diff --git a/releases/2026-10-02/.gitattributes b/releases/2026-10-02/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..681ed02223161ca91c3dee7f5d2a9768382d0807 --- /dev/null +++ b/releases/2026-10-02/.gitattributes @@ -0,0 +1,2 @@ +*.pt filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text diff --git a/releases/2026-10-02/.gitignore b/releases/2026-10-02/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..7894b3348d839c006b9fdd0c7f6e9845c217c8ab --- /dev/null +++ b/releases/2026-10-02/.gitignore @@ -0,0 +1,5 @@ +__pycache__/ +*.pyc +.venv/ +outputs/ +weights/ diff --git a/releases/2026-10-02/LICENSE b/releases/2026-10-02/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..d9a10c0d8e868ebf8da0b3dc95bb0be634c34bfe --- /dev/null +++ b/releases/2026-10-02/LICENSE @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/releases/2026-10-02/NOTICE b/releases/2026-10-02/NOTICE new file mode 100644 index 0000000000000000000000000000000000000000..9258193710da6017fa253743ca6ce1d7dff7ec8e --- /dev/null +++ b/releases/2026-10-02/NOTICE @@ -0,0 +1,18 @@ +BERTose and BERToseBind +Copyright 2026 Supantha Dey and contributors. + +Original code is licensed under Apache License 2.0. See LICENSE. Existing source notices and attribution are preserved. + +The Python dependencies are distributed separately under their own licenses. +The bundled WURCSFramework and MolWURCS Java archives are third-party software. +Their bytes, embedded LICENSE/NOTICE files and dependency POMs are preserved; +the original-code Apache declaration does not replace those terms. Archive +hashes and embedded notice locations are listed in +provenance/third_party_archives.json. +This code license does not grant rights to source databases, spectra, molecular +structures, simulations, third-party model weights, or ESM-C-derived features. +Those assets require the terms documented with each separate release. + +The preserved implementation files retain their historical filenames and +internal model identifiers so that source and checkpoint hashes remain traceable. +Public model names are BERTose and BERToseBind. diff --git a/releases/2026-10-02/README.md b/releases/2026-10-02/README.md new file mode 100644 index 0000000000000000000000000000000000000000..1db8ff397f071e8508fe427d016ceef3ef845630 --- /dev/null +++ b/releases/2026-10-02/README.md @@ -0,0 +1,51 @@ +# BERTose workbench + +Code for [supanthadey1/bertose-affinose-training-code](https://huggingface.co/supanthadey1/bertose-affinose-training-code), under `releases/2026-10-02/`. The model assets retain their `releases/2026-09-28/` paths. + +## Install + +Run these commands from the code directory with Python 3.12: + +```bash +python3.12 -m venv .venv +source .venv/bin/activate +python -m pip install -r requirements-workbench.txt +``` + +The base requirements use PyTorch 2.9.1 and NumPy 1.26.4. The workbench adds Hugging Face downloads, plotting and a notebook kernel. + +## Embed a glycan + +```python +from bertose_workbench import Encoder + +encoder = Encoder.from_pretrained(variant="3", device="cpu") +wurcs = "WURCS=2.0/1,2,1/[a2122h-1a_1-5]/1-1/a4-b1" +vectors = encoder.encode([wurcs]) +print(vectors.shape) # (1, 768) +``` + +Variant 3 is the BERTose encoder used in the manuscript comparison. The five variants have different pretraining loss weights. Input must be WURCS 2.0 within the trained 256-token limit. Use `encode_with_diagnostics` to inspect tokenizer diagnostics alongside the vectors. + +Open [BERTose_workbench.ipynb](notebooks/BERTose_workbench.ipynb) for batch embeddings, similarity searches and PCA plots. [The quickstart](docs/QUICKSTART.md) gives the same examples as scripts, CSV export, downloads and API reuse in a website backend. Embedding similarity and PCA explore the representations; they do not measure chemical validity, binding affinity or completion accuracy. + +## Binding and IAR + +The package includes the nine fitted BERToseBind models' loader and the fitted iterative ambiguity resolution (IAR) linkage readout. Model checkpoints and feature data are separate downloads. + +- Binding prediction accepts pairs represented in the supplied glycan and protein feature cache. It does not generate features for new glycans or proteins. Scores are model regression outputs, not calibrated probabilities or affinity constants. +- IAR inference runs only the two supplied single-linkage cases with the full reference checkpoint and saved readout. It does not accept arbitrary new masking cases. + +[The quickstart](docs/QUICKSTART.md#binding-from-cached-inputs) shows both commands and their required downloads. These interfaces use saved models without training or refitting. + +For selective model/data downloads, see [DATA_ACCESS.md](docs/DATA_ACCESS.md). Your website collaborator can follow [WEBSITE_INTEGRATION.md](docs/WEBSITE_INTEGRATION.md) to reuse the Python interface and check the deployed model identity. + +## Training and manuscript code + +Training, evaluation, structure/MD processing, and analysis and figure sources are included. See [TRAINING.md](docs/TRAINING.md) for the entry points and required inputs, and [reproduction.md](docs/reproduction.md) for the original implementation details. The workbench examples are inference examples, not a rerun of the full training or benchmark campaign. + +## Licenses and provenance + +Original code uses [Apache-2.0](LICENSE); [NOTICE](NOTICE) records third-party exceptions. Revised model weights use Apache-2.0. Newly generated contributor-owned data use CC-BY-4.0; upstream data and external model assets retain their own terms. ESM-C weights are not bundled. + +[The execution summary](provenance/execution_summary.json), [sequence variant records](provenance/sequence_variants.json) and [release manifest](provenance/release_manifest.json) preserve the source and model references. Historical execution paths describe the original runs; follow the quickstart for local paths. diff --git a/releases/2026-10-02/SHA256SUMS b/releases/2026-10-02/SHA256SUMS new file mode 100644 index 0000000000000000000000000000000000000000..f92f1e3a406270ee49e0c7ebb2ee7772fee9d829 --- /dev/null +++ b/releases/2026-10-02/SHA256SUMS @@ -0,0 +1,577 @@ +87c07b5f72ac341f0eb42c040e0617c9512c4ec9f89a20790580d01d473f1b99 .gitattributes +6f8f72cd77c10018fd9f9666bad581556097a04a67d11e3e831ef21bb250f25b .gitignore +a6cba85bc92e0cff7a450b1d873c0eaa2e9fc96bf472df0247a26bec77bf3ff9 LICENSE +b6c446fc86540a7a2c432368a5987ed15d622820a0b1bdf45c7cd7273b9bcad0 NOTICE +5b60c2b1da93ffe81348a456f7f43ba0909855355347f1ea18436c8acb613843 README.md +52c790c24e10061b5890260aad39cefdb6c2c615b8b9c167cc23d86393e41d98 affinose/a1111_encoder_adapter.py +c4bbe5c1a0286b319f0b71c87669b4f9cfe781051019fb02a98b5d7e208b8b2b affinose/a5_tokenizer_shim.py +7fa8d6fe95db3ccecefdd396931d6354442800cd5284cabf519e3425cc388883 affinose/bertint_v8.py +27e7fe6820357551e9e09a135db4a9d2cff5c4382f5396912dced12c54aaa288 affinose/dataset_v8.py +82d1d55ed231740fff88065cff7eb9bc45907d69f7c96beebf7eb5fa6e1ae52d affinose/training_v8.py +8452e3ac521af1d3ea24bb5a99e02a930d913fc96394e5610fe8b86e19ea89ec benchmark_exclusion/MANIFEST_SHA256.tsv +96567c3b9c3e254bceb6bd82e43c1f252b987ced58dad41d3b4406b9f58a76ec benchmark_exclusion/README.md +3d37d993b1cd4135ca9fe90feca856b73907d725516ea652425ca24060769698 benchmark_exclusion/SHA256SUMS +e2e0dfa7d133362146de10ba3dd774e9a3e186088f976189b0aae9d26b442bc4 benchmark_exclusion/code_inventory.tsv +050c0af96f133ded3139baf6dfea594f91c6659f411dc25fc06d5847951b2f0c benchmark_exclusion/required_successor_inputs.json +0507537ca8ee05b249f9ab3f3fa09de94b7acc633b91235f2778ae07659096bd benchmark_exclusion/source_verification.json +3d598a249db90c928f8a317923ba5d37eebbc1f63383a2c39e0541f20c31ccac benchmark_exclusion/writing/review/glytoucan/scripts/build_connection_level_support_audit.py +a9160769759c1df56238caad6a9f4ed6ec68477d44435ebbc81d64bbf541b64c benchmark_exclusion/writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py +0f88f53e22d0c068a87a09508a9d286e4982eddcb4e2154e63b2ca25339ece69 benchmark_exclusion/writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py +2c8821586df1caa53556b4cc14e6cd7507af4830aa8a149657571e0455eb6853 benchmark_exclusion/writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py +cd86a0a0b228c32e51ec73490711e37da3e6c9fdf9e64e980b7222b5312484aa benchmark_exclusion/writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py +966889118fa567729e1959750b1601018ba117aed0bfad3508005ba6b1896a08 benchmark_exclusion/writing/review/multimodal/tests/test_build_review_a5_non_iar_later_role_successor_20260720.py +92a9fb830e7adfad3d6999bd3b0cd73f2d5414934c65521a3ee7c6f59003a66d bertose.py +0bc54399362945601bcfd403441fc80968d173200dd0561f57568b2053a94839 bertose_source/bert_training_v4/downstream_tasks/utils/wurcs_bpe_tokenizer.py +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 bertose_source/bert_training_v4/model/__init__.py +b69f14c9976951325e3a0a4e8107a16126e67d410e966650f513f1f538a732bb bertose_source/bert_training_v4/model/glycan_bert.py +83fde1c18cd6547a6ea026017296b5c94d209ac8f0e125057f03d507b3b65190 bertose_source/bert_training_v4/model/multimodal_glycan_bert_v3.py +8a7f8569ff3a21513723d3a15e969120f0fdcf352943dbbadfdc54afd382149e bertose_source/data/bpe_vocabulary.json +48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4 bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_authority.json +53098620a5c22dafdc951ba743515b4b10b1673c02f0aa4d881db669584902fa bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_independent_certificate.json +f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4 bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_receipt.json +918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json +10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04 bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py +f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7 bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py +6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4 bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py +399df3de2b6c4d5e88aa442c8326214ab9cff2e8f0411e6921762bbade1475ba bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_receipt.json +93ed219d807d4a7735be96bf7cf6a59a0bd407619925ee194aed6d473048cdf0 bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_summary.json +b69f14c9976951325e3a0a4e8107a16126e67d410e966650f513f1f538a732bb bertose_source/model/glycan_bert.py +8e06c32f4e844c3c66f146fd15a075472808a0720c892d0b9683dfd32f15ef0c bertose_source/model/multimodal_glycan_bert_v3.py +6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4 bertose_source/training/a5_wurcs_bpe.py +2a3b28bd980b144eb42f9688f411adfbced054b9e7bad9fac4de37c6180064f8 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_submission_readback_11767377/review_a5_native_eight_cuda_resume_diagnostic_r5_11767377_terminal_certification_receipt.json +6a1bc65c568a17dc45f1102cd122ac43c62a8ee3b28e06ec855577857cc41ce0 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/review_a5_native_eight_cuda_resume_diagnostic_receipt_r5.json +9292c31195a7eddfe9f987a8cfe8cda843b283bb10a1bc8fb1b05d88f82a92d9 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/review_checkpoints_r1/review_checkpoint_index.json +cacec838740d64a493c2e56fd1efa8a85ba7d11fce3ec26e40905c33db05e58d bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r1/review_a5_native_eight_data_adapter_receipt_r1.json +3b2118e128a5550ba4918b4f4f2c6d8045e319b7cff37b76d74dce6b3220c9f0 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_receipt_r2.json +e29df7a91d0c30238abe9155e600fb1b77b0d3d3481f6599d2ca0d2185371b9f bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_receipt_r3.json +a92f4b951476e84af006015c97698f07d5e03e7a182c54c82b7d7c5c0e68ffb3 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_verification_receipt_r1.json +9aa5860bfc032afd82561a6db6f8df1439245b73aa3f7575b2b88836e384a1f9 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4_integrity_receipt.json +59a2fd53e9e75f6f8ec258d76e103adb61c908ab0ace6718a348739f5b70d8bd bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5_integrity_receipt.json +0c078ce52e2eb6d6feaeb1a1c2af1794ef33aef56aca7959f76a93f39d152692 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6_integrity_receipt.json +912bc1391ff66c3fd704e61266de508adcf9ed587d7e136932508029b77cb956 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7_integrity_receipt.json +d8feaf25a7266a919c42d3a4fd1ad2d105ab088ae79c024edc665dfa29cf758a bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_final_binding_r22.json +30082379d47318f5d9e17fafad4aa018e7e9f0f0bf1aac559178d46784fe4b9f bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_launch_config_r22.json +826f3e8167fdd459cff7677b5b69d0f3caf9dababaaa71d9eded6070aa5d93a7 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/run_review_a5_native_eight_r22.sbatch +1238f76e5da5184d16d33077bf3e5342033918fadb4eba84242c47cb1b1322cc bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_authority_r1.json +fb65dddf0bc61b4c73b5dc5ec796967e65263e9d7bdc4882e07684e882280fdb bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_receipt_r1.json +64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_topology_loss_v2.py +654f5b9728c3dfd2588c4b570b0e3a1bcab8feb366af28eeead36f9beb37d921 bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_receipt_r4.json +ccd4b81d3afac8ae789c538e0af332f74f2468d403da1d243fefefd4df013538 bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_summary_r4.json +b10556643abf560b9e8622e8ae67936d2d3ca8867433db485e785f31d049a8fb bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null.json +f4eb239f56e472d57dd3a3848c1a6c142e193cb326320ac8bf134b96ac35102a bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null_receipt.json +831bebd2dcf6a8308d01ec62eb6e1132fe7edbbc666c1c83787335acc576b19c bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_frozen_sequence_masking_runtime.py +eae6b3772cd08c65cdc26bdf7ec525742452aad4a35b4d5aa9a7a5936dc3bf73 bertose_source/writing/review/multimodal/outputs/review_a5_sequence_topology_bfs_replay_all_20260722_r1/review_a5_sequence_topology_bfs_replay_all_receipt_r1.json +da7814d20c81c0d072544cfc5761e8fae0292def176d63b863083389c9caa0ff bertose_source/writing/review/multimodal/outputs/review_a5_sequence_topology_bfs_replay_all_20260722_r1/review_a5_sequence_topology_bfs_replay_all_summary_r1.json +ba9591529f3747706fbc169fe8262e23ca31a810473d10c284fb01d9190ebe42 bertose_source/writing/review/multimodal/outputs/review_a5_sequence_v4_two_run_reproduction_20260722_r1/review_a5_sequence_v4_two_run_reproduction_receipt.json +d6b3dad73d8c9cc78a7c721e7969280d0ff6500773402545bc2ff143b125f56c bertose_source/writing/review/multimodal/outputs/review_a5_sequence_v4_two_run_reproduction_20260722_r1/review_a5_sequence_v4_two_run_reproduction_summary.json +8ff3181d22567728c0a10580c1e775da0714f17561ace81034fc673813f54af6 bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_epoch_boundary_continuation_11762446_r1.json +163374c5c6b049908d935f0d92d8f1a1adda761550761db9b2cb423bfb450ee1 bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_epoch_boundary_continuation_11762534_r1.json +85711141c9d0e84dee228df84d02df7d4693fb4b85b1ae8163466e208f5e9fd6 bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_amendment_11762446_r2.json +0d96b7867eeec85dbf14eb8f55b745b7c354edb5d16ac702d17b97bf850c79af bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_amendment_11762534_r3.json +f7adbf64e17c3a2afc677b7af9f05e50e37b4d681f38f0fc192634ca0447e4f4 bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_rightsizing_applied_11762446_r2.json +6796f0b163dcf21af5dfe3048b53e8d2660fe10290e22222232a6c7f6668396c bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_rightsizing_applied_11762534_r3.json +be55a87986dd6d80942dcd0b17dd75994145ff4a383596314d5b4ee51972a443 bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_cpu_finalization_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_cpu_finalization_execution_r21.json +77ba176a9fab70e75b3c2c423c857d1e266f2021875aea01e15bac3f11f327d1 bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_publication_receipt_r4.json +661d04d76fcf36d116feb117154eac01e6569e377d4245c07653b28696e1227b bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_train_only_null_r4.json +333ee6f34e69f89e26b810cc565415b89d6874615ea4ac57850371fb159c1b71 bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_a5_official_ragged_topology_receipt.json +a752ffd350fbe38aa0e6f6b42b76137f4f72d76fa9a7f5d3609bc47c65c552de bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null.json +dace4cb5df71912f5aa7531bb0ce87db3b63d726b2a12aa41facabf9d54b5c35 bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null_receipt.json +68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6 bertose_source/writing/review/multimodal/runtime/a5_ms_acquisition_top30_v3_20260721_r3/review_a5_ms_acquisition_top30_runtime_v3.py +9f8f167148aa234df413e4c3d4e1846881781c8e5a19bd91b0b178b260a3a537 bertose_source/writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_r2.py +a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e bertose_source/writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_r3.py +c71ba654568a24993bc1733b26b6863b11e5c198c53871a6183b485ab96540f0 bertose_source/writing/review/multimodal/runtime/a5_native_eight_direct_static_bridge_20260724_r1/review_a5_native_eight_direct_static_bridge_r1.py +b6266553c075e9b85d221a6278d1ef3ab1d26fbce5de70dbcd4569db42653990 bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260727_r19_external_release_runtime_binding/review_a5_native_eight_finalization_runtime_r19.py +28d482fbae230c999d84e64a5abd6a1260ae26fb555c92b7d3176afb37cb260a bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260727_r19_external_release_runtime_binding/run_review_a5_native_eight_training_r19.py +62f5355ef06cdc56f85214ac251bfa0ed4b19b41a19ab6acac51d644678f0a62 bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/review_a5_native_eight_finalization_runtime_r22.py +cb9a583091912c59f515f46074b04c90dfbe0ebf0fc28d241db980851b180335 bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/run_review_a5_native_eight_training_r22.py +3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r1/review_a5_native_eight_hotpath_r1.py +101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/load_review_a5_native_eight_hotpath_r2.py +941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/review_a5_native_eight_hotpath_r2.py +e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/load_review_a5_native_eight_hotpath_r3.py +a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/review_a5_native_eight_hotpath_r3.py +662d0766a8d68638480e9c44ca4070387481d43e1c666a20363025cf5b9bc958 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/load_review_a5_native_eight_hotpath_r4.py +600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4.py +864a05e86c5ea91318b11373d2cdffcdd2ddd0777f141cb7ef0305f779a42ea6 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/load_review_a5_native_eight_hotpath_r5.py +ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5.py +e2496170942db844e4ebe71d4c098b0d0cf99540d3465ed7e8e9a113469cf7d2 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/load_review_a5_native_eight_hotpath_r6.py +73b42e5131c64284c6f748ddf81b4d187dcb57f756c88c22240d189f2afc4cef bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6.py +fa9538829ff3ccfaf3d3f4346c7e735c70758661eb6bf3da5eece2e7e96e0fb6 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/load_review_a5_native_eight_hotpath_r7.py +c0cb618f7856daf24666dbec07ff51b86e3fbd52c073c58bd1b7151122714f47 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7.py +35c7a13da662f49bec07b63f590c8fb3d9cc4578633a179da42ff2650a2d7865 bertose_source/writing/review/multimodal/runtime/a5_native_eight_submission_20260727_r15_preparation/review_a5_native_eight_submission_contract_r15.py +34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r1/review_a5_native_eight_training_runner_r1.py +7e93b13b3212b3c97e30144f3e393a86a13411d5e82fe19bd55d43bc58587e30 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/review_a5_native_eight_training_runner_r2.py +195dbedfde65c061eb0fca5684270ff95a2bec16732683b1df7f40d91909cc7f bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/run_review_a5_native_eight_training_r2.py +550588ca033718273de2e35825b8b9faffe4a5fb747ff8775fe17bb31050d9be bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/review_a5_native_eight_training_runner_r3.py +bba69e736a44fbfa6b380089d50b945e93b45d5202fa265b5869ffd378149040 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/run_review_a5_native_eight_training_r3.py +cbc9fc0179ecb1e7c449fa37a574f38ff3e912e13db5c984d87e05e3e347a0e1 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/review_a5_native_eight_training_runner_r8.py +213afce295408dda11cf3ede98ebff191735a77e1db09b6252cae964caca39e2 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/run_review_a5_native_eight_training_r8.py +4430560565a18da0e68700d60526d3dec15fabd79854111d1e85deb59e2381c8 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/review_a5_native_eight_training_runner_r9.py +b2bae85c879d2d266ac1e39869c661625958e21c1c3b7299713c8a0b46827ec5 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/run_review_a5_native_eight_training_r9.py +ce7626823c2980bc21b46a7eec6c1961a87dc5512525e553c49f2c7d57bf0430 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r11_certification_gate_candidate/review_a5_native_eight_certification_gate_r11.py +a8cfaca102f7c3d0c7936d244ce1e9ed75099e70c0ca3a27943be7ce5587b6e0 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_final_bindings_r12.py +47e973c7c4ed5bc6686e5d7795b00d3eea5c2da8c2a15fc534a7cc24c1744ee1 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_training_runner_r12.py +66270933d1ff23ffe50b800267a4705c905fc423e8e2c929bf642cb5c6c37def bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/run_review_a5_native_eight_training_r12.py +2feb9a90db66ca277fb9e23d079ce8b089a31060e5670961a13b0e5146ed39a8 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_direct_submit_controller_r13.py +c30b6b03dae852a4b10c6d01596e977d8a071e738dc3074f1ca0592a50778dd3 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py +17cf8ab216b354ec1de7574ebebd7bfe02b5935da605b4131e45c7aa13982d5b bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py +a2a0a0d9056c7cd360913a792ff5e3390a190b692d7663c3a6d48a3ee0f180d5 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/run_review_a5_native_eight_training_r13.py +737b1caa9086f8ac1556c05625d1b5391b8cae58e9d98a7755fa72f44e94c7ba bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/__init__.py +bd6c704239e2bb4898dddda5c86274f41cd5b304b35d584ddfae3884e8bc8503 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_final_bindings_r14.py +eda983e1b0c29357eb1b6e2f555f402a83b7176fb857488e9be5f5faed490b2d bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_strict_successor_r14.py +7ef11d9a891d32b0c1bb3ee24016700acd14251ac49448f004a701cdea79ca53 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/__init__.py +1f21427486260e8b56795f7137f0f7322ae768d80645db6636414e5961aa3224 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_bindings_r15.py +1556d6e2643edfc80b6b6782164ab47560e259ff55791c50dcffdd9b9afc001f bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_gate_r15.py +1287db8472580db69e38d60be8c13beeddb4fdde7958a5b302d072e1226f4de3 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation/review_a5_native_eight_final_bindings_r16.py +689db8aaf51d15288f01b196c5ad2fe8ee3ca8aab3ff525695abaa9f25060ff6 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation/review_a5_native_eight_release_successor_r16.py +2c985edfe747bae712c41689da8be2abb5096bd97a8771691b3676d3a8af49fd bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_balanced_planner_r4.py +52a311636e7631b97711aab63aec28e2ada47a446d1aecc1a47921d584f69f9d bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_composite_r4.py +1b9b05c812603db7b216aa989214a3c3715f80032b3a8b82577ae2b9e48f048d bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_balanced_planner_r5.py +24c35257fc61e1c9c77630d2b0075775a7f46b6500ecb5f175ef8f42bd214e0e bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_composite_r5.py +a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2 bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_executor_r5.py +b5fbdff168de23676208484ccccc3cc32f613ea411d193e6d8930456e8edeeef bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_r4_lineage_receipt_r1.json +e47e6e9810db0e8ec9d37ce5533f762e287b162f811bfadc347666f5ad78db82 bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r6/review_a5_native_eight_executor_r6.py +e068a3c233fc3fd94fe3b8618edb9bd8c87fd81b97dff2666206fb870f0f898a bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r7/review_a5_native_eight_executor_r7.py +60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630 bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r8/review_a5_native_eight_executor_r8.py +ee97bf4e68ddfbf280b7e0f01ce3409c4d4692feafbc9382613bbc5698913fa7 bertose_source/writing/review/multimodal/runtime/a5_static_failure_release_chain_20260727_r1_preparation/review_a5_native_static_failure_release_gate_r1.py +f420c84258cdf4247fdd766a9e8470bad55bd1f845ebd6640ec70b97b3953e6e bertose_source/writing/review/multimodal/runtime/a5_static_v2_epoch_boundary_resume_20260725_r1/run_review_a5_static_v2_epoch_boundary_resume_r1_scavenger_v100.sbatch +f2e558c52bf166d6e7f42ecdd92995f2b70c8a174eab8d6814875399fb69732e bertose_source/writing/review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_checkpoint_store_r2.py +8e57c17fd43f3894f94f980cf70a0d6d7f183cf04c26780c3fe30c1932bb7abb bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/review_a5_static_v2_postfit_direct_publication_r2.py +c46a7d4644899a5e7551e2dd5eb30666e01e0f36e2f65a2cd821b8c5565258dc bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/run_review_a5_static_v2_postfit_direct_publication_r2.py +3b9632e840265e1a5c1d226f3fe7fb8cd4c448f810f3826c59e19c25132dd04f bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r4_terminal_certification/review_a5_static_v2_terminal_certification_r4.py +9429deca8cfb6cb25ef6f79a5b0ee0b91d47657e7f21f61627afd655d08fe7d3 bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r5_terminal_certification/__init__.py +04d724ee84f67565e2f0229db99006c8f64d2492564643f6e60af25930cf12a1 bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r5_terminal_certification/review_a5_static_v2_terminal_certification_r5.py +bbdce8deb776917ade3704eb5d08b064917f52c76f3f39ee345b3b2938992add bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/__init__.py +195d41bba2282fdfde77a88f8b0a70eb64b0207d1a9efd42ddaeb873f8ccaeed bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/review_a5_static_v2_production_module_roster_r6.json +bdb0fa37804531f6446cee9411c9730fde792eb9674054e56b883156f36da4cb bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/review_a5_static_v2_terminal_certification_r6.py +30b64143eb15688fa1e1c8aeaf3b84eb08a2a65730fa1c996c9ef6f12679d80f bertose_source/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/a5_wa345_continuation_manifest_20260819_r1.json +f517b5c99d93103d1212b2153c26be1cc58267c7b2d9bfa747f6d512f0fdadf2 bertose_source/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/submit_a5_wa345_continuation_20260819_r1.sbatch +eeebc9c7e2cfc701f3ad47e62696ae2247c8caec93d8b034d5f573b701eab2a1 bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/a5_wa345_manifest_20260817_r1.json +5159414381025cf3e2d5e742422c84c292481168af42801c773df4ba12797fb4 bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/run_a5_wa345_shim_20260817_r1.py +a090f111df7cc0db09e61ea0a8067882b7cd9bf21d91c53da4115549560b08e7 bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/submit_a5_wa345_20260817_r1.sbatch +600144a7f5b893958d629083a3a9266eec980765218408d2d51db72b73c1e506 bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/review_md_temporal_20x6_a1111_wa2_manifest_20260811_r1.json +dd74253863f39150af4ddc7e8d48c0a366e1f327c30aa50e0748078330b97b85 bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py +6ffd2f97706bdf0001b90ca2f8af7ec565b298cc8585444ba6027194d0e378d2 bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/submit_review_md_temporal_20x6_a1111_wa2_20260811_r1.sbatch +aa37d1e86bd3a58262f9824ba80993c0f0f280db4d0f4d704ca469dc12ba3df7 bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/__init__.py +3e96d8092239c2c21f217ad5bae4ee7e07dbe0f7630b213bad468d6b08d3b1c1 bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/review_md_temporal_20x6_core_r3.py +1e446e7e89a39ef01132b9f2a4deb817161f7b376a0fa04c2b11529004f53e8a bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/run_review_md_temporal_20x6_training_r3.py +a6a180ae103eaaf68458b298cd4180920a0e88c1724a6ba9a94ef94559e75c5f bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260805_r4_dev_memory/run_review_md_temporal_20x6_training_r4.py +32285cc5fedd421032bd98b97214f899ccacda9b211c1b2a97a3fb1513f1ad70 bertose_workbench.py +3d3077181b519b0106d9201ee8514a41905e32057237d8fdb48343e10cfa97b3 bertosebind_inference/README.md +81f3da9b814892c3f12b2f7a535284b89f0be07b22bce50a374c8303d6db6c72 bertosebind_inference/__init__.py +b7cfcdaf1c902664252f3d2022e290a803892a31618c1290c09c174131036541 bertosebind_inference/check_real_examples.py +07282f0fec34ef2cf9f832c3662227ca89064b52e3fdbe9fd3ad11b5f4e01154 bertosebind_inference/config.json +d748e004c483597c86cc214ecd43f5c902e3d3ced41d1e9223b555dfa3b9ed58 bertosebind_inference/examples/doubly_cold.csv +c50e124eba39a8bb5f08e4d75e54b0f168ff74ee886d7f28e3156b3beba6ad96 bertosebind_inference/examples/glycan_cold.csv +6d70ea272cb716c7bf001675493496bfe7491add0185c010f83417a8ed607784 bertosebind_inference/examples/protein_cold.csv +3de9b7e6b9c6035c0e07504b1dadb2c1c430151b7c889c33825a437a5c70e659 bertosebind_inference/examples/reference.json +0c074c3901ac55b737e10a2b316db3c00678e569d151fc3e2192b46bd1662ce6 bertosebind_inference/loader.py +e06c540874abbfd72b72b6ee41aa2d35a6d35bf11d26e10714f382d031765b3a bertosebind_inference/local_checks.json +fe3f559157a6bc3dd4b59803fb010054c8987f402b6790f488e6cce51bc95d4b bertosebind_inference/predict.py +b18eed4c3ad4f0cbdd700e41d6ff7af1f520d26386f76f4573e82332f3e1ea28 bertosebind_new_runs/README.md +fc4ffac8de965da6250297ee24fa801be2619f1afcc29471204c7e5aead03012 bertosebind_new_runs/audit_pretraining_exposure.py +2b8be4fcd7ebc98f49e9532415644f457930a1e7700d5c17fdc58a0abd0dd271 bertosebind_new_runs/check_package.py +45a366b40a523671427950b83ac2c8a243c96f1bce8527b0af2337a375ff2b15 bertosebind_new_runs/executed/local/audit_current_pretraining_exposure.py +bdb19bf323c94eacc1943b4345b5b2485dfa50b7ac00a755e8a1dde2f8a4ed74 bertosebind_new_runs/executed/local/collect_current_glycan_sets.py +9c9b90f077709c105dd16b706ebcd434dd793177c274eca17b10bc3241f0138b bertosebind_new_runs/executed/local/dc_anatomy.py +33d41f680cf7a5ae3b98fef4d1ef604f6e12a6a856ec6e90df8bb5a88f336bbe bertosebind_new_runs/executed/remote/aff_attribution_motif.py +2b89020895eebac8c99366036eebb07dd43c687fe47274dcd1de47d1017548ff bertosebind_new_runs/executed/remote/aff_attribution_motif.sbatch +d7f21b8037172e6d42fb65c8169d37b19c385d68dc9cbebadbafe9e930843074 bertosebind_new_runs/executed/remote/affinose_gifflar_macro_A_glycan_gifflarESM.json +eca94bfbe82bfba95c2086c9c4ffe14091d442017356394ec2e75173cb66810f bertosebind_new_runs/executed/remote/affinose_gifflar_macro_A_glycan_sweetnetESM.json +529296c1388651b4451f35829d0caa63e692a96fc88b74ee9b8dc8c1d09136da bertosebind_new_runs/executed/remote/affinose_gifflar_macro_B_protein_gifflarESM.json +6f0098947aa4c962f991d1e17acc17707d7cb2eb5e9d6338182d6cfa65d28a2d bertosebind_new_runs/executed/remote/affinose_gifflar_macro_B_protein_sweetnetESM.json +bf720edacbad09cd04c42df7cf347dd1fe9846a22f307f7be1c38f06e89faa44 bertosebind_new_runs/executed/remote/affinose_gifflar_macro_C_doubly_gifflarESM.json +1884d744232b56c5edc76e655cf9bd117e43d8d749c98300b528ea6a5e55b75d bertosebind_new_runs/executed/remote/affinose_gifflar_macro_C_doubly_sweetnetESM.json +0d4458462cd10dae219a9f15eb6dc8129d200a09891bd0b6bf0297cd85c4dae2 bertosebind_new_runs/executed/remote/affinose_glycan_cold_contamination.json +61a5ef32482365e37e58bd4aee49ff5dabc2fafa04f4e063f3a0be7c294c84c7 bertosebind_new_runs/executed/remote/b4_baselines_perrow.py +a381978d36492bb21cdb7c2a3007c51414b7630dd88016c7a74eb19c48080925 bertosebind_new_runs/executed/remote/b4_gif_repeat.sbatch +7fe6a80de1e7662a916e84b0a679c5579ab7fdcaaace70e1855f7d8face51ca3 bertosebind_new_runs/executed/remote/b4_gif_repeat_compare.py +1d0433763d7ad49088e396b435a42f2a12141436db05592778a79938c88a953b bertosebind_new_runs/executed/remote/b4_lo_perrow_ckpt.py +c82d7fe71d178d78d52ee47d809cd12d0286c48b1375c0c7b8b80fa222858e61 bertosebind_new_runs/executed/remote/b4_step1_structure.py +ab7560abe237da435464a984a4e23925e7ec48d802949f57ef9600b829e6b37d bertosebind_new_runs/executed/remote/b4_step3_bootstrap.py +6dbbbeb14bb860f6344a93bb65754f540dee8da4ceb3fdc526133c7133dd426c bertosebind_new_runs/executed/remote/b4_step3_bootstrap_r2.py +50049bf5658f27700205e91d07f40512b8d297a7af11f51fcfbd514df9b59478 bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_gif_repeat_20260927.json +7f9edc64528d5b43d2c464f8f5d4db91c2a133f54364993c7798a2a606bd3427 bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step1_structure_20260926.json +17ab513ec2d9dec6f1e8c9445dfd7500190f99f0e8758b21fbb435b026324f3b bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step3_bootstrap_20260926.json +6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235 bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json +1ab7793ddb0daa247dc1f75b53356663d2c99e2e279a33207c9dd82f24288d17 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml +cda3d3e0df11dcbffff287c985039a4abe486a39bb97fe1554851992cbca127e bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml +d11d6ca73935a664a9afe9330d07e51b7e95e89e044a1012065ef1780d820381 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml +dab891f502cb328f8313a9d2971e5d8134472b059fa776409f97f5f59e5d470b bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml +875883d0ec38fca1a4995ea76c00db81ba84357fb2ed9a7c0921dbb6c7cf6492 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml +529c3940cfce81ab3d135f25b722d7c302cd83e8540646f041a5d6ba36baebf3 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml +908379483dc5b2d0655aa7b0a13b33c8b70ba0379852ffc2d848e354ebd9945e bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml +57cbf88ddf620ffbec7c4a8167a271ec38da0f94b1d3a4e9fe9769a9a19b8eea bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml +5e518f2db88c03663eb263a5e4a44e93a3bc43e51c4af6c626cd0da416a18d81 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml +50c68416d3d4d72445e61811474179cb552e60d9f8a87f6cc0ed1da32d8b55e8 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml +034ba8bdefc3410b987d7bc380bd24a469a01c912349fef1e35436df2a24c36e bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml +ed244565f2f81e6c554613718398af97683ad375eb4debb5a61d25855c444368 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml +d8ba3e8d83871cdd92548bc8bab1493225cdcbd536c0004ff6b40b48e4e62e40 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml +2faa1986c043cf5d8b869d316afa0a043d071400c4f2018ba83551332a143f25 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml +5fd2cdec3ee4d49f7d7441a037e0a2fbe428b1c0586de88beaf17a2ab67580f1 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml +e8fafb98627685ededa4392c5310e149a7dbbe907e37b43da7d20d228961b181 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_sweetonly.yaml +ab257b93c23a522dcd99f37b2b802e67c8e3b4ba46b938db6229a6311a77cd39 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/data/utils.py +ab79451e7b51e27d985904a4445fc09b756d759413bb2ebaf8755d177bb3e8ad bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/train.py +56bf1e5b11a386d0920b9f50da6288eff222ee1b7f25d772a8a666a2387b2a9d bertosebind_new_runs/executed/remote/gif_seeds.sbatch +241d3ca6045610a70ccad8307448b4d57e47810c945f127fef768357e56cdef2 bertosebind_new_runs/executed/remote/gifflar_launch.py +e391584ec821c1e86916c6f8c14a6571a550034fd246e1dc0e7d7b3b6d4dbd7e bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml +35d0ef06a1b9725233ed1e58c74101b7e6a555da48165ed57c9bd71bb5e77315 bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv +0dae829566b87d0dd00613343bc5a0c49fb1107c0f4834327d8cca71b8932389 bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml +fd6f39dd3bef9326bc1f583bf07a1f9b8f02f846630a0c58c66c7bae70456d59 bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv +fb07ac7cfcb63c4dd77c7493f4a518e11d268fd5e8d4cf6a849c31552e48369a bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml +1d9e1b8c6fff12f8603ce8f7e58189da0ae8580e72d3c5bf5ff3893a4f9bce2f bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv +4902e83edaa137f55f5fe4f32f32068e94a3f4832630b284048c22b8a099dca6 bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml +b911e06e11968f9d8655ab69619f33a8878759e497eb44498432c341dc6fbdd1 bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv +75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml +346d480fa44e31a5a486bfa99c136cc5ddfee27a197194b7fac289de9ba55665 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv +75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml +6a42d5cf20bf64a7b027660beca902ec84a80a1beb73e8aec1e4eb26fbb7c913 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv +75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/hparams.yaml +a71483c34b9d9cd904a6fe241f88af3e30bb3e100a15d666def5b06e4a5c0431 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/metrics.csv +2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml +faee86ceadc7e1dbe6835d44aef8c5d4f810a2cbe224e13202154b52dab92be3 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv +2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml +ed66bf0654eeaabf3b4f5f92e1295abc53a0155095160092ffb47826ff385d1a bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/metrics.csv +2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml +127b095cc67faf26378a247dc7345de56d331537dad375990ed319f684fbde27 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/metrics.csv +2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml +eee99377078178660db1f12c2700b0c46c9d8120db5f445a8d71d3f584cc9fcd bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/metrics.csv +0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml +47b51d96993782f3c9e6117722176941bd2c6d571200d160e28aa654c97c6356 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv +0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml +89d056126636c1fd1fa44d27ecfd57040a9bfc9eec2a76104da0ae07d01680b3 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv +0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/hparams.yaml +c066cdbf7827bdec2f87c15bf95a42e0a23b511bf03338482e4d2b20c149336b bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/metrics.csv +1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml +fe5d987579ac234e8f21bb70e642177e9eccb69493564b7c5895e6abd51f4dc2 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv +1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml +0ecfee6421a63cee0f0537fdb311e44b87227421f637816a0a3ccfd132763d16 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv +1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml +0d313e8557cb13577b34c8e94e0f2c887c11cfa6da6ca36ab2aa5f9d1cc10f22 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/metrics.csv +1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml +5ef2b9552f452e4218b9728c0ed57f7a14ec5068d065c7223e2c6e566e5dafd2 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/metrics.csv +781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml +e92266239d6445a0de886e5081e433632c6719719f6d536ad31e98045160fcea bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv +781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml +929a3396f429527836db8368e7908024bf69766e0567636b1f24df8c1c06ea42 bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv +f7852d23330d3b55e46eec193b3fe411306ea59349de6fa53273294d893dce1c bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml +1e68c5af1f9c7fe0f1c85d9f3d49fa1104bf3d4c768014154316ee27b94a3cc3 bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv +987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml +e937607ecc6a7058664faab71728c58ef7a9bba8f6985082bca5d565aef6ec7e bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv +987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml +eb420f0ea03bce2075ad4eac9237862ccbecb2c37c02d162d860516f4739b280 bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv +22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml +30f0105da3f2c579a8261a30ed6c3fcc8308cf9ebc2068f0e71168567e919922 bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv +22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml +168da3dcbf6ca795bb75ec67b9fc567788637c25875b766cc76b441825e6020c bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv +ef833104d5eecd273df7d9f7c39bae4a216b015bde15978ea716f1f864874de4 bertosebind_new_runs/executed/remote/gifflar_score_macro.py +578635213e1a3eddd61438a6249f14e1a5d2487267286fc459eb77972808e225 bertosebind_new_runs/executed/remote/gifflar_score_macro_seeds.py +f88bcf303685ea6a075747a12eafa7df041909b9b455d80ea98c2b536aed0de8 bertosebind_new_runs/executed/remote/gifflar_score_perrow.py +e65e21b8c9c9bd0291a034852f7ab47f826e1f51448d9ea8439b5eb23ed8eb98 bertosebind_new_runs/executed/remote/logs/aff_attr_motif_16596807.out +dadfe2c408938645b4138bb011719affdaebe7098060f66354df56da71d0a146 bertosebind_new_runs/executed/remote/logs/aff_b4_grep_16604967.out +79eb29df46c44942a2a6ac4313789ebc29e1672bec4512c4f965be5ebb739cc9 bertosebind_new_runs/executed/remote/logs/aff_b4_s3_16604914.out +5d93f96fb6e537c9b802fd1b2d9fe25df41a19800f85ea860246274d2e897d71 bertosebind_new_runs/executed/remote/logs/aff_b4_s3r2_16605803.out +6c486b37a642549a8dcf924eabd52e2660d88a6ada53ba05aecb91937fd98626 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_0.err +7832596dfd62832aadeed39c1acca59643f00ec8dbe812730b49bd1b2ca5150b bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_0.out +bf5e3ff79c6b942dca7f35dcb85d0f32081b03875cb4640022fab29dff833b11 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_1.err +134b045efbf1f560d0d41fa702ff53b6369fd38235fcef55ca8aaa4615698fed bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_1.out +d911a9619dee68a9fc982bb3db253b8e72f12dc1c06d2bc434556211909b2719 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_10.err +c079926adcc0d2bce5b591f870208dcd2bef2ea3029aee8950bf0ce44c1105ea bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_10.out +5024c4160aeeccd212930b0d959ed0bab4dd7bf593b61b26decd78c7513aa638 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_11.err +4d110e939761ff4d8c7938c754e182d2c09ede84c8360d10ce18a04280dafea6 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_11.out +d9383fa7e0469a436e08d24f4f9af31c1a6fb9ebb5e115843b53e2b2ded612f1 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_2.err +0bbeab27824eeffbbfe5cf04317d1795b1f8f02d4c5ad9b7dbc23e159a823940 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_2.out +735f42f273046b3af0374283927429fa75a1b7a8b66d6b205a20e4e1cfd59eed bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_3.err +dcdbc088e7945d0f63803ac95aed81f3f8c8d25c97dd760df269921a08bacae7 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_3.out +98912251710582e65eaed2ba01ee184d957d177ec31e30969939b4ef0962a2bf bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_4.err +b1febe3591a887bd63d7bb607536ce17bdab51eb9db9a8b8c3d9d5ff77aca1c2 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_4.out +cbb38c7fc50100cfa44cdf9b64de3df9a002613c62d8489b9d3db301406712c7 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_5.err +a1b8f17ba63285c54d42ad49ce61bf8356ac4dfe279de8b65f687304783bdf55 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_5.out +8ec18cd103ee2f80b2bacc8660a53588ed6313dbdc2455fe87fb5cdac6d30ef1 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_6.err +18050c22347d3a2900b0d15cd7f2b97c1f6028ff27e5e060fc33c8308851b358 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_6.out +1a1baefb3f9d8bae9c38975310f96004470e75bed27b32b5273b31a9baca05f5 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_7.err +8869a90d89089a6f26c7d88b1a389630930c35adff10016a015bc5bb331308b7 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_7.out +01b633582a3ed13728f688fde16693926778896ba0952506cce66072f600f354 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_8.err +8f468cb20588f01bc0794c43ea69d5fa78627f4e35ef7ecdb7ffbcd3266c78c3 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_8.out +a3ea46d3bd9191b9bbd49627cbfdac0dee312230e5e1ed93016f98f8786b94ba bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_9.err +313f8c5e3999dfa75ae508fd57d0d033a00b40cdf2b794cb4c32fb0a901b53bb bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_9.out +53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_0.err +19bb18892da4f9174e308bd42908a6e6d383001edd75c9ad482eef111b5bbb31 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_0.out +53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_1.err +152af1228aa39534d68470023321d4350bb2ea4b997bfd0bf38efbbeb92bad8b bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_1.out +53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_10.err +d842f047adc16782a9724406ecab07aa67fe3ad853f5d0c8bee73cb63d129782 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_10.out +53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_11.err +922dfe72fd457b50a6c468db266827346ab1173381458ad61e21ceb5a0c8736c bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_11.out +53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_2.err +2b008f6ae0f5554b9841582ded12a01558218558d8b7748899e94a0499d8caaf bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_2.out +53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_3.err +c1d325125ee0463b230e5ac347c45a117ebc1a1686393d9d7bd63dd7c9a8a8d4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_3.out +53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_4.err +939f30920d3d4a772d8736c945f6e39dc949cde64cc7b9b9e0116e7b45f4f895 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_4.out +53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_5.err +7817d9b5c087d542f2c0659726a66532091a24c9b05edb04196a756291dd5784 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_5.out +53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_6.err +4283aa1d699582d4766ca394cf2d9c4b046ce8247b5cef0f8250c424329138a2 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_6.out +53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_7.err +eb0257132cbd79d1a3a84bec543183b7bbdaceaaaefc85c988368d70d4146322 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_7.out +53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_8.err +523b5ac11259832265dab5c4e08d837f3fe7e4780048a5a4af1f513f6b8c3d4a bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_8.out +53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_9.err +40ef3d8f12ba723cfe0e845ec72a960dbd32c8bc5baa3013f570e1c27a6431b6 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_9.out +06fbfcd2f820fc4621d35c16dcd6bbece93ea68b96d417d8b7bd2ce3ea104cdb bertosebind_new_runs/executed/remote/manifest.json +bf602abb05eeb3b0203766d9d1bc462579c181bc3418d762f6d02d5f36e8a230 bertosebind_new_runs/executed/remote/train_lgi.py +9d13452309d64f138705657334b74738eaf167c9faff835d024582e0e98c0af8 bertosebind_new_runs/inputs/current_glycan_sets/doubly_cold_exposure_join.csv +e5eebf2072779d7001dabd3981237025be37eee6f19a5b109b00ce4b3e776e09 bertosebind_new_runs/inputs/current_glycan_sets/doubly_cold_scored_glycans.csv +4d101cc92685c63ecca99cfad2c1bc46c73c77b1e565bd686bde14ee0d020886 bertosebind_new_runs/inputs/current_glycan_sets/glycan_cold_exposure_join.csv +0faab973a6ee5e5bf712983d51fad9f746e34edcbe5342574d45933bba62f48a bertosebind_new_runs/inputs/current_glycan_sets/glycan_cold_scored_glycans.csv +7655d9d080df7cb5dc748b7d9721037fbec67c04cf837e4724f0afba7e7a4d71 bertosebind_new_runs/inputs/current_glycan_sets/manifest.json +08ceef347f61012e0baab4daf1472122dc80335c6ea02fe084098c055a3e3e30 bertosebind_new_runs/inputs/current_glycan_sets/protein_cold_exposure_join.csv +f35d6088903e993f46adee07806e577456599d9814f4f43e40efdf3d8ddf6c46 bertosebind_new_runs/inputs/current_glycan_sets/protein_cold_scored_glycans.csv +56d04a5a985d2bd96067e5c1a1e7acd67c5f76ae05c17831bc5949cb6bee26ab bertosebind_new_runs/package_manifest.json +924765b90a840277c5ed9dd6594a8ded2d5f7add5b138a9af1adf89bbb46cbcc bertosebind_new_runs/protocol/amendment_excerpts_20260925_26.md +04dea299feb3ac0840ff5db7471381ad3f1cf531653bf6aeb9825005236d2f0b bertosebind_new_runs/protocol/original_20260910.md +11014b5f0972c23b7225c4202f2254b444109b8105563d968e9c8f4534061ff1 bertosebind_new_runs/provenance/bootstrap_anatomy_audit.json +d2812e72a7befc1bdb08465189d2fed035ae725142c1cf978a578e0add72e94d bertosebind_new_runs/provenance/bootstrap_code_audit.json +d6e36605873c587028c6dab2dde8093c6e4e33df53ebc27f1d6e3c6b4de14991 bertosebind_new_runs/provenance/bootstrap_exact_input_manifest.json +30a70a1703183b50fa1c10986c065471513981fac1e3e69f9c7ad649aeecb16a bertosebind_new_runs/provenance/current_pretraining_exposure_audit.json +ff65b38435040ba2f5987e0c78ecc0fafc4604341b9bc094513d47cb343db023 bertosebind_new_runs/provenance/exposure_portability.patch +6649cef7a00096ba2981c611a4c6432be93300e3bb439cd543a692cbb40a15af bertosebind_new_runs/provenance/gifflar_scorer_diff.txt +7d24cac24a37583fddac7d91c73e22ea6d4a022194ac213ab354f9e9831b1084 bertosebind_new_runs/provenance/protein_gifflar_audit.json +9d2e628a789a46a69333c24550d2a150166aebed382880c2d0a67fbd43124eaa bertosebind_new_runs/provenance/protein_gifflar_verified_numbers.json +4b49c6f8f6c9953cee46ff2f6c47e1bb68692c9b58984973b3d8666648999f62 bertosebind_new_runs/reproduce_summary.py +99acda4c8365d691c16de3e032e225de05cee38cff063a772bf9eaec2067328f bertosebind_new_runs/requirements.txt +0dff08537f0cd5a1ad40562537c48546d3d4f3858a75b2ab2d3729b22a5dfe91 bertosebind_new_runs/results/doubly_cold_anatomy.json +4186c66c13fd05d62d83a10df2a5761b2e29ded502660c12cb450836f9881496 bertosebind_new_runs/results/doubly_cold_per_assay.csv +2c494ac1351d4ff63828139eac004c0047dc3259d62fd10334d5a740cab9182f bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s43.json +82173016b893cb2913e90e99feea5f6f4ff22cff9e1aff0fe7dc136161c7f627 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s44.json +ac58a83969a0ffb860cf1a33a472f4cb5b3e14f25097c3ba909f7555f65aa589 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json +d2d2d73c834a2fcca7b8c22fd6ce91907f18866443628c2c54f8b8ec04477803 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json +7b0a01a1acc7e2ca80a3de9aaab02941942ead519e6661abec6c44c7fa5fd079 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s43.json +f2e40d306b767e6949c02304077a08398dc16ac19d08d94937f7dc49abd7cc24 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s44.json +e13c8021d6e94b3bd6cb4ef00d7456c182449f57c4b1356256e011805a6efdbf bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s43.json +d274d35c9a0ba25e4597cdb8c01001f4f7ff7760aabfe7c8a00b84a70b74252f bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s44.json +2208056d5303fda27c5b541eed1c6f64cb03de1c10abd2868d4ce55d1bdb475c bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s43.json +c831378d73c3c2c9456be5ff9ff05acc34b64815b056c5df21bef2078a415393 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s44.json +121a30d0de568217e722036cf25ba4ef61128398fde3466fc8b2f60f096722c7 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json +3d29ac377491db5d952f6066228fe4099f99db0e2fbaa80063ee429fc28e0a28 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json +4fd80f7396aa9803602fd62bd82ec3e98e1f937b46e1057cb26ffa56ea6c93f0 bertosebind_new_runs/results/protein_probe.json +f224aac78366d64d60b86841b11a9694d234e955904112d266de9bbbc4d8af3e check_release.py +9acda1420a4df8efc4b73432e517c32a55aa26b4d9c7bb3487e2a565565089e0 code_inventory.tsv +6d805fd046c5aca89ef531f37950bb73ef15125865c6a841dcc4934ba7932780 docs/DATA_ACCESS.md +1fa5b83d57f611207e04c88d2190d6cd364833b4c6ec9c0ca35649937ec5f645 docs/QUICKSTART.md +b5072e437307aedfd1f789b3dc8024498e6c96ffb6f80d06d0f6a08a805d4b00 docs/TRAINING.md +5f19be94138c38e9f35afa27aeedb514f9421a4e4724ee27c76ec0302487eed3 docs/WEBSITE_INTEGRATION.md +52263f18a04e465305b49d53a73f9682849fd138fe817d4afb774c48252d869b docs/reproduction.md +4008db9ad60a8d97e5bf705cee0da416dd6755eed15ab4882ffa61e04e4299a5 download_assets.py +b8fe7b4e50ffa4caf7ca9c50742dd279bb4a717b6fad629a24971ceab635b2ab embed.py +a46c2c31f02fb0829fbe70a29c4c032b16a1cd5208386c2ecbc9f6c3fc2018bc examples/glycans.csv +b4a8c26479a118943646d4baae370c1d0a267fe30c487fbf816a3999b5a4ed03 examples/predictions.csv +903d14d8bafc9ae2aa968a74ad4b9d31396c598624fe05e2acb1814cb60bd60e examples/smoke_affinose.py +ff95ff2a7707940b849a44259cdf356f66dd5b0351faf4e400feac6666afd9af examples/smoke_models.py +89b65f9186f2080eab214f1b7389854cd8477124cdc729a428624312fb7a1453 executed/downstream/review_a5_native_checkpoint.py +1c958427bca7991b8ec091b6f0c8d209fc1ddfaf1aa9e1f96ad22ed5c60b839d executed/downstream/run_review_native_md_on_terminal4_s42.py +75d530c95c218fafb25e844865dd3884737d11b23c4cfdc121226549923fecdb figures/Figure_style.md +83791502b5e689451ea735a3da108185ad5aed4d861a187b68c622e0b4b3fe69 figures/README.md +14addd0706d771da818f53b0d17a0248ba496c7e6ceb3850b89cc6573d35ae71 figures/ablation_figure9/README.md +a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b figures/ablation_figure9/nature-bpg-palette.json +179bf3ddb15842c726a90a9cf373c7861409c8f823bae344a0b621fa77ed51f9 figures/ablation_figure9/plot_data.json +457cfdc37e557c623d23292cfb221b214b9f158ab9ec611576b5553969ce4469 figures/bootstrap_figure13/README.md +fbddc62114cd214265d12bb11584004988c169731fe66c8faba20d1c871bb876 figures/bootstrap_figure13/build_figure13.py +6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235 figures/bootstrap_figure13/inputs/affinose_b4_step3_bootstrap_r2_20260927.json +a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b figures/bootstrap_figure13/inputs/nature-bpg-palette.json +7b14add6ccb6e16d72ab066ae902b77fd15cca4baab69c52015a828c5bc32b35 figures/bootstrap_figure13/inputs/review_affinose_gifflar_seed_welch.csv +8a5ce609298e83a231895587c64a24bbc535a3887feb157ef2b4934db4355243 figures/bootstrap_figure13/inputs/review_affinose_individual_values.csv +cd5a299c7b3a21ce8bbd0c445e66b938e497658e9ffe602d562517eb1ce103fd figures/bootstrap_figure13/inputs/review_affinose_results.csv +c0957bc56e0694a72289183e7424b49383346e6e55c245b92132c2e77ffc6f9d figures/bootstrap_figure13/inputs/source_manifest.json +d734b8076500af5edbd2bedd26f29004fb066725a45c273e35b49a1a711d26b1 figures/build_bpe_figure3.py +0ceff115647c4921165805fb25fb5ec5451e8ac1264a9140b3db8591f30f66d2 figures/build_corpus_composition_figure.py +6053ddca0892325752308544a39da61d427de959f6559ab771902b0c30c7c103 figures/build_grey_seal_figure5.py +90fd5e292872323cf90b2312903f8320731808e382a4798cc033379ebd57e568 figures/build_submission_figures.py +f112a826a7b210c2700d810c2a62f91d80c0f2e964b141290f0343f648ce8a81 figures/build_supplement_figure1.py +2b33f563431fc64271f84bebfbf99210e057d4f6d8b4b838316c574aa6bf33b8 figures/build_supplement_presentation.py +ba1cbfccd6a8f0e029849e9188ae212cfbf9afbc5174d1099970911821c740a1 figures/build_supplementary_figure9.py +25e648b564e4db77532947bcd432cf82ef15cd08f5676441a21feffadb9eacfa figures/build_taxonomy_figure11.py +e964dc2d021382d5950008eceef05d001d640de608b0d86ce37701db5de8379e figures/build_token_length_figure2.py +de51e3d170a28a319aed0eaf8f0ee5c1a3b95c59146d0360a3e228c947178a78 figures/build_training_coverage_figure6.py +dd7f57d15e39df52dfa3a92a1ba3aab7e85c284fabc926cffbcad7876366b852 figures/compact_modalities/README.md +5d2748b98cf4f4ce9b74b71b8617d98c6d52a7cf3b68b567210727659804b363 figures/compact_modalities/builders/build_figures6_7.py +000b70258a2b599a326903d9792e11b6bb67adf5ed6730b5fddc416df6cbe7d7 figures/compact_modalities/inputs/figure7_original_provenance.json +3e96d8092239c2c21f217ad5bae4ee7e07dbe0f7630b213bad468d6b08d3b1c1 figures/compact_modalities/inputs/review_md_temporal_20x6_core_r3.py +a0096e0a0cd5ac6ade78c6b0ee4b0b0fffc7d2c8969899f26f03134aa63edd8e figures/compact_modalities/inputs/review_training_modality_coverage.csv +2373a8e7e2998023e764a4a69dead5f3f3a5cba87743fd8762e31bfb55e03393 figures/contrastive_figure12/README.md +ed7446d8ab3b4a0258cc031361b93e1613fab438786a81fc1a775b88f6ae3c67 figures/contrastive_figure12/build_figure12.py +a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b figures/contrastive_figure12/inputs/nature-bpg-palette.json +d732e76c28cd3d741fad99636a8937b464f1efa190d26e7005146e6c88b1feb3 figures/contrastive_figure12/inputs/review_contrastive_fit_values.csv +5bfd6352e60158fe3a09c2a3228a7fffc4926780aa320b5e205ef276db3e4113 figures/contrastive_figure12/inputs/review_contrastive_paired_summary.csv +dc90a817bc54ac310a73298f60d03fc30eaccd724f4676eb826301dd85470acc figures/contrastive_figure12/inputs/review_contrastive_taxonomy_summary.csv +a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b figures/figure3_inputs/nature-bpg-palette.json +bd530abacb61f3d6cffda8d1e7e6112f9261fd0a761e594fddceb5c615b9497b figures/figure3_inputs/partition_count_flow.csv +918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b figures/figure3_inputs/review_bpe_vocabulary.json +c885944b4ebce9b08c99318ce51c81b7648309c49ba5244ad0345b794429f151 figures/figure3_inputs/source_example.json +8bed92feb2c7ff8f8759e4fa287470336e364764ac7b6fead456840b92b5a5db figures/final_iar/README.md +014b0949823ae8691f09efccab38919400282c33e0fd9b6994b39a6fb4ad78dd figures/final_iar/build_final_iar_figures.py +259fdc68a39b415c4ec114fbd6872ceaccaf09327d1fde958390071a5a94af2a figures/final_iar/inputs/baselines_same_cases.csv +d5b7fd634677ea22ea27670649ea30636ef6c98daedc8592cd3f5d7b56beb9c0 figures/final_iar/inputs/final_iar_summary.json +50906ea3964a4a7c9744d224c8ffe2d356738d83bc0f5ead05b04ae6c558a64a figures/final_iar/inputs/iar_recount_and_wilson_intervals.csv +a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b figures/final_iar/inputs/nature-bpg-palette.json +0aa0dc0fb74388a72750578acdf9beafba917a1976059c813157a90eceae3419 figures/final_iar/inputs/run_manifest.json +61136a3d00e0184db8fbf4db47fa480766e7dadbb4f81d278df27b1fd0a0613c figures/model_variants_figure10/README.md +d88d4db86071e94d9012f0062696920c2c44a9a15a66e3f152826943234aac0c figures/model_variants_figure10/build_model_variants_figure10.py +53fdfc11a75e3aaf39b78a9c59d90e206b0726579440d03df2d5cb5708249ebf figures/model_variants_figure10/inputs/review_weight_policy_ranks.csv +9b35cb9ab5056c0548eea944f8472906a8cb36e2a7adf5cf3135268c675619b7 figures/model_variants_figure10/inputs/review_weight_policy_sensitivity.csv +dd96f6ec2247a918a89873dd031be5f738bcd870056e9b98cb7a1e2c85e158e8 figures/taxonomy_figure11/README.md +a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b figures/taxonomy_figure11/nature-bpg-palette.json +04670f06e3459608d7a43da767531544421d4da1a6125376edc3939dba951d1f iar_completion/README.md +8f7e1027e67222d49eb9e3c12fcdff083005d182583990c08c54b7ac3c11040e iar_completion/SHA256SUMS +a03990a02a1737de05a7fa1739164e84fa6a0a4170ebaa65317a9f3c2f16c0b0 iar_completion/assets/linkage_readout.pt +37514cb79322719772b5c14a5795f00a78f3275f3315d5b3b674ee97127ca953 iar_completion/check_package.py +bbf016ce2f1a7dc82940be28397cbe8083da7ad0f5f525b1cf7345fd42a5758d iar_completion/model_metadata.json +d406620e3b0c070dff4d6fb6e0c57effce848a9ca5b3dc3de705d65c49ac0961 iar_completion/originals/run_all_training.sbatch +5acafc45244a0bf9a8489794f8a39f956622cf50594d87eb2eaa04502589fcb5 iar_completion/originals/wa3_final_iar_readout.py +72f8583bf32799ba29c09829d138900c0cbb589f73bd278f389da6fa8a786730 iar_completion/originals/wa3_final_iar_readout_all.py +679499406106611dc2c70240a3c14c9b94311bc03a7811d3dae807c58aef4ef8 iar_completion/originals/wa3_linkage_diagnosis.py +0ebc629778c854621f485ceb4f5f11090e84ac9171d52270fcc90b6b07d6fe7f iar_completion/originals/wa3_linkage_probe.py +0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 iar_completion/originals/wa3_same_test.py +c6e9506dbf97752aa248e325e75acf3abf63495054bcac68d48602967379531d iar_completion/originals/wa3_typed_strict_test.py +1341b0051fefaf54b4113d7dda5e408540844d12a9275f9a73607c416f35928d iar_completion/originals/wa3_typed_test.py +259fdc68a39b415c4ec114fbd6872ceaccaf09327d1fde958390071a5a94af2a iar_completion/provenance/final_run/baselines_same_cases.csv +d5b7fd634677ea22ea27670649ea30636ef6c98daedc8592cd3f5d7b56beb9c0 iar_completion/provenance/final_run/final_iar_summary.json +0aa0dc0fb74388a72750578acdf9beafba917a1976059c813157a90eceae3419 iar_completion/provenance/final_run/run_manifest.json +a615d9a889c7a62c19d05a4d07d66d9e743fbfb9e37e4d646c889490d297e492 iar_completion/provenance/heldout_masking_wa3_final_iar_readout_20260926_run_manifest.json +0aa0dc0fb74388a72750578acdf9beafba917a1976059c813157a90eceae3419 iar_completion/provenance/heldout_masking_wa3_final_iar_readout_all_20260927_run_manifest.json +933ef4d07c380bd4322814acff135e207e00db36197c3dc543214b24cb5d554e iar_completion/provenance/heldout_masking_wa3_linkage_diagnosis_20260925_run_manifest.json +3f713f4e074cbb068264173a8fb0ec99813665ad1b23fdea507f7389071cb04b iar_completion/provenance/heldout_masking_wa3_same_test_run_manifest.json +b3cf90dc772f206dc386a3a92d96e43d7a6c1de4147bc7cc501599730d31807f iar_completion/provenance/heldout_masking_wa3_typed_20260924_run_manifest.json +4a13b9faecc329257c2aa08fd6734a8b6c02837d0b230b0f659fd00602832c75 iar_completion/provenance/heldout_masking_wa3_typed_strict_20260925_run_manifest.json +9c957fe6b76da503c909ac4e3a0d70cf4ea1fd6da34a3aa6573bac4722d4c62d iar_completion/provenance/local_checks.json +8af8ed8b6124f26072d6041deb0e6966c13c149926f5bd720b714884cba6801e iar_completion/provenance/required_input_hashes.json +2cb3a3f4e8b1d37dd3ad0234996d546f34ab48231bf69247ffb6ace0651a4a69 iar_completion/provenance/source_inventory.json +42464d76c743a302bae79ced6b09af9657444c6f977535b5de49dcf59a5a8a90 iar_completion/readout.py +9ef74c17ef3ffacde3f0fc862f9844757bacfffa55b3ac9e7e6a6cca43f5843c iar_completion/requirements.txt +3392850a98f1739e3eec8434f42c26f3fad2d3da9fc815a17dd2790aa3b0ff98 iar_completion/runtime_dependencies.json +a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6 iar_completion/runtime_snapshot/java/review_A5WurcsArrayTreeAudit.java +bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf iar_completion/runtime_snapshot/java/review_MolWURCS.jar +5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37 iar_completion/runtime_snapshot/java/review_wurcsframework-1.3.1.jar +0bc54399362945601bcfd403441fc80968d173200dd0561f57568b2053a94839 iar_completion/runtime_snapshot/project/bert_training_v4/downstream_tasks/utils/wurcs_bpe_tokenizer.py +c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74 iar_completion/runtime_snapshot/project/data/bpe_ambiguity_tokens.json +6a572afdf53f1494ab96c896876b824ca7ea749777352606aa9f96bf270ceecc iar_completion/runtime_snapshot/project/data/bpe_vocabulary_clean.json +22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_ambiguity_tokens.json +918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json +10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04 iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py +f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7 iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py +6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4 iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py +de8c3237b858b640ee9fbf4dac34864c54b6dac80bc89f346a44c774254289a4 iar_completion/runtime_snapshot/project/writing/cluster/nature_submission/code/model/__init__.py +b69f14c9976951325e3a0a4e8107a16126e67d410e966650f513f1f538a732bb iar_completion/runtime_snapshot/project/writing/cluster/nature_submission/code/model/glycan_bert.py +8e06c32f4e844c3c66f146fd15a075472808a0720c892d0b9683dfd32f15ef0c iar_completion/runtime_snapshot/project/writing/cluster/nature_submission/code/model/multimodal_glycan_bert_v3.py +f0c8efda7a12942b4c6359792d6ee9417e6a9ec0eb04623ad17b4772430270b5 iar_completion/runtime_snapshot/project/writing/cluster/nature_submission/code/training/ipa_bpe_distillation.py +8d05a4048e200625694ff9a36f50af89b845fd0d38ba8034a97a710e7ad3dce2 iar_completion/runtime_snapshot/project/writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py +cfce20d28291c8b5868d35386990037415090202dd823bdfd73038456cc65557 iar_completion/runtime_snapshot/schema/classify.py +704ed130bdcce94a7af7ce3e37654705f709b8526f632907ef794451c6ef7f30 iar_completion/runtime_snapshot/schema/pipelib.py +be4b51d806c364f6aa88119d17d71674b8313dde8a35c82099ca755a5c46e0b6 iar_inference/README.md +1d21cb72f1cc7d5a094a5fb5f0ec11a6072df996f0975cc39569ed9964daee1c iar_inference/SHA256SUMS +043a38744f9fd832181d822ae8481488d954604bf615b2eb05c4c8ad29794325 iar_inference/config.json +a212cfbd49ec2f951e942c92caaac63260687a626eca588cb692d86bb1e52198 iar_inference/fixtures/case0_pre_sequence_head.npy +6ffca438526432a33168a85a0fee1158fd2a9c9f23ecb97f587235f204ae50b3 iar_inference/fixtures/case1_pre_sequence_head.npy +60ac0c0fd1b6e0ada2d847d1fccff4f6fe7c085aab3146247dc5d7bfebbabc27 iar_inference/fixtures/rebuilt_two_case_inputs.json +60dcdb6262457962da84c7b239c194fac343bd8d27db0e05f15906acb9bf5f4b iar_inference/fixtures/reference_smoke_report.json +9237b349668ea3fb5266f4696169fd958e9f997e5064ede0ab06e41859b17361 iar_inference/infer.py +87fa484e1f6105fa476dff4cf8c7e6aea71a2aac537796131a4858632f54b906 iar_inference/original_inference_helpers.py +4e36f9237dc494eb47898ff3ab9a5b1a483f5004aa933a5294af794edd0757ce iar_inference/preparation_validation.json +16e89b25a13eabc8586ba2a8ec32890ecf321f652b03f7548c63112d13cb2e62 iar_inference/requirements.txt +144e09f44c6cc2c09df0fafefb2c3975c590ae684756500fae9b6a589767574c notebooks/BERTose_workbench.ipynb +a4b66d2ed429ad6516646256a84173082b2fca6b779baa6e4ff93586a81a5c2b provenance/WA3_checkpoint_index.json +b8b05510e97f6b94ca5e0d1465eba034724d7ddcc405aa405db09c4c29fc768b provenance/WA3_final_receipt.json +670cfcbcfe89e0729bb75f122cff8c7100c24d39ef775c69421d4bb820654056 provenance/affinose_arms_on_test_20260909.json +a291a8e8f2b77c7955b5346aa52289afc520a0b5181d62eb0dfa2c096bd6bbb8 provenance/affinose_cells/affinose_mo_20260908_mo_A_glycan_s42/receipt.json +fdd520b70e38d0e6bc112118adad89cf209278614645b47e219341736bf99599 provenance/affinose_cells/affinose_mo_20260908_mo_A_glycan_s42/results.json +29b68fb30127700fa55942d5cc4c237f8bf15c2d0c883192b62698d811e71c51 provenance/affinose_cells/affinose_mo_20260908_mo_C_doubly_s42/receipt.json +54918a535b86b01590bab11c78ff4c354c106ca78a384446eb79038b0df666af provenance/affinose_cells/affinose_mo_20260908_mo_C_doubly_s42/results.json +a380534df6f877c212a2c7dbce577511e282537bbff9ad5d7ac3e186f1cc5633 provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s43/receipt.json +a732a56ddc81fc41b02dde8f56d852929ec8eefa12524ed9410a09361f267544 provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s43/results.json +9344a727416db1368c45a0ddad962a12130e10f03944a5142874f72ba5311297 provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s44/receipt.json +a530b2fac81a72d99674906253897a1e3eecca4ee17e83c3a27ed409a3411877 provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s44/results.json +068bb72cc2fc0231f3a9f729ac78f1a6340a7088ea86a60449ebe63dcfbd794d provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s43/receipt.json +a21307bb48db62270792f990541bac1c2728feb34063f4b2009e2f6c7d8a7e4c provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s43/results.json +3044b56619b1bb83063070624b02bfaa64c952c1da76a80051bb62bb26098395 provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s44/receipt.json +42ffeb2f81acbae80df3284300d0213b52918b90d3b186dbbd1f074800af75f0 provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s44/results.json +07a919272c928f9630f4d70a73cf1aa91a327e2c9597cf582814c5386b6f24cc provenance/affinose_cells/affinose_sa_20260908_mo_B_protein_s42/receipt.json +ef5a0b42f15f23a473d46198bd39dc17176add75a1bf76cd708d5b595d552b6e provenance/affinose_cells/affinose_sa_20260908_mo_B_protein_s42/results.json +c3e3028a05cf7f5b58883d9485bcd7a7e0ba5d05265f4503b8bad09e307c1480 provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s43/receipt.json +f62ddffaffae54f91e4f921fa235741df4023e94b47c2c90f3e158b7c4cd9858 provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s43/results.json +6f5cbc9e19a45b4e9c8d33e7f4a82e41ef610b5040175852d3c05ea172995d4f provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s44/receipt.json +9f0a6dc5b89f58603fb368e754da90001a987016ed4d9ab425420703aeb44d9e provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s44/results.json +f4fb099a7dbe229450d2ca337d213555203dc69dd67f1e4b2cca227baca3d701 provenance/affinose_input_hashes_moA_glycan_20260908.json +00c53175abc949336bf495c796dc9c779af2109227bc6f351433356129d85663 provenance/affinose_input_hashes_moB_protein_20260908.json +3d3c6fd5c39fe2f1ce37ce5ba47b842fa193b716c08227678d68cdcc7e996c4e provenance/affinose_input_hashes_moC_doubly_20260908.json +ebf5e35b60640944bf3d03955f10da2c40cd5075a85bf0e3a4c6210f97ed85a6 provenance/affinose_recipe.json +9c14d2981a11bef92ef230e9848f9876d941b290f2c70848e739a2795bb6feea provenance/artifact_locations.tsv +4dfa51299e99a23add6cdfe5380403d4504a207e2b6522ea86cc50ba1cd2cb74 provenance/candidate_affinose_input_hashes_moA_glycan_20260908.json +48768c773a262864e7a5104732d1e37971be2581058dec7e6f8778d05483965c provenance/candidate_affinose_input_hashes_moB_protein_20260908.json +efbfbea3df98ff7b20dadae530aaf5e3cdadc7216a60a97495b4344e39ef1934 provenance/candidate_affinose_input_hashes_moC_doubly_20260908.json +2ce6f4a60fdb0bc87d69e270bd724fbccbfae6239579f3c17c0c4d8de05b3d94 provenance/candidate_portability.patch +16bed602b94a1a3010f07c2feca3e219035160ab5cc05f4ab202faf57ae1c63c provenance/copied_sources.json +967d38d95702e0863eec468dac9de27fee7da60312fc53ba0f95c5b88f381595 provenance/execution_summary.json +f4cd53bb88fb383677e0f85417662c01a351a954db6df93b6162d0aadda495b0 provenance/local_checks.json +fc689486dc297277e32480d52d9abb69549520c085101bd406ef3ed6c2fad86b provenance/local_test_environment.json +7202cdde019556a7babb3459ae04da8ab5ecb5edbdfde2b74c4a675ed1c9ff43 provenance/moconf_cells.tsv +e6f1be53ab77ad80ea274f80bd11369bb4efe3836b6119c58283ec12af224752 provenance/mofull_cells.tsv +67b5ade1b857e789173128939c6baa4687354bb1d640d8fd3b40332b5956ec72 provenance/motif_cells.tsv +fb75dee7521e1ca381d9b1fd5c7054bb7ba6389dfde61259362ae4d082ba9a7e provenance/portable_execution_20260930/binding_portable_report.json +24f61f4291610df9d7ad89a0cc8afb6a472e41b2dab3ef1ca73d852076c073da provenance/portable_execution_20260930/code_snapshot_manifest.json +07fee191f75e12c5becd19b3dbe627ff3a9dbcfcdeb0aea770126483bfd0cebb provenance/portable_execution_20260930/execution_receipt.json +b51a0f8f5c7b5682e4c432587236bce9daa74e6f2389ccba89b34bcc8c0042cd provenance/portable_execution_20260930/iar_portable_report.json +7fb7d9274cc72e65b8a8026256841c9fbcdbbdf82747b319b46b008d4ca4700c provenance/release_manifest.json +dc42f4cdd76cc2c49fedfe6b8b8ef40b5915ee70803c9cec5ec0b0573256f815 provenance/score_arms_on_test_historical.py +e2bad73cbdcc16a2a44f2d6e8230bc55b5a8a484d7553af29e379a12f541bba9 provenance/sequence_variants.json +6fc928f84838ac82af228d744fadb8be670d631afd5ca84ff84d0847b140d8fd provenance/submission_README.md +cf0e33d454260a8fa949a9c5fea60bac6291b84c3db573e48fb1735f3a2a2772 provenance/submission_SHA256SUMS +80aae521be2bdc5ac2337ea733f7a8ade028f788499d7d44ff1b6e7389639c8d provenance/submission_code_inventory.tsv +48da67d3a47fb1155389fccdd9022b825b2eeefb60e28260633ec4c2fe00a33f provenance/submission_requirements.txt +05832b5f811b977c09418c79545d8e38c689973b4a91e36a96e20389ac3c0e2c provenance/third_party_archives.json +b7cb8a39e167f2cc9e35476dcdcad56320b02c1898d13db3236a41bbb2ed4852 provenance/training_v8_before_resume_load_fix.py +be8f4ae30ae2fbd8f91de0e5db98de3044213e24587717775c31df37e2272dbb provenance/wa3_config.json +881354fe1ef1eb6ae73565a42da2b175a0426f41feb6b3a1d8897c4e048fa012 provenance/workbench_assets.json +fcbf7a31abd2f468c589feca4111a1d5b851e587046aed53ca0196deb3f39e74 requirements-analysis.txt +2c69dc6c9b8643afe0e9fbd5f2f355662dc55f2b555f2b096b582065baa2db74 requirements-workbench.txt +1c89cbdda9d2c1fb7a3df6692f93eb2765f59f64dd3392b8799697f3238a8867 requirements.txt +428d6c855cd9a6a1988581f9d71bd85a130ceb7b803e6190b3590f5e40ef426c score_predictions.py +1a8459fea8d7d35948bd4315d840a0ec6f60e4fcb4823e18d903294f2c1c20d5 structure_md_processing/README.md +d1c48e285928b5b4e2b84f7748bfeb3360f0c98c8d66ac1651927f849e5384f6 structure_md_processing/SHA256SUMS +39c6691d762b1ac2d0bed3464b1ed31e4fbe72b18e218ba4a553f3f94702a9e2 structure_md_processing/evidence/review_md_parent_temporal_20x6_v2_summary.json +823f089df162283c6ed2077d7c8af1cfc49d1f814e58a029b64c2c18a0a075d8 structure_md_processing/extension_checks.json +2e644b90c80388a169da946a22557e0d6d0f37876334fa5d450f27fce41aebe1 structure_md_processing/independent_qa_20260930.json +1e15e8a160c1af8e31c490fde35e9177fce583d98157751a852846d1390cb43a structure_md_processing/input_closure_20260930.json +0f43a293b4b5edaa76da4c4073a7a221582b064c41375a7de982b09dbfe05642 structure_md_processing/prior_snapshot_20260929.json +0d967082a8225a1eab98315c2fe7916eff0e863ec04287a43351b757e08f5070 structure_md_processing/project/training/__init__.py +daae9ee3f3c286e36c7fd7ede37f889eca2a6f9956755717a5bf714645ffa4bb structure_md_processing/project/training/a5_glycam_chemistry.py +ee6e3d06fce7316b3622f4ad92d900608eb91af09f3872d0200c1b246158605f structure_md_processing/project/training/a5_static_alignment.py +f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7 structure_md_processing/project/training/a5_topology.py +d08683664ffe28661becd6bdfd5b6b8169bd430800c3e844218969548d3498a2 structure_md_processing/project/training/masking.py +ca2be55ece9c15271713f553f619bdd42cf4292c6c9d86e19037db9a73168e28 structure_md_processing/project/training/multimodal_dataset.py +21ae467f964ea98486ed7efa3f7887194e05c326e4fa92f124e8d5f5570f030c structure_md_processing/project/training/multimodal_masking.py +2e3b0a72767fa5e7ca950ada7923faac63e58db53f6969a030e01938a81254ad structure_md_processing/project/writing/review/glycam_structure/configs/review_md_temporal_20x6_v1_20260801.yaml +4d668c45f1f17f12b1d4af022d2e1849cec815e24664e8ad9183569fae7f764f structure_md_processing/project/writing/review/glycam_structure/configs/review_md_temporal_20x9_v1_20260731.yaml +ddabd88756774a9c75ae93709fafb6b7c2d3cdf0c9b7d5b66fd801d8e2388c76 structure_md_processing/project/writing/review/glycam_structure/scripts/audit_review_md_charge_corrected_exact_roster_20260802_r1.py +131499356bc91f07ebd1f2f40166c9f756d7e64b49a66ee69d1efa0fcecf9843 structure_md_processing/project/writing/review/glycam_structure/scripts/audit_review_md_parent_feature_package.py +dacc54f37dc4c816fdf2fb801b13eb239cf42444883ace1dfed2a92b6fc798da structure_md_processing/project/writing/review/glycam_structure/scripts/audit_review_md_temporal_20x6_r2.py +2df5009bdcefb49ed7742391d7d6f5f73cf1574fc7d17cd46bd2ad3098331a06 structure_md_processing/project/writing/review/glycam_structure/scripts/build_review_md_parent_feature_package.py +4bad11cfd69c150f2c50b92856a6ab21641772baa2236b45ca505f5637ea5a0b structure_md_processing/project/writing/review/glycam_structure/scripts/build_review_md_temporal_20x6_r2.py +2743e322eccd5c0217b44e3eb6c4dc242d35db7eacf91f235d23f7a846b70dbb structure_md_processing/project/writing/review/glycam_structure/scripts/build_review_md_temporal_20x9.py +35108afde036b0f1fbf888014a5afebc45568b45dbdea85a5913c2dba8938127 structure_md_processing/project/writing/review/glycam_structure/scripts/freeze_review_md_temporal_feature_layer.py +102466ed3bf04ef2cf2ab53b04fdbb9c6e6ea1d16061194f97eed5bedc4e2e2d structure_md_processing/project/writing/review/glycam_structure/scripts/merge_review_md_charge_corrected_temporal_20x9_r1.py +47c9d9a448325e59742e30a444b636e888df18cf88f010fdad09e0393f5bf9c9 structure_md_processing/project/writing/review/glycam_structure/scripts/prepare_review_md_charge_corrected_feature_overlay_r1.py +80c1e2cbf2f2bbf7a19564a7e88d65e2d9dd4a190c33e6b5405dd107d6e553fe structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_all20_charge_corrected_run_state_r6.py +dfc5670ad8a146af48abfb381198bacd017ad7dbac4a081bc204d5dbf61cb1cb structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_wiley_pca_corpus.py +b9f20eef44858866d95338a6f5dedebf253d8e827890d10806ce7d0045b14594 structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_wiley_pca_pilot.py +39f9ddfd0e91c3afc1c3b6085689f8bed7bf585446128be634ab97369a79869b structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_wiley_structural_extension.py +163c93827dc18dd281d8e5a6ceb8b106a02b00e3366442ee09fd0e1b477262e8 structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_wiley_torsion_pca_corpus.py +3cb1b2ea38fef04ba9ba2b01ef1944f69a48fb5dcfd4d8011684de9ddaa10ca7 structure_md_processing/project/writing/review/glycam_structure/scripts/run_review_md_charge_corrected_feature_stage_20260802_r1.sh +21ffbc09d34291adc6d2a3535ef142014d1d31ea8a28002fee23af29b88f415a structure_md_processing/project/writing/review/glycam_structure/scripts/slurm_freeze_review_md_temporal_feature_layer_20260801.sh +bf3ef76494d936044615b59e0941f3b6fb35a935d6743abb5c035995b61a63d5 structure_md_processing/project/writing/review/glycam_structure/scripts/slurm_review_md_parent_feature_package_20260731.sh +b8e953947b4ac55e1cd9d509c33e1bddf211f046b9124ddc175166a1a763b31a structure_md_processing/project/writing/review/multimodal/outputs/p1_a5_static_role_successor_cascade_20260720_r1/review_a5_static_role_successor_cascade_receipt.json +ffbbe2126eb6131ab8b64ab5809b79b29e5534785cbe6fcfe1bba04b93e06050 structure_md_processing/project/writing/review/multimodal/outputs/review_a5_static_glycam_template_registry_20260721_r2/review_a5_static_glycam_template_registry_r2.json +6bba07e7da9284af46b97f80c25c7e1dc332facf452e0fd2140a975b7c1e496b structure_md_processing/project/writing/review/multimodal/outputs/review_a5_static_glycam_template_registry_20260721_r2/review_a5_static_glycam_template_registry_receipt_r2.json +da8d6dab478ace650fa5af3e99c72dedaf65a6cbc2bf62373fa2082bef748cea structure_md_processing/project/writing/review/multimodal/runtime/a5_static_v2_20260721_r7/review_a5_static_graph_materializer_r7.py +12fd869f52759168e0f3ff3243ac7dcdb36c0b067d83e24931c185c67fc80c26 structure_md_processing/project/writing/review/multimodal/scripts/build_review_a5_static_graph_v2_20260721_r7.py +8da3a60c3d205f9a56f3a97842f3c05e647d3f89ad56c91d431eb75ede49c9ff structure_md_processing/source_manifest.json +28c3941d1ae7ebc86296a4ac7117c27a1d4bcaa0ec6c56ea8cfd18fade1bb7a2 test_bertose_workbench.py diff --git a/releases/2026-10-02/affinose/a1111_encoder_adapter.py b/releases/2026-10-02/affinose/a1111_encoder_adapter.py new file mode 100644 index 0000000000000000000000000000000000000000..3ebe2dc0bea2fcf4f82fa4704058b14c25af22e0 --- /dev/null +++ b/releases/2026-10-02/affinose/a1111_encoder_adapter.py @@ -0,0 +1,144 @@ +"""Load an A1111 / WA-lineage BERTose checkpoint as an Affinose glycan encoder. + +The a5/md20x6 lineage (A1111, WA1-WA5) stores its sequence tower under different +module names and a different vocabulary from the submitted-era v5b checkpoint that +`bertint_v8.load_bertose_encoder()` expects. This adapter renames the 209 sequence +tensors and resizes the two structural embedding tables so the tower loads STRICTLY. + +Verified 2026-08-19 against + review_md_temporal_20x6_a1111_recovery_20260806_r1/.../A1111_seed43/ + review_checkpoints/review_md20x6_checkpoint_best.pt +-> 209 remapped / 209 expected, 0 missing, 0 unexpected, 0 shape mismatch. + +WHY STRICT MATTERS. The submitted Affinose shipped an encoder that was 95% random: +`bertint_v8.py` assigned the pretrained tower and then called +`self.apply(self._init_weights)`, which silently reset it. `load_state_dict(..., +strict=False)` hid the damage. Every load here is strict, and +`assert_pretrained()` is the tensor-level gate that would have caught it. + +NAME MAPPING (both levels verified against the checkpoints, not guessed): + + sequence_embeddings.* -> seq_embeddings.* + sequence_layers.* -> seq_layers.* + convolution_projection -> conv_proj + convolutions.N -> conv_layers.N + input_norm (embeddings) -> LayerNorm (pre-conv normalisation) + output_norm (embeddings) -> conv_norm (post-conv residual merge) + attention_norm (layers) -> attention_layer_norm + output_norm (layers) -> output_layer_norm + +TRAP: `output_norm` means DIFFERENT things at the two levels — `conv_norm` inside +the embeddings module, `output_layer_norm` inside a transformer layer. The remap is +therefore prefix-scoped. Mapping it uniformly silently corrupts the encoder. + +NOT HANDLED HERE — the caller must supply data tokenized under the A1111 vocabulary +(2,114 tokens; only the 10 special tokens share IDs with Affinose's 2,090-token +vocabulary), with branch depths in [0, 203) and linkage types in [0, 10). +""" + +from __future__ import annotations + +import math +import torch +import torch.nn as nn + +A1111_VOCAB_SIZE = 2114 +A1111_MAX_BRANCH_DEPTH = 203 +A1111_NUM_LINKAGE_TYPES = 10 +EXPECTED_ENCODER_TENSORS = 209 + + +def remap_key(key: str) -> str | None: + """Return the Affinose-side key for an a5-lineage key, or None if not encoder.""" + if key.startswith("sequence_embeddings."): + s = key[len("sequence_embeddings."):] + s = s.replace("convolution_projection", "conv_proj") + s = s.replace("convolutions.", "conv_layers.") + if s.startswith("input_norm"): + s = s.replace("input_norm", "LayerNorm", 1) + elif s.startswith("output_norm"): + s = s.replace("output_norm", "conv_norm", 1) + return "seq_embeddings." + s + if key.startswith("sequence_layers."): + s = key[len("sequence_layers."):] + s = s.replace("attention_norm", "attention_layer_norm") + s = s.replace(".output_norm", ".output_layer_norm") + return "seq_layers." + s + return None + + +def assert_pretrained(seq_layers, tol: float = 1e-4) -> None: + """Fail loudly if any layer is still at pristine Xavier init. + + An untrained nn.Linear sits EXACTLY at its xavier_uniform bound with a zero + bias; a trained one does not. This is the check that would have caught the + original 198-of-209 wipe. + """ + for i, layer in enumerate(seq_layers): + w = layer.attention.query.weight.data + bound = math.sqrt(6.0 / (w.shape[0] + w.shape[1])) + ratio = w.abs().max().item() / bound + bias_zero = bool((layer.attention.query.bias.data == 0).all()) + if abs(ratio - 1.0) < tol and bias_zero: + raise RuntimeError( + f"seq_layers[{i}] is at pristine Xavier init (max/bound={ratio:.6f}, " + "bias all zero) — pretrained weights were NOT loaded or were " + "overwritten after loading." + ) + + +def load_a1111_encoder(checkpoint_path: str, freeze_layers: int = 4): + """Return (config, seq_embeddings, seq_layers) from an A1111/WA checkpoint.""" + from model.multimodal_glycan_bert_v3 import ( + MultimodalGlycanBERT, + MultimodalGlycanBERTConfig, + ) + + ckpt = torch.load(checkpoint_path, map_location="cpu", weights_only=False) + state = ckpt.get("model_state", ckpt.get("model_state_dict", ckpt)) + + src = {} + for k, v in state.items(): + nk = remap_key(k) + if nk is not None: + src[nk] = v + if len(src) != EXPECTED_ENCODER_TENSORS: + raise RuntimeError( + f"expected {EXPECTED_ENCODER_TENSORS} encoder tensors, remapped {len(src)}" + ) + + vocab = src["seq_embeddings.token_embeddings.weight"].shape[0] + max_pos = src["seq_embeddings.position_embeddings.weight"].shape[0] + config = MultimodalGlycanBERTConfig( + seq_vocab_size=vocab, seq_max_length=max_pos, use_cnn_frontend=True + ) + model = MultimodalGlycanBERT(config) + + # MultimodalGlycanBERTConfig.to_seq_config() drops max_branch_depth / + # num_linkage_types, so the tables build at the v5b defaults (8, 9). Resize + # them here rather than patching the shared model file, which other lanes use. + hidden = model.seq_embeddings.branch_embeddings.weight.shape[1] + n_branch = src["seq_embeddings.branch_embeddings.weight"].shape[0] + n_link = src["seq_embeddings.linkage_embeddings.weight"].shape[0] + model.seq_embeddings.branch_embeddings = nn.Embedding(n_branch, hidden) + model.seq_embeddings.linkage_embeddings = nn.Embedding(n_link, hidden) + + model.seq_embeddings.load_state_dict( + {k[len("seq_embeddings."):]: v for k, v in src.items() + if k.startswith("seq_embeddings.")}, strict=True) + model.seq_layers.load_state_dict( + {k[len("seq_layers."):]: v for k, v in src.items() + if k.startswith("seq_layers.")}, strict=True) + + seq_embeddings, seq_layers = model.seq_embeddings, model.seq_layers + assert_pretrained(seq_layers) # gate BEFORE any freezing + print(f" [A1111] strict-loaded {len(src)}/{EXPECTED_ENCODER_TENSORS} encoder " + f"tensors (vocab {vocab}, branch {n_branch}, linkage {n_link})") + + for p in seq_embeddings.parameters(): + p.requires_grad = False + for i in range(min(freeze_layers, len(seq_layers))): + for p in seq_layers[i].parameters(): + p.requires_grad = False + + return config, seq_embeddings, seq_layers diff --git a/releases/2026-10-02/affinose/a5_tokenizer_shim.py b/releases/2026-10-02/affinose/a5_tokenizer_shim.py new file mode 100644 index 0000000000000000000000000000000000000000..9ff72661c56e6fedf298fe8de9aae31ba0486158 --- /dev/null +++ b/releases/2026-10-02/affinose/a5_tokenizer_shim.py @@ -0,0 +1,72 @@ +"""Import the frozen a5 BPE tokenizer without editing its sha-bound source files. + +The A1111 tokenizer ships as read-only, sha256-pinned source inside the corpus +package. Its module names do not match its filenames: + + review_frozen_training_a5_wurcs_bpe.py -> training.a5_wurcs_bpe + review_frozen_training_a5_topology.py -> training.a5_topology + review_frozen_sequence_tree_runtime.py -> (consumer, imports the two above) + +and it imports them as `from .a5_topology import ...` / `from training.a5_topology +import ...`. Editing the files is not permitted (read-only, sha-bound), so this +registers them in sys.modules under the names the frozen code expects. + +Nothing is written; the frozen bytes are loaded exactly as-is. +""" +from __future__ import annotations + +import importlib.util +import sys +import types +from pathlib import Path + +V31_ROOT = Path(__file__).resolve().parents[1] / "bertose_source" +A5_PKG = V31_ROOT / "data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" + +_FILES = { + "a5_topology": "review_frozen_training_a5_topology.py", + "a5_wurcs_bpe": "review_frozen_training_a5_wurcs_bpe.py", + "sequence_tree_runtime": "review_frozen_sequence_tree_runtime.py", +} + + +def _load(mod_name: str, path: Path, package: str): + spec = importlib.util.spec_from_file_location(mod_name, path) + mod = importlib.util.module_from_spec(spec) + mod.__package__ = package + sys.modules[mod_name] = mod + return mod, spec + + +# The frozen BPE module does: +# try: from bert_training_v4.downstream_tasks.utils.wurcs_bpe_tokenizer import ... +# except ImportError: from ..bert_training_v4... (needs a 2-level parent package) +# Putting the v3.1 root on sys.path lets the ABSOLUTE first branch resolve, so the +# awkward relative fallback never executes. + + + +def install(pkg_dir: Path = A5_PKG): + """Register the frozen modules under `training.*` and return the namespace.""" + if str(V31_ROOT) not in sys.path: + sys.path.insert(0, str(V31_ROOT)) + if "training" not in sys.modules: + pkg = types.ModuleType("training") + pkg.__path__ = [str(pkg_dir)] + sys.modules["training"] = pkg + pkg = sys.modules["training"] + + loaded = {} + # a5_topology has no intra-package imports, so it must be executed first. + for short in ("a5_topology", "a5_wurcs_bpe", "sequence_tree_runtime"): + fname = _FILES[short] + full = f"training.{short}" + if full in sys.modules: + loaded[short] = sys.modules[full] + continue + mod, spec = _load(full, pkg_dir / fname, "training") + sys.modules[short] = mod # satisfy bare `import a5_topology` too + spec.loader.exec_module(mod) + setattr(pkg, short, mod) + loaded[short] = mod + return loaded diff --git a/releases/2026-10-02/affinose/bertint_v8.py b/releases/2026-10-02/affinose/bertint_v8.py new file mode 100644 index 0000000000000000000000000000000000000000..c335235e0f1a6f03ec320552296593ffca1ac3e5 --- /dev/null +++ b/releases/2026-10-02/affinose/bertint_v8.py @@ -0,0 +1,969 @@ +""" +Bertint V8 — Cross-Attention + Live Bertose Finetuning + +Architecture: + GLYCAN: WURCS → BPE → Bertose (live, freeze layers 0-3) → [B, Lg, 768] + ↓ proj(768→512) + PROTEIN: precomputed ESM-C → [B, Lp, 960] ↓ + ↓ proj(960→512) ↓ + 2× CrossAttentionBlock(d=512, 8 heads, FFN=1024) ↓ + ↓ ↓ + SHARED mask-aware SWE(d=512, S=512, R=64) ↓ + ↓ ↓ + [B, 512] [B, 512] + ↓ element-wise product + sum + [B, 1024] + ↓ MLP → binding score + +Key changes from V7: + - Per-residue protein embeddings (not mean-pooled) for cross-attention + - CrossAttentionBlock: glycan tokens attend to protein residues and vice versa + - SWE pooling: variable-length → fixed-length (mask-aware, differentiable) + - Product + sum interaction (from Twin Peaks) instead of concat + +Key changes from V3: + - Live Bertose forward pass (not frozen precomputed embeddings) + - ESM-C 300M (960-dim, not ESM-C 600M 1152-dim) + +SWE, CrossAttention, and mask handling ported from V3 (Sessions 5-10). +""" + +import sys +import math +from pathlib import Path +from typing import Dict, Optional, Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +# ============================================================================ +# Bertose model imports (same as V7) +# ============================================================================ +BERTOSE_ROOT = Path(__file__).resolve().parents[1] / "bertose_source" + + +def _ensure_bertose_imports(): + """Add Bertose source directories to sys.path if not already present.""" + roots = [ + str(BERTOSE_ROOT), + str(BERTOSE_ROOT / "bert_training_v4"), + ] + for root in roots: + if root not in sys.path: + sys.path.insert(0, root) + + +def load_bertose_config(): + """Create Bertose config matching the V5b checkpoint.""" + _ensure_bertose_imports() + from model.multimodal_glycan_bert_v3 import MultimodalGlycanBERTConfig + + return MultimodalGlycanBERTConfig( + seq_vocab_size=2200, + use_cnn_frontend=True, + ) + + +def load_bertose_encoder( + checkpoint_path: str, freeze_layers: int = 4 +): + """ + Load Bertose sequence encoder with pretrained weights. + + Args: + checkpoint_path: Path to pretrained Bertose checkpoint. + freeze_layers: Number of transformer layers to freeze (0-indexed). + + Returns: + Tuple of (bertose_config, seq_embeddings, seq_layers). + """ + _ensure_bertose_imports() + from model.multimodal_glycan_bert_v3 import ( + MultimodalGlycanBERT, + MultimodalGlycanBERTConfig, + ) + + # Load checkpoint + # A1111 PORT 2026-08-19: the a5/md20x6 lineage stores its sequence tower under + # different module names and a 2,114-token vocabulary. Delegate to the adapter, + # which renames the 209 tensors and STRICT-loads them. Verified bit-exact against + # A1111's native ExactSequenceEmbeddings/EncoderLayer (max|diff| = 0.0). + import a5_tokenizer_shim as _shim # noqa: F401 (registers frozen a5 modules) + from a1111_encoder_adapter import load_a1111_encoder as _load_a1111 + _probe = torch.load(checkpoint_path, map_location="cpu", weights_only=False) + if "model_state" in _probe and any( + k.startswith("sequence_embeddings.") for k in _probe["model_state"] + ): + del _probe + return _load_a1111(checkpoint_path, freeze_layers=freeze_layers) + del _probe + + ckpt = torch.load(checkpoint_path, map_location="cpu") + state_dict = ckpt.get("model_state_dict", ckpt) + + # Infer vocab size and max position embeddings from checkpoint + vocab_size = state_dict["seq_embeddings.token_embeddings.weight"].shape[0] + max_pos = state_dict["seq_embeddings.position_embeddings.weight"].shape[0] + config = MultimodalGlycanBERTConfig( + seq_vocab_size=vocab_size, + seq_max_length=max_pos, + use_cnn_frontend=True, + ) + + # Instantiate full model, then extract sequence encoder + model = MultimodalGlycanBERT(config) + missing, unexpected = model.load_state_dict(state_dict, strict=False) + loaded = len(state_dict) - len(unexpected) + print(f" Loaded {loaded}/{len(state_dict)} pretrained weight tensors") + print(f" ({len(missing)} missing in checkpoint, {len(unexpected)} unexpected)") + + seq_embeddings = model.seq_embeddings + seq_layers = model.seq_layers + + # Freeze embedding layer + first N transformer layers + for param in seq_embeddings.parameters(): + param.requires_grad = False + for i in range(min(freeze_layers, len(seq_layers))): + for param in seq_layers[i].parameters(): + param.requires_grad = False + + trainable = sum( + p.numel() for p in seq_embeddings.parameters() if p.requires_grad + ) + trainable += sum( + p.numel() + for layer in seq_layers + for p in layer.parameters() + if p.requires_grad + ) + total = sum(p.numel() for p in seq_embeddings.parameters()) + total += sum( + p.numel() for layer in seq_layers for p in layer.parameters() + ) + print( + f" Bertose encoder: {total:,} params total, " + f"{trainable:,} trainable (frozen layers 0-{freeze_layers - 1})" + ) + + return config, seq_embeddings, seq_layers + + +# ============================================================================ +# Differentiable Interpolation (from V3, Sessions 5-6) +# ============================================================================ + + +def differentiable_interp1d( + x: torch.Tensor, y: torch.Tensor, xnew: torch.Tensor +) -> torch.Tensor: + """ + Fully differentiable 1D linear interpolation. + + Gradients flow through y (values) back to theta projection and + earlier layers. The original Interp1d.backward from Twin Peaks + only returned gradients for xnew (query coords), NOT for y — + killing 83% of gradient flow. Fixed in Session 5. + + Args: + x: [B, N] sorted input coordinates (detached) + y: [B, N] values at x positions (REQUIRES grad flow!) + xnew: [B, R] query coordinates + + Returns: + [B, R] interpolated values + """ + n_pts = x.shape[1] + + # Find interpolation indices + ind = torch.searchsorted( + x.contiguous().detach(), xnew.contiguous().detach() + ) + ind = ind.clamp(1, n_pts - 1) + + # Gather neighbor values — preserves gradient flow through y + x_lo = torch.gather(x, 1, ind - 1) + x_hi = torch.gather(x, 1, ind) + y_lo = torch.gather(y, 1, ind - 1) + y_hi = torch.gather(y, 1, ind) + + # Linear interpolation weights + denom = (x_hi - x_lo).clamp(min=1e-8) + alpha = ((xnew - x_lo) / denom).clamp(0, 1) + + # Interpolated value — fully differentiable w.r.t. y_lo and y_hi + return y_lo + alpha * (y_hi - y_lo) + + +# ============================================================================ +# SWE Pooling (from V3, mask-aware fixes from Sessions 6-8) +# ============================================================================ + + +class SWE_Pooling(nn.Module): + """ + Sliced-Wasserstein Embedding pooling. + Maps variable-length token embeddings [B, L, d_in] => [B, num_slices]. + + From Twin Peaks, with mask-aware sorting (Session 6) and + degenerate-sample handling (Session 8). + """ + + def __init__( + self, + d_in: int, + num_slices: int, + num_ref_points: int, + freeze_swe: bool = False, + ): + super().__init__() + self.num_slices = num_slices + self.num_ref_points = num_ref_points + + # Learnable reference distribution + ref = torch.linspace(-1, 1, num_ref_points).unsqueeze(1).repeat( + 1, num_slices + ) + self.reference = nn.Parameter(ref, requires_grad=not freeze_swe) + + # Projection directions (weight-normalized) + self.theta = nn.utils.weight_norm( + nn.Linear(d_in, num_slices, bias=False), dim=0 + ) + self.theta.weight_g.data = torch.ones_like(self.theta.weight_g.data) + self.theta.weight_g.requires_grad = False + nn.init.normal_(self.theta.weight_v) + + # Weighted aggregation over reference points + self.weight = nn.Linear(num_ref_points, 1, bias=False) + + if freeze_swe: + self.theta.weight_v.requires_grad = False + self.reference.requires_grad = False + + def forward( + self, x: torch.Tensor, mask: Optional[torch.Tensor] = None + ) -> torch.Tensor: + """ + Args: + x: [B, L, d_in] token embeddings + mask: [B, L] attention mask (1=valid, 0=padding) + + Returns: + [B, num_slices] fixed-length representation + """ + batch_size, seq_len, _ = x.shape + device = x.device + + # Degenerate: single token → just project + if seq_len == 1: + x_slices = self.theta(x) + return x_slices.squeeze(1) + + # Project onto learned directions + x_slices = self.theta(x) # [B, L, num_slices] + + # MASK-AWARE SORTING: set padding → -inf so they sort to bottom + if mask is not None: + mask_exp = mask.unsqueeze(-1).expand_as(x_slices) + x_slices = x_slices.masked_fill(mask_exp == 0, float("-inf")) + + x_sorted, _ = torch.sort(x_slices, dim=1) + + # Strip padding from sorted array + if mask is not None: + valid_counts = mask.sum(dim=1).long() + degenerate_mask = valid_counts < 2 + safe_counts = valid_counts.clamp(min=2) + max_valid = safe_counts.max().item() + + # Vectorized gather: take last safe_count values + starts = (seq_len - safe_counts).unsqueeze(1) + offsets = torch.arange(max_valid, device=device).unsqueeze(0) + raw_idx = starts + offsets + gather_idx = raw_idx.clamp(max=seq_len - 1).unsqueeze(-1).expand( + batch_size, max_valid, self.num_slices + ) + x_sorted = torch.gather(x_sorted, 1, gather_idx) + + # Replace -inf with 0.0 for degenerate samples + x_sorted = x_sorted.masked_fill( + x_sorted == float("-inf"), 0.0 + ) + n_eff = max_valid + else: + degenerate_mask = None + n_eff = seq_len + + # Interpolate to fixed reference grid + x_coord = ( + torch.linspace(0, 1, n_eff, device=device) + .unsqueeze(0) + .expand(batch_size * self.num_slices, -1) + ) + x_flat = x_sorted.permute(0, 2, 1).reshape( + batch_size * self.num_slices, n_eff + ) + xnew = ( + torch.linspace(0, 1, self.num_ref_points, device=device) + .unsqueeze(0) + .expand(batch_size * self.num_slices, -1) + ) + + y_intp = differentiable_interp1d(x_coord, x_flat, xnew) + x_interp = y_intp.view( + batch_size, self.num_slices, self.num_ref_points + ).permute(0, 2, 1) + + # Compare with reference distribution + r_expanded = self.reference.expand_as(x_interp) + embeddings = (r_expanded - x_interp).permute(0, 2, 1) + + # Weighted aggregation → [B, num_slices] + weighted = self.weight(embeddings).sum(dim=-1) + + # Zero out degenerate samples + if degenerate_mask is not None and degenerate_mask.any(): + weighted = weighted.masked_fill( + degenerate_mask.unsqueeze(-1), 0.0 + ) + + return weighted + + +# ============================================================================ +# Cross-Attention Block (from V3, NaN guard from Session 9) +# ============================================================================ + + +class PredeclaredAttentivePool(nn.Module): + """Attentive pooling over post-cross-attention PROTEIN residues. + + Predeclared in AFFINOSE_PREDECLARATION_ATTENTIVE_POOLING_20260827.md: + + s_j = w^T p_j ; a_j = softmax_j(s_j) over valid positions ; p_bar = sum_j a_j p_j + + `w` is a single Linear(dim -> 1, bias=False), ZERO-INITIALISED, and must be exempt from any + `_init_weights` pass (Xavier init would destroy the equal-at-init property). +dim parameters. + + At w = 0 every logit is 0, so the masked softmax is uniform over valid positions and p_bar is + exactly the masked mean — arm A equals arm M at initialisation. Unlike a gated form, the + gradient dL/dw is non-zero there, so A can actually depart from M. + """ + + def __init__(self, dim: int): + super().__init__() + self.w = nn.Linear(dim, 1, bias=False) + nn.init.zeros_(self.w.weight) + self.w._skip_init = True # honoured by _init_weights guards, if any + + def forward(self, x, mask): + s = self.w(x).squeeze(-1).masked_fill(mask <= 0, float("-inf")) + a = torch.softmax(s, dim=1) + a = torch.nan_to_num(a, nan=0.0).unsqueeze(-1) + return (x * a * mask.unsqueeze(-1).to(x.dtype)).sum(1) + + +class CrossAttentionBlock(nn.Module): + """ + Bidirectional cross-attention between glycan and protein tokens. + + Glycan tokens attend to protein residues (Q=glycan, KV=protein) + Protein residues attend to glycan tokens (Q=protein, KV=glycan) + + Includes NaN guard for all-masked keys (Session 9 fix) and + padding-position zeroing (Session 7 fix). + """ + + def __init__( + self, + d_model: int, + num_heads: int, + ffn_dim: int, + dropout: float = 0.1, + ): + super().__init__() + + # Glycan → Protein cross-attention + self.glycan_cross_attn = nn.MultiheadAttention( + d_model, num_heads, dropout=dropout, batch_first=True + ) + self.glycan_norm1 = nn.LayerNorm(d_model) + self.glycan_ffn = nn.Sequential( + nn.Linear(d_model, ffn_dim), + nn.GELU(), + nn.Dropout(dropout), + nn.Linear(ffn_dim, d_model), + nn.Dropout(dropout), + ) + self.glycan_norm2 = nn.LayerNorm(d_model) + + # Protein → Glycan cross-attention + self.protein_cross_attn = nn.MultiheadAttention( + d_model, num_heads, dropout=dropout, batch_first=True + ) + self.protein_norm1 = nn.LayerNorm(d_model) + self.protein_ffn = nn.Sequential( + nn.Linear(d_model, ffn_dim), + nn.GELU(), + nn.Dropout(dropout), + nn.Linear(ffn_dim, d_model), + nn.Dropout(dropout), + ) + self.protein_norm2 = nn.LayerNorm(d_model) + + def forward( + self, + glycan: torch.Tensor, + protein: torch.Tensor, + glycan_mask: Optional[torch.Tensor] = None, + protein_mask: Optional[torch.Tensor] = None, + return_attention: bool = False, + ) -> Tuple[torch.Tensor, torch.Tensor]: + """ + Returns updated (glycan, protein) enriched with cross-modal info. + + NaN guard: nn.MultiheadAttention produces NaN when ALL keys + are masked. We replace NaN→0 so residual preserves query. + """ + # Convert to key_padding_mask (True = padded) + g_key_pad = (~glycan_mask.bool()) if glycan_mask is not None else None + p_key_pad = ( + (~protein_mask.bool()) if protein_mask is not None else None + ) + + # Glycan attends to protein + g_cross, g_attn_weights = self.glycan_cross_attn( + query=glycan, key=protein, value=protein, + key_padding_mask=p_key_pad, + need_weights=return_attention, + average_attn_weights=False, + ) + g_cross = torch.nan_to_num(g_cross, nan=0.0) + glycan = self.glycan_norm1(glycan + g_cross) + glycan = self.glycan_norm2(glycan + self.glycan_ffn(glycan)) + if glycan_mask is not None: + glycan = glycan * glycan_mask.unsqueeze(-1) + + # Protein attends to glycan + p_cross, p_attn_weights = self.protein_cross_attn( + query=protein, key=glycan, value=glycan, + key_padding_mask=g_key_pad, + need_weights=return_attention, + average_attn_weights=False, + ) + p_cross = torch.nan_to_num(p_cross, nan=0.0) + protein = self.protein_norm1(protein + p_cross) + protein = self.protein_norm2(protein + self.protein_ffn(protein)) + if protein_mask is not None: + protein = protein * protein_mask.unsqueeze(-1) + + if return_attention: + attn_dict = { + "glycan_to_protein": g_attn_weights, + "protein_to_glycan": p_attn_weights, + } + return glycan, protein, attn_dict + + return glycan, protein + + +# ============================================================================ +# Bertint V8 Model +# ============================================================================ + + +class BertintV8(nn.Module): + """ + Glycan-protein interaction predictor with cross-attention. + + Glycan: Live Bertose (partially frozen) → per-token [B, Lg, 768] + Protein: Precomputed ESM-C per-residue [B, Lp, 960] + Cross-attention: 2 bidirectional layers in shared 512-dim space + SWE: Variable-length → fixed [B, 512] for each side + Interaction: product + sum → MLP → scalar + """ + + def __init__( + self, + seq_embeddings: nn.Module, + seq_layers: nn.ModuleList, + glycan_dim: int = 768, + protein_dim: int = 960, + shared_dim: int = 512, + num_cross_layers: int = 2, + num_heads: int = 8, + ffn_dim: int = 1024, + swe_slices: int = 512, + swe_ref_points: int = 64, + head_hidden: int = 256, + dropout: float = 0.1, + separate_swe: bool = False, + pooling_mode: str = "swe", + protein_attentive_pool: bool = False, + interaction_mode: str = "product_sum", + use_cross_attention: bool = True, + glycan_size_channel: bool = False, + motif_additive_dim: int = 0, + protein_mode: str = "real", + protein_tower: bool = True, + protein_binding_channel: bool = False, + ): + """ + Args: + seq_embeddings: Pretrained Bertose embedding layer. + seq_layers: Pretrained Bertose transformer layers. + glycan_dim: Bertose output dimension (768). + protein_dim: ESM-C per-residue dimension (960). + shared_dim: Shared space for cross-attention (512). + num_cross_layers: Number of cross-attention blocks. + num_heads: Attention heads per block. + ffn_dim: FFN hidden dim in cross-attention. + swe_slices: Number of SWE projection directions. + swe_ref_points: Number of SWE reference distribution points. + head_hidden: MLP head hidden dimension. + dropout: Dropout rate. + separate_swe: If True, use independent SWE modules. + pooling_mode: 'swe', 'mean', or 'joint_swe'. + interaction_mode: 'product_sum' or 'concat'. + use_cross_attention: If False, skip cross-attention. + """ + super().__init__() + + self.separate_swe = separate_swe + self.pooling_mode = pooling_mode + self.protein_attentive_pool = protein_attentive_pool + self.interaction_mode = interaction_mode + self.use_cross_attention = use_cross_attention + self.glycan_size_channel = glycan_size_channel + # 'shuffle' is REMOVED, not deprecated: it permuted inside forward(), which also + # runs under eval(), so it corrupted validation and test. P is a materialised + # dataset now (fit-rows-only donor map, hash-bound), so no model path is needed. + if protein_mode == "shuffle": + raise ValueError( + "protein_mode='shuffle' is withdrawn: it permuted inside forward(), which " + "also runs under eval(), so it permuted validation and test. Use the " + "materialised P arm (affinose_v2_binding_P_seed*.csv).") + assert protein_mode in ("real", "constant") + self.protein_mode = protein_mode + # G: do not CONSTRUCT the protein pathway at all. + self.protein_tower = protein_tower + # R2: the last input channel is a per-residue binding probability, not a + # feature. It rides along so that padding/masking/collate stay unchanged. + self.protein_binding_channel = protein_binding_channel + if protein_binding_channel: + assert protein_tower, "binding-weighted pooling needs the protein tower" + protein_dim = protein_dim - 1 # the channel is a weight, not a feature + if not protein_tower: + assert protein_mode == "real", ( + "protein_tower=False already removes the protein pathway; combining it " + "with a protein_mode ablation is redundant and ambiguous") + use_cross_attention = False + + print(f" Architecture config:") + print(f" cross_attention={use_cross_attention}") + print(f" pooling_mode={pooling_mode}") + print(f" interaction_mode={interaction_mode}") + + # === Bertose sequence encoder (partially frozen) === + self.seq_embeddings = seq_embeddings + self.seq_layers = seq_layers + + # === Projection to shared space === + self.glycan_proj = nn.Sequential( + nn.Linear(glycan_dim, shared_dim), + nn.LayerNorm(shared_dim), + ) + if protein_tower: + self.protein_proj = nn.Sequential( + nn.Linear(protein_dim, shared_dim), + nn.LayerNorm(shared_dim), + ) + + # === Cross-attention stack (optional) === + if use_cross_attention: + self.cross_attention = nn.ModuleList([ + CrossAttentionBlock( + d_model=shared_dim, + num_heads=num_heads, + ffn_dim=ffn_dim, + dropout=dropout, + ) + for _ in range(num_cross_layers) + ]) + else: + self.cross_attention = nn.ModuleList() + + # === Pooling === + if pooling_mode == "swe": + if separate_swe: + self.swe_glycan = SWE_Pooling( + d_in=shared_dim, num_slices=swe_slices, + num_ref_points=swe_ref_points, + ) + if protein_tower: + self.swe_protein = SWE_Pooling( + d_in=shared_dim, num_slices=swe_slices, + num_ref_points=swe_ref_points, + ) + pool_out_dim = swe_slices + else: + self.swe = SWE_Pooling( + d_in=shared_dim, num_slices=swe_slices, + num_ref_points=swe_ref_points, + ) + pool_out_dim = swe_slices + elif pooling_mode == "mean": + pool_out_dim = shared_dim + elif pooling_mode == "joint_swe": + self.swe_joint = SWE_Pooling( + d_in=shared_dim, num_slices=swe_slices, + num_ref_points=swe_ref_points, + ) + pool_out_dim = swe_slices + + # === Regression head === + if pooling_mode == "joint_swe" or not protein_tower: + # glycan-only: the head sees ONE pooled vector, not a concatenated pair + head_input_dim = pool_out_dim + elif protein_binding_channel: + # glycan + global protein + binding-weighted protein + head_input_dim = 3 * pool_out_dim + else: + head_input_dim = 2 * pool_out_dim + # Restore the glycan-magnitude signal that masked mean pooling divides out. + if glycan_size_channel: + head_input_dim += 1 + + self.head = nn.Sequential( + nn.Linear(head_input_dim, head_hidden), + nn.GELU(), + nn.Dropout(dropout), + nn.Linear(head_hidden, head_hidden), + nn.GELU(), + nn.Dropout(dropout), + nn.Linear(head_hidden, 1), + ) + + # Initialize (skip SWE weight-normed params) + # ENCODER-INIT FIX 2026-08-17: nn.Module.apply() recurses into the + # pretrained BERTose encoder assigned above and _init_weights resets + # every nn.Linear / nn.LayerNorm inside it. Snapshot the encoder, + # let apply() run unchanged so every OTHER module receives the exact + # same init (and consumes the identical RNG stream), then restore. + _encfix_emb = {k: v.detach().clone() for k, v in self.seq_embeddings.state_dict().items()} + _encfix_lay = {k: v.detach().clone() for k, v in self.seq_layers.state_dict().items()} + self.apply(self._init_weights) + self.seq_embeddings.load_state_dict(_encfix_emb) + self.seq_layers.load_state_dict(_encfix_lay) + + # ── ADDITIVE MOTIF TERM — CONSTRUCTED LAST, ON PURPOSE ────────────────────────── + # score += w . motif_features. LAST so it draws from the RNG stream only after every + # shared module, otherwise this arm is confounded with a different initialisation. + # Zero-init: identical to the reference at init, but dw != 0 so it can depart. + self.motif_additive_dim = int(motif_additive_dim) + if self.motif_additive_dim > 0: + self.motif_head = nn.Linear(self.motif_additive_dim, 1, bias=False) + nn.init.zeros_(self.motif_head.weight) + print(f" [ENCFIX] restored {len(_encfix_emb)}+{len(_encfix_lay)} pretrained encoder tensors after init") + self._count_params() + + # Constructed LAST on purpose: every shared submodule above draws from the RNG + # stream first, so arm A and arm M receive IDENTICAL shared weights under the + # same seed. Only this module's draws come afterwards. Without this, the extra + # parameters shift the stream and A - M confounds capacity with a different init. + if protein_attentive_pool: + self.protein_pool = PredeclaredAttentivePool(shared_dim) + + def _init_weights(self, module: nn.Module) -> None: + """Xavier init for Linear, skip weight-normed SWE modules.""" + if isinstance(module, nn.Linear): + if hasattr(module, "weight_v"): + return # Preserve SWE initialization + nn.init.xavier_uniform_(module.weight) + if module.bias is not None: + nn.init.zeros_(module.bias) + elif isinstance(module, nn.LayerNorm): + nn.init.ones_(module.weight) + nn.init.zeros_(module.bias) + + def _count_params(self) -> None: + """Log parameter counts.""" + total = sum(p.numel() for p in self.parameters()) + trainable = sum( + p.numel() for p in self.parameters() if p.requires_grad + ) + print(f"BertintV8: {total:,} total, {trainable:,} trainable") + + def _masked_mean_pool(self, x, mask): + """Masked mean pooling: average valid tokens only.""" + mask_expanded = mask.unsqueeze(-1) + x_masked = x * mask_expanded + summed = x_masked.sum(dim=1) + counts = mask.sum(dim=1, keepdim=True).clamp(min=1) + return summed / counts + + def forward( + self, + token_ids: torch.Tensor, + attention_mask: torch.Tensor, + branch_depths: torch.Tensor, + linkage_types: torch.Tensor, + protein_emb: torch.Tensor, + protein_mask: torch.Tensor, + motif_features: Optional[torch.Tensor] = None, + log_conc: Optional[torch.Tensor] = None, + has_conc: Optional[torch.Tensor] = None, + return_attention: bool = False, + ) -> torch.Tensor: + """ + Forward pass with cross-attention. + + Args: + token_ids: [B, Lg] BPE token IDs. + attention_mask: [B, Lg] glycan attention mask (1=valid, 0=pad). + branch_depths: [B, Lg] branch depth per token. + linkage_types: [B, Lg] linkage type per token. + protein_emb: [B, Lp, protein_dim] per-residue ESM-C embeddings. + protein_mask: [B, Lp] protein attention mask (1=valid, 0=pad). + + Returns: + [B] binding score predictions. + """ + # === 0. Protein-channel ablation (G / P arms) === + # 'constant': zero the protein input, so protein_pooled is identical for every + # example -> the model is effectively GLYCAN-ONLY (Codex's G). + # 'shuffle': permute whole protein tensors + masks together across the batch, + # destroying protein-glycan pairing while preserving the protein marginal + # (an approximation of a label-blind pairing null, Codex's P). + if self.protein_mode == "constant": + protein_emb = torch.zeros_like(protein_emb) + protein_mask = torch.ones_like(protein_mask) + elif self.protein_mode == "shuffle": + perm = torch.randperm(protein_emb.shape[0], device=protein_emb.device) + protein_emb = protein_emb[perm] + protein_mask = protein_mask[perm] + + # === 1. Bertose forward: per-token embeddings === + x = self.seq_embeddings(token_ids, branch_depths, linkage_types) + for layer in self.seq_layers: + x = layer(x, attention_mask) + # x: [B, Lg, 768] — all tokens (not just CLS!) + + # Glycan mask: use the attention_mask from BPE tokenizer + glycan_mask = attention_mask # [B, Lg], 1=valid, 0=pad + + # === G arm: glycan-only. The protein tensor and mask are never read. === + if not self.protein_tower: + x = self.seq_embeddings(token_ids, branch_depths, linkage_types) + for layer in self.seq_layers: + x = layer(x, attention_mask) + glycan = self.glycan_proj(x) * attention_mask.unsqueeze(-1) + if self.pooling_mode == "mean": + pooled = self._masked_mean_pool(glycan, attention_mask) + else: + pooled = self.swe(glycan, attention_mask) + if self.glycan_size_channel: + n_tok = attention_mask.sum(dim=1, keepdim=True).to(pooled.dtype) + pooled = torch.cat([pooled, torch.log1p(n_tok)], dim=-1) + return self.head(pooled).squeeze(-1) + + # R2: peel the binding-probability channel off the protein input. Done BEFORE + # projection so the projection never sees the weight as a feature. + binding_w = None + if self.protein_binding_channel: + binding_w = protein_emb[..., -1] # [B, Lp] + protein_emb = protein_emb[..., :-1] # [B, Lp, 960] + + # === 2. Project to shared space === + glycan = self.glycan_proj(x) # [B, Lg, 512] + protein = self.protein_proj(protein_emb) # [B, Lp, 512] + + # Zero padding positions after projection (Session 7 fix: + # LayerNorm bias produces non-trivial values at padding) + glycan = glycan * glycan_mask.unsqueeze(-1) + protein = protein * protein_mask.unsqueeze(-1) + + # === 3. Cross-attention (optional) === + all_attention_maps = [] + if self.use_cross_attention: + for cross_layer in self.cross_attention: + if return_attention: + glycan, protein, attn_dict = cross_layer( + glycan, protein, glycan_mask, protein_mask, + return_attention=True, + ) + all_attention_maps.append(attn_dict) + else: + glycan, protein = cross_layer( + glycan, protein, glycan_mask, protein_mask + ) + + # === 4. Pooling === + if self.pooling_mode == "joint_swe": + joint_tokens = torch.cat([glycan, protein], dim=1) + joint_mask = torch.cat([glycan_mask, protein_mask], dim=1) + pooled = self.swe_joint(joint_tokens, joint_mask) + return self.head(pooled).squeeze(-1) + + if self.pooling_mode == "swe": + if self.separate_swe: + glycan_pooled = self.swe_glycan(glycan, glycan_mask) + protein_pooled = self.swe_protein(protein, protein_mask) + else: + glycan_pooled = self.swe(glycan, glycan_mask) + protein_pooled = self.swe(protein, protein_mask) + elif self.pooling_mode == "mean": + glycan_pooled = self._masked_mean_pool(glycan, glycan_mask) + if self.protein_attentive_pool: + # arm A: zero-initialised attentive protein pooling. Identical to the mean-pool + # arm M at initialisation; A - M therefore measures only the trained use of the + # added capacity. + protein_pooled = self.protein_pool(protein, protein_mask) + else: + protein_pooled = self._masked_mean_pool(protein, protein_mask) + if binding_w is not None: + # w~ = w / sum(w) over VALID positions only; a protein with no + # predicted site falls back to the mean rather than dividing by zero + w = binding_w * protein_mask + denom = w.sum(dim=1, keepdim=True) + w = torch.where(denom > 1e-8, w / denom.clamp(min=1e-8), + protein_mask / protein_mask.sum(1, keepdim=True).clamp(min=1)) + protein_binding = (protein * w.unsqueeze(-1)).sum(1) + protein_pooled = torch.cat([protein_pooled, protein_binding], dim=-1) + + # === 5. Interaction === + if self.interaction_mode == "product_sum": + interaction = torch.cat([ + glycan_pooled * protein_pooled, + glycan_pooled + protein_pooled, + ], dim=-1) + elif self.interaction_mode == "concat": + interaction = torch.cat([ + glycan_pooled, protein_pooled, + ], dim=-1) + + # Masked mean pooling is invariant to token count, so glycan size is absent + # from the pooled vector by construction. Append it back as one scalar. + if self.glycan_size_channel: + n_tok = glycan_mask.sum(dim=1, keepdim=True).to(interaction.dtype) + interaction = torch.cat([interaction, torch.log1p(n_tok)], dim=-1) + + # === 6. Predict binding score === + out = self.head(interaction).squeeze(-1) + + # Additive motif main effect -- the functional form of the ridge that beats us on + # doubly-cold (0.2290 vs 0.1444), learned jointly instead of bolted on. + if getattr(self, "motif_additive_dim", 0) > 0: + # ⛔ FAIL CLOSED. A missed call site must crash here, never train without motifs. + if motif_features is None: + raise ValueError("motif_additive_dim > 0 but motif_features was not supplied -- " + "refusing to run a motif arm without motif inputs") + out = out + self.motif_head(motif_features.to(out.dtype)).squeeze(-1) + if return_attention and all_attention_maps: + return out, all_attention_maps + return out + + +# ============================================================================ +# Loss (same as V7 — simple MSE) +# ============================================================================ + + +class BertintV8Loss(nn.Module): + """MSE loss for regression.""" + + def __init__(self): + super().__init__() + self.mse = nn.MSELoss() + + def forward( + self, pred: torch.Tensor, target: torch.Tensor + ) -> torch.Tensor: + """Compute MSE loss.""" + return self.mse(pred, target) + + +# ============================================================================ +# Sanity check +# ============================================================================ +if __name__ == "__main__": + print("=" * 60) + print("BertintV8 Architecture Sanity Check") + print("=" * 60) + + # Mock Bertose encoder (for testing without cluster) + class MockEmbeddings(nn.Module): + """Mock Bertose embeddings for local testing.""" + + def __init__(self, dim: int = 768): + super().__init__() + self.proj = nn.Linear(64, dim) + + def forward(self, token_ids, branch_depths, linkage_types): + """Return random embeddings.""" + batch_size, seq_len = token_ids.shape + return torch.randn(batch_size, seq_len, 768) + + class MockLayer(nn.Module): + """Mock transformer layer.""" + + def forward(self, x, mask): + """Identity.""" + return x + + seq_emb = MockEmbeddings() + seq_layers = nn.ModuleList([MockLayer() for _ in range(12)]) + + model = BertintV8( + seq_embeddings=seq_emb, + seq_layers=seq_layers, + glycan_dim=768, + protein_dim=960, + ) + + # Simulate batch + batch_size = 4 + lg = 37 # Glycan: 37 BPE tokens + lp = 150 # Protein: 150 residues + + token_ids = torch.randint(0, 100, (batch_size, lg)) + attention_mask = torch.ones(batch_size, lg).float() + branch_depths = torch.zeros(batch_size, lg, dtype=torch.long) + linkage_types = torch.zeros(batch_size, lg, dtype=torch.long) + protein_emb = torch.randn(batch_size, lp, 960) + protein_mask = torch.ones(batch_size, lp).float() + + out = model( + token_ids=token_ids, + attention_mask=attention_mask, + branch_depths=branch_depths, + linkage_types=linkage_types, + protein_emb=protein_emb, + protein_mask=protein_mask, + ) + + print(f"\nInput shapes:") + print(f" Glycan tokens: {token_ids.shape}") + print(f" Protein emb: {protein_emb.shape}") + print(f"\nOutput shape: {out.shape} — values: {out.detach()}") + + # Test loss + loss_fn = BertintV8Loss() + target = torch.rand(batch_size) + loss = loss_fn(out, target) + print(f"\nLoss: {loss.item():.6f}") + + # Test backward + loss.backward() + grad_count = sum( + 1 for p in model.parameters() if p.grad is not None and p.requires_grad + ) + total_trainable = sum( + 1 for p in model.parameters() if p.requires_grad + ) + print(f"Gradients: {grad_count}/{total_trainable} trainable params") + + print(f"\n✅ V8 sanity check passed!") +"""Bertint V8 model — cross-attention + live Bertose finetuning.""" diff --git a/releases/2026-10-02/affinose/dataset_v8.py b/releases/2026-10-02/affinose/dataset_v8.py new file mode 100644 index 0000000000000000000000000000000000000000..3709cbd75ea097fb0d7175d8682800af3e0e2e38 --- /dev/null +++ b/releases/2026-10-02/affinose/dataset_v8.py @@ -0,0 +1,351 @@ +""" +Bertint V8 Dataset — Per-Residue Protein Embeddings for Cross-Attention + +Like V7 but keeps per-residue ESM-C embeddings [L, D] instead of +mean-pooling to [D]. This enables token-level cross-attention between +glycan tokens and protein residues. + +Changes from V7: + - protein_emb: [Lp, 960] per-residue (not [960] mean-pooled) + - collate_fn: pads protein sequences to max length in batch + - Returns protein_mask for cross-attention padding +""" + +import json +import gzip +import csv +import logging +from pathlib import Path +from typing import Dict, List, Optional, Tuple + +import h5py +import numpy as np +import pandas as pd +import torch +from torch.utils.data import Dataset +from torch.nn.utils.rnn import pad_sequence + +logger = logging.getLogger(__name__) + + +# ============================================================================ +# BPE Tokenizer Loader (same as V7) +# ============================================================================ + +def load_bpe_tokenizer(vocab_path: str): + """ + Load the Bertose BPE tokenizer directly from source. + + Bypasses downstream_tasks package imports. Adds utils + directory to sys.path and imports WURCSBPETokenizer directly. + + Args: + vocab_path: Path to BPE vocabulary JSON file. + + Returns: + WURCSBPETokenizer instance. + """ + import sys + + utils_dir = str(Path(__file__).resolve().parents[1] / "bertose_source" / + "bert_training_v4/downstream_tasks/utils") + if utils_dir not in sys.path: + sys.path.insert(0, utils_dir) + + # A1111 PORT 2026-08-19: use the frozen a5 tokenizer (2,114-token vocabulary) + # instead of the submitted-era 2,090-token one. Only the 10 special tokens + # share IDs between the two, so features MUST be regenerated, not reused. + # Verified: reproduces A1111's own review_token_ids.npy / review_branch_depths.npy + # byte-for-byte on 2,762/2,762 glycans with tree_channels_valid=True. + import a5_tokenizer_shim + a5_tokenizer_shim.install() + # V3 FIX 2026-08-24: the BASE tokenizer's linkage mapping disagrees with the + # one the encoder was pretrained under -- (1,2)->0/unknown->8 instead of + # LINKAGE_NONE=0/(1,2)->1/unknown->9. linkage_embeddings is (10,768), learned + # under V3, so base IDs index the wrong rows. Not fixable by a +1 remap. + from training.sequence_tree_runtime import ReviewA5WURCSBPETokenizerV3 + return ReviewA5WURCSBPETokenizerV3(vocab_path=vocab_path) + + +# ============================================================================ +# Dataset +# ============================================================================ + +class BertintV8Dataset(Dataset): + """ + Dataset for glycan-protein interaction with cross-attention support. + + Returns: + - BPE-tokenized glycan sequences for live Bertose forward pass + - Per-residue ESM-C protein embeddings [Lp, D] (NOT mean-pooled) + - Masks for both sides (for cross-attention padding) + + Args: + csv_path: Path to binding data CSV. + split_path: Path to glycan-cold splits JSON. + split: One of 'train', 'val', 'test'. + protein_emb_path: Path to ESM-C embeddings HDF5. + vocab_path: Path to BPE vocabulary JSON. + max_glycan_length: Maximum glycan sequence length. + max_protein_length: Maximum protein residues (truncate longer). + target_col: Column name for regression target. + """ + + def __init__( + self, + csv_path: str, + split_path: str, + split: str, + protein_emb_path: str, + vocab_path: str, + max_glycan_length: int = 256, + max_protein_length: int = 1024, + target_col: str = "target_rank", + roles_path: str = None, + stratum: str = None, + features_dir: str = None, + expected_rows: int = None, + ): + logger.info(f"Loading {split} dataset from {csv_path}") + + # ------------------------------------------------------------------ + # CONTRACT r2 (2026-08-24): partition comes from the A5 role TSV's + # evaluation_stratum, not from splits_glycan_cold.json. + # + # H5-SAFE JOIN. Four CarboGrove protein_id values carry a TRAILING + # SPACE in the CSV (Laburnum/Lima Bean/Aspergillus/Limulus, 4,247 rows) + # while the role TSV holds the stripped form. Stripping protein_id in + # place would fix the stratum join and then silently lose the SAME + # 4,247 rows at the H5 lookup, whose keys also keep the space. So we + # join on a separate canonical key and never mutate protein_id. + # ------------------------------------------------------------------ + if roles_path is None or stratum is None: + raise ValueError("roles_path and stratum are required under contract r2") + + df = pd.read_csv(csv_path, float_precision="round_trip") + n_csv = len(df) + df["_join_protein"] = df["protein_id"].astype(str).str.strip() + df["_join_glycan"] = df["glycan_wurcs"].astype(str).str.strip() + + roles = pd.read_csv(roles_path, sep="\t", compression="gzip", + usecols=["protein_id", "glycan_wurcs", "evaluation_stratum"]) + roles["_join_protein"] = roles["protein_id"].astype(str).str.strip() + roles["_join_glycan"] = roles["glycan_wurcs"].astype(str).str.strip() + roles = roles[["_join_protein", "_join_glycan", "evaluation_stratum"]] + if roles.duplicated(["_join_protein", "_join_glycan"]).any(): + raise RuntimeError("role TSV has duplicate (protein, glycan) pairs") + + merged = df.merge(roles, on=["_join_protein", "_join_glycan"], + how="left", validate="many_to_one") + if len(merged) != n_csv: + raise RuntimeError(f"stratum join changed row count {n_csv} -> {len(merged)}") + unmatched = int(merged["evaluation_stratum"].isna().sum()) + if unmatched: + raise RuntimeError(f"{unmatched} CSV rows matched no evaluation_stratum") + + df = merged[merged["evaluation_stratum"] == stratum].copy() + df = df.dropna(subset=[target_col]) + logger.info(f" stratum {stratum}: {len(df):,} records " + f"(from {n_csv:,} CSV rows, 0 unmatched)") + + self.target_col = target_col + self.max_protein_length = max_protein_length + + # ------------------------------------------------------------------ + # CONTRACT r2: glycan channels come from the SEALED merged feature + # table. NO TOKENIZER IS IN THE PRODUCTION PATH. Tier A (2,877) are + # the official WURCSArray-derived arrays; tier B (1,048) come from the + # sealed WURCSArray extension. Anything the WURCSArray authority marks + # tree_channels_valid=False FAILS CLOSED and is excluded. + # ------------------------------------------------------------------ + self.max_glycan_length = max_glycan_length + feat = Path(features_dir) + chans = ("token_ids", "residue_ids", "branch_depths", + "linkage_types", "attention_mask") + arrays = {c: np.load(feat / f"review_{c}.npy") for c in chans} + valid = np.load(feat / "review_tree_channels_valid.npy") + if arrays["token_ids"].shape[1] != max_glycan_length: + raise RuntimeError( + f"feature width {arrays['token_ids'].shape[1]} != " + f"max_glycan_length {max_glycan_length}") + frow, fvalid = {}, {} + with gzip.open(feat / "review_affinose_glycan_index.tsv.gz", + "rt", newline="") as fh: + for r in csv.DictReader(fh, delimiter="\t"): + w = r["canonical_wurcs"].strip() + frow[w] = int(r["feature_row"]) + fvalid[w] = (r["tree_channels_valid"] == "True") + logger.info(f" sealed feature table: {len(frow)} glycans, " + f"{int(valid.sum())} valid / {int((~valid).sum())} fail-closed") + + need = set(df["_join_glycan"].unique()) + unknown = sorted(w for w in need if w not in frow) + if unknown: + raise RuntimeError( + f"{len(unknown)} glycans absent from the sealed feature table, " + f"e.g. {unknown[0][:60]}") + + excluded = sorted(w for w in need if not fvalid[w]) + if excluded: + before = len(df) + df = df[~df["_join_glycan"].isin(set(excluded))].copy() + logger.info(f" FAIL-CLOSED: dropped {len(excluded)} glycans " + f"(tree_channels_valid=False), {before - len(df):,} rows") + self.excluded_glycans = excluded + + # MOTIF CHANNEL: 165 raw motif counts per glycan, row-aligned to the sealed + # feature index; the pinned float32 array contains counts 0-13. Do not binarize. + _motif = np.load(feat / "review_motif_features.npy") + if _motif.shape[0] != arrays["token_ids"].shape[0]: + raise RuntimeError("motif array rows %d != feature rows %d" + % (_motif.shape[0], arrays["token_ids"].shape[0])) + + self.tokenized_cache = {} + for w in df["_join_glycan"].unique(): + i = frow[w] + self.tokenized_cache[w] = { + "token_ids": torch.tensor(arrays["token_ids"][i], dtype=torch.long), + "attention_mask": torch.tensor(arrays["attention_mask"][i], dtype=torch.long), + "branch_depths": torch.tensor(arrays["branch_depths"][i], dtype=torch.long), + "linkage_types": torch.tensor(arrays["linkage_types"][i], dtype=torch.long), + "motif_features": torch.tensor(_motif[i], dtype=torch.float), + } + logger.info(f" {len(self.tokenized_cache)} glycans served from sealed arrays") + + self.records = df.reset_index(drop=True) + + # Load protein embeddings — KEEP PER-RESIDUE (not mean-pooled!) + logger.info(f" Loading per-residue protein embeddings...") + self.protein_embs: Dict[str, torch.Tensor] = {} + with h5py.File(protein_emb_path, "r") as f: + for key in f.keys(): + emb = torch.from_numpy(f[key][:]).float() + # emb: [L, D] per-residue + if emb.dim() == 1: + # Edge case: single-residue protein + emb = emb.unsqueeze(0) + # BOS/EOS FIX 2026-08-19: ESM-C emits L+2 vectors per protein + # (verified: every entry in esmc_embeddings.h5 is exactly + # len(sequence)+2). The original code truncated but never stripped + # them, so position 0 was the BOS token fed to the model as + # residue 1 and the whole protein was shifted by one. + if emb.shape[0] >= 3: + emb = emb[1:-1] + # Truncate very long proteins + if emb.shape[0] > max_protein_length: + emb = emb[:max_protein_length] + protein_id = key.replace("|", "/") + self.protein_embs[protein_id] = emb + logger.info(f" {len(self.protein_embs)} proteins loaded") + + # Log protein length statistics + lengths = [v.shape[0] for v in self.protein_embs.values()] + logger.info( + f" Protein lengths: min={min(lengths)}, " + f"max={max(lengths)}, mean={np.mean(lengths):.0f}" + ) + + # Filter to records with available embeddings + # CONTRACT r2: fail closed. protein_id is used EXACTLY as it appears + # in the CSV (trailing spaces included) because the H5 keys keep them. + available = set(self.protein_embs.keys()) + has_protein = self.records["protein_id"].isin(available) + if not has_protein.all(): + missing = int((~has_protein).sum()) + bad = sorted(self.records.loc[~has_protein, "protein_id"].unique())[:5] + raise RuntimeError( + f"{missing} records missing protein embeddings " + f"({len(bad)} distinct shown): {bad}") + + if expected_rows is not None and len(self.records) != int(expected_rows): + raise RuntimeError( + f"retained row count {len(self.records)} != manifest " + f"expected {expected_rows} for stratum {stratum}") + logger.info(f" Final {split} dataset: {len(self.records):,} records") + + def __len__(self) -> int: + return len(self.records) + + def __getitem__(self, idx: int) -> Dict[str, torch.Tensor]: + row = self.records.iloc[idx] + wurcs = row["glycan_wurcs"] + protein_id = row["protein_id"] + + # Glycan tokens (pre-cached, already padded to max_glycan_length) + cached = self.tokenized_cache[wurcs] + + # Protein embedding — per-residue [Lp, D] + protein_emb = self.protein_embs[protein_id] + + # Target + target = torch.tensor(row[self.target_col], dtype=torch.float) + + # Concentration features + has_conc = torch.tensor(row.get("has_conc", 0), dtype=torch.float) + log_conc = torch.tensor(row.get("log_conc", 0.0), dtype=torch.float) + + return { + "token_ids": cached["token_ids"], + "attention_mask": cached["attention_mask"], + "branch_depths": cached["branch_depths"], + "linkage_types": cached["linkage_types"], + "motif_features": cached["motif_features"], + "protein_emb": protein_emb, # [Lp, D] variable-length! + "protein_length": protein_emb.shape[0], + "target": target, + "has_conc": has_conc, + "log_conc": log_conc, + } + + +def collate_fn( + batch: List[Dict[str, torch.Tensor]], +) -> Dict[str, torch.Tensor]: + """ + Collate with variable-length protein padding. + + Glycan sequences are already padded (BPE tokenizer pads to + max_glycan_length). Protein sequences need padding to the + max length in the batch. + """ + # Glycan: already fixed-length, just stack + token_ids = torch.stack([item["token_ids"] for item in batch]) + attention_mask = torch.stack( + [item["attention_mask"] for item in batch] + ).float() + branch_depths = torch.stack( + [item["branch_depths"] for item in batch] + ) + linkage_types = torch.stack( + [item["linkage_types"] for item in batch] + ) + motif_features = torch.stack([item["motif_features"] for item in batch]) + + # Protein: variable-length → pad to max in batch + protein_embs = [item["protein_emb"] for item in batch] + protein_padded = pad_sequence(protein_embs, batch_first=True) # [B, Lp_max, D] + + # Protein mask: 1 for real residues, 0 for padding + protein_lengths = [item["protein_length"] for item in batch] + max_prot_len = protein_padded.shape[1] + protein_mask = torch.zeros(len(batch), max_prot_len) + for i, length in enumerate(protein_lengths): + protein_mask[i, :length] = 1.0 + + # Targets and metadata + targets = torch.stack([item["target"] for item in batch]) + has_conc = torch.stack([item["has_conc"] for item in batch]) + log_conc = torch.stack([item["log_conc"] for item in batch]) + + return { + "token_ids": token_ids, + "attention_mask": attention_mask, + "branch_depths": branch_depths, + "linkage_types": linkage_types, + "motif_features": motif_features, + "protein_emb": protein_padded, # [B, Lp_max, D] + "protein_mask": protein_mask, # [B, Lp_max] + "target": targets, + "has_conc": has_conc, + "log_conc": log_conc, + } diff --git a/releases/2026-10-02/affinose/training_v8.py b/releases/2026-10-02/affinose/training_v8.py new file mode 100644 index 0000000000000000000000000000000000000000..279cf92a86fc460bb3e7ccfc96586818b4195cd1 --- /dev/null +++ b/releases/2026-10-02/affinose/training_v8.py @@ -0,0 +1,1038 @@ +""" +Bertint V8 Training — Cross-Attention + Live Bertose Finetuning + +Based on V7 trainer with changes for V8 architecture: + - Per-residue protein embeddings (variable-length, padded in collate) + - protein_mask passed to model for cross-attention + - AMP (GradScaler + autocast) built in from the start + - Regression only (no classification mode — V7 showed regression wins) +""" + +import argparse +import json +import logging +import os +import hashlib +import random +import sys +import time +from pathlib import Path +from typing import Dict, List, Optional, Tuple + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from scipy.stats import spearmanr, pearsonr +from torch.cuda.amp import GradScaler, autocast +from torch.utils.data import DataLoader + +from bertint_v8 import BertintV8, BertintV8Loss, load_bertose_encoder +from dataset_v8 import BertintV8Dataset, collate_fn + +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(levelname)s - %(message)s", +) +logger = logging.getLogger(__name__) + + +# ============================================================================ +# Reproducibility +# ============================================================================ + + +def set_seed(seed: int = 42) -> None: + """Set random seeds for reproducibility.""" + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + if torch.cuda.is_available(): + torch.cuda.manual_seed_all(seed) + + +# ============================================================================ +# Metrics +# ============================================================================ + + +def _atomic_torch_save(obj, path): + """Write via a temp file + os.replace so a preemption cannot truncate.""" + tmp = str(path) + ".tmp" + torch.save(obj, tmp) + os.replace(tmp, path) + +class AssayGroupedBatchSampler(torch.utils.data.Sampler): + """Batches of K assays x M rows, emitted as contiguous blocks. + + The block structure is what lets the loss recover the grouping from the batch shape without + threading assay ids through collate_fn. Sampling is uniform over ASSAYS, not rows, so the + gradient weighting matches the equal-assay macro we actually report. + """ + + def __init__(self, exp_ids, assays_per_batch, rows_per_assay, seed=42): + import collections + self.K, self.M = assays_per_batch, rows_per_assay + idx = collections.defaultdict(list) + for i, e in enumerate(exp_ids): + idx[e].append(i) + # an assay smaller than M cannot fill a block; excluded and COUNTED, never padded + self.groups = [np.asarray(v) for v in idx.values() if len(v) >= self.M] + self.excluded_assays = len(idx) - len(self.groups) + self.rng = np.random.default_rng(seed) + self.n_batches = max(len(self.groups) // self.K, 1) + logger.info(" assay-grouped sampler: %d usable assays (%d too small for M=%d), " + "%d batches/epoch of %dx%d", + len(self.groups), self.excluded_assays, self.M, + self.n_batches, self.K, self.M) + + def __iter__(self): + order = self.rng.permutation(len(self.groups)) + for b in range(self.n_batches): + batch = [] + for gi in order[b * self.K:(b + 1) * self.K]: + g = self.groups[gi] + pick = self.rng.choice(len(g), self.M, replace=False) + batch.extend(int(x) for x in g[pick]) + if len(batch) == self.K * self.M: + yield batch + + def __len__(self): + return self.n_batches + + +class WithinAssayPairwiseLoss(nn.Module): + """RankNet pairwise logistic loss, computed INSIDE each assay block. + + The batch arrives as K contiguous blocks of M rows (see AssayGroupedBatchSampler), so it + reshapes to (K, M) and every pair compared is guaranteed to come from the same assay — which + is the only comparison the estimand defines. + """ + + def __init__(self, assays_per_batch, rows_per_assay): + super().__init__() + self.K, self.M = assays_per_batch, rows_per_assay + + def forward(self, pred, target): + if pred.numel() != self.K * self.M: + # eval batches are not grouped; fall back so the same object can score them + return F.mse_loss(pred, target) + p = pred.view(self.K, self.M) + y = target.view(self.K, self.M) + d = p.unsqueeze(2) - p.unsqueeze(1) # (K, M, M) predicted differences + s = torch.sign(y.unsqueeze(2) - y.unsqueeze(1)) # (K, M, M) true order, 0 where tied + m = s != 0 + if not m.any(): + return pred.sum() * 0.0 + return F.softplus(-s[m] * d[m]).mean() + + +def equal_assay_macro(preds, targets, groups, min_rows=5, min_distinct=2): + """Mean per-assay Spearman, equal weight per eligible assay. + + Eligibility mirrors the split's own rule: an assay needs >= min_rows rows and >= min_distinct + distinct target values, plus >= min_distinct distinct PREDICTIONS (a constant prediction makes + Spearman undefined, and treating that as 0.0 would silently reward degenerate assays). + Returns (macro, n_eligible, n_total). + """ + import collections + idx = collections.defaultdict(list) + for i, g in enumerate(groups): + idx[g].append(i) + vals = [] + for g, ii in idx.items(): + if len(ii) < min_rows: + continue + t_ = targets[ii] + p_ = preds[ii] + if len(np.unique(t_)) < min_distinct or len(np.unique(p_)) < min_distinct: + continue + r, _ = spearmanr(p_, t_) + if not np.isnan(r): + vals.append(float(r)) + if not vals: + return 0.0, 0, len(idx) + return float(np.mean(vals)), len(vals), len(idx) + + +def compute_metrics( + preds: np.ndarray, targets: np.ndarray +) -> Dict[str, float]: + """Compute Spearman, Pearson, MSE.""" + rho, _ = spearmanr(preds, targets) + r, _ = pearsonr(preds, targets) + mse = np.mean((preds - targets) ** 2) + # CONTRACT r2: a NaN correlation means a collapsed model. Coercing it to + # 0.0 disguises collapse as merely-bad performance, so fail closed. + if np.isnan(rho) or np.isnan(r) or not np.isfinite(mse): + raise RuntimeError( + "non-finite metric: spearman=%r pearson=%r mse=%r " + "(pred std=%r, target std=%r)" % (rho, r, mse, + float(np.std(preds)), float(np.std(targets)))) + return {"spearman": float(rho), "pearson": float(r), "mse": float(mse)} + + +# ============================================================================ +# Trainer +# ============================================================================ + + +class BertintV8Trainer: + """ + Trainer for BertintV8 with cross-attention and AMP. + + Args: + model: BertintV8 model. + criterion: Loss function. + train_loader: Training data loader. + val_loader: Validation data loader. + test_loader: Test data loader. + output_dir: Directory for checkpoints and results. + lr_encoder: Learning rate for Bertose encoder layers. + lr_head: Learning rate for cross-attention, SWE, and head. + weight_decay: Weight decay for AdamW. + max_grad_norm: Maximum gradient norm for clipping. + epochs: Number of training epochs. + patience: Early stopping patience. + checkpoint_interval: Save checkpoint every N epochs. + resume: Whether to resume from last checkpoint. + """ + + def __init__( + self, + model: BertintV8, + criterion: nn.Module, + train_loader: DataLoader, + val_loader: DataLoader, + test_loader: DataLoader, + output_dir: str, + lr_encoder: float = 1e-5, + lr_head: float = 1e-4, + weight_decay: float = 0.01, + max_grad_norm: float = 1.0, + epochs: int = 50, + patience: int = 15, + checkpoint_interval: int = 5, + resume: bool = False, + fingerprint: str = None, + input_hashes: dict = None, + warmup_pct: float = 0.0, + ): + self.model = model + self.criterion = criterion + self.train_loader = train_loader + self.val_loader = val_loader + self.test_loader = test_loader + self.output_dir = output_dir + self.epochs = epochs + self.patience = patience + self.checkpoint_interval = checkpoint_interval + self.resume = resume + self.max_grad_norm = max_grad_norm + + os.makedirs(output_dir, exist_ok=True) + + self.device = torch.device( + "cuda" if torch.cuda.is_available() else "cpu" + ) + self.model.to(self.device) + self.criterion.to(self.device) + + # AMP scaler + self.scaler = GradScaler() + + # Separate param groups: encoder (small lr) vs rest (larger lr) + encoder_params = [] + head_params = [] + for name, param in model.named_parameters(): + if not param.requires_grad: + continue + if name.startswith("seq_embeddings") or name.startswith( + "seq_layers" + ): + encoder_params.append(param) + else: + head_params.append(param) + + logger.info( + f" Param groups: encoder={len(encoder_params)} tensors " + f"(lr={lr_encoder}), head={len(head_params)} tensors " + f"(lr={lr_head})" + ) + + self.optimizer = torch.optim.AdamW( + [ + { + "params": encoder_params, + "lr": lr_encoder, + "weight_decay": weight_decay, + }, + { + "params": head_params, + "lr": lr_head, + "weight_decay": weight_decay, + }, + ] + ) + + # OneCycleLR with per-batch stepping (matches Twin Peaks pattern) + # Built-in warmup (pct_start) + cosine annealing + total_steps = len(train_loader) * epochs + if warmup_pct > 0: + pct_start = warmup_pct + else: + pct_start = 0.3 # Default: 30% warmup + + self.scheduler = torch.optim.lr_scheduler.OneCycleLR( + self.optimizer, + max_lr=[lr_encoder, lr_head], + total_steps=total_steps, + pct_start=pct_start, + anneal_strategy='cos', + ) + warmup_steps_actual = int(total_steps * pct_start) + logger.info( + f" Scheduler: OneCycleLR per-batch stepping" + ) + logger.info( + f" total_steps={total_steps:,}, " + f"warmup={warmup_steps_actual:,} steps " + f"({pct_start*100:.0f}%), cosine decay" + ) + + # State + self.start_epoch = 0 + self.best_metric = -float("inf") + self.patience_counter = 0 + self.history: List[Dict] = [] + + # CONTRACT r2 FIX: the fingerprint must exist BEFORE resume, which is + # the last statement of __init__. Assigning it after construction left + # the guard reading None and a foreign checkpoint loaded unchecked. + self.fingerprint = fingerprint + self.input_hashes = input_hashes or {} + self.early_stopped = False + self.best_epoch = -1 + if resume: + self._resume_from_checkpoint() + + def train(self) -> Dict: + """Full training loop with early stopping.""" + logger.info(f"\nStarting V8 training for {self.epochs} epochs") + logger.info(f" Device: {self.device}") + logger.info(f" Train batches: {len(self.train_loader)}") + logger.info(f" Val batches: {len(self.val_loader)}") + logger.info(f" AMP: enabled") + + for epoch in range(self.start_epoch, self.epochs): + t0 = time.time() + + train_loss = self._train_epoch(epoch) + val_loss, val_metrics = self._eval_epoch(self.val_loader) + + elapsed = time.time() - t0 + rho_pooled = val_metrics["spearman"] + rho = val_metrics["macro_spearman"] # the DECLARED selector + r = val_metrics["pearson"] + + logger.info( + f" Epoch {epoch + 1:3d} | Train loss={train_loss:.4f} | " + f"Val loss={val_loss:.4f} MACRO={rho:.4f} " + f"(pooled={rho_pooled:.4f}, {val_metrics['macro_assays_eligible']}" + f"/{val_metrics['macro_assays_total']} assays) r={r:.4f} | " + f"{elapsed:.1f}s" + ) + + # Track best + if rho > self.best_metric: + self.best_metric = rho + self.patience_counter = 0 + _atomic_torch_save( + self.model.state_dict(), + os.path.join(self.output_dir, "best_model.pt"), + ) + self.best_epoch = epoch + logger.info(f" * New best: {rho:.4f}") + else: + self.patience_counter += 1 + + # History + self.history.append( + { + "epoch": epoch + 1, + "train_loss": train_loss, + "val_loss": val_loss, + "val_metrics": val_metrics, + "lr_encoder": self.optimizer.param_groups[0]["lr"], + "lr_head": self.optimizer.param_groups[1]["lr"], + } + ) + + # (scheduler.step() is now called per-batch in _train_epoch) + + # Periodic checkpoint + if (epoch + 1) % self.checkpoint_interval == 0: + self._save_checkpoint(epoch + 1) + + # Early stopping + if self.patience_counter >= self.patience: + logger.info( + f" Early stopping at epoch {epoch + 1} " + f"(no improvement for {self.patience} epochs)" + ) + self.early_stopped = True + self._save_checkpoint(epoch + 1) + break + + # Load best and test + logger.info(f"\n{'=' * 60}") + logger.info("Loading best model for test evaluation...") + best_path = os.path.join(self.output_dir, "best_model.pt") + self.model.load_state_dict( + torch.load(best_path, map_location=self.device, weights_only=False) + ) + + test_loss, test_metrics = self._eval_epoch(self.test_loader) + + logger.info(f"\n{'=' * 60}") + logger.info("TEST RESULTS:") + logger.info(f" Spearman rho: {test_metrics['spearman']:.4f}") + logger.info(f" Pearson r: {test_metrics['pearson']:.4f}") + logger.info(f" MSE: {test_metrics['mse']:.6f}") + logger.info(f"{'=' * 60}") + + # Save results + # CONTRACT r2: the old label hard-coded "SWE" regardless of what was + # actually requested. Describe the configuration that ran. + results = { + "task_type": "regression", + "architecture": getattr(self, "architecture_label", + "cross-attention + live Bertose"), + "best_metric": self.best_metric, + "best_metric_is": "validation", + "best_epoch": self.best_epoch, + "early_stopped": self.early_stopped, + "epochs_ran": len(self.history), + "test_metrics": test_metrics, + "test_loss": test_loss, + "history": self.history, + "fingerprint": self.fingerprint, + "input_hashes": self.input_hashes, + } + # CONTRACT r2: dump per-record predictions. Without them no + # cohort-averaged statistic can be recovered after the fact. + try: + import numpy as _np + _p = getattr(self, "_last_preds", None) + _t = getattr(self, "_last_targets", None) + if _p is not None and _t is not None: + _np.savez_compressed( + os.path.join(self.output_dir, "test_predictions.npz"), + predictions=_np.asarray(_p, dtype=_np.float32), + targets=_np.asarray(_t, dtype=_np.float32)) + logger.info(f" [PRED] wrote {len(_p)} test predictions") + else: + raise RuntimeError("no test predictions captured") + except Exception as _e: + raise RuntimeError("failed to write test predictions: %s" % _e) + + results_path = os.path.join(self.output_dir, "results.json") + with open(results_path, "w") as f: + json.dump(results, f, indent=2) + logger.info(f"Results saved to {results_path}") + + return results + + def _train_epoch(self, epoch: int) -> float: + """Run one training epoch with AMP.""" + self.model.train() + total_loss = 0.0 + n_batches = len(self.train_loader) + + for batch_idx, batch in enumerate(self.train_loader): + # Move to device + token_ids = batch["token_ids"].to(self.device) + attention_mask = batch["attention_mask"].to(self.device) + branch_depths = batch["branch_depths"].to(self.device) + linkage_types = batch["linkage_types"].to(self.device) + protein_emb = batch["protein_emb"].to(self.device) + protein_mask = batch["protein_mask"].to(self.device) + target = batch["target"].to(self.device) + + self.optimizer.zero_grad() + + # AMP forward + with autocast(): + pred = self.model( + token_ids=token_ids, + attention_mask=attention_mask, + branch_depths=branch_depths, + linkage_types=linkage_types, + protein_emb=protein_emb, + protein_mask=protein_mask, + motif_features=batch["motif_features"].to(self.device), + ) + loss = self.criterion(pred, target) + + # AMP backward + self.scaler.scale(loss).backward() + self.scaler.unscale_(self.optimizer) + torch.nn.utils.clip_grad_norm_( + self.model.parameters(), self.max_grad_norm + ) + self.scaler.step(self.optimizer) + self.scaler.update() + + # Per-batch LR scheduling (OneCycleLR) + self.scheduler.step() + + total_loss += loss.item() + + # Progress logging + if (batch_idx + 1) % 200 == 0: + avg = total_loss / (batch_idx + 1) + lr_enc = self.optimizer.param_groups[0]["lr"] + logger.info( + f" [E{epoch + 1}][{batch_idx + 1}/{n_batches}] " + f"loss={avg:.4f} lr_enc={lr_enc:.2e}" + ) + + return total_loss / n_batches + + @torch.no_grad() + def _eval_epoch( + self, loader: DataLoader + ) -> Tuple[float, Dict[str, float]]: + """Run evaluation with AMP.""" + self.model.eval() + total_loss = 0.0 + all_preds = [] + all_targets = [] + + for batch in loader: + token_ids = batch["token_ids"].to(self.device) + attention_mask = batch["attention_mask"].to(self.device) + branch_depths = batch["branch_depths"].to(self.device) + linkage_types = batch["linkage_types"].to(self.device) + protein_emb = batch["protein_emb"].to(self.device) + protein_mask = batch["protein_mask"].to(self.device) + target = batch["target"].to(self.device) + + with autocast(): + pred = self.model( + token_ids=token_ids, + attention_mask=attention_mask, + branch_depths=branch_depths, + linkage_types=linkage_types, + protein_emb=protein_emb, + protein_mask=protein_mask, + motif_features=batch["motif_features"].to(self.device), + ) + loss = self.criterion(pred, target) + + total_loss += loss.item() + all_preds.extend(pred.float().cpu().numpy()) + all_targets.extend(target.cpu().numpy()) + + avg_loss = total_loss / len(loader) + metrics = compute_metrics( + np.array(all_preds), np.array(all_targets) + ) + # ⛔ DECLARED SELECTOR: equal-assay macro, not pooled. Cohort ids come from the dataset's + # own row order, which equals evaluation order because val/test loaders use shuffle=False. + # Asserted, not assumed — a silent misalignment here would select on scrambled assays. + try: + recs = loader.dataset.records + assert len(recs) == len(all_preds), ( + "eval row count %d != dataset rows %d; loader order is not dataset order" + % (len(all_preds), len(recs))) + groups = recs["exp_id"].values + macro, n_elig, n_tot = equal_assay_macro( + np.array(all_preds), np.array(all_targets), groups) + metrics["macro_spearman"] = macro + metrics["macro_assays_eligible"] = int(n_elig) + metrics["macro_assays_total"] = int(n_tot) + except Exception as e: + logger.error("FAIL-CLOSED: equal-assay macro unavailable: %s", e) + raise + self._last_preds = all_preds + self._last_targets = all_targets + return avg_loss, metrics + + def _save_checkpoint(self, epoch: int) -> None: + """Save full training state for resume.""" + ckpt = { + "epoch": epoch, + "model_state_dict": self.model.state_dict(), + "optimizer_state_dict": self.optimizer.state_dict(), + "scheduler_state_dict": self.scheduler.state_dict(), + "scaler_state_dict": self.scaler.state_dict(), + "best_metric": self.best_metric, + "patience_counter": self.patience_counter, + "history": self.history, + # CONTRACT r2: without RNG state a resumed fit replays the data + # order and dropout stream from epoch 0 and is a DIFFERENT + # experiment from an uninterrupted fit at the same seed. + "py_rng": random.getstate(), + "np_rng": np.random.get_state(), + "torch_rng": torch.get_rng_state(), + "cuda_rng": (torch.cuda.get_rng_state_all() + if torch.cuda.is_available() else None), + "best_epoch": getattr(self, "best_epoch", -1), + "early_stopped": getattr(self, "early_stopped", False), + "fingerprint": getattr(self, "fingerprint", None), + } + path = os.path.join(self.output_dir, "last_checkpoint.pt") + _atomic_torch_save(ckpt, path) + logger.info(f" [CKPT] Saved epoch {epoch}") + + def _resume_from_checkpoint(self) -> None: + """Resume training from last checkpoint.""" + ckpt_path = os.path.join(self.output_dir, "last_checkpoint.pt") + if not os.path.exists(ckpt_path): + logger.info(" No checkpoint found, starting fresh") + return + + ckpt = torch.load(ckpt_path, map_location=self.device, weights_only=False) + # CONTRACT r2: every arm/seed/port produces an identically shaped state + # dict, so shape is no check at all. Refuse anything whose trajectory + # fingerprint differs from this cell's. + mine = getattr(self, "fingerprint", None) + theirs = ckpt.get("fingerprint") + if mine is not None and theirs is not None and mine != theirs: + raise RuntimeError( + "refusing foreign checkpoint: fingerprint %s != %s" + % (theirs, mine)) + if mine is not None and theirs is None: + raise RuntimeError( + "refusing unfingerprinted checkpoint (pre-contract-r2 run) " + "at %s" % ckpt_path) + self.model.load_state_dict(ckpt["model_state_dict"]) + self.optimizer.load_state_dict(ckpt["optimizer_state_dict"]) + self.scheduler.load_state_dict(ckpt["scheduler_state_dict"]) + if "scaler_state_dict" in ckpt: + self.scaler.load_state_dict(ckpt["scaler_state_dict"]) + self.start_epoch = ckpt["epoch"] + self.best_metric = ckpt["best_metric"] + self.patience_counter = ckpt["patience_counter"] + self.history = ckpt["history"] + self.best_epoch = ckpt.get("best_epoch", -1) + self.early_stopped = ckpt.get("early_stopped", False) + if ckpt.get("py_rng") is not None: + random.setstate(ckpt["py_rng"]) + np.random.set_state(ckpt["np_rng"]) + torch.set_rng_state(ckpt["torch_rng"].cpu() + if hasattr(ckpt["torch_rng"], "cpu") + else ckpt["torch_rng"]) + if ckpt.get("cuda_rng") is not None and torch.cuda.is_available(): + # torch.load(map_location=device, weights_only=False) moves these onto the GPU; + # set_rng_state_all requires CPU ByteTensors. + torch.cuda.set_rng_state_all( + [t.cpu() if hasattr(t, "cpu") else t + for t in ckpt["cuda_rng"]]) + logger.info(" [RNG] restored python/numpy/torch/cuda state") + else: + raise RuntimeError("checkpoint carries no RNG state; refusing resume") + logger.info( + f" Resumed from epoch {self.start_epoch}, " + f"best={self.best_metric:.4f}" + ) + + +# ============================================================================ +# Main +# ============================================================================ + + +def main(): + """Entry point for V8 training.""" + parser = argparse.ArgumentParser(description="Bertint V8 Training") + parser.add_argument( + "--csv_path", required=True, help="Path to binding data CSV" + ) + parser.add_argument( + "--split_path", required=True, help="Path to glycan-cold splits JSON" + ) + parser.add_argument( + "--protein_emb_path", required=True, help="Path to ESM-C HDF5" + ) + parser.add_argument( + "--vocab_path", required=True, help="Path to BPE vocab JSON" + ) + parser.add_argument( + "--bertose_checkpoint", required=True, help="Bertose checkpoint" + ) + parser.add_argument("--output_dir", required=True, help="Output dir") + + # Model architecture + parser.add_argument( + "--freeze_layers", type=int, default=4, help="Layers to freeze" + ) + parser.add_argument( + "--shared_dim", type=int, default=512, help="Shared dim" + ) + parser.add_argument( + "--num_cross_layers", type=int, default=2, help="Cross-attn layers" + ) + parser.add_argument( + "--num_heads", type=int, default=8, help="Attention heads" + ) + parser.add_argument( + "--swe_slices", type=int, default=512, help="SWE slices" + ) + parser.add_argument( + "--dropout", type=float, default=0.1, help="Dropout rate" + ) + parser.add_argument( + "--protein_dim", type=int, default=960, help="ESM-C dim" + ) + parser.add_argument( + "--separate_swe", action="store_true", + help="Use separate SWE modules for glycan and protein" + ) + + # Training + parser.add_argument( + "--lr_encoder", type=float, default=1e-5, help="Encoder LR" + ) + parser.add_argument( + "--lr_head", type=float, default=1e-4, help="Head LR" + ) + parser.add_argument( + "--weight_decay", type=float, default=0.01, help="Weight decay" + ) + parser.add_argument( + "--max_grad_norm", type=float, default=1.0, help="Grad clip" + ) + parser.add_argument( + "--batch_size", type=int, default=32, help="Batch size" + ) + parser.add_argument( + "--epochs", type=int, default=50, help="Max epochs" + ) + parser.add_argument( + "--patience", type=int, default=15, help="Early stopping" + ) + parser.add_argument( + "--max_glycan_length", type=int, default=256, help="Max glycan len" + ) + parser.add_argument( + "--max_protein_length", type=int, default=1024, help="Max protein len" + ) + parser.add_argument("--protein_mode", default="real", + choices=["real","constant"], + help="real | constant (protein input zeroed; NOT the G arm — the " + "protein pathway still exists. Use --glycan_only for G.)") + # G arm: do not construct the protein pathway at all. 'constant' only zeroes the + # input; projection, cross-attention and the 2x-width head all remain. + parser.add_argument("--ranking_loss", action="store_true", + help="within-assay pairwise ranking loss + assay-grouped batches; " + "aligns the objective with the equal-assay macro estimand") + parser.add_argument("--assays_per_batch", type=int, default=4) + parser.add_argument("--rows_per_assay", type=int, default=8) + parser.add_argument("--protein_binding_channel", action="store_true", + help="R2: last protein channel is a per-residue binding " + "probability; pool globally AND binding-weighted, then " + "concatenate (KinForm Eqs 2-5). Use --protein_dim 961.") + parser.add_argument("--glycan_only", action="store_true", + help="protected arm G: no protein tensor, mask, projection or " + "cross-attention; head narrows to the glycan width") + parser.add_argument("--protein_attentive_pool", action="store_true", + help="arm A: zero-init attentive protein pooling " + "(identical to mean pooling at init)") + parser.add_argument( + "--motif_additive_dim", type=int, default=0, + help="d>0 adds score += w . motif_features over d raw motif counts (released counts 0-13), zero-initialised") + parser.add_argument("--glycan_size_channel", action="store_true", + help="Append log1p(glycan token count) to the head input") + parser.add_argument("--seed", type=int, default=42, help="Random seed") + # ---- contract r2 ----------------------------------------------------- + parser.add_argument("--roles_tsv", required=True) + parser.add_argument("--train_stratum", required=True) + parser.add_argument("--val_stratum", required=True) + parser.add_argument("--test_stratum", required=True) + parser.add_argument("--features_dir", required=True) + parser.add_argument("--expected_train_rows", type=int, required=True) + parser.add_argument("--expected_val_rows", type=int, required=True) + parser.add_argument("--expected_test_rows", type=int, required=True) + parser.add_argument("--manifest_sha256", required=True) + parser.add_argument("--cell_id", required=True) + parser.add_argument("--input_hashes", required=True) + parser.add_argument( + "--warmup_pct", type=float, default=0.05, + help="Fraction of total steps for warmup (0.05=5%%, 0.10=10%%)" + ) + parser.add_argument( + "--target_col", default="target_rank", help="Target column" + ) + parser.add_argument( + "--checkpoint_interval", type=int, default=5, help="Ckpt every N" + ) + parser.add_argument( + "--resume", action="store_true", help="Resume from checkpoint" + ) + # Ablation controls + parser.add_argument( + "--pooling_mode", default="swe", + choices=["swe", "mean", "joint_swe"], + help="Pooling strategy: swe (default), mean, or joint_swe" + ) + parser.add_argument( + "--interaction_mode", default="product_sum", + choices=["product_sum", "concat"], + help="Interaction: product_sum (default) or concat" + ) + parser.add_argument( + "--no_cross_attention", action="store_true", + help="Disable cross-attention blocks (ablation)" + ) + + args = parser.parse_args() + + set_seed(args.seed) + logger.info("Bertint V8 Training — Cross-Attention + Live Bertose") + logger.info(f" freeze_layers={args.freeze_layers}") + logger.info(f" lr_encoder={args.lr_encoder}") + logger.info(f" lr_head={args.lr_head}") + logger.info(f" batch_size={args.batch_size}") + logger.info(f" shared_dim={args.shared_dim}") + logger.info(f" cross_layers={args.num_cross_layers}") + logger.info(f" separate_swe={args.separate_swe}") + logger.info(f" pooling_mode={args.pooling_mode}") + logger.info(f" interaction_mode={args.interaction_mode}") + logger.info(f" cross_attention={not args.no_cross_attention}") + + # Load datasets + logger.info("\nLoading datasets...") + train_ds = BertintV8Dataset( + args.csv_path, args.split_path, "train", + args.protein_emb_path, args.vocab_path, + max_glycan_length=args.max_glycan_length, + max_protein_length=args.max_protein_length, + target_col=args.target_col, + roles_path=args.roles_tsv, + stratum=args.train_stratum, + features_dir=args.features_dir, + expected_rows=args.expected_train_rows, + ) + val_ds = BertintV8Dataset( + args.csv_path, args.split_path, "val", + args.protein_emb_path, args.vocab_path, + max_glycan_length=args.max_glycan_length, + max_protein_length=args.max_protein_length, + target_col=args.target_col, + roles_path=args.roles_tsv, + stratum=args.val_stratum, + features_dir=args.features_dir, + expected_rows=args.expected_val_rows, + ) + test_ds = BertintV8Dataset( + args.csv_path, args.split_path, "test", + args.protein_emb_path, args.vocab_path, + max_glycan_length=args.max_glycan_length, + max_protein_length=args.max_protein_length, + target_col=args.target_col, + roles_path=args.roles_tsv, + stratum=args.test_stratum, + features_dir=args.features_dir, + expected_rows=args.expected_test_rows, + ) + + if args.ranking_loss: + # ⛔ TRAIN ONLY. val/test keep plain batching + shuffle=False so the macro is computed + # exactly as it was for every previously reported arm. + _sampler = AssayGroupedBatchSampler( + train_ds.records["exp_id"].values, + args.assays_per_batch, args.rows_per_assay, seed=args.seed) + train_loader = DataLoader( + train_ds, batch_sampler=_sampler, + num_workers=4, pin_memory=True, collate_fn=collate_fn, + ) + else: + train_loader = DataLoader( + train_ds, batch_size=args.batch_size, shuffle=True, + num_workers=4, pin_memory=True, collate_fn=collate_fn, + ) + val_loader = DataLoader( + val_ds, batch_size=args.batch_size, shuffle=False, + num_workers=2, pin_memory=True, collate_fn=collate_fn, + ) + test_loader = DataLoader( + test_ds, batch_size=args.batch_size, shuffle=False, + num_workers=2, pin_memory=True, collate_fn=collate_fn, + ) + + # Build model + logger.info("\nBuilding model...") + config, seq_emb, seq_layers = load_bertose_encoder( + args.bertose_checkpoint, freeze_layers=args.freeze_layers + ) + + model = BertintV8( + seq_embeddings=seq_emb, + seq_layers=seq_layers, + glycan_dim=config.seq_hidden_size, + protein_dim=args.protein_dim, + shared_dim=args.shared_dim, + num_cross_layers=args.num_cross_layers, + num_heads=args.num_heads, + swe_slices=args.swe_slices, + dropout=args.dropout, + separate_swe=args.separate_swe, + pooling_mode=args.pooling_mode, + interaction_mode=args.interaction_mode, + use_cross_attention=not args.no_cross_attention, + glycan_size_channel=args.glycan_size_channel, + motif_additive_dim=args.motif_additive_dim, + protein_mode=args.protein_mode, + protein_attentive_pool=args.protein_attentive_pool, + protein_tower=not args.glycan_only, + protein_binding_channel=args.protein_binding_channel, + ) + + total_params = sum(p.numel() for p in model.parameters()) + trainable_params = sum( + p.numel() for p in model.parameters() if p.requires_grad + ) + logger.info(f" Total params: {total_params:,}") + logger.info(f" Trainable: {trainable_params:,}") + + # Loss + criterion = (WithinAssayPairwiseLoss(args.assays_per_batch, args.rows_per_assay) + if args.ranking_loss else BertintV8Loss()) + logger.info(" objective: %s", type(criterion).__name__) + + # ---------------- CONTRACT r2: seal inputs, then fingerprint ----------- + def _sha_file(p): + h = hashlib.sha256() + with open(p, "rb") as fh: + for c in iter(lambda: fh.read(1 << 22), b""): + h.update(c) + return h.hexdigest() + + _here = os.path.dirname(os.path.abspath(__file__)) + _feat = args.features_dir + _sealed = { + "csv": args.csv_path, + "roles_tsv": args.roles_tsv, + "protein_emb_h5": args.protein_emb_path, + "vocabulary": args.vocab_path, + "upstream_checkpoint": args.bertose_checkpoint, + "dataset_v8.py": os.path.join(_here, "dataset_v8.py"), + "training_v8.py": os.path.abspath(__file__), + "bertint_v8.py": os.path.join(_here, "bertint_v8.py"), + "a1111_encoder_adapter.py": os.path.join(_here, "a1111_encoder_adapter.py"), + } + for _n in ("token_ids", "branch_depths", "linkage_types", "attention_mask", + "tree_channels_valid", "motif_features"): + _sealed["feature_" + _n] = os.path.join(_feat, "review_%s.npy" % _n) + _sealed["feature_index"] = os.path.join(_feat, "review_affinose_glycan_index.tsv.gz") + + _hashes = {} + for _k, _p in _sealed.items(): + if not os.path.isfile(_p): + raise RuntimeError("sealed input missing: %s -> %s" % (_k, _p)) + _hashes[_k] = _sha_file(_p) + + # every dynamically resolved module under the port tree or bertose root + _imports = {} + for _m in list(sys.modules.values()): + _f = getattr(_m, "__file__", None) + if not _f or not os.path.isfile(_f): + continue + _fa = os.path.abspath(_f) + if _fa.startswith(_here) or "/bertose" in _fa or "/glycan-SD-VS/" in _fa: + _imports[_fa] = _sha_file(_fa) + _hashes["_imported_modules"] = _imports + logger.info(" [SEAL] hashed %d artifacts + %d imported modules" + % (len(_sealed), len(_imports))) + + # ENFORCE against the pinned expectation file, if supplied + if getattr(args, "input_hashes", None): + with open(args.input_hashes) as _fh: + _exp = json.load(_fh) + _bad = [] + for _k, _v in _exp.items(): + if _k.startswith("_"): + continue + if _hashes.get(_k) != _v: + _bad.append("%s: got %s expected %s" + % (_k, str(_hashes.get(_k))[:16], str(_v)[:16])) + if _bad: + raise RuntimeError("SEALED INPUT HASH DRIFT:\n " + "\n ".join(_bad)) + logger.info(" [SEAL] all %d pinned hashes match" % len( + [k for k in _exp if not k.startswith("_")])) + else: + raise RuntimeError("--input_hashes is required under contract r2") + + # roster identity, not just a count + _roster = {} + for _split, _ds in (("train", train_ds), ("val", val_ds), ("test", test_ds)): + _h = hashlib.sha256() + _r = _ds.records + for _i, _row in enumerate(zip(_r["protein_id"], _r["glycan_wurcs"], + _r.get("exp_id", _r["protein_id"]))): + _h.update(("%d|%s|%s|%s\n" % (_i, _row[0], _row[1], _row[2])).encode()) + _roster[_split] = _h.hexdigest() + _hashes["_roster_digests"] = _roster + logger.info(" [SEAL] roster digests train=%s val=%s test=%s" + % (_roster["train"][:16], _roster["val"][:16], _roster["test"][:16])) + + _fp = hashlib.sha256("|".join([ + args.manifest_sha256, args.cell_id, str(args.seed), + args.train_stratum, args.val_stratum, args.test_stratum, + str(args.expected_train_rows), str(args.expected_val_rows), + str(args.expected_test_rows), + _hashes["upstream_checkpoint"], _hashes["dataset_v8.py"], + _hashes["training_v8.py"], _hashes["bertint_v8.py"], + _roster["train"], _roster["val"], _roster["test"], + str(args.epochs), str(args.batch_size), str(args.lr_encoder), + str(args.lr_head), str(args.freeze_layers), str(args.warmup_pct), + ]).encode()).hexdigest() + logger.info(" [FINGERPRINT] %s cell=%s" % (_fp[:16], args.cell_id)) + + os.makedirs(args.output_dir, exist_ok=True) + with open(os.path.join(args.output_dir, "receipt.json"), "w") as _fh: + json.dump({"cell_id": args.cell_id, "fingerprint": _fp, + "manifest_sha256": args.manifest_sha256, + "args": vars(args), "input_hashes": _hashes, + "roster_digests": _roster, + "slurm_job_id": os.environ.get("SLURM_JOB_ID"), + "slurm_array_task_id": os.environ.get("SLURM_ARRAY_TASK_ID"), + "slurm_restart_count": os.environ.get("SLURM_RESTART_COUNT"), + "node": os.environ.get("SLURMD_NODENAME"), + "gpu": (torch.cuda.get_device_name(0) + if torch.cuda.is_available() else None)}, + _fh, indent=2, default=str) + + # Train + trainer = BertintV8Trainer( + model=model, + criterion=criterion, + train_loader=train_loader, + val_loader=val_loader, + test_loader=test_loader, + output_dir=args.output_dir, + lr_encoder=args.lr_encoder, + lr_head=args.lr_head, + weight_decay=args.weight_decay, + max_grad_norm=args.max_grad_norm, + epochs=args.epochs, + patience=args.patience, + checkpoint_interval=args.checkpoint_interval, + resume=args.resume, + warmup_pct=args.warmup_pct, + fingerprint=_fp, + input_hashes=_hashes, + ) + trainer.architecture_label = ( + "cross-attention=%s pooling=%s interaction=%s + live Bertose" + % (not args.no_cross_attention if hasattr(args, "no_cross_attention") else True, + args.pooling_mode, args.interaction_mode)) + + results = trainer.train() + logger.info("\nTraining complete!") + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/benchmark_exclusion/MANIFEST_SHA256.tsv b/releases/2026-10-02/benchmark_exclusion/MANIFEST_SHA256.tsv new file mode 100644 index 0000000000000000000000000000000000000000..12e27f074d9ed30087b00c62907180413964192d --- /dev/null +++ b/releases/2026-10-02/benchmark_exclusion/MANIFEST_SHA256.tsv @@ -0,0 +1,11 @@ +sha256 path +1db45969e1c06f12c1d8d2df35a166cb65c4ce0bf603aabebc2e6689bedc8e72 README.md +e2e0dfa7d133362146de10ba3dd774e9a3e186088f976189b0aae9d26b442bc4 code_inventory.tsv +050c0af96f133ded3139baf6dfea594f91c6659f411dc25fc06d5847951b2f0c required_successor_inputs.json +0507537ca8ee05b249f9ab3f3fa09de94b7acc633b91235f2778ae07659096bd source_verification.json +3d598a249db90c928f8a317923ba5d37eebbc1f63383a2c39e0541f20c31ccac writing/review/glytoucan/scripts/build_connection_level_support_audit.py +a9160769759c1df56238caad6a9f4ed6ec68477d44435ebbc81d64bbf541b64c writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py +0f88f53e22d0c068a87a09508a9d286e4982eddcb4e2154e63b2ca25339ece69 writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py +2c8821586df1caa53556b4cc14e6cd7507af4830aa8a149657571e0455eb6853 writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py +cd86a0a0b228c32e51ec73490711e37da3e6c9fdf9e64e980b7222b5312484aa writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py +966889118fa567729e1959750b1601018ba117aed0bfad3508005ba6b1896a08 writing/review/multimodal/tests/test_build_review_a5_non_iar_later_role_successor_20260720.py diff --git a/releases/2026-10-02/benchmark_exclusion/README.md b/releases/2026-10-02/benchmark_exclusion/README.md new file mode 100644 index 0000000000000000000000000000000000000000..ff653c13d09a084a94ba7c0fb7ef24c6e1275d92 --- /dev/null +++ b/releases/2026-10-02/benchmark_exclusion/README.md @@ -0,0 +1,60 @@ +# Benchmark-identity exclusion and partition code + +This folder supplies the five exclusion/partition scripts named in `BENCHMARK_IDENTITY_EXCLUSION_3833_20260922.md`, plus their only imported local helper. These are byte-identical copies of the original sources. This folder is included in the submission code package and reviewer ZIP. The matching exclusion lists and count tables are in `04_source_data/benchmark_exclusion` in the full submission folder. + +The fifth requested file is in `multimodal/tests/`, not `multimodal/scripts/`. Relative project structure is preserved below `writing/review/` because the source resolves its inputs and helper imports from its own path. `code_inventory.tsv` records each original path, SHA-256 and copied path. + +## What the code does + +1. `build_p1_direct_local_neighbor_audit_20260710.py` parses fixed-linkage residue trees and retrieves candidate matches using a three-iteration Weisfeiler–Lehman hash. Graphs contain residue nodes labelled by the complete WURCS residue-definition string and intermediate `BOND` nodes; edges carry the corresponding endpoint position. WL uses SHA-256 label strings, edge positions and a 32-byte digest. Exact NetworkX isomorphism confirms equality of original node `label` and edge `position` attributes. Hash agreement alone is not identity evidence. The script also measures other neighbour relations for separate analyses. +2. `build_p1_non_iar_exact_graph_authority_20260711.py` excludes sequence parents only by exact canonical WURCS string or confirmed graph identity. It filters out GlyCosmos IAR and grey-seal-only anchor memberships. A glycan also carrying another active endpoint role remains an anchor. One-edit neighbours, motifs and substructures do not cause exclusion. +3. `repartition_a5_non_iar_80_20_20260712.py` assigns whole precluster blocks, deterministically ordered by a salted hash, using the weighted cumulative midpoint relative to the 80% target. It verifies no retained group crosses training/development for block, raw feature hash or registry family. +4. `build_review_a5_non_iar_later_role_successor_20260720.py` adds 93 later strict interaction non-fit anchors. It requires 73 newly excluded parents, all exact matches, with no new graph-only aliases; 59 training and 14 development parents change to excluded while every other role is preserved. Its invariants require 3,673 exact matches plus 160 graph-only matches, 3,833 exclusions, 221,899 training parents and 55,476 development parents. +5. `test_build_review_a5_non_iar_later_role_successor_20260720.py` validates the existing successor outputs and their receipts. It does not build the inputs. + +Graph matching covers connected residue trees with fully specified linkage positions, **not necessarily completely specified residue stereochemistry**. Full residue-definition strings must match, including any unresolved residue annotations. Non-fixed structures receive exact-string matching only. Exclusion of matching identities does not establish motif-family or biosynthetic-family novelty. + +## Environment and checks + +Python 3.10 or newer is needed by the source syntax. The graph verifier imports `networkx`; its local parser helper imports `pandas`. The other four requested files use the standard library. Historical dependency versions are not pinned by these sources; no historical environment is asserted here. + +Preparation checked syntax with Python 3.12.14 and verified all six copied files byte for byte. Three standard-library builder `--help` entry points were checked. Local pandas metadata is 2.2.3; NetworkX is unavailable in that interpreter, so the graph module import/self-test was not run. No packages were installed. No exclusion scan, full builder, model inference, training, or payload-based test suite was run. + +## Inputs needed for replay + +This is a source bundle, not a self-contained data release. Original frozen data remain outside it. Restore the named inputs in the matching project layout before running a builder. Do not replace pinned files with newer files of the same name. + +- Initial graph audit: role-complete anchor manifest, frozen motif/fingerprint manifest and objective-eligibility manifest. The anchor-producing and fingerprint-producing pipelines are upstream prerequisites, not imported dependencies bundled here. +- Initial exclusion authority: role-complete anchor manifest, graph-neighbour edge ledger, and parent-identity manifest. +- 80/20 partition: the frozen July 11 parent/objective partition precursor plus fingerprints and parent identities. This precursor is a required input; the five scripts are not a continuous from-raw-data pipeline. +- Successor: the 22 exact path/hash inputs in `required_successor_inputs.json`, plus role CSVs named by the strict classification authority JSON. The source validates their expected hashes before processing. It also records the supplied test source. +- Tests: the successor output directory and original 80/20 predecessor parent partition. + +`required_successor_inputs.json` records the hashes declared by the unchanged source and whether the inputs exist locally; this preparation did not freshly hash or copy the data payloads. Source constants additionally document the first three steps' input paths and, where available, required input hashes. + +## Commands + +Run from this folder with the required dependencies installed in your selected environment. Help commands do not scan data: + +```sh +python3 writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py --help +python3 writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py --help +python3 writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py --help +python3 writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py --help +``` + +The following full replay commands are documented from the CLI/source and were **not executed** during preparation. Run each only after restoring its exact frozen inputs; choose a fresh output directory. Do not overwrite original scientific artifacts. + +```sh +python3 writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py --anchor-manifest writing/review/multimodal/outputs/p1_role_complete_anchor_union_20260711/review_p1_role_complete_anchor_manifest.tsv.gz --final-anchor-authority --output-dir replay/graph_audit +python3 writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py --output-dir replay/exclusion_authority +python3 writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py --output-directory replay/partition_80_20 +python3 writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py --output-directory replay/later_role_successor +REVIEW_A5_NON_IAR_SUCCESSOR_OUTPUT=replay/later_role_successor python3 writing/review/multimodal/tests/test_build_review_a5_non_iar_later_role_successor_20260720.py +``` + +These commands use frozen predecessor inputs at their source-declared paths; later steps do not automatically consume preceding `replay/` outputs. The successor has source-bound input hashes and cannot be redirected through arbitrary replacement datasets. Its receipt contains execution paths, so receipt bytes need not match when replayed at a new location even when deterministic payload bytes match. + +## Verification boundary + +See `source_verification.json` for line anchors, source hashes and preparation checks. The arithmetic is enforced by source invariants and supported by saved artifacts; this candidate preparation is not a fresh numerical reproduction of the 3,833-parent result, a checkpoint certification, or a claim that later AFFINose splits were all represented in these pretraining-time anchors. diff --git a/releases/2026-10-02/benchmark_exclusion/SHA256SUMS b/releases/2026-10-02/benchmark_exclusion/SHA256SUMS new file mode 100644 index 0000000000000000000000000000000000000000..5c7821d1a8a7d387e86ead69f280e61f7bc08e00 --- /dev/null +++ b/releases/2026-10-02/benchmark_exclusion/SHA256SUMS @@ -0,0 +1,11 @@ +8452e3ac521af1d3ea24bb5a99e02a930d913fc96394e5610fe8b86e19ea89ec MANIFEST_SHA256.tsv +96567c3b9c3e254bceb6bd82e43c1f252b987ced58dad41d3b4406b9f58a76ec README.md +e2e0dfa7d133362146de10ba3dd774e9a3e186088f976189b0aae9d26b442bc4 code_inventory.tsv +050c0af96f133ded3139baf6dfea594f91c6659f411dc25fc06d5847951b2f0c required_successor_inputs.json +0507537ca8ee05b249f9ab3f3fa09de94b7acc633b91235f2778ae07659096bd source_verification.json +3d598a249db90c928f8a317923ba5d37eebbc1f63383a2c39e0541f20c31ccac writing/review/glytoucan/scripts/build_connection_level_support_audit.py +a9160769759c1df56238caad6a9f4ed6ec68477d44435ebbc81d64bbf541b64c writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py +0f88f53e22d0c068a87a09508a9d286e4982eddcb4e2154e63b2ca25339ece69 writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py +2c8821586df1caa53556b4cc14e6cd7507af4830aa8a149657571e0455eb6853 writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py +cd86a0a0b228c32e51ec73490711e37da3e6c9fdf9e64e980b7222b5312484aa writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py +966889118fa567729e1959750b1601018ba117aed0bfad3508005ba6b1896a08 writing/review/multimodal/tests/test_build_review_a5_non_iar_later_role_successor_20260720.py diff --git a/releases/2026-10-02/benchmark_exclusion/code_inventory.tsv b/releases/2026-10-02/benchmark_exclusion/code_inventory.tsv new file mode 100644 index 0000000000000000000000000000000000000000..0d68d05805e0633f619341af267288c7fb45ae13 --- /dev/null +++ b/releases/2026-10-02/benchmark_exclusion/code_inventory.tsv @@ -0,0 +1,7 @@ +original_path candidate_path sha256 bytes unchanged +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py a9160769759c1df56238caad6a9f4ed6ec68477d44435ebbc81d64bbf541b64c 36975 True +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py 0f88f53e22d0c068a87a09508a9d286e4982eddcb4e2154e63b2ca25339ece69 15043 True +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py cd86a0a0b228c32e51ec73490711e37da3e6c9fdf9e64e980b7222b5312484aa 14084 True +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py 2c8821586df1caa53556b4cc14e6cd7507af4830aa8a149657571e0455eb6853 38441 True +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/tests/test_build_review_a5_non_iar_later_role_successor_20260720.py writing/review/multimodal/tests/test_build_review_a5_non_iar_later_role_successor_20260720.py 966889118fa567729e1959750b1601018ba117aed0bfad3508005ba6b1896a08 7856 True +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/glytoucan/scripts/build_connection_level_support_audit.py writing/review/glytoucan/scripts/build_connection_level_support_audit.py 3d598a249db90c928f8a317923ba5d37eebbc1f63383a2c39e0541f20c31ccac 21842 True diff --git a/releases/2026-10-02/benchmark_exclusion/required_successor_inputs.json b/releases/2026-10-02/benchmark_exclusion/required_successor_inputs.json new file mode 100644 index 0000000000000000000000000000000000000000..936304e7cd82021ffe423ef9e3856b7ac832a4b5 --- /dev/null +++ b/releases/2026-10-02/benchmark_exclusion/required_successor_inputs.json @@ -0,0 +1,203 @@ +{ + "scope": "Exact source-pinned input list; data hashes are not freshly recomputed here. Strict3 JSON additionally names role CSV files which the builder hashes at runtime. Original dataset payloads are not bundled.", + "inputs": [ + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/p1_non_iar_exact_graph_authority_20260711/review_p1_non_iar_anchor_manifest.tsv.gz", + "candidate_relative_path": "writing/review/multimodal/outputs/p1_non_iar_exact_graph_authority_20260711/review_p1_non_iar_anchor_manifest.tsv.gz", + "expected_sha256_from_successor_source": "048facdfd9a5ff15f1295d28f1d07b4dae2c656ca8714c3ed06df9e284ac199a", + "locally_exists": true, + "local_bytes": 113824, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/p1_non_iar_exact_graph_authority_20260711/review_p1_non_iar_exact_graph_parent_manifest.tsv.gz", + "candidate_relative_path": "writing/review/multimodal/outputs/p1_non_iar_exact_graph_authority_20260711/review_p1_non_iar_exact_graph_parent_manifest.tsv.gz", + "expected_sha256_from_successor_source": "088971d5dbe61f840a45a67a84df39478edd7a80089fd6528fd9fda8063b26b9", + "locally_exists": true, + "local_bytes": 3857629, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/p1_non_iar_pretraining_partition_80_20_20260712/review_p1_non_iar_pretraining_parent_partition.tsv.gz", + "candidate_relative_path": "writing/review/multimodal/outputs/p1_non_iar_pretraining_partition_80_20_20260712/review_p1_non_iar_pretraining_parent_partition.tsv.gz", + "expected_sha256_from_successor_source": "7c4ed33a6cbf50df8d3264421c652c480d3a5eff0eace10c3c958e6dac6b2160", + "locally_exists": true, + "local_bytes": 12149150, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/p1_non_iar_pretraining_partition_80_20_20260712/review_p1_non_iar_pretraining_objective_partition.tsv.gz", + "candidate_relative_path": "writing/review/multimodal/outputs/p1_non_iar_pretraining_partition_80_20_20260712/review_p1_non_iar_pretraining_objective_partition.tsv.gz", + "expected_sha256_from_successor_source": "d09eebb3f7ac47058d2d0cabfd42905f624581bf4c942dceac9cad9c1973e5a0", + "locally_exists": true, + "local_bytes": 4238642, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/p0_p1_freeze_20260710/review_p1_wurcs_motif_fingerprint_manifest.tsv.gz", + "candidate_relative_path": "writing/review/multimodal/outputs/p0_p1_freeze_20260710/review_p1_wurcs_motif_fingerprint_manifest.tsv.gz", + "expected_sha256_from_successor_source": "69994cbc859146e97867e62669fd9f71b8d02140ecd9ae8056375af608afdcab", + "locally_exists": true, + "local_bytes": 167661349, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/p0_p1_freeze_20260710/review_p1_parent_identity_manifest.tsv.gz", + "candidate_relative_path": "writing/review/multimodal/outputs/p0_p1_freeze_20260710/review_p1_parent_identity_manifest.tsv.gz", + "expected_sha256_from_successor_source": "55b830d839370c0cec0aab2b61b4721e6ace9ba3ee49e4c93e7be6e486d1c5c4", + "locally_exists": true, + "local_bytes": 33418108, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/p1_role_complete_direct_local_neighbor_audit_20260711/review_p1_direct_local_neighbor_edges.tsv.gz", + "candidate_relative_path": "writing/review/multimodal/outputs/p1_role_complete_direct_local_neighbor_audit_20260711/review_p1_direct_local_neighbor_edges.tsv.gz", + "expected_sha256_from_successor_source": "e95d8122449f4b91271fd297be41a7912244f2398739e349064fc55b781e3ae0", + "locally_exists": true, + "local_bytes": 1457038, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py", + "candidate_relative_path": "writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py", + "expected_sha256_from_successor_source": "a9160769759c1df56238caad6a9f4ed6ec68477d44435ebbc81d64bbf541b64c", + "locally_exists": true, + "local_bytes": 36975, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/review_a5_downstream_strict3_authority_20260720_r2/review_a5_downstream_strict3_authority.json", + "candidate_relative_path": "writing/review/multimodal/outputs/review_a5_downstream_strict3_authority_20260720_r2/review_a5_downstream_strict3_authority.json", + "expected_sha256_from_successor_source": "c1bbcfe410c0ee78824657da84a4055e58fdf196624d8981e1aa239ae629f1d8", + "locally_exists": true, + "local_bytes": 91064, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/p1_affinose_motif_scaffold_balanced_k20_20260711/review_p1_affinose_balanced_k20_a5_anchors.tsv.gz", + "candidate_relative_path": "writing/review/multimodal/outputs/p1_affinose_motif_scaffold_balanced_k20_20260711/review_p1_affinose_balanced_k20_a5_anchors.tsv.gz", + "expected_sha256_from_successor_source": "cdeb7b4075f00efc50c0649ac4be11560154e29a6a728c4ddeb54dd6bc26f6c9", + "locally_exists": true, + "local_bytes": 8489, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/review_a5_affinose_strict_glycan_components_20260720_r1/review_a5_affinose_strict_glycan_nonfit_anchors_20260720.tsv.gz", + "candidate_relative_path": "writing/review/multimodal/outputs/review_a5_affinose_strict_glycan_components_20260720_r1/review_a5_affinose_strict_glycan_nonfit_anchors_20260720.tsv.gz", + "expected_sha256_from_successor_source": "85c8f760dba0e11a4346cd07bc7eb09f5f31d6bf1b0407658130da4173f8a5f9", + "locally_exists": true, + "local_bytes": 29453, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/review_a5_affinose_strict_glycan_components_20260720_r1/review_a5_affinose_strict_glycan_candidate_summary_20260720.json", + "candidate_relative_path": "writing/review/multimodal/outputs/review_a5_affinose_strict_glycan_components_20260720_r1/review_a5_affinose_strict_glycan_candidate_summary_20260720.json", + "expected_sha256_from_successor_source": "d1a56f0bb7f77535c619cc2739933bd751cb5d3e3fcd2e8175fc88671e83e6ee", + "locally_exists": true, + "local_bytes": 29848, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/review_a5_affinose_strict_glycan_components_20260720_r1/review_a5_affinose_strict_glycan_candidate_verification_receipt_20260720.json", + "candidate_relative_path": "writing/review/multimodal/outputs/review_a5_affinose_strict_glycan_components_20260720_r1/review_a5_affinose_strict_glycan_candidate_verification_receipt_20260720.json", + "expected_sha256_from_successor_source": "a92f442f2b74e630783b5a0eb6fb16738d6aa4c86f71b28c487cc42622d3eee1", + "locally_exists": true, + "local_bytes": 5962, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_80_20_parser_v3_failclosed_20260720_r3/review_sequence_parent_index.tsv.gz", + "candidate_relative_path": "data/review_sequences_a5_non_iar_80_20_parser_v3_failclosed_20260720_r3/review_sequence_parent_index.tsv.gz", + "expected_sha256_from_successor_source": "c61e766dbffc4a1d88c7c7fb94deb683943c0861403350e79ab09c70b317fa52", + "locally_exists": true, + "local_bytes": 17392883, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/review_a5_affinose_p6_observation_authority_20260720_r2/review_a5_affinose_p6_failclosed_authority_20260720.json", + "candidate_relative_path": "writing/review/multimodal/outputs/review_a5_affinose_p6_observation_authority_20260720_r2/review_a5_affinose_p6_failclosed_authority_20260720.json", + "expected_sha256_from_successor_source": "a77e486e200e50e9becb3ad45f70ef97272b5a339267c636d746af8d9bf2b2b5", + "locally_exists": true, + "local_bytes": 22820, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/review_a5_affinose_p6_observation_authority_20260720_r2/review_a5_affinose_p6_failclosed_receipt_20260720.json", + "candidate_relative_path": "writing/review/multimodal/outputs/review_a5_affinose_p6_observation_authority_20260720_r2/review_a5_affinose_p6_failclosed_receipt_20260720.json", + "expected_sha256_from_successor_source": "d6fb00bd5a79d5a1caa9d06f440357202d85bb6cb3f33c7732f063b4721cf23f", + "locally_exists": true, + "local_bytes": 2652, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/P0_P1_non_iar_authority_correction_20260711.md", + "candidate_relative_path": "writing/review/multimodal/P0_P1_non_iar_authority_correction_20260711.md", + "expected_sha256_from_successor_source": "f7ba54c4ec66b74e0061ffa75bd963af9589f28a7124e95208099f169657936f", + "locally_exists": true, + "local_bytes": 5448, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/P1_parent_split_refit_contract_20260710.md", + "candidate_relative_path": "writing/review/multimodal/P1_parent_split_refit_contract_20260710.md", + "expected_sha256_from_successor_source": "2533d651ccbf6d86111709676bf528d7c805d1df214ada62fd45772dda0f388e", + "locally_exists": true, + "local_bytes": 22645, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/P1_reviewer_complete_generalization_protocol_20260710.md", + "candidate_relative_path": "writing/review/multimodal/P1_reviewer_complete_generalization_protocol_20260710.md", + "expected_sha256_from_successor_source": "9556f456490bdd7e03926cc78d9c0a73146386a9b7ac7188a556b1bc23c37b4a", + "locally_exists": true, + "local_bytes": 27011, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/review_a5_interaction_endpoint_adjudication_20260720.md", + "candidate_relative_path": "writing/review/multimodal/review_a5_interaction_endpoint_adjudication_20260720.md", + "expected_sha256_from_successor_source": "614a4e2144dda63538a26dcbd8fce0a9d604a97c2b4ad07cf80820407ca29fdb", + "locally_exists": true, + "local_bytes": 24284, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/p1_a5_ms_harmonized_identity_repair_20260720_r1/review_a5_ms_repaired_parent_manifest.tsv.gz", + "candidate_relative_path": "writing/review/multimodal/outputs/p1_a5_ms_harmonized_identity_repair_20260720_r1/review_a5_ms_repaired_parent_manifest.tsv.gz", + "expected_sha256_from_successor_source": "f4abd4b186f5f4758918b89f19870bc112a7c6be6085f870208235cd03005e26", + "locally_exists": true, + "local_bytes": 209281, + "payload_copied": false, + "hash_freshly_checked": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/p1_a5_static_repair_child_authority_20260720_r1/review_a5_static_repair_child_authority.tsv.gz", + "candidate_relative_path": "writing/review/multimodal/outputs/p1_a5_static_repair_child_authority_20260720_r1/review_a5_static_repair_child_authority.tsv.gz", + "expected_sha256_from_successor_source": "2ca981b78bca56928d449d35467671b03db515496ac61162e68f8a1381a3661f", + "locally_exists": true, + "local_bytes": 10920113, + "payload_copied": false, + "hash_freshly_checked": false + } + ] +} diff --git a/releases/2026-10-02/benchmark_exclusion/source_verification.json b/releases/2026-10-02/benchmark_exclusion/source_verification.json new file mode 100644 index 0000000000000000000000000000000000000000..b8a0933d59ebc65d69fbc4a1bf38c74899b33237 --- /dev/null +++ b/releases/2026-10-02/benchmark_exclusion/source_verification.json @@ -0,0 +1,124 @@ +{ + "status": "PASS_STATIC_SOURCE_AND_UNCHANGED_CANDIDATE_PREPARATION", + "checked_utc": "2026-09-23T00:13:39.128129+00:00", + "source_report": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/BENCHMARK_IDENTITY_EXCLUSION_3833_20260922.md", + "files": [ + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py", + "candidate_path": "writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py", + "sha256": "a9160769759c1df56238caad6a9f4ed6ec68477d44435ebbc81d64bbf541b64c", + "bytes": 36975, + "unchanged": true, + "role": "requested_script", + "present_in_shipped_06_code": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py", + "candidate_path": "writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py", + "sha256": "0f88f53e22d0c068a87a09508a9d286e4982eddcb4e2154e63b2ca25339ece69", + "bytes": 15043, + "unchanged": true, + "role": "requested_script", + "present_in_shipped_06_code": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py", + "candidate_path": "writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py", + "sha256": "cd86a0a0b228c32e51ec73490711e37da3e6c9fdf9e64e980b7222b5312484aa", + "bytes": 14084, + "unchanged": true, + "role": "requested_script", + "present_in_shipped_06_code": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py", + "candidate_path": "writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py", + "sha256": "2c8821586df1caa53556b4cc14e6cd7507af4830aa8a149657571e0455eb6853", + "bytes": 38441, + "unchanged": true, + "role": "requested_script", + "present_in_shipped_06_code": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/tests/test_build_review_a5_non_iar_later_role_successor_20260720.py", + "candidate_path": "writing/review/multimodal/tests/test_build_review_a5_non_iar_later_role_successor_20260720.py", + "sha256": "966889118fa567729e1959750b1601018ba117aed0bfad3508005ba6b1896a08", + "bytes": 7856, + "unchanged": true, + "role": "requested_script", + "present_in_shipped_06_code": false + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/glytoucan/scripts/build_connection_level_support_audit.py", + "candidate_path": "writing/review/glytoucan/scripts/build_connection_level_support_audit.py", + "sha256": "3d598a249db90c928f8a317923ba5d37eebbc1f63383a2c39e0541f20c31ccac", + "bytes": 21842, + "unchanged": true, + "role": "local_import_helper", + "present_in_shipped_06_code": false + } + ], + "python_for_syntax_check": "3.12.14 (main, Aug 25 2026, 13:50:33) [Clang 22.1.3 ]", + "local_dependency_metadata": { + "networkx": "unavailable in this interpreter", + "pandas": "2.2.3" + }, + "checks": { + "six_python_files_ast_parse": true, + "all_copies_byte_identical": true, + "all_five_requested_scripts_absent_from_shipped_code": true, + "no_science_pipeline_run": true, + "shipped_code_and_zip_untouched": true, + "cli_help_checks": [ + { + "file": "writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py", + "command": "python -B FILE --help", + "returncode": 0, + "output": "usage: build_p1_non_iar_exact_graph_authority_20260711.py [-h]\n [--anchor-manifest ANCHOR_MANIFEST]\n [--graph-edges GRAPH_EDGES]\n [--parent-manifest PARENT_MANIFEST]\n [--output-dir OUTPUT_DIR]\n\noptions:\n -h, --help show this help message and exit\n --anchor-manifest ANCHOR_MANIFEST\n --graph-edges GRAPH_EDGES\n --parent-manifest PARENT_MANIFEST\n --output-dir OUTPUT_DIR\n", + "stderr": "" + }, + { + "file": "writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py", + "command": "python -B FILE --help", + "returncode": 0, + "output": "usage: repartition_a5_non_iar_80_20_20260712.py [-h]\n [--source-parent SOURCE_PARENT]\n [--source-objective SOURCE_OBJECTIVE]\n [--fingerprints FINGERPRINTS]\n [--identity IDENTITY]\n [--output-directory OUTPUT_DIRECTORY]\n\noptions:\n -h, --help show this help message and exit\n --source-parent SOURCE_PARENT\n --source-objective SOURCE_OBJECTIVE\n --fingerprints FINGERPRINTS\n --identity IDENTITY\n --output-directory OUTPUT_DIRECTORY\n", + "stderr": "" + }, + { + "file": "writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py", + "command": "python -B FILE --help", + "returncode": 0, + "output": "usage: build_review_a5_non_iar_later_role_successor_20260720.py\n [-h] [--output-directory OUTPUT_DIRECTORY]\n\noptions:\n -h, --help show this help message and exit\n --output-directory OUTPUT_DIRECTORY\n", + "stderr": "" + } + ] + }, + "findings": [ + "Graph retrieval uses WL on SHA256 residue-label strings and BOND labels with edge endpoint positions, 3 iterations, digest_size32; exact isomorphism confirms original label and position equality.", + "Graph representation is a bipartite residue-bond tree; only fixed_tree_exact_linkage anchors/parents enter graph checks.", + "The fixed-tree tier does not require completely specified residue stereochemistry: prefer connected residue trees with fully specified linkages.", + "Authority includes exact string OR graph identity only; near neighbours and shared motifs are not exclusion criteria.", + "IAR-only GlyCosmos and grey-seal memberships are dropped; a glycan with another active benchmark role remains an anchor.", + "Successor checks93 added anchors,73 additional exact parents,0 additional graph-only aliases,59 train+14 dev moves,final3833 exclusions; all other roles are unchanged.", + "Fifth named script is under multimodal/tests/, not multimodal/scripts/." + ], + "limits": [ + "Counts are checked as source-enforced invariants and previously saved evidence; no new full data recount or science pipeline run.", + "Frozen upstream input payloads and parent-partition precursor are required; this is not a self-contained dataset release.", + "NetworkX/pandas historical version pins are not established by these scripts.", + "The full payload-based successor tests were not rerun; they reopen large existing manifests." + ], + "line_evidence": { + "graph_parser_WL_and_isomorphism": "build_p1_direct_local_neighbor_audit_20260710.py:47-49,111-197,449-452,517-520,576-588,695-734", + "IAR_source_filter_and_identity_OR": "build_p1_non_iar_exact_graph_authority_20260711.py:55-59,119-151,226-244", + "whole_block_split": "repartition_a5_non_iar_80_20_20260712.py:118-150,220-233", + "successor_anchor_and_role_rules": "build_review_a5_non_iar_later_role_successor_20260720.py:294-298,338-359,383-438,447-484", + "tier_definition_source_not_copied": "multimodal/scripts/build_p1_wurcs_motif_fingerprints_20260710.py:147-213" + }, + "tier_definition_source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/scripts/build_p1_wurcs_motif_fingerprints_20260710.py", + "sha256": "b0d2ca8d60722f144d988e59e3281017879890f88f50a3ba93d603f05236401f", + "copied": false, + "reason": "Source of prerequisite fingerprint tier, not an imported runtime dependency." + } +} diff --git a/releases/2026-10-02/benchmark_exclusion/writing/review/glytoucan/scripts/build_connection_level_support_audit.py b/releases/2026-10-02/benchmark_exclusion/writing/review/glytoucan/scripts/build_connection_level_support_audit.py new file mode 100644 index 0000000000000000000000000000000000000000..603593136825aa668cda11f5a7f4d54d7dcbe3d4 --- /dev/null +++ b/releases/2026-10-02/benchmark_exclusion/writing/review/glytoucan/scripts/build_connection_level_support_audit.py @@ -0,0 +1,521 @@ +#!/usr/bin/env python3 +"""Audit linkage, edge, and modification support patterns in GlyCorpus rows. + +This is a curation audit, not a full WURCS chemical validator. It extracts +repeatable WURCS/IUPAC connection signatures, assigns conservative support +tiers, and summarizes unique patterns for review. +""" + +from __future__ import annotations + +import argparse +import gzip +import json +import re +from collections import Counter +from pathlib import Path + +import pandas as pd + + +ROOT = Path.cwd() +EXCLUDED_INPUT = ( + ROOT + / "review/glytoucan/outputs/family_publication_context_addendum_20260702/family_context_support_by_row.tsv" +) +FULL_INPUT = ( + ROOT + / "review/glytoucan/outputs/final_training_recommendation_v2_20260702/glycorpus_final_training_recommendation_v2.tsv.gz" +) +OUTDIR = ROOT / "review/glytoucan/outputs/connection_level_support_audit_20260702" + +IUPAC_LINK_RE = re.compile(r"(?P[A-Za-z?][A-Za-z0-9?/-]*)(?P\([ab?][0-9?]-[0-9?/]+[ab?]?\))") +EDGE_RE = re.compile(r"(?P[A-Za-z]+)(?P[0-9?]+)-(?P[A-Za-z]+)(?P[0-9?]+)") +RESDEF_RE = re.compile(r"\[([^\]]*)\]") + +COMMON_ANIMAL_NEU5AC = { + "Neu5Ac(a2-3)", + "Neu5Ac(a2-6)", + "Neu5Ac(a2-8)", + "Neu5Ac(a2-9)", +} +COMMON_ALPHA_SIALIC_ACCEPTORS = {"3", "6", "8", "9"} + + +def node_label(index: int) -> str: + """Return WURCS-style node labels for the first several hundred nodes.""" + letters = "abcdefghijklmnopqrstuvwxyz" + index -= 1 + label = "" + while True: + label = letters[index % 26] + label + index = index // 26 - 1 + if index < 0: + return label + + +def split_wurcs_sections(body: str) -> list[str]: + sections = [] + current = [] + bracket_depth = 0 + for char in body: + if char == "[": + bracket_depth += 1 + elif char == "]" and bracket_depth: + bracket_depth -= 1 + if char == "/" and bracket_depth == 0: + sections.append("".join(current)) + current = [] + else: + current.append(char) + sections.append("".join(current)) + return sections + + +def split_wurcs(wurcs: str) -> tuple[list[str], dict[str, str], str]: + if not wurcs.startswith("WURCS=2.0/"): + return [], {}, "" + body = wurcs[len("WURCS=2.0/") :] + parts = split_wurcs_sections(body) + if len(parts) < 4: + return [], {}, "" + resdefs = RESDEF_RE.findall(parts[1]) + seq = parts[2].split("-") if parts[2] else [] + node_to_resdef = {} + for i, value in enumerate(seq, start=1): + label = node_label(i) + try: + resdef = resdefs[int(value) - 1] + except (ValueError, IndexError): + resdef = "" + node_to_resdef[label] = resdef + link_section = "/".join(parts[3:]) + return resdefs, node_to_resdef, link_section + + +def residue_class_from_resdef(resdef: str) -> str: + low = resdef.lower() + if not resdef: + return "unknown_residue" + if "aad" in low or "neu" in low or "kdn" in low or "kdo" in low: + return "nonulosonic_like" + if low.startswith("ha"): + return "ketose_fructose_like" + if re.search(r"_\d+\*opo|opo/", low): + return "phosphate_modified" + if re.search(r"_\d+\*oso|oso/", low): + return "sulfate_modified" + if re.search(r"c{6,}|nccc|occc", low): + return "long_substituent_or_lipid_like" + if "_2*n" in low or "_5*n" in low or "ncc" in low: + return "amino_acetamido_modified" + if "x" in low or low.startswith("u"): + return "ambiguous_or_unknown" + if low.startswith("a") or low.startswith("h"): + return "monosaccharide_like" + return "other_residue" + + +def modification_classes(text: str) -> list[str]: + classes = [] + low = text.lower() + if "opo" in low or re.search(r"\bp-", low) or "phosphate" in low: + classes.append("phosphate") + if "oso" in low or "sulf" in low: + classes.append("sulfate") + if re.search(r"c{6,}|nccc|occc|cer|lipid", low): + classes.append("long_lipid_like") + if "ncc/3=o" in low or "_2*n" in low or "_5*n" in low: + classes.append("amino_acetamido") + if "_6*oc" in low or "me(" in low or "methyl" in low: + classes.append("methyl_or_o_acetyl_like") + if "?" in text or "[" in low and ("x" in low or "[u" in low): + classes.append("unknown_or_ambiguous") + return sorted(set(classes)) + + +def iupac_linkages(iupac: str) -> list[str]: + links = [] + for match in IUPAC_LINK_RE.finditer(iupac or ""): + residue = match.group("residue") + link = match.group("link") + links.append(f"{residue}{link}") + return links + + +def parse_iupac_link(link: str) -> tuple[str, str, str, str] | None: + match = re.match( + r"(?P[A-Za-z?][A-Za-z0-9?/-]*)\((?P[ab?])(?P[0-9?]+)-(?P[0-9?/]+)(?P[ab?]?)\)", + link, + ) + if not match: + return None + return ( + match.group("residue"), + match.group("anomer"), + match.group("donor"), + match.group("acceptor"), + ) + + +def sialic_link_context(iupac_links: list[str]) -> tuple[list[str], list[str]]: + unusual = [] + uncertain = [] + for link in iupac_links: + parsed = parse_iupac_link(link) + if not parsed: + continue + residue, anomer, donor, acceptor = parsed + if not (residue.startswith("Neu") or residue.startswith("Kdn")): + continue + if residue.startswith("Neu5Ac") or residue.startswith("Neu5Gc") or residue == "Neu": + if "?" in link: + uncertain.append(link) + elif "/" in acceptor: + uncertain.append(link) + elif anomer != "a": + unusual.append(link) + elif donor == "2" and acceptor not in COMMON_ALPHA_SIALIC_ACCEPTORS: + unusual.append(link) + return unusual, uncertain + + +def edge_records(wurcs: str) -> tuple[list[dict], list[str], list[str]]: + resdefs, node_to_resdef, link_section = split_wurcs(wurcs) + edges = [] + signatures = [] + flags = [] + for token in link_section.split("_") if link_section else []: + match = EDGE_RE.search(token) + if not match: + if token: + flags.append("unparsed_wurcs_edge_token") + continue + n1, p1, n2, p2 = match.group("n1"), match.group("p1"), match.group("n2"), match.group("p2") + r1 = residue_class_from_resdef(node_to_resdef.get(n1, "")) + r2 = residue_class_from_resdef(node_to_resdef.get(n2, "")) + mods = modification_classes(token) + edge = { + "edge_token": token, + "endpoint_position_pair": f"{p1}-{p2}", + "endpoint_class_pair": f"{r1}--{r2}", + "edge_signature": f"{r1}:{p1}-{r2}:{p2}", + "edge_modification_classes": "|".join(mods), + } + edges.append(edge) + signatures.append(edge["edge_signature"]) + pset = {p1, p2} + if p1 == "1" and p2 == "1": + flags.append("both_anomeric_1_1_edge") + if "2" in pset and (r1 == "nonulosonic_like" or r2 == "nonulosonic_like"): + flags.append("nonulosonic_position_2_edge") + if "2" in pset and (r1 == "ketose_fructose_like" or r2 == "ketose_fructose_like"): + flags.append("ketose_fructose_position_2_edge") + if "phosphate" in mods: + flags.append("phosphate_edge_or_substituent") + if "sulfate" in mods: + flags.append("sulfate_edge_or_substituent") + if "long_lipid_like" in mods or r1 == "long_substituent_or_lipid_like" or r2 == "long_substituent_or_lipid_like": + flags.append("long_lipid_like_edge_or_substituent") + if "?" in p1 + p2 + token: + flags.append("unknown_edge_position_or_substituent") + for resdef in resdefs: + mods = modification_classes(resdef) + for mod in mods: + if mod == "phosphate": + flags.append("phosphate_residue_modification") + elif mod == "sulfate": + flags.append("sulfate_residue_modification") + elif mod == "long_lipid_like": + flags.append("long_lipid_like_residue_modification") + elif mod == "unknown_or_ambiguous": + flags.append("unknown_residue_or_modification") + return edges, sorted(set(signatures)), sorted(set(flags)) + + +def connection_support(row: pd.Series, iupac_links: list[str], edge_flags: list[str], edge_signatures: list[str]) -> tuple[str, str, str]: + iupac_set = set(iupac_links) + unusual_sialic_links, uncertain_sialic_links = sialic_link_context(iupac_links) + proposed_use = row.get("proposed_training_use", "") + confidence = row.get("family_assignment_confidence", "") + family = row.get("primary_context_family", "") + support_level = row.get("support_level", "") + broad_bucket = row.get("broad_training_bucket_v2", "") + exact_csdb = str(row.get("exact_csdb_wurcs_match", row.get("csdb_exact_wurcs_rescue", ""))).lower() in {"true", "yes"} + + if ( + row.get("confirmed_error_flag", "") == "yes" + or proposed_use == "exclude_from_all_clean_training" + or broad_bucket == "hard_exclude" + or support_level == "confirmed_or_near_confirmed_error" + ): + return ( + "specific_connection_entry_concern", + "exclude_from_clean_training", + "Specific reviewer-like connection concern, usually explicit Neu5Ac(a2-2) or related C2 pattern.", + ) + if exact_csdb: + return ( + "exact_record_external_support", + "eligible_for_exact_or_primary_context_depending_on_claim", + "Exact CSDB-WURCS support is present; still separate animal/exact-claim context as needed.", + ) + if "Neu5Ac(a2-2)" in iupac_set: + return ( + "specific_connection_unresolved", + "manual_recheck_or_exclude_from_clean_training", + "Explicit Neu5Ac(a2-2) connection remains unresolved without exact source support.", + ) + if unusual_sialic_links: + return ( + "specific_connection_unresolved", + "manual_recheck_before_broad_inclusion", + f"Unusual sialic-acid linkage token(s): {'|'.join(unusual_sialic_links[:5])}.", + ) + if uncertain_sialic_links: + return ( + "connection_unresolved_or_ambiguous", + "exclude_from_exact_topology_keep_only_labeled_context", + f"Uncertain sialic-acid linkage token(s): {'|'.join(uncertain_sialic_links[:5])}.", + ) + if family == "nonulosonic_kdo_neu5ac_kdn" and "nonulosonic_position_2_edge" in edge_flags: + return ( + "context_supported_nonulosonic_connection", + "broad_wurcs_or_sensitivity_not_exact_biology", + "Kdo/Kdn/nonulosonic C2-link chemistry is supported in bacterial/LPS contexts; exact row remains unproven.", + ) + if "both_anomeric_1_1_edge" in edge_flags: + if any(re.match(r"(?:[LD]-)?(?:\\?-)?Glc\([ab?]1-1[ab?]\)", link) for link in iupac_set): + return ( + "connection_pattern_supported", + "broad_wurcs_or_sensitivity_not_exact_biology", + "Both-anomeric 1-1 chemistry has trehalose-like support, but exact row still lacks exact-record evidence.", + ) + return ( + "connection_motif_supported_low_confidence", + "sensitivity_only_unless_manually_reviewed", + "WURCS 1-1 motif maps broadly to known chemistry, but row-level connection context is weak.", + ) + if "ketose_fructose_position_2_edge" in edge_flags: + if any(re.search(r"Fru|Fruf", link) for link in iupac_links): + return ( + "connection_pattern_supported", + "broad_wurcs_or_sensitivity_not_exact_biology", + "Fructan/ketose 2-x chemistry has literature support; exact row remains unverified.", + ) + return ( + "connection_motif_supported_medium_confidence", + "broad_wurcs_sensitivity_not_exact_biology", + "WURCS ketose/fructose-like 2-x motif has family support; explicit row context is limited.", + ) + if "phosphate_edge_or_substituent" in edge_flags or "phosphate_residue_modification" in edge_flags: + return ( + "connection_or_modification_pattern_supported", + "broad_wurcs_or_sensitivity_not_exact_biology", + "Ribitol/phosphate wall-teichoic-like chemistry is supported; exact edge placement is not per-row proven.", + ) + if "sulfate_edge_or_substituent" in edge_flags or "sulfate_residue_modification" in edge_flags: + return ( + "connection_or_modification_pattern_supported", + "broad_wurcs_or_sensitivity_not_exact_biology", + "Sulfated glycan chemistry is supported; exact modification placement is not per-row proven.", + ) + if "long_lipid_like_edge_or_substituent" in edge_flags or "long_lipid_like_residue_modification" in edge_flags: + return ( + "connection_or_modification_motif_supported_low_confidence", + "sensitivity_only_unless_manually_reviewed", + "Glycolipid/lipooligosaccharide chemistry exists, but this motif-level assignment needs manual review for exact use.", + ) + if "unknown_edge_position_or_substituent" in edge_flags or "unknown_residue_or_modification" in edge_flags: + return ( + "connection_unresolved_or_ambiguous", + "exclude_from_exact_topology_keep_only_labeled_context", + "Unknown or ambiguous linkage/residue/modification cannot support exact topology supervision.", + ) + if confidence in {"high", "medium"} and proposed_use.startswith("include"): + return ( + "family_supported_no_specific_connection_alert", + "broad_wurcs_not_exact_biology", + "No additional high-priority connection alert was found by this audit; support remains family/pattern-level.", + ) + if broad_bucket in {"broad_core", "broad_citation_backed", "csdb_supported_broad_only_rescue"}: + return ( + "no_specific_connection_alert_found", + "keep_existing_training_recommendation", + "The connection/modification audit did not find a reviewer-like linkage alert in this retained row.", + ) + if broad_bucket in {"broad_labeled_not_exact", "broad_labeled_context"}: + return ( + "labeled_record_no_specific_connection_alert", + "keep_as_labeled_database_record_not_exact_topology", + "No reviewer-like linkage alert was found, but the row still carries non-exact or context labels.", + ) + if broad_bucket == "sensitivity_or_quarantine": + return ( + "quarantine_record_no_specific_connection_alert", + "sensitivity_only_or_release_with_label", + "No single reviewer-like linkage alert was found, but the row remains outside clean training for existing curation reasons.", + ) + return ( + "connection_support_not_assigned", + "manual_or_release_only", + "No supported connection pattern was assigned in this audit.", + ) + + +def audit_rows(df: pd.DataFrame, scope: str) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]: + records = [] + edge_rows = [] + for idx, row in df.fillna("").iterrows(): + wurcs = row.get("canonical_wurcs", "") + iupac = row.get("iupac_name", "") + edges, signatures, flags = edge_records(wurcs) + links = iupac_linkages(iupac) + status, action, rationale = connection_support(row, links, flags, signatures) + glycorpus_id = row.get("glycorpus_id", "") + accession = row.get("primary_accession", "") + records.append( + { + "scope": scope, + "glycorpus_id": glycorpus_id, + "primary_accession": accession, + "iupac_linkages": "|".join(links), + "wurcs_edge_signatures": "|".join(signatures), + "connection_flags": "|".join(flags), + "connection_support_status": status, + "connection_training_action": action, + "connection_support_rationale": rationale, + "edge_count_extracted": len(edges), + "family_assignment_confidence": row.get("family_assignment_confidence", ""), + "primary_context_family": row.get("primary_context_family", ""), + "proposed_training_use": row.get("proposed_training_use", ""), + "exclusion_category": row.get("exclusion_category", ""), + "support_level": row.get("support_level", ""), + "broad_training_bucket_v2": row.get("broad_training_bucket_v2", ""), + "canonical_wurcs": wurcs, + "iupac_name": iupac, + } + ) + for edge in edges: + edge_rows.append( + { + "scope": scope, + "glycorpus_id": glycorpus_id, + "primary_accession": accession, + **edge, + } + ) + row_df = pd.DataFrame(records) + edge_df = pd.DataFrame(edge_rows) + if edge_df.empty: + pattern_df = pd.DataFrame(columns=["edge_signature", "rows", "examples"]) + else: + pattern_df = ( + edge_df.groupby(["edge_signature", "endpoint_position_pair", "endpoint_class_pair"], dropna=False) + .agg( + edge_instances=("glycorpus_id", "size"), + rows=("glycorpus_id", "nunique"), + examples=("primary_accession", lambda s: ";".join(list(dict.fromkeys(s.astype(str)))[:8])), + ) + .reset_index() + .sort_values(["rows", "edge_instances"], ascending=False) + ) + return row_df, edge_df, pattern_df + + +def write_table(path: Path, df: pd.DataFrame) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + if path.suffix == ".gz": + with gzip.open(path, "wt") as handle: + df.to_csv(handle, sep="\t", index=False, lineterminator="\n") + else: + df.to_csv(path, sep="\t", index=False, lineterminator="\n") + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--skip-full", action="store_true") + args = parser.parse_args() + OUTDIR.mkdir(parents=True, exist_ok=True) + + excluded = pd.read_csv(EXCLUDED_INPUT, sep="\t", dtype=str).fillna("") + excluded_row, excluded_edge, excluded_pattern = audit_rows(excluded, "excluded_primary_3819") + write_table(OUTDIR / "connection_row_audit_excluded_primary_3819.tsv", excluded_row) + write_table(OUTDIR / "connection_edge_instances_excluded_primary_3819.tsv", excluded_edge) + write_table(OUTDIR / "connection_pattern_summary_excluded_primary_3819.tsv", excluded_pattern) + + support_summary = ( + excluded_row.groupby(["connection_support_status", "connection_training_action"], dropna=False) + .size() + .reset_index(name="rows") + .sort_values("rows", ascending=False) + ) + write_table(OUTDIR / "connection_support_summary_excluded_primary_3819.tsv", support_summary) + + flag_counter: Counter[str] = Counter() + for flags in excluded_row["connection_flags"]: + for flag in str(flags).split("|"): + if flag: + flag_counter[flag] += 1 + flag_summary = pd.DataFrame( + [{"connection_flag": flag, "rows": rows} for flag, rows in flag_counter.most_common()] + ) + write_table(OUTDIR / "connection_flag_summary_excluded_primary_3819.tsv", flag_summary) + + meta = { + "excluded_primary_rows": int(len(excluded_row)), + "excluded_primary_unique_edge_signatures": int(excluded_pattern["edge_signature"].nunique()), + "excluded_primary_support_counts": ( + excluded_row.groupby("connection_support_status", dropna=False) + .size() + .sort_values(ascending=False) + .to_dict() + ), + } + + if not args.skip_full: + full = pd.read_csv(FULL_INPUT, sep="\t", dtype=str).fillna("") + full_row, full_edge, full_pattern = audit_rows(full, "full_final_recommendation_260703") + # Full row audit is useful but compacted because it is large. + full_cols = [ + "scope", + "glycorpus_id", + "primary_accession", + "iupac_linkages", + "wurcs_edge_signatures", + "connection_flags", + "connection_support_status", + "connection_training_action", + "edge_count_extracted", + "support_level", + "broad_training_bucket_v2", + ] + write_table(OUTDIR / "connection_row_audit_full_260703.tsv.gz", full_row[full_cols]) + write_table(OUTDIR / "connection_pattern_summary_full_260703.tsv", full_pattern) + full_support = ( + full_row.groupby(["connection_support_status", "connection_training_action"], dropna=False) + .size() + .reset_index(name="rows") + .sort_values("rows", ascending=False) + ) + write_table(OUTDIR / "connection_support_summary_full_260703.tsv", full_support) + meta.update( + { + "full_rows": int(len(full_row)), + "full_unique_edge_signatures": int(full_pattern["edge_signature"].nunique()), + "full_support_counts": ( + full_row.groupby("connection_support_status", dropna=False) + .size() + .sort_values(ascending=False) + .to_dict() + ), + } + ) + + (OUTDIR / "connection_level_audit_summary.json").write_text(json.dumps(meta, indent=2)) + print(json.dumps(meta, indent=2)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py b/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py new file mode 100644 index 0000000000000000000000000000000000000000..1c338e8e60cb539c2c6ab2a8f8015de738ab757b --- /dev/null +++ b/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py @@ -0,0 +1,969 @@ +#!/usr/bin/env python3 +"""Build the provisional exact/direct-local-neighbour exclusion audit. + +This script is label blind. Hashes retrieve candidate graph pairs, but every +reported relation is confirmed with exact labelled graph isomorphism. It does +not authorize A5 training; final motif-cluster and AFFINose roles are still +open, and non-fixed WURCS tiers receive exact-string handling only. +""" + +from __future__ import annotations + +import argparse +import csv +import gzip +import hashlib +import io +import json +import sys +from collections import Counter, defaultdict +from contextlib import contextmanager +from dataclasses import dataclass +from pathlib import Path +from typing import Iterable, Iterator + +import networkx as nx + + +WRITING_ROOT = Path(__file__).resolve().parents[3] +MM = WRITING_ROOT / "review/multimodal" +FREEZE = MM / "outputs/p0_p1_freeze_20260710" +FINGERPRINT = FREEZE / "review_p1_wurcs_motif_fingerprint_manifest.tsv.gz" +OBJECTIVE = FREEZE / "review_p1_objective_eligibility_manifest.tsv.gz" +ANCHORS = ( + MM + / "outputs/p1_targeted_similarity_retention_role_aware_20260710/" + "review_p1_targeted_anchor_manifest.tsv.gz" +) +DEFAULT_OUTPUT_DIR = MM / "outputs/p1_direct_local_neighbor_audit_20260710" + +PARSER_SOURCE = ( + WRITING_ROOT / "review/glytoucan/scripts/build_connection_level_support_audit.py" +) +sys.path.insert(0, str(PARSER_SOURCE.parent)) +from build_connection_level_support_audit import EDGE_RE, split_wurcs # noqa: E402 + + +NODE_MATCH = nx.algorithms.isomorphism.categorical_node_match("label", "") +EDGE_MATCH = nx.algorithms.isomorphism.categorical_edge_match("position", "") +FIXED_TIER = "fixed_tree_exact_linkage" +RELATION_ORDER = { + "exact_wurcs": 0, + "graph_identity": 1, + "residue_substitution": 2, + "linkage_change": 3, + "terminal_insertion_or_deletion": 4, + "branch_attachment_relocation": 5, +} + + +@dataclass(slots=True) +class AnchorGraph: + index: int + wurcs: str + sources: str + tier: str + residue_count: int + graph: nx.Graph + exact_signature: str + + +def sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for chunk in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def hash_text(value: str) -> str: + return hashlib.sha256(value.encode("utf-8")).hexdigest() + + +def as_bool(value: object) -> bool: + return str(value).strip().lower() in {"1", "true", "yes"} + + +@contextmanager +def gzip_tsv_writer( + path: Path, fieldnames: list[str] +) -> Iterator[csv.DictWriter]: + with path.open("wb") as raw: + with gzip.GzipFile(filename="", mode="wb", fileobj=raw, mtime=0) as zipped: + with io.TextIOWrapper(zipped, encoding="utf-8", newline="") as text: + writer = csv.DictWriter( + text, + fieldnames=fieldnames, + delimiter="\t", + lineterminator="\n", + ) + writer.writeheader() + yield writer + + +def write_gzip_tsv( + path: Path, fieldnames: list[str], rows: Iterable[dict[str, object]] +) -> None: + with gzip_tsv_writer(path, fieldnames) as writer: + writer.writerows(rows) + + +def parse_fixed_tree(wurcs: str) -> nx.Graph: + """Parse a simple exact-linkage WURCS tree into a residue-bond graph.""" + _, node_to_resdef, link_section = split_wurcs(wurcs) + if not node_to_resdef or any(not value for value in node_to_resdef.values()): + raise ValueError("missing_or_unmapped_residue") + + graph = nx.Graph() + for node_id, residue in node_to_resdef.items(): + graph.add_node( + ("residue", node_id), + kind="residue", + label=residue, + signature_label=hash_text(residue), + ) + + tokens = [token for token in link_section.split("_") if token] + for edge_index, token in enumerate(tokens): + match = EDGE_RE.fullmatch(token) + if not match: + raise ValueError(f"non_simple_edge:{token}") + left = ("residue", match.group("n1")) + right = ("residue", match.group("n2")) + if left not in graph or right not in graph: + raise ValueError(f"edge_references_unknown_residue:{token}") + left_position = match.group("p1") + right_position = match.group("p2") + if "?" in left_position + right_position: + raise ValueError(f"unknown_linkage:{token}") + bond = ("bond", edge_index) + graph.add_node( + bond, + kind="bond", + label="BOND", + signature_label=hash_text("BOND"), + ) + graph.add_edge(left, bond, position=left_position) + graph.add_edge(right, bond, position=right_position) + + residue_count = len(node_to_resdef) + if len(tokens) != max(0, residue_count - 1): + raise ValueError("not_a_residue_tree") + if graph.number_of_nodes() and not nx.is_tree(graph): + raise ValueError("parsed_graph_not_tree") + graph.graph["residue_count"] = residue_count + return graph + + +def residue_nodes(graph: nx.Graph) -> list[object]: + return sorted( + (node for node, data in graph.nodes(data=True) if data["kind"] == "residue"), + key=str, + ) + + +def bond_nodes(graph: nx.Graph) -> list[object]: + return sorted( + (node for node, data in graph.nodes(data=True) if data["kind"] == "bond"), + key=str, + ) + + +def signature(graph: nx.Graph) -> str: + """Return an isomorphism-invariant candidate key, never final evidence.""" + if not graph: + return "EMPTY" + digest = nx.weisfeiler_lehman_graph_hash( + graph, + node_attr="signature_label", + edge_attr="position", + iterations=3, + digest_size=32, + ) + return f"{graph.number_of_nodes()}:{graph.number_of_edges()}:{digest}" + + +def exact_isomorphic(left: nx.Graph, right: nx.Graph) -> bool: + if ( + left.number_of_nodes() != right.number_of_nodes() + or left.number_of_edges() != right.number_of_edges() + ): + return False + return nx.is_isomorphic( + left, + right, + node_match=NODE_MATCH, + edge_match=EDGE_MATCH, + ) + + +def residue_wildcard_signature(graph: nx.Graph, residue: object) -> str: + previous = graph.nodes[residue]["label"] + previous_signature = graph.nodes[residue]["signature_label"] + graph.nodes[residue]["label"] = "RESIDUE_WILDCARD" + graph.nodes[residue]["signature_label"] = hash_text("RESIDUE_WILDCARD") + try: + return signature(graph) + finally: + graph.nodes[residue]["label"] = previous + graph.nodes[residue]["signature_label"] = previous_signature + + +def bond_wildcard_signature(graph: nx.Graph, bond: object) -> str: + previous = { + neighbor: graph.edges[bond, neighbor]["position"] + for neighbor in graph.neighbors(bond) + } + for neighbor in previous: + graph.edges[bond, neighbor]["position"] = "*" + try: + return signature(graph) + finally: + for neighbor, value in previous.items(): + graph.edges[bond, neighbor]["position"] = value + + +def verify_residue_substitution( + left: nx.Graph, + left_residue: object, + right: nx.Graph, + right_residue: object, +) -> bool: + if exact_isomorphic(left, right): + return False + left_copy = left.copy() + right_copy = right.copy() + left_copy.nodes[left_residue]["label"] = "RESIDUE_WILDCARD" + left_copy.nodes[left_residue]["signature_label"] = hash_text( + "RESIDUE_WILDCARD" + ) + right_copy.nodes[right_residue]["label"] = "RESIDUE_WILDCARD" + right_copy.nodes[right_residue]["signature_label"] = hash_text( + "RESIDUE_WILDCARD" + ) + return exact_isomorphic(left_copy, right_copy) + + +def verify_linkage_change( + left: nx.Graph, + left_bond: object, + right: nx.Graph, + right_bond: object, +) -> bool: + if exact_isomorphic(left, right): + return False + left_copy = left.copy() + right_copy = right.copy() + for graph, bond in ((left_copy, left_bond), (right_copy, right_bond)): + for neighbor in graph.neighbors(bond): + graph.edges[bond, neighbor]["position"] = "*" + return exact_isomorphic(left_copy, right_copy) + + +def terminal_leaf_nodes(graph: nx.Graph) -> list[object]: + if int(graph.graph["residue_count"]) <= 1: + return [] + return [node for node in residue_nodes(graph) if graph.degree(node) == 1] + + +def remove_terminal_residue(graph: nx.Graph, residue: object) -> nx.Graph: + if residue not in graph or graph.nodes[residue]["kind"] != "residue": + raise ValueError("terminal deletion target is not a residue") + if graph.degree(residue) != 1: + raise ValueError("terminal deletion target is not a leaf") + bond = next(iter(graph.neighbors(residue))) + if graph.nodes[bond]["kind"] != "bond" or graph.degree(bond) != 2: + raise ValueError("terminal residue does not have one simple bond") + result = graph.copy() + result.remove_nodes_from((residue, bond)) + result.graph["residue_count"] = int(graph.graph["residue_count"]) - 1 + return result + + +def verify_terminal_edit( + smaller: nx.Graph, larger: nx.Graph, larger_leaf: object +) -> bool: + if int(larger.graph["residue_count"]) != int(smaller.graph["residue_count"]) + 1: + return False + return exact_isomorphic(smaller, remove_terminal_residue(larger, larger_leaf)) + + +def cut_components( + graph: nx.Graph, bond: object +) -> list[tuple[nx.Graph, str]]: + neighbors = list(graph.neighbors(bond)) + if len(neighbors) != 2: + raise ValueError("branch cut requires a simple two-ended bond") + positions = { + neighbor: graph.edges[bond, neighbor]["position"] for neighbor in neighbors + } + cut = graph.copy() + cut.remove_node(bond) + components: list[tuple[nx.Graph, str]] = [] + for neighbor in neighbors: + nodes = nx.node_connected_component(cut, neighbor) + component = cut.subgraph(nodes).copy() + component.graph["residue_count"] = sum( + data["kind"] == "residue" for _, data in component.nodes(data=True) + ) + components.append((component, positions[neighbor])) + return components + + +def branch_cut_signature(graph: nx.Graph, bond: object) -> str: + parts = sorted((signature(component), position) for component, position in cut_components(graph, bond)) + return hash_text(json.dumps(parts, separators=(",", ":"))) + + +def verify_branch_relocation( + left: nx.Graph, + left_bond: object, + right: nx.Graph, + right_bond: object, +) -> bool: + if exact_isomorphic(left, right): + return False + if int(left.graph["residue_count"]) != int(right.graph["residue_count"]): + return False + left_parts = cut_components(left, left_bond) + right_parts = cut_components(right, right_bond) + for permutation in ((0, 1), (1, 0)): + if all( + left_parts[index][1] == right_parts[permutation[index]][1] + and exact_isomorphic( + left_parts[index][0], right_parts[permutation[index]][0] + ) + for index in (0, 1) + ): + return True + return False + + +def synthetic_graph( + labels: list[str], edges: list[tuple[int, int, str, str]] +) -> nx.Graph: + graph = nx.Graph() + for index, label in enumerate(labels): + graph.add_node( + ("residue", index), + kind="residue", + label=label, + signature_label=hash_text(label), + ) + for index, (left, right, left_pos, right_pos) in enumerate(edges): + bond = ("bond", index) + graph.add_node( + bond, + kind="bond", + label="BOND", + signature_label=hash_text("BOND"), + ) + graph.add_edge(("residue", left), bond, position=left_pos) + graph.add_edge(("residue", right), bond, position=right_pos) + graph.graph["residue_count"] = len(labels) + if graph and not nx.is_tree(graph): + raise ValueError("synthetic graph is not a tree") + return graph + + +def self_test() -> None: + anchor = synthetic_graph( + ["A", "B", "C"], + [(0, 1, "4", "1"), (1, 2, "3", "1")], + ) + substituted = synthetic_graph( + ["A", "B", "D"], + [(0, 1, "4", "1"), (1, 2, "3", "1")], + ) + assert residue_wildcard_signature(anchor, ("residue", 2)) == residue_wildcard_signature( + substituted, ("residue", 2) + ) + assert verify_residue_substitution( + anchor, ("residue", 2), substituted, ("residue", 2) + ) + + relinked = synthetic_graph( + ["A", "B", "C"], + [(0, 1, "4", "1"), (1, 2, "6", "1")], + ) + assert bond_wildcard_signature(anchor, ("bond", 1)) == bond_wildcard_signature( + relinked, ("bond", 1) + ) + assert verify_linkage_change(anchor, ("bond", 1), relinked, ("bond", 1)) + + extended = synthetic_graph( + ["A", "B", "C", "D"], + [ + (0, 1, "4", "1"), + (1, 2, "3", "1"), + (2, 3, "2", "1"), + ], + ) + assert signature(anchor) == signature(remove_terminal_residue(extended, ("residue", 3))) + assert verify_terminal_edit(anchor, extended, ("residue", 3)) + + chain = extended + relocated = synthetic_graph( + ["A", "B", "C", "D"], + [ + (0, 1, "4", "1"), + (1, 2, "3", "1"), + (1, 3, "2", "1"), + ], + ) + assert branch_cut_signature(chain, ("bond", 2)) == branch_cut_signature( + relocated, ("bond", 2) + ) + assert verify_branch_relocation(chain, ("bond", 2), relocated, ("bond", 2)) + assert not exact_isomorphic(anchor, substituted) + assert exact_isomorphic(anchor, anchor.copy()) + unicode_graph = synthetic_graph(["alpha", "beta-\u03b2"], [(0, 1, "4", "1")]) + assert signature(unicode_graph) + + +def load_anchor_rows(path: Path) -> list[dict[str, str]]: + with gzip.open(path, "rt", newline="", encoding="utf-8") as handle: + rows = list(csv.DictReader(handle, delimiter="\t")) + if not rows or len({row["canonical_wurcs"] for row in rows}) != len(rows): + raise RuntimeError("Anchor manifest is empty or has duplicate WURCS") + return rows + + +def build_anchor_indices(anchor_rows: list[dict[str, str]]) -> tuple[ + list[AnchorGraph], + dict[str, list[int]], + dict[str, list[tuple[int, object]]], + dict[str, list[tuple[int, object]]], + dict[str, list[tuple[int, object]]], + dict[str, list[int]], + dict[str, list[tuple[int, object]]], +]: + anchors: list[AnchorGraph] = [] + exact_index: dict[str, list[int]] = defaultdict(list) + residue_index: dict[str, list[tuple[int, object]]] = defaultdict(list) + bond_index: dict[str, list[tuple[int, object]]] = defaultdict(list) + leaf_deleted_index: dict[str, list[tuple[int, object]]] = defaultdict(list) + terminal_extension_anchor_index: dict[str, list[int]] = defaultdict(list) + branch_index: dict[str, list[tuple[int, object]]] = defaultdict(list) + + for row in anchor_rows: + if row["fingerprint_tier"] != FIXED_TIER: + continue + graph = parse_fixed_tree(row["canonical_wurcs"]) + index = len(anchors) + anchor = AnchorGraph( + index=index, + wurcs=row["canonical_wurcs"], + sources=row["anchor_sources"], + tier=row["fingerprint_tier"], + residue_count=int(graph.graph["residue_count"]), + graph=graph, + exact_signature=signature(graph), + ) + anchors.append(anchor) + exact_index[anchor.exact_signature].append(index) + + if anchor.residue_count >= 3: + terminal_extension_anchor_index[anchor.exact_signature].append(index) + for residue in residue_nodes(graph): + residue_index[residue_wildcard_signature(graph, residue)].append( + (index, residue) + ) + for leaf in terminal_leaf_nodes(graph): + leaf_deleted_index[signature(remove_terminal_residue(graph, leaf))].append( + (index, leaf) + ) + for bond in bond_nodes(graph): + branch_index[branch_cut_signature(graph, bond)].append((index, bond)) + + if anchor.residue_count >= 2: + for bond in bond_nodes(graph): + bond_index[bond_wildcard_signature(graph, bond)].append((index, bond)) + + return ( + anchors, + exact_index, + residue_index, + bond_index, + leaf_deleted_index, + terminal_extension_anchor_index, + branch_index, + ) + + +def add_relation( + relations: dict[tuple[int, str], list[tuple[object, object]]], + anchor_index: int, + relation: str, + anchor_element: object = "", + candidate_element: object = "", +) -> None: + pair = (anchor_element, candidate_element) + values = relations.setdefault((anchor_index, relation), []) + if pair not in values: + values.append(pair) + + +def confirmed_relations( + graph: nx.Graph, + anchors: list[AnchorGraph], + exact_index: dict[str, list[int]], + residue_index: dict[str, list[tuple[int, object]]], + bond_index: dict[str, list[tuple[int, object]]], + leaf_deleted_index: dict[str, list[tuple[int, object]]], + terminal_extension_anchor_index: dict[str, list[int]], + branch_index: dict[str, list[tuple[int, object]]], +) -> list[tuple[int, str]]: + candidates: dict[tuple[int, str], list[tuple[object, object]]] = {} + exact_key = signature(graph) + for anchor_index in exact_index.get(exact_key, []): + add_relation(candidates, anchor_index, "graph_identity") + + residue_count = int(graph.graph["residue_count"]) + if residue_count >= 3: + for residue in residue_nodes(graph): + key = residue_wildcard_signature(graph, residue) + for anchor_index, anchor_residue in residue_index.get(key, []): + add_relation( + candidates, + anchor_index, + "residue_substitution", + anchor_residue, + residue, + ) + for bond in bond_nodes(graph): + key = branch_cut_signature(graph, bond) + for anchor_index, anchor_bond in branch_index.get(key, []): + add_relation( + candidates, + anchor_index, + "branch_attachment_relocation", + anchor_bond, + bond, + ) + + if residue_count >= 2: + for bond in bond_nodes(graph): + key = bond_wildcard_signature(graph, bond) + for anchor_index, anchor_bond in bond_index.get(key, []): + add_relation( + candidates, + anchor_index, + "linkage_change", + anchor_bond, + bond, + ) + + for anchor_index, anchor_leaf in leaf_deleted_index.get(exact_key, []): + add_relation( + candidates, + anchor_index, + "terminal_insertion_or_deletion", + anchor_leaf, + "", + ) + for candidate_leaf in terminal_leaf_nodes(graph): + key = signature(remove_terminal_residue(graph, candidate_leaf)) + for anchor_index in terminal_extension_anchor_index.get(key, []): + add_relation( + candidates, + anchor_index, + "terminal_insertion_or_deletion", + "", + candidate_leaf, + ) + + confirmed: list[tuple[int, str]] = [] + for (anchor_index, relation), element_pairs in sorted( + candidates.items(), + key=lambda item: ( + RELATION_ORDER[item[0][1]], + anchors[item[0][0]].wurcs, + ), + ): + anchor = anchors[anchor_index] + passes = False + for anchor_element, candidate_element in element_pairs: + if relation == "graph_identity": + passes = exact_isomorphic(anchor.graph, graph) + elif relation == "residue_substitution": + passes = verify_residue_substitution( + anchor.graph, anchor_element, graph, candidate_element + ) + elif relation == "linkage_change": + passes = verify_linkage_change( + anchor.graph, anchor_element, graph, candidate_element + ) + elif relation == "terminal_insertion_or_deletion": + if anchor_element: + passes = verify_terminal_edit(graph, anchor.graph, anchor_element) + else: + passes = verify_terminal_edit(anchor.graph, graph, candidate_element) + elif relation == "branch_attachment_relocation": + passes = verify_branch_relocation( + anchor.graph, anchor_element, graph, candidate_element + ) + else: + raise AssertionError(f"Unknown relation: {relation}") + if passes: + break + if passes: + confirmed.append((anchor_index, relation)) + return confirmed + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--output-dir", type=Path, default=DEFAULT_OUTPUT_DIR) + parser.add_argument("--anchor-manifest", type=Path, default=ANCHORS) + parser.add_argument( + "--anchor-policy", + default="role-derived non-fit endpoint union", + ) + parser.add_argument("--final-anchor-authority", action="store_true") + parser.add_argument( + "--limit", + type=int, + default=0, + help="Process only the first N sequence parents for a smoke run; 0 is full.", + ) + parser.add_argument("--self-test-only", action="store_true") + args = parser.parse_args() + + self_test() + if args.self_test_only: + print("self-test: PASS") + return + + args.output_dir.mkdir(parents=True, exist_ok=True) + anchor_rows = load_anchor_rows(args.anchor_manifest) + anchor_wurcs = {row["canonical_wurcs"] for row in anchor_rows} + source_by_wurcs = { + row["canonical_wurcs"]: row["anchor_sources"] for row in anchor_rows + } + ( + fixed_anchors, + exact_index, + residue_index, + bond_index, + leaf_deleted_index, + terminal_extension_anchor_index, + branch_index, + ) = build_anchor_indices(anchor_rows) + + parent_fields = [ + "parent_glycorpus_id", + "canonical_wurcs", + "fingerprint_tier", + "residue_count", + "exact_wurcs_anchor", + "graph_identity_anchor_count", + "direct_local_neighbor_anchor_count", + "confirmed_relation_types", + "confirmed_anchor_wurcs", + "provisional_excluded", + "provisional_exclusion_reason", + "fixed_anchor_relation_status", + "unresolved_reason", + ] + edge_fields = [ + "anchor_wurcs", + "anchor_sources", + "anchor_residue_count", + "parent_glycorpus_id", + "parent_wurcs", + "parent_residue_count", + "relation_type", + "candidate_generator", + "exact_verifier", + ] + parent_output = args.output_dir / "review_p1_direct_local_neighbor_manifest.tsv.gz" + edge_output = args.output_dir / "review_p1_direct_local_neighbor_edges.tsv.gz" + + processed_parent_ids: set[str] = set() + excluded_parent_ids: set[str] = set() + exact_parent_ids: set[str] = set() + graph_identity_parent_ids: set[str] = set() + local_neighbor_parent_ids: set[str] = set() + parent_status_counts: Counter[str] = Counter() + relation_edge_counts: Counter[str] = Counter() + tier_counts: Counter[str] = Counter() + parse_failures = 0 + + with gzip_tsv_writer(parent_output, parent_fields) as parent_writer: + with gzip_tsv_writer(edge_output, edge_fields) as edge_writer: + with gzip.open(FINGERPRINT, "rt", newline="", encoding="utf-8") as handle: + for row in csv.DictReader(handle, delimiter="\t"): + if not ( + row["graph_record_role"] == "sequence_eligible_parent" + and as_bool(row["sequence_eligible_parent"]) + ): + continue + if args.limit and len(processed_parent_ids) >= args.limit: + break + + parent_id = row["parent_glycorpus_id"] + wurcs = row["canonical_wurcs"] + tier = row["fingerprint_tier"] + residue_count = int(row["residue_count"]) + processed_parent_ids.add(parent_id) + tier_counts[tier] += 1 + exact_wurcs = wurcs in anchor_wurcs + relations: list[tuple[int, str]] = [] + unresolved_reason = "" + + if tier == FIXED_TIER: + try: + graph = parse_fixed_tree(wurcs) + relations = confirmed_relations( + graph, + fixed_anchors, + exact_index, + residue_index, + bond_index, + leaf_deleted_index, + terminal_extension_anchor_index, + branch_index, + ) + except ValueError as exc: + parse_failures += 1 + unresolved_reason = f"fixed_tier_parse_failure:{exc}" + else: + unresolved_reason = ( + "nonfixed_wurcs_exact_identity_only_in_this_pass" + ) + + relation_by_anchor: dict[int, set[str]] = defaultdict(set) + for anchor_index, relation in relations: + relation_by_anchor[anchor_index].add(relation) + + graph_identity_indices = { + index + for index, values in relation_by_anchor.items() + if "graph_identity" in values + } + local_indices = { + index + for index, values in relation_by_anchor.items() + if values + - {"graph_identity"} + } + relation_types = sorted( + { + relation + for values in relation_by_anchor.values() + for relation in values + }, + key=lambda value: RELATION_ORDER[value], + ) + confirmed_anchor_indices = sorted( + relation_by_anchor, + key=lambda index: fixed_anchors[index].wurcs, + ) + + if exact_wurcs: + exact_parent_ids.add(parent_id) + excluded_parent_ids.add(parent_id) + exclusion_reason = "exact_role_anchor" + elif graph_identity_indices: + graph_identity_parent_ids.add(parent_id) + excluded_parent_ids.add(parent_id) + exclusion_reason = "validated_graph_identity" + elif local_indices: + local_neighbor_parent_ids.add(parent_id) + excluded_parent_ids.add(parent_id) + exclusion_reason = "exact_confirmed_direct_local_neighbor" + else: + exclusion_reason = "retained_in_provisional_direct_rule" + + if tier != FIXED_TIER: + relation_status = "not_evaluable_nonfixed_except_exact" + elif unresolved_reason: + relation_status = "unresolved_parser_failure" + elif graph_identity_indices or local_indices: + relation_status = "confirmed" + else: + relation_status = "ruled_out_against_fixed_anchor_relations" + parent_status_counts[relation_status] += 1 + + parent_writer.writerow( + { + "parent_glycorpus_id": parent_id, + "canonical_wurcs": wurcs, + "fingerprint_tier": tier, + "residue_count": residue_count, + "exact_wurcs_anchor": exact_wurcs, + "graph_identity_anchor_count": len(graph_identity_indices), + "direct_local_neighbor_anchor_count": len(local_indices), + "confirmed_relation_types": ";".join(relation_types), + "confirmed_anchor_wurcs": ";".join( + fixed_anchors[index].wurcs + for index in confirmed_anchor_indices + ), + "provisional_excluded": parent_id in excluded_parent_ids, + "provisional_exclusion_reason": exclusion_reason, + "fixed_anchor_relation_status": relation_status, + "unresolved_reason": unresolved_reason, + } + ) + + for anchor_index in confirmed_anchor_indices: + anchor = fixed_anchors[anchor_index] + for relation in sorted( + relation_by_anchor[anchor_index], + key=lambda value: RELATION_ORDER[value], + ): + relation_edge_counts[relation] += 1 + edge_writer.writerow( + { + "anchor_wurcs": anchor.wurcs, + "anchor_sources": source_by_wurcs[anchor.wurcs], + "anchor_residue_count": anchor.residue_count, + "parent_glycorpus_id": parent_id, + "parent_wurcs": wurcs, + "parent_residue_count": residue_count, + "relation_type": relation, + "candidate_generator": ( + "wl_hash_signature_v1_exact_verified" + ), + "exact_verifier": ( + "networkx_labelled_isomorphism_v1" + ), + } + ) + + objective_total: Counter[str] = Counter() + objective_excluded: Counter[str] = Counter() + with gzip.open(OBJECTIVE, "rt", newline="", encoding="utf-8") as handle: + for row in csv.DictReader(handle, delimiter="\t"): + parent_id = row["parent_glycorpus_id"] + if parent_id not in processed_parent_ids or not as_bool( + row["eligible_before_partition"] + ): + continue + objective = row["objective"] + objective_total[objective] += 1 + if parent_id in excluded_parent_ids: + objective_excluded[objective] += 1 + + retention_rows: list[dict[str, object]] = [] + for objective in ("sequence", "topology", "ms", "static", "md"): + eligible = objective_total[objective] + excluded = objective_excluded[objective] + retained = eligible - excluded + retention_rows.append( + { + "objective": objective, + "eligible_in_processed_scope": eligible, + "provisional_excluded": excluded, + "provisional_retained": retained, + "retained_percent": ( + f"{100.0 * retained / eligible:.6f}" if eligible else "" + ), + } + ) + retention_output = args.output_dir / "review_p1_direct_local_neighbor_retention.tsv" + with retention_output.open("w", newline="", encoding="utf-8") as handle: + writer = csv.DictWriter( + handle, + fieldnames=list(retention_rows[0]), + delimiter="\t", + lineterminator="\n", + ) + writer.writeheader() + writer.writerows(retention_rows) + + fixed_anchor_count = sum(row["fingerprint_tier"] == FIXED_TIER for row in anchor_rows) + summary = { + "schema": "bertose_p1_direct_local_neighbor_audit_v1", + "status": ( + ( + "FULL_FINAL_ROLE_UNION_DIAGNOSTIC" + if args.final_anchor_authority + else "FULL_ROLE_UNION_DIAGNOSTIC" + ) + if not args.limit + else "PARTIAL_SMOKE_DIAGNOSTIC" + ), + "training_authorized": False, + "official_submitted_artifacts_modified": False, + "anchor_policy": args.anchor_policy, + "binary_relation_policy": ( + "exact WURCS or exact-labelled graph identity; for fixed exact-linkage " + "trees only, direct one-residue substitution, one-linkage change, " + "one terminal insertion/deletion, or one branch attachment relocation" + ), + "candidate_hash_is_final_evidence": False, + "exact_verifier": "networkx labelled graph isomorphism v1", + "transitive_closure_used": False, + "numeric_similarity_cutoff_used": False, + "anchor_count": len(anchor_rows), + "fixed_tree_exact_linkage_anchor_count": fixed_anchor_count, + "nonfixed_anchor_count": len(anchor_rows) - fixed_anchor_count, + "processed_sequence_parent_count": len(processed_parent_ids), + "processed_tier_counts": dict(sorted(tier_counts.items())), + "exact_wurcs_parent_count": len(exact_parent_ids), + "additional_graph_identity_parent_count": len( + graph_identity_parent_ids - exact_parent_ids + ), + "direct_local_neighbor_parent_count": len( + local_neighbor_parent_ids + - exact_parent_ids + - graph_identity_parent_ids + ), + "total_provisional_excluded_parent_count": len(excluded_parent_ids), + "parent_relation_status_counts": dict(sorted(parent_status_counts.items())), + "confirmed_relation_edge_counts": dict(sorted(relation_edge_counts.items())), + "fixed_tier_parse_failure_count": parse_failures, + "objective_retention": retention_rows, + "input_sha256": { + "anchor_manifest": sha256(args.anchor_manifest), + "fingerprint_manifest": sha256(FINGERPRINT), + "objective_manifest": sha256(OBJECTIVE), + "parser_source": sha256(PARSER_SOURCE), + "script": sha256(Path(__file__).resolve()), + }, + "outputs": { + "parent_manifest": parent_output.name, + "parent_manifest_sha256": sha256(parent_output), + "relation_edges": edge_output.name, + "relation_edges_sha256": sha256(edge_output), + "retention": retention_output.name, + "retention_sha256": sha256(retention_output), + }, + "validation_checks": { + "self_test_passed": True, + "all_candidate_relations_exact_verified": True, + "candidate_hash_used_only_for_retrieval": True, + "downstream_labels_or_model_outputs_read": False, + "all_exclusions_direct_anchor_to_parent": True, + "no_numeric_cutoff": True, + "no_transitive_closure": True, + "fixed_anchor_count_matches_manifest": fixed_anchor_count + == sum(row["fingerprint_tier"] == FIXED_TIER for row in anchor_rows), + "processed_parent_count_matches_requested_scope": ( + len(processed_parent_ids) == args.limit + if args.limit + else len(processed_parent_ids) == 281208 + ), + "fixed_tier_parse_failures_zero": parse_failures == 0, + }, + "open_gates": ([] if args.final_anchor_authority else [ + "final role-derived anchor authority", + ]) + [ + "derivative propagation audit", + "validated nomenclature-alias authority", + "finite-completion handling for resolvable ambiguous WURCS", + "independent brute-force candidate-recall audit", + "post-implementation independent reviewer sign-off", + ], + } + summary_output = args.output_dir / "review_p1_direct_local_neighbor_summary.json" + summary_output.write_text( + json.dumps(summary, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + print(json.dumps(summary, indent=2, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py b/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py new file mode 100644 index 0000000000000000000000000000000000000000..e4abcbc978f509105f5df69550c78fd0c2f3c08d --- /dev/null +++ b/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py @@ -0,0 +1,380 @@ +#!/usr/bin/env python3 +"""Build the non-IAR A5 anchor and exact/graph-identity exclusion authority.""" + +from __future__ import annotations + +import argparse +import csv +import gzip +import hashlib +import io +import json +from collections import Counter, defaultdict +from contextlib import contextmanager +from pathlib import Path +from typing import Iterator + + +WRITING_ROOT = Path(__file__).resolve().parents[3] +MM = WRITING_ROOT / "review/multimodal" +ANCHORS = ( + MM + / "outputs/p1_role_complete_anchor_union_20260711/" + "review_p1_role_complete_anchor_manifest.tsv.gz" +) +GRAPH_EDGES = ( + MM + / "outputs/p1_role_complete_direct_local_neighbor_audit_20260711/" + "review_p1_direct_local_neighbor_edges.tsv.gz" +) +PARENTS = ( + MM + / "outputs/p0_p1_freeze_20260710/" + "review_p1_parent_identity_manifest.tsv.gz" +) +DEFAULT_OUTPUT_DIR = MM / "outputs/p1_non_iar_exact_graph_authority_20260711" +OBJECTIVES = ("sequence", "topology", "ms", "static", "md") + + +def sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for chunk in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def as_bool(value: object) -> bool: + return str(value).strip().lower() in {"1", "true", "yes"} + + +def split_sources(value: str) -> tuple[str, ...]: + return tuple(source for source in value.split(";") if source) + + +def is_iar_source(source: str) -> bool: + return ( + source.startswith("glycosmos_fully_defined_iar_") + or source == "grey_seal_external_iar" + ) + + +@contextmanager +def gzip_tsv_writer(path: Path, fieldnames: list[str]) -> Iterator[csv.DictWriter]: + with path.open("wb") as raw: + with gzip.GzipFile(filename="", mode="wb", fileobj=raw, mtime=0) as zipped: + with io.TextIOWrapper(zipped, encoding="utf-8", newline="") as text: + writer = csv.DictWriter( + text, + fieldnames=fieldnames, + delimiter="\t", + lineterminator="\n", + ) + writer.writeheader() + yield writer + + +def objective_flags(row: dict[str, str]) -> dict[str, bool]: + return { + objective: as_bool(row[f"{objective}_eligible_before_partition"]) + for objective in OBJECTIVES + } + + +def intersection_flags(flags: dict[str, bool]) -> dict[str, bool]: + return { + "sequence_ms": flags["sequence"] and flags["ms"], + "sequence_static": flags["sequence"] and flags["static"], + "sequence_topology": flags["sequence"] and flags["topology"], + "ms_static": flags["ms"] and flags["static"], + "sequence_ms_static": ( + flags["sequence"] and flags["ms"] and flags["static"] + ), + "topology_ms_static": ( + flags["topology"] and flags["ms"] and flags["static"] + ), + "topology_ms_static_md": ( + flags["topology"] + and flags["ms"] + and flags["static"] + and flags["md"] + ), + "ms_md": flags["ms"] and flags["md"], + "static_md": flags["static"] and flags["md"], + } + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--anchor-manifest", type=Path, default=ANCHORS) + parser.add_argument("--graph-edges", type=Path, default=GRAPH_EDGES) + parser.add_argument("--parent-manifest", type=Path, default=PARENTS) + parser.add_argument("--output-dir", type=Path, default=DEFAULT_OUTPUT_DIR) + args = parser.parse_args() + args.output_dir.mkdir(parents=True, exist_ok=True) + + active_anchors: dict[str, dict[str, object]] = {} + active_source_memberships: Counter[str] = Counter() + inactive_source_memberships: Counter[str] = Counter() + with gzip.open( + args.anchor_manifest, "rt", newline="", encoding="utf-8" + ) as handle: + for row in csv.DictReader(handle, delimiter="\t"): + sources = split_sources(row["anchor_sources"]) + active_sources = tuple(source for source in sources if not is_iar_source(source)) + inactive_sources = tuple(source for source in sources if is_iar_source(source)) + if not active_sources: + continue + wurcs = row["canonical_wurcs"] + if wurcs in active_anchors: + raise RuntimeError(f"Duplicate anchor WURCS: {wurcs}") + active_source_memberships.update(active_sources) + inactive_source_memberships.update(inactive_sources) + active_anchors[wurcs] = { + "row": row, + "active_sources": active_sources, + "inactive_sources": inactive_sources, + } + + if len(active_anchors) != 4532: + raise RuntimeError( + f"Expected 4,532 non-IAR anchors, found {len(active_anchors):,}" + ) + + graph_identity_by_parent: dict[str, set[str]] = defaultdict(set) + with gzip.open(args.graph_edges, "rt", newline="", encoding="utf-8") as handle: + for row in csv.DictReader(handle, delimiter="\t"): + if row["relation_type"] != "graph_identity": + continue + if row["anchor_wurcs"] not in active_anchors: + continue + graph_identity_by_parent[row["parent_glycorpus_id"]].add( + row["anchor_wurcs"] + ) + + anchor_output = args.output_dir / "review_p1_non_iar_anchor_manifest.tsv.gz" + with gzip_tsv_writer( + anchor_output, + [ + "canonical_wurcs", + "active_anchor_sources", + "active_source_count", + "inactive_iar_context_sources", + "in_submitted_exact_exclusion_list", + "observed_in_frozen_graph", + "sequence_parent_id", + "review_parent_id", + "fingerprint_tier", + "registry_family_id", + ], + ) as writer: + for wurcs in sorted(active_anchors): + item = active_anchors[wurcs] + row = item["row"] + active_sources = item["active_sources"] + inactive_sources = item["inactive_sources"] + writer.writerow( + { + "canonical_wurcs": wurcs, + "active_anchor_sources": ";".join(active_sources), + "active_source_count": len(active_sources), + "inactive_iar_context_sources": ";".join(inactive_sources), + "in_submitted_exact_exclusion_list": row[ + "in_submitted_exact_exclusion_list" + ], + "observed_in_frozen_graph": row["observed_in_frozen_graph"], + "sequence_parent_id": row["sequence_parent_id"], + "review_parent_id": row["review_parent_id"], + "fingerprint_tier": row["fingerprint_tier"], + "registry_family_id": row["registry_family_id"], + } + ) + + eligible_counts: Counter[str] = Counter() + excluded_counts: Counter[str] = Counter() + retained_counts: Counter[str] = Counter() + raw_intersections: Counter[str] = Counter() + retained_intersections: Counter[str] = Counter() + sequence_exact_count = 0 + sequence_graph_count = 0 + sequence_graph_only_count = 0 + sequence_excluded_count = 0 + sequence_parent_count = 0 + + parent_output = ( + args.output_dir / "review_p1_non_iar_exact_graph_parent_manifest.tsv.gz" + ) + with gzip_tsv_writer( + parent_output, + [ + "parent_glycorpus_id", + "canonical_wurcs", + "exact_wurcs_anchor", + "graph_identity_anchor_count", + "graph_identity_anchor_wurcs", + "a5_excluded", + "a5_exclusion_reason", + "sequence_eligible_before_partition", + "topology_eligible_before_partition", + "ms_eligible_before_partition", + "static_eligible_before_partition", + "md_eligible_before_partition", + ], + ) as writer: + with gzip.open( + args.parent_manifest, "rt", newline="", encoding="utf-8" + ) as handle: + for row in csv.DictReader(handle, delimiter="\t"): + flags = objective_flags(row) + if not flags["sequence"]: + continue + sequence_parent_count += 1 + parent = row["parent_glycorpus_id"] + exact = row["canonical_wurcs"] in active_anchors + graph_anchors = graph_identity_by_parent.get(parent, set()) + graph = bool(graph_anchors) + excluded = exact or graph + if exact: + sequence_exact_count += 1 + if graph: + sequence_graph_count += 1 + if graph and not exact: + sequence_graph_only_count += 1 + if excluded: + sequence_excluded_count += 1 + + for objective, eligible in flags.items(): + if not eligible: + continue + eligible_counts[objective] += 1 + if excluded: + excluded_counts[objective] += 1 + else: + retained_counts[objective] += 1 + + for name, available in intersection_flags(flags).items(): + if not available: + continue + raw_intersections[name] += 1 + if not excluded: + retained_intersections[name] += 1 + + if exact and graph: + reason = "exact_wurcs_and_verified_graph_identity" + elif exact: + reason = "exact_wurcs_anchor" + elif graph: + reason = "verified_serialized_graph_identity" + else: + reason = "retained_no_exact_or_graph_identity" + writer.writerow( + { + "parent_glycorpus_id": parent, + "canonical_wurcs": row["canonical_wurcs"], + "exact_wurcs_anchor": exact, + "graph_identity_anchor_count": len(graph_anchors), + "graph_identity_anchor_wurcs": ";".join( + sorted(graph_anchors) + ), + "a5_excluded": excluded, + "a5_exclusion_reason": reason, + **{ + f"{objective}_eligible_before_partition": flags[objective] + for objective in OBJECTIVES + }, + } + ) + + expected_retained = { + "sequence": 277448, + "topology": 89457, + "ms": 5315, + "static": 36941, + "md": 27719, + } + if dict(retained_counts) != expected_retained: + raise RuntimeError( + f"Retention mismatch: expected {expected_retained}, got {dict(retained_counts)}" + ) + if sequence_parent_count != 281208 or sequence_excluded_count != 3760: + raise RuntimeError( + "Expected 281,208 sequence parents with 3,760 exact/graph exclusions" + ) + + summary = { + "schema": "bertose_p1_non_iar_exact_graph_authority_v1", + "status": "FROZEN_REVIEW_CANDIDATE_NOT_TRAINING_AUTHORIZATION", + "training_authorized": False, + "official_submitted_artifacts_modified": False, + "policy": ( + "Use established GlycanML/interaction/AFFINose non-fit roles plus " + "predeclared AFFINose component and motif/scaffold stress roles as " + "anchors. Exclude sequence parents only for exact canonical WURCS " + "or exact-verified serialized graph identity. IAR roles are not A5 " + "pretraining exclusions. One-edit, larger-substructure, motif, and " + "nearest-neighbour relations remain analysis strata." + ), + "non_iar_anchor_count": len(active_anchors), + "active_source_memberships": dict(sorted(active_source_memberships.items())), + "inactive_iar_context_memberships_on_retained_anchors": dict( + sorted(inactive_source_memberships.items()) + ), + "sequence_parent_counts": { + "eligible": sequence_parent_count, + "exact_wurcs_anchor": sequence_exact_count, + "verified_graph_identity": sequence_graph_count, + "additional_graph_identity": sequence_graph_only_count, + "excluded_union": sequence_excluded_count, + "retained": retained_counts["sequence"], + }, + "objective_retention": { + objective: { + "eligible": eligible_counts[objective], + "excluded": excluded_counts[objective], + "retained": retained_counts[objective], + "retained_percent": round( + 100.0 * retained_counts[objective] / eligible_counts[objective], 6 + ), + } + for objective in OBJECTIVES + }, + "raw_intersections": dict(sorted(raw_intersections.items())), + "retained_intersections": dict(sorted(retained_intersections.items())), + "input_sha256": { + "role_complete_anchor_manifest": sha256(args.anchor_manifest), + "role_complete_graph_identity_edges": sha256(args.graph_edges), + "parent_identity_manifest": sha256(args.parent_manifest), + "script": sha256(Path(__file__).resolve()), + }, + "outputs": { + "anchor_manifest": anchor_output.name, + "anchor_manifest_sha256": sha256(anchor_output), + "parent_manifest": parent_output.name, + "parent_manifest_sha256": sha256(parent_output), + }, + "validation_checks": { + "non_iar_anchor_count_is_4532": len(active_anchors) == 4532, + "sequence_parent_count_is_281208": sequence_parent_count == 281208, + "sequence_excluded_count_is_3760": sequence_excluded_count == 3760, + "no_numeric_similarity_threshold_used": True, + "no_one_edit_or_substructure_neighbour_excluded": True, + "no_downstream_labels_or_model_outputs_read": True, + "all_expected_retention_counts_match": dict(retained_counts) + == expected_retained, + }, + "claim_boundary": ( + "This is an exact-glycan/serialized-graph-excluded pretraining " + "authority, not a leakage-proof claim. Similarity, motif, family, " + "substructure, and nearest-neighbour evidence must be reported as " + "separate stress analyses." + ), + } + summary_output = args.output_dir / "review_p1_non_iar_authority_summary.json" + summary_output.write_text( + json.dumps(summary, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + print(json.dumps(summary, indent=2, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py b/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py new file mode 100644 index 0000000000000000000000000000000000000000..c3cfb95ff563add947803c8d92fcc93313cab285 --- /dev/null +++ b/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py @@ -0,0 +1,770 @@ +#!/usr/bin/env python3 +"""Build an audit-only A5 exclusion successor for later downstream roles. + +This builder is deliberately no-overwrite and training-disabled. It preserves +every unaffected frozen 80/20 parent role, adds current paper-facing non-fit +glycans to the exact/known-graph anchor union, and propagates newly excluded +parents into the base objective contributor ledger. It does not inspect any +downstream target or model output. +""" + +from __future__ import annotations + +import argparse +import csv +import gzip +import hashlib +import importlib.util +import io +import json +import os +import stat +import sys +from collections import Counter, defaultdict +from contextlib import contextmanager +from pathlib import Path +from typing import Any, Iterable, Iterator + + +WRITING_ROOT = Path(__file__).resolve().parents[3] +PROJECT_ROOT = WRITING_ROOT.parent +MM = WRITING_ROOT / "review/multimodal" + +PREDECESSOR_ANCHORS = ( + MM / "outputs/p1_non_iar_exact_graph_authority_20260711/" + "review_p1_non_iar_anchor_manifest.tsv.gz" +) +PREDECESSOR_PARENTS = ( + MM / "outputs/p1_non_iar_exact_graph_authority_20260711/" + "review_p1_non_iar_exact_graph_parent_manifest.tsv.gz" +) +PREDECESSOR_PARTITION = ( + MM / "outputs/p1_non_iar_pretraining_partition_80_20_20260712/" + "review_p1_non_iar_pretraining_parent_partition.tsv.gz" +) +PREDECESSOR_OBJECTIVES = ( + MM / "outputs/p1_non_iar_pretraining_partition_80_20_20260712/" + "review_p1_non_iar_pretraining_objective_partition.tsv.gz" +) +FINGERPRINTS = ( + MM / "outputs/p0_p1_freeze_20260710/" + "review_p1_wurcs_motif_fingerprint_manifest.tsv.gz" +) +PARENT_IDENTITIES = ( + MM / "outputs/p0_p1_freeze_20260710/" + "review_p1_parent_identity_manifest.tsv.gz" +) +PREDECESSOR_GRAPH_EDGES = ( + MM / "outputs/p1_role_complete_direct_local_neighbor_audit_20260711/" + "review_p1_direct_local_neighbor_edges.tsv.gz" +) +GRAPH_VERIFIER = MM / "scripts/build_p1_direct_local_neighbor_audit_20260710.py" +STRICT3 = ( + MM / "outputs/review_a5_downstream_strict3_authority_20260720_r2/" + "review_a5_downstream_strict3_authority.json" +) +K20_ANCHORS = ( + MM / "outputs/p1_affinose_motif_scaffold_balanced_k20_20260711/" + "review_p1_affinose_balanced_k20_a5_anchors.tsv.gz" +) +STRICT_ANCHORS = ( + MM / "outputs/review_a5_affinose_strict_glycan_components_20260720_r1/" + "review_a5_affinose_strict_glycan_nonfit_anchors_20260720.tsv.gz" +) +STRICT_SUMMARY = ( + MM / "outputs/review_a5_affinose_strict_glycan_components_20260720_r1/" + "review_a5_affinose_strict_glycan_candidate_summary_20260720.json" +) +STRICT_RECEIPT = ( + MM / "outputs/review_a5_affinose_strict_glycan_components_20260720_r1/" + "review_a5_affinose_strict_glycan_candidate_verification_receipt_20260720.json" +) +SEQUENCE_V3 = ( + PROJECT_ROOT / "data/" + "review_sequences_a5_non_iar_80_20_parser_v3_failclosed_20260720_r3/" + "review_sequence_parent_index.tsv.gz" +) +P6_AUTHORITY = ( + MM / "outputs/review_a5_affinose_p6_observation_authority_20260720_r2/" + "review_a5_affinose_p6_failclosed_authority_20260720.json" +) +P6_RECEIPT = ( + MM / "outputs/review_a5_affinose_p6_observation_authority_20260720_r2/" + "review_a5_affinose_p6_failclosed_receipt_20260720.json" +) +CORRECTION = MM / "P0_P1_non_iar_authority_correction_20260711.md" +REFIT_CONTRACT = MM / "P1_parent_split_refit_contract_20260710.md" +GENERALIZATION_PROTOCOL = MM / "P1_reviewer_complete_generalization_protocol_20260710.md" +ENDPOINT_ADJUDICATION = MM / "review_a5_interaction_endpoint_adjudication_20260720.md" +MS_PARENTS = ( + MM / "outputs/p1_a5_ms_harmonized_identity_repair_20260720_r1/" + "review_a5_ms_repaired_parent_manifest.tsv.gz" +) +STATIC_CHILD = ( + MM / "outputs/p1_a5_static_repair_child_authority_20260720_r1/" + "review_a5_static_repair_child_authority.tsv.gz" +) +TEST_FILE = ( + MM + / "tests/test_build_review_a5_non_iar_later_role_successor_20260720.py" +) + +DEFAULT_OUTPUT = ( + MM / "outputs/review_a5_non_iar_later_role_successor_20260720_r1" +) + +EXPECTED_SHA256 = { + PREDECESSOR_ANCHORS: "048facdfd9a5ff15f1295d28f1d07b4dae2c656ca8714c3ed06df9e284ac199a", + PREDECESSOR_PARENTS: "088971d5dbe61f840a45a67a84df39478edd7a80089fd6528fd9fda8063b26b9", + PREDECESSOR_PARTITION: "7c4ed33a6cbf50df8d3264421c652c480d3a5eff0eace10c3c958e6dac6b2160", + PREDECESSOR_OBJECTIVES: "d09eebb3f7ac47058d2d0cabfd42905f624581bf4c942dceac9cad9c1973e5a0", + FINGERPRINTS: "69994cbc859146e97867e62669fd9f71b8d02140ecd9ae8056375af608afdcab", + PARENT_IDENTITIES: "55b830d839370c0cec0aab2b61b4721e6ace9ba3ee49e4c93e7be6e486d1c5c4", + PREDECESSOR_GRAPH_EDGES: "e95d8122449f4b91271fd297be41a7912244f2398739e349064fc55b781e3ae0", + GRAPH_VERIFIER: "a9160769759c1df56238caad6a9f4ed6ec68477d44435ebbc81d64bbf541b64c", + STRICT3: "c1bbcfe410c0ee78824657da84a4055e58fdf196624d8981e1aa239ae629f1d8", + K20_ANCHORS: "cdeb7b4075f00efc50c0649ac4be11560154e29a6a728c4ddeb54dd6bc26f6c9", + STRICT_ANCHORS: "85c8f760dba0e11a4346cd07bc7eb09f5f31d6bf1b0407658130da4173f8a5f9", + STRICT_SUMMARY: "d1a56f0bb7f77535c619cc2739933bd751cb5d3e3fcd2e8175fc88671e83e6ee", + STRICT_RECEIPT: "a92f442f2b74e630783b5a0eb6fb16738d6aa4c86f71b28c487cc42622d3eee1", + SEQUENCE_V3: "c61e766dbffc4a1d88c7c7fb94deb683943c0861403350e79ab09c70b317fa52", + P6_AUTHORITY: "a77e486e200e50e9becb3ad45f70ef97272b5a339267c636d746af8d9bf2b2b5", + P6_RECEIPT: "d6fb00bd5a79d5a1caa9d06f440357202d85bb6cb3f33c7732f063b4721cf23f", + CORRECTION: "f7ba54c4ec66b74e0061ffa75bd963af9589f28a7124e95208099f169657936f", + REFIT_CONTRACT: "2533d651ccbf6d86111709676bf528d7c805d1df214ada62fd45772dda0f388e", + GENERALIZATION_PROTOCOL: "9556f456490bdd7e03926cc78d9c0a73146386a9b7ac7188a556b1bc23c37b4a", + ENDPOINT_ADJUDICATION: "614a4e2144dda63538a26dcbd8fce0a9d604a97c2b4ad07cf80820407ca29fdb", + MS_PARENTS: "f4abd4b186f5f4758918b89f19870bc112a7c6be6085f870208235cd03005e26", + STATIC_CHILD: "2ca981b78bca56928d449d35467671b03db515496ac61162e68f8a1381a3661f", +} + +OBJECTIVES = ("sequence", "topology", "ms", "static", "md") +ACTIVE_ROLES = ("pretraining_train", "pretraining_development") + + +def require(condition: bool, message: str) -> None: + if not condition: + raise RuntimeError(message) + + +def as_bool(value: object) -> bool: + return str(value).strip().lower() in {"1", "true", "yes"} + + +def sha256_file(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for chunk in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def validate_input(path: Path, expected: str) -> dict[str, object]: + info = path.lstat() + require(stat.S_ISREG(info.st_mode), f"input is not a regular file: {path}") + require(not path.is_symlink(), f"input is a symlink: {path}") + actual = sha256_file(path) + require(actual == expected, f"input SHA-256 changed: {path}: {actual}") + return {"name": path.name, "bytes": info.st_size, "sha256": actual} + + +def read_tsv(path: Path) -> tuple[list[str], list[dict[str, str]]]: + with gzip.open(path, "rt", newline="", encoding="utf-8") as handle: + reader = csv.DictReader(handle, delimiter="\t") + return list(reader.fieldnames or []), list(reader) + + +def iter_tsv(path: Path) -> Iterator[dict[str, str]]: + with gzip.open(path, "rt", newline="", encoding="utf-8") as handle: + yield from csv.DictReader(handle, delimiter="\t") + + +@contextmanager +def deterministic_tsv(path: Path, fields: list[str]) -> Iterator[csv.DictWriter]: + with path.open("wb") as raw: + with gzip.GzipFile(filename="", mode="wb", fileobj=raw, mtime=0) as zipped: + with io.TextIOWrapper(zipped, encoding="utf-8", newline="") as text: + writer = csv.DictWriter( + text, fieldnames=fields, delimiter="\t", lineterminator="\n" + ) + writer.writeheader() + yield writer + + +def json_bytes(value: object) -> bytes: + return (json.dumps(value, indent=2, sort_keys=True) + "\n").encode("utf-8") + + +def output_identity(path: Path) -> dict[str, object]: + return {"name": path.name, "bytes": path.stat().st_size, "sha256": sha256_file(path)} + + +def load_graph_verifier() -> Any: + spec = importlib.util.spec_from_file_location( + "review_a5_bound_graph_verifier_20260720", GRAPH_VERIFIER + ) + require(spec is not None and spec.loader is not None, "cannot load graph verifier") + module = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = module + spec.loader.exec_module(module) + return module + + +def strict3_nonfit_wurcs(authority: dict[str, Any]) -> tuple[set[str], set[str], dict[str, int]]: + primary: set[str] = set() + secondary: set[str] = set() + per_task: dict[str, int] = {} + for task in authority["task_authorities"]: + task_primary: set[str] = set() + task_secondary: set[str] = set() + for section, target in (("roles", task_primary), ("secondary_roles", task_secondary)): + for role in ("method_development", "locked_confirmation"): + item = task[section][role] + path = PROJECT_ROOT / item["path"] + require(sha256_file(path) == item["sha256"], f"strict3 role changed: {path}") + with path.open("rt", newline="", encoding="utf-8") as handle: + for row in csv.DictReader(handle): + wurcs = row["WURCS"] + if wurcs: + target.add(wurcs) + require(task_secondary <= task_primary, f"secondary strict3 not subset: {task['task']}") + primary.update(task_primary) + secondary.update(task_secondary) + per_task[task["task"]] = len(task_primary) + return primary, secondary, per_task + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--output-directory", type=Path, default=DEFAULT_OUTPUT) + args = parser.parse_args() + + output_names = ( + "review_a5_non_iar_successor_anchor_manifest.tsv.gz", + "review_a5_non_iar_successor_exact_known_graph_parent_manifest.tsv.gz", + "review_a5_non_iar_successor_parent_partition.tsv.gz", + "review_a5_non_iar_successor_objective_partition.tsv.gz", + "review_a5_non_iar_successor_later_role_gap.tsv.gz", + "review_a5_non_iar_successor_changed_parent_roles.tsv.gz", + "review_a5_non_iar_successor_summary.json", + "review_a5_non_iar_successor_receipt.json", + ) + require( + not args.output_directory.exists(), + f"refusing to overwrite output directory: {args.output_directory}", + ) + + input_receipts = { + str(path.relative_to(PROJECT_ROOT)): validate_input(path, expected) + for path, expected in EXPECTED_SHA256.items() + } + + anchor_fields, predecessor_anchor_rows = read_tsv(PREDECESSOR_ANCHORS) + parent_fields, predecessor_parent_rows = read_tsv(PREDECESSOR_PARENTS) + partition_fields, predecessor_partition_rows = read_tsv(PREDECESSOR_PARTITION) + objective_fields, predecessor_objective_rows = read_tsv(PREDECESSOR_OBJECTIVES) + require(len(predecessor_anchor_rows) == 4532, "predecessor anchor count changed") + require(len(predecessor_parent_rows) == 281208, "predecessor parent count changed") + require(len(predecessor_partition_rows) == 281208, "predecessor partition count changed") + require(len(predecessor_objective_rows) == 281208 * 5, "objective row count changed") + + predecessor_anchors = {row["canonical_wurcs"]: row for row in predecessor_anchor_rows} + require(len(predecessor_anchors) == 4532, "duplicate predecessor anchors") + predecessor_parents = { + row["parent_glycorpus_id"]: row for row in predecessor_parent_rows + } + predecessor_partition = { + row["parent_glycorpus_id"]: row for row in predecessor_partition_rows + } + require(len(predecessor_parents) == len(predecessor_partition) == 281208, "duplicate parents") + + strict3_authority = json.loads(STRICT3.read_text(encoding="utf-8")) + class_primary, class_secondary, class_per_task = strict3_nonfit_wurcs(strict3_authority) + _, k20_rows = read_tsv(K20_ANCHORS) + _, strict_rows = read_tsv(STRICT_ANCHORS) + k20 = {row["glycan_wurcs"]: row for row in k20_rows} + strict = {row["glycan_wurcs"]: row for row in strict_rows} + require(len(class_primary) == 1967, "strict3 primary nonfit union changed") + require(len(k20) == 704, "K20 nonfit count changed") + require(len(strict) == 786, "strict AFFINose nonfit count changed") + require(class_primary <= set(predecessor_anchors), "strict3 role absent from predecessor anchors") + require(class_secondary <= set(predecessor_anchors), "secondary strict3 role absent from predecessor anchors") + require(set(k20) <= set(predecessor_anchors), "K20 role absent from predecessor anchors") + + strict_gap = set(strict) - set(predecessor_anchors) + require(len(set(strict) & set(predecessor_anchors)) == 693, "strict overlap changed") + require(len(strict_gap) == 93, "strict later-role gap changed") + current_nonfit_union = class_primary | set(k20) | set(strict) + require(len(current_nonfit_union) == 3341, "current nonfit union changed") + + fingerprint_parent: dict[str, dict[str, str]] = {} + fingerprint_rows_by_wurcs: dict[str, list[dict[str, str]]] = defaultdict(list) + for row in iter_tsv(FINGERPRINTS): + wurcs = row["canonical_wurcs"] + if wurcs in strict_gap: + fingerprint_rows_by_wurcs[wurcs].append(row) + if row["graph_record_role"] == "sequence_eligible_parent" and as_bool( + row["sequence_eligible_parent"] + ): + parent = row["parent_glycorpus_id"] + require(parent not in fingerprint_parent, f"duplicate fingerprint parent: {parent}") + fingerprint_parent[parent] = { + "parent_glycorpus_id": parent, + "canonical_wurcs": wurcs, + "fingerprint_tier": row["fingerprint_tier"], + "raw_feature_sha256": row["raw_feature_sha256"], + "precluster_union_block_id": row["precluster_union_block_id"], + "registry_family_id": row["registry_family_id"], + "exact_benchmark_excluded": row["exact_benchmark_excluded"], + } + require(len(fingerprint_parent) == 281208, "fingerprint parent coverage changed") + require(set(fingerprint_rows_by_wurcs) == strict_gap, "strict gap fingerprint coverage incomplete") + require(set(fingerprint_parent) == set(predecessor_parents), "parent/fingerprint mismatch") + + graph_by_parent: dict[str, set[str]] = defaultdict(set) + for row in iter_tsv(PREDECESSOR_GRAPH_EDGES): + if row["relation_type"] == "graph_identity" and row["anchor_wurcs"] in predecessor_anchors: + graph_by_parent[row["parent_glycorpus_id"]].add(row["anchor_wurcs"]) + for parent, row in predecessor_parents.items(): + expected_graph = set(filter(None, row["graph_identity_anchor_wurcs"].split(";"))) + require(expected_graph == graph_by_parent.get(parent, set()), f"predecessor graph mismatch: {parent}") + exact = row["canonical_wurcs"] in predecessor_anchors + require(exact == as_bool(row["exact_wurcs_anchor"]), f"predecessor exact mismatch: {parent}") + require( + (exact or bool(expected_graph)) == as_bool(row["a5_excluded"]), + f"predecessor exclusion mismatch: {parent}", + ) + + graph_module = load_graph_verifier() + fixed_gap_graphs: dict[str, Any] = {} + signatures: dict[str, list[str]] = defaultdict(list) + tier_by_gap: dict[str, str] = {} + for wurcs in sorted(strict_gap): + tiers = {row["fingerprint_tier"] for row in fingerprint_rows_by_wurcs[wurcs]} + require(len(tiers) == 1, f"inconsistent fingerprint tier: {wurcs}") + tier = next(iter(tiers)) + tier_by_gap[wurcs] = tier + if tier == graph_module.FIXED_TIER: + graph = graph_module.parse_fixed_tree(wurcs) + fixed_gap_graphs[wurcs] = graph + signatures[graph_module.signature(graph)].append(wurcs) + + new_graph_by_parent: dict[str, set[str]] = defaultdict(set) + for parent, row in fingerprint_parent.items(): + if row["fingerprint_tier"] != graph_module.FIXED_TIER: + continue + graph = graph_module.parse_fixed_tree(row["canonical_wurcs"]) + for anchor in signatures.get(graph_module.signature(graph), []): + if graph_module.exact_isomorphic(fixed_gap_graphs[anchor], graph): + new_graph_by_parent[parent].add(anchor) + + successor_anchors = dict(predecessor_anchors) + for wurcs in sorted(strict_gap): + source = f"affinose_strict_direct_edit_component_{strict[wurcs]['component_role']}_20260720" + metadata = fingerprint_rows_by_wurcs[wurcs] + sequence_rows = [row for row in metadata if row["graph_record_role"] == "sequence_eligible_parent"] + parent_rows = [row for row in metadata if row["parent_glycorpus_id"]] + registry_ids = {row["registry_family_id"] for row in metadata if row["registry_family_id"]} + require(len(registry_ids) <= 1, f"inconsistent registry family: {wurcs}") + successor_anchors[wurcs] = { + "canonical_wurcs": wurcs, + "active_anchor_sources": source, + "active_source_count": "1", + "inactive_iar_context_sources": "", + "in_submitted_exact_exclusion_list": str( + any(as_bool(row["exact_benchmark_excluded"]) for row in metadata) + ), + "observed_in_frozen_graph": str(bool(parent_rows)), + "sequence_parent_id": sequence_rows[0]["parent_glycorpus_id"] if sequence_rows else "", + "review_parent_id": parent_rows[0]["parent_glycorpus_id"] if parent_rows else "", + "fingerprint_tier": tier_by_gap[wurcs], + "registry_family_id": next(iter(registry_ids), ""), + } + require(len(successor_anchors) == 4625, "successor anchor count changed") + + successor_parent_rows: list[dict[str, str]] = [] + newly_excluded: set[str] = set() + new_exact_parents: set[str] = set() + new_graph_alias_parents: set[str] = set() + for source in predecessor_parent_rows: + parent = source["parent_glycorpus_id"] + canonical = source["canonical_wurcs"] + exact = canonical in successor_anchors + graph_anchors = graph_by_parent.get(parent, set()) | new_graph_by_parent.get(parent, set()) + graph = bool(graph_anchors) + excluded = exact or graph + if canonical in strict_gap: + new_exact_parents.add(parent) + if new_graph_by_parent.get(parent) and canonical not in strict_gap: + new_graph_alias_parents.add(parent) + if excluded and not as_bool(source["a5_excluded"]): + newly_excluded.add(parent) + if exact and graph: + reason = "exact_wurcs_and_verified_graph_identity" + elif exact: + reason = "exact_wurcs_anchor" + elif graph: + reason = "verified_serialized_graph_identity" + else: + reason = "retained_no_exact_or_graph_identity" + row = dict(source) + row.update( + { + "exact_wurcs_anchor": str(exact), + "graph_identity_anchor_count": str(len(graph_anchors)), + "graph_identity_anchor_wurcs": ";".join(sorted(graph_anchors)), + "a5_excluded": str(excluded), + "a5_exclusion_reason": reason, + } + ) + successor_parent_rows.append(row) + require(len(new_exact_parents) == 73, "new exact parent count changed") + require(len(new_graph_alias_parents) == 0, "new graph-only alias count changed") + require(len(newly_excluded) == 73, "new exclusion union changed") + successor_exact_count = sum( + as_bool(row["exact_wurcs_anchor"]) for row in successor_parent_rows + ) + successor_graph_count = sum( + int(row["graph_identity_anchor_count"]) > 0 for row in successor_parent_rows + ) + successor_graph_only_count = sum( + not as_bool(row["exact_wurcs_anchor"]) + and int(row["graph_identity_anchor_count"]) > 0 + for row in successor_parent_rows + ) + require( + (successor_exact_count, successor_graph_count, successor_graph_only_count) + == (3673, 3587, 160), + "successor exact/known-graph counts changed", + ) + + successor_parent_by_id = { + row["parent_glycorpus_id"]: row for row in successor_parent_rows + } + role_by_parent: dict[str, str] = {} + successor_partition_rows: list[dict[str, str]] = [] + role_transitions: Counter[tuple[str, str]] = Counter() + for source in predecessor_partition_rows: + parent = source["parent_glycorpus_id"] + old_role = source["pretraining_partition"] + new_role = ( + "excluded_exact_or_verified_graph_identity" + if parent in newly_excluded + else old_role + ) + role_by_parent[parent] = new_role + role_transitions[(old_role, new_role)] += 1 + row = dict(source) + row["a5_excluded"] = str(new_role not in ACTIVE_ROLES) + row["a5_exclusion_reason"] = successor_parent_by_id[parent][ + "a5_exclusion_reason" + ] + row["pretraining_partition"] = new_role + row["learned_preprocessing_fit_contributor"] = str(new_role == "pretraining_train") + row["model_pretraining_contributor"] = str(new_role == "pretraining_train") + successor_partition_rows.append(row) + + role_counts = Counter(role_by_parent.values()) + require( + role_counts + == { + "pretraining_train": 221899, + "pretraining_development": 55476, + "excluded_exact_or_verified_graph_identity": 3833, + }, + f"successor role counts changed: {role_counts}", + ) + require( + role_transitions[("pretraining_train", "excluded_exact_or_verified_graph_identity")] == 59 + and role_transitions[("pretraining_development", "excluded_exact_or_verified_graph_identity")] == 14, + "strict role-transition counts changed", + ) + require( + all(old == new or new == "excluded_exact_or_verified_graph_identity" for old, new in role_transitions), + "unaffected 80/20 role moved", + ) + + objective_counts: Counter[tuple[str, str]] = Counter() + objective_impacts: Counter[tuple[str, str]] = Counter() + successor_objective_rows: list[dict[str, str]] = [] + flags_by_parent: dict[str, dict[str, bool]] = defaultdict(dict) + for source in predecessor_objective_rows: + parent = source["parent_glycorpus_id"] + objective = source["objective"] + eligible = as_bool(source["eligible_before_partition"]) + old_role = source["pretraining_partition"] + new_role = role_by_parent[parent] + row = dict(source) + row["pretraining_partition"] = new_role + row["objective_train_contributor"] = str(eligible and new_role == "pretraining_train") + row["objective_development_contributor"] = str( + eligible and new_role == "pretraining_development" + ) + successor_objective_rows.append(row) + flags_by_parent[parent][objective] = eligible + if eligible and new_role in ACTIVE_ROLES: + objective_counts[(new_role, objective)] += 1 + if eligible and parent in newly_excluded: + objective_impacts[(old_role, objective)] += 1 + require(all(set(flags) == set(OBJECTIVES) for flags in flags_by_parent.values()), "objective coverage incomplete") + + registry_by_parent: dict[str, str] = {} + for row in iter_tsv(PARENT_IDENTITIES): + parent = row["parent_glycorpus_id"] + if parent in role_by_parent: + registry_by_parent[parent] = row["registry_family_id"] + require(set(registry_by_parent) == set(role_by_parent), "registry-family coverage incomplete") + crossings: dict[str, int] = {} + for name, grouping in ( + ("precluster_union_block_id", {p: fingerprint_parent[p]["precluster_union_block_id"] for p in role_by_parent}), + ("raw_feature_sha256", {p: fingerprint_parent[p]["raw_feature_sha256"] for p in role_by_parent}), + ("registry_family_id", registry_by_parent), + ): + roles_by_group: dict[str, set[str]] = defaultdict(set) + for parent, group in grouping.items(): + role = role_by_parent[parent] + if role in ACTIVE_ROLES: + roles_by_group[group].add(role) + crossings[name] = sum(len(roles) > 1 for roles in roles_by_group.values()) + require(not any(crossings.values()), f"retained grouping crosses roles: {crossings}") + + sequence_v3 = {row["parent_glycorpus_id"]: row for row in iter_tsv(SEQUENCE_V3)} + require(set(sequence_v3) == set(role_by_parent), "sequence-v3 parent coverage changed") + strict_sequence_roles = Counter( + sequence_v3[parent]["pretraining_partition"] for parent in newly_excluded + ) + + ms_impacted = [row for row in iter_tsv(MS_PARENTS) if row["parent_glycorpus_id"] in newly_excluded] + ms_impacted_roles = Counter(row["pretraining_partition"] for row in ms_impacted) + static_impacted = [row for row in iter_tsv(STATIC_CHILD) if row["parent_glycorpus_id"] in newly_excluded] + static_active_states = Counter( + row["a5_static_partition"] for row in static_impacted if row["a5_static_partition"] in ACTIVE_ROLES + ) + static_active_parents = Counter() + static_parent_roles: dict[str, str] = {} + for row in static_impacted: + if row["a5_static_partition"] in ACTIVE_ROLES: + static_parent_roles[row["parent_glycorpus_id"]] = row["a5_static_partition"] + static_active_parents.update(static_parent_roles.values()) + + gap_fields = [ + "canonical_wurcs", + "strict_component_role", + "fingerprint_tier", + "fingerprint_graph_record_roles", + "sequence_parent_id", + "sequence_v3_pretraining_partition", + "successor_pretraining_partition", + "known_graph_identity_parent_count", + "known_graph_only_alias_parent_count", + *[f"{objective}_eligible_before_partition" for objective in OBJECTIVES], + ] + gap_rows: list[dict[str, object]] = [] + for wurcs in sorted(strict_gap): + parent_candidates = [ + row["parent_glycorpus_id"] + for row in fingerprint_rows_by_wurcs[wurcs] + if row["graph_record_role"] == "sequence_eligible_parent" + ] + parent = parent_candidates[0] if parent_candidates else "" + identity_parents = sorted( + candidate for candidate, anchors in new_graph_by_parent.items() if wurcs in anchors + ) + graph_only = [candidate for candidate in identity_parents if fingerprint_parent[candidate]["canonical_wurcs"] != wurcs] + flags = flags_by_parent.get(parent, {}) + gap_rows.append( + { + "canonical_wurcs": wurcs, + "strict_component_role": strict[wurcs]["component_role"], + "fingerprint_tier": tier_by_gap[wurcs], + "fingerprint_graph_record_roles": ";".join( + sorted({row["graph_record_role"] for row in fingerprint_rows_by_wurcs[wurcs]}) + ), + "sequence_parent_id": parent, + "sequence_v3_pretraining_partition": sequence_v3[parent]["pretraining_partition"] if parent else "absent", + "successor_pretraining_partition": role_by_parent[parent] if parent else "absent", + "known_graph_identity_parent_count": len(identity_parents), + "known_graph_only_alias_parent_count": len(graph_only), + **{f"{objective}_eligible_before_partition": str(flags.get(objective, False)) for objective in OBJECTIVES}, + } + ) + + changed_fields = [ + "parent_glycorpus_id", + "canonical_wurcs", + "predecessor_pretraining_partition", + "successor_pretraining_partition", + "strict_component_role", + "successor_exclusion_reason", + ] + changed_rows = [] + for parent in sorted(newly_excluded): + canonical = predecessor_parents[parent]["canonical_wurcs"] + changed_rows.append( + { + "parent_glycorpus_id": parent, + "canonical_wurcs": canonical, + "predecessor_pretraining_partition": predecessor_partition[parent]["pretraining_partition"], + "successor_pretraining_partition": role_by_parent[parent], + "strict_component_role": strict[canonical]["component_role"], + "successor_exclusion_reason": successor_parent_by_id[parent]["a5_exclusion_reason"], + } + ) + + args.output_directory.mkdir(parents=True, exist_ok=False) + paths = {name: args.output_directory / name for name in output_names} + with deterministic_tsv(paths[output_names[0]], anchor_fields) as writer: + writer.writerows(successor_anchors[w] for w in sorted(successor_anchors)) + with deterministic_tsv(paths[output_names[1]], parent_fields) as writer: + writer.writerows(successor_parent_rows) + with deterministic_tsv(paths[output_names[2]], partition_fields) as writer: + writer.writerows(successor_partition_rows) + with deterministic_tsv(paths[output_names[3]], objective_fields) as writer: + writer.writerows(successor_objective_rows) + with deterministic_tsv(paths[output_names[4]], gap_fields) as writer: + writer.writerows(gap_rows) + with deterministic_tsv(paths[output_names[5]], changed_fields) as writer: + writer.writerows(changed_rows) + + active_total = role_counts["pretraining_train"] + role_counts["pretraining_development"] + summary: dict[str, Any] = { + "schema": "bertose_a5_non_iar_later_role_successor_v1", + "status": "PREPARED_FAIL_CLOSED_REQUIRES_ALL_LEARNED_REFITS_AND_NEW_PRETRAINING", + "training_authorized": False, + "scientific_launch_authorized": False, + "official_submitted_or_predecessor_artifacts_modified": False, + "implementation": { + "builder": { + "name": Path(__file__).name, + "bytes": Path(__file__).stat().st_size, + "sha256": sha256_file(Path(__file__)), + }, + "bound_graph_verifier": input_receipts[ + str(GRAPH_VERIFIER.relative_to(PROJECT_ROOT)) + ], + "tests": { + "name": TEST_FILE.name, + "bytes": TEST_FILE.stat().st_size, + "sha256": sha256_file(TEST_FILE), + }, + }, + "policy": { + "source": "P0/P1 exact canonical WURCS or known retrieved and exact-verified serialized graph identity", + "later_role_rule": "any later paper-facing endpoint must add non-fit glycans through a versioned authority rebuild", + "allocation": "preserve every unaffected frozen 80/20 role; move only newly matched parents to transform-only exclusion", + "graph_retrieval_boundary": "fixed-tree exact-linkage WL retrieval plus exact labelled isomorphism; not exhaustive for nonfixed WURCS", + }, + "endpoint_adjudication": { + "strict_affinose_status": "selected_primary_interaction_double_cold_endpoint", + "corrected_k20_status": "mandatory_companion", + "generic_unlabelled_pretraining_overlap_note": "may be acceptable in other protocols, but conflicts with this frozen project-specific exclusion rule", + "target_or_outcome_values_read": False, + }, + "current_nonfit_coverage": { + "strict3_classification_primary_unique_wurcs": len(class_primary), + "strict3_classification_secondary_unique_wurcs": len(class_secondary), + "strict3_primary_per_task_unique_wurcs": dict(sorted(class_per_task.items())), + "strict3_primary_missing_from_predecessor_4532": len(class_primary - set(predecessor_anchors)), + "k20_nonfit_wurcs": len(k20), + "k20_missing_from_predecessor_4532": len(set(k20) - set(predecessor_anchors)), + "strict_affinose_nonfit_wurcs": len(strict), + "strict_affinose_predecessor_overlap": len(set(strict) & set(predecessor_anchors)), + "strict_affinose_missing_from_predecessor": len(strict_gap), + "all_current_nonfit_unique_wurcs": len(current_nonfit_union), + }, + "successor_anchor_and_parent_counts": { + "predecessor_active_anchors": len(predecessor_anchors), + "successor_active_anchors": len(successor_anchors), + "added_strict_anchors": len(strict_gap), + "added_fixed_tree_exact_linkage_anchors": sum(t == graph_module.FIXED_TIER for t in tier_by_gap.values()), + "new_exact_sequence_parents": len(new_exact_parents), + "new_known_graph_identity_edges": sum(len(v) for v in new_graph_by_parent.values()), + "new_known_graph_only_alias_parents": len(new_graph_alias_parents), + "new_excluded_parent_union": len(newly_excluded), + "successor_exact_wurcs_sequence_parents": successor_exact_count, + "successor_known_graph_identity_sequence_parents": successor_graph_count, + "successor_additional_known_graph_only_sequence_parents": successor_graph_only_count, + "successor_excluded_parent_union": sum(as_bool(row["a5_excluded"]) for row in successor_parent_rows), + }, + "preserved_80_20_partition": { + "parent_role_counts": dict(sorted(role_counts.items())), + "retained_train_fraction": role_counts["pretraining_train"] / active_total, + "retained_development_fraction": role_counts["pretraining_development"] / active_total, + "newly_excluded_predecessor_roles": dict(sorted(strict_sequence_roles.items())), + "unaffected_train_development_role_moves": 0, + "retained_group_crossings": crossings, + }, + "base_objective_successor_counts": { + role: {objective: objective_counts[(role, objective)] for objective in OBJECTIVES} + for role in ACTIVE_ROLES + }, + "base_objective_removed_counts": { + role: {objective: objective_impacts[(role, objective)] for objective in OBJECTIVES} + for role in ACTIVE_ROLES + }, + "current_repaired_derivative_snapshot_impact": { + "ms_parent_rows_to_move_transform_only": len(ms_impacted), + "ms_parent_rows_by_predecessor_role": dict(sorted(ms_impacted_roles.items())), + "static_child_active_parent_rows_to_move_transform_only": sum(static_active_parents.values()), + "static_child_active_parents_by_predecessor_role": dict(sorted(static_active_parents.items())), + "static_child_active_state_rows_to_move_transform_only": sum(static_active_states.values()), + "static_child_active_states_by_predecessor_role": dict(sorted(static_active_states.items())), + "static_child_snapshot_is_not_final_training_authority": True, + }, + "required_successors_before_any_compute": [ + "fit-only BPE vocabulary and complete sequence tensor package", + "topology-r3 parent/pair authority and train-only null", + "repaired no-RT MS roles/tokens and train-only null", + "final static graph materializer plus GNN/RVQ/codebooks/tokens and train-only null", + "multimodal dataset/planner/masker/sampler manifests", + "all enabled-objective null scales and validation selection ledger", + "A000, A111, and every other paper-facing A5 factorial pretraining run", + "downstream strict/K20 evaluators bound to the resulting frozen A5 exports", + ], + "reuse_adjudication": { + "historical_a000_a111_reusable_for_strict_primary_claim": False, + "reason": "59 newly excluded parents influenced fitting and fit-only transforms; 14 influenced development selection; downstream outcomes cannot repair upstream exposure", + "exploratory_alternative": "only if strict is demoted from selected primary and exposure is explicitly reported; contradicted by the bound endpoint adjudication", + }, + "input_artifacts": input_receipts, + "output_artifacts": {}, + "validation_checks": { + "all_current_strict3_primary_nonfit_wurcs_in_successor": class_primary <= set(successor_anchors), + "all_current_strict3_secondary_nonfit_wurcs_in_successor": class_secondary <= set(successor_anchors), + "all_current_k20_nonfit_wurcs_in_successor": set(k20) <= set(successor_anchors), + "all_current_strict_affinose_nonfit_wurcs_in_successor": set(strict) <= set(successor_anchors), + "predecessor_graph_identity_replayed_exactly": True, + "new_graph_candidates_exact_isomorphism_verified": True, + "all_new_exact_or_known_graph_parents_excluded": len(newly_excluded) == 73, + "no_unaffected_80_20_parent_role_changed": True, + "no_retained_group_crossing": not any(crossings.values()), + "no_downstream_targets_or_model_outputs_read": True, + "training_fail_closed": True, + }, + } + summary["output_artifacts"] = { + name: output_identity(paths[name]) for name in output_names[:6] + } + paths[output_names[6]].write_bytes(json_bytes(summary)) + receipt = { + "schema": "bertose_a5_non_iar_later_role_successor_receipt_v1", + "status": "PASS_AUDIT_ONLY_FAIL_CLOSED", + "training_authorized": False, + "summary": output_identity(paths[output_names[6]]), + "payloads": {name: output_identity(paths[name]) for name in output_names[:6]}, + "checks": summary["validation_checks"], + "determinism_contract": { + "gzip_mtime": 0, + "json_keys_sorted": True, + "absolute_output_paths_embedded": False, + "input_hashes_rechecked_after_build": True, + }, + } + for path, expected in EXPECTED_SHA256.items(): + require(sha256_file(path) == expected, f"input changed during build: {path}") + paths[output_names[7]].write_bytes(json_bytes(receipt)) + print(json.dumps({"summary": output_identity(paths[output_names[6]]), "receipt": output_identity(paths[output_names[7]]), "role_counts": dict(role_counts)}, indent=2, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py b/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py new file mode 100644 index 0000000000000000000000000000000000000000..7d8d6426737407fb3268145ea942ca8501b2d041 --- /dev/null +++ b/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py @@ -0,0 +1,339 @@ +#!/usr/bin/env python3 +"""Reassign the frozen non-IAR A5 authority to a grouped 80/20 split.""" + +from __future__ import annotations + +import argparse +import csv +import gzip +import hashlib +import io +import json +from collections import Counter, defaultdict +from contextlib import contextmanager +from pathlib import Path +from typing import Iterator + + +WRITING_ROOT = Path(__file__).resolve().parents[3] +MM = WRITING_ROOT / "review/multimodal" +SOURCE = MM / "outputs/p1_non_iar_pretraining_partition_20260711" +SOURCE_PARENT = SOURCE / "review_p1_non_iar_pretraining_parent_partition.tsv.gz" +SOURCE_OBJECTIVE = SOURCE / "review_p1_non_iar_pretraining_objective_partition.tsv.gz" +FINGERPRINTS = ( + MM + / "outputs/p0_p1_freeze_20260710/" + "review_p1_wurcs_motif_fingerprint_manifest.tsv.gz" +) +IDENTITY = ( + MM + / "outputs/p0_p1_freeze_20260710/" + "review_p1_parent_identity_manifest.tsv.gz" +) +DEFAULT_OUTPUT = MM / "outputs/p1_non_iar_pretraining_partition_80_20_20260712" +SOURCE_PARENT_SHA256 = "1bcbd764f0970e664547692a9bb2c39442a9faecd01faa2def4dff7303687fcc" +SOURCE_OBJECTIVE_SHA256 = "5bf36799bfa96f5a275782d046570bcec54932b0d7aee04693080151e6b1710c" +TRAIN_FRACTION = 0.80 +SPLIT_SALT = "BERTose-local-split-audit-v2-20260712|block|0.80" +ACTIVE_ROLES = ("pretraining_train", "pretraining_development") +OBJECTIVES = ("sequence", "topology", "ms", "static", "md") + + +def sha256_file(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for chunk in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def stable_hash(value: str) -> str: + return hashlib.sha256(value.encode("utf-8")).hexdigest() + + +def as_bool(value: object) -> bool: + return str(value).strip().lower() in {"1", "true", "yes"} + + +def read_tsv(path: Path) -> tuple[list[str], list[dict[str, str]]]: + with gzip.open(path, "rt", newline="", encoding="utf-8") as handle: + reader = csv.DictReader(handle, delimiter="\t") + return list(reader.fieldnames or []), list(reader) + + +@contextmanager +def deterministic_tsv(path: Path, fields: list[str]) -> Iterator[csv.DictWriter]: + with path.open("wb") as raw: + with gzip.GzipFile(filename="", mode="wb", fileobj=raw, mtime=0) as zipped: + with io.TextIOWrapper(zipped, encoding="utf-8", newline="") as text: + writer = csv.DictWriter( + text, + fieldnames=fields, + delimiter="\t", + lineterminator="\n", + ) + writer.writeheader() + yield writer + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--source-parent", type=Path, default=SOURCE_PARENT) + parser.add_argument("--source-objective", type=Path, default=SOURCE_OBJECTIVE) + parser.add_argument("--fingerprints", type=Path, default=FINGERPRINTS) + parser.add_argument("--identity", type=Path, default=IDENTITY) + parser.add_argument("--output-directory", type=Path, default=DEFAULT_OUTPUT) + args = parser.parse_args() + + if sha256_file(args.source_parent) != SOURCE_PARENT_SHA256: + raise RuntimeError("source A5 parent authority changed") + if sha256_file(args.source_objective) != SOURCE_OBJECTIVE_SHA256: + raise RuntimeError("source A5 objective authority changed") + + output_parent = ( + args.output_directory / "review_p1_non_iar_pretraining_parent_partition.tsv.gz" + ) + output_objective = ( + args.output_directory + / "review_p1_non_iar_pretraining_objective_partition.tsv.gz" + ) + output_summary = ( + args.output_directory / "review_p1_non_iar_partition_summary.json" + ) + outputs = (output_parent, output_objective, output_summary) + if any(path.exists() for path in outputs): + raise FileExistsError( + f"refusing to overwrite existing 80/20 outputs: " + f"{[str(path) for path in outputs if path.exists()]}" + ) + + parent_fields, parent_rows = read_tsv(args.source_parent) + objective_fields, objective_rows = read_tsv(args.source_objective) + if len(parent_rows) != 281208 or len(objective_rows) != 281208 * 5: + raise RuntimeError("source non-IAR authority has unexpected row counts") + parents = {row["parent_glycorpus_id"]: row for row in parent_rows} + if len(parents) != len(parent_rows): + raise RuntimeError("source parent authority repeats a parent") + + retained_by_block: dict[str, list[str]] = defaultdict(list) + for parent, row in parents.items(): + if not as_bool(row["a5_excluded"]): + retained_by_block[row["precluster_union_block_id"]].append(parent) + retained_count = sum(map(len, retained_by_block.values())) + excluded_count = len(parent_rows) - retained_count + if (retained_count, excluded_count) != (277448, 3760): + raise RuntimeError("source retained/excluded counts changed") + + ordered_blocks = sorted( + retained_by_block, + key=lambda block: stable_hash(f"{SPLIT_SALT}|{block}"), + ) + target_train_rows = TRAIN_FRACTION * retained_count + cumulative = 0 + role_by_block: dict[str, str] = {} + for block in ordered_blocks: + block_size = len(retained_by_block[block]) + midpoint = cumulative + block_size / 2 + role_by_block[block] = ( + "pretraining_train" + if midpoint < target_train_rows + else "pretraining_development" + ) + cumulative += block_size + + role_by_parent = { + parent: ( + "excluded_exact_or_verified_graph_identity" + if as_bool(row["a5_excluded"]) + else role_by_block[row["precluster_union_block_id"]] + ) + for parent, row in parents.items() + } + + parent_allowed_changes = { + "pretraining_partition", + "learned_preprocessing_fit_contributor", + "model_pretraining_contributor", + } + new_parent_rows: list[dict[str, str]] = [] + for source in parent_rows: + row = dict(source) + role = role_by_parent[source["parent_glycorpus_id"]] + is_train = role == "pretraining_train" + row["pretraining_partition"] = role + row["learned_preprocessing_fit_contributor"] = str(is_train) + row["model_pretraining_contributor"] = str(is_train) + changed = {field for field in row if row[field] != source[field]} + if not changed <= parent_allowed_changes: + raise RuntimeError(f"80/20 repartition changed parent authority fields: {changed}") + new_parent_rows.append(row) + + objective_allowed_changes = { + "pretraining_partition", + "objective_train_contributor", + "objective_development_contributor", + } + new_objective_rows: list[dict[str, str]] = [] + objective_counts: Counter[tuple[str, str]] = Counter() + flags_by_parent: dict[str, dict[str, bool]] = defaultdict(dict) + for source in objective_rows: + row = dict(source) + parent = source["parent_glycorpus_id"] + objective = source["objective"] + role = role_by_parent[parent] + eligible = as_bool(source["eligible_before_partition"]) + row["pretraining_partition"] = role + row["objective_train_contributor"] = str( + eligible and role == "pretraining_train" + ) + row["objective_development_contributor"] = str( + eligible and role == "pretraining_development" + ) + changed = {field for field in row if row[field] != source[field]} + if not changed <= objective_allowed_changes: + raise RuntimeError( + f"80/20 repartition changed objective authority fields: {changed}" + ) + if role in ACTIVE_ROLES and eligible: + objective_counts[(role, objective)] += 1 + flags_by_parent[parent][objective] = eligible + new_objective_rows.append(row) + + if any(set(flags) != set(OBJECTIVES) for flags in flags_by_parent.values()): + raise RuntimeError("objective authority is incomplete for at least one parent") + + raw_feature_by_parent: dict[str, str] = {} + with gzip.open(args.fingerprints, "rt", newline="", encoding="utf-8") as handle: + for row in csv.DictReader(handle, delimiter="\t"): + parent = row["parent_glycorpus_id"] + if parent in parents and row.get("graph_record_role") == "sequence_eligible_parent": + raw_feature_by_parent[parent] = row["raw_feature_sha256"] + family_by_parent: dict[str, str] = {} + with gzip.open(args.identity, "rt", newline="", encoding="utf-8") as handle: + for row in csv.DictReader(handle, delimiter="\t"): + parent = row["parent_glycorpus_id"] + if parent in parents: + family_by_parent[parent] = row["registry_family_id"] + if set(raw_feature_by_parent) != set(parents) or set(family_by_parent) != set(parents): + raise RuntimeError("grouping authorities do not cover the parent authority") + + crossings: dict[str, int] = {} + for name, grouping in ( + ("precluster_union_block_id", {p: parents[p]["precluster_union_block_id"] for p in parents}), + ("raw_feature_sha256", raw_feature_by_parent), + ("registry_family_id", family_by_parent), + ): + roles_by_group: dict[str, set[str]] = defaultdict(set) + for parent, group in grouping.items(): + role = role_by_parent[parent] + if role in ACTIVE_ROLES: + roles_by_group[group].add(role) + crossings[name] = sum(len(roles) > 1 for roles in roles_by_group.values()) + if any(crossings.values()): + raise RuntimeError(f"80/20 grouping authority crosses roles: {crossings}") + + intersection_counts: Counter[tuple[str, str]] = Counter() + for parent, flags in flags_by_parent.items(): + role = role_by_parent[parent] + if role not in ACTIVE_ROLES: + continue + for name, enabled in { + "topology_ms": flags["topology"] and flags["ms"], + "topology_static": flags["topology"] and flags["static"], + "ms_static": flags["ms"] and flags["static"], + "topology_ms_static": flags["topology"] and flags["ms"] and flags["static"], + "topology_ms_static_md": flags["topology"] and flags["ms"] and flags["static"] and flags["md"], + }.items(): + intersection_counts[(role, name)] += int(enabled) + + args.output_directory.mkdir(parents=True, exist_ok=True) + with deterministic_tsv(output_parent, parent_fields) as writer: + writer.writerows(new_parent_rows) + with deterministic_tsv(output_objective, objective_fields) as writer: + writer.writerows(new_objective_rows) + + role_counts = Counter(role_by_parent.values()) + summary = { + "schema": "bertose_p1_non_iar_pretraining_partition_v2", + "status": "FROZEN_REVIEW_CANDIDATE_NOT_TRAINING_AUTHORIZATION", + "training_authorized": False, + "official_submitted_artifacts_modified": False, + "change_scope": "role_only_repartition_from_frozen_non_iar_authority", + "split_method": "deterministic_whole_precluster_block_weighted_midpoint", + "split_salt": SPLIT_SALT, + "target_train_fraction": TRAIN_FRACTION, + "realized_train_fraction": role_counts["pretraining_train"] / retained_count, + "parent_role_counts": dict(sorted(role_counts.items())), + "retained_block_count": len(retained_by_block), + "largest_retained_block": max(map(len, retained_by_block.values())), + "objective_partitions": { + role: { + objective: objective_counts[(role, objective)] + for objective in OBJECTIVES + } + for role in ACTIVE_ROLES + }, + "intersection_partitions": { + role: { + name: intersection_counts[(role, name)] + for name in ( + "topology_ms", + "topology_static", + "ms_static", + "topology_ms_static", + "topology_ms_static_md", + ) + } + for role in ACTIVE_ROLES + }, + "group_crossings": crossings, + "validation_checks": { + "all_281208_parent_rows_preserved": len(new_parent_rows) == 281208, + "all_1406040_objective_rows_preserved": len(new_objective_rows) == 1406040, + "only_parent_role_fields_changed": True, + "only_objective_role_fields_changed": True, + "no_declared_group_crosses_train_development": not any(crossings.values()), + "no_downstream_outcome_used": True, + "submitted_artifacts_left_unchanged": True, + }, + "inputs": { + "source_parent_partition": { + "path": str(args.source_parent), + "sha256": sha256_file(args.source_parent), + }, + "source_objective_partition": { + "path": str(args.source_objective), + "sha256": sha256_file(args.source_objective), + }, + "fingerprints": { + "path": str(args.fingerprints), + "sha256": sha256_file(args.fingerprints), + }, + "parent_identity": { + "path": str(args.identity), + "sha256": sha256_file(args.identity), + }, + "implementation": { + "path": str(Path(__file__)), + "sha256": sha256_file(Path(__file__)), + }, + }, + "outputs": { + "parent_partition": { + "path": str(output_parent), + "sha256": sha256_file(output_parent), + }, + "objective_partition": { + "path": str(output_objective), + "sha256": sha256_file(output_objective), + }, + }, + } + output_summary.write_text( + json.dumps(summary, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + print(json.dumps(summary, indent=2, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/tests/test_build_review_a5_non_iar_later_role_successor_20260720.py b/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/tests/test_build_review_a5_non_iar_later_role_successor_20260720.py new file mode 100644 index 0000000000000000000000000000000000000000..b4d0a473634146ad2c17f27aaadc721a5aceb487 --- /dev/null +++ b/releases/2026-10-02/benchmark_exclusion/writing/review/multimodal/tests/test_build_review_a5_non_iar_later_role_successor_20260720.py @@ -0,0 +1,203 @@ +from __future__ import annotations + +import csv +import gzip +import hashlib +import json +import os +import unittest +from collections import Counter +from pathlib import Path + + +WRITING_ROOT = Path(__file__).resolve().parents[3] +OUTPUT = Path( + os.environ.get( + "REVIEW_A5_NON_IAR_SUCCESSOR_OUTPUT", + str( + WRITING_ROOT + / "review/multimodal/outputs/" + "review_a5_non_iar_later_role_successor_20260720_r1" + ), + ) +) +PREDECESSOR = ( + WRITING_ROOT + / "review/multimodal/outputs/" + "p1_non_iar_pretraining_partition_80_20_20260712/" + "review_p1_non_iar_pretraining_parent_partition.tsv.gz" +) + + +def sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for chunk in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def read_tsv(path: Path) -> list[dict[str, str]]: + with gzip.open(path, "rt", newline="", encoding="utf-8") as handle: + return list(csv.DictReader(handle, delimiter="\t")) + + +class LaterRoleSuccessorTests(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + cls.summary = json.loads( + (OUTPUT / "review_a5_non_iar_successor_summary.json").read_text( + encoding="utf-8" + ) + ) + cls.receipt = json.loads( + (OUTPUT / "review_a5_non_iar_successor_receipt.json").read_text( + encoding="utf-8" + ) + ) + + def test_01_fail_closed(self) -> None: + self.assertFalse(self.summary["training_authorized"]) + self.assertFalse(self.summary["scientific_launch_authorized"]) + self.assertEqual(self.receipt["status"], "PASS_AUDIT_ONLY_FAIL_CLOSED") + self.assertFalse(self.receipt["training_authorized"]) + + def test_02_receipt_reopens_every_payload(self) -> None: + for item in [self.receipt["summary"], *self.receipt["payloads"].values()]: + path = OUTPUT / item["name"] + self.assertEqual(path.stat().st_size, item["bytes"]) + self.assertEqual(sha256(path), item["sha256"]) + + def test_03_all_outputs_are_review_prefixed_and_deterministic_gzip(self) -> None: + for path in OUTPUT.iterdir(): + self.assertTrue(path.name.startswith("review_")) + if path.suffix == ".gz": + header = path.read_bytes()[:10] + self.assertEqual(header[:2], b"\x1f\x8b") + self.assertEqual(header[4:8], b"\x00\x00\x00\x00") + + def test_04_anchor_union(self) -> None: + rows = read_tsv(OUTPUT / "review_a5_non_iar_successor_anchor_manifest.tsv.gz") + self.assertEqual(len(rows), 4625) + self.assertEqual(len({row["canonical_wurcs"] for row in rows}), 4625) + coverage = self.summary["current_nonfit_coverage"] + self.assertEqual(coverage["strict3_primary_missing_from_predecessor_4532"], 0) + self.assertEqual(coverage["k20_missing_from_predecessor_4532"], 0) + self.assertEqual(coverage["strict_affinose_missing_from_predecessor"], 93) + self.assertTrue( + self.summary["validation_checks"][ + "all_current_strict_affinose_nonfit_wurcs_in_successor" + ] + ) + + def test_05_parent_exact_and_known_graph_counts(self) -> None: + rows = read_tsv( + OUTPUT + / "review_a5_non_iar_successor_exact_known_graph_parent_manifest.tsv.gz" + ) + self.assertEqual(len(rows), 281208) + self.assertEqual(len({row["parent_glycorpus_id"] for row in rows}), 281208) + exact = sum(row["exact_wurcs_anchor"] == "True" for row in rows) + graph = sum(int(row["graph_identity_anchor_count"]) > 0 for row in rows) + graph_only = sum( + row["exact_wurcs_anchor"] == "False" + and int(row["graph_identity_anchor_count"]) > 0 + for row in rows + ) + excluded = sum(row["a5_excluded"] == "True" for row in rows) + self.assertEqual((exact, graph, graph_only, excluded), (3673, 3587, 160, 3833)) + + def test_06_only_newly_matched_parents_change_role(self) -> None: + old = {row["parent_glycorpus_id"]: row for row in read_tsv(PREDECESSOR)} + new = { + row["parent_glycorpus_id"]: row + for row in read_tsv( + OUTPUT / "review_a5_non_iar_successor_parent_partition.tsv.gz" + ) + } + self.assertEqual(set(old), set(new)) + transitions = Counter( + (old[parent]["pretraining_partition"], new[parent]["pretraining_partition"]) + for parent in old + ) + self.assertEqual( + transitions[( + "pretraining_train", + "excluded_exact_or_verified_graph_identity", + )], + 59, + ) + self.assertEqual( + transitions[( + "pretraining_development", + "excluded_exact_or_verified_graph_identity", + )], + 14, + ) + self.assertEqual( + sum(count for (before, after), count in transitions.items() if before != after), + 73, + ) + + def test_07_successor_role_counts_and_group_guards(self) -> None: + expected = { + "excluded_exact_or_verified_graph_identity": 3833, + "pretraining_development": 55476, + "pretraining_train": 221899, + } + self.assertEqual(self.summary["preserved_80_20_partition"]["parent_role_counts"], expected) + self.assertEqual( + self.summary["preserved_80_20_partition"]["retained_group_crossings"], + { + "precluster_union_block_id": 0, + "raw_feature_sha256": 0, + "registry_family_id": 0, + }, + ) + + def test_08_gap_ledger(self) -> None: + rows = read_tsv(OUTPUT / "review_a5_non_iar_successor_later_role_gap.tsv.gz") + self.assertEqual(len(rows), 93) + self.assertEqual(Counter(row["strict_component_role"] for row in rows), {"validation": 62, "test": 31}) + self.assertEqual( + Counter(row["sequence_v3_pretraining_partition"] for row in rows), + {"pretraining_train": 59, "pretraining_development": 14, "absent": 20}, + ) + self.assertEqual( + Counter(row["fingerprint_tier"] for row in rows), + { + "fixed_tree_exact_linkage": 81, + "composition_only": 6, + "fixed_tree_unknown_linkage": 3, + "partial_or_ambiguous_graph": 3, + }, + ) + self.assertTrue(all(row["known_graph_only_alias_parent_count"] == "0" for row in rows)) + + def test_09_changed_parent_ledger(self) -> None: + rows = read_tsv(OUTPUT / "review_a5_non_iar_successor_changed_parent_roles.tsv.gz") + self.assertEqual(len(rows), 73) + self.assertTrue( + all( + row["successor_pretraining_partition"] + == "excluded_exact_or_verified_graph_identity" + for row in rows + ) + ) + + def test_10_objective_counts(self) -> None: + rows = read_tsv(OUTPUT / "review_a5_non_iar_successor_objective_partition.tsv.gz") + self.assertEqual(len(rows), 281208 * 5) + observed: Counter[tuple[str, str]] = Counter() + for row in rows: + if row["eligible_before_partition"] == "True" and row[ + "pretraining_partition" + ] in {"pretraining_train", "pretraining_development"}: + observed[(row["pretraining_partition"], row["objective"])] += 1 + for role, values in self.summary["base_objective_successor_counts"].items(): + for objective, count in values.items(): + self.assertEqual(observed[(role, objective)], count) + + +if __name__ == "__main__": + unittest.main() diff --git a/releases/2026-10-02/bertose.py b/releases/2026-10-02/bertose.py new file mode 100644 index 0000000000000000000000000000000000000000..991533b6e0afa3557ae0091fb2f1ff58cb15b047 --- /dev/null +++ b/releases/2026-10-02/bertose.py @@ -0,0 +1,132 @@ +"""Portable loading of the unchanged BERTose sequence encoder and tokenizer. + +This is a release adapter, not a new model implementation. The encoder class, +embedding/layer implementations and tokenizer are imported from preserved source. +""" +from pathlib import Path +import hashlib +import importlib.util +import json +import sys + +import torch + +ROOT = Path(__file__).resolve().parent +RUNTIME = ROOT / "bertose_source/writing/review/multimodal/runtime" +TOKENIZER_DIR = ROOT / "bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" + + +def sha256_file(path): + digest = hashlib.sha256() + with Path(path).open("rb") as handle: + for block in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + +def _module(name, path): + if name in sys.modules: + return sys.modules[name] + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + spec.loader.exec_module(module) + return module + + +def load_tokenizer(): + """Load the 2,114-token vocabulary and its frozen tree-channel tokenizer.""" + vocabulary = TOKENIZER_DIR / "review_bpe_vocabulary.json" + manifest = json.loads((ROOT / "provenance/sequence_variants.json").read_text()) + if sha256_file(vocabulary) != manifest["vocabulary_sha256"]: + raise ValueError("Vocabulary differs from the released model vocabulary") + shim = _module("_bertose_tokenizer_shim", ROOT / "affinose/a5_tokenizer_shim.py") + module = shim.install()["sequence_tree_runtime"] + return module.ReviewA5WURCSBPETokenizerV3(vocabulary) + + +def tokenize(wurcs, tokenizer=None): + """Encode WURCS 2.0 with the training envelope; reject overlength inputs. + + Unknown characters remain [UNK], as in the frozen tokenizer. The returned + diagnostics expose their number and whether exact tree channels are available. + """ + if not isinstance(wurcs, str) or not wurcs.startswith("WURCS=2.0/"): + raise ValueError("Provide a WURCS 2.0 string, not an IUPAC name or sequence") + tokenizer = tokenizer or load_tokenizer() + units = tokenizer.pre_tokenizer.pre_tokenize(wurcs) + length = sum(1 if unit["type"] == "special" else len(tokenizer.apply_bpe(unit["text"])) for unit in units) + if length > 256: + raise ValueError(f"Input has {length} tokens; the trained position limit is 256. No truncation was applied.") + result = tokenizer.tokenize_sequence(wurcs, max_length=256) + result["unknown_token_count"] = sum(i == tokenizer.token_to_id["[UNK]"] for i in result["token_ids"]) + return result + + +def load_encoder(checkpoint, variant="3", device="cpu"): + """Strictly load a pinned sequence export using the original 209 state keys. + + Returns (encoder, metadata). These exports have no task head or MLM head. + """ + manifest = json.loads((ROOT / "provenance/sequence_variants.json").read_text()) + variant = str(variant) + if variant in {"1", "2", "3", "4", "5"}: + variant = "WA" + variant + record = next((x for x in manifest["variants"] if x["variant"] == variant), None) + if record is None: + raise ValueError("variant must be 1, 2, 3, 4 or 5 (legacy WA1-WA5 aliases are also accepted)") + checkpoint = Path(checkpoint) + if checkpoint.stat().st_size != record["bytes"] or sha256_file(checkpoint) != record["sha256"]: + raise ValueError("Checkpoint bytes do not match the selected variant") + payload = torch.load(checkpoint, map_location="cpu", weights_only=True) + if (payload.get("schema") != "bertose_review_a5_native_md_on_sequence_export_20260808_r1" + or payload.get("cell") != "A1111" or payload.get("upstream_seed") != 42 + or payload.get("selected_epoch") != record["selected_epoch"]): + raise ValueError("Unexpected sequence-export identity") + state = payload["model_state"] + checkpoint_module = _module("_bertose_exact_checkpoint", ROOT / "executed/downstream/review_a5_native_checkpoint.py") + checkpoint_module.validate_encoder_schema_fingerprint(state) + native = _module("_bertose_native_r4", RUNTIME / "a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_composite_r4.py") + config = native.NativeEightConfig(cell_id="A111", seq_vocab_size=2114) + # R5 inherits these exact R4 sequence modules. Allocate on meta so there is + # no random-initialization pass and no allocation of unused modality heads. + with torch.device("meta"): + embeddings = native.ExactSequenceEmbeddings(config) + layers = torch.nn.ModuleList([ + native.EncoderLayer(config.seq_hidden_size, config.seq_num_heads, + config.hidden_dropout_prob, config.attention_dropout_prob, + config.layer_norm_eps) + for _ in range(config.seq_num_layers) + ]) + encoder = checkpoint_module.ExactNativeSequenceEncoder(embeddings, layers) + encoder.load_state_dict(state, strict=True, assign=True) + encoder.to(device).eval().requires_grad_(False) + metadata = dict(record, state_entries=len(state), vocabulary_sha256=manifest["vocabulary_sha256"], + output="sequence-token states before any task-specific pooling/head") + return encoder, metadata + + +@torch.inference_mode() +def embed(wurcs_strings, encoder, tokenizer=None, pooling="first"): + """Return [N,768] embeddings and tokenizer diagnostics. + + `first` uses the START envelope token. `mean` averages all attended tokens, + including the START and END envelope. Neither is a fitted benchmark head. + """ + if not wurcs_strings or pooling not in {"first", "mean"}: + raise ValueError("Supply at least one WURCS string and pooling first or mean") + tokenizer = tokenizer or load_tokenizer() + records = [tokenize(text, tokenizer) for text in wurcs_strings] + device = next(encoder.parameters()).device + tensors = {key: torch.tensor([r[key] for r in records], dtype=torch.long, device=device) + for key in ("token_ids", "attention_mask", "branch_depths", "linkage_types")} + hidden = encoder(**tensors) + if pooling == "first": + vectors = hidden[:, 0] + else: + mask = tensors["attention_mask"].unsqueeze(-1) + vectors = (hidden * mask).sum(1) / mask.sum(1) + if not torch.isfinite(vectors).all(): + raise ValueError("Encoder returned nonfinite embeddings") + return vectors.cpu().numpy(), [{k: r[k] for k in ( + "tree_channels_valid", "tree_channel_failure_reason", "unknown_token_count")} for r in records] diff --git a/releases/2026-10-02/bertose_source/bert_training_v4/downstream_tasks/utils/wurcs_bpe_tokenizer.py b/releases/2026-10-02/bertose_source/bert_training_v4/downstream_tasks/utils/wurcs_bpe_tokenizer.py new file mode 100644 index 0000000000000000000000000000000000000000..145cb4fd434978463411c17f141cf38bf15a4bb4 --- /dev/null +++ b/releases/2026-10-02/bertose_source/bert_training_v4/downstream_tasks/utils/wurcs_bpe_tokenizer.py @@ -0,0 +1,740 @@ +#!/usr/bin/env python3 +""" +WURCS-BPE Tokenizer + +A hybrid tokenizer that learns semantic subwords from WURCS while preserving +the ability to handle rare/novel glycan structures character-by-character. + +Key features: +1. Pre-tokenization: Split WURCS into semantic units (residues, linkages, mods) +2. BPE: Learn subword merges from corpus +3. Character fallback: Handle novel structures +4. Tree embeddings: Preserve branch_depth and linkage_type per token + +Usage: + # Train BPE on corpus + tokenizer = WURCSBPETokenizer.train_from_corpus( + wurcs_strings, + num_merges=500, + output_path="bpe_vocabulary.json" + ) + + # Tokenize + result = tokenizer.tokenize(wurcs_string) +""" + +import json +import re +from collections import Counter, defaultdict +from pathlib import Path +from typing import Dict, List, Optional, Tuple, Set +import pickle + + +class WURCSPreTokenizer: + """ + Pre-tokenize WURCS into semantic units before BPE. + + WURCS format: WURCS=2.0/count/[residues]/indices/linkages + + We split into: + - Residues: [a2122h-1b_1-5_2*NCC/3=O] -> one unit per [] + - Linkages: a4-b1 -> one unit per linkage + - Special markers: [BRANCH_OPEN], [BRANCH_CLOSE], etc. + """ + + # Residue patterns for common monosaccharides + RESIDUE_PATTERN = re.compile(r'\[([^\]]+)\]') + LINKAGE_PATTERN = re.compile(r'([a-z])(\d+|\?)-([a-z])(\d+|\?)') + + def __init__(self): + self.special_tokens = { + '[PAD]': 0, + '[UNK]': 1, + '[START]': 2, + '[END]': 3, + '[MASK]': 4, + '[BRANCH_OPEN]': 5, + '[BRANCH_CLOSE]': 6, + '[LINK]': 7, + '[MOD]': 8, + '[RESIDUE_ERROR]': 9, + } + + def pre_tokenize(self, wurcs: str) -> List[Dict]: + """ + Pre-tokenize WURCS into semantic units. + + Returns list of dicts with: + - text: The unit text + - type: 'special', 'residue', 'linkage', 'mod', 'index' + - residue_id: Which residue this belongs to (-1 for special, -2 for linkage) + - branch_depth: Tree depth (computed later) + """ + units = [] + + # Add start token + units.append({ + 'text': '[START]', + 'type': 'special', + 'residue_id': -1, + 'branch_depth': 0, + 'linkage_type': 0, + }) + + # Parse WURCS sections + if not wurcs.startswith('WURCS='): + units.append({'text': '[RESIDUE_ERROR]', 'type': 'special', 'residue_id': -1, 'branch_depth': 0, 'linkage_type': 0}) + units.append({'text': '[END]', 'type': 'special', 'residue_id': -1, 'branch_depth': 0, 'linkage_type': 0}) + return units + + try: + parts = self._split_wurcs_sections(wurcs) + if len(parts) < 4: + return [{'text': '[ERROR]', 'type': 'special', 'residue_id': -1, 'branch_depth': 0, 'linkage_type': 0}] + + # parts: WURCS=2.0/3,3,2/[a2122h-1b_1-5][a2122h-1a_1-5][a1122h-1b_1-5]/1-2-3-1/a4-b1_b3-c1_c4-d1 + # section 2: residue definitions + # section 3: indices + # section 4: linkages (optional) + + version = parts[0] # WURCS=2.0 + counts = parts[1] # residue_count,node_count,link_count + residue_defs = parts[2] # [res1][res2]... + indices = parts[3] # 1-2-3-1 + linkages = parts[4] if len(parts) > 4 else "" # a4-b1_b3-c1 + + # Parse residue definitions + residue_list = self.RESIDUE_PATTERN.findall(residue_defs) + + # Parse linkages to compute branch structure + linkage_list = linkages.split('_') if linkages else [] + branch_points, residue_depths, linkage_types_map, adj = self._analyze_tree_structure(linkage_list, num_residues=len(residue_list)) + + # Compute distance matrix and cache it based on the linkage string (structure) + # This is the most expensive part, so we cache it + if not hasattr(self, '_dist_cache'): self._dist_cache = {} + if linkages not in self._dist_cache: + self._dist_cache[linkages] = self._compute_distance_matrix(adj, len(residue_list)) + dist_matrix_raw = self._dist_cache[linkages] + + # Parse indices to map positions to residue definitions + index_list = indices.split('-') if indices else [] + + # Process each residue instance + residue_letter = ord('a') + for idx, res_idx in enumerate(index_list): + current_residue_id = idx + res_letter = chr(residue_letter + idx) + + # Check if this is a branch point - add branch marker before + if res_letter in branch_points and branch_points[res_letter] > 0: + for _ in range(branch_points[res_letter]): + units.append({ + 'text': '[BRANCH_OPEN]', + 'type': 'special', + 'residue_id': -1, + 'branch_depth': residue_depths.get(res_letter, 0), + 'linkage_type': 0, + }) + + # Get residue definition + try: + res_def_idx = int(res_idx) - 1 # 1-indexed to 0-indexed + res_def = residue_list[res_def_idx] if res_def_idx < len(residue_list) else "" + except (ValueError, IndexError): + res_def = "" + + # Split residue into base and modifications + res_parts = res_def.split('_') + base = res_parts[0] if res_parts else res_def + mods = res_parts[1:] if len(res_parts) > 1 else [] + + # Add residue base as a single unit + depth = residue_depths.get(res_letter, 0) + units.append({ + 'text': base, + 'type': 'residue', + 'residue_id': current_residue_id, + 'branch_depth': depth, + 'linkage_type': 0, + }) + + # Add modifications + for mod in mods: + units.append({ + 'text': mod, + 'type': 'mod', + 'residue_id': current_residue_id, + 'branch_depth': depth, + 'linkage_type': 0, + }) + + # Store distance matrix in units for easy access in tokenizer + if units: + # Find first residue unit or just use START + units[0]['distance_matrix'] = dist_matrix_raw + + # Add linkages + for link in linkage_list: + if not link: + continue + # Parse linkage type + lt = self._parse_linkage_type(link) + units.append({ + 'text': link, + 'type': 'linkage', + 'residue_id': -2, + 'branch_depth': 0, + 'linkage_type': lt, + }) + except Exception: + # Fallback for truly broken WURCS + pass + + # Add end token + units.append({ + 'text': '[END]', + 'type': 'special', + 'residue_id': -1, + 'branch_depth': 0, + 'linkage_type': 0, + }) + + return units + + def _split_wurcs_sections(self, wurcs: str) -> List[str]: + """Split WURCS string into sections, handling nested brackets.""" + # Remove WURCS= prefix + if wurcs.startswith('WURCS='): + wurcs = wurcs[6:] + + sections = [] + current = "" + bracket_depth = 0 + + for char in wurcs: + if char == '[': + bracket_depth += 1 + current += char + elif char == ']': + bracket_depth -= 1 + current += char + elif char == '/' and bracket_depth == 0: + sections.append(current) + current = "" + else: + current += char + + if current: + sections.append(current) + + return sections + + def _analyze_tree_structure(self, linkages: List[str], num_residues: int) -> Tuple[Dict, Dict, Dict, Dict]: + """Analyze linkages to compute branch points and residue depths.""" + branch_points = defaultdict(int) # residue -> number of children + children = defaultdict(list) + all_residues = set() + linkage_types = {} + + for link in linkages: + match = self.LINKAGE_PATTERN.match(link) + if match: + from_res, from_pos, to_res, to_pos = match.groups() + children[from_res].append(to_res) + all_residues.add(from_res) + all_residues.add(to_res) + + # Store linkage type + linkage_types[link] = self._parse_linkage_type(link) + + # Build adjacency list for BFS + adj = defaultdict(list) + for link in linkages: + match = self.LINKAGE_PATTERN.match(link) + if match: + u = ord(match.group(1)) - ord('a') + v = ord(match.group(3)) - ord('a') + if 0 <= u < num_residues and 0 <= v < num_residues: + adj[u].append(v) + adj[v].append(u) + + # Find branch points (residues with >1 child) + for res, kids in children.items(): + if len(kids) > 1: + branch_points[res] = len(kids) - 1 # Number of extra branches + + # Compute depths using BFS + # Find root (residue with no parent) + child_set = set() + for kids in children.values(): + child_set.update(kids) + roots = all_residues - child_set + root = min(roots) if roots else 'a' + + depths = {root: 0} + queue = [root] + while queue: + current = queue.pop(0) + for child in children.get(current, []): + if child not in depths: + depths[child] = depths[current] + 1 + queue.append(child) + + return branch_points, depths, linkage_types, adj + + def _compute_distance_matrix(self, adj: Dict[int, List[int]], num_residues: int) -> List[List[int]]: + """ + Compute shortest path distance (number of bonds) between all residue pairs using BFS. + """ + if num_residues == 0: + return [] + + dist_matrix = [[-1] * num_residues for _ in range(num_residues)] + + for i in range(num_residues): + dist_matrix[i][i] = 0 + queue = [(i, 0)] + visited = {i} + + while queue: + curr, d = queue.pop(0) + dist_matrix[i][curr] = d + + for neighbor in adj[curr]: + if neighbor not in visited: + visited.add(neighbor) + queue.append((neighbor, d + 1)) + + return dist_matrix + + def _compute_distance_matrix_OLD(self, linkages: List[str], num_residues: int) -> List[List[int]]: + """ + Compute shortest path distance (number of bonds) between all residue pairs. + Returns a symmetric N x N matrix where N is num_residues. + Values are integers (number of steps). 0 on diagonal. -1 if unreachable (shouldn't happen in single tree). + """ + if num_residues == 0: + return [] + + # Initialize adjacency list + adj = defaultdict(list) + for link in linkages: + match = self.LINKAGE_PATTERN.match(link) + if match: + # WURCS indices are 1-based letters (a=1, b=2...) + from_res_char, _, to_res_char, _ = match.groups() + # Convert char to 0-based index + u = ord(from_res_char) - ord('a') + v = ord(to_res_char) - ord('a') + + # Undirected graph for structural distance + if 0 <= u < num_residues and 0 <= v < num_residues: + adj[u].append(v) + adj[v].append(u) + + # Compute All-Pairs Shortest Path (BFS from each node is fine for small N) + # Glycans are small (N ~ 5-20 usually), so O(N^2) BFS is cheap. + dist_matrix = [[-1] * num_residues for _ in range(num_residues)] + + for i in range(num_residues): + dist_matrix[i][i] = 0 + queue = [(i, 0)] + visited = {i} + + while queue: + curr, d = queue.pop(0) + dist_matrix[i][curr] = d + + for neighbor in adj[curr]: + if neighbor not in visited: + visited.add(neighbor) + queue.append((neighbor, d + 1)) + + return dist_matrix + + def _parse_linkage_type(self, link: str) -> int: + """Parse linkage string to get type ID.""" + LINKAGE_TYPES = { + (1, 2): 0, (2, 1): 0, + (1, 3): 1, (3, 1): 1, + (1, 4): 2, (4, 1): 2, + (1, 6): 3, (6, 1): 3, + (2, 3): 4, (3, 2): 4, + (2, 6): 5, (6, 2): 5, + (3, 6): 6, (6, 3): 6, + } + + match = self.LINKAGE_PATTERN.match(link) + if match: + _, from_pos, _, to_pos = match.groups() + try: + pos_tuple = (int(from_pos), int(to_pos)) + return LINKAGE_TYPES.get(pos_tuple, 7) + except ValueError: + return 8 # Unknown + return 8 + + +class WURCSBPETokenizer: + """ + BPE tokenizer for WURCS with tree-aware embeddings. + """ + + def __init__(self, vocab_path: Optional[str] = None): + self.pre_tokenizer = WURCSPreTokenizer() + + # Special tokens (fixed) + self.special_tokens = self.pre_tokenizer.special_tokens + + # BPE vocabulary + self.token_to_id: Dict[str, int] = {} + self.id_to_token: Dict[int, str] = {} + self.merges: List[Tuple[str, str]] = [] + + if vocab_path: + self.load_vocab(vocab_path) + else: + # Initialize with special tokens only + self.token_to_id = dict(self.special_tokens) + self.id_to_token = {v: k for k, v in self.token_to_id.items()} + + @classmethod + def train_from_corpus( + cls, + wurcs_strings: List[str], + num_merges: int = 500, + output_path: Optional[str] = None, + min_frequency: int = 2, + max_token_length: Optional[int] = None, + ) -> 'WURCSBPETokenizer': + """ + Train BPE on a corpus of WURCS strings. + + Args: + wurcs_strings: List of WURCS strings + num_merges: Number of BPE merge operations + output_path: Optional path to save vocabulary + min_frequency: Minimum frequency for a token to be kept + max_token_length: Maximum length of a merged token (None = no limit) + + Returns: + Trained tokenizer + """ + tokenizer = cls() + pre_tok = WURCSPreTokenizer() + + print(f"Training BPE on {len(wurcs_strings)} WURCS strings...") + + # Step 1: Pre-tokenize all strings to get semantic units + all_units = [] + for wurcs in wurcs_strings: + units = pre_tok.pre_tokenize(wurcs) + for unit in units: + if unit['type'] != 'special': + all_units.append(unit['text']) + + # Step 2: Count unit frequencies + unit_counts = Counter(all_units) + print(f"Found {len(unit_counts)} unique units") + + # Step 3: Initialize vocabulary with characters from all units + char_vocab = set() + for unit in unit_counts: + for char in unit: + char_vocab.add(char) + + # Build initial vocab: special tokens + characters + vocab_id = len(tokenizer.special_tokens) + for char in sorted(char_vocab): + tokenizer.token_to_id[char] = vocab_id + tokenizer.id_to_token[vocab_id] = char + vocab_id += 1 + + print(f"Initial vocab size: {vocab_id} (special + characters)") + + # Step 4: Convert units to character sequences + word_freqs = {} + for unit, count in unit_counts.items(): + if count >= min_frequency: + # Split into characters with space separator + chars = tuple(unit) + word_freqs[chars] = count + + # Step 5: BPE merging + merges = [] + + for merge_idx in range(num_merges): + # Count pairs + pair_counts = Counter() + for word, freq in word_freqs.items(): + for i in range(len(word) - 1): + pair = (word[i], word[i + 1]) + pair_counts[pair] += freq + + if not pair_counts: + break + + # Find most frequent pair + best_pair = pair_counts.most_common(1)[0][0] + best_count = pair_counts[best_pair] + + if best_count < min_frequency: + break + + # Merge pair + new_token = best_pair[0] + best_pair[1] + + # Check length constraint + if max_token_length and len(new_token) > max_token_length: + # remove this pair from consideration for this iteration and future? + # Actually, skipping it here is tricky because we need to ignore it in pair_counts next time + # Simpler: Just skip adding it to merges and modify word_freqs? + # No, if we don't merge, we just continue to the next best pair in THIS iteration. + # But pair_counts is already computed. + # We need to loop until we find a valid pair or run out + + # In this simple implementation, let's just skip this merge efficiently + # We need to find the NEXT most common pair. + + # Re-do finding best pair loop + found_valid_pair = False + for pair, count in pair_counts.most_common(): + token_candidate = pair[0] + pair[1] + if max_token_length and len(token_candidate) > max_token_length: + continue # Skip too long + + if count < min_frequency: + break # Stop if frequency too low + + # Found valid pair + best_pair = pair + best_count = count + new_token = token_candidate + found_valid_pair = True + break + + if not found_valid_pair: + print(f" Stopping early: No more pairs satisfy max_token_length={max_token_length}") + break + + # Final check before merging (in case we didn't enter the if block but updated vars) + # Actually the logic above handles it. If we entered the block, we either found a new best_pair or broke. + + merges.append(best_pair) + + # Add to vocab + tokenizer.token_to_id[new_token] = vocab_id + tokenizer.id_to_token[vocab_id] = new_token + vocab_id += 1 + + # Update word_freqs + new_word_freqs = {} + for word, freq in word_freqs.items(): + new_word = [] + i = 0 + while i < len(word): + if i < len(word) - 1 and word[i] == best_pair[0] and word[i + 1] == best_pair[1]: + new_word.append(new_token) + i += 2 + else: + new_word.append(word[i]) + i += 1 + new_word_freqs[tuple(new_word)] = freq + word_freqs = new_word_freqs + + if (merge_idx + 1) % 100 == 0: + print(f" Merge {merge_idx + 1}/{num_merges}: '{best_pair[0]}' + '{best_pair[1]}' -> '{new_token}' (count={best_count})") + + tokenizer.merges = merges + print(f"Final vocab size: {len(tokenizer.token_to_id)}") + + # Save if requested + if output_path: + tokenizer.save_vocab(output_path) + + return tokenizer + + def apply_bpe(self, text: str) -> List[str]: + """Apply BPE merges to a text string.""" + if text in self.token_to_id: + return [text] + + # Split into characters + tokens = list(text) + + # Apply merges + for pair in self.merges: + new_tokens = [] + i = 0 + while i < len(tokens): + if i < len(tokens) - 1 and tokens[i] == pair[0] and tokens[i + 1] == pair[1]: + new_tokens.append(pair[0] + pair[1]) + i += 2 + else: + new_tokens.append(tokens[i]) + i += 1 + tokens = new_tokens + + return tokens + + def tokenize(self, wurcs: str, max_length: int = 256) -> Dict: + """ + Tokenize a WURCS string. + + Returns: + Dict with: + - tokens: List of token strings + - token_ids: List of token IDs + - residue_ids: List of residue IDs + - branch_depths: List of branch depths + - linkage_types: List of linkage types + - attention_mask: Attention mask + """ + # Pre-tokenize + units = self.pre_tokenizer.pre_tokenize(wurcs) + + tokens = [] + token_ids = [] + residue_ids = [] + branch_depths = [] + linkage_types = [] + + for unit in units: + if unit['type'] == 'special': + # Special tokens stay as-is + tok = unit['text'] + tokens.append(tok) + token_ids.append(self.token_to_id.get(tok, self.token_to_id['[UNK]'])) + residue_ids.append(unit['residue_id']) + branch_depths.append(unit['branch_depth']) + linkage_types.append(unit['linkage_type']) + else: + # Apply BPE to this unit + bpe_tokens = self.apply_bpe(unit['text']) + for tok in bpe_tokens: + tokens.append(tok) + token_ids.append(self.token_to_id.get(tok, self.token_to_id['[UNK]'])) + residue_ids.append(unit['residue_id']) + branch_depths.append(unit['branch_depth']) + linkage_types.append(unit['linkage_type']) + + # Truncate if needed + if len(tokens) > max_length: + tokens = tokens[:max_length - 1] + ['[END]'] + token_ids = token_ids[:max_length - 1] + [self.token_to_id['[END]']] + residue_ids = residue_ids[:max_length - 1] + [-1] + branch_depths = branch_depths[:max_length - 1] + [0] + linkage_types = linkage_types[:max_length - 1] + [0] + + # Create attention mask and pad + length = len(tokens) + attention_mask = [1] * length + + while len(tokens) < max_length: + tokens.append('[PAD]') + token_ids.append(self.token_to_id['[PAD]']) + residue_ids.append(-1) + branch_depths.append(0) + linkage_types.append(0) + attention_mask.append(0) + # Pre-tokenize + units = self.pre_tokenizer.pre_tokenize(wurcs) + + # Extract distance matrix from pre-tokenizer result + dist_matrix_raw = units[0].get('distance_matrix', []) + num_residues = len(dist_matrix_raw) + + # Map token-to-token distances using residue_ids + # token_i is associated with residue_ids[i]. + # residue_ids[i] is index into dist_matrix_raw. + # If residue_ids[i] == -1 (special), distance is undefined (use -1 or 999) + + # Use UNPADDED length for distance matrix to save massive memory + # distance_matrix will be e.g. 20x20, while tokens are padded to 256 + token_len = length + distance_matrix = [[-1] * token_len for _ in range(token_len)] + + for i in range(token_len): + for j in range(token_len): + r_i = residue_ids[i] + r_j = residue_ids[j] + + if r_i >= 0 and r_j >= 0 and r_i < num_residues and r_j < num_residues: + distance_matrix[i][j] = dist_matrix_raw[r_i][r_j] + else: + distance_matrix[i][j] = -1 # Special/Padding + + # MEMORY OPTIMIZATION: Do NOT pad matrix here. + # Pad on-the-fly in Dataset class instead. + # This saves massive memory (0.2GB vs 66GB). + + return { + 'tokens': tokens, + 'token_ids': token_ids, + 'residue_ids': residue_ids, + 'branch_depths': branch_depths, + 'linkage_types': linkage_types, + 'attention_mask': attention_mask, + 'distance_matrix': distance_matrix, # New Output + 'length': length, + } + + def save_vocab(self, path: str): + """Save vocabulary to JSON file.""" + data = { + 'special_tokens': self.special_tokens, + 'token_to_id': self.token_to_id, + 'merges': [list(m) for m in self.merges], + 'metadata': { + 'vocab_size': len(self.token_to_id), + 'num_merges': len(self.merges), + } + } + with open(path, 'w') as f: + json.dump(data, f, indent=2) + print(f"Saved vocabulary to {path}") + + def load_vocab(self, path: str): + """Load vocabulary from JSON file.""" + with open(path, 'r') as f: + data = json.load(f) + + self.special_tokens = data['special_tokens'] + self.token_to_id = data['token_to_id'] + self.id_to_token = {int(v): k for k, v in self.token_to_id.items()} + self.merges = [tuple(m) for m in data['merges']] + + print(f"Loaded vocabulary with {len(self.token_to_id)} tokens") + + @property + def vocab_size(self) -> int: + return len(self.token_to_id) + + +# ============================================================================ +# Testing +# ============================================================================ + +if __name__ == '__main__': + # Test pre-tokenizer + print("="*80) + print("Testing WURCSPreTokenizer") + print("="*80) + + pre_tok = WURCSPreTokenizer() + + test_wurcs = [ + "WURCS=2.0/2,2,1/[a2122h-1b_1-5][a2211m-1a_1-5]/1-2/a4-b1", + "WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2211m-1a_1-5]/1-2-3/a4-b1_b3-c1", + ] + + for wurcs in test_wurcs: + print(f"\nWURCS: {wurcs[:60]}...") + units = pre_tok.pre_tokenize(wurcs) + print(f"Units ({len(units)}):") + for u in units[:10]: + print(f" {u['type']:10} | res={u['residue_id']:2} | depth={u['branch_depth']} | {u['text']}") + if len(units) > 10: + print(f" ... and {len(units) - 10} more") diff --git a/releases/2026-10-02/bertose_source/bert_training_v4/model/__init__.py b/releases/2026-10-02/bertose_source/bert_training_v4/model/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/releases/2026-10-02/bertose_source/bert_training_v4/model/glycan_bert.py b/releases/2026-10-02/bertose_source/bert_training_v4/model/glycan_bert.py new file mode 100644 index 0000000000000000000000000000000000000000..bc2ca3ff916d1016b30e82c22dea19762f613f44 --- /dev/null +++ b/releases/2026-10-02/bertose_source/bert_training_v4/model/glycan_bert.py @@ -0,0 +1,303 @@ +""" +Glycan BERT Model + +Transformer-based masked language model for glycan structures. +Based on BERT/ESM2 architecture adapted for atomic glycan tokenization. +""" + +import torch +import torch.nn as nn +import math + + +class GlycanBERTConfig: + """Configuration for GlycanBERT.""" + + def __init__( + self, + vocab_size: int = 102, + hidden_size: int = 384, + num_hidden_layers: int = 6, + num_attention_heads: int = 6, + intermediate_size: int = 1536, + hidden_dropout_prob: float = 0.1, + attention_probs_dropout_prob: float = 0.1, + max_position_embeddings: int = 512, + layer_norm_eps: float = 1e-12, + pad_token_id: int = 0, + mask_token_id: int = 4, + initializer_range: float = 0.02 + ): + self.vocab_size = vocab_size + self.hidden_size = hidden_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + self.intermediate_size = intermediate_size + self.hidden_dropout_prob = hidden_dropout_prob + self.attention_probs_dropout_prob = attention_probs_dropout_prob + self.max_position_embeddings = max_position_embeddings + self.layer_norm_eps = layer_norm_eps + self.pad_token_id = pad_token_id + self.mask_token_id = mask_token_id + self.initializer_range = initializer_range + + +class GlycanBERTEmbeddings(nn.Module): + """ + Embeddings for glycan tokens including token and positional embeddings. + """ + + def __init__(self, config: GlycanBERTConfig): + super().__init__() + self.token_embeddings = nn.Embedding(config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id) + self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size) + + self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) + self.dropout = nn.Dropout(config.hidden_dropout_prob) + + # position_ids (1, max_seq_len) is contiguous in memory and exported when serialized + self.register_buffer("position_ids", torch.arange(config.max_position_embeddings).expand((1, -1))) + + def forward(self, input_ids: torch.Tensor) -> torch.Tensor: + """ + Args: + input_ids: Tensor of shape (batch_size, seq_len) + + Returns: + Embeddings of shape (batch_size, seq_len, hidden_size) + """ + batch_size, seq_len = input_ids.shape + + # Token embeddings + token_embeds = self.token_embeddings(input_ids) + + # Position embeddings + position_ids = self.position_ids[:, :seq_len] + position_embeds = self.position_embeddings(position_ids) + + # Combine + embeddings = token_embeds + position_embeds + embeddings = self.LayerNorm(embeddings) + embeddings = self.dropout(embeddings) + + return embeddings + + +class GlycanBERTAttention(nn.Module): + """Multi-head self-attention.""" + + def __init__(self, config: GlycanBERTConfig): + super().__init__() + assert config.hidden_size % config.num_attention_heads == 0 + + self.num_attention_heads = config.num_attention_heads + self.attention_head_size = config.hidden_size // config.num_attention_heads + self.all_head_size = self.num_attention_heads * self.attention_head_size + + self.query = nn.Linear(config.hidden_size, self.all_head_size) + self.key = nn.Linear(config.hidden_size, self.all_head_size) + self.value = nn.Linear(config.hidden_size, self.all_head_size) + + self.dropout = nn.Dropout(config.attention_probs_dropout_prob) + + def transpose_for_scores(self, x: torch.Tensor) -> torch.Tensor: + """Reshape for multi-head attention.""" + new_shape = x.size()[:-1] + (self.num_attention_heads, self.attention_head_size) + x = x.view(*new_shape) + return x.permute(0, 2, 1, 3) # (batch, heads, seq_len, head_size) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: torch.Tensor = None + ) -> torch.Tensor: + """ + Args: + hidden_states: (batch_size, seq_len, hidden_size) + attention_mask: (batch_size, seq_len) - 1 for valid, 0 for padding + + Returns: + Attention output: (batch_size, seq_len, hidden_size) + """ + batch_size, seq_len, _ = hidden_states.shape + + # Linear projections + query_layer = self.transpose_for_scores(self.query(hidden_states)) + key_layer = self.transpose_for_scores(self.key(hidden_states)) + value_layer = self.transpose_for_scores(self.value(hidden_states)) + + # Attention scores + attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) + attention_scores = attention_scores / math.sqrt(self.attention_head_size) + + # Apply attention mask + if attention_mask is not None: + # Convert mask to additive mask + attention_mask = attention_mask.unsqueeze(1).unsqueeze(2) # (batch, 1, 1, seq_len) + attention_mask = (1.0 - attention_mask) * -10000.0 + attention_scores = attention_scores + attention_mask + + # Attention probabilities + attention_probs = nn.functional.softmax(attention_scores, dim=-1) + attention_probs = self.dropout(attention_probs) + + # Apply attention to values + context_layer = torch.matmul(attention_probs, value_layer) + + # Reshape back + context_layer = context_layer.permute(0, 2, 1, 3).contiguous() + new_shape = context_layer.size()[:-2] + (self.all_head_size,) + context_layer = context_layer.view(*new_shape) + + return context_layer + + +class GlycanBERTLayer(nn.Module): + """Single transformer layer.""" + + def __init__(self, config: GlycanBERTConfig): + super().__init__() + self.attention = GlycanBERTAttention(config) + self.attention_output = nn.Linear(config.hidden_size, config.hidden_size) + self.attention_layer_norm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) + + self.intermediate = nn.Linear(config.hidden_size, config.intermediate_size) + self.output = nn.Linear(config.intermediate_size, config.hidden_size) + self.output_layer_norm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) + + self.dropout = nn.Dropout(config.hidden_dropout_prob) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: torch.Tensor = None + ) -> torch.Tensor: + """ + Args: + hidden_states: (batch_size, seq_len, hidden_size) + attention_mask: (batch_size, seq_len) + + Returns: + Output: (batch_size, seq_len, hidden_size) + """ + # Self-attention + attention_output = self.attention(hidden_states, attention_mask) + attention_output = self.attention_output(attention_output) + attention_output = self.dropout(attention_output) + + # Add & Norm + hidden_states = self.attention_layer_norm(hidden_states + attention_output) + + # Feed-forward + intermediate_output = self.intermediate(hidden_states) + intermediate_output = nn.functional.gelu(intermediate_output) + + layer_output = self.output(intermediate_output) + layer_output = self.dropout(layer_output) + + # Add & Norm + layer_output = self.output_layer_norm(hidden_states + layer_output) + + return layer_output + + +class GlycanBERT(nn.Module): + """ + Glycan BERT model for masked language modeling. + """ + + def __init__(self, config: GlycanBERTConfig): + super().__init__() + self.config = config + + # Embeddings + self.embeddings = GlycanBERTEmbeddings(config) + + # Transformer layers + self.layers = nn.ModuleList([GlycanBERTLayer(config) for _ in range(config.num_hidden_layers)]) + + # MLM head + self.mlm_head = nn.Linear(config.hidden_size, config.vocab_size) + + # Initialize weights + self.apply(self._init_weights) + + def _init_weights(self, module): + """Initialize weights.""" + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + elif isinstance(module, nn.LayerNorm): + module.bias.data.zero_() + module.weight.data.fill_(1.0) + + def forward( + self, + input_ids: torch.Tensor, + attention_mask: torch.Tensor = None, + labels: torch.Tensor = None + ): + """ + Args: + input_ids: (batch_size, seq_len) + attention_mask: (batch_size, seq_len) - 1 for valid, 0 for padding + labels: (batch_size, seq_len) - token IDs to predict, -100 for positions to ignore + + Returns: + If labels provided: (loss, logits) + Else: logits + """ + # Create attention mask if not provided + if attention_mask is None: + attention_mask = (input_ids != self.config.pad_token_id).float() + + # Embeddings + hidden_states = self.embeddings(input_ids) + + # Transformer layers + for layer in self.layers: + hidden_states = layer(hidden_states, attention_mask) + + # MLM prediction + logits = self.mlm_head(hidden_states) + + # Calculate loss if labels provided + loss = None + if labels is not None: + loss_fct = nn.CrossEntropyLoss() # -100 is ignored + loss = loss_fct(logits.view(-1, self.config.vocab_size), labels.view(-1)) + + if loss is not None: + return loss, logits + return logits + + def get_embeddings( + self, + input_ids: torch.Tensor, + attention_mask: torch.Tensor = None + ) -> torch.Tensor: + """ + Get contextualized embeddings (for downstream tasks). + + Args: + input_ids: (batch_size, seq_len) + attention_mask: (batch_size, seq_len) + + Returns: + Embeddings: (batch_size, seq_len, hidden_size) + """ + if attention_mask is None: + attention_mask = (input_ids != self.config.pad_token_id).float() + + hidden_states = self.embeddings(input_ids) + + for layer in self.layers: + hidden_states = layer(hidden_states, attention_mask) + + return hidden_states + diff --git a/releases/2026-10-02/bertose_source/bert_training_v4/model/multimodal_glycan_bert_v3.py b/releases/2026-10-02/bertose_source/bert_training_v4/model/multimodal_glycan_bert_v3.py new file mode 100644 index 0000000000000000000000000000000000000000..8fcbf1c61cb90ba43e7f7e440a7c59b37d340915 --- /dev/null +++ b/releases/2026-10-02/bertose_source/bert_training_v4/model/multimodal_glycan_bert_v3.py @@ -0,0 +1,1108 @@ +""" +Multimodal Glycan BERT Model v3 + +Extends GlycanBERT to handle three modalities: +- Sequence (WURCS atomic tokenization) +- MS (mass spectrometry peaks, RT, intensity) +- 3D structure (VQ-VAE discrete tokens, 4 per residue) + +Each modality has its own encoder, with cross-attention for sequence-structure alignment. +""" + +import torch +import torch.nn as nn +from typing import Dict, Optional, Tuple +import math + +try: + from .glycan_bert import GlycanBERTConfig, GlycanBERTEmbeddings, GlycanBERTLayer +except ImportError: + from glycan_bert import GlycanBERTConfig, GlycanBERTEmbeddings, GlycanBERTLayer + + +class ConvGlycanBERTEmbeddings(nn.Module): + """ + Improved Convolutional front-end that mixes local WURCS context before the Transformer. + + Key improvements over original: + 1. Position embeddings added BEFORE convolution (provides spatial context to conv) + 2. Residual connection (conv enriches embeddings rather than replacing them) + 3. Multi-scale convolutions (kernel sizes 3, 5, 7) for better receptive field + 4. Proper layer normalization on the residual path + """ + + def __init__(self, config): + super().__init__() + self.token_embeddings = nn.Embedding( + config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id + ) + self.position_embeddings = nn.Embedding( + config.max_position_embeddings, config.hidden_size + ) + + # NEW: Branch depth embeddings - encodes depth in glycan tree (0=root, 1=child, etc.) + max_branch_depth = getattr(config, "max_branch_depth", 8) + self.branch_embeddings = nn.Embedding(max_branch_depth, config.hidden_size) + + # NEW: Linkage type embeddings - encodes chemistry of glycosidic bond + # 0=none, 1=1-3, 2=1-4, 3=1-6, etc. + num_linkage_types = getattr(config, "num_linkage_types", 9) + self.linkage_embeddings = nn.Embedding(num_linkage_types, config.hidden_size) + + # Multi-scale convolutions for different receptive fields + kernel_size = getattr(config, "cnn_kernel_size", 3) + # Split channels evenly: 256 + 256 + 256 = 768 for hidden_size=768 + channels_per_scale = config.hidden_size // 3 + self.conv_layers = nn.ModuleList([ + nn.Conv1d( + in_channels=config.hidden_size, + out_channels=channels_per_scale, + kernel_size=kernel_size + 2 * i, # Kernels: 3, 5, 7 + padding=(kernel_size + 2 * i) // 2, # Same padding + ) + for i in range(3) + ]) + self.conv_activation = nn.GELU() + self.conv_proj = nn.Linear(channels_per_scale * 3, config.hidden_size) # Project concatenated back + + self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) + self.conv_norm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) + self.dropout = nn.Dropout(config.hidden_dropout_prob) + self.register_buffer( + "position_ids", + torch.arange(config.max_position_embeddings).expand((1, -1)), + ) + + self.hidden_size = config.hidden_size + + def forward(self, input_ids, branch_depths=None, linkage_types=None): + seq_len = input_ids.shape[1] + + # Step 1: Token + Position embeddings FIRST (provides spatial context to conv) + x = self.token_embeddings(input_ids) # (batch, seq, hidden) + position_ids = self.position_ids[:, :seq_len] + x = x + self.position_embeddings(position_ids) + + # NEW: Add branch depth embeddings (encodes tree structure) + if branch_depths is not None: + # Clamp to valid range + branch_depths = branch_depths.clamp(0, self.branch_embeddings.num_embeddings - 1) + x = x + self.branch_embeddings(branch_depths) + + # NEW: Add linkage type embeddings (encodes bond chemistry) + if linkage_types is not None: + linkage_types = linkage_types.clamp(0, self.linkage_embeddings.num_embeddings - 1) + x = x + self.linkage_embeddings(linkage_types) + + x = self.LayerNorm(x) + + # Step 2: Multi-scale convolution with RESIDUAL connection + # Convolution expects (batch, hidden, seq) + conv_in = x.permute(0, 2, 1) + + # Apply multi-scale convolutions and concatenate + conv_outputs = [] + for conv in self.conv_layers: + conv_out = self.conv_activation(conv(conv_in)) + conv_outputs.append(conv_out) + + # Concatenate multi-scale features and project back + conv_out = torch.cat(conv_outputs, dim=1) # (batch, hidden, seq) + conv_out = conv_out.permute(0, 2, 1) # (batch, seq, hidden) + conv_out = self.conv_proj(conv_out) # Project to correct size + + # Step 3: Residual connection - conv ENRICHES rather than replaces + x = self.conv_norm(x + self.dropout(conv_out)) + + return x + + +def create_residue_level_mask( + seq_residue_ids: torch.Tensor, # (batch, N_seq) + struct_residue_ids: torch.Tensor # (batch, N_struct) +) -> torch.Tensor: + """ + Create residue-level attention mask for cross-attention. + + Maps WURCS tokens to VQ-VAE structural tokens based on residue IDs. + A WURCS token with residue_id=0 can only attend to VQ-VAE tokens with residue_id=0. + + Args: + seq_residue_ids: Residue IDs for sequence tokens (batch, N_seq) + struct_residue_ids: Residue IDs for structural tokens (batch, N_struct) + + Returns: + Boolean mask (batch, N_seq, N_struct) where True = can attend + """ + # Expand dimensions for broadcasting + # seq: (batch, N_seq, 1) + # struct: (batch, 1, N_struct) + mask = seq_residue_ids.unsqueeze(2) == struct_residue_ids.unsqueeze(1) + # Shape: (batch, N_seq, N_struct) + + # Mask out structural tokens (residue_id = -1) and MS tokens (residue_id = -2) + # Only tokens with residue_id >= 0 can attend + mask &= (seq_residue_ids.unsqueeze(2) >= 0) + + return mask # True = can attend, False = cannot attend + + +class MultimodalGlycanBERTConfig: + """Configuration for Multimodal GlycanBERT v3.""" + + def __init__( + self, + # Sequence modality + seq_vocab_size: int = 166, + seq_hidden_size: int = 768, + seq_num_layers: int = 12, + seq_num_heads: int = 12, + seq_max_length: int = 512, + + # MS modality + ms_vocab_size: int = 242, + ms_hidden_size: int = 384, + ms_num_layers: int = 6, + ms_num_heads: int = 6, + ms_max_length: int = 150, + + # 3D structure modality + struct_vocab_size: int = 1024, # VQ-VAE codebook size + struct_hidden_size: int = 512, + struct_num_layers: int = 8, + struct_num_heads: int = 8, + struct_max_length: int = 200, + use_3d: bool = True, + + # Cross-attention + use_cross_attention: bool = True, + cross_attn_num_heads: int = 8, + + # Fusion + fusion_hidden_size: int = 768, + fusion_num_layers: int = 2, + + # Training + hidden_dropout_prob: float = 0.1, + attention_probs_dropout_prob: float = 0.1, + layer_norm_eps: float = 1e-12, + initializer_range: float = 0.02, + + # Conv front-end + use_cnn_frontend: bool = True, + cnn_kernel_size: int = 3, + + # Loss weights + seq_loss_weight: float = 0.60, + ms_loss_weight: float = 0.15, + struct_loss_weight: float = 0.25, + + # Token IDs + pad_token_id: int = 0, + mask_token_id: int = 1, + ): + # Sequence config + self.seq_vocab_size = seq_vocab_size + self.seq_hidden_size = seq_hidden_size + self.seq_num_layers = seq_num_layers + self.seq_num_heads = seq_num_heads + self.seq_max_length = seq_max_length + + # MS config + self.ms_vocab_size = ms_vocab_size + self.ms_vocab_offset = seq_vocab_size # MS tokens start at 166 + self.ms_total_vocab_size = seq_vocab_size + ms_vocab_size # 408 total + self.ms_hidden_size = ms_hidden_size + self.ms_num_layers = ms_num_layers + self.ms_num_heads = ms_num_heads + self.ms_max_length = ms_max_length + + # Structure config + self.struct_vocab_size = struct_vocab_size + self.struct_hidden_size = struct_hidden_size + self.struct_num_layers = struct_num_layers + self.struct_num_heads = struct_num_heads + self.struct_max_length = struct_max_length + self.use_3d = use_3d + + # Cross-attention config + self.use_cross_attention = use_cross_attention + self.cross_attn_num_heads = cross_attn_num_heads + + # Fusion config + self.fusion_hidden_size = fusion_hidden_size + self.fusion_num_layers = fusion_num_layers + + # Training config + self.hidden_dropout_prob = hidden_dropout_prob + self.attention_probs_dropout_prob = attention_probs_dropout_prob + self.layer_norm_eps = layer_norm_eps + self.initializer_range = initializer_range + + # Conv front-end + self.use_cnn_frontend = use_cnn_frontend + self.cnn_kernel_size = cnn_kernel_size + + # Loss weights + self.seq_loss_weight = seq_loss_weight + self.ms_loss_weight = ms_loss_weight + self.struct_loss_weight = struct_loss_weight + + # Token IDs + self.pad_token_id = pad_token_id + self.mask_token_id = mask_token_id + + def to_seq_config(self) -> GlycanBERTConfig: + """Convert to sequence-only config.""" + return GlycanBERTConfig( + vocab_size=self.seq_vocab_size, + hidden_size=self.seq_hidden_size, + num_hidden_layers=self.seq_num_layers, + num_attention_heads=self.seq_num_heads, + intermediate_size=self.seq_hidden_size * 4, + hidden_dropout_prob=self.hidden_dropout_prob, + attention_probs_dropout_prob=self.attention_probs_dropout_prob, + max_position_embeddings=self.seq_max_length, + layer_norm_eps=self.layer_norm_eps, + pad_token_id=self.pad_token_id, + mask_token_id=self.mask_token_id, + initializer_range=self.initializer_range, + ) + + def to_ms_config(self) -> GlycanBERTConfig: + """Convert to MS-only config.""" + return GlycanBERTConfig( + vocab_size=self.ms_total_vocab_size, + hidden_size=self.ms_hidden_size, + num_hidden_layers=self.ms_num_layers, + num_attention_heads=self.ms_num_heads, + intermediate_size=self.ms_hidden_size * 4, + hidden_dropout_prob=self.hidden_dropout_prob, + attention_probs_dropout_prob=self.attention_probs_dropout_prob, + max_position_embeddings=self.ms_max_length, + layer_norm_eps=self.layer_norm_eps, + pad_token_id=self.pad_token_id, + mask_token_id=self.mask_token_id, + initializer_range=self.initializer_range, + ) + + def to_struct_config(self) -> GlycanBERTConfig: + """Convert to structure-only config.""" + return GlycanBERTConfig( + vocab_size=self.struct_vocab_size, + hidden_size=self.struct_hidden_size, + num_hidden_layers=self.struct_num_layers, + num_attention_heads=self.struct_num_heads, + intermediate_size=self.struct_hidden_size * 4, + hidden_dropout_prob=self.hidden_dropout_prob, + attention_probs_dropout_prob=self.attention_probs_dropout_prob, + max_position_embeddings=self.struct_max_length, + layer_norm_eps=self.layer_norm_eps, + pad_token_id=self.pad_token_id, + mask_token_id=self.mask_token_id, + initializer_range=self.initializer_range, + ) + + +# ============================================================================= +# Improvement #1: Monosaccharide-Level Pooling +# ============================================================================= + +class MonosaccharidePooling(nn.Module): + """ + Pool token representations to monosaccharide level, then aggregate. + + This bridges the gap between token-level BERT and monosaccharide-level CNNs/GNNs. + Uses monosaccharide_indices from the data to know where each residue starts. + """ + + def __init__(self, hidden_size: int, num_attention_heads: int = 8, dropout: float = 0.1): + super().__init__() + self.hidden_size = hidden_size + + # Attention pooling over monosaccharide representations + self.mono_attention = nn.MultiheadAttention( + embed_dim=hidden_size, + num_heads=num_attention_heads, + dropout=dropout, + batch_first=True + ) + self.mono_norm = nn.LayerNorm(hidden_size) + + # Final aggregation to single glycan representation + self.glycan_query = nn.Parameter(torch.randn(1, 1, hidden_size) * 0.02) + self.glycan_attention = nn.MultiheadAttention( + embed_dim=hidden_size, + num_heads=num_attention_heads, + dropout=dropout, + batch_first=True + ) + self.glycan_norm = nn.LayerNorm(hidden_size) + + def forward( + self, + hidden_states: torch.Tensor, # (batch, seq_len, hidden) + residue_ids: torch.Tensor, # (batch, seq_len) - which residue each token belongs to + attention_mask: torch.Tensor = None, # (batch, seq_len) + ) -> torch.Tensor: + """ + Pool tokens to monosaccharide level, then to glycan level. + + Returns: + Glycan representation: (batch, hidden_size) + """ + batch_size = hidden_states.size(0) + device = hidden_states.device + + # Get unique residue IDs per sample (excluding -1 padding) + max_residues = 50 # Reasonable max for glycans + + # Pool tokens within each residue using mean pooling + mono_reps = torch.zeros(batch_size, max_residues, self.hidden_size, device=device) + mono_mask = torch.zeros(batch_size, max_residues, dtype=torch.bool, device=device) + + for b in range(batch_size): + unique_residues = torch.unique(residue_ids[b][residue_ids[b] >= 0]) + for i, rid in enumerate(unique_residues): + if i >= max_residues: + break + token_mask = residue_ids[b] == rid + if attention_mask is not None: + token_mask = token_mask & (attention_mask[b] > 0) + if token_mask.sum() > 0: + mono_reps[b, i] = hidden_states[b][token_mask].mean(dim=0) + mono_mask[b, i] = True + + # Apply attention over monosaccharide representations + # Convert mask for attention: True = valid, need to invert for PyTorch + key_padding_mask = ~mono_mask # True = ignore + + mono_out, _ = self.mono_attention( + mono_reps, mono_reps, mono_reps, + key_padding_mask=key_padding_mask + ) + mono_out = self.mono_norm(mono_reps + mono_out) + + # Aggregate to single glycan representation using learned query + glycan_query = self.glycan_query.expand(batch_size, -1, -1) + glycan_out, _ = self.glycan_attention( + glycan_query, mono_out, mono_out, + key_padding_mask=key_padding_mask + ) + glycan_out = self.glycan_norm(glycan_query + glycan_out) + + return glycan_out.squeeze(1) # (batch, hidden) + + +# ============================================================================= +# Improvement #2: Residue Type Embeddings +# ============================================================================= + +# Common monosaccharide types vocabulary +MONOSACCHARIDE_VOCAB = { + '[PAD_MONO]': 0, '[UNK_MONO]': 1, + 'Glc': 2, 'GlcNAc': 3, 'GlcA': 4, 'GlcN': 5, + 'Gal': 6, 'GalNAc': 7, 'GalA': 8, 'GalN': 9, + 'Man': 10, 'ManNAc': 11, 'ManA': 12, 'ManN': 13, + 'Fuc': 14, 'Rha': 15, 'Xyl': 16, 'Ara': 17, + 'Neu5Ac': 18, 'Neu5Gc': 19, 'Kdn': 20, 'Sia': 21, + 'GalNAcA': 22, 'GlcNAcA': 23, 'IdoA': 24, 'GulA': 25, + 'Rib': 26, 'Lyx': 27, 'All': 28, 'Alt': 29, + 'Tal': 30, 'Ido': 31, 'Qui': 32, 'Oli': 33, + 'Tyv': 34, 'Abe': 35, 'Par': 36, 'Dig': 37, + 'Col': 38, 'Dha': 39, 'Kdo': 40, 'Hep': 41, + 'NeuroGc': 42, 'Muramic': 43, 'LDManHep': 44, 'DDManHep': 45, + 'Bac': 46, 'Pse': 47, 'Leg': 48, 'Aci': 49, + '6dTal': 50, 'Fru': 51, 'Tag': 52, 'Sor': 53, + 'Psi': 54, 'Sed': 55, 'MurNAc': 56, 'MurNGc': 57, + 'Api': 58, 'Erwiniose': 59, 'Yer': 60, 'Thre': 61, + # Add more as needed, up to ~70 +} + + +class ResidueTypeEmbeddings(nn.Module): + """ + Learnable embeddings for monosaccharide types. + + Instead of the model having to learn that 'a1221m' = Fucose from character patterns, + we explicitly add a Fucose embedding to all tokens belonging to that residue. + """ + + def __init__(self, hidden_size: int, num_mono_types: int = 70): + super().__init__() + self.mono_embeddings = nn.Embedding(num_mono_types, hidden_size) + self.mono_vocab = MONOSACCHARIDE_VOCAB + self.hidden_size = hidden_size + + def forward( + self, + token_embeddings: torch.Tensor, # (batch, seq_len, hidden) + residue_ids: torch.Tensor, # (batch, seq_len) + mono_type_ids: torch.Tensor = None, # (batch, max_residues) - monosaccharide type per residue + ) -> torch.Tensor: + """ + Add residue type embeddings to token embeddings. + + Args: + token_embeddings: Base token embeddings + residue_ids: Which residue each token belongs to (-1 for special tokens) + mono_type_ids: Monosaccharide type ID for each residue position + + Returns: + Enhanced embeddings with residue type information + """ + if mono_type_ids is None: + return token_embeddings + + batch_size, seq_len, _ = token_embeddings.shape + enhanced = token_embeddings.clone() + + # Add mono type embedding to each token based on its residue + for b in range(batch_size): + for pos in range(seq_len): + rid = residue_ids[b, pos].item() + if rid >= 0 and rid < mono_type_ids.size(1): + mono_id = mono_type_ids[b, rid] + enhanced[b, pos] = enhanced[b, pos] + self.mono_embeddings(mono_id) + + return enhanced + + @staticmethod + def get_mono_type_id(mono_name: str) -> int: + """Convert monosaccharide name to type ID.""" + return MONOSACCHARIDE_VOCAB.get(mono_name, MONOSACCHARIDE_VOCAB['[UNK_MONO]']) + + +# ============================================================================= +# Improvement #4: Relative Position Encoding for Glycan Trees +# ============================================================================= + +class RelativePositionBias(nn.Module): + """ + Compute relative position bias for attention based on residue IDs. + + Tokens in the same residue get distance 0. + Tokens in adjacent residues get distance ±1. + This helps the model understand glycan tree structure. + """ + + def __init__(self, num_heads: int, max_distance: int = 10): + super().__init__() + self.num_heads = num_heads + self.max_distance = max_distance + + # Learnable bias for each relative distance (-max to +max) + num_distances = 2 * max_distance + 1 + self.relative_bias = nn.Embedding(num_distances, num_heads) + + def forward(self, residue_ids: torch.Tensor) -> torch.Tensor: + """ + Compute relative position bias. + + Args: + residue_ids: (batch, seq_len) + + Returns: + Bias to add to attention scores: (batch, num_heads, seq_len, seq_len) + """ + # Compute pairwise residue distances + # (batch, seq_len, 1) - (batch, 1, seq_len) = (batch, seq_len, seq_len) + distance = residue_ids.unsqueeze(2) - residue_ids.unsqueeze(1) + + # Clamp to max distance range and shift to 0-indexed + distance_clamped = distance.clamp(-self.max_distance, self.max_distance) + distance_idx = distance_clamped + self.max_distance # Now 0 to 2*max_distance + + # Look up bias: (batch, seq_len, seq_len, num_heads) + bias = self.relative_bias(distance_idx) + + # Transpose to (batch, num_heads, seq_len, seq_len) + bias = bias.permute(0, 3, 1, 2) + + return bias + + +class CrossAttentionLayer(nn.Module): + """ + Cross-attention layer for sequence-structure alignment. + + Allows sequence tokens to attend to structural atoms using attention masks. + """ + + def __init__(self, config: MultimodalGlycanBERTConfig): + super().__init__() + self.num_heads = config.cross_attn_num_heads + self.hidden_size = config.seq_hidden_size + self.head_dim = self.hidden_size // self.num_heads + + assert self.hidden_size % self.num_heads == 0, "hidden_size must be divisible by num_heads" + + # Query from sequence, Key/Value from structure (VQ-VAE tokens) + self.query = nn.Linear(config.seq_hidden_size, self.hidden_size) + self.key = nn.Linear(config.struct_hidden_size, self.hidden_size) + self.value = nn.Linear(config.struct_hidden_size, self.hidden_size) + + self.output = nn.Linear(self.hidden_size, config.seq_hidden_size) + self.dropout = nn.Dropout(config.attention_probs_dropout_prob) + self.layer_norm = nn.LayerNorm(config.seq_hidden_size, eps=config.layer_norm_eps) + + def forward( + self, + seq_hidden: torch.Tensor, # (batch, seq_len, seq_hidden) + struct_hidden: torch.Tensor, # (batch, struct_len, struct_hidden) + attention_mask: Optional[torch.Tensor] = None, # (batch, seq_len, struct_len) + ) -> torch.Tensor: + """ + Apply cross-attention from sequence to structure. + + Args: + seq_hidden: Sequence hidden states + struct_hidden: Structure hidden states + attention_mask: Boolean mask (True = can attend, False = cannot attend) + + Returns: + Updated sequence hidden states + """ + batch_size, seq_len, _ = seq_hidden.shape + struct_len = struct_hidden.shape[1] + + # Project to Q, K, V + Q = self.query(seq_hidden) # (batch, seq_len, hidden) + K = self.key(struct_hidden) # (batch, struct_len, hidden) + V = self.value(struct_hidden) # (batch, struct_len, hidden) + + # Reshape for multi-head attention + Q = Q.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2) # (batch, heads, seq_len, head_dim) + K = K.view(batch_size, struct_len, self.num_heads, self.head_dim).transpose(1, 2) # (batch, heads, struct_len, head_dim) + V = V.view(batch_size, struct_len, self.num_heads, self.head_dim).transpose(1, 2) # (batch, heads, struct_len, head_dim) + + # Compute attention scores + scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.head_dim) # (batch, heads, seq_len, struct_len) + + # Apply attention mask + if attention_mask is not None: + # attention_mask: (batch, seq_len, struct_len) -> (batch, 1, seq_len, struct_len) + attention_mask = attention_mask.unsqueeze(1) + # Convert boolean mask to float: True -> 0.0, False -> -10000.0 + attention_mask = (~attention_mask).float() * -10000.0 + scores = scores + attention_mask + + # Softmax and dropout + attn_weights = torch.softmax(scores, dim=-1) # (batch, heads, seq_len, struct_len) + attn_weights = self.dropout(attn_weights) + + # Apply attention to values + context = torch.matmul(attn_weights, V) # (batch, heads, seq_len, head_dim) + + # Reshape back + context = context.transpose(1, 2).contiguous().view(batch_size, seq_len, self.hidden_size) + + # Output projection + output = self.output(context) + output = self.dropout(output) + + # Residual connection + layer norm + output = self.layer_norm(seq_hidden + output) + + return output + + +class DistanceHead(nn.Module): + """ + Head for predicting structural distance (shortest path) between token pairs. + + Input: Pair of token embeddings (x_i, x_j) + Output: Scalar distance prediction + + Formula: Dist(i, j) = Linear( [x_i; x_j; x_i * x_j; |x_i - x_j|] ) + Using a comprehensive bilinear-like interaction for robust distance learning. + """ + def __init__(self, config): + super().__init__() + self.hidden_size = config.seq_hidden_size + # Interaction features: concat(u, v, u*v, |u-v|) -> 4 * hidden + self.dense = nn.Linear(self.hidden_size * 4, self.hidden_size) + self.activation = nn.GELU() + self.layer_norm = nn.LayerNorm(self.hidden_size, eps=config.layer_norm_eps) + self.decoder = nn.Linear(self.hidden_size, 1) # Output scalar distance + + def forward(self, hidden_states): + """ + Args: + hidden_states: (batch, seq_len, hidden) + + Returns: + distances: (batch, seq_len, seq_len) + """ + batch_size, seq_len, hidden = hidden_states.shape + + # Expand to pairs (batch, seq, seq, hidden) + u = hidden_states.unsqueeze(2).expand(batch_size, seq_len, seq_len, hidden) + v = hidden_states.unsqueeze(1).expand(batch_size, seq_len, seq_len, hidden) + + # Features + features = torch.cat([ + u, + v, + u * v, + torch.abs(u - v) + ], dim=-1) # (batch, seq, seq, 4*hidden) + + x = self.dense(features) + x = self.activation(x) + x = self.layer_norm(x) + x = self.decoder(x) # (batch, seq, seq, 1) + + return x.squeeze(-1) # (batch, seq, seq) + +class MultimodalGlycanBERT(nn.Module): + """ + Multimodal BERT for glycan representation learning (v3). + + Architecture: + 1. Separate encoders for each modality (sequence, MS, 3D structure) + 2. Cross-attention for sequence-structure alignment + 3. Modality-specific MLM heads + 4. Fusion layer for combined representation + """ + + def __init__(self, config: MultimodalGlycanBERTConfig): + super().__init__() + self.config = config + + # ===== Sequence Encoder ===== + seq_config = config.to_seq_config() + seq_config.cnn_kernel_size = config.cnn_kernel_size + + if config.use_cnn_frontend: + print(f"✅ Enabled Convolutional Front-End (Kernel={config.cnn_kernel_size})") + self.seq_embeddings = ConvGlycanBERTEmbeddings(seq_config) + else: + self.seq_embeddings = GlycanBERTEmbeddings(seq_config) + self.seq_layers = nn.ModuleList([GlycanBERTLayer(seq_config) for _ in range(seq_config.num_hidden_layers)]) + self.seq_mlm_head = nn.Linear(seq_config.hidden_size, seq_config.vocab_size) + self.distance_head = DistanceHead(config) # New Distance Prediction Head + + + # ===== MS Encoder ===== + ms_config = config.to_ms_config() + self.ms_embeddings = GlycanBERTEmbeddings(ms_config) + self.ms_layers = nn.ModuleList([GlycanBERTLayer(ms_config) for _ in range(ms_config.num_hidden_layers)]) + self.ms_mlm_head = nn.Linear(ms_config.hidden_size, ms_config.vocab_size) + + # ===== Structure Encoder (VQ-VAE tokens) ===== + if config.use_3d: + struct_config = config.to_struct_config() + self.struct_embeddings = GlycanBERTEmbeddings(struct_config) + self.struct_layers = nn.ModuleList([GlycanBERTLayer(struct_config) for _ in range(struct_config.num_hidden_layers)]) + self.struct_mlm_head = nn.Linear(struct_config.hidden_size, struct_config.vocab_size) + + # Cross-attention layer (sequence → VQ-VAE structural tokens) + if config.use_cross_attention: + self.cross_attention = CrossAttentionLayer(config) + + # ===== Projection layers (align hidden sizes) ===== + if config.ms_hidden_size != config.seq_hidden_size: + self.ms_projection = nn.Linear(config.ms_hidden_size, config.seq_hidden_size) + else: + self.ms_projection = nn.Identity() + + if config.use_3d and config.struct_hidden_size != config.seq_hidden_size: + self.struct_projection = nn.Linear(config.struct_hidden_size, config.seq_hidden_size) + else: + self.struct_projection = nn.Identity() + + # ===== Fusion Layer ===== + # Concatenate seq + ms + struct + fusion_input_size = config.seq_hidden_size * (3 if config.use_3d else 2) + self.fusion_layer = nn.Sequential( + nn.Linear(fusion_input_size, config.fusion_hidden_size), + nn.LayerNorm(config.fusion_hidden_size, eps=config.layer_norm_eps), + nn.GELU(), + nn.Dropout(config.hidden_dropout_prob), + nn.Linear(config.fusion_hidden_size, config.fusion_hidden_size), + ) + + # Initialize weights + self.apply(self._init_weights) + + def _init_weights(self, module): + """Initialize weights.""" + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + elif isinstance(module, nn.LayerNorm): + module.bias.data.zero_() + module.weight.data.fill_(1.0) + + def forward( + self, + seq_token_ids: torch.Tensor, + seq_attention_mask: torch.Tensor, + seq_residue_ids: torch.Tensor, + seq_branch_depths: Optional[torch.Tensor] = None, # NEW: Branch depths + seq_linkage_types: Optional[torch.Tensor] = None, # NEW: Linkage types + ms_token_ids: torch.Tensor = None, + ms_attention_mask: torch.Tensor = None, + has_ms: torch.Tensor = None, + struct_token_ids: Optional[torch.Tensor] = None, + struct_attention_mask: Optional[torch.Tensor] = None, + struct_residue_ids: Optional[torch.Tensor] = None, + has_3d: Optional[torch.Tensor] = None, + seq_labels: Optional[torch.Tensor] = None, + ms_labels: Optional[torch.Tensor] = None, + struct_labels: Optional[torch.Tensor] = None, + dist_labels: Optional[torch.Tensor] = None, # NEW: Topology distance labels + return_dict: bool = True, + compute_distance: bool = True, # Skip distance_head if False (saves memory) + ) -> Dict[str, torch.Tensor]: + """ + Forward pass for multimodal BERT v3. + + Args: + seq_token_ids: (batch_size, seq_len) - Sequence token IDs + seq_attention_mask: (batch_size, seq_len) - Sequence attention mask + seq_residue_ids: (batch_size, seq_len) - Sequence token residue IDs + ms_token_ids: (batch_size, ms_len) - MS token IDs + ms_attention_mask: (batch_size, ms_len) - MS attention mask + has_ms: (batch_size,) - Boolean mask for samples with MS data + struct_token_ids: (batch_size, struct_len) - Structure VQ-VAE token IDs (optional) + struct_attention_mask: (batch_size, struct_len) - Structure attention mask (optional) + struct_residue_ids: (batch_size, struct_len) - Structure token residue IDs (optional) + has_3d: (batch_size,) - Boolean mask for samples with 3D data (optional) + seq_labels: (batch_size, seq_len) - Masked sequence labels (optional) + ms_labels: (batch_size, ms_len) - Masked MS labels (optional) + struct_labels: (batch_size, struct_len) - Masked structure labels (optional) + return_dict: Whether to return dict or tuple + + Returns: + Dictionary containing logits, hidden states, losses, etc. + """ + batch_size = seq_token_ids.shape[0] + device = seq_token_ids.device + + # ===== Sequence Encoder ===== + # Pass branch_depths and linkage_types to embeddings for tree-aware encoding + seq_hidden = self.seq_embeddings(seq_token_ids, seq_branch_depths, seq_linkage_types) + for layer in self.seq_layers: + seq_hidden = layer(seq_hidden, seq_attention_mask) + + seq_pooled = seq_hidden[:, 0, :] # [CLS] token + seq_logits = self.seq_mlm_head(seq_hidden) + + # Calculate structural distances + # Calculate structural distances only if needed (saves ~48GB memory) + dist_predictions = self.distance_head(seq_hidden) if compute_distance else None + + + # ===== MS Encoder ===== + ms_hidden = None + ms_pooled = None + ms_logits = None + + if ms_token_ids is not None: + ms_hidden = self.ms_embeddings(ms_token_ids) + for layer in self.ms_layers: + ms_hidden = layer(ms_hidden, ms_attention_mask) + + ms_pooled = ms_hidden[:, 0, :] # [CLS] token + ms_logits = self.ms_mlm_head(ms_hidden) + + # Zero out MS representations for samples without MS data + if has_ms is not None: + has_ms_expanded = has_ms.unsqueeze(1).float() # (batch, 1) + ms_pooled = ms_pooled * has_ms_expanded + + # ===== Structure Encoder ===== + struct_pooled = None + struct_logits = None + struct_hidden = None + + if self.config.use_3d and struct_token_ids is not None: + struct_hidden = self.struct_embeddings(struct_token_ids) + for layer in self.struct_layers: + struct_hidden = layer(struct_hidden, struct_attention_mask) + + struct_pooled = struct_hidden[:, 0, :] # [CLS] token + struct_logits = self.struct_mlm_head(struct_hidden) + + # Zero out structure representations for samples without 3D data + if has_3d is not None: + has_3d_expanded = has_3d.unsqueeze(1).float() # (batch, 1) + struct_pooled = struct_pooled * has_3d_expanded + + # ===== Cross-Attention (Sequence → VQ-VAE Structural Tokens) ===== + # Use residue-level alignment between WURCS tokens and VQ-VAE tokens + if self.config.use_cross_attention and struct_residue_ids is not None: + # Create residue-level mask + # WURCS token with residue_id=0 → VQ-VAE tokens with residue_id=0 + residue_mask = create_residue_level_mask( + seq_residue_ids=seq_residue_ids, + struct_residue_ids=struct_residue_ids, + ) # (batch, N_seq, N_struct) + + # Apply cross-attention: sequence tokens attend to VQ-VAE tokens + seq_hidden = self.cross_attention( + seq_hidden=seq_hidden, + struct_hidden=struct_hidden, # VQ-VAE token features + attention_mask=residue_mask, # Residue-based mask + ) + + # Update seq_pooled after cross-attention + seq_pooled = seq_hidden[:, 0, :] + + # ===== Fusion ===== + # Project to common hidden size + ms_pooled_projected = self.ms_projection(ms_pooled) + + if self.config.use_3d and struct_pooled is not None: + struct_pooled_projected = self.struct_projection(struct_pooled) + combined = torch.cat([seq_pooled, ms_pooled_projected, struct_pooled_projected], dim=-1) + else: + combined = torch.cat([seq_pooled, ms_pooled_projected], dim=-1) + + fused_repr = self.fusion_layer(combined) + + # ===== Compute Losses ===== + total_loss = None + seq_loss = None + ms_loss = None + struct_loss = None + dist_loss = None # NEW: Topology loss + + if seq_labels is not None: + loss_fct = nn.CrossEntropyLoss(ignore_index=-100) + seq_loss = loss_fct( + seq_logits.view(-1, self.config.seq_vocab_size), + seq_labels.view(-1) + ) + + if ms_labels is not None: + ms_labels_masked = ms_labels.clone() + ms_labels_masked[~has_ms] = -100 + # Only compute loss if there are valid labels (not all -100) + if (ms_labels_masked != -100).any(): + loss_fct = nn.CrossEntropyLoss(ignore_index=-100) + ms_loss = loss_fct( + ms_logits.view(-1, self.config.ms_total_vocab_size), + ms_labels_masked.view(-1) + ) + else: + ms_loss = torch.tensor(0.0, device=seq_token_ids.device) + + if self.config.use_3d and struct_labels is not None and struct_logits is not None: + struct_labels_masked = struct_labels.clone() + if has_3d is not None: + struct_labels_masked[~has_3d] = -100 + # Only compute loss if there are valid labels (not all -100) + if (struct_labels_masked != -100).any(): + loss_fct = nn.CrossEntropyLoss(ignore_index=-100) + struct_loss = loss_fct( + struct_logits.view(-1, self.config.struct_vocab_size), + struct_labels_masked.view(-1) + ) + else: + struct_loss = torch.tensor(0.0, device=seq_token_ids.device) + + # ===== Distance Loss (Topology) ===== + if dist_labels is not None: + # dist_predictions: (Batch, Seq, Seq, 1) -> (Batch, Seq, Seq) + preds = dist_predictions.squeeze(-1) + + # Create mask for valid distance pairs (label != -1) + # Also respect attention mask to avoid padding + valid_mask = (dist_labels != -1) & (seq_attention_mask.unsqueeze(1) * seq_attention_mask.unsqueeze(2) == 1) + + if valid_mask.sum() > 0: + # MSE loss on valid positions only + loss_fct = nn.MSELoss() + dist_loss = loss_fct(preds[valid_mask], dist_labels[valid_mask].float()) + else: + dist_loss = torch.tensor(0.0, device=seq_token_ids.device) + + # Weighted combination + losses = [] + if seq_loss is not None: + losses.append(self.config.seq_loss_weight * seq_loss) + if ms_loss is not None: + losses.append(self.config.ms_loss_weight * ms_loss) + if struct_loss is not None: + losses.append(self.config.struct_loss_weight * struct_loss) + if dist_loss is not None: + losses.append(self.config.dist_loss_weight * dist_loss) + + if losses: + total_loss = sum(losses) + + if return_dict: + return { + 'loss': total_loss, + 'seq_loss': seq_loss, + 'ms_loss': ms_loss, + 'struct_loss': struct_loss, + 'dist_loss': dist_loss, + 'seq_logits': seq_logits, + 'ms_logits': ms_logits, + 'struct_logits': struct_logits, + 'dist_predictions': dist_predictions, # Return distance predictions + 'seq_hidden': seq_hidden, + 'ms_hidden': ms_hidden, + 'struct_hidden': struct_hidden, + 'seq_pooled': seq_pooled, + 'ms_pooled': ms_pooled, + 'struct_pooled': struct_pooled, + 'fused_repr': fused_repr, + } + else: + return (total_loss, seq_logits, ms_logits, struct_logits, fused_repr) + + def get_multimodal_representation( + self, + seq_token_ids: torch.Tensor, + seq_attention_mask: torch.Tensor, + seq_residue_ids: torch.Tensor, + ms_token_ids: torch.Tensor, + ms_attention_mask: torch.Tensor, + has_ms: torch.Tensor, + struct_token_ids: Optional[torch.Tensor] = None, + struct_attention_mask: Optional[torch.Tensor] = None, + struct_residue_ids: Optional[torch.Tensor] = None, + has_3d: Optional[torch.Tensor] = None, + ) -> torch.Tensor: + """Get fused multimodal representation (for inference).""" + outputs = self.forward( + seq_token_ids=seq_token_ids, + seq_attention_mask=seq_attention_mask, + seq_residue_ids=seq_residue_ids, + ms_token_ids=ms_token_ids, + ms_attention_mask=ms_attention_mask, + has_ms=has_ms, + struct_token_ids=struct_token_ids, + struct_attention_mask=struct_attention_mask, + struct_residue_ids=struct_residue_ids, + has_3d=has_3d, + return_dict=True, + ) + return outputs['fused_repr'] + + +if __name__ == "__main__": + # Test the model + print("="*80) + print("Testing Multimodal GlycanBERT v3") + print("="*80) + + # Create config + config = MultimodalGlycanBERTConfig( + seq_vocab_size=166, + seq_hidden_size=768, + seq_num_layers=12, + seq_num_heads=12, + ms_vocab_size=242, + ms_hidden_size=384, + ms_num_layers=6, + ms_num_heads=6, + struct_vocab_size=1024, + struct_hidden_size=512, + struct_num_layers=8, + struct_num_heads=8, + use_3d=True, + use_cross_attention=True, + seq_loss_weight=0.60, + ms_loss_weight=0.15, + struct_loss_weight=0.25, + ) + + print(f"\nConfig:") + print(f" Sequence vocab: {config.seq_vocab_size}") + print(f" MS vocab: {config.ms_vocab_size}") + print(f" Structure vocab: {config.struct_vocab_size}") + print(f" Loss weights: seq={config.seq_loss_weight}, ms={config.ms_loss_weight}, struct={config.struct_loss_weight}") + + # Create model + model = MultimodalGlycanBERT(config) + + # Count parameters + total_params = sum(p.numel() for p in model.parameters()) + trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad) + + print(f"\nModel Parameters:") + print(f" Total: {total_params:,}") + print(f" Trainable: {trainable_params:,}") + + # Test forward pass + print(f"\n{'='*80}") + print("Testing Forward Pass (with Conv front-end)") + print("="*80) + + batch_size = 4 + seq_len = 128 + ms_len = 50 + struct_len = 40 + + # Create dummy inputs + seq_token_ids = torch.randint(0, config.seq_vocab_size, (batch_size, seq_len)) + seq_attention_mask = torch.ones(batch_size, seq_len) + # Approximate: ~5 tokens per residue + seq_residue_ids = torch.div( + torch.arange(seq_len), 5, rounding_mode="floor" + ).unsqueeze(0).expand(batch_size, -1) + + ms_token_ids = torch.randint(config.ms_vocab_offset, config.ms_total_vocab_size, (batch_size, ms_len)) + ms_attention_mask = torch.ones(batch_size, ms_len) + struct_token_ids = torch.randint(0, config.struct_vocab_size, (batch_size, struct_len)) + struct_attention_mask = torch.ones(batch_size, struct_len) + # Approximate: 4 tokens per residue for VQ-VAE tokens + struct_residue_ids = torch.div( + torch.arange(struct_len), 4, rounding_mode="floor" + ).unsqueeze(0).expand(batch_size, -1) + + has_ms = torch.tensor([True, True, False, True]) + has_3d = torch.tensor([True, False, True, True]) + + # Create labels for MLM + seq_labels = seq_token_ids.clone() + seq_labels[seq_labels != config.mask_token_id] = -100 + ms_labels = ms_token_ids.clone() + ms_labels[ms_labels != config.mask_token_id] = -100 + struct_labels = struct_token_ids.clone() + struct_labels[struct_labels != config.mask_token_id] = -100 + + # Forward pass + outputs = model( + seq_token_ids=seq_token_ids, + seq_attention_mask=seq_attention_mask, + seq_residue_ids=seq_residue_ids, + ms_token_ids=ms_token_ids, + ms_attention_mask=ms_attention_mask, + has_ms=has_ms, + struct_token_ids=struct_token_ids, + struct_attention_mask=struct_attention_mask, + struct_residue_ids=struct_residue_ids, + has_3d=has_3d, + seq_labels=seq_labels, + ms_labels=ms_labels, + struct_labels=struct_labels, + ) + + print(f"\nOutput shapes:") + print(f" seq_logits: {outputs['seq_logits'].shape}") + print(f" ms_logits: {outputs['ms_logits'].shape}") + print(f" struct_logits: {outputs['struct_logits'].shape}") + print(f" fused_repr: {outputs['fused_repr'].shape}") + + print(f"\nLosses:") + print(f" Total loss: {outputs['loss'].item():.4f}") + print(f" Sequence loss: {outputs['seq_loss'].item():.4f}") + print(f" MS loss: {outputs['ms_loss'].item():.4f}") + print(f" Structure loss: {outputs['struct_loss'].item():.4f}") + + print(f"\n{'='*80}") + print("Model Test Complete!") + print("="*80) + diff --git a/releases/2026-10-02/bertose_source/data/bpe_vocabulary.json b/releases/2026-10-02/bertose_source/data/bpe_vocabulary.json new file mode 100644 index 0000000000000000000000000000000000000000..23ef7f12a75bf93e6a961a87272f2baaed03adaa --- /dev/null +++ b/releases/2026-10-02/bertose_source/data/bpe_vocabulary.json @@ -0,0 +1,2612 @@ +{ + "special_tokens": { + "[PAD]": 0, + "[UNK]": 1, + "[START]": 2, + "[END]": 3, + "[MASK]": 4, + "[BRANCH_OPEN]": 5, + "[BRANCH_CLOSE]": 6, + "[LINK]": 7, + "[MOD]": 8, + "[RESIDUE_ERROR]": 9 + }, + "token_to_id": { + "[PAD]": 0, + "[UNK]": 1, + "[START]": 2, + "[END]": 3, + "[MASK]": 4, + "[BRANCH_OPEN]": 5, + "[BRANCH_CLOSE]": 6, + "[LINK]": 7, + "[MOD]": 8, + "[RESIDUE_ERROR]": 9, + "#": 10, + "$": 11, + "%": 12, + "(": 13, + ")": 14, + "*": 15, + "-": 16, + ".": 17, + "/": 18, + "0": 19, + "1": 20, + "2": 21, + "3": 22, + "4": 23, + "5": 24, + "6": 25, + "7": 26, + "8": 27, + "9": 28, + "<": 29, + "=": 30, + ">": 31, + "?": 32, + "A": 33, + "B": 34, + "C": 35, + "D": 36, + "E": 37, + "F": 38, + "G": 39, + "H": 40, + "I": 41, + "J": 42, + "K": 43, + "L": 44, + "M": 45, + "N": 46, + "O": 47, + "P": 48, + "Q": 49, + "R": 50, + "S": 51, + "T": 52, + "U": 53, + "V": 54, + "W": 55, + "X": 56, + "Y": 57, + "Z": 58, + "^": 59, + "a": 60, + "b": 61, + "c": 62, + "d": 63, + "e": 64, + "f": 65, + "g": 66, + "h": 67, + "i": 68, + "j": 69, + "k": 70, + "l": 71, + "m": 72, + "n": 73, + "o": 74, + "p": 75, + "q": 76, + "r": 77, + "s": 78, + "t": 79, + "u": 80, + "v": 81, + "w": 82, + "x": 83, + "y": 84, + "z": 85, + "{": 86, + "|": 87, + "}": 88, + "~": 89, + "?|": 90, + "12": 91, + "1-": 92, + "-1": 93, + "1-5": 94, + "h-1": 95, + "122": 96, + "CC": 97, + "a2": 98, + "/3": 99, + "=O": 100, + "/3=O": 101, + "122h-1": 102, + "*N": 103, + "CC/3=O": 104, + "xx": 105, + "*NCC/3=O": 106, + "2*NCC/3=O": 107, + "a?|": 108, + "a?|b": 109, + "?|c": 110, + "a?|b?|c": 111, + "?|d": 112, + "a?|b?|c?|d": 113, + "?|e": 114, + "a?|b?|c?|d?|e": 115, + "?|f": 116, + "a?|b?|c?|d?|e?|f": 117, + "?-": 118, + "a2122h-1": 119, + "?|g": 120, + "a?|b?|c?|d?|e?|f?|g": 121, + "?|h": 122, + "a?|b?|c?|d?|e?|f?|g?|h": 123, + "?|i": 124, + "a?|b?|c?|d?|e?|f?|g?|h?|i": 125, + "?|j": 126, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j": 127, + "112": 128, + "?|k": 129, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k": 130, + "?|l": 131, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l": 132, + "a2112": 133, + "?|m": 134, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m": 135, + "a2112h-1": 136, + "4-": 137, + "a1": 138, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|": 139, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n": 140, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|": 141, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o": 142, + "?}": 143, + "a1122h-1": 144, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|": 145, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p": 146, + "?}-": 147, + "?}-{": 148, + "2-": 149, + "122h": 150, + "a2122h-1b": 151, + "3-": 152, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|": 153, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q": 154, + "*O": 155, + "xxxx": 156, + "b1": 157, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|": 158, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r": 159, + "a2122h-1x": 160, + "c1": 161, + "d1": 162, + "a2112h-1b": 163, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|": 164, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s": 165, + "m-1": 166, + "21": 167, + "1221": 168, + "6-": 169, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|": 170, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t": 171, + "CCCC": 172, + "u2": 173, + "e1": 174, + "a1122h-1a": 175, + "-2": 176, + "uxxxx": 177, + "a2112h-1x": 178, + "122h-2": 179, + "h-1x": 180, + "Aa": 181, + "2-6": 182, + "d21": 183, + "f1": 184, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|": 185, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u": 186, + "a1221": 187, + "O/3=O": 188, + "a1221m-1": 189, + "uxxxxh": 190, + "Aad21": 191, + "Aad21122h-2": 192, + "a4-": 193, + "a1122h-1x": 194, + "a?-": 195, + "axxxx": 196, + "c?-": 197, + "*OC": 198, + "5*NCC/3=O": 199, + "a4-b1": 200, + "axxxxh-1x": 201, + "g1": 202, + "h1": 203, + "u2122h": 204, + "b?-": 205, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|": 206, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v": 207, + "b4-": 208, + "a?-b1": 209, + "i1": 210, + "b4-c1": 211, + "d?-": 212, + "a1221m-1a": 213, + "CCCCCC": 214, + "*OCC/3=O": 215, + "b?-c1": 216, + "c3-": 217, + "j1": 218, + "CCCCCC$": 219, + "(CCCCCC$": 220, + "Aad21122h-2a": 221, + "a1122h-1b": 222, + "a2122h-1a": 223, + "(CCCCCC$4": 224, + "*OC(CCCCCC$4": 225, + "c3-d1": 226, + "*OC(CCCCCC$4)": 227, + "c?-d1": 228, + "SO/3=O": 229, + "SO/3=O/3=O": 230, + "a6-": 231, + "112h": 232, + "k1": 233, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|": 234, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w": 235, + "Aad21122h-2x": 236, + "a3-": 237, + "A-1": 238, + "a1221m-1x": 239, + "d?-e1": 240, + "*OSO/3=O/3=O": 241, + "a3-b1": 242, + "e?-": 243, + "1-?": 244, + "c6-": 245, + "b3-": 246, + "h-1a": 247, + "d2-": 248, + "u2112h": 249, + "d2-e1": 250, + "211": 251, + "l1": 252, + "2*N": 253, + "a2112h-1a": 254, + "e4-": 255, + "5*N": 256, + "AU": 257, + "u1": 258, + "a11221": 259, + "c4-": 260, + "e?-f1": 261, + "m-1a": 262, + "b3-c1": 263, + "CCO/3=O": 264, + "a2211": 265, + "5*NCCO/3=O": 266, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|": 267, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x": 268, + "m1": 269, + "3|": 270, + "f?-": 271, + "*OP": 272, + "d4-": 273, + "e4-f1": 274, + "a212": 275, + "a2122": 276, + "h2": 277, + "n1": 278, + "m-1x": 279, + "u1122h": 280, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|": 281, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y": 282, + "-b1": 283, + "h-1b": 284, + "xh": 285, + "11": 286, + "a11221h-1a": 287, + "/3O/3=O": 288, + "a2211m-1a": 289, + "c4-d1": 290, + "g?-": 291, + "a2122A-1": 292, + "1-4": 293, + "*OPO": 294, + "o1": 295, + "6*OSO/3=O/3=O": 296, + "g2": 297, + "i?-": 298, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?}-{": 299, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t": 300, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?": 301, + "*OC(CCCCCC$4)/3=O": 302, + "h?-": 303, + "22": 304, + "Aad1": 305, + "e3-": 306, + "AUd21": 307, + "AUd21122h": 308, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?}-{": 309, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u": 310, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?": 311, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?}-{": 312, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r": 313, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?": 314, + "Aad1122h-2": 315, + "f?-g1": 316, + "d3-": 317, + "b6-": 318, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?}-{": 319, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o": 320, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?": 321, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|": 322, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z": 323, + "f3-": 324, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?}-{": 325, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s": 326, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?": 327, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?}-{": 328, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p": 329, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?": 330, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?}-{": 331, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q": 332, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?": 333, + "3*OCC/3=O": 334, + "uxxxxm": 335, + "a1-": 336, + "g?-h1": 337, + "e3-f1": 338, + "2*OCC/3=O": 339, + "p1": 340, + "j?-": 341, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?}-{": 342, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l": 343, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?": 344, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?}-{": 345, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n": 346, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?": 347, + "h?-i1": 348, + "a2-b1": 349, + "^X": 350, + "3*OC": 351, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?}-{": 352, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v": 353, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?": 354, + "k?-": 355, + "4*OCC/3=O": 356, + "i?-j1": 357, + "a11221h-1x": 358, + "d3-e1": 359, + "6*OCC/3=O": 360, + "c2-": 361, + "c2": 362, + "u1221": 363, + "a1122": 364, + "a6-b1": 365, + "c2-d1": 366, + "u1221m": 367, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?}-{": 368, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m": 369, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?": 370, + "d4-e1": 371, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?}-{": 372, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k": 373, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?": 374, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|": 375, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A": 376, + "4-i1": 377, + "b2-": 378, + "*OPO/3O/3=O": 379, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?}-{": 380, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j": 381, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?": 382, + "d2": 383, + "h2-": 384, + "b2-c1": 385, + "l?-": 386, + "^XO": 387, + "q1": 388, + "4-h1": 389, + "dxxxx": 390, + "f3-g1": 391, + "A-1a": 392, + "AUdxxxx": 393, + "CCN": 394, + "h4-i1": 395, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|": 396, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B": 397, + "~n": 398, + "a2122A-1b": 399, + "xh-1": 400, + "A-1x": 401, + "i4-": 402, + "j?-k1": 403, + "3*OC(CCCCCC$4)": 404, + "a211": 405, + "2*OSO/3=O/3=O": 406, + "m?-": 407, + "g4-h1": 408, + "r1": 409, + "a?|b?|c?|d?|e?|f?|g?|h?|i?}-{": 410, + "a?|b?|c?|d?|e?|f?|g?|h?|i?}-{a?|b?|c?|d?|e?|f?|g?|h?|i": 411, + "a?|b?|c?|d?|e?|f?|g?|h?|i?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?": 412, + "g2-": 413, + "a5": 414, + "g3-": 415, + "34": 416, + "m-1b": 417, + "k?-l1": 418, + "f?-g2": 419, + "a212h-1b": 420, + "C/": 421, + "a?|b?|c?|d?|e?|f?|g?|h?}-{": 422, + "a?|b?|c?|d?|e?|f?|g?|h?}-{a?|b?|c?|d?|e?|f?|g?|h": 423, + "a?|b?|c?|d?|e?|f?|g?|h?}-{a?|b?|c?|d?|e?|f?|g?|h?": 424, + "Aad1122h-2a": 425, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|": 426, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C": 427, + "i4-j1": 428, + "Aad1122h-2x": 429, + "a?|b?|c?|d?|e?|f?|g?}-{": 430, + "a?|b?|c?|d?|e?|f?|g?}-{a?|b?|c?|d?|e?|f?|g": 431, + "a?|b?|c?|d?|e?|f?|g?}-{a?|b?|c?|d?|e?|f?|g?": 432, + "d6-": 433, + "h2-i1": 434, + "2*NSO/3=O/3=O": 435, + "*OP^XO": 436, + "2*OC(CCCCCC$4)": 437, + "a2211m-1x": 438, + "ax": 439, + "f4-": 440, + "4|": 441, + "a?|b?|c?|d?|e?|f?}-{": 442, + "a?|b?|c?|d?|e?|f?}-{a?|b?|c?|d?|e?|f": 443, + "a?|b?|c?|d?|e?|f?}-{a?|b?|c?|d?|e?|f?": 444, + "f4-g1": 445, + "l?-m1": 446, + "e2-": 447, + "*OCC": 448, + "AUdxxxxxh": 449, + "h2122h": 450, + "e2-f1": 451, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?}-{": 452, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w": 453, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?": 454, + "b2": 455, + "i2-": 456, + "4*OC(CCCCCC$4)": 457, + "g2-h1": 458, + "a212h-1x": 459, + "j4-": 460, + "l4-": 461, + "g3-h1": 462, + "6*OC(CCCCCC$4)": 463, + "a2122A-1x": 464, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|": 465, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D": 466, + "e2": 467, + "O/": 468, + "i2-j1": 469, + "i3-": 470, + "a5-b1": 471, + "e4-g1": 472, + "a?|b?|c?|d?|e?}-{": 473, + "a?|b?|c?|d?|e?}-{a?|b?|c?|d?|e": 474, + "a?|b?|c?|d?|e?}-{a?|b?|c?|d?|e?": 475, + "f6-": 476, + "/3C": 477, + "s1": 478, + "j4-k1": 479, + "xh-1u": 480, + "h2112h": 481, + "h3-": 482, + "c6-h1": 483, + "k2-": 484, + "3*OSO/3=O/3=O": 485, + "l4-m1": 486, + "j2": 487, + "2-5": 488, + "a2121": 489, + "d1122h": 490, + "a4-c1": 491, + "AUd1122h": 492, + "n?-": 493, + "8-": 494, + "*OP^XOCCN": 495, + "2*OC": 496, + "a?|b?|c?|d?}-{": 497, + "a?|b?|c?|d?}-{a?|b?|c?|d": 498, + "a?|b?|c?|d?}-{a?|b?|c?|d?": 499, + "axx": 500, + "7-": 501, + "uxxxxxh": 502, + "f2-": 503, + "c6-g1": 504, + "j2-": 505, + "2*OC(CCCCCC$4)/3=O": 506, + "f2": 507, + "k4-": 508, + "m?-n1": 509, + "4*OSO/3=O/3=O": 510, + "f2-g1": 511, + "*OS": 512, + "h3-i1": 513, + "222": 514, + "k2-l1": 515, + "1221h": 516, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|": 517, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E": 518, + "axxxxm-1x": 519, + "i2": 520, + "u11221h": 521, + "4*OPO/3O/3=O": 522, + "334": 523, + "b6-c1": 524, + "c6-i1": 525, + "d4-h1": 526, + "d?-h1": 527, + "o?-": 528, + "k2": 529, + "6*OC": 530, + "a11222": 531, + "c?-i1": 532, + "a122h-1": 533, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|": 534, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F": 535, + "c?-h1": 536, + "3*OC(CCCCCC$4)/3=O": 537, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|": 538, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G": 539, + "i3-j1": 540, + "4*OC": 541, + "ha": 542, + "j2-k1": 543, + "j3-": 544, + "a4": 545, + "6|": 546, + "*OP^XOCCN/3O/3=O": 547, + "C/4": 548, + "a2112A-1a": 549, + "m4-": 550, + "n2": 551, + "c6-k1": 552, + "k4-l1": 553, + "ad": 554, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?}-{": 555, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x": 556, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?": 557, + "t1": 558, + "a21": 559, + "4*N": 560, + "u2211": 561, + "a?|b?|c?}-{": 562, + "a?|b?|c?}-{a?|b?|c": 563, + "a?|b?|c?}-{a?|b?|c?": 564, + "a12": 565, + "CCCCCCCC": 566, + "g6-": 567, + "f3-g2": 568, + "u2211m": 569, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|": 570, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H": 571, + "5-": 572, + "ha122h-2": 573, + "e6-": 574, + "h6-": 575, + "3|g": 576, + "c6-d1": 577, + "4*OC(CCCCCC$4)/3=O": 578, + "3*NCC/3=O": 579, + "2-?": 580, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|": 581, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I": 582, + "?}*OC": 583, + "C/3=O": 584, + "i6-": 585, + "c?-k1": 586, + "c?-g1": 587, + "l2-": 588, + "a22": 589 + }, + "merges": [ + [ + "?", + "|" + ], + [ + "1", + "2" + ], + [ + "1", + "-" + ], + [ + "-", + "1" + ], + [ + "1-", + "5" + ], + [ + "h", + "-1" + ], + [ + "12", + "2" + ], + [ + "C", + "C" + ], + [ + "a", + "2" + ], + [ + "/", + "3" + ], + [ + "=", + "O" + ], + [ + "/3", + "=O" + ], + [ + "122", + "h-1" + ], + [ + "*", + "N" + ], + [ + "CC", + "/3=O" + ], + [ + "x", + "x" + ], + [ + "*N", + "CC/3=O" + ], + [ + "2", + "*NCC/3=O" + ], + [ + "a", + "?|" + ], + [ + "a?|", + "b" + ], + [ + "?|", + "c" + ], + [ + "a?|b", + "?|c" + ], + [ + "?|", + "d" + ], + [ + "a?|b?|c", + "?|d" + ], + [ + "?|", + "e" + ], + [ + "a?|b?|c?|d", + "?|e" + ], + [ + "?|", + "f" + ], + [ + "a?|b?|c?|d?|e", + "?|f" + ], + [ + "?", + "-" + ], + [ + "a2", + "122h-1" + ], + [ + "?|", + "g" + ], + [ + "a?|b?|c?|d?|e?|f", + "?|g" + ], + [ + "?|", + "h" + ], + [ + "a?|b?|c?|d?|e?|f?|g", + "?|h" + ], + [ + "?|", + "i" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h", + "?|i" + ], + [ + "?|", + "j" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i", + "?|j" + ], + [ + "1", + "12" + ], + [ + "?|", + "k" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j", + "?|k" + ], + [ + "?|", + "l" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k", + "?|l" + ], + [ + "a2", + "112" + ], + [ + "?|", + "m" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l", + "?|m" + ], + [ + "a2112", + "h-1" + ], + [ + "4", + "-" + ], + [ + "a", + "1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|", + "n" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|", + "o" + ], + [ + "?", + "}" + ], + [ + "a1", + "122h-1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|", + "p" + ], + [ + "?}", + "-" + ], + [ + "?}-", + "{" + ], + [ + "2", + "-" + ], + [ + "122", + "h" + ], + [ + "a2122h-1", + "b" + ], + [ + "3", + "-" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|", + "q" + ], + [ + "*", + "O" + ], + [ + "xx", + "xx" + ], + [ + "b", + "1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|", + "r" + ], + [ + "a2122h-1", + "x" + ], + [ + "c", + "1" + ], + [ + "d", + "1" + ], + [ + "a2112h-1", + "b" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|", + "s" + ], + [ + "m", + "-1" + ], + [ + "2", + "1" + ], + [ + "122", + "1" + ], + [ + "6", + "-" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|", + "t" + ], + [ + "CC", + "CC" + ], + [ + "u", + "2" + ], + [ + "e", + "1" + ], + [ + "a1122h-1", + "a" + ], + [ + "-", + "2" + ], + [ + "u", + "xxxx" + ], + [ + "a2112h-1", + "x" + ], + [ + "122h", + "-2" + ], + [ + "h-1", + "x" + ], + [ + "A", + "a" + ], + [ + "2-", + "6" + ], + [ + "d", + "21" + ], + [ + "f", + "1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|", + "u" + ], + [ + "a", + "1221" + ], + [ + "O", + "/3=O" + ], + [ + "a1221", + "m-1" + ], + [ + "uxxxx", + "h" + ], + [ + "Aa", + "d21" + ], + [ + "Aad21", + "122h-2" + ], + [ + "a", + "4-" + ], + [ + "a1122h-1", + "x" + ], + [ + "a", + "?-" + ], + [ + "a", + "xxxx" + ], + [ + "c", + "?-" + ], + [ + "*O", + "C" + ], + [ + "5", + "*NCC/3=O" + ], + [ + "a4-", + "b1" + ], + [ + "axxxx", + "h-1x" + ], + [ + "g", + "1" + ], + [ + "h", + "1" + ], + [ + "u2", + "122h" + ], + [ + "b", + "?-" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|", + "v" + ], + [ + "b", + "4-" + ], + [ + "a?-", + "b1" + ], + [ + "i", + "1" + ], + [ + "b4-", + "c1" + ], + [ + "d", + "?-" + ], + [ + "a1221m-1", + "a" + ], + [ + "CCCC", + "CC" + ], + [ + "*O", + "CC/3=O" + ], + [ + "b?-", + "c1" + ], + [ + "c", + "3-" + ], + [ + "j", + "1" + ], + [ + "CCCCCC", + "$" + ], + [ + "(", + "CCCCCC$" + ], + [ + "Aad21122h-2", + "a" + ], + [ + "a1122h-1", + "b" + ], + [ + "a2122h-1", + "a" + ], + [ + "(CCCCCC$", + "4" + ], + [ + "*OC", + "(CCCCCC$4" + ], + [ + "c3-", + "d1" + ], + [ + "*OC(CCCCCC$4", + ")" + ], + [ + "c?-", + "d1" + ], + [ + "S", + "O/3=O" + ], + [ + "SO/3=O", + "/3=O" + ], + [ + "a", + "6-" + ], + [ + "112", + "h" + ], + [ + "k", + "1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|", + "w" + ], + [ + "Aad21122h-2", + "x" + ], + [ + "a", + "3-" + ], + [ + "A", + "-1" + ], + [ + "a1221m-1", + "x" + ], + [ + "d?-", + "e1" + ], + [ + "*O", + "SO/3=O/3=O" + ], + [ + "a3-", + "b1" + ], + [ + "e", + "?-" + ], + [ + "1-", + "?" + ], + [ + "c", + "6-" + ], + [ + "b", + "3-" + ], + [ + "h-1", + "a" + ], + [ + "d", + "2-" + ], + [ + "u2", + "112h" + ], + [ + "d2-", + "e1" + ], + [ + "21", + "1" + ], + [ + "l", + "1" + ], + [ + "2", + "*N" + ], + [ + "a2112h-1", + "a" + ], + [ + "e", + "4-" + ], + [ + "5", + "*N" + ], + [ + "A", + "U" + ], + [ + "u", + "1" + ], + [ + "a1", + "1221" + ], + [ + "c", + "4-" + ], + [ + "e?-", + "f1" + ], + [ + "m-1", + "a" + ], + [ + "b3-", + "c1" + ], + [ + "CC", + "O/3=O" + ], + [ + "a2", + "211" + ], + [ + "5*N", + "CCO/3=O" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|", + "x" + ], + [ + "m", + "1" + ], + [ + "3", + "|" + ], + [ + "f", + "?-" + ], + [ + "*O", + "P" + ], + [ + "d", + "4-" + ], + [ + "e4-", + "f1" + ], + [ + "a2", + "12" + ], + [ + "a2", + "122" + ], + [ + "h", + "2" + ], + [ + "n", + "1" + ], + [ + "m-1", + "x" + ], + [ + "u1", + "122h" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|", + "y" + ], + [ + "-", + "b1" + ], + [ + "h-1", + "b" + ], + [ + "x", + "h" + ], + [ + "1", + "1" + ], + [ + "a11221", + "h-1a" + ], + [ + "/3", + "O/3=O" + ], + [ + "a2211", + "m-1a" + ], + [ + "c4-", + "d1" + ], + [ + "g", + "?-" + ], + [ + "a2122", + "A-1" + ], + [ + "1-", + "4" + ], + [ + "*OP", + "O" + ], + [ + "o", + "1" + ], + [ + "6", + "*OSO/3=O/3=O" + ], + [ + "g", + "2" + ], + [ + "i", + "?-" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t", + "?" + ], + [ + "*OC(CCCCCC$4)", + "/3=O" + ], + [ + "h", + "?-" + ], + [ + "2", + "2" + ], + [ + "Aa", + "d1" + ], + [ + "e", + "3-" + ], + [ + "AU", + "d21" + ], + [ + "AUd21", + "122h" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r", + "?" + ], + [ + "Aad1", + "122h-2" + ], + [ + "f?-", + "g1" + ], + [ + "d", + "3-" + ], + [ + "b", + "6-" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|", + "z" + ], + [ + "f", + "3-" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q", + "?" + ], + [ + "3", + "*OCC/3=O" + ], + [ + "uxxxx", + "m" + ], + [ + "a", + "1-" + ], + [ + "g?-", + "h1" + ], + [ + "e3-", + "f1" + ], + [ + "2", + "*OCC/3=O" + ], + [ + "p", + "1" + ], + [ + "j", + "?-" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n", + "?" + ], + [ + "h?-", + "i1" + ], + [ + "a2", + "-b1" + ], + [ + "^", + "X" + ], + [ + "3", + "*OC" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v", + "?" + ], + [ + "k", + "?-" + ], + [ + "4", + "*OCC/3=O" + ], + [ + "i?-", + "j1" + ], + [ + "a11221", + "h-1x" + ], + [ + "d3-", + "e1" + ], + [ + "6", + "*OCC/3=O" + ], + [ + "c", + "2-" + ], + [ + "c", + "2" + ], + [ + "u", + "1221" + ], + [ + "a1", + "122" + ], + [ + "a6-", + "b1" + ], + [ + "c2-", + "d1" + ], + [ + "u1221", + "m" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m", + "?" + ], + [ + "d4-", + "e1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|", + "A" + ], + [ + "4-", + "i1" + ], + [ + "b", + "2-" + ], + [ + "*OPO", + "/3O/3=O" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j", + "?" + ], + [ + "d", + "2" + ], + [ + "h", + "2-" + ], + [ + "b2-", + "c1" + ], + [ + "l", + "?-" + ], + [ + "^X", + "O" + ], + [ + "q", + "1" + ], + [ + "4-", + "h1" + ], + [ + "d", + "xxxx" + ], + [ + "f3-", + "g1" + ], + [ + "A-1", + "a" + ], + [ + "AU", + "dxxxx" + ], + [ + "CC", + "N" + ], + [ + "h", + "4-i1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|", + "B" + ], + [ + "~", + "n" + ], + [ + "a2122A-1", + "b" + ], + [ + "x", + "h-1" + ], + [ + "A-1", + "x" + ], + [ + "i", + "4-" + ], + [ + "j?-", + "k1" + ], + [ + "3", + "*OC(CCCCCC$4)" + ], + [ + "a2", + "11" + ], + [ + "2", + "*OSO/3=O/3=O" + ], + [ + "m", + "?-" + ], + [ + "g", + "4-h1" + ], + [ + "r", + "1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?}-{a?|b?|c?|d?|e?|f?|g?|h?|i", + "?" + ], + [ + "g", + "2-" + ], + [ + "a", + "5" + ], + [ + "g", + "3-" + ], + [ + "3", + "4" + ], + [ + "m-1", + "b" + ], + [ + "k?-", + "l1" + ], + [ + "f?-", + "g2" + ], + [ + "a212", + "h-1b" + ], + [ + "C", + "/" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?}-{", + "a?|b?|c?|d?|e?|f?|g?|h" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?}-{a?|b?|c?|d?|e?|f?|g?|h", + "?" + ], + [ + "Aad1122h-2", + "a" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|", + "C" + ], + [ + "i4-", + "j1" + ], + [ + "Aad1122h-2", + "x" + ], + [ + "a?|b?|c?|d?|e?|f?|g", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?}-{", + "a?|b?|c?|d?|e?|f?|g" + ], + [ + "a?|b?|c?|d?|e?|f?|g?}-{a?|b?|c?|d?|e?|f?|g", + "?" + ], + [ + "d", + "6-" + ], + [ + "h2-", + "i1" + ], + [ + "2*N", + "SO/3=O/3=O" + ], + [ + "*OP", + "^XO" + ], + [ + "2", + "*OC(CCCCCC$4)" + ], + [ + "a2211", + "m-1x" + ], + [ + "a", + "x" + ], + [ + "f", + "4-" + ], + [ + "4", + "|" + ], + [ + "a?|b?|c?|d?|e?|f", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?}-{", + "a?|b?|c?|d?|e?|f" + ], + [ + "a?|b?|c?|d?|e?|f?}-{a?|b?|c?|d?|e?|f", + "?" + ], + [ + "f4-", + "g1" + ], + [ + "l?-", + "m1" + ], + [ + "e", + "2-" + ], + [ + "*O", + "CC" + ], + [ + "AUdxxxx", + "xh" + ], + [ + "h2", + "122h" + ], + [ + "e2-", + "f1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w", + "?" + ], + [ + "b", + "2" + ], + [ + "i", + "2-" + ], + [ + "4", + "*OC(CCCCCC$4)" + ], + [ + "g2-", + "h1" + ], + [ + "a212", + "h-1x" + ], + [ + "j", + "4-" + ], + [ + "l", + "4-" + ], + [ + "g3-", + "h1" + ], + [ + "6", + "*OC(CCCCCC$4)" + ], + [ + "a2122A-1", + "x" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|", + "D" + ], + [ + "e", + "2" + ], + [ + "O", + "/" + ], + [ + "i2-", + "j1" + ], + [ + "i", + "3-" + ], + [ + "a5", + "-b1" + ], + [ + "e4-", + "g1" + ], + [ + "a?|b?|c?|d?|e", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?}-{", + "a?|b?|c?|d?|e" + ], + [ + "a?|b?|c?|d?|e?}-{a?|b?|c?|d?|e", + "?" + ], + [ + "f", + "6-" + ], + [ + "/3", + "C" + ], + [ + "s", + "1" + ], + [ + "j4-", + "k1" + ], + [ + "xh-1", + "u" + ], + [ + "h2", + "112h" + ], + [ + "h", + "3-" + ], + [ + "c6-", + "h1" + ], + [ + "k", + "2-" + ], + [ + "3", + "*OSO/3=O/3=O" + ], + [ + "l4-", + "m1" + ], + [ + "j", + "2" + ], + [ + "2-", + "5" + ], + [ + "a212", + "1" + ], + [ + "d1", + "122h" + ], + [ + "a4-", + "c1" + ], + [ + "AU", + "d1122h" + ], + [ + "n", + "?-" + ], + [ + "8", + "-" + ], + [ + "*OP^XO", + "CCN" + ], + [ + "2", + "*OC" + ], + [ + "a?|b?|c?|d", + "?}-{" + ], + [ + "a?|b?|c?|d?}-{", + "a?|b?|c?|d" + ], + [ + "a?|b?|c?|d?}-{a?|b?|c?|d", + "?" + ], + [ + "a", + "xx" + ], + [ + "7", + "-" + ], + [ + "uxxxx", + "xh" + ], + [ + "f", + "2-" + ], + [ + "c6-", + "g1" + ], + [ + "j", + "2-" + ], + [ + "2", + "*OC(CCCCCC$4)/3=O" + ], + [ + "f", + "2" + ], + [ + "k", + "4-" + ], + [ + "m?-", + "n1" + ], + [ + "4", + "*OSO/3=O/3=O" + ], + [ + "f2-", + "g1" + ], + [ + "*O", + "S" + ], + [ + "h3-", + "i1" + ], + [ + "22", + "2" + ], + [ + "k2-", + "l1" + ], + [ + "1221", + "h" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|", + "E" + ], + [ + "axxxx", + "m-1x" + ], + [ + "i", + "2" + ], + [ + "u1", + "1221h" + ], + [ + "4", + "*OPO/3O/3=O" + ], + [ + "3", + "34" + ], + [ + "b6-", + "c1" + ], + [ + "c6-", + "i1" + ], + [ + "d4-", + "h1" + ], + [ + "d?-", + "h1" + ], + [ + "o", + "?-" + ], + [ + "k", + "2" + ], + [ + "6", + "*OC" + ], + [ + "a1122", + "2" + ], + [ + "c?-", + "i1" + ], + [ + "a", + "122h-1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|", + "F" + ], + [ + "c?-", + "h1" + ], + [ + "3", + "*OC(CCCCCC$4)/3=O" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|", + "G" + ], + [ + "i3-", + "j1" + ], + [ + "4", + "*OC" + ], + [ + "h", + "a" + ], + [ + "j2-", + "k1" + ], + [ + "j", + "3-" + ], + [ + "a", + "4" + ], + [ + "6", + "|" + ], + [ + "*OP^XOCCN", + "/3O/3=O" + ], + [ + "C/", + "4" + ], + [ + "a2112", + "A-1a" + ], + [ + "m", + "4-" + ], + [ + "n", + "2" + ], + [ + "c6-", + "k1" + ], + [ + "k4-", + "l1" + ], + [ + "a", + "d" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x", + "?}-{" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x", + "?" + ], + [ + "t", + "1" + ], + [ + "a2", + "1" + ], + [ + "4", + "*N" + ], + [ + "u2", + "211" + ], + [ + "a?|b?|c", + "?}-{" + ], + [ + "a?|b?|c?}-{", + "a?|b?|c" + ], + [ + "a?|b?|c?}-{a?|b?|c", + "?" + ], + [ + "a", + "12" + ], + [ + "CCCC", + "CCCC" + ], + [ + "g", + "6-" + ], + [ + "f3-", + "g2" + ], + [ + "u2211", + "m" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|", + "H" + ], + [ + "5", + "-" + ], + [ + "ha", + "122h-2" + ], + [ + "e", + "6-" + ], + [ + "h", + "6-" + ], + [ + "3|", + "g" + ], + [ + "c6-", + "d1" + ], + [ + "4", + "*OC(CCCCCC$4)/3=O" + ], + [ + "3", + "*NCC/3=O" + ], + [ + "2-", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|", + "I" + ], + [ + "?}", + "*OC" + ], + [ + "C", + "/3=O" + ], + [ + "i", + "6-" + ], + [ + "c?-", + "k1" + ], + [ + "c?-", + "g1" + ], + [ + "l", + "2-" + ], + [ + "a2", + "2" + ] + ], + "metadata": { + "vocab_size": 590, + "num_merges": 500 + } +} \ No newline at end of file diff --git a/releases/2026-10-02/bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_authority.json b/releases/2026-10-02/bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_authority.json new file mode 100644 index 0000000000000000000000000000000000000000..883c6432a443823afdcf9383987a10fdbc57c9ed --- /dev/null +++ b/releases/2026-10-02/bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_authority.json @@ -0,0 +1,511 @@ +{ + "artifacts": { + "development_expansion_manifest": { + "bytes": 2467731, + "name": "review_ms_acquisition_top30_development_expansion.tsv.gz", + "sha256": "f337cc115011dbdb2040f01142de00f42a28a68218a7441f721cd76b74a18753" + }, + "parent_manifest": { + "bytes": 78127, + "name": "review_ms_acquisition_top30_parents.tsv.gz", + "sha256": "10dc3fa7622e2a7e448d775f4082fdc84aa0622f9a7a74bcfaeed491c0eb7d39" + }, + "row_manifest": { + "bytes": 65148547, + "name": "review_ms_acquisition_top30_rows.tsv.gz", + "sha256": "cf1dd59bd0b11525e643b2b44e60ff3bebc374e83d671365f4d5ec1f1e2d3a49" + }, + "target_ids": { + "bytes": 26045132, + "name": "review_ms_acquisition_top30_target_ids_u16le.bin", + "sha256": "1d545f3d1ed77111f04298c632885b0809879ccc1dc4103c4ffc6f947a4bd472" + }, + "target_offsets": { + "bytes": 1800456, + "name": "review_ms_acquisition_top30_target_offsets_u64le.bin", + "sha256": "42eb4beae41b9ec821e1fcc0cf18d8f36041d6e2075605012c3f9070fca750cd" + } + }, + "counts": { + "active_acquisition_count": 225056, + "active_parent_count": 3035, + "active_target_token_count": 13022566, + "development_acquisition_count": 49573, + "development_parent_count": 580, + "train_acquisition_count": 175483, + "train_parent_count": 2455 + }, + "development_expansion_contract": { + "eligible_acquisition_count": 49573, + "eligible_parent_count": 580, + "every_eligible_ms_acquisition_required_for_each_output": true, + "ms_factorized_weight": "1/580 * 1/N_acquisition(parent)", + "ms_lane_acquisition_expansion_outputs": [ + "sequence", + "ms" + ], + "ms_local_reduction": "family mean within acquisition, acquisition mean within MS parent, then equal over 580 MS parents", + "replay_sha256": "e50dc962240b622d0cedfc42db0f1653d639bbd4a4f956ed611817222b84d453", + "schema": "bertose_a5_ms_development_expansion_v2", + "sequence_global_reduction": "equal parents over full eligible sequence development roster; composite-owned", + "sequence_ms_parent_reduction": "mean_acquisition within MS parent", + "sequence_no_ms_parent_view": "one no-MS view", + "sequence_source": "post-fusion shared_hidden", + "sequence_within_ms_parent_weight": "1/N_acquisition(parent); global parent denominator is composite-owned", + "static_development_nesting": "state within parent, then equal parents; separate from acquisition expansion", + "topology_code_evidence": "review_a5_composite_model_v2_r3.py SHA-256 ee62f065fb347d3967228bf2a17caad9f2e6c0bbb1c387ca2bebefec9713f90b: seq_logits uses shared_hidden at line 2037; topology_v2 receives seq_hidden_base at lines 2041-2046", + "topology_development_nesting": "pre-fusion seq_hidden_base; once per eligible topology parent on the full topology roster; never acquisition-expanded or restricted to MS parents", + "topology_roster_ownership": "composite must replay every eligible topology development parent exactly once; MS package supplies no topology roster filter" + }, + "implementation": { + "bytes": 43711, + "name": "review_a5_ms_acquisition_top30_runtime_v3.py", + "sha256": "68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6" + }, + "inputs": { + "count_child_authority": { + "bytes": 15090, + "name": "review_a5_ms_top30_count_child_authority.json", + "sha256": "70a38dffb73aa9a482bc2227dd874862896453b7a45e3441f2aa97ea9ac9fab9" + }, + "count_child_evidence": { + "bytes": 820, + "name": "review_a5_ms_top30_count_delta_evidence.tsv.gz", + "sha256": "dbdc6bbe0e8c4e17ab30908aaa510a09c522a8c4f8d154efac21b60a1453b2a8" + }, + "count_child_independent_certificate": { + "bytes": 2078, + "name": "review_a5_ms_top30_count_child_authority_independent_audit.json", + "sha256": "c708f81a39706a9af86bbf5fe2d859a53de19f565b9f4eae2ff12f62a066513e" + }, + "count_child_receipt": { + "bytes": 9916, + "name": "review_a5_ms_top30_count_child_receipt.json", + "sha256": "1bd22e3d7ac9312db567fdd9357b30e853ada4e7a5e2d23478f864422c3c7b15" + }, + "design_independent_certificate": { + "bytes": 5889, + "name": "review_a5_ms_acquisition_top30_independent_audit_r2.json", + "sha256": "158450a27ae9bb642c010d5a2275adacef491bcf14a0ba227beb96cc2eaaaa5f" + }, + "design_manifest": { + "bytes": 105029603, + "name": "review_a5_ms_acquisition_top30_manifest.tsv.gz", + "sha256": "bfe12eb3100552039dd18b217c899e15c75174b314b624deb72e320edc873e97" + }, + "design_receipt": { + "bytes": 6517, + "name": "review_a5_ms_acquisition_top30_receipt.json", + "sha256": "86913823e6c5c14924735575dffac37ec4264ec130b0eaafda05226f4a87880e" + }, + "design_summary": { + "bytes": 21986, + "name": "review_a5_ms_acquisition_top30_summary.json", + "sha256": "2fb09f48f204ed8fbf5edb8b109eba880b7de60ff40ce54f3d30cb41294a3211" + }, + "design_superseded_metadata_certificate": { + "bytes": 5470, + "name": "review_a5_ms_acquisition_top30_independent_audit.json", + "sha256": "dff09234ed4b6550bf5c9f17e32e2e4f356aaa18efb2a7a21e70ac9f568e6338" + }, + "design_train_only_null": { + "bytes": 8878, + "name": "review_a5_ms_acquisition_top30_train_only_null.json", + "sha256": "2f68b42c9201011a078ea806199fdf151473b4b6ff38a9273f1a53a63fed4493" + }, + "raw_clean_double_build_certificate": { + "bytes": 4617, + "name": "review_a5_ms_raw_to_top30_clean_double_build_r3_certificate.json", + "sha256": "f92f2c0c56acddbdf818d015cd8f7d9d99c0b98535c97624116fe92f7b9cb28e" + }, + "raw_end_to_end_receipt": { + "bytes": 11189, + "name": "review_a5_ms_raw_to_top30_end_to_end_receipt.json", + "sha256": "98c4bbf1088e28a0a56593fc66796ffba75235755c72adfe6e02f59c0f4a48e7" + }, + "raw_publication_certificate": { + "bytes": 7603, + "name": "review_a5_ms_raw_to_top30_published_r3_certificate.json", + "sha256": "d9f5845940f57af88d212d395bf90bcd4e8d5728d88060c460ad0784390a1bd5" + }, + "raw_transformation_authority": { + "bytes": 732729924, + "name": "review_a5_ms_primary_runtime_transformation_authority.tsv.gz", + "sha256": "d3c16f4bdbe8b35440855d1c83287c5bda12d512ec3b89ba0ca312829dddb7f4" + }, + "raw_transformation_authority_receipt": { + "bytes": 1367, + "name": "review_a5_ms_primary_runtime_transformation_authority_receipt.json", + "sha256": "e82ceec1a94ec2f250d28e4ed37e818aee234eb132ece9fec03f43fabc9d6378" + } + }, + "join_keys": { + "canonical_parent_identity": "canonical_wurcs", + "model_parent": "parent_glycorpus_id", + "physical_acquisition": "acquisition_identity_sha256", + "provenance_only": [ + "source_record_identity", + "source_record_identity_sha256", + "source_raw_numeric_coordinate_sha256", + "ledger_positive_parser_projection_sha256", + "raw_coordinate_container_sha256", + "raw_container_locator", + "raw_transformation_row_surface_sha256" + ], + "source_row": "row_key" + }, + "nova_jobs_submitted": false, + "null_ruler": { + "acquisition_count": 175483, + "atomic_record": "parent_glycorpus_id + acquisition_identity_sha256 + family + peak-pair label", + "development_rows_used_for_fit": 0, + "family_conditional_marginal_weight_formula": "1/N_parent * 1/N_acquisition(parent) * 1/N_peak_pair(acquisition); the common family factor 1/2 cancels after conditioning on family", + "family_mean_parent_risks": { + "intensity": 0.9538678814156866, + "mz": 5.058329202544485 + }, + "family_probabilities": { + "intensity": [ + 0.5197177353428715, + 0.36756454029956603, + 0.1127177243575615 + ], + "mz": [ + 0.0006405498650642573, + 0.0006021252988097924, + 0.0009749945211706317, + 0.0012252351748472381, + 0.0014919905269334868, + 0.0015897223541305183, + 0.0018750290482665633, + 0.0022325092284391297, + 0.0034832951393886616, + 0.0030005874190584293, + 0.0031870148335501544, + 0.002153589976904484, + 0.006199135195682838, + 0.0025635386139654104, + 0.005081629903518679, + 0.0021085111949207445, + 0.0049675443759019215, + 0.0026602408560569084, + 0.004910147907424021, + 0.0033596265935932593, + 0.007460028144741095, + 0.007342316510259218, + 0.009383699893628727, + 0.0035924973862568356, + 0.007300624112203328, + 0.003492257441496713, + 0.007360542338169046, + 0.007382295095945736, + 0.014832571097070722, + 0.004265176358855978, + 0.010263477266301528, + 0.0037736525044596487, + 0.010357919182143932, + 0.003968945641000579, + 0.009871247361505384, + 0.004710725207575534, + 0.006315269663161841, + 0.005157638724597456, + 0.007760572611057847, + 0.007187969630144797, + 0.0064124494773172445, + 0.005628045100877154, + 0.011602968806865377, + 0.010493624967610124, + 0.014841790030570219, + 0.006582790521429821, + 0.00750222517517576, + 0.010939826561705971, + 0.011289749262542014, + 0.009076003093031543, + 0.01059155518012925, + 0.006798531213847085, + 0.006580023268606618, + 0.006625866180657642, + 0.00809072231972558, + 0.007049768301782209, + 0.007619380290109273, + 0.013172914049614742, + 0.007973038587594817, + 0.013669095027737806, + 0.008854889943844537, + 0.010764243344026123, + 0.009261971480032959, + 0.011407087221082244, + 0.008275493172872357, + 0.014411502711840623, + 0.008746366070571238, + 0.008573085716761386, + 0.005291706775934269, + 0.009011519952519228, + 0.006988717495289838, + 0.009253048598594757, + 0.007821243894415412, + 0.011086758968541742, + 0.007673134347475936, + 0.011097951070032187, + 0.006218925559457332, + 0.009936426882326424, + 0.007959877939685212, + 0.011968876654308121, + 0.008339926878809802, + 0.012695391772888196, + 0.005731582712877305, + 0.009291721965872388, + 0.005613550406088611, + 0.009175948267808341, + 0.005978035242077504, + 0.008944619689293509, + 0.007367184276934726, + 0.007941269958145787, + 0.007299264060980651, + 0.007239133563442773, + 0.006612679564797478, + 0.006283524080156452, + 0.008149139416552757, + 0.009507867376475363, + 0.007738268726780698, + 0.007931483865568491, + 0.005231235554487748, + 0.00665149206592971, + 0.00650735399622342, + 0.007954727132383264, + 0.005030903411493357, + 0.007363008031486631, + 0.004293715643194716, + 0.005116324444397951, + 0.005079498064988057, + 0.005328559680790833, + 0.0047181521200511745, + 0.00452701797791838, + 0.005665956328012772, + 0.0056135415685971725, + 0.006477197736781981, + 0.0044094388131974156, + 0.004562203092508437, + 0.003927667497232976, + 0.00595400228271556, + 0.0044660876335546155, + 0.0043911564061610954, + 0.004415206577921035, + 0.003937588905054545, + 0.003719985017029448, + 0.003676435977917263, + 0.003814600894783378, + 0.003433020728342275, + 0.003935725556137375, + 0.00404266701069346, + 0.0028970529888585088, + 0.004150673826274117, + 0.0032579911376673146, + 0.004363882486274142, + 0.004270449886008418, + 0.0049071061870006915, + 0.003015248951052818, + 0.003807070235575648, + 0.002774851223097479, + 0.00292725217431102, + 0.0021288821303970945, + 0.0032297161628375686, + 0.0028509226016853015, + 0.0026799148798400474, + 0.001825988019983223, + 0.003292129599799677, + 0.001677051151594144, + 0.002439523654513002, + 0.00198363535229116, + 0.0037587177141866174, + 0.003490935731056946, + 0.002995263611964447, + 0.0018092325269436526, + 0.002247483981193846, + 0.0024445658007253178, + 0.002339234579099249, + 0.0017213923060684785, + 0.0026590153316273036, + 0.0013800374494157537, + 0.002284641032769585, + 0.0011368525865265914, + 0.0018214148728505491, + 0.0013022046110269289, + 0.0013966749830251343, + 0.0015469207178817875, + 0.0028377577479343882, + 0.002359877651502991, + 0.0020768239242850046, + 0.0016799064395334328, + 0.001560964204396998, + 0.002849456766570763, + 0.0018607669582667444, + 0.002124968758476105, + 0.0018335763283124742, + 0.001537877313231571, + 0.0011432679414856727, + 0.001173615019432312, + 0.0012124839173755315, + 0.001279967116160827, + 0.001498155553665475, + 0.001122604974469808, + 0.0014509640741489293, + 0.0012002230758373785, + 0.0011659033448112672, + 0.001313358414307407, + 0.001296550566618564, + 0.0020724105583319057, + 0.0015725440101973384, + 0.0021442389022742173, + 0.0014270560400526352, + 0.0013324118457630541, + 0.0009997932453970622, + 0.0011887167011727473, + 0.0007072343298746987, + 0.0013301494348818492, + 0.0006204627186076994, + 0.00039869722720875154, + 0.00043077402577967574, + 0.0004672031444357866, + 0.00039750241121630064, + 0.0005384150176558037, + 0.0008002933341730924, + 0.0008629090005762214, + 0.0006959207112273459, + 0.00040135183128836273, + 0.0004873041609817168, + 0.0005243254947311232, + 0.000664005589046579, + 0.0004979014294268761, + 0.0005286575931262811, + 0.00042244525643066514, + 0.00040993170463503857, + 0.00039515285548507293, + 0.00038376572004818074, + 0.00039552561334986583, + 0.00019519812609798947 + ] + }, + "family_target_counts": { + "intensity": 4770785, + "mz": 4770785 + }, + "finite_epoch_exposure_used_for_fit": false, + "fit_scope": "representation-clean pretraining_train acquisitions only", + "fixed_before_training": true, + "frozen_design_oracle_coefficients_preserved": true, + "independent_packed_recomputed_numeric_surface_sha256": "80cf1bc7092492cf486edbcff422e61c3ad77dde152b9376d79c7457f30697d1", + "independent_packed_recomputed_scale": 3.006098541980087, + "masking_estimator": "uniform without-replacement whole-peak-pair sample mean; both MZ and intensity labels are supervised for every selected pair", + "masking_estimator_unbiased_for_population_loss": true, + "maximum_absolute_difference_from_frozen_design_oracle": 4.440892098500626e-15, + "parent_count": 2455, + "population_atomic_weight_formula": "1/N_parent * 1/N_acquisition(parent) * 1/2 * 1/N_peak_pair(acquisition)", + "population_loss_formula": "mean_parent(mean_acquisition(0.5*(mean_peak_mz_nll + mean_peak_intensity_nll)))", + "pseudocount": 0.5, + "realized_schedule_epochs_used": [], + "recomputed_from_packed_primary_train_targets": true, + "scale": 3.006098541980086, + "support_kind": "all eligible pretraining_train acquisition peak-pair labels as a population expectation, not realized finite-epoch schedule exposure", + "target_token_count": 10243502, + "weighting": "equal parents, equal acquisitions within parent, equal family means within acquisition" + }, + "official_submitted_artifacts_modified": false, + "raw_to_top30_authority_binding": { + "all_row_parent_role_source_acquisition_target_joins_exact": true, + "authority_streamed_no_follow_not_loaded_wholesale": true, + "packed_runtime_binding_sha256": "5fe30dfcb673f450c600af76c70a10b225d26ae35d5d3a8cc603303dd10aafdd", + "raw_authority_file_sha256": "d3c16f4bdbe8b35440855d1c83287c5bda12d512ec3b89ba0ca312829dddb7f4", + "raw_authority_whole_surface_sha256": "83fbdd24bb99332329da7b31c8412e74fef169f3c8faede9e4e09db04f9f1200", + "raw_publication_certificate_sha256": "d9f5845940f57af88d212d395bf90bcd4e8d5728d88060c460ad0784390a1bd5", + "row_count": 225056, + "source_raw_differs_from_positive_parser_projection_count": 351, + "unique_raw_transformation_row_surface_count": 225056 + }, + "remaining_release_boundary": "This package certifies the MS lane only. Integrated four-objective model, optimizer, static, sequence/topology, checkpoint, and cluster release gates remain external.", + "schedule": { + "arm_and_unrelated_modality_invariant": true, + "development_all_acquisitions": true, + "development_parent_equal_reduction": true, + "fixture_epochs": [ + 0, + 1, + 7, + 17 + ], + "mask_rng_key_includes_acquisition_identity": true, + "once_per_parent_local_cycle": true, + "one_acquisition_per_parent_epoch": true, + "parent_order_domain": "bertose-a5-ms-parent-order-v1", + "population_binding_sha256": "35a729fc66db5fdb440b70843bccaf557ca2674635523ceff9e440bf8d99ee91", + "resume_binding": [ + "population_binding_sha256", + "schedule_schema", + "seed", + "epoch", + "global_parent_cursor", + "selected_prefix_sha256" + ], + "schema": "bertose_a5_ms_parent_cycle_hash_schedule_v1", + "seed": 43, + "selection_domain": "bertose-a5-ms-acquisition-view-selection-v1" + }, + "schema": "bertose_a5_ms_acquisition_top30_runtime_authority_v3", + "scientific_launch_authorized": false, + "status": "PASS_RUNTIME_PACKAGE_PREPARATION_ONLY", + "supersession": { + "predecessor_preserved_without_overwrite": true, + "predecessor_release_status": "NO_GO_SUPERSEDED", + "predecessor_runtime": { + "bytes": 33000, + "name": "review_a5_ms_acquisition_top30_runtime_v2.py", + "sha256": "94359f20bf8040e7758d2b793d5c78a6b3045cd726143b785d7d8cbbeda6aa14" + }, + "predecessor_schema": "bertose_a5_ms_acquisition_top30_runtime_v2", + "reason": "The predecessor accepted caller seed values for development corruption. The v3 successor exposes a separate development-mask API fixed to seed 0 and epoch 0.", + "successor_schema": "bertose_a5_ms_acquisition_top30_runtime_v3" + }, + "target_contract": { + "development_mask_api": "mask_development_target(row_index)", + "development_mask_epoch": 0, + "development_mask_seed": 0, + "development_mask_seed_or_epoch_caller_control": false, + "dtype": "uint16 little-endian", + "envelope": "[CLS=0,GLYCAN_ID=3,PEAKS=5,(MZ=29..241,INTENSITY=26..28)+,SEP=1]", + "intensity_levels": { + "high": 28, + "low": 26, + "medium": 27 + }, + "mask_pair_count_formula": "max(1, floor(N_peak_pair * 3 / 20))", + "mask_pair_probability_denominator": 20, + "mask_pair_probability_numerator": 3, + "mask_probability_runtime_configurable": false, + "mask_selection": "exact rational 3/20 of physical peak pairs via floor with minimum one pair; both the MZ and intensity token of each selected pair are supervised", + "maximum_length": 64, + "padding_id_at_collation_only": 2, + "peak_cap": 30, + "per_acquisition_equal_family_loss": "0.5*(mean selected MZ token NLL + mean selected intensity token NLL)", + "physical_condition_used": false, + "predecessor_vocabulary_metadata_non_authoritative": { + "parent_top_k": 50, + "reason": "These retained vocabulary JSON fields describe predecessor construction metadata, not the R3 target grammar. R3 TOP30 selection and target bytes are bound exclusively by the raw-to-TOP30 authority.", + "spectrum_top_k": 50, + "token_schema": "parent_consensus_pair_grammar_v1" + }, + "replacement_routing": { + "binary_float_thresholds_used": false, + "half_revealed_selected_pair_possible": false, + "mask": "exact cumulative interval [0,4/5)", + "random_same_family_excluding_original": "exact cumulative interval [4/5,9/10)", + "routing_unit": "one physical m/z+intensity peak pair", + "shared_route_draw_for_both_pair_tokens": true, + "unchanged": "exact cumulative interval [9/10,1)" + }, + "retention_time_used": false, + "selected_mz_intensity_counts_always_equal": true, + "training_mask_api": "mask_target(row_index, epoch, seed)", + "vocabulary_mapping_authority": "fixed IDs only: LOW/MED/HIGH=26/27/28 and MZ_8..MZ_220=29..241" + }, + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_independent_certificate.json b/releases/2026-10-02/bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_independent_certificate.json new file mode 100644 index 0000000000000000000000000000000000000000..dd21c84776edafad44d903ffcc06063df50131f8 --- /dev/null +++ b/releases/2026-10-02/bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_independent_certificate.json @@ -0,0 +1,466 @@ +{ + "authority": { + "bytes": 20541, + "name": "review_a5_ms_acquisition_top30_runtime_authority.json", + "sha256": "48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4" + }, + "certifier_implementation": { + "bytes": 49683, + "name": "certify_review_a5_ms_acquisition_top30_runtime_package_r3_20260721.py", + "sha256": "a1e2989e36876840ee10d555b1ab69e9876fb0483aec839bb5a44187e7a1122a" + }, + "checks": { + "all_225056_active_acquisition_targets_reopened_and_rehashed": true, + "all_225056_rows_rejoined_to_raw_r3_parent_source_acquisition_target_and_provenance": true, + "all_four_ms_active_factorial_cells_mask_identical": true, + "all_shortest_acquisitions_pass_pair_mask_contract": true, + "development_all_acquisitions_parent_equal_reduction": true, + "development_and_finite_epoch_rows_absent_from_null_fit": true, + "development_mask_fixed_seed0_epoch0_and_caller_control_absent": true, + "development_mask_repeat_and_factorial_cell_identity_pass": true, + "development_mask_seed_epoch_tamper_rejected": true, + "development_ms_and_sequence_within_parent_weights_and_replay_hash_independently_verified": true, + "development_sequence_and_ms_expand_every_eligible_ms_acquisition": true, + "epoch16_and_epoch100_acquisition_and_target_exposure_exact": true, + "every_valid_target_length_has_nonempty_equal_mz_intensity_pair_supervision": true, + "exact_13022566_target_tokens": true, + "exact_3_over_20_pair_count_boundaries_n20_n40_pass": true, + "exact_80_10_10_replacement_route_boundaries_pass": true, + "exact_resume_cursor_and_prefix_binding": true, + "exact_top30_train2455_175483_and_development580_49573_counts": true, + "factorial_arm_identity_absent_from_schedule_and_mask_apis": true, + "five_raw_provenance_hash_fields_bound_and_tamper_evident": true, + "four_epoch_schedules_independently_recomputed": true, + "mask_rng_includes_physical_acquisition_identity": true, + "no_selected_peak_pair_half_revealed_by_split_routing": true, + "null_matches_parent_then_acquisition_expected_sampling_estimand": true, + "null_support_is_full_train_population_not_finite_epoch_exposure": true, + "one_shared_replacement_route_per_selected_physical_pair": true, + "predecessor_runtime_hash_preserved_and_supersession_bound": true, + "predecessor_top50_vocabulary_metadata_explicitly_non_authoritative": true, + "random_replacement_same_family_and_excludes_original": true, + "shortest_acquisition_1024_seed_hash_sweep_passes": true, + "source_row_and_physical_acquisition_identifiers_unique": true, + "static_state_then_parent_nesting_kept_separate": true, + "tampered_resume_cursor_rejected": true, + "topology_pre_fusion_not_acquisition_expanded_or_ms_restricted": true, + "train_only_null_independently_recomputed_from_packed_targets": true, + "training_and_scientific_launch_false": true, + "whole_pair_mask_estimator_declared_unbiased_for_null_estimand": true, + "within_parent_sampling_is_source_and_condition_blind": true, + "world_size_1_2_3_4_8_disjoint_complete": true, + "zero_peak_pair_probability_rejected_for_active_ms": true, + "zero_primary_train_development_target_hash_intersection": true + }, + "counts": { + "role_parents": { + "pretraining_development": 580, + "pretraining_train": 2455 + }, + "role_rows": { + "pretraining_development": 49573, + "pretraining_train": 175483 + }, + "target_tokens": 13022566 + }, + "development_expansion": { + "eligible_acquisition_count": 49573, + "eligible_parent_count": 580, + "manifest": { + "bytes": 2467731, + "name": "review_ms_acquisition_top30_development_expansion.tsv.gz", + "sha256": "f337cc115011dbdb2040f01142de00f42a28a68218a7441f721cd76b74a18753" + }, + "ms_factorized_weight": "1/580 * 1/N_acquisition(parent)", + "ms_lane_acquisition_expansion_outputs": [ + "sequence", + "ms" + ], + "replay_sha256": "e50dc962240b622d0cedfc42db0f1653d639bbd4a4f956ed611817222b84d453", + "sequence_within_ms_parent_weight": "1/N_acquisition(parent); global parent denominator is composite-owned", + "static_development_nesting": "state within parent, then equal parents; separate from acquisition expansion", + "topology_development_nesting": "pre-fusion seq_hidden_base; once per eligible topology parent on the full topology roster; never acquisition-expanded or restricted to MS parents" + }, + "development_fixed_mask_sha256": "6e63678cd8ddb4529370398e64e4b8819acefc90481f6a74ffb8e487486869ae", + "development_parent_equal_fixture": 8.197980484692945, + "finite_window_exposure": { + "epoch_windows": { + "100": { + "absolute_relative_null_difference": 6.160079253677961e-06, + "declared_full_train_expected_null_scale": 3.006098541980086, + "epochs": 100, + "presentation_condition_signature_present_counts": { + "absent": 234200, + "present": 11300 + }, + "presentation_count": 245500, + "presentation_source_counts": { + "bounded": 87400, + "candy_cc2_test": 11300, + "gap_rescue": 900, + "legacy": 145900 + }, + "realized_minus_expected_null": -1.8517805262963094e-05, + "realized_schedule_null_risk": 3.006080024174823, + "unique_acquisition_condition_signature_present_counts": { + "absent": 55933, + "present": 4959 + }, + "unique_acquisition_count": 60892, + "unique_acquisition_coverage_fraction": 0.34699657516682525, + "unique_acquisition_source_counts": { + "bounded": 1225, + "candy_cc2_test": 4959, + "gap_rescue": 10, + "legacy": 54698 + }, + "unique_parent_target_pair_count": 60568, + "unique_target_hash_count": 60361, + "unique_target_hash_coverage_fraction": 0.3470538856052069 + }, + "16": { + "absolute_relative_null_difference": 9.750531018454421e-05, + "declared_full_train_expected_null_scale": 3.006098541980086, + "epochs": 16, + "presentation_condition_signature_present_counts": { + "absent": 37472, + "present": 1808 + }, + "presentation_count": 39280, + "presentation_source_counts": { + "bounded": 13984, + "candy_cc2_test": 1808, + "gap_rescue": 144, + "legacy": 23344 + }, + "realized_minus_expected_null": 0.0002931105707810744, + "realized_schedule_null_risk": 3.006391652550867, + "unique_acquisition_condition_signature_present_counts": { + "absent": 17362, + "present": 1286 + }, + "unique_acquisition_count": 18648, + "unique_acquisition_coverage_fraction": 0.1062667038972436, + "unique_acquisition_source_counts": { + "bounded": 1225, + "candy_cc2_test": 1286, + "gap_rescue": 10, + "legacy": 16127 + }, + "unique_parent_target_pair_count": 18598, + "unique_target_hash_count": 18490, + "unique_target_hash_coverage_fraction": 0.10631080241944757 + } + }, + "finite_window_interpretation": "The deterministic seed-43 realization is label-blind within parent. Source-level presentation frequencies reflect equal parent weighting, not the global acquisition histogram.", + "finite_window_null_alignment_rule": "Absolute realized-minus-population null difference divided by the fixed population null scale must be below 1e-4; exact finite-window equality is not expected.", + "global_acquisition_proportional_sampling": false, + "global_acquisition_to_target_redundancy_count": 1559, + "global_parent_target_pair_count": 174489, + "global_unique_target_hash_count": 173924, + "maximum_acquisitions_per_parent": 5116, + "parents_with_more_than_100_acquisitions": 315, + "parents_with_multiple_source_families": 0, + "sampling_estimand": "equal parents; within each parent, acquisition-uniform SHA-256 permutation without replacement per local cycle", + "source_or_condition_used_by_ranking": false, + "train_acquisition_count": 175483, + "within_parent_acquisition_to_target_redundancy_count": 994 + }, + "ms_active_cell_mask_sha256": "2a8f9e16e723407c6762ce2f36aa5bdbe326efa32575268aba2d9b738b623b37", + "nova_jobs_submitted": false, + "null_and_reducer_alignment": { + "aligned": true, + "finite_window_relative_difference_tolerance_exclusive": 0.0001, + "independent_packed_train_only_replay": { + "acquisition_count": 175483, + "development_rows_used": 0, + "family_mean_parent_risks": { + "intensity": 0.9538678814156855, + "mz": 5.058329202544489 + }, + "family_probabilities": { + "intensity": [ + 0.5197177353428725, + 0.36756454029956576, + 0.11271772435756178 + ], + "mz": [ + 0.000640549865064257, + 0.0006021252988097924, + 0.0009749945211706308, + 0.001225235174847238, + 0.001491990526933486, + 0.0015897223541305192, + 0.0018750290482665644, + 0.0022325092284391328, + 0.003483295139388665, + 0.003000587419058433, + 0.0031870148335501557, + 0.002153589976904486, + 0.006199135195682839, + 0.002563538613965407, + 0.005081629903518681, + 0.002108511194920743, + 0.004967544375901917, + 0.0026602408560569084, + 0.004910147907424022, + 0.0033596265935932584, + 0.007460028144741085, + 0.0073423165102591975, + 0.009383699893628675, + 0.003592497386256839, + 0.007300624112203314, + 0.003492257441496715, + 0.007360542338169028, + 0.007382295095945714, + 0.014832571097070651, + 0.004265176358855972, + 0.010263477266301436, + 0.0037736525044596452, + 0.010357919182143871, + 0.003968945641000572, + 0.009871247361505292, + 0.004710725207575529, + 0.006315269663161832, + 0.005157638724597448, + 0.0077605726110578045, + 0.007187969630144764, + 0.006412449477317231, + 0.005628045100877153, + 0.011602968806865283, + 0.010493624967610065, + 0.01484179003057013, + 0.0065827905214298045, + 0.007502225175175732, + 0.010939826561705892, + 0.011289749262541926, + 0.009076003093031464, + 0.010591555180129155, + 0.006798531213847064, + 0.006580023268606611, + 0.006625866180657621, + 0.008090722319725546, + 0.007049768301782186, + 0.0076193802901092424, + 0.01317291404961464, + 0.007973038587594787, + 0.013669095027737707, + 0.00885488994384447, + 0.010764243344026031, + 0.009261971480032901, + 0.011407087221082144, + 0.008275493172872336, + 0.01441150271184049, + 0.008746366070571202, + 0.00857308571676133, + 0.005291706775934275, + 0.009011519952519172, + 0.006988717495289805, + 0.009253048598594693, + 0.007821243894415368, + 0.011086758968541641, + 0.007673134347475914, + 0.011097951070032072, + 0.0062189255594573304, + 0.009936426882326339, + 0.007959877939685181, + 0.011968876654308003, + 0.008339926878809764, + 0.01269539177288809, + 0.005731582712877293, + 0.00929172196587231, + 0.005613550406088605, + 0.0091759482678083, + 0.0059780352420775095, + 0.008944619689293477, + 0.007367184276934712, + 0.007941269958145774, + 0.007299264060980633, + 0.007239133563442758, + 0.006612679564797477, + 0.006283524080156457, + 0.008149139416552728, + 0.009507867376475309, + 0.007738268726780678, + 0.007931483865568464, + 0.005231235554487746, + 0.006651492065929697, + 0.006507353996223413, + 0.00795472713238325, + 0.005030903411493361, + 0.007363008031486606, + 0.004293715643194716, + 0.005116324444397954, + 0.005079498064988051, + 0.005328559680790829, + 0.004718152120051172, + 0.004527017977918373, + 0.005665956328012781, + 0.005613541568597172, + 0.006477197736781978, + 0.004409438813197414, + 0.004562203092508441, + 0.003927667497232979, + 0.0059540022827155575, + 0.004466087633554613, + 0.004391156406161099, + 0.004415206577921035, + 0.003937588905054544, + 0.003719985017029452, + 0.003676435977917266, + 0.003814600894783379, + 0.003433020728342273, + 0.003935725556137382, + 0.0040426670106934615, + 0.0028970529888585096, + 0.004150673826274122, + 0.0032579911376673194, + 0.004363882486274141, + 0.004270449886008421, + 0.004907106187000692, + 0.0030152489510528215, + 0.0038070702355756493, + 0.0027748512230974798, + 0.0029272521743110213, + 0.0021288821303970962, + 0.0032297161628375743, + 0.0028509226016853032, + 0.002679914879840049, + 0.0018259880199832242, + 0.0032921295997996778, + 0.001677051151594143, + 0.0024395236545130036, + 0.0019836353522911625, + 0.003758717714186613, + 0.0034909357310569456, + 0.002995263611964451, + 0.0018092325269436543, + 0.0022474839811938456, + 0.00244456580072532, + 0.00233923457909925, + 0.0017213923060684793, + 0.0026590153316273075, + 0.0013800374494157535, + 0.002284641032769587, + 0.001136852586526592, + 0.0018214148728505498, + 0.0013022046110269284, + 0.001396674983025135, + 0.0015469207178817877, + 0.002837757747934389, + 0.002359877651502992, + 0.002076823924285004, + 0.0016799064395334354, + 0.001560964204396998, + 0.002849456766570762, + 0.001860766958266745, + 0.0021249687584761062, + 0.0018335763283124761, + 0.0015378773132315709, + 0.0011432679414856723, + 0.0011736150194323123, + 0.001212483917375532, + 0.001279967116160827, + 0.0014981555536654756, + 0.001122604974469808, + 0.0014509640741489289, + 0.0012002230758373783, + 0.001165903344811268, + 0.0013133584143074069, + 0.0012965505666185648, + 0.0020724105583319074, + 0.0015725440101973375, + 0.0021442389022742194, + 0.0014270560400526345, + 0.0013324118457630544, + 0.0009997932453970622, + 0.0011887167011727473, + 0.0007072343298746989, + 0.0013301494348818492, + 0.0006204627186076996, + 0.00039869722720875164, + 0.00043077402577967584, + 0.00046720314443578676, + 0.00039750241121630064, + 0.0005384150176558039, + 0.0008002933341730924, + 0.0008629090005762214, + 0.0006959207112273458, + 0.00040135183128836295, + 0.0004873041609817168, + 0.0005243254947311233, + 0.000664005589046579, + 0.0004979014294268762, + 0.000528657593126281, + 0.00042244525643066514, + 0.0004099317046350386, + 0.00039515285548507293, + 0.00038376572004818085, + 0.0003955256133498657, + 0.00019519812609798947 + ] + }, + "family_target_counts": { + "intensity": 4770785, + "mz": 4770785 + }, + "finite_epoch_schedule_used": false, + "maximum_absolute_difference_from_declared_runtime_null": 4.440892098500626e-15, + "parent_count": 2455, + "scale": 3.006098541980087, + "target_token_count": 10243502 + }, + "ms_local_development_reducer": "equal MS parents then equal acquisitions within MS parent", + "null_scale": 3.006098541980086, + "null_weighting": "equal parents, equal acquisitions within parent, equal family means within acquisition", + "population_atomic_weight_formula": "1/N_parent * 1/N_acquisition(parent) * 1/2 * 1/N_peak_pair(acquisition)", + "support_kind": "all eligible pretraining_train acquisition peak-pair labels as a population expectation, not realized finite-epoch schedule exposure", + "training_schedule_expectation": "equal parents then equal acquisitions within parent" + }, + "official_submitted_artifacts_modified": false, + "raw_authority_binding": { + "all_source_parent_acquisition_target_and_provenance_fields_match": true, + "raw_authority": { + "bytes": 732729924, + "name": "review_a5_ms_primary_runtime_transformation_authority.tsv.gz", + "sha256": "d3c16f4bdbe8b35440855d1c83287c5bda12d512ec3b89ba0ca312829dddb7f4" + }, + "row_count": 225056, + "source_raw_differs_from_positive_projection_count": 351, + "streamed_no_follow_not_loaded_wholesale": true, + "unique_row_surface_count": 225056 + }, + "receipt": { + "bytes": 6260, + "name": "review_a5_ms_acquisition_top30_runtime_receipt.json", + "sha256": "f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4" + }, + "release_boundary": "MS lane is independently promotable into the isolated eight-cell integration bundle; global training/scientific launch remains false until every other objective and execution gate passes.", + "resume_cursor_fixture": { + "authority_sha256": "48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4", + "epoch": 11, + "global_parent_cursor": 1337, + "global_parent_order_sha256": "b9efe4846a7ed24e681342982393f387ac37daf95e95e963b7f76e1131d59819", + "population_binding_sha256": "35a729fc66db5fdb440b70843bccaf557ca2674635523ceff9e440bf8d99ee91", + "receipt_sha256": "f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4", + "schedule_schema": "bertose_a5_ms_parent_cycle_hash_schedule_v1", + "schema": "bertose_a5_ms_acquisition_top30_resume_cursor_v3", + "seed": 43, + "selected_prefix_sha256": "40076d2d1390fa7225cfbb9f37e177d16bc32eded92447b567b9265c91ab87f9" + }, + "runtime_implementation": { + "bytes": 43711, + "name": "review_a5_ms_acquisition_top30_runtime_v3.py", + "sha256": "68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6" + }, + "schedule_fixture_sha256_by_epoch": { + "0": "c9f2332c62840aa0c2e4bcbafdfff9abfd7cb2a2c4bfb0847a6b176aa9b9eed1", + "1": "f209078a76268d07409838423889de542e782f53355747c1940aeac497331772", + "17": "dc7a6debb69e6d5f995173def4066d139da51b9e7198779556211abbdbf75872", + "7": "33c8498639d1f0a338e9aeb90708a67f90649ce84f3c5dcd51663ae4eb19315d" + }, + "schema": "bertose_a5_ms_acquisition_top30_runtime_independent_certificate_v3", + "scientific_launch_authorized": false, + "status": "PASS_MS_TOP30_LANE_RUNTIME_CERTIFIED_INTEGRATED_LAUNCH_CLOSED", + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_receipt.json b/releases/2026-10-02/bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_receipt.json new file mode 100644 index 0000000000000000000000000000000000000000..708284ebdcbd8c2e89815c05af92c0ea7965f91b --- /dev/null +++ b/releases/2026-10-02/bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_receipt.json @@ -0,0 +1,150 @@ +{ + "artifacts": { + "development_expansion_manifest": { + "bytes": 2467731, + "name": "review_ms_acquisition_top30_development_expansion.tsv.gz", + "sha256": "f337cc115011dbdb2040f01142de00f42a28a68218a7441f721cd76b74a18753" + }, + "parent_manifest": { + "bytes": 78127, + "name": "review_ms_acquisition_top30_parents.tsv.gz", + "sha256": "10dc3fa7622e2a7e448d775f4082fdc84aa0622f9a7a74bcfaeed491c0eb7d39" + }, + "row_manifest": { + "bytes": 65148547, + "name": "review_ms_acquisition_top30_rows.tsv.gz", + "sha256": "cf1dd59bd0b11525e643b2b44e60ff3bebc374e83d671365f4d5ec1f1e2d3a49" + }, + "target_ids": { + "bytes": 26045132, + "name": "review_ms_acquisition_top30_target_ids_u16le.bin", + "sha256": "1d545f3d1ed77111f04298c632885b0809879ccc1dc4103c4ffc6f947a4bd472" + }, + "target_offsets": { + "bytes": 1800456, + "name": "review_ms_acquisition_top30_target_offsets_u64le.bin", + "sha256": "42eb4beae41b9ec821e1fcc0cf18d8f36041d6e2075605012c3f9070fca750cd" + } + }, + "authority": { + "bytes": 20541, + "name": "review_a5_ms_acquisition_top30_runtime_authority.json", + "sha256": "48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4" + }, + "implementation": { + "builder": { + "bytes": 55528, + "name": "build_review_a5_ms_acquisition_top30_runtime_package_r3_20260721.py", + "sha256": "e797638591e884cfda0053e84519e82770155ae339f531689b04e2d7993ef6d5" + }, + "certifier": { + "bytes": 49683, + "name": "certify_review_a5_ms_acquisition_top30_runtime_package_r3_20260721.py", + "sha256": "a1e2989e36876840ee10d555b1ab69e9876fb0483aec839bb5a44187e7a1122a" + }, + "runtime": { + "bytes": 43711, + "name": "review_a5_ms_acquisition_top30_runtime_v3.py", + "sha256": "68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6" + }, + "tests": { + "bytes": 15700, + "name": "test_review_a5_ms_acquisition_top30_runtime_v3_20260721.py", + "sha256": "3ba5679eb77bb1f3ae27b168009b4af60a7d63dca71d108cb179cb017f69b64e" + } + }, + "inputs": { + "count_child_authority": { + "bytes": 15090, + "name": "review_a5_ms_top30_count_child_authority.json", + "sha256": "70a38dffb73aa9a482bc2227dd874862896453b7a45e3441f2aa97ea9ac9fab9" + }, + "count_child_evidence": { + "bytes": 820, + "name": "review_a5_ms_top30_count_delta_evidence.tsv.gz", + "sha256": "dbdc6bbe0e8c4e17ab30908aaa510a09c522a8c4f8d154efac21b60a1453b2a8" + }, + "count_child_independent_certificate": { + "bytes": 2078, + "name": "review_a5_ms_top30_count_child_authority_independent_audit.json", + "sha256": "c708f81a39706a9af86bbf5fe2d859a53de19f565b9f4eae2ff12f62a066513e" + }, + "count_child_receipt": { + "bytes": 9916, + "name": "review_a5_ms_top30_count_child_receipt.json", + "sha256": "1bd22e3d7ac9312db567fdd9357b30e853ada4e7a5e2d23478f864422c3c7b15" + }, + "design_independent_certificate": { + "bytes": 5889, + "name": "review_a5_ms_acquisition_top30_independent_audit_r2.json", + "sha256": "158450a27ae9bb642c010d5a2275adacef491bcf14a0ba227beb96cc2eaaaa5f" + }, + "design_manifest": { + "bytes": 105029603, + "name": "review_a5_ms_acquisition_top30_manifest.tsv.gz", + "sha256": "bfe12eb3100552039dd18b217c899e15c75174b314b624deb72e320edc873e97" + }, + "design_receipt": { + "bytes": 6517, + "name": "review_a5_ms_acquisition_top30_receipt.json", + "sha256": "86913823e6c5c14924735575dffac37ec4264ec130b0eaafda05226f4a87880e" + }, + "design_summary": { + "bytes": 21986, + "name": "review_a5_ms_acquisition_top30_summary.json", + "sha256": "2fb09f48f204ed8fbf5edb8b109eba880b7de60ff40ce54f3d30cb41294a3211" + }, + "design_superseded_metadata_certificate": { + "bytes": 5470, + "name": "review_a5_ms_acquisition_top30_independent_audit.json", + "sha256": "dff09234ed4b6550bf5c9f17e32e2e4f356aaa18efb2a7a21e70ac9f568e6338" + }, + "design_train_only_null": { + "bytes": 8878, + "name": "review_a5_ms_acquisition_top30_train_only_null.json", + "sha256": "2f68b42c9201011a078ea806199fdf151473b4b6ff38a9273f1a53a63fed4493" + }, + "raw_clean_double_build_certificate": { + "bytes": 4617, + "name": "review_a5_ms_raw_to_top30_clean_double_build_r3_certificate.json", + "sha256": "f92f2c0c56acddbdf818d015cd8f7d9d99c0b98535c97624116fe92f7b9cb28e" + }, + "raw_end_to_end_receipt": { + "bytes": 11189, + "name": "review_a5_ms_raw_to_top30_end_to_end_receipt.json", + "sha256": "98c4bbf1088e28a0a56593fc66796ffba75235755c72adfe6e02f59c0f4a48e7" + }, + "raw_publication_certificate": { + "bytes": 7603, + "name": "review_a5_ms_raw_to_top30_published_r3_certificate.json", + "sha256": "d9f5845940f57af88d212d395bf90bcd4e8d5728d88060c460ad0784390a1bd5" + }, + "raw_transformation_authority": { + "bytes": 732729924, + "name": "review_a5_ms_primary_runtime_transformation_authority.tsv.gz", + "sha256": "d3c16f4bdbe8b35440855d1c83287c5bda12d512ec3b89ba0ca312829dddb7f4" + }, + "raw_transformation_authority_receipt": { + "bytes": 1367, + "name": "review_a5_ms_primary_runtime_transformation_authority_receipt.json", + "sha256": "e82ceec1a94ec2f250d28e4ed37e818aee234eb132ece9fec03f43fabc9d6378" + } + }, + "official_submitted_artifacts_modified": false, + "schema": "bertose_a5_ms_acquisition_top30_runtime_receipt_v3", + "scientific_launch_authorized": false, + "status": "PASS_RUNTIME_BYTES_PREPARATION_ONLY", + "supersession": { + "predecessor_preserved_without_overwrite": true, + "predecessor_release_status": "NO_GO_SUPERSEDED", + "predecessor_runtime": { + "bytes": 33000, + "name": "review_a5_ms_acquisition_top30_runtime_v2.py", + "sha256": "94359f20bf8040e7758d2b793d5c78a6b3045cd726143b785d7d8cbbeda6aa14" + }, + "predecessor_schema": "bertose_a5_ms_acquisition_top30_runtime_v2", + "reason": "The predecessor accepted caller seed values for development corruption. The v3 successor exposes a separate development-mask API fixed to seed 0 and epoch 0.", + "successor_schema": "bertose_a5_ms_acquisition_top30_runtime_v3" + }, + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json b/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json new file mode 100644 index 0000000000000000000000000000000000000000..b572bd7f979062ce20f91e3adfa0b17d6192f2c4 --- /dev/null +++ b/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json @@ -0,0 +1,10264 @@ +{ + "merges": [ + [ + "?", + "|" + ], + [ + "1", + "2" + ], + [ + "1", + "-" + ], + [ + "C", + "C" + ], + [ + "-", + "1" + ], + [ + "1-", + "5" + ], + [ + "h", + "-1" + ], + [ + "12", + "2" + ], + [ + "/", + "3" + ], + [ + "=", + "O" + ], + [ + "/3", + "=O" + ], + [ + "a", + "2" + ], + [ + "122", + "h-1" + ], + [ + "*", + "N" + ], + [ + "CC", + "/3=O" + ], + [ + "x", + "x" + ], + [ + "*N", + "CC/3=O" + ], + [ + "a", + "?|" + ], + [ + "a?|", + "b" + ], + [ + "?|", + "c" + ], + [ + "a?|b", + "?|c" + ], + [ + "?|", + "d" + ], + [ + "a?|b?|c", + "?|d" + ], + [ + "?|", + "e" + ], + [ + "a?|b?|c?|d", + "?|e" + ], + [ + "2", + "*NCC/3=O" + ], + [ + "?|", + "f" + ], + [ + "a?|b?|c?|d?|e", + "?|f" + ], + [ + "?|", + "g" + ], + [ + "a?|b?|c?|d?|e?|f", + "?|g" + ], + [ + "?|", + "h" + ], + [ + "a?|b?|c?|d?|e?|f?|g", + "?|h" + ], + [ + "a2", + "122h-1" + ], + [ + "?|", + "i" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h", + "?|i" + ], + [ + "?", + "-" + ], + [ + "?|", + "j" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i", + "?|j" + ], + [ + "?|", + "k" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j", + "?|k" + ], + [ + "1", + "12" + ], + [ + "?|", + "l" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k", + "?|l" + ], + [ + "?|", + "m" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l", + "?|m" + ], + [ + "a2", + "112" + ], + [ + "4", + "-" + ], + [ + "a", + "1" + ], + [ + "*", + "O" + ], + [ + "?", + "}" + ], + [ + "?|", + "n" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m", + "?|n" + ], + [ + "a2112", + "h-1" + ], + [ + "?|", + "o" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n", + "?|o" + ], + [ + "-", + "{" + ], + [ + "?}", + "-{" + ], + [ + "122", + "h" + ], + [ + "a1", + "122h-1" + ], + [ + "CC", + "CC" + ], + [ + "2", + "-" + ], + [ + "?|", + "p" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o", + "?|p" + ], + [ + "a2122h-1", + "b" + ], + [ + "3", + "-" + ], + [ + "b", + "1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|", + "q" + ], + [ + "xx", + "xx" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|", + "r" + ], + [ + "c", + "1" + ], + [ + "d", + "1" + ], + [ + "a2122h-1", + "x" + ], + [ + "u", + "2" + ], + [ + "m", + "-1" + ], + [ + "a2112h-1", + "b" + ], + [ + "2", + "1" + ], + [ + "?|", + "s" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r", + "?|s" + ], + [ + "122", + "1" + ], + [ + "6", + "-" + ], + [ + "a1122h-1", + "a" + ], + [ + "?|", + "t" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s", + "?|t" + ], + [ + "O", + "/3=O" + ], + [ + "e", + "1" + ], + [ + "u", + "xxxx" + ], + [ + "*O", + "C" + ], + [ + "h-1", + "x" + ], + [ + "d", + "21" + ], + [ + "a2112h-1", + "x" + ], + [ + "-", + "2" + ], + [ + "d21", + "122h" + ], + [ + "2-", + "6" + ], + [ + "A", + "a" + ], + [ + "CCCC", + "CC" + ], + [ + "f", + "1" + ], + [ + "uxxxx", + "h" + ], + [ + "a", + "1221" + ], + [ + "CCCCCC", + "$" + ], + [ + "a1221", + "m-1" + ], + [ + "(", + "CCCCCC$" + ], + [ + "?|", + "u" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t", + "?|u" + ], + [ + "u2", + "122h" + ], + [ + "Aa", + "d21122h" + ], + [ + "Aad21122h", + "-2" + ], + [ + "a", + "4-" + ], + [ + "a1122h-1", + "x" + ], + [ + "a", + "xxxx" + ], + [ + "5", + "*NCC/3=O" + ], + [ + "a", + "?-" + ], + [ + "4", + ")" + ], + [ + "a4-", + "b1" + ], + [ + "c", + "?-" + ], + [ + "*O", + "CC/3=O" + ], + [ + "axxxx", + "h-1x" + ], + [ + "g", + "1" + ], + [ + "*OC", + "(CCCCCC$" + ], + [ + "h", + "1" + ], + [ + "*OC(CCCCCC$", + "4)" + ], + [ + "b", + "4-" + ], + [ + "b", + "?-" + ], + [ + "?|", + "v" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u", + "?|v" + ], + [ + "i", + "1" + ], + [ + "a?-", + "b1" + ], + [ + "b4-", + "c1" + ], + [ + "112", + "h" + ], + [ + "*O", + "S" + ], + [ + "a1221m-1", + "a" + ], + [ + "a2122h-1", + "a" + ], + [ + "d", + "?-" + ], + [ + "c", + "3-" + ], + [ + "O/3=O", + "/3=O" + ], + [ + "a1122h-1", + "b" + ], + [ + "b?-", + "c1" + ], + [ + "u2", + "112h" + ], + [ + "j", + "1" + ], + [ + "Aad21122h-2", + "a" + ], + [ + "c3-", + "d1" + ], + [ + "a", + "3-" + ], + [ + "*OS", + "O/3=O/3=O" + ], + [ + "c?-", + "d1" + ], + [ + "A", + "-1" + ], + [ + "u", + "1" + ], + [ + "a", + "6-" + ], + [ + "a3-", + "b1" + ], + [ + "k", + "1" + ], + [ + "?|", + "w" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v", + "?|w" + ], + [ + "Aad21122h-2", + "x" + ], + [ + "21", + "1" + ], + [ + "c", + "6-" + ], + [ + "2", + "*N" + ], + [ + "a1221m-1", + "x" + ], + [ + "b", + "3-" + ], + [ + "A", + "U" + ], + [ + "1-", + "?" + ], + [ + "m-1", + "a" + ], + [ + "d?-", + "e1" + ], + [ + "e", + "?-" + ], + [ + "h-1", + "a" + ], + [ + "d", + "2-" + ], + [ + "*O", + "P" + ], + [ + "/3", + "O/3=O" + ], + [ + "a2112h-1", + "a" + ], + [ + "d2-", + "e1" + ], + [ + "*N", + "CC" + ], + [ + "l", + "1" + ], + [ + "a2", + "211" + ], + [ + "u1", + "122h" + ], + [ + "e", + "4-" + ], + [ + "c", + "4-" + ], + [ + "5", + "*NCC" + ], + [ + "5*NCC", + "O/3=O" + ], + [ + "b3-", + "c1" + ], + [ + "[", + "C" + ], + [ + "[C", + "@" + ], + [ + "2", + "2" + ], + [ + "e?-", + "f1" + ], + [ + "1", + "1" + ], + [ + "3", + "|" + ], + [ + "?|", + "x" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w", + "?|x" + ], + [ + "1-", + "4" + ], + [ + "a1", + "1221" + ], + [ + "m", + "1" + ], + [ + "h-1", + "b" + ], + [ + "a2", + "122" + ], + [ + "a2", + "12" + ], + [ + "d", + "4-" + ], + [ + "*OP", + "O" + ], + [ + "e4-", + "f1" + ], + [ + "f", + "?-" + ], + [ + "n", + "1" + ], + [ + "-", + "b1" + ], + [ + "*OC(CCCCCC$4)", + "/3=O" + ], + [ + "C", + "/" + ], + [ + "a2211", + "m-1a" + ], + [ + "h", + "2" + ], + [ + "AU", + "d21122h" + ], + [ + "x", + "h" + ], + [ + "m-1", + "x" + ], + [ + "a", + "1-" + ], + [ + "a2122", + "A-1" + ], + [ + "c4-", + "d1" + ], + [ + "?|", + "y" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x", + "?|y" + ], + [ + "3", + "*OCC/3=O" + ], + [ + "d1", + "122h" + ], + [ + "H", + "]" + ], + [ + "2", + "*OCC/3=O" + ], + [ + "u", + "1221" + ], + [ + "g", + "?-" + ], + [ + "u1221", + "m" + ], + [ + "^", + "X" + ], + [ + "3", + "*OC" + ], + [ + "6", + "*OSO/3=O/3=O" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?" + ], + [ + "4", + "*OCC/3=O" + ], + [ + "o", + "1" + ], + [ + "b", + "6-" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?" + ], + [ + "d", + "3-" + ], + [ + "4", + "|" + ], + [ + "i", + "?-" + ], + [ + "/3", + "C" + ], + [ + "e", + "3-" + ], + [ + "g", + "2" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?" + ], + [ + "h", + "?-" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?" + ], + [ + "*OPO", + "/3O/3=O" + ], + [ + "d", + "2" + ], + [ + "a11221", + "h-1a" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?" + ], + [ + "6", + "*OCC/3=O" + ], + [ + "f?-", + "g1" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?" + ], + [ + "*O", + "CC" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?" + ], + [ + "(", + "C" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?" + ], + [ + "C", + "/3=O" + ], + [ + "[C@", + "@" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?" + ], + [ + "CCCC", + "CCCC" + ], + [ + "?|", + "z" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y", + "?|z" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?" + ], + [ + "^X", + "O" + ], + [ + "O", + ")" + ], + [ + "e3-", + "f1" + ], + [ + "f", + "3-" + ], + [ + "b", + "2-" + ], + [ + "3", + "*OC(CCCCCC$4)" + ], + [ + "uxxxx", + "m" + ], + [ + "a2", + "-b1" + ], + [ + "p", + "1" + ], + [ + "g?-", + "h1" + ], + [ + "c", + "2-" + ], + [ + "6", + "|" + ], + [ + "a6-", + "b1" + ], + [ + "j", + "?-" + ], + [ + "d1122h", + "-2" + ], + [ + "Aa", + "d1122h-2" + ], + [ + "d4-", + "e1" + ], + [ + "h?-", + "i1" + ], + [ + "a1", + "122" + ], + [ + "d3-", + "e1" + ], + [ + "CC", + "N" + ], + [ + "c2-", + "d1" + ], + [ + "O", + "/" + ], + [ + "i?-", + "j1" + ], + [ + "k", + "?-" + ], + [ + "a2122A-1", + "b" + ], + [ + "b2-", + "c1" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?" + ], + [ + "(C", + ")" + ], + [ + "m-1", + "b" + ], + [ + "a11221", + "h-1x" + ], + [ + "~", + "n" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?" + ], + [ + "(", + "O)" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?" + ], + [ + "a2", + "11" + ], + [ + "?|", + "A" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z", + "?|A" + ], + [ + "c", + "2" + ], + [ + "A-1", + "a" + ], + [ + "h", + "2-" + ], + [ + "C/", + "4" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f" + ], + [ + "?}-{a?|b?|c?|d?|e?|f", + "?" + ], + [ + "a?|b?|c?|d?|e?|f", + "?}-{a?|b?|c?|d?|e?|f?" + ], + [ + "h", + "4-" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g", + "?}-{a?|b?|c?|d?|e?|f?|g?" + ], + [ + "2", + "*OC(CCCCCC$4)" + ], + [ + "q", + "1" + ], + [ + "3", + "4" + ], + [ + "l", + "?-" + ], + [ + "a212", + "h-1b" + ], + [ + "x", + "h-1" + ], + [ + ")", + "O" + ], + [ + "*OP", + "^XO" + ], + [ + "d", + "xxxx" + ], + [ + "4", + "*OC(CCCCCC$4)" + ], + [ + "=", + "C" + ], + [ + "g", + "4-" + ], + [ + "=", + "^" + ], + [ + "6", + "*OC(CCCCCC$4)" + ], + [ + "AU", + "dxxxx" + ], + [ + "?|", + "B" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A", + "?|B" + ], + [ + "f3-", + "g1" + ], + [ + "A-1", + "x" + ], + [ + "h4-", + "i1" + ], + [ + "/", + "6" + ], + [ + "/", + "7" + ], + [ + "2", + "*OSO/3=O/3=O" + ], + [ + "j?-", + "k1" + ], + [ + "i", + "4-" + ], + [ + "[C@", + "]" + ], + [ + "a", + "x" + ], + [ + "r", + "1" + ], + [ + "2", + "*OC" + ], + [ + "?}-{", + "a?|b?|c?|d?|e" + ], + [ + "?}-{a?|b?|c?|d?|e", + "?" + ], + [ + "a?|b?|c?|d?|e", + "?}-{a?|b?|c?|d?|e?" + ], + [ + "f", + "4-" + ], + [ + "d", + "6-" + ], + [ + "m", + "?-" + ], + [ + "g", + "2-" + ], + [ + "a", + "5" + ], + [ + "22", + "2" + ], + [ + "a", + "d" + ], + [ + "g4-", + "h1" + ], + [ + "?}-{", + "a?|b?|c?|d" + ], + [ + "?}-{a?|b?|c?|d", + "?" + ], + [ + "a?|b?|c?|d", + "?}-{a?|b?|c?|d?" + ], + [ + "1", + "*N" + ], + [ + "g", + "3-" + ], + [ + "S", + "O/3=O/3=O" + ], + [ + "?|", + "C" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B", + "?|C" + ], + [ + "2*N", + "SO/3=O/3=O" + ], + [ + "k?-", + "l1" + ], + [ + "e", + "2-" + ], + [ + "/", + "4" + ], + [ + "f?-", + "g2" + ], + [ + "/", + "5" + ], + [ + "i4-", + "j1" + ], + [ + "[C@@", + "]" + ], + [ + "}", + "C" + ], + [ + "=^", + "Z" + ], + [ + "CC", + "C" + ], + [ + "h2-", + "i1" + ], + [ + "*OPO", + "*" + ], + [ + "*OPO*", + "/3O/3=O" + ], + [ + "b6-", + "c1" + ], + [ + "e2-", + "f1" + ], + [ + "f4-", + "g1" + ], + [ + "2", + "*OC(CCCCCC$4)/3=O" + ], + [ + "a2211", + "m-1x" + ], + [ + "4", + "*OC" + ], + [ + "AUdxxxx", + "xh" + ], + [ + "l?-", + "m1" + ], + [ + "*OP^XO", + "CCN" + ], + [ + "a5", + "-b1" + ], + [ + "[C@@", + "H]" + ], + [ + "3", + "*OC(CCCCCC$4)/3=O" + ], + [ + "2-", + "5" + ], + [ + "i", + "2-" + ], + [ + "Aad1122h-2", + "x" + ], + [ + "a", + "xx" + ], + [ + "h2", + "122h" + ], + [ + "e4-", + "g1" + ], + [ + "a212", + "h-1x" + ], + [ + "6", + "*OC" + ], + [ + "j", + "4-" + ], + [ + "xh-1", + "u" + ], + [ + "g2-", + "h1" + ], + [ + "a2122A-1", + "x" + ], + [ + "<", + "Q" + ], + [ + "" + ], + [ + "?|", + "D" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C", + "?|D" + ], + [ + "[C@", + "H]" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?" + ], + [ + "*OS", + "i" + ], + [ + "/", + "1" + ], + [ + "f", + "6-" + ], + [ + "g3-", + "h1" + ], + [ + "l", + "4-" + ], + [ + "a212", + "1" + ], + [ + "e", + "2" + ], + [ + "3", + "*OSO/3=O/3=O" + ], + [ + "i2-", + "j1" + ], + [ + "s", + "1" + ], + [ + "34", + "4" + ], + [ + "?|", + "a" + ], + [ + "3-", + "7" + ], + [ + "M", + "I" + ], + [ + "i", + "3-" + ], + [ + "12", + "h" + ], + [ + "8", + "-" + ], + [ + "/6", + ")" + ], + [ + "@", + "S" + ], + [ + "E", + "S" + ], + [ + "L", + "ES" + ], + [ + "@S", + "MI" + ], + [ + "@SMI", + "LES" + ], + [ + "@SMILES", + "@" + ], + [ + "j4-", + "k1" + ], + [ + "c6-", + "h1" + ], + [ + "k", + "2-" + ], + [ + "b", + "2" + ], + [ + "*", + "1" + ], + [ + "AU", + "d1122h" + ], + [ + "a4-", + "c1" + ], + [ + "h", + "3-" + ], + [ + "Aad1122h-2", + "a" + ], + [ + "h2", + "112h" + ], + [ + "=", + "@SMILES@" + ], + [ + "@", + "=@SMILES@" + ], + [ + "C", + "N" + ], + [ + "1221", + "h" + ], + [ + "*O", + "CCCC" + ], + [ + "a", + "122h-1" + ], + [ + "4", + "*OSO/3=O/3=O" + ], + [ + "u1", + "1221h" + ], + [ + "5", + "-" + ], + [ + "*OP^XOCCN", + "/3O/3=O" + ], + [ + "j", + "2" + ], + [ + "4", + "/7" + ], + [ + "*", + "2" + ], + [ + "*O", + "CCCCCCCC" + ], + [ + "l4-", + "m1" + ], + [ + "n", + "?-" + ], + [ + "f", + "2-" + ], + [ + "?}", + "*OSO/3=O/3=O" + ], + [ + "c6-", + "d1" + ], + [ + "*", + "C" + ], + [ + "/3", + "(CCCCCC$" + ], + [ + "/3C", + "/3C" + ], + [ + "a", + "4" + ], + [ + "122h", + "-2" + ], + [ + "j", + "2-" + ], + [ + "C", + "(CCCCCC$" + ], + [ + "4", + "*OC(CCCCCC$4)/3=O" + ], + [ + "?}-{", + "a?|b?|c" + ], + [ + "?}-{a?|b?|c", + "?" + ], + [ + "a?|b?|c", + "?}-{a?|b?|c?" + ], + [ + "(CCCCCC$", + "3" + ], + [ + "4", + "*OPO/3O/3=O" + ], + [ + "c6-", + "g1" + ], + [ + "?|", + "E" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D", + "?|E" + ], + [ + "k", + "4-" + ], + [ + "uxxxx", + "xh" + ], + [ + "a", + "12" + ], + [ + "C", + "/3C/3C" + ], + [ + "4", + "*N" + ], + [ + "[", + "H]" + ], + [ + "f2-", + "g1" + ], + [ + "u2", + "211" + ], + [ + "axxxx", + "m-1x" + ], + [ + "f", + "2" + ], + [ + "m?-", + "n1" + ], + [ + "^", + "R" + ], + [ + "3", + "*OCC" + ], + [ + "/", + "4)" + ], + [ + "a211", + "h-1a" + ], + [ + "*1", + "O" + ], + [ + "h", + "a" + ], + [ + "i", + "2" + ], + [ + "c6-", + "i1" + ], + [ + "h3-", + "i1" + ], + [ + "k2-", + "l1" + ], + [ + "u2211", + "m" + ], + [ + "k", + "2" + ], + [ + "a2112", + "A-1a" + ], + [ + "n", + "2" + ], + [ + "?|", + "F" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E", + "?|F" + ], + [ + "o", + "?-" + ], + [ + "e", + "6-" + ], + [ + "x", + "h-1x" + ], + [ + "d?-", + "h1" + ], + [ + "7", + "-" + ], + [ + "", + "@" + ], + [ + ")", + "C" + ], + [ + "6", + "*N" + ], + [ + "a1122", + "2" + ], + [ + "?|", + "G" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F", + "?|G" + ], + [ + "3", + "}" + ], + [ + "c?-", + "h1" + ], + [ + "d4-", + "h1" + ], + [ + "a2", + "2" + ], + [ + "t", + "1" + ], + [ + "a2", + "1" + ], + [ + "c?-", + "i1" + ], + [ + "j", + "3-" + ], + [ + "j2-", + "k1" + ], + [ + "3|", + "g" + ], + [ + "i3-", + "j1" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?" + ], + [ + "3", + "*N" + ], + [ + "m", + "4-" + ], + [ + "u2", + "122" + ], + [ + "k4-", + "l1" + ], + [ + "O/", + "5" + ], + [ + "?|", + "H" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G", + "?|H" + ], + [ + "ha", + "122h-2" + ], + [ + "/3(CCCCCC$", + "1" + ], + [ + "}C", + "(O)" + ], + [ + "n", + "2-" + ], + [ + "(", + "[H]" + ], + [ + "h2", + "h" + ], + [ + "?|", + "I" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H", + "?|I" + ], + [ + "n1", + "*1O" + ], + [ + "d6-", + "e1" + ], + [ + "u", + "xx" + ], + [ + "CC", + "/4" + ], + [ + "g", + "6-" + ], + [ + "c6-", + "k1" + ], + [ + "u2", + "12h" + ], + [ + "i", + "n" + ], + [ + "l", + "2-" + ], + [ + "C/3=O", + "/3=O" + ], + [ + "a2112", + "m-1a" + ], + [ + "?|", + "J" + ], + [ + "a2", + "22" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I", + "?|J" + ], + [ + "3", + "~n" + ], + [ + "o", + "l" + ], + [ + ")O", + "(" + ], + [ + "3", + "*NCC/3=O" + ], + [ + "{", + "1" + ], + [ + "*", + "F" + ], + [ + "CC/4", + "C/4" + ], + [ + "*OSi", + "CC/4C/4" + ], + [ + "a1122", + "m-1a" + ], + [ + "d", + "h" + ], + [ + "6", + "*OC(CCCCCC$4)/3=O" + ], + [ + "h", + "6-" + ], + [ + "0", + "=O" + ], + [ + "E", + "R" + ], + [ + "a1-", + "d" + ], + [ + "CC", + "^" + ], + [ + "a2", + "222" + ], + [ + "a6-", + "c1" + ], + [ + "(CCCCCC$3", + "/6)" + ], + [ + "f3-", + "g2" + ], + [ + "c?-", + "g1" + ], + [ + "=^Z", + "CCC" + ], + [ + "i", + "6-" + ], + [ + "C/", + "7" + ], + [ + "A-1", + "b" + ], + [ + "?}", + "*OC" + ], + [ + "m", + "3-" + ], + [ + "4", + "~n" + ], + [ + "a3-", + "c1" + ], + [ + "c?-", + "k1" + ], + [ + "2-", + "?" + ], + [ + "xh-1", + "d" + ], + [ + "O/5", + "=O" + ], + [ + "C", + "(" + ], + [ + "C/4", + "C/3=O" + ], + [ + "11", + "h" + ], + [ + "2", + "*OCC" + ], + [ + "ER", + "R" + ], + [ + "ERR", + "O" + ], + [ + "ERRO", + "R" + ], + [ + "n", + "4-" + ], + [ + "ax", + "12" + ], + [ + "/", + "2" + ], + [ + "n?-", + "o1" + ], + [ + "m4-", + "n1" + ], + [ + "a", + "3" + ], + [ + "x", + "2" + ], + [ + "c6-", + "e1" + ], + [ + "22", + "h" + ], + [ + "O/5=O", + "/3O/3=O" + ], + [ + "a1-", + "c" + ], + [ + "?}", + "*OPO/3O/3=O" + ], + [ + "6", + "}" + ], + [ + "3", + "34" + ], + [ + "b4-", + "d1" + ], + [ + "e", + "n" + ], + [ + "A", + "d1" + ], + [ + "g", + "3|g" + ], + [ + "/", + "8" + ], + [ + "b3-", + "c2" + ], + [ + "u2", + "112" + ], + [ + "o?-", + "p1" + ], + [ + "k", + "6-" + ], + [ + "d?-", + "g1" + ], + [ + "A", + "d2" + ], + [ + "CC", + "[C@]" + ], + [ + "6", + "*OPO/3O/3=O" + ], + [ + "c6-", + "f1" + ], + [ + "x", + "1" + ], + [ + "[C@@H]", + "(O)" + ], + [ + "g3|g", + "6" + ], + [ + "k", + "3-" + ], + [ + "(CCCCCC$3/6)", + "N" + ], + [ + "3|", + "c" + ], + [ + "f6-", + "g2" + ], + [ + "([H]", + ")" + ], + [ + "c6-", + "j1" + ], + [ + "{", + "2" + ], + [ + "j3-", + "k1" + ], + [ + "6", + "*OCC" + ], + [ + "122", + "2" + ], + [ + "a211", + "h-1x" + ], + [ + "h2-", + "g3|g6" + ], + [ + "o", + "4-" + ], + [ + "u2122", + "A" + ], + [ + "j", + "6-" + ], + [ + "a122h-1", + "a" + ], + [ + "p", + "?-" + ], + [ + "c3-", + "e1" + ], + [ + "a2121", + "A-1a" + ], + [ + "uxxxx", + "A" + ], + [ + "{", + "3}" + ], + [ + "b3-", + "d1" + ], + [ + "a6-", + "d1" + ], + [ + "l", + "2" + ], + [ + "6", + "=O" + ], + [ + "a12", + "11" + ], + [ + "d?-", + "i1" + ], + [ + "4/7", + ")" + ], + [ + ")O", + "C" + ], + [ + "a?|b?|c?|d?|e", + "?}" + ], + [ + "d4-", + "g1" + ], + [ + "b?-", + "c2" + ], + [ + "3|", + "f" + ], + [ + "1", + "h" + ], + [ + "e6-", + "f1" + ], + [ + "a", + "112" + ], + [ + "a2112", + "A-1x" + ], + [ + "a2122", + "m-1b" + ], + [ + "l", + "3-" + ], + [ + "*OSi", + "C/3C/3C" + ], + [ + "C", + "$" + ], + [ + "/5", + "O/5=O/3O/3=O" + ], + [ + "a11222", + "h-1a" + ], + [ + "C/4", + "C/4C/3=O" + ], + [ + "n4-", + "o1" + ], + [ + "n", + "3-" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?" + ], + [ + ")", + "/3(CCCCCC$1" + ], + [ + "a3", + "344" + ], + [ + "C/", + "5" + ], + [ + "n1*1O", + "(CCCCCC$3/6)N" + ], + [ + "a212", + "h-1a" + ], + [ + "a6-", + "l1" + ], + [ + "e?-", + "h1" + ], + [ + "/4)", + "*2" + ], + [ + "l2-", + "m1" + ], + [ + "c?-", + "j1" + ], + [ + "c4-", + "e1" + ], + [ + "a2122A-1", + "a" + ], + [ + "F", + "/4" + ], + [ + "a2112", + "m-1x" + ], + [ + "a1", + "112" + ], + [ + "CCCC", + "CCCCCC" + ], + [ + "*OP^XO", + "P" + ], + [ + "m", + "2-" + ], + [ + "/1", + "0=O" + ], + [ + "ha122h-2", + "b" + ], + [ + "?|", + "K" + ], + [ + "a22", + "21" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J", + "?|K" + ], + [ + "a?|b?|c?|d?|e?|f", + "?}" + ], + [ + "a1-", + "b" + ], + [ + "m3-", + "n1" + ], + [ + "*", + "S" + ], + [ + "u", + "d" + ], + [ + "6", + ")" + ], + [ + "i", + "c" + ], + [ + "5", + "*N" + ], + [ + "d4-", + "f1" + ], + [ + "q", + "?-" + ], + [ + "c?-", + "f1" + ], + [ + "a4", + "334" + ], + [ + "6", + "*OP^XOCCN/3O/3=O" + ], + [ + "AUdxxxx", + "h" + ], + [ + "*OSiCC/4C/4", + "C/3C/3C" + ], + [ + "4", + "*OCC" + ], + [ + "ax", + "11" + ], + [ + "^", + "S" + ], + [ + "a222", + "h-1b" + ], + [ + "h", + "xh" + ], + [ + "k3-", + "l1" + ], + [ + "o4-", + "p1" + ], + [ + "1-", + "a" + ], + [ + "d4-", + "i1" + ], + [ + "O/", + "6=O" + ], + [ + "i?-", + "j2" + ], + [ + "C/5", + "O/3=O" + ], + [ + "i", + "d" + ], + [ + "222", + "h" + ], + [ + "3", + "~" + ], + [ + "CC", + "$" + ], + [ + "l3-", + "m1" + ], + [ + "C", + "^R" + ], + [ + "4", + "~" + ], + [ + "4|", + "d" + ], + [ + "1-", + "a?|b?|c?|d?|e?}" + ], + [ + "?}", + "*OCC/3=O" + ], + [ + "r", + "o" + ], + [ + "n", + "2-6" + ], + [ + "j?-", + "k2" + ], + [ + "o", + "2" + ], + [ + "F", + "/3=O" + ], + [ + "=O", + ")" + ], + [ + "3", + "*OCCCCCCCC" + ], + [ + "1-", + "c" + ], + [ + "a2121", + "A-1x" + ], + [ + "c?-", + "e1" + ], + [ + "axx", + "2" + ], + [ + "*OP^XOP", + "^XO" + ], + [ + "CCN", + "/5O/5=O/3O/3=O" + ], + [ + "a2211", + "m-1b" + ], + [ + "g?-", + "h2" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i", + "?}" + ], + [ + "O", + "C" + ], + [ + "uxx", + "xh" + ], + [ + "=^", + "E" + ], + [ + "h", + "4" + ], + [ + "(CCCCCC$", + "4/7)" + ], + [ + "C/", + "1" + ], + [ + "h?-", + "i2" + ], + [ + "c?-", + "l1" + ], + [ + "o", + "3-" + ], + [ + "l", + "6-" + ], + [ + "1-", + "d" + ], + [ + "c6-", + "l1" + ], + [ + "3", + "*C" + ], + [ + "@", + "a" + ], + [ + "a6-", + "j1" + ], + [ + "m", + "6-" + ], + [ + "5", + "n2-6" + ], + [ + "5n2-6", + "n1*1O(CCCCCC$3/6)N" + ], + [ + "{", + "5" + ], + [ + "b6-", + "c2" + ], + [ + "p", + "4-" + ], + [ + "/", + "9" + ], + [ + "a1-", + "e" + ], + [ + "b?-", + "e1" + ], + [ + "Ad2", + "d" + ], + [ + "a", + "n" + ], + [ + "u", + "x" + ], + [ + "a4", + "344" + ], + [ + "(CCCCCC$4/7)", + "C/3=O/3=O" + ], + [ + "a1-", + "b1" + ], + [ + "v", + "1" + ], + [ + "=^ZCCC", + "=^ZCCC" + ], + [ + "a112", + "1" + ], + [ + "2", + "*OCCCCCCCC" + ], + [ + "[C@H]", + "(O)" + ], + [ + "n3-", + "o1" + ], + [ + "4", + "*NCC/3=O" + ], + [ + "@=@SMILES@", + "C" + ], + [ + "a2112", + "m-1b" + ], + [ + "CCCCCC", + "CC/3=O" + ], + [ + "d3-", + "f1" + ], + [ + "1-", + "a?|b?|c?|d?|e?|f?}" + ], + [ + "=", + "CC" + ], + [ + "-2", + "x" + ], + [ + "Ad1", + "d" + ], + [ + "ERROR", + "1-" + ], + [ + "8", + "-b1" + ], + [ + "h", + "y" + ], + [ + "CC^", + "Z" + ], + [ + "a1-", + "b2" + ], + [ + "a2", + "-" + ], + [ + "b?-", + "f1" + ], + [ + "?|", + "L" + ], + [ + "?|", + "M" + ], + [ + "?|", + "N" + ], + [ + "?|L", + "?|M" + ], + [ + "?|L?|M", + "?|N" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K", + "?|L?|M?|N" + ], + [ + "ad", + "222" + ], + [ + "@=@SMILES@", + "O" + ], + [ + "a6-", + "f1" + ], + [ + "m", + "2" + ], + [ + "*OS", + "(CCCCCC$4/7)C/3=O/3=O" + ], + [ + "m?-", + "n2" + ], + [ + "a6-", + "e1" + ], + [ + "p?-", + "q1" + ], + [ + "e?-", + "g1" + ], + [ + "a6-", + "k1" + ], + [ + "c", + "5-" + ], + [ + "1-c", + "3|c" + ], + [ + "o3-", + "p1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j", + "?}" + ], + [ + "a?-", + "d1" + ], + [ + "4/7", + ")OC" + ], + [ + "d?-", + "f1" + ], + [ + "3", + "*OCCCC" + ], + [ + "r", + "?-" + ], + [ + "CC", + "[C@@]" + ], + [ + "CCCC", + "CC/3=O" + ], + [ + "b6-", + "f1" + ], + [ + "1", + "*NCC" + ], + [ + "C", + "/3O/3=O" + ], + [ + "3|", + "i" + ], + [ + "u2112", + "m" + ], + [ + "21", + "h" + ], + [ + "a?-", + "c1" + ], + [ + "*OP^XOP^XO", + "CCN/5O/5=O/3O/3=O" + ], + [ + "3|", + "b" + ], + [ + "*", + "/2" + ], + [ + "p", + "3-" + ], + [ + "u2", + "11h" + ], + [ + "(", + "{2" + ], + [ + "a?-", + "e1" + ], + [ + "C/7", + "C/7" + ], + [ + "b4-", + "e1" + ], + [ + "a122h-1", + "x" + ], + [ + "g", + "en" + ], + [ + "5", + ")" + ], + [ + "f6-", + "g1" + ], + [ + "C/7C/7", + "C/3O/3=O" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?" + ], + [ + "C", + "l" + ], + [ + "2*N", + "CCC" + ], + [ + "a11222", + "h-1x" + ], + [ + "1-c3|c", + "6" + ], + [ + "?}-{", + "a?|b" + ], + [ + "?}-{a?|b", + "?" + ], + [ + "a?|b", + "?}-{a?|b?" + ], + [ + "a", + "1222" + ], + [ + "C", + "=^Z" + ], + [ + "f", + "3|f" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h", + "?}" + ], + [ + "d?-", + "j1" + ], + [ + "2", + "*OCCCC" + ], + [ + "?|", + "O" + ], + [ + "?|", + "P" + ], + [ + "?|", + "Q" + ], + [ + "?|", + "R" + ], + [ + "?|", + "S" + ], + [ + "?|", + "T" + ], + [ + "?|", + "U" + ], + [ + "?|", + "V" + ], + [ + "?|O", + "?|P" + ], + [ + "?|O?|P", + "?|Q" + ], + [ + "?|O?|P?|Q", + "?|R" + ], + [ + "?|O?|P?|Q?|R", + "?|S" + ], + [ + "?|O?|P?|Q?|R?|S", + "?|T" + ], + [ + "?|O?|P?|Q?|R?|S?|T", + "?|U" + ], + [ + "?|O?|P?|Q?|R?|S?|T?|U", + "?|V" + ], + [ + "a2", + "d" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N", + "?|O?|P?|Q?|R?|S?|T?|U?|V" + ], + [ + "q", + "2" + ], + [ + "b?-", + "g1" + ], + [ + "a22", + "12" + ], + [ + "2*N", + "C" + ], + [ + "4|", + "i" + ], + [ + "CN", + "(CCCCCC$" + ], + [ + "q?-", + "r1" + ], + [ + "CC", + "O" + ], + [ + "4)", + "/3=O" + ], + [ + "axx", + "1" + ], + [ + "o", + "2-" + ], + [ + "1", + "m" + ], + [ + "3|", + "j" + ], + [ + "*OS", + "C/3=O/3=O" + ], + [ + "1*N", + "C(CCCCCC$" + ], + [ + "f3|f", + "6" + ], + [ + "b6-", + "d1" + ], + [ + "[C@@]", + "3" + ], + [ + "c?-", + "m1" + ], + [ + "m2-", + "n1" + ], + [ + "ad", + "122" + ], + [ + "i3-", + "j2" + ], + [ + "122", + "m" + ], + [ + "*", + "I" + ], + [ + "4|d", + "6|" + ], + [ + "/3C", + "O/6=O" + ], + [ + "/3CO/6=O", + "/3C" + ], + [ + "a211", + "1" + ], + [ + "h", + "U" + ], + [ + "3-", + "6" + ], + [ + "d?-", + "e2" + ], + [ + "g2-", + "f3|f6" + ], + [ + "/10=O", + "(" + ], + [ + "a1122", + "A-1b" + ], + [ + "a6-", + "i1" + ], + [ + "a?-", + "f1" + ], + [ + "ERROR1-", + "ERROR" + ], + [ + "n", + "1-" + ], + [ + "6", + "~n" + ], + [ + "*OPO", + "CCN" + ], + [ + "3|", + "k" + ], + [ + "3|", + "h" + ], + [ + "e", + "t" + ], + [ + "-2", + "b" + ], + [ + "e", + "4|" + ], + [ + "O/", + "4" + ], + [ + " ", + "@" + ], + [ + "p", + "2-" + ], + [ + "3|", + "d" + ], + [ + "C", + "^S" + ], + [ + "CC", + "=C" + ], + [ + "ax11", + "xh-1u" + ], + [ + "b?-", + "d1" + ], + [ + "4|", + "b" + ], + [ + "4|", + "h" + ], + [ + "4", + "}" + ], + [ + "5", + "*OC(CCCCCC$4)/3=O" + ], + [ + "ax12", + "xh-1u" + ], + [ + "?", + "*OSO/3=O/3=O" + ], + [ + "4|", + "c" + ], + [ + "(C)", + "C" + ], + [ + "3|", + "e" + ], + [ + "p4-", + "q1" + ], + [ + "*OP^XOCCN", + "C/7C/7C/3O/3=O" + ], + [ + "-2", + "a" + ], + [ + "f", + "4|" + ], + [ + "q", + "4-" + ], + [ + "u2112", + "A" + ], + [ + "C", + "=C" + ], + [ + "/7", + ")O(" + ], + [ + "{3}", + "[C@@H](O)" + ], + [ + "c4-", + "f1" + ], + [ + "xxxx", + "h" + ], + [ + "*OC(CCCCCC$", + "4/7)OC" + ], + [ + "F", + "F" + ], + [ + "1-", + "b" + ], + [ + "5", + "*OC(CCCCCC$4)" + ], + [ + "c4-", + "h1" + ], + [ + "a2122", + "m-1x" + ], + [ + "/3(CCCCCC$1", + "0" + ], + [ + "/3(CCCCCC$10", + ")/3(CCCCCC$1" + ], + [ + "p3-", + "q1" + ], + [ + "a1", + "11" + ], + [ + "C", + "^X" + ], + [ + "ha122h-2", + "x" + ], + [ + "e", + "E" + ], + [ + "@a", + "c" + ], + [ + ")/3(CCCCCC$1", + "4)" + ], + [ + "*OSiCC/4C/4", + "C" + ], + [ + "*OSiCC/4C/4C", + "/3(CCCCCC$" + ], + [ + "*OSiCC/4C/4C/3(CCCCCC$", + "8" + ], + [ + "*OSiCC/4C/4C/3(CCCCCC$8", + ")/3(CCCCCC$14)" + ], + [ + "b6-", + "e1" + ], + [ + "a6-", + "m1" + ], + [ + "a2222", + "h-1b" + ], + [ + "a?-", + "l1" + ], + [ + "k?-", + "l2" + ], + [ + "@ac", + "id" + ], + [ + "x", + "m-1" + ], + [ + "x", + "y" + ], + [ + "1222", + "h" + ], + [ + "ic", + "@acid" + ], + [ + "d3-", + "e2" + ], + [ + "h", + "xxxxh" + ], + [ + "k?-", + "o1" + ], + [ + "gen", + "in" + ], + [ + "q", + "3-" + ], + [ + "CC^", + "E" + ], + [ + "a1221m-1", + "b" + ], + [ + "C", + "=O" + ], + [ + "c5-", + "d1" + ], + [ + "d", + "x" + ], + [ + "/3(CCCCCC$10)/3(CCCCCC$1", + "6)" + ], + [ + "2", + "*F" + ], + [ + "axx", + "xh-1x" + ], + [ + "E", + "E" + ], + [ + "g6-", + "h1" + ], + [ + "hy", + "d" + ], + [ + "r?-", + "s1" + ], + [ + "axxxx", + "xh-1x" + ], + [ + "O/", + "2" + ], + [ + "b6-", + "g1" + ], + [ + "F/4", + "F/4" + ], + [ + "a2222", + "h-1x" + ], + [ + "hyd", + "ro" + ], + [ + "a1122", + "m-1x" + ], + [ + "CCCC", + "C$" + ], + [ + "S", + "(CCCCCC$" + ], + [ + "a3344", + "h-1a" + ], + [ + "}C", + "O)" + ], + [ + "a?|b?|c?|d?|e?|f?|g", + "?}" + ], + [ + "i4-", + "k1" + ], + [ + "B", + "r" + ], + [ + "ad222", + "m-1b" + ], + [ + "u2", + "12" + ], + [ + "z", + "z" + ], + [ + "a211", + "h-1b" + ], + [ + "3|c", + "3|d" + ], + [ + "p", + "2" + ], + [ + "6", + "~" + ], + [ + "5", + "*OCC/3=O" + ], + [ + "c?-", + "d2" + ], + [ + "3|b", + "3|c3|d" + ], + [ + "o", + "n" + ], + [ + "a6-", + "n1" + ], + [ + "a6-", + "o1" + ], + [ + "=O", + "/5" + ], + [ + "?|", + "W" + ], + [ + "?|", + "X" + ], + [ + "?|", + "Y" + ], + [ + "?|W", + "?|X" + ], + [ + "?|W?|X", + "?|Y" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V", + "?|W?|X?|Y" + ], + [ + "s", + "?-" + ], + [ + "3|b3|c3|d", + "3|e" + ], + [ + "CCCCCCCCCC", + "C/5O/3=O" + ], + [ + "4|", + "j" + ], + [ + "6|", + "h" + ], + [ + "g?-", + "i1" + ], + [ + "6|", + "c" + ], + [ + "6|", + "d" + ], + [ + "*C", + "l" + ], + [ + "g4-", + "i1" + ], + [ + "*", + "/3CO/6=O/3C" + ], + [ + "h6-", + "i1" + ], + [ + "6|", + "b" + ], + [ + "u", + "12" + ], + [ + "3|b3|c3|d3|e", + "3|f" + ], + [ + "=C", + "1" + ], + [ + "F/4F/4", + "F/3=O" + ], + [ + "h4", + "h" + ], + [ + "6|", + "i" + ], + [ + "a", + "6|b" + ], + [ + "i?-", + "l1" + ], + [ + "h4-", + "j1" + ], + [ + "r", + "4-" + ], + [ + "*", + "Br" + ], + [ + "e?-", + "f2" + ], + [ + "d", + "i" + ], + [ + "xm-1", + "u" + ], + [ + "c4-", + "i1" + ], + [ + "f4-", + "h1" + ], + [ + "2", + "*OPO/3O/3=O" + ], + [ + "w", + "1" + ], + [ + "k", + "1-" + ], + [ + "e", + "6|" + ], + [ + "a2122", + "m-1a" + ], + [ + "3|b3|c3|d3|e3|f", + "3|g" + ], + [ + "=O", + "/3C" + ], + [ + "q", + "2-" + ], + [ + "2", + "(C)" + ], + [ + "2", + "C" + ], + [ + "6|", + "g" + ], + [ + "f", + "6|g" + ], + [ + "u2122", + "m" + ], + [ + "hydro", + "xy" + ], + [ + "/4)", + "CN" + ], + [ + "3|", + "o" + ], + [ + "c4-", + "k1" + ], + [ + "d", + "22h" + ], + [ + "n?-", + "o2" + ], + [ + "*OPOCCN", + "/3O/3=O" + ], + [ + "4", + "/8" + ], + [ + "a1", + "1" + ], + [ + "j", + "1-" + ], + [ + "3|b3|c3|d3|e3|f3|g", + "3|h" + ], + [ + "CCCCCCCC", + "C/3=O" + ], + [ + "d6-", + "f1" + ], + [ + "/2", + "=O" + ], + [ + "a2112", + "A-1b" + ], + [ + "22", + "h-1b" + ], + [ + "j3-", + "k2" + ], + [ + "}", + "[C@@H](O)" + ], + [ + "a?-", + "j1" + ], + [ + "d6-", + "h1" + ], + [ + "[C@H]", + "1" + ], + [ + "a122h-1", + "b" + ], + [ + "7", + "-b1" + ], + [ + "g6-", + "i1" + ], + [ + "a1", + "x2" + ], + [ + "3|b3|c3|d3|e3|f3|g3|h", + "3|i" + ], + [ + "3|", + "l" + ], + [ + "a1", + "*OPO*/3O/3=O" + ], + [ + "k6-", + "o1" + ], + [ + "6|", + "j" + ], + [ + "a1-d", + "3~n" + ], + [ + "q3-", + "r1" + ], + [ + "3|", + "n" + ], + [ + "c", + "7-" + ], + [ + "a2", + "8-b1" + ], + [ + "b?-", + "h1" + ], + [ + "6", + "*OCCCC" + ], + [ + "d6-", + "g1" + ], + [ + "a?|b?|c?|d?|e", + "?}*OSO/3=O/3=O" + ], + [ + "u2", + "2" + ], + [ + "a21", + "EE" + ], + [ + "c", + "c" + ], + [ + "e", + "r" + ], + [ + "u", + "4" + ], + [ + "4", + "*OP^XOP^XOCCN/5O/5=O/3O/3=O" + ], + [ + "b4-", + "f1" + ], + [ + "g3-", + "h2" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k", + "?}" + ], + [ + "a6-", + "r1" + ], + [ + "b2-", + "d1" + ], + [ + "e3-", + "g1" + ], + [ + "O/4", + "=O/3C" + ], + [ + "a?-", + "b2" + ], + [ + "dx", + "dh" + ], + [ + "h", + "dxdh" + ], + [ + "{3}[C@@H](O)", + "CC[C@]" + ], + [ + "4", + "*OCCCC" + ], + [ + "=^Z", + "CCCCCC/3=O" + ], + [ + "/7)O(", + "/6)" + ], + [ + "a21", + "eE" + ], + [ + "P", + "O" + ], + [ + "O/2", + "=O" + ], + [ + "a6-", + "g1" + ], + [ + "ax12", + "xh-1d" + ], + [ + "d", + "d1" + ], + [ + "d", + "7-" + ], + [ + "u", + "122h" + ], + [ + "a", + "7-b1" + ], + [ + "a", + "8-" + ], + [ + "m3-", + "n2" + ], + [ + "ad122", + "m-1b" + ], + [ + "o", + "3|o" + ], + [ + "b", + "5-" + ], + [ + "Cl", + "/3=O" + ], + [ + "c4-", + "g1" + ], + [ + "1", + "A" + ], + [ + "d", + "d2" + ], + [ + "/10=O(", + "/4)*2" + ], + [ + "3|", + "m" + ], + [ + "C", + "O/4=O/3C" + ], + [ + "axxxx", + "A-1x" + ], + [ + "a1112", + "h-1b" + ], + [ + "3*OCC", + "=C" + ], + [ + "o3|o", + "6" + ], + [ + "p2-", + "o3|o6" + ], + [ + "O/", + "7" + ], + [ + "h?-", + "j1" + ], + [ + "i", + "1-" + ], + [ + "q4-", + "r1" + ], + [ + "CC=C", + "4" + ], + [ + "e?-", + "i1" + ], + [ + "A", + "" + ], + [ + "a111", + "1" + ], + [ + "a2d", + "12" + ], + [ + "a5", + "-" + ], + [ + "a4334", + "h-1x" + ], + [ + "ERROR1-ERROR", + "2" + ], + [ + "[C@@]", + "(C)" + ], + [ + "a1-", + "f" + ], + [ + "c6-", + "m1" + ], + [ + "2", + "/5" + ], + [ + "a", + "b" + ], + [ + "i?-", + "k1" + ], + [ + "a?-", + "k1" + ], + [ + "4/8", + ")O(" + ], + [ + "d1", + "1h" + ], + [ + "h", + "222h" + ], + [ + "/7", + "=O/5" + ], + [ + "a6-", + "h1" + ], + [ + "[C@]", + "5" + ], + [ + "$", + "4)" + ], + [ + "*OC(CCCCCC$", + "4/8)O(" + ], + [ + "6*OC(CCCCCC$4)", + "/3(CCCCCC$10)/3(CCCCCC$16)" + ], + [ + "6|", + "k" + ], + [ + "u2", + "1" + ], + [ + "4", + "/5" + ], + [ + "c3-", + "d2" + ], + [ + "CC", + "(C)" + ], + [ + "a?|b?|c?|d?|e?|f", + "?}*OSO/3=O/3=O" + ], + [ + "r", + "2-" + ], + [ + "d2", + "|" + ], + [ + "([H]", + ")C" + ], + [ + "344", + "h" + ], + [ + "h1", + "122h" + ], + [ + "*OC(CCCCCC$4/8)O(", + "/7)O(/6)" + ], + [ + "*OC(CCCCCC$4/8)O(/7)O(/6)", + "O/3=O" + ], + [ + "2", + ")" + ], + [ + "a?-", + "g1" + ], + [ + "n2-", + "8" + ], + [ + "e3-", + "f2" + ], + [ + "*", + "(CCCCCC$" + ], + [ + "{", + "7" + ], + [ + "a21", + "FF" + ], + [ + "a2221", + "m-1a" + ], + [ + "a?|b?|c?|d", + "?}*OSO/3=O/3=O" + ], + [ + "3|b3|c3|d3|e3|f3|g3|h3|i", + "3|j" + ], + [ + "a1-", + "d2" + ], + [ + "a1-c", + "3~n" + ], + [ + "a1-d", + "4~n" + ], + [ + "6", + "*S" + ], + [ + "3", + ")" + ], + [ + "dd1", + "dh" + ], + [ + "(", + "N" + ], + [ + "a12", + "12" + ], + [ + "i6-", + "j1" + ], + [ + "d?-", + "k1" + ], + [ + "dd2", + "dh" + ], + [ + "l", + "1-" + ], + [ + "2", + "*O" + ], + [ + "c", + "8-" + ], + [ + "r", + "2" + ], + [ + "(", + "CC" + ], + [ + "Aa", + "d2" + ], + [ + "m4-", + "o1" + ], + [ + "}C(O)", + "=O)" + ], + [ + "?|", + "Z" + ], + [ + "?|Z", + "?|a" + ], + [ + "?|Z?|a", + "a?|" + ], + [ + "?|Z?|aa?|", + "ab" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V?|W?|X?|Y", + "?|Z?|aa?|ab" + ], + [ + "h", + "8-" + ], + [ + "3|", + "p" + ], + [ + "[C@H](O)", + "C" + ], + [ + "a4-", + "d1" + ], + [ + "d", + "22" + ], + [ + "h8-", + "i2" + ], + [ + "1", + "*OC" + ], + [ + "^XO", + "*/3CO/6=O/3C" + ], + [ + "l?-", + "m2" + ], + [ + "r4-", + "s1" + ], + [ + "A", + "2" + ], + [ + "Q", + "Q" + ], + [ + "d", + "1-c3|c6" + ], + [ + "r", + "3-" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?" + ], + [ + "c4-", + "j1" + ], + [ + ")C", + "l" + ], + [ + "7", + "*N" + ], + [ + "C/1", + "0=O" + ], + [ + "f?-", + "h1" + ], + [ + "1", + "*OP^XOCCNC/7C/7C/3O/3=O" + ], + [ + "C(CCCCCC$", + "4)/3=O" + ], + [ + "3*OC", + "^R" + ], + [ + "9", + "*OCC/3=O" + ], + [ + "[C@]", + "3" + ], + [ + "8", + "*N" + ], + [ + "n", + "6-" + ], + [ + "g6-", + "j1" + ], + [ + "i6-", + "l1" + ], + [ + "3", + "*OPO/3O/3=O" + ], + [ + "s", + "t" + ], + [ + "b", + "3" + ], + [ + "s", + "2-" + ], + [ + "u1", + "1222h" + ], + [ + "3", + "*F" + ], + [ + "4|", + "k" + ], + [ + "ad", + "22h-1b" + ], + [ + "u1", + "122m" + ], + [ + "2*OCC", + "C/4C/4C/3=O" + ], + [ + "a?-", + "m1" + ], + [ + "f6-", + "h1" + ], + [ + "a", + "8-b1" + ], + [ + "a1", + "x1" + ], + [ + "a?-", + "i1" + ], + [ + "({2", + "8" + ], + [ + "3", + "*OSiC/3C/3C" + ], + [ + ",", + "2" + ], + [ + "7", + "*NCC/3=O" + ], + [ + "a?-", + "n1" + ], + [ + "axx1", + "xh-1u" + ], + [ + "CCCCCCCC", + "CC/3=O" + ], + [ + "s?-", + "t1" + ], + [ + "3", + "*NCC" + ], + [ + "[C@]", + "1" + ], + [ + "CCCCCCCC", + "CCCC" + ], + [ + "b", + "1-b" + ], + [ + "p?-", + "q2" + ], + [ + ")O", + "C/3=O" + ], + [ + "4", + "(C)" + ], + [ + "6*OCC", + "C/4C/4C/3=O" + ], + [ + "CN(CCCCCC$", + "5" + ], + [ + "C", + "1" + ], + [ + "1-a", + "4|" + ], + [ + "2*N", + "CC" + ], + [ + "4*N", + "C=O" + ], + [ + "2*NC", + "O" + ], + [ + "3|b3|c3|d3|e3|f3|g3|h3|i3|j", + "3|k" + ], + [ + "3", + "*O" + ], + [ + "c?-", + "n1" + ], + [ + "n2-", + "o1" + ], + [ + "x", + "m" + ], + [ + "4|", + "g" + ], + [ + "uxx", + "2" + ], + [ + "x", + "A-1" + ], + [ + "e4|", + "e6|" + ], + [ + "a2", + "|" + ], + [ + "1-a4|", + "a6|b" + ], + [ + "1-a4|a6|b", + "4|b" + ], + [ + "1-a4|a6|b4|b", + "6|c" + ], + [ + "1-a4|a6|b4|b6|c", + "4|c" + ], + [ + "1-a4|a6|b4|b6|c4|c", + "6|d" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d", + "4|d6|" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|", + "e4|e6|" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|", + "f4|" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|", + "f6|g" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g", + "4|g" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g", + "6|h" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h", + "4|h" + ], + [ + "*/2", + "C" + ], + [ + "u212", + "1A" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h", + "6|i" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i", + "4|i" + ], + [ + "j6-", + "k2" + ], + [ + "(", + "$" + ], + [ + "1-d", + "4|d6|" + ], + [ + "i6-", + "j2" + ], + [ + "CCCCCCCC", + "CCCCCC" + ], + [ + "t", + "2-" + ], + [ + "(", + "OC" + ], + [ + "a1211", + "h-1x" + ], + [ + "a6-", + "p1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m", + "?}" + ], + [ + "a4344", + "h-1x" + ], + [ + "a1221", + "h-1a" + ], + [ + "=^E", + "C(CCCCCC$" + ], + [ + "a1112", + "h-1x" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l", + "?}" + ], + [ + "c8-", + "d2" + ], + [ + "(", + "O" + ], + [ + "3|p", + "6" + ], + [ + "p", + "3|p6" + ], + [ + "q2-", + "p3|p6" + ], + [ + "d1", + "1" + ], + [ + "y", + "c" + ], + [ + "a1122", + "A-1x" + ], + [ + "n", + "3|n" + ], + [ + "@=@SMILES@", + "CC" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i", + "6|j" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j", + "4|j" + ], + [ + "a1211", + "h-1b" + ], + [ + "h6-", + "j1" + ], + [ + "u2", + "22h" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?" + ], + [ + "d2|", + "e2" + ], + [ + "o?-", + "p2" + ], + [ + "N", + "CC$" + ], + [ + "c2", + "|" + ], + [ + "l4-", + "n1" + ], + [ + "=", + "{5" + ], + [ + "n3|n", + "6" + ], + [ + "o2-", + "n3|n6" + ], + [ + "(", + "CCCC" + ], + [ + "=", + "N" + ], + [ + "[C@@H]", + "1" + ], + [ + "g?-", + "j1" + ], + [ + "r", + "i" + ], + [ + "CC^E", + "CC^Z" + ], + [ + "b2", + "|" + ], + [ + "b5-", + "c1" + ], + [ + "3", + "*OSiCC/4C/4C/3C/3C" + ], + [ + "C=^Z", + "CCCCCCCCC/3=O" + ], + [ + "n2", + "*1O" + ], + [ + "O/2=O", + "/2=O" + ], + [ + "/3", + "O" + ], + [ + "CCCCCCCCCC", + "C/3=O" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n", + "?}" + ], + [ + "6", + "*OSiCC/4C/4C/3(CCCCCC$8)/3(CCCCCC$14)" + ], + [ + "a2|", + "b2|" + ], + [ + "a2|b2|", + "c2|" + ], + [ + "axx2", + "xh-1d" + ], + [ + "axx2", + "xh-1u" + ], + [ + "*O", + "*/2C" + ], + [ + "b?-", + "i1" + ], + [ + "r3-", + "s1" + ], + [ + "A", + "1" + ], + [ + "=^ZCCC", + "=^ZCCCCCC/3=O" + ], + [ + "a2|b2|c2|", + "d2|e2" + ], + [ + "e6-", + "g1" + ], + [ + "j6-", + "k1" + ], + [ + "o4-", + "q1" + ], + [ + "a", + "d2" + ], + [ + "C(", + "CCCC" + ], + [ + "2", + "*OSiC/3C/3C" + ], + [ + "6", + "/9" + ], + [ + "u", + "112" + ], + [ + "/4)CN", + "*2" + ], + [ + "6", + "n2-8" + ], + [ + "6n2-8", + "n1*1O(CCCCCC$3/6)N" + ], + [ + "m", + "1-" + ], + [ + "m6-", + "n2" + ], + [ + "6", + "*F" + ], + [ + "[C@@]", + "2" + ], + [ + "CCCCCC", + "C/3=O" + ], + [ + "=", + "^X" + ], + [ + "=O", + "/3=O" + ], + [ + "hU", + "122h" + ], + [ + "/", + "11" + ], + [ + "s", + "4-" + ], + [ + "2", + "*C" + ], + [ + "c2-", + "e1" + ], + [ + "xA-1", + "u" + ], + [ + "3*OC^R", + "CO/4=O/3C" + ], + [ + "a?-", + "h1" + ], + [ + "(C)", + "CC" + ], + [ + "a?|b?|c", + "?}*OC" + ], + [ + "6", + "*I" + ], + [ + "6", + "*O" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?" + ], + [ + "xx", + "xh" + ], + [ + "2(C)", + "[C@@]3" + ], + [ + "n4-", + "p1" + ], + [ + "h3-", + "i2" + ], + [ + "ic", + "~" + ], + [ + "y", + "1" + ], + [ + "a222", + "h-1x" + ], + [ + "e", + "7-" + ], + [ + "h", + "1-" + ], + [ + "11", + "/1" + ], + [ + "3*OCC", + "C^X" + ], + [ + "4", + "*F" + ], + [ + "}C(O)", + "=C" + ], + [ + "xh", + "-2x" + ], + [ + "6", + "*OSiCC/4C/4C/3C/3C" + ], + [ + "k4-", + "m1" + ], + [ + "{1", + "6}" + ], + [ + "7", + "*OCC/3=O" + ], + [ + "6", + "*NCC" + ], + [ + "O", + "($" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j", + "6|k" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k", + "4|k" + ], + [ + "334", + "h" + ], + [ + "CC^Z", + "CC^Z" + ], + [ + "k", + "3|k" + ], + [ + "[C@]", + "(C)" + ], + [ + "k3-", + "l2" + ], + [ + "*OPO", + "PO" + ], + [ + "4|b", + "4|c" + ], + [ + "4|b4|c", + "4|d" + ], + [ + "4|b4|c4|d", + "4|" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?" + ], + [ + "6)", + "/3=O" + ], + [ + "[C@@]", + "4" + ], + [ + "a?-", + "o1" + ], + [ + "1-a", + "4|b4|c4|d4|" + ], + [ + "ax", + "22" + ], + [ + "c?-", + "o1" + ], + [ + "s", + "3-" + ], + [ + "*OC(CCCCCC$", + "4/7)" + ], + [ + "*OC(CCCCCC$4/7)", + "C/3=O" + ], + [ + "3|", + "q" + ], + [ + "3*C", + "O" + ], + [ + "{", + "3" + ], + [ + "2*NCCC", + "^R" + ], + [ + "a6-", + "b2" + ], + [ + "ol", + "e" + ], + [ + "/7=O/5", + "CCCCCCCCCCC/3=O" + ], + [ + "3|b3|c3|d3|e3|f3|g3|h3|i3|j3|k", + "3|l" + ], + [ + "}C", + "1" + ], + [ + "4", + "*OSiC/3C/3C" + ], + [ + "a1221", + "h-1x" + ], + [ + "e4|", + "f4|" + ], + [ + "uxx2", + "xh" + ], + [ + "a12", + "1" + ], + [ + "j?-", + "m1" + ], + [ + "[C@H]", + "3" + ], + [ + "a1-c", + "4~n" + ], + [ + "d", + "xx" + ], + [ + "3|", + "r" + ], + [ + "k3|k", + "6" + ], + [ + "l2-", + "k3|k6" + ], + [ + ")", + "F" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?" + ], + [ + "d1", + "11" + ], + [ + "a1-b", + "4~n" + ], + [ + "a3-", + "d1" + ], + [ + "ux", + "12" + ], + [ + "{", + "8" + ], + [ + "(", + "/6)" + ], + [ + "6|", + "l" + ], + [ + "[C@H]", + "4" + ], + [ + "f3-", + "h1" + ], + [ + "j", + "3|j" + ], + [ + "-", + "3" + ], + [ + "5", + "*OPO*/3O/3=O" + ], + [ + "6", + "*OS(CCCCCC$4/7)C/3=O/3=O" + ], + [ + "h6-", + "k1" + ], + [ + "4", + "}C(O)" + ], + [ + "N", + "$" + ], + [ + "C", + ")C" + ], + [ + "e4|f4|", + "g" + ], + [ + "i", + "3|i" + ], + [ + "1-a4|b4|c4|d4|", + "e4|f4|g" + ], + [ + "=", + "C/" + ], + [ + "211", + "1m" + ], + [ + "=^X", + "CC" + ], + [ + "CC$", + "2" + ], + [ + "a?-", + "r1" + ], + [ + "axx", + "21" + ], + [ + "CN", + "$" + ], + [ + "N", + "CCO" + ], + [ + "a5-", + "c1" + ], + [ + "b3-", + "e1" + ], + [ + "z", + "1" + ], + [ + "=^EC(CCCCCC$", + "6/9" + ], + [ + "?", + "%" + ], + [ + "u2", + "222h" + ], + [ + "b?-", + "j1" + ], + [ + "g", + "1-a?|b?|c?|d?|e?|f?}" + ], + [ + "i6-", + "k1" + ], + [ + "6", + "*OCCCCCCCC" + ], + [ + "d", + "12h" + ], + [ + "3*OCC", + "C/4C/4C/3=O" + ], + [ + "C", + ")" + ], + [ + "d1", + "11h" + ], + [ + "d2", + "21h" + ], + [ + "d4-", + "j1" + ], + [ + "ad", + "112" + ], + [ + "4|", + "l" + ], + [ + "j3|j", + "6" + ], + [ + "k2-", + "j3|j6" + ], + [ + "CC", + "^R" + ], + [ + "m?-", + "p1" + ], + [ + "{1", + "}" + ], + [ + "/1", + "5" + ], + [ + "a21", + "d2" + ], + [ + "a4344", + "h-1b" + ], + [ + "6", + "*OPOCCN/3O/3=O" + ], + [ + "a1", + "d21" + ], + [ + "3|q", + "6" + ], + [ + "C", + "=^ZCCC=^ZCCC" + ], + [ + "q", + "3|q6" + ], + [ + "r2-", + "q3|q6" + ], + [ + "*", + "/5O/5=O/3O/3=O" + ], + [ + "hy", + "l" + ], + [ + ",", + "1" + ], + [ + "3|", + "s" + ], + [ + "g", + "l" + ], + [ + "O", + "*2" + ], + [ + "3|r", + "6" + ], + [ + "e7-", + "f1" + ], + [ + "r", + "3|r6" + ], + [ + "s2-", + "r3|r6" + ], + [ + "a", + "m" + ], + [ + "a1-d", + "3~" + ], + [ + "6", + "*Br" + ], + [ + "a1111", + "h-1a" + ], + [ + "g", + "8-" + ], + [ + "O/", + "8" + ], + [ + "4", + "[C@@](C)" + ], + [ + "4[C@@](C)", + "3" + ], + [ + "=^XCC", + "/3O" + ], + [ + "CCCC", + "$" + ], + [ + "ux12", + "xh" + ], + [ + "C/10=O", + "(" + ], + [ + "[C@@]", + "1" + ], + [ + "g8-", + "h2" + ], + [ + "n1", + "*1" + ], + [ + "O/5", + "O/5=O/3O/3=O" + ], + [ + "a1122", + "m-1b" + ], + [ + "a2212", + "h-1b" + ], + [ + "ax", + "1" + ], + [ + "l?-", + "p1" + ], + [ + "Ad2", + "zz" + ], + [ + "s", + "3|s" + ], + [ + "=^E", + "C(" + ], + [ + "n", + "2*OC" + ], + [ + "ole", + "an" + ], + [ + "5", + "*OPO/3O/3=O" + ], + [ + "[C@@]", + "5" + ], + [ + "ad", + "122h-1" + ], + [ + "s3|s", + "6" + ], + [ + "t2-", + "s3|s6" + ], + [ + "?|", + "ad" + ], + [ + "?|a", + "c" + ], + [ + "?|ac", + "?|ad" + ], + [ + "a?-", + "p1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V?|W?|X?|Y?|Z?|aa?|ab", + "?|ac?|ad" + ], + [ + "et", + "hyl" + ], + [ + "i3|i", + "6" + ], + [ + "j4-", + "l1" + ], + [ + "*OPO*/3O/3=O", + "~n" + ], + [ + "5", + "*OC" + ], + [ + "O", + "/3O/3=O" + ], + [ + "a2211", + "h-1x" + ], + [ + "l6-", + "p1" + ], + [ + "*(CCCCCC$", + "2/5" + ], + [ + "Ad1", + "zz" + ], + [ + "j?-", + "l1" + ], + [ + "7", + "*OP^XOCCN/3O/3=O" + ], + [ + "}C", + "(" + ], + [ + ")O", + "C(" + ], + [ + "({28", + "}C(O)=O)" + ], + [ + "a6-", + "q1" + ], + [ + "j6-", + "m1" + ], + [ + "p4-", + "r1" + ], + [ + "([H])", + "CC[C@]" + ], + [ + "c4-", + "l1" + ], + [ + "m", + "3|m" + ], + [ + "%", + "?%" + ], + [ + "j2-", + "i3|i6" + ], + [ + "(C)", + "/" + ], + [ + "2", + "*I" + ], + [ + "CC", + "C/3=O" + ], + [ + "a1-c", + "3~" + ], + [ + "a2222", + "h-1a" + ], + [ + "gl", + "yc" + ], + [ + "Aa", + "d21" + ], + [ + "a4-", + "b2" + ], + [ + "a?|b?|c", + "?}*OCC/3=O" + ], + [ + "d7-", + "e1" + ], + [ + "a2-", + "c1" + ], + [ + "d2", + "h" + ], + [ + "a2d12", + "m-1a" + ], + [ + "n", + "1-4" + ], + [ + "*", + "(N" + ], + [ + "k?-", + "n1" + ], + [ + "s4-", + "t1" + ], + [ + "a21EE", + "A-1a" + ], + [ + "a2211", + "h-1a" + ], + [ + "a", + "r" + ], + [ + "a1-d2", + "~n" + ], + [ + "o", + "s" + ], + [ + "1*NC(CCCCCC$", + "4/5" + ], + [ + "a2212", + "h-1x" + ], + [ + "ax", + "21" + ], + [ + "l?-", + "n1" + ], + [ + "CN(CCCCCC$", + "12" + ], + [ + "a2121", + "h-1b" + ], + [ + "x", + "21" + ], + [ + "x2", + "h" + ], + [ + "4", + "4" + ], + [ + "?", + "*OPO/3O/3=O" + ], + [ + "N", + "C$" + ], + [ + "f", + "1-a?|b?|c?|d?|e?}" + ], + [ + "h6-", + "l1" + ], + [ + "Aad2", + "2111m" + ], + [ + "d21", + "h" + ], + [ + "s3-", + "t1" + ], + [ + "/1", + "0" + ], + [ + "l?-", + "q1" + ], + [ + "m3|m", + "6" + ], + [ + "n2-", + "m3|m6" + ], + [ + "([H])", + "CC=C4" + ], + [ + "o", + "ic@acid" + ], + [ + "9", + "-b1" + ], + [ + "a1-b", + "3~n" + ], + [ + "a222", + "h-1a" + ], + [ + "|", + "f2" + ], + [ + "1", + "*OCCCCCCCC" + ], + [ + "a1222", + "h-1a" + ], + [ + "a2|b2|c2|d2|e2", + "|f2" + ], + [ + "222", + "m" + ], + [ + "7", + "*OPO/3O/3=O" + ], + [ + "a1-", + "a" + ], + [ + "t", + "ri" + ], + [ + "a1-e", + "3~n" + ], + [ + "6", + "*OP^XOCCNC/7C/7C/3O/3=O" + ], + [ + "a2221", + "h-1b" + ], + [ + "ol", + "@=@SMILES@C" + ], + [ + "#", + "N" + ], + [ + "2*N", + "C(CCCCCC$4)/3=O" + ], + [ + "c3-", + "f1" + ], + [ + "O/", + "9" + ], + [ + "p", + "6-" + ], + [ + "t", + "?-" + ], + [ + "/4)*2", + "/10=O" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k4|k", + "6|l" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k4|k6|l", + "4|l" + ], + [ + "a", + "c" + ], + [ + "4|h", + "4|i" + ], + [ + "C/", + "2" + ], + [ + "C=^Z", + "CCCCCCC/3=O" + ], + [ + "a", + "d21" + ], + [ + "a1", + "*OC" + ], + [ + "a1121", + "A-1a" + ], + [ + "a1x2", + "xh-1u" + ], + [ + "o", + "genin" + ], + [ + "?|i", + "?}" + ], + [ + "[C@]", + "2" + ], + [ + "a6-", + "u1" + ], + [ + "ad222", + "m-1x" + ], + [ + "xx", + "h" + ], + [ + "3*OCC", + "C^R" + ], + [ + "C", + "F/4F/4F/3=O" + ], + [ + "CF/4F/4F/3=O", + "/3=O" + ], + [ + "h", + "22" + ], + [ + "@a", + "glyc" + ], + [ + "@aglyc", + "on" + ], + [ + "CCC", + "NCC$" + ], + [ + "a1", + "d22" + ], + [ + "a1-", + "g" + ], + [ + "a4334", + "h-1b" + ], + [ + "b", + "3*N" + ], + [ + "d3-", + "g1" + ], + [ + "6", + "n1-4" + ], + [ + "a1-c", + "4~" + ], + [ + "A", + "4" + ], + [ + "[C@]", + "4" + ], + [ + "*OS", + "CF/4F/4F/3=O/3=O" + ], + [ + "6", + "*OSiC/3C/3C" + ], + [ + "6*OC", + "^XO*/3CO/6=O/3C" + ], + [ + "d6-", + "e2" + ], + [ + "C", + "=^ZCCC=^ZCCCCCC/3=O" + ], + [ + "a3344", + "h-1x" + ], + [ + "2*NCCC", + "^X" + ], + [ + "6", + "*Cl" + ], + [ + "a6-", + "s1" + ], + [ + "s", + "2" + ], + [ + "1-a4|b4|c4|d4|e4|f4|g", + "4|h4|i" + ], + [ + "a1211", + "h-1a" + ], + [ + "C(CCCCCC$", + "6)/3=O" + ], + [ + "C/", + "2C" + ], + [ + "[C@]", + "12" + ], + [ + "a2d", + "22" + ], + [ + "a6-", + "t1" + ], + [ + "o", + "1-" + ], + [ + "11", + "xh" + ], + [ + "CC^ECC^Z", + "$4)" + ], + [ + "O/", + "6" + ], + [ + "{", + "22" + ], + [ + "4-", + "6*OC^XO*/3CO/6=O/3C" + ], + [ + "d", + "8-" + ], + [ + "in", + "e" + ], + [ + "k?-", + "m1" + ], + [ + "x", + "22h" + ], + [ + ")", + "-" + ], + [ + "2*NCCC", + "^XO" + ], + [ + "h", + "21" + ], + [ + "n?-", + "q1" + ], + [ + "4", + "*OSC/3=O/3=O" + ], + [ + "a", + "d111" + ], + [ + "id", + "e" + ], + [ + "u", + "2-" + ], + [ + "6*S", + "O/2=O/2=O" + ], + [ + "a1-", + "c2" + ], + [ + "m", + "ethyl" + ], + [ + "t", + "2" + ], + [ + "=^Z", + "CCC/3=O" + ], + [ + "a3-", + "b2" + ], + [ + "h1", + "1" + ], + [ + "j1-", + "a?|b?|c?|d?|e?|f?|g?|h?|i?}" + ], + [ + "11/1", + "4)" + ], + [ + "a?-", + "s1" + ], + [ + "*N", + "*/2" + ], + [ + "3", + "*OC(CCCCCC$4/7)OC" + ], + [ + "a1-d", + "4~" + ], + [ + "a3-", + "e1" + ], + [ + "a?-", + "q1" + ], + [ + "c", + "(O)" + ], + [ + "a", + "l" + ], + [ + "6n1-4", + "n2*OC" + ], + [ + "[C@]5", + "([H])" + ], + [ + "ol", + "ic~" + ], + [ + "-", + "?" + ], + [ + "1", + "n1-" + ], + [ + "a1x1", + "xh-1u" + ], + [ + "3", + "*OP^XOCCN/3O/3=O" + ], + [ + "a1-", + "e2" + ], + [ + "a?|b?|c?|d", + "?}" + ], + [ + "(CCCCCC$", + "4)" + ], + [ + "*OP^XOP", + "O/5O/5=O/3O/3=O" + ], + [ + "4", + "*C" + ], + [ + "a2", + "6" + ], + [ + "x", + "h-1a" + ], + [ + "CC^ECC^Z$4)", + "/9" + ], + [ + "l3-", + "m2" + ], + [ + "(CCCCCC$4)", + "/3C" + ], + [ + "/3", + "=N" + ], + [ + "{1", + "4}" + ], + [ + "12", + "m" + ], + [ + "8", + "*(N" + ], + [ + "a1211", + "m-1a" + ], + [ + "2*OCC", + "=C" + ], + [ + "C/", + "9" + ], + [ + "a21FF", + "A-1a" + ], + [ + "f?-", + "i1" + ], + [ + "k6-", + "n1" + ], + [ + "122h-2", + "b" + ], + [ + "Aa", + "x21" + ], + [ + "Ad2d", + "d22h" + ], + [ + "c?-", + "q1" + ], + [ + "h", + "12" + ], + [ + "4", + "/6)" + ], + [ + "m?-", + "r1" + ], + [ + "Ad1d", + "d11h" + ], + [ + "a1222", + "h-1x" + ], + [ + "a?|b?|c?|d", + "?}*OC" + ], + [ + "*2", + "/6" + ], + [ + "5n2-6n1*1O(CCCCCC$3/6)N", + "CN(CCCCCC$12" + ], + [ + "a21eE", + "A-1a" + ], + [ + "u12", + "11h" + ], + [ + "a", + "344" + ], + [ + "a6-", + "b3*N" + ], + [ + "(C)", + "CC[C@@]" + ], + [ + "[C@H]", + "2" + ], + [ + "1", + "*OPO/3O/3=O" + ], + [ + "i1-", + "a?|b?|c?|d?|e?|f?|g?|h?}" + ], + [ + "2*N", + "=^XCC/3O" + ], + [ + "n1*1O", + "(CCCCCC$3" + ], + [ + "u4", + "344h" + ], + [ + "2*N", + "CCO" + ], + [ + "5", + "*OCC" + ], + [ + "=C", + "(C" + ], + [ + "a21EE", + "A-1x" + ], + [ + "q4-", + "s1" + ], + [ + "t", + "3-" + ], + [ + "=O", + ")C" + ], + [ + "Ad1d", + "d22h" + ], + [ + "[C@@H]", + "2" + ], + [ + "{2", + "}" + ], + [ + "122h-2", + "x" + ], + [ + "a21eE", + "A-1x" + ], + [ + "e", + "1-" + ], + [ + "f", + "7-" + ], + [ + "b6-", + "h1" + ], + [ + "k6-", + "l1" + ], + [ + "ud", + "222m" + ], + [ + "1-b", + "3|b" + ], + [ + "c4-", + "d2" + ], + [ + "C/", + "11" + ], + [ + "f6-", + "i1" + ], + [ + "g", + "1-" + ], + [ + "n3-", + "o2" + ], + [ + "{3}[C@@H](O)CC[C@]", + "2(C)[C@@]3" + ], + [ + "Ad2d", + "d11h" + ], + [ + "CCC", + "l" + ], + [ + "l?-", + "o1" + ], + [ + "c?-", + "p1" + ], + [ + "q?-", + "r2" + ], + [ + "y", + "l" + ], + [ + "/6", + "Cl" + ], + [ + "/6", + "Cl/3=O" + ], + [ + "/6Cl", + "/6Cl/3=O" + ], + [ + "C/4", + "O/3=O" + ], + [ + "CCCl", + "/6Cl/6Cl/3=O" + ], + [ + "b", + "1-" + ], + [ + ")O(", + "/8" + ], + [ + "A", + "a11" + ], + [ + "CC", + "^X" + ], + [ + "a1d21", + "m-1a" + ], + [ + "c6-", + "n1" + ], + [ + "2*NCO", + "CCCl/6Cl/6Cl/3=O" + ], + [ + "4", + "*OSiCC/4C/4C/3C/3C" + ], + [ + "c6-", + "d2" + ], + [ + "o", + "6-" + ], + [ + "#N", + "(" + ], + [ + "4", + "*NCC" + ], + [ + "5)", + "/3=O" + ], + [ + "6*N", + "CN(CCCCCC$5" + ], + [ + "C/10=O(", + "/4)*2" + ], + [ + "d8-", + "e2" + ], + [ + "", + "-?" + ], + [ + "h", + "axx" + ], + [ + "3|b3|c3|d3|e3|f3|g3|h3|i3|j3|k3|l", + "3|m" + ], + [ + "l", + "3|l" + ], + [ + "a?-", + "t1" + ], + [ + "m?-", + "q1" + ], + [ + "1", + "n2-" + ], + [ + "CC[C@]", + "3" + ], + [ + "a4-", + "e1" + ], + [ + "o", + "p" + ], + [ + "a21FF", + "A-1x" + ], + [ + "a2221", + "h-1x" + ], + [ + "B", + "1" + ], + [ + "d", + "5-" + ], + [ + "a?|b?|c", + "?}*OSO/3=O/3=O" + ], + [ + "x2", + "xh" + ], + [ + "/5", + "C/3=O" + ], + [ + "?", + "*OCC/3=O" + ], + [ + "a?|b?|c?|d?|e", + "?}*OC" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h", + "?}*OSO/3=O/3=O" + ], + [ + "d", + "d" + ], + [ + "ad", + "xx" + ], + [ + "e6-", + "f2" + ], + [ + "2", + "*OS(CCCCCC$4/7)C/3=O/3=O" + ], + [ + "a8-", + "b3" + ], + [ + "ad2", + "21" + ], + [ + "in", + "@=@SMILES@O" + ], + [ + "@", + "p" + ], + [ + "[C@H]", + "(C" + ], + [ + "(CCCCCC$3", + ")" + ], + [ + "/10=O(", + "/4)CN*2" + ], + [ + "CC^", + "S" + ], + [ + "u112", + "1h" + ], + [ + "=", + "{" + ], + [ + "@=@SMILES@CC", + "1" + ], + [ + "=^EC(CCCCCC$6/9", + ")O(/8" + ], + [ + "C", + "2" + ], + [ + "N$", + "2" + ], + [ + "j6-", + "n1" + ], + [ + "3*OCCCCCCCC", + "CCCCCCCC/3=O" + ], + [ + "FF", + "A" + ], + [ + "a1-e", + "4~n" + ], + [ + "h6-", + "i2" + ], + [ + "o2-", + "p1" + ], + [ + "β", + "," + ], + [ + "3*OCCC^X", + "CCCCCCCCCCC/5O/3=O" + ], + [ + "4*OCC", + "C/4C/4C/3=O" + ], + [ + "$", + "5" + ], + [ + "?|h", + "?}" + ], + [ + "6|c", + "6|d" + ], + [ + "c?-", + "r1" + ], + [ + "?-", + "?" + ], + [ + "@", + "olean" + ], + [ + "@olean", + "olic~" + ], + [ + "C/", + "12" + ], + [ + "axxxx", + "xh-1a" + ], + [ + "b4-", + "g1" + ], + [ + ")O(", + "/4)" + ], + [ + "3", + "*OS(CCCCCC$4/7)C/3=O/3=O" + ], + [ + "6|c6|d", + "6|" + ], + [ + "e", + "c" + ], + [ + "i", + "1-a?|b?|c?|d?|e?}" + ], + [ + "l3|l", + "6" + ], + [ + "m2-", + "l3|l6" + ], + [ + "|", + "g2" + ], + [ + "C/", + "6=O" + ], + [ + "/1", + "8" + ], + [ + "3", + "*S" + ], + [ + "=O", + ")O" + ], + [ + "@=@SMILES@O", + "{3}" + ], + [ + "a3344", + "m-1x" + ], + [ + "u1221", + "h" + ], + [ + "21", + "m" + ], + [ + "={5", + "4}C(O)" + ], + [ + ")", + "O/3=O" + ], + [ + "a1222", + "h-1b" + ], + [ + "f", + "1-" + ], + [ + "j?-", + "n1" + ], + [ + "4", + "*O" + ], + [ + "d6-", + "i1" + ], + [ + "h-1", + "u" + ], + [ + "{3}", + "[C@H](O)" + ], + [ + "/", + "12" + ], + [ + "/1", + "7" + ], + [ + "1-d", + "?|i?}" + ], + [ + "a?|b", + "?}*OSO/3=O/3=O" + ], + [ + "d4-", + "k1" + ], + [ + "{3}", + "[C@H](O)C" + ], + [ + "Aa", + "d" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o", + "?}" + ], + [ + "1", + "0" + ], + [ + "12", + "[H]" + ], + [ + "122h-2", + "a" + ], + [ + "@", + "2" + ], + [ + "a?|b?|c?|d?|e?|f", + "?}*OC" + ], + [ + "}C(O)", + "C" + ], + [ + "2", + "*OSC/3=O/3=O" + ], + [ + "2", + "*OSiCC/4C/4C/3C/3C" + ] + ], + "metadata": { + "num_merges": 2000, + "vocab_size": 2114 + }, + "review_trace": { + "authority_generation": "r3_dependency_closed", + "bounded_distance_cache": true, + "development_or_excluded_rows_read_for_merge_learning": 0, + "fit_contributor_manifest": "review_bpe_fit_contributors.tsv.gz", + "fit_contributor_manifest_sha256": "4ec8dfaeacef355092313507ab71c628f48ddf1a4fe39e7663748060a07af297", + "fit_non_special_unit_occurrences": 4306785, + "fit_only_character_alphabet": [ + "\t", + " ", + "\"", + "#", + "$", + "%", + "'", + "(", + ")", + "*", + "+", + ",", + "-", + ".", + "/", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + ":", + "<", + "=", + ">", + "?", + "@", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "[", + "\\", + "]", + "^", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "{", + "|", + "}", + "~", + "Δ", + "α", + "β", + "γ", + "δ", + "ζ", + "ξ", + "С", + "’", + "′", + "″", + "→", + "−" + ], + "fit_only_character_alphabet_size": 104, + "fit_parent_count": 221899, + "fit_unique_non_special_unit_strings": 20949, + "max_token_length": null, + "merge_tie_rule": "highest_frequency_then_lexicographic_pair", + "minimum_pair_frequency": 2, + "num_merges_realized": 2000, + "num_merges_requested": 2000, + "official_submitted_artifacts_modified": false, + "parser": "fail_closed_parser_v3_exact_semantic_units", + "schema": "bertose_a5_later_role_train_only_bpe_v1", + "scientific_launch_authorized": false, + "successor_partition_sha256": "86a8c6742156683d502c93fc71b31b9a93450037d647e5a90db437a015bb3bbc", + "training_authorized": false + }, + "special_tokens": { + "[BRANCH_CLOSE]": 6, + "[BRANCH_OPEN]": 5, + "[END]": 3, + "[LINK]": 7, + "[MASK]": 4, + "[MOD]": 8, + "[PAD]": 0, + "[RESIDUE_ERROR]": 9, + "[START]": 2, + "[UNK]": 1 + }, + "token_to_id": { + "\t": 10, + " ": 11, + " @": 1066, + "\"": 12, + "#": 13, + "#N": 1824, + "#N(": 2010, + "$": 14, + "$4)": 1325, + "$5": 2063, + "%": 15, + "%?%": 1763, + "'": 16, + "(": 17, + "($": 1470, + "(/6)": 1642, + "(C": 374, + "(C)": 422, + "(C)/": 1765, + "(C)C": 1080, + "(C)CC": 1562, + "(C)CC[C@@]": 1958, + "(CC": 1366, + "(CCCC": 1510, + "(CCCCCC$": 216, + "(CCCCCC$3": 605, + "(CCCCCC$3)": 2045, + "(CCCCCC$3/6)": 709, + "(CCCCCC$3/6)N": 763, + "(CCCCCC$4)": 1924, + "(CCCCCC$4)/3C": 1931, + "(CCCCCC$4/7)": 891, + "(CCCCCC$4/7)C/3=O/3=O": 915, + "(N": 1357, + "(O": 1485, + "(O)": 429, + "(OC": 1475, + "([H]": 673, + "([H])": 766, + "([H])C": 1336, + "([H])CC=C4": 1807, + "([H])CC[C@]": 1760, + "({2": 978, + "({28": 1421, + "({28}C(O)=O)": 1756, + ")": 18, + ")-": 1890, + ")/3(CCCCCC$1": 811, + ")/3(CCCCCC$14)": 1107, + ")C": 643, + ")Cl": 1393, + ")F": 1633, + ")O": 453, + ")O(": 693, + ")O(/4)": 2073, + ")O(/8": 2001, + ")O/3=O": 2090, + ")OC": 790, + ")OC(": 1755, + ")OC/3=O": 1434, + "*": 19, + "*(CCCCCC$": 1345, + "*(CCCCCC$2/5": 1750, + "*(N": 1779, + "*/2": 975, + "*/2C": 1465, + "*/3CO/6=O/3C": 1183, + "*/5O/5=O/3O/3=O": 1697, + "*1": 569, + "*1O": 625, + "*2": 587, + "*2/6": 1952, + "*Br": 1196, + "*C": 594, + "*Cl": 1181, + "*F": 696, + "*I": 1043, + "*N": 127, + "*N*/2": 1908, + "*NCC": 283, + "*NCC/3=O": 130, + "*O": 162, + "*O*/2C": 1530, + "*OC": 202, + "*OC(CCCCCC$": 233, + "*OC(CCCCCC$4)": 235, + "*OC(CCCCCC$4)/3=O": 312, + "*OC(CCCCCC$4/7)": 1610, + "*OC(CCCCCC$4/7)C/3=O": 1611, + "*OC(CCCCCC$4/7)OC": 1093, + "*OC(CCCCCC$4/8)O(": 1326, + "*OC(CCCCCC$4/8)O(/7)O(/6)": 1339, + "*OC(CCCCCC$4/8)O(/7)O(/6)O/3=O": 1340, + "*OCC": 370, + "*OCC/3=O": 230, + "*OCCCC": 579, + "*OCCCCCCCC": 588, + "*OP": 279, + "*OPO": 307, + "*OPO*": 507, + "*OPO*/3O/3=O": 508, + "*OPO*/3O/3=O~n": 1745, + "*OPO/3O/3=O": 356, + "*OPOCCN": 1059, + "*OPOCCN/3O/3=O": 1221, + "*OPOPO": 1596, + "*OP^XO": 454, + "*OP^XOCCN": 517, + "*OP^XOCCN/3O/3=O": 584, + "*OP^XOCCNC/7C/7C/3O/3=O": 1083, + "*OP^XOP": 827, + "*OP^XOPO/5O/5=O/3O/3=O": 1925, + "*OP^XOP^XO": 882, + "*OP^XOP^XOCCN/5O/5=O/3O/3=O": 973, + "*OS": 244, + "*OS(CCCCCC$4/7)C/3=O/3=O": 949, + "*OSC/3=O/3=O": 1033, + "*OSCF/4F/4F/3=O/3=O": 1863, + "*OSO/3=O/3=O": 257, + "*OSi": 541, + "*OSiC/3C/3C": 801, + "*OSiCC/4C/4": 698, + "*OSiCC/4C/4C": 1108, + "*OSiCC/4C/4C/3(CCCCCC$": 1109, + "*OSiCC/4C/4C/3(CCCCCC$8": 1110, + "*OSiCC/4C/4C/3(CCCCCC$8)/3(CCCCCC$14)": 1111, + "*OSiCC/4C/4C/3C/3C": 848, + "*S": 837, + "+": 20, + ",": 21, + ",1": 1699, + ",2": 1423, + "-": 22, + "-1": 118, + "-2": 206, + "-2a": 1084, + "-2b": 1063, + "-2x": 930, + "-3": 1647, + "-?": 1918, + "-b1": 311, + "-{": 169, + ".": 23, + "/": 24, + "/1": 542, + "/10": 1803, + "/10=O": 829, + "/10=O(": 1052, + "/10=O(/4)*2": 1292, + "/10=O(/4)CN*2": 2046, + "/11": 1555, + "/12": 2098, + "/15": 1688, + "/17": 2099, + "/18": 2082, + "/2": 733, + "/2=O": 1228, + "/3": 122, + "/3(CCCCCC$": 595, + "/3(CCCCCC$1": 670, + "/3(CCCCCC$10": 1099, + "/3(CCCCCC$10)/3(CCCCCC$1": 1100, + "/3(CCCCCC$10)/3(CCCCCC$16)": 1132, + "/3=N": 1932, + "/3=O": 124, + "/3C": 346, + "/3C/3C": 596, + "/3CO/6=O": 1045, + "/3CO/6=O/3C": 1046, + "/3O": 1522, + "/3O/3=O": 280, + "/4": 498, + "/4)": 623, + "/4)*2": 818, + "/4)*2/10=O": 1830, + "/4)CN": 1216, + "/4)CN*2": 1544, + "/5": 500, + "/5C/3=O": 2032, + "/5O/5=O/3O/3=O": 803, + "/6": 467, + "/6)": 558, + "/6Cl": 1995, + "/6Cl/3=O": 1996, + "/6Cl/6Cl/3=O": 1997, + "/7": 468, + "/7)O(": 1089, + "/7)O(/6)": 1273, + "/7=O/5": 1322, + "/7=O/5CCCCCCCCCCC/3=O": 1618, + "/8": 749, + "/9": 908, + "0": 25, + "0=O": 703, + "1": 26, + "1*N": 490, + "1*NC(CCCCCC$": 1034, + "1*NC(CCCCCC$4/5": 1787, + "1*NCC": 967, + "1*OC": 1381, + "1*OCCCCCCCC": 1813, + "1*OPO/3O/3=O": 1960, + "1*OP^XOCCNC/7C/7C/3O/3=O": 1397, + "1-": 116, + "1-4": 300, + "1-5": 119, + "1-?": 273, + "1-a": 856, + "1-a4|": 1439, + "1-a4|a6|b": 1453, + "1-a4|a6|b4|b": 1454, + "1-a4|a6|b4|b6|c": 1455, + "1-a4|a6|b4|b6|c4|c": 1456, + "1-a4|a6|b4|b6|c4|c6|d": 1457, + "1-a4|a6|b4|b6|c4|c6|d4|d6|": 1458, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|": 1459, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|": 1460, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g": 1461, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g": 1462, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h": 1463, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h": 1464, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i": 1467, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i": 1468, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j": 1494, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j": 1495, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k": 1589, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k4|k": 1590, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k4|k6|l": 1831, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k4|k6|l4|l": 1832, + "1-a4|b4|c4|d4|": 1606, + "1-a4|b4|c4|d4|e4|f4|g": 1656, + "1-a4|b4|c4|d4|e4|f4|g4|h4|i": 1873, + "1-a?|b?|c?|d?|e?|f?}": 928, + "1-a?|b?|c?|d?|e?}": 869, + "1-b": 1095, + "1-b3|b": 1982, + "1-c": 878, + "1-c3|c": 956, + "1-c3|c6": 993, + "1-d": 897, + "1-d4|d6|": 1471, + "1-d?|i?}": 2100, + "10": 2106, + "11": 296, + "11/1": 1578, + "11/14)": 1906, + "112": 154, + "112h": 243, + "11h": 726, + "11xh": 1881, + "12": 115, + "122": 121, + "1221": 194, + "1221h": 578, + "1222": 771, + "1222h": 1120, + "122h": 171, + "122h-1": 126, + "122h-2": 598, + "122h-2a": 2108, + "122h-2b": 1942, + "122h-2x": 1975, + "122m": 1042, + "12[H]": 2107, + "12h": 556, + "12m": 1934, + "1A": 1290, + "1h": 795, + "1m": 1031, + "1n1-": 1919, + "1n2-": 2022, + "2": 27, + "2(C)": 1210, + "2(C)[C@@]3": 1570, + "2)": 1341, + "2*C": 1557, + "2*F": 1133, + "2*I": 1766, + "2*N": 269, + "2*N=^XCC/3O": 1962, + "2*NC": 1023, + "2*NC(CCCCCC$4)/3=O": 1825, + "2*NCC": 1440, + "2*NCC/3=O": 139, + "2*NCCC": 991, + "2*NCCC^R": 1615, + "2*NCCC^X": 1869, + "2*NCCC^XO": 1891, + "2*NCCO": 1965, + "2*NCO": 1442, + "2*NCOCCCl/6Cl/6Cl/3=O": 2006, + "2*NSO/3=O/3=O": 495, + "2*O": 1363, + "2*OC": 475, + "2*OC(CCCCCC$4)": 447, + "2*OC(CCCCCC$4)/3=O": 512, + "2*OCC": 727, + "2*OCC/3=O": 327, + "2*OCC=C": 1937, + "2*OCCC/4C/4C/3=O": 1415, + "2*OCCCC": 1002, + "2*OCCCCCCCC": 920, + "2*OPO/3O/3=O": 1202, + "2*OS(CCCCCC$4/7)C/3=O/3=O": 2039, + "2*OSC/3=O/3=O": 2112, + "2*OSO/3=O/3=O": 469, + "2*OSiC/3C/3C": 1541, + "2*OSiCC/4C/4C/3C/3C": 2113, + "2-": 174, + "2-5": 521, + "2-6": 208, + "2-?": 721, + "2/5": 1315, + "21": 191, + "211": 267, + "2111m": 1658, + "21h": 971, + "21m": 2088, + "22": 294, + "222": 484, + "222h": 862, + "222m": 1816, + "22h": 739, + "22h-1b": 1230, + "2C": 1211, + "3": 28, + "3)": 1355, + "3*C": 899, + "3*CO": 1613, + "3*F": 1411, + "3*N": 662, + "3*NCC": 1429, + "3*NCC/3=O": 694, + "3*O": 1444, + "3*OC": 332, + "3*OC(CCCCCC$4)": 397, + "3*OC(CCCCCC$4)/3=O": 520, + "3*OC(CCCCCC$4/7)OC": 1909, + "3*OCC": 622, + "3*OCC/3=O": 324, + "3*OCC=C": 1297, + "3*OCCC/4C/4C/3=O": 1676, + "3*OCCCC": 962, + "3*OCCCCCCCC": 877, + "3*OCCCCCCCCCCCCCCCC/3=O": 2055, + "3*OCCC^R": 1847, + "3*OCCC^X": 1579, + "3*OCCC^XCCCCCCCCCCC/5O/3=O": 2061, + "3*OC^R": 1399, + "3*OC^RCO/4=O/3C": 1560, + "3*OPO/3O/3=O": 1406, + "3*OP^XOCCN/3O/3=O": 1921, + "3*OS(CCCCCC$4/7)C/3=O/3=O": 2074, + "3*OSO/3=O/3=O": 548, + "3*OSiC/3C/3C": 1422, + "3*OSiCC/4C/4C/3C/3C": 1518, + "3*S": 2083, + "3-": 178, + "3-6": 1049, + "3-7": 553, + "334": 744, + "334h": 1591, + "34": 449, + "344": 551, + "344h": 1337, + "3|": 297, + "3|b": 974, + "3|b3|c3|d": 1162, + "3|b3|c3|d3|e": 1174, + "3|b3|c3|d3|e3|f": 1187, + "3|b3|c3|d3|e3|f3|g": 1207, + "3|b3|c3|d3|e3|f3|g3|h": 1225, + "3|b3|c3|d3|e3|f3|g3|h3|i": 1240, + "3|b3|c3|d3|e3|f3|g3|h3|i3|j": 1350, + "3|b3|c3|d3|e3|f3|g3|h3|i3|j3|k": 1443, + "3|b3|c3|d3|e3|f3|g3|h3|i3|j3|k3|l": 1619, + "3|b3|c3|d3|e3|f3|g3|h3|i3|j3|k3|l3|m": 2018, + "3|c": 764, + "3|c3|d": 1157, + "3|d": 1068, + "3|e": 1081, + "3|f": 794, + "3|g": 657, + "3|h": 1061, + "3|i": 969, + "3|j": 1032, + "3|k": 1060, + "3|l": 1241, + "3|m": 1293, + "3|n": 1247, + "3|o": 1217, + "3|p": 1376, + "3|p6": 1486, + "3|q": 1612, + "3|q6": 1693, + "3|r": 1630, + "3|r6": 1703, + "3|s": 1700, + "3}": 648, + "3~": 863, + "3~n": 691, + "4": 29, + "4(C)": 1435, + "4)": 227, + "4)/3=O": 1028, + "4*C": 1926, + "4*F": 1580, + "4*N": 614, + "4*NC=O": 1441, + "4*NCC": 2011, + "4*NCC/3=O": 923, + "4*O": 2094, + "4*OC": 514, + "4*OC(CCCCCC$4)": 456, + "4*OC(CCCCCC$4)/3=O": 601, + "4*OCC": 849, + "4*OCC/3=O": 337, + "4*OCCC/4C/4C/3=O": 2062, + "4*OCCCC": 1271, + "4*OPO/3O/3=O": 606, + "4*OP^XOP^XOCCN/5O/5=O/3O/3=O": 1259, + "4*OSC/3=O/3=O": 1894, + "4*OSO/3=O/3=O": 581, + "4*OSiC/3C/3C": 1621, + "4*OSiCC/4C/4C/3C/3C": 2007, + "4-": 160, + "4-6*OC^XO*/3CO/6=O/3C": 1885, + "4/5": 1330, + "4/6)": 1947, + "4/7": 586, + "4/7)": 789, + "4/7)OC": 960, + "4/8": 1222, + "4/8)O(": 1319, + "44": 1795, + "4[C@@](C)": 1713, + "4[C@@](C)3": 1714, + "4|": 344, + "4|b": 1073, + "4|b4|c": 1597, + "4|b4|c4|d": 1598, + "4|b4|c4|d4|": 1599, + "4|c": 1079, + "4|d": 868, + "4|d6|": 1044, + "4|g": 1448, + "4|h": 1074, + "4|h4|i": 1834, + "4|i": 1024, + "4|j": 1176, + "4|k": 1412, + "4|l": 1682, + "4}": 1075, + "4}C(O)": 1651, + "4~": 867, + "4~n": 718, + "5": 30, + "5)": 984, + "5)/3=O": 2012, + "5*N": 841, + "5*NCC": 289, + "5*NCC/3=O": 225, + "5*NCCO/3=O": 290, + "5*OC": 1746, + "5*OC(CCCCCC$4)": 1096, + "5*OC(CCCCCC$4)/3=O": 1076, + "5*OCC": 1966, + "5*OCC/3=O": 1160, + "5*OPO*/3O/3=O": 1648, + "5*OPO/3O/3=O": 1732, + "5-": 583, + "5n2-6": 903, + "5n2-6n1*1O(CCCCCC$3/6)N": 904, + "5n2-6n1*1O(CCCCCC$3/6)NCN(CCCCCC$12": 1953, + "6": 31, + "6)": 839, + "6)/3=O": 1603, + "6*Br": 1709, + "6*Cl": 1870, + "6*F": 1549, + "6*I": 1564, + "6*N": 644, + "6*NCC": 1587, + "6*NCN(CCCCCC$5": 2013, + "6*O": 1565, + "6*OC": 528, + "6*OC(CCCCCC$4)": 460, + "6*OC(CCCCCC$4)/3(CCCCCC$10)/3(CCCCCC$16)": 1327, + "6*OC(CCCCCC$4)/3=O": 701, + "6*OCC": 770, + "6*OCC/3=O": 362, + "6*OCCC/4C/4C/3=O": 1436, + "6*OCCCC": 1251, + "6*OCCCCCCCC": 1674, + "6*OC^XO*/3CO/6=O/3C": 1865, + "6*OPO/3O/3=O": 757, + "6*OPOCCN/3O/3=O": 1691, + "6*OP^XOCCN/3O/3=O": 846, + "6*OP^XOCCNC/7C/7C/3O/3=O": 1821, + "6*OS(CCCCCC$4/7)C/3=O/3=O": 1649, + "6*OSO/3=O/3=O": 333, + "6*OSiC/3C/3C": 1864, + "6*OSiCC/4C/4C/3(CCCCCC$8)/3(CCCCCC$14)": 1525, + "6*OSiCC/4C/4C/3C/3C": 1583, + "6*S": 1354, + "6*SO/2=O/2=O": 1898, + "6-": 195, + "6/9": 1542, + "6=O": 786, + "6n1-4": 1859, + "6n1-4n2*OC": 1915, + "6n2-8": 1545, + "6n2-8n1*1O(CCCCCC$3/6)N": 1546, + "6|": 403, + "6|b": 1185, + "6|c": 1179, + "6|c6|d": 2065, + "6|c6|d6|": 2075, + "6|d": 1180, + "6|g": 1212, + "6|h": 1177, + "6|i": 1191, + "6|j": 1244, + "6|k": 1328, + "6|l": 1643, + "6}": 743, + "6~": 1159, + "6~n": 1058, + "7": 32, + "7*N": 1394, + "7*NCC/3=O": 1424, + "7*OCC/3=O": 1586, + "7*OPO/3O/3=O": 1817, + "7*OP^XOCCN/3O/3=O": 1753, + "7-": 641, + "7-b1": 1237, + "8": 33, + "8*(N": 1935, + "8*N": 1402, + "8-": 557, + "8-b1": 933, + "9": 34, + "9*OCC/3=O": 1400, + "9-b1": 1809, + ":": 35, + "<": 36, + "": 534, + "-?": 2016, + "@": 642, + "@2": 2109, + "@p": 2043, + "=": 37, + "=@SMILES@": 575, + "=C": 457, + "=C(C": 1967, + "=C/": 1657, + "=C1": 1188, + "=CC": 929, + "=N": 1511, + "=O": 123, + "=O)": 876, + "=O)C": 1971, + "=O)O": 2084, + "=O/3=O": 1553, + "=O/3C": 1208, + "=O/5": 1166, + "=^": 459, + "=^E": 889, + "=^EC(": 1729, + "=^EC(CCCCCC$": 1481, + "=^EC(CCCCCC$6/9": 1668, + "=^EC(CCCCCC$6/9)O(/8": 2051, + "=^X": 1552, + "=^XCC": 1659, + "=^XCC/3O": 1715, + "=^Z": 504, + "=^ZCCC": 712, + "=^ZCCC/3=O": 1902, + "=^ZCCC=^ZCCC": 918, + "=^ZCCC=^ZCCCCCC/3=O": 1534, + "=^ZCCCCCC/3=O": 1272, + "={": 2049, + "={5": 1507, + "={54}C(O)": 2089, + ">": 38, + "?": 39, + "?%": 1669, + "?*OCC/3=O": 2033, + "?*OPO/3O/3=O": 1796, + "?*OSO/3=O/3=O": 1078, + "?-": 149, + "?-?": 2067, + "?|": 114, + "?|A": 434, + "?|B": 462, + "?|C": 493, + "?|D": 535, + "?|E": 608, + "?|F": 635, + "?|G": 646, + "?|H": 667, + "?|I": 675, + "?|J": 688, + "?|K": 831, + "?|L": 939, + "?|L?|M": 942, + "?|L?|M?|N": 943, + "?|M": 940, + "?|N": 941, + "?|O": 1003, + "?|O?|P": 1011, + "?|O?|P?|Q": 1012, + "?|O?|P?|Q?|R": 1013, + "?|O?|P?|Q?|R?|S": 1014, + "?|O?|P?|Q?|R?|S?|T": 1015, + "?|O?|P?|Q?|R?|S?|T?|U": 1016, + "?|O?|P?|Q?|R?|S?|T?|U?|V": 1017, + "?|P": 1004, + "?|Q": 1005, + "?|R": 1006, + "?|S": 1007, + "?|T": 1008, + "?|U": 1009, + "?|V": 1010, + "?|W": 1167, + "?|W?|X": 1170, + "?|W?|X?|Y": 1171, + "?|X": 1168, + "?|Y": 1169, + "?|Z": 1370, + "?|Z?|a": 1371, + "?|Z?|aa?|": 1372, + "?|Z?|aa?|ab": 1373, + "?|a": 552, + "?|ac": 1738, + "?|ac?|ad": 1739, + "?|ad": 1737, + "?|c": 133, + "?|d": 135, + "?|e": 137, + "?|f": 140, + "?|g": 142, + "?|h": 144, + "?|h?}": 2064, + "?|i": 147, + "?|i?}": 1842, + "?|j": 150, + "?|k": 152, + "?|l": 155, + "?|m": 157, + "?|n": 164, + "?|o": 167, + "?|p": 175, + "?|s": 192, + "?|t": 197, + "?|u": 217, + "?|v": 238, + "?|w": 264, + "?|x": 298, + "?|y": 322, + "?|z": 387, + "?}": 163, + "?}*OC": 716, + "?}*OCC/3=O": 870, + "?}*OPO/3O/3=O": 742, + "?}*OSO/3=O/3=O": 592, + "?}-{": 170, + "?}-{a?|b": 994, + "?}-{a?|b?": 995, + "?}-{a?|b?|c": 602, + "?}-{a?|b?|c?": 603, + "?}-{a?|b?|c?|d": 487, + "?}-{a?|b?|c?|d?": 488, + "?}-{a?|b?|c?|d?|e": 476, + "?}-{a?|b?|c?|d?|e?": 477, + "?}-{a?|b?|c?|d?|e?|f": 440, + "?}-{a?|b?|c?|d?|e?|f?": 441, + "?}-{a?|b?|c?|d?|e?|f?|g": 444, + "?}-{a?|b?|c?|d?|e?|f?|g?": 445, + "?}-{a?|b?|c?|d?|e?|f?|g?|h": 430, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?": 431, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i": 419, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?": 420, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j": 383, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?": 384, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k": 371, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?": 372, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l": 340, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?": 341, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m": 389, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?": 390, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n": 378, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?": 379, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o": 359, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?": 360, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p": 349, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?": 350, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q": 375, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?": 376, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r": 353, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?": 354, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s": 367, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?": 368, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t": 334, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?": 335, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u": 364, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?": 365, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v": 426, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?": 427, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w": 538, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?": 539, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x": 659, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?": 660, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y": 808, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?": 809, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z": 987, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?": 988, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A": 1499, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?": 1500, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B": 1389, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?": 1390, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C": 1634, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?": 1635, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D": 1600, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?": 1601, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J": 1566, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?": 1567, + "@": 40, + "@=@SMILES@": 576, + "@=@SMILES@C": 924, + "@=@SMILES@CC": 1493, + "@=@SMILES@CC1": 2050, + "@=@SMILES@O": 946, + "@=@SMILES@O{3}": 2085, + "@S": 559, + "@SMI": 562, + "@SMILES": 563, + "@SMILES@": 564, + "@a": 900, + "@ac": 1106, + "@acid": 1117, + "@aglyc": 1851, + "@aglycon": 1852, + "@olean": 2068, + "@oleanolic~": 2069, + "A": 41, + "A-1": 259, + "A-1a": 437, + "A-1b": 715, + "A-1x": 465, + "A1": 1533, + "A2": 1385, + "A4": 1861, + "A": 1306, + "AU": 272, + "AUd1122h": 570, + "AUd21122h": 316, + "AUdxxxx": 461, + "AUdxxxxh": 847, + "AUdxxxxxh": 515, + "Aa": 209, + "Aa11": 2002, + "Aad": 2104, + "Aad1122h-2": 407, + "Aad1122h-2a": 573, + "Aad1122h-2x": 523, + "Aad2": 1367, + "Aad21": 1771, + "Aad21122h": 220, + "Aad21122h-2": 221, + "Aad21122h-2a": 254, + "Aad21122h-2x": 266, + "Aad22111m": 1800, + "Aax21": 1943, + "Ad1": 747, + "Ad1d": 931, + "Ad1dd11h": 1949, + "Ad1dd22h": 1972, + "Ad1zz": 1751, + "Ad2": 755, + "Ad2d": 911, + "Ad2dd11h": 1989, + "Ad2dd22h": 1944, + "Ad2zz": 1727, + "B": 42, + "B1": 2028, + "Br": 1152, + "C": 43, + "C$": 802, + "C(": 724, + "C(CCCC": 1540, + "C(CCCCCC$": 600, + "C(CCCCCC$4)/3=O": 1398, + "C(CCCCCC$6)/3=O": 1875, + "C)": 1677, + "C)C": 1653, + "C/": 313, + "C/1": 892, + "C/10=O": 1395, + "C/10=O(": 1718, + "C/10=O(/4)*2": 2014, + "C/11": 1984, + "C/12": 2070, + "C/2": 1835, + "C/2C": 1876, + "C/3=O": 381, + "C/3=O/3=O": 686, + "C/3C/3C": 613, + "C/3O/3=O": 968, + "C/4": 439, + "C/4C/3=O": 725, + "C/4C/4C/3=O": 805, + "C/4O/3=O": 1998, + "C/5": 813, + "C/5O/3=O": 860, + "C/6=O": 2081, + "C/7": 714, + "C/7C/7": 980, + "C/7C/7C/3O/3=O": 986, + "C/9": 1938, + "C1": 1438, + "C2": 2052, + "C=C": 1088, + "C=O": 1129, + "C=^Z": 998, + "C=^ZCCC=^ZCCC": 1694, + "C=^ZCCC=^ZCCCCCC/3=O": 1867, + "C=^ZCCCCCCC/3=O": 1836, + "C=^ZCCCCCCCCC/3=O": 1519, + "CC": 117, + "CC$": 864, + "CC$2": 1660, + "CC(C)": 1332, + "CC/3=O": 128, + "CC/4": 680, + "CC/4C/4": 697, + "CC=C": 1070, + "CC=C4": 1304, + "CCC": 505, + "CCC/3=O": 1767, + "CCCC": 173, + "CCCC$": 1716, + "CCCCC$": 1146, + "CCCCCC": 210, + "CCCCCC$": 214, + "CCCCCC/3=O": 965, + "CCCCCCC/3=O": 1551, + "CCCCCCCC": 386, + "CCCCCCCC/3=O": 926, + "CCCCCCCCC/3=O": 1226, + "CCCCCCCCCC": 826, + "CCCCCCCCCC/3=O": 1427, + "CCCCCCCCCCC/3=O": 1523, + "CCCCCCCCCCC/5O/3=O": 1175, + "CCCCCCCCCCCC": 1431, + "CCCCCCCCCCCCCC": 1473, + "CCCNCC$": 1853, + "CCCl": 1990, + "CCCl/6Cl/6Cl/3=O": 1999, + "CCN": 412, + "CCN/5O/5=O/3O/3=O": 883, + "CCO": 1027, + "CC[C@@]": 964, + "CC[C@]": 756, + "CC[C@]3": 2023, + "CC^": 706, + "CC^E": 1127, + "CC^ECC^Z": 1515, + "CC^ECC^Z$4)": 1882, + "CC^ECC^Z$4)/9": 1929, + "CC^R": 1685, + "CC^S": 2047, + "CC^X": 2003, + "CC^Z": 935, + "CC^ZCC^Z": 1592, + "CF/4F/4F/3=O": 1848, + "CF/4F/4F/3=O/3=O": 1849, + "CN": 577, + "CN$": 1663, + "CN(CCCCCC$": 1025, + "CN(CCCCCC$12": 1791, + "CN(CCCCCC$5": 1437, + "CO/4=O/3C": 1294, + "C^R": 866, + "C^S": 1069, + "C^X": 1103, + "Cl": 990, + "Cl/3=O": 1288, + "D": 44, + "E": 45, + "EE": 1135, + "ER": 704, + "ERR": 728, + "ERRO": 729, + "ERROR": 730, + "ERROR1-": 932, + "ERROR1-ERROR": 1056, + "ERROR1-ERROR2": 1311, + "ES": 560, + "F": 46, + "F/3=O": 875, + "F/4": 823, + "F/4F/4": 1142, + "F/4F/4F/3=O": 1189, + "FF": 1094, + "FFA": 2056, + "G": 47, + "H": 48, + "H]": 326, + "I": 49, + "J": 50, + "K": 51, + "L": 52, + "LES": 561, + "M": 53, + "MI": 554, + "N": 54, + "N$": 1652, + "N$2": 2053, + "NC$": 1797, + "NCC$": 1504, + "NCCO": 1664, + "O": 55, + "O($": 1588, + "O)": 393, + "O*2": 1702, + "O/": 414, + "O/2": 1140, + "O/2=O": 1276, + "O/2=O/2=O": 1521, + "O/3=O": 199, + "O/3=O/3=O": 249, + "O/3O/3=O": 1747, + "O/4": 1065, + "O/4=O/3C": 1266, + "O/5": 666, + "O/5=O": 723, + "O/5=O/3O/3=O": 740, + "O/5O/5=O/3O/3=O": 1722, + "O/6": 1883, + "O/6=O": 858, + "O/7": 1300, + "O/8": 1712, + "O/9": 1827, + "OC": 887, + "P": 56, + "PO": 1275, + "Q": 57, + "QQ": 1386, + "R": 58, + "S": 59, + "S(CCCCCC$": 1147, + "SO/3=O/3=O": 492, + "T": 60, + "U": 61, + "V": 62, + "W": 63, + "X": 64, + "Y": 65, + "Z": 66, + "[": 67, + "[BRANCH_CLOSE]": 6, + "[BRANCH_OPEN]": 5, + "[C": 292, + "[C@": 293, + "[C@@": 382, + "[C@@H]": 519, + "[C@@H](O)": 760, + "[C@@H]1": 1512, + "[C@@H]2": 1973, + "[C@@]": 502, + "[C@@](C)": 1312, + "[C@@]1": 1719, + "[C@@]2": 1550, + "[C@@]3": 1037, + "[C@@]4": 1604, + "[C@@]5": 1733, + "[C@H]": 537, + "[C@H](C": 2044, + "[C@H](O)": 921, + "[C@H](O)C": 1377, + "[C@H]1": 1235, + "[C@H]2": 1959, + "[C@H]3": 1627, + "[C@H]4": 1644, + "[C@]": 472, + "[C@](C)": 1594, + "[C@]1": 1430, + "[C@]12": 1877, + "[C@]2": 1843, + "[C@]3": 1401, + "[C@]4": 1862, + "[C@]5": 1324, + "[C@]5([H])": 1916, + "[END]": 3, + "[H]": 615, + "[LINK]": 7, + "[MASK]": 4, + "[MOD]": 8, + "[PAD]": 0, + "[RESIDUE_ERROR]": 9, + "[START]": 2, + "[UNK]": 1, + "\\": 68, + "]": 69, + "^": 70, + "^R": 621, + "^S": 851, + "^X": 331, + "^XO": 392, + "^XO*/3CO/6=O/3C": 1382, + "a": 71, + "a1": 161, + "a1*OC": 1838, + "a1*OPO*/3O/3=O": 1242, + "a1-": 319, + "a1-a": 1818, + "a1-b": 835, + "a1-b1": 916, + "a1-b2": 936, + "a1-b3~n": 1810, + "a1-b4~n": 1638, + "a1-c": 741, + "a1-c2": 1899, + "a1-c3~": 1768, + "a1-c3~n": 1352, + "a1-c4~": 1860, + "a1-c4~n": 1628, + "a1-d": 705, + "a1-d2": 1351, + "a1-d2~n": 1785, + "a1-d3~": 1708, + "a1-d3~n": 1245, + "a1-d4~": 1910, + "a1-d4~n": 1353, + "a1-e": 909, + "a1-e2": 1922, + "a1-e3~n": 1820, + "a1-e4~n": 2057, + "a1-f": 1313, + "a1-g": 1855, + "a11": 1223, + "a111": 1102, + "a1111": 1307, + "a1111h-1a": 1710, + "a1112": 825, + "a1112h-1b": 1296, + "a1112h-1x": 1482, + "a112": 797, + "a1121": 919, + "a1121A-1a": 1839, + "a1122": 410, + "a11221": 301, + "a11221h-1a": 358, + "a11221h-1x": 424, + "a11222": 645, + "a11222h-1a": 804, + "a11222h-1x": 992, + "a1122A-1b": 1053, + "a1122A-1x": 1491, + "a1122h-1": 172, + "a1122h-1a": 196, + "a1122h-1b": 250, + "a1122h-1x": 223, + "a1122m-1a": 699, + "a1122m-1b": 1723, + "a1122m-1x": 1145, + "a12": 612, + "a121": 1625, + "a1211": 787, + "a1211h-1a": 1874, + "a1211h-1b": 1496, + "a1211h-1x": 1476, + "a1211m-1a": 1936, + "a1212": 1358, + "a1221": 213, + "a1221h-1a": 1480, + "a1221h-1x": 1622, + "a1221m-1": 215, + "a1221m-1a": 245, + "a1221m-1b": 1128, + "a1221m-1x": 270, + "a1222": 997, + "a1222h-1a": 1814, + "a1222h-1b": 2091, + "a1222h-1x": 1950, + "a122h-1": 580, + "a122h-1a": 777, + "a122h-1b": 1236, + "a122h-1x": 982, + "a1d21": 1692, + "a1d21m-1a": 2004, + "a1d22": 1854, + "a1x1": 1419, + "a1x1xh-1u": 1920, + "a1x2": 1239, + "a1x2xh-1u": 1840, + "a2": 125, + "a2-": 937, + "a2-b1": 399, + "a2-c1": 1775, + "a21": 653, + "a211": 433, + "a2111": 1047, + "a2112": 159, + "a2112A-1a": 633, + "a2112A-1b": 1229, + "a2112A-1x": 798, + "a2112h-1": 166, + "a2112h-1a": 281, + "a2112h-1b": 190, + "a2112h-1x": 205, + "a2112m-1a": 687, + "a2112m-1b": 925, + "a2112m-1x": 824, + "a211h-1a": 624, + "a211h-1b": 1156, + "a211h-1x": 772, + "a212": 305, + "a2121": 546, + "a2121A-1a": 780, + "a2121A-1x": 879, + "a2121h-1b": 1792, + "a2122": 304, + "a2122A-1": 320, + "a2122A-1a": 822, + "a2122A-1b": 417, + "a2122A-1x": 532, + "a2122h-1": 146, + "a2122h-1a": 246, + "a2122h-1b": 177, + "a2122h-1x": 187, + "a2122m-1a": 1206, + "a2122m-1b": 799, + "a2122m-1x": 1098, + "a212h-1a": 815, + "a212h-1b": 451, + "a212h-1x": 527, + "a21EE": 1255, + "a21EEA-1a": 1782, + "a21EEA-1x": 1968, + "a21FF": 1347, + "a21FFA-1a": 1939, + "a21FFA-1x": 2026, + "a21d2": 1689, + "a21eE": 1274, + "a21eEA-1a": 1954, + "a21eEA-1x": 1976, + "a22": 651, + "a2211": 285, + "a2211h-1a": 1783, + "a2211h-1x": 1748, + "a2211m-1a": 314, + "a2211m-1b": 884, + "a2211m-1x": 513, + "a2212": 1022, + "a2212h-1b": 1724, + "a2212h-1x": 1788, + "a222": 689, + "a2221": 832, + "a2221h-1b": 1822, + "a2221h-1x": 2027, + "a2221m-1a": 1348, + "a2222": 707, + "a2222h-1a": 1769, + "a2222h-1b": 1114, + "a2222h-1x": 1143, + "a222h-1a": 1811, + "a222h-1b": 852, + "a222h-1x": 1575, + "a26": 1927, + "a28-b1": 1249, + "a2d": 1018, + "a2d12": 1308, + "a2d12m-1a": 1777, + "a2d22": 1878, + "a2|": 1452, + "a2|b2|": 1526, + "a2|b2|c2|": 1527, + "a2|b2|c2|d2|e2": 1535, + "a2|b2|c2|d2|e2|f2": 1815, + "a3": 736, + "a3-": 256, + "a3-b1": 262, + "a3-b2": 1903, + "a3-c1": 719, + "a3-d1": 1639, + "a3-e1": 1911, + "a3344": 812, + "a3344h-1a": 1148, + "a3344h-1x": 1868, + "a3344m-1x": 2086, + "a344": 1956, + "a4": 597, + "a4-": 222, + "a4-b1": 228, + "a4-b2": 1772, + "a4-c1": 571, + "a4-d1": 1378, + "a4-e1": 2024, + "a4334": 845, + "a4334h-1b": 1856, + "a4334h-1x": 1310, + "a4344": 914, + "a4344h-1b": 1690, + "a4344h-1x": 1479, + "a5": 483, + "a5-": 1309, + "a5-b1": 518, + "a5-c1": 1665, + "a6-": 261, + "a6-b1": 404, + "a6-b2": 1616, + "a6-b3*N": 1957, + "a6-c1": 708, + "a6-d1": 784, + "a6-e1": 951, + "a6-f1": 947, + "a6-g1": 1277, + "a6-h1": 1323, + "a6-i1": 1054, + "a6-j1": 901, + "a6-k1": 954, + "a6-l1": 816, + "a6-m1": 1113, + "a6-n1": 1164, + "a6-o1": 1165, + "a6-p1": 1477, + "a6-q1": 1757, + "a6-r1": 1263, + "a6-s1": 1871, + "a6-t1": 1879, + "a6-u1": 1844, + "a6|b": 1192, + "a7-b1": 1282, + "a8-": 1283, + "a8-b1": 1418, + "a8-b3": 2040, + "a?-": 226, + "a?-b1": 241, + "a?-b2": 1267, + "a?-c1": 972, + "a?-d1": 959, + "a?-e1": 979, + "a?-f1": 1055, + "a?-g1": 1342, + "a?-h1": 1561, + "a?-i1": 1420, + "a?-j1": 1233, + "a?-k1": 1318, + "a?-l1": 1115, + "a?-m1": 1416, + "a?-n1": 1425, + "a?-o1": 1605, + "a?-p1": 1740, + "a?-q1": 1912, + "a?-r1": 1661, + "a?-s1": 1907, + "a?-t1": 2020, + "a?|": 131, + "a?|b": 132, + "a?|b?|c": 134, + "a?|b?|c?|d": 136, + "a?|b?|c?|d?|e": 138, + "a?|b?|c?|d?|e?|f": 141, + "a?|b?|c?|d?|e?|f?|g": 143, + "a?|b?|c?|d?|e?|f?|g?|h": 145, + "a?|b?|c?|d?|e?|f?|g?|h?|i": 148, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j": 151, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k": 153, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l": 156, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m": 158, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n": 165, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o": 168, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p": 176, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|": 180, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q": 181, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|": 183, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r": 184, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s": 193, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t": 198, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u": 218, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v": 239, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w": 265, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x": 299, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y": 323, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z": 388, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A": 435, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B": 463, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C": 494, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D": 536, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E": 609, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F": 636, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G": 647, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H": 668, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I": 676, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J": 690, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K": 833, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N": 944, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V": 1019, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V?|W?|X?|Y": 1172, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V?|W?|X?|Y?|Z?|aa?|ab": 1374, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V?|W?|X?|Y?|Z?|aa?|ab?|ac?|ad": 1741, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?": 1568, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?": 1602, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?": 1636, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?": 1391, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?": 1501, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?": 989, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?": 810, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?": 661, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?": 540, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?": 428, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?": 366, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?": 336, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?": 369, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?": 355, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?": 377, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?": 351, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?}": 2105, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?": 361, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?}": 1524, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?": 380, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?}": 1478, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?": 391, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?}": 1483, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?": 342, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?}": 1262, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?": 373, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?}": 958, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?": 385, + "a?|b?|c?|d?|e?|f?|g?|h?|i?}": 886, + "a?|b?|c?|d?|e?|f?|g?|h?|i?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?": 421, + "a?|b?|c?|d?|e?|f?|g?|h?}": 1000, + "a?|b?|c?|d?|e?|f?|g?|h?}*OSO/3=O/3=O": 2035, + "a?|b?|c?|d?|e?|f?|g?|h?}-{a?|b?|c?|d?|e?|f?|g?|h?": 432, + "a?|b?|c?|d?|e?|f?|g?}": 1150, + "a?|b?|c?|d?|e?|f?|g?}-{a?|b?|c?|d?|e?|f?|g?": 446, + "a?|b?|c?|d?|e?|f?}": 834, + "a?|b?|c?|d?|e?|f?}*OC": 2110, + "a?|b?|c?|d?|e?|f?}*OSO/3=O/3=O": 1333, + "a?|b?|c?|d?|e?|f?}-{a?|b?|c?|d?|e?|f?": 442, + "a?|b?|c?|d?|e?}": 791, + "a?|b?|c?|d?|e?}*OC": 2034, + "a?|b?|c?|d?|e?}*OSO/3=O/3=O": 1253, + "a?|b?|c?|d?|e?}-{a?|b?|c?|d?|e?": 478, + "a?|b?|c?|d?}": 1923, + "a?|b?|c?|d?}*OC": 1951, + "a?|b?|c?|d?}*OSO/3=O/3=O": 1349, + "a?|b?|c?|d?}-{a?|b?|c?|d?": 489, + "a?|b?|c?}*OC": 1563, + "a?|b?|c?}*OCC/3=O": 1773, + "a?|b?|c?}*OSO/3=O/3=O": 2030, + "a?|b?|c?}-{a?|b?|c?": 604, + "a?|b?}*OSO/3=O/3=O": 2101, + "a?|b?}-{a?|b?": 996, + "ab": 1316, + "ac": 1833, + "ad": 485, + "ad111": 1895, + "ad112": 1681, + "ad122": 1040, + "ad122h-1": 1734, + "ad122m-1b": 1285, + "ad2": 1539, + "ad21": 1837, + "ad221": 2041, + "ad222": 945, + "ad222m-1b": 1153, + "ad222m-1x": 1845, + "ad22h-1b": 1413, + "adxx": 2037, + "al": 1914, + "am": 1707, + "an": 912, + "ar": 1784, + "ax": 473, + "ax1": 1725, + "ax11": 850, + "ax11xh-1u": 1071, + "ax12": 732, + "ax12xh-1d": 1278, + "ax12xh-1u": 1077, + "ax21": 1789, + "ax22": 1607, + "axx": 524, + "axx1": 1029, + "axx1xh-1u": 1426, + "axx2": 881, + "axx21": 1662, + "axx2xh-1d": 1528, + "axx2xh-1u": 1529, + "axxxh-1x": 1134, + "axxxx": 224, + "axxxxA-1x": 1295, + "axxxxh-1x": 231, + "axxxxm-1x": 618, + "axxxxxh-1a": 2071, + "axxxxxh-1x": 1139, + "b": 72, + "b1": 179, + "b1-": 2000, + "b1-b": 1432, + "b2": 568, + "b2-": 396, + "b2-c1": 418, + "b2-d1": 1264, + "b2|": 1516, + "b3": 1408, + "b3*N": 1857, + "b3-": 271, + "b3-c1": 291, + "b3-c2": 750, + "b3-d1": 783, + "b3-e1": 1666, + "b4-": 236, + "b4-c1": 242, + "b4-d1": 745, + "b4-e1": 981, + "b4-f1": 1260, + "b4-g1": 2072, + "b5-": 1287, + "b5-c1": 1517, + "b6-": 339, + "b6-c1": 509, + "b6-c2": 906, + "b6-d1": 1036, + "b6-e1": 1112, + "b6-f1": 966, + "b6-g1": 1141, + "b6-h1": 1979, + "b?-": 237, + "b?-c1": 251, + "b?-c2": 793, + "b?-d1": 1072, + "b?-e1": 910, + "b?-f1": 938, + "b?-g1": 1021, + "b?-h1": 1250, + "b?-i1": 1531, + "b?-j1": 1671, + "c": 73, + "c(O)": 1913, + "c1": 185, + "c2": 436, + "c2-": 402, + "c2-d1": 413, + "c2-e1": 1558, + "c2|": 1505, + "c3-": 248, + "c3-d1": 255, + "c3-d2": 1331, + "c3-e1": 779, + "c3-f1": 1826, + "c4-": 288, + "c4-d1": 321, + "c4-d2": 1983, + "c4-e1": 821, + "c4-f1": 1091, + "c4-g1": 1289, + "c4-h1": 1097, + "c4-i1": 1200, + "c4-j1": 1392, + "c4-k1": 1218, + "c4-l1": 1761, + "c5-": 955, + "c5-d1": 1130, + "c6-": 268, + "c6-d1": 593, + "c6-d2": 2008, + "c6-e1": 738, + "c6-f1": 758, + "c6-g1": 607, + "c6-h1": 566, + "c6-i1": 628, + "c6-j1": 767, + "c6-k1": 682, + "c6-l1": 898, + "c6-m1": 1314, + "c6-n1": 2005, + "c7-": 1248, + "c8-": 1364, + "c8-d2": 1484, + "c?-": 229, + "c?-d1": 258, + "c?-d2": 1161, + "c?-e1": 880, + "c?-f1": 844, + "c?-g1": 711, + "c?-h1": 649, + "c?-i1": 654, + "c?-j1": 820, + "c?-k1": 720, + "c?-l1": 894, + "c?-m1": 1038, + "c?-n1": 1445, + "c?-o1": 1608, + "c?-p1": 1992, + "c?-q1": 1945, + "c?-r1": 2066, + "cc": 1256, + "d": 74, + "d1": 186, + "d1-c3|c6": 1387, + "d11": 1489, + "d111": 1637, + "d111h": 1678, + "d1122h": 325, + "d1122h-2": 406, + "d11h": 1320, + "d12h": 1675, + "d2": 357, + "d2-": 278, + "d2-e1": 282, + "d21": 204, + "d21122h": 207, + "d21h": 1801, + "d22": 1379, + "d221h": 1679, + "d22h": 1219, + "d2h": 1776, + "d2|": 1335, + "d2|e2": 1502, + "d3-": 343, + "d3-e1": 411, + "d3-e2": 1122, + "d3-f1": 927, + "d3-g1": 1858, + "d4-": 306, + "d4-e1": 408, + "d4-f1": 842, + "d4-g1": 792, + "d4-h1": 650, + "d4-i1": 857, + "d4-j1": 1680, + "d4-k1": 2102, + "d5-": 2029, + "d6-": 480, + "d6-e1": 678, + "d6-e2": 1866, + "d6-f1": 1227, + "d6-g1": 1252, + "d6-h1": 1234, + "d6-i1": 2095, + "d7-": 1280, + "d7-e1": 1774, + "d8-": 1886, + "d8-e2": 2015, + "d?-": 247, + "d?-e1": 275, + "d?-e2": 1050, + "d?-f1": 961, + "d?-g1": 754, + "d?-h1": 640, + "d?-i1": 788, + "d?-j1": 1001, + "d?-k1": 1360, + "dd": 2036, + "dd1": 1279, + "dd1dh": 1356, + "dd2": 1291, + "dd2dh": 1361, + "dh": 700, + "di": 1198, + "dx": 1131, + "dxdh": 1268, + "dxx": 1629, + "dxxxx": 455, + "e": 75, + "e1": 200, + "e1-": 1977, + "e2": 547, + "e2-": 497, + "e2-f1": 510, + "e3-": 347, + "e3-f1": 394, + "e3-f2": 1344, + "e3-g1": 1265, + "e4-": 287, + "e4-f1": 308, + "e4-g1": 526, + "e4|": 1064, + "e4|e6|": 1451, + "e4|f4|": 1623, + "e4|f4|g": 1654, + "e6-": 638, + "e6-f1": 796, + "e6-f2": 2038, + "e6-g1": 1536, + "e6|": 1205, + "e7-": 1576, + "e7-f1": 1704, + "e?-": 276, + "e?-f1": 295, + "e?-f2": 1197, + "e?-g1": 953, + "e?-h1": 817, + "e?-i1": 1305, + "eE": 1105, + "ec": 2076, + "en": 746, + "er": 1257, + "et": 1062, + "ethyl": 1742, + "f": 76, + "f1": 211, + "f1-": 2092, + "f1-a?|b?|c?|d?|e?}": 1798, + "f2": 619, + "f2-": 591, + "f2-g1": 616, + "f3-": 395, + "f3-g1": 464, + "f3-g2": 710, + "f3-h1": 1645, + "f3|f": 999, + "f3|f6": 1035, + "f4-": 479, + "f4-g1": 511, + "f4-h1": 1201, + "f4|": 1085, + "f6-": 543, + "f6-g1": 985, + "f6-g2": 765, + "f6-h1": 1417, + "f6-i1": 1985, + "f6|g": 1213, + "f7-": 1978, + "f?-": 309, + "f?-g1": 363, + "f?-g2": 499, + "f?-h1": 1396, + "f?-i1": 1940, + "g": 77, + "g1": 232, + "g1-": 1986, + "g1-a?|b?|c?|d?|e?|f?}": 1672, + "g2": 348, + "g2-": 482, + "g2-f3|f6": 1051, + "g2-h1": 531, + "g3-": 491, + "g3-h1": 544, + "g3-h2": 1261, + "g3|g": 748, + "g3|g6": 761, + "g4-": 458, + "g4-h1": 486, + "g4-i1": 1182, + "g6-": 681, + "g6-h1": 1136, + "g6-i1": 1238, + "g6-j1": 1404, + "g8-": 1711, + "g8-h2": 1720, + "g?-": 329, + "g?-h1": 401, + "g?-h2": 885, + "g?-i1": 1178, + "g?-j1": 1513, + "gen": 983, + "genin": 1125, + "gl": 1701, + "glyc": 1770, + "h": 78, + "h-1": 120, + "h-1a": 277, + "h-1b": 303, + "h-1u": 2096, + "h-1x": 203, + "h1": 234, + "h1-": 1577, + "h11": 1904, + "h1122h": 1338, + "h12": 1946, + "h2": 315, + "h2-": 438, + "h2-g3|g6": 773, + "h2-i1": 506, + "h21": 1892, + "h2112h": 574, + "h2122h": 525, + "h22": 1850, + "h222h": 1321, + "h2h": 674, + "h3-": 572, + "h3-i1": 629, + "h3-i2": 1572, + "h4": 890, + "h4-": 443, + "h4-i1": 466, + "h4-j1": 1194, + "h4h": 1190, + "h6-": 702, + "h6-i1": 1184, + "h6-i2": 2058, + "h6-j1": 1497, + "h6-k1": 1650, + "h6-l1": 1799, + "h8-": 1375, + "h8-i2": 1380, + "h?-": 352, + "h?-i1": 409, + "h?-i2": 893, + "h?-j1": 1301, + "hU": 1048, + "hU122h": 1554, + "ha": 626, + "ha122h-2": 669, + "ha122h-2b": 830, + "ha122h-2x": 1104, + "haxx": 2017, + "hdxdh": 1269, + "hxh": 853, + "hxxxxh": 1123, + "hy": 934, + "hyd": 1137, + "hydro": 1144, + "hydroxy": 1215, + "hyl": 1698, + "i": 79, + "i1": 240, + "i1-": 1302, + "i1-a?|b?|c?|d?|e?|f?|g?|h?}": 1961, + "i1-a?|b?|c?|d?|e?}": 2077, + "i2": 627, + "i2-": 522, + "i2-j1": 549, + "i3-": 555, + "i3-j1": 658, + "i3-j2": 1041, + "i3|i": 1655, + "i3|i6": 1743, + "i4-": 471, + "i4-j1": 501, + "i4-k1": 1151, + "i6-": 713, + "i6-j1": 1359, + "i6-j2": 1472, + "i6-k1": 1673, + "i6-l1": 1405, + "i?-": 345, + "i?-j1": 415, + "i?-j2": 859, + "i?-k1": 1317, + "i?-l1": 1193, + "ic": 840, + "ic@acid": 1121, + "ic~": 1573, + "id": 861, + "ide": 1896, + "in": 684, + "in@=@SMILES@O": 2042, + "ine": 1887, + "j": 80, + "j1": 253, + "j1-": 1224, + "j1-a?|b?|c?|d?|e?|f?|g?|h?|i?}": 1905, + "j2": 585, + "j2-": 599, + "j2-i3|i6": 1764, + "j2-k1": 656, + "j3-": 655, + "j3-k1": 769, + "j3-k2": 1231, + "j3|j": 1646, + "j3|j6": 1683, + "j4-": 529, + "j4-k1": 565, + "j4-l1": 1744, + "j6-": 776, + "j6-k1": 1537, + "j6-k2": 1469, + "j6-m1": 1758, + "j6-n1": 2054, + "j?-": 405, + "j?-k1": 470, + "j?-k2": 873, + "j?-l1": 1752, + "j?-m1": 1626, + "j?-n1": 2093, + "k": 81, + "k1": 263, + "k1-": 1204, + "k2": 632, + "k2-": 567, + "k2-j3|j6": 1684, + "k2-l1": 630, + "k3-": 762, + "k3-l1": 854, + "k3-l2": 1595, + "k3|k": 1593, + "k3|k6": 1631, + "k4-": 610, + "k4-l1": 665, + "k4-m1": 1584, + "k6-": 753, + "k6-l1": 1980, + "k6-n1": 1941, + "k6-o1": 1243, + "k?-": 416, + "k?-l1": 496, + "k?-l2": 1116, + "k?-m1": 1888, + "k?-n1": 1780, + "k?-o1": 1124, + "l": 82, + "l1": 284, + "l1-": 1362, + "l2": 785, + "l2-": 685, + "l2-k3|k6": 1632, + "l2-m1": 819, + "l3-": 800, + "l3-m1": 865, + "l3-m2": 1930, + "l3|l": 2019, + "l3|l6": 2078, + "l4-": 545, + "l4-m1": 589, + "l4-n1": 1506, + "l6-": 896, + "l6-p1": 1749, + "l?-": 450, + "l?-m1": 516, + "l?-m2": 1383, + "l?-n1": 1790, + "l?-o1": 1991, + "l?-p1": 1726, + "l?-q1": 1804, + "m": 83, + "m-1": 189, + "m-1a": 274, + "m-1b": 423, + "m-1x": 318, + "m1": 302, + "m1-": 1547, + "m2": 948, + "m2-": 828, + "m2-l3|l6": 2079, + "m2-n1": 1039, + "m3-": 717, + "m3-n1": 836, + "m3-n2": 1284, + "m3|m": 1762, + "m3|m6": 1805, + "m4-": 663, + "m4-n1": 735, + "m4-o1": 1368, + "m6-": 902, + "m6-n2": 1548, + "m?-": 481, + "m?-n1": 620, + "m?-n2": 950, + "m?-p1": 1686, + "m?-q1": 2021, + "m?-r1": 1948, + "methyl": 1900, + "n": 84, + "n1": 310, + "n1*1": 1721, + "n1*1O": 677, + "n1*1O(CCCCCC$3": 1963, + "n1*1O(CCCCCC$3/6)N": 814, + "n1-": 1057, + "n1-4": 1778, + "n2": 634, + "n2*1O": 1520, + "n2*OC": 1730, + "n2-": 672, + "n2-6": 872, + "n2-8": 1343, + "n2-m3|m6": 1806, + "n2-o1": 1446, + "n3-": 807, + "n3-o1": 922, + "n3-o2": 1987, + "n3|n": 1492, + "n3|n6": 1508, + "n4-": 731, + "n4-o1": 806, + "n4-p1": 1571, + "n6-": 1403, + "n?-": 590, + "n?-o1": 734, + "n?-o2": 1220, + "n?-q1": 1893, + "o": 85, + "o1": 338, + "o1-": 1880, + "o2": 874, + "o2-": 1030, + "o2-n3|n6": 1509, + "o2-p1": 2059, + "o3-": 895, + "o3-p1": 957, + "o3|o": 1286, + "o3|o6": 1298, + "o4-": 774, + "o4-p1": 855, + "o4-q1": 1538, + "o6-": 2009, + "o?-": 637, + "o?-p1": 752, + "o?-p2": 1503, + "ogenin": 1841, + "oic@acid": 1808, + "ol": 692, + "ol@=@SMILES@C": 1823, + "ole": 1617, + "olean": 1731, + "olic~": 1917, + "on": 1163, + "op": 2025, + "os": 1786, + "p": 86, + "p1": 400, + "p2": 1158, + "p2-": 1067, + "p2-o3|o6": 1299, + "p3-": 976, + "p3-q1": 1101, + "p3|p6": 1487, + "p4-": 907, + "p4-q1": 1082, + "p4-r1": 1759, + "p6-": 1828, + "p?-": 778, + "p?-q1": 952, + "p?-q2": 1433, + "q": 87, + "q1": 448, + "q2": 1020, + "q2-": 1209, + "q2-p3|p6": 1488, + "q3-": 1126, + "q3-r1": 1246, + "q3|q6": 1695, + "q4-": 1086, + "q4-r1": 1303, + "q4-s1": 1969, + "q?-": 843, + "q?-r1": 1026, + "q?-r2": 1993, + "r": 88, + "r1": 474, + "r2": 1365, + "r2-": 1334, + "r2-q3|q6": 1696, + "r3-": 1388, + "r3-s1": 1532, + "r3|r6": 1705, + "r4-": 1195, + "r4-s1": 1384, + "r?-": 963, + "r?-s1": 1138, + "ri": 1514, + "ro": 871, + "s": 89, + "s1": 550, + "s2": 1872, + "s2-": 1409, + "s2-r3|r6": 1706, + "s3-": 1609, + "s3-t1": 1802, + "s3|s": 1728, + "s3|s6": 1735, + "s4-": 1556, + "s4-t1": 1781, + "s?-": 1173, + "s?-t1": 1428, + "st": 1407, + "t": 90, + "t1": 652, + "t2": 1901, + "t2-": 1474, + "t2-s3|s6": 1736, + "t3-": 1970, + "t?-": 1829, + "tri": 1819, + "u": 91, + "u1": 260, + "u112": 1543, + "u1121h": 2048, + "u11221h": 582, + "u11222h": 1410, + "u1122h": 286, + "u1122m": 1414, + "u12": 1186, + "u1211h": 1955, + "u1221": 328, + "u1221h": 2087, + "u1221m": 330, + "u122h": 1281, + "u2": 188, + "u2-": 1897, + "u21": 1329, + "u2112": 751, + "u2112A": 1087, + "u2112h": 252, + "u2112m": 970, + "u211h": 977, + "u212": 1154, + "u2121A": 1466, + "u2122": 664, + "u2122A": 775, + "u2122h": 219, + "u2122m": 1214, + "u212h": 683, + "u22": 1254, + "u2211": 617, + "u2211m": 631, + "u2222h": 1670, + "u222h": 1498, + "u4": 1258, + "u4344h": 1964, + "ud": 838, + "ud222m": 1981, + "ux": 913, + "ux12": 1640, + "ux12xh": 1717, + "uxx": 679, + "uxx2": 1449, + "uxx2xh": 1624, + "uxxxh": 888, + "uxxxx": 201, + "uxxxxA": 781, + "uxxxxh": 212, + "uxxxxm": 398, + "uxxxxxh": 611, + "v": 92, + "v1": 917, + "w": 93, + "w1": 1203, + "x": 94, + "x1": 759, + "x2": 737, + "x21": 1793, + "x22h": 1889, + "x2h": 1794, + "x2xh": 2031, + "xA-1": 1450, + "xA-1u": 1559, + "xh": 317, + "xh-1": 452, + "xh-1a": 1928, + "xh-1d": 722, + "xh-1u": 530, + "xh-1x": 639, + "xh-2x": 1582, + "xm": 1447, + "xm-1": 1118, + "xm-1u": 1199, + "xx": 129, + "xxh": 1846, + "xxxh": 1569, + "xxxx": 182, + "xxxxh": 1092, + "xy": 1119, + "y": 95, + "y1": 1574, + "yc": 1490, + "yl": 1994, + "z": 96, + "z1": 1667, + "zz": 1155, + "{": 97, + "{1": 695, + "{14}": 1933, + "{16}": 1585, + "{1}": 1687, + "{2": 768, + "{22": 1884, + "{2}": 1974, + "{3": 1614, + "{3}": 782, + "{3}[C@@H](O)": 1090, + "{3}[C@@H](O)CC[C@]": 1270, + "{3}[C@@H](O)CC[C@]2(C)[C@@]3": 1988, + "{3}[C@H](O)": 2097, + "{3}[C@H](O)C": 2103, + "{5": 905, + "{7": 1346, + "{8": 1641, + "|": 98, + "|f2": 1812, + "|g2": 2080, + "}": 99, + "}C": 503, + "}C(": 1754, + "}C(O)": 671, + "}C(O)=C": 1581, + "}C(O)=O)": 1369, + "}C(O)C": 2111, + "}C1": 1620, + "}CO)": 1149, + "}[C@@H](O)": 1232, + "~": 100, + "~n": 425, + "Δ": 101, + "α": 102, + "β": 103, + "β,": 2060, + "γ": 104, + "δ": 105, + "ζ": 106, + "ξ": 107, + "С": 108, + "’": 109, + "′": 110, + "″": 111, + "→": 112, + "−": 113 + } +} diff --git a/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py b/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py new file mode 100644 index 0000000000000000000000000000000000000000..ce35d1fb5983918c87aedebaf3f1b2d3949b7baa --- /dev/null +++ b/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py @@ -0,0 +1,287 @@ +"""Fail-closed WURCS tree channels for the review-only A5 runtime. + +The fitted BPE vocabulary is deliberately not changed here. This module only +repairs deterministic transform-time annotations. A tree depth is emitted +only when every linkage is a full, unambiguous residue-pair token, exactly one +endpoint of every bond is the anomeric donor, and the resulting directed graph +is one rooted tree. Otherwise residue tokens receive an explicit UNKNOWN +depth while the original WURCS units remain available to BPE. + +This file is an isolated review runtime. It must not be copied over the shared +``training/a5_wurcs_bpe.py`` module. +""" + +from __future__ import annotations + +from collections import defaultdict, deque +from dataclasses import dataclass +from pathlib import Path +from typing import Optional + +from training.a5_topology import node_index, node_label +from training.a5_wurcs_bpe import A5WURCSBPETokenizer, A5WURCSPreTokenizer + + +BRANCH_DEPTH_UNKNOWN = 202 +BRANCH_DEPTH_VOCAB_SIZE = 203 + +LINKAGE_NONE = 0 +LINKAGE_1_2 = 1 +LINKAGE_1_3 = 2 +LINKAGE_1_4 = 3 +LINKAGE_1_6 = 4 +LINKAGE_2_3 = 5 +LINKAGE_2_6 = 6 +LINKAGE_3_6 = 7 +LINKAGE_OTHER_EXACT = 8 +LINKAGE_UNKNOWN = 9 +LINKAGE_VOCAB_SIZE = 10 + + +@dataclass(frozen=True) +class TreeChannelAnalysis: + residue_count: int + exact_undirected_tree: bool + exact_rooted_tree: bool + failure_reason: str + depths: dict[int, int] + branch_open_counts: dict[int, int] + distance_matrix: list[list[int]] + + +def _distance_matrix(adjacency: dict[int, set[int]], count: int) -> list[list[int]]: + matrix: list[list[int]] = [] + for source in range(count): + distances = {source: 0} + queue: deque[int] = deque([source]) + while queue: + current = queue.popleft() + for neighbor in sorted(adjacency[current]): + if neighbor not in distances: + distances[neighbor] = distances[current] + 1 + queue.append(neighbor) + if len(distances) != count: + return [] + matrix.append([distances[target] for target in range(count)]) + return matrix + + +class ReviewA5WURCSPreTokenizerV3(A5WURCSPreTokenizer): + """A5 semantic units with fail-closed branch and linkage channels.""" + + def _sections( + self, wurcs: str + ) -> tuple[list[str], list[str], list[str], list[int | None]]: + parts = self._split_wurcs_sections(wurcs) + if len(parts) < 4: + return [], [], [], [] + residue_definitions = self.RESIDUE_PATTERN.findall(parts[2]) + index_list = parts[3].split("-") if parts[3] else [] + linkages = parts[4].split("_") if len(parts) > 4 and parts[4] else [] + anomeric = self._instance_anomeric_positions(residue_definitions, index_list) + return residue_definitions, index_list, linkages, anomeric + + def analyze_tree(self, wurcs: str) -> TreeChannelAnalysis: + _, index_list, linkages, anomeric = self._sections(wurcs) + count = len(index_list) + if count == 0: + return TreeChannelAnalysis(0, False, False, "missing_residue_instances", {}, {}, []) + if count == 1: + if linkages: + return TreeChannelAnalysis( + 1, False, False, "single_residue_has_linkage_tokens", {}, {}, [] + ) + return TreeChannelAnalysis(1, True, True, "", {0: 0}, {}, [[0]]) + + adjacency: dict[int, set[int]] = {index: set() for index in range(count)} + directed_children: dict[int, list[int]] = defaultdict(list) + child_parent: dict[int, int] = {} + seen_edges: set[tuple[int, int]] = set() + orientation_failure = "" + + for linkage in linkages: + match = self.A5_LINKAGE_PATTERN.fullmatch(linkage) + if match is None: + return TreeChannelAnalysis( + count, False, False, "non_exact_linkage_token", {}, {}, [] + ) + left_label, left_position, right_label, right_position = match.groups() + try: + left = node_index(left_label) - 1 + right = node_index(right_label) - 1 + except ValueError: + return TreeChannelAnalysis( + count, False, False, "invalid_residue_label", {}, {}, [] + ) + if not (0 <= left < count and 0 <= right < count) or left == right: + return TreeChannelAnalysis( + count, False, False, "invalid_residue_edge", {}, {}, [] + ) + edge = tuple(sorted((left, right))) + if edge in seen_edges: + return TreeChannelAnalysis( + count, False, False, "duplicate_residue_edge", {}, {}, [] + ) + seen_edges.add(edge) + adjacency[left].add(right) + adjacency[right].add(left) + + left_is_donor = ( + left_position != "?" + and anomeric[left] is not None + and int(left_position) == anomeric[left] + ) + right_is_donor = ( + right_position != "?" + and anomeric[right] is not None + and int(right_position) == anomeric[right] + ) + if left_is_donor == right_is_donor: + orientation_failure = "bond_donor_not_unique" + continue + child = left if left_is_donor else right + parent = right if left_is_donor else left + if child in child_parent and child_parent[child] != parent: + orientation_failure = "residue_has_multiple_parents" + continue + child_parent[child] = parent + directed_children[parent].append(child) + + if len(seen_edges) != count - 1: + return TreeChannelAnalysis( + count, False, False, "edge_count_not_residue_count_minus_one", {}, {}, [] + ) + distances = _distance_matrix(adjacency, count) + if not distances: + return TreeChannelAnalysis( + count, False, False, "residue_graph_disconnected", {}, {}, [] + ) + if orientation_failure: + return TreeChannelAnalysis( + count, True, False, orientation_failure, {}, {}, distances + ) + + roots = sorted(set(range(count)) - set(child_parent)) + if len(roots) != 1: + return TreeChannelAnalysis( + count, True, False, "root_not_unique", {}, {}, distances + ) + depths = {roots[0]: 0} + queue: deque[int] = deque([roots[0]]) + while queue: + parent = queue.popleft() + for child in sorted(directed_children.get(parent, [])): + if child in depths: + return TreeChannelAnalysis( + count, True, False, "directed_cycle", {}, {}, distances + ) + depths[child] = depths[parent] + 1 + queue.append(child) + if len(depths) != count: + return TreeChannelAnalysis( + count, True, False, "directed_tree_disconnected", {}, {}, distances + ) + if max(depths.values()) >= BRANCH_DEPTH_UNKNOWN: + return TreeChannelAnalysis( + count, True, False, "exact_depth_collides_with_unknown_id", {}, {}, distances + ) + branch_counts = { + parent: len(children) - 1 + for parent, children in directed_children.items() + if len(children) > 1 + } + return TreeChannelAnalysis( + count, True, True, "", depths, branch_counts, distances + ) + + @staticmethod + def exact_linkage_type(linkage: str) -> int: + match = ReviewA5WURCSPreTokenizerV3.A5_LINKAGE_PATTERN.fullmatch(linkage) + if match is None: + return LINKAGE_UNKNOWN + _, left_position, _, right_position = match.groups() + if left_position == "?" or right_position == "?": + return LINKAGE_UNKNOWN + positions = tuple(sorted((int(left_position), int(right_position)))) + mapping = { + (1, 2): LINKAGE_1_2, + (1, 3): LINKAGE_1_3, + (1, 4): LINKAGE_1_4, + (1, 6): LINKAGE_1_6, + (2, 3): LINKAGE_2_3, + (2, 6): LINKAGE_2_6, + (3, 6): LINKAGE_3_6, + } + return mapping.get(positions, LINKAGE_OTHER_EXACT) + + def pre_tokenize(self, wurcs: str) -> list[dict]: + # Reuse only the already-audited semantic WURCS unit extraction. All + # v2 branch markers, depths, linkage classes, and distance matrices are + # discarded and rebuilt below. + inherited = super().pre_tokenize(wurcs) + units = [dict(unit) for unit in inherited if unit.get("text") != "[BRANCH_OPEN]"] + analysis = self.analyze_tree(wurcs) + first_unit_for_residue: set[int] = set() + repaired: list[dict] = [] + for unit in units: + unit.pop("distance_matrix", None) + residue_id = int(unit.get("residue_id", -1)) + unit["linkage_type"] = LINKAGE_NONE + if residue_id >= 0: + depth = ( + analysis.depths[residue_id] + if analysis.exact_rooted_tree + else BRANCH_DEPTH_UNKNOWN + ) + unit["branch_depth"] = depth + if residue_id not in first_unit_for_residue: + for _ in range(analysis.branch_open_counts.get(residue_id, 0)): + repaired.append( + { + "text": "[BRANCH_OPEN]", + "type": "special", + "residue_id": -1, + "branch_depth": depth, + "linkage_type": LINKAGE_NONE, + } + ) + first_unit_for_residue.add(residue_id) + else: + unit["branch_depth"] = 0 + if unit.get("type") == "linkage": + unit["linkage_type"] = self.exact_linkage_type(str(unit["text"])) + repaired.append(unit) + + if repaired: + repaired[0]["distance_matrix"] = analysis.distance_matrix + repaired[0]["tree_channels_valid"] = analysis.exact_rooted_tree + repaired[0]["tree_channel_failure_reason"] = analysis.failure_reason + return repaired + + +class ReviewA5WURCSBPETokenizerV3(A5WURCSBPETokenizer): + """Existing train-only BPE vocabulary with repaired transform channels.""" + + def __init__(self, vocab_path: Optional[str | Path] = None) -> None: + super().__init__(vocab_path) + self.pre_tokenizer = ReviewA5WURCSPreTokenizerV3() + + def tokenize_sequence(self, wurcs: str, max_length: int = 256) -> dict: + encoded = super().tokenize_sequence(wurcs, max_length=max_length) + analysis = self.pre_tokenizer.analyze_tree(wurcs) + encoded["tree_channels_valid"] = analysis.exact_rooted_tree + encoded["tree_channel_failure_reason"] = analysis.failure_reason + return encoded + + +__all__ = [ + "BRANCH_DEPTH_UNKNOWN", + "BRANCH_DEPTH_VOCAB_SIZE", + "LINKAGE_NONE", + "LINKAGE_OTHER_EXACT", + "LINKAGE_UNKNOWN", + "LINKAGE_VOCAB_SIZE", + "ReviewA5WURCSBPETokenizerV3", + "ReviewA5WURCSPreTokenizerV3", + "TreeChannelAnalysis", +] diff --git a/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py b/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py new file mode 100644 index 0000000000000000000000000000000000000000..03a3fe5a3680355dd47dfbda69e58efb565ece06 --- /dev/null +++ b/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py @@ -0,0 +1,180 @@ +"""Residue-level shortest-path targets used by the A5 topology objective.""" + +from __future__ import annotations + +import hashlib +import json +import re +from collections import deque + + +EDGE_RE = re.compile( + r"(?P[A-Za-z]+)(?P[0-9?]+)-(?P[A-Za-z]+)(?P[0-9?]+)" +) +RESDEF_RE = re.compile(r"\[([^\]]*)\]") +WURCS_RES_INDEX_ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + + +def node_label(index: int) -> str: + if index < 1: + raise ValueError("WURCS residue indices are one-based") + letters = WURCS_RES_INDEX_ALPHABET + base = len(letters) + index -= 1 + label = "" + while True: + label = letters[index % base] + label + index = index // base - 1 + if index < 0: + return label + + +def node_index(label: str) -> int: + if not label: + raise ValueError("WURCS residue label cannot be empty") + base = len(WURCS_RES_INDEX_ALPHABET) + value = 0 + for character in label: + try: + digit = WURCS_RES_INDEX_ALPHABET.index(character) + 1 + except ValueError as error: + raise ValueError(f"Invalid WURCS residue label: {label}") from error + value = value * base + digit + return value + + +def split_wurcs_sections(body: str) -> list[str]: + sections: list[str] = [] + current: list[str] = [] + bracket_depth = 0 + for character in body: + if character == "[": + bracket_depth += 1 + elif character == "]" and bracket_depth: + bracket_depth -= 1 + if character == "/" and bracket_depth == 0: + sections.append("".join(current)) + current = [] + else: + current.append(character) + sections.append("".join(current)) + return sections + + +def split_wurcs(wurcs: str) -> tuple[list[str], dict[str, str], str]: + if not wurcs.startswith("WURCS=2.0/"): + return [], {}, "" + parts = split_wurcs_sections(wurcs[len("WURCS=2.0/") :]) + if len(parts) < 4: + return [], {}, "" + residue_definitions = RESDEF_RE.findall(parts[1]) + sequence = parts[2].split("-") if parts[2] else [] + node_to_residue: dict[str, str] = {} + for index, value in enumerate(sequence, start=1): + try: + residue = residue_definitions[int(value) - 1] + except (ValueError, IndexError): + residue = "" + node_to_residue[node_label(index)] = residue + return residue_definitions, node_to_residue, "/".join(parts[3:]) + + +def _hash_fields(*values: object) -> str: + payload = "\x1f".join(str(value) for value in values).encode("utf-8") + return hashlib.sha256(payload).hexdigest() + + +def build_residue_shortest_path(wurcs: str) -> dict[str, object]: + """Build the same immutable residue target frozen by the P0/P1 audit.""" + _, node_to_residue, linkage_section = split_wurcs(wurcs) + node_ids = list(node_to_residue) + if not node_ids or any(not node_to_residue[node] for node in node_ids): + return _failure("missing_or_unmapped_residue_sequence", len(node_ids), 0) + if len(node_ids) < 2: + return _failure( + "fewer_than_two_residues_no_off_diagonal_target", len(node_ids), 0 + ) + + adjacency: dict[str, set[str]] = {node: set() for node in node_ids} + parsed_edges: list[tuple[str, str]] = [] + unparsed_tokens: list[str] = [] + for token in linkage_section.split("_") if linkage_section else []: + match = EDGE_RE.fullmatch(token) + if not match: + if token: + unparsed_tokens.append(token) + continue + left, right = match.group("n1"), match.group("n2") + if left not in adjacency or right not in adjacency or left == right: + unparsed_tokens.append(token) + continue + parsed_edges.append(tuple(sorted((left, right)))) + adjacency[left].add(right) + adjacency[right].add(left) + + reason = "" + if unparsed_tokens: + reason = "one_or_more_edge_tokens_not_unambiguous_residue_pairs" + elif len(set(parsed_edges)) != len(parsed_edges): + reason = "duplicate_residue_edge" + elif len(parsed_edges) != len(node_ids) - 1: + reason = "edge_count_not_residue_count_minus_one" + + seen = {node_ids[0]} + queue = deque([node_ids[0]]) + while queue: + node = queue.popleft() + for neighbor in sorted(adjacency[node]): + if neighbor not in seen: + seen.add(neighbor) + queue.append(neighbor) + if not reason and len(seen) != len(node_ids): + reason = "residue_graph_disconnected" + if reason: + return _failure(reason, len(node_ids), len(parsed_edges)) + + matrix: list[list[int]] = [] + for source in node_ids: + distance = {source: 0} + queue = deque([source]) + while queue: + node = queue.popleft() + for neighbor in sorted(adjacency[node]): + if neighbor not in distance: + distance[neighbor] = distance[node] + 1 + queue.append(neighbor) + matrix.append([distance[target] for target in node_ids]) + + matrix_payload = json.dumps(matrix, separators=(",", ":")) + matrix_sha256 = hashlib.sha256(matrix_payload.encode("utf-8")).hexdigest() + return { + "target_valid": True, + "failure_reason": "", + "residue_count": len(node_ids), + "parsed_edge_count": len(parsed_edges), + "valid_unordered_pair_count": len(node_ids) * (len(node_ids) - 1) // 2, + "matrix": matrix, + "matrix_sha256": matrix_sha256, + "target_identity_sha256": _hash_fields( + "residue_shortest_path_v2", + wurcs, + matrix_sha256, + len(node_ids), + len(parsed_edges), + ), + "schema": "residue_shortest_path_v2", + } + + +def _failure(reason: str, residues: int, edges: int) -> dict[str, object]: + return { + "target_valid": False, + "failure_reason": reason, + "residue_count": residues, + "parsed_edge_count": edges, + "valid_unordered_pair_count": 0, + "matrix": [], + "matrix_sha256": "", + "target_identity_sha256": "", + "schema": "residue_shortest_path_v2", + } diff --git a/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py b/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py new file mode 100644 index 0000000000000000000000000000000000000000..4ca91c571f8a538e026b1c086a14d81a0e3d59db --- /dev/null +++ b/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py @@ -0,0 +1,368 @@ +"""Deterministic train-only WURCS BPE utilities for A5.""" + +from __future__ import annotations + +import re +from collections import Counter, defaultdict +from pathlib import Path +from typing import Iterable, Optional + +from .a5_topology import node_index, node_label + +try: + from bert_training_v4.downstream_tasks.utils.wurcs_bpe_tokenizer import ( + WURCSBPETokenizer, + WURCSPreTokenizer, + ) +except ImportError: + from ..bert_training_v4.downstream_tasks.utils.wurcs_bpe_tokenizer import ( + WURCSBPETokenizer, + WURCSPreTokenizer, + ) + + +SUBMITTED_FIT_ALPHABET = tuple( + "#$%()*-./0123456789<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ^abcdefghijklmnopqrstuvwxyz{|}~" +) + + +class _TopLevelBracketPattern: + """Expose regex-like findall while respecting nested SMILES brackets.""" + + @staticmethod + def findall(text: str) -> list[str]: + residues: list[str] = [] + depth = 0 + start = -1 + for index, character in enumerate(text): + if character == "[": + if depth == 0: + start = index + 1 + depth += 1 + elif character == "]" and depth: + depth -= 1 + if depth == 0 and start >= 0: + residues.append(text[start:index]) + start = -1 + if depth: + return [] + return residues + + +class A5WURCSPreTokenizer(WURCSPreTokenizer): + """Submitted pre-tokenizer with nested bracket-safe residue extraction.""" + + A5_LINKAGE_PATTERN = re.compile( + r"([A-Za-z]+)(\d+|\?)-([A-Za-z]+)(\d+|\?)" + ) + A5_ANOMERIC_PATTERN = re.compile(r"-([0-9]+)([abuxo])(?:_|$)") + + def __init__(self) -> None: + super().__init__() + self.RESIDUE_PATTERN = _TopLevelBracketPattern() + + def _split_wurcs_sections(self, wurcs: str) -> list[str]: + sections = super()._split_wurcs_sections(wurcs) + if len(sections) <= 5: + return sections + # WURCS LIN modifications may contain unbracketed slashes. The format + # has exactly five top-level sections, so every trailing fragment + # belongs to the linkage section rather than a new section. + return sections[:4] + ["/".join(sections[4:])] + + def _instance_anomeric_positions( + self, residue_definitions: list[str], index_list: list[str] + ) -> list[int | None]: + positions: list[int | None] = [] + for definition_index in index_list: + try: + residue_definition = residue_definitions[int(definition_index) - 1] + except (IndexError, ValueError): + positions.append(None) + continue + match = self.A5_ANOMERIC_PATTERN.search(residue_definition) + positions.append(int(match.group(1)) if match is not None else None) + return positions + + def _analyze_a5_tree( + self, + linkages: list[str], + residue_count: int, + anomeric_positions: list[int | None] | None = None, + ) -> tuple[dict[str, int], dict[str, int], dict[int, list[int]]]: + branch_points: dict[str, int] = defaultdict(int) + children: dict[str, list[str]] = defaultdict(list) + all_residues: set[str] = set() + adjacency: dict[int, list[int]] = defaultdict(list) + for linkage in linkages: + match = self.A5_LINKAGE_PATTERN.match(linkage) + if not match: + continue + left, left_position, right, right_position = match.groups() + try: + left_index = node_index(left) - 1 + right_index = node_index(right) - 1 + except ValueError: + continue + if not ( + 0 <= left_index < residue_count + and 0 <= right_index < residue_count + and left_index != right_index + ): + continue + parent, child = left, right + if anomeric_positions is not None: + left_anomeric = anomeric_positions[left_index] + right_anomeric = anomeric_positions[right_index] + left_is_donor = ( + left_position != "?" + and left_anomeric is not None + and int(left_position) == left_anomeric + ) + right_is_donor = ( + right_position != "?" + and right_anomeric is not None + and int(right_position) == right_anomeric + ) + if left_is_donor and not right_is_donor: + parent, child = right, left + elif right_is_donor and not left_is_donor: + parent, child = left, right + children[parent].append(child) + all_residues.update((parent, child)) + adjacency[left_index].append(right_index) + adjacency[right_index].append(left_index) + + for residue, child_labels in children.items(): + if len(child_labels) > 1: + branch_points[residue] = len(child_labels) - 1 + child_set = {child for values in children.values() for child in values} + roots = all_residues - child_set + root = min(roots, key=node_index) if roots else node_label(1) + depths = {root: 0} + queue = [root] + while queue: + current = queue.pop(0) + for child in children.get(current, []): + if child not in depths: + depths[child] = depths[current] + 1 + queue.append(child) + return dict(branch_points), depths, adjacency + + def _a5_linkage_type(self, linkage: str) -> int: + match = self.A5_LINKAGE_PATTERN.match(linkage) + if not match: + return 8 + _, from_position, _, to_position = match.groups() + try: + positions = (int(from_position), int(to_position)) + except ValueError: + return 8 + linkage_types = { + (1, 2): 0, + (2, 1): 0, + (1, 3): 1, + (3, 1): 1, + (1, 4): 2, + (4, 1): 2, + (1, 6): 3, + (6, 1): 3, + (2, 3): 4, + (3, 2): 4, + (2, 6): 5, + (6, 2): 5, + (3, 6): 6, + (6, 3): 6, + } + return linkage_types.get(positions, 7) + + def pre_tokenize(self, wurcs: str) -> list[dict]: + # Reuse the submitted semantic split, then correct only its tree + # annotations. This keeps the BPE unit text and special-token behavior. + inherited_units = super().pre_tokenize(wurcs) + try: + parts = self._split_wurcs_sections(wurcs) + index_list = parts[3].split("-") if len(parts) > 3 and parts[3] else [] + linkages = parts[4].split("_") if len(parts) > 4 and parts[4] else [] + residue_definitions = self.RESIDUE_PATTERN.findall(parts[2]) + anomeric_positions = self._instance_anomeric_positions( + residue_definitions, index_list + ) + branch_points, depths, adjacency = self._analyze_a5_tree( + linkages, len(index_list), anomeric_positions + ) + except (IndexError, ValueError): + return inherited_units + + units: list[dict] = [] + opened_residues: set[int] = set() + for inherited in inherited_units: + if inherited.get("text") == "[BRANCH_OPEN]": + continue + unit = dict(inherited) + residue_id = int(unit.get("residue_id", -1)) + if residue_id >= 0: + label = node_label(residue_id + 1) + if residue_id not in opened_residues: + for _ in range(branch_points.get(label, 0)): + units.append( + { + "text": "[BRANCH_OPEN]", + "type": "special", + "residue_id": -1, + "branch_depth": depths.get(label, 0), + "linkage_type": 0, + } + ) + opened_residues.add(residue_id) + unit["branch_depth"] = depths.get(label, 0) + elif unit.get("type") == "linkage": + unit["linkage_type"] = self._a5_linkage_type(str(unit["text"])) + units.append(unit) + + if units: + units[0]["distance_matrix"] = self._compute_distance_matrix( + adjacency, len(index_list) + ) + return units + + +class A5WURCSBPETokenizer(WURCSBPETokenizer): + """Train-only BPE with a fit-derived alphabet and deterministic merge ties.""" + + def __init__(self, vocab_path: Optional[str | Path] = None) -> None: + super().__init__(str(vocab_path) if vocab_path is not None else None) + self.pre_tokenizer = A5WURCSPreTokenizer() + + @classmethod + def train_from_fit_corpus( + cls, + wurcs_strings: Iterable[str], + num_merges: int = 2000, + output_path: Optional[str | Path] = None, + min_frequency: int = 2, + max_token_length: Optional[int] = None, + ) -> "A5WURCSBPETokenizer": + tokenizer = cls() + pre_tokenizer = tokenizer.pre_tokenizer + unit_counts: Counter[str] = Counter() + for wurcs in wurcs_strings: + for unit in pre_tokenizer.pre_tokenize(wurcs): + if unit["type"] != "special": + unit_counts[unit["text"]] += 1 + + # The submitted tokenizer learned the base character inventory from its + # corpus. Preserve that behavior, but fit it from training parents only. + tokenizer.fit_alphabet = tuple( + sorted({char for unit in unit_counts for char in unit}) + ) + + next_id = len(tokenizer.special_tokens) + for char in tokenizer.fit_alphabet: + tokenizer.token_to_id[char] = next_id + tokenizer.id_to_token[next_id] = char + next_id += 1 + + word_freqs: dict[tuple[str, ...], int] = { + tuple(unit): count + for unit, count in sorted(unit_counts.items()) + if count >= min_frequency + } + merges: list[tuple[str, str]] = [] + for _ in range(num_merges): + pair_counts: Counter[tuple[str, str]] = Counter() + for word, frequency in word_freqs.items(): + for index in range(len(word) - 1): + pair_counts[(word[index], word[index + 1])] += frequency + candidates = [ + (pair, count) + for pair, count in pair_counts.items() + if count >= min_frequency + and ( + max_token_length is None + or len(pair[0]) + len(pair[1]) <= max_token_length + ) + ] + if not candidates: + break + best_pair, _ = min( + candidates, + key=lambda item: (-item[1], item[0][0], item[0][1]), + ) + new_token = best_pair[0] + best_pair[1] + merges.append(best_pair) + tokenizer.token_to_id[new_token] = next_id + tokenizer.id_to_token[next_id] = new_token + next_id += 1 + + merged_freqs: Counter[tuple[str, ...]] = Counter() + for word, frequency in word_freqs.items(): + merged_word: list[str] = [] + index = 0 + while index < len(word): + if ( + index < len(word) - 1 + and word[index] == best_pair[0] + and word[index + 1] == best_pair[1] + ): + merged_word.append(new_token) + index += 2 + else: + merged_word.append(word[index]) + index += 1 + merged_freqs[tuple(merged_word)] += frequency + word_freqs = dict(merged_freqs) + + tokenizer.merges = merges + if output_path is not None: + tokenizer.save_vocab(str(output_path)) + return tokenizer + + def tokenize_sequence(self, wurcs: str, max_length: int = 256) -> dict: + units = self.pre_tokenizer.pre_tokenize(wurcs) + tokens: list[str] = [] + token_ids: list[int] = [] + residue_ids: list[int] = [] + branch_depths: list[int] = [] + linkage_types: list[int] = [] + + for unit in units: + unit_tokens = ( + [unit["text"]] + if unit["type"] == "special" + else self.apply_bpe(unit["text"]) + ) + for token in unit_tokens: + tokens.append(token) + token_ids.append( + self.token_to_id.get(token, self.token_to_id["[UNK]"]) + ) + residue_ids.append(int(unit["residue_id"])) + branch_depths.append(int(unit["branch_depth"])) + linkage_types.append(int(unit["linkage_type"])) + + if len(tokens) > max_length: + tokens = tokens[: max_length - 1] + ["[END]"] + token_ids = token_ids[: max_length - 1] + [self.token_to_id["[END]"]] + residue_ids = residue_ids[: max_length - 1] + [-1] + branch_depths = branch_depths[: max_length - 1] + [0] + linkage_types = linkage_types[: max_length - 1] + [0] + + length = len(tokens) + attention_mask = [1] * length + padding = max_length - length + tokens.extend(["[PAD]"] * padding) + token_ids.extend([self.token_to_id["[PAD]"]] * padding) + residue_ids.extend([-1] * padding) + branch_depths.extend([0] * padding) + linkage_types.extend([0] * padding) + attention_mask.extend([0] * padding) + return { + "tokens": tokens, + "token_ids": token_ids, + "residue_ids": residue_ids, + "branch_depths": branch_depths, + "linkage_types": linkage_types, + "attention_mask": attention_mask, + "length": length, + } diff --git a/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_receipt.json b/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_receipt.json new file mode 100644 index 0000000000000000000000000000000000000000..d684ce8c6134d162ae818818717f530fb4759c97 --- /dev/null +++ b/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_receipt.json @@ -0,0 +1,149 @@ +{ + "checkpoint_resume_authorized": false, + "downstream_evaluation_authorized": false, + "gpu_launch_authorized": false, + "nova_submission_authorized": false, + "official_submitted_or_predecessor_artifacts_modified": false, + "payloads": { + "review_attention_mask.npy": { + "bytes": 71989376, + "name": "review_attention_mask.npy", + "sha256": "01ed165720b9414e614dd7e7d75284a8886165f11138e16117ffcbe4e4bbf95c" + }, + "review_bpe_ambiguity_tokens.json": { + "bytes": 19693, + "name": "review_bpe_ambiguity_tokens.json", + "sha256": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b" + }, + "review_bpe_fit_contributors.tsv.gz": { + "bytes": 9934117, + "name": "review_bpe_fit_contributors.tsv.gz", + "sha256": "4ec8dfaeacef355092313507ab71c628f48ddf1a4fe39e7663748060a07af297" + }, + "review_bpe_vocabulary.json": { + "bytes": 138150, + "name": "review_bpe_vocabulary.json", + "sha256": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b" + }, + "review_branch_depths.npy": { + "bytes": 71989376, + "name": "review_branch_depths.npy", + "sha256": "f39f76aa56a9bb782b2349f3ad1ca4ad16351ee1f06a8b9ae4b06bff9b1ebece" + }, + "review_build_official_sequence_topology_successor.py": { + "bytes": 16295, + "name": "review_build_official_sequence_topology_successor.py", + "sha256": "2e84b03ab2189f009654e97c427930cc511c50d079db06f425035fcfb2ae1efb" + }, + "review_frozen_sequence_tree_runtime.py": { + "bytes": 11405, + "name": "review_frozen_sequence_tree_runtime.py", + "sha256": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04" + }, + "review_frozen_training_a5_topology.py": { + "bytes": 6186, + "name": "review_frozen_training_a5_topology.py", + "sha256": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7" + }, + "review_frozen_training_a5_wurcs_bpe.py": { + "bytes": 14161, + "name": "review_frozen_training_a5_wurcs_bpe.py", + "sha256": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4" + }, + "review_full_untruncated_lengths.npy": { + "bytes": 562544, + "name": "review_full_untruncated_lengths.npy", + "sha256": "6d83b42630bd8c5d355378b423b3a0021938741b5faa711ecc129a6789e307c2" + }, + "review_lengths.npy": { + "bytes": 562544, + "name": "review_lengths.npy", + "sha256": "ade919d1e054c0ba852aa047bf873ac675f81a6c1f8a05cc73a0a2258131f021" + }, + "review_linkage_types.npy": { + "bytes": 71989376, + "name": "review_linkage_types.npy", + "sha256": "89edb1940765928ced6f54e0d394f95c573eb9d96310b14dbd0adf8e20ac07c4" + }, + "review_owner_clean_build_report.json": { + "bytes": 3169, + "name": "review_owner_clean_build_report.json", + "sha256": "2c24a655f009c6994756d8199b26c3e6489222c4b26d90efd0c43aacc17b9e4c" + }, + "review_residue_ids.npy": { + "bytes": 143978624, + "name": "review_residue_ids.npy", + "sha256": "36c96dcd3e03ba30e02e16f98d17605742627a37b37cd7824f2a745dd09dc044" + }, + "review_sequence_objective_eligible.npy": { + "bytes": 281336, + "name": "review_sequence_objective_eligible.npy", + "sha256": "62502d0d1b44a10989350a78f1e033d271fe8417715e10d42eb47c6720ceb3bf" + }, + "review_sequence_package_summary.json": { + "bytes": 7777, + "name": "review_sequence_package_summary.json", + "sha256": "93ed219d807d4a7735be96bf7cf6a59a0bd407619925ee194aed6d473048cdf0" + }, + "review_sequence_parent_index.tsv.gz": { + "bytes": 14697953, + "name": "review_sequence_parent_index.tsv.gz", + "sha256": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0" + }, + "review_token_categories.npy": { + "bytes": 71989376, + "name": "review_token_categories.npy", + "sha256": "2d51df879382deb4927a446937983fea5a07fbbc783181f7903546222b856205" + }, + "review_token_ids.npy": { + "bytes": 143978624, + "name": "review_token_ids.npy", + "sha256": "ec2d52dced65d22f0f218ff617d351fbd2930661bc8681e939990149d493537d" + }, + "review_topology_lengths.npy": { + "bytes": 93175, + "name": "review_topology_lengths.npy", + "sha256": "b52f6ddcf327b8cfc5159659bada97357216f9526b42c230a35192932f43d2f3" + }, + "review_topology_offsets.npy": { + "bytes": 744512, + "name": "review_topology_offsets.npy", + "sha256": "e06d61b8e47c2a2a3e0c8aeec7e015e673f64f0f483a483abe40ccda2d08b9e0" + }, + "review_topology_roster.tsv": { + "bytes": 3890681, + "name": "review_topology_roster.tsv", + "sha256": "a216ce485ea699fb1b66ed6915175a49cde8c7d14279dbaf835f4675bc7c7fa1" + }, + "review_topology_row.npy": { + "bytes": 1124960, + "name": "review_topology_row.npy", + "sha256": "a0ae28b0476322e3dbeda42a891f4a42c0973002a5d8507bf387b12dcbff4e95" + }, + "review_topology_values.npy": { + "bytes": 5027730, + "name": "review_topology_values.npy", + "sha256": "2d4ba8395f78864b7eed9ed250bb9fd50bd45ef84a10ed497ffb89c684276e4e" + }, + "review_tree_channels_valid.npy": { + "bytes": 281336, + "name": "review_tree_channels_valid.npy", + "sha256": "d15b160afe92a91a4a3d1b85b4a0353672b217b1d5c54513f3c80eab29c6b7c5" + } + }, + "publication": { + "atomic_rename": true, + "no_overwrite": true, + "nofollow_inputs": true, + "pre_post_source_hash_stable": true + }, + "schema": "bertose_a5_official_array_sequence_topology_successor_receipt_v1", + "scientific_launch_authorized": false, + "status": "PASS_RECEIPT_LAST", + "summary": { + "bytes": 7777, + "name": "review_sequence_package_summary.json", + "sha256": "93ed219d807d4a7735be96bf7cf6a59a0bd407619925ee194aed6d473048cdf0" + }, + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_summary.json b/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_summary.json new file mode 100644 index 0000000000000000000000000000000000000000..6917e8834d7b75b2d6ef43188b1ef90be4317f05 --- /dev/null +++ b/releases/2026-10-02/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_summary.json @@ -0,0 +1,186 @@ +{ + "bpe": { + "fit_contributor_sha256": "4ec8dfaeacef355092313507ab71c628f48ddf1a4fe39e7663748060a07af297", + "fit_parent_count": 221899, + "fit_roles": [ + "pretraining_train" + ], + "vocabulary_sha256": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b", + "vocabulary_size": 2114 + }, + "checkpoint_resume_authorized": false, + "downstream_evaluation_authorized": false, + "gate_audit": { + "canonical_wurcs_mismatch": 0, + "duplicate_ids": 0, + "gate_rows": 285050, + "legitimate_extra_gate_ids": 3842, + "missing_sequence_parents": 0, + "sequence_parents": 281208 + }, + "gpu_launch_authorized": false, + "nova_submission_authorized": false, + "official_submitted_or_predecessor_artifacts_modified": false, + "output_payloads": { + "review_attention_mask.npy": { + "bytes": 71989376, + "name": "review_attention_mask.npy", + "sha256": "01ed165720b9414e614dd7e7d75284a8886165f11138e16117ffcbe4e4bbf95c" + }, + "review_bpe_ambiguity_tokens.json": { + "bytes": 19693, + "name": "review_bpe_ambiguity_tokens.json", + "sha256": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b" + }, + "review_bpe_fit_contributors.tsv.gz": { + "bytes": 9934117, + "name": "review_bpe_fit_contributors.tsv.gz", + "sha256": "4ec8dfaeacef355092313507ab71c628f48ddf1a4fe39e7663748060a07af297" + }, + "review_bpe_vocabulary.json": { + "bytes": 138150, + "name": "review_bpe_vocabulary.json", + "sha256": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b" + }, + "review_branch_depths.npy": { + "bytes": 71989376, + "name": "review_branch_depths.npy", + "sha256": "f39f76aa56a9bb782b2349f3ad1ca4ad16351ee1f06a8b9ae4b06bff9b1ebece" + }, + "review_build_official_sequence_topology_successor.py": { + "bytes": 16295, + "name": "review_build_official_sequence_topology_successor.py", + "sha256": "2e84b03ab2189f009654e97c427930cc511c50d079db06f425035fcfb2ae1efb" + }, + "review_frozen_sequence_tree_runtime.py": { + "bytes": 11405, + "name": "review_frozen_sequence_tree_runtime.py", + "sha256": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04" + }, + "review_frozen_training_a5_topology.py": { + "bytes": 6186, + "name": "review_frozen_training_a5_topology.py", + "sha256": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7" + }, + "review_frozen_training_a5_wurcs_bpe.py": { + "bytes": 14161, + "name": "review_frozen_training_a5_wurcs_bpe.py", + "sha256": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4" + }, + "review_full_untruncated_lengths.npy": { + "bytes": 562544, + "name": "review_full_untruncated_lengths.npy", + "sha256": "6d83b42630bd8c5d355378b423b3a0021938741b5faa711ecc129a6789e307c2" + }, + "review_lengths.npy": { + "bytes": 562544, + "name": "review_lengths.npy", + "sha256": "ade919d1e054c0ba852aa047bf873ac675f81a6c1f8a05cc73a0a2258131f021" + }, + "review_linkage_types.npy": { + "bytes": 71989376, + "name": "review_linkage_types.npy", + "sha256": "89edb1940765928ced6f54e0d394f95c573eb9d96310b14dbd0adf8e20ac07c4" + }, + "review_owner_clean_build_report.json": { + "bytes": 3169, + "name": "review_owner_clean_build_report.json", + "sha256": "2c24a655f009c6994756d8199b26c3e6489222c4b26d90efd0c43aacc17b9e4c" + }, + "review_residue_ids.npy": { + "bytes": 143978624, + "name": "review_residue_ids.npy", + "sha256": "36c96dcd3e03ba30e02e16f98d17605742627a37b37cd7824f2a745dd09dc044" + }, + "review_sequence_objective_eligible.npy": { + "bytes": 281336, + "name": "review_sequence_objective_eligible.npy", + "sha256": "62502d0d1b44a10989350a78f1e033d271fe8417715e10d42eb47c6720ceb3bf" + }, + "review_sequence_parent_index.tsv.gz": { + "bytes": 14697953, + "name": "review_sequence_parent_index.tsv.gz", + "sha256": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0" + }, + "review_token_categories.npy": { + "bytes": 71989376, + "name": "review_token_categories.npy", + "sha256": "2d51df879382deb4927a446937983fea5a07fbbc783181f7903546222b856205" + }, + "review_token_ids.npy": { + "bytes": 143978624, + "name": "review_token_ids.npy", + "sha256": "ec2d52dced65d22f0f218ff617d351fbd2930661bc8681e939990149d493537d" + }, + "review_topology_lengths.npy": { + "bytes": 93175, + "name": "review_topology_lengths.npy", + "sha256": "b52f6ddcf327b8cfc5159659bada97357216f9526b42c230a35192932f43d2f3" + }, + "review_topology_offsets.npy": { + "bytes": 744512, + "name": "review_topology_offsets.npy", + "sha256": "e06d61b8e47c2a2a3e0c8aeec7e015e673f64f0f483a483abe40ccda2d08b9e0" + }, + "review_topology_roster.tsv": { + "bytes": 3890681, + "name": "review_topology_roster.tsv", + "sha256": "a216ce485ea699fb1b66ed6915175a49cde8c7d14279dbaf835f4675bc7c7fa1" + }, + "review_topology_row.npy": { + "bytes": 1124960, + "name": "review_topology_row.npy", + "sha256": "a0ae28b0476322e3dbeda42a891f4a42c0973002a5d8507bf387b12dcbff4e95" + }, + "review_topology_values.npy": { + "bytes": 5027730, + "name": "review_topology_values.npy", + "sha256": "2d4ba8395f78864b7eed9ed250bb9fd50bd45ef84a10ed497ffb89c684276e4e" + }, + "review_tree_channels_valid.npy": { + "bytes": 281336, + "name": "review_tree_channels_valid.npy", + "sha256": "d15b160afe92a91a4a3d1b85b4a0353672b217b1d5c54513f3c80eab29c6b7c5" + } + }, + "parent_count": 281208, + "rooted_valid_count": 157652, + "schema": "bertose_a5_official_array_sequence_topology_successor_v1", + "scientific_launch_authorized": false, + "sequence_objective_roles": { + "pretraining_development": 55440, + "pretraining_train": 221827 + }, + "source_bindings": { + "ambiguity": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b", + "builder": "2e84b03ab2189f009654e97c427930cc511c50d079db06f425035fcfb2ae1efb", + "fit": "4ec8dfaeacef355092313507ab71c628f48ddf1a4fe39e7663748060a07af297", + "gate": "5fb976a4b3440eb60b52bce9e1932d197f90bf3e074c6e8438bfe92b93c0c7da", + "helper": "a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6", + "index": "3b9e9f6b4671448cea70a3c16717dc6538c01c59ebfce478ce274e133e563ac3", + "input_all": "27da2fa1513e77e7f1ced2b5461299d9a997138a643db99f5b2de704bec7a746", + "molwurcs": "bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf", + "owner_report": "2c24a655f009c6994756d8199b26c3e6489222c4b26d90efd0c43aacc17b9e4c", + "partition": "86a8c6742156683d502c93fc71b31b9a93450037d647e5a90db437a015bb3bbc", + "pretokenizer": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4", + "raw": "d69583e2499f775ded3f18baaee843de4dd7c424e2ce5780ad89acab517d85fc", + "topology_source": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7", + "tree_runtime": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04", + "vocabulary": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b", + "wurcsframework": "5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37" + }, + "status": "PASS_PREPARATION_ONLY_OWNER_CLEAN_BUILD_BYTE_MATCHED", + "topology_roles_including_excluded_audit": { + "excluded_exact_or_verified_graph_identity": 3483, + "pretraining_development": 17650, + "pretraining_train": 71914 + }, + "topology_storage": { + "legacy_dense_width26_rejected": true, + "max_residue_count": 48, + "row_count": 93047, + "schema": "ragged_original_residue_axis_bfs_int8_offsets_uint64", + "value_count": 5027602 + }, + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/model/glycan_bert.py b/releases/2026-10-02/bertose_source/model/glycan_bert.py new file mode 100644 index 0000000000000000000000000000000000000000..bc2ca3ff916d1016b30e82c22dea19762f613f44 --- /dev/null +++ b/releases/2026-10-02/bertose_source/model/glycan_bert.py @@ -0,0 +1,303 @@ +""" +Glycan BERT Model + +Transformer-based masked language model for glycan structures. +Based on BERT/ESM2 architecture adapted for atomic glycan tokenization. +""" + +import torch +import torch.nn as nn +import math + + +class GlycanBERTConfig: + """Configuration for GlycanBERT.""" + + def __init__( + self, + vocab_size: int = 102, + hidden_size: int = 384, + num_hidden_layers: int = 6, + num_attention_heads: int = 6, + intermediate_size: int = 1536, + hidden_dropout_prob: float = 0.1, + attention_probs_dropout_prob: float = 0.1, + max_position_embeddings: int = 512, + layer_norm_eps: float = 1e-12, + pad_token_id: int = 0, + mask_token_id: int = 4, + initializer_range: float = 0.02 + ): + self.vocab_size = vocab_size + self.hidden_size = hidden_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + self.intermediate_size = intermediate_size + self.hidden_dropout_prob = hidden_dropout_prob + self.attention_probs_dropout_prob = attention_probs_dropout_prob + self.max_position_embeddings = max_position_embeddings + self.layer_norm_eps = layer_norm_eps + self.pad_token_id = pad_token_id + self.mask_token_id = mask_token_id + self.initializer_range = initializer_range + + +class GlycanBERTEmbeddings(nn.Module): + """ + Embeddings for glycan tokens including token and positional embeddings. + """ + + def __init__(self, config: GlycanBERTConfig): + super().__init__() + self.token_embeddings = nn.Embedding(config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id) + self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size) + + self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) + self.dropout = nn.Dropout(config.hidden_dropout_prob) + + # position_ids (1, max_seq_len) is contiguous in memory and exported when serialized + self.register_buffer("position_ids", torch.arange(config.max_position_embeddings).expand((1, -1))) + + def forward(self, input_ids: torch.Tensor) -> torch.Tensor: + """ + Args: + input_ids: Tensor of shape (batch_size, seq_len) + + Returns: + Embeddings of shape (batch_size, seq_len, hidden_size) + """ + batch_size, seq_len = input_ids.shape + + # Token embeddings + token_embeds = self.token_embeddings(input_ids) + + # Position embeddings + position_ids = self.position_ids[:, :seq_len] + position_embeds = self.position_embeddings(position_ids) + + # Combine + embeddings = token_embeds + position_embeds + embeddings = self.LayerNorm(embeddings) + embeddings = self.dropout(embeddings) + + return embeddings + + +class GlycanBERTAttention(nn.Module): + """Multi-head self-attention.""" + + def __init__(self, config: GlycanBERTConfig): + super().__init__() + assert config.hidden_size % config.num_attention_heads == 0 + + self.num_attention_heads = config.num_attention_heads + self.attention_head_size = config.hidden_size // config.num_attention_heads + self.all_head_size = self.num_attention_heads * self.attention_head_size + + self.query = nn.Linear(config.hidden_size, self.all_head_size) + self.key = nn.Linear(config.hidden_size, self.all_head_size) + self.value = nn.Linear(config.hidden_size, self.all_head_size) + + self.dropout = nn.Dropout(config.attention_probs_dropout_prob) + + def transpose_for_scores(self, x: torch.Tensor) -> torch.Tensor: + """Reshape for multi-head attention.""" + new_shape = x.size()[:-1] + (self.num_attention_heads, self.attention_head_size) + x = x.view(*new_shape) + return x.permute(0, 2, 1, 3) # (batch, heads, seq_len, head_size) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: torch.Tensor = None + ) -> torch.Tensor: + """ + Args: + hidden_states: (batch_size, seq_len, hidden_size) + attention_mask: (batch_size, seq_len) - 1 for valid, 0 for padding + + Returns: + Attention output: (batch_size, seq_len, hidden_size) + """ + batch_size, seq_len, _ = hidden_states.shape + + # Linear projections + query_layer = self.transpose_for_scores(self.query(hidden_states)) + key_layer = self.transpose_for_scores(self.key(hidden_states)) + value_layer = self.transpose_for_scores(self.value(hidden_states)) + + # Attention scores + attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) + attention_scores = attention_scores / math.sqrt(self.attention_head_size) + + # Apply attention mask + if attention_mask is not None: + # Convert mask to additive mask + attention_mask = attention_mask.unsqueeze(1).unsqueeze(2) # (batch, 1, 1, seq_len) + attention_mask = (1.0 - attention_mask) * -10000.0 + attention_scores = attention_scores + attention_mask + + # Attention probabilities + attention_probs = nn.functional.softmax(attention_scores, dim=-1) + attention_probs = self.dropout(attention_probs) + + # Apply attention to values + context_layer = torch.matmul(attention_probs, value_layer) + + # Reshape back + context_layer = context_layer.permute(0, 2, 1, 3).contiguous() + new_shape = context_layer.size()[:-2] + (self.all_head_size,) + context_layer = context_layer.view(*new_shape) + + return context_layer + + +class GlycanBERTLayer(nn.Module): + """Single transformer layer.""" + + def __init__(self, config: GlycanBERTConfig): + super().__init__() + self.attention = GlycanBERTAttention(config) + self.attention_output = nn.Linear(config.hidden_size, config.hidden_size) + self.attention_layer_norm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) + + self.intermediate = nn.Linear(config.hidden_size, config.intermediate_size) + self.output = nn.Linear(config.intermediate_size, config.hidden_size) + self.output_layer_norm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) + + self.dropout = nn.Dropout(config.hidden_dropout_prob) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: torch.Tensor = None + ) -> torch.Tensor: + """ + Args: + hidden_states: (batch_size, seq_len, hidden_size) + attention_mask: (batch_size, seq_len) + + Returns: + Output: (batch_size, seq_len, hidden_size) + """ + # Self-attention + attention_output = self.attention(hidden_states, attention_mask) + attention_output = self.attention_output(attention_output) + attention_output = self.dropout(attention_output) + + # Add & Norm + hidden_states = self.attention_layer_norm(hidden_states + attention_output) + + # Feed-forward + intermediate_output = self.intermediate(hidden_states) + intermediate_output = nn.functional.gelu(intermediate_output) + + layer_output = self.output(intermediate_output) + layer_output = self.dropout(layer_output) + + # Add & Norm + layer_output = self.output_layer_norm(hidden_states + layer_output) + + return layer_output + + +class GlycanBERT(nn.Module): + """ + Glycan BERT model for masked language modeling. + """ + + def __init__(self, config: GlycanBERTConfig): + super().__init__() + self.config = config + + # Embeddings + self.embeddings = GlycanBERTEmbeddings(config) + + # Transformer layers + self.layers = nn.ModuleList([GlycanBERTLayer(config) for _ in range(config.num_hidden_layers)]) + + # MLM head + self.mlm_head = nn.Linear(config.hidden_size, config.vocab_size) + + # Initialize weights + self.apply(self._init_weights) + + def _init_weights(self, module): + """Initialize weights.""" + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + elif isinstance(module, nn.LayerNorm): + module.bias.data.zero_() + module.weight.data.fill_(1.0) + + def forward( + self, + input_ids: torch.Tensor, + attention_mask: torch.Tensor = None, + labels: torch.Tensor = None + ): + """ + Args: + input_ids: (batch_size, seq_len) + attention_mask: (batch_size, seq_len) - 1 for valid, 0 for padding + labels: (batch_size, seq_len) - token IDs to predict, -100 for positions to ignore + + Returns: + If labels provided: (loss, logits) + Else: logits + """ + # Create attention mask if not provided + if attention_mask is None: + attention_mask = (input_ids != self.config.pad_token_id).float() + + # Embeddings + hidden_states = self.embeddings(input_ids) + + # Transformer layers + for layer in self.layers: + hidden_states = layer(hidden_states, attention_mask) + + # MLM prediction + logits = self.mlm_head(hidden_states) + + # Calculate loss if labels provided + loss = None + if labels is not None: + loss_fct = nn.CrossEntropyLoss() # -100 is ignored + loss = loss_fct(logits.view(-1, self.config.vocab_size), labels.view(-1)) + + if loss is not None: + return loss, logits + return logits + + def get_embeddings( + self, + input_ids: torch.Tensor, + attention_mask: torch.Tensor = None + ) -> torch.Tensor: + """ + Get contextualized embeddings (for downstream tasks). + + Args: + input_ids: (batch_size, seq_len) + attention_mask: (batch_size, seq_len) + + Returns: + Embeddings: (batch_size, seq_len, hidden_size) + """ + if attention_mask is None: + attention_mask = (input_ids != self.config.pad_token_id).float() + + hidden_states = self.embeddings(input_ids) + + for layer in self.layers: + hidden_states = layer(hidden_states, attention_mask) + + return hidden_states + diff --git a/releases/2026-10-02/bertose_source/model/multimodal_glycan_bert_v3.py b/releases/2026-10-02/bertose_source/model/multimodal_glycan_bert_v3.py new file mode 100644 index 0000000000000000000000000000000000000000..dc52d2c5d8b48df2251bc9001c59b0d694482364 --- /dev/null +++ b/releases/2026-10-02/bertose_source/model/multimodal_glycan_bert_v3.py @@ -0,0 +1,1084 @@ +""" +Multimodal Glycan BERT Model v3 + +Extends GlycanBERT to handle three modalities: +- Sequence (WURCS atomic tokenization) +- MS (mass spectrometry peaks, RT, intensity) +- 3D structure (VQ-VAE discrete tokens, 4 per residue) + +Each modality has its own encoder, with cross-attention for sequence-structure alignment. +""" + +import torch +import torch.nn as nn +from typing import Dict, Optional, Tuple +import math + +try: + from .glycan_bert import GlycanBERTConfig, GlycanBERTEmbeddings, GlycanBERTLayer +except ImportError: + from glycan_bert import GlycanBERTConfig, GlycanBERTEmbeddings, GlycanBERTLayer + + +class ConvGlycanBERTEmbeddings(nn.Module): + """ + Improved Convolutional front-end that mixes local WURCS context before the Transformer. + + Key improvements over original: + 1. Position embeddings added BEFORE convolution (provides spatial context to conv) + 2. Residual connection (conv enriches embeddings rather than replacing them) + 3. Multi-scale convolutions (kernel sizes 3, 5, 7) for better receptive field + 4. Proper layer normalization on the residual path + """ + + def __init__(self, config): + super().__init__() + self.token_embeddings = nn.Embedding( + config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id + ) + self.position_embeddings = nn.Embedding( + config.max_position_embeddings, config.hidden_size + ) + + # NEW: Branch depth embeddings - encodes depth in glycan tree (0=root, 1=child, etc.) + max_branch_depth = getattr(config, "max_branch_depth", 8) + self.branch_embeddings = nn.Embedding(max_branch_depth, config.hidden_size) + + # NEW: Linkage type embeddings - encodes chemistry of glycosidic bond + # 0=none, 1=1-3, 2=1-4, 3=1-6, etc. + num_linkage_types = getattr(config, "num_linkage_types", 9) + self.linkage_embeddings = nn.Embedding(num_linkage_types, config.hidden_size) + + # Multi-scale convolutions for different receptive fields + kernel_size = getattr(config, "cnn_kernel_size", 3) + # Split channels evenly: 256 + 256 + 256 = 768 for hidden_size=768 + channels_per_scale = config.hidden_size // 3 + self.conv_layers = nn.ModuleList([ + nn.Conv1d( + in_channels=config.hidden_size, + out_channels=channels_per_scale, + kernel_size=kernel_size + 2 * i, # Kernels: 3, 5, 7 + padding=(kernel_size + 2 * i) // 2, # Same padding + ) + for i in range(3) + ]) + self.conv_activation = nn.GELU() + self.conv_proj = nn.Linear(channels_per_scale * 3, config.hidden_size) # Project concatenated back + + self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) + self.conv_norm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) + self.dropout = nn.Dropout(config.hidden_dropout_prob) + self.register_buffer( + "position_ids", + torch.arange(config.max_position_embeddings).expand((1, -1)), + ) + + self.hidden_size = config.hidden_size + + def forward(self, input_ids, branch_depths=None, linkage_types=None): + seq_len = input_ids.shape[1] + + # Step 1: Token + Position embeddings FIRST (provides spatial context to conv) + x = self.token_embeddings(input_ids) # (batch, seq, hidden) + position_ids = self.position_ids[:, :seq_len] + x = x + self.position_embeddings(position_ids) + + # NEW: Add branch depth embeddings (encodes tree structure) + if branch_depths is not None: + # Clamp to valid range + branch_depths = branch_depths.clamp(0, self.branch_embeddings.num_embeddings - 1) + x = x + self.branch_embeddings(branch_depths) + + # NEW: Add linkage type embeddings (encodes bond chemistry) + if linkage_types is not None: + linkage_types = linkage_types.clamp(0, self.linkage_embeddings.num_embeddings - 1) + x = x + self.linkage_embeddings(linkage_types) + + x = self.LayerNorm(x) + + # Step 2: Multi-scale convolution with RESIDUAL connection + # Convolution expects (batch, hidden, seq) + conv_in = x.permute(0, 2, 1) + + # Apply multi-scale convolutions and concatenate + conv_outputs = [] + for conv in self.conv_layers: + conv_out = self.conv_activation(conv(conv_in)) + conv_outputs.append(conv_out) + + # Concatenate multi-scale features and project back + conv_out = torch.cat(conv_outputs, dim=1) # (batch, hidden, seq) + conv_out = conv_out.permute(0, 2, 1) # (batch, seq, hidden) + conv_out = self.conv_proj(conv_out) # Project to correct size + + # Step 3: Residual connection - conv ENRICHES rather than replaces + x = self.conv_norm(x + self.dropout(conv_out)) + + return x + + +def create_residue_level_mask( + seq_residue_ids: torch.Tensor, # (batch, N_seq) + struct_residue_ids: torch.Tensor # (batch, N_struct) +) -> torch.Tensor: + """ + Create residue-level attention mask for cross-attention. + + Maps WURCS tokens to VQ-VAE structural tokens based on residue IDs. + A WURCS token with residue_id=0 can only attend to VQ-VAE tokens with residue_id=0. + + Args: + seq_residue_ids: Residue IDs for sequence tokens (batch, N_seq) + struct_residue_ids: Residue IDs for structural tokens (batch, N_struct) + + Returns: + Boolean mask (batch, N_seq, N_struct) where True = can attend + """ + # Expand dimensions for broadcasting + # seq: (batch, N_seq, 1) + # struct: (batch, 1, N_struct) + mask = seq_residue_ids.unsqueeze(2) == struct_residue_ids.unsqueeze(1) + # Shape: (batch, N_seq, N_struct) + + # Mask out structural tokens (residue_id = -1) and MS tokens (residue_id = -2) + # Only tokens with residue_id >= 0 can attend + mask &= (seq_residue_ids.unsqueeze(2) >= 0) + + return mask # True = can attend, False = cannot attend + + +class MultimodalGlycanBERTConfig: + """Configuration for Multimodal GlycanBERT v3.""" + + def __init__( + self, + # Sequence modality + seq_vocab_size: int = 166, + seq_hidden_size: int = 768, + seq_num_layers: int = 12, + seq_num_heads: int = 12, + seq_max_length: int = 512, + + # MS modality + ms_vocab_size: int = 242, + ms_hidden_size: int = 384, + ms_num_layers: int = 6, + ms_num_heads: int = 6, + ms_max_length: int = 150, + + # 3D structure modality + struct_vocab_size: int = 1024, # VQ-VAE codebook size + struct_hidden_size: int = 512, + struct_num_layers: int = 8, + struct_num_heads: int = 8, + struct_max_length: int = 200, + use_3d: bool = True, + + # Cross-attention + use_cross_attention: bool = True, + cross_attn_num_heads: int = 8, + + # Fusion + fusion_hidden_size: int = 768, + fusion_num_layers: int = 2, + + # Training + hidden_dropout_prob: float = 0.1, + attention_probs_dropout_prob: float = 0.1, + layer_norm_eps: float = 1e-12, + initializer_range: float = 0.02, + + # Conv front-end + use_cnn_frontend: bool = True, + cnn_kernel_size: int = 3, + + # Loss weights + seq_loss_weight: float = 0.60, + ms_loss_weight: float = 0.15, + struct_loss_weight: float = 0.25, + dist_loss_weight: float = 0.25, + + # Token IDs + pad_token_id: int = 0, + mask_token_id: int = 1, + ): + # Sequence config + self.seq_vocab_size = seq_vocab_size + self.seq_hidden_size = seq_hidden_size + self.seq_num_layers = seq_num_layers + self.seq_num_heads = seq_num_heads + self.seq_max_length = seq_max_length + + # MS config + self.ms_vocab_size = ms_vocab_size + self.ms_vocab_offset = seq_vocab_size # MS tokens start at 166 + self.ms_total_vocab_size = seq_vocab_size + ms_vocab_size # 408 total + self.ms_hidden_size = ms_hidden_size + self.ms_num_layers = ms_num_layers + self.ms_num_heads = ms_num_heads + self.ms_max_length = ms_max_length + + # Structure config + self.struct_vocab_size = struct_vocab_size + self.struct_hidden_size = struct_hidden_size + self.struct_num_layers = struct_num_layers + self.struct_num_heads = struct_num_heads + self.struct_max_length = struct_max_length + self.use_3d = use_3d + + # Cross-attention config + self.use_cross_attention = use_cross_attention + self.cross_attn_num_heads = cross_attn_num_heads + + # Fusion config + self.fusion_hidden_size = fusion_hidden_size + self.fusion_num_layers = fusion_num_layers + + # Training config + self.hidden_dropout_prob = hidden_dropout_prob + self.attention_probs_dropout_prob = attention_probs_dropout_prob + self.layer_norm_eps = layer_norm_eps + self.initializer_range = initializer_range + + # Conv front-end + self.use_cnn_frontend = use_cnn_frontend + self.cnn_kernel_size = cnn_kernel_size + + # Loss weights + self.seq_loss_weight = seq_loss_weight + self.ms_loss_weight = ms_loss_weight + self.struct_loss_weight = struct_loss_weight + self.dist_loss_weight = dist_loss_weight + + # Token IDs + self.pad_token_id = pad_token_id + self.mask_token_id = mask_token_id + + def to_seq_config(self) -> GlycanBERTConfig: + """Convert to sequence-only config.""" + return GlycanBERTConfig( + vocab_size=self.seq_vocab_size, + hidden_size=self.seq_hidden_size, + num_hidden_layers=self.seq_num_layers, + num_attention_heads=self.seq_num_heads, + intermediate_size=self.seq_hidden_size * 4, + hidden_dropout_prob=self.hidden_dropout_prob, + attention_probs_dropout_prob=self.attention_probs_dropout_prob, + max_position_embeddings=self.seq_max_length, + layer_norm_eps=self.layer_norm_eps, + pad_token_id=self.pad_token_id, + mask_token_id=self.mask_token_id, + initializer_range=self.initializer_range, + ) + + def to_ms_config(self) -> GlycanBERTConfig: + """Convert to MS-only config.""" + return GlycanBERTConfig( + vocab_size=self.ms_total_vocab_size, + hidden_size=self.ms_hidden_size, + num_hidden_layers=self.ms_num_layers, + num_attention_heads=self.ms_num_heads, + intermediate_size=self.ms_hidden_size * 4, + hidden_dropout_prob=self.hidden_dropout_prob, + attention_probs_dropout_prob=self.attention_probs_dropout_prob, + max_position_embeddings=self.ms_max_length, + layer_norm_eps=self.layer_norm_eps, + pad_token_id=self.pad_token_id, + mask_token_id=self.mask_token_id, + initializer_range=self.initializer_range, + ) + + def to_struct_config(self) -> GlycanBERTConfig: + """Convert to structure-only config.""" + return GlycanBERTConfig( + vocab_size=self.struct_vocab_size, + hidden_size=self.struct_hidden_size, + num_hidden_layers=self.struct_num_layers, + num_attention_heads=self.struct_num_heads, + intermediate_size=self.struct_hidden_size * 4, + hidden_dropout_prob=self.hidden_dropout_prob, + attention_probs_dropout_prob=self.attention_probs_dropout_prob, + max_position_embeddings=self.struct_max_length, + layer_norm_eps=self.layer_norm_eps, + pad_token_id=self.pad_token_id, + mask_token_id=self.mask_token_id, + initializer_range=self.initializer_range, + ) + + +# ============================================================================= +# Improvement #1: Monosaccharide-Level Pooling +# ============================================================================= + +class MonosaccharidePooling(nn.Module): + """ + Pool token representations to monosaccharide level, then aggregate. + + This bridges the gap between token-level BERT and monosaccharide-level CNNs/GNNs. + Uses monosaccharide_indices from the data to know where each residue starts. + """ + + def __init__(self, hidden_size: int, num_attention_heads: int = 8, dropout: float = 0.1): + super().__init__() + self.hidden_size = hidden_size + + # Attention pooling over monosaccharide representations + self.mono_attention = nn.MultiheadAttention( + embed_dim=hidden_size, + num_heads=num_attention_heads, + dropout=dropout, + batch_first=True + ) + self.mono_norm = nn.LayerNorm(hidden_size) + + # Final aggregation to single glycan representation + self.glycan_query = nn.Parameter(torch.randn(1, 1, hidden_size) * 0.02) + self.glycan_attention = nn.MultiheadAttention( + embed_dim=hidden_size, + num_heads=num_attention_heads, + dropout=dropout, + batch_first=True + ) + self.glycan_norm = nn.LayerNorm(hidden_size) + + def forward( + self, + hidden_states: torch.Tensor, # (batch, seq_len, hidden) + residue_ids: torch.Tensor, # (batch, seq_len) - which residue each token belongs to + attention_mask: torch.Tensor = None, # (batch, seq_len) + ) -> torch.Tensor: + """ + Pool tokens to monosaccharide level, then to glycan level. + + Returns: + Glycan representation: (batch, hidden_size) + """ + batch_size = hidden_states.size(0) + device = hidden_states.device + + # Get unique residue IDs per sample (excluding -1 padding) + max_residues = 50 # Reasonable max for glycans + + # Pool tokens within each residue using mean pooling + mono_reps = torch.zeros(batch_size, max_residues, self.hidden_size, device=device) + mono_mask = torch.zeros(batch_size, max_residues, dtype=torch.bool, device=device) + + for b in range(batch_size): + unique_residues = torch.unique(residue_ids[b][residue_ids[b] >= 0]) + for i, rid in enumerate(unique_residues): + if i >= max_residues: + break + token_mask = residue_ids[b] == rid + if attention_mask is not None: + token_mask = token_mask & (attention_mask[b] > 0) + if token_mask.sum() > 0: + mono_reps[b, i] = hidden_states[b][token_mask].mean(dim=0) + mono_mask[b, i] = True + + # Apply attention over monosaccharide representations + # Convert mask for attention: True = valid, need to invert for PyTorch + key_padding_mask = ~mono_mask # True = ignore + + mono_out, _ = self.mono_attention( + mono_reps, mono_reps, mono_reps, + key_padding_mask=key_padding_mask + ) + mono_out = self.mono_norm(mono_reps + mono_out) + + # Aggregate to single glycan representation using learned query + glycan_query = self.glycan_query.expand(batch_size, -1, -1) + glycan_out, _ = self.glycan_attention( + glycan_query, mono_out, mono_out, + key_padding_mask=key_padding_mask + ) + glycan_out = self.glycan_norm(glycan_query + glycan_out) + + return glycan_out.squeeze(1) # (batch, hidden) + + +# ============================================================================= +# Improvement #2: Residue Type Embeddings +# ============================================================================= + +# Common monosaccharide types vocabulary +MONOSACCHARIDE_VOCAB = { + '[PAD_MONO]': 0, '[UNK_MONO]': 1, + 'Glc': 2, 'GlcNAc': 3, 'GlcA': 4, 'GlcN': 5, + 'Gal': 6, 'GalNAc': 7, 'GalA': 8, 'GalN': 9, + 'Man': 10, 'ManNAc': 11, 'ManA': 12, 'ManN': 13, + 'Fuc': 14, 'Rha': 15, 'Xyl': 16, 'Ara': 17, + 'Neu5Ac': 18, 'Neu5Gc': 19, 'Kdn': 20, 'Sia': 21, + 'GalNAcA': 22, 'GlcNAcA': 23, 'IdoA': 24, 'GulA': 25, + 'Rib': 26, 'Lyx': 27, 'All': 28, 'Alt': 29, + 'Tal': 30, 'Ido': 31, 'Qui': 32, 'Oli': 33, + 'Tyv': 34, 'Abe': 35, 'Par': 36, 'Dig': 37, + 'Col': 38, 'Dha': 39, 'Kdo': 40, 'Hep': 41, + 'NeuroGc': 42, 'Muramic': 43, 'LDManHep': 44, 'DDManHep': 45, + 'Bac': 46, 'Pse': 47, 'Leg': 48, 'Aci': 49, + '6dTal': 50, 'Fru': 51, 'Tag': 52, 'Sor': 53, + 'Psi': 54, 'Sed': 55, 'MurNAc': 56, 'MurNGc': 57, + 'Api': 58, 'Erwiniose': 59, 'Yer': 60, 'Thre': 61, + # Add more as needed, up to ~70 +} + + +class ResidueTypeEmbeddings(nn.Module): + """ + Learnable embeddings for monosaccharide types. + + Instead of the model having to learn that 'a1221m' = Fucose from character patterns, + we explicitly add a Fucose embedding to all tokens belonging to that residue. + """ + + def __init__(self, hidden_size: int, num_mono_types: int = 70): + super().__init__() + self.mono_embeddings = nn.Embedding(num_mono_types, hidden_size) + self.mono_vocab = MONOSACCHARIDE_VOCAB + self.hidden_size = hidden_size + + def forward( + self, + token_embeddings: torch.Tensor, # (batch, seq_len, hidden) + residue_ids: torch.Tensor, # (batch, seq_len) + mono_type_ids: torch.Tensor = None, # (batch, max_residues) - monosaccharide type per residue + ) -> torch.Tensor: + """ + Add residue type embeddings to token embeddings. + + Args: + token_embeddings: Base token embeddings + residue_ids: Which residue each token belongs to (-1 for special tokens) + mono_type_ids: Monosaccharide type ID for each residue position + + Returns: + Enhanced embeddings with residue type information + """ + if mono_type_ids is None: + return token_embeddings + + batch_size, seq_len, _ = token_embeddings.shape + enhanced = token_embeddings.clone() + + # Add mono type embedding to each token based on its residue + for b in range(batch_size): + for pos in range(seq_len): + rid = residue_ids[b, pos].item() + if rid >= 0 and rid < mono_type_ids.size(1): + mono_id = mono_type_ids[b, rid] + enhanced[b, pos] = enhanced[b, pos] + self.mono_embeddings(mono_id) + + return enhanced + + @staticmethod + def get_mono_type_id(mono_name: str) -> int: + """Convert monosaccharide name to type ID.""" + return MONOSACCHARIDE_VOCAB.get(mono_name, MONOSACCHARIDE_VOCAB['[UNK_MONO]']) + + +# ============================================================================= +# Improvement #4: Relative Position Encoding for Glycan Trees +# ============================================================================= + +class RelativePositionBias(nn.Module): + """ + Compute relative position bias for attention based on residue IDs. + + Tokens in the same residue get distance 0. + Tokens in adjacent residues get distance ±1. + This helps the model understand glycan tree structure. + """ + + def __init__(self, num_heads: int, max_distance: int = 10): + super().__init__() + self.num_heads = num_heads + self.max_distance = max_distance + + # Learnable bias for each relative distance (-max to +max) + num_distances = 2 * max_distance + 1 + self.relative_bias = nn.Embedding(num_distances, num_heads) + + def forward(self, residue_ids: torch.Tensor) -> torch.Tensor: + """ + Compute relative position bias. + + Args: + residue_ids: (batch, seq_len) + + Returns: + Bias to add to attention scores: (batch, num_heads, seq_len, seq_len) + """ + # Compute pairwise residue distances + # (batch, seq_len, 1) - (batch, 1, seq_len) = (batch, seq_len, seq_len) + distance = residue_ids.unsqueeze(2) - residue_ids.unsqueeze(1) + + # Clamp to max distance range and shift to 0-indexed + distance_clamped = distance.clamp(-self.max_distance, self.max_distance) + distance_idx = distance_clamped + self.max_distance # Now 0 to 2*max_distance + + # Look up bias: (batch, seq_len, seq_len, num_heads) + bias = self.relative_bias(distance_idx) + + # Transpose to (batch, num_heads, seq_len, seq_len) + bias = bias.permute(0, 3, 1, 2) + + return bias + + +class CrossAttentionLayer(nn.Module): + """ + Cross-attention layer for sequence-structure alignment. + + Allows sequence tokens to attend to structural atoms using attention masks. + """ + + def __init__(self, config: MultimodalGlycanBERTConfig): + super().__init__() + self.num_heads = config.cross_attn_num_heads + self.hidden_size = config.seq_hidden_size + self.head_dim = self.hidden_size // self.num_heads + + assert self.hidden_size % self.num_heads == 0, "hidden_size must be divisible by num_heads" + + # Query from sequence, Key/Value from structure (VQ-VAE tokens) + self.query = nn.Linear(config.seq_hidden_size, self.hidden_size) + self.key = nn.Linear(config.struct_hidden_size, self.hidden_size) + self.value = nn.Linear(config.struct_hidden_size, self.hidden_size) + + self.output = nn.Linear(self.hidden_size, config.seq_hidden_size) + self.dropout = nn.Dropout(config.attention_probs_dropout_prob) + self.layer_norm = nn.LayerNorm(config.seq_hidden_size, eps=config.layer_norm_eps) + + def forward( + self, + seq_hidden: torch.Tensor, # (batch, seq_len, seq_hidden) + struct_hidden: torch.Tensor, # (batch, struct_len, struct_hidden) + attention_mask: Optional[torch.Tensor] = None, # (batch, seq_len, struct_len) + ) -> torch.Tensor: + """ + Apply cross-attention from sequence to structure. + + Args: + seq_hidden: Sequence hidden states + struct_hidden: Structure hidden states + attention_mask: Boolean mask (True = can attend, False = cannot attend) + + Returns: + Updated sequence hidden states + """ + batch_size, seq_len, _ = seq_hidden.shape + struct_len = struct_hidden.shape[1] + + # Project to Q, K, V + Q = self.query(seq_hidden) # (batch, seq_len, hidden) + K = self.key(struct_hidden) # (batch, struct_len, hidden) + V = self.value(struct_hidden) # (batch, struct_len, hidden) + + # Reshape for multi-head attention + Q = Q.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2) # (batch, heads, seq_len, head_dim) + K = K.view(batch_size, struct_len, self.num_heads, self.head_dim).transpose(1, 2) # (batch, heads, struct_len, head_dim) + V = V.view(batch_size, struct_len, self.num_heads, self.head_dim).transpose(1, 2) # (batch, heads, struct_len, head_dim) + + # Compute attention scores + scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.head_dim) # (batch, heads, seq_len, struct_len) + + # Apply attention mask + if attention_mask is not None: + # attention_mask: (batch, seq_len, struct_len) -> (batch, 1, seq_len, struct_len) + attention_mask = attention_mask.unsqueeze(1) + # Convert boolean mask to float: True -> 0.0, False -> -10000.0 + attention_mask = (~attention_mask).float() * -10000.0 + scores = scores + attention_mask + + # Softmax and dropout + attn_weights = torch.softmax(scores, dim=-1) # (batch, heads, seq_len, struct_len) + attn_weights = self.dropout(attn_weights) + + # Apply attention to values + context = torch.matmul(attn_weights, V) # (batch, heads, seq_len, head_dim) + + # Reshape back + context = context.transpose(1, 2).contiguous().view(batch_size, seq_len, self.hidden_size) + + # Output projection + output = self.output(context) + output = self.dropout(output) + + # Residual connection + layer norm + output = self.layer_norm(seq_hidden + output) + + return output + + +class MultimodalGlycanBERT(nn.Module): + """ + Multimodal BERT for glycan representation learning (v3). + + Architecture: + 1. Separate encoders for each modality (sequence, MS, 3D structure) + 2. Cross-attention for sequence-structure alignment + 3. Modality-specific MLM heads + 4. Fusion layer for combined representation + """ + + def __init__(self, config: MultimodalGlycanBERTConfig): + super().__init__() + self.config = config + + # ===== Sequence Encoder ===== + seq_config = config.to_seq_config() + seq_config.cnn_kernel_size = config.cnn_kernel_size + + if config.use_cnn_frontend: + print(f"✅ Enabled Convolutional Front-End (Kernel={config.cnn_kernel_size})") + self.seq_embeddings = ConvGlycanBERTEmbeddings(seq_config) + else: + self.seq_embeddings = GlycanBERTEmbeddings(seq_config) + self.seq_layers = nn.ModuleList([GlycanBERTLayer(seq_config) for _ in range(seq_config.num_hidden_layers)]) + self.seq_mlm_head = nn.Linear(seq_config.hidden_size, seq_config.vocab_size) + + # ===== MS Encoder ===== + ms_config = config.to_ms_config() + self.ms_embeddings = GlycanBERTEmbeddings(ms_config) + self.ms_layers = nn.ModuleList([GlycanBERTLayer(ms_config) for _ in range(ms_config.num_hidden_layers)]) + self.ms_mlm_head = nn.Linear(ms_config.hidden_size, ms_config.vocab_size) + + # ===== Structure Encoder (VQ-VAE tokens) ===== + if config.use_3d: + struct_config = config.to_struct_config() + self.struct_embeddings = GlycanBERTEmbeddings(struct_config) + self.struct_layers = nn.ModuleList([GlycanBERTLayer(struct_config) for _ in range(struct_config.num_hidden_layers)]) + self.struct_mlm_head = nn.Linear(struct_config.hidden_size, struct_config.vocab_size) + + # Cross-attention layer (sequence → VQ-VAE structural tokens) + if config.use_cross_attention: + self.cross_attention = CrossAttentionLayer(config) + + # ===== Projection layers (align hidden sizes) ===== + if config.ms_hidden_size != config.seq_hidden_size: + self.ms_projection = nn.Linear(config.ms_hidden_size, config.seq_hidden_size) + else: + self.ms_projection = nn.Identity() + + if config.use_3d and config.struct_hidden_size != config.seq_hidden_size: + self.struct_projection = nn.Linear(config.struct_hidden_size, config.seq_hidden_size) + else: + self.struct_projection = nn.Identity() + + # ===== Fusion Layer ===== + # Concatenate seq + ms + struct + fusion_input_size = config.seq_hidden_size * (3 if config.use_3d else 2) + self.fusion_layer = nn.Sequential( + nn.Linear(fusion_input_size, config.fusion_hidden_size), + nn.LayerNorm(config.fusion_hidden_size, eps=config.layer_norm_eps), + nn.GELU(), + nn.Dropout(config.hidden_dropout_prob), + nn.Linear(config.fusion_hidden_size, config.fusion_hidden_size), + ) + + # ===== Distance Prediction Head (Topology) ===== + # OPTIMIZED: Project down to 128 dim first to save GPU memory + # (Batch, 256, 256, 768) -> (Batch, 256, 256, 128) reduces memory by 6x + self.dist_proj = nn.Linear(config.seq_hidden_size, 128) + self.distance_head = nn.Sequential( + nn.Linear(128, 64), + nn.ReLU(), + nn.Linear(64, 1) + ) + + # Initialize weights + self.apply(self._init_weights) + + def _init_weights(self, module): + """Initialize weights.""" + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + elif isinstance(module, nn.LayerNorm): + module.bias.data.zero_() + module.weight.data.fill_(1.0) + + def forward( + self, + seq_token_ids: torch.Tensor, + seq_attention_mask: torch.Tensor, + seq_residue_ids: torch.Tensor, + seq_branch_depths: Optional[torch.Tensor] = None, # NEW: Branch depths + seq_linkage_types: Optional[torch.Tensor] = None, # NEW: Linkage types + ms_token_ids: torch.Tensor = None, + ms_attention_mask: torch.Tensor = None, + has_ms: torch.Tensor = None, + struct_token_ids: Optional[torch.Tensor] = None, + struct_attention_mask: Optional[torch.Tensor] = None, + struct_residue_ids: Optional[torch.Tensor] = None, + has_3d: Optional[torch.Tensor] = None, + seq_labels: Optional[torch.Tensor] = None, + ms_labels: Optional[torch.Tensor] = None, + struct_labels: Optional[torch.Tensor] = None, + dist_labels: Optional[torch.Tensor] = None, # NEW: Topology distance labels + return_dict: bool = True, + ) -> Dict[str, torch.Tensor]: + """ + Forward pass for multimodal BERT v3. + + Args: + seq_token_ids: (batch_size, seq_len) - Sequence token IDs + seq_attention_mask: (batch_size, seq_len) - Sequence attention mask + seq_residue_ids: (batch_size, seq_len) - Sequence token residue IDs + ms_token_ids: (batch_size, ms_len) - MS token IDs + ms_attention_mask: (batch_size, ms_len) - MS attention mask + has_ms: (batch_size,) - Boolean mask for samples with MS data + struct_token_ids: (batch_size, struct_len) - Structure VQ-VAE token IDs (optional) + struct_attention_mask: (batch_size, struct_len) - Structure attention mask (optional) + struct_residue_ids: (batch_size, struct_len) - Structure token residue IDs (optional) + has_3d: (batch_size,) - Boolean mask for samples with 3D data (optional) + seq_labels: (batch_size, seq_len) - Masked sequence labels (optional) + ms_labels: (batch_size, ms_len) - Masked MS labels (optional) + struct_labels: (batch_size, struct_len) - Masked structure labels (optional) + return_dict: Whether to return dict or tuple + + Returns: + Dictionary containing logits, hidden states, losses, etc. + """ + batch_size = seq_token_ids.shape[0] + device = seq_token_ids.device + + # ===== Sequence Encoder ===== + # Pass branch_depths and linkage_types to embeddings for tree-aware encoding + seq_hidden = self.seq_embeddings(seq_token_ids, seq_branch_depths, seq_linkage_types) + for layer in self.seq_layers: + seq_hidden = layer(seq_hidden, seq_attention_mask) + + seq_pooled = seq_hidden[:, 0, :] # [CLS] token + seq_logits = self.seq_mlm_head(seq_hidden) + + # ===== Distance Predictions (Topology) ===== + # Compute pairwise distance predictions + # MEMORY OPTIMIZATION: Project to 128-dim first + seq_hidden_small = self.dist_proj(seq_hidden) # (batch, seq_len, 128) + + # Expand for pairwise: (batch, seq_len, 1, 128) - (batch, 1, seq_len, 128) + h_i = seq_hidden_small.unsqueeze(2) + h_j = seq_hidden_small.unsqueeze(1) + h_diff = torch.abs(h_i - h_j) # (batch, seq_len, seq_len, 128) - Much smaller! + dist_predictions = self.distance_head(h_diff) # (batch, seq_len, seq_len, 1) + + # ===== MS Encoder ===== + ms_hidden = None + ms_pooled = None + ms_logits = None + + if ms_token_ids is not None: + ms_hidden = self.ms_embeddings(ms_token_ids) + for layer in self.ms_layers: + ms_hidden = layer(ms_hidden, ms_attention_mask) + + ms_pooled = ms_hidden[:, 0, :] # [CLS] token + ms_logits = self.ms_mlm_head(ms_hidden) + + # Zero out MS representations for samples without MS data + if has_ms is not None: + has_ms_expanded = has_ms.unsqueeze(1).float() # (batch, 1) + ms_pooled = ms_pooled * has_ms_expanded + + # ===== Structure Encoder ===== + struct_pooled = None + struct_logits = None + struct_hidden = None + + if self.config.use_3d and struct_token_ids is not None: + struct_hidden = self.struct_embeddings(struct_token_ids) + for layer in self.struct_layers: + struct_hidden = layer(struct_hidden, struct_attention_mask) + + struct_pooled = struct_hidden[:, 0, :] # [CLS] token + struct_logits = self.struct_mlm_head(struct_hidden) + + # Zero out structure representations for samples without 3D data + if has_3d is not None: + has_3d_expanded = has_3d.unsqueeze(1).float() # (batch, 1) + struct_pooled = struct_pooled * has_3d_expanded + + # ===== Cross-Attention (Sequence → VQ-VAE Structural Tokens) ===== + # Use residue-level alignment between WURCS tokens and VQ-VAE tokens + if self.config.use_cross_attention and struct_residue_ids is not None: + # Create residue-level mask + # WURCS token with residue_id=0 → VQ-VAE tokens with residue_id=0 + residue_mask = create_residue_level_mask( + seq_residue_ids=seq_residue_ids, + struct_residue_ids=struct_residue_ids, + ) # (batch, N_seq, N_struct) + + # Apply cross-attention: sequence tokens attend to VQ-VAE tokens + seq_hidden = self.cross_attention( + seq_hidden=seq_hidden, + struct_hidden=struct_hidden, # VQ-VAE token features + attention_mask=residue_mask, # Residue-based mask + ) + + # Update seq_pooled after cross-attention + seq_pooled = seq_hidden[:, 0, :] + + # ===== Fusion ===== + # Project to common hidden size + ms_pooled_projected = self.ms_projection(ms_pooled) + + if self.config.use_3d and struct_pooled is not None: + struct_pooled_projected = self.struct_projection(struct_pooled) + combined = torch.cat([seq_pooled, ms_pooled_projected, struct_pooled_projected], dim=-1) + else: + combined = torch.cat([seq_pooled, ms_pooled_projected], dim=-1) + + fused_repr = self.fusion_layer(combined) + + # ===== Compute Losses ===== + total_loss = None + seq_loss = None + ms_loss = None + struct_loss = None + dist_loss = None # NEW: Topology distance loss + + if seq_labels is not None: + loss_fct = nn.CrossEntropyLoss(ignore_index=-100) + seq_loss = loss_fct( + seq_logits.view(-1, self.config.seq_vocab_size), + seq_labels.view(-1) + ) + + if ms_labels is not None: + ms_labels_masked = ms_labels.clone() + ms_labels_masked[~has_ms] = -100 + # Only compute loss if there are valid labels (not all -100) + if (ms_labels_masked != -100).any(): + loss_fct = nn.CrossEntropyLoss(ignore_index=-100) + ms_loss = loss_fct( + ms_logits.view(-1, self.config.ms_total_vocab_size), + ms_labels_masked.view(-1) + ) + else: + ms_loss = torch.tensor(0.0, device=seq_token_ids.device) + + if self.config.use_3d and struct_labels is not None and struct_logits is not None: + struct_labels_masked = struct_labels.clone() + if has_3d is not None: + struct_labels_masked[~has_3d] = -100 + # Only compute loss if there are valid labels (not all -100) + if (struct_labels_masked != -100).any(): + loss_fct = nn.CrossEntropyLoss(ignore_index=-100) + struct_loss = loss_fct( + struct_logits.view(-1, self.config.struct_vocab_size), + struct_labels_masked.view(-1) + ) + else: + struct_loss = torch.tensor(0.0, device=seq_token_ids.device) + + # ===== Distance Loss (Topology) ===== + if dist_labels is not None: + # dist_predictions: (Batch, Seq, Seq, 1) -> (Batch, Seq, Seq) + preds = dist_predictions.squeeze(-1) + + # Create mask for valid distance pairs (label != -1) + # Also respect attention mask to avoid padding + valid_mask = (dist_labels != -1) & (seq_attention_mask.unsqueeze(1) * seq_attention_mask.unsqueeze(2) == 1) + + # DEBUG: Print once + if not hasattr(self, '_dist_debug_printed'): + print(f"[DIST DEBUG] dist_labels shape: {dist_labels.shape}, valid_mask.sum: {valid_mask.sum().item()}") + self._dist_debug_printed = True + + if valid_mask.sum() > 0: + # MSE loss on valid positions only + loss_fct = nn.MSELoss() + dist_loss = loss_fct(preds[valid_mask], dist_labels[valid_mask].float()) + else: + dist_loss = torch.tensor(0.0, device=seq_token_ids.device) + else: + # DEBUG: dist_labels is None + if not hasattr(self, '_dist_none_printed'): + print("[DIST DEBUG] dist_labels is None!") + self._dist_none_printed = True + + # Weighted combination + losses = [] + if seq_loss is not None: + losses.append(self.config.seq_loss_weight * seq_loss) + if ms_loss is not None: + losses.append(self.config.ms_loss_weight * ms_loss) + if struct_loss is not None: + losses.append(self.config.struct_loss_weight * struct_loss) + if dist_loss is not None: + losses.append(self.config.dist_loss_weight * dist_loss) + + if losses: + total_loss = sum(losses) + + if return_dict: + return { + 'loss': total_loss, + 'seq_loss': seq_loss, + 'ms_loss': ms_loss, + 'struct_loss': struct_loss, + 'dist_loss': dist_loss, # NEW: Topology loss + 'seq_logits': seq_logits, + 'ms_logits': ms_logits, + 'struct_logits': struct_logits, + 'dist_predictions': dist_predictions, # NEW: Distance predictions + 'seq_hidden': seq_hidden, + 'ms_hidden': ms_hidden, + 'struct_hidden': struct_hidden, + 'seq_pooled': seq_pooled, + 'ms_pooled': ms_pooled, + 'struct_pooled': struct_pooled, + 'fused_repr': fused_repr, + } + else: + return (total_loss, seq_logits, ms_logits, struct_logits, fused_repr) + + def get_multimodal_representation( + self, + seq_token_ids: torch.Tensor, + seq_attention_mask: torch.Tensor, + seq_residue_ids: torch.Tensor, + ms_token_ids: torch.Tensor, + ms_attention_mask: torch.Tensor, + has_ms: torch.Tensor, + struct_token_ids: Optional[torch.Tensor] = None, + struct_attention_mask: Optional[torch.Tensor] = None, + struct_residue_ids: Optional[torch.Tensor] = None, + has_3d: Optional[torch.Tensor] = None, + ) -> torch.Tensor: + """Get fused multimodal representation (for inference).""" + outputs = self.forward( + seq_token_ids=seq_token_ids, + seq_attention_mask=seq_attention_mask, + seq_residue_ids=seq_residue_ids, + ms_token_ids=ms_token_ids, + ms_attention_mask=ms_attention_mask, + has_ms=has_ms, + struct_token_ids=struct_token_ids, + struct_attention_mask=struct_attention_mask, + struct_residue_ids=struct_residue_ids, + has_3d=has_3d, + return_dict=True, + ) + return outputs['fused_repr'] + + +if __name__ == "__main__": + # Test the model + print("="*80) + print("Testing Multimodal GlycanBERT v3") + print("="*80) + + # Create config + config = MultimodalGlycanBERTConfig( + seq_vocab_size=166, + seq_hidden_size=768, + seq_num_layers=12, + seq_num_heads=12, + ms_vocab_size=242, + ms_hidden_size=384, + ms_num_layers=6, + ms_num_heads=6, + struct_vocab_size=1024, + struct_hidden_size=512, + struct_num_layers=8, + struct_num_heads=8, + use_3d=True, + use_cross_attention=True, + seq_loss_weight=0.60, + ms_loss_weight=0.15, + struct_loss_weight=0.25, + ) + + print(f"\nConfig:") + print(f" Sequence vocab: {config.seq_vocab_size}") + print(f" MS vocab: {config.ms_vocab_size}") + print(f" Structure vocab: {config.struct_vocab_size}") + print(f" Loss weights: seq={config.seq_loss_weight}, ms={config.ms_loss_weight}, struct={config.struct_loss_weight}") + + # Create model + model = MultimodalGlycanBERT(config) + + # Count parameters + total_params = sum(p.numel() for p in model.parameters()) + trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad) + + print(f"\nModel Parameters:") + print(f" Total: {total_params:,}") + print(f" Trainable: {trainable_params:,}") + + # Test forward pass + print(f"\n{'='*80}") + print("Testing Forward Pass (with Conv front-end)") + print("="*80) + + batch_size = 4 + seq_len = 128 + ms_len = 50 + struct_len = 40 + + # Create dummy inputs + seq_token_ids = torch.randint(0, config.seq_vocab_size, (batch_size, seq_len)) + seq_attention_mask = torch.ones(batch_size, seq_len) + # Approximate: ~5 tokens per residue + seq_residue_ids = torch.div( + torch.arange(seq_len), 5, rounding_mode="floor" + ).unsqueeze(0).expand(batch_size, -1) + + ms_token_ids = torch.randint(config.ms_vocab_offset, config.ms_total_vocab_size, (batch_size, ms_len)) + ms_attention_mask = torch.ones(batch_size, ms_len) + struct_token_ids = torch.randint(0, config.struct_vocab_size, (batch_size, struct_len)) + struct_attention_mask = torch.ones(batch_size, struct_len) + # Approximate: 4 tokens per residue for VQ-VAE tokens + struct_residue_ids = torch.div( + torch.arange(struct_len), 4, rounding_mode="floor" + ).unsqueeze(0).expand(batch_size, -1) + + has_ms = torch.tensor([True, True, False, True]) + has_3d = torch.tensor([True, False, True, True]) + + # Create labels for MLM + seq_labels = seq_token_ids.clone() + seq_labels[seq_labels != config.mask_token_id] = -100 + ms_labels = ms_token_ids.clone() + ms_labels[ms_labels != config.mask_token_id] = -100 + struct_labels = struct_token_ids.clone() + struct_labels[struct_labels != config.mask_token_id] = -100 + + # Forward pass + outputs = model( + seq_token_ids=seq_token_ids, + seq_attention_mask=seq_attention_mask, + seq_residue_ids=seq_residue_ids, + ms_token_ids=ms_token_ids, + ms_attention_mask=ms_attention_mask, + has_ms=has_ms, + struct_token_ids=struct_token_ids, + struct_attention_mask=struct_attention_mask, + struct_residue_ids=struct_residue_ids, + has_3d=has_3d, + seq_labels=seq_labels, + ms_labels=ms_labels, + struct_labels=struct_labels, + ) + + print(f"\nOutput shapes:") + print(f" seq_logits: {outputs['seq_logits'].shape}") + print(f" ms_logits: {outputs['ms_logits'].shape}") + print(f" struct_logits: {outputs['struct_logits'].shape}") + print(f" fused_repr: {outputs['fused_repr'].shape}") + + print(f"\nLosses:") + print(f" Total loss: {outputs['loss'].item():.4f}") + print(f" Sequence loss: {outputs['seq_loss'].item():.4f}") + print(f" MS loss: {outputs['ms_loss'].item():.4f}") + print(f" Structure loss: {outputs['struct_loss'].item():.4f}") + + print(f"\n{'='*80}") + print("Model Test Complete!") + print("="*80) diff --git a/releases/2026-10-02/bertose_source/training/a5_wurcs_bpe.py b/releases/2026-10-02/bertose_source/training/a5_wurcs_bpe.py new file mode 100644 index 0000000000000000000000000000000000000000..4ca91c571f8a538e026b1c086a14d81a0e3d59db --- /dev/null +++ b/releases/2026-10-02/bertose_source/training/a5_wurcs_bpe.py @@ -0,0 +1,368 @@ +"""Deterministic train-only WURCS BPE utilities for A5.""" + +from __future__ import annotations + +import re +from collections import Counter, defaultdict +from pathlib import Path +from typing import Iterable, Optional + +from .a5_topology import node_index, node_label + +try: + from bert_training_v4.downstream_tasks.utils.wurcs_bpe_tokenizer import ( + WURCSBPETokenizer, + WURCSPreTokenizer, + ) +except ImportError: + from ..bert_training_v4.downstream_tasks.utils.wurcs_bpe_tokenizer import ( + WURCSBPETokenizer, + WURCSPreTokenizer, + ) + + +SUBMITTED_FIT_ALPHABET = tuple( + "#$%()*-./0123456789<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ^abcdefghijklmnopqrstuvwxyz{|}~" +) + + +class _TopLevelBracketPattern: + """Expose regex-like findall while respecting nested SMILES brackets.""" + + @staticmethod + def findall(text: str) -> list[str]: + residues: list[str] = [] + depth = 0 + start = -1 + for index, character in enumerate(text): + if character == "[": + if depth == 0: + start = index + 1 + depth += 1 + elif character == "]" and depth: + depth -= 1 + if depth == 0 and start >= 0: + residues.append(text[start:index]) + start = -1 + if depth: + return [] + return residues + + +class A5WURCSPreTokenizer(WURCSPreTokenizer): + """Submitted pre-tokenizer with nested bracket-safe residue extraction.""" + + A5_LINKAGE_PATTERN = re.compile( + r"([A-Za-z]+)(\d+|\?)-([A-Za-z]+)(\d+|\?)" + ) + A5_ANOMERIC_PATTERN = re.compile(r"-([0-9]+)([abuxo])(?:_|$)") + + def __init__(self) -> None: + super().__init__() + self.RESIDUE_PATTERN = _TopLevelBracketPattern() + + def _split_wurcs_sections(self, wurcs: str) -> list[str]: + sections = super()._split_wurcs_sections(wurcs) + if len(sections) <= 5: + return sections + # WURCS LIN modifications may contain unbracketed slashes. The format + # has exactly five top-level sections, so every trailing fragment + # belongs to the linkage section rather than a new section. + return sections[:4] + ["/".join(sections[4:])] + + def _instance_anomeric_positions( + self, residue_definitions: list[str], index_list: list[str] + ) -> list[int | None]: + positions: list[int | None] = [] + for definition_index in index_list: + try: + residue_definition = residue_definitions[int(definition_index) - 1] + except (IndexError, ValueError): + positions.append(None) + continue + match = self.A5_ANOMERIC_PATTERN.search(residue_definition) + positions.append(int(match.group(1)) if match is not None else None) + return positions + + def _analyze_a5_tree( + self, + linkages: list[str], + residue_count: int, + anomeric_positions: list[int | None] | None = None, + ) -> tuple[dict[str, int], dict[str, int], dict[int, list[int]]]: + branch_points: dict[str, int] = defaultdict(int) + children: dict[str, list[str]] = defaultdict(list) + all_residues: set[str] = set() + adjacency: dict[int, list[int]] = defaultdict(list) + for linkage in linkages: + match = self.A5_LINKAGE_PATTERN.match(linkage) + if not match: + continue + left, left_position, right, right_position = match.groups() + try: + left_index = node_index(left) - 1 + right_index = node_index(right) - 1 + except ValueError: + continue + if not ( + 0 <= left_index < residue_count + and 0 <= right_index < residue_count + and left_index != right_index + ): + continue + parent, child = left, right + if anomeric_positions is not None: + left_anomeric = anomeric_positions[left_index] + right_anomeric = anomeric_positions[right_index] + left_is_donor = ( + left_position != "?" + and left_anomeric is not None + and int(left_position) == left_anomeric + ) + right_is_donor = ( + right_position != "?" + and right_anomeric is not None + and int(right_position) == right_anomeric + ) + if left_is_donor and not right_is_donor: + parent, child = right, left + elif right_is_donor and not left_is_donor: + parent, child = left, right + children[parent].append(child) + all_residues.update((parent, child)) + adjacency[left_index].append(right_index) + adjacency[right_index].append(left_index) + + for residue, child_labels in children.items(): + if len(child_labels) > 1: + branch_points[residue] = len(child_labels) - 1 + child_set = {child for values in children.values() for child in values} + roots = all_residues - child_set + root = min(roots, key=node_index) if roots else node_label(1) + depths = {root: 0} + queue = [root] + while queue: + current = queue.pop(0) + for child in children.get(current, []): + if child not in depths: + depths[child] = depths[current] + 1 + queue.append(child) + return dict(branch_points), depths, adjacency + + def _a5_linkage_type(self, linkage: str) -> int: + match = self.A5_LINKAGE_PATTERN.match(linkage) + if not match: + return 8 + _, from_position, _, to_position = match.groups() + try: + positions = (int(from_position), int(to_position)) + except ValueError: + return 8 + linkage_types = { + (1, 2): 0, + (2, 1): 0, + (1, 3): 1, + (3, 1): 1, + (1, 4): 2, + (4, 1): 2, + (1, 6): 3, + (6, 1): 3, + (2, 3): 4, + (3, 2): 4, + (2, 6): 5, + (6, 2): 5, + (3, 6): 6, + (6, 3): 6, + } + return linkage_types.get(positions, 7) + + def pre_tokenize(self, wurcs: str) -> list[dict]: + # Reuse the submitted semantic split, then correct only its tree + # annotations. This keeps the BPE unit text and special-token behavior. + inherited_units = super().pre_tokenize(wurcs) + try: + parts = self._split_wurcs_sections(wurcs) + index_list = parts[3].split("-") if len(parts) > 3 and parts[3] else [] + linkages = parts[4].split("_") if len(parts) > 4 and parts[4] else [] + residue_definitions = self.RESIDUE_PATTERN.findall(parts[2]) + anomeric_positions = self._instance_anomeric_positions( + residue_definitions, index_list + ) + branch_points, depths, adjacency = self._analyze_a5_tree( + linkages, len(index_list), anomeric_positions + ) + except (IndexError, ValueError): + return inherited_units + + units: list[dict] = [] + opened_residues: set[int] = set() + for inherited in inherited_units: + if inherited.get("text") == "[BRANCH_OPEN]": + continue + unit = dict(inherited) + residue_id = int(unit.get("residue_id", -1)) + if residue_id >= 0: + label = node_label(residue_id + 1) + if residue_id not in opened_residues: + for _ in range(branch_points.get(label, 0)): + units.append( + { + "text": "[BRANCH_OPEN]", + "type": "special", + "residue_id": -1, + "branch_depth": depths.get(label, 0), + "linkage_type": 0, + } + ) + opened_residues.add(residue_id) + unit["branch_depth"] = depths.get(label, 0) + elif unit.get("type") == "linkage": + unit["linkage_type"] = self._a5_linkage_type(str(unit["text"])) + units.append(unit) + + if units: + units[0]["distance_matrix"] = self._compute_distance_matrix( + adjacency, len(index_list) + ) + return units + + +class A5WURCSBPETokenizer(WURCSBPETokenizer): + """Train-only BPE with a fit-derived alphabet and deterministic merge ties.""" + + def __init__(self, vocab_path: Optional[str | Path] = None) -> None: + super().__init__(str(vocab_path) if vocab_path is not None else None) + self.pre_tokenizer = A5WURCSPreTokenizer() + + @classmethod + def train_from_fit_corpus( + cls, + wurcs_strings: Iterable[str], + num_merges: int = 2000, + output_path: Optional[str | Path] = None, + min_frequency: int = 2, + max_token_length: Optional[int] = None, + ) -> "A5WURCSBPETokenizer": + tokenizer = cls() + pre_tokenizer = tokenizer.pre_tokenizer + unit_counts: Counter[str] = Counter() + for wurcs in wurcs_strings: + for unit in pre_tokenizer.pre_tokenize(wurcs): + if unit["type"] != "special": + unit_counts[unit["text"]] += 1 + + # The submitted tokenizer learned the base character inventory from its + # corpus. Preserve that behavior, but fit it from training parents only. + tokenizer.fit_alphabet = tuple( + sorted({char for unit in unit_counts for char in unit}) + ) + + next_id = len(tokenizer.special_tokens) + for char in tokenizer.fit_alphabet: + tokenizer.token_to_id[char] = next_id + tokenizer.id_to_token[next_id] = char + next_id += 1 + + word_freqs: dict[tuple[str, ...], int] = { + tuple(unit): count + for unit, count in sorted(unit_counts.items()) + if count >= min_frequency + } + merges: list[tuple[str, str]] = [] + for _ in range(num_merges): + pair_counts: Counter[tuple[str, str]] = Counter() + for word, frequency in word_freqs.items(): + for index in range(len(word) - 1): + pair_counts[(word[index], word[index + 1])] += frequency + candidates = [ + (pair, count) + for pair, count in pair_counts.items() + if count >= min_frequency + and ( + max_token_length is None + or len(pair[0]) + len(pair[1]) <= max_token_length + ) + ] + if not candidates: + break + best_pair, _ = min( + candidates, + key=lambda item: (-item[1], item[0][0], item[0][1]), + ) + new_token = best_pair[0] + best_pair[1] + merges.append(best_pair) + tokenizer.token_to_id[new_token] = next_id + tokenizer.id_to_token[next_id] = new_token + next_id += 1 + + merged_freqs: Counter[tuple[str, ...]] = Counter() + for word, frequency in word_freqs.items(): + merged_word: list[str] = [] + index = 0 + while index < len(word): + if ( + index < len(word) - 1 + and word[index] == best_pair[0] + and word[index + 1] == best_pair[1] + ): + merged_word.append(new_token) + index += 2 + else: + merged_word.append(word[index]) + index += 1 + merged_freqs[tuple(merged_word)] += frequency + word_freqs = dict(merged_freqs) + + tokenizer.merges = merges + if output_path is not None: + tokenizer.save_vocab(str(output_path)) + return tokenizer + + def tokenize_sequence(self, wurcs: str, max_length: int = 256) -> dict: + units = self.pre_tokenizer.pre_tokenize(wurcs) + tokens: list[str] = [] + token_ids: list[int] = [] + residue_ids: list[int] = [] + branch_depths: list[int] = [] + linkage_types: list[int] = [] + + for unit in units: + unit_tokens = ( + [unit["text"]] + if unit["type"] == "special" + else self.apply_bpe(unit["text"]) + ) + for token in unit_tokens: + tokens.append(token) + token_ids.append( + self.token_to_id.get(token, self.token_to_id["[UNK]"]) + ) + residue_ids.append(int(unit["residue_id"])) + branch_depths.append(int(unit["branch_depth"])) + linkage_types.append(int(unit["linkage_type"])) + + if len(tokens) > max_length: + tokens = tokens[: max_length - 1] + ["[END]"] + token_ids = token_ids[: max_length - 1] + [self.token_to_id["[END]"]] + residue_ids = residue_ids[: max_length - 1] + [-1] + branch_depths = branch_depths[: max_length - 1] + [0] + linkage_types = linkage_types[: max_length - 1] + [0] + + length = len(tokens) + attention_mask = [1] * length + padding = max_length - length + tokens.extend(["[PAD]"] * padding) + token_ids.extend([self.token_to_id["[PAD]"]] * padding) + residue_ids.extend([-1] * padding) + branch_depths.extend([0] * padding) + linkage_types.extend([0] * padding) + attention_mask.extend([0] * padding) + return { + "tokens": tokens, + "token_ids": token_ids, + "residue_ids": residue_ids, + "branch_depths": branch_depths, + "linkage_types": linkage_types, + "attention_mask": attention_mask, + "length": length, + } diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_submission_readback_11767377/review_a5_native_eight_cuda_resume_diagnostic_r5_11767377_terminal_certification_receipt.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_submission_readback_11767377/review_a5_native_eight_cuda_resume_diagnostic_r5_11767377_terminal_certification_receipt.json new file mode 100644 index 0000000000000000000000000000000000000000..83da36f96ebfa67034de37e78f3d67d9da007b6c --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_submission_readback_11767377/review_a5_native_eight_cuda_resume_diagnostic_r5_11767377_terminal_certification_receipt.json @@ -0,0 +1,135 @@ +{ + "schema": "bertose_review_a5_native_eight_cuda_resume_diagnostic_r5_terminal_certification_20260727", + "status": "PASS_TERMINAL_CERTIFIED_REAL_CUDA_EXACT_RESUME", + "job": { + "job_id": "11767377", + "job_name": "a5-n8-cuda-resume-r5", + "state": "COMPLETED", + "exit_code": "0:0", + "submit_time": "2026-07-26T16:38:45", + "eligible_time": "2026-07-26T16:38:45", + "start_time": "2026-07-26T16:38:48", + "end_time": "2026-07-26T16:41:19", + "scheduler_wait_seconds": 3, + "elapsed": "00:02:31", + "restarts": 0, + "node": "nova18-singularity" + }, + "route": { + "partition": "interactive", + "account": "ratul", + "qos": "normal", + "requested_gres": "gpu:1", + "gpu_feature_constraint": null, + "allocated_gpu": "v100-sxm2-32g", + "allocated_gpu_count": 1, + "cpus": 4, + "memory": "16G", + "time_limit": "00:30:00", + "requeue": false + }, + "frozen_submission": { + "runner_sha256": "3e561dceed9a4a05b720b46598d18b7f98cf04e49dbe8ccf228afb1aa5f236b5", + "runner_bytes": 11473, + "sbatch_sha256": "87dadccc4b99db12acdd5f62f5429444489f403fddcd12ceaa9225208defb547", + "sbatch_bytes": 2346, + "submission_readback_receipt_sha256": "4824c00d3e28ee15cab63401204ff2c6b2aaa250012b97fd1776dacc6e36266c", + "submission_readback_receipt_bytes": 3307, + "submission_count": 1, + "other_runnable_copy_count_after_terminal": 0 + }, + "terminal_scheduler_readback": { + "scontrol_sha256": "b5e8b47da0a15a3cedfea54a85a397b744affddae2d5bffae394c40b754b1d10", + "scontrol_bytes": 2450, + "sacct_sha256": "fd3a55dc63abd830ec2620f7f637e51871552f663466c6496a9a72ed7eb18216", + "sacct_bytes": 300 + }, + "cuda_success_receipt": { + "path": "review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/review_a5_native_eight_cuda_resume_diagnostic_receipt_r5.json", + "file_sha256": "6a1bc65c568a17dc45f1102cd122ac43c62a8ee3b28e06ec855577857cc41ce0", + "bytes": 127461, + "self_domain_sha256": "0e491d188a71df9c51dc9deb5df8faea2f88f5096f65ac83a5cde5b53c1762a3", + "self_domain_sha256_verified": true, + "schema": "bertose_review_a5_native_eight_cuda_resume_diagnostic_20260727_r5", + "status": "PASS_REAL_CUDA_R7_BOTH_LOADS_EXACT_RESUME_DRAWS_AND_DEVICE_RECEIPT" + }, + "cuda_exact_resume_proof": { + "load_latest_executed": true, + "load_best_executed": true, + "interrupted_uninterrupted_exact_match": true, + "python_numpy_torch_cpu_torch_cuda_next_draws_exact": true, + "private_generators_did_not_mutate_global_rng": true, + "latest_model_tensor_devices": [ + "cuda:0" + ], + "latest_optimizer_tensor_devices": [ + "cuda:0" + ], + "latest_rng_tensor_devices": [ + "cpu", + "cpu", + "cpu" + ], + "best_model_tensor_devices": [ + "cuda:0" + ], + "best_optimizer_tensor_devices": [ + "cuda:0" + ], + "best_rng_tensor_devices": [ + "cpu", + "cpu", + "cpu" + ], + "latest_provenance_record_lifecycle": [ + 1, + 1, + 0 + ], + "best_provenance_record_lifecycle": [ + 1, + 1, + 0 + ], + "negative_cuda_boundary_cases_rejected": [ + "dtype", + "shape", + "value", + "mixed_device", + "requested_device" + ], + "negative_case_checkpoint_model_optimizer_unchanged": true, + "negative_case_global_rng_unchanged": true, + "production_runtime_source_modified": false, + "r7_source_modified": false, + "production_live_cell_claim_requested_by_synthetic_diagnostic": false + }, + "output_integrity": { + "checkpoint_index_sha256": "9292c31195a7eddfe9f987a8cfe8cda843b283bb10a1bc8fb1b05d88f82a92d9", + "checkpoint_index_bytes": 796, + "checkpoint_payload_sha256": "6885400540a9701725519e4e476cfbca0dec700836c52c0777e9ae5858ef6bb3", + "checkpoint_payload_bytes": 1683243, + "slurm_stdout_sha256": "60c00132b50b4fcfd887f4fef35828f55c5cb3fe5562fa7a6f81d20fc64244ae", + "slurm_stdout_bytes": 131246, + "slurm_stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "slurm_stderr_bytes": 0, + "terminal_hash_ledger_sha256": "19036f29acc263a1b3c1a764e87bfc3c420c4420c052c7c37500a90128350808", + "terminal_hash_ledger_bytes": 2644, + "terminal_hash_ledger_entry_count": 10 + }, + "scope": { + "synthetic_isolated_fixture": true, + "production_review_artifacts_opened_read_only": true, + "production_training_examples_used": false, + "production_training_occurred": false, + "official_submitted_artifacts_modified": false, + "cuda_exact_resume_gate_certified": true, + "training_authorized": false, + "scientific_launch_authorized": false, + "nova_submission_authorized": false, + "native_eight_array_submission_authorized_by_this_receipt": false + }, + "resubmit_authorized": false, + "reroute_authorized": false, + "cancel_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/review_a5_native_eight_cuda_resume_diagnostic_receipt_r5.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/review_a5_native_eight_cuda_resume_diagnostic_receipt_r5.json new file mode 100644 index 0000000000000000000000000000000000000000..3b8e8201f9c49271e4d300b2697b81b7d2707734 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/review_a5_native_eight_cuda_resume_diagnostic_receipt_r5.json @@ -0,0 +1 @@ +{"best_checkpoint_entry":{"bytes":1683243,"development_loss":1.0,"epoch":1,"filename":"review_checkpoint_payload_e001_6885400540a9701725519e4e476cfbca0dec700836c52c0777e9ae5858ef6bb3.pt","sha256":"6885400540a9701725519e4e476cfbca0dec700836c52c0777e9ae5858ef6bb3"},"cell_id":"A111","checkpoint_commit":{"best_checkpoint_sha256":"6885400540a9701725519e4e476cfbca0dec700836c52c0777e9ae5858ef6bb3","checkpoint_sha256":"6885400540a9701725519e4e476cfbca0dec700836c52c0777e9ae5858ef6bb3","index_sha256":"68c0dedf930e9e4cb54f58a8cf2ab15fe6a52a2c0567b68873265856d67cc087"},"cuda_checkpoint_lifecycle":{"best":{"entry_sha256":"6885400540a9701725519e4e476cfbca0dec700836c52c0777e9ae5858ef6bb3","placement":{"model_tensor_devices":["cuda:0"],"optimizer_tensor_devices":["cuda:0"],"rng_tensor_devices":["cpu","cpu","cpu"]},"provenance_records_after_load":1,"provenance_records_after_restore":0,"provenance_records_after_validation":1,"restored_checkpoint_unchanged":true,"validated_checkpoint_unchanged":true},"latest":{"entry_sha256":"6885400540a9701725519e4e476cfbca0dec700836c52c0777e9ae5858ef6bb3","placement":{"model_tensor_devices":["cuda:0"],"optimizer_tensor_devices":["cuda:0"],"rng_tensor_devices":["cpu","cpu","cpu"]},"provenance_records_after_load":1,"provenance_records_after_restore":0,"provenance_records_after_validation":1,"restored_checkpoint_unchanged":true,"validated_checkpoint_unchanged":true}},"cuda_optimizer_steps_used_only_synthetic_fixture_examples":true,"device":{"accelerator_model_constraint":null,"compute_capability":[7,0],"cuda_runtime":"12.8","cudnn_version":91002,"device":"cuda:0","generic_gpu_request":"gpu:1","multiprocessor_count":80,"name":"Tesla V100-SXM2-32GB","receipt_sha256":"6764e1b1f64316a51731661bdbc345cea0a9a7d4dd9f1535c6fed4c58df66699","torch_version":"2.9.1+cu128","total_memory_bytes":34072559616},"direct_model_state_sha256":"09bd5379d32fd127a045eb41823a1e3e3ef9a0d806d935c79fc7209356119509","direct_optimizer_state_sha256":"b1dd4caa0cd006130390dce024270f7c7996dcc188a86e27c296e241cd5e8146","epoch0_combined_normalized_loss":4.394619308412075,"epoch0_objective_parent_counts":{"ms":2,"sequence":8,"static":2,"topology":2},"epoch1_combined_normalized_loss":4.393069103360176,"explicit_next_rng_draws":{"direct_after_epoch1":{"numpy_next_16_bytes_hex":"4437741d404d327fffc8eb9b319f581a","python_getrandbits_64":5277321656444815509,"torch_cpu_next8_int64_sha256":"65893d5d8b3adf0209da585af014b5a68ec7c01b0fea05987cf51ec8e4e6eb38","torch_cuda_next8_int64_sha256":"2063fe9a85b121f52cf1fc1fb0f77ff594ab4232a15b577e578a934ca35192ae"},"private_generators_did_not_mutate_global_rng":true,"python_numpy_torch_cpu_torch_cuda_exact":true,"resumed_after_epoch1":{"numpy_next_16_bytes_hex":"4437741d404d327fffc8eb9b319f581a","python_getrandbits_64":5277321656444815509,"torch_cpu_next8_int64_sha256":"65893d5d8b3adf0209da585af014b5a68ec7c01b0fea05987cf51ec8e4e6eb38","torch_cuda_next8_int64_sha256":"2063fe9a85b121f52cf1fc1fb0f77ff594ab4232a15b577e578a934ca35192ae"}},"final_static_terminal_binding_required":false,"interrupted_uninterrupted_exact_match":true,"load_best_executed":true,"load_latest_executed":true,"negative_cuda_boundary_proof":{"checkpoint_model_optimizer_unchanged_each_failure":true,"global_rng_unchanged_each_failure":true,"rejected_cases":["dtype","shape","value","mixed_device","requested_device"]},"nova_submission_authorized":false,"objectives_exercised":["sequence","topology","ms","static"],"official_submitted_artifacts_modified":false,"production_data_opened":true,"production_review_artifact_access_purpose":"read_only_integrity_source_gate_and_fixture_validation","production_review_artifacts_opened":true,"production_training_examples_used":false,"production_training_occurred":false,"r4_failed_job_id":"11767362","r4_failure_receipt_sha256":"dfe235e740945321e0fd9968468156cc7ac58d85a0ed549900fd4bba4d3d51dd","r7_integrity_receipt_sha256":"912bc1391ff66c3fd704e61266de508adcf9ed587d7e136932508029b77cb956","r7_load_boundary_install_receipt":{"amp_enabled":false,"checkpoint_additional_full_state_hashes":0,"checkpoint_creation_chain_recomputed_from_exact_step_identities":true,"checkpoint_creation_or_verified_load_provenance_required":true,"checkpoint_cursor_prevalidated_before_model_optimizer_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_history_max_epochs":100,"checkpoint_lightweight_provenance_retired_after_commit_or_restore":true,"checkpoint_load_best_rng_cpu_normalized":true,"checkpoint_load_boundary_non_rng_objects_preserved":true,"checkpoint_load_boundary_returns_new_root":true,"checkpoint_load_latest_rng_cpu_normalized":true,"checkpoint_provenance_abandoned_gc_cleanup_claimed":false,"checkpoint_provenance_additional_full_state_hashes":0,"checkpoint_provenance_commit_restore_success_failure_retires":true,"checkpoint_provenance_full_history_chain_digest":true,"checkpoint_provenance_history_chain_digest_max_rows":100,"checkpoint_provenance_max_outstanding_records":1,"checkpoint_provenance_process_lifetime_bounded_records":1,"checkpoint_provenance_registration_replaces_prior":true,"checkpoint_provenance_strong_checkpoint_owner":true,"checkpoint_provenance_validation_failure_retires":true,"checkpoint_provenance_validation_success_transitions_record":true,"checkpoint_restore_chain_recomputation_claimed":false,"checkpoint_top_level_chain_equals_last_history_row_required":true,"checkpoint_valid_bytes_changed":false,"cuda_map_location_rng_metadata_cpu_clone":true,"development_history_chain_fields_exact_sha256_required":true,"development_history_sequential_rows_required":true,"exact_step_slice_checks_preserved":true,"existing_exact_r6_provenance_map_adopted":true,"frozen_r4_validator_patched":false,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"global_rng_mutated_during_load_normalization":false,"load_failure_clears_provenance":true,"loaded_model_optimizer_match_requested_device_required":true,"loaded_non_rng_tensors_match_requested_device_required":true,"loaded_rng_tensors_match_requested_device_required":true,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","persisted_checkpoint_bytes_changed":false,"predecessor_checkpoint_mutated_by_normalization":false,"predecessor_provenance_retired":true,"predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","predecessor_r3_loader_sha256":"e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30","predecessor_r3_receipt":{"amp_enabled":false,"checkpoint_cursor_prevalidated_before_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_valid_bytes_changed":false,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r3","scientific_launch_authorized":false,"source_bytes":36449,"source_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r3_runtime_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","predecessor_r4_loader_sha256":"662d0766a8d68638480e9c44ca4070387481d43e1c666a20363025cf5b9bc958","predecessor_r4_receipt":{"amp_enabled":false,"checkpoint_additional_full_state_hashes":0,"checkpoint_creation_chain_recomputed_from_exact_step_identities":true,"checkpoint_creation_or_verified_load_provenance_required":true,"checkpoint_cursor_prevalidated_before_model_optimizer_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_history_max_epochs":100,"checkpoint_lightweight_provenance_retired_after_commit_or_restore":true,"checkpoint_restore_chain_recomputation_claimed":false,"checkpoint_top_level_chain_equals_last_history_row_required":true,"checkpoint_valid_bytes_changed":false,"development_history_chain_fields_exact_sha256_required":true,"development_history_sequential_rows_required":true,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","predecessor_r3_loader_sha256":"e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30","predecessor_r3_receipt":{"amp_enabled":false,"checkpoint_cursor_prevalidated_before_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_valid_bytes_changed":false,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r3","scientific_launch_authorized":false,"source_bytes":36449,"source_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r3_runtime_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"rng_numpy_exact_mt19937_shape_types_required":true,"rng_prevalidation_before_model_optimizer_global_mutation":true,"rng_torch_cpu_disposable_generator_validation":true,"rng_torch_cuda_disposable_generator_validation":true,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r4","scientific_launch_authorized":false,"source_bytes":23798,"source_sha256":"600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r4_runtime_sha256":"600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649","predecessor_r5_launch_authorized":false,"predecessor_r5_loader_sha256":"864a05e86c5ea91318b11373d2cdffcdd2ddd0777f141cb7ef0305f779a42ea6","predecessor_r5_receipt":{"amp_enabled":false,"checkpoint_additional_full_state_hashes":0,"checkpoint_creation_chain_recomputed_from_exact_step_identities":true,"checkpoint_creation_or_verified_load_provenance_required":true,"checkpoint_cursor_prevalidated_before_model_optimizer_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_history_max_epochs":100,"checkpoint_lightweight_provenance_retired_after_commit_or_restore":true,"checkpoint_provenance_actual_constituent_identity_bound":true,"checkpoint_provenance_additional_full_state_hashes":0,"checkpoint_provenance_cleanup_paths":["validation_failure","commit_success","commit_failure","restore_success","restore_failure","abandoned_creation_or_load_gc"],"checkpoint_provenance_full_history_chain_digest":true,"checkpoint_provenance_history_chain_digest_max_rows":100,"checkpoint_restore_chain_recomputation_claimed":false,"checkpoint_top_level_chain_equals_last_history_row_required":true,"checkpoint_valid_bytes_changed":false,"development_history_chain_fields_exact_sha256_required":true,"development_history_sequential_rows_required":true,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","predecessor_r3_loader_sha256":"e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30","predecessor_r3_receipt":{"amp_enabled":false,"checkpoint_cursor_prevalidated_before_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_valid_bytes_changed":false,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r3","scientific_launch_authorized":false,"source_bytes":36449,"source_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r3_runtime_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","predecessor_r4_loader_sha256":"662d0766a8d68638480e9c44ca4070387481d43e1c666a20363025cf5b9bc958","predecessor_r4_receipt":{"amp_enabled":false,"checkpoint_additional_full_state_hashes":0,"checkpoint_creation_chain_recomputed_from_exact_step_identities":true,"checkpoint_creation_or_verified_load_provenance_required":true,"checkpoint_cursor_prevalidated_before_model_optimizer_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_history_max_epochs":100,"checkpoint_lightweight_provenance_retired_after_commit_or_restore":true,"checkpoint_restore_chain_recomputation_claimed":false,"checkpoint_top_level_chain_equals_last_history_row_required":true,"checkpoint_valid_bytes_changed":false,"development_history_chain_fields_exact_sha256_required":true,"development_history_sequential_rows_required":true,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","predecessor_r3_loader_sha256":"e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30","predecessor_r3_receipt":{"amp_enabled":false,"checkpoint_cursor_prevalidated_before_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_valid_bytes_changed":false,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r3","scientific_launch_authorized":false,"source_bytes":36449,"source_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r3_runtime_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"rng_numpy_exact_mt19937_shape_types_required":true,"rng_prevalidation_before_model_optimizer_global_mutation":true,"rng_torch_cpu_disposable_generator_validation":true,"rng_torch_cuda_disposable_generator_validation":true,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r4","scientific_launch_authorized":false,"source_bytes":23798,"source_sha256":"600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r4_runtime_sha256":"600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"rng_numpy_exact_mt19937_shape_types_required":true,"rng_prevalidation_before_model_optimizer_global_mutation":true,"rng_torch_cpu_disposable_generator_validation":true,"rng_torch_cuda_disposable_generator_validation":true,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r5","scientific_launch_authorized":false,"source_bytes":17677,"source_sha256":"ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r5_runtime_sha256":"ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8","predecessor_r5_status":"SUPERSEDED_NOT_LAUNCHABLE_SAME_CONSTITUENT_IMPOSTOR_ACCEPTANCE","predecessor_r6_loader_sha256":"e2496170942db844e4ebe71d4c098b0d0cf99540d3465ed7e8e9a113469cf7d2","predecessor_r6_receipt":{"amp_enabled":false,"checkpoint_additional_full_state_hashes":0,"checkpoint_creation_chain_recomputed_from_exact_step_identities":true,"checkpoint_creation_or_verified_load_provenance_required":true,"checkpoint_cursor_prevalidated_before_model_optimizer_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_history_max_epochs":100,"checkpoint_lightweight_provenance_retired_after_commit_or_restore":true,"checkpoint_provenance_abandoned_gc_cleanup_claimed":false,"checkpoint_provenance_additional_full_state_hashes":0,"checkpoint_provenance_commit_restore_success_failure_retires":true,"checkpoint_provenance_full_history_chain_digest":true,"checkpoint_provenance_history_chain_digest_max_rows":100,"checkpoint_provenance_max_outstanding_records":1,"checkpoint_provenance_process_lifetime_bounded_records":1,"checkpoint_provenance_registration_replaces_prior":true,"checkpoint_provenance_strong_checkpoint_owner":true,"checkpoint_provenance_validation_failure_retires":true,"checkpoint_provenance_validation_success_transitions_record":true,"checkpoint_restore_chain_recomputation_claimed":false,"checkpoint_top_level_chain_equals_last_history_row_required":true,"checkpoint_valid_bytes_changed":false,"development_history_chain_fields_exact_sha256_required":true,"development_history_sequential_rows_required":true,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","predecessor_r3_loader_sha256":"e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30","predecessor_r3_receipt":{"amp_enabled":false,"checkpoint_cursor_prevalidated_before_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_valid_bytes_changed":false,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r3","scientific_launch_authorized":false,"source_bytes":36449,"source_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r3_runtime_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","predecessor_r4_loader_sha256":"662d0766a8d68638480e9c44ca4070387481d43e1c666a20363025cf5b9bc958","predecessor_r4_receipt":{"amp_enabled":false,"checkpoint_additional_full_state_hashes":0,"checkpoint_creation_chain_recomputed_from_exact_step_identities":true,"checkpoint_creation_or_verified_load_provenance_required":true,"checkpoint_cursor_prevalidated_before_model_optimizer_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_history_max_epochs":100,"checkpoint_lightweight_provenance_retired_after_commit_or_restore":true,"checkpoint_restore_chain_recomputation_claimed":false,"checkpoint_top_level_chain_equals_last_history_row_required":true,"checkpoint_valid_bytes_changed":false,"development_history_chain_fields_exact_sha256_required":true,"development_history_sequential_rows_required":true,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","predecessor_r3_loader_sha256":"e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30","predecessor_r3_receipt":{"amp_enabled":false,"checkpoint_cursor_prevalidated_before_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_valid_bytes_changed":false,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r3","scientific_launch_authorized":false,"source_bytes":36449,"source_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r3_runtime_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"rng_numpy_exact_mt19937_shape_types_required":true,"rng_prevalidation_before_model_optimizer_global_mutation":true,"rng_torch_cpu_disposable_generator_validation":true,"rng_torch_cuda_disposable_generator_validation":true,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r4","scientific_launch_authorized":false,"source_bytes":23798,"source_sha256":"600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r4_runtime_sha256":"600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649","predecessor_r5_launch_authorized":false,"predecessor_r5_loader_sha256":"864a05e86c5ea91318b11373d2cdffcdd2ddd0777f141cb7ef0305f779a42ea6","predecessor_r5_receipt":{"amp_enabled":false,"checkpoint_additional_full_state_hashes":0,"checkpoint_creation_chain_recomputed_from_exact_step_identities":true,"checkpoint_creation_or_verified_load_provenance_required":true,"checkpoint_cursor_prevalidated_before_model_optimizer_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_history_max_epochs":100,"checkpoint_lightweight_provenance_retired_after_commit_or_restore":true,"checkpoint_provenance_actual_constituent_identity_bound":true,"checkpoint_provenance_additional_full_state_hashes":0,"checkpoint_provenance_cleanup_paths":["validation_failure","commit_success","commit_failure","restore_success","restore_failure","abandoned_creation_or_load_gc"],"checkpoint_provenance_full_history_chain_digest":true,"checkpoint_provenance_history_chain_digest_max_rows":100,"checkpoint_restore_chain_recomputation_claimed":false,"checkpoint_top_level_chain_equals_last_history_row_required":true,"checkpoint_valid_bytes_changed":false,"development_history_chain_fields_exact_sha256_required":true,"development_history_sequential_rows_required":true,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","predecessor_r3_loader_sha256":"e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30","predecessor_r3_receipt":{"amp_enabled":false,"checkpoint_cursor_prevalidated_before_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_valid_bytes_changed":false,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r3","scientific_launch_authorized":false,"source_bytes":36449,"source_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r3_runtime_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","predecessor_r4_loader_sha256":"662d0766a8d68638480e9c44ca4070387481d43e1c666a20363025cf5b9bc958","predecessor_r4_receipt":{"amp_enabled":false,"checkpoint_additional_full_state_hashes":0,"checkpoint_creation_chain_recomputed_from_exact_step_identities":true,"checkpoint_creation_or_verified_load_provenance_required":true,"checkpoint_cursor_prevalidated_before_model_optimizer_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_history_max_epochs":100,"checkpoint_lightweight_provenance_retired_after_commit_or_restore":true,"checkpoint_restore_chain_recomputation_claimed":false,"checkpoint_top_level_chain_equals_last_history_row_required":true,"checkpoint_valid_bytes_changed":false,"development_history_chain_fields_exact_sha256_required":true,"development_history_sequential_rows_required":true,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","predecessor_r3_loader_sha256":"e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30","predecessor_r3_receipt":{"amp_enabled":false,"checkpoint_cursor_prevalidated_before_state_mutation":true,"checkpoint_exact_chain_length_required":true,"checkpoint_valid_bytes_changed":false,"exact_step_slice_checks_preserved":true,"frozen_topology_loss_internal_validations_preserved":true,"frozen_topology_loss_sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e","full_plan_validation_boundaries":["build","bind","resume"],"fused_optimizer_enabled":false,"nova_submission_authorized":false,"per_step_plan_validation":"constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp","predecessor_r2_loader_sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae","predecessor_r2_receipt":{"actual_r9_direct_route_supported":true,"amp_enabled":false,"checkpoint_semantics_preserved":true,"development_transport_changed":false,"diagnostic_model_sha_fields_semantics":"rolling_step_chain_not_literal_model_state_sha256;reanchored_to_literal_model_state_only_at_resume_and_completed_epoch","exact_fp32_math_preserved":true,"frozen_r1_hotpath_sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f","full_cpu_digest_validated_before_h2d":true,"fused_optimizer_enabled":false,"nova_submission_authorized":false,"optional_outer_r8_route_supported":true,"partial_provenance_rejected":true,"per_step_authority_file_reads":0,"per_step_full_state_hashes":0,"per_step_model_state_copies":0,"per_step_optimizer_state_copies":0,"predecessor_source_sha256":{"adapter_r3":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e","executor_r8":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","r5_executor":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","training_core_r1":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"prefetch_installed":false,"sanitized_forward_cpu_digest_distinct":true,"schema":"bertose_review_a5_native_eight_hotpath_20260725_r2","scientific_launch_authorized":false,"source_bytes":32821,"source_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"training_authorized":false,"training_provenance_fields_cpu_only":true},"predecessor_r2_runtime_sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r3","scientific_launch_authorized":false,"source_bytes":36449,"source_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r3_runtime_sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"rng_numpy_exact_mt19937_shape_types_required":true,"rng_prevalidation_before_model_optimizer_global_mutation":true,"rng_torch_cpu_disposable_generator_validation":true,"rng_torch_cuda_disposable_generator_validation":true,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r4","scientific_launch_authorized":false,"source_bytes":23798,"source_sha256":"600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r4_runtime_sha256":"600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"rng_numpy_exact_mt19937_shape_types_required":true,"rng_prevalidation_before_model_optimizer_global_mutation":true,"rng_torch_cpu_disposable_generator_validation":true,"rng_torch_cuda_disposable_generator_validation":true,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r5","scientific_launch_authorized":false,"source_bytes":17677,"source_sha256":"ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r5_runtime_sha256":"ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8","predecessor_r5_status":"SUPERSEDED_NOT_LAUNCHABLE_SAME_CONSTITUENT_IMPOSTOR_ACCEPTANCE","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"rng_numpy_exact_mt19937_shape_types_required":true,"rng_prevalidation_before_model_optimizer_global_mutation":true,"rng_torch_cpu_disposable_generator_validation":true,"rng_torch_cuda_disposable_generator_validation":true,"schema":"bertose_review_a5_native_eight_hotpath_20260726_r6","scientific_launch_authorized":false,"source_bytes":17373,"source_sha256":"73b42e5131c64284c6f748ddf81b4d187dcb57f756c88c22240d189f2afc4cef","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"predecessor_r6_runtime_sha256":"73b42e5131c64284c6f748ddf81b4d187dcb57f756c88c22240d189f2afc4cef","prefetch_installed":false,"python_numpy_rng_in_development_mutation_receipt":true,"python_numpy_rng_prevalidated_before_global_mutation":true,"r13_coordination_paths":{"binding":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","runner":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py"},"r13_files_modified":false,"r8_executor_sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630","ram_request_changed":false,"replacement_strong_owner_registered_same_entry_sha":true,"rng_numpy_exact_mt19937_shape_types_required":true,"rng_prevalidation_before_model_optimizer_global_mutation":true,"rng_tensor_dtype_shape_contiguity_checks_preserved":true,"rng_torch_cpu_disposable_generator_validation":true,"rng_torch_cuda_disposable_generator_validation":true,"rng_value_range_and_generator_parse_checks_preserved":true,"schema":"bertose_review_a5_native_eight_hotpath_20260727_r7","scientific_launch_authorized":false,"source_bytes":20454,"source_sha256":"c0cb618f7856daf24666dbec07ff51b86e3fbd52c073c58bd1b7151122714f47","status":"INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED","tf32_enabled":false,"topology_bridge_availability_transfers_per_micro_max":1,"topology_bridge_batched_finite_checks_per_micro_max":1,"training_authorized":false,"transactional_checkpoint_commit_semantics_checked":true,"transactional_checkpoint_manager_schema_checked":true},"r7_runtime_sha256":"c0cb618f7856daf24666dbec07ff51b86e3fbd52c073c58bd1b7151122714f47","r7_test_sha256":"08115565db0ab8e75b76cde340a8609c7f36727b8f32ba6e936608d04bd67bb8","raw_cuda_map_location_proof":{"normalized_probe_placement":{"model_tensor_devices":["cuda:0"],"optimizer_tensor_devices":["cuda:0"],"rng_tensor_devices":["cpu","cpu","cpu"]},"source_checkpoint_unchanged":true,"source_snapshot":{"model_state_sha256":"031ac4554cfb0d92976bb8b0bf26bf7a4e70a66d728f10096cd5b30614bacc33","optimizer_state_sha256":"db278d9e5eead77b45a7d86047f7638d5676ed02f83df3e763b052d4ef97b87e","recursive_state_sha256":"e0d44c6d057c709327b0b0370390afe03662ce045c45616b357109edc2c4db9a","serialized_bytes":1684523,"serialized_sha256":"a11ddc4a32ff847ceb66378cd5ce7e5cf30079c3ccad0fc5d65bb9d81e440326"}},"receipt_sha256":"0e491d188a71df9c51dc9deb5df8faea2f88f5096f65ac83a5cde5b53c1762a3","recursive_closure_manifest":{"bytes":34753,"path":"/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r4_load_boundary_fix/review_a5_native_eight_cuda_resume_recursive_closure_r4.json","sha256":"8b920e99c188996f0abdf53bf26f8b07be61fdc0cf3e827d614d0e755087e871"},"resumed_model_state_sha256":"09bd5379d32fd127a045eb41823a1e3e3ef9a0d806d935c79fc7209356119509","resumed_optimizer_state_sha256":"b1dd4caa0cd006130390dce024270f7c7996dcc188a86e27c296e241cd5e8146","schema":"bertose_review_a5_native_eight_cuda_resume_diagnostic_20260727_r5","scientific_launch_authorized":false,"source_closure":{"cuda_diagnostic_runner":{"bytes":11473,"path":"/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/run_review_a5_native_eight_cuda_resume_diagnostic_r5.py","sha256":"3e561dceed9a4a05b720b46598d18b7f98cf04e49dbe8ccf228afb1aa5f236b5"},"predecessor_r1_runner":{"bytes":16614,"path":"review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r1/run_review_a5_native_eight_cuda_resume_diagnostic_r1.py","sha256":"abb819d3f18a795b5305890960a96807a5724dc5c7ded74ba73772aa919dc403"},"r13_binding":{"bytes":2946,"path":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","sha256":"c30b6b03dae852a4b10c6d01596e977d8a071e738dc3074f1ca0592a50778dd3"},"r13_test":{"bytes":56262,"path":"review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/test_review_a5_native_eight_r13.py","sha256":"1fb1a9cbf6149f706786301fa57644cde5db57eb068fbc754fc939303f25b425"},"r15_gate":{"bytes":41461,"path":"review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_gate_r15.py","sha256":"1556d6e2643edfc80b6b6782164ab47560e259ff55791c50dcffdd9b9afc001f"},"r15_preparation_binding":{"bytes":2041,"path":"review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_bindings_r15.py","sha256":"1f21427486260e8b56795f7137f0f7322ae768d80645db6636414e5961aa3224"},"r2_test_fixture":{"bytes":43561,"path":"review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/test_review_a5_native_eight_hotpath_r2.py","sha256":"cce9b4c85cebea8d3df6b33dfa0a54ac2b6c03f7a15aa96fc88436710a4a74eb"},"r3_test_fixture":{"bytes":22249,"path":"review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/test_review_a5_native_eight_hotpath_r3.py","sha256":"0d9c387ff7d7314ca5645dd0fc052bd3a4f814637094c5901e5c7a51078ad07b"},"r4_test_fixture":{"bytes":19081,"path":"review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/test_review_a5_native_eight_hotpath_r4.py","sha256":"ebbbdb35644e84b566278fec702afdf7bb23b77cc0b9da7dec226d68feb0504d"},"r5_direct:r4_runner":{"bytes":27102,"path":"writing/review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r4_load_boundary_fix/run_review_a5_native_eight_cuda_resume_diagnostic_r4.py","sha256":"02748db7c23ee670f648ffb052cd8b8ab0127f93330c0d2609fe71988061dc12"},"r5_direct:r4_sbatch":{"bytes":2672,"path":"writing/review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r4_load_boundary_fix/run_review_a5_native_eight_cuda_resume_diagnostic_r4.sbatch","sha256":"392c0128a4c60dffde4ee06f29a337f0c731c63b938b37f8aa008ea77984f8b7"},"r5_direct:r4_submission_readback":{"bytes":2977,"path":"writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r4_submission_readback_11767362/review_a5_native_eight_cuda_resume_diagnostic_r4_11767362_submission_readback_receipt.json","sha256":"45b337f270985e07996f9fda822a71dc22fb27dab6861ce73038df94eed23109"},"r5_direct:r4_terminal_failure_receipt":{"bytes":3260,"path":"writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r4_submission_readback_11767362/review_a5_native_eight_cuda_resume_diagnostic_r4_11767362_terminal_failure_receipt.json","sha256":"dfe235e740945321e0fd9968468156cc7ac58d85a0ed549900fd4bba4d3d51dd"},"r5_direct:r4_terminal_stderr":{"bytes":2458,"path":"writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r4_submission_readback_11767362/review_a5_native_eight_cuda_resume_diagnostic_r4_11767362_terminal_stderr.txt","sha256":"28817c7301f5b7c130314e09d68bf155f025731e9677d20412731650f4dc3dd0"},"r5_test_fixture":{"bytes":20423,"path":"review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/test_review_a5_native_eight_hotpath_r5.py","sha256":"fb36b4b6e474ecce6c61565a55e50092e6bbe8405d1e4bdd6032af4fdbdacd01"},"r6_integrity_receipt":{"bytes":3933,"path":"review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6_integrity_receipt.json","sha256":"0c078ce52e2eb6d6feaeb1a1c2af1794ef33aef56aca7959f76a93f39d152692"},"r6_loader":{"bytes":4013,"path":"review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/load_review_a5_native_eight_hotpath_r6.py","sha256":"e2496170942db844e4ebe71d4c098b0d0cf99540d3465ed7e8e9a113469cf7d2"},"r6_runtime":{"bytes":17373,"path":"review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6.py","sha256":"73b42e5131c64284c6f748ddf81b4d187dcb57f756c88c22240d189f2afc4cef"},"r6_test_fixture":{"bytes":20399,"path":"review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/test_review_a5_native_eight_hotpath_r6.py","sha256":"8acb8f578f94d6ad25a966615052bb1d3be0848914c513a02aa40970743986b3"},"recursive:data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_authority.json":{"bytes":20541,"path":"data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_authority.json","sha256":"48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4"},"recursive:data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_independent_certificate.json":{"bytes":19121,"path":"data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_independent_certificate.json","sha256":"53098620a5c22dafdc951ba743515b4b10b1673c02f0aa4d881db669584902fa"},"recursive:data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_receipt.json":{"bytes":6260,"path":"data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_receipt.json","sha256":"f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4"},"recursive:data/review_ms_acquisition_top30_runtime_20260721_r3/review_ms_acquisition_top30_parents.tsv.gz":{"bytes":78127,"path":"data/review_ms_acquisition_top30_runtime_20260721_r3/review_ms_acquisition_top30_parents.tsv.gz","sha256":"10dc3fa7622e2a7e448d775f4082fdc84aa0622f9a7a74bcfaeed491c0eb7d39"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_attention_mask.npy":{"bytes":71989376,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_attention_mask.npy","sha256":"01ed165720b9414e614dd7e7d75284a8886165f11138e16117ffcbe4e4bbf95c"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_ambiguity_tokens.json":{"bytes":19693,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_ambiguity_tokens.json","sha256":"22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_fit_contributors.tsv.gz":{"bytes":9934117,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_fit_contributors.tsv.gz","sha256":"4ec8dfaeacef355092313507ab71c628f48ddf1a4fe39e7663748060a07af297"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json":{"bytes":138150,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json","sha256":"918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_branch_depths.npy":{"bytes":71989376,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_branch_depths.npy","sha256":"f39f76aa56a9bb782b2349f3ad1ca4ad16351ee1f06a8b9ae4b06bff9b1ebece"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_build_official_sequence_topology_successor.py":{"bytes":16295,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_build_official_sequence_topology_successor.py","sha256":"2e84b03ab2189f009654e97c427930cc511c50d079db06f425035fcfb2ae1efb"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py":{"bytes":11405,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py","sha256":"10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py":{"bytes":6186,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py","sha256":"f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py":{"bytes":14161,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py","sha256":"6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_full_untruncated_lengths.npy":{"bytes":562544,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_full_untruncated_lengths.npy","sha256":"6d83b42630bd8c5d355378b423b3a0021938741b5faa711ecc129a6789e307c2"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_lengths.npy":{"bytes":562544,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_lengths.npy","sha256":"ade919d1e054c0ba852aa047bf873ac675f81a6c1f8a05cc73a0a2258131f021"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_linkage_types.npy":{"bytes":71989376,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_linkage_types.npy","sha256":"89edb1940765928ced6f54e0d394f95c573eb9d96310b14dbd0adf8e20ac07c4"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_owner_clean_build_report.json":{"bytes":3169,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_owner_clean_build_report.json","sha256":"2c24a655f009c6994756d8199b26c3e6489222c4b26d90efd0c43aacc17b9e4c"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_residue_ids.npy":{"bytes":143978624,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_residue_ids.npy","sha256":"36c96dcd3e03ba30e02e16f98d17605742627a37b37cd7824f2a745dd09dc044"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_objective_eligible.npy":{"bytes":281336,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_objective_eligible.npy","sha256":"62502d0d1b44a10989350a78f1e033d271fe8417715e10d42eb47c6720ceb3bf"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_receipt.json":{"bytes":5797,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_receipt.json","sha256":"399df3de2b6c4d5e88aa442c8326214ab9cff2e8f0411e6921762bbade1475ba"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_summary.json":{"bytes":7777,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_summary.json","sha256":"93ed219d807d4a7735be96bf7cf6a59a0bd407619925ee194aed6d473048cdf0"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz":{"bytes":14697953,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz","sha256":"2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_token_categories.npy":{"bytes":71989376,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_token_categories.npy","sha256":"2d51df879382deb4927a446937983fea5a07fbbc783181f7903546222b856205"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_token_ids.npy":{"bytes":143978624,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_token_ids.npy","sha256":"ec2d52dced65d22f0f218ff617d351fbd2930661bc8681e939990149d493537d"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_topology_lengths.npy":{"bytes":93175,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_topology_lengths.npy","sha256":"b52f6ddcf327b8cfc5159659bada97357216f9526b42c230a35192932f43d2f3"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_topology_offsets.npy":{"bytes":744512,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_topology_offsets.npy","sha256":"e06d61b8e47c2a2a3e0c8aeec7e015e673f64f0f483a483abe40ccda2d08b9e0"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_topology_roster.tsv":{"bytes":3890681,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_topology_roster.tsv","sha256":"a216ce485ea699fb1b66ed6915175a49cde8c7d14279dbaf835f4675bc7c7fa1"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_topology_row.npy":{"bytes":1124960,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_topology_row.npy","sha256":"a0ae28b0476322e3dbeda42a891f4a42c0973002a5d8507bf387b12dcbff4e95"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_topology_values.npy":{"bytes":5027730,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_topology_values.npy","sha256":"2d4ba8395f78864b7eed9ed250bb9fd50bd45ef84a10ed497ffb89c684276e4e"},"recursive:data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_tree_channels_valid.npy":{"bytes":281336,"path":"data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_tree_channels_valid.npy","sha256":"d15b160afe92a91a4a3d1b85b4a0353672b217b1d5c54513f3c80eab29c6b7c5"},"recursive:writing/review/multimodal/outputs/review_a5_native_eight_balanced_planner_r5_certificate_20260721_r1/review_a5_native_eight_balanced_planner_r5_certificate_r1.md":{"bytes":2460,"path":"writing/review/multimodal/outputs/review_a5_native_eight_balanced_planner_r5_certificate_20260721_r1/review_a5_native_eight_balanced_planner_r5_certificate_r1.md","sha256":"4b3198f26e45d84ffced87280e7ac6cd59932bb92cf4da66db1eefb099b897bf"},"recursive:writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r3_failure_diagnosis/review_a5_native_eight_cuda_resume_diagnostic_r3_failure_diagnosis_receipt.json":{"bytes":5533,"path":"writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r3_failure_diagnosis/review_a5_native_eight_cuda_resume_diagnostic_r3_failure_diagnosis_receipt.json","sha256":"f450ad637a82bcd7fb44b4424f212a5dffdee22f72fb8d3b0839b9d3365c3005"},"recursive:writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r1/review_a5_native_eight_data_adapter_receipt_r1.json":{"bytes":4132,"path":"writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r1/review_a5_native_eight_data_adapter_receipt_r1.json","sha256":"cacec838740d64a493c2e56fd1efa8a85ba7d11fce3ec26e40905c33db05e58d"},"recursive:writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r1/review_a5_native_eight_joined_development_manifest_r1.tsv.gz":{"bytes":3982015,"path":"writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r1/review_a5_native_eight_joined_development_manifest_r1.tsv.gz","sha256":"4eea50c1bd4eee0ea10062c287f31c619cef5835e2e660facd098698859f7e70"},"recursive:writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r1/review_a5_native_eight_joined_train_manifest_r1.tsv.gz":{"bytes":15455767,"path":"writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r1/review_a5_native_eight_joined_train_manifest_r1.tsv.gz","sha256":"13b7ebc78b22baa1a38d2ae40da202dcc1e20e56f44220b4d4d5003ca5f3b8f2"},"recursive:writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_receipt_r2.json":{"bytes":3677,"path":"writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_receipt_r2.json","sha256":"3b2118e128a5550ba4918b4f4f2c6d8045e319b7cff37b76d74dce6b3220c9f0"},"recursive:writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_receipt_r3.json":{"bytes":3016,"path":"writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_receipt_r3.json","sha256":"e29df7a91d0c30238abe9155e600fb1b77b0d3d3481f6599d2ca0d2185371b9f"},"recursive:writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_verification_receipt_r1.json":{"bytes":2659,"path":"writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_verification_receipt_r1.json","sha256":"a92f4b951476e84af006015c97698f07d5e03e7a182c54c82b7d7c5c0e68ffb3"},"recursive:writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5_integrity_receipt.json":{"bytes":3995,"path":"writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5_integrity_receipt.json","sha256":"59a2fd53e9e75f6f8ec258d76e103adb61c908ab0ace6718a348739f5b70d8bd"},"recursive:writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6_integrity_receipt.json":{"bytes":3933,"path":"writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6_integrity_receipt.json","sha256":"0c078ce52e2eb6d6feaeb1a1c2af1794ef33aef56aca7959f76a93f39d152692"},"recursive:writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7_integrity_receipt.json":{"bytes":2968,"path":"writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7_integrity_receipt.json","sha256":"912bc1391ff66c3fd704e61266de508adcf9ed587d7e136932508029b77cb956"},"recursive:writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_authority_r1.json":{"bytes":14887,"path":"writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_authority_r1.json","sha256":"1238f76e5da5184d16d33077bf3e5342033918fadb4eba84242c47cb1b1322cc"},"recursive:writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_receipt_r1.json":{"bytes":743,"path":"writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_receipt_r1.json","sha256":"fb65dddf0bc61b4c73b5dc5ec796967e65263e9d7bdc4882e07684e882280fdb"},"recursive:writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_official_ragged_sequence_topology.py":{"bytes":4154,"path":"writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_official_ragged_sequence_topology.py","sha256":"0b212043878ebfc7edb75929aa0cfe025df7eaf69bc526ed57b85e5cd0b4ba69"},"recursive:writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_official_ragged_sequence_topology_base_v1.py":{"bytes":19291,"path":"writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_official_ragged_sequence_topology_base_v1.py","sha256":"36104ee82636e611ec81cbd86d49962436bcceef3f51a026144e23046e0c7009"},"recursive:writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_official_ragged_sequence_topology_r2_child.py":{"bytes":6774,"path":"writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_official_ragged_sequence_topology_r2_child.py","sha256":"653add190345dfaa6b959dc875997b705b732a5b3ad1f9f4f620db7b2f6c104f"},"recursive:writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_official_ragged_sequence_topology_runtime_receipt.json":{"bytes":2561,"path":"writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_official_ragged_sequence_topology_runtime_receipt.json","sha256":"53b058a2032c424718a96757b3aa63df5160c20910001fcb128b0ace03a13a4c"},"recursive:writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_official_ragged_sequence_topology_runtime_summary.json":{"bytes":4513,"path":"writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_official_ragged_sequence_topology_runtime_summary.json","sha256":"31fd5a9e015b370681a9d2bacdc1b3ebce0e9408f0cf2835affa35596110460a"},"recursive:writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_topology_loss_v2.py":{"bytes":8067,"path":"writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_topology_loss_v2.py","sha256":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e"},"recursive:writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_r4.py":{"bytes":25227,"path":"writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_r4.py","sha256":"efc56a84cb82f30c0566da83a38bf0f02fdd507e02d116d827c1bbd827151ecf"},"recursive:writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_receipt_r4.json":{"bytes":2678,"path":"writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_receipt_r4.json","sha256":"654f5b9728c3dfd2588c4b570b0e3a1bcab8feb366af28eeead36f9beb37d921"},"recursive:writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_summary_r4.json":{"bytes":3228,"path":"writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_summary_r4.json","sha256":"ccd4b81d3afac8ae789c538e0af332f74f2468d403da1d243fefefd4df013538"},"recursive:writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_sequence_topology_bfs_replay_250_r1.json":{"bytes":160937,"path":"writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_sequence_topology_bfs_replay_250_r1.json","sha256":"75914916591d1db97a77d64b9e7a51e0f23526aeb87bd6e394d49c6583309469"},"recursive:writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_sequence_topology_bfs_replay_250_receipt_r1.json":{"bytes":928,"path":"writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_sequence_topology_bfs_replay_250_receipt_r1.json","sha256":"f20a1dd444f2760ccd8605d53ad716ceb55112fd32d3409826bcaf78ff2c6c3d"},"recursive:writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null.json":{"bytes":3278,"path":"writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null.json","sha256":"b10556643abf560b9e8622e8ae67936d2d3ca8867433db485e785f31d049a8fb"},"recursive:writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null_receipt.json":{"bytes":1340,"path":"writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null_receipt.json","sha256":"f4eb239f56e472d57dd3a3848c1a6c142e193cb326320ac8bf134b96ac35102a"},"recursive:writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_frozen_sequence_masking_runtime.py":{"bytes":12583,"path":"writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_frozen_sequence_masking_runtime.py","sha256":"831bebd2dcf6a8308d01ec62eb6e1132fe7edbbc666c1c83787335acc576b19c"},"recursive:writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_null_builder.py":{"bytes":17633,"path":"writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_null_builder.py","sha256":"269ed77c765432a515be2da7817d5d2ef4294c25d3095679ae14e19e2fe7db32"},"recursive:writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_sequence_null_probabilities.npy":{"bytes":17040,"path":"writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_sequence_null_probabilities.npy","sha256":"e48971c044a3a9bc3b9f496a13e916856c5a7203c29a3a67e22a58539e24bfb3"},"recursive:writing/review/multimodal/outputs/review_a5_static_graph_v2_authority_20260721_r7/review_a5_static_graph_v2_authority_r7.tsv.gz":{"bytes":14602716,"path":"writing/review/multimodal/outputs/review_a5_static_graph_v2_authority_20260721_r7/review_a5_static_graph_v2_authority_r7.tsv.gz","sha256":"59cf794d52341847b08aaa7f4212d1203dec4df89609157d924fda50d54f7602"},"recursive:writing/review/multimodal/outputs/review_a5_static_graph_v2_authority_20260721_r7/review_a5_static_graph_v2_authority_receipt_r7.json":{"bytes":2526,"path":"writing/review/multimodal/outputs/review_a5_static_graph_v2_authority_20260721_r7/review_a5_static_graph_v2_authority_receipt_r7.json","sha256":"0729fa35e7a34a51ee77d2752f008a783d582b845e6c8dd9ae694eb9edb61d9c"},"recursive:writing/review/multimodal/outputs/review_a5_static_graph_v2_authority_20260721_r7/review_a5_static_graph_v2_authority_summary_r7.json":{"bytes":7845,"path":"writing/review/multimodal/outputs/review_a5_static_graph_v2_authority_20260721_r7/review_a5_static_graph_v2_authority_summary_r7.json","sha256":"f95235a74962fd8aec04b0a14ad17aea3e2bcec27826102d5d26d3f907871908"},"recursive:writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_a5_official_ragged_topology_receipt.json":{"bytes":1625,"path":"writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_a5_official_ragged_topology_receipt.json","sha256":"333ee6f34e69f89e26b810cc565415b89d6874615ea4ac57850371fb159c1b71"},"recursive:writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_a5_official_ragged_topology_summary.json":{"bytes":775,"path":"writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_a5_official_ragged_topology_summary.json","sha256":"20ba6bc43acf968e332a03170e70942bb1db0d2e633a30d6403b79fa0b68f2c6"},"recursive:writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_lengths.npy":{"bytes":93175,"path":"writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_lengths.npy","sha256":"b52f6ddcf327b8cfc5159659bada97357216f9526b42c230a35192932f43d2f3"},"recursive:writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_offsets.npy":{"bytes":744512,"path":"writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_offsets.npy","sha256":"e06d61b8e47c2a2a3e0c8aeec7e015e673f64f0f483a483abe40ccda2d08b9e0"},"recursive:writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_roster.tsv":{"bytes":3890681,"path":"writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_roster.tsv","sha256":"a216ce485ea699fb1b66ed6915175a49cde8c7d14279dbaf835f4675bc7c7fa1"},"recursive:writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_row.npy":{"bytes":1124960,"path":"writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_row.npy","sha256":"a0ae28b0476322e3dbeda42a891f4a42c0973002a5d8507bf387b12dcbff4e95"},"recursive:writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_values.npy":{"bytes":5027730,"path":"writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_values.npy","sha256":"2d4ba8395f78864b7eed9ed250bb9fd50bd45ef84a10ed497ffb89c684276e4e"},"recursive:writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null.json":{"bytes":2970,"path":"writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null.json","sha256":"a752ffd350fbe38aa0e6f6b42b76137f4f72d76fa9a7f5d3609bc47c65c552de"},"recursive:writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null_receipt.json":{"bytes":902,"path":"writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null_receipt.json","sha256":"dace4cb5df71912f5aa7531bb0ce87db3b63d726b2a12aa41facabf9d54b5c35"},"recursive:writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_null_builder.py":{"bytes":17633,"path":"writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_null_builder.py","sha256":"269ed77c765432a515be2da7817d5d2ef4294c25d3095679ae14e19e2fe7db32"},"recursive:writing/review/multimodal/runtime/a5_ms_acquisition_top30_v3_20260721_r3/review_a5_ms_acquisition_top30_runtime_v3.py":{"bytes":43711,"path":"writing/review/multimodal/runtime/a5_ms_acquisition_top30_v3_20260721_r3/review_a5_ms_acquisition_top30_runtime_v3.py","sha256":"68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6"},"recursive:writing/review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r1/run_review_a5_native_eight_cuda_resume_diagnostic_r1.py":{"bytes":16614,"path":"writing/review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r1/run_review_a5_native_eight_cuda_resume_diagnostic_r1.py","sha256":"abb819d3f18a795b5305890960a96807a5724dc5c7ded74ba73772aa919dc403"},"recursive:writing/review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r2/run_review_a5_native_eight_cuda_resume_diagnostic_r2.py":{"bytes":4629,"path":"writing/review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r2/run_review_a5_native_eight_cuda_resume_diagnostic_r2.py","sha256":"e9bbb455ba9e16cca96f7aca330ff66d0de32b3332432c93b87bbd7d626e5e21"},"recursive:writing/review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r3_recursive_closure/review_a5_native_eight_cuda_resume_recursive_closure_r3.json":{"bytes":28514,"path":"writing/review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r3_recursive_closure/review_a5_native_eight_cuda_resume_recursive_closure_r3.json","sha256":"43c1627a3214a3ef8934a9b1e418681f4ab591fe908ffc2f6930b02889609f96"},"recursive:writing/review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r3_recursive_closure/run_review_a5_native_eight_cuda_resume_diagnostic_r3.py":{"bytes":18007,"path":"writing/review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r3_recursive_closure/run_review_a5_native_eight_cuda_resume_diagnostic_r3.py","sha256":"1eeab9e62e36e1c5be344a7d9df7f34b06006d06537fb0ca70de0a568e2c21ee"},"recursive:writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_r2.py":{"bytes":102990,"path":"writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_r2.py","sha256":"9f8f167148aa234df413e4c3d4e1846881781c8e5a19bd91b0b178b260a3a537"},"recursive:writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_r3.py":{"bytes":41304,"path":"writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_r3.py","sha256":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e"},"recursive:writing/review/multimodal/runtime/a5_native_eight_direct_static_bridge_20260724_r1/review_a5_native_eight_direct_static_bridge_r1.py":{"bytes":37921,"path":"writing/review/multimodal/runtime/a5_native_eight_direct_static_bridge_20260724_r1/review_a5_native_eight_direct_static_bridge_r1.py","sha256":"c71ba654568a24993bc1733b26b6863b11e5c198c53871a6183b485ab96540f0"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r1/review_a5_native_eight_hotpath_r1.py":{"bytes":33246,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r1/review_a5_native_eight_hotpath_r1.py","sha256":"3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/load_review_a5_native_eight_hotpath_r2.py":{"bytes":4127,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/load_review_a5_native_eight_hotpath_r2.py","sha256":"101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/review_a5_native_eight_hotpath_r2.py":{"bytes":32821,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/review_a5_native_eight_hotpath_r2.py","sha256":"941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/test_review_a5_native_eight_hotpath_r2.py":{"bytes":43561,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/test_review_a5_native_eight_hotpath_r2.py","sha256":"cce9b4c85cebea8d3df6b33dfa0a54ac2b6c03f7a15aa96fc88436710a4a74eb"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/load_review_a5_native_eight_hotpath_r3.py":{"bytes":4013,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/load_review_a5_native_eight_hotpath_r3.py","sha256":"e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/review_a5_native_eight_hotpath_r3.py":{"bytes":36449,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/review_a5_native_eight_hotpath_r3.py","sha256":"a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/test_review_a5_native_eight_hotpath_r3.py":{"bytes":22249,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/test_review_a5_native_eight_hotpath_r3.py","sha256":"0d9c387ff7d7314ca5645dd0fc052bd3a4f814637094c5901e5c7a51078ad07b"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/load_review_a5_native_eight_hotpath_r4.py":{"bytes":4013,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/load_review_a5_native_eight_hotpath_r4.py","sha256":"662d0766a8d68638480e9c44ca4070387481d43e1c666a20363025cf5b9bc958"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4.py":{"bytes":23798,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4.py","sha256":"600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/test_review_a5_native_eight_hotpath_r4.py":{"bytes":19081,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/test_review_a5_native_eight_hotpath_r4.py","sha256":"ebbbdb35644e84b566278fec702afdf7bb23b77cc0b9da7dec226d68feb0504d"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/load_review_a5_native_eight_hotpath_r5.py":{"bytes":4013,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/load_review_a5_native_eight_hotpath_r5.py","sha256":"864a05e86c5ea91318b11373d2cdffcdd2ddd0777f141cb7ef0305f779a42ea6"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5.py":{"bytes":17677,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5.py","sha256":"ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/test_review_a5_native_eight_hotpath_r5.py":{"bytes":20423,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/test_review_a5_native_eight_hotpath_r5.py","sha256":"fb36b4b6e474ecce6c61565a55e50092e6bbe8405d1e4bdd6032af4fdbdacd01"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/load_review_a5_native_eight_hotpath_r6.py":{"bytes":4013,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/load_review_a5_native_eight_hotpath_r6.py","sha256":"e2496170942db844e4ebe71d4c098b0d0cf99540d3465ed7e8e9a113469cf7d2"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6.py":{"bytes":17373,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6.py","sha256":"73b42e5131c64284c6f748ddf81b4d187dcb57f756c88c22240d189f2afc4cef"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/test_review_a5_native_eight_hotpath_r6.py":{"bytes":20399,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/test_review_a5_native_eight_hotpath_r6.py","sha256":"8acb8f578f94d6ad25a966615052bb1d3be0848914c513a02aa40970743986b3"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/load_review_a5_native_eight_hotpath_r7.py":{"bytes":4013,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/load_review_a5_native_eight_hotpath_r7.py","sha256":"fa9538829ff3ccfaf3d3f4346c7e735c70758661eb6bf3da5eece2e7e96e0fb6"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7.py":{"bytes":20454,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7.py","sha256":"c0cb618f7856daf24666dbec07ff51b86e3fbd52c073c58bd1b7151122714f47"},"recursive:writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/test_review_a5_native_eight_hotpath_r7.py":{"bytes":20804,"path":"writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/test_review_a5_native_eight_hotpath_r7.py","sha256":"08115565db0ab8e75b76cde340a8609c7f36727b8f32ba6e936608d04bd67bb8"},"recursive:writing/review/multimodal/runtime/a5_native_eight_submission_20260727_r15_preparation/__init__.py":{"bytes":70,"path":"writing/review/multimodal/runtime/a5_native_eight_submission_20260727_r15_preparation/__init__.py","sha256":"71acc02bbdc797924631115278a47fa8ca934e032027def2c4793d11f63a04ac"},"recursive:writing/review/multimodal/runtime/a5_native_eight_submission_20260727_r15_preparation/review_a5_native_eight_submission_contract_r15.py":{"bytes":29305,"path":"writing/review/multimodal/runtime/a5_native_eight_submission_20260727_r15_preparation/review_a5_native_eight_submission_contract_r15.py","sha256":"35c7a13da662f49bec07b63f590c8fb3d9cc4578633a179da42ff2650a2d7865"},"recursive:writing/review/multimodal/runtime/a5_native_eight_submission_20260727_r15_preparation/test_review_a5_native_eight_submission_contract_r15.py":{"bytes":11109,"path":"writing/review/multimodal/runtime/a5_native_eight_submission_20260727_r15_preparation/test_review_a5_native_eight_submission_contract_r15.py","sha256":"0769e6185df0451651804b84345a7ab651f9425299eef53717b6377fa86e6e78"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260722_r1/review_a5_native_eight_training_runner_r1.py":{"bytes":97336,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260722_r1/review_a5_native_eight_training_runner_r1.py","sha256":"34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/review_a5_native_eight_training_runner_r2.py":{"bytes":74326,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/review_a5_native_eight_training_runner_r2.py","sha256":"7e93b13b3212b3c97e30144f3e393a86a13411d5e82fe19bd55d43bc58587e30"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/review_a5_native_eight_training_runner_r3.py":{"bytes":25611,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/review_a5_native_eight_training_runner_r3.py","sha256":"550588ca033718273de2e35825b8b9faffe4a5fb747ff8775fe17bb31050d9be"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/review_a5_native_eight_training_runner_r8.py":{"bytes":11844,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/review_a5_native_eight_training_runner_r8.py","sha256":"cbc9fc0179ecb1e7c449fa37a574f38ff3e912e13db5c984d87e05e3e347a0e1"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/review_a5_native_eight_training_runner_r9.py":{"bytes":7443,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/review_a5_native_eight_training_runner_r9.py","sha256":"4430560565a18da0e68700d60526d3dec15fabd79854111d1e85deb59e2381c8"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_training_runner_r12.py":{"bytes":23200,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_training_runner_r12.py","sha256":"47e973c7c4ed5bc6686e5d7795b00d3eea5c2da8c2a15fc534a7cc24c1744ee1"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/__init__.py":{"bytes":77,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/__init__.py","sha256":"773035c83f54a5d7b002faa1d2f1f670b41546692eea8aa4efc46b2c5d4eb268"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py":{"bytes":2946,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py","sha256":"c30b6b03dae852a4b10c6d01596e977d8a071e738dc3074f1ca0592a50778dd3"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py":{"bytes":60696,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py","sha256":"17cf8ab216b354ec1de7574ebebd7bfe02b5935da605b4131e45c7aa13982d5b"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/test_review_a5_native_eight_r13.py":{"bytes":56262,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/test_review_a5_native_eight_r13.py","sha256":"1fb1a9cbf6149f706786301fa57644cde5db57eb068fbc754fc939303f25b425"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/__init__.py":{"bytes":74,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/__init__.py","sha256":"737b1caa9086f8ac1556c05625d1b5391b8cae58e9d98a7755fa72f44e94c7ba"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_final_bindings_r14.py":{"bytes":5726,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_final_bindings_r14.py","sha256":"bd6c704239e2bb4898dddda5c86274f41cd5b304b35d584ddfae3884e8bc8503"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_strict_successor_r14.py":{"bytes":46942,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_strict_successor_r14.py","sha256":"eda983e1b0c29357eb1b6e2f555f402a83b7176fb857488e9be5f5faed490b2d"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/test_review_a5_native_eight_strict_successor_r14.py":{"bytes":20070,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/test_review_a5_native_eight_strict_successor_r14.py","sha256":"0de5bbc59ca7c00dca89286d0519ffcdcbead8014175c0aba8f798739f50c2cd"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/__init__.py":{"bytes":72,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/__init__.py","sha256":"7ef11d9a891d32b0c1bb3ee24016700acd14251ac49448f004a701cdea79ca53"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_bindings_r15.py":{"bytes":2041,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_bindings_r15.py","sha256":"1f21427486260e8b56795f7137f0f7322ae768d80645db6636414e5961aa3224"},"recursive:writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_gate_r15.py":{"bytes":41461,"path":"writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_gate_r15.py","sha256":"1556d6e2643edfc80b6b6782164ab47560e259ff55791c50dcffdd9b9afc001f"},"recursive:writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_balanced_planner_r4.py":{"bytes":25544,"path":"writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_balanced_planner_r4.py","sha256":"2c985edfe747bae712c41689da8be2abb5096bd97a8771691b3676d3a8af49fd"},"recursive:writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_composite_r4.py":{"bytes":70358,"path":"writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_composite_r4.py","sha256":"52a311636e7631b97711aab63aec28e2ada47a446d1aecc1a47921d584f69f9d"},"recursive:writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_balanced_planner_r5.py":{"bytes":16021,"path":"writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_balanced_planner_r5.py","sha256":"1b9b05c812603db7b216aa989214a3c3715f80032b3a8b82577ae2b9e48f048d"},"recursive:writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_composite_r5.py":{"bytes":58459,"path":"writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_composite_r5.py","sha256":"24c35257fc61e1c9c77630d2b0075775a7f46b6500ecb5f175ef8f42bd214e0e"},"recursive:writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_executor_r5.py":{"bytes":74648,"path":"writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_executor_r5.py","sha256":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2"},"recursive:writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_r4_lineage_receipt_r1.json":{"bytes":1716,"path":"writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_r4_lineage_receipt_r1.json","sha256":"b5fbdff168de23676208484ccccc3cc32f613ea411d193e6d8930456e8edeeef"},"recursive:writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r6/review_a5_native_eight_executor_r6.py":{"bytes":89792,"path":"writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r6/review_a5_native_eight_executor_r6.py","sha256":"e47e6e9810db0e8ec9d37ce5533f762e287b162f811bfadc347666f5ad78db82"},"recursive:writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r7/review_a5_native_eight_executor_r7.py":{"bytes":130802,"path":"writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r7/review_a5_native_eight_executor_r7.py","sha256":"e068a3c233fc3fd94fe3b8618edb9bd8c87fd81b97dff2666206fb870f0f898a"},"recursive:writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r8/review_a5_native_eight_executor_r8.py":{"bytes":52743,"path":"writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r8/review_a5_native_eight_executor_r8.py","sha256":"60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630"},"recursive:writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/review_a5_static_v2_postfit_direct_publication_r2.py":{"bytes":40020,"path":"writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/review_a5_static_v2_postfit_direct_publication_r2.py","sha256":"8e57c17fd43f3894f94f980cf70a0d6d7f183cf04c26780c3fe30c1932bb7abb"},"recursive:writing/review/multimodal/scripts/build_review_a5_native_eight_cuda_resume_r4_closure_20260727.js":{"bytes":5349,"path":"writing/review/multimodal/scripts/build_review_a5_native_eight_cuda_resume_r4_closure_20260727.js","sha256":"06d03f6e5fc65216b3552951f908b3bf9b92fe2bb9d8c0ebe8af4b65575c09c2"},"recursive:writing/review/multimodal/scripts/build_review_a5_native_eight_r11_successor_20260726_r14.py":{"bytes":4336,"path":"writing/review/multimodal/scripts/build_review_a5_native_eight_r11_successor_20260726_r14.py","sha256":"7d2d2657201e344a3c5fd8c1fca60d41a9f304ce8b15b5e47cd937fe21220479"},"recursive_closure_manifest":{"bytes":34753,"path":"/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_native_eight_cuda_resume_diagnostic_20260727_r4_load_boundary_fix/review_a5_native_eight_cuda_resume_recursive_closure_r4.json","sha256":"8b920e99c188996f0abdf53bf26f8b07be61fdc0cf3e827d614d0e755087e871"}},"status":"PASS_REAL_CUDA_R7_BOTH_LOADS_EXACT_RESUME_DRAWS_AND_DEVICE_RECEIPT","synthetic_diagnostic_device_receipt_boundary":{"device_receipt":{"accelerator_model_constraint":null,"compute_capability":[7,0],"cuda_runtime":"12.8","cudnn_version":91002,"device":"cuda:0","generic_gpu_request":"gpu:1","multiprocessor_count":80,"name":"Tesla V100-SXM2-32GB","receipt_sha256":"6764e1b1f64316a51731661bdbc345cea0a9a7d4dd9f1535c6fed4c58df66699","torch_version":"2.9.1+cu128","total_memory_bytes":34072559616},"fixture_local_original_function":"_device_receipt_r2","fixture_local_replacement_function":"synthetic_diagnostic_device_receipt","inherited_live_cuda_identity_function_used":true,"production_live_cell_claim_requested":false,"production_runtime_source_modified":false,"r7_source_modified":false},"synthetic_isolated_fixture":true,"training_authorized":false} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/review_checkpoints_r1/review_checkpoint_index.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/review_checkpoints_r1/review_checkpoint_index.json new file mode 100644 index 0000000000000000000000000000000000000000..6e7f5f52bcb367895d6da9203e78d4055f3d0ed2 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/review_checkpoints_r1/review_checkpoint_index.json @@ -0,0 +1 @@ +{"cell_id":"A111","generation":1,"index_sha256":"68c0dedf930e9e4cb54f58a8cf2ab15fe6a52a2c0567b68873265856d67cc087","roles":{"best":{"bytes":1683243,"development_loss":1.0,"epoch":1,"filename":"review_checkpoint_payload_e001_6885400540a9701725519e4e476cfbca0dec700836c52c0777e9ae5858ef6bb3.pt","sha256":"6885400540a9701725519e4e476cfbca0dec700836c52c0777e9ae5858ef6bb3"},"latest":{"bytes":1683243,"development_loss":1.0,"epoch":1,"filename":"review_checkpoint_payload_e001_6885400540a9701725519e4e476cfbca0dec700836c52c0777e9ae5858ef6bb3.pt","sha256":"6885400540a9701725519e4e476cfbca0dec700836c52c0777e9ae5858ef6bb3"},"milestones":{}},"run_identity_sha256":"d35d4d8041d8a5448c68584b0c8ab9b0aeaa939fee7b1fe4fca1b606aef92f9a","schema":"bertose_review_a5_native_eight_checkpoint_index_20260722_r3"} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r1/review_a5_native_eight_data_adapter_receipt_r1.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r1/review_a5_native_eight_data_adapter_receipt_r1.json new file mode 100644 index 0000000000000000000000000000000000000000..bac3951b0fa40d51388e240111db8f99a7ae21b6 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r1/review_a5_native_eight_data_adapter_receipt_r1.json @@ -0,0 +1,95 @@ +{ + "artifacts": { + "development_manifest": { + "bytes": 3982015, + "canonical_row_surface_sha256": "92f46de77c5e1831f01dbe4f672bad19b180d8fb0ea6798040bd07ed7009112b", + "name": "review_a5_native_eight_joined_development_manifest_r1.tsv.gz", + "rows": 55440, + "sha256": "4eea50c1bd4eee0ea10062c287f31c619cef5835e2e660facd098698859f7e70" + }, + "train_manifest": { + "bytes": 15455767, + "canonical_row_surface_sha256": "94f8e3b13bf95bed3f2768c9303d8602ecfa78d3c1d7956699c68856f33e8eef", + "name": "review_a5_native_eight_joined_train_manifest_r1.tsv.gz", + "rows": 221827, + "sha256": "13b7ebc78b22baa1a38d2ae40da202dcc1e20e56f44220b4d4d5003ca5f3b8f2" + } + }, + "authority_bindings": { + "composite_r5": "24c35257fc61e1c9c77630d2b0075775a7f46b6500ecb5f175ef8f42bd214e0e", + "executor_r5": "a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2", + "ms_authority": "48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4", + "ms_certificate": "53098620a5c22dafdc951ba743515b4b10b1673c02f0aa4d881db669584902fa", + "ms_receipt": "f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4", + "ms_runtime": "68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6", + "planner_r5": "1b9b05c812603db7b216aa989214a3c3715f80032b3a8b82577ae2b9e48f048d", + "sequence_receipt": "53b058a2032c424718a96757b3aa63df5160c20910001fcb128b0ace03a13a4c", + "sequence_runtime": "0b212043878ebfc7edb75929aa0cfe025df7eaf69bc526ed57b85e5cd0b4ba69", + "sequence_summary": "31fd5a9e015b370681a9d2bacdc1b3ebce0e9408f0cf2835affa35596110460a", + "static_r7_authority": "59cf794d52341847b08aaa7f4212d1203dec4df89609157d924fda50d54f7602", + "static_r7_receipt": "0729fa35e7a34a51ee77d2752f008a783d582b845e6c8dd9ae694eb9edb61d9c", + "static_r7_summary": "f95235a74962fd8aec04b0a14ad17aea3e2bcec27826102d5d26d3f907871908" + }, + "availability_pattern_counts": { + "development": { + "000": 37213, + "001": 238, + "010": 339, + "011": 0, + "100": 12351, + "101": 5058, + "110": 147, + "111": 94 + }, + "train": { + "000": 147444, + "001": 978, + "010": 1491, + "011": 0, + "100": 49345, + "101": 21605, + "110": 567, + "111": 397 + } + }, + "counts": { + "development_sequence_parents": 55440, + "ms_development_acquisitions": 49573, + "ms_development_parents": 580, + "ms_train_parents": 2455, + "static_development_parents": 5390, + "static_development_states": 7964, + "static_exact_single_state_parents": 14368, + "static_open_unspecified_two_state_parents": 8951, + "static_train_parents": 22980, + "static_train_states": 34408, + "static_unknown_x_anomer_two_state_parents": 5051, + "topology_development_parents": 17650, + "topology_train_parents": 71914, + "train_sequence_parents": 221827 + }, + "execution_certified": false, + "gpu_launch_authorized": false, + "join_contract": { + "ms": "exact_parent_id_role_and_canonical_wurcs", + "official_or_submitted_artifacts_modified": false, + "sequence_topology": "authoritative_sequence_row_parent_role_and_topology_row", + "static": "exact_parent_id_and_role; preserve parent canonical WURCS plus every R7 state effective WURCS; x-anomer or open/unspecified parent identities expand only through the R7-declared alpha/beta states" + }, + "nova_submission_authorized": false, + "runtime_source": { + "bytes": 79461, + "name": "review_a5_native_eight_data_adapter_r1.py", + "sha256": "bc34703f189f240a27282542a4e6268b8eeab7d92ad276dc0e375efa66841ce1" + }, + "schema": "bertose_a5_native_eight_data_adapter_receipt_20260721_r1", + "scientific_launch_authorized": false, + "split_roster_sha256": { + "development": "dbadd12a88e29cc1a7ca1da85895d89f0162fa8bc9f3dcf8aebf5b8781a1e698", + "train": "2a7c8121c9ec88418e930cdec47302b7ef2b4d92e01fafa523218461a249de6e" + }, + "static_active_production_materialization_authorized": false, + "static_final_token_package_bound": false, + "status": "PASS_IMMUTABLE_JOIN_PREPARATION_ONLY_STATIC_TOKENS_ABSENT", + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_receipt_r2.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_receipt_r2.json new file mode 100644 index 0000000000000000000000000000000000000000..95d272e2210a01714915e4dbb74aacfff9564797 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_receipt_r2.json @@ -0,0 +1 @@ +{"affinose_supported":false,"authority_bindings":{"adapter_r1_receipt":"cacec838740d64a493c2e56fd1efa8a85ba7d11fce3ec26e40905c33db05e58d","composite_r5":"24c35257fc61e1c9c77630d2b0075775a7f46b6500ecb5f175ef8f42bd214e0e","executor_r5":"a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2","joined_development_manifest_r1":"4eea50c1bd4eee0ea10062c287f31c619cef5835e2e660facd098698859f7e70","joined_train_manifest_r1":"13b7ebc78b22baa1a38d2ae40da202dcc1e20e56f44220b4d4d5003ca5f3b8f2","ms_authority":"48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4","ms_certificate":"53098620a5c22dafdc951ba743515b4b10b1673c02f0aa4d881db669584902fa","ms_parent_manifest":"10dc3fa7622e2a7e448d775f4082fdc84aa0622f9a7a74bcfaeed491c0eb7d39","ms_receipt":"f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4","ms_runtime":"68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6","planner_r5":"1b9b05c812603db7b216aa989214a3c3715f80032b3a8b82577ae2b9e48f048d","planner_r5_certificate":"4b3198f26e45d84ffced87280e7ac6cd59932bb92cf4da66db1eefb099b897bf","sequence_mask_runtime":"831bebd2dcf6a8308d01ec62eb6e1132fe7edbbc666c1c83787335acc576b19c","sequence_null":"b10556643abf560b9e8622e8ae67936d2d3ca8867433db485e785f31d049a8fb","sequence_null_receipt":"f4eb239f56e472d57dd3a3848c1a6c142e193cb326320ac8bf134b96ac35102a","sequence_package_receipt":"399df3de2b6c4d5e88aa442c8326214ab9cff2e8f0411e6921762bbade1475ba","sequence_receipt":"53b058a2032c424718a96757b3aa63df5160c20910001fcb128b0ace03a13a4c","sequence_runtime":"0b212043878ebfc7edb75929aa0cfe025df7eaf69bc526ed57b85e5cd0b4ba69","sequence_summary":"31fd5a9e015b370681a9d2bacdc1b3ebce0e9408f0cf2835affa35596110460a","static_r7_authority":"59cf794d52341847b08aaa7f4212d1203dec4df89609157d924fda50d54f7602","static_r7_receipt":"0729fa35e7a34a51ee77d2752f008a783d582b845e6c8dd9ae694eb9edb61d9c","static_r7_summary":"f95235a74962fd8aec04b0a14ad17aea3e2bcec27826102d5d26d3f907871908","topology_null":"a752ffd350fbe38aa0e6f6b42b76137f4f72d76fa9a7f5d3609bc47c65c552de","topology_null_receipt":"dace4cb5df71912f5aa7531bb0ce87db3b63d726b2a12aa41facabf9d54b5c35","topology_package_receipt":"333ee6f34e69f89e26b810cc565415b89d6874615ea4ac57850371fb159c1b71"},"cells":["A000","A100","A010","A001","A110","A101","A011","A111"],"common_seed":43,"downstream_supported":false,"execution_certified":false,"fresh_corrected_fit_required_for_all_cells":true,"gpu_launch_authorized":false,"historical_a000_a111_reuse_for_training":false,"nova_submission_authorized":false,"official_or_submitted_artifacts_modified":false,"reused_r1_artifacts":{"development_manifest":{"bytes":3982015,"canonical_row_surface_sha256":"92f46de77c5e1831f01dbe4f672bad19b180d8fb0ea6798040bd07ed7009112b","name":"review_a5_native_eight_joined_development_manifest_r1.tsv.gz","rows":55440,"sha256":"4eea50c1bd4eee0ea10062c287f31c619cef5835e2e660facd098698859f7e70"},"train_manifest":{"bytes":15455767,"canonical_row_surface_sha256":"94f8e3b13bf95bed3f2768c9303d8602ecfa78d3c1d7956699c68856f33e8eef","name":"review_a5_native_eight_joined_train_manifest_r1.tsv.gz","rows":221827,"sha256":"13b7ebc78b22baa1a38d2ae40da202dcc1e20e56f44220b4d4d5003ca5f3b8f2"}},"runtime_source":{"bytes":102990,"name":"review_a5_native_eight_data_adapter_r2.py","sha256":"9f8f167148aa234df413e4c3d4e1846881781c8e5a19bd91b0b178b260a3a537"},"schema":"bertose_a5_native_eight_data_adapter_receipt_20260721_r2","scientific_launch_authorized":false,"static_active_production_materialization_authorized":false,"static_final_token_package_bound":false,"status":"PASS_PREPARATION_ONLY_STATIC_FINAL_TOKENS_ABSENT_LAUNCH_CLOSED","training_authorized":false,"world_size":1} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_receipt_r3.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_receipt_r3.json new file mode 100644 index 0000000000000000000000000000000000000000..0800b0c22c351c48311b1e0ac39e34616d9e974f --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_receipt_r3.json @@ -0,0 +1 @@ +{"affinose_supported":false,"cells":["A000","A100","A010","A001","A110","A101","A011","A111"],"common_seed":43,"downstream_supported":false,"execution_certified":false,"external_authority_bindings":{"adapter_r2_receipt":"3b2118e128a5550ba4918b4f4f2c6d8045e319b7cff37b76d74dce6b3220c9f0","adapter_r2_source":"9f8f167148aa234df413e4c3d4e1846881781c8e5a19bd91b0b178b260a3a537","ms_authority":"48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4","ms_certificate":"53098620a5c22dafdc951ba743515b4b10b1673c02f0aa4d881db669584902fa","ms_parent_manifest":"10dc3fa7622e2a7e448d775f4082fdc84aa0622f9a7a74bcfaeed491c0eb7d39","ms_receipt":"f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4","ms_runtime":"68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6","scientific_boundary_authority":"1238f76e5da5184d16d33077bf3e5342033918fadb4eba84242c47cb1b1322cc","scientific_boundary_receipt":"fb65dddf0bc61b4c73b5dc5ec796967e65263e9d7bdc4882e07684e882280fdb","sequence_topology_r3_predecessor_receipt":"53b058a2032c424718a96757b3aa63df5160c20910001fcb128b0ace03a13a4c","sequence_topology_r4_bfs_receipt":"f20a1dd444f2760ccd8605d53ad716ceb55112fd32d3409826bcaf78ff2c6c3d","sequence_topology_r4_bfs_result":"75914916591d1db97a77d64b9e7a51e0f23526aeb87bd6e394d49c6583309469","sequence_topology_r4_receipt":"654f5b9728c3dfd2588c4b570b0e3a1bcab8feb366af28eeead36f9beb37d921","sequence_topology_r4_runtime":"efc56a84cb82f30c0566da83a38bf0f02fdd507e02d116d827c1bbd827151ecf","sequence_topology_r4_summary":"ccd4b81d3afac8ae789c538e0af332f74f2468d403da1d243fefefd4df013538","static_r7_authority":"59cf794d52341847b08aaa7f4212d1203dec4df89609157d924fda50d54f7602","static_r7_receipt":"0729fa35e7a34a51ee77d2752f008a783d582b845e6c8dd9ae694eb9edb61d9c","static_r7_summary":"f95235a74962fd8aec04b0a14ad17aea3e2bcec27826102d5d26d3f907871908","topology_loss_source":"64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e"},"fixed_loss_coefficients":[1,"topology_bit","ms_bit","static_bit"],"fixed_loss_denominator":4,"gpu_launch_authorized":false,"md_supported":false,"nova_submission_authorized":false,"official_or_submitted_artifacts_modified":false,"predecessor_adapter_r2":{"receipt_sha256":"3b2118e128a5550ba4918b4f4f2c6d8045e319b7cff37b76d74dce6b3220c9f0","source_sha256":"9f8f167148aa234df413e4c3d4e1846881781c8e5a19bd91b0b178b260a3a537"},"provenance_fields":["sequence_rows","roles","seq_token_categories","topology_rows","topology_residue_counts","topology_target_counts"],"runtime_source":{"bytes":41304,"name":"review_a5_native_eight_data_adapter_r3.py","sha256":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e"},"schema":"bertose_a5_native_eight_data_adapter_receipt_20260721_r3","scientific_launch_authorized":false,"static_active_production_materialization_authorized":false,"static_final_token_package_bound":false,"status":"PASS_PREPARATION_ONLY_R4_BOUND_STATIC_FINAL_TOKENS_ABSENT_LAUNCH_CLOSED","training_authorized":false,"weight_ablation_supported":false} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_verification_receipt_r1.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_verification_receipt_r1.json new file mode 100644 index 0000000000000000000000000000000000000000..3032979d6255b5313d297a61f870a208f097026f --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_verification_receipt_r1.json @@ -0,0 +1 @@ +{"affinose_supported":false,"artifacts":{"migration_handoff":{"bytes":4796,"name":"review_a5_native_eight_adapter_r3_r4_migration_handoff_20260721.md","sha256":"400bcb62d730f8449060f9becbacbec89e90f64c487be0d35c3dc43067e74c0e"},"release_receipt":{"bytes":3016,"name":"review_a5_native_eight_data_adapter_receipt_r3.json","sha256":"e29df7a91d0c30238abe9155e600fb1b77b0d3d3481f6599d2ca0d2185371b9f"},"runtime_source":{"bytes":41304,"name":"review_a5_native_eight_data_adapter_r3.py","sha256":"a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e"},"test_source":{"bytes":14372,"name":"test_review_a5_native_eight_data_adapter_r3_20260721.py","sha256":"44d54ed68291527ae98c2f5970ea339d791f8372a7a5d5a5b114b5a10f5d5360"}},"contracts":{"collate_only_through_r4_store":true,"corrected_scientific_boundary_bound":true,"direct_ms_v3_authorities_bound":true,"direct_static_r7_authorities_bound":true,"eight_fresh_seed43_cells":true,"explicit_frozen_r3_predecessor":true,"fixed_coefficients_constant_denominator_4":true,"r4_masker_only_sequence_checkpoint_restore":true,"r4_provenance_fields_retained":["sequence_rows","roles","seq_token_categories","topology_rows","topology_residue_counts","topology_target_counts"],"receipt_bound_topology_loss":true,"rows_only_through_r4_store_sample":true,"static_active_materialization_blocked":true},"downstream_supported":false,"execution_certified":false,"gpu_launch_authorized":false,"identities":{"a000_epoch_2_step_0_sha256":"05ac100b4f77b0ff33e126fe5560b24d7c4f732d07987862acbde8dcea6ee61c","adapter_contract_sha256":"a3b681f307bad96abb8e446eb8efd769f29ccb65728d424295c89c9ba065224f","authority_set_sha256":"7804332dfc2be432b45f6a82459f21f0b577fc5c358f16b1fea90ba4cb6bb52f","epoch_2_plan_sha256":"b3bdd276a7582748937c461e5c2ba6f927068c380af7d52eb3ad14701ad97330","store_manifest_identity_sha256":"7bd44c2f15715924bce78c7bbdbe57d40fc69aaf90ed834e17d9632bded0fc17"},"md_supported":false,"nova_submission_authorized":false,"publication":{"no_overwrite":true,"official_or_submitted_artifacts_modified":false,"receipt_written_last":true},"schema":"bertose_a5_native_eight_data_adapter_r3_verification_receipt_20260721_r1","scientific_launch_authorized":false,"status":"PASS_PREPARATION_ONLY_R4_MIGRATION_CERTIFIED_LAUNCH_CLOSED","tests":{"adapter_r3":{"clean_process_replays":2,"failed":0,"passed":11,"warnings":0},"certified_r4_runtime":{"failed":0,"passed":12,"warnings":0},"combined_passed":33,"independent_readback":{"remaining_p0":0,"remaining_p1":0,"remaining_p2":0,"status":"PASS"},"predecessor_adapter_r2":{"failed":0,"passed":10,"warnings":0}},"training_authorized":false,"weight_ablation_supported":false} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4_integrity_receipt.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4_integrity_receipt.json new file mode 100644 index 0000000000000000000000000000000000000000..661e70132036a6d3d44d2a7a75f2a0d97441be89 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4_integrity_receipt.json @@ -0,0 +1,115 @@ +{ + "authorization": { + "nova_accessed": false, + "nova_submission_authorized": false, + "production_epoch_executed": false, + "scientific_launch_authorized": false, + "training_authorized": false + }, + "caveats": { + "cuda_available_in_certification_environment": false, + "cuda_disposable_generator_positive_path_executed": false, + "cuda_state_behavior": "R4 requires a CPU uint8 CUDA state and a live CUDA runtime, then calls set_state on a disposable torch.Generator bound to the executor's exact CUDA device; when no executor is available it uses the current CUDA device, and without CUDA any CUDA-bearing checkpoint fails closed before mutation", + "scientific_or_training_semantics_changed": false, + "test_scope": "isolated one-step exact-R9 checkpoint/resume fixture plus frozen predecessor/controller regressions; no production epoch or Nova execution" + }, + "closure": { + "loader": { + "bytes": 4013, + "mode": "0444", + "path": "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/load_review_a5_native_eight_hotpath_r4.py", + "sha256": "662d0766a8d68638480e9c44ca4070387481d43e1c666a20363025cf5b9bc958" + }, + "runtime": { + "bytes": 23798, + "mode": "0444", + "path": "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4.py", + "sha256": "600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649" + }, + "test": { + "bytes": 19081, + "mode": "0444", + "path": "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/test_review_a5_native_eight_hotpath_r4.py", + "sha256": "ebbbdb35644e84b566278fec702afdf7bb23b77cc0b9da7dec226d68feb0504d" + } + }, + "guards": { + "checkpoint_creation_chain_recomputed_from_exact_one_per_step_identity_list": true, + "checkpoint_creation_or_manager_verified_load_provenance_required": true, + "checkpoint_cursor_prevalidated_before_model_optimizer_state_mutation": true, + "checkpoint_history_max_epochs": 100, + "checkpoint_lightweight_provenance_fields": [ + "step_identity_chain_sha256", + "epoch", + "plan_sha256", + "run_identity_sha256", + "cell_id", + "trusted_manager_entry_sha256_on_load" + ], + "checkpoint_lightweight_provenance_retired_after_successful_commit_or_restore": true, + "checkpoint_restore_chain_recomputed_from_step_identities": false, + "checkpoint_top_level_chain_equals_last_development_history_row_at_commit": true, + "checkpoint_top_level_chain_equals_last_development_history_row_at_validation": true, + "development_history_epochs_sequential_from_one": true, + "development_history_step_chain_fields_exact_lowercase_sha256": true, + "invalid_rng_rejected_before_model_optimizer_or_global_rng_mutation": true, + "additional_full_model_optimizer_or_checkpoint_state_hashes": 0, + "numpy_state_exact_serialized_shape_and_types": { + "cached_gaussian": "finite builtin float", + "has_gauss": "builtin int in {0,1}", + "keys": "plain CPU contiguous torch.int64 tensor shape [624], values in uint32 range", + "name": "builtin str exactly MT19937", + "position": "builtin int in [0,624]" + }, + "python_state_parsed_by_disposable_random_instance": true, + "torch_cpu_state_parsed_by_disposable_generator_set_state": true, + "torch_cuda_state_parsed_by_disposable_generator_set_state": true, + "valid_checkpoint_bytes_changed": false + }, + "predecessor_r3": { + "loader": { + "bytes": 4013, + "sha256": "e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30" + }, + "receipt": { + "bytes": 2464, + "sha256": "bbce190f463159fe5ed7f80d317ec84e93c08d3119bcd0ee343a3793a13cd8ba" + }, + "runtime": { + "bytes": 36449, + "sha256": "a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd" + }, + "test": { + "bytes": 22249, + "sha256": "0d9c387ff7d7314ca5645dd0fc052bd3a4f814637094c5901e5c7a51078ad07b" + } + }, + "r13_nonmutation": { + "frozen_runner": { + "bytes": 55423, + "sha256": "f5d5eceff5377c7146f9ee000559483f2779117661945342fd112059a1c7a6b1" + }, + "frozen_test": { + "bytes": 49920, + "sha256": "765b20221105571ae8aa031d7926130ea604172824472b633d404ff1f28abaf5" + }, + "current_frozen_r13_accepts_r4_receipt": false, + "integration_note": "R4 intentionally omits R3's broad cursor-prevalidation claim and exposes the narrower model/optimizer boundary; a future no-overwrite R13 successor must bind this exact R4 surface." + }, + "schema": "bertose_review_a5_native_eight_hotpath_integrity_receipt_20260726_r4", + "status": "PASS_LOCAL_EXACT_INTEGRITY_SUCCESSOR_PREPARATION_ONLY_LAUNCH_CLOSED", + "tests": { + "certification_process_order": [ + "fresh_interpreter_1_frozen_r3_8_of_8_pass_warning_fatal", + "fresh_interpreter_2_frozen_r13_invocation_collected_no_tests_due_missing_PYTHONPATH", + "fresh_interpreter_3_frozen_r13_19_of_19_pass_warning_fatal_with_PYTHONPATH", + "fresh_interpreter_4_r4_7_of_7_pass_warning_fatal", + "fresh_interpreter_5_r4_after_final_provenance_revision_7_of_7_pass_warning_fatal" + ], + "fresh_interpreter_note": "Each listed command was a separate OS Python process. The first R13 invocation was an environment-path invocation error, not a test failure; the corrected fresh process collected and passed all 19 tests. The final R4 process ran after replacement of recursive checkpoint fingerprinting with lightweight chain/epoch/plan/run/cell provenance.", + "frozen_r13_regression": "19/19 PASS warning-fatal", + "frozen_r3_regression": "8/8 PASS warning-fatal", + "no_pycache_in_r4_runtime_tree": true, + "r4_focused": "7/7 PASS warning-fatal" + } +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5_integrity_receipt.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5_integrity_receipt.json new file mode 100644 index 0000000000000000000000000000000000000000..ff665d2df80cbd81423ce0dc8d0e532538c4dc23 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5_integrity_receipt.json @@ -0,0 +1,98 @@ +{ + "authorization": { + "nova_accessed": false, + "nova_submission_authorized": false, + "production_epoch_executed": false, + "scientific_launch_authorized": false, + "training_authorized": false + }, + "closure": { + "loader": { + "bytes": 4013, + "mode": "0444", + "path": "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/load_review_a5_native_eight_hotpath_r5.py", + "sha256": "864a05e86c5ea91318b11373d2cdffcdd2ddd0777f141cb7ef0305f779a42ea6" + }, + "runtime": { + "bytes": 17677, + "mode": "0444", + "path": "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5.py", + "sha256": "ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8" + }, + "test": { + "bytes": 20423, + "mode": "0444", + "path": "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/test_review_a5_native_eight_hotpath_r5.py", + "sha256": "fb36b4b6e474ecce6c61565a55e50092e6bbe8405d1e4bdd6032af4fdbdacd01" + } + }, + "guards": { + "abandoned_created_or_loaded_checkpoint_gc_cleanup": true, + "additional_full_model_optimizer_or_checkpoint_state_hashes": 0, + "checkpoint_bytes_changed": false, + "commit_success_and_failure_cleanup": true, + "deterministic_id_reuse_simulation_rejected": true, + "history_epoch_chain_pair_digest": { + "domain": "bertose-review-a5-native8-history-chain-pairs-20260726-r5", + "maximum_rows": 100, + "scope": "all sequential epoch and step_identity_chain_sha256 pairs" + }, + "provenance_identity_binding": [ + "strong development_history owner identity", + "weak Torch CPU RNG tensor identity sentinel", + "chain", + "history-pair digest", + "epoch", + "plan_sha256", + "run_identity_sha256", + "cell_id", + "trusted manager entry SHA on load" + ], + "restore_success_and_failure_cleanup": true, + "validation_failure_cleanup": true + }, + "integration": { + "current_r13_binding_sha256": "c30b6b03dae852a4b10c6d01596e977d8a071e738dc3074f1ca0592a50778dd3", + "current_r13_runner_sha256": "17cf8ab216b354ec1de7574ebebd7bfe02b5935da605b4131e45c7aa13982d5b", + "current_r13_test_sha256": "1fb1a9cbf6149f706786301fa57644cde5db57eb068fbc754fc939303f25b425", + "exact_source_chain": [ + "R5 exact-byte loader/runtime", + "current exact R13 runner", + "R13-pinned exact R12 predecessor", + "R13-pinned exact R11 release gate", + "R13-pinned exact R9 runtime" + ], + "fresh_process_result": "PASS_EXACT_R5_R13_R12_R11_R9", + "optimization_kind_on_current_r13_surface": "r4_successor_over_frozen_r3", + "outer_scientific_launch_authorized": false, + "predecessor_r3_scientific_launch_authorized": false, + "predecessor_r4_scientific_launch_authorized": false, + "terminal_binding_caveat": "The current binding references an absent live terminal-binding file. The integration regression used one isolated read-only terminal-binding fixture, removed automatically at process exit; no production authority or project output was created." + }, + "predecessor_r4": { + "loader": { + "bytes": 4013, + "sha256": "662d0766a8d68638480e9c44ca4070387481d43e1c666a20363025cf5b9bc958" + }, + "receipt": { + "bytes": 5728, + "sha256": "9aa5860bfc032afd82561a6db6f8df1439245b73aa3f7575b2b88836e384a1f9" + }, + "runtime": { + "bytes": 23798, + "sha256": "600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649" + }, + "test": { + "bytes": 19081, + "sha256": "ebbbdb35644e84b566278fec702afdf7bb23b77cc0b9da7dec226d68feb0504d" + } + }, + "schema": "bertose_review_a5_native_eight_hotpath_integrity_receipt_20260726_r5", + "status": "PASS_LOCAL_PROVENANCE_LIFECYCLE_SUCCESSOR_PREPARATION_ONLY_LAUNCH_CLOSED", + "tests": { + "exact_loader_mutable_copy_negative": true, + "focused_warning_fatal": "8/8 PASS", + "fresh_process_integration": true, + "no_pycache_in_r5_runtime_tree": true + } +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6_integrity_receipt.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6_integrity_receipt.json new file mode 100644 index 0000000000000000000000000000000000000000..c8421f7668db0541c22efca6e718ae312f3f3077 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6_integrity_receipt.json @@ -0,0 +1,93 @@ +{ + "authorization": { + "nova_accessed": false, + "nova_submission_authorized": false, + "production_epoch_executed": false, + "scientific_launch_authorized": false, + "training_authorized": false + }, + "closure": { + "loader": { + "bytes": 4013, + "mode": "0444", + "path": "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/load_review_a5_native_eight_hotpath_r6.py", + "sha256": "e2496170942db844e4ebe71d4c098b0d0cf99540d3465ed7e8e9a113469cf7d2" + }, + "runtime": { + "bytes": 17373, + "mode": "0444", + "path": "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6.py", + "sha256": "73b42e5131c64284c6f748ddf81b4d187dcb57f756c88c22240d189f2afc4cef" + }, + "test": { + "bytes": 20399, + "mode": "0444", + "path": "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/test_review_a5_native_eight_hotpath_r6.py", + "sha256": "8acb8f578f94d6ad25a966615052bb1d3be0848914c513a02aa40970743986b3" + } + }, + "guards": { + "abandoned_gc_cleanup_claimed": false, + "additional_full_model_optimizer_or_checkpoint_state_hashes": 0, + "checkpoint_bytes_changed": false, + "commit_restore_success_failure_retires": true, + "full_history_epoch_chain_pair_digest": true, + "history_chain_digest_max_rows": 100, + "maximum_outstanding_provenance_records": 1, + "process_lifetime_bounded_records": 1, + "registration_replaces_prior_record": true, + "shallow_same_constituent_impostor_with_altered_model_state_rejected": true, + "strong_checkpoint_owner_identity_required": true, + "validation_failure_retires": true, + "validation_success_transitions_to_fresh_record": true + }, + "integration": { + "current_r13_runner_sha256": "17cf8ab216b354ec1de7574ebebd7bfe02b5935da605b4131e45c7aa13982d5b", + "fresh_process_result": "PASS_EXACT_R6_CURRENT_R13_R12_R11_R9", + "nested_predecessor_r3_scientific_launch_authorized": false, + "nested_predecessor_r4_scientific_launch_authorized": false, + "nested_predecessor_r5_scientific_launch_authorized": false, + "outer_scientific_launch_authorized": false, + "terminal_binding_caveat": "The current binding references an absent live terminal-binding file. The integration regression used one isolated read-only terminal-binding fixture removed automatically at process exit; it created no production authority or project output." + }, + "outer_receipt_semantics": { + "legacy_r5_provenance_fields_flattened": false, + "predecessor_r5_launch_authorized": false, + "predecessor_r5_status": "SUPERSEDED_NOT_LAUNCHABLE_SAME_CONSTITUENT_IMPOSTOR_ACCEPTANCE", + "r6_additional_full_state_hashes": 0, + "r6_history_chain_digest_max_rows": 100, + "r6_maximum_outstanding_records": 1 + }, + "predecessor_r5": { + "loader": { + "bytes": 4013, + "sha256": "864a05e86c5ea91318b11373d2cdffcdd2ddd0777f141cb7ef0305f779a42ea6" + }, + "receipt": { + "bytes": 3995, + "sha256": "59a2fd53e9e75f6f8ec258d76e103adb61c908ab0ace6718a348739f5b70d8bd" + }, + "runtime": { + "bytes": 17677, + "sha256": "ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8" + }, + "status": "SUPERSEDED_NOT_LAUNCHABLE_SAME_CONSTITUENT_IMPOSTOR_ACCEPTANCE", + "test": { + "bytes": 20423, + "sha256": "fb36b4b6e474ecce6c61565a55e50092e6bbe8405d1e4bdd6032af4fdbdacd01" + } + }, + "schema": "bertose_review_a5_native_eight_hotpath_integrity_receipt_20260726_r6", + "status": "PASS_STRONG_OWNER_PROVENANCE_SUCCESSOR_PREPARATION_ONLY_LAUNCH_CLOSED", + "tests": { + "exact_integer_type_checks": { + "additional_full_state_hashes": 0, + "history_chain_digest_max_rows": 100, + "maximum_outstanding_records": 1, + "process_lifetime_bounded_records": 1 + }, + "focused_warning_fatal": "8/8 PASS", + "fresh_process_integration": true, + "no_pycache_in_r6_runtime_tree": true + } +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7_integrity_receipt.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7_integrity_receipt.json new file mode 100644 index 0000000000000000000000000000000000000000..f2a90b5dd3c166c948aec38a9a2d41faef9d6b80 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7_integrity_receipt.json @@ -0,0 +1,61 @@ +{ + "schema": "bertose_review_a5_native_eight_hotpath_r7_integrity_receipt_20260727", + "created_at_utc": "2026-07-26T20:51:29Z", + "status": "PREPARATION_ONLY_CUDA_EXECUTION_PROOF_PENDING", + "runtime": { + "path": "review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7.py", + "sha256": "c0cb618f7856daf24666dbec07ff51b86e3fbd52c073c58bd1b7151122714f47", + "bytes": 20454, + "mode": "0444" + }, + "loader": { + "path": "review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/load_review_a5_native_eight_hotpath_r7.py", + "sha256": "fa9538829ff3ccfaf3d3f4346c7e735c70758661eb6bf3da5eece2e7e96e0fb6", + "bytes": 4013, + "mode": "0444" + }, + "warning_fatal_tests": { + "path": "review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/test_review_a5_native_eight_hotpath_r7.py", + "sha256": "08115565db0ab8e75b76cde340a8609c7f36727b8f32ba6e936608d04bd67bb8", + "bytes": 20804, + "mode": "0444", + "command": "PYTHONWARNINGS=error python3 -m unittest -v review.multimodal.runtime.a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization.test_review_a5_native_eight_hotpath_r7", + "local_result": "PASS", + "local_passed": 5, + "local_skipped": 1, + "local_skip_reason": "CUDA-only proof requires CUDA and remains mandatory before promotion" + }, + "predecessor": { + "r6_loader_sha256": "e2496170942db844e4ebe71d4c098b0d0cf99540d3465ed7e8e9a113469cf7d2", + "r6_loader_bytes": 4013, + "r6_runtime_sha256": "73b42e5131c64284c6f748ddf81b4d187dcb57f756c88c22240d189f2afc4cef", + "r6_runtime_bytes": 17373, + "frozen_predecessor_sources_modified": false + }, + "implemented_boundary": { + "checkpoint_manager_load_latest_wrapped": true, + "checkpoint_manager_load_best_wrapped": true, + "predecessor_entry_and_strong_owner_verified_first": true, + "new_checkpoint_root_returned": true, + "rng_state_and_numpy_mappings_cloned": true, + "rng_tensor_values_losslessly_cpu_cloned": true, + "model_optimizer_objects_preserved": true, + "all_non_rng_tensors_required_on_requested_device": true, + "old_provenance_retired": true, + "new_strong_owner_registered_with_same_entry_sha256": true, + "failure_clears_provenance": true, + "frozen_r4_validator_patched": false, + "persisted_checkpoint_bytes_changed": false + }, + "required_cuda_proof": { + "cuda_only_test_present": true, + "rng_tensors_cpu_after_load": "PENDING_LIVE_PROOF", + "model_optimizer_tensors_requested_cuda_after_load": "PENDING_LIVE_PROOF", + "predecessor_recursive_state_and_serialized_bytes_unchanged": "PENDING_LIVE_PROOF", + "dtype_shape_value_mixed_device_failure_nonmutation": "PENDING_LIVE_PROOF", + "direct_vs_resumed_next_rng_draws_exact": "PENDING_LIVE_PROOF" + }, + "training_authorized": false, + "scientific_launch_authorized": false, + "nova_submission_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_final_binding_r22.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_final_binding_r22.json new file mode 100644 index 0000000000000000000000000000000000000000..af5fd5b8eaef507505d4c18c76961e8525ea0fd1 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_final_binding_r22.json @@ -0,0 +1 @@ +{"frozen_r14_r7_cuda_preserved":true,"frozen_r19_runtime_behavior_preserved":true,"nova_submission_authorized":false,"obsolete_r15_success_only_loader_invoked":false,"receipt_sha256":"689d4ed5b5420d735dd813ae1f17e34212b977eb6adc2644df56540417bbaf69","schema":"bertose_review_a5_native_eight_truthful_static_runtime_binding_20260728_r22","scientific_launch_authorized":false,"static_release_identity":{"adapter_source_bytes":15013,"adapter_source_relative":"review/multimodal/runtime/a5_static_failure_release_adapter_20260728_r4_r21_cpu_finalizer_release/review_a5_static_failure_release_adapter_r4.py","adapter_source_sha256":"56f8bd745ff87aba53e59b672fcbbdc0cee72957f32006a2fe2994b4f9388062","binding_bytes":5308,"binding_relative":"review/multimodal/outputs/review_a5_static_failure_release_binding_20260728_r4_r21_cpu_finalizer_release/review_a5_static_failure_release_binding_r4.json","binding_sha256":"f647d4bf32600085d1832fe8ca79cc660950248e5da1e5e806d02ec9d752cfd9","validator_name":"validate_release_binding"},"status":"BOUND_TRUTHFUL_STATIC_FAILURE_GATE_R14_R7_CUDA_R19_R21_R22_NORMAL","training_authorized":false,"truthful_lineage_coherence":{"certificate_artifacts":{"static_null_receipt":{"bytes":52862,"relative_path":"review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_train_only_null_r4.json","sha256":"661d04d76fcf36d116feb117154eac01e6569e377d4245c07653b28696e1227b"},"static_postfit_execution_result":{"bytes":5306,"relative_path":"review/multimodal/outputs/review_a5_static_v2_postfit_cpu_finalization_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_cpu_finalization_execution_r21.json","sha256":"be55a87986dd6d80942dcd0b17dd75994145ff4a383596314d5b4ee51972a443"},"static_publication_receipt":{"bytes":9514,"relative_path":"review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_publication_receipt_r4.json","sha256":"77ba176a9fab70e75b3c2c423c857d1e266f2021875aea01e15bac3f11f327d1"},"static_token_package":{"bytes":17105960,"relative_path":"review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_tokens_v2_r4.pkl","sha256":"f9a032f0bd3ad47b99c8a3df2fc46596500e13baf0e77f4b39d26a8351dc7323"}},"postfit_job_id":"11772779","publication_member_sha256":{"null_publication":"661d04d76fcf36d116feb117154eac01e6569e377d4245c07653b28696e1227b","state_publication":"b9ee13338f5813af3386bcf69d4d4c326bdd298e9902790d62b2319336e79175","token_publication":"f9a032f0bd3ad47b99c8a3df2fc46596500e13baf0e77f4b39d26a8351dc7323","traceability_publication":"6bd0f41f24f7d31e1b21847d0550a7113a60977487b6d4dc0a9122e7330c89e7"},"selected_best_checkpoint_semantic_sha256":"79582ef6b692956cc2fc82d0f026412a6327ea281ddc94801136b301da8f7efd","static_release_binding_file_sha256":"f647d4bf32600085d1832fe8ca79cc660950248e5da1e5e806d02ec9d752cfd9","static_release_binding_receipt_sha256":"35b81eeb44603b3f46f10cb1e45c917283283f43c984abedd4bd72f1f2e154b6"}} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_launch_config_r22.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_launch_config_r22.json new file mode 100644 index 0000000000000000000000000000000000000000..b0fd2532befc9f5a4ebef90991928b1821c26672 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_launch_config_r22.json @@ -0,0 +1 @@ +{"array_spec":"0-7","bit_order":["topology","ms","static"],"cell_order":["A000","A100","A010","A001","A110","A101","A011","A111"],"checkpoint_roles":["latest","best","milestone_25","milestone_50","milestone_75","milestone_100"],"common_seed":43,"launch_authorized":true,"loss_coefficients":[1,"topology_bit","ms_bit","static_bit"],"loss_denominator":4,"maximum_epochs":100,"official_submitted_artifacts_modified":false,"output_root":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs","patience":15,"project_root":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc","release_receipt":{"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_external_release_r22.json","sha256":"261099ec7bf32cd72e261ea95d0631702b46cb53cc19085827ed368ba3e3bb63"},"scheduler":{"account":"ratul-scavenger","array":"0-7","concurrency_throttle":null,"constraint":null,"gres":"gpu:1","partition":"scavenger","qos":"scavenger"},"schema":"bertose_review_a5_native_eight_training_launch_config_20260722_r3","selection_rule":"strict_lower_earliest_tie","semantic_array_id":"bertose-native8-seed43-corrected-20260727-r16","static_null_receipt":{"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_train_only_null_r4.json","sha256":"661d04d76fcf36d116feb117154eac01e6569e377d4245c07653b28696e1227b"},"static_publication_receipt":{"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_publication_receipt_r4.json","sha256":"77ba176a9fab70e75b3c2c423c857d1e266f2021875aea01e15bac3f11f327d1"},"static_token_package":{"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_tokens_v2_r4.pkl","sha256":"f9a032f0bd3ad47b99c8a3df2fc46596500e13baf0e77f4b39d26a8351dc7323"}} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/run_review_a5_native_eight_r22.sbatch b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/run_review_a5_native_eight_r22.sbatch new file mode 100644 index 0000000000000000000000000000000000000000..25cbee4d4b10a5f810d7e13fe0631d0cb7ff12e4 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/run_review_a5_native_eight_r22.sbatch @@ -0,0 +1,62 @@ +#!/bin/bash +#SBATCH --job-name=a5-native8-s43-r16 +#SBATCH --partition=nova +#SBATCH --account=ratul +#SBATCH --qos=normal +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=4 +#SBATCH --gres=gpu:1 +#SBATCH --mem=144G +#SBATCH --time=2-00:00:00 +#SBATCH --array=0-7 +#SBATCH --requeue +#SBATCH --open-mode=append +#SBATCH --export=NONE +#SBATCH --chdir=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc +#SBATCH --output=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_a5_native8_r22_%A_%a.out +#SBATCH --error=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_a5_native8_r22_%A_%a.err + +set -euo pipefail +umask 077 +PROJECT_ROOT=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc +PYTHON=/work/ratul1/supantha/miniconda3/bin/python3.10 +WRAPPER=${PROJECT_ROOT}/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/run_review_a5_native_eight_training_r22.py +RUNTIME_SOURCE=${PROJECT_ROOT}/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/review_a5_native_eight_finalization_runtime_r22.py +FINAL_BINDING=${PROJECT_ROOT}/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_final_binding_r22.json +LAUNCH_CONFIG=${PROJECT_ROOT}/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_launch_config_r22.json +SBATCH=${PROJECT_ROOT}/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/run_review_a5_native_eight_r22.sbatch +FINAL_BINDING_SHA256=d8feaf25a7266a919c42d3a4fd1ad2d105ab088ae79c024edc665dfa29cf758a +LAUNCH_CONFIG_SHA256=30082379d47318f5d9e17fafad4aa018e7e9f0f0bf1aac559178d46784fe4b9f +RUNTIME_SOURCE_SHA256=62f5355ef06cdc56f85214ac251bfa0ed4b19b41a19ab6acac51d644678f0a62 +RUNTIME_SOURCE_BYTES=12841 +test "$(sha256sum "${WRAPPER}" | awk '{print $1}')" = cb9a583091912c59f515f46074b04c90dfbe0ebf0fc28d241db980851b180335 +test "$(wc -c < "${WRAPPER}" | tr -d ' ')" = 24070 +test "$(sha256sum "${RUNTIME_SOURCE}" | awk '{print $1}')" = "${RUNTIME_SOURCE_SHA256}" +test "$(wc -c < "${RUNTIME_SOURCE}" | tr -d ' ')" = "${RUNTIME_SOURCE_BYTES}" +test "${SLURM_NTASKS:?}" = 1 +test "${SLURM_NNODES:?}" = 1 +test "${SLURM_CPUS_PER_TASK:?}" = 4 +test "${SLURM_GPUS_ON_NODE:?}" = 1 +[[ "${CUDA_VISIBLE_DEVICES:?}" != *,* ]] +case "${SLURM_ARRAY_TASK_ID:?}" in + 0|1|2|3|4|5|6|7) ;; + *) exit 64 ;; +esac +export PYTHONNOUSERSITE=1 PYTHONHASHSEED=0 PYTHONDONTWRITEBYTECODE=1 +export PYTHONUNBUFFERED=1 CUDA_DEVICE_ORDER=PCI_BUS_ID +export CUBLAS_WORKSPACE_CONFIG=:4096:8 OMP_NUM_THREADS=4 MKL_NUM_THREADS=4 +exec "${PYTHON}" -I -W error "${WRAPPER}" \ + --scientific-gate-source-sha256 ee97bf4e68ddfbf280b7e0f01ce3409c4d4692feafbc9382613bbc5698913fa7 \ + --scientific-gate-source-bytes 28699 \ + --runtime-source "${RUNTIME_SOURCE}" \ + --runtime-source-sha256 "${RUNTIME_SOURCE_SHA256}" \ + --runtime-source-bytes "${RUNTIME_SOURCE_BYTES}" \ + --final-binding "${FINAL_BINDING}" \ + --final-binding-sha256 "${FINAL_BINDING_SHA256}" \ + --final-binding-bytes 3104 \ + --launch-config "${LAUNCH_CONFIG}" \ + --launch-config-sha256 "${LAUNCH_CONFIG_SHA256}" \ + --sbatch "${SBATCH}" \ + --array-task-id "${SLURM_ARRAY_TASK_ID}" \ + --resume auto diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_authority_r1.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_authority_r1.json new file mode 100644 index 0000000000000000000000000000000000000000..06691cca1ef7b9bad08b5e7fdffedcddc98d8d21 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_authority_r1.json @@ -0,0 +1,415 @@ +{ + "all_required_launch_dependencies_complete": false, + "authorization_surface_present": false, + "bound_sources": [ + { + "path": "writing/review/multimodal/P1_loss_weighting_contract_20260710.md", + "role": "historical_loss_contract_reconciled_but_not_rewritten", + "sha256": "e88f864c30f8a1cda9c70b54ccabaa8d04410d5ec8174f3cf2932f73ee3ef6dc" + }, + { + "path": "writing/review/multimodal/P1_A5_core_statistics_amendment_20260717.md", + "role": "historical_three_seed_confirmatory_plan_reconciled_but_not_rewritten", + "sha256": "9a02aa46613baf625225d2d3ec80c2b2de30118538a8db193b815b688d7779fc" + }, + { + "path": "writing/review/multimodal/review_a5_checkpoint_selection_amendment_20260719.md", + "role": "checkpoint_rule_source_and_historical_checkpoint_identity_boundary", + "sha256": "8666a8538de7156f4b49725dbf524e3419f4c9deb2af331c32dcff0ae5db4a7e" + }, + { + "path": "writing/review/multimodal/outputs/p2_a5_phase1_authority_correction_20260720_r1/review_a5_phase1_authority_correction.json", + "role": "historical_51_fit_inventory_reconciled_but_not_rewritten", + "sha256": "089d79137739e779b432b6e84d1675f022103c3e86000b0ac32ed708e883cb8b" + }, + { + "path": "writing/review/multimodal/outputs/review_a5_eight_cell_execution_authority_20260721_r7/review_a5_native_eight_cell_prep_authority_v2.json", + "role": "parent_preparation_authority_launch_closed", + "sha256": "0dc95087400194f8adf877c1726bbc74d1b12fbc35c132ab8cdcb0ffd1872bb2" + } + ], + "cell_plans": [ + { + "array_task_id": 0, + "cell_id": "A000", + "factor_bits": { + "ms": 0, + "static": 0, + "topology": 0 + }, + "fresh_fit_required": true, + "historical_checkpoint_reuse": false, + "objective_coefficients": { + "ms": 0, + "sequence": 1, + "static": 0, + "topology": 0 + }, + "seed": 43, + "status": "PREPARATION_ONLY_LAUNCH_CLOSED" + }, + { + "array_task_id": 1, + "cell_id": "A100", + "factor_bits": { + "ms": 0, + "static": 0, + "topology": 1 + }, + "fresh_fit_required": true, + "historical_checkpoint_reuse": false, + "objective_coefficients": { + "ms": 0, + "sequence": 1, + "static": 0, + "topology": 1 + }, + "seed": 43, + "status": "PREPARATION_ONLY_LAUNCH_CLOSED" + }, + { + "array_task_id": 2, + "cell_id": "A010", + "factor_bits": { + "ms": 1, + "static": 0, + "topology": 0 + }, + "fresh_fit_required": true, + "historical_checkpoint_reuse": false, + "objective_coefficients": { + "ms": 1, + "sequence": 1, + "static": 0, + "topology": 0 + }, + "seed": 43, + "status": "PREPARATION_ONLY_LAUNCH_CLOSED" + }, + { + "array_task_id": 3, + "cell_id": "A001", + "factor_bits": { + "ms": 0, + "static": 1, + "topology": 0 + }, + "fresh_fit_required": true, + "historical_checkpoint_reuse": false, + "objective_coefficients": { + "ms": 0, + "sequence": 1, + "static": 1, + "topology": 0 + }, + "seed": 43, + "status": "PREPARATION_ONLY_LAUNCH_CLOSED" + }, + { + "array_task_id": 4, + "cell_id": "A110", + "factor_bits": { + "ms": 1, + "static": 0, + "topology": 1 + }, + "fresh_fit_required": true, + "historical_checkpoint_reuse": false, + "objective_coefficients": { + "ms": 1, + "sequence": 1, + "static": 0, + "topology": 1 + }, + "seed": 43, + "status": "PREPARATION_ONLY_LAUNCH_CLOSED" + }, + { + "array_task_id": 5, + "cell_id": "A101", + "factor_bits": { + "ms": 0, + "static": 1, + "topology": 1 + }, + "fresh_fit_required": true, + "historical_checkpoint_reuse": false, + "objective_coefficients": { + "ms": 0, + "sequence": 1, + "static": 1, + "topology": 1 + }, + "seed": 43, + "status": "PREPARATION_ONLY_LAUNCH_CLOSED" + }, + { + "array_task_id": 6, + "cell_id": "A011", + "factor_bits": { + "ms": 1, + "static": 1, + "topology": 0 + }, + "fresh_fit_required": true, + "historical_checkpoint_reuse": false, + "objective_coefficients": { + "ms": 1, + "sequence": 1, + "static": 1, + "topology": 0 + }, + "seed": 43, + "status": "PREPARATION_ONLY_LAUNCH_CLOSED" + }, + { + "array_task_id": 7, + "cell_id": "A111", + "factor_bits": { + "ms": 1, + "static": 1, + "topology": 1 + }, + "fresh_fit_required": true, + "historical_checkpoint_reuse": false, + "objective_coefficients": { + "ms": 1, + "sequence": 1, + "static": 1, + "topology": 1 + }, + "seed": 43, + "status": "PREPARATION_ONLY_LAUNCH_CLOSED" + } + ], + "completed_component_evidence": { + "ms_acquisition_top30": { + "authority": { + "path": "data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_authority.json", + "sha256": "48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4" + }, + "independent_certificate_sha256": "53098620a5c22dafdc951ba743515b4b10b1673c02f0aa4d881db669584902fa", + "launch_binding_status": "PENDING_FINAL_INTEGRATED_EXECUTION_BINDING", + "null_scale": 3.006098541980086, + "receipt_sha256": "f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4", + "status": "COMPONENT_EVIDENCE_PASS_PREPARATION_ONLY" + }, + "sequence_and_topology": { + "launch_binding_status": "PENDING_FINAL_INTEGRATED_EXECUTION_BINDING", + "runtime_receipt": { + "path": "writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_official_ragged_sequence_topology_runtime_receipt.json", + "sha256": "53b058a2032c424718a96757b3aa63df5160c20910001fcb128b0ace03a13a4c" + }, + "sequence_null_receipt_sha256": "f4eb239f56e472d57dd3a3848c1a6c142e193cb326320ac8bf134b96ac35102a", + "sequence_null_scale": 4.9674945244448905, + "sequence_package_receipt_sha256": "399df3de2b6c4d5e88aa442c8326214ab9cff2e8f0411e6921762bbade1475ba", + "status": "COMPONENT_EVIDENCE_PASS_PREPARATION_ONLY", + "topology_null_receipt_sha256": "dace4cb5df71912f5aa7531bb0ce87db3b63d726b2a12aa41facabf9d54b5c35", + "topology_null_scale": 2.0932970080357696, + "topology_package_receipt_sha256": "333ee6f34e69f89e26b810cc565415b89d6874615ea4ac57850371fb159c1b71" + }, + "static_graph": { + "authority": { + "path": "writing/review/multimodal/outputs/review_a5_static_graph_v2_authority_20260721_r7/review_a5_static_graph_v2_authority_r7.tsv.gz", + "sha256": "59cf794d52341847b08aaa7f4212d1203dec4df89609157d924fda50d54f7602" + }, + "learned_egnn_rvq_package_status": "PENDING", + "launch_binding_status": "PENDING_LEARNED_EGNN_RVQ_AND_FINAL_INTEGRATED_EXECUTION_BINDING", + "receipt_sha256": "0729fa35e7a34a51ee77d2752f008a783d582b845e6c8dd9ae694eb9edb61d9c", + "static_null_status": "PENDING", + "status": "GRAPH_COMPONENT_EVIDENCE_PASS_TOKENIZER_NOT_YET_FIT" + } + }, + "contradiction_reconciliation": [ + { + "conflict": "The 2026-07-10 loss contract retained WA2 and WA3 sensitivities, and the 2026-07-17 amendment retained WA2 while superseding WA3.", + "resolution_for_this_child": "Use only fixed WA1-style coefficients for the eight native cells. WA2, WA3, GradNorm, adaptive weighting, and any coefficient search are outside this execution scope.", + "source_artifacts_modified": false + }, + { + "conflict": "The 2026-07-17 statistical amendment describes a 24-fit, three-seed factorial and says the historical A111 fits are unchanged.", + "resolution_for_this_child": "This is a distinct corrected-data/corrected-model native rerun consisting of exactly eight fresh seed-43 fits. It does not rewrite or silently satisfy the older three-seed inferential plan.", + "source_artifacts_modified": false + }, + { + "conflict": "The 2026-07-19 checkpoint amendment says historical A111 does not require retraining.", + "resolution_for_this_child": "That statement applies only to the historical data/model identity. Historical A000 and A111 are evidence-only and cannot be reused for the corrected pipeline; both are fresh fits here.", + "source_artifacts_modified": false + }, + { + "conflict": "The 2026-07-20 phase-1 correction freezes a broader 51-fit inventory and earlier staged waves.", + "resolution_for_this_child": "The broader inventory is not launch authority for this corrected eight-cell stage. No information-shuffle, representation, graph-comparator, fusion, or weight-sensitivity fit is included here.", + "source_artifacts_modified": false + }, + { + "conflict": "The parent eight-cell preparation authority has the correct cell shape but all final dependency and operational authority slots remain null.", + "resolution_for_this_child": "Retain launch closure, record current component evidence separately, and require new exact final runtime, data, resume, CPU/CUDA, route, device, and duplicate-receipt bindings before any release authority can exist.", + "source_artifacts_modified": false + } + ], + "created_date": "2026-07-21", + "downstream_metrics_used": false, + "execution_certified": false, + "fresh_fit_count": 8, + "historical_artifact_policy": { + "A000": "EVIDENCE_ONLY_DO_NOT_REUSE", + "A111": "EVIDENCE_ONLY_DO_NOT_REUSE", + "reason": "Corrected modality packages, joins, masking, static tokenizer, and integrated model/runtime change the scientific and executable identity." + }, + "job_submission_allowed": false, + "launch_dependencies": { + "cpu_baseline_and_numeric_guard_certificate": "PENDING", + "duplicate_submission_preflight_receipt": "PENDING", + "exact_a100_device_route_receipt": "PENDING", + "final_common_epoch_planner_authority": "PENDING", + "final_composite_model_runtime_authority": "PENDING", + "final_dependency_set_and_release_promotion_authority": "PENDING", + "final_development_evaluator_authority": "PENDING", + "final_exact_resume_and_checkpoint_store_authority": "PENDING", + "final_fixed_gradient_and_optimizer_group_diagnostic": "PENDING", + "final_integrated_data_adapter_and_join_authority": "PENDING", + "final_masker_and_sampler_nonreuse_authority": "PENDING", + "final_modality_package_set_hash_binding": "PENDING", + "final_software_environment_cpu_cuda_authority": "PENDING", + "final_static_egnn_rvq_best_restore_and_token_export": "PENDING", + "final_static_train_only_null_authority": "PENDING", + "one_bounded_cuda_probe_certificate": "PENDING", + "scheduler_partition_account_qos_constraint_receipt": "PENDING" + }, + "loss_contract": { + "active_coefficient": 1, + "adaptive_or_epochwise_weight_optimization": false, + "constant_shell_denominator": 4, + "disabled_coefficient": 0, + "formula": "L_cell=(L_sequence_normalized+t*L_topology_normalized+m*L_ms_normalized+s*L_static_normalized)/4", + "gradnorm": false, + "normalization": "one fixed train-only null scale per objective, unchanged across cells and epochs", + "objective_order": [ + "sequence", + "topology", + "ms", + "static" + ], + "weight_sensitivity_runs": [] + }, + "official_submitted_artifacts_modified": false, + "owner_direction": { + "decision": "Exactly eight fresh seed-43 native pretraining cells under the corrected pipeline; no WA2, WA3, GradNorm, MD, AFFINose, or downstream work before ablation completion.", + "source_thread_id": "019f33ab-e069-7ac0-8095-28f37df1d208" + }, + "planned_scheduler_route": { + "activation_status": "PENDING_ALL_FINAL_GATES", + "array_indices": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "array_spec": "0-7%4", + "max_concurrent": 4, + "no_duplicate_normal_and_scavenger_copy": true, + "normal_ratul_first": true, + "scavenger_fallback_only": true, + "submission_occurred": false + }, + "pretraining_seed": 43, + "resume_and_checkpoint_contract": { + "checkpoint_publication": "transactional_committed_only", + "exact_best_restore_before_export": true, + "exact_resume_required": true, + "maximum_completed_epochs": 100, + "milestones": [ + 25, + 50, + 75, + 100 + ], + "resume_must_restore": [ + "model", + "optimizer", + "scheduler", + "amp_scaler", + "all_rng_states", + "sampler_and_global_epoch_plan_cursor", + "best_checkpoint_pointer_and_metric", + "patience_state", + "rvq_or_ema_state_when_present" + ], + "resume_source": "owned_committed_latest_only", + "retain_best": true, + "retain_latest": true, + "retain_nonmilestone_epoch_checkpoints": false + }, + "schema": "bertose_review_a5_native_eight_scientific_boundary_child_authority_r1", + "scientific_claim_boundary": { + "allowed_after_successful_training_but_before_downstream": "report the complete matched seed-43 pretraining factorial and pretraining development behavior", + "not_allowed": [ + "cross_seed_robustness_claim", + "downstream_component_contribution_claim", + "AFFINose_claim", + "MD_claim", + "weight_optimization_claim" + ] + }, + "scientific_design": { + "bit_order": [ + "topology", + "ms", + "static" + ], + "cell_count": 8, + "cell_order": [ + "A000", + "A100", + "A010", + "A001", + "A110", + "A101", + "A011", + "A111" + ], + "factor_objectives": [ + "topology", + "ms", + "static" + ], + "fit_reuse_count": 0, + "native_runtime_required": true, + "sequence_always_enabled": true + }, + "scientific_launch_authorized": false, + "selection_contract": { + "development_partition": "pretraining_development_only", + "downstream_or_test_selection": false, + "earliest_possible_stop_epoch": 16, + "improvement": "strictly_lower_finite_total_normalized_development_loss", + "maximum_completed_epochs": 100, + "min_delta": 0, + "patience_completed_development_evaluations": 15, + "tie_rule": "retain_earlier_epoch" + }, + "scope_exclusions": { + "AFFINose": true, + "B_char": true, + "B_bpe": true, + "G_match": true, + "GradNorm": true, + "MD": true, + "WA2": true, + "WA3": true, + "adaptive_weighting": true, + "contrastive_refinement": true, + "downstream_tasks": true, + "fusion_controls": true, + "information_shuffle_controls": true, + "iar": true, + "weight_grid_search": true + }, + "status": "PREPARATION_ONLY_SCIENTIFIC_BOUNDARY_FROZEN_LAUNCH_CLOSED", + "submission_occurred": false, + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_receipt_r1.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_receipt_r1.json new file mode 100644 index 0000000000000000000000000000000000000000..e59b8a9a6f163ddd39fa484fd888bb070c36873d --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_receipt_r1.json @@ -0,0 +1,17 @@ +{ + "authority": { + "bytes": 14887, + "path": "writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_authority_r1.json", + "sha256": "1238f76e5da5184d16d33077bf3e5342033918fadb4eba84242c47cb1b1322cc" + }, + "authorization_surface_present": false, + "execution_certified": false, + "official_submitted_artifacts_modified": false, + "output_file_count": 2, + "receipt_written_after_authority": true, + "schema": "bertose_review_a5_native_eight_scientific_boundary_child_receipt_r1", + "scientific_launch_authorized": false, + "status": "PASS_PREPARATION_ONLY_CHILD_WRITTEN_LAUNCH_CLOSED", + "submission_occurred": false, + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_topology_loss_v2.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_topology_loss_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..a01a33c64fc364a88a388d856343a67b0e28bdcb --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_topology_loss_v2.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python3 +"""Isolated prototype for the repaired A5 topology reduction. + +This file is review-only. It deliberately does not modify or authorize the +shared A5 model. The loss unit is one distinct unordered residue pair, even +when either residue spans multiple BPE tokens. Token-pair errors are retained +so the auxiliary objective still reaches every residue-bearing token, but an +inverse-multiplicity weight makes the total mass of every residue pair one. +""" + +from __future__ import annotations + +from typing import Optional + +import torch + + +class TopologyLossV2Error(ValueError): + """Raised when a batch cannot prove the repaired topology semantics.""" + + +def _active_residue_count(labels: torch.Tensor) -> int: + if labels.ndim != 2 or labels.shape[0] != labels.shape[1]: + raise TopologyLossV2Error("topology labels must be square") + active = labels.diagonal().ge(0) + count = int(active.sum().item()) + if count == 0: + if labels.ge(0).any(): + raise TopologyLossV2Error( + "topology labels have targets but no valid residue diagonal" + ) + return 0 + expected = torch.arange(labels.shape[0], device=labels.device) < count + if not torch.equal(active, expected): + raise TopologyLossV2Error( + "active topology residues must be a contiguous zero-based prefix" + ) + active_labels = labels[:count, :count] + if not active_labels.ge(0).all(): + raise TopologyLossV2Error("active topology matrix contains missing targets") + if not torch.equal(active_labels, active_labels.transpose(0, 1)): + raise TopologyLossV2Error("topology target matrix must be symmetric") + if not torch.equal( + active_labels.diagonal(), torch.zeros_like(active_labels.diagonal()) + ): + raise TopologyLossV2Error("topology target diagonal must be zero") + return count + + +def inverse_multiplicity_unordered_pair_weights( + residue_ids: torch.Tensor, + attention_mask: torch.Tensor, + *, + residue_count: int, +) -> torch.Tensor: + """Return ordered-token weights whose mass is one per unordered residue pair. + + For distinct residues ``r`` and ``s`` with token multiplicities ``k_r`` and + ``k_s``, every ordered token pair receives ``1 / (2 k_r k_s)``. The two + orientations and all token combinations therefore sum to exactly one. + Same-residue pairs receive zero. + """ + + if residue_ids.ndim != 1 or attention_mask.shape != residue_ids.shape: + raise TopologyLossV2Error( + "residue IDs and attention mask must be one-dimensional and aligned" + ) + if residue_count < 2: + raise TopologyLossV2Error( + "a distinct-pair topology target requires at least two residues" + ) + token_valid = attention_mask.bool() & residue_ids.ge(0) + represented = residue_ids[token_valid] + if represented.numel() == 0: + raise TopologyLossV2Error("topology parent has no residue-bearing tokens") + if int(represented.max().item()) >= residue_count: + raise TopologyLossV2Error("sequence residue ID exceeds topology target size") + multiplicity = torch.bincount(represented, minlength=residue_count) + if multiplicity.shape[0] != residue_count or multiplicity.le(0).any(): + raise TopologyLossV2Error( + "every active topology residue must have a sequence-token representative" + ) + + safe = residue_ids.clamp_min(0).clamp_max(residue_count - 1) + left = safe.unsqueeze(1) + right = safe.unsqueeze(0) + valid = ( + token_valid.unsqueeze(1) + & token_valid.unsqueeze(0) + & left.ne(right) + ) + denominator = ( + 2.0 + * multiplicity.index_select(0, safe).to(torch.float64).unsqueeze(1) + * multiplicity.index_select(0, safe).to(torch.float64).unsqueeze(0) + ) + weights = torch.where( + valid, + denominator.reciprocal(), + torch.zeros_like(denominator), + ) + expected_mass = residue_count * (residue_count - 1) / 2.0 + observed_mass = float(weights.sum().item()) + if abs(observed_mass - expected_mass) > 1e-10 * max(1.0, expected_mass): + raise TopologyLossV2Error( + "inverse-multiplicity weights do not sum to the unordered-pair count" + ) + return weights + + +def parent_balanced_unique_residue_pair_loss( + predictions: torch.Tensor, + residue_ids: torch.Tensor, + attention_mask: torch.Tensor, + topology_labels: torch.Tensor, +) -> Optional[torch.Tensor]: + """Mean squared error with equal residue-pair and equal-parent weighting. + + ``predictions`` remains token-pair shaped, preserving the current topology + head. Padded parents with no topology target are ignored. For every + supervised parent, distinct unordered residue pairs are the statistical + units; diagonal and same-residue token pairs never enter the objective. + """ + + if predictions.ndim != 3 or predictions.shape[1] != predictions.shape[2]: + raise TopologyLossV2Error("topology predictions must be batched square") + if residue_ids.shape != predictions.shape[:2]: + raise TopologyLossV2Error("residue IDs do not align with predictions") + if attention_mask.shape != residue_ids.shape: + raise TopologyLossV2Error("attention mask does not align with residue IDs") + if ( + topology_labels.ndim != 3 + or topology_labels.shape[0] != predictions.shape[0] + or topology_labels.shape[1] != topology_labels.shape[2] + ): + raise TopologyLossV2Error("topology labels must be batched square") + + parent_losses: list[torch.Tensor] = [] + for parent in range(predictions.shape[0]): + labels = topology_labels[parent] + residue_count = _active_residue_count(labels) + if residue_count == 0: + continue + weights = inverse_multiplicity_unordered_pair_weights( + residue_ids[parent], + attention_mask[parent], + residue_count=residue_count, + ).to(device=predictions.device, dtype=predictions.dtype) + safe = residue_ids[parent].clamp_min(0).clamp_max(residue_count - 1) + token_targets = labels[:residue_count, :residue_count][ + safe.unsqueeze(1), safe.unsqueeze(0) + ].to(device=predictions.device, dtype=predictions.dtype) + squared = (predictions[parent] - token_targets).square() + pair_mass = weights.sum() + parent_losses.append((squared * weights).sum() / pair_mass) + + if not parent_losses: + return None + return torch.stack(parent_losses).mean() + + +def current_ordered_all_token_pair_loss( + predictions: torch.Tensor, + residue_ids: torch.Tensor, + attention_mask: torch.Tensor, + topology_labels: torch.Tensor, +) -> Optional[torch.Tensor]: + """Small CPU reference for the currently frozen A5 reduction.""" + + if predictions.ndim != 3 or residue_ids.shape != predictions.shape[:2]: + raise TopologyLossV2Error("current-loss reference received invalid shapes") + parent_losses: list[torch.Tensor] = [] + for parent in range(predictions.shape[0]): + labels = topology_labels[parent] + residue_count = _active_residue_count(labels) + if residue_count == 0: + continue + token_valid = attention_mask[parent].bool() & residue_ids[parent].ge(0) + represented = residue_ids[parent][token_valid] + if represented.numel() == 0 or int(represented.max().item()) >= residue_count: + raise TopologyLossV2Error("invalid current-loss token-to-residue map") + safe = residue_ids[parent].clamp_min(0).clamp_max(residue_count - 1) + token_targets = labels[:residue_count, :residue_count][ + safe.unsqueeze(1), safe.unsqueeze(0) + ].to(device=predictions.device, dtype=predictions.dtype) + valid = token_valid.unsqueeze(1) & token_valid.unsqueeze(0) + squared = (predictions[parent] - token_targets).square() + parent_losses.append((squared * valid).sum() / valid.sum()) + if not parent_losses: + return None + return torch.stack(parent_losses).mean() + diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_receipt_r4.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_receipt_r4.json new file mode 100644 index 0000000000000000000000000000000000000000..37167757f8e6c92418d1bc519b4fd17533f6c462 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_receipt_r4.json @@ -0,0 +1,61 @@ +{ + "affinose_authorized": false, + "bfs_replay_receipt_sha256": "f20a1dd444f2760ccd8605d53ad716ceb55112fd32d3409826bcaf78ff2c6c3d", + "checkpoint_resume_authorized": false, + "downstream_evaluation_authorized": false, + "gpu_launch_authorized": false, + "nova_submission_authorized": false, + "official_submitted_or_predecessor_artifacts_modified": false, + "payloads": { + "review_a5_official_ragged_sequence_topology_r4.py": { + "bytes": 25227, + "name": "review_a5_official_ragged_sequence_topology_r4.py", + "sha256": "efc56a84cb82f30c0566da83a38bf0f02fdd507e02d116d827c1bbd827151ecf" + }, + "review_a5_official_ragged_sequence_topology_runtime_summary_r4.json": { + "bytes": 3228, + "name": "review_a5_official_ragged_sequence_topology_runtime_summary_r4.json", + "sha256": "ccd4b81d3afac8ae789c538e0af332f74f2468d403da1d243fefefd4df013538" + }, + "review_a5_sequence_topology_bfs_replay_250_r1.json": { + "bytes": 160937, + "name": "review_a5_sequence_topology_bfs_replay_250_r1.json", + "sha256": "75914916591d1db97a77d64b9e7a51e0f23526aeb87bd6e394d49c6583309469" + }, + "review_a5_sequence_topology_bfs_replay_250_receipt_r1.json": { + "bytes": 928, + "name": "review_a5_sequence_topology_bfs_replay_250_receipt_r1.json", + "sha256": "f20a1dd444f2760ccd8605d53ad716ceb55112fd32d3409826bcaf78ff2c6c3d" + }, + "review_package_a5_official_ragged_sequence_topology_runtime_r4.py": { + "bytes": 10688, + "name": "review_package_a5_official_ragged_sequence_topology_runtime_r4.py", + "sha256": "30ef0a2840451a0f8074b4bdd1bf5ea1b6cdaab11c24de50cd3b4dba4cfd7b6c" + }, + "review_test_a5_official_ragged_sequence_topology_r4.py": { + "bytes": 13932, + "name": "review_test_a5_official_ragged_sequence_topology_r4.py", + "sha256": "fd053e2cb46fa5d780c28fa62d366f8b4d30d091d239278340bb2e1cc6de8d95" + }, + "review_warning_fatal_r4_test_output.txt": { + "bytes": 2914, + "name": "review_warning_fatal_r4_test_output.txt", + "sha256": "7c6fa6cc192142105639f04f29a8302b707aad6777c46d51ec7436d6cd56a1b9" + } + }, + "publication": { + "atomic_rename": true, + "no_overwrite": true, + "receipt_written_last": true, + "warning_fatal_test_replayed_from_staged_package": true + }, + "schema": "bertose_a5_official_ragged_sequence_topology_runtime_receipt_v4", + "scientific_launch_authorized": false, + "status": "PASS_RECEIPT_LAST", + "summary": { + "bytes": 3228, + "name": "review_a5_official_ragged_sequence_topology_runtime_summary_r4.json", + "sha256": "ccd4b81d3afac8ae789c538e0af332f74f2468d403da1d243fefefd4df013538" + }, + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_summary_r4.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_summary_r4.json new file mode 100644 index 0000000000000000000000000000000000000000..1cac0d52171af665fe6950352496575352323027 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_summary_r4.json @@ -0,0 +1,64 @@ +{ + "affinose_authorized": false, + "bfs_replay": { + "all_mismatch_counts_zero": true, + "receipt_sha256": "f20a1dd444f2760ccd8605d53ad716ceb55112fd32d3409826bcaf78ff2c6c3d", + "result_sha256": "75914916591d1db97a77d64b9e7a51e0f23526aeb87bd6e394d49c6583309469", + "selected_count": 250 + }, + "checkpoint_resume_authorized": false, + "contracts": { + "all_26_sequence_package_members_sha256_and_size": true, + "all_3_topology_null_package_members_sha256_and_size": true, + "all_5_sequence_null_package_members_sha256_and_size": true, + "all_7_topology_package_members_sha256_and_size": true, + "all_source_and_package_bindings_replayed_at_resume": true, + "authoritative_row_refetched_by_sequence_row_before_collation": true, + "authoritative_row_refetched_by_sequence_row_before_masking": true, + "deterministic_bfs_replay_250_of_250_zero_mismatch": true, + "epoch_varying_train_and_fixed_development_masking_preserved": true, + "inverse_multiplicity_equal_parent_topology_loss_preserved": true, + "mutation_tests_role_wurcs_all_channels_topology_and_source": true, + "no_follow_regular_file_hashing": true, + "original_residue_axis_bfs_preserved": true, + "parent_id_canonical_wurcs_role_and_objective_eligibility_exact": true, + "predecessor_r3_r2_base_and_loss_sha256_and_size_before_import": true, + "token_attention_category_residue_depth_linkage_channels_exact": true, + "topology_index_row_residue_count_target_count_and_matrix_exact": true, + "train_only_bpe_preserved": true + }, + "downstream_evaluation_authorized": false, + "gpu_launch_authorized": false, + "migration_requirements": { + "batch_channels": "consume and retain sequence_rows, roles, seq_token_categories, topology_rows, topology_residue_counts, topology_target_counts", + "collator": "call collate_sequence_topology(store, samples, include_topology=...) and never the r3 raw-sample collator", + "required_receipts": "bind this r4 receipt and the 250-row BFS replay receipt in adapter/executor authorities", + "resume": "restore through r4 masker.load_state_dict, which replays every source/data manifest", + "sample_source": "use r4_store.sample(sequence_row); do not construct or carry detached row mappings", + "store_constructor": "add explicit predecessor_package bound to the frozen r3 package" + }, + "nova_submission_authorized": false, + "official_submitted_or_predecessor_artifacts_modified": false, + "predecessor": { + "runtime_generation": "r3", + "runtime_receipt_sha256": "53b058a2032c424718a96757b3aa63df5160c20910001fcb128b0ace03a13a4c", + "scientific_semantics_changed": false + }, + "schema": "bertose_a5_official_ragged_sequence_topology_runtime_v4", + "scientific_counts": { + "development_sequence_parents": 55440, + "development_topology_parents": 17650, + "sequence_null_scale": 4.9674945244448905, + "topology_null_scale": 2.0932970080357696, + "train_sequence_parents": 221827, + "train_topology_parents": 71914 + }, + "scientific_launch_authorized": false, + "status": "PASS_FAIL_CLOSED_12_OF_12_WARNING_FATAL_AND_BFS_250_OF_250", + "training_authorized": false, + "warning_fatal_tests": { + "failed": 0, + "passed": 12, + "warnings": 0 + } +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null.json new file mode 100644 index 0000000000000000000000000000000000000000..02bf537de91de8639683101cdbcfbadd05b03de0 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null.json @@ -0,0 +1,62 @@ +{ + "checkpoint_resume_authorized": false, + "downstream_evaluation_authorized": false, + "gpu_launch_authorized": false, + "nova_submission_authorized": false, + "official_submitted_or_predecessor_artifacts_modified": false, + "payloads": { + "review_frozen_sequence_masking_runtime.py": { + "bytes": 12583, + "name": "review_frozen_sequence_masking_runtime.py", + "sha256": "831bebd2dcf6a8308d01ec62eb6e1132fe7edbbc666c1c83787335acc576b19c" + }, + "review_null_builder.py": { + "bytes": 17633, + "name": "review_null_builder.py", + "sha256": "269ed77c765432a515be2da7817d5d2ef4294c25d3095679ae14e19e2fe7db32" + }, + "review_sequence_null_probabilities.npy": { + "bytes": 17040, + "name": "review_sequence_null_probabilities.npy", + "sha256": "e48971c044a3a9bc3b9f496a13e916856c5a7203c29a3a67e22a58539e24bfb3" + } + }, + "result": { + "active_category_count": 1727, + "fit_role": "pretraining_train_only_sequence_objective_eligible", + "jeffreys_pseudocount": 0.5, + "marginal_sha256": "c0d7b0c2faeaefe76eb9e95f240eb0e4d82fbccc08df2387b8e157a090974e2c", + "masked_input_surface_sha256": "b348f4e028f8904f96a8e4b18d1b925fa56f16cddde907d00a072fb0c3ecf3de", + "ordered_train_parent_sha256": "c3024baceefa290edefa7babc9e52630267b5a5d62f1ecba73038844c50fdab2", + "parent_count": 221827, + "parent_reduction": "mean masked-token NLL within parent then equal parent mean", + "scale": 4.9674945244448905, + "target_count": 584709, + "target_surface_sha256": "afae2a92ae88c7ca4ece5e67de253379d1f79cb1cdd54f4fffbe45daabbce5ae", + "vocabulary_size": 2114 + }, + "schema": "bertose_a5_official_sequence_train_only_null_v1", + "scientific_launch_authorized": false, + "source_bindings": { + "ambiguity": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b", + "attention": "01ed165720b9414e614dd7e7d75284a8886165f11138e16117ffcbe4e4bbf95c", + "index": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0", + "masking_runtime": "831bebd2dcf6a8308d01ec62eb6e1132fe7edbbc666c1c83787335acc576b19c", + "objective": "62502d0d1b44a10989350a78f1e033d271fe8417715e10d42eb47c6720ceb3bf", + "sequence_receipt": "399df3de2b6c4d5e88aa442c8326214ab9cff2e8f0411e6921762bbade1475ba", + "tokens": "ec2d52dced65d22f0f218ff617d351fbd2930661bc8681e939990149d493537d", + "topology_lengths": "b52f6ddcf327b8cfc5159659bada97357216f9526b42c230a35192932f43d2f3", + "topology_offsets": "e06d61b8e47c2a2a3e0c8aeec7e015e673f64f0f483a483abe40ccda2d08b9e0", + "topology_receipt": "333ee6f34e69f89e26b810cc565415b89d6874615ea4ac57850371fb159c1b71", + "topology_roster": "a216ce485ea699fb1b66ed6915175a49cde8c7d14279dbaf835f4675bc7c7fa1", + "topology_row": "a0ae28b0476322e3dbeda42a891f4a42c0973002a5d8507bf387b12dcbff4e95", + "topology_values": "2d4ba8395f78864b7eed9ed250bb9fd50bd45ef84a10ed497ffb89c684276e4e", + "vocabulary": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b" + }, + "stale_predecessor_surfaces_rejected": { + "masked_input": "2f357f445d7f58126e8128516c90ff96da79b4d5164322a29c01c0271ce289be", + "target": "069f40d6a7857a06f768a851b67e2352e55d821f59a39317adc2a2ae4ad5650c" + }, + "status": "PASS_EXACT_TRAIN_ONLY_NULL", + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null_receipt.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null_receipt.json new file mode 100644 index 0000000000000000000000000000000000000000..c12107375b000de7e7bad0edc9cb084f4668038e --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null_receipt.json @@ -0,0 +1,38 @@ +{ + "checkpoint_resume_authorized": false, + "downstream_evaluation_authorized": false, + "gpu_launch_authorized": false, + "nova_submission_authorized": false, + "official_submitted_or_predecessor_artifacts_modified": false, + "payloads": { + "review_frozen_sequence_masking_runtime.py": { + "bytes": 12583, + "name": "review_frozen_sequence_masking_runtime.py", + "sha256": "831bebd2dcf6a8308d01ec62eb6e1132fe7edbbc666c1c83787335acc576b19c" + }, + "review_null_builder.py": { + "bytes": 17633, + "name": "review_null_builder.py", + "sha256": "269ed77c765432a515be2da7817d5d2ef4294c25d3095679ae14e19e2fe7db32" + }, + "review_sequence_null_probabilities.npy": { + "bytes": 17040, + "name": "review_sequence_null_probabilities.npy", + "sha256": "e48971c044a3a9bc3b9f496a13e916856c5a7203c29a3a67e22a58539e24bfb3" + } + }, + "publication": { + "atomic_rename": true, + "no_overwrite": true, + "receipt_written_last": true + }, + "schema": "bertose_a5_official_sequence_train_only_null_v1_receipt", + "scientific_launch_authorized": false, + "status": "PASS_RECEIPT_LAST", + "summary": { + "bytes": 3278, + "name": "review_a5_official_sequence_train_only_null.json", + "sha256": "b10556643abf560b9e8622e8ae67936d2d3ca8867433db485e785f31d049a8fb" + }, + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_frozen_sequence_masking_runtime.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_frozen_sequence_masking_runtime.py new file mode 100644 index 0000000000000000000000000000000000000000..e13d801f2fa42e32405aff4338d3ae93aeb42016 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_frozen_sequence_masking_runtime.py @@ -0,0 +1,323 @@ +"""Sequence-only null-fit masker with exact rational probability laws. + +This module is an isolated replacement for r1. It fixes the binary64 count +error in ``floor(0.15*n)`` by evaluating ``floor(3*n/20)`` with integers. It +also routes replacement draws through exact cumulative 4/5 and 9/10 +thresholds. The seed-zero/epoch-zero recipe here is only the fixed null-fit +calibration bank; epoch-varying training remains externally bound to seed 43. +""" + +from __future__ import annotations + +from dataclasses import dataclass +import hashlib +import json +from typing import Iterable + +import numpy as np + + +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +NULL_CALIBRATION_ONLY = True +SEQUENCE_WIDTH = 256 +PAD_ID = 0 +START_ID = 2 +END_ID = 3 +MASK_ID = 4 +SELECTION_NUMERATOR = 3 +SELECTION_DENOMINATOR = 20 +MASK_THRESHOLD_NUMERATOR = 4 +MASK_THRESHOLD_DENOMINATOR = 5 +RANDOM_CUMULATIVE_NUMERATOR = 9 +RANDOM_CUMULATIVE_DENOMINATOR = 10 + + +def _length_prefixed(payload: bytes) -> bytes: + return len(payload).to_bytes(8, "big") + payload + + +def _constant_bytes(value: object) -> bytes: + if value is None: + return b"none" + if value is Ellipsis: + return b"ellipsis" + if isinstance(value, bool): + return b"bool1" if value else b"bool0" + if isinstance(value, int): + return b"int" + _length_prefixed(str(value).encode("ascii")) + if isinstance(value, float): + return b"float" + _length_prefixed(value.hex().encode("ascii")) + if isinstance(value, complex): + payload = f"{value.real.hex()}|{value.imag.hex()}".encode("ascii") + return b"complex" + _length_prefixed(payload) + if isinstance(value, str): + return b"str" + _length_prefixed(value.encode("utf-8")) + if isinstance(value, bytes): + return b"bytes" + _length_prefixed(value) + if isinstance(value, tuple): + return b"tuple" + b"".join( + _length_prefixed(_constant_bytes(item)) for item in value + ) + if isinstance(value, frozenset): + items = sorted(_constant_bytes(item) for item in value) + return b"frozenset" + b"".join(_length_prefixed(item) for item in items) + raise TypeError(f"unsupported seed constant: {type(value).__name__}") + + +def stable_seed(*parts: object) -> bytes: + payload = bytearray(b"bertose-masker-v4-sha256-stream-key-v1\0") + for part in parts: + payload.extend(_length_prefixed(_constant_bytes(part))) + return hashlib.sha256(payload).digest() + + +def generator(*parts: object) -> list[object]: + return [stable_seed(*parts), 0] + + +def draw_uint256(state: list[object]) -> int: + if ( + type(state) is not list + or len(state) != 2 + or not isinstance(state[0], bytes) + or len(state[0]) != 32 + or type(state[1]) is not int + or state[1] < 0 + or state[1] >= 2**128 + ): + raise RuntimeError("invalid sequence SHA-256 counter stream") + counter = state[1] + payload = ( + b"bertose-masker-v4-sha256-counter-draw-v1\0" + + state[0] + + counter.to_bytes(16, "big") + ) + state[1] = counter + 1 + return int.from_bytes(hashlib.sha256(payload).digest(), "big") + + +def below_ratio(draw: int, numerator: int, denominator: int) -> bool: + if type(draw) is not int or draw < 0 or draw >= 2**256: + raise RuntimeError("sequence SHA-256 draw is outside uint256") + if ( + type(numerator) is not int + or type(denominator) is not int + or denominator <= 0 + or numerator < 0 + or numerator > denominator + ): + raise ValueError("invalid exact probability ratio") + return draw * denominator < numerator * 2**256 + + +def randbelow(state: list[object], upper: int) -> int: + if type(upper) is not int or upper <= 0: + raise RuntimeError("sequence random upper bound must be positive") + space = 2**256 + limit = space - space % upper + while True: + draw = draw_uint256(state) + if draw < limit: + return draw % upper + + +def exact_selection_count(candidate_count: int) -> int: + if type(candidate_count) is not int or candidate_count < 0: + raise ValueError("candidate count must be a non-negative integer") + if candidate_count == 0: + return 0 + return min( + candidate_count, + max(1, candidate_count * SELECTION_NUMERATOR // SELECTION_DENOMINATOR), + ) + + +def select_positions(candidates: np.ndarray, state: list[object]) -> np.ndarray: + if candidates.dtype != np.dtype(bool) or candidates.ndim != 1: + raise TypeError("sequence candidates must be one boolean vector") + indices = np.flatnonzero(candidates) + selected = np.zeros_like(candidates, dtype=bool) + count = exact_selection_count(int(indices.size)) + if count == 0: + return selected + ranked = sorted((draw_uint256(state), int(position)) for position in indices) + for _, position in ranked[:count]: + selected[position] = True + return selected + + +def replacement_excluding_original( + original: int, pool: tuple[int, ...], state: list[object] +) -> int: + if len(pool) < 2 or original not in pool: + raise RuntimeError("replacement pool cannot exclude the original token") + index = randbelow(state, len(pool) - 1) + original_index = pool.index(original) + if index >= original_index: + index += 1 + replacement = int(pool[index]) + if replacement == original: + raise RuntimeError("random replacement equals original token") + return replacement + + +@dataclass(frozen=True, slots=True) +class SequenceMaskingRecipeV2: + seed: int = 0 + split: str = "train" + epoch: int = 0 + + def __post_init__(self) -> None: + if type(self.seed) is not int or self.seed != 0: + raise ValueError("sequence null seed must be exactly zero") + if self.split != "train" or type(self.epoch) is not int or self.epoch != 0: + raise ValueError("sequence null requires train/epoch0") + + +def canonical_recipe_payload( + recipe: SequenceMaskingRecipeV2, + *, + vocabulary_sha256: str, + ambiguity_sha256: str, + objective_mask_sha256: str, +) -> dict[str, object]: + for digest in (vocabulary_sha256, ambiguity_sha256, objective_mask_sha256): + if len(digest) != 64 or any(value not in "0123456789abcdef" for value in digest): + raise ValueError("recipe binding is not lowercase SHA-256") + return { + "schema": "bertose_a5_sequence_masking_recipe_v2_exact_rational", + "usage": "fixed_null_fit_replay_only_not_epoch_varying_training_stream", + "rng_key_domain": "bertose-masker-v4-sha256-stream-key-v1\\0", + "rng_draw_domain": "bertose-masker-v4-sha256-counter-draw-v1\\0", + "parent_stream_suffix": "sequence-token", + "selection_rule": "take_lowest_counter_ranks_count_max1_floor_3n_over_20_exact_integer", + "selection_numerator": SELECTION_NUMERATOR, + "selection_denominator": SELECTION_DENOMINATOR, + "mask_threshold_rule": "uint256_draw_times_5_less_than_4_times_2pow256", + "mask_threshold_numerator": MASK_THRESHOLD_NUMERATOR, + "mask_threshold_denominator": MASK_THRESHOLD_DENOMINATOR, + "random_cumulative_threshold_rule": "uint256_draw_times_10_less_than_9_times_2pow256", + "random_cumulative_threshold_numerator": RANDOM_CUMULATIVE_NUMERATOR, + "random_cumulative_threshold_denominator": RANDOM_CUMULATIVE_DENOMINATOR, + "unchanged_probability_exact": "1/10", + "random_replacement_rule": "uniform_active_id_excluding_original_rejection_free", + "seed": recipe.seed, + "split": recipe.split, + "epoch": recipe.epoch, + "training_stream_common_seed": 43, + "training_stream_epoch": "current_epoch_not_frozen_by_this_null_recipe", + "development_stream_seed_epoch": "seed0_epoch0", + "special_ids": list(range(10)), + "vocabulary_sha256": vocabulary_sha256, + "ambiguity_sha256": ambiguity_sha256, + "objective_mask_sha256": objective_mask_sha256, + "training_authorized": False, + "scientific_launch_authorized": False, + } + + +def recipe_sha256(payload: dict[str, object]) -> str: + return hashlib.sha256( + json.dumps(payload, sort_keys=True, separators=(",", ":"), allow_nan=False).encode() + ).hexdigest() + + +class SequenceMaskerV2: + def __init__( + self, + *, + vocab_size: int, + special_ids: Iterable[int], + ambiguity_ids: Iterable[int], + recipe: SequenceMaskingRecipeV2 | None = None, + ) -> None: + if type(vocab_size) is not int or vocab_size <= 10: + raise ValueError("invalid sequence vocabulary size") + specials = tuple(sorted(set(int(value) for value in special_ids))) + ambiguous = tuple(sorted(set(int(value) for value in ambiguity_ids))) + if specials != tuple(range(10)): + raise ValueError("sequence special IDs must be exactly 0..9") + if any(value < 0 or value >= vocab_size for value in ambiguous): + raise ValueError("ambiguity ID is out of range") + if set(specials) & set(ambiguous): + raise ValueError("special and ambiguity IDs overlap") + excluded = set(specials) | set(ambiguous) + random_ids = tuple(value for value in range(vocab_size) if value not in excluded) + if len(random_ids) < 2: + raise ValueError("sequence random replacement pool is too small") + self.vocab_size = vocab_size + self.special_ids = specials + self.ambiguity_ids = ambiguous + self.random_ids = random_ids + self.recipe = recipe if recipe is not None else SequenceMaskingRecipeV2() + + def mask_parent( + self, token_ids: np.ndarray, attention: np.ndarray, parent_id: str + ) -> tuple[np.ndarray, np.ndarray, np.ndarray]: + tokens = np.asarray(token_ids) + active = np.asarray(attention) + if tokens.ndim != 1 or active.shape != tokens.shape: + raise ValueError("sequence token/attention shapes disagree") + if not np.issubdtype(tokens.dtype, np.integer) or active.dtype != np.dtype(bool): + raise TypeError("sequence tokens must be integer and attention boolean") + if tokens.size != SEQUENCE_WIDTH: + raise ValueError("sequence width changed") + positions = np.flatnonzero(active) + if positions.size < 2 or not np.array_equal(positions, np.arange(positions.size)): + raise ValueError("sequence attention is not a contiguous prefix") + length = int(positions.size) + if int(tokens[0]) != START_ID or int(tokens[length - 1]) != END_ID: + raise ValueError("sequence START/END placement changed") + if np.any(tokens[~active] != PAD_ID): + raise ValueError("sequence padding token changed") + if tokens.min() < 0 or tokens.max() >= self.vocab_size: + raise ValueError("sequence token is outside vocabulary") + eligible = active.copy() + eligible &= ~np.isin(tokens, np.asarray(self.special_ids, dtype=tokens.dtype)) + eligible &= ~np.isin(tokens, np.asarray(self.ambiguity_ids, dtype=tokens.dtype)) + state = generator( + self.recipe.seed, + self.recipe.split, + self.recipe.epoch, + parent_id, + "sequence-token", + ) + selected = select_positions(eligible, state) + if not selected.any(): + raise RuntimeError("eligible sequence parent has no selected target") + masked = tokens.astype(np.int64, copy=True) + labels = np.full(tokens.shape, -100, dtype=np.int64) + labels[selected] = tokens[selected] + for position in np.flatnonzero(selected): + draw = draw_uint256(state) + if below_ratio(draw, MASK_THRESHOLD_NUMERATOR, MASK_THRESHOLD_DENOMINATOR): + masked[position] = MASK_ID + elif below_ratio( + draw, + RANDOM_CUMULATIVE_NUMERATOR, + RANDOM_CUMULATIVE_DENOMINATOR, + ): + masked[position] = replacement_excluding_original( + int(tokens[position]), self.random_ids, state + ) + return masked, labels, selected + + +__all__ = [ + "NULL_CALIBRATION_ONLY", + "SCIENTIFIC_LAUNCH_AUTHORIZED", + "TRAINING_AUTHORIZED", + "SequenceMaskerV2", + "SequenceMaskingRecipeV2", + "below_ratio", + "canonical_recipe_payload", + "draw_uint256", + "exact_selection_count", + "generator", + "randbelow", + "recipe_sha256", + "replacement_excluding_original", + "select_positions", + "stable_seed", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_topology_bfs_replay_all_20260722_r1/review_a5_sequence_topology_bfs_replay_all_receipt_r1.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_topology_bfs_replay_all_20260722_r1/review_a5_sequence_topology_bfs_replay_all_receipt_r1.json new file mode 100644 index 0000000000000000000000000000000000000000..84a4acee738471043184b3c5e5eff8e6d6cb3316 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_topology_bfs_replay_all_20260722_r1/review_a5_sequence_topology_bfs_replay_all_receipt_r1.json @@ -0,0 +1,38 @@ +{ + "affinose_authorized": false, + "all_mismatch_counts_zero": true, + "builder": { + "bytes": 29456, + "sha256": "5a8e57a7adf06208ec5dc8208858dfdaf719900519c728f9506172d60552fb17" + }, + "checkpoint_resume_authorized": false, + "downstream_evaluation_authorized": false, + "gpu_launch_authorized": false, + "joined_parent_rows": 281208, + "nova_submission_authorized": false, + "official_submitted_or_predecessor_artifacts_modified": false, + "publication": { + "files_read_only": true, + "no_overwrite": true, + "receipt_published_last": true, + "receipt_written_after_payloads": true + }, + "row_ledger": { + "bytes": 3326293, + "name": "review_a5_sequence_topology_bfs_replay_all_rows_r1.tsv.gz", + "row_count": 93047, + "sha256": "40b02a0657297dde0626ca5fc1080b80b46e9baa75e1918f64a9359d5975c479" + }, + "schema": "bertose_a5_sequence_topology_exhaustive_independent_bfs_replay_receipt_v1", + "scientific_launch_authorized": false, + "source_bytes_exact_before_and_after": true, + "status": "PASS_RECEIPT_LAST_ALL_93047_ZERO_MISMATCH", + "summary": { + "bytes": 8477, + "name": "review_a5_sequence_topology_bfs_replay_all_summary_r1.json", + "sha256": "da7814d20c81c0d072544cfc5761e8fae0292def176d63b863083389c9caa0ff" + }, + "training_authorized": false, + "verified_target_rows": 93047, + "warnings_fatal": true +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_topology_bfs_replay_all_20260722_r1/review_a5_sequence_topology_bfs_replay_all_summary_r1.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_topology_bfs_replay_all_20260722_r1/review_a5_sequence_topology_bfs_replay_all_summary_r1.json new file mode 100644 index 0000000000000000000000000000000000000000..466aed158978c439f9eae313983ee95c5a308b3e --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_topology_bfs_replay_all_20260722_r1/review_a5_sequence_topology_bfs_replay_all_summary_r1.json @@ -0,0 +1,236 @@ +{ + "affinose_authorized": false, + "algorithm": { + "distance": "independent all-sources deque BFS with sorted neighbor traversal", + "graph": "authority original-residue-axis undirected tree from official_pair_text", + "original_axis_check": "axis cardinality and SHA256(residue_axis + newline + unique_axis)", + "stored_comparison": "exact int8 C-order bytes for every target", + "target_identity_domain": "bertose_a5_official_original_axis_bfs_v2" + }, + "checkpoint_resume_authorized": false, + "downstream_evaluation_authorized": false, + "exhaustive_row_and_matrix_digest_sha256": "46bcbf8e7ad00d8fa45d6dd3cb4b61d96b1974e93a0b9cae497fc62338edd641", + "gpu_launch_authorized": false, + "nova_submission_authorized": false, + "official_submitted_or_predecessor_artifacts_modified": false, + "publication": { + "exclusive_output_directory_creation": true, + "missing_receipt_means_invalid_incomplete_publication": true, + "no_overwrite": true, + "payload_files_published_before_receipt": true, + "receipt_published_last": true, + "review_prefixed": true + }, + "row_ledger": { + "bytes": 3326293, + "name": "review_a5_sequence_topology_bfs_replay_all_rows_r1.tsv.gz", + "row_count": 93047, + "sha256": "40b02a0657297dde0626ca5fc1080b80b46e9baa75e1918f64a9359d5975c479" + }, + "schema": "bertose_a5_sequence_topology_exhaustive_independent_bfs_replay_v1", + "scientific_launch_authorized": false, + "scope": { + "active_train_or_development_targets": 89564, + "all_parent_role_counts": { + "excluded_exact_or_verified_graph_identity": 3833, + "pretraining_development": 55476, + "pretraining_train": 221899 + }, + "authority_successor_rows": 93047, + "joined_parent_rows": 281208, + "offset_coverage": { + "first": 0, + "gaps": 0, + "last": 5027602, + "overlaps": 0, + "value_count": 5027602 + }, + "residue_count_distribution": { + "10": 3743, + "11": 3128, + "12": 2922, + "13": 1716, + "14": 1559, + "15": 1261, + "16": 797, + "17": 686, + "18": 791, + "19": 335, + "2": 19920, + "20": 265, + "21": 148, + "22": 113, + "23": 38, + "24": 61, + "25": 28, + "26": 10, + "27": 12, + "28": 17, + "29": 4, + "3": 15232, + "30": 28, + "31": 3, + "32": 6, + "33": 17, + "34": 3, + "35": 5, + "36": 21, + "37": 10, + "38": 3, + "39": 1, + "4": 11101, + "40": 6, + "41": 1, + "43": 4, + "44": 2, + "47": 1, + "48": 7, + "5": 8528, + "6": 7024, + "7": 5040, + "8": 4558, + "9": 3892 + }, + "successor_root_action_counts": { + "preserve_exact": 89984, + "preserve_unknown": 1571, + "recover_exact": 1396, + "replace_with_unknown": 96 + }, + "target_role_counts": { + "excluded_exact_or_verified_graph_identity": 3483, + "pretraining_development": 17650, + "pretraining_train": 71914 + }, + "topology_row_coverage": { + "first": 0, + "last": 93046, + "missing": 0, + "unique": 93047 + } + }, + "source_bindings": { + "authority_package_members": { + "review_A5WurcsArrayTreeAudit.java": { + "bytes": 19697, + "sha256": "a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6" + }, + "review_MolWURCS.jar": { + "bytes": 4019920, + "sha256": "bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf" + }, + "review_a5_official_all_exact_topology_roster.tsv.gz": { + "bytes": 3270155, + "sha256": "963323032e4f9b91fbb15824ae61f7de78148c5244f6d99a4854b0ab69cf782f" + }, + "review_a5_official_all_parent_authority.tsv.gz": { + "bytes": 30891891, + "sha256": "82916f13a58f7ff311d81bb3147a0cd887f644bb00c02d1665523666537b45d8" + }, + "review_a5_official_all_parent_authority_receipt.json": { + "bytes": 3475, + "sha256": "32ffbb7d5d1d705b95879e269db0a841888b9283499bba728ecb93924b24cf36" + }, + "review_a5_official_all_parent_authority_summary.json": { + "bytes": 5116, + "sha256": "d2b82bf804f09dbde0b0b468d35e86fa4ae24dc70df8eb220c93d956529be9bd" + }, + "review_a5_official_helper_input_all.tsv": { + "bytes": 80455364, + "sha256": "27da2fa1513e77e7f1ced2b5461299d9a997138a643db99f5b2de704bec7a746" + }, + "review_a5_official_helper_raw_all.tsv": { + "bytes": 98093444, + "sha256": "d69583e2499f775ded3f18baaee843de4dd7c424e2ce5780ad89acab517d85fc" + }, + "review_a5_official_retained_topology_gt26.tsv.gz": { + "bytes": 1398, + "sha256": "4a308c7bbfd45ef1cb966e372af594f3decc81c62df02e66a85c94ece35826ce" + }, + "review_frozen_later_role_partition.tsv.gz": { + "bytes": 12149834, + "sha256": "86a8c6742156683d502c93fc71b31b9a93450037d647e5a90db437a015bb3bbc" + }, + "review_frozen_p1_topology_gate.tsv.gz": { + "bytes": 13585948, + "sha256": "5fb976a4b3440eb60b52bce9e1932d197f90bf3e074c6e8438bfe92b93c0c7da" + }, + "review_owner_clean_builder.py": { + "bytes": 16295, + "sha256": "2e84b03ab2189f009654e97c427930cc511c50d079db06f425035fcfb2ae1efb" + }, + "review_predecessor_sequence_parent_index.tsv.gz": { + "bytes": 17485509, + "sha256": "3b9e9f6b4671448cea70a3c16717dc6538c01c59ebfce478ce274e133e563ac3" + }, + "review_wurcsframework-1.3.1.jar": { + "bytes": 340319, + "sha256": "5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37" + } + }, + "direct_inputs": { + "freezer_source": { + "bytes": 37966, + "path": "writing/review/multimodal/scripts/freeze_review_a5_official_sequence_topology_successor_20260721.py", + "sha256": "d9411d45963129254c33d8fcc5761dcb373f2e3a3286651df4445a1304d1c10b" + }, + "frozen_topology_source": { + "bytes": 6186, + "path": "data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py", + "sha256": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7" + }, + "reference_250_replay_builder": { + "bytes": 16505, + "path": "writing/review/multimodal/scripts/build_review_a5_sequence_topology_bfs_replay_250_20260721.py", + "sha256": "f8a804d27975d777fc8788ca29b878a10300ac89d63ef0942664fe900bd8a56d" + }, + "sequence_parent_index": { + "bytes": 14697953, + "path": "data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz", + "sha256": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0" + }, + "topology_lengths": { + "bytes": 93175, + "path": "writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_lengths.npy", + "sha256": "b52f6ddcf327b8cfc5159659bada97357216f9526b42c230a35192932f43d2f3" + }, + "topology_offsets": { + "bytes": 744512, + "path": "writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_offsets.npy", + "sha256": "e06d61b8e47c2a2a3e0c8aeec7e015e673f64f0f483a483abe40ccda2d08b9e0" + }, + "topology_row": { + "bytes": 1124960, + "path": "writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_row.npy", + "sha256": "a0ae28b0476322e3dbeda42a891f4a42c0973002a5d8507bf387b12dcbff4e95" + }, + "topology_values": { + "bytes": 5027730, + "path": "writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_topology_values.npy", + "sha256": "2d4ba8395f78864b7eed9ed250bb9fd50bd45ef84a10ed497ffb89c684276e4e" + } + }, + "exhaustive_replay_builder": { + "bytes": 29456, + "sha256": "5a8e57a7adf06208ec5dc8208858dfdaf719900519c728f9506172d60552fb17" + }, + "verified_exact_before_and_after_replay": true + }, + "status": "PASS_ALL_93047_ZERO_MISMATCH", + "training_authorized": false, + "warnings_fatal": true, + "zero_mismatch_counts": { + "authority_sequence_array_topology_row": 0, + "axis": 0, + "canonical_wurcs_identity": 0, + "length": 0, + "matrix": 0, + "offset": 0, + "parent_join": 0, + "role_join": 0, + "source_row_ordinal": 0, + "successor_row_duplicate": 0, + "successor_row_missing": 0, + "target_identity": 0 + } +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_v4_two_run_reproduction_20260722_r1/review_a5_sequence_v4_two_run_reproduction_receipt.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_v4_two_run_reproduction_20260722_r1/review_a5_sequence_v4_two_run_reproduction_receipt.json new file mode 100644 index 0000000000000000000000000000000000000000..8a1759b720a88ad084d013a1969f0c3c57f7f480 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_v4_two_run_reproduction_20260722_r1/review_a5_sequence_v4_two_run_reproduction_receipt.json @@ -0,0 +1,31 @@ +{ + "checkpoint_resume_authorized": false, + "downstream_evaluation_authorized": false, + "gpu_launch_authorized": false, + "nova_submission_authorized": false, + "official_submitted_or_predecessor_artifacts_modified": false, + "payloads": { + "review_a5_sequence_v4_two_run_reproduction_summary.json": { + "bytes": 6916, + "sha256": "d6b3dad73d8c9cc78a7c721e7969280d0ff6500773402545bc2ff143b125f56c" + }, + "verifier_source": { + "bytes": 20488, + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/scripts/review_a5_sequence_v4_two_run_reproduction_verifier_20260722.py", + "sha256": "0062f4076cbb1764a8aa87f976904000d2c29609705c762e925ccd94ece43672" + } + }, + "publication": { + "atomic_rename": true, + "large_reproductions_retained": false, + "no_overwrite": true + }, + "schema": "bertose_a5_sequence_v4_two_run_reproduction_receipt_v1", + "scientific_launch_authorized": false, + "status": "PASS_RECEIPT_LAST", + "summary": { + "bytes": 6916, + "sha256": "d6b3dad73d8c9cc78a7c721e7969280d0ff6500773402545bc2ff143b125f56c" + }, + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_v4_two_run_reproduction_20260722_r1/review_a5_sequence_v4_two_run_reproduction_summary.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_v4_two_run_reproduction_20260722_r1/review_a5_sequence_v4_two_run_reproduction_summary.json new file mode 100644 index 0000000000000000000000000000000000000000..584a79838ef0d6c7c3db42eff0616967c8a3d2d3 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_v4_two_run_reproduction_20260722_r1/review_a5_sequence_v4_two_run_reproduction_summary.json @@ -0,0 +1,128 @@ +{ + "authority_audit": { + "all_flags_false": true, + "documents_checked": 18, + "flags_checked_per_document": [ + "training_authorized", + "scientific_launch_authorized", + "gpu_launch_authorized", + "nova_submission_authorized", + "checkpoint_resume_authorized", + "downstream_evaluation_authorized", + "official_submitted_or_predecessor_artifacts_modified" + ] + }, + "bpe_fit_audit": { + "development_fit_parent_count": 0, + "fit_ledger_sha256": "4ec8dfaeacef355092313507ab71c628f48ddf1a4fe39e7663748060a07af297", + "fit_order_and_parent_wurcs_exact": true, + "fit_parent_count": 221899, + "fit_role_counts": { + "pretraining_train": 221899 + }, + "sequence_parent_count": 281208 + }, + "checkpoint_resume_authorized": false, + "disk_safety": { + "free_before_bytes": 65350656000, + "official_three_package_bytes_per_run": 884560096, + "required_with_four_gib_safety_margin": 6064087488, + "two_run_bytes": 1769120192 + }, + "downstream_evaluation_authorized": false, + "freezer": { + "bytes": 37966, + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/scripts/freeze_review_a5_official_sequence_topology_successor_20260721.py", + "sha256": "d9411d45963129254c33d8fcc5761dcb373f2e3a3286651df4445a1304d1c10b" + }, + "gpu_launch_authorized": false, + "nova_submission_authorized": false, + "official_packages": { + "authority": { + "declared_member_count": 14, + "declared_member_manifest_sha256": "dd8598927f6292331989d1155fb719ebd66bb0b72c4bf8467e18da5b431aaac3", + "direct_nonmember_entries_not_part_of_receipted_package": [], + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/review_a5_sequence_tree_official_array_all_parent_audit_20260721_r1" + }, + "sequence": { + "declared_member_count": 26, + "declared_member_manifest_sha256": "0a6171e0494035245af819c45f4acaf63de2680bf2d7ea6245e1b77f87fca48a", + "direct_nonmember_entries_not_part_of_receipted_package": [ + { + "kind": "directory", + "name": "__pycache__" + } + ], + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" + }, + "topology": { + "declared_member_count": 7, + "declared_member_manifest_sha256": "a1fdc152a174ac58384a51a9a238791479bbf2f88ba0a7a1e1d11b8192a4880e", + "direct_nonmember_entries_not_part_of_receipted_package": [], + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1" + } + }, + "official_submitted_or_predecessor_artifacts_modified": false, + "owner_surface": { + "bound_input_manifest_sha256": "b15bc065e881f95637ddb24a161e445ce5ed995826c8d73e2807c6ce0002be05", + "owner_report_sha256": "2c24a655f009c6994756d8199b26c3e6489222c4b26d90efd0c43aacc17b9e4c", + "payload_count": 13, + "payload_manifest_sha256": "f877cca1fb99c82899cce59a4ff0b170e8d8219d28a9e2798593d42b6bbe9a2c", + "source": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" + }, + "publication": { + "large_temporary_reproductions_retained": false, + "official_or_predecessor_namespace_written": false, + "temporary_namespace_removed_after_hash_and_byte_comparison": true + }, + "reproduction": { + "all_members_run1_run2_official_byte_for_byte_identical": true, + "all_members_run1_run2_official_sha256_identical": true, + "authority_members_compared": 14, + "distinct_temporary_output_namespaces": true, + "fresh_output_run_count": 2, + "run_receipts": [ + { + "authority_output": "/private/tmp/review_a5_sequence_v4_repro_gbwsgu4h/run_1/review_authority", + "authority_receipt_sha256": "32ffbb7d5d1d705b95879e269db0a841888b9283499bba728ecb93924b24cf36", + "sequence_output": "/private/tmp/review_a5_sequence_v4_repro_gbwsgu4h/run_1/review_sequence", + "sequence_receipt_sha256": "399df3de2b6c4d5e88aa442c8326214ab9cff2e8f0411e6921762bbade1475ba", + "topology_output": "/private/tmp/review_a5_sequence_v4_repro_gbwsgu4h/run_1/review_topology", + "topology_receipt_sha256": "333ee6f34e69f89e26b810cc565415b89d6874615ea4ac57850371fb159c1b71" + }, + { + "authority_output": "/private/tmp/review_a5_sequence_v4_repro_gbwsgu4h/run_2/review_authority", + "authority_receipt_sha256": "32ffbb7d5d1d705b95879e269db0a841888b9283499bba728ecb93924b24cf36", + "sequence_output": "/private/tmp/review_a5_sequence_v4_repro_gbwsgu4h/run_2/review_sequence", + "sequence_receipt_sha256": "399df3de2b6c4d5e88aa442c8326214ab9cff2e8f0411e6921762bbade1475ba", + "topology_output": "/private/tmp/review_a5_sequence_v4_repro_gbwsgu4h/run_2/review_topology", + "topology_receipt_sha256": "333ee6f34e69f89e26b810cc565415b89d6874615ea4ac57850371fb159c1b71" + } + ], + "sequence_members_compared": 26, + "topology_members_compared": 7 + }, + "schema": "bertose_a5_sequence_v4_two_run_reproduction_v1", + "scientific_launch_authorized": false, + "source_binding_manifest_sha256": "042a5b71c866bd347125ecc059db25e35bbfe7d594b95f009b0dd57a384db4a2", + "source_bindings": { + "ambiguity": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b", + "builder": "2e84b03ab2189f009654e97c427930cc511c50d079db06f425035fcfb2ae1efb", + "fit": "4ec8dfaeacef355092313507ab71c628f48ddf1a4fe39e7663748060a07af297", + "gate": "5fb976a4b3440eb60b52bce9e1932d197f90bf3e074c6e8438bfe92b93c0c7da", + "helper": "a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6", + "index": "3b9e9f6b4671448cea70a3c16717dc6538c01c59ebfce478ce274e133e563ac3", + "input_all": "27da2fa1513e77e7f1ced2b5461299d9a997138a643db99f5b2de704bec7a746", + "molwurcs": "bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf", + "owner_report": "2c24a655f009c6994756d8199b26c3e6489222c4b26d90efd0c43aacc17b9e4c", + "partition": "86a8c6742156683d502c93fc71b31b9a93450037d647e5a90db437a015bb3bbc", + "pretokenizer": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4", + "raw": "d69583e2499f775ded3f18baaee843de4dd7c424e2ce5780ad89acab517d85fc", + "topology_source": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7", + "tree_runtime": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04", + "vocabulary": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b", + "wurcsframework": "5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37" + }, + "status": "PASS_TWO_DISTINCT_FRESH_FREEZES_ALL_DECLARED_BYTES_IDENTICAL", + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_epoch_boundary_continuation_11762446_r1.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_epoch_boundary_continuation_11762446_r1.json new file mode 100644 index 0000000000000000000000000000000000000000..0efc666379b1e712a4dbacc39142c3eef3703cbc --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_epoch_boundary_continuation_11762446_r1.json @@ -0,0 +1 @@ +{"ablation_or_downstream_opened":false,"batch_script_absolute_path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/a5_static_v2_epoch_boundary_resume_20260725_r1/run_review_a5_static_v2_epoch_boundary_resume_r1_scavenger_v100.sbatch","batch_script_file_sha256":"f420c84258cdf4247fdd766a9e8470bad55bd1f845ebd6640ec70b97b3953e6e","batch_script_size_bytes":3389,"checkpoint_contract_sha256":"d4214b58b5dbe9af571b83739fdaf5a399c0d6d4e31a55f89a8f901f8855c8a9","checkpoint_policy":"one_startup_publication_then_completed_epochs_only","constraint_tokens":["nova18","v100"],"cross_class_resume_authorized":false,"features":["nova18","v100"],"generic_gpu_request":"gpu:1","initial_checkpoint_head_sha256":"0765a1e1dc363570daf0ea454343fd757a6564c759903aeb71b07df84d80fecd","initial_checkpoint_payload_sha256":"c45db638a2a890ce3aa9d2647c8419a8f1264ae364f943abe8460fb9643fdc8a","initial_checkpoint_readback":{"checkpoint_ordinal":28363,"checkpoint_semantic_sha256":"3a91fa7d33ad9fd4771c7f70eba8525cdcdf2ac3fad1d98c7d67a59faa0e3163","head_sha256":"0765a1e1dc363570daf0ea454343fd757a6564c759903aeb71b07df84d80fecd","receipt_sha256":"4de25b14c6230bebbcfb1928ac75576013a22d2f3afdedbb46b7aebe9876b88e"},"initial_checkpoint_receipt_sha256":"4de25b14c6230bebbcfb1928ac75576013a22d2f3afdedbb46b7aebe9876b88e","initial_checkpoint_semantic_sha256":"3a91fa7d33ad9fd4771c7f70eba8525cdcdf2ac3fad1d98c7d67a59faa0e3163","initial_epoch_index":12,"initial_group_cursor":252,"launcher_source_sha256":"b198471e6c57c7c452952b3fd701ad5d6880b132dd4d8c3988fa6b7bea20bedd","maximum_replay_scope":"current_incomplete_epoch_only","parent_authority_file_sha256":"14a3b3ac5167bd558a6db53e4940aff3a19fd54b24a4d43d026c4d958d4a93cc","parent_bundle_file_sha256":"fb7ef6d0427e42a2a6d94fbe0f2aa41e205d840180b4e4f81eebd3f0d0c0395d","parent_dependent_job_id":"11759688","parent_job_id":"11759687","parent_jobs_terminal":true,"parent_submission_file_sha256":"878d3eb5b6bbc4903b57d164d5641a47b9b5ec7effec46eb6dae0ef1852ec817","parent_submission_payload_sha256":"2cd0573ffe936a5d7831809b521fc045f296e7eeb0783a9107f867cdd8431381","receipt_sha256":"6fd0cf5482904937babd3ff93c2908bc7693ea88fa80c8efc3e169fda747e738","resume_device_class_sha256":"f73fda38334de1b0b41af0db00d15514a7a41519932f3f6332faecaf0290e358","scheduler_job_name":"review_a5_sv2_af805f5d2cb8c32e","scheduler_route":{"account":"ratul-scavenger","partition":"scavenger","qos":"scavenger"},"scheduler_stdout_sha256":"20005d10533c468b983ead5aeaeea80c6110d2bc3820b824c07739b4571e2bae","schema":"bertose_a5_static_v2_epoch_boundary_continuation_20260725_r1","second_runnable_copy_authorized":false,"status":"OWNER_AUTHORIZED_CANCELLED_JOB_EPOCH_BOUNDARY_SUCCESSOR_ONLY","submitted_utc":"2026-07-25T06:51:00Z","successor_job_id":"11762446"} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_epoch_boundary_continuation_11762534_r1.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_epoch_boundary_continuation_11762534_r1.json new file mode 100644 index 0000000000000000000000000000000000000000..15cfae0ea624740f1d2f642340e59130622cccef --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_epoch_boundary_continuation_11762534_r1.json @@ -0,0 +1 @@ +{"ablation_or_downstream_opened":false,"batch_script_absolute_path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/a5_static_v2_epoch_boundary_resume_20260725_r1/run_review_a5_static_v2_epoch_boundary_resume_r1_scavenger_v100.sbatch","batch_script_file_sha256":"f420c84258cdf4247fdd766a9e8470bad55bd1f845ebd6640ec70b97b3953e6e","batch_script_size_bytes":3389,"checkpoint_contract_sha256":"d4214b58b5dbe9af571b83739fdaf5a399c0d6d4e31a55f89a8f901f8855c8a9","checkpoint_policy":"one_startup_publication_then_completed_epochs_only","constraint_tokens":["nova18","v100"],"cross_class_resume_authorized":false,"features":["nova18","v100"],"generic_gpu_request":"gpu:1","initial_checkpoint_head_sha256":"0765a1e1dc363570daf0ea454343fd757a6564c759903aeb71b07df84d80fecd","initial_checkpoint_payload_sha256":"c45db638a2a890ce3aa9d2647c8419a8f1264ae364f943abe8460fb9643fdc8a","initial_checkpoint_readback":{"checkpoint_ordinal":28363,"checkpoint_semantic_sha256":"3a91fa7d33ad9fd4771c7f70eba8525cdcdf2ac3fad1d98c7d67a59faa0e3163","head_sha256":"0765a1e1dc363570daf0ea454343fd757a6564c759903aeb71b07df84d80fecd","receipt_sha256":"4de25b14c6230bebbcfb1928ac75576013a22d2f3afdedbb46b7aebe9876b88e"},"initial_checkpoint_receipt_sha256":"4de25b14c6230bebbcfb1928ac75576013a22d2f3afdedbb46b7aebe9876b88e","initial_checkpoint_semantic_sha256":"3a91fa7d33ad9fd4771c7f70eba8525cdcdf2ac3fad1d98c7d67a59faa0e3163","initial_epoch_index":12,"initial_group_cursor":252,"launcher_source_sha256":"b198471e6c57c7c452952b3fd701ad5d6880b132dd4d8c3988fa6b7bea20bedd","maximum_replay_scope":"current_incomplete_epoch_only","parent_authority_file_sha256":"14a3b3ac5167bd558a6db53e4940aff3a19fd54b24a4d43d026c4d958d4a93cc","parent_bundle_file_sha256":"fb7ef6d0427e42a2a6d94fbe0f2aa41e205d840180b4e4f81eebd3f0d0c0395d","parent_dependent_job_id":"11759688","parent_job_id":"11759687","parent_jobs_terminal":true,"parent_submission_file_sha256":"878d3eb5b6bbc4903b57d164d5641a47b9b5ec7effec46eb6dae0ef1852ec817","parent_submission_payload_sha256":"2cd0573ffe936a5d7831809b521fc045f296e7eeb0783a9107f867cdd8431381","receipt_sha256":"ddcf206531b9ab2db553b2e7773a6787d0ca9c0344b7985d70dc06d75e9814b8","resume_device_class_sha256":"f73fda38334de1b0b41af0db00d15514a7a41519932f3f6332faecaf0290e358","scheduler_job_name":"review_a5_sv2_af805f5d2cb8c32e","scheduler_route":{"account":"ratul-scavenger","partition":"scavenger","qos":"scavenger"},"scheduler_stdout_sha256":"1234b7ab4aa85a99d4dc1d6de4e1f3c84f3301ca66b522d426df51f3276ff340","schema":"bertose_a5_static_v2_epoch_boundary_continuation_20260725_r1","second_runnable_copy_authorized":false,"status":"OWNER_AUTHORIZED_CANCELLED_JOB_EPOCH_BOUNDARY_SUCCESSOR_ONLY","submitted_utc":"2026-07-25T07:19:11Z","successor_job_id":"11762534"} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_amendment_11762446_r2.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_amendment_11762446_r2.json new file mode 100644 index 0000000000000000000000000000000000000000..6e12791b7286b742e40240e70c58b7883cbe0646 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_amendment_11762446_r2.json @@ -0,0 +1,36 @@ +{ + "ablation_or_downstream_opened": false, + "amended_min_memory_bytes": 68719476736, + "basis": { + "cancelled_parent_batch_job_id": "11759687.batch", + "cancelled_parent_elapsed": "16:29:03", + "cancelled_parent_max_rss_bytes": 13446082560, + "cancelled_parent_max_rss_kib": 13130940, + "evidence_command_argv": [ + "sacct", + "-j", + "11759687.batch", + "--starttime", + "2026-07-24", + "-n", + "-P", + "--units=K", + "-o", + "JobIDRaw,State,Elapsed,MaxRSS,MaxVMSize,AveRSS,ReqMem" + ], + "host_memory_headroom_denominator_bytes": 13446082560, + "host_memory_headroom_numerator_bytes": 68719476736 + }, + "checkpoint_or_scientific_state_changed": false, + "continuation_receipt_file_sha256": "8ff3181d22567728c0a10580c1e775da0714f17561ace81034fc673813f54af6", + "continuation_receipt_sha256": "6fd0cf5482904937babd3ff93c2908bc7693ea88fa80c8efc3e169fda747e738", + "job_id": "11762446", + "prior_min_memory_bytes": 137438953472, + "rationale": "reduce pending-job scheduler fragmentation using greater-than-five-fold headroom over the observed full-process peak RSS; training bytes, checkpoint, GPU class, route, and one-copy identity remain unchanged", + "receipt_sha256": "f650808b563c41db13ead25f46538a5b804924189cdcbbffe50bc05e8ee536fe", + "sbatch_source_modified": false, + "schema": "bertose_a5_static_v2_pending_job_memory_rightsizing_20260725_r2", + "second_runnable_copy_created": false, + "status": "OWNER_AUTHORIZED_PENDING_JOB_SCHEDULER_MEMORY_RIGHTSIZING_ONLY", + "updated_utc": "2026-07-25T06:56:10Z" +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_amendment_11762534_r3.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_amendment_11762534_r3.json new file mode 100644 index 0000000000000000000000000000000000000000..fd57d903aa7219da4888df5716f64b8bc3e3a3c4 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_amendment_11762534_r3.json @@ -0,0 +1,36 @@ +{ + "ablation_or_downstream_opened": false, + "amended_min_memory_bytes": 68719476736, + "basis": { + "cancelled_parent_batch_job_id": "11759687.batch", + "cancelled_parent_elapsed": "16:29:03", + "cancelled_parent_max_rss_bytes": 13446082560, + "cancelled_parent_max_rss_kib": 13130940, + "evidence_command_argv": [ + "sacct", + "-j", + "11759687.batch", + "--starttime", + "2026-07-24", + "-n", + "-P", + "--units=K", + "-o", + "JobIDRaw,State,Elapsed,MaxRSS,MaxVMSize,AveRSS,ReqMem" + ], + "host_memory_headroom_denominator_bytes": 13446082560, + "host_memory_headroom_numerator_bytes": 68719476736 + }, + "checkpoint_or_scientific_state_changed": false, + "continuation_receipt_file_sha256": "163374c5c6b049908d935f0d92d8f1a1adda761550761db9b2cb423bfb450ee1", + "continuation_receipt_sha256": "ddcf206531b9ab2db553b2e7773a6787d0ca9c0344b7985d70dc06d75e9814b8", + "job_id": "11762534", + "prior_min_memory_bytes": 137438953472, + "rationale": "reduce pending-job scheduler fragmentation using greater-than-five-fold headroom over the observed full-process peak RSS; training bytes, checkpoint, GPU class, route, and one-copy identity remain unchanged", + "receipt_sha256": "0763d56c90aea0841298cfc3bb99ab773312c9116d1e3207b48c908bdedfcb2b", + "sbatch_source_modified": false, + "schema": "bertose_a5_static_v2_pending_job_memory_rightsizing_20260725_r3", + "second_runnable_copy_created": false, + "status": "OWNER_AUTHORIZED_PENDING_JOB_SCHEDULER_MEMORY_RIGHTSIZING_ONLY", + "updated_utc": "2026-07-25T07:19:51Z" +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_rightsizing_applied_11762446_r2.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_rightsizing_applied_11762446_r2.json new file mode 100644 index 0000000000000000000000000000000000000000..b3acb380ab25171fdbeb02fd5354ddf187d1c2f2 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_rightsizing_applied_11762446_r2.json @@ -0,0 +1,31 @@ +{ + "action_applied": true, + "amended_min_memory_bytes": 68719476736, + "amendment_file_sha256": "85711141c9d0e84dee228df84d02df7d4693fb4b85b1ae8163466e208f5e9fd6", + "amendment_receipt_sha256": "f650808b563c41db13ead25f46538a5b804924189cdcbbffe50bc05e8ee536fe", + "captured_utc": "2026-07-25T06:58:27Z", + "checkpoint_or_scientific_state_changed": false, + "job_id": "11762446", + "job_name": "review_a5_sv2_af805f5d2cb8c32e", + "one_runnable_copy_only": true, + "prior_min_memory_bytes": 137438953472, + "receipt_sha256": "600aeaa3ce59d1aba7aa40d2f5c6d0ae257b5abbe5e9cd26589a4ab304df8413", + "scheduler_readback": { + "account": "ratul-scavenger", + "constraint_tokens": [ + "nova18", + "v100" + ], + "job_state": "PENDING", + "partition": "scavenger", + "pending_reason": "Priority", + "qos": "scavenger", + "requested_gres": "gpu:1", + "requested_memory": "64G", + "scontrol_stdout_sha256": "95acfc5241f89d2f7bf451c99fb1bb496a5a3c348f99a68d77f8961c354bf2fc", + "squeue_row": "11762446|review_a5_sv2_af805f5d2cb8c32e|PENDING|(Priority)|64G|scavenger|ratul-scavenger|scavenger|v100&nova18|", + "squeue_stdout_sha256": "d9ba34bae141681cd115f6db07fb811407e81d9309bf24027430f0567b164dd9" + }, + "schema": "bertose_a5_static_v2_pending_job_memory_rightsizing_applied_20260725_r2", + "status": "PASS_SCHEDULER_MEMORY_RIGHTSIZING_APPLIED_WITHOUT_RESUBMISSION" +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_rightsizing_applied_11762534_r3.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_rightsizing_applied_11762534_r3.json new file mode 100644 index 0000000000000000000000000000000000000000..be46b8a26307e31f67e3f29934f82b5cc890b661 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_rightsizing_applied_11762534_r3.json @@ -0,0 +1,31 @@ +{ + "action_applied": true, + "amended_min_memory_bytes": 68719476736, + "amendment_file_sha256": "0d96b7867eeec85dbf14eb8f55b745b7c354edb5d16ac702d17b97bf850c79af", + "amendment_receipt_sha256": "0763d56c90aea0841298cfc3bb99ab773312c9116d1e3207b48c908bdedfcb2b", + "captured_utc": "2026-07-25T07:20:50Z", + "checkpoint_or_scientific_state_changed": false, + "job_id": "11762534", + "job_name": "review_a5_sv2_af805f5d2cb8c32e", + "one_runnable_copy_only": true, + "prior_min_memory_bytes": 137438953472, + "receipt_sha256": "90d9c8ead2ec77d43c5774f4df331fdb2dba8fb27c4e6674f193d495510d5fca", + "scheduler_readback": { + "account": "ratul-scavenger", + "constraint_tokens": [ + "nova18", + "v100" + ], + "job_state": "PENDING", + "partition": "scavenger", + "pending_reason": "Priority", + "qos": "scavenger", + "requested_gres": "gpu:1", + "requested_memory": "64G", + "scontrol_stdout_sha256": "9dd563fc0a27d3090fb284f3ca6633b9cf71e5e8b7770b331f60ba53fc71b915", + "squeue_row": "11762534|review_a5_sv2_af805f5d2cb8c32e|PENDING|(Priority)|64G|scavenger|ratul-scavenger|scavenger|v100&nova18|", + "squeue_stdout_sha256": "8975d66436464799d12a6d853407aab1445db2f4f0ee287bbd06f56428660ead" + }, + "schema": "bertose_a5_static_v2_pending_job_memory_rightsizing_applied_20260725_r3", + "status": "PASS_SCHEDULER_MEMORY_RIGHTSIZING_APPLIED_WITHOUT_RESUBMISSION" +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_cpu_finalization_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_cpu_finalization_execution_r21.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_cpu_finalization_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_cpu_finalization_execution_r21.json new file mode 100644 index 0000000000000000000000000000000000000000..ea7c55ae0281de04193c583921e8a1cfcff250fb --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_cpu_finalization_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_cpu_finalization_execution_r21.json @@ -0,0 +1 @@ +{"authorization":{"affinose_authorized":false,"downstream_authorized":false,"native_ablation_data_binding_authorized":false,"native_ablation_launch_authorized":false,"nova_submission_authorized":false},"checkpoint_reselected":false,"egnn_or_rvq_inference_performed":false,"failure_and_mass_evidence":{"bytes":3088,"failed_job_state":"FAILED","relative_path":"review/multimodal/outputs/review_a5_static_v2_postfit_cpu_finalization_evidence_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_r20_failure_and_r21_mass_diagnostic_evidence.json","sha256":"866336ffb63d35046f6cb2543f5b49599d600f12e9b6571b8c9b0359b26e61f3","stable_delta_per_slot":[0.0,0.0,0.0,0.0]},"finalizer_job_id":"11772779","inner_r20_execution_receipt_sha256":"b33f667437676bfbbef7ace7fcc6d976a9f1734da80a0cba902b5512f34e2c1a","inner_r20_receipt_sha256":"fe9423af998127903a82f46187de9f83b51b2c66aab4fe506fc9d0094380e2ab","model_restored_or_executed":false,"official_submitted_artifacts_modified":false,"publication_receipt_sha256":"654faac335def8eccb7c50eb8a7d871036bf2a8c223e61f0cb11027830869a84","r20_predecessor":{"bytes":40953,"relative_path":"review/multimodal/runtime/a5_static_v2_postfit_cpu_finalization_20260728_r20_receipt_order_adapter/review_a5_static_v2_postfit_cpu_finalization_r20.py","sha256":"e40627761d4a20575c2d2552fe8d9344eeb42523df31406e2cc4355ba2e78682"},"r21_adapter_source":{"bytes":24827,"relative_path":"review/multimodal/runtime/a5_static_v2_postfit_cpu_finalization_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_cpu_finalization_r21.py","sha256":"f34a7128e257abc8e4b37d3f76ebc5302fc5934a9f3f8da2ef2f6abf09e0e10e"},"receipt_sha256":"c9cb2b267e5b4375f2bc7bbe09c6377ff7c897114c321b09fd7bad176df78dc9","schema":"bertose_a5_static_v2_postfit_cpu_finalization_20260728_r21","source_r20_failed_job_id":"11772763","stable_null_mass_adapter":{"all_order_replays_byte_identical":true,"audit":{"audit_sha256":"d56d7cd58ac32f0f8218d66db6bb60b5be61fc2c0a99435c84640fc3aa27829f","exact_counts":{"parent_count":22980,"residue_count":205801,"state_count":34408},"exact_rational_parent_mass_passed":true,"frozen_naive_probabilities_preserved":true,"fsum_naive_bins_delta_per_slot":[-9.094947017729282e-11,-1.382431946694851e-10,-5.820766091346741e-11,-1.3096723705530167e-10],"fsum_naive_bins_per_slot":[22979.99999999991,22979.99999999986,22979.99999999994,22979.99999999987],"max_abs_naive_vs_stable_code_mass_per_slot":[1.432454155292362e-11,5.775291356258094e-11,7.639755494892597e-11,4.411049303598702e-11],"max_abs_naive_vs_stable_probability_per_slot":[6.175615574477433e-16,2.4980018054066022e-15,3.3306690738754696e-15,1.915134717478395e-15],"naive_np_sum_delta_per_slot":[-9.094947017729282e-11,-1.382431946694851e-10,-5.820766091346741e-11,-1.3096723705530167e-10],"naive_np_sum_hex_per_slot":["0x1.670ffffffffe7p+14","0x1.670ffffffffdap+14","0x1.670fffffffff0p+14","0x1.670ffffffffdcp+14"],"naive_np_sum_per_slot":[22979.99999999991,22979.99999999986,22979.99999999994,22979.99999999987],"naive_probability_sha256_by_slot":["a90c8005ac4f4ca10bc68505cdb19a8d33255aedcfb0347bce6bb05bfb1f3d99","6792eabd175bed56116c9d2a4a00f453decfd8cb727162d24a8dc17c15b8b594","4f40a667460f23f6baf04a08cbdf4026e4779c2d99a20d8a7f10f6611c8e2c5a","c9eccf5f25a71fa55271a36523ba16bfe7f73501e52260b14a48676cd8a92264"],"stable_parent_structural_delta":0.0,"stable_parent_structural_mass":22980.0,"stable_parent_structural_mass_hex":"0x1.6710000000000p+14","stable_per_code_sum_delta_per_slot":[0.0,0.0,0.0,0.0],"stable_per_code_sum_per_slot":[22980.0,22980.0,22980.0,22980.0],"stable_probabilities_used_for_publication":false,"stable_probability_sha256_by_slot_diagnostic_only":["429e7d15fe0796510dd0d30b721fd4413f41af3e1f554ecf634de6e012ff3c49","67714dfabc4692554907dc3c21b93cd300ef324a4e715353dd841c35679d2deb","1da07ea067be51de23d6d2ecf2d80f632053abf7687e64434d0cb20a52f245d9","42560924d11b9bda528f2c855d38d02de4d33ebb60c1e1bc9bdc0d4754addc19"]},"fragile_mass_checks":[{"delta":-9.094947017729282e-11,"fragile_original_guard_passed":true,"observed":22979.99999999991,"observed_hex":"0x1.670ffffffffe7p+14","roundoff_bound_64_ulp":2.3283064365386963e-10,"slot":0,"stable_structural_guard_passed":true,"within_roundoff_bound":true},{"delta":-1.382431946694851e-10,"fragile_original_guard_passed":false,"observed":22979.99999999986,"observed_hex":"0x1.670ffffffffdap+14","roundoff_bound_64_ulp":2.3283064365386963e-10,"slot":1,"stable_structural_guard_passed":true,"within_roundoff_bound":true},{"delta":-5.820766091346741e-11,"fragile_original_guard_passed":true,"observed":22979.99999999994,"observed_hex":"0x1.670fffffffff0p+14","roundoff_bound_64_ulp":2.3283064365386963e-10,"slot":2,"stable_structural_guard_passed":true,"within_roundoff_bound":true},{"delta":-1.3096723705530167e-10,"fragile_original_guard_passed":false,"observed":22979.99999999987,"observed_hex":"0x1.670ffffffffdcp+14","roundoff_bound_64_ulp":2.3283064365386963e-10,"slot":3,"stable_structural_guard_passed":true,"within_roundoff_bound":true}],"frozen_null_receipt_sha256":"683283e6fb1bd6ba19f80f59f7bf938c751dc8feaab9325e476b9e886829b91d","frozen_weighted_counts_probabilities_risks_scale_and_hashes_preserved":true,"invocation_count":4},"status":"PASS_R20_SHARDS_PUBLISHED_AFTER_STABLE_TRAIN_NULL_MASS_PROOF","training_performed":false} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_publication_receipt_r4.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_publication_receipt_r4.json new file mode 100644 index 0000000000000000000000000000000000000000..1bdad5344138e65e6f0169cbfe4f15319aa0e81e --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_publication_receipt_r4.json @@ -0,0 +1 @@ +{"authorization":{"ablation_launch_authorized":false,"affinose_authorized":false,"automatic_promotion_authorized":false,"capacity_payload_open_authorized":false,"downstream_authorized":false,"nova_submission_authorized":false,"owner_promotion_authorized":false,"token_publication_authorized":false},"development_used_for_checkpoint_selection_after_amendment":false,"development_used_for_support_or_null_fit":false,"export_receipt":{"authorization":{"ablation_launch_authorized":false,"affinose_authorized":false,"automatic_promotion_authorized":false,"capacity_payload_open_authorized":false,"downstream_authorized":false,"nova_submission_authorized":false,"owner_promotion_authorized":false,"token_publication_authorized":false},"caller_supplied_code_path_used":false,"complete_development_adapter_receipt_sha256":"bd5765d1e6b28dc69b7af404188dd2fd6b999ac3f116896d62f1adf5cfafde6d","complete_development_adapter_source_sha256":"9794d59c8efa0102d56fa26fee7024ada2c4484a4cf54c411e6c3ea471571558","development_codes_all_within_train_support":true,"development_used_for_support_or_null_fit":false,"device_execution_identity_sha256":"3bb4ff14f4acf46f3573b215166dc7868f2364732e7aee79960d25ba95442be3","exact_counts":{"all":{"parent_count":28370,"residue_count":257038,"state_count":42372,"token_count":1028152},"pretraining_development":{"parent_count":5390,"residue_count":51237,"state_count":7964},"pretraining_train":{"parent_count":22980,"residue_count":205801,"state_count":34408}},"export_model_state_sha256":"5f0ed32679d23cc4ed9c2051469ec94d713e677e8a3dcaf1a77303e305c3cad4","legacy_selection_capacity_role_split_used":false,"null_receipt_sha256":"84d8fdb5e960ed0f695c1618d881fe9dd13062e2ad143e099fc7db6415e54c89","official_submitted_artifacts_modified":false,"ordered_parent_ids_sha256":"7071d018b53f4363901b80e311e24e434f5c5d306df4308bc63e4abc1063623e","ordered_parent_inference_receipt_sha256":"66766fdb5355e12f146b850e47b38561425682bd2c94e3bcb029c9ef360d9153","ordered_state_ids_sha256":"d26af18c2faf4a0210564d734d0262bbeec4ebf239a1a2f5b46d75ffdab28fbc","parent_inference_manifest_sha256":"91257b290bd4c6c2831e9526c7288fc1911b0260c7fa0d4540cfcf8d17f33621","production_mode":true,"r6_top_level_python_bundle_sha256":"31c036b7cd385a15df5aed10821f5dee543eedfa36c9118c9c5021fb40036c9c","receipt_sha256":"b68da847cd4ccd5b6cbfd65e42a4d4b504fcfae00136851fdc980acb1690ad72","rvq_identity_sha256":"87a1319aeb1435de142acf0ccf8d533d900374b1d72010780ba11eb47c685bda","schema":"bertose_a5_static_v2_direct_train_development_export_20260722_r4","selected_checkpoint_inference_authority_binding_sha256":"71197d2c0b503eb2259c246e8287901ccbd18caee36bf90f5fe769079f9133f8","selected_checkpoint_semantic_sha256":"79582ef6b692956cc2fc82d0f026412a6327ea281ddc94801136b301da8f7efd","selected_model_state_sha256":"56907e06485961e399511ae7ee3dde8ec85f1ba0f188f6d4515c98cebe8825fb","selected_support_identity_sha256":"38c47a7c323b29bfe9c6a76668de45370789687e50663b0acf52b25bc5f96779","source_authority_file_sha256":"59cf794d52341847b08aaa7f4212d1203dec4df89609157d924fda50d54f7602","source_closure_sha256":"2bfe02464c860c0c5fe2facd61236446758c1d544c87bfa65eab41365cefe015","status":"FROZEN_PREPARATION_ONLY_DIRECT_TRAIN_DEVELOPMENT_RVQ_EXPORT","support_replay_receipt_sha256":"4d6fecf9c014ef760b3fd6c5820d059b12a8a540b631a233adad33db5907bd0a","train_support_identity_sha256":"38c47a7c323b29bfe9c6a76668de45370789687e50663b0acf52b25bc5f96779"},"export_receipt_sha256":"b68da847cd4ccd5b6cbfd65e42a4d4b504fcfae00136851fdc980acb1690ad72","historical_held_provenance":{"counts":{"parent_count":1036,"residue_count":9740,"state_count":1532},"graph_or_pdb_payload_opened_while_computing_provenance":false,"ordered_parent_ids_sha256":"1fce8954ef97c4abb16b7d9ab04dbc61f2e1e3ac4122c5cf2d0cadcf81c89b48","ordered_state_ids_sha256":"4dff9c786598a1daa006fdbc7f599b024cd6180efe0e5dd30a2180fd252ca44e","receipt_sha256":"6bd07a03cb8db03039ded6e31920f014bf65fcd53b0d4ade55a1985726fdc213","schema":"bertose_a5_static_v2_historical_capacity_membership_provenance_20260724_r2","status":"PRESERVED_AS_PROVENANCE_NOT_AN_EXECUTION_GATE","used_as_postfit_publication_gate":false,"used_for_training_or_checkpoint_selection":false},"historical_held_provenance_receipt_sha256":"6bd07a03cb8db03039ded6e31920f014bf65fcd53b0d4ade55a1985726fdc213","join_receipt":{"authorization":{"ablation_launch_authorized":false,"affinose_authorized":false,"automatic_promotion_authorized":false,"capacity_payload_open_authorized":false,"downstream_authorized":false,"nova_submission_authorized":false,"owner_promotion_authorized":false,"token_publication_authorized":false},"canonical_state_int64_recomputed":true,"effective_wurcs_join_policy":"state_specific_effective_wurcs_is_bound_to_certified_r7_authority_and_state_label_mapping;parent_sequence_wurcs_byte_equality_is_not_required","official_submitted_artifacts_modified":false,"parent_and_state_wurcs_ordered_node_sequence_exact":true,"parent_identity_and_role_join_passed":true,"parent_sequence_wurcs_byte_equality_required":false,"receipt_sha256":"7b55cf83bd3175e9a9e0be15fc2a9fc998d0803bc67cb2761f69f612e9b6c921","schema":"bertose_a5_static_v2_direct_state_sequence_join_20260722_r4","sequence_ordered_residue_identity_equals_each_state_graph_residue_identity":true,"sequence_row_count":28370,"static_parent_count":28370,"status":"PASS_STATE_SPECIFIC_SUCCESSOR_JOIN","token_graph_tensor_join_recomputed":true,"token_package_sha256":"b4c0adb42cc2444e91611c4492c8d385c10fe706a862dbe9b51c144aad80f9e7","token_parent_count":28370,"token_residue_order_join_recomputed":true,"token_state_count":42372},"join_receipt_sha256":"7b55cf83bd3175e9a9e0be15fc2a9fc998d0803bc67cb2761f69f612e9b6c921","model_or_rvq_updated_during_direct_development_encoding":false,"native_ablation_data_binding_authorized":false,"nova_submission_authorized":false,"null_publication":{"absolute_path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_train_only_null_r4.json","exclusive_no_overwrite":true,"file_sha256":"661d04d76fcf36d116feb117154eac01e6569e377d4245c07653b28696e1227b","idempotent_identical_reuse_supported":true,"mode_octal":"0400","nlink":1,"sealed_readback_passed":true,"size_bytes":52862},"null_receipt_sha256":"84d8fdb5e960ed0f695c1618d881fe9dd13062e2ad143e099fc7db6415e54c89","official_submitted_artifacts_modified":false,"owner_amendment_file_sha256":"876a3746653254a812d5607d1115abfa112fcefb0772b3828efcb26865dfaf7d","owner_amendment_receipt_sha256":"672d247a416280617634b8f51c7c69716fd7a6fe010db4109fe634b25c531b93","parent_inference_manifest_sha256":"91257b290bd4c6c2831e9526c7288fc1911b0260c7fa0d4540cfcf8d17f33621","predecessor_writer_schema":"bertose_a5_static_v2_postfit_production_writer_20260722_r4","preserved_authority_role_counts":{"excluded_exact_or_verified_graph_identity":3179,"excluded_later_role_nonfit_identity":35,"outside_sequence_authority":423,"pretraining_development":7964,"pretraining_train":34408,"static_ineligible":5430,"static_ineligible_incomplete_alpha_beta_pair":622,"static_transform_only_exact_development_overlap":3,"static_transform_only_exact_excluded_overlap":2638},"production_mode":true,"receipt_sha256":"654faac335def8eccb7c50eb8a7d871036bf2a8c223e61f0cb11027830869a84","receipt_written_last":true,"resume_is_verify_or_continue_without_overwrite":true,"schema":"bertose_a5_static_v2_direct_development_publication_20260724_r2","selected_handoff_file_sha256":"9ddc0364da9ca63242e6d1d97b8b204512161a58e5b1ffd59c64fc887450f22f","selected_handoff_receipt_sha256":"43b794603ba5379bd7665469fc685859d2e0aa426eb4912ab4d145141a3519f8","state_publication":{"absolute_path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_state_authority_r4.tsv","exclusive_no_overwrite":true,"file_sha256":"b9ee13338f5813af3386bcf69d4d4c326bdd298e9902790d62b2319336e79175","idempotent_identical_reuse_supported":true,"mode_octal":"0400","nlink":1,"sealed_readback_passed":true,"size_bytes":23868225},"status":"PASS_DIRECT_FULL_DEVELOPMENT_STATIC_PUBLICATION_READBACK","support_replay_receipt_sha256":"4d6fecf9c014ef760b3fd6c5820d059b12a8a540b631a233adad33db5907bd0a","token_publication":{"absolute_path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_tokens_v2_r4.pkl","exclusive_no_overwrite":true,"file_sha256":"f9a032f0bd3ad47b99c8a3df2fc46596500e13baf0e77f4b39d26a8351dc7323","idempotent_identical_reuse_supported":true,"mode_octal":"0400","nlink":1,"sealed_readback_passed":true,"size_bytes":17105960},"traceability_publication":{"absolute_path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_traceability_r4.md","exclusive_no_overwrite":true,"file_sha256":"6bd0f41f24f7d31e1b21847d0550a7113a60977487b6d4dc0a9122e7330c89e7","idempotent_identical_reuse_supported":true,"mode_octal":"0400","nlink":1,"sealed_readback_passed":true,"size_bytes":1342}} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_train_only_null_r4.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_train_only_null_r4.json new file mode 100644 index 0000000000000000000000000000000000000000..4bb3658f3f738a46ac079c88bb69412760b174a9 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_train_only_null_r4.json @@ -0,0 +1 @@ +{"authorization":{"ablation_launch_authorized":false,"affinose_authorized":false,"automatic_promotion_authorized":false,"capacity_payload_open_authorized":false,"downstream_authorized":false,"nova_submission_authorized":false,"owner_promotion_authorized":false,"token_publication_authorized":false},"complete_development_adapter_receipt_sha256":"bd5765d1e6b28dc69b7af404188dd2fd6b999ac3f116896d62f1adf5cfafde6d","complete_development_adapter_source_sha256":"9794d59c8efa0102d56fa26fee7024ada2c4484a4cf54c411e6c3ea471571558","core_receipt":{"authorization":{"downstream_evaluation_authorized":false,"external_release_authorized":false,"gpu_launch_authorized":false,"inference_authorized":false,"nova_submission_authorized":false,"scientific_launch_authorized":false,"test_opening_authorized":false,"training_authorized":false},"development_rows_used":false,"fit_role":"pretraining_train_after_v2_graph_quarantine","parent_count":22980,"policy_sha256":"04d15b2291d05d17effb665fbaf0bdce99bf1ae0a41ddee6f47940211812970c","probabilities_combined_sha256":"9925a68a4072b280ea11a3ca7684c86142f9a5bb8f1f3e9000b41577872f82b8","probabilities_sha256_by_slot":["a90c8005ac4f4ca10bc68505cdb19a8d33255aedcfb0347bce6bb05bfb1f3d99","6792eabd175bed56116c9d2a4a00f453decfd8cb727162d24a8dc17c15b8b594","4f40a667460f23f6baf04a08cbdf4026e4779c2d99a20d8a7f10f6611c8e2c5a","c9eccf5f25a71fa55271a36523ba16bfe7f73501e52260b14a48676cd8a92264"],"raw_count_by_slot":[205801,205801,205801,205801],"raw_target_count":823204,"receipt_sha256":"683283e6fb1bd6ba19f80f59f7bf938c751dc8feaab9325e476b9e886829b91d","residue_count":205801,"rvq_identity_sha256":"87a1319aeb1435de142acf0ccf8d533d900374b1d72010780ba11eb47c685bda","scale":3.4285808327094895,"scale_hex":"0x1.b6dbbc9a17009p+1","schema":"bertose_a5_static_v2_four_slot_train_null_20260721_r2","slot_weighted_risk_contribution":[1.1370471436448455,0.9147228771462409,0.7082907568361128,0.6685200550823024],"state_count":34408,"status":"PREPARATION_ONLY_FIXED_TRAIN_NULL_LAUNCH_CLOSED","support_binding_sha256":"38c47a7c323b29bfe9c6a76668de45370789687e50663b0acf52b25bc5f96779","support_count_by_slot":[313,463,93,41],"support_identity_sha256":"38c47a7c323b29bfe9c6a76668de45370789687e50663b0acf52b25bc5f96779","support_sha256_by_slot":["427c4b27091096e0260bb3ad896db841b4b41e9c615bec24cc4330e3e4ddf158","fc55a9e195344141ed497f5a59fa8ab8fcd58f04ccb21c6b7f5a9166cb8d19b6","da96778691370fa5a1c59e471af23113f72c1a93bc277f40d8ea05bdf4aa4720","db2889304eef19132309f70744dc696d2b1bb344473296b5fd7fae48afca8f5c"],"surface_sha256":"3accec22b66e62a0e1fb30ba221caa80e27f1343d8f4723e1a0c7a12be50e627","training_authority_sha256":"efa36988f4420ad36787cdf729e51973a3ba279f8495d293454239c8387937cd","weighted_mass_per_slot":[22979.99999999991,22979.99999999986,22979.99999999994,22979.99999999987]},"core_receipt_sha256":"683283e6fb1bd6ba19f80f59f7bf938c751dc8feaab9325e476b9e886829b91d","development_state_count_read_during_fit":0,"device_execution_identity_sha256":"3bb4ff14f4acf46f3573b215166dc7868f2364732e7aee79960d25ba95442be3","export_model_state_sha256":"5f0ed32679d23cc4ed9c2051469ec94d713e677e8a3dcaf1a77303e305c3cad4","fit_used_training_only":true,"official_submitted_artifacts_modified":false,"ordered_train_parent_inference_receipt_sha256":"cf0032c69ebad289f88202888b0743b36250d27935f119f9c1acc5be5bd66eee","probabilities_dtype":"float64_le","probabilities_float64_le_base64":"dmwBVEXiMj9lc5tTjYw4PwAAAAAAAAAAxxrl7PWnaD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA86GZ+ttzWj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFQZrs2npIPy+8YX7EA0c/06ILtWNfKT9EWDZ9WE82P13TjzZ1kTo/x1QOU8mSgz/Od8MMAk1jP0oNFA9SRzw/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMsMFTsmw2PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJhaniZNHlA/wBto/h+pBj9I5hQp6YpWP+109TXrcUU/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADvFWXVHlpTP0Ba0Gy0JD4/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/2+CpSU14/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8TQsZ5Q1TP6XY5ibyLHE/o+PnnUtcgD8AAAAAAAAAAAAAAAAAAAAA7j1IflZuWD9DOyxOpLU6PwAAAAAAAAAAAAAAAAAAAAD4TQA+wcB2PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjK+IDdJYMz/8CBZg1x1NPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMe7nU9dMJD8wncEELCdgP74jP+e1TGI/ZBozFDHnVT8AAAAAAAAAAEx9Tics+Yg/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKWFh9m7Ais/AAAAAAAAAACZtKItJA6FPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAiAv5nUxw/SrnFYwf8fz84HzX+Q34ZPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhaUN94+Tcj9Xsbd6LHNbPwAAAAAAAAAArGTIktrFbT8WYCj+jDM6P5kj7YTinyA/yIAP2VzNlj8AAAAAAAAAAFV5HnWjYkQ/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATSJkiL9Ilz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxlwZleIsjP2A0pwA9rZw/AAAAAAAAAAAAAAAAAAAAAKPAZ6mO8EE/AAAAAAAAAAAAAAAAAAAAAOJvp4HT0UM/WwOAInLKRD8gwStBNKZnPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ/4or+TLE0/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtqYt1dfQj/QFM7+1/4AP7PlP8DAkS0/dUXaZUpFYD8PPvuRznEbP4VYs29pw0c/AqmU4pg/YT9bZIqaYCyFP2d0HZCMBXQ/AM0JgKIgVT8GZ8L91N0/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeJm05aYJgP5O9s+TSJUg/np1WegHXQz/rUrrOPphYPwAAAAAAAAAAQqDyys5XOj/GkxAyTSUgPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJlmO/kSJND8SmESuoNl5PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmr5rTq0Us/Phfg5+kjbD+3P8u5PLh0PxaR3/wdoVQ/ZAuDHNw2Wz/U3ml5XotCP7FzBGYUt6I/h1cPooGUPD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDyVJb/09QP18aFpgRh1U/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4unknhhs/PwAAAAAAAAAAteYtZFGVXz8AAAAAAAAAAAAAAAAAAAAANQ2sm9Vxkz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsNUw7ALAdj8AAAAAAAAAAAAAAAAAAAAA4vcwQ3KEYj8AAAAAAAAAAIvLGxcgJ2c/AAAAAAAAAABCpRmtUBJKP89aRoxDsvs+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUvwpePJWj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoKo7kUBxYPwSagf6NPiU/PYNBqWkQRD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj6pQh3FTMT/H0nCmL5hbPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO94o4x0CX0/CIo/YFokIj9+nU7+sRNIP1FXkFdASkQ/xc8vVkFnhD8AAAAAAAAAAK1BJXYZyhI/N2y3fJfqSz9YTqpojGBpP6PAQsnFH3M/yGaxPryWUj+QQQEE7tZaPwAAAAAAAAAADPkg4IueOT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADvXTbIovl+PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyIgL+Z1MsP2yk6P35vS0/isCG/9QSSD9lwwZL8HFDPwAAAAAAAAAAAAAAAAAAAAA4HzX+Q34ZPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ7R67g15tj8AAAAAAAAAAEw7ECwfLHI/AAAAAAAAAAAAAAAAAAAAAEgYm/770yM/QfMJjUzMfD8bxDSpssUUPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5tEVbfh1BPwAAAAAAAAAA0BTO/tf+ED+uGLQ5ZN48P0r5d4ZKXS0/AAAAAAAAAAAUJFRkdnUNP+stBuAiVEU/YnfF31VAlz+XBg7NO35DP11YeNi2g0E/SBib/vvTIz8AAAAAAAAAAAAAAAAAAAAA0BTO/tf+AD939eYI+nSPP8AbaP4fqUY/W9kFU5oBcT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXRaeGZhFSP8AbaP4fqRY/AAAAAAAAAABCS1vGLvVOPwAAAAAAAAAAAAAAAAAAAACTxwGp1ponP4iHUmVdxWA/b+C8lxB8Kj8AAAAAAAAAAOb61SZQJFg/AAAAAAAAAABgR3WLohVTPwAAAAAAAAAAENUYlSevlD8AAAAAAAAAAD43XoyCtF4/5fG7YjcEYD8akXWo+WQ/PwAAAAAAAAAA5mVUkhSaUz9vwEXcZuJpP2Zzm1ONjBg/tRHbFiKxNT8XsDHkHm9oP/dm4IyhP1A/obnSOZUNaz/R3jp59+NXP/SgG/7V6Co/0Ry34TksOj/xuJp2NFJmPwAAAAAAAAAAjmP1/bAIPT+TxZ25GrhuP7cxQtdphUs/AAAAAAAAAABCy8nr5whzPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO5vzlNptzU/f6Zjlw9xLz8yPU59azRVP8iPRenFZU8/xaM3R7jwWT8AAAAAAAAAADTwFEnBNCI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaFrZASgOiz/jvTRjQvWZPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVejVT1Tb+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJwacL59z4/AAAAAAAAAACMlrT+aWkiPxvrxMlYxFk/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASpQKF28NMz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk5qGNSjMeT+mZ3a6Gr5aPwAAAAAAAAAAAAAAAAAAAAB/Gh4UYUpBPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNC+md5vVI/AAAAAAAAAAAAAAAAAAAAAOO5t5bJpzc/bHbsmqWAkj92GUFDNodvPwAAAAAAAAAAwBto/h+pJj/QFM7+1/4QP5JMVgseGHQ/CsoYfG3yUT8AAAAAAAAAAB81HdJ7ciw/OHZwW3jppT9IGJv++9MjPwAAAAAAAAAAToW8Qn/DNT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQ5wzvEXVI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJLcim9+nI/AAAAAAAAAACwIgL+Z1MMPwAAAAAAAAAAXSw7RaufUD8j4Xbx0S5iP0PaKpa1T1A/itmHBxUKND9piq0ZMTtWPwAAAAAAAAAAwnnDHccroz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjlQ6rlcVj8AAAAAAAAAAAAAAAAAAAAA7/VjFxy+cj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4fp+I6nkI/AAAAAAAAAAAAAAAAAAAAAPHNg7raWSw/AAAAAAAAAAAAAAAAAAAAAPVnvAWBciY/a3yw7OrpHz/dawpVZ3NbPy5W7Ht3h3g/AAAAAAAAAACjE0Xfo8FhP3oNQ1038Dk/n0Zi2VdQdD9z6Nz5FihJPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFf3SpRTsxP0sQsCOM5yk/0D/uXBn7RT+bXp++c7MwP/bINeQxL2E/AAAAAAAAAAAAAAAAAAAAAKW0zu09A2A/AAAAAAAAAADQZZODrn5iP7ptBk0eAIE/AAAAAAAAAADvjbigdBY0PwAAAAAAAAAAC5fiwcpSRT8AAAAAAAAAAL8gmHBjP2g/AAAAAAAAAAB8nU7+sRM4P8AbaP4fqQY/AAAAAAAAAABcQpGistFRPzgz0YZLaCg/Uj0A9Qi7QT+rmUZ2sfBdPy+E586BFUY/diWmyoSXLj+5vaFdncpePwAAAAAAAAAAAAAAAAAAAAB7Ulom7eVEP3juoNaIXUU/iDKoU0TXNz8/dvn3zchiPwAAAAAAAAAAAAAAAAAAAACeXFv+aF43P9AUzv7X/gA/0BTO/tf+MD/AG2j+H6kmPwAAAAAAAAAAwBto/h+pBj8AAAAAAAAAANyMGSOw9W0/AAAAAAAAAAAAAAAAAAAAABM61txCKFY/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHIm113ZLPwAAAAAAAAAAeM9sLBRzXD/QpTpkCOAuP2ngS9/2rFI/LVxDiwlqaT8AAAAAAAAAALa4hxVSF3M/AAAAAAAAAABiHGSTMYuHP6In0PvZWWc/AAAAAAAAAAAAAAAAAAAAAJq2ht/8aFw/9pQzSnaeQz9mc5tTjYwYPwAAAAAAAAAAO4obJTz+ZT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKnxtFP7ISc/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGNrNhNtcMj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADL2KT86YBLP/5AfC8FsHE/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5wq4oLoWU/isAxl/1STz8AAAAAAAAAAFV6NVPVNi4/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs6GB0GZVKPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAiAv5nU/w+AAAAAAAAAAAAAAAAAAAAAM7NcnUXtDw/YA7CsLkPSj+6s64Nf1pNPwAAAAAAAAAAHdgDTR0sXj8lc/qkmztyP3p1Fu2iPyo/DPRi+Z1fVD8AAAAAAAAAAAAAAAAAAAAAZZls93Kbgz8AAAAAAAAAANadi+rFnYE/m0tvfHVdVD8AAAAAAAAAALaaqjGVzzU/AAAAAAAAAAAWwRPqhA1RPwAAAAAAAAAAAAAAAAAAAAApap1z8PqNPwAAAAAAAAAArw5mdWBpLT8AAAAAAAAAAGvXp/6yHkM/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsCIC/mdTDD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO9cVyVKhvPwAAAAAAAAAAABO5jLJSNT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAUzv7X/hA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhG/f32gFSP5dmJ2xxOIE/TizpHaSlWT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOXuXgTTynw/AAAAAAAAAADQFM7+1/4APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa7Oqw/bdET8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwBto/h+pNj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALrDQ+EZGHk/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASGzSBWA5JT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpEGc/TAmE/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtCS7UxWdAP4vVA//DgmQ/LaOeEztfSD8AAAAAAAAAAAAAAAAAAAAALJYU81wMZT8AAAAAAAAAANr2PNsG8oA/8boXlAWlUT/IrGdp3pxKP1NxCe9WbDs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5G5ajN3VMP8AbaP4fqQY/pLNcCliSlz8o+p/aIjZrP2EHw0ElLUU/q7nwgaY0bz+JeMqxXgo0P8arK4BPN6g/AAAAAAAAAAC56hpUs3dBP23MKzFlQGU/AAAAAAAAAAAAAAAAAAAAACgmz/2LKB8/AAAAAAAAAACmIY+AHJxQPwAAAAAAAAAAsCIC/mdTHD99seqGuf0mP9upJ1RqwjA/AAAAAAAAAAAAAAAAAAAAAD2oemVInTQ/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUgdKIptICPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANl0vRTJ8BA/AAAAAAAAAACFciH8pOEZPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQjfuPXSphP2KNq/1NgGQ/AAAAAAAAAAAAAAAAAAAAAJ6nw9is8Dw/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2XS9FMnwMD8K45aN5xECP1II3UKVwwM/AfkrtpPSOj8AAAAAAAAAALXcZbW0/w8/AAAAAAAAAACWIy4RHu05P5Lf9Kuabyw/zJv8cGGWFj8AAAAAAAAAAAAAAAAAAAAAwrUmWRxaCj8AAAAAAAAAAMyb/HBhlhY/AAAAAAAAAADYBTQoLnNNP1ANyDdVnw8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1IHSiKbSEj8AAAAAAAAAAAAAAAAAAAAAOFZb+8UOLz/1vfkT839jPwAAAAAAAAAAUgjdQpXDIz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD91tY+uwcBP8yb/HBhlhY/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOVyDVFFoUc/AAAAAAAAAABlchzqxc8pPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARS8cny1pGT9SCN1ClcMjPwAAAAAAAAAAVd3ynzkSND8AAAAAAAAAANSB0oim0gI/mWBQUu3nTD8AAAAAAAAAANl0vRTJ8CA/AAAAAAAAAAAAAAAAAAAAAPoSVp5Oli4/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzJv8cGGWBj8AAAAAAAAAAAAAAAAAAAAARS8cny1pKT8AAAAAAAAAAGFXqQdYljo/k0dN4P04CT++ACunOM4VPwvPS0Vw+QM/AAAAAAAAAADMm/xwYZYWP8yb/HBhlhY/Max/noS3NT8AAAAAAAAAAMioEeU+eBg/AAAAAAAAAACzxb6Y4UkjP1II3UKVwyM/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYkbyyA8IeD+2IViOGAovP7/CO835Oxw/392zwUaHOz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTopFNjt1yPwAAAAAAAAAAABetoORtET9SCN1ClcMjP4kkJ9gDP0k/2XS9FMnwAD8AAAAAAAAAAC36ecIlWiY/AAAAAAAAAACMXIzT+CAhPwAAAAAAAAAAwrUmWRxaCj8AAAAAAAAAANl0vRTJ8CA/AAAAAAAAAAAAAAAAAAAAAOwRQjPlEUM/hHIh/KThKT8AAAAAAAAAAK2PfbbTpD0/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGHEu2vktgc/AAAAAAAAAADu+3jiMe5RPwAAAAAAAAAAAAAAAAAAAABzpR+XaZAgP0UvHJ8taSk/2XS9FMnwED8AAAAAAAAAAAAAAAAAAAAA3mMT4dwLJD/1ifImAJsOP/XdLy233jA/AAAAAAAAAAAAAAAAAAAAAL/CO835Oww/2XS9FMnwED8AAAAAAAAAAMyb/HBhlhY/4ovJAaDsfT/Mm/xwYZYGP2OYMllQ0Tc/AAAAAAAAAABW+8fOt+EhPwAAAAAAAAAAxdN1h7gJAz/ZdL0UyfAgPwAAAAAAAAAAAAAAAAAAAABSCN1ClcMjPwAAAAAAAAAAAAAAAAAAAACOVGJU2xr7Pt6orGXBlmY/UgjdQpXDIz8pIXdUdqtGP+jQr5GlSQ4/s2ZFLHjbgj/Mm/xwYZYmP5g2o6wRVBw/sGtFiRljLz/CtSZZHFoKP9l0vRTJ8BA/AAAAAAAAAAC7z1BB1x0ePwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzig6KA3wg/eBZAwwQtQT8AAAAAAAAAAAAAAAAAAAAAzJv8cGGWBj+Ck87+qzmNP8yb/HBhlhY/AAAAAAAAAAAAAAAAAAAAACKaA8p2ohI/AAAAAAAAAAC6z1BB1x0OPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIP4evkZBc/AAAAAAAAAAAAAAAAAAAAANl0vRTJ8BA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4uAS8vBB2PwAAAAAAAAAAhONwAgGiYD8AAAAAAAAAADhWW/vFDi8/mE4LTfVgaT8AAAAAAAAAANCO5/yDtBQ/AAAAAAAAAAAqB482Azw4P7/CO835Oxw/AAAAAAAAAADN7EpKwvUFPwAAAAAAAAAAONiaOqgDMD9qjrNkegBKPwAAAAAAAAAAAAAAAAAAAAC6z1BB1x0ePwAAAAAAAAAAIr1rnLjwRz+6z1BB1x3+PuuJcwoTkWY/AAAAAAAAAACW4e2T+n5MPwAAAAAAAAAAAAAAAAAAAABQDcg3VZ//PgAAAAAAAAAAAAAAAAAAAADZdL0UyfAgPwAAAAAAAAAAAAAAAAAAAAD32ZptqNs1PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/CO835Oww/2XS9FMnwAD8AAAAAAAAAAMiMOFQTSrM/AAAAAAAAAAAAAAAAAAAAAG5J3Zbctk4/t1lFIHylMT9W+8fOt+EBPwAAAAAAAAAAUgjdQpXDIz/Mm/xwYZYWP5Y+zSsvWiI/AAAAAAAAAABFLxyfLWk5PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJZZuCmifJz8AAAAAAAAAAAAAAAAAAAAAhf1rEPtBTj8AAAAAAAAAAAAAAAAAAAAA3oriw0eaEz+hTEsYoc1KPwAAAAAAAAAAAAAAAAAAAADZdL0UyfAgPwAAAAAAAAAAUgjdQpXDIz/ZdL0UyfAQPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALrPUEHXHf4+AAAAAAAAAAC/wjvN+Tv8PoQkzI2Ik2o/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbJsDBqpJbj9FLxyfLWkZPwAAAAAAAAAAAAAAAAAAAAApXwj27RiQPxKATDIP4yQ/AAAAAAAAAAAke4uUSqtlP32Y03jc6HY/2XS9FMnwED8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKMtazusaUI/AAAAAAAAAAC13GW1tP8PP4WQOSsUQQo/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnCnk+QRkkj8RUCL6c6snP5Y+zSsvWjI/M7D5/r99Rz/Mm/xwYZYmPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFII3UKVwyM/AAAAAAAAAADPIlZn3W1OPwAAAAAAAAAARCkK5k4xST8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFII3UKVwyM/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkgHZmUUiAD8AAAAAAAAAAAAAAAAAAAAAO0ZeTWfgcj/6ElaeTpYuPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwrUmWRxaCj8AAAAAAAAAAEy7RgpA3UE/4oaiEWSkYz8AAAAAAAAAAAAAAAAAAAAAzJv8cGGWBj8txtqDIwdUP9l0vRTJ8AA/ZP2FbP1KWT8AAAAAAAAAAE4V8rZypRU/AAAAAAAAAADZdL0UyfAQPwRMbc2pO2k/AAAAAAAAAACdL8RlRFVtP7/CO835Oxw/AAAAAAAAAAAAAAAAAAAAAOGknDLVRhE/AAAAAAAAAAAAAAAAAAAAAFII3UKVwxM/EqP9keQujD8AAAAAAAAAACC45Pm4sfo+8wZooDzJTD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2XS9FMnwED8AAAAAAAAAAAAAAAAAAAAAyKnqTjFRcz8AAAAAAAAAAL/CO835Oxw/AAAAAAAAAADMm/xwYZYWP8yb/HBhlhY/0xH3TYBqTj8AAAAAAAAAANeJMl0yaXM/Ihg5au8gJT/qfFezjKvKPwAAAAAAAAAAAAAAAAAAAAC6z1BB1x3+PgAAAAAAAAAAAAAAAAAAAAC9ce3zmNwMPwAAAAAAAAAAKf4OgjRdMT84Vlv7xQ4vPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEkiBytQhyc/wL1Q2DlgAD+kidNrTKUCPwAAAAAAAAAAAAAAAAAAAACtxEfvSBFHP7/CO835Oxw/AAAAAAAAAADBjNRREz4yP28E2ZADrIc/sqg1LX58Mj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIVyIfyk4Sk//paXIbBlKj8AAAAAAAAAAL/CO835Oxw/AAAAAAAAAAAAAAAAAAAAAM7dySB4Bk4/MmK8qDSIVz8AAAAAAAAAAMyb/HBhliY/nf3GlkfvYD9CPDETC0s7P7vPUEHXHR4/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKUY5ARIjU0/us9QQdcd/j4AAAAAAAAAAAAAAAAAAAAA2XS9FMnwID8AAAAAAAAAAMyb/HBhlgY/AAAAAAAAAAD/JyUYHGcgP8yb/HBhlgY/zJv8cGGWFj8AAAAAAAAAANl0vRTJ8DA/mwKfySlnQT8AAAAAAAAAAF0HjY0LSXI/2XS9FMnwED9yVDmpj4ORPwooNQzfqJ0/eQFDmlGZTj/Mm/xwYZYWPwAAAAAAAAAAAAAAAAAAAADMm/xwYZYWPx8HKeWbilg/SSIHK1CHJz+dp8PYrPA8P8yb/HBhlgY/AAAAAAAAAAAAAAAAAAAAAC1cQ0Hw4G4/C2XJrv8dcD8gTnh3kNNkP3sHEsfVyFU/AAAAAAAAAAAAAAAAAAAAACkD+nb0OD0/2XS9FMnwED8AAAAAAAAAAAAAAAAAAAAA2XS9FMnwAD+/wjvN+TscP3FklkVxVTM/BXSSLW9HVD8AAAAAAAAAANl0vRTJ8BA/lYeKhupckT8HiTjHBTViPwl4/UlXbJA/RS8cny1pCT/jUmmt8CY3P+JfqFY5QFM/v8I7zfk7HD84Vlv7xQ4vPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2upWUkdmc/AAAAAAAAAAAFNiBIfQr9PgAAAAAAAAAASvK0sUEjbz+sdwTIRWwwP95d+/wveyA/AAAAAAAAAADMm/xwYZYWP5ngad7wGCE/oAA8MStWUj+6z1BB1x3+Pldu7TitPVA/IOihj0y/AT8AAAAAAAAAAFII3UKVwyM/6F88V4a0Qz98+OGY7tBsPwAAAAAAAAAAe80wlCNmTD+Gbow8lt4OP9tjE+HcC0Q/AAAAAAAAAACaH0MeRbpkP1NvuIuDJIQ/AAAAAAAAAAAAAAAAAAAAANwP/o+EB4s/HPW2AyqhMz8AAAAAAAAAAAAAAAAAAAAAXhO45T0NSj8AAAAAAAAAAL/CO835Oww/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxqgR5T54KD+/wjvN+TscP9qEo4FVv1U/AAAAAAAAAAAAAAAAAAAAACx8RCKt2xM/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHaaFH1gITP39Q//GTAUM/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWfcyD6neJj9FLxyfLWkZP9l0vRTJ8BA/jFyM0/ggET8AAAAAAAAAAJzYeOgTnnY/0I7n/IO0JD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOsJTrARcQPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUgdKIptISPwAAAAAAAAAAAAAAAAAAAACkfN5/KNQWP7rPUEHXHR4/2XS9FMnwAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMm/xwYZYGP1II3UKVwyM/AAAAAAAAAAAAAAAAAAAAAMlerICs2EI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADdaBGQowED83UOTYOxRgP04RXfdjoho/grEHHFq9Sj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPm2loX5VkP49UYlTbGhs/AAAAAAAAAAB4z8KXyUJzPwAAAAAAAAAAdU9XUnZtCz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Vlv7xQ4fPwAAAAAAAAAA0ss37ThySD8AAAAAAAAAAL/CO835Oxw/zJv8cGGWBj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgn+6+Nn4OPzhWW/vFDg8/AAAAAAAAAADMm/xwYZYGPwXsFkK28Cg/AAAAAAAAAAAMsGuqfy4iP9J9cFTkYFQ/AAAAAAAAAADZdL0UyfAQPwAAAAAAAAAAlj7NKy9aIj8AAAAAAAAAABj6ofjpfC8/BFs+GQWokT8AAAAAAAAAAMyb/HBhlhY/gBLzRl8eMz+4WUUgfKUxPwAAAAAAAAAAv8I7zfk7HD/ZdL0UyfAQP52W5MtK9Wg/QSqFLjAAnD/IQpPEgqlVPwAAAAAAAAAAlCS3XtYnQz9QaIHqKT5oPwAAAAAAAAAAAAAAAAAAAACIfC9BpF8kPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK04bI95xoU/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtLsWfssJT9FLxyfLWkZPwAAAAAAAAAAus9QQdcdDj8AAAAAAAAAANl0vRTJ8AA/AAAAAAAAAADZdL0UyfAQPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMyb/HBhlhY/AAAAAAAAAAAAAAAAAAAAANl0vRTJ8BA/v8I7zfk7DD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADadL0UyfAwPwAAAAAAAAAAOFZb+8UOHz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApbNv4Dz1DPwAAAAAAAAAAUCvDIcQaIT8AAAAAAAAAAPo0Ooz5SAI/qKdTX3/ZNj/p9lM2qu1mPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzJv8cGGWBj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/wjvN+TsMPwAAAAAAAAAA2XS9FMnwED/Mm/xwYZYGP3WZYFg9hz8/fUuudwXZSz8AAAAAAAAAALbBJ2KQt1A/zJv8cGGWBj8AAAAAAAAAAMn5X76f1wc/AAAAAAAAAAAAAAAAAAAAAK60VLj6KUQ/gnIh/KThOT8AAAAAAAAAACaN7lWZwDA/ub5+7jslgD8AAAAAAAAAANl0vRTJ8BA/2XS9FMnwAD+TR03g/TgpP9l0vRTJ8BA/0oa9fWauLj8t3ZpdKCJqPwAAAAAAAAAAAAAAAAAAAADUgdKIptICP8yb/HBhlgY/AAAAAAAAAADIqBHlPngYPyd685Ma/1s/AAAAAAAAAADZdL0UyfAAPzHIcR6AQD4/A5WwhKgANj8AAAAAAAAAAMO5uxgrXSU/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz6NanWMUuP3jRxVMyaUc/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB++50mzahT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMC9UNg5YAA/AAAAAAAAAACZ0iVN9YltPzbYdUOoMlo/AAAAAAAAAACOEhNK13Y2PwAAAAAAAAAAhMGXozymVT8AAAAAAAAAAIhbOGX5jcQ/AAAAAAAAAAAAAAAAAAAAAAU2IEh9Cv0+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKTLFKZcKUj+/wjvN+TsMPwAAAAAAAAAAofdsEeykQz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Vlv7xQ4fP+rvnPGeKlw/zJv8cGGWFj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/wjvN+TscPwAAAAAAAAAAzJv8cGGWFj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuMGqrv/BEPwAAAAAAAAAAvXEyLdCQjz8AAAAAAAAAAD+f6FQLUZY/AAAAAAAAAADZdL0UyfAQPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFJwvJYhEI/zJv8cGGWFj+pJUG8jmM8PwAAAAAAAAAAAAAAAAAAAACWPs0rL1oiPwAAAAAAAAAA7cxR0cOWGz8AAAAAAAAAACkvrFoqjEs/nJpmIWYaHj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSCN1ClcMjP+xkJ0xGkE8/zJv8cGGWBj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANl0vRTJ8AA/AAAAAAAAAAAAAAAAAAAAAJA6wboAQFY/AAAAAAAAAABSCN1ClcMDP3gFt3Q88lY/AAAAAAAAAAARTQsqrkFiPwAAAAAAAAAAAAAAAAAAAAAXAGaYadkrPwAAAAAAAAAAUkpFFRBpZD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALkQeqN2w2PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3WgRkKMBA/0opSPXWxKT/oPSq69T4vPwAAAAAAAAAAzJv8cGGWBj+/wjvN+TscPwAAAAAAAAAAv8I7zfk7HD8AAAAAAAAAAAAAAAAAAAAAmrTYTIrSLj8AAAAAAAAAAMyb/HBhlgY/AAAAAAAAAAAAAAAAAAAAAMyb/HBhlhY/YScSLbU0Jz8AAAAAAAAAAAAAAAAAAAAA2XS9FMnwED9KI55SyttePwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv8I7zfk7HD8AAAAAAAAAAHWd9RdMigo/zJv8cGGWBj+/wjvN+TscPwRydmFMdUE/v8I7zfk7DD8AAAAAAAAAAAAAAAAAAAAAv8I7zfk7HD8AAAAAAAAAAAAAAAAAAAAA2XS9FMnwED8AAAAAAAAAANl0vRTJ8BA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL58PeZJlOPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIhlDIjH/zc/AAAAAAAAAABQmhDMueMxPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzJv8cGGWJj8AAAAAAAAAAGu/SX8kVBQ/UgjdQpXDIz8AAAAAAAAAAJiJhvx+EWM/AAAAAAAAAACGfzZwgsNbPwAAAAAAAAAASx5ya0GELD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKkSDyOxzKj8AAAAAAAAAANl0vRTJ8AA/AAAAAAAAAAAAAAAAAAAAAFII3UKVwxM/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZdL0UyfAQP9WB0oim0iI/UA3IN1WfDz8AAAAAAAAAAGmh+lCIpBs/2XS9FMnwAD8SVFtbtygxPwAAAAAAAAAAzJv8cGGWBj8AAAAAAAAAAAAAAAAAAAAABewWQrbwKD8AAAAAAAAAAAAAAAAAAAAA2XS9FMnwED8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMm/xwYZYGPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+9Jb2hM8vPwAAAAAAAAAAAAAAAAAAAADMm/xwYZYWPwAAAAAAAAAAAAAAAAAAAAC/wjvN+TscPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEI8MRMLSys/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPElGh+gsLT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd/wdJGq9APwU2IEh9Cv0+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALrPUEHXHf4+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZdL0UyfAAPwAAAAAAAAAAh2mhR9YCEz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASRXYIu9zaT8kB482AzxIPwAAAAAAAAAAlj7NKy9aIj9Fseb+tOo2PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9JNMP3ztVPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvmrJ/gqqSj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3D4qutLcHPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzyMeatbEFj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM8jHmrWxBY/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsq4qi8IgED8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD6Dz+ztGwsPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAElDYQc9G1g/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADPIx5q1sQGPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuals+gExE/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIPz18pKqCD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFyW2y5FZnY/AAAAAAAAAAA5SssGsh9gPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFXsJIPgOZM/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3xNEXZRqgD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM8jHmrWxAY/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnCfsgiEPCPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKGN67vQM3c/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALXkcJkhLII/AAAAAAAAAAAAAAAAAAAAAFzpx1En1cU/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeZf+Yy72WD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJeVqy/CUMI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4FgAiTKB6PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkahMfB2wXT8UhX2NyFv+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsc25YXfkCPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHqkicqygmT8AAAAAAAAAAH4SUl3P5XI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADWNPkL0aJ/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABc7FAFy5ZiP9uals+gEwE/AAAAAAAAAAAXavCGTFuYP8DjHbvIj5E/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25qWz6ATET8AAAAAAAAAADmIwDooD5I/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO1sA1JadGM/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQliR+OEsej8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMftY5PIRXY/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLqKV4HA5rPwAAAAAAAAAA25qWz6ATET8AAAAAAAAAAAAAAAAAAAAAEZd3NcvvXT8AAAAAAAAAAGrEVkrmYH4/AAAAAAAAAADwKiPI9CsfPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAzuF+mqWE/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM+lN3TXUjT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5TNREXpaUP/cPiq60tyc/o9au3STJgT9BTHmt9rGBPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFC3802wso0/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx78s25qFxPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALXNuWF35Ej8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVXp+JoY1Oj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTNSZ3H1nM/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Gb3+BL1YT8AAAAAAAAAAAAAAAAAAAAAgY0oZbdhcz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW0Jv7kydRPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFnba+drcpPwAAAAAAAAAAh5gM6caYxD/bmpbPoBMRP77WXdOW16g/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsr7vuw4klz/bmpbPoBMRP7uqpmVVUQA/w6ylBAx2LD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM8jHmrWxCY/D0pnQjKXcj8AAAAAAAAAAAAAAAAAAAAAVINXlVDMAT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1IQrV1KqJPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSFfY3IW/4+AAAAAAAAAAAAAAAAAAAAANyrcBXrMGA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM8jHmrWxBY/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRnhDB0Z1lPwAAAAAAAAAAAAAAAAAAAAAunFyZfl1qPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADPIx5q1sQWPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL89fKSqhg/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0WzMLDI1jPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYN+7hE3Ej8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuals+gEyE/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbmpbPoBMRPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwHbqehPYj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDrKUEDHYcPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25qWz6ATAT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmB6FINhEo/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKuKovCIBA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuals+gEwE/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5rZg2DWiM/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPnNuBi+wDQ/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw6ylBAx2DD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDrKUEDHYMPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiwPpl/UFo/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsc25YXfkCPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANyzxG3VrWc/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7LS1VTf1jPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr7JZpBKqdT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC982hxtfFTPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJk+VAd2naz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL7xqAgBjDPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtsIk2p+FoPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcdkQB4LkkD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAur47Wan5mT8AAAAAAAAAAAAAAAAAAAAAmS4XEWe+wj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1OvTFafD6PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwSLpaIgRiPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7CsV9tHtXPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANBwJaBzk6Q/clW0S512jT8yTplbEEaPPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeNJPg4ddrPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwcHTcguGUPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFA9n9GI7sM/AAAAAAAAAADtSttifEaBP7OKy8hT9mo/P0F1FQK0bT/4JBygS3BjPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRI/vX8tWg/yMGGVDYINz8AAAAAAAAAAAAAAAAAAAAAm3BWXVTIbD8AAAAAAAAAAI36So4hO4U/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVW1WaGoGLPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9hyxjnnpU/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc7KW8GVlfD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEqzVBCE2gPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhCl/LR3XU/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh9Hu7sZsfj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8u5yyLVjsj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkdS863V50PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtjkyTQ6Rwj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAij1Qj9Hraz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACozvWJjpKc/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVWAC5ZEYAT8AAAAAAAAAAI6grn1Ifhw/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjXQ1wM0hYPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1OvTFafD6PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","probabilities_float64_le_sha256":"9925a68a4072b280ea11a3ca7684c86142f9a5bb8f1f3e9000b41577872f82b8","probabilities_shape":[4,1024],"production_mode":true,"r6_top_level_python_bundle_sha256":"31c036b7cd385a15df5aed10821f5dee543eedfa36c9118c9c5021fb40036c9c","receipt_sha256":"84d8fdb5e960ed0f695c1618d881fe9dd13062e2ad143e099fc7db6415e54c89","reversed_train_order_replay_byte_identical":true,"rvq_identity_sha256":"87a1319aeb1435de142acf0ccf8d533d900374b1d72010780ba11eb47c685bda","scale":3.4285808327094895,"scale_hex":"0x1.b6dbbc9a17009p+1","schema":"bertose_a5_static_v2_published_train_only_null_20260722_r4","selected_checkpoint_inference_authority_binding_sha256":"71197d2c0b503eb2259c246e8287901ccbd18caee36bf90f5fe769079f9133f8","selected_checkpoint_semantic_sha256":"79582ef6b692956cc2fc82d0f026412a6327ea281ddc94801136b301da8f7efd","selected_model_state_sha256":"56907e06485961e399511ae7ee3dde8ec85f1ba0f188f6d4515c98cebe8825fb","selected_support_identity_sha256":"38c47a7c323b29bfe9c6a76668de45370789687e50663b0acf52b25bc5f96779","source_authority_file_sha256":"59cf794d52341847b08aaa7f4212d1203dec4df89609157d924fda50d54f7602","source_closure_sha256":"2bfe02464c860c0c5fe2facd61236446758c1d544c87bfa65eab41365cefe015","status":"FROZEN_PREPARATION_ONLY_TRAIN_ONLY_STATIC_NULL","support_identity":{"codes_per_slot":1024,"local_ids_by_slot":[[0,1,3,9,13,14,15,16,17,18,19,20,25,29,30,31,32,37,38,44,52,53,54,57,58,61,66,67,210,211,212,213,215,227,229,233,234,235,240,241,243,244,245,246,248,255,259,260,263,266,267,268,272,279,280,281,282,283,284,285,286,287,288,289,295,296,297,298,300,301,306,307,311,312,313,314,315,316,317,318,325,326,331,333,336,342,345,347,349,350,363,367,368,369,375,376,389,390,391,392,393,395,396,397,398,399,400,402,406,412,413,414,415,418,426,428,431,432,433,439,441,442,443,445,446,447,448,449,450,453,454,455,456,463,464,466,469,470,471,473,475,477,479,480,481,483,484,485,486,487,488,489,490,491,492,493,495,496,497,499,509,510,511,512,513,515,519,520,550,566,568,569,573,579,580,583,599,602,603,604,606,607,608,609,611,612,613,615,620,626,628,630,631,632,633,634,636,651,654,659,662,665,666,667,668,670,671,672,673,682,683,684,685,686,689,691,692,694,696,698,700,701,703,704,705,706,707,708,709,712,713,714,715,718,719,720,721,723,725,728,733,735,736,737,738,740,742,743,746,747,748,750,758,765,772,773,785,786,788,793,800,803,804,805,807,808,809,810,813,815,816,818,820,823,825,827,834,841,843,848,895,896,897,902,904,912,918,935,942,947,982,983,984,987,989,990,991,992,1003,1004,1005,1006,1007,1008,1009,1010,1012,1013,1016,1018,1020,1021,1022],[1,6,13,15,21,22,25,32,33,34,35,37,39,40,41,44,46,48,49,53,56,57,59,63,64,73,75,80,81,83,85,86,88,91,95,98,100,101,102,103,105,106,107,109,111,112,116,117,118,119,123,125,126,127,128,130,132,134,136,139,140,142,148,150,153,154,155,158,159,160,163,164,166,167,168,169,171,173,174,177,180,181,182,183,184,185,186,187,188,189,190,192,196,197,200,201,202,205,207,211,214,219,221,223,224,226,228,229,231,233,234,237,239,240,241,243,246,249,252,259,260,262,265,266,267,269,270,271,273,278,281,284,285,288,290,291,298,300,301,305,306,309,310,312,313,314,319,321,322,326,327,328,329,330,337,339,341,346,353,356,357,362,364,365,368,369,370,371,373,375,376,378,379,382,385,386,388,389,395,398,400,402,403,404,406,407,408,411,414,416,417,421,422,423,426,427,429,430,431,436,437,439,442,443,445,446,447,448,454,455,458,460,462,463,464,466,467,469,470,471,472,473,474,477,478,479,480,481,484,485,486,487,490,491,494,495,496,497,499,500,501,502,503,504,505,506,507,511,513,515,516,517,519,520,521,522,523,524,526,527,528,530,531,532,534,535,538,539,542,544,548,549,550,553,558,559,563,564,565,566,568,569,573,579,582,583,584,588,589,592,596,597,598,599,603,604,606,608,612,614,616,617,624,625,627,628,630,631,633,635,637,638,640,641,642,644,645,646,647,648,650,651,654,658,662,663,665,667,669,673,676,677,681,683,687,689,691,692,693,701,705,707,708,709,710,712,713,715,718,719,721,722,724,725,726,727,728,729,732,733,735,736,738,739,740,742,747,748,755,760,762,763,765,767,769,772,779,780,782,789,790,791,798,800,804,806,808,810,814,815,816,819,821,823,824,828,829,830,835,838,840,841,843,846,848,852,856,857,858,860,861,863,866,868,871,872,875,876,890,892,893,894,895,896,899,902,904,909,913,915,920,922,923,925,927,929,935,937,940,945,946,947,949,950,951,953,956,959,963,969,972,975,982,986,990,991,1000,1011,1013,1019,1020,1022,1023],[62,121,143,172,201,205,218,225,239,258,262,273,275,294,298,318,329,342,351,354,370,381,398,424,425,431,436,438,443,449,450,452,453,457,459,465,469,474,479,481,484,486,488,492,499,506,507,508,509,516,521,526,535,540,559,562,572,578,580,581,582,592,593,594,595,606,607,610,614,624,627,642,647,650,656,660,677,685,696,701,709,722,733,747,810,819,852,870,919,932,984,995,1017],[175,180,343,357,364,388,402,420,423,427,442,466,470,471,472,493,502,506,508,509,510,511,515,516,519,521,526,530,534,544,551,558,567,592,609,651,662,753,755,901,1009]],"local_ids_sha256_by_slot":["427c4b27091096e0260bb3ad896db841b4b41e9c615bec24cc4330e3e4ddf158","fc55a9e195344141ed497f5a59fa8ab8fcd58f04ccb21c6b7f5a9166cb8d19b6","da96778691370fa5a1c59e471af23113f72c1a93bc277f40d8ea05bdf4aa4720","db2889304eef19132309f70744dc696d2b1bb344473296b5fd7fae48afca8f5c"],"minimum_ids_per_slot":2,"slot_count":4,"source_role":"pretraining_train_after_v2_graph_quarantine","support_identity_sha256":"38c47a7c323b29bfe9c6a76668de45370789687e50663b0acf52b25bc5f96779"},"support_identity_sha256":"38c47a7c323b29bfe9c6a76668de45370789687e50663b0acf52b25bc5f96779","support_replay_receipt_sha256":"4d6fecf9c014ef760b3fd6c5820d059b12a8a540b631a233adad33db5907bd0a","train_parent_inference_manifest_sha256":"dad35af597c12fabbddb5bff1149ff3042b96ff01b81cec51c4b7ac9048e7c8a","train_state_count":34408} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_a5_official_ragged_topology_receipt.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_a5_official_ragged_topology_receipt.json new file mode 100644 index 0000000000000000000000000000000000000000..f5d905422c0ef12ec79003f73bc975405583a06f --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_a5_official_ragged_topology_receipt.json @@ -0,0 +1,43 @@ +{ + "checkpoint_resume_authorized": false, + "downstream_evaluation_authorized": false, + "gpu_launch_authorized": false, + "nova_submission_authorized": false, + "official_submitted_or_predecessor_artifacts_modified": false, + "payloads": { + "review_a5_official_ragged_topology_summary.json": { + "bytes": 775, + "name": "review_a5_official_ragged_topology_summary.json", + "sha256": "20ba6bc43acf968e332a03170e70942bb1db0d2e633a30d6403b79fa0b68f2c6" + }, + "review_topology_lengths.npy": { + "bytes": 93175, + "name": "review_topology_lengths.npy", + "sha256": "b52f6ddcf327b8cfc5159659bada97357216f9526b42c230a35192932f43d2f3" + }, + "review_topology_offsets.npy": { + "bytes": 744512, + "name": "review_topology_offsets.npy", + "sha256": "e06d61b8e47c2a2a3e0c8aeec7e015e673f64f0f483a483abe40ccda2d08b9e0" + }, + "review_topology_roster.tsv": { + "bytes": 3890681, + "name": "review_topology_roster.tsv", + "sha256": "a216ce485ea699fb1b66ed6915175a49cde8c7d14279dbaf835f4675bc7c7fa1" + }, + "review_topology_row.npy": { + "bytes": 1124960, + "name": "review_topology_row.npy", + "sha256": "a0ae28b0476322e3dbeda42a891f4a42c0973002a5d8507bf387b12dcbff4e95" + }, + "review_topology_values.npy": { + "bytes": 5027730, + "name": "review_topology_values.npy", + "sha256": "2d4ba8395f78864b7eed9ed250bb9fd50bd45ef84a10ed497ffb89c684276e4e" + } + }, + "schema": "bertose_a5_official_ragged_topology_receipt_v1", + "scientific_launch_authorized": false, + "status": "PASS_TARGETS_ONLY_NULL_PENDING", + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null.json new file mode 100644 index 0000000000000000000000000000000000000000..70ded2d949454c6980cb62df549fdb064c2b0984 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null.json @@ -0,0 +1,51 @@ +{ + "checkpoint_resume_authorized": false, + "downstream_evaluation_authorized": false, + "gpu_launch_authorized": false, + "nova_submission_authorized": false, + "official_submitted_or_predecessor_artifacts_modified": false, + "payloads": { + "review_null_builder.py": { + "bytes": 17633, + "name": "review_null_builder.py", + "sha256": "269ed77c765432a515be2da7817d5d2ef4294c25d3095679ae14e19e2fe7db32" + } + }, + "result": { + "constant": 1.9979868248421309, + "constant_decimal80": "1.9979868248421309305669343585002755417422970208670208971747599648930996242459040", + "constant_exact_denominator": "12133312634927406747825", + "constant_exact_numerator": "24242198786275518738754", + "estimator": "equal parent then equal unordered original-residue-pair squared-error null", + "exact_recipe": "A=mean_parent(sum_d/pairs); B=mean_parent(sum_d2/pairs); c=A; risk=B-A^2 using Python Fraction", + "fit_role": "pretraining_train_only_preserved_structure_gate", + "naive_numpy_one_ulp_high_value_rejected": 2.09329700803577, + "parent_count": 71914, + "scale": 2.0932970080357696, + "scale_decimal80": "2.0932970080357696924811252672529443900406468098298737866944742439441873336636836", + "scale_exact_denominator": "2355476407950224799637502917088181490275690000", + "scale_exact_numerator": "4930711717261047652767509449628814949448147219", + "target_surface_sha256": "3937280ecaed5e6dda8213c93f70761e832661f7a808a65b3200552edf9ad774", + "unordered_pair_count": 1635514 + }, + "schema": "bertose_a5_official_topology_train_only_null_v1", + "scientific_launch_authorized": false, + "source_bindings": { + "ambiguity": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b", + "attention": "01ed165720b9414e614dd7e7d75284a8886165f11138e16117ffcbe4e4bbf95c", + "index": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0", + "masking_runtime": "831bebd2dcf6a8308d01ec62eb6e1132fe7edbbc666c1c83787335acc576b19c", + "objective": "62502d0d1b44a10989350a78f1e033d271fe8417715e10d42eb47c6720ceb3bf", + "sequence_receipt": "399df3de2b6c4d5e88aa442c8326214ab9cff2e8f0411e6921762bbade1475ba", + "tokens": "ec2d52dced65d22f0f218ff617d351fbd2930661bc8681e939990149d493537d", + "topology_lengths": "b52f6ddcf327b8cfc5159659bada97357216f9526b42c230a35192932f43d2f3", + "topology_offsets": "e06d61b8e47c2a2a3e0c8aeec7e015e673f64f0f483a483abe40ccda2d08b9e0", + "topology_receipt": "333ee6f34e69f89e26b810cc565415b89d6874615ea4ac57850371fb159c1b71", + "topology_roster": "a216ce485ea699fb1b66ed6915175a49cde8c7d14279dbaf835f4675bc7c7fa1", + "topology_row": "a0ae28b0476322e3dbeda42a891f4a42c0973002a5d8507bf387b12dcbff4e95", + "topology_values": "2d4ba8395f78864b7eed9ed250bb9fd50bd45ef84a10ed497ffb89c684276e4e", + "vocabulary": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b" + }, + "status": "PASS_EXACT_RATIONAL_TRAIN_ONLY_NULL", + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null_receipt.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null_receipt.json new file mode 100644 index 0000000000000000000000000000000000000000..16d66557629032f9b5d13ae024555ba60a309cfd --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null_receipt.json @@ -0,0 +1,28 @@ +{ + "checkpoint_resume_authorized": false, + "downstream_evaluation_authorized": false, + "gpu_launch_authorized": false, + "nova_submission_authorized": false, + "official_submitted_or_predecessor_artifacts_modified": false, + "payloads": { + "review_null_builder.py": { + "bytes": 17633, + "name": "review_null_builder.py", + "sha256": "269ed77c765432a515be2da7817d5d2ef4294c25d3095679ae14e19e2fe7db32" + } + }, + "publication": { + "atomic_rename": true, + "no_overwrite": true, + "receipt_written_last": true + }, + "schema": "bertose_a5_official_topology_train_only_null_v1_receipt", + "scientific_launch_authorized": false, + "status": "PASS_RECEIPT_LAST", + "summary": { + "bytes": 2970, + "name": "review_a5_official_topology_train_only_null.json", + "sha256": "a752ffd350fbe38aa0e6f6b42b76137f4f72d76fa9a7f5d3609bc47c65c552de" + }, + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_ms_acquisition_top30_v3_20260721_r3/review_a5_ms_acquisition_top30_runtime_v3.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_ms_acquisition_top30_v3_20260721_r3/review_a5_ms_acquisition_top30_runtime_v3.py new file mode 100644 index 0000000000000000000000000000000000000000..dfe2e1a6029752aba3e99a82f00730c919824a45 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_ms_acquisition_top30_v3_20260721_r3/review_a5_ms_acquisition_top30_runtime_v3.py @@ -0,0 +1,1053 @@ +"""Isolated top-30 acquisition-level MS package loader, scheduler, and masker. + +This review-only runtime consumes a hash-pinned packed package. It deliberately +has no factorial-arm input: every MS-active cell receives the same acquisition +and mask stream for the same seed, epoch, and package bytes. It never imports +the submitted/shared training modules and cannot authorize training by itself. +""" + +from __future__ import annotations + +import csv +from dataclasses import dataclass +import gzip +import hashlib +import io +import json +import math +import os +from pathlib import Path +import stat +import struct +from typing import Any, Iterable, Mapping, Sequence + +import numpy as np + + +SCHEMA = "bertose_a5_ms_acquisition_top30_runtime_v3" +AUTHORITY_SCHEMA = "bertose_a5_ms_acquisition_top30_runtime_authority_v3" +RECEIPT_SCHEMA = "bertose_a5_ms_acquisition_top30_runtime_receipt_v3" +CURSOR_SCHEMA = "bertose_a5_ms_acquisition_top30_resume_cursor_v3" +SCHEDULE_SCHEMA = "bertose_a5_ms_parent_cycle_hash_schedule_v1" +SCHEDULE_DOMAIN = "bertose-a5-ms-acquisition-view-selection-v1" +PARENT_ORDER_DOMAIN = "bertose-a5-ms-parent-order-v1" +MASK_STREAM_DOMAIN = b"bertose-masker-v4-sha256-stream-key-v1\0" +MASK_DRAW_DOMAIN = b"bertose-masker-v4-sha256-counter-draw-v1\0" +PAIR_MASK_NUMERATOR = 3 +PAIR_MASK_DENOMINATOR = 20 +MASK_REPLACEMENT_CUMULATIVE_NUMERATOR = 4 +MASK_REPLACEMENT_CUMULATIVE_DENOMINATOR = 5 +RANDOM_REPLACEMENT_CUMULATIVE_NUMERATOR = 9 +RANDOM_REPLACEMENT_CUMULATIVE_DENOMINATOR = 10 +DRAW_SPACE = 2**256 +DEVELOPMENT_EXPANSION_SCHEMA = "bertose_a5_ms_development_expansion_v2" +DEVELOPMENT_EXPANSION_DOMAIN = b"bertose-a5-ms-development-expansion-v2\0" +RAW_RUNTIME_BINDING_DOMAIN = b"bertose-a5-ms-packed-raw-runtime-binding-v1\0" +DEVELOPMENT_EXPANSION_FIELDS = ( + "development_expansion_index", + "parent_index", + "parent_glycorpus_id", + "row_index", + "acquisition_identity_sha256", + "row_key", + "ms_parent_weight_numerator", + "ms_parent_weight_denominator", + "within_parent_acquisition_weight_numerator", + "within_parent_acquisition_weight_denominator", + "acquisition_expansion_outputs", + "sequence_global_parent_weight_source", + "topology_development_nesting", + "static_development_nesting", +) + +TRAIN_ROLE = "pretraining_train" +DEVELOPMENT_ROLE = "pretraining_development" +ROLE_CODE = {TRAIN_ROLE: 0, DEVELOPMENT_ROLE: 1} +MS_PAD_ID = 2 +MS_MZ_IDS = tuple(range(29, 242)) +MS_INTENSITY_IDS = (26, 27, 28) +MS_MAX_LENGTH = 64 +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False + + +def sha256_file(path: Path) -> str: + digest = hashlib.sha256() + descriptor = os.open(path, os.O_RDONLY | getattr(os, "O_NOFOLLOW", 0)) + try: + metadata = os.fstat(descriptor) + if not stat.S_ISREG(metadata.st_mode): + raise RuntimeError(f"not a regular no-follow file: {path}") + while True: + chunk = os.read(descriptor, 1024 * 1024) + if not chunk: + break + digest.update(chunk) + finally: + os.close(descriptor) + return digest.hexdigest() + + +def _read_bytes_nofollow(path: Path) -> bytes: + descriptor = os.open(path, os.O_RDONLY | getattr(os, "O_NOFOLLOW", 0)) + try: + metadata = os.fstat(descriptor) + if not stat.S_ISREG(metadata.st_mode): + raise RuntimeError(f"not a regular no-follow file: {path}") + pieces: list[bytes] = [] + while True: + chunk = os.read(descriptor, 1024 * 1024) + if not chunk: + break + pieces.append(chunk) + return b"".join(pieces) + finally: + os.close(descriptor) + + +def _read_json_nofollow(path: Path) -> Any: + return json.loads(_read_bytes_nofollow(path).decode("utf-8")) + + +def _open_binary_nofollow(path: Path): + descriptor = os.open(path, os.O_RDONLY | getattr(os, "O_NOFOLLOW", 0)) + metadata = os.fstat(descriptor) + if not stat.S_ISREG(metadata.st_mode): + os.close(descriptor) + raise RuntimeError(f"not a regular no-follow file: {path}") + return os.fdopen(descriptor, "rb", closefd=True) + + +def _valid_sha256(value: object) -> bool: + return ( + isinstance(value, str) + and len(value) == 64 + and all(character in "0123456789abcdef" for character in value) + ) + + +def _require_regular(path: Path, label: str) -> Path: + path = Path(path) + if not path.is_absolute() or path.is_symlink() or not path.is_file(): + raise RuntimeError(f"{label} must be an absolute nonsymbolic regular file") + current = path.parent + while current != current.parent: + if current.is_symlink(): + raise RuntimeError(f"{label} has a symbolic parent") + current = current.parent + return path + + +def _receipt(path: Path) -> dict[str, Any]: + path = _require_regular(path, path.name) + with _open_binary_nofollow(path) as handle: + size = os.fstat(handle.fileno()).st_size + return {"name": path.name, "bytes": size, "sha256": sha256_file(path)} + + +def _schedule_hash(*parts: str) -> str: + digest = hashlib.sha256() + for part in parts: + payload = part.encode("utf-8") + digest.update(struct.pack("!Q", len(payload))) + digest.update(payload) + return digest.hexdigest() + + +def _target_sha256(token_ids: Sequence[int]) -> str: + digest = hashlib.sha256() + digest.update(struct.pack("!Q", len(token_ids))) + for token_id in token_ids: + digest.update(struct.pack("!q", int(token_id))) + return digest.hexdigest() + + +def validate_target(token_ids: Sequence[int]) -> None: + if any(isinstance(value, bool) or not isinstance(value, (int, np.integer)) for value in token_ids): + raise ValueError("acquisition target IDs must be exact integers") + values = [int(value) for value in token_ids] + if len(values) < 6 or len(values) > MS_MAX_LENGTH or values[:3] != [0, 3, 5] or values[-1] != 1: + raise ValueError("invalid acquisition-level no-RT target envelope") + body = values[3:-1] + if not body or len(body) % 2: + raise ValueError("invalid acquisition-level target body") + if any(value not in MS_MZ_IDS for value in body[0::2]): + raise ValueError("target has an invalid m/z token") + if any(value not in MS_INTENSITY_IDS for value in body[1::2]): + raise ValueError("target has an invalid intensity-level token") + if len(set(body[0::2])) != len(body[0::2]): + raise ValueError("target repeats an m/z bin") + + +@dataclass(frozen=True, slots=True) +class AcquisitionRow: + row_index: int + parent_index: int + role: str + parent_id: str + row_key: str + acquisition_sha256: str + source_record_identity: str + source_record_identity_sha256: str + source_raw_numeric_coordinate_sha256: str + ledger_positive_parser_projection_sha256: str + raw_coordinate_container_sha256: str + raw_container_locator: str + raw_transformation_row_surface_sha256: str + target_sha256: str + target_offset: int + target_length: int + source_family: str + condition_signature_present: bool + complete_physical_condition_metadata: bool + + +@dataclass(frozen=True, slots=True) +class ParentRecord: + parent_index: int + role: str + parent_id: str + canonical_wurcs: str + row_start: int + row_count: int + total_target_token_count: int + + +@dataclass(frozen=True, slots=True) +class PlannedAcquisition: + global_parent_order_index: int + parent_id: str + parent_index: int + row_index: int + acquisition_sha256: str + row_key: str + cycle_index: int + cycle_position: int + selection_sha256: str + + +@dataclass(frozen=True, slots=True) +class MaskedAcquisition: + token_ids: np.ndarray + labels: np.ndarray + input_mask: np.ndarray + selected_positions: np.ndarray + + +@dataclass(frozen=True, slots=True) +class DevelopmentExpansionRecord: + development_expansion_index: int + parent_index: int + parent_glycorpus_id: str + row_index: int + acquisition_identity_sha256: str + row_key: str + ms_parent_weight_numerator: int + ms_parent_weight_denominator: int + within_parent_acquisition_weight_numerator: int + within_parent_acquisition_weight_denominator: int + acquisition_expansion_outputs: str + sequence_global_parent_weight_source: str + topology_development_nesting: str + static_development_nesting: str + + +def _length_prefixed(payload: bytes) -> bytes: + return len(payload).to_bytes(8, "big") + payload + + +def _constant_bytes(value: object) -> bytes: + if value is None: + return b"none" + if isinstance(value, bool): + return b"bool1" if value else b"bool0" + if isinstance(value, int): + return b"int" + _length_prefixed(str(value).encode("ascii")) + if isinstance(value, float): + return b"float" + _length_prefixed(value.hex().encode("ascii")) + if isinstance(value, str): + return b"str" + _length_prefixed(value.encode("utf-8")) + if isinstance(value, bytes): + return b"bytes" + _length_prefixed(value) + raise TypeError(f"unsupported deterministic RNG key type: {type(value).__name__}") + + +def _generator(*parts: object) -> list[object]: + payload = bytearray(MASK_STREAM_DOMAIN) + for part in parts: + payload.extend(_length_prefixed(_constant_bytes(part))) + return [hashlib.sha256(payload).digest(), 0] + + +def _draw_uint256(generator: list[object]) -> int: + key, counter = generator + if not isinstance(key, bytes) or len(key) != 32 or type(counter) is not int or not 0 <= counter < 2**128: + raise RuntimeError("invalid MS mask counter stream") + generator[1] = counter + 1 + return int.from_bytes( + hashlib.sha256(MASK_DRAW_DOMAIN + key + counter.to_bytes(16, "big")).digest(), + "big", + ) + + +def _draw_below_ratio(draw: int, numerator: int, denominator: int) -> bool: + if ( + type(draw) is not int + or not 0 <= draw < DRAW_SPACE + or type(numerator) is not int + or type(denominator) is not int + or denominator <= 0 + or not 0 <= numerator <= denominator + ): + raise ValueError("invalid exact rational draw threshold") + return draw * denominator < numerator * DRAW_SPACE + + +def _selected_pair_count_rational( + peak_count: int, numerator: int, denominator: int +) -> int: + if ( + type(peak_count) is not int + or peak_count <= 0 + or type(numerator) is not int + or type(denominator) is not int + or numerator <= 0 + or denominator <= 0 + or numerator > denominator + ): + raise ValueError("active MS pair selection requires a positive exact rational law") + return min(peak_count, max(1, (peak_count * numerator) // denominator)) + + +def selected_pair_count(peak_count: int) -> int: + """Return the non-configurable exact 3/20 whole-pair mask count.""" + return _selected_pair_count_rational( + peak_count, PAIR_MASK_NUMERATOR, PAIR_MASK_DENOMINATOR + ) + + +def replacement_route(draw: int) -> str: + if _draw_below_ratio( + draw, + MASK_REPLACEMENT_CUMULATIVE_NUMERATOR, + MASK_REPLACEMENT_CUMULATIVE_DENOMINATOR, + ): + return "mask" + if _draw_below_ratio( + draw, + RANDOM_REPLACEMENT_CUMULATIVE_NUMERATOR, + RANDOM_REPLACEMENT_CUMULATIVE_DENOMINATOR, + ): + return "random_same_family_excluding_original" + return "unchanged" + + +def _randbelow(generator: list[object], upper: int) -> int: + space = 2**256 + limit = space - (space % upper) + while True: + draw = _draw_uint256(generator) + if draw < limit: + return draw % upper + + +def _replacement_excluding_original(original: int, pool: tuple[int, ...], generator: list[object]) -> int: + index = _randbelow(generator, len(pool) - 1) + original_index = pool.index(original) + if index >= original_index: + index += 1 + return int(pool[index]) + + +def selected_prefix_sha256(selection_hashes: Sequence[str]) -> str: + digest = hashlib.sha256() + for value in selection_hashes: + if not _valid_sha256(value): + raise ValueError("invalid selection hash") + payload = value.encode("ascii") + digest.update(struct.pack("!Q", len(payload))) + digest.update(payload) + return digest.hexdigest() + + +def _development_replay_sha256(records: Iterable[DevelopmentExpansionRecord]) -> str: + digest = hashlib.sha256(DEVELOPMENT_EXPANSION_DOMAIN) + for record in records: + for field in DEVELOPMENT_EXPANSION_FIELDS: + encoded = str(getattr(record, field)).encode("utf-8") + digest.update(struct.pack("!Q", len(encoded))) + digest.update(encoded) + return digest.hexdigest() + + +def _raw_runtime_binding_sha256(rows: Iterable[AcquisitionRow]) -> str: + digest = hashlib.sha256(RAW_RUNTIME_BINDING_DOMAIN) + for row in rows: + values = ( + row.row_index, + row.parent_index, + row.role, + row.parent_id, + row.row_key, + row.acquisition_sha256, + row.source_record_identity, + row.source_record_identity_sha256, + row.source_raw_numeric_coordinate_sha256, + row.ledger_positive_parser_projection_sha256, + row.raw_coordinate_container_sha256, + row.raw_container_locator, + row.raw_transformation_row_surface_sha256, + row.target_sha256, + ) + for value in values: + encoded = str(value).encode("utf-8") + digest.update(struct.pack("!Q", len(encoded))) + digest.update(encoded) + return digest.hexdigest() + + +def _rows_from_gzip_bytes(payload: bytes) -> list[dict[str, str]]: + with gzip.GzipFile(fileobj=io.BytesIO(payload), mode="rb") as compressed: + with io.TextIOWrapper(compressed, encoding="utf-8", newline="") as text: + return list(csv.DictReader(text, delimiter="\t")) + + +class ReviewMSAcquisitionTop30RuntimeV3: + """Hash-bound view of the packed acquisition target population.""" + + def __init__( + self, + *, + package_directory: Path, + ) -> None: + package_directory = Path(package_directory) + if not package_directory.is_absolute() or package_directory.is_symlink() or not package_directory.is_dir(): + raise RuntimeError("MS package directory must be absolute, nonsymbolic, and present") + current = package_directory + while current != current.parent: + if current.is_symlink(): + raise RuntimeError("MS package directory has a symbolic parent") + current = current.parent + implementation = _require_regular(Path(__file__).absolute(), "MS runtime implementation") + implementation_sha256 = sha256_file(implementation) + + authority_path = _require_regular( + package_directory / "review_a5_ms_acquisition_top30_runtime_authority.json", + "MS runtime authority", + ) + receipt_path = _require_regular( + package_directory / "review_a5_ms_acquisition_top30_runtime_receipt.json", + "MS runtime receipt", + ) + authority_sha256 = sha256_file(authority_path) + receipt_sha256 = sha256_file(receipt_path) + authority = _read_json_nofollow(authority_path) + receipt = _read_json_nofollow(receipt_path) + if ( + authority.get("schema") != AUTHORITY_SCHEMA + or receipt.get("schema") != RECEIPT_SCHEMA + or authority.get("status") != "PASS_RUNTIME_PACKAGE_PREPARATION_ONLY" + or receipt.get("status") != "PASS_RUNTIME_BYTES_PREPARATION_ONLY" + ): + raise RuntimeError("MS runtime package schema/status changed") + for payload in (authority, receipt): + if payload.get("training_authorized") is not False or payload.get("scientific_launch_authorized") is not False: + raise RuntimeError("MS package cannot authorize training or launch") + if authority.get("implementation", {}).get("sha256") != implementation_sha256: + raise RuntimeError("authority does not bind the loaded MS runtime") + if receipt.get("authority", {}).get("sha256") != authority_sha256: + raise RuntimeError("receipt does not bind the authority bytes") + if receipt.get("implementation", {}).get("runtime", {}).get("sha256") != implementation_sha256: + raise RuntimeError("receipt does not bind the loaded MS runtime") + + artifact_receipts = authority.get("artifacts") + if not isinstance(artifact_receipts, dict): + raise RuntimeError("MS authority lacks artifact receipts") + artifact_paths: dict[str, Path] = {} + artifact_bytes: dict[str, bytes] = {} + for label, declared in artifact_receipts.items(): + if not isinstance(declared, Mapping) or not isinstance(declared.get("name"), str): + raise RuntimeError(f"invalid MS artifact receipt: {label}") + path = _require_regular(package_directory / declared["name"], f"MS artifact {label}") + observed = _receipt(path) + if observed != dict(declared): + raise RuntimeError(f"MS artifact bytes changed: {label}") + artifact_paths[label] = path + if label in { + "row_manifest", + "parent_manifest", + "development_expansion_manifest", + }: + artifact_bytes[label] = _read_bytes_nofollow(path) + + self.package_directory = package_directory + self.authority_sha256 = authority_sha256 + self.receipt_sha256 = receipt_sha256 + self.implementation_sha256 = implementation_sha256 + self.authority = authority + self.population_binding_sha256 = authority["schedule"]["population_binding_sha256"] + self.schedule_seed = int(authority["schedule"]["seed"]) + if authority["schedule"]["schema"] != SCHEDULE_SCHEMA or not _valid_sha256(self.population_binding_sha256): + raise RuntimeError("MS schedule authority changed") + + target_handle = _open_binary_nofollow(artifact_paths["target_ids"]) + offsets_handle = _open_binary_nofollow(artifact_paths["target_offsets"]) + try: + self._target_ids = np.memmap(target_handle, dtype=" None: + """Close both read-only memory maps; safe to call repeatedly.""" + + if getattr(self, "_closed", True): + return + self._closed = True + seen: set[int] = set() + for name in ("_target_ids", "_offsets"): + array = getattr(self, name, None) + mapping = getattr(array, "_mmap", None) + if mapping is not None and id(mapping) not in seen: + seen.add(id(mapping)) + mapping.close() + + def __enter__(self): + if self._closed: + raise RuntimeError("MS runtime is already closed") + return self + + def __exit__(self, exc_type, exc_value, traceback) -> None: + self.close() + + def __del__(self) -> None: + try: + self.close() + except BaseException: + pass + + def _validate_index(self) -> None: + counts = self.authority["counts"] + if len(self.rows) != counts["active_acquisition_count"] or len(self.parents) != counts["active_parent_count"]: + raise RuntimeError("MS runtime index counts changed") + if len(self._offsets) != len(self.rows) + 1 or int(self._offsets[0]) != 0 or int(self._offsets[-1]) != len(self._target_ids): + raise RuntimeError("MS target offset table is not complete") + if len(self.parent_by_id) != len(self.parents): + raise RuntimeError("MS parent index contains duplicates") + for expected, parent in enumerate(self.parents): + if parent.parent_index != expected or parent.role not in ROLE_CODE or parent.row_count <= 0: + raise RuntimeError("MS parent table ordering/role changed") + selected = self.rows[parent.row_start : parent.row_start + parent.row_count] + if len(selected) != parent.row_count or any(row.parent_index != expected or row.parent_id != parent.parent_id or row.role != parent.role for row in selected): + raise RuntimeError("MS row/parent index relation changed") + for expected, row in enumerate(self.rows): + if ( + row.row_index != expected + or row.target_offset != int(self._offsets[expected]) + or row.target_length != int(self._offsets[expected + 1] - self._offsets[expected]) + or not _valid_sha256(row.acquisition_sha256) + or not _valid_sha256(row.source_record_identity_sha256) + or not _valid_sha256(row.source_raw_numeric_coordinate_sha256) + or not _valid_sha256(row.ledger_positive_parser_projection_sha256) + or not _valid_sha256(row.raw_coordinate_container_sha256) + or not row.source_record_identity + or not row.raw_container_locator + or hashlib.sha256(row.source_record_identity.encode("utf-8")).hexdigest() + != row.source_record_identity_sha256 + or not _valid_sha256(row.raw_transformation_row_surface_sha256) + or not _valid_sha256(row.target_sha256) + ): + raise RuntimeError("MS acquisition row index changed") + raw_binding = self.authority.get("raw_to_top30_authority_binding") + if ( + not isinstance(raw_binding, Mapping) + or raw_binding.get("row_count") != 225_056 + or raw_binding.get("unique_raw_transformation_row_surface_count") + != 225_056 + or raw_binding.get( + "source_raw_differs_from_positive_parser_projection_count" + ) + != 351 + or raw_binding.get("all_row_parent_role_source_acquisition_target_joins_exact") + is not True + or raw_binding.get("authority_streamed_no_follow_not_loaded_wholesale") + is not True + or raw_binding.get("raw_authority_file_sha256") + != "d3c16f4bdbe8b35440855d1c83287c5bda12d512ec3b89ba0ca312829dddb7f4" + or raw_binding.get("raw_authority_whole_surface_sha256") + != "83fbdd24bb99332329da7b31c8412e74fef169f3c8faede9e4e09db04f9f1200" + or raw_binding.get("raw_publication_certificate_sha256") + != "d9f5845940f57af88d212d395bf90bcd4e8d5728d88060c460ad0784390a1bd5" + or raw_binding.get("packed_runtime_binding_sha256") + != _raw_runtime_binding_sha256(self.rows) + ): + raise RuntimeError("MS raw-to-TOP30 authority binding changed") + target_contract = self.authority.get("target_contract") + if ( + not isinstance(target_contract, Mapping) + or target_contract.get("training_mask_api") + != "mask_target(row_index, epoch, seed)" + or target_contract.get("development_mask_api") + != "mask_development_target(row_index)" + or target_contract.get("development_mask_seed") != 0 + or target_contract.get("development_mask_epoch") != 0 + or target_contract.get("development_mask_seed_or_epoch_caller_control") + is not False + or target_contract.get("replacement_routing", {}).get("routing_unit") + != "one physical m/z+intensity peak pair" + or target_contract.get("replacement_routing", {}).get( + "shared_route_draw_for_both_pair_tokens" + ) + is not True + or target_contract.get("replacement_routing", {}).get( + "half_revealed_selected_pair_possible" + ) + is not False + ): + raise RuntimeError("MS train/development corruption contract changed") + null_ruler = self.authority.get("null_ruler") + if ( + not isinstance(null_ruler, Mapping) + or null_ruler.get("scale") != 3.006098541980086 + or null_ruler.get("parent_count") != 2_455 + or null_ruler.get("acquisition_count") != 175_483 + or null_ruler.get("development_rows_used_for_fit") != 0 + or null_ruler.get("finite_epoch_exposure_used_for_fit") is not False + or null_ruler.get("recomputed_from_packed_primary_train_targets") + is not True + or null_ruler.get("frozen_design_oracle_coefficients_preserved") + is not True + or float( + null_ruler.get( + "maximum_absolute_difference_from_frozen_design_oracle", + math.inf, + ) + ) + > 1e-12 + ): + raise RuntimeError("MS fixed train-only null authority changed") + supersession = self.authority.get("supersession") + if ( + not isinstance(supersession, Mapping) + or supersession.get("predecessor_runtime", {}).get("bytes") != 33_000 + or supersession.get("predecessor_runtime", {}).get("sha256") + != "94359f20bf8040e7758d2b793d5c78a6b3045cd726143b785d7d8cbbeda6aa14" + or supersession.get("predecessor_preserved_without_overwrite") is not True + or supersession.get("predecessor_release_status") + != "NO_GO_SUPERSEDED" + or supersession.get("successor_schema") + != "bertose_a5_ms_acquisition_top30_runtime_v3" + ): + raise RuntimeError("MS predecessor/successor authority changed") + contract = self.authority.get("development_expansion_contract") + if ( + not isinstance(contract, Mapping) + or contract.get("schema") != DEVELOPMENT_EXPANSION_SCHEMA + or contract.get("eligible_parent_count") != 580 + or contract.get("eligible_acquisition_count") != 49_573 + or contract.get("ms_lane_acquisition_expansion_outputs") + != ["sequence", "ms"] + or contract.get("every_eligible_ms_acquisition_required_for_each_output") + is not True + or contract.get("topology_development_nesting") + != "pre-fusion seq_hidden_base; once per eligible topology parent on the full topology roster; never acquisition-expanded or restricted to MS parents" + or contract.get("topology_roster_ownership") + != "composite must replay every eligible topology development parent exactly once; MS package supplies no topology roster filter" + ): + raise RuntimeError("MS development expansion contract changed") + expected_expansion = list(self.iter_development_expansion()) + if len(expected_expansion) != len(self._development_expansion_rows): + raise RuntimeError("MS development expansion row count changed") + for expected, observed in zip( + expected_expansion, self._development_expansion_rows, strict=True + ): + expected_payload = { + field: str(getattr(expected, field)) + for field in DEVELOPMENT_EXPANSION_FIELDS + } + if observed != expected_payload: + raise RuntimeError("MS development expansion manifest changed") + replay_sha256 = _development_replay_sha256(expected_expansion) + if replay_sha256 != contract.get("replay_sha256"): + raise RuntimeError("MS development expansion replay hash changed") + self.development_expansion_replay_sha256 = replay_sha256 + + def target(self, row_index: int, *, verify_semantics: bool = False) -> np.ndarray: + if self._closed: + raise RuntimeError("MS runtime is closed") + if type(row_index) is not int or not 0 <= row_index < len(self.rows): + raise IndexError("MS row index outside package") + row = self.rows[row_index] + result = np.asarray( + self._target_ids[row.target_offset : row.target_offset + row.target_length], + dtype=np.uint16, + ).copy() + if verify_semantics: + validate_target(result.tolist()) + if _target_sha256(result.tolist()) != row.target_sha256: + raise RuntimeError("MS target content differs from row identity") + return result + + def _select_parent(self, parent: ParentRecord, *, epoch: int, seed: int) -> PlannedAcquisition: + candidates = self.rows[parent.row_start : parent.row_start + parent.row_count] + cycle, position = divmod(epoch, len(candidates)) + ranked = sorted( + candidates, + key=lambda row: ( + _schedule_hash( + SCHEDULE_DOMAIN, + self.population_binding_sha256, + str(seed), + parent.parent_id, + str(cycle), + row.acquisition_sha256, + row.row_key, + ), + row.acquisition_sha256, + row.row_key, + ), + ) + row = ranked[position] + selection = _schedule_hash( + SCHEDULE_SCHEMA, + self.population_binding_sha256, + str(seed), + str(epoch), + parent.parent_id, + row.acquisition_sha256, + row.row_key, + ) + return PlannedAcquisition( + global_parent_order_index=-1, + parent_id=parent.parent_id, + parent_index=parent.parent_index, + row_index=row.row_index, + acquisition_sha256=row.acquisition_sha256, + row_key=row.row_key, + cycle_index=cycle, + cycle_position=position, + selection_sha256=selection, + ) + + def epoch_plan(self, *, epoch: int, seed: int | None = None) -> tuple[PlannedAcquisition, ...]: + if type(epoch) is not int or epoch < 0: + raise ValueError("epoch must be a nonnegative exact integer") + seed = self.schedule_seed if seed is None else seed + if type(seed) is not int or seed < 0 or seed >= 2**63: + raise ValueError("seed must be a nonnegative signed-64 exact integer") + parents = [parent for parent in self.parents if parent.role == TRAIN_ROLE] + ordered = sorted( + parents, + key=lambda parent: ( + _schedule_hash( + PARENT_ORDER_DOMAIN, + self.population_binding_sha256, + str(seed), + str(epoch), + parent.parent_id, + ), + parent.parent_id, + ), + ) + result = [] + for order_index, parent in enumerate(ordered): + selected = self._select_parent(parent, epoch=epoch, seed=seed) + result.append( + PlannedAcquisition( + global_parent_order_index=order_index, + parent_id=selected.parent_id, + parent_index=selected.parent_index, + row_index=selected.row_index, + acquisition_sha256=selected.acquisition_sha256, + row_key=selected.row_key, + cycle_index=selected.cycle_index, + cycle_position=selected.cycle_position, + selection_sha256=selected.selection_sha256, + ) + ) + return tuple(result) + + def resume_cursor(self, *, epoch: int, parent_cursor: int, seed: int | None = None) -> dict[str, Any]: + plan = self.epoch_plan(epoch=epoch, seed=seed) + if type(parent_cursor) is not int or not 0 <= parent_cursor <= len(plan): + raise ValueError("parent cursor outside epoch plan") + used_seed = self.schedule_seed if seed is None else seed + parent_order_digest = hashlib.sha256( + "\n".join(item.parent_id for item in plan).encode("utf-8") + ).hexdigest() + return { + "schema": CURSOR_SCHEMA, + "authority_sha256": self.authority_sha256, + "receipt_sha256": self.receipt_sha256, + "population_binding_sha256": self.population_binding_sha256, + "schedule_schema": SCHEDULE_SCHEMA, + "seed": used_seed, + "epoch": epoch, + "global_parent_cursor": parent_cursor, + "global_parent_order_sha256": parent_order_digest, + "selected_prefix_sha256": selected_prefix_sha256( + [item.selection_sha256 for item in plan[:parent_cursor]] + ), + } + + def resume_suffix(self, cursor: Mapping[str, Any]) -> tuple[PlannedAcquisition, ...]: + required = { + "schema", + "authority_sha256", + "receipt_sha256", + "population_binding_sha256", + "schedule_schema", + "seed", + "epoch", + "global_parent_cursor", + "global_parent_order_sha256", + "selected_prefix_sha256", + } + if set(cursor) != required: + raise RuntimeError("MS resume cursor fields changed") + expected = self.resume_cursor( + epoch=int(cursor["epoch"]), + parent_cursor=int(cursor["global_parent_cursor"]), + seed=int(cursor["seed"]), + ) + if dict(cursor) != expected: + raise RuntimeError("MS resume cursor does not match package and exact prefix") + return self.epoch_plan(epoch=expected["epoch"], seed=expected["seed"])[ + expected["global_parent_cursor"] : + ] + + @staticmethod + def shard_plan( + plan: Sequence[PlannedAcquisition], *, world_size: int, rank: int + ) -> tuple[PlannedAcquisition, ...]: + if type(world_size) is not int or world_size <= 0: + raise ValueError("world size must be a positive exact integer") + if type(rank) is not int or not 0 <= rank < world_size: + raise ValueError("rank outside world size") + return tuple(item for item in plan if item.global_parent_order_index % world_size == rank) + + def _mask_row( + self, + *, + row_index: int, + epoch: int, + seed: int, + expected_role: str, + stream_role: str, + ) -> MaskedAcquisition: + tokens = self.target(row_index, verify_semantics=True) + row = self.rows[row_index] + if row.role != expected_role: + raise ValueError(f"MS mask row is not {expected_role}") + generator = _generator( + seed, + stream_role, + epoch, + row.parent_id, + row.acquisition_sha256, + "ms", + ) + # Select whole physical peak pairs. Each chosen m/z bin and its + # intensity level are supervised together, guaranteeing nonempty and + # equally sized MZ/intensity families for the declared family-equal + # acquisition loss. + peak_indices = list(range((len(tokens) - 4) // 2)) + pair_count = selected_pair_count(len(peak_indices)) + ranked_pairs = sorted( + (_draw_uint256(generator), peak_index) for peak_index in peak_indices + ) + selected_peak_indices = sorted( + peak_index for _, peak_index in ranked_pairs[:pair_count] + ) + selected_indices = sorted( + position + for peak_index in selected_peak_indices + for position in (3 + 2 * peak_index, 4 + 2 * peak_index) + ) + selected = np.zeros(len(tokens), dtype=np.bool_) + selected[selected_indices] = True + labels = np.full(len(tokens), -100, dtype=np.int64) + labels[selected] = tokens[selected].astype(np.int64) + masked = tokens.copy() + input_mask = np.zeros(len(tokens), dtype=np.bool_) + for peak_index in selected_peak_indices: + positions = (3 + 2 * peak_index, 4 + 2 * peak_index) + draw = _draw_uint256(generator) + route = replacement_route(draw) + if route == "mask": + input_mask[list(positions)] = True + elif route == "random_same_family_excluding_original": + for position in positions: + original = int(tokens[position]) + pool = ( + MS_MZ_IDS if original in MS_MZ_IDS else MS_INTENSITY_IDS + ) + masked[position] = _replacement_excluding_original( + original, pool, generator + ) + return MaskedAcquisition(masked, labels, input_mask, selected) + + def mask_target( + self, + *, + row_index: int, + epoch: int, + seed: int, + ) -> MaskedAcquisition: + """Mask one training acquisition with the epoch-varying train stream. + + Development corruption is deliberately unavailable through this API; + callers must use :meth:`mask_development_target`, whose seed and epoch + are fixed and absent from the call signature. + """ + if type(epoch) is not int or epoch < 0 or type(seed) is not int or seed < 0: + raise ValueError("mask seed/epoch must be nonnegative exact integers") + return self._mask_row( + row_index=row_index, + epoch=epoch, + seed=seed, + expected_role=TRAIN_ROLE, + stream_role="train", + ) + + def mask_development_target(self, *, row_index: int) -> MaskedAcquisition: + """Mask one development acquisition with fixed seed 0 and epoch 0.""" + return self._mask_row( + row_index=row_index, + epoch=0, + seed=0, + expected_role=DEVELOPMENT_ROLE, + stream_role="development", + ) + + def development_rows(self) -> tuple[AcquisitionRow, ...]: + return tuple(row for row in self.rows if row.role == DEVELOPMENT_ROLE) + + def iter_development_expansion(self) -> Iterable[DevelopmentExpansionRecord]: + expansion_index = 0 + for parent in self.parents: + if parent.role != DEVELOPMENT_ROLE: + continue + for row in self.rows[ + parent.row_start : parent.row_start + parent.row_count + ]: + yield DevelopmentExpansionRecord( + development_expansion_index=expansion_index, + parent_index=parent.parent_index, + parent_glycorpus_id=parent.parent_id, + row_index=row.row_index, + acquisition_identity_sha256=row.acquisition_sha256, + row_key=row.row_key, + ms_parent_weight_numerator=1, + ms_parent_weight_denominator=580, + within_parent_acquisition_weight_numerator=1, + within_parent_acquisition_weight_denominator=parent.row_count, + acquisition_expansion_outputs="sequence|ms", + sequence_global_parent_weight_source=( + "composite_full_sequence_development_roster" + ), + topology_development_nesting=( + "pre_fusion_once_per_full_topology_parent_roster" + ), + static_development_nesting=( + "state_then_parent_separate_from_acquisition_expansion" + ), + ) + expansion_index += 1 + + def ms_parent_equal_development_loss(self, row_losses: Iterable[tuple[int, float]]) -> float: + expected_rows = {row.row_index for row in self.rows if row.role == DEVELOPMENT_ROLE} + observed: dict[int, float] = {} + for row_index, raw_value in row_losses: + if type(row_index) is not int or row_index not in expected_rows or row_index in observed: + raise ValueError("development loss rows are missing, duplicated, or outside development") + value = float(raw_value) + if not math.isfinite(value): + raise ValueError("development acquisition loss is nonfinite") + observed[row_index] = value + if set(observed) != expected_rows: + raise ValueError("development loss must include every eligible acquisition exactly once") + parent_means = [] + for parent in self.parents: + if parent.role == DEVELOPMENT_ROLE: + values = [observed[row.row_index] for row in self.rows[parent.row_start : parent.row_start + parent.row_count]] + parent_means.append(math.fsum(values) / len(values)) + return math.fsum(parent_means) / len(parent_means) + + +__all__ = [ + "AcquisitionRow", + "DevelopmentExpansionRecord", + "MaskedAcquisition", + "ParentRecord", + "PlannedAcquisition", + "ReviewMSAcquisitionTop30RuntimeV3", + "SCHEMA", + "TRAINING_AUTHORIZED", + "SCIENTIFIC_LAUNCH_AUTHORIZED", + "selected_prefix_sha256", + "selected_pair_count", + "replacement_route", + "sha256_file", + "validate_target", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_r2.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_r2.py new file mode 100644 index 0000000000000000000000000000000000000000..94c29d0c89b451b257b0d871231c1083889ef98a --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_r2.py @@ -0,0 +1,2286 @@ +"""Immutable, launch-closed r2 data adapter for the native eight A5 cells. + +This review-only runtime joins the frozen sequence/topology, MS, and static-R7 +identity surfaces. It materializes only sequence/topology/MS tensors. Static +R7 is availability evidence, not a trainable token package, so every +static-active cell fails before a production batch can be emitted. + +The public adapter accepts no caller-provided tensors or masks. All stochastic +surfaces are deterministic identity streams owned by the frozen modality +runtimes: seed 43 plus epoch for train and fixed seed 0/epoch 0 for development. +""" + +from __future__ import annotations + +import builtins +import csv +import gzip +import hashlib +import importlib.util +import io +import json +import math +import os +import re +import stat +import sys +from dataclasses import asdict, dataclass +from pathlib import Path +from types import MappingProxyType, ModuleType +from typing import Any, Iterable, Iterator, Mapping, Sequence + +import numpy as np +import torch + + +SCHEMA = "bertose_a5_native_eight_data_adapter_20260721_r2" +MANIFEST_SCHEMA = "bertose_a5_native_eight_joined_manifest_20260721_r1" +RECEIPT_SCHEMA = "bertose_a5_native_eight_data_adapter_receipt_20260721_r2" +STEP_SCHEMA = "bertose_a5_native_eight_authoritative_step_20260721_r2" +CURSOR_SCHEMA = "bertose_a5_native_eight_data_cursor_20260721_r2" +DEVELOPMENT_SCHEMA = "bertose_a5_native_eight_fixed_development_20260721_r2" + +TRAIN_ROLE = "pretraining_train" +DEVELOPMENT_ROLE = "pretraining_development" +COMMON_SEED = 43 +CELL_ORDER = ("A000", "A100", "A010", "A001", "A110", "A101", "A011", "A111") +CELL_BITS = { + "A000": (0, 0, 0), + "A100": (1, 0, 0), + "A010": (0, 1, 0), + "A001": (0, 0, 1), + "A110": (1, 1, 0), + "A101": (1, 0, 1), + "A011": (0, 1, 1), + "A111": (1, 1, 1), +} +TRAIN_PATTERN_COUNTS = { + "000": 147_444, + "001": 978, + "010": 1_491, + "011": 0, + "100": 49_345, + "101": 21_605, + "110": 567, + "111": 397, +} +DEVELOPMENT_PATTERN_COUNTS = { + "000": 37_213, + "001": 238, + "010": 339, + "011": 0, + "100": 12_351, + "101": 5_058, + "110": 147, + "111": 94, +} + +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +GPU_LAUNCH_AUTHORIZED = False +NOVA_SUBMISSION_AUTHORIZED = False +EXECUTION_CERTIFIED = False +STATIC_FINAL_TOKEN_PACKAGE_BOUND = False + + +class NativeEightDataAdapterError(RuntimeError): + """Fail-closed data identity, masking, or materialization error.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightDataAdapterError(message) + + +WRITING_ROOT = Path(__file__).absolute().parents[4] +DATA_ROOT = WRITING_ROOT.parent / "data" +SEQ_RUNTIME_ROOT = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3" +) +SEQ_RUNTIME_PATH = SEQ_RUNTIME_ROOT / "review_a5_official_ragged_sequence_topology.py" +SEQ_SUMMARY_PATH = SEQ_RUNTIME_ROOT / "review_a5_official_ragged_sequence_topology_runtime_summary.json" +SEQ_RECEIPT_PATH = SEQ_RUNTIME_ROOT / "review_a5_official_ragged_sequence_topology_runtime_receipt.json" +SEQ_PACKAGE = DATA_ROOT / "review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" +TOPOLOGY_PACKAGE = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1" +) +SEQ_NULL_PACKAGE = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1" +) +TOPOLOGY_NULL_PACKAGE = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1" +) + +MS_RUNTIME_PATH = ( + WRITING_ROOT + / "review/multimodal/runtime/a5_ms_acquisition_top30_v3_20260721_r3" + / "review_a5_ms_acquisition_top30_runtime_v3.py" +) +MS_PACKAGE = DATA_ROOT / "review_ms_acquisition_top30_runtime_20260721_r3" +MS_AUTHORITY_PATH = MS_PACKAGE / "review_a5_ms_acquisition_top30_runtime_authority.json" +MS_RECEIPT_PATH = MS_PACKAGE / "review_a5_ms_acquisition_top30_runtime_receipt.json" +MS_CERTIFICATE_PATH = MS_PACKAGE / "review_a5_ms_acquisition_top30_runtime_independent_certificate.json" +MS_PARENT_MANIFEST_PATH = MS_PACKAGE / "review_ms_acquisition_top30_parents.tsv.gz" + +R5_ROOT = WRITING_ROOT / "review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5" +PLANNER_PATH = R5_ROOT / "review_a5_native_eight_balanced_planner_r5.py" +COMPOSITE_PATH = R5_ROOT / "review_a5_native_eight_composite_r5.py" +EXECUTOR_PATH = R5_ROOT / "review_a5_native_eight_executor_r5.py" + +STATIC_ROOT = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_static_graph_v2_authority_20260721_r7" +) +STATIC_AUTHORITY_PATH = STATIC_ROOT / "review_a5_static_graph_v2_authority_r7.tsv.gz" +STATIC_RECEIPT_PATH = STATIC_ROOT / "review_a5_static_graph_v2_authority_receipt_r7.json" +STATIC_SUMMARY_PATH = STATIC_ROOT / "review_a5_static_graph_v2_authority_summary_r7.json" + +R1_JOINED_ROOT = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r1" +) +R1_ADAPTER_RECEIPT_PATH = R1_JOINED_ROOT / "review_a5_native_eight_data_adapter_receipt_r1.json" +TRAIN_MANIFEST_PATH = R1_JOINED_ROOT / "review_a5_native_eight_joined_train_manifest_r1.tsv.gz" +DEVELOPMENT_MANIFEST_PATH = ( + R1_JOINED_ROOT / "review_a5_native_eight_joined_development_manifest_r1.tsv.gz" +) +JOINED_ROOT = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r2" +) +ADAPTER_RECEIPT_PATH = JOINED_ROOT / "review_a5_native_eight_data_adapter_receipt_r2.json" + +EXPECTED_SHA256 = MappingProxyType( + { + "adapter_r1_receipt": "cacec838740d64a493c2e56fd1efa8a85ba7d11fce3ec26e40905c33db05e58d", + "joined_train_manifest_r1": "13b7ebc78b22baa1a38d2ae40da202dcc1e20e56f44220b4d4d5003ca5f3b8f2", + "joined_development_manifest_r1": "4eea50c1bd4eee0ea10062c287f31c619cef5835e2e660facd098698859f7e70", + "sequence_runtime": "0b212043878ebfc7edb75929aa0cfe025df7eaf69bc526ed57b85e5cd0b4ba69", + "sequence_summary": "31fd5a9e015b370681a9d2bacdc1b3ebce0e9408f0cf2835affa35596110460a", + "sequence_receipt": "53b058a2032c424718a96757b3aa63df5160c20910001fcb128b0ace03a13a4c", + "sequence_package_receipt": "399df3de2b6c4d5e88aa442c8326214ab9cff2e8f0411e6921762bbade1475ba", + "topology_package_receipt": "333ee6f34e69f89e26b810cc565415b89d6874615ea4ac57850371fb159c1b71", + "sequence_null": "b10556643abf560b9e8622e8ae67936d2d3ca8867433db485e785f31d049a8fb", + "sequence_null_receipt": "f4eb239f56e472d57dd3a3848c1a6c142e193cb326320ac8bf134b96ac35102a", + "sequence_mask_runtime": "831bebd2dcf6a8308d01ec62eb6e1132fe7edbbc666c1c83787335acc576b19c", + "topology_null": "a752ffd350fbe38aa0e6f6b42b76137f4f72d76fa9a7f5d3609bc47c65c552de", + "topology_null_receipt": "dace4cb5df71912f5aa7531bb0ce87db3b63d726b2a12aa41facabf9d54b5c35", + "ms_runtime": "68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6", + "ms_authority": "48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4", + "ms_receipt": "f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4", + "ms_certificate": "53098620a5c22dafdc951ba743515b4b10b1673c02f0aa4d881db669584902fa", + "ms_parent_manifest": "10dc3fa7622e2a7e448d775f4082fdc84aa0622f9a7a74bcfaeed491c0eb7d39", + "planner_r5": "1b9b05c812603db7b216aa989214a3c3715f80032b3a8b82577ae2b9e48f048d", + "composite_r5": "24c35257fc61e1c9c77630d2b0075775a7f46b6500ecb5f175ef8f42bd214e0e", + "executor_r5": "a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2", + "planner_r5_certificate": "4b3198f26e45d84ffced87280e7ac6cd59932bb92cf4da66db1eefb099b897bf", + "static_r7_authority": "59cf794d52341847b08aaa7f4212d1203dec4df89609157d924fda50d54f7602", + "static_r7_receipt": "0729fa35e7a34a51ee77d2752f008a783d582b845e6c8dd9ae694eb9edb61d9c", + "static_r7_summary": "f95235a74962fd8aec04b0a14ad17aea3e2bcec27826102d5d26d3f907871908", + } +) + +SEQUENCE_PACKAGE_RECEIPT_PATH = SEQ_PACKAGE / "review_sequence_package_receipt.json" +TOPOLOGY_PACKAGE_RECEIPT_PATH = TOPOLOGY_PACKAGE / "review_a5_official_ragged_topology_receipt.json" +SEQUENCE_NULL_PATH = SEQ_NULL_PACKAGE / "review_a5_official_sequence_train_only_null.json" +SEQUENCE_NULL_RECEIPT_PATH = ( + SEQ_NULL_PACKAGE / "review_a5_official_sequence_train_only_null_receipt.json" +) +SEQUENCE_MASK_RUNTIME_PATH = SEQ_NULL_PACKAGE / "review_frozen_sequence_masking_runtime.py" +TOPOLOGY_NULL_PATH = TOPOLOGY_NULL_PACKAGE / "review_a5_official_topology_train_only_null.json" +TOPOLOGY_NULL_RECEIPT_PATH = ( + TOPOLOGY_NULL_PACKAGE / "review_a5_official_topology_train_only_null_receipt.json" +) +PLANNER_CERTIFICATE_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_native_eight_balanced_planner_r5_certificate_20260721_r1" + / "review_a5_native_eight_balanced_planner_r5_certificate_r1.md" +) + +EXPECTED_R1_ARTIFACTS = MappingProxyType( + { + "train_manifest": { + "name": "review_a5_native_eight_joined_train_manifest_r1.tsv.gz", + "bytes": 15_455_767, + "sha256": EXPECTED_SHA256["joined_train_manifest_r1"], + "rows": 221_827, + "canonical_row_surface_sha256": "94f8e3b13bf95bed3f2768c9303d8602ecfa78d3c1d7956699c68856f33e8eef", + }, + "development_manifest": { + "name": "review_a5_native_eight_joined_development_manifest_r1.tsv.gz", + "bytes": 3_982_015, + "sha256": EXPECTED_SHA256["joined_development_manifest_r1"], + "rows": 55_440, + "canonical_row_surface_sha256": "92f46de77c5e1831f01dbe4f672bad19b180d8fb0ea6798040bd07ed7009112b", + }, + } +) + + +def _read_regular_nofollow(path: Path, *, label: str) -> bytes: + """Open every path component no-follow and hash the pinned leaf bytes. + + No ``resolve()``, pathname pre-check, or second pathname read participates + in an authority decision. The returned bytes and their size come from one + retained leaf descriptor after an exact ancestor walk. + """ + + _require( + hasattr(os, "O_NOFOLLOW") and hasattr(os, "O_DIRECTORY"), + f"{label} platform lacks complete no-follow traversal", + ) + absolute = Path(path) + _require(absolute.is_absolute(), f"{label} path is not absolute") + parts = absolute.parts + _require( + bool(parts) + and parts[0] == os.sep + and all(part not in {"", ".", ".."} for part in parts[1:]) + and os.path.normpath(os.fspath(absolute)) == os.fspath(absolute), + f"{label} path is not canonical", + ) + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(parts[-1], leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + _require(stat.S_ISREG(before.st_mode), f"{label} is not a regular file") + chunks: list[bytes] = [] + while True: + chunk = os.read(descriptor, 1 << 20) + if not chunk: + break + chunks.append(chunk) + after = os.fstat(descriptor) + _require( + ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + ) + == ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + ), + f"{label} changed during read", + ) + payload = b"".join(chunks) + _require(len(payload) == before.st_size, f"{label} size changed during read") + return payload + except OSError as error: + raise NativeEightDataAdapterError( + f"{label} no-follow open failed: {error}" + ) from error + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + + +def _sha256(payload: bytes) -> str: + return hashlib.sha256(payload).hexdigest() + + +def _file_receipt(path: Path, *, label: str) -> dict[str, Any]: + payload = _read_regular_nofollow(path, label=label) + return {"name": path.name, "bytes": len(payload), "sha256": _sha256(payload)} + + +def _jsonable(value: object) -> object: + if isinstance(value, Mapping): + return {str(key): _jsonable(item) for key, item in value.items()} + if isinstance(value, (tuple, list)): + return [_jsonable(item) for item in value] + if isinstance(value, np.generic): + return value.item() + return value + + +def _canonical_bytes(value: object) -> bytes: + return ( + json.dumps(_jsonable(value), sort_keys=True, separators=(",", ":"), allow_nan=False) + + "\n" + ).encode("utf-8") + + +def _canonical_sha256(value: object, *, domain: str) -> str: + return hashlib.sha256(domain.encode("ascii") + b"\0" + _canonical_bytes(value)).hexdigest() + + +def _load_bound_module(path: Path, expected_sha256: str, *, name: str) -> ModuleType: + source = _read_regular_nofollow(path, label=name) + _require(_sha256(source) == expected_sha256, f"{name} source hash changed") + module_name = f"_review_a5_adapter_r2_bound_{name}_{expected_sha256}" + existing = sys.modules.get(module_name) + if existing is not None: + _require( + getattr(existing, "__adapter_r2_source_sha256__", None) == expected_sha256, + f"{name} stable module name is occupied by different bytes", + ) + return existing + module = ModuleType(module_name) + module.__file__ = os.fspath(path) + module.__package__ = "" + module.__adapter_r2_source_sha256__ = expected_sha256 + sys.modules[module_name] = module + try: + exec(compile(source, os.fspath(path), "exec"), module.__dict__) + except BaseException: + sys.modules.pop(module_name, None) + raise + return module + + +def _verify_expected(path: Path, key: str) -> str: + payload = _read_regular_nofollow(path, label=key) + observed = _sha256(payload) + _require(observed == EXPECTED_SHA256[key], f"{key} bytes changed") + return observed + + +def verify_authorities() -> Mapping[str, str]: + """Reopen every externally frozen authority with exact no-follow hashes.""" + + bindings = { + "adapter_r1_receipt": _verify_expected( + R1_ADAPTER_RECEIPT_PATH, "adapter_r1_receipt" + ), + "joined_train_manifest_r1": _verify_expected( + TRAIN_MANIFEST_PATH, "joined_train_manifest_r1" + ), + "joined_development_manifest_r1": _verify_expected( + DEVELOPMENT_MANIFEST_PATH, "joined_development_manifest_r1" + ), + "sequence_runtime": _verify_expected(SEQ_RUNTIME_PATH, "sequence_runtime"), + "sequence_summary": _verify_expected(SEQ_SUMMARY_PATH, "sequence_summary"), + "sequence_receipt": _verify_expected(SEQ_RECEIPT_PATH, "sequence_receipt"), + "sequence_package_receipt": _verify_expected( + SEQUENCE_PACKAGE_RECEIPT_PATH, "sequence_package_receipt" + ), + "topology_package_receipt": _verify_expected( + TOPOLOGY_PACKAGE_RECEIPT_PATH, "topology_package_receipt" + ), + "sequence_null": _verify_expected(SEQUENCE_NULL_PATH, "sequence_null"), + "sequence_null_receipt": _verify_expected( + SEQUENCE_NULL_RECEIPT_PATH, "sequence_null_receipt" + ), + "sequence_mask_runtime": _verify_expected( + SEQUENCE_MASK_RUNTIME_PATH, "sequence_mask_runtime" + ), + "topology_null": _verify_expected(TOPOLOGY_NULL_PATH, "topology_null"), + "topology_null_receipt": _verify_expected( + TOPOLOGY_NULL_RECEIPT_PATH, "topology_null_receipt" + ), + "ms_runtime": _verify_expected(MS_RUNTIME_PATH, "ms_runtime"), + "ms_authority": _verify_expected(MS_AUTHORITY_PATH, "ms_authority"), + "ms_receipt": _verify_expected(MS_RECEIPT_PATH, "ms_receipt"), + "ms_certificate": _verify_expected(MS_CERTIFICATE_PATH, "ms_certificate"), + "ms_parent_manifest": _verify_expected( + MS_PARENT_MANIFEST_PATH, "ms_parent_manifest" + ), + "planner_r5": _verify_expected(PLANNER_PATH, "planner_r5"), + "composite_r5": _verify_expected(COMPOSITE_PATH, "composite_r5"), + "executor_r5": _verify_expected(EXECUTOR_PATH, "executor_r5"), + "planner_r5_certificate": _verify_expected( + PLANNER_CERTIFICATE_PATH, "planner_r5_certificate" + ), + "static_r7_authority": _verify_expected(STATIC_AUTHORITY_PATH, "static_r7_authority"), + "static_r7_receipt": _verify_expected(STATIC_RECEIPT_PATH, "static_r7_receipt"), + "static_r7_summary": _verify_expected(STATIC_SUMMARY_PATH, "static_r7_summary"), + } + _require(bindings == dict(EXPECTED_SHA256), "authority key set changed") + return dict(bindings) + + +def _load_sequence_module() -> ModuleType: + return _load_bound_module( + SEQ_RUNTIME_PATH, + EXPECTED_SHA256["sequence_runtime"], + name="sequence_topology_r3", + ) + + +def _load_ms_module() -> ModuleType: + return _load_bound_module(MS_RUNTIME_PATH, EXPECTED_SHA256["ms_runtime"], name="ms_v3") + + +def _load_r5_executor_stack_once() -> ModuleType: + """Load the exact R5 stack under cross-process-stable hash names. + + Frozen R5 predecessors used ``id(source)`` only to name dynamically loaded + modules. A private recursive ``exec`` wrapper injects a deterministic + bytes-only ``id`` into each module namespace during bootstrap, then removes + it before returning. Global builtins are never mutated and runtime + parameter identity continues to use the real builtin. + """ + + source = _read_regular_nofollow(EXECUTOR_PATH, label="executor_r5") + expected = EXPECTED_SHA256["executor_r5"] + _require(_sha256(source) == expected, "executor_r5 source hash changed") + module_name = f"_review_a5_adapter_r2_r5_executor_{expected}" + existing = sys.modules.get(module_name) + if existing is not None: + _require( + getattr(existing, "__adapter_r2_source_sha256__", None) == expected, + "stable R5 executor module name is occupied by different bytes", + ) + return existing + def stable_source_id(value: object) -> int: + if type(value) is bytes: + return int(_sha256(value)[:15], 16) + return builtins.id(value) + + def stable_nested_exec( + code: object, + globals_mapping: dict[str, Any], + locals_mapping: dict[str, Any] | None = None, + ) -> object: + _require(type(globals_mapping) is dict, "R5 nested globals mapping changed") + _require( + "id" not in globals_mapping and "exec" not in globals_mapping, + "R5 nested source unexpectedly defines id/exec", + ) + globals_mapping["id"] = stable_source_id + globals_mapping["exec"] = stable_nested_exec + try: + return builtins.exec( + code, + globals_mapping, + globals_mapping if locals_mapping is None else locals_mapping, + ) + finally: + globals_mapping.pop("exec", None) + globals_mapping.pop("id", None) + + module = ModuleType(module_name) + module.__file__ = os.fspath(EXECUTOR_PATH) + module.__package__ = "" + module.__adapter_r2_source_sha256__ = expected + sys.modules[module_name] = module + try: + stable_nested_exec( + compile(source, os.fspath(EXECUTOR_PATH), "exec"), module.__dict__ + ) + except BaseException: + sys.modules.pop(module_name, None) + raise + _require( + "id" not in module.__dict__ and "exec" not in module.__dict__, + "R5 bootstrap helper leaked into runtime globals", + ) + return module + + +R5_EXECUTOR_MODULE = _load_r5_executor_stack_once() +_executor = R5_EXECUTOR_MODULE +_planner = R5_EXECUTOR_MODULE._planner +NativeEightCompositeR5 = R5_EXECUTOR_MODULE.NativeEightCompositeR5 +NativeEightConfig = R5_EXECUTOR_MODULE.NativeEightConfig +NativeEightOutput = R5_EXECUTOR_MODULE.NativeEightOutput +FrozenEpochPlan = R5_EXECUTOR_MODULE.FrozenEpochPlan +PlannedMicrobatch = R5_EXECUTOR_MODULE.PlannedMicrobatch +DevelopmentBatch = R5_EXECUTOR_MODULE.DevelopmentBatch +DevelopmentResult = R5_EXECUTOR_MODULE.DevelopmentResult +FixedDevelopmentContract = R5_EXECUTOR_MODULE.FixedDevelopmentContract +AdamWContract = R5_EXECUTOR_MODULE.AdamWContract +StepDiagnostic = R5_EXECUTOR_MODULE.StepDiagnostic +NativeEightProductionExecutor = R5_EXECUTOR_MODULE.NativeEightProductionExecutor + + +@dataclass(frozen=True, slots=True) +class JoinedParent: + split: str + split_index: int + sequence_row: int + parent_id: str + canonical_wurcs: str + canonical_wurcs_sha256: str + role: str + topology_available: bool + topology_row: int + topology_residue_count: int + ms_available: bool + ms_parent_index: int + ms_row_start: int + ms_row_count: int + ms_total_target_token_count: int + static_available: bool + static_state_count: int + static_state_ids: tuple[str, ...] + static_effective_wurcs_sha256: tuple[str, ...] + static_parent_wurcs_relation: str + availability_bits: str + + @property + def planner_row(self) -> Mapping[str, Any]: + return { + "parent_id": self.parent_id, + "availability": { + "sequence": True, + "topology": self.topology_available, + "ms": self.ms_available, + "static": self.static_available, + }, + } + +MANIFEST_FIELDS = ( + "manifest_schema", + "split", + "split_index", + "sequence_row", + "parent_glycorpus_id", + "canonical_wurcs", + "canonical_wurcs_sha256", + "role", + "sequence_objective_eligible", + "topology_available", + "topology_row", + "topology_residue_count", + "ms_available", + "ms_parent_index", + "ms_row_start", + "ms_row_count", + "ms_total_target_token_count", + "static_r7_available", + "static_state_count", + "static_state_ids_json", + "static_effective_wurcs_sha256_json", + "static_parent_wurcs_relation", + "availability_bits", +) + + +def _parse_bool(value: str, *, label: str) -> bool: + _require(value in {"true", "false"}, f"{label} is not an exact boolean") + return value == "true" + + +def _availability_bits(topology: bool, ms: bool, static: bool) -> str: + return f"{int(topology)}{int(ms)}{int(static)}" + + +def _manifest_row(parent: JoinedParent) -> dict[str, str]: + return { + "manifest_schema": MANIFEST_SCHEMA, + "split": parent.split, + "split_index": str(parent.split_index), + "sequence_row": str(parent.sequence_row), + "parent_glycorpus_id": parent.parent_id, + "canonical_wurcs": parent.canonical_wurcs, + "canonical_wurcs_sha256": parent.canonical_wurcs_sha256, + "role": parent.role, + "sequence_objective_eligible": "true", + "topology_available": str(parent.topology_available).lower(), + "topology_row": str(parent.topology_row), + "topology_residue_count": str(parent.topology_residue_count), + "ms_available": str(parent.ms_available).lower(), + "ms_parent_index": str(parent.ms_parent_index), + "ms_row_start": str(parent.ms_row_start), + "ms_row_count": str(parent.ms_row_count), + "ms_total_target_token_count": str(parent.ms_total_target_token_count), + "static_r7_available": str(parent.static_available).lower(), + "static_state_count": str(parent.static_state_count), + "static_state_ids_json": json.dumps(parent.static_state_ids, separators=(",", ":")), + "static_effective_wurcs_sha256_json": json.dumps( + parent.static_effective_wurcs_sha256, separators=(",", ":") + ), + "static_parent_wurcs_relation": parent.static_parent_wurcs_relation, + "availability_bits": parent.availability_bits, + } + + +def _joined_from_manifest_row(row: Mapping[str, str], *, expected_index: int, split: str) -> JoinedParent: + _require(set(row) == set(MANIFEST_FIELDS), "joined manifest fields changed") + _require(row["manifest_schema"] == MANIFEST_SCHEMA, "joined manifest schema changed") + _require(row["split"] == split and int(row["split_index"]) == expected_index, "joined split/order changed") + _require(row["sequence_objective_eligible"] == "true", "ineligible sequence row entered joined manifest") + parent = JoinedParent( + split=split, + split_index=expected_index, + sequence_row=int(row["sequence_row"]), + parent_id=row["parent_glycorpus_id"], + canonical_wurcs=row["canonical_wurcs"], + canonical_wurcs_sha256=row["canonical_wurcs_sha256"], + role=row["role"], + topology_available=_parse_bool(row["topology_available"], label="topology availability"), + topology_row=int(row["topology_row"]), + topology_residue_count=int(row["topology_residue_count"]), + ms_available=_parse_bool(row["ms_available"], label="MS availability"), + ms_parent_index=int(row["ms_parent_index"]), + ms_row_start=int(row["ms_row_start"]), + ms_row_count=int(row["ms_row_count"]), + ms_total_target_token_count=int(row["ms_total_target_token_count"]), + static_available=_parse_bool(row["static_r7_available"], label="static availability"), + static_state_count=int(row["static_state_count"]), + static_state_ids=tuple(json.loads(row["static_state_ids_json"])), + static_effective_wurcs_sha256=tuple( + json.loads(row["static_effective_wurcs_sha256_json"]) + ), + static_parent_wurcs_relation=row["static_parent_wurcs_relation"], + availability_bits=row["availability_bits"], + ) + _require(parent.parent_id and parent.canonical_wurcs and parent.role, "joined identity field is blank") + _require(_sha256(parent.canonical_wurcs.encode("utf-8")) == parent.canonical_wurcs_sha256, "joined WURCS hash changed") + _require(parent.role == (TRAIN_ROLE if split == "train" else DEVELOPMENT_ROLE), "joined role changed") + _require(parent.topology_available == (parent.topology_row >= 0), "topology row/availability mismatch") + _require(parent.ms_available == (parent.ms_parent_index >= 0), "MS row/availability mismatch") + _require(parent.ms_available == (parent.ms_row_count > 0), "MS count/availability mismatch") + _require(parent.static_available == (parent.static_state_count > 0), "static count/availability mismatch") + _require(parent.static_state_count == len(parent.static_state_ids) == len(parent.static_effective_wurcs_sha256), "static state identity count mismatch") + _require(parent.availability_bits == _availability_bits(parent.topology_available, parent.ms_available, parent.static_available), "availability bits changed") + return parent + + +def _sequence_store() -> Any: + module = _load_sequence_module() + return module.OfficialRaggedSequenceTopologyStore( + SEQ_PACKAGE, + TOPOLOGY_PACKAGE, + SEQ_NULL_PACKAGE, + TOPOLOGY_NULL_PACKAGE, + ) + + +def _ms_runtime() -> Any: + module = _load_ms_module() + return module.ReviewMSAcquisitionTop30RuntimeV3(package_directory=MS_PACKAGE) + + +@dataclass(frozen=True, slots=True) +class _StaticState: + authority_index: int + state_id: str + parent_id: str + role: str + effective_wurcs: str + effective_wurcs_sha256: str + graph_fingerprint_sha256: str + + +def _static_states_by_parent() -> Mapping[str, tuple[_StaticState, ...]]: + payload = _read_regular_nofollow(STATIC_AUTHORITY_PATH, label="static R7 authority") + _require(_sha256(payload) == EXPECTED_SHA256["static_r7_authority"], "static R7 authority changed") + grouped: dict[str, list[_StaticState]] = {} + with gzip.GzipFile(fileobj=io.BytesIO(payload), mode="rb") as compressed: + with io.TextIOWrapper(compressed, encoding="utf-8", newline="") as text_handle: + for expected_index, row in enumerate(csv.DictReader(text_handle, delimiter="\t")): + _require(int(row["authority_index"]) == expected_index, "static authority order changed") + role = row["review_r7_static_partition"] + fingerprint = row["review_r7_graph_fingerprint_sha256"] + if role not in {TRAIN_ROLE, DEVELOPMENT_ROLE} or not fingerprint: + continue + wurcs = row["effective_wurcs"] + _require( + _sha256(wurcs.encode("utf-8")) == row["effective_wurcs_sha256"], + "static state WURCS hash changed", + ) + state = _StaticState( + authority_index=expected_index, + state_id=row["canonical_structure_state_id"], + parent_id=row["parent_glycorpus_id"], + role=role, + effective_wurcs=wurcs, + effective_wurcs_sha256=row["effective_wurcs_sha256"], + graph_fingerprint_sha256=fingerprint, + ) + grouped.setdefault(state.parent_id, []).append(state) + frozen: dict[str, tuple[_StaticState, ...]] = {} + for parent_id, values in grouped.items(): + ordered = tuple(sorted(values, key=lambda item: (item.authority_index, item.state_id))) + _require(len(ordered) in {1, 2}, "static parent state count is outside R7 contract") + _require(len({item.state_id for item in ordered}) == len(ordered), "static state repeats") + _require(len({item.role for item in ordered}) == 1, "static siblings cross roles") + frozen[parent_id] = ordered + _require(len(frozen) == 28_370 and sum(map(len, frozen.values())) == 42_372, "static R7 active roster changed") + return MappingProxyType(frozen) + + +def _static_parent_relation(parent_wurcs: str, states: Sequence[_StaticState]) -> str: + if len(states) == 1: + _require(states[0].effective_wurcs == parent_wurcs, "single static state differs from parent WURCS") + _require(states[0].state_id.endswith("__state_single"), "single static state ID changed") + return "exact_parent_wurcs_single_state" + _require(len(states) == 2, "static state relation has unsupported cardinality") + by_suffix: dict[str, _StaticState] = {} + for state in states: + if state.state_id.endswith("__state_alpha"): + by_suffix["a"] = state + elif state.state_id.endswith("__state_beta"): + by_suffix["b"] = state + _require(set(by_suffix) == {"a", "b"}, "two-state static parent is not alpha/beta") + expected: dict[str, str] = {} + for symbol in ("a", "b"): + replacement, count = re.subn(r"(-\d+)x(_)", rf"\1{symbol}\2", parent_wurcs, count=1) + if count == 1: + expected[symbol] = replacement + if set(expected) == {"a", "b"}: + _require( + by_suffix["a"].effective_wurcs == expected["a"] + and by_suffix["b"].effective_wurcs == expected["b"], + "static alpha/beta effective WURCS does not derive from parent unknown anomer", + ) + return "parent_unknown_x_anomer_to_declared_alpha_beta_states" + # R7 also certifies open/unspecified monosaccharide skeletons (the WURCS + # `u...` form) into explicit cyclic alpha/beta structure states. That is + # not a byte substitution, so preserve the authority's effective WURCS + # identities instead of pretending the parent and state strings are equal. + _require("/[u" in parent_wurcs or ",u" in parent_wurcs, "two-state parent is neither x-anomer nor open/unspecified") + _require( + re.search(r"-\d+a_", by_suffix["a"].effective_wurcs) is not None + and re.search(r"-\d+b_", by_suffix["b"].effective_wurcs) is not None, + "open/unspecified parent did not resolve to explicit alpha/beta states", + ) + return "parent_open_unspecified_to_declared_alpha_beta_states" + + +def _ms_parent_identities() -> dict[str, dict[str, Any]]: + payload = _read_regular_nofollow(MS_PARENT_MANIFEST_PATH, label="MS parent manifest") + _require( + _sha256(payload) == EXPECTED_SHA256["ms_parent_manifest"], + "MS parent manifest changed", + ) + expected_fields = ( + "parent_index", + "role", + "parent_glycorpus_id", + "canonical_wurcs", + "row_start", + "row_count", + "total_target_token_count", + ) + result: dict[str, dict[str, Any]] = {} + next_row_start = 0 + with gzip.GzipFile(fileobj=io.BytesIO(payload), mode="rb") as compressed: + with io.TextIOWrapper(compressed, encoding="utf-8", newline="") as text_handle: + reader = csv.DictReader(text_handle, delimiter="\t") + _require(tuple(reader.fieldnames or ()) == expected_fields, "MS parent fields changed") + for expected_index, row in enumerate(reader): + _require(int(row["parent_index"]) == expected_index, "MS parent order changed") + parent_id = row["parent_glycorpus_id"] + _require(parent_id and parent_id not in result, "MS parent repeats or is blank") + role = row["role"] + _require(role in {TRAIN_ROLE, DEVELOPMENT_ROLE}, "MS parent role changed") + row_start = int(row["row_start"]) + row_count = int(row["row_count"]) + token_count = int(row["total_target_token_count"]) + _require( + row_start == next_row_start and row_count > 0 and token_count > 0, + "MS parent row span changed", + ) + next_row_start += row_count + result[parent_id] = { + "parent_index": expected_index, + "role": role, + "canonical_wurcs": row["canonical_wurcs"], + "row_start": row_start, + "row_count": row_count, + "total_target_token_count": token_count, + } + _require( + len(result) == 3_035 + and next_row_start == 225_056 + and sum(value["role"] == TRAIN_ROLE for value in result.values()) == 2_455 + and sum(value["role"] == DEVELOPMENT_ROLE for value in result.values()) == 580, + "MS parent population changed", + ) + return result + + +def _write_manifest_exclusive(path: Path, rows: Iterable[JoinedParent]) -> dict[str, Any]: + _require(not path.exists() and not path.is_symlink(), f"refusing to overwrite {path.name}") + count = 0 + row_identity = hashlib.sha256() + with path.open("xb") as raw: + with gzip.GzipFile(filename="", fileobj=raw, mode="wb", mtime=0) as compressed: + with io.TextIOWrapper(compressed, encoding="utf-8", newline="") as text_handle: + writer = csv.DictWriter( + text_handle, + fieldnames=MANIFEST_FIELDS, + delimiter="\t", + lineterminator="\n", + extrasaction="raise", + ) + writer.writeheader() + for parent in rows: + encoded = _manifest_row(parent) + writer.writerow(encoded) + row_identity.update( + _canonical_bytes({field: encoded[field] for field in MANIFEST_FIELDS}) + ) + count += 1 + raw.flush() + os.fsync(raw.fileno()) + receipt = _file_receipt(path, label=path.name) + return {**receipt, "rows": count, "canonical_row_surface_sha256": row_identity.hexdigest()} + + +def _write_json_exclusive(path: Path, value: Mapping[str, Any]) -> dict[str, Any]: + _require(not path.exists() and not path.is_symlink(), f"refusing to overwrite {path.name}") + payload = json.dumps(value, indent=2, sort_keys=True, allow_nan=False).encode("utf-8") + b"\n" + with path.open("xb") as handle: + handle.write(payload) + handle.flush() + os.fsync(handle.fileno()) + return {"name": path.name, "bytes": len(payload), "sha256": _sha256(payload)} + + +def build_joined_manifests() -> Mapping[str, Any]: + """Build immutable review-prefixed train/dev joins; never overwrite bytes.""" + + authority_bindings = dict(verify_authorities()) + JOINED_ROOT.mkdir(parents=True, exist_ok=True) + for path in (TRAIN_MANIFEST_PATH, DEVELOPMENT_MANIFEST_PATH, ADAPTER_RECEIPT_PATH): + _require(not path.exists() and not path.is_symlink(), f"joined artifact already exists: {path.name}") + + store = _sequence_store() + ms = _ms_runtime() + static = _static_states_by_parent() + try: + ms_by_parent = ms.parent_by_id + _require(len(ms_by_parent) == 3_035, "MS parent roster changed") + seq_parent_ids = {record.parent_id for record in store.records} + _require(len(seq_parent_ids) == 281_208, "sequence parent roster changed") + _require(set(ms_by_parent).issubset(seq_parent_ids), "MS parent is absent from sequence roster") + _require(set(static).issubset(seq_parent_ids), "static parent is absent from sequence roster") + + pattern_counts = { + "train": {format(bits, "03b"): 0 for bits in range(8)}, + "development": {format(bits, "03b"): 0 for bits in range(8)}, + } + relation_counts: dict[str, int] = {} + split_roster_hashes: dict[str, str] = {} + + def joined_rows(split: str) -> Iterator[JoinedParent]: + role = TRAIN_ROLE if split == "train" else DEVELOPMENT_ROLE + roster_hash = hashlib.sha256() + for split_index, sample in enumerate(store.iter_sequence_objective_samples(split)): + sequence_row = int(sample["sequence_row"]) + record = store.records[sequence_row] + _require(record.role == role and sample["parent_id"] == record.parent_id, "sequence role/parent join changed") + _require(sample["canonical_wurcs"] == record.canonical_wurcs, "sequence sample WURCS changed") + topology_available = record.topology_row >= 0 + ms_parent = ms_by_parent.get(record.parent_id) + if ms_parent is not None: + _require( + (ms_parent.role, ms_parent.canonical_wurcs) + == (record.role, record.canonical_wurcs), + "MS parent role/WURCS join changed", + ) + states = static.get(record.parent_id, ()) + if states: + _require(all(state.role == record.role for state in states), "static parent role join changed") + relation = _static_parent_relation(record.canonical_wurcs, states) + else: + relation = "not_available" + relation_counts[relation] = relation_counts.get(relation, 0) + 1 + bits = _availability_bits(topology_available, ms_parent is not None, bool(states)) + pattern_counts[split][bits] += 1 + parent = JoinedParent( + split=split, + split_index=split_index, + sequence_row=sequence_row, + parent_id=record.parent_id, + canonical_wurcs=record.canonical_wurcs, + canonical_wurcs_sha256=_sha256(record.canonical_wurcs.encode("utf-8")), + role=record.role, + topology_available=topology_available, + topology_row=record.topology_row, + topology_residue_count=record.topology_residue_count, + ms_available=ms_parent is not None, + ms_parent_index=-1 if ms_parent is None else ms_parent.parent_index, + ms_row_start=-1 if ms_parent is None else ms_parent.row_start, + ms_row_count=0 if ms_parent is None else ms_parent.row_count, + ms_total_target_token_count=( + 0 if ms_parent is None else ms_parent.total_target_token_count + ), + static_available=bool(states), + static_state_count=len(states), + static_state_ids=tuple(state.state_id for state in states), + static_effective_wurcs_sha256=tuple( + state.effective_wurcs_sha256 for state in states + ), + static_parent_wurcs_relation=relation, + availability_bits=bits, + ) + roster_hash.update( + _canonical_bytes( + { + "split_index": split_index, + "sequence_row": sequence_row, + "parent_id": record.parent_id, + "role": record.role, + "canonical_wurcs_sha256": parent.canonical_wurcs_sha256, + "availability_bits": bits, + } + ) + ) + yield parent + split_roster_hashes[split] = roster_hash.hexdigest() + + train_receipt = _write_manifest_exclusive(TRAIN_MANIFEST_PATH, joined_rows("train")) + development_receipt = _write_manifest_exclusive( + DEVELOPMENT_MANIFEST_PATH, joined_rows("development") + ) + _require(train_receipt["rows"] == 221_827, "joined train row count changed") + _require(development_receipt["rows"] == 55_440, "joined development row count changed") + _require(pattern_counts["train"] == TRAIN_PATTERN_COUNTS, "joined train pattern counts changed") + _require( + pattern_counts["development"] == DEVELOPMENT_PATTERN_COUNTS, + "joined development pattern counts changed", + ) + _require( + relation_counts.get("parent_unknown_x_anomer_to_declared_alpha_beta_states") == 5_051 + and relation_counts.get("parent_open_unspecified_to_declared_alpha_beta_states") == 8_951 + and relation_counts.get("exact_parent_wurcs_single_state") == 14_368, + "static parent/state WURCS relation counts changed", + ) + runtime_source = _file_receipt(Path(__file__).absolute(), label="data adapter source") + receipt: dict[str, Any] = { + "schema": RECEIPT_SCHEMA, + "status": "PASS_IMMUTABLE_JOIN_PREPARATION_ONLY_STATIC_TOKENS_ABSENT", + "runtime_source": runtime_source, + "authority_bindings": authority_bindings, + "artifacts": { + "train_manifest": train_receipt, + "development_manifest": development_receipt, + }, + "counts": { + "train_sequence_parents": 221_827, + "development_sequence_parents": 55_440, + "ms_train_parents": 2_455, + "ms_development_parents": 580, + "ms_development_acquisitions": 49_573, + "topology_train_parents": 71_914, + "topology_development_parents": 17_650, + "static_train_parents": 22_980, + "static_development_parents": 5_390, + "static_train_states": 34_408, + "static_development_states": 7_964, + "static_unknown_x_anomer_two_state_parents": 5_051, + "static_open_unspecified_two_state_parents": 8_951, + "static_exact_single_state_parents": 14_368, + }, + "availability_pattern_counts": pattern_counts, + "split_roster_sha256": split_roster_hashes, + "join_contract": { + "sequence_topology": "authoritative_sequence_row_parent_role_and_topology_row", + "ms": "exact_parent_id_role_and_canonical_wurcs", + "static": ( + "exact_parent_id_and_role; preserve parent canonical WURCS plus every R7 " + "state effective WURCS; x-anomer or open/unspecified parent identities expand " + "only through the R7-declared alpha/beta states" + ), + "official_or_submitted_artifacts_modified": False, + }, + "static_final_token_package_bound": False, + "static_active_production_materialization_authorized": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "gpu_launch_authorized": False, + "nova_submission_authorized": False, + "execution_certified": False, + } + _write_json_exclusive(ADAPTER_RECEIPT_PATH, receipt) + return MappingProxyType(receipt) + finally: + ms.close() + + +def _read_receipt_and_manifests() -> tuple[Mapping[str, Any], tuple[JoinedParent, ...], tuple[JoinedParent, ...]]: + receipt_payload = _read_regular_nofollow( + R1_ADAPTER_RECEIPT_PATH, label="adapter r1 receipt" + ) + _require( + _sha256(receipt_payload) == EXPECTED_SHA256["adapter_r1_receipt"], + "adapter r1 receipt changed", + ) + receipt = json.loads(receipt_payload) + _require( + receipt.get("schema") + == "bertose_a5_native_eight_data_adapter_receipt_20260721_r1", + "adapter r1 receipt schema changed", + ) + _require( + receipt.get("status") == "PASS_IMMUTABLE_JOIN_PREPARATION_ONLY_STATIC_TOKENS_ABSENT", + "adapter receipt status changed", + ) + for flag in ( + "training_authorized", + "scientific_launch_authorized", + "gpu_launch_authorized", + "nova_submission_authorized", + "execution_certified", + "static_final_token_package_bound", + "static_active_production_materialization_authorized", + ): + _require(receipt.get(flag) is False, f"adapter r1 receipt flag changed: {flag}") + r1_authorities = dict(receipt["authority_bindings"]) + _require( + r1_authorities + and all(EXPECTED_SHA256.get(key) == value for key, value in r1_authorities.items()), + "adapter r1 authority bindings changed", + ) + _require( + receipt.get("artifacts") == dict(EXPECTED_R1_ARTIFACTS), + "adapter r1 manifest declarations changed", + ) + + def load_manifest(path: Path, split: str) -> tuple[JoinedParent, ...]: + declared = receipt["artifacts"][f"{split}_manifest"] + observed = _file_receipt(path, label=f"joined {split} manifest") + for key in ("name", "bytes", "sha256"): + _require(declared.get(key) == observed[key], f"joined {split} manifest {key} changed") + payload = _read_regular_nofollow(path, label=f"joined {split} manifest") + result: list[JoinedParent] = [] + row_identity = hashlib.sha256() + with gzip.GzipFile(fileobj=io.BytesIO(payload), mode="rb") as compressed: + with io.TextIOWrapper(compressed, encoding="utf-8", newline="") as text_handle: + for expected_index, row in enumerate(csv.DictReader(text_handle, delimiter="\t")): + parent = _joined_from_manifest_row(row, expected_index=expected_index, split=split) + result.append(parent) + row_identity.update( + _canonical_bytes({field: row[field] for field in MANIFEST_FIELDS}) + ) + _require(len(result) == declared["rows"], f"joined {split} row count changed") + _require( + row_identity.hexdigest() == declared["canonical_row_surface_sha256"], + f"joined {split} row surface changed", + ) + _require(len({row.parent_id for row in result}) == len(result), f"joined {split} parent repeats") + _require(len({row.sequence_row for row in result}) == len(result), f"joined {split} sequence row repeats") + return tuple(result) + + train = load_manifest(TRAIN_MANIFEST_PATH, "train") + development = load_manifest(DEVELOPMENT_MANIFEST_PATH, "development") + _require(len(train) == 221_827 and len(development) == 55_440, "joined split counts changed") + observed_patterns = { + "train": {bits: sum(row.availability_bits == bits for row in train) for bits in TRAIN_PATTERN_COUNTS}, + "development": { + bits: sum(row.availability_bits == bits for row in development) + for bits in DEVELOPMENT_PATTERN_COUNTS + }, + } + _require(observed_patterns["train"] == TRAIN_PATTERN_COUNTS, "loaded train pattern counts changed") + _require( + observed_patterns["development"] == DEVELOPMENT_PATTERN_COUNTS, + "loaded development pattern counts changed", + ) + return dict(receipt), train, development + + +def _read_r2_receipt() -> dict[str, Any]: + payload = _read_regular_nofollow(ADAPTER_RECEIPT_PATH, label="adapter r2 receipt") + try: + receipt = json.loads(payload.decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightDataAdapterError("adapter r2 receipt is not canonical JSON") from error + _require(type(receipt) is dict, "adapter r2 receipt root changed") + _require(_canonical_bytes(receipt) == payload, "adapter r2 receipt is not canonical JSON") + _require(receipt.get("schema") == RECEIPT_SCHEMA, "adapter r2 receipt schema changed") + _require( + receipt.get("status") + == "PASS_PREPARATION_ONLY_STATIC_FINAL_TOKENS_ABSENT_LAUNCH_CLOSED", + "adapter r2 receipt status changed", + ) + for flag in ( + "training_authorized", + "scientific_launch_authorized", + "gpu_launch_authorized", + "nova_submission_authorized", + "execution_certified", + ): + _require(receipt.get(flag) is False, f"adapter r2 receipt flag changed: {flag}") + _require( + receipt.get("runtime_source") + == _file_receipt(Path(__file__).absolute(), label="adapter r2 source"), + "adapter r2 receipt does not bind the loaded source", + ) + _require( + receipt.get("reused_r1_artifacts") == dict(EXPECTED_R1_ARTIFACTS), + "adapter r2 receipt r1 artifact bindings changed", + ) + _require( + receipt.get("authority_bindings") == dict(EXPECTED_SHA256), + "adapter r2 receipt authority bindings changed", + ) + _require( + receipt.get("official_or_submitted_artifacts_modified") is False, + "adapter r2 receipt claims an official artifact mutation", + ) + return receipt + + +class NativeEightDataAdapter: + """Exact frozen parent roster -> R5 model-input adapter. + + Construction loads only the sequence/topology store. The MS runtime is + lazy and is never constructed for MS-disabled cells. No static loader + exists because R7 has no final trainable token package. + """ + + training_authorized = False + scientific_launch_authorized = False + gpu_launch_authorized = False + nova_submission_authorized = False + execution_certified = False + + def __init__(self) -> None: + self._authority_bindings = dict(verify_authorities()) + self.release_receipt = _read_r2_receipt() + self.receipt, self.train_rows, self.development_rows = _read_receipt_and_manifests() + self.train_by_parent = MappingProxyType({row.parent_id: row for row in self.train_rows}) + self.development_by_parent = MappingProxyType( + {row.parent_id: row for row in self.development_rows} + ) + self._train_planner_rows = tuple(row.planner_row for row in self.train_rows) + self._store = _sequence_store() + self._sequence_module = _load_sequence_module() + self._train_masker = self._sequence_module.EpochVaryingSequenceMasker( + self._store, split="train", seed=COMMON_SEED, epoch=0 + ) + self._development_masker = self._sequence_module.EpochVaryingSequenceMasker( + self._store, split="development", seed=COMMON_SEED, epoch=0 + ) + self._ms: Any | None = None + self._ms_epoch = -1 + self._ms_epoch_plan: tuple[Any, ...] = () + self._ms_epoch_by_parent: Mapping[str, Any] = MappingProxyType({}) + self._restored_cursor: Mapping[str, Any] | None = None + self._verify_store_against_joined_rows() + self._verify_all_modality_joins() + self._contract_sha256_cached = _canonical_sha256( + self.contract_payload(), + domain="bertose-a5-native-eight-data-adapter-contract-r6", + ) + + @property + def ms_runtime_loaded(self) -> bool: + return self._ms is not None + + def close(self) -> None: + if self._ms is not None: + self._ms.close() + self._ms = None + self._ms_epoch = -1 + self._ms_epoch_plan = () + self._ms_epoch_by_parent = MappingProxyType({}) + + def __enter__(self) -> "NativeEightDataAdapter": + return self + + def __exit__(self, exc_type: object, exc: object, traceback: object) -> None: + self.close() + + def _verify_store_against_joined_rows(self) -> None: + all_rows = self.train_rows + self.development_rows + for joined in all_rows: + record = self._store.records[joined.sequence_row] + _require( + (record.parent_id, record.role, record.canonical_wurcs) + == (joined.parent_id, joined.role, joined.canonical_wurcs), + "live sequence store differs from joined identity", + ) + _require(record.topology_row == joined.topology_row, "live topology row differs from join") + _require( + bool(self._store.objective[joined.sequence_row]), + "joined sequence row is no longer objective-eligible", + ) + + def _verify_all_modality_joins(self) -> None: + """Reconstruct every role/identity join without loading disabled tensors.""" + + joined_rows = self.train_rows + self.development_rows + joined_by_parent = {row.parent_id: row for row in joined_rows} + _require( + len(joined_by_parent) == len(joined_rows) == 277_267, + "joined parent identity population changed", + ) + ms_parents = _ms_parent_identities() + static_parents = _static_states_by_parent() + _require( + set(ms_parents) + == {row.parent_id for row in joined_rows if row.ms_available}, + "MS availability differs from joined roster", + ) + _require( + set(static_parents) + == {row.parent_id for row in joined_rows if row.static_available}, + "static availability differs from joined roster", + ) + for joined in joined_rows: + _require( + joined.topology_available + == (joined.topology_row >= 0 and joined.topology_residue_count > 0), + "topology identity/count differs from joined roster", + ) + if not joined.topology_available: + _require( + joined.topology_row == -1 and joined.topology_residue_count == 0, + "absent topology carries a sentinel payload", + ) + ms_parent = ms_parents.get(joined.parent_id) + if ms_parent is None: + _require( + not joined.ms_available + and joined.ms_parent_index == -1 + and joined.ms_row_start == -1 + and joined.ms_row_count == 0 + and joined.ms_total_target_token_count == 0, + "absent MS parent carries a payload", + ) + else: + _require( + joined.ms_available + and ( + joined.ms_parent_index, + joined.role, + joined.canonical_wurcs, + joined.ms_row_start, + joined.ms_row_count, + joined.ms_total_target_token_count, + ) + == ( + ms_parent["parent_index"], + ms_parent["role"], + ms_parent["canonical_wurcs"], + ms_parent["row_start"], + ms_parent["row_count"], + ms_parent["total_target_token_count"], + ), + "MS role/WURCS/span differs from joined roster", + ) + states = static_parents.get(joined.parent_id, ()) + if not states: + _require( + not joined.static_available + and joined.static_state_count == 0 + and not joined.static_state_ids + and not joined.static_effective_wurcs_sha256 + and joined.static_parent_wurcs_relation == "not_available", + "absent static parent carries a payload", + ) + else: + _require( + joined.static_available + and all(state.role == joined.role for state in states) + and joined.static_state_count == len(states) + and joined.static_state_ids + == tuple(state.state_id for state in states) + and joined.static_effective_wurcs_sha256 + == tuple(state.effective_wurcs_sha256 for state in states) + and joined.static_parent_wurcs_relation + == _static_parent_relation(joined.canonical_wurcs, states), + "static role/state/WURCS differs from joined roster", + ) + + def verify_authorities(self) -> Mapping[str, str]: + observed = dict(verify_authorities()) + _require(observed == self._authority_bindings, "live adapter authority changed") + _require(_read_r2_receipt() == self.release_receipt, "adapter r2 receipt changed") + self._store.verify_live_bindings() + current_receipt, current_train, current_development = _read_receipt_and_manifests() + _require(dict(current_receipt) == dict(self.receipt), "joined adapter receipt changed") + _require(current_train == self.train_rows, "joined train rows changed") + _require(current_development == self.development_rows, "joined development rows changed") + return dict(observed) + + def contract_payload(self) -> dict[str, Any]: + observed = dict(verify_authorities()) + _require(observed == self._authority_bindings, "live adapter authority changed") + source_receipt = _file_receipt(Path(__file__).absolute(), label="adapter r2 source") + receipt_receipt = _file_receipt(ADAPTER_RECEIPT_PATH, label="adapter r2 receipt") + current_release = _read_r2_receipt() + _require(current_release == self.release_receipt, "adapter r2 receipt changed") + payload = { + "schema": SCHEMA, + "status": "PREPARATION_ONLY_STATIC_FINAL_TOKENS_ABSENT_LAUNCH_CLOSED", + "cells": list(CELL_ORDER), + "common_seed": COMMON_SEED, + "world_size": 1, + "train_parent_count": len(self.train_rows), + "development_parent_count": len(self.development_rows), + "source_sha256": source_receipt["sha256"], + "receipt_sha256": receipt_receipt["sha256"], + "authority_set_sha256": _canonical_sha256( + observed, + domain="bertose-a5-native-eight-data-adapter-authorities-r6", + ), + "train_manifest_sha256": self.receipt["artifacts"]["train_manifest"]["sha256"], + "development_manifest_sha256": self.receipt["artifacts"]["development_manifest"]["sha256"], + "train_roster_sha256": self.receipt["split_roster_sha256"]["train"], + "development_roster_sha256": self.receipt["split_roster_sha256"]["development"], + "processing_contract": { + "sequence": "final R3 BPE/residue/tree-depth/linkage arrays; seed43 epoch masks", + "topology": "final R3 exact ragged BFS labels; inverse-BPE reducer lives in composite", + "ms": ( + "final V3 raw-derived TOP30 acquisition targets; one deterministic acquisition " + "per train parent/epoch; pair mask; all acquisitions at fixed development" + ), + "static": ( + "R7 GLYCAM graph/state identity and availability only; EGNN/RVQ trainable token " + "package absent; static-active production fails" + ), + }, + "disabled_branch_contract": "no_loader_no_mask_rng_no_payload", + "development_nesting": { + "topology": "once_per_eligible_parent_pre_fusion", + "ms": "acquisition_then_equal_mean_within_parent", + "static": "slot_then_residue_then_state_then_parent", + "sequence_ms_active": "all_acquisition_views_then_equal_mean_within_parent", + "sequence_ms_absent": "one_no_ms_view", + "final": "equal_parent_mean", + }, + "static_final_token_package_bound": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "gpu_launch_authorized": False, + "nova_submission_authorized": False, + "execution_certified": False, + } + return payload + + @property + def contract_sha256(self) -> str: + return _canonical_sha256( + self.contract_payload(), + domain="bertose-a5-native-eight-data-adapter-contract-r6", + ) + + @staticmethod + def _cell_bits(cell_id: str) -> tuple[bool, bool, bool]: + _require(cell_id in CELL_BITS, f"unknown native-eight cell: {cell_id}") + return tuple(bool(value) for value in CELL_BITS[cell_id]) # type: ignore[return-value] + + @classmethod + def _require_materializable_cell(cls, cell_id: str) -> tuple[bool, bool, bool]: + topology, ms, static = cls._cell_bits(cell_id) + _require( + not static and STATIC_FINAL_TOKEN_PACKAGE_BOUND is False, + ( + f"{cell_id} requires static/EGNN-RVQ payloads, but R7 binds only graph/state " + "availability; static-active production is launch-closed" + ), + ) + return topology, ms, static + + def _ensure_ms(self) -> Any: + if self._ms is None: + self._ms = _ms_runtime() + _require(len(self._ms.parents) == 3_035, "MS parent roster changed at lazy load") + for parent in self._ms.parents: + joined = ( + self.train_by_parent.get(parent.parent_id) + if parent.role == TRAIN_ROLE + else self.development_by_parent.get(parent.parent_id) + ) + _require(joined is not None and joined.ms_available, "MS parent absent from joined roster") + _require( + (joined.role, joined.canonical_wurcs, joined.ms_parent_index) + == (parent.role, parent.canonical_wurcs, parent.parent_index), + "MS live parent differs from joined identity", + ) + return self._ms + + def _ensure_ms_epoch(self, epoch: int) -> tuple[Any, ...]: + runtime = self._ensure_ms() + if self._ms_epoch != epoch: + plan = tuple(runtime.epoch_plan(epoch=epoch, seed=COMMON_SEED)) + _require(len(plan) == 2_455, "MS epoch selection count changed") + by_parent = {item.parent_id: item for item in plan} + _require(len(by_parent) == len(plan), "MS epoch selection repeats a parent") + _require(set(by_parent) == {row.parent_id for row in self.train_rows if row.ms_available}, "MS epoch selection roster changed") + self._ms_epoch = epoch + self._ms_epoch_plan = plan + self._ms_epoch_by_parent = MappingProxyType(by_parent) + return self._ms_epoch_plan + + def build_epoch_plan(self, epoch: int) -> Any: + _require(type(epoch) is int and epoch >= 0, "epoch must be a nonnegative exact integer") + self.verify_authorities() + plan = _planner.build_balanced_epoch_plan( + self._train_planner_rows, + epoch=epoch, + seed=COMMON_SEED, + ) + _require(type(plan) is FrozenEpochPlan, "planner returned a non-R5 plan") + _require(plan.parent_count == len(self.train_rows), "epoch plan parent count changed") + for ordered_index, parent_id in zip(plan.ordered_parent_indices, plan.ordered_parent_ids): + _require(self.train_rows[ordered_index].parent_id == parent_id, "epoch plan row/parent join changed") + self._train_masker.set_epoch(epoch) + return plan + + @staticmethod + def _move_inputs(inputs: Mapping[str, Any], device: torch.device) -> Mapping[str, Any]: + moved: dict[str, Any] = {} + for key, value in inputs.items(): + moved[key] = value.to(device=device, non_blocking=False) if isinstance(value, torch.Tensor) else value + return MappingProxyType(moved) + + def _sequence_topology_inputs( + self, + joined_rows: Sequence[JoinedParent], + *, + topology_active: bool, + split: str, + ) -> tuple[dict[str, Any], tuple[str, ...]]: + masker = self._train_masker if split == "train" else self._development_masker + samples: list[dict[str, Any]] = [] + mask_identities: list[str] = [] + for joined in joined_rows: + if topology_active: + sample = self._store.sample(joined.sequence_row) + else: + # The R3 sequence masker requires a store-bound authoritative + # row and arrays, not a topology matrix. Building this exact + # sample directly avoids touching the ragged target payload in + # topology-disabled cells. + record = self._store.records[joined.sequence_row] + sample = { + "parent_id": record.parent_id, + "canonical_wurcs": record.canonical_wurcs, + "sequence_row": joined.sequence_row, + "role": record.role, + "seq_token_ids": self._store.token_ids[joined.sequence_row], + "seq_residue_ids": self._store.residue_ids[joined.sequence_row], + "seq_branch_depths": self._store.branch_depths[joined.sequence_row], + "seq_linkage_types": self._store.linkage_types[joined.sequence_row], + "seq_attention_mask": self._store.attention[joined.sequence_row], + "topology_labels": None, + "sequence_objective_eligible": bool( + self._store.objective[joined.sequence_row] + ), + } + _require(sample["parent_id"] == joined.parent_id, "sequence sample parent changed") + _require(sample["sequence_objective_eligible"] is True, "ineligible sequence sample entered adapter") + masked, labels, selected = masker.mask_sample(sample) + materialized = dict(sample) + materialized["seq_token_ids"] = masked + materialized["seq_labels"] = labels + samples.append(materialized) + mask_identities.append( + _canonical_sha256( + { + "parent_id": joined.parent_id, + "sequence_row": joined.sequence_row, + "selected_positions": np.flatnonzero(selected).tolist(), + "effective_epoch": masker.effective_epoch, + "seed": masker.seed, + "split": split, + }, + domain="bertose-a5-sequence-mask-identity-r1", + ) + ) + batch = self._sequence_module.collate_sequence_topology( + samples, include_topology=topology_active + ) + inputs: dict[str, Any] = { + "seq_token_ids": batch["seq_token_ids"], + "seq_attention_mask": batch["seq_attention_mask"].bool(), + "seq_residue_ids": batch["seq_residue_ids"], + "seq_branch_depths": batch["seq_branch_depths"], + "seq_linkage_types": batch["seq_linkage_types"], + "seq_labels": torch.as_tensor( + np.stack([sample["seq_labels"] for sample in samples]), dtype=torch.long + ), + } + if topology_active: + inputs["topology_labels"] = batch["topology_labels"] + inputs["topology_available"] = torch.tensor( + [row.topology_available for row in joined_rows], dtype=torch.bool + ) + return inputs, tuple(mask_identities) + + @staticmethod + def _pad_ms_masks(masked_rows: Sequence[Any], *, width: int = 64) -> tuple[torch.Tensor, ...]: + _require(type(width) is int and 6 <= width <= 64, "MS padded width changed") + acquisition_count = len(masked_rows) + token_ids = torch.full((acquisition_count, width), 2, dtype=torch.long) + attention = torch.zeros((acquisition_count, width), dtype=torch.bool) + input_mask = torch.zeros((acquisition_count, width), dtype=torch.bool) + labels = torch.full((acquisition_count, width), -100, dtype=torch.long) + for index, masked in enumerate(masked_rows): + length = int(len(masked.token_ids)) + _require(6 <= length <= width, "MS target length changed") + token_ids[index, :length] = torch.as_tensor(masked.token_ids, dtype=torch.long) + attention[index, :length] = True + input_mask[index, :length] = torch.as_tensor(masked.input_mask, dtype=torch.bool) + labels[index, :length] = torch.as_tensor(masked.labels, dtype=torch.long) + return token_ids, attention, input_mask, labels + + def _ms_training_inputs( + self, + joined_rows: Sequence[JoinedParent], + *, + epoch: int, + ) -> tuple[dict[str, Any], tuple[str, ...]]: + runtime = self._ensure_ms() + self._ensure_ms_epoch(epoch) + masked_rows: list[Any] = [] + local_parent_indices: list[int] = [] + selection_identities: list[str] = [] + parent_available = torch.zeros(len(joined_rows), dtype=torch.bool) + for local_index, joined in enumerate(joined_rows): + if not joined.ms_available: + continue + selected = self._ms_epoch_by_parent.get(joined.parent_id) + _require(selected is not None, "MS epoch plan omitted an available parent") + masked = runtime.mask_target( + row_index=selected.row_index, + epoch=epoch, + seed=COMMON_SEED, + ) + masked_rows.append(masked) + local_parent_indices.append(local_index) + parent_available[local_index] = True + selection_identities.append(selected.selection_sha256) + token_ids, attention, input_mask, labels = self._pad_ms_masks(masked_rows) + return ( + { + "ms_token_ids": token_ids, + "ms_attention_mask": attention, + "ms_input_mask": input_mask, + "ms_labels": labels, + "ms_acquisition_parent_indices": torch.tensor( + local_parent_indices, dtype=torch.long + ), + "ms_parent_available": parent_available, + "ms_mode": "train", + }, + tuple(selection_identities), + ) + + def _collate_training_micro( + self, + indices: Sequence[int], + *, + cell_id: str, + epoch: int, + device: torch.device, + ) -> tuple[Any, Mapping[str, Any]]: + topology, ms, _ = self._require_materializable_cell(cell_id) + joined_rows = tuple(self.train_rows[index] for index in indices) + _require(joined_rows and len({row.parent_id for row in joined_rows}) == len(joined_rows), "training micro roster invalid") + inputs, sequence_mask_ids = self._sequence_topology_inputs( + joined_rows, topology_active=topology, split="train" + ) + ms_selection_ids: tuple[str, ...] = () + if ms: + ms_inputs, ms_selection_ids = self._ms_training_inputs(joined_rows, epoch=epoch) + inputs.update(ms_inputs) + moved = self._move_inputs(inputs, device) + micro = PlannedMicrobatch( + parent_indices=tuple(int(index) for index in indices), + parent_ids=tuple(row.parent_id for row in joined_rows), + model_inputs=moved, + ) + metadata = MappingProxyType( + { + "sequence_mask_identity_sha256": _canonical_sha256( + sequence_mask_ids, domain="bertose-a5-sequence-mask-micro-r1" + ), + "ms_selection_identity_sha256": ( + _canonical_sha256(ms_selection_ids, domain="bertose-a5-ms-selection-micro-r1") + if ms + else None + ), + } + ) + return micro, metadata + + def materialize_training_step( + self, + *, + plan: Any, + step_index: int, + cell_id: str, + device: str | torch.device, + ) -> dict[str, Any]: + topology, ms, static = self._require_materializable_cell(cell_id) + _require(type(plan) is FrozenEpochPlan, "materialization requires the bound R5 plan type") + _planner.verify_plan_identity(plan) + _require(type(step_index) is int and 0 <= step_index < plan.optimizer_step_count, "step index outside plan") + _require(plan.seed == COMMON_SEED, "plan seed changed") + self._train_masker.set_epoch(plan.epoch) + if ms: + self._ensure_ms_epoch(plan.epoch) + expected = tuple(plan.step_parent_indices(step_index)) + sizes = tuple(_planner.micro_sizes(len(expected))) + micros: list[Any] = [] + metadata: list[Mapping[str, Any]] = [] + cursor = 0 + resolved_device = torch.device(device) + for size in sizes: + indices = expected[cursor : cursor + size] + micro, meta = self._collate_training_micro( + indices, + cell_id=cell_id, + epoch=plan.epoch, + device=resolved_device, + ) + micros.append(micro) + metadata.append(meta) + cursor += size + _require(cursor == len(expected) and len(micros) == 4, "step did not materialize exactly four micros") + _require(tuple(index for micro in micros for index in micro.parent_indices) == expected, "materialized micro order differs from plan") + input_surface = [ + { + "parent_indices": list(micro.parent_indices), + "parent_ids": list(micro.parent_ids), + "model_inputs": micro.model_inputs, + } + for micro in micros + ] + model_input_sha256 = _executor._recursive_state_sha256(input_surface) + sequence_stream_sha256 = _executor._recursive_state_sha256( + [ + { + "parent_ids": list(micro.parent_ids), + "seq_token_ids": micro.model_inputs["seq_token_ids"], + "seq_attention_mask": micro.model_inputs["seq_attention_mask"], + "seq_residue_ids": micro.model_inputs["seq_residue_ids"], + "seq_branch_depths": micro.model_inputs["seq_branch_depths"], + "seq_linkage_types": micro.model_inputs["seq_linkage_types"], + "seq_labels": micro.model_inputs["seq_labels"], + "mask_identity": metadata[index]["sequence_mask_identity_sha256"], + } + for index, micro in enumerate(micros) + ] + ) + topology_surface_sha256 = _executor._recursive_state_sha256( + [ + { + "parent_ids": list(micro.parent_ids), + "topology_labels": micro.model_inputs.get("topology_labels"), + "topology_available": micro.model_inputs.get("topology_available"), + "active": topology, + } + for micro in micros + ] + ) + ms_stream_sha256 = _executor._recursive_state_sha256( + [ + { + "parent_ids": list(micro.parent_ids), + "ms_token_ids": micro.model_inputs.get("ms_token_ids"), + "ms_attention_mask": micro.model_inputs.get("ms_attention_mask"), + "ms_input_mask": micro.model_inputs.get("ms_input_mask"), + "ms_labels": micro.model_inputs.get("ms_labels"), + "ms_acquisition_parent_indices": micro.model_inputs.get( + "ms_acquisition_parent_indices" + ), + "ms_parent_available": micro.model_inputs.get("ms_parent_available"), + "selection_identity": metadata[index]["ms_selection_identity_sha256"], + "active": ms, + } + for index, micro in enumerate(micros) + ] + ) + identity_payload = { + "schema": STEP_SCHEMA, + "adapter_contract_sha256": self._contract_sha256_cached, + "plan_sha256": plan.plan_sha256, + "seed": plan.seed, + "epoch": plan.epoch, + "optimizer_step_index": step_index, + "parent_indices": list(expected), + "parent_ids": [ + parent_id for micro in micros for parent_id in micro.parent_ids + ], + "availability_bits_hex": plan.step_availability_bits(step_index).hex(), + "sequence_stream_sha256": sequence_stream_sha256, + "topology_surface_sha256": topology_surface_sha256, + "ms_stream_sha256": ms_stream_sha256, + "static_stream_sha256": None, + "model_input_sha256": model_input_sha256, + "training_authorized": False, + "scientific_launch_authorized": False, + } + identity = { + **identity_payload, + "step_identity_sha256": _canonical_sha256( + identity_payload, + domain="bertose-a5-native-eight-authoritative-step-r6", + ), + } + return { + "micros": (micros[0], micros[1], micros[2], micros[3]), + "step_identity": identity, + } + + @staticmethod + def _plan_prefix_suffix( + plan: Any, next_optimizer_step: int + ) -> tuple[tuple[str, ...], tuple[str, ...]]: + boundary = plan.step_offsets[next_optimizer_step] + return ( + tuple(plan.ordered_parent_ids[:boundary]), + tuple(plan.ordered_parent_ids[boundary:]), + ) + + def resume_cursor( + self, + *, + plan: Any, + next_optimizer_step: int, + cell_id: str, + ) -> dict[str, Any]: + topology, ms, static = self._require_materializable_cell(cell_id) + _require(type(plan) is FrozenEpochPlan, "resume requires the bound R5 plan type") + _planner.verify_plan_identity(plan) + _require( + type(next_optimizer_step) is int + and 0 <= next_optimizer_step <= plan.optimizer_step_count, + "resume step outside plan", + ) + prefix, suffix = self._plan_prefix_suffix(plan, next_optimizer_step) + self._train_masker.set_epoch(plan.epoch) + sequence_stream = { + "masker_state": self._train_masker.state_dict(), + "consumed_parent_ids_sha256": _canonical_sha256( + prefix, domain="bertose-a5-resume-sequence-prefix-r1" + ), + "remaining_parent_ids_sha256": _canonical_sha256( + suffix, domain="bertose-a5-resume-sequence-suffix-r1" + ), + } + ms_surface: Mapping[str, Any] | None = None + if ms: + selected = self._ensure_ms_epoch(plan.epoch) + selected_by_parent = self._ms_epoch_by_parent + prefix_selections = tuple( + selected_by_parent[parent_id].selection_sha256 + for parent_id in prefix + if parent_id in selected_by_parent + ) + suffix_selections = tuple( + selected_by_parent[parent_id].selection_sha256 + for parent_id in suffix + if parent_id in selected_by_parent + ) + ms_surface = { + "runtime_authority_sha256": self._ms.authority_sha256, + "runtime_receipt_sha256": self._ms.receipt_sha256, + "population_binding_sha256": self._ms.population_binding_sha256, + "epoch_selection_count": len(selected), + "epoch_selection_surface_sha256": _canonical_sha256( + tuple(item.selection_sha256 for item in selected), + domain="bertose-a5-resume-ms-epoch-selection-r1", + ), + "consumed_selection_prefix_sha256": _canonical_sha256( + prefix_selections, + domain="bertose-a5-resume-ms-selection-prefix-r1", + ), + "remaining_selection_suffix_sha256": _canonical_sha256( + suffix_selections, + domain="bertose-a5-resume-ms-selection-suffix-r1", + ), + "mask_stream_identity_sha256": _canonical_sha256( + { + "runtime_source_sha256": EXPECTED_SHA256["ms_runtime"], + "seed": COMMON_SEED, + "epoch": plan.epoch, + "selection_surface": tuple(item.selection_sha256 for item in selected), + }, + domain="bertose-a5-resume-ms-mask-stream-r1", + ), + } + payload = { + "schema": CURSOR_SCHEMA, + "adapter_contract_sha256": self._contract_sha256_cached, + "planner_cursor": _planner.make_resume_cursor( + plan, next_optimizer_step=next_optimizer_step + ), + "plan_sha256": plan.plan_sha256, + "seed": plan.seed, + "epoch": plan.epoch, + "cell_id": cell_id, + "world_size": 1, + "cell_bits": {"topology": topology, "ms": ms, "static": static}, + "next_optimizer_step": next_optimizer_step, + "next_microbatch": 0, + "train_roster_sha256": self.receipt["split_roster_sha256"]["train"], + "development_roster_sha256": self.receipt["split_roster_sha256"]["development"], + "consumed_parent_count": len(prefix), + "remaining_parent_count": len(suffix), + "consumed_parent_prefix_sha256": _canonical_sha256( + prefix, domain="bertose-a5-resume-parent-prefix-r1" + ), + "remaining_parent_suffix_sha256": _canonical_sha256( + suffix, domain="bertose-a5-resume-parent-suffix-r1" + ), + "sequence_mask_stream": sequence_stream, + "ms_acquisition_and_mask_stream": ms_surface, + "static_token_stream": None, + "training_authorized": False, + "scientific_launch_authorized": False, + } + plain_payload = json.loads(_canonical_bytes(payload).decode("utf-8")) + return { + **plain_payload, + "cursor_sha256": _canonical_sha256(plain_payload, domain=CURSOR_SCHEMA), + } + + def validate_resume_cursor( + self, + cursor: Mapping[str, Any], + *, + plan: Any, + cell_id: str, + ) -> None: + _require(type(cursor) is dict, "resume cursor must be one plain mapping") + _require( + set(cursor) + == { + "schema", + "adapter_contract_sha256", + "planner_cursor", + "plan_sha256", + "seed", + "epoch", + "cell_id", + "world_size", + "cell_bits", + "next_optimizer_step", + "next_microbatch", + "train_roster_sha256", + "development_roster_sha256", + "consumed_parent_count", + "remaining_parent_count", + "consumed_parent_prefix_sha256", + "remaining_parent_suffix_sha256", + "sequence_mask_stream", + "ms_acquisition_and_mask_stream", + "static_token_stream", + "training_authorized", + "scientific_launch_authorized", + "cursor_sha256", + }, + "resume cursor fields changed", + ) + _require(cursor.get("cell_id") == cell_id, "resume cursor cell changed") + expected = self.resume_cursor( + plan=plan, + next_optimizer_step=cursor.get("next_optimizer_step"), + cell_id=cell_id, + ) + _require(cursor == expected, "resume cursor differs from exact semantic boundary") + + def restore_resume_cursor( + self, + cursor: Mapping[str, Any], + *, + plan: Any, + cell_id: str, + ) -> dict[str, Any]: + self.validate_resume_cursor(cursor, plan=plan, cell_id=cell_id) + self._train_masker.load_state_dict(cursor["sequence_mask_stream"]["masker_state"]) + if cursor["cell_bits"]["ms"]: + self._ensure_ms_epoch(plan.epoch) + self._restored_cursor = json.loads(_canonical_bytes(cursor).decode("utf-8")) + return json.loads(_canonical_bytes(self._restored_cursor).decode("utf-8")) + + def state_dict(self) -> dict[str, Any]: + _require(self._restored_cursor is not None, "no resume cursor has been restored") + return json.loads(_canonical_bytes(self._restored_cursor).decode("utf-8")) + + def load_state_dict( + self, state: Mapping[str, Any], *, plan: Any, cell_id: str + ) -> None: + self.restore_resume_cursor(state, plan=plan, cell_id=cell_id) + + @staticmethod + def shard_remaining_parent_indices( + plan: Any, + *, + next_optimizer_step: int, + world_size: int, + rank: int, + ) -> tuple[int, ...]: + _planner.verify_plan_identity(plan) + _require(world_size == 1, "native-eight adapter supports world_size=1 only") + _require(rank == 0, "native-eight adapter supports rank=0 only") + _require( + type(next_optimizer_step) is int + and 0 <= next_optimizer_step <= plan.optimizer_step_count, + "reshard cursor outside plan", + ) + boundary = plan.step_offsets[next_optimizer_step] + return tuple( + parent_index + for global_position, parent_index in enumerate( + plan.ordered_parent_indices[boundary:], start=boundary + ) + if global_position % world_size == rank + ) + + def _development_ms_inputs( + self, joined_rows: Sequence[JoinedParent] + ) -> tuple[dict[str, Any], tuple[int, ...], tuple[str, ...]]: + runtime = self._ensure_ms() + masked_rows: list[Any] = [] + local_parent_indices: list[int] = [] + row_indices: list[int] = [] + acquisition_identities: list[str] = [] + parent_available = torch.zeros(len(joined_rows), dtype=torch.bool) + for local_index, joined in enumerate(joined_rows): + if not joined.ms_available: + continue + parent = runtime.parent_by_id[joined.parent_id] + _require(parent.role == DEVELOPMENT_ROLE, "development MS parent role changed") + rows = runtime.rows[parent.row_start : parent.row_start + parent.row_count] + _require(len(rows) == joined.ms_row_count, "development MS acquisition count changed") + for row in rows: + masked_rows.append(runtime.mask_development_target(row_index=row.row_index)) + local_parent_indices.append(local_index) + row_indices.append(row.row_index) + acquisition_identities.append(row.acquisition_sha256) + parent_available[local_index] = True + token_ids, attention, input_mask, labels = self._pad_ms_masks(masked_rows) + return ( + { + "ms_token_ids": token_ids, + "ms_attention_mask": attention, + "ms_input_mask": input_mask, + "ms_labels": labels, + "ms_acquisition_parent_indices": torch.tensor( + local_parent_indices, dtype=torch.long + ), + "ms_parent_available": parent_available, + "ms_mode": "development", + }, + tuple(row_indices), + tuple(acquisition_identities), + ) + + def fixed_development_contract(self, cell_id: str) -> FixedDevelopmentContract: + topology, ms, _ = self._require_materializable_cell(cell_id) + sequence_parent_ids = tuple(row.parent_id for row in self.development_rows) + topology_parent_ids = ( + tuple(row.parent_id for row in self.development_rows if row.topology_available) + if topology + else () + ) + ms_parent_ids: tuple[str, ...] = () + ms_row_indices: tuple[int, ...] = () + ms_identity_surface: tuple[tuple[int, str, str], ...] = () + if ms: + runtime = self._ensure_ms() + parents = [row for row in self.development_rows if row.ms_available] + ms_parent_ids = tuple(row.parent_id for row in parents) + identity_rows: list[tuple[int, str, str]] = [] + for joined in parents: + parent = runtime.parent_by_id[joined.parent_id] + for row in runtime.rows[parent.row_start : parent.row_start + parent.row_count]: + identity_rows.append((row.row_index, row.parent_id, row.acquisition_sha256)) + ms_identity_surface = tuple(identity_rows) + ms_row_indices = tuple(row[0] for row in identity_rows) + _require(len(ms_parent_ids) == 580 and len(ms_row_indices) == 49_573, "fixed MS development surface changed") + eligible_parent_ids = { + "sequence": sequence_parent_ids, + "topology": topology_parent_ids, + "ms": ms_parent_ids, + "static": (), + } + surface_sha = _canonical_sha256( + { + "schema": DEVELOPMENT_SCHEMA, + "cell_id": cell_id, + "parent_batch_size": 32, + "development_manifest_sha256": self.receipt["artifacts"]["development_manifest"]["sha256"], + "sequence_runtime_sha256": EXPECTED_SHA256["sequence_runtime"], + "sequence_package_receipt_sha256": EXPECTED_SHA256[ + "sequence_package_receipt" + ], + "topology_package_receipt_sha256": EXPECTED_SHA256[ + "topology_package_receipt" + ], + "sequence_masker_state": self._development_masker.state_dict(), + "eligible_parent_ids": eligible_parent_ids, + "ms_identity_surface": ms_identity_surface, + "ms_mask_stream": ( + { + "runtime_source_sha256": EXPECTED_SHA256["ms_runtime"], + "seed": 0, + "epoch": 0, + "mode": "development", + } + if ms + else None + ), + "static_stream": None, + "training_authorized": False, + "scientific_launch_authorized": False, + }, + domain=DEVELOPMENT_SCHEMA, + ) + contract = FixedDevelopmentContract( + surface_sha256=surface_sha, + eligible_parent_ids=MappingProxyType(eligible_parent_ids), + ) + contract.validate() + return contract + + def materialize_fixed_development( + self, + cell_id: str, + *, + device: str | torch.device, + parent_batch_size: int = 32, + ) -> Iterator[Any]: + topology, ms, _ = self._require_materializable_cell(cell_id) + _require( + parent_batch_size == 32, + "fixed development parent batch size must be exactly 32", + ) + contract = self.fixed_development_contract(cell_id) + resolved_device = torch.device(device) + seen_parent_ids: list[str] = [] + seen_ms_rows: list[int] = [] + for start in range(0, len(self.development_rows), parent_batch_size): + joined_rows = self.development_rows[start : start + parent_batch_size] + inputs, _ = self._sequence_topology_inputs( + joined_rows, topology_active=topology, split="development" + ) + if ms: + ms_inputs, row_indices, _ = self._development_ms_inputs(joined_rows) + inputs.update(ms_inputs) + seen_ms_rows.extend(row_indices) + parent_ids = tuple(row.parent_id for row in joined_rows) + seen_parent_ids.extend(parent_ids) + yield DevelopmentBatch( + parent_ids=parent_ids, + model_inputs=self._move_inputs(inputs, resolved_device), + ) + _require( + tuple(seen_parent_ids) == contract.eligible_parent_ids["sequence"], + "development parent traversal changed", + ) + if ms: + _require( + len(seen_ms_rows) == 49_573 + and len(seen_ms_rows) == len(set(seen_ms_rows)), + "development MS traversal changed", + ) + else: + _require(not seen_ms_rows, "disabled MS development stream was touched") + + def evaluate_fixed_development( + self, + inner_executor: Any, + cell_id: str, + *, + device: str | torch.device, + parent_batch_size: int = 32, + ) -> DevelopmentResult: + """Stream the owned fixed-dev surface with exact parent-level nesting.""" + + _require( + type(inner_executor) is NativeEightProductionExecutor, + "fixed development requires the exact adapter-owned R5 executor", + ) + _require( + parent_batch_size == 32, + "fixed development parent batch size must be exactly 32", + ) + contract = self.fixed_development_contract(cell_id) + topology, ms, _ = self._require_materializable_cell(cell_id) + expected_coefficients = { + "sequence": 1, + "topology": int(topology), + "ms": int(ms), + "static": 0, + } + _require( + dict(inner_executor.coefficients) == expected_coefficients, + "executor cell differs from adapter cell", + ) + inner_executor.model.reverify_component_authorities() + objectives = tuple(R5_EXECUTOR_MODULE.OBJECTIVES) + observed: dict[str, dict[str, float]] = {objective: {} for objective in objectives} + was_training = inner_executor.model.training + before = { + "model": _executor._recursive_state_sha256(inner_executor.model.state_dict()), + "optimizer": _executor._recursive_state_sha256( + inner_executor.optimizer.state_dict() + ), + "scheduler": _executor._recursive_state_sha256( + None + if inner_executor.scheduler is None + else inner_executor.scheduler.state_dict() + ), + "scaler": _executor._recursive_state_sha256( + None + if inner_executor.grad_scaler is None + else inner_executor.grad_scaler.state_dict() + ), + "rng": _executor._recursive_state_sha256(_executor._capture_rng_state()), + "training": was_training, + "runtime_source_sha256": inner_executor.runtime_source_sha256, + "optimizer_contract_sha256": inner_executor.optimizer_contract_sha256, + "next_optimizer_step": inner_executor.next_optimizer_step, + } + inner_executor.model.eval() + try: + with torch.no_grad(): + for batch in self.materialize_fixed_development( + cell_id, + device=device, + parent_batch_size=parent_batch_size, + ): + with inner_executor.autocast_context_factory(): + output = inner_executor.model(**dict(batch.model_inputs)) + for objective in objectives: + losses = output.parent_losses[objective] + indices = output.loss_parent_indices[objective] + if not expected_coefficients[objective]: + _require(losses is None and indices is None, f"disabled {objective} produced dev loss") + continue + _require( + isinstance(losses, torch.Tensor) + and isinstance(indices, torch.Tensor) + and losses.ndim == indices.ndim == 1 + and losses.shape == indices.shape + and torch.isfinite(losses).all().item(), + f"enabled {objective} development vector invalid", + ) + for local_index, raw_value in zip( + indices.detach().cpu().tolist(), losses.detach().cpu().tolist() + ): + _require(type(local_index) is int and 0 <= local_index < len(batch.parent_ids), "development local parent index invalid") + parent_id = batch.parent_ids[local_index] + _require(parent_id not in observed[objective], f"{objective} development parent repeats") + value = float(raw_value) + _require(np.isfinite(value) and value >= 0, f"{objective} development loss invalid") + observed[objective][parent_id] = value + finally: + inner_executor.model.train(was_training) + after = { + "model": _executor._recursive_state_sha256( + inner_executor.model.state_dict() + ), + "optimizer": _executor._recursive_state_sha256( + inner_executor.optimizer.state_dict() + ), + "scheduler": _executor._recursive_state_sha256( + None + if inner_executor.scheduler is None + else inner_executor.scheduler.state_dict() + ), + "scaler": _executor._recursive_state_sha256( + None + if inner_executor.grad_scaler is None + else inner_executor.grad_scaler.state_dict() + ), + "rng": _executor._recursive_state_sha256( + _executor._capture_rng_state() + ), + "training": inner_executor.model.training, + "runtime_source_sha256": inner_executor.runtime_source_sha256, + "optimizer_contract_sha256": inner_executor.optimizer_contract_sha256, + "next_optimizer_step": inner_executor.next_optimizer_step, + } + _require( + after == before, + "fixed development changed model/optimizer/scheduler/scaler/RNG/mode/policy", + ) + + eligible = contract.eligible_parent_ids + raw_means: dict[str, float | None] = {} + normalized: dict[str, float | None] = {} + counts: dict[str, int] = {} + total = 0.0 + for objective in objectives: + if expected_coefficients[objective]: + _require(set(observed[objective]) == set(eligible[objective]), f"{objective} development roster incomplete") + values = [observed[objective][parent_id] for parent_id in eligible[objective]] + mean = math.fsum(values) / len(values) + scale = inner_executor.null_scales[objective] + _require( + type(scale) is float and math.isfinite(scale) and scale > 0, + f"{objective} fixed null scale is invalid", + ) + value = mean / scale + raw_means[objective] = mean + normalized[objective] = value + counts[objective] = len(values) + total += value / 4.0 + else: + _require(not observed[objective], f"disabled {objective} accumulated dev loss") + raw_means[objective] = None + normalized[objective] = None + counts[objective] = 0 + result = DevelopmentResult( + raw_parent_means=MappingProxyType(raw_means), + normalized_losses=MappingProxyType(normalized), + parent_counts=MappingProxyType(counts), + total_normalized_loss=total, + surface_sha256=contract.surface_sha256, + contract_sha256=contract.contract_sha256, + ) + _require(type(result) is DevelopmentResult, "development result class changed") + _require( + result.surface_sha256 == contract.surface_sha256 + and result.contract_sha256 == contract.contract_sha256, + "development result identity changed", + ) + return result + + +def contract_payload() -> dict[str, Any]: + with NativeEightDataAdapter() as adapter: + return adapter.contract_payload() + + +def contract_sha256() -> str: + with NativeEightDataAdapter() as adapter: + return adapter.contract_sha256 + + +__all__ = [ + "ADAPTER_RECEIPT_PATH", + "AdamWContract", + "CELL_BITS", + "CELL_ORDER", + "DEVELOPMENT_MANIFEST_PATH", + "DevelopmentBatch", + "DevelopmentResult", + "FixedDevelopmentContract", + "FrozenEpochPlan", + "JOINED_ROOT", + "JoinedParent", + "NativeEightCompositeR5", + "NativeEightConfig", + "NativeEightDataAdapter", + "NativeEightDataAdapterError", + "NativeEightOutput", + "NativeEightProductionExecutor", + "PlannedMicrobatch", + "R5_EXECUTOR_MODULE", + "RECEIPT_SCHEMA", + "SCHEMA", + "StepDiagnostic", + "TRAIN_MANIFEST_PATH", + "contract_payload", + "contract_sha256", + "verify_authorities", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_r3.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_r3.py new file mode 100644 index 0000000000000000000000000000000000000000..561d978c80a98f18fcc4db8fb03739d4eb58de75 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_r3.py @@ -0,0 +1,973 @@ +"""Immutable, launch-closed native-eight adapter R3 over certified R4 rows. + +This no-overwrite successor retains the frozen adapter-R2 parent joins, MS-V3 +acquisition stream, static-R7 availability surface, and exact R5 planner/model +class identities. It replaces only the sequence/topology ingress boundary: + +* the certified R4 runtime and its R3 predecessor are both byte-bound; +* every row is obtained through ``r4_store.sample(sequence_row)``; +* every batch is collated through ``collate_sequence_topology(store, ...)``; +* all six R4 provenance channels are retained in every materialized batch; +* resume state contains the R4 masker state and restores only through R4; and +* the topology-loss implementation is the module loaded by the R4 store from + the receipt-bound predecessor package. + +Static-active cells remain deliberately unmaterializable until the final +EGNN/RVQ token package and train-only static null are separately certified. +No flag in this file or its receipt authorizes training, GPU use, Nova +submission, AFFINose, MD, weight ablations, or downstream evaluation. +""" + +from __future__ import annotations + +import copy +import hashlib +import importlib.util +import json +import os +import stat +import sys +from pathlib import Path +from types import MappingProxyType, ModuleType +from typing import Any, Mapping, Optional, Sequence + +import numpy as np +import torch + + +SCHEMA = "bertose_a5_native_eight_data_adapter_20260721_r3" +RECEIPT_SCHEMA = "bertose_a5_native_eight_data_adapter_receipt_20260721_r3" +STEP_SCHEMA = "bertose_a5_native_eight_authoritative_step_20260721_r3" +CURSOR_SCHEMA = "bertose_a5_native_eight_data_cursor_20260721_r3" +DEVELOPMENT_SCHEMA = "bertose_a5_native_eight_fixed_development_20260721_r3" + +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +GPU_LAUNCH_AUTHORIZED = False +NOVA_SUBMISSION_AUTHORIZED = False +EXECUTION_CERTIFIED = False +STATIC_FINAL_TOKEN_PACKAGE_BOUND = False +AFFINOSE_SUPPORTED = False +DOWNSTREAM_SUPPORTED = False +MD_SUPPORTED = False +WEIGHT_ABLATION_SUPPORTED = False + +WRITING_ROOT = Path(__file__).absolute().parents[4] +DATA_ROOT = WRITING_ROOT.parent / "data" + +ADAPTER_R2_SOURCE_PATH = ( + WRITING_ROOT + / "review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r2" + / "review_a5_native_eight_data_adapter_r2.py" +) +ADAPTER_R2_SOURCE_SHA256 = ( + "9f8f167148aa234df413e4c3d4e1846881781c8e5a19bd91b0b178b260a3a537" +) +ADAPTER_R2_RECEIPT_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r2" + / "review_a5_native_eight_data_adapter_receipt_r2.json" +) +ADAPTER_R2_RECEIPT_SHA256 = ( + "3b2118e128a5550ba4918b4f4f2c6d8045e319b7cff37b76d74dce6b3220c9f0" +) + +R4_RUNTIME_ROOT = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4" +) +R4_RUNTIME_PATH = R4_RUNTIME_ROOT / "review_a5_official_ragged_sequence_topology_r4.py" +R4_RUNTIME_SHA256 = "efc56a84cb82f30c0566da83a38bf0f02fdd507e02d116d827c1bbd827151ecf" +R4_SUMMARY_PATH = ( + R4_RUNTIME_ROOT / "review_a5_official_ragged_sequence_topology_runtime_summary_r4.json" +) +R4_SUMMARY_SHA256 = "ccd4b81d3afac8ae789c538e0af332f74f2468d403da1d243fefefd4df013538" +R4_RECEIPT_PATH = ( + R4_RUNTIME_ROOT / "review_a5_official_ragged_sequence_topology_runtime_receipt_r4.json" +) +R4_RECEIPT_SHA256 = "654f5b9728c3dfd2588c4b570b0e3a1bcab8feb366af28eeead36f9beb37d921" +R4_BFS_RESULT_PATH = R4_RUNTIME_ROOT / "review_a5_sequence_topology_bfs_replay_250_r1.json" +R4_BFS_RESULT_SHA256 = "75914916591d1db97a77d64b9e7a51e0f23526aeb87bd6e394d49c6583309469" +R4_BFS_RECEIPT_PATH = ( + R4_RUNTIME_ROOT / "review_a5_sequence_topology_bfs_replay_250_receipt_r1.json" +) +R4_BFS_RECEIPT_SHA256 = "f20a1dd444f2760ccd8605d53ad716ceb55112fd32d3409826bcaf78ff2c6c3d" + +# R4 requires this explicit predecessor path. It is not inferred from R4's +# location and cannot be caller-overridden. The relative identity is recorded +# in contracts so the same immutable bundle has one identity on Mac and Nova. +FROZEN_R3_PREDECESSOR_RELATIVE_PATH = ( + "review/multimodal/outputs/" + "review_a5_official_ragged_sequence_topology_runtime_20260721_r3" +) +FROZEN_R3_PREDECESSOR_PATH = WRITING_ROOT / FROZEN_R3_PREDECESSOR_RELATIVE_PATH +FROZEN_R3_RUNTIME_RECEIPT_PATH = ( + FROZEN_R3_PREDECESSOR_PATH + / "review_a5_official_ragged_sequence_topology_runtime_receipt.json" +) +FROZEN_R3_RUNTIME_RECEIPT_SHA256 = ( + "53b058a2032c424718a96757b3aa63df5160c20910001fcb128b0ace03a13a4c" +) +FROZEN_TOPOLOGY_LOSS_PATH = FROZEN_R3_PREDECESSOR_PATH / "review_a5_topology_loss_v2.py" +FROZEN_TOPOLOGY_LOSS_SHA256 = ( + "64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e" +) + +SCIENTIFIC_BOUNDARY_AUTHORITY_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1" + / "review_a5_native_eight_scientific_boundary_child_authority_r1.json" +) +SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256 = ( + "1238f76e5da5184d16d33077bf3e5342033918fadb4eba84242c47cb1b1322cc" +) +SCIENTIFIC_BOUNDARY_RECEIPT_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1" + / "review_a5_native_eight_scientific_boundary_child_receipt_r1.json" +) +SCIENTIFIC_BOUNDARY_RECEIPT_SHA256 = ( + "fb65dddf0bc61b4c73b5dc5ec796967e65263e9d7bdc4882e07684e882280fdb" +) + +JOINED_ROOT = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3" +) +ADAPTER_RECEIPT_PATH = JOINED_ROOT / "review_a5_native_eight_data_adapter_receipt_r3.json" + + +class NativeEightDataAdapterR3Error(RuntimeError): + """An immutable R3-adapter source, receipt, row, or resume gate changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightDataAdapterR3Error(message) + + +def _read_regular_nofollow(path: Path, *, label: str) -> bytes: + """Read one canonical absolute regular file through an O_NOFOLLOW walk.""" + + _require( + hasattr(os, "O_NOFOLLOW") and hasattr(os, "O_DIRECTORY"), + f"{label} platform lacks complete no-follow traversal", + ) + absolute = Path(path) + _require(absolute.is_absolute(), f"{label} path is not absolute") + parts = absolute.parts + _require( + bool(parts) + and parts[0] == os.sep + and all(part not in {"", ".", ".."} for part in parts[1:]) + and os.path.normpath(os.fspath(absolute)) == os.fspath(absolute), + f"{label} path is not canonical", + ) + cloexec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | cloexec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | cloexec + descriptor: Optional[int] = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(parts[-1], leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + _require(stat.S_ISREG(before.st_mode), f"{label} is not a regular file") + chunks: list[bytes] = [] + while True: + chunk = os.read(descriptor, 1 << 20) + if not chunk: + break + chunks.append(chunk) + after = os.fstat(descriptor) + _require( + (before.st_dev, before.st_ino, before.st_size, before.st_mtime_ns, before.st_ctime_ns) + == (after.st_dev, after.st_ino, after.st_size, after.st_mtime_ns, after.st_ctime_ns), + f"{label} changed during read", + ) + payload = b"".join(chunks) + _require(len(payload) == before.st_size, f"{label} size changed during read") + return payload + except OSError as error: + raise NativeEightDataAdapterR3Error(f"{label} no-follow open failed: {error}") from error + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + + +def _sha256(payload: bytes) -> str: + return hashlib.sha256(payload).hexdigest() + + +def _file_receipt(path: Path, *, label: str) -> dict[str, Any]: + payload = _read_regular_nofollow(path, label=label) + return {"name": path.name, "bytes": len(payload), "sha256": _sha256(payload)} + + +def _canonical_bytes(value: object) -> bytes: + return ( + json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False) + "\n" + ).encode("utf-8") + + +def _canonical_sha256(value: object, *, domain: str) -> str: + return hashlib.sha256(domain.encode("ascii") + b"\0" + _canonical_bytes(value)).hexdigest() + + +def _load_bound_module(path: Path, expected_sha256: str, *, label: str) -> ModuleType: + source = _read_regular_nofollow(path, label=label) + _require(_sha256(source) == expected_sha256, f"{label} source hash changed") + module_name = f"_review_a5_adapter_r3_{label}_{expected_sha256}" + existing = sys.modules.get(module_name) + if existing is not None: + _require( + getattr(existing, "__adapter_r3_source_sha256__", None) == expected_sha256, + f"{label} module name is occupied by different bytes", + ) + return existing + module = ModuleType(module_name) + module.__file__ = os.fspath(path) + module.__package__ = "" + module.__adapter_r3_source_sha256__ = expected_sha256 + sys.modules[module_name] = module + try: + exec(compile(source, os.fspath(path), "exec"), module.__dict__) + except BaseException: + sys.modules.pop(module_name, None) + raise + return module + + +_r2 = _load_bound_module( + ADAPTER_R2_SOURCE_PATH, ADAPTER_R2_SOURCE_SHA256, label="native_eight_adapter_r2" +) +_r4 = _load_bound_module(R4_RUNTIME_PATH, R4_RUNTIME_SHA256, label="sequence_topology_r4") + + +class NativeEightDataAdapterR3Error(_r2.NativeEightDataAdapterError): + """R3 successor error; also catchable through the predecessor error API.""" + +# Preserve the one exact R5 planner/model/executor class identity already owned +# by adapter R2. The executor successor must bind these exact objects. +R5_EXECUTOR_MODULE = _r2.R5_EXECUTOR_MODULE +NativeEightCompositeR5 = _r2.NativeEightCompositeR5 +NativeEightConfig = _r2.NativeEightConfig +NativeEightOutput = _r2.NativeEightOutput +NativeEightProductionExecutor = _r2.NativeEightProductionExecutor +FrozenEpochPlan = _r2.FrozenEpochPlan +PlannedMicrobatch = _r2.PlannedMicrobatch +DevelopmentBatch = _r2.DevelopmentBatch +DevelopmentResult = _r2.DevelopmentResult +FixedDevelopmentContract = _r2.FixedDevelopmentContract +AdamWContract = _r2.AdamWContract +StepDiagnostic = _r2.StepDiagnostic +JoinedParent = _r2.JoinedParent +CELL_ORDER = _r2.CELL_ORDER +CELL_BITS = _r2.CELL_BITS +COMMON_SEED = _r2.COMMON_SEED +TRAIN_PATTERN_COUNTS = _r2.TRAIN_PATTERN_COUNTS +DEVELOPMENT_PATTERN_COUNTS = _r2.DEVELOPMENT_PATTERN_COUNTS +TRAIN_MANIFEST_PATH = _r2.TRAIN_MANIFEST_PATH +DEVELOPMENT_MANIFEST_PATH = _r2.DEVELOPMENT_MANIFEST_PATH + +PROVENANCE_FIELDS = ( + "sequence_rows", + "roles", + "seq_token_categories", + "topology_rows", + "topology_residue_counts", + "topology_target_counts", +) + +EXPECTED_EXTERNAL_SHA256 = MappingProxyType( + { + "adapter_r2_source": ADAPTER_R2_SOURCE_SHA256, + "adapter_r2_receipt": ADAPTER_R2_RECEIPT_SHA256, + "sequence_topology_r4_runtime": R4_RUNTIME_SHA256, + "sequence_topology_r4_summary": R4_SUMMARY_SHA256, + "sequence_topology_r4_receipt": R4_RECEIPT_SHA256, + "sequence_topology_r4_bfs_result": R4_BFS_RESULT_SHA256, + "sequence_topology_r4_bfs_receipt": R4_BFS_RECEIPT_SHA256, + "sequence_topology_r3_predecessor_receipt": FROZEN_R3_RUNTIME_RECEIPT_SHA256, + "topology_loss_source": FROZEN_TOPOLOGY_LOSS_SHA256, + "ms_runtime": "68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6", + "ms_authority": "48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4", + "ms_receipt": "f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4", + "ms_certificate": "53098620a5c22dafdc951ba743515b4b10b1673c02f0aa4d881db669584902fa", + "ms_parent_manifest": "10dc3fa7622e2a7e448d775f4082fdc84aa0622f9a7a74bcfaeed491c0eb7d39", + "static_r7_authority": "59cf794d52341847b08aaa7f4212d1203dec4df89609157d924fda50d54f7602", + "static_r7_receipt": "0729fa35e7a34a51ee77d2752f008a783d582b845e6c8dd9ae694eb9edb61d9c", + "static_r7_summary": "f95235a74962fd8aec04b0a14ad17aea3e2bcec27826102d5d26d3f907871908", + "scientific_boundary_authority": SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256, + "scientific_boundary_receipt": SCIENTIFIC_BOUNDARY_RECEIPT_SHA256, + } +) + + +def _verify_hash(path: Path, expected: str, *, label: str) -> str: + observed = _sha256(_read_regular_nofollow(path, label=label)) + _require(observed == expected, f"{label} bytes changed") + return observed + + +def _read_json( + path: Path, *, label: str, require_canonical: bool = False +) -> dict[str, Any]: + payload = _read_regular_nofollow(path, label=label) + try: + value = json.loads(payload.decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightDataAdapterR3Error(f"{label} is invalid JSON") from error + _require(type(value) is dict, f"{label} root is not a dictionary") + if require_canonical: + _require(_canonical_bytes(value) == payload, f"{label} is not canonical JSON") + return value + + +def verify_authorities() -> Mapping[str, str]: + """Re-attest R2/MS/static plus R4/BFS/scientific authorities.""" + + predecessor = dict(_r2.verify_authorities()) + external = { + "adapter_r2_source": _verify_hash( + ADAPTER_R2_SOURCE_PATH, ADAPTER_R2_SOURCE_SHA256, label="adapter R2 source" + ), + "adapter_r2_receipt": _verify_hash( + ADAPTER_R2_RECEIPT_PATH, ADAPTER_R2_RECEIPT_SHA256, label="adapter R2 receipt" + ), + "sequence_topology_r4_runtime": _verify_hash( + R4_RUNTIME_PATH, R4_RUNTIME_SHA256, label="sequence/topology R4 runtime" + ), + "sequence_topology_r4_summary": _verify_hash( + R4_SUMMARY_PATH, R4_SUMMARY_SHA256, label="sequence/topology R4 summary" + ), + "sequence_topology_r4_receipt": _verify_hash( + R4_RECEIPT_PATH, R4_RECEIPT_SHA256, label="sequence/topology R4 receipt" + ), + "sequence_topology_r4_bfs_result": _verify_hash( + R4_BFS_RESULT_PATH, R4_BFS_RESULT_SHA256, label="sequence/topology BFS result" + ), + "sequence_topology_r4_bfs_receipt": _verify_hash( + R4_BFS_RECEIPT_PATH, + R4_BFS_RECEIPT_SHA256, + label="sequence/topology BFS receipt", + ), + "sequence_topology_r3_predecessor_receipt": _verify_hash( + FROZEN_R3_RUNTIME_RECEIPT_PATH, + FROZEN_R3_RUNTIME_RECEIPT_SHA256, + label="sequence/topology R3 predecessor receipt", + ), + "topology_loss_source": _verify_hash( + FROZEN_TOPOLOGY_LOSS_PATH, + FROZEN_TOPOLOGY_LOSS_SHA256, + label="receipt-bound topology loss source", + ), + "ms_runtime": _verify_hash( + _r2.MS_RUNTIME_PATH, + EXPECTED_EXTERNAL_SHA256["ms_runtime"], + label="MS V3 runtime", + ), + "ms_authority": _verify_hash( + _r2.MS_AUTHORITY_PATH, + EXPECTED_EXTERNAL_SHA256["ms_authority"], + label="MS V3 authority", + ), + "ms_receipt": _verify_hash( + _r2.MS_RECEIPT_PATH, + EXPECTED_EXTERNAL_SHA256["ms_receipt"], + label="MS V3 receipt", + ), + "ms_certificate": _verify_hash( + _r2.MS_CERTIFICATE_PATH, + EXPECTED_EXTERNAL_SHA256["ms_certificate"], + label="MS V3 certificate", + ), + "ms_parent_manifest": _verify_hash( + _r2.MS_PARENT_MANIFEST_PATH, + EXPECTED_EXTERNAL_SHA256["ms_parent_manifest"], + label="MS V3 parent manifest", + ), + "static_r7_authority": _verify_hash( + _r2.STATIC_AUTHORITY_PATH, + EXPECTED_EXTERNAL_SHA256["static_r7_authority"], + label="static R7 authority", + ), + "static_r7_receipt": _verify_hash( + _r2.STATIC_RECEIPT_PATH, + EXPECTED_EXTERNAL_SHA256["static_r7_receipt"], + label="static R7 receipt", + ), + "static_r7_summary": _verify_hash( + _r2.STATIC_SUMMARY_PATH, + EXPECTED_EXTERNAL_SHA256["static_r7_summary"], + label="static R7 summary", + ), + "scientific_boundary_authority": _verify_hash( + SCIENTIFIC_BOUNDARY_AUTHORITY_PATH, + SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256, + label="native-eight scientific boundary authority", + ), + "scientific_boundary_receipt": _verify_hash( + SCIENTIFIC_BOUNDARY_RECEIPT_PATH, + SCIENTIFIC_BOUNDARY_RECEIPT_SHA256, + label="native-eight scientific boundary receipt", + ), + } + _require(external == dict(EXPECTED_EXTERNAL_SHA256), "external authority set changed") + + r4_receipt = _read_json(R4_RECEIPT_PATH, label="R4 runtime receipt") + _require( + r4_receipt.get("schema") + == "bertose_a5_official_ragged_sequence_topology_runtime_receipt_v4" + and r4_receipt.get("bfs_replay_receipt_sha256") == R4_BFS_RECEIPT_SHA256, + "R4 runtime receipt no longer binds the BFS replay", + ) + bfs_receipt = _read_json(R4_BFS_RECEIPT_PATH, label="BFS replay receipt") + _require( + bfs_receipt.get("selected_count") == 250 + and bfs_receipt.get("all_mismatch_counts_zero") is True + and bfs_receipt.get("result", {}).get("sha256") == R4_BFS_RESULT_SHA256, + "BFS replay receipt changed", + ) + scientific = _read_json( + SCIENTIFIC_BOUNDARY_AUTHORITY_PATH, label="scientific boundary authority" + ) + cell_plans = scientific.get("cell_plans") + _require( + type(cell_plans) is list + and [row.get("cell_id") for row in cell_plans] == list(CELL_ORDER) + and all(row.get("fresh_fit_required") is True for row in cell_plans) + and scientific.get("pretraining_seed") == COMMON_SEED + and scientific.get("fresh_fit_count") == 8, + "scientific eight-cell boundary changed", + ) + for name in ( + "training_authorized", + "scientific_launch_authorized", + "execution_certified", + "job_submission_allowed", + "submission_occurred", + ): + _require(scientific.get(name) is False, f"scientific boundary flag changed: {name}") + combined = {**{f"r2::{key}": value for key, value in predecessor.items()}, **external} + return MappingProxyType(combined) + + +def _read_release_receipt() -> dict[str, Any]: + receipt = _read_json( + ADAPTER_RECEIPT_PATH, label="adapter R3 receipt", require_canonical=True + ) + _require(receipt.get("schema") == RECEIPT_SCHEMA, "adapter R3 receipt schema changed") + _require( + receipt.get("status") + == "PASS_PREPARATION_ONLY_R4_BOUND_STATIC_FINAL_TOKENS_ABSENT_LAUNCH_CLOSED", + "adapter R3 receipt status changed", + ) + _require( + receipt.get("runtime_source") + == _file_receipt(Path(__file__).absolute(), label="adapter R3 source"), + "adapter R3 receipt does not bind the loaded source", + ) + _require( + receipt.get("predecessor_adapter_r2") + == { + "source_sha256": ADAPTER_R2_SOURCE_SHA256, + "receipt_sha256": ADAPTER_R2_RECEIPT_SHA256, + }, + "adapter R3 predecessor binding changed", + ) + _require( + receipt.get("external_authority_bindings") == dict(EXPECTED_EXTERNAL_SHA256), + "adapter R3 external authority bindings changed", + ) + _require(receipt.get("cells") == list(CELL_ORDER), "adapter R3 cell set changed") + _require(receipt.get("common_seed") == COMMON_SEED, "adapter R3 common seed changed") + _require(receipt.get("fixed_loss_coefficients") == [1, "topology_bit", "ms_bit", "static_bit"], "adapter R3 coefficient policy changed") + _require(receipt.get("fixed_loss_denominator") == 4, "adapter R3 loss denominator changed") + _require(receipt.get("provenance_fields") == list(PROVENANCE_FIELDS), "adapter R3 provenance fields changed") + for flag in ( + "training_authorized", + "scientific_launch_authorized", + "gpu_launch_authorized", + "nova_submission_authorized", + "execution_certified", + "static_final_token_package_bound", + "static_active_production_materialization_authorized", + "affinose_supported", + "downstream_supported", + "md_supported", + "weight_ablation_supported", + ): + _require(receipt.get(flag) is False, f"adapter R3 receipt flag changed: {flag}") + return receipt + + +def _r4_store() -> Any: + return _r4.OfficialRaggedSequenceTopologyStore( + _r2.SEQ_PACKAGE, + _r2.TOPOLOGY_PACKAGE, + _r2.SEQ_NULL_PACKAGE, + _r2.TOPOLOGY_NULL_PACKAGE, + predecessor_package=FROZEN_R3_PREDECESSOR_PATH, + ) + + +class NativeEightDataAdapter(_r2.NativeEightDataAdapter): + """Frozen parent joins with an exclusively R4 sequence/topology ingress.""" + + training_authorized = False + scientific_launch_authorized = False + gpu_launch_authorized = False + nova_submission_authorized = False + execution_certified = False + + def __init__(self) -> None: + self._authority_bindings = dict(verify_authorities()) + self.release_receipt = _read_release_receipt() + self.receipt, self.train_rows, self.development_rows = ( + _r2._read_receipt_and_manifests() + ) + self.train_by_parent = MappingProxyType( + {row.parent_id: row for row in self.train_rows} + ) + self.development_by_parent = MappingProxyType( + {row.parent_id: row for row in self.development_rows} + ) + self._train_planner_rows = tuple(row.planner_row for row in self.train_rows) + self._sequence_module = _r4 + self._store = _r4_store() + self._train_masker = _r4.EpochVaryingSequenceMasker( + self._store, split="train", seed=COMMON_SEED, epoch=0 + ) + self._development_masker = _r4.EpochVaryingSequenceMasker( + self._store, split="development", seed=COMMON_SEED, epoch=0 + ) + self._ms: Any | None = None + self._ms_epoch = -1 + self._ms_epoch_plan: tuple[Any, ...] = () + self._ms_epoch_by_parent: Mapping[str, Any] = MappingProxyType({}) + self._restored_cursor: Mapping[str, Any] | None = None + self._verify_store_against_joined_rows() + self._verify_all_modality_joins() + self._verify_receipt_bound_topology_loss() + self._contract_sha256_cached = _canonical_sha256( + self.contract_payload(), + domain="bertose-a5-native-eight-data-adapter-contract-r7", + ) + + def _verify_receipt_bound_topology_loss(self) -> None: + self._store.verify_live_bindings() + module = self._store.topology_loss_module + _require(isinstance(module, ModuleType), "R4 store topology loss is not a module") + _require( + Path(module.__file__).absolute() == FROZEN_TOPOLOGY_LOSS_PATH, + "R4 store topology loss path changed", + ) + _require( + _sha256(_read_regular_nofollow(Path(module.__file__).absolute(), label="live topology loss")) + == FROZEN_TOPOLOGY_LOSS_SHA256, + "R4 store topology loss bytes changed", + ) + for name in ( + "inverse_multiplicity_unordered_pair_weights", + "parent_balanced_unique_residue_pair_loss", + ): + _require(callable(getattr(module, name, None)), f"topology loss API changed: {name}") + + @property + def topology_loss_module(self) -> ModuleType: + self._verify_receipt_bound_topology_loss() + return self._store.topology_loss_module + + def verify_authorities(self) -> Mapping[str, str]: + observed = dict(verify_authorities()) + _require(observed == self._authority_bindings, "live adapter R3 authority changed") + _require(_read_release_receipt() == self.release_receipt, "adapter R3 receipt changed") + self._store.verify_live_bindings() + self._verify_receipt_bound_topology_loss() + current_receipt, current_train, current_development = ( + _r2._read_receipt_and_manifests() + ) + _require(dict(current_receipt) == dict(self.receipt), "joined adapter receipt changed") + _require(current_train == self.train_rows, "joined train rows changed") + _require(current_development == self.development_rows, "joined development rows changed") + return MappingProxyType(observed) + + def contract_payload(self) -> dict[str, Any]: + observed = dict(verify_authorities()) + _require(observed == self._authority_bindings, "live adapter R3 authority changed") + current_release = _read_release_receipt() + _require(current_release == self.release_receipt, "adapter R3 receipt changed") + return { + "schema": SCHEMA, + "status": "PREPARATION_ONLY_R4_BOUND_STATIC_FINAL_TOKENS_ABSENT_LAUNCH_CLOSED", + "cells": list(CELL_ORDER), + "common_seed": COMMON_SEED, + "world_size": 1, + "train_parent_count": len(self.train_rows), + "development_parent_count": len(self.development_rows), + "source_sha256": _file_receipt( + Path(__file__).absolute(), label="adapter R3 source" + )["sha256"], + "receipt_sha256": _file_receipt( + ADAPTER_RECEIPT_PATH, label="adapter R3 receipt" + )["sha256"], + "predecessor_adapter_r2_source_sha256": ADAPTER_R2_SOURCE_SHA256, + "predecessor_adapter_r2_receipt_sha256": ADAPTER_R2_RECEIPT_SHA256, + "authority_set_sha256": _canonical_sha256( + observed, + domain="bertose-a5-native-eight-data-adapter-authorities-r7", + ), + "train_manifest_sha256": self.receipt["artifacts"]["train_manifest"]["sha256"], + "development_manifest_sha256": self.receipt["artifacts"]["development_manifest"]["sha256"], + "train_roster_sha256": self.receipt["split_roster_sha256"]["train"], + "development_roster_sha256": self.receipt["split_roster_sha256"]["development"], + "sequence_topology_r4": { + "runtime_sha256": R4_RUNTIME_SHA256, + "runtime_receipt_sha256": R4_RECEIPT_SHA256, + "bfs_replay_receipt_sha256": R4_BFS_RECEIPT_SHA256, + "predecessor_relative_path": FROZEN_R3_PREDECESSOR_RELATIVE_PATH, + "predecessor_receipt_sha256": FROZEN_R3_RUNTIME_RECEIPT_SHA256, + "store_manifest_identity_sha256": self._store.manifest_identity_sha256, + "topology_loss_source_sha256": FROZEN_TOPOLOGY_LOSS_SHA256, + "rows_only_through_r4_store_sample": True, + "r4_store_collation_required": True, + "r4_masker_only_checkpoint_restore": True, + "provenance_fields": list(PROVENANCE_FIELDS), + }, + "processing_contract": { + "sequence": "train-only BPE plus R4-bound token/category/residue/depth/linkage channels and seed43 epoch masks", + "topology": "R4-bound original-residue BFS matrix with receipt-bound inverse-multiplicity equal-parent loss", + "ms": "unchanged certified MS-V3 TOP30 acquisition runtime and train-only null", + "static": "unchanged static-R7 GLYCAM graph/state identity only; final EGNN/RVQ token package absent", + }, + "loss_policy": { + "coefficients": [1, "topology_bit", "ms_bit", "static_bit"], + "denominator": 4, + "adaptive_or_weight_ablation": False, + }, + "disabled_branch_contract": "no_final_static_loader_no_static_payload", + "static_final_token_package_bound": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "gpu_launch_authorized": False, + "nova_submission_authorized": False, + "execution_certified": False, + "affinose_supported": False, + "downstream_supported": False, + "md_supported": False, + "weight_ablation_supported": False, + } + + @property + def contract_sha256(self) -> str: + return _canonical_sha256( + self.contract_payload(), + domain="bertose-a5-native-eight-data-adapter-contract-r7", + ) + + def _sequence_topology_inputs( + self, + joined_rows: Sequence[JoinedParent], + *, + topology_active: bool, + split: str, + ) -> tuple[dict[str, Any], tuple[str, ...]]: + _require(split in {"train", "development"}, "sequence split changed") + masker = self._train_masker if split == "train" else self._development_masker + samples: list[dict[str, Any]] = [] + masked_token_ids: list[np.ndarray] = [] + sequence_labels: list[np.ndarray] = [] + mask_identities: list[str] = [] + for joined in joined_rows: + # No detached row mapping is permitted, including in A000/A010. + sample = self._store.sample(joined.sequence_row) + _require(sample["parent_id"] == joined.parent_id, "R4 sample parent changed") + _require(sample["role"] == joined.role, "R4 sample role changed") + _require(sample["canonical_wurcs"] == joined.canonical_wurcs, "R4 sample WURCS changed") + _require(sample["sequence_objective_eligible"] is True, "ineligible R4 sequence sample entered adapter") + _require(sample["topology_row"] == joined.topology_row, "R4 topology row changed") + _require( + sample["topology_residue_count"] == joined.topology_residue_count, + "R4 topology residue count changed", + ) + masked, labels, selected = masker.mask_sample(sample) + # R4 deliberately validates the pristine authoritative row at + # collation. Masked IDs and labels remain a parallel, adapter- + # owned surface and replace only the collated model-input IDs. + samples.append(sample) + masked_token_ids.append(masked) + sequence_labels.append(labels) + mask_identities.append( + _canonical_sha256( + { + "parent_id": joined.parent_id, + "sequence_row": joined.sequence_row, + "selected_positions": np.flatnonzero(selected).tolist(), + "effective_epoch": masker.effective_epoch, + "seed": masker.seed, + "split": split, + "r4_contract_sha256": _r4.R4_CONTRACT_SHA256, + }, + domain="bertose-a5-sequence-mask-identity-r4", + ) + ) + batch = _r4.collate_sequence_topology( + self._store, samples, include_topology=topology_active + ) + inputs: dict[str, Any] = { + "seq_token_ids": torch.as_tensor( + np.stack(masked_token_ids), dtype=torch.long + ), + "seq_attention_mask": batch["seq_attention_mask"].bool(), + "seq_residue_ids": batch["seq_residue_ids"], + "seq_branch_depths": batch["seq_branch_depths"], + "seq_linkage_types": batch["seq_linkage_types"], + "seq_labels": torch.as_tensor( + np.stack(sequence_labels), dtype=torch.long + ), + "sequence_rows": batch["sequence_rows"], + "roles": list(batch["roles"]), + "seq_token_categories": batch["seq_token_categories"], + "topology_rows": batch["topology_rows"], + "topology_residue_counts": batch["topology_residue_counts"], + "topology_target_counts": batch["topology_target_counts"], + } + if topology_active: + inputs["topology_labels"] = batch["topology_labels"] + inputs["topology_available"] = torch.tensor( + [row.topology_available for row in joined_rows], dtype=torch.bool + ) + _require(set(PROVENANCE_FIELDS).issubset(inputs), "R4 batch provenance was dropped") + return inputs, tuple(mask_identities) + + def materialize_training_step( + self, + *, + plan: Any, + step_index: int, + cell_id: str, + device: str | torch.device, + ) -> dict[str, Any]: + value = super().materialize_training_step( + plan=plan, step_index=step_index, cell_id=cell_id, device=device + ) + micros = value["micros"] + provenance_surface = [ + { + key: micro.model_inputs[key] + for key in PROVENANCE_FIELDS + } + for micro in micros + ] + identity = dict(value["step_identity"]) + identity.pop("step_identity_sha256") + identity["schema"] = STEP_SCHEMA + identity["sequence_topology_r4_runtime_sha256"] = R4_RUNTIME_SHA256 + identity["sequence_topology_r4_receipt_sha256"] = R4_RECEIPT_SHA256 + identity["sequence_topology_bfs_receipt_sha256"] = R4_BFS_RECEIPT_SHA256 + identity["topology_loss_source_sha256"] = FROZEN_TOPOLOGY_LOSS_SHA256 + identity["r4_batch_provenance_sha256"] = R5_EXECUTOR_MODULE._recursive_state_sha256( + provenance_surface + ) + identity["step_identity_sha256"] = _canonical_sha256( + identity, + domain="bertose-a5-native-eight-authoritative-step-r7", + ) + return {"micros": micros, "step_identity": identity} + + def resume_cursor( + self, + *, + plan: Any, + next_optimizer_step: int, + cell_id: str, + ) -> dict[str, Any]: + cursor = super().resume_cursor( + plan=plan, + next_optimizer_step=next_optimizer_step, + cell_id=cell_id, + ) + cursor.pop("cursor_sha256") + cursor["schema"] = CURSOR_SCHEMA + masker_state = cursor["sequence_mask_stream"]["masker_state"] + _require( + type(masker_state) is dict + and masker_state.get("schema") + == "bertose_a5_official_sequence_masker_resume_v4", + "resume cursor does not contain an R4 masker state", + ) + cursor["sequence_topology_r4"] = { + "runtime_sha256": R4_RUNTIME_SHA256, + "runtime_receipt_sha256": R4_RECEIPT_SHA256, + "bfs_replay_receipt_sha256": R4_BFS_RECEIPT_SHA256, + "predecessor_receipt_sha256": FROZEN_R3_RUNTIME_RECEIPT_SHA256, + "store_manifest_identity_sha256": self._store.manifest_identity_sha256, + "topology_loss_source_sha256": FROZEN_TOPOLOGY_LOSS_SHA256, + } + plain = json.loads(_canonical_bytes(cursor).decode("utf-8")) + return { + **plain, + "cursor_sha256": _canonical_sha256(plain, domain=CURSOR_SCHEMA), + } + + def validate_resume_cursor( + self, + cursor: Mapping[str, Any], + *, + plan: Any, + cell_id: str, + ) -> None: + _require(type(cursor) is dict, "resume cursor must be one plain mapping") + _require(cursor.get("schema") == CURSOR_SCHEMA, "resume cursor schema changed") + _require(cursor.get("cell_id") == cell_id, "resume cursor cell changed") + expected = self.resume_cursor( + plan=plan, + next_optimizer_step=cursor.get("next_optimizer_step"), + cell_id=cell_id, + ) + _require(cursor == expected, "resume cursor differs from exact R4 semantic boundary") + + def restore_resume_cursor( + self, + cursor: Mapping[str, Any], + *, + plan: Any, + cell_id: str, + ) -> dict[str, Any]: + self.validate_resume_cursor(cursor, plan=plan, cell_id=cell_id) + # R4 load_state_dict replays the R3 predecessor plus all four complete + # sequence/topology package manifests before it accepts the state. + self._train_masker.load_state_dict(cursor["sequence_mask_stream"]["masker_state"]) + if cursor["cell_bits"]["ms"]: + self._ensure_ms_epoch(plan.epoch) + self._restored_cursor = json.loads(_canonical_bytes(cursor).decode("utf-8")) + return json.loads(_canonical_bytes(self._restored_cursor).decode("utf-8")) + + def fixed_development_contract(self, cell_id: str) -> FixedDevelopmentContract: + topology, ms, _ = self._require_materializable_cell(cell_id) + sequence_parent_ids = tuple(row.parent_id for row in self.development_rows) + topology_parent_ids = ( + tuple(row.parent_id for row in self.development_rows if row.topology_available) + if topology + else () + ) + ms_parent_ids: tuple[str, ...] = () + ms_identity_surface: tuple[tuple[int, str, str], ...] = () + if ms: + runtime = self._ensure_ms() + parents = [row for row in self.development_rows if row.ms_available] + ms_parent_ids = tuple(row.parent_id for row in parents) + identities: list[tuple[int, str, str]] = [] + for joined in parents: + parent = runtime.parent_by_id[joined.parent_id] + for row in runtime.rows[parent.row_start : parent.row_start + parent.row_count]: + identities.append((row.row_index, row.parent_id, row.acquisition_sha256)) + ms_identity_surface = tuple(identities) + _require( + len(ms_parent_ids) == 580 and len(ms_identity_surface) == 49_573, + "fixed MS development surface changed", + ) + eligible = { + "sequence": sequence_parent_ids, + "topology": topology_parent_ids, + "ms": ms_parent_ids, + "static": (), + } + surface_sha = _canonical_sha256( + { + "schema": DEVELOPMENT_SCHEMA, + "cell_id": cell_id, + "parent_batch_size": 32, + "development_manifest_sha256": self.receipt["artifacts"]["development_manifest"]["sha256"], + "sequence_topology_r4_runtime_sha256": R4_RUNTIME_SHA256, + "sequence_topology_r4_receipt_sha256": R4_RECEIPT_SHA256, + "sequence_topology_bfs_receipt_sha256": R4_BFS_RECEIPT_SHA256, + "predecessor_receipt_sha256": FROZEN_R3_RUNTIME_RECEIPT_SHA256, + "store_manifest_identity_sha256": self._store.manifest_identity_sha256, + "topology_loss_source_sha256": FROZEN_TOPOLOGY_LOSS_SHA256, + "sequence_masker_state": self._development_masker.state_dict(), + "provenance_fields": list(PROVENANCE_FIELDS), + "eligible_parent_ids": eligible, + "ms_identity_surface": ms_identity_surface, + "ms_mask_stream": ( + { + "runtime_source_sha256": _r2.EXPECTED_SHA256["ms_runtime"], + "seed": 0, + "epoch": 0, + "mode": "development", + } + if ms + else None + ), + "static_stream": None, + "training_authorized": False, + "scientific_launch_authorized": False, + }, + domain=DEVELOPMENT_SCHEMA, + ) + contract = FixedDevelopmentContract( + surface_sha256=surface_sha, + eligible_parent_ids=MappingProxyType(eligible), + ) + contract.validate() + return contract + + +def contract_payload() -> dict[str, Any]: + with NativeEightDataAdapter() as adapter: + return adapter.contract_payload() + + +def contract_sha256() -> str: + with NativeEightDataAdapter() as adapter: + return adapter.contract_sha256 + + +NativeEightDataAdapterError = _r2.NativeEightDataAdapterError + +__all__ = [ + "ADAPTER_RECEIPT_PATH", + "AdamWContract", + "CELL_BITS", + "CELL_ORDER", + "CURSOR_SCHEMA", + "DEVELOPMENT_MANIFEST_PATH", + "DevelopmentBatch", + "DevelopmentResult", + "FixedDevelopmentContract", + "FROZEN_R3_PREDECESSOR_PATH", + "FROZEN_TOPOLOGY_LOSS_SHA256", + "FrozenEpochPlan", + "JOINED_ROOT", + "JoinedParent", + "NativeEightCompositeR5", + "NativeEightConfig", + "NativeEightDataAdapter", + "NativeEightDataAdapterError", + "NativeEightDataAdapterR3Error", + "NativeEightOutput", + "NativeEightProductionExecutor", + "PROVENANCE_FIELDS", + "PlannedMicrobatch", + "R4_BFS_RECEIPT_SHA256", + "R4_RECEIPT_SHA256", + "R4_RUNTIME_SHA256", + "R5_EXECUTOR_MODULE", + "RECEIPT_SCHEMA", + "SCHEMA", + "STEP_SCHEMA", + "StepDiagnostic", + "TRAIN_MANIFEST_PATH", + "contract_payload", + "contract_sha256", + "verify_authorities", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_direct_static_bridge_20260724_r1/review_a5_native_eight_direct_static_bridge_r1.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_direct_static_bridge_20260724_r1/review_a5_native_eight_direct_static_bridge_r1.py new file mode 100644 index 0000000000000000000000000000000000000000..c7ac8982028510180873e9ab5973cd535afb869f --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_direct_static_bridge_20260724_r1/review_a5_native_eight_direct_static_bridge_r1.py @@ -0,0 +1,1001 @@ +"""Validate direct static-v2 R2 and derive a non-persistent compatibility view. + +The native-eight R2 loader predates the direct full-development publication. +Its deep token/null/support checks are still useful, but its receipt field +surface and three preparation status strings are obsolete. This module first +validates the complete direct artifacts and owner amendment exactly. Only +then does it derive a process-local view suitable for the pinned predecessor +loader. The derived view is never serialized. +""" + +from __future__ import annotations + +import copy +from dataclasses import dataclass +import hashlib +import json +import math +import os +from pathlib import Path +import re +import stat +from types import MappingProxyType +from typing import Any, Mapping + + +SCHEMA = "bertose_review_a5_native_eight_direct_static_bridge_20260724_r1" +DIRECT_PUBLICATION_SCHEMA = ( + "bertose_a5_static_v2_direct_development_publication_20260724_r2" +) +DIRECT_PUBLICATION_STATUS = ( + "PASS_DIRECT_FULL_DEVELOPMENT_STATIC_PUBLICATION_READBACK" +) +WRITER_SCHEMA = "bertose_a5_static_v2_postfit_production_writer_20260722_r4" +WRITER_SOURCE_SHA256 = ( + "ceffd07edb6b8b322baecd95e023053ad8c783cc97cdb2edfc03c0b4fdeeaab6" +) +PACKAGE_SCHEMA = "bertose_a5_static_tokens_v2" +PACKAGE_STATUS = "FROZEN_PREPARATION_ONLY" +NULL_SCHEMA = "bertose_a5_static_v2_published_train_only_null_20260722_r4" +NULL_STATUS = "FROZEN_PREPARATION_ONLY_TRAIN_ONLY_STATIC_NULL" +EXPORT_SCHEMA = "bertose_a5_static_v2_direct_train_development_export_20260722_r4" +EXPORT_STATUS = ( + "FROZEN_PREPARATION_ONLY_DIRECT_TRAIN_DEVELOPMENT_RVQ_EXPORT" +) +JOIN_SCHEMA = "bertose_a5_static_v2_direct_state_sequence_join_20260722_r4" +JOIN_STATUS = "PASS_STATE_SPECIFIC_SUCCESSOR_JOIN" +OWNER_AMENDMENT_SCHEMA = ( + "bertose_a5_static_v2_direct_development_publication_owner_" + "amendment_20260724_r1" +) +OWNER_AMENDMENT_FILE_SHA256 = ( + "876a3746653254a812d5607d1115abfa112fcefb0772b3828efcb26865dfaf7d" +) +OWNER_AMENDMENT_RECEIPT_SHA256 = ( + "672d247a416280617634b8f51c7c69716fd7a6fe010db4109fe634b25c531b93" +) + +PREDECESSOR_PUBLICATION_SCHEMA = "bertose_a5_static_v2_postfit_publication_20260722_r4" +PREDECESSOR_PUBLICATION_STATUS = "PASS_IMMUTABLE_REVIEW_POSTFIT_PUBLICATION" +PREDECESSOR_EXPORT_STATUS = "PASS_DIRECT_TRAIN_FULL_DEVELOPMENT_RVQ_EXPORT" + +CLOSED_AUTHORIZATION = MappingProxyType( + { + "ablation_launch_authorized": False, + "affinose_authorized": False, + "downstream_authorized": False, + "nova_submission_authorized": False, + "automatic_promotion_authorized": False, + "capacity_payload_open_authorized": False, + "token_publication_authorized": False, + "owner_promotion_authorized": False, + } +) + +EXPECTED_COUNTS = MappingProxyType( + { + "pretraining_train": { + "parent_count": 22_980, + "state_count": 34_408, + "residue_count": 205_801, + }, + "pretraining_development": { + "parent_count": 5_390, + "state_count": 7_964, + "residue_count": 51_237, + }, + "all": { + "parent_count": 28_370, + "state_count": 42_372, + "residue_count": 257_038, + "token_count": 1_028_152, + }, + } +) + +EXPECTED_AUTHORITY_ROLE_COUNTS = MappingProxyType( + { + "excluded_exact_or_verified_graph_identity": 3_179, + "excluded_later_role_nonfit_identity": 35, + "outside_sequence_authority": 423, + "pretraining_development": 7_964, + "pretraining_train": 34_408, + "static_ineligible": 5_430, + "static_ineligible_incomplete_alpha_beta_pair": 622, + "static_transform_only_exact_development_overlap": 3, + "static_transform_only_exact_excluded_overlap": 2_638, + } +) + +PACKAGE_KEYS = frozenset( + { + "schema", + "status", + "official_submitted_artifacts_modified", + "parents", + "max_static_tokens", + "ordered_parent_ids_sha256", + "ordered_state_ids_sha256", + "export_receipt_sha256", + "null_receipt_sha256", + "authorization", + } +) +EXPORT_KEYS = frozenset( + { + "schema", + "status", + "production_mode", + "selected_checkpoint_semantic_sha256", + "selected_model_state_sha256", + "export_model_state_sha256", + "support_replay_receipt_sha256", + "selected_support_identity_sha256", + "rvq_identity_sha256", + "device_execution_identity_sha256", + "source_authority_file_sha256", + "selected_checkpoint_inference_authority_binding_sha256", + "r6_top_level_python_bundle_sha256", + "complete_development_adapter_source_sha256", + "complete_development_adapter_receipt_sha256", + "source_closure_sha256", + "exact_counts", + "ordered_state_ids_sha256", + "ordered_parent_ids_sha256", + "train_support_identity_sha256", + "ordered_parent_inference_receipt_sha256", + "parent_inference_manifest_sha256", + "development_codes_all_within_train_support", + "development_used_for_support_or_null_fit", + "legacy_selection_capacity_role_split_used", + "caller_supplied_code_path_used", + "null_receipt_sha256", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } +) +NULL_KEYS = frozenset( + { + "schema", + "status", + "production_mode", + "selected_checkpoint_semantic_sha256", + "selected_model_state_sha256", + "export_model_state_sha256", + "support_replay_receipt_sha256", + "selected_support_identity_sha256", + "rvq_identity_sha256", + "device_execution_identity_sha256", + "source_authority_file_sha256", + "selected_checkpoint_inference_authority_binding_sha256", + "r6_top_level_python_bundle_sha256", + "complete_development_adapter_source_sha256", + "complete_development_adapter_receipt_sha256", + "source_closure_sha256", + "train_state_count", + "ordered_train_parent_inference_receipt_sha256", + "train_parent_inference_manifest_sha256", + "development_state_count_read_during_fit", + "fit_used_training_only", + "reversed_train_order_replay_byte_identical", + "support_identity", + "support_identity_sha256", + "probabilities_dtype", + "probabilities_shape", + "probabilities_float64_le_base64", + "probabilities_float64_le_sha256", + "scale", + "scale_hex", + "core_receipt", + "core_receipt_sha256", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } +) +JOIN_KEYS = frozenset( + { + "schema", + "status", + "sequence_row_count", + "static_parent_count", + "parent_identity_and_role_join_passed", + "sequence_ordered_residue_identity_equals_each_state_graph_residue_identity", + "parent_and_state_wurcs_ordered_node_sequence_exact", + "effective_wurcs_join_policy", + "parent_sequence_wurcs_byte_equality_required", + "token_state_count", + "token_parent_count", + "token_graph_tensor_join_recomputed", + "token_residue_order_join_recomputed", + "canonical_state_int64_recomputed", + "token_package_sha256", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } +) +DIRECT_PUBLICATION_KEYS = frozenset( + { + "schema", + "status", + "production_mode", + "predecessor_writer_schema", + "owner_amendment_file_sha256", + "owner_amendment_receipt_sha256", + "historical_held_provenance", + "historical_held_provenance_receipt_sha256", + "selected_handoff_file_sha256", + "selected_handoff_receipt_sha256", + "support_replay_receipt_sha256", + "export_receipt", + "export_receipt_sha256", + "null_receipt_sha256", + "join_receipt", + "join_receipt_sha256", + "parent_inference_manifest_sha256", + "preserved_authority_role_counts", + "token_publication", + "state_publication", + "null_publication", + "traceability_publication", + "receipt_written_last", + "resume_is_verify_or_continue_without_overwrite", + "development_used_for_support_or_null_fit", + "development_used_for_checkpoint_selection_after_amendment", + "model_or_rvq_updated_during_direct_development_encoding", + "native_ablation_data_binding_authorized", + "nova_submission_authorized", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } +) +PREDECESSOR_NULL_KEYS = frozenset( + { + "schema", + "status", + "production_mode", + "selected_checkpoint_semantic_sha256", + "selected_model_state_sha256", + "export_model_state_sha256", + "support_replay_receipt_sha256", + "selected_support_identity_sha256", + "rvq_identity_sha256", + "device_execution_identity_sha256", + "source_authority_file_sha256", + "source_closure_sha256", + "ordered_parent_inference_receipt_sha256", + "train_state_count", + "development_state_count_read_during_fit", + "fit_used_training_only", + "reversed_train_order_replay_byte_identical", + "support_identity", + "support_identity_sha256", + "probabilities_dtype", + "probabilities_shape", + "probabilities_float64_le_base64", + "probabilities_float64_le_sha256", + "scale", + "scale_hex", + "core_receipt", + "core_receipt_sha256", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } +) +PREDECESSOR_PUBLICATION_KEYS = frozenset( + { + "schema", + "status", + "production_mode", + "writer_schema", + "selected_handoff_file_sha256", + "selected_handoff_receipt_sha256", + "support_replay_receipt_sha256", + "export_receipt", + "export_receipt_sha256", + "null_receipt_sha256", + "join_receipt", + "join_receipt_sha256", + "preserved_authority_role_counts", + "token_publication", + "state_publication", + "null_publication", + "traceability_publication", + "receipt_written_last", + "resume_is_verify_or_continue_without_overwrite", + "development_used_for_support_or_null_fit", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } +) +RELEASE_POSTFIT_KEYS = frozenset( + { + "writer_schema", + "writer_source_sha256", + "publication_file_sha256", + "publication_receipt_semantic_sha256", + "token_file_sha256", + "token_package_semantic_sha256", + "token_export_receipt_sha256", + "token_null_receipt_sha256", + "null_file_sha256", + "null_receipt_semantic_sha256", + "export_receipt_semantic_sha256", + "join_receipt_semantic_sha256", + "selected_checkpoint_semantic_sha256", + "selected_model_state_sha256", + "export_model_state_sha256", + "support_replay_receipt_sha256", + "selected_support_identity_sha256", + "rvq_identity_sha256", + "device_execution_identity_sha256", + "source_authority_file_sha256", + "source_closure_sha256", + "ordered_parent_inference_receipt_sha256", + "ordered_parent_ids_sha256", + "ordered_state_ids_sha256", + "active_counts", + "authority_role_counts", + "sequence_ordered_residue_identity_equals_each_state_graph_residue_identity", + "parent_and_state_wurcs_ordered_node_sequence_exact", + "parent_sequence_wurcs_byte_equality_required", + "development_used_for_support_or_null_fit", + "excluded_later_role_nonfit_identity_count", + } +) +PUBLICATION_FILE_BINDING_KEYS = frozenset( + { + "absolute_path", + "size_bytes", + "file_sha256", + "mode_octal", + "nlink", + "exclusive_no_overwrite", + "sealed_readback_passed", + "idempotent_identical_reuse_supported", + } +) + +_SHA_RE = re.compile(r"[0-9a-f]{64}\Z") + + +class DirectStaticBridgeError(RuntimeError): + """The direct publication or its in-memory bridge changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise DirectStaticBridgeError(message) + + +def canonical_bytes(value: object) -> bytes: + try: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + except (TypeError, ValueError) as error: + raise DirectStaticBridgeError("value is not canonical JSON") from error + + +def sha256_json(value: object) -> str: + return hashlib.sha256(canonical_bytes(value)).hexdigest() + + +def _sha(value: object, label: str) -> str: + _require( + type(value) is str + and _SHA_RE.fullmatch(value) is not None + and value != "0" * 64, + f"{label} is not SHA-256", + ) + return value + + +def _receipt(value: Mapping[str, Any], *, label: str) -> str: + _require(type(value) is dict, f"{label} is not a dictionary") + unsigned = copy.deepcopy(dict(value)) + signed = _sha(unsigned.pop("receipt_sha256", None), f"{label} receipt") + _require(sha256_json(unsigned) == signed, f"{label} self-hash changed") + return signed + + +def _closed(value: object, label: str) -> None: + _require(dict(value) == dict(CLOSED_AUTHORIZATION), f"{label} authorization changed") + + +def expected_owner_amendment() -> dict[str, Any]: + value: dict[str, Any] = { + "authorization": { + "affinose_authorized": False, + "downstream_evaluation_authorized": False, + "native_ablation_data_binding_authorized": False, + "nova_submission_authorized": False, + "postfit_execution_authorized": True, + "postfit_static_publication_authorized": True, + }, + "development_policy": { + "checkpoint_selection_may_use_direct_development_codes": False, + "development_may_fit_rvq_or_support": False, + "encode_complete_development_once_after_checkpoint_freeze": True, + "model_or_rvq_updates_allowed": False, + }, + "exact_active_counts": copy.deepcopy(dict(EXPECTED_COUNTS)), + "historical_boundary": { + "capacity_graph_or_pdb_payload_opened_before_amendment": False, + "historical_held_parent_count": 1_036, + "historical_held_residue_count": 9_740, + "historical_held_state_count": 1_532, + "preserve_membership_as_provenance": True, + "supersede_as_postfit_publication_gate": True, + }, + "null_and_support_policy": { + "development_used_for_null_fit": False, + "development_used_for_support_fit": False, + "fit_from_pretraining_train_only": True, + }, + "official_submitted_artifacts_modified": False, + "predecessor_policy": { + "complete_development_adapter_source_sha256": ( + "9794d59c8efa0102d56fa26fee7024ada2c4484a4cf54c411e6c3ea471571558" + ), + "postfit_r4_executor_source_sha256": ( + "a3fd9ab11032e5df3de13f5f43be630a703904b78002de8263827eec589acfce" + ), + "postfit_r4_writer_source_sha256": WRITER_SOURCE_SHA256, + "predecessors_remain_unchanged": True, + }, + "schema": OWNER_AMENDMENT_SCHEMA, + "scope": "selected_checkpoint_static_token_export_for_native_eight_only", + "status": ( + "OWNER_DIRECTED_PROSPECTIVE_SUPERSESSION_OF_HISTORICAL_CAPACITY_GATE" + ), + } + value["receipt_sha256"] = sha256_json(value) + return value + + +@dataclass(frozen=True, slots=True) +class BridgeView: + token_package: Mapping[str, Any] + null_receipt: Mapping[str, Any] + publication_receipt: Mapping[str, Any] + released_postfit: Mapping[str, Any] + evidence: Mapping[str, Any] + + +def _historical_provenance(value: object) -> str: + _require(type(value) is dict, "historical held provenance is absent") + _require( + set(value) + == { + "schema", + "status", + "counts", + "ordered_parent_ids_sha256", + "ordered_state_ids_sha256", + "used_as_postfit_publication_gate", + "receipt_sha256", + } + and value["schema"] + == "bertose_a5_static_v2_historical_capacity_membership_provenance_20260724_r2" + and value["status"] == "PRESERVED_AS_PROVENANCE_NOT_AN_EXECUTION_GATE" + and value["counts"] + == {"parent_count": 1_036, "state_count": 1_532, "residue_count": 9_740} + and value["used_as_postfit_publication_gate"] is False, + "historical held provenance changed", + ) + return _receipt(value, label="historical held provenance") + + +def _validate_publication_binding(value: object, *, label: str) -> None: + _require( + type(value) is dict + and set(value) == PUBLICATION_FILE_BINDING_KEYS + and type(value["absolute_path"]) is str + and Path(value["absolute_path"]).is_absolute() + and Path(value["absolute_path"]).name.startswith("review_") + and type(value["size_bytes"]) is int + and value["size_bytes"] > 0 + and _SHA_RE.fullmatch(value["file_sha256"]) is not None + and value["mode_octal"] == "0400" + and value["nlink"] == 1 + and value["exclusive_no_overwrite"] is True + and value["sealed_readback_passed"] is True + and value["idempotent_identical_reuse_supported"] is True, + f"{label} publication binding changed", + ) + + +def build_in_memory_view( + *, + direct_publication: Mapping[str, Any], + token_package: Mapping[str, Any], + null_receipt: Mapping[str, Any], + released_postfit: Mapping[str, Any], + publication_file_sha256: str, + token_file_sha256: str, + null_file_sha256: str, + owner_amendment: Mapping[str, Any], + owner_amendment_file_sha256: str, +) -> BridgeView: + """Validate every direct-only field and derive a predecessor-shaped view.""" + + _sha(publication_file_sha256, "direct publication file") + _sha(token_file_sha256, "direct token file") + _sha(null_file_sha256, "direct null file") + _require( + owner_amendment_file_sha256 == OWNER_AMENDMENT_FILE_SHA256 + and dict(owner_amendment) == expected_owner_amendment() + and _receipt(owner_amendment, label="owner amendment") + == OWNER_AMENDMENT_RECEIPT_SHA256, + "direct-development owner amendment changed", + ) + + direct = copy.deepcopy(dict(direct_publication)) + package = copy.deepcopy(dict(token_package)) + null = copy.deepcopy(dict(null_receipt)) + release = copy.deepcopy(dict(released_postfit)) + _require(set(direct) == DIRECT_PUBLICATION_KEYS, "direct publication fields changed") + _require(set(package) == PACKAGE_KEYS, "direct token package fields changed") + _require(set(null) == NULL_KEYS, "direct null fields changed") + _require(set(release) == RELEASE_POSTFIT_KEYS, "release postfit fields changed") + export = direct["export_receipt"] + join = direct["join_receipt"] + _require(type(export) is dict and set(export) == EXPORT_KEYS, "direct export fields changed") + _require(type(join) is dict and set(join) == JOIN_KEYS, "direct join fields changed") + + direct_sha = _receipt(direct, label="direct publication") + export_sha = _receipt(export, label="direct export") + null_sha = _receipt(null, label="direct null") + join_sha = _receipt(join, label="direct join") + package_semantic_sha = sha256_json(package) + _closed(direct["authorization"], "direct publication") + _closed(export["authorization"], "direct export") + _closed(null["authorization"], "direct null") + _closed(join["authorization"], "direct join") + _closed(package["authorization"], "direct token package") + + historical_sha = _historical_provenance(direct["historical_held_provenance"]) + for label in ( + "token_publication", + "state_publication", + "null_publication", + "traceability_publication", + ): + _validate_publication_binding(direct[label], label=label) + + _require( + direct["schema"] == DIRECT_PUBLICATION_SCHEMA + and direct["status"] == DIRECT_PUBLICATION_STATUS + and direct["production_mode"] is True + and direct["predecessor_writer_schema"] == WRITER_SCHEMA + and direct["owner_amendment_file_sha256"] == OWNER_AMENDMENT_FILE_SHA256 + and direct["owner_amendment_receipt_sha256"] + == OWNER_AMENDMENT_RECEIPT_SHA256 + and direct["historical_held_provenance_receipt_sha256"] == historical_sha + and direct["receipt_written_last"] is True + and direct["resume_is_verify_or_continue_without_overwrite"] is True + and direct["development_used_for_support_or_null_fit"] is False + and direct["development_used_for_checkpoint_selection_after_amendment"] + is False + and direct["model_or_rvq_updated_during_direct_development_encoding"] + is False + and direct["native_ablation_data_binding_authorized"] is False + and direct["nova_submission_authorized"] is False + and direct["official_submitted_artifacts_modified"] is False, + "direct publication policy or status changed", + ) + _require( + package["schema"] == PACKAGE_SCHEMA + and package["status"] == PACKAGE_STATUS + and package["official_submitted_artifacts_modified"] is False + and type(package["parents"]) is dict + and bool(package["parents"]) + and type(package["max_static_tokens"]) is int + and package["max_static_tokens"] > 0, + "direct token package policy changed", + ) + _require( + null["schema"] == NULL_SCHEMA + and null["status"] == NULL_STATUS + and null["production_mode"] is True + and null["development_state_count_read_during_fit"] == 0 + and null["fit_used_training_only"] is True + and null["reversed_train_order_replay_byte_identical"] is True + and null["train_state_count"] + == EXPECTED_COUNTS["pretraining_train"]["state_count"] + and null["official_submitted_artifacts_modified"] is False + and type(null["scale"]) is float + and math.isfinite(null["scale"]) + and null["scale"] > 0.0 + and null["scale_hex"] == null["scale"].hex(), + "direct train-only null policy or status changed", + ) + _require( + export["schema"] == EXPORT_SCHEMA + and export["status"] == EXPORT_STATUS + and export["production_mode"] is True + and export["exact_counts"] == dict(EXPECTED_COUNTS) + and export["development_codes_all_within_train_support"] is True + and export["development_used_for_support_or_null_fit"] is False + and export["legacy_selection_capacity_role_split_used"] is False + and export["caller_supplied_code_path_used"] is False + and export["official_submitted_artifacts_modified"] is False, + "direct export policy or status changed", + ) + _require( + join["schema"] == JOIN_SCHEMA + and join["status"] == JOIN_STATUS + and join["sequence_row_count"] == 28_370 + and join["static_parent_count"] == 28_370 + and join["token_state_count"] == 42_372 + and join["token_parent_count"] == 28_370 + and join["parent_identity_and_role_join_passed"] is True + and join[ + "sequence_ordered_residue_identity_equals_each_state_graph_residue_identity" + ] + is True + and join["parent_and_state_wurcs_ordered_node_sequence_exact"] is True + and join["parent_sequence_wurcs_byte_equality_required"] is False + and join["token_graph_tensor_join_recomputed"] is True + and join["token_residue_order_join_recomputed"] is True + and join["canonical_state_int64_recomputed"] is True + and join["official_submitted_artifacts_modified"] is False, + "direct state/sequence join changed", + ) + + for key in ( + "selected_checkpoint_semantic_sha256", + "selected_model_state_sha256", + "export_model_state_sha256", + "support_replay_receipt_sha256", + "selected_support_identity_sha256", + "rvq_identity_sha256", + "device_execution_identity_sha256", + "source_authority_file_sha256", + "selected_checkpoint_inference_authority_binding_sha256", + "r6_top_level_python_bundle_sha256", + "complete_development_adapter_source_sha256", + "complete_development_adapter_receipt_sha256", + "source_closure_sha256", + ): + _sha(export[key], f"direct export {key}") + _require(null[key] == export[key], f"direct export/null {key} differs") + _require( + direct["selected_handoff_file_sha256"] + and direct["selected_handoff_receipt_sha256"] + and direct["support_replay_receipt_sha256"] + == export["support_replay_receipt_sha256"] + and direct["export_receipt_sha256"] == export_sha + and direct["null_receipt_sha256"] == null_sha + and direct["join_receipt_sha256"] == join_sha + and direct["parent_inference_manifest_sha256"] + == export["parent_inference_manifest_sha256"] + and direct["preserved_authority_role_counts"] + == dict(EXPECTED_AUTHORITY_ROLE_COUNTS) + and package["export_receipt_sha256"] == export_sha + and package["null_receipt_sha256"] == null_sha + and export["null_receipt_sha256"] == null_sha + and export["ordered_parent_ids_sha256"] + == package["ordered_parent_ids_sha256"] + and export["ordered_state_ids_sha256"] + == package["ordered_state_ids_sha256"] + and join["token_package_sha256"] == package_semantic_sha, + "direct publication/token/null/export/join hashes differ", + ) + _require( + direct["token_publication"]["file_sha256"] == token_file_sha256 + and direct["null_publication"]["file_sha256"] == null_file_sha256, + "direct token/null publication file binding differs from launch config", + ) + + expected_release = { + "writer_schema": WRITER_SCHEMA, + "writer_source_sha256": WRITER_SOURCE_SHA256, + "publication_file_sha256": publication_file_sha256, + "publication_receipt_semantic_sha256": direct_sha, + "token_file_sha256": token_file_sha256, + "token_package_semantic_sha256": package_semantic_sha, + "token_export_receipt_sha256": export_sha, + "token_null_receipt_sha256": null_sha, + "null_file_sha256": null_file_sha256, + "null_receipt_semantic_sha256": null_sha, + "export_receipt_semantic_sha256": export_sha, + "join_receipt_semantic_sha256": join_sha, + "selected_checkpoint_semantic_sha256": export[ + "selected_checkpoint_semantic_sha256" + ], + "selected_model_state_sha256": export["selected_model_state_sha256"], + "export_model_state_sha256": export["export_model_state_sha256"], + "support_replay_receipt_sha256": export[ + "support_replay_receipt_sha256" + ], + "selected_support_identity_sha256": export[ + "selected_support_identity_sha256" + ], + "rvq_identity_sha256": export["rvq_identity_sha256"], + "device_execution_identity_sha256": export[ + "device_execution_identity_sha256" + ], + "source_authority_file_sha256": export[ + "source_authority_file_sha256" + ], + "source_closure_sha256": export["source_closure_sha256"], + "ordered_parent_inference_receipt_sha256": export[ + "ordered_parent_inference_receipt_sha256" + ], + "ordered_parent_ids_sha256": package["ordered_parent_ids_sha256"], + "ordered_state_ids_sha256": package["ordered_state_ids_sha256"], + "active_counts": copy.deepcopy(dict(EXPECTED_COUNTS)), + "authority_role_counts": copy.deepcopy( + dict(EXPECTED_AUTHORITY_ROLE_COUNTS) + ), + "sequence_ordered_residue_identity_equals_each_state_graph_residue_identity": True, + "parent_and_state_wurcs_ordered_node_sequence_exact": True, + "parent_sequence_wurcs_byte_equality_required": False, + "development_used_for_support_or_null_fit": False, + "excluded_later_role_nonfit_identity_count": 35, + } + _require(release == expected_release, "external release does not bind direct artifacts") + + compat_null = { + key: copy.deepcopy(null[key]) + for key in PREDECESSOR_NULL_KEYS + if key != "ordered_parent_inference_receipt_sha256" + and key != "receipt_sha256" + } + compat_null["ordered_parent_inference_receipt_sha256"] = export[ + "ordered_parent_inference_receipt_sha256" + ] + compat_null["receipt_sha256"] = sha256_json(compat_null) + _require( + set(compat_null) == PREDECESSOR_NULL_KEYS, + "in-memory predecessor null fields changed", + ) + + compat_export = copy.deepcopy(export) + compat_export["status"] = PREDECESSOR_EXPORT_STATUS + compat_export["null_receipt_sha256"] = compat_null["receipt_sha256"] + compat_export.pop("receipt_sha256") + compat_export["receipt_sha256"] = sha256_json(compat_export) + + compat_package = copy.deepcopy(package) + compat_package["export_receipt_sha256"] = compat_export["receipt_sha256"] + compat_package["null_receipt_sha256"] = compat_null["receipt_sha256"] + compat_package_semantic_sha = sha256_json(compat_package) + + compat_join = copy.deepcopy(join) + compat_join["token_package_sha256"] = compat_package_semantic_sha + compat_join.pop("receipt_sha256") + compat_join["receipt_sha256"] = sha256_json(compat_join) + + compat_publication: dict[str, Any] = { + "schema": PREDECESSOR_PUBLICATION_SCHEMA, + "status": PREDECESSOR_PUBLICATION_STATUS, + "production_mode": True, + "writer_schema": WRITER_SCHEMA, + "selected_handoff_file_sha256": direct[ + "selected_handoff_file_sha256" + ], + "selected_handoff_receipt_sha256": direct[ + "selected_handoff_receipt_sha256" + ], + "support_replay_receipt_sha256": direct[ + "support_replay_receipt_sha256" + ], + "export_receipt": compat_export, + "export_receipt_sha256": compat_export["receipt_sha256"], + "null_receipt_sha256": compat_null["receipt_sha256"], + "join_receipt": compat_join, + "join_receipt_sha256": compat_join["receipt_sha256"], + "preserved_authority_role_counts": copy.deepcopy( + direct["preserved_authority_role_counts"] + ), + "token_publication": copy.deepcopy(direct["token_publication"]), + "state_publication": copy.deepcopy(direct["state_publication"]), + "null_publication": copy.deepcopy(direct["null_publication"]), + "traceability_publication": copy.deepcopy( + direct["traceability_publication"] + ), + "receipt_written_last": True, + "resume_is_verify_or_continue_without_overwrite": True, + "development_used_for_support_or_null_fit": False, + "official_submitted_artifacts_modified": False, + "authorization": copy.deepcopy(dict(CLOSED_AUTHORIZATION)), + } + compat_publication["receipt_sha256"] = sha256_json(compat_publication) + _require( + set(compat_publication) == PREDECESSOR_PUBLICATION_KEYS, + "in-memory predecessor publication fields changed", + ) + + compat_release = copy.deepcopy(release) + compat_release.update( + { + "publication_receipt_semantic_sha256": compat_publication[ + "receipt_sha256" + ], + "token_package_semantic_sha256": compat_package_semantic_sha, + "token_export_receipt_sha256": compat_export["receipt_sha256"], + "token_null_receipt_sha256": compat_null["receipt_sha256"], + "null_receipt_semantic_sha256": compat_null["receipt_sha256"], + "export_receipt_semantic_sha256": compat_export["receipt_sha256"], + "join_receipt_semantic_sha256": compat_join["receipt_sha256"], + } + ) + evidence: dict[str, Any] = { + "schema": SCHEMA, + "direct_publication_file_sha256": publication_file_sha256, + "direct_publication_receipt_sha256": direct_sha, + "direct_token_file_sha256": token_file_sha256, + "direct_token_package_semantic_sha256": package_semantic_sha, + "direct_null_file_sha256": null_file_sha256, + "direct_null_receipt_sha256": null_sha, + "direct_export_receipt_sha256": export_sha, + "direct_join_receipt_sha256": join_sha, + "owner_amendment_file_sha256": OWNER_AMENDMENT_FILE_SHA256, + "owner_amendment_receipt_sha256": OWNER_AMENDMENT_RECEIPT_SHA256, + "writer_source_sha256": WRITER_SOURCE_SHA256, + "compatibility_view_persisted": False, + "native_ablation_data_binding_authorized_by_source_publication": False, + "nova_submission_authorized_by_source_publication": False, + "official_submitted_artifacts_modified": False, + } + evidence["bridge_evidence_sha256"] = sha256_json(evidence) + return BridgeView( + MappingProxyType(compat_package), + MappingProxyType(compat_null), + MappingProxyType(compat_publication), + MappingProxyType(compat_release), + MappingProxyType(evidence), + ) + + +def read_regular_nofollow( + path: Path, + *, + expected_sha256: str, + label: str, + maximum: int = 64 * 1024 * 1024, +) -> bytes: + """Read an immutable regular file without following any path component.""" + + absolute = Path(path) + _require( + absolute.is_absolute() + and os.path.normpath(os.fspath(absolute)) == os.fspath(absolute) + and hasattr(os, "O_NOFOLLOW") + and hasattr(os, "O_DIRECTORY"), + f"{label} path is not canonical/no-follow capable", + ) + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + file_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + directory_fd = os.open(os.sep, directory_flags) + file_fd: int | None = None + try: + for part in absolute.parts[1:-1]: + child = os.open(part, directory_flags, dir_fd=directory_fd) + os.close(directory_fd) + directory_fd = child + file_fd = os.open(absolute.name, file_flags, dir_fd=directory_fd) + before = os.fstat(file_fd) + _require( + stat.S_ISREG(before.st_mode) + and before.st_nlink == 1 + and before.st_size <= maximum + and before.st_mode & 0o222 == 0, + f"{label} is not one bounded read-only regular file", + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(file_fd, min(1 << 20, remaining)) + _require(bool(chunk), f"{label} truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(file_fd) + _require( + ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) + == ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ), + f"{label} changed during read", + ) + raw = b"".join(chunks) + finally: + if file_fd is not None: + os.close(file_fd) + os.close(directory_fd) + _require( + hashlib.sha256(raw).hexdigest() == _sha(expected_sha256, label), + f"{label} SHA changed", + ) + return raw + + +def validate_bound_publication_files( + direct_publication: Mapping[str, Any], + *, + publication_directory: Path, +) -> Mapping[str, str]: + """Reopen all four files bound by the original direct receipt.""" + + directory = Path(publication_directory) + _require( + directory.is_absolute() and not directory.is_symlink(), + "direct publication directory changed", + ) + observed: dict[str, str] = {} + for label in ( + "token_publication", + "state_publication", + "null_publication", + "traceability_publication", + ): + binding = direct_publication[label] + _validate_publication_binding(binding, label=label) + path = Path(binding["absolute_path"]) + _require(path.parent == directory, f"{label} left the direct output directory") + raw = read_regular_nofollow( + path, + expected_sha256=binding["file_sha256"], + label=label, + maximum=2 * 1024 * 1024 * 1024, + ) + _require( + len(raw) == binding["size_bytes"], + f"{label} size differs from direct receipt", + ) + observed[label] = binding["file_sha256"] + return MappingProxyType(observed) + + +__all__ = [ + "BridgeView", + "CLOSED_AUTHORIZATION", + "DIRECT_PUBLICATION_SCHEMA", + "DIRECT_PUBLICATION_STATUS", + "DirectStaticBridgeError", + "EXPORT_STATUS", + "NULL_STATUS", + "OWNER_AMENDMENT_FILE_SHA256", + "OWNER_AMENDMENT_RECEIPT_SHA256", + "PACKAGE_STATUS", + "SCHEMA", + "WRITER_SOURCE_SHA256", + "build_in_memory_view", + "canonical_bytes", + "expected_owner_amendment", + "read_regular_nofollow", + "sha256_json", + "validate_bound_publication_files", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260727_r19_external_release_runtime_binding/review_a5_native_eight_finalization_runtime_r19.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260727_r19_external_release_runtime_binding/review_a5_native_eight_finalization_runtime_r19.py new file mode 100644 index 0000000000000000000000000000000000000000..c022f5733477fb4be900345c46a63a6d34a12787 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260727_r19_external_release_runtime_binding/review_a5_native_eight_finalization_runtime_r19.py @@ -0,0 +1,631 @@ +#!/usr/bin/env python3 +"""Runtime fixes shared by the R19 controller and every array task. + +R19 leaves the frozen R16 science and R18 preparation sources unchanged. It +rebinds only the actual child wrapper/sbatch paths and replaces the defective +legacy duplicate-receipt/sbatch validators process-locally. +""" + +from __future__ import annotations + +import copy +from datetime import datetime, timezone +import hashlib +import json +import os +from pathlib import Path +import re +import stat +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + + +SCHEMA = "bertose_review_a5_native_eight_finalization_runtime_20260727_r19" +INSTALLATION_STATUS = "PASS_R19_ACTUAL_CHILD_RUNTIME_INSTALLED" +SCHEDULER_SCHEMA = ( + "bertose_review_a5_native_eight_all_family_scheduler_scan_20260727_r19" +) +OUTPUT_SCHEMA = ( + "bertose_review_a5_native_eight_output_namespace_scan_20260727_r19" +) +PREFLIGHT_SCHEMA = ( + "bertose_review_a5_native_eight_live_duplicate_preflight_20260727_r19" +) +SEMANTIC_ARRAY_ID = "bertose-native8-seed43-corrected-20260727-r16" +STABLE_JOB_NAME = "a5-native8-s43-r16" +CELL_ORDER = ( + "A000", + "A100", + "A010", + "A001", + "A110", + "A101", + "A011", + "A111", +) +SQUEUE_ARGV = ( + "/usr/bin/squeue", + "-h", + "-r", + "--states=all", + "-o", + "%F|%K|%j|%T|%r", +) +FRESHNESS_SECONDS = 300 +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") +JOB_RE = re.compile(r"[1-9][0-9]*\Z") +DUPLICATE_JOB_NAME_RE = re.compile( + r"(?:" + r"a5-native8-s43-r[0-9]+" + r"|a5-native-s43-six-p15-r[0-9]+" + r"|a5-phase1-six-submit-r[0-9]+" + r"|a5-native-p15-r[0-9]+" + r"|a5-native-p15-ratul-r[0-9]+" + r")\Z" +) + +ISOLATED_NOVA_ROOT = ( + "/work/ratul1/supantha/" + "bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc" +) +OUTPUT_ROOT = f"{ISOLATED_NOVA_ROOT}/writing/review/multimodal/outputs" +SBATCH_DIRECTIVES = MappingProxyType( + { + "--job-name": STABLE_JOB_NAME, + "--partition": "scavenger", + "--account": "ratul-scavenger", + "--qos": "scavenger", + "--nodes": "1", + "--ntasks": "1", + "--cpus-per-task": "4", + "--gres": "gpu:1", + "--mem": "144G", + "--time": "2-00:00:00", + "--array": "0-7", + "--requeue": None, + "--open-mode": "append", + "--export": "NONE", + "--chdir": ISOLATED_NOVA_ROOT, + "--output": f"{OUTPUT_ROOT}/review_a5_native8_r19_%A_%a.out", + "--error": f"{OUTPUT_ROOT}/review_a5_native8_r19_%A_%a.err", + } +) + + +class NativeEightFinalizationRuntimeR19Error(RuntimeError): + """An R19 runtime, duplicate, path, or receipt invariant changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightFinalizationRuntimeR19Error(message) + + +def canonical_bytes(value: Any) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def sha256_bytes(raw: bytes) -> str: + return hashlib.sha256(raw).hexdigest() + + +def whole_second_utc(value: datetime) -> str: + """Return the exact whole-second syntax accepted by frozen R3.""" + + _require(value.tzinfo is not None, "clock returned a naive datetime") + return value.astimezone(timezone.utc).replace(microsecond=0).strftime( + "%Y-%m-%dT%H:%M:%SZ" + ) + + +def parse_whole_second_utc(value: Any, *, label: str) -> datetime: + _require( + type(value) is str + and re.fullmatch(r"[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z", value) + is not None, + f"{label} is not whole-second UTC", + ) + return datetime.strptime(value, "%Y-%m-%dT%H:%M:%SZ").replace( + tzinfo=timezone.utc + ) + + +def read_regular_nofollow( + path: Path, + *, + expected_sha256: str | None = None, + expected_bytes: int | None = None, + maximum: int = 2 << 30, + require_read_only: bool = True, +) -> bytes: + """Read one canonical file without following any path component.""" + + absolute = Path(path) + _require( + absolute.is_absolute() + and os.path.normpath(os.fspath(absolute)) == os.fspath(absolute) + and hasattr(os, "O_NOFOLLOW") + and hasattr(os, "O_DIRECTORY"), + f"{absolute} is not one canonical no-follow path", + ) + if expected_sha256 is not None: + _require( + SHA_RE.fullmatch(expected_sha256) is not None, + f"{absolute.name} expected SHA is unresolved", + ) + if expected_bytes is not None: + _require( + type(expected_bytes) is int and 0 < expected_bytes <= maximum, + f"{absolute.name} expected size is unresolved", + ) + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + file_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + directory_fd = os.open(os.sep, directory_flags) + file_fd: int | None = None + try: + for component in absolute.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=directory_fd) + os.close(directory_fd) + directory_fd = child + file_fd = os.open(absolute.name, file_flags, dir_fd=directory_fd) + before = os.fstat(file_fd) + _require( + stat.S_ISREG(before.st_mode) + and before.st_nlink == 1 + and 0 < before.st_size <= maximum + and (expected_bytes is None or before.st_size == expected_bytes) + and (not require_read_only or before.st_mode & 0o222 == 0), + f"{absolute.name} type, size, link, or mode changed", + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(file_fd, min(1 << 20, remaining)) + _require(bool(chunk), f"{absolute.name} truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(file_fd) + finally: + if file_fd is not None: + os.close(file_fd) + os.close(directory_fd) + raw = b"".join(chunks) + identity = lambda item: ( + item.st_dev, + item.st_ino, + item.st_size, + item.st_mtime_ns, + item.st_ctime_ns, + item.st_nlink, + ) + _require( + identity(before) == identity(after) + and (expected_sha256 is None or sha256_bytes(raw) == expected_sha256), + f"{absolute.name} changed while read", + ) + return raw + + +def load_canonical_bound_receipt( + binding: Any, *, label: str +) -> tuple[dict[str, Any], bytes]: + _require( + type(binding) is dict + and set(binding) == {"absolute_path", "sha256", "bytes"} + and type(binding["absolute_path"]) is str + and Path(binding["absolute_path"]).is_absolute() + and SHA_RE.fullmatch(str(binding["sha256"])) is not None + and type(binding["bytes"]) is int + and binding["bytes"] > 0, + f"{label} binding changed", + ) + raw = read_regular_nofollow( + Path(binding["absolute_path"]), + expected_sha256=binding["sha256"], + expected_bytes=binding["bytes"], + ) + value = json.loads(raw) + _require( + type(value) is dict and canonical_bytes(value) == raw, + f"{label} is not canonical JSON", + ) + return value, raw + + +def signed(value: Mapping[str, Any], *, schema: str) -> dict[str, Any]: + result = copy.deepcopy(dict(value)) + result["receipt_sha256"] = hashlib.sha256( + schema.encode("ascii") + b"\0" + canonical_bytes(result) + ).hexdigest() + return result + + +def _validate_signed(value: Mapping[str, Any], *, schema: str, label: str) -> None: + unsigned = copy.deepcopy(dict(value)) + observed = unsigned.pop("receipt_sha256", None) + _require( + SHA_RE.fullmatch(str(observed)) is not None + and hashlib.sha256( + schema.encode("ascii") + b"\0" + canonical_bytes(unsigned) + ).hexdigest() + == observed, + f"{label} signature changed", + ) + + +def parse_scheduler_rows(stdout: str) -> frozenset[str]: + """Parse truthful expanded `%F|%K` rows and match all native families.""" + + _require(type(stdout) is str, "scheduler stdout is not text") + matches: set[str] = set() + for line in stdout.splitlines(): + columns = line.split("|") + _require(len(columns) == 5, "scheduler scan row is malformed") + base, task, name, state, reason = columns + _require( + JOB_RE.fullmatch(base) is not None + and (task.isdigit() or task in {"", "N/A"}) + and bool(name) + and bool(state) + and bool(reason), + "scheduler scan fields are malformed", + ) + if DUPLICATE_JOB_NAME_RE.fullmatch(name) is not None: + matches.add(base) + return frozenset(matches) + + +def expected_output_roots(config: Any) -> dict[str, str]: + return { + cell: os.fspath( + Path(config.output_root) + / f"review_native8_{config.semantic_array_id.replace(':', '_')}_{cell}_seed43" + ) + for cell in CELL_ORDER + } + + +def validate_duplicate_preflight_r19( + value: object, *, semantic_array_id: str +) -> Mapping[str, Any]: + """Installed replacement for the defective frozen R3 duplicate validator.""" + + _require( + type(value) is dict + and set(value) + == { + "schema", + "status", + "semantic_array_id", + "cell_order", + "array_spec", + "stable_job_name", + "duplicate_job_name_regex", + "duplicate_family_count", + "active_job_match_count", + "existing_output_root_count", + "scheduler_scan_receipt", + "output_scan_receipt", + "one_copy_only", + "observed_at_utc", + "validated_at_utc", + "freshness_seconds", + "valid_for_immediate_single_submission_only", + "receipt_sha256", + }, + "R19 duplicate preflight fields changed", + ) + observed = parse_whole_second_utc( + value["observed_at_utc"], label="duplicate observation time" + ) + validated = parse_whole_second_utc( + value["validated_at_utc"], label="duplicate validation time" + ) + _require( + value["schema"] == PREFLIGHT_SCHEMA + and value["status"] + == "PASS_NO_ACTIVE_OR_EXISTING_NATIVE_EIGHT_FAMILY_COPY" + and value["semantic_array_id"] == semantic_array_id == SEMANTIC_ARRAY_ID + and value["cell_order"] == list(CELL_ORDER) + and value["array_spec"] == "0-7" + and value["stable_job_name"] == STABLE_JOB_NAME + and value["duplicate_job_name_regex"] + == DUPLICATE_JOB_NAME_RE.pattern + and value["duplicate_family_count"] == 5 + and value["active_job_match_count"] == 0 + and value["existing_output_root_count"] == 0 + and value["one_copy_only"] is True + and value["freshness_seconds"] == FRESHNESS_SECONDS + and observed <= validated + and (validated - observed).total_seconds() <= FRESHNESS_SECONDS + and value["valid_for_immediate_single_submission_only"] is True, + "R19 duplicate preflight semantics changed", + ) + scheduler, _ = load_canonical_bound_receipt( + value["scheduler_scan_receipt"], label="R19 scheduler scan" + ) + output, _ = load_canonical_bound_receipt( + value["output_scan_receipt"], label="R19 output scan" + ) + _validate_signed(scheduler, schema=SCHEDULER_SCHEMA, label="scheduler scan") + _validate_signed(output, schema=OUTPUT_SCHEMA, label="output scan") + _require( + set(scheduler) + == { + "schema", + "status", + "semantic_array_id", + "stable_job_name", + "duplicate_job_name_regex", + "duplicate_family_count", + "captured_at_utc", + "command_argv", + "return_code", + "stdout", + "stderr", + "matching_array_ids", + "active_array_match_count", + "receipt_sha256", + } + and scheduler["schema"] == SCHEDULER_SCHEMA + and scheduler["status"] == "PASS_NO_NATIVE_FAMILY_ARRAY" + and scheduler["semantic_array_id"] == semantic_array_id + and scheduler["stable_job_name"] == STABLE_JOB_NAME + and scheduler["duplicate_job_name_regex"] + == DUPLICATE_JOB_NAME_RE.pattern + and scheduler["duplicate_family_count"] == 5 + and scheduler["captured_at_utc"] == value["observed_at_utc"] + and scheduler["command_argv"] == list(SQUEUE_ARGV) + and scheduler["return_code"] == 0 + and scheduler["stderr"] == "" + and scheduler["matching_array_ids"] == [] + and scheduler["active_array_match_count"] == 0 + and not parse_scheduler_rows(scheduler["stdout"]), + "R19 scheduler scan changed or found a duplicate", + ) + _require( + set(output) + == { + "schema", + "status", + "semantic_array_id", + "captured_at_utc", + "output_root", + "cell_output_roots", + "existing_output_root_count", + "existing_paths", + "receipt_sha256", + } + and output["schema"] == OUTPUT_SCHEMA + and output["status"] == "PASS_NO_NATIVE_EIGHT_OUTPUT_ROOTS" + and output["semantic_array_id"] == semantic_array_id + and output["captured_at_utc"] == value["observed_at_utc"] + and output["output_root"] == OUTPUT_ROOT + and output["cell_output_roots"] + == { + cell: ( + f"{OUTPUT_ROOT}/review_native8_" + f"{SEMANTIC_ARRAY_ID}_{cell}_seed43" + ) + for cell in CELL_ORDER + } + and output["existing_output_root_count"] == 0 + and output["existing_paths"] == [], + "R19 output scan changed or found an output", + ) + _validate_signed(value, schema=PREFLIGHT_SCHEMA, label="duplicate preflight") + return MappingProxyType(copy.deepcopy(value)) + + +def parse_sbatch_directives_r19(payload: bytes) -> Mapping[str, str | None]: + """Validate the actual R19 child, including its R2 assignment pin.""" + + try: + source = payload.decode("ascii") + except UnicodeDecodeError as error: + raise NativeEightFinalizationRuntimeR19Error( + "R19 sbatch is not ASCII" + ) from error + _require(source.startswith("#!/bin/bash\n"), "R19 sbatch shebang changed") + directives: dict[str, str | None] = {} + for line in source.splitlines(): + if not line.startswith("#SBATCH "): + continue + token = line[len("#SBATCH ") :] + _require( + token.startswith("--") and " " not in token and "\t" not in token, + "R19 sbatch directive spelling changed", + ) + key, separator, value = token.partition("=") + item = value if separator else None + _require(key not in directives, "R19 sbatch directive duplicated") + directives[key] = item + lowered = source.lower() + runtime_relative = ( + "writing/review/multimodal/runtime/" + "a5_native_eight_finalization_controller_20260727_" + "r19_external_release_runtime_binding" + ) + required_assignments = ( + f"PROJECT_ROOT={ISOLATED_NOVA_ROOT}", + "PYTHON=/work/ratul1/supantha/miniconda3/bin/python3.10", + f"WRAPPER=${{PROJECT_ROOT}}/{runtime_relative}/" + "run_review_a5_native_eight_training_r19.py", + f"RUNTIME_SOURCE=${{PROJECT_ROOT}}/{runtime_relative}/" + "review_a5_native_eight_finalization_runtime_r19.py", + ) + binding_assignments = re.findall( + r"(?m)^FINAL_BINDING=\$\{PROJECT_ROOT\}/" + r"(writing/review/multimodal/outputs/review_[^\s]+\.json)$", + source, + ) + config_assignments = re.findall( + r"(?m)^LAUNCH_CONFIG=\$\{PROJECT_ROOT\}/" + r"(writing/review/multimodal/outputs/review_[^\s]+\.json)$", + source, + ) + sbatch_assignments = re.findall( + r"(?m)^SBATCH=\$\{PROJECT_ROOT\}/" + r"(writing/review/multimodal/outputs/review_[^\s]+\.sbatch)$", + source, + ) + required_invocation_fragments = ( + '--runtime-source "${RUNTIME_SOURCE}"', + '--runtime-source-sha256 "${RUNTIME_SOURCE_SHA256}"', + '--runtime-source-bytes "${RUNTIME_SOURCE_BYTES}"', + '--final-binding "${FINAL_BINDING}"', + '--final-binding-sha256 "${FINAL_BINDING_SHA256}"', + '--launch-config "${LAUNCH_CONFIG}"', + '--launch-config-sha256 "${LAUNCH_CONFIG_SHA256}"', + '--sbatch "${SBATCH}"', + '--array-task-id "${SLURM_ARRAY_TASK_ID}"', + "--resume auto", + ) + _require( + directives == dict(SBATCH_DIRECTIVES) + and "0-7%" not in source + and "--constraint" not in directives + and "--nodelist" not in directives + and not any( + token in lowered + for token in ( + "gpu:a100", + "gpu:v100", + "gpu:h100", + "gpu:h200", + "gpu:l40s", + ) + ) + and len( + re.findall( + r"(?m)^LAUNCH_CONFIG_SHA256=[0-9a-f]{64}$", source + ) + ) + == 1 + and all(source.count(item + "\n") == 1 for item in required_assignments) + and len(binding_assignments) == 1 + and len(config_assignments) == 1 + and len(sbatch_assignments) == 1 + and Path(binding_assignments[0]).parent + == Path(config_assignments[0]).parent + == Path(sbatch_assignments[0]).parent + and len( + re.findall(r"(?m)^FINAL_BINDING_SHA256=[0-9a-f]{64}$", source) + ) + == 1 + and len( + re.findall(r"(?m)^RUNTIME_SOURCE_SHA256=[0-9a-f]{64}$", source) + ) + == 1 + and len( + re.findall(r"(?m)^RUNTIME_SOURCE_BYTES=[1-9][0-9]*$", source) + ) + == 1 + and source.count( + 'exec "${PYTHON}" -I -W error "${WRAPPER}"' + ) + == 1 + and source.count( + '--launch-config-sha256 "${LAUNCH_CONFIG_SHA256}"' + ) + == 1 + and source.count('--array-task-id "${SLURM_ARRAY_TASK_ID}"') == 1 + and source.count("--resume auto") == 1 + and all(source.count(item) == 1 for item in required_invocation_fragments) + and not re.search(r"(^|[;&|()\s])sbatch(?:\s|$)", source), + "R19 route, GPU, array, pin, or execution surface changed", + ) + return MappingProxyType(directives) + + +def install_r19_runtime( + r9: ModuleType, + *, + wrapper_path: Path, + sbatch_path: Path, +) -> Mapping[str, Any]: + """Install the same corrected validators controller-side and job-side.""" + + _require(type(r9) is ModuleType, "R19 did not receive the R9 module") + wrapper = Path(wrapper_path) + sbatch = Path(sbatch_path) + _require( + wrapper.is_absolute() + and sbatch.is_absolute() + and wrapper.name.startswith("run_review_") + and sbatch.name.startswith("run_review_"), + "R19 actual child paths changed", + ) + parse_sbatch_directives_r19( + read_regular_nofollow(sbatch, maximum=4 << 20) + ) + r3 = r9._r3 + r2 = r9._r2 + for module in (r3, r2): + module.WRAPPER_SOURCE_PATH = wrapper + module.SBATCH_SOURCE_PATH = sbatch + r9.WRAPPER_PATH = wrapper + r9.SBATCH_PATH = sbatch + r3._parse_sbatch_directives_r3 = parse_sbatch_directives_r19 + r2._validate_duplicate_preflight = validate_duplicate_preflight_r19 + receipt = { + "schema": SCHEMA, + "status": INSTALLATION_STATUS, + "wrapper_path": os.fspath(wrapper), + "sbatch_path": os.fspath(sbatch), + "scheduler_argv": list(SQUEUE_ARGV), + "duplicate_family_count": 5, + "whole_second_utc_required": True, + "pre_submit_validator_installed": True, + "job_side_validator_installed": True, + "actual_child_sbatch_bound": True, + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + receipt["receipt_sha256"] = hashlib.sha256( + SCHEMA.encode("ascii") + b"\0" + canonical_bytes(receipt) + ).hexdigest() + return MappingProxyType(receipt) + + +__all__ = [ + "CELL_ORDER", + "DUPLICATE_JOB_NAME_RE", + "FRESHNESS_SECONDS", + "NativeEightFinalizationRuntimeR19Error", + "OUTPUT_ROOT", + "OUTPUT_SCHEMA", + "PREFLIGHT_SCHEMA", + "SBATCH_DIRECTIVES", + "SCHEDULER_SCHEMA", + "SEMANTIC_ARRAY_ID", + "SQUEUE_ARGV", + "STABLE_JOB_NAME", + "canonical_bytes", + "expected_output_roots", + "install_r19_runtime", + "load_canonical_bound_receipt", + "parse_sbatch_directives_r19", + "parse_scheduler_rows", + "parse_whole_second_utc", + "read_regular_nofollow", + "sha256_bytes", + "signed", + "validate_duplicate_preflight_r19", + "whole_second_utc", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260727_r19_external_release_runtime_binding/run_review_a5_native_eight_training_r19.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260727_r19_external_release_runtime_binding/run_review_a5_native_eight_training_r19.py new file mode 100644 index 0000000000000000000000000000000000000000..851ca077fa390e72f0b746609d6c026da5b10424 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260727_r19_external_release_runtime_binding/run_review_a5_native_eight_training_r19.py @@ -0,0 +1,222 @@ +#!/usr/bin/env python3 +"""Exact-source job entry for the corrected native-eight R19 child.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import os +from pathlib import Path +import re +import stat +import sys +from types import ModuleType +from typing import Any, Sequence + + +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") +PROJECT_ROOT = Path( + "/work/ratul1/supantha/" + "bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc" +) +WRITING_ROOT = PROJECT_ROOT / "writing" +GATE_PATH = ( + WRITING_ROOT + / "review/multimodal/runtime/" + "a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation/" + "review_a5_native_eight_release_successor_r16.py" +) + + +def _read_exact( + path: Path, + *, + expected_sha256: str, + expected_bytes: int, +) -> bytes: + if ( + not path.is_absolute() + or os.path.normpath(os.fspath(path)) != os.fspath(path) + or SHA_RE.fullmatch(expected_sha256) is None + or type(expected_bytes) is not int + or expected_bytes <= 0 + ): + raise RuntimeError("R19 source identity is unresolved") + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + file_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + directory_fd = os.open(os.sep, directory_flags) + file_fd: int | None = None + try: + for component in path.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=directory_fd) + os.close(directory_fd) + directory_fd = child + file_fd = os.open(path.name, file_flags, dir_fd=directory_fd) + before = os.fstat(file_fd) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or before.st_size != expected_bytes + or before.st_mode & 0o222 + ): + raise RuntimeError("R19 source is not one immutable regular file") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(file_fd, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("R19 source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(file_fd) + finally: + if file_fd is not None: + os.close(file_fd) + os.close(directory_fd) + raw = b"".join(chunks) + identity = lambda item: ( + item.st_dev, + item.st_ino, + item.st_size, + item.st_mtime_ns, + item.st_ctime_ns, + item.st_nlink, + ) + if ( + identity(before) != identity(after) + or len(raw) != expected_bytes + or hashlib.sha256(raw).hexdigest() != expected_sha256 + ): + raise RuntimeError("R19 source changed while read") + return raw + + +def _load_module( + path: Path, + *, + expected_sha256: str, + expected_bytes: int, + name: str, +) -> ModuleType: + raw = _read_exact( + path, + expected_sha256=expected_sha256, + expected_bytes=expected_bytes, + ) + module = ModuleType(name) + module.__file__ = os.fspath(path) + module.__package__ = "" + previous = sys.modules.get(name) + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(path), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + if previous is None: + sys.modules.pop(name, None) + else: + sys.modules[name] = previous + raise + return module + + +def _load_binding( + path: Path, *, expected_sha256: str, expected_bytes: int +) -> dict[str, Any]: + raw = _read_exact( + path, + expected_sha256=expected_sha256, + expected_bytes=expected_bytes, + ) + value = json.loads(raw) + canonical = ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + if type(value) is not dict or canonical != raw: + raise RuntimeError("R19 final binding is not canonical JSON") + return value + + +def main(argv: Sequence[str] | None = None) -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--scientific-gate-source-sha256", required=True) + parser.add_argument( + "--scientific-gate-source-bytes", type=int, required=True + ) + parser.add_argument("--runtime-source", type=Path, required=True) + parser.add_argument("--runtime-source-sha256", required=True) + parser.add_argument("--runtime-source-bytes", type=int, required=True) + parser.add_argument("--final-binding", type=Path, required=True) + parser.add_argument("--final-binding-sha256", required=True) + parser.add_argument("--final-binding-bytes", type=int, required=True) + parser.add_argument("--launch-config", type=Path, required=True) + parser.add_argument("--launch-config-sha256", required=True) + parser.add_argument("--sbatch", type=Path, required=True) + parser.add_argument( + "--array-task-id", choices=tuple(map(str, range(8))), required=True + ) + parser.add_argument("--resume", choices=("auto",), required=True) + arguments = parser.parse_args(argv) + if os.fspath(WRITING_ROOT) not in sys.path: + sys.path.insert(0, os.fspath(WRITING_ROOT)) + gate = _load_module( + GATE_PATH, + expected_sha256=arguments.scientific_gate_source_sha256, + expected_bytes=arguments.scientific_gate_source_bytes, + name="_review_a5_native_eight_release_successor_r16_exact_for_r19", + ) + runtime = _load_module( + arguments.runtime_source.absolute(), + expected_sha256=arguments.runtime_source_sha256, + expected_bytes=arguments.runtime_source_bytes, + name="_review_a5_native_eight_finalization_runtime_r19_exact", + ) + binding = _load_binding( + arguments.final_binding.absolute(), + expected_sha256=arguments.final_binding_sha256, + expected_bytes=arguments.final_binding_bytes, + ) + r9, _r11, _binding, _receipt = gate.load_bound_runtime(binding=binding) + runtime.install_r19_runtime( + r9, + wrapper_path=Path(__file__).absolute(), + sbatch_path=arguments.sbatch.absolute(), + ) + gate._r15._r14._r13.validate_singleton_gpu( + environment=os.environ, + torch_module=r9._core.torch, + array_task_id=int(arguments.array_task_id), + ) + return int( + r9.main( + [ + "--launch-config", + os.fspath(arguments.launch_config.absolute()), + "--launch-config-sha256", + arguments.launch_config_sha256, + "--array-task-id", + arguments.array_task_id, + "--resume", + arguments.resume, + ] + ) + ) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/review_a5_native_eight_finalization_runtime_r22.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/review_a5_native_eight_finalization_runtime_r22.py new file mode 100644 index 0000000000000000000000000000000000000000..38b92291295faf38bc6d525c346d275e7fed57c3 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/review_a5_native_eight_finalization_runtime_r22.py @@ -0,0 +1,393 @@ +#!/usr/bin/env python3 +"""Normal-primary R22 route adapter over sealed R21/R19 behavior. + +R22 preserves the corrected R19 duplicate families, one-copy semantics, +resources, array shape, resume behavior, and installed runtime mutations. It +changes only the physical route from Scavenger to normal Ratul. The adapter +validates the physical normal route before projecting its three route fields +to the frozen Scavenger representation expected by inherited validators. +""" + +from __future__ import annotations + +from contextlib import contextmanager +import copy +import hashlib +import os +from pathlib import Path +from types import MappingProxyType, ModuleType +from typing import Any, Iterator, Mapping + +from review.multimodal.runtime.a5_native_eight_finalization_controller_20260727_r19_external_release_runtime_binding import ( + review_a5_native_eight_finalization_runtime_r19 as _r19, +) + + +SCHEMA = "bertose_review_a5_native_eight_finalization_runtime_20260728_r22" +INSTALLATION_STATUS = ( + "PASS_R22_TRUTHFUL_STATIC_CHILD_OVER_FROZEN_R19_RUNTIME_INSTALLED" +) +R19_RUNTIME_SHA256 = ( + "b6266553c075e9b85d221a6278d1ef3ab1d26fbce5de70dbcd4569db42653990" +) +R19_RUNTIME_BYTES = 21_049 +R22_RUNTIME_RELATIVE = ( + "writing/review/multimodal/runtime/" + "a5_native_eight_finalization_controller_20260728_" + "r24_stable_null_jobside" +) +R19_RUNTIME_RELATIVE = ( + "writing/review/multimodal/runtime/" + "a5_native_eight_finalization_controller_20260727_" + "r19_external_release_runtime_binding" +) + +SEMANTIC_ARRAY_ID = _r19.SEMANTIC_ARRAY_ID +STABLE_JOB_NAME = _r19.STABLE_JOB_NAME +CELL_ORDER = _r19.CELL_ORDER +SQUEUE_USER = "supantha" +SQUEUE_ARGV = ( + "/usr/bin/squeue", + "-h", + "-r", + "--states=all", + "-u", + SQUEUE_USER, + "-o", + "%F|%K|%j|%T|%r", +) +FRESHNESS_SECONDS = _r19.FRESHNESS_SECONDS +SHA_RE = _r19.SHA_RE +JOB_RE = _r19.JOB_RE +DUPLICATE_JOB_NAME_RE = _r19.DUPLICATE_JOB_NAME_RE +ISOLATED_NOVA_ROOT = _r19.ISOLATED_NOVA_ROOT +OUTPUT_ROOT = _r19.OUTPUT_ROOT +SCHEDULER_SCHEMA = _r19.SCHEDULER_SCHEMA +OUTPUT_SCHEMA = _r19.OUTPUT_SCHEMA +PREFLIGHT_SCHEMA = _r19.PREFLIGHT_SCHEMA +SBATCH_DIRECTIVES = MappingProxyType( + { + **dict(_r19.SBATCH_DIRECTIVES), + "--partition": "nova", + "--account": "ratul", + "--qos": "normal", + "--output": f"{OUTPUT_ROOT}/review_a5_native8_r22_%A_%a.out", + "--error": f"{OUTPUT_ROOT}/review_a5_native8_r22_%A_%a.err", + } +) +ACTUAL_ROUTE = MappingProxyType( + {"partition": "nova", "account": "ratul", "qos": "normal"} +) +FROZEN_R19_COMPATIBILITY_ROUTE = MappingProxyType( + { + "partition": "scavenger", + "account": "ratul-scavenger", + "qos": "scavenger", + } +) + +canonical_bytes = _r19.canonical_bytes +sha256_bytes = _r19.sha256_bytes +whole_second_utc = _r19.whole_second_utc +parse_whole_second_utc = _r19.parse_whole_second_utc +read_regular_nofollow = _r19.read_regular_nofollow +load_canonical_bound_receipt = _r19.load_canonical_bound_receipt +signed = _r19.signed +parse_scheduler_rows = _r19.parse_scheduler_rows +expected_output_roots = _r19.expected_output_roots +_R19_PARSE_SBATCH = _r19.parse_sbatch_directives_r19 +_FROZEN_R19_SQUEUE_ARGV = _r19.SQUEUE_ARGV +_BOUND_SQUEUE_DEPTH = 0 + + +class NativeEightFinalizationRuntimeR22Error(RuntimeError): + """The frozen R19 behavior or R22 child path adapter changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightFinalizationRuntimeR22Error(message) + + +def _verify_frozen_r19() -> Mapping[str, Any]: + path = Path(_r19.__file__).absolute() + raw = read_regular_nofollow( + path, + expected_sha256=R19_RUNTIME_SHA256, + expected_bytes=R19_RUNTIME_BYTES, + require_read_only=True, + ) + return MappingProxyType( + { + "absolute_path": os.fspath(path), + "sha256": hashlib.sha256(raw).hexdigest(), + "bytes": len(raw), + } + ) + + +@contextmanager +def bounded_r19_scheduler_argv() -> Iterator[None]: + """Temporarily bind inherited R19 scheduler consumers to the R22 argv.""" + + global _BOUND_SQUEUE_DEPTH + outermost = _BOUND_SQUEUE_DEPTH == 0 + previous = _r19.SQUEUE_ARGV + if outermost: + _require( + previous == _FROZEN_R19_SQUEUE_ARGV, + "frozen R19 scheduler argv was already changed", + ) + _r19.SQUEUE_ARGV = SQUEUE_ARGV + else: + _require( + previous == SQUEUE_ARGV, + "nested R22 scheduler argv binding changed", + ) + _BOUND_SQUEUE_DEPTH += 1 + try: + yield + finally: + _BOUND_SQUEUE_DEPTH -= 1 + if outermost: + _r19.SQUEUE_ARGV = previous + + +def require_bounded_r19_scheduler_argv() -> None: + """Fail unless the owner-scoped inherited scheduler binding is active.""" + + _require( + _BOUND_SQUEUE_DEPTH > 0 and _r19.SQUEUE_ARGV == SQUEUE_ARGV, + "R22 bounded scheduler context is not active", + ) + + +def post_submit_squeue_argv(job_id: str) -> tuple[str, ...]: + """Return the one exact owner-and-job-scoped expanded readback command.""" + + _require( + type(job_id) is str and JOB_RE.fullmatch(job_id) is not None, + "post-submit job id changed", + ) + return ( + "/usr/bin/squeue", + "-h", + "-r", + "-u", + SQUEUE_USER, + "-j", + job_id, + "-o", + "%F|%K|%j|%T|%b", + ) + + +def validate_duplicate_preflight_r22( + value: object, *, semantic_array_id: str +) -> Mapping[str, Any]: + """Accept only receipts made by the exact owner-scoped expanded scan.""" + + try: + with bounded_r19_scheduler_argv(): + return _r19.validate_duplicate_preflight_r19( + value, semantic_array_id=semantic_array_id + ) + except _r19.NativeEightFinalizationRuntimeR19Error as error: + raise NativeEightFinalizationRuntimeR22Error( + "R22 bounded duplicate preflight changed" + ) from error + + +def _normalized_r19_sbatch(payload: bytes) -> bytes: + try: + source = payload.decode("ascii") + except UnicodeDecodeError as error: + raise NativeEightFinalizationRuntimeR22Error( + "R22 sbatch is not ASCII" + ) from error + replacements = ( + (R22_RUNTIME_RELATIVE, R19_RUNTIME_RELATIVE), + ( + "run_review_a5_native_eight_training_r22.py", + "run_review_a5_native_eight_training_r19.py", + ), + ( + "review_a5_native_eight_finalization_runtime_r22.py", + "review_a5_native_eight_finalization_runtime_r19.py", + ), + ( + f"{OUTPUT_ROOT}/review_a5_native8_r22_%A_%a.out", + f"{OUTPUT_ROOT}/review_a5_native8_r19_%A_%a.out", + ), + ( + f"{OUTPUT_ROOT}/review_a5_native8_r22_%A_%a.err", + f"{OUTPUT_ROOT}/review_a5_native8_r19_%A_%a.err", + ), + ("#SBATCH --partition=nova\n", "#SBATCH --partition=scavenger\n"), + ( + "#SBATCH --account=ratul\n", + "#SBATCH --account=ratul-scavenger\n", + ), + ("#SBATCH --qos=normal\n", "#SBATCH --qos=scavenger\n"), + ) + _require( + R19_RUNTIME_RELATIVE not in source + and "run_review_a5_native_eight_training_r19.py" not in source + and "review_a5_native_eight_finalization_runtime_r19.py" + not in source + and source.count(R22_RUNTIME_RELATIVE) == 2 + and source.count("run_review_a5_native_eight_training_r22.py") == 1 + and source.count( + "review_a5_native_eight_finalization_runtime_r22.py" + ) + == 1 + and source.count("#SBATCH --partition=nova\n") == 1 + and source.count("#SBATCH --account=ratul\n") == 1 + and source.count("#SBATCH --qos=normal\n") == 1 + and "#SBATCH --partition=scavenger\n" not in source + and "#SBATCH --account=ratul-scavenger\n" not in source + and "#SBATCH --qos=scavenger\n" not in source, + "R22 child paths are absent, duplicated, or mixed with R19", + ) + for old, new in replacements: + source = source.replace(old, new) + return source.encode("ascii") + + +def parse_sbatch_directives_r22( + payload: bytes, +) -> Mapping[str, str | None]: + """Validate the physical normal route through the sealed R19 parser.""" + + _verify_frozen_r19() + normalized = _normalized_r19_sbatch(payload) + try: + directives = _R19_PARSE_SBATCH(normalized) + except _r19.NativeEightFinalizationRuntimeR19Error as error: + raise NativeEightFinalizationRuntimeR22Error( + "R22 normal-primary sbatch contract changed" + ) from error + expected = dict(SBATCH_DIRECTIVES) + observed = dict(directives) + observed["--partition"] = expected["--partition"] + observed["--account"] = expected["--account"] + observed["--qos"] = expected["--qos"] + observed["--output"] = expected["--output"] + observed["--error"] = expected["--error"] + _require( + observed == expected, + "R22 normalized sbatch directives changed", + ) + return MappingProxyType(copy.deepcopy(expected)) + + +def parse_sbatch_directives_r22_frozen_compatibility( + payload: bytes, +) -> Mapping[str, str | None]: + """Return the frozen Scavenger projection after normal-route validation.""" + + parse_sbatch_directives_r22(payload) + return _R19_PARSE_SBATCH(_normalized_r19_sbatch(payload)) + + +def install_r22_runtime( + r9: ModuleType, + *, + wrapper_path: Path, + sbatch_path: Path, +) -> Mapping[str, Any]: + """Install sealed R19 runtime behavior for the actual R22 child.""" + + frozen = _verify_frozen_r19() + sbatch = read_regular_nofollow( + Path(sbatch_path), require_read_only=True + ) + parse_sbatch_directives_r22(sbatch) + original_parser = _r19.parse_sbatch_directives_r19 + _require( + original_parser is _R19_PARSE_SBATCH, + "frozen R19 parser was already changed", + ) + with bounded_r19_scheduler_argv(): + _r19.parse_sbatch_directives_r19 = ( + parse_sbatch_directives_r22_frozen_compatibility + ) + try: + inherited = _r19.install_r19_runtime( + r9, + wrapper_path=Path(wrapper_path), + sbatch_path=Path(sbatch_path), + ) + r9._r2._validate_duplicate_preflight = ( + validate_duplicate_preflight_r22 + ) + finally: + _r19.parse_sbatch_directives_r19 = original_parser + _require( + inherited.get("schema") == _r19.SCHEMA + and inherited.get("status") == _r19.INSTALLATION_STATUS + and inherited.get("scheduler_argv") == list(SQUEUE_ARGV) + and inherited.get("training_authorized") is False + and inherited.get("scientific_launch_authorized") is False + and inherited.get("nova_submission_authorized") is False, + "frozen R19 runtime installation changed", + ) + receipt: dict[str, Any] = { + "schema": SCHEMA, + "status": INSTALLATION_STATUS, + "frozen_r19_runtime": dict(frozen), + "inherited_r19_receipt_sha256": inherited["receipt_sha256"], + "route_and_path_parser_adapter": True, + "actual_route": dict(ACTUAL_ROUTE), + "frozen_r19_compatibility_route": dict( + FROZEN_R19_COMPATIBILITY_ROUTE + ), + "old_r19_wrapper_or_r16_gate_called": False, + "actual_wrapper_path": os.fspath(Path(wrapper_path)), + "actual_sbatch_path": os.fspath(Path(sbatch_path)), + "scheduler_argv": list(SQUEUE_ARGV), + "scheduler_user": SQUEUE_USER, + "scheduler_scan_owner_scoped": True, + "job_side_bounded_duplicate_validator_installed": True, + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + receipt["receipt_sha256"] = hashlib.sha256( + SCHEMA.encode("ascii") + b"\0" + canonical_bytes(receipt) + ).hexdigest() + return MappingProxyType(receipt) + + +__all__ = [ + "ACTUAL_ROUTE", + "CELL_ORDER", + "DUPLICATE_JOB_NAME_RE", + "FRESHNESS_SECONDS", + "FROZEN_R19_COMPATIBILITY_ROUTE", + "ISOLATED_NOVA_ROOT", + "NativeEightFinalizationRuntimeR22Error", + "OUTPUT_ROOT", + "PREFLIGHT_SCHEMA", + "SBATCH_DIRECTIVES", + "SCHEDULER_SCHEMA", + "SEMANTIC_ARRAY_ID", + "SQUEUE_ARGV", + "SQUEUE_USER", + "STABLE_JOB_NAME", + "bounded_r19_scheduler_argv", + "canonical_bytes", + "expected_output_roots", + "install_r22_runtime", + "load_canonical_bound_receipt", + "parse_sbatch_directives_r22", + "parse_sbatch_directives_r22_frozen_compatibility", + "parse_scheduler_rows", + "post_submit_squeue_argv", + "read_regular_nofollow", + "require_bounded_r19_scheduler_argv", + "sha256_bytes", + "signed", + "validate_duplicate_preflight_r22", + "whole_second_utc", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/run_review_a5_native_eight_training_r22.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/run_review_a5_native_eight_training_r22.py new file mode 100644 index 0000000000000000000000000000000000000000..d2c9df5ce4138bcdadca08e50d37b735d2526dc2 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/run_review_a5_native_eight_training_r22.py @@ -0,0 +1,708 @@ +#!/usr/bin/env python3 +"""Exact-source R22 child with a CPU=4 adapter over the frozen R12 check.""" + +from __future__ import annotations + +import argparse +import copy +from contextlib import contextmanager +import hashlib +import json +import os +from pathlib import Path +import re +import stat +import sys +import threading +from types import MappingProxyType, ModuleType +from typing import Any, Callable, Mapping, Sequence + + +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") +PROJECT_ROOT = Path( + "/work/ratul1/supantha/" + "bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc" +) +WRITING_ROOT = PROJECT_ROOT / "writing" +GATE_PATH = ( + WRITING_ROOT + / "review/multimodal/runtime/" + "a5_static_failure_release_chain_20260727_r1_preparation/" + "review_a5_native_static_failure_release_gate_r1.py" +) +BINDING_SCHEMA = ( + "bertose_review_a5_native_eight_truthful_static_runtime_binding_" + "20260728_r22" +) +BINDING_STATUS = ( + "BOUND_TRUTHFUL_STATIC_FAILURE_GATE_R14_R7_CUDA_R19_R21_R22_NORMAL" +) +ACTUAL_ROUTE_ENVIRONMENT = MappingProxyType( + { + "SLURM_JOB_PARTITION": "nova", + "SLURM_JOB_ACCOUNT": "ratul", + "SLURM_JOB_QOS": "normal", + } +) +BINDING_FIELDS = { + "schema", + "status", + "static_release_identity", + "truthful_lineage_coherence", + "frozen_r14_r7_cuda_preserved", + "frozen_r19_runtime_behavior_preserved", + "obsolete_r15_success_only_loader_invoked", + "training_authorized", + "scientific_launch_authorized", + "nova_submission_authorized", + "receipt_sha256", +} +_R21_HISTORICAL_PROVENANCE_EXTRA_FIELDS = frozenset( + { + "graph_or_pdb_payload_opened_while_computing_provenance", + "used_for_training_or_checkpoint_selection", + } +) +_R1_HISTORICAL_PROVENANCE_FIELDS = frozenset( + { + "schema", + "status", + "counts", + "ordered_parent_ids_sha256", + "ordered_state_ids_sha256", + "used_as_postfit_publication_gate", + "receipt_sha256", + } +) +R21_STATIC_NULL_FILE_SHA256 = ( + "661d04d76fcf36d116feb117154eac01e6569e377d4245c07653b28696e1227b" +) +R21_STATIC_NULL_CORE_RECEIPT_SHA256 = ( + "683283e6fb1bd6ba19f80f59f7bf938c751dc8feaab9325e476b9e886829b91d" +) +R21_EXECUTION_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs/" + "review_a5_static_v2_postfit_cpu_finalization_" + "20260728_r21_stable_null_mass_adapter/" + "review_a5_static_v2_postfit_cpu_finalization_execution_r21.json" +) +R21_EXECUTION_FILE_SHA256 = ( + "be55a87986dd6d80942dcd0b17dd75994145ff4a383596314d5b4ee51972a443" +) +R21_EXECUTION_BYTES = 5_306 +R21_EXECUTION_RECEIPT_SHA256 = ( + "c9cb2b267e5b4375f2bc7bbe09c6377ff7c897114c321b09fd7bad176df78dc9" +) +R21_STABLE_AUDIT_SHA256 = ( + "d56d7cd58ac32f0f8218d66db6bb60b5be61fc2c0a99435c84640fc3aa27829f" +) +R21_STATIC_NULL_SLOT_SHA256 = ( + "a90c8005ac4f4ca10bc68505cdb19a8d33255aedcfb0347bce6bb05bfb1f3d99", + "6792eabd175bed56116c9d2a4a00f453decfd8cb727162d24a8dc17c15b8b594", + "4f40a667460f23f6baf04a08cbdf4026e4779c2d99a20d8a7f10f6611c8e2c5a", + "c9eccf5f25a71fa55271a36523ba16bfe7f73501e52260b14a48676cd8a92264", +) +R21_STATIC_NULL_SUM_VECTOR_SHA256 = ( + "0d02995f4c63afc7760b2d4bb703a0edc754bb1159084c4a6da0679128b71c43" +) +R21_STATIC_NULL_PROBABILITY_SUM_HEX = ( + "0x1.fffffffffffddp-1", + "0x1.fffffffffffcap-1", + "0x1.fffffffffffeap-1", + "0x1.fffffffffffcep-1", +) + + +def _validate_r21_stable_null_audit() -> None: + raw = _read_exact( + R21_EXECUTION_PATH, + expected_sha256=R21_EXECUTION_FILE_SHA256, + expected_bytes=R21_EXECUTION_BYTES, + ) + value = json.loads(raw) + unsigned = copy.deepcopy(value) + signed = unsigned.pop("receipt_sha256", None) + stable = value.get("stable_null_mass_adapter") + audit = stable.get("audit") if type(stable) is dict else None + audit_unsigned = copy.deepcopy(audit) + audit_signed = ( + audit_unsigned.pop("audit_sha256", None) + if type(audit_unsigned) is dict + else None + ) + if not ( + type(value) is dict + and _canonical_bytes(value) == raw + and signed == R21_EXECUTION_RECEIPT_SHA256 + and hashlib.sha256(_canonical_bytes(unsigned)).hexdigest() == signed + and value.get("schema") + == "bertose_a5_static_v2_postfit_cpu_finalization_20260728_r21" + and value.get("status") + == "PASS_R20_SHARDS_PUBLISHED_AFTER_STABLE_TRAIN_NULL_MASS_PROOF" + and type(stable) is dict + and stable.get("invocation_count") == 4 + and stable.get("all_order_replays_byte_identical") is True + and stable.get("frozen_null_receipt_sha256") + == R21_STATIC_NULL_CORE_RECEIPT_SHA256 + and stable.get( + "frozen_weighted_counts_probabilities_risks_scale_and_hashes_preserved" + ) + is True + and type(audit) is dict + and audit_signed == R21_STABLE_AUDIT_SHA256 + and hashlib.sha256( + _canonical_bytes(audit_unsigned) + ).hexdigest() + == audit_signed + and audit.get("exact_counts") + == { + "parent_count": 22_980, + "state_count": 34_408, + "residue_count": 205_801, + } + and audit.get("exact_rational_parent_mass_passed") is True + and audit.get("stable_per_code_sum_per_slot") + == [22_980.0] * 4 + and audit.get("stable_per_code_sum_delta_per_slot") + == [0.0] * 4 + and audit.get("stable_parent_structural_mass") == 22_980.0 + and audit.get("stable_parent_structural_delta") == 0.0 + and audit.get("stable_probabilities_used_for_publication") is False + and audit.get("frozen_naive_probabilities_preserved") is True + and tuple(audit.get("naive_probability_sha256_by_slot", ())) + == R21_STATIC_NULL_SLOT_SHA256 + ): + raise RuntimeError("R21 stable-null audit identity changed") + + +@contextmanager +def r21_historical_provenance_compatibility(r9: Any): + """Validate R21's stricter false claims during the training process.""" + + bridge = r9._r8._bridge + original = bridge._historical_provenance + + def validate_r21(value: object) -> str: + if not ( + type(value) is dict + and set(value) + == ( + _R1_HISTORICAL_PROVENANCE_FIELDS + | _R21_HISTORICAL_PROVENANCE_EXTRA_FIELDS + ) + and all( + value[field] is False + for field in _R21_HISTORICAL_PROVENANCE_EXTRA_FIELDS + ) + ): + raise RuntimeError( + "R21 historical held-provenance extension changed" + ) + original_receipt = bridge._receipt( + value, label="R21 historical held provenance" + ) + projected = copy.deepcopy(value) + for field in _R21_HISTORICAL_PROVENANCE_EXTRA_FIELDS: + projected.pop(field) + unsigned = copy.deepcopy(projected) + unsigned.pop("receipt_sha256") + projected["receipt_sha256"] = bridge.sha256_json(unsigned) + original(projected) + return original_receipt + + bridge._historical_provenance = validate_r21 + try: + yield + finally: + replaced_while_active = ( + bridge._historical_provenance is not validate_r21 + ) + bridge._historical_provenance = original + if ( + replaced_while_active + or bridge._historical_provenance is not original + ): + raise RuntimeError( + "R21 historical provenance compatibility was not restored" + ) + + +@contextmanager +def r21_static_null_probability_compatibility(r9: Any): + """Accept only the certified R21 binary64 summation residuals.""" + + _validate_r21_stable_null_audit() + r8 = r9._r8 + r2 = r8._r2 + np_module = r9._core.np + original_loader = r8._inherited_static_loader + original_r2_np = r2.np + loader_call_count = 0 + if original_r2_np is not np_module: + raise RuntimeError("R21 R2 NumPy identity changed") + + class CertifiedNumpyProxy: + def __init__(self) -> None: + self.allclose_call_count = 0 + self.accepted_call_count = 0 + + def __getattr__(self, name: str) -> Any: + return getattr(np_module, name) + + def allclose( + self, a: Any, b: Any, *args: Any, **kwargs: Any + ) -> Any: + self.allclose_call_count += 1 + inherited = np_module.allclose(a, b, *args, **kwargs) + observed = np_module.asarray(a) + expected = np_module.asarray(b) + exact_vector = ( + not args + and kwargs == {"rtol": 0.0, "atol": 1e-15} + and observed.shape == (4,) + and observed.dtype == np_module.dtype(" Any: + nonlocal loader_call_count + loader_call_count += 1 + if ( + loader_call_count != 1 + or r8._inherited_static_loader is not certified_loader + or config.static_null_receipt_sha256 + != R21_STATIC_NULL_FILE_SHA256 + or r2.np is not original_r2_np + or threading.current_thread() is not threading.main_thread() + or threading.active_count() != 1 + ): + raise RuntimeError( + "R21 static-null compatibility identity changed" + ) + proxy = CertifiedNumpyProxy() + r2.np = proxy + try: + result = original_loader(cls, config) + finally: + replaced_while_active = r2.np is not proxy + r2.np = original_r2_np + if ( + replaced_while_active + or r2.np is not original_r2_np + ): + raise RuntimeError( + "R21 static-null NumPy proxy was not restored" + ) + if ( + proxy.allclose_call_count != 1 + or proxy.accepted_call_count != 1 + ): + raise RuntimeError( + "R21 static-null allclose call surface changed" + ) + r8._inherited_static_loader = original_loader + return result + + r8._inherited_static_loader = certified_loader + try: + yield + finally: + active_loader = r8._inherited_static_loader + replaced_while_active = ( + active_loader is not certified_loader + and active_loader is not original_loader + ) + r8._inherited_static_loader = original_loader + if ( + replaced_while_active + or r8._inherited_static_loader is not original_loader + or r2.np is not original_r2_np + ): + raise RuntimeError( + "R21 static-null loader compatibility was not restored" + ) + + +def validate_singleton_gpu_r22( + *, + environment: Mapping[str, str], + torch_module: Any, + array_task_id: int, + frozen_validator: Callable[..., Mapping[str, Any]], +) -> Mapping[str, Any]: + """Require the physical normal route and four CPUs, then reuse R12 checks. + + R12 predates the final four-CPU sbatch surface and therefore expects the + legacy value ``8``. Only that one compatibility field is changed in an + immutable ephemeral mapping passed to R12. The live environment is never + changed, and every task, array, job, GPU, and PyTorch CUDA check remains the + exact frozen implementation. + """ + + observed_route = { + key: environment.get(key) + for key in ACTUAL_ROUTE_ENVIRONMENT + } + if observed_route != dict(ACTUAL_ROUTE_ENVIRONMENT): + raise RuntimeError( + "R22 requires actual normal route " + "SLURM_JOB_PARTITION=nova, SLURM_JOB_ACCOUNT=ratul, " + "SLURM_JOB_QOS=normal before frozen R12" + ) + if environment.get("SLURM_CPUS_PER_TASK") != "4": + raise RuntimeError( + "R22 requires actual SLURM_CPUS_PER_TASK=4 before frozen R12" + ) + original = dict(environment) + normalized = dict(original) + normalized["SLURM_CPUS_PER_TASK"] = "8" + if ( + set(normalized) != set(original) + or any( + normalized[key] != value + for key, value in original.items() + if key != "SLURM_CPUS_PER_TASK" + ) + or original.get("SLURM_CPUS_PER_TASK") != "4" + or normalized.get("SLURM_CPUS_PER_TASK") != "8" + ): + raise RuntimeError("R22 CPU-only compatibility mapping changed") + result = frozen_validator( + environment=MappingProxyType(normalized), + torch_module=torch_module, + array_task_id=array_task_id, + ) + if dict(environment) != original: + raise RuntimeError("R22 live Slurm environment was mutated") + return result + + +def _read_exact( + path: Path, + *, + expected_sha256: str, + expected_bytes: int, +) -> bytes: + if ( + not path.is_absolute() + or os.path.normpath(os.fspath(path)) != os.fspath(path) + or SHA_RE.fullmatch(expected_sha256) is None + or type(expected_bytes) is not int + or expected_bytes <= 0 + ): + raise RuntimeError("R22 source identity is unresolved") + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + file_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + directory_fd = os.open(os.sep, directory_flags) + file_fd: int | None = None + try: + for component in path.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=directory_fd) + os.close(directory_fd) + directory_fd = child + file_fd = os.open(path.name, file_flags, dir_fd=directory_fd) + before = os.fstat(file_fd) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or before.st_size != expected_bytes + or before.st_mode & 0o222 + ): + raise RuntimeError("R22 source is not one immutable regular file") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(file_fd, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("R22 source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(file_fd) + finally: + if file_fd is not None: + os.close(file_fd) + os.close(directory_fd) + raw = b"".join(chunks) + identity = lambda item: ( + item.st_dev, + item.st_ino, + item.st_size, + item.st_mtime_ns, + item.st_ctime_ns, + item.st_nlink, + ) + if ( + identity(before) != identity(after) + or len(raw) != expected_bytes + or hashlib.sha256(raw).hexdigest() != expected_sha256 + ): + raise RuntimeError("R22 source changed while read") + return raw + + +def _load_module( + path: Path, + *, + expected_sha256: str, + expected_bytes: int, + name: str, +) -> ModuleType: + raw = _read_exact( + path, + expected_sha256=expected_sha256, + expected_bytes=expected_bytes, + ) + module = ModuleType(name) + module.__file__ = os.fspath(path) + module.__package__ = "" + previous = sys.modules.get(name) + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(path), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + if previous is None: + sys.modules.pop(name, None) + else: + sys.modules[name] = previous + raise + return module + + +def _canonical_bytes(value: Any) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def _load_binding( + path: Path, *, expected_sha256: str, expected_bytes: int +) -> dict[str, Any]: + raw = _read_exact( + path, + expected_sha256=expected_sha256, + expected_bytes=expected_bytes, + ) + value = json.loads(raw) + unsigned = dict(value) if type(value) is dict else {} + signed = unsigned.pop("receipt_sha256", None) + identity = value.get("static_release_identity") if type(value) is dict else None + if ( + type(value) is not dict + or set(value) != BINDING_FIELDS + or _canonical_bytes(value) != raw + or value.get("schema") != BINDING_SCHEMA + or value.get("status") != BINDING_STATUS + or type(identity) is not dict + or set(identity) + != { + "adapter_source_relative", + "adapter_source_sha256", + "adapter_source_bytes", + "binding_relative", + "binding_sha256", + "binding_bytes", + "validator_name", + } + or type(value.get("truthful_lineage_coherence")) is not dict + or value.get("frozen_r14_r7_cuda_preserved") is not True + or value.get("frozen_r19_runtime_behavior_preserved") is not True + or value.get("obsolete_r15_success_only_loader_invoked") is not False + or value.get("training_authorized") is not False + or value.get("scientific_launch_authorized") is not False + or value.get("nova_submission_authorized") is not False + or signed != hashlib.sha256(_canonical_bytes(unsigned)).hexdigest() + ): + raise RuntimeError("R22 final binding changed") + return value + + +def _validate_lineage_coherence( + binding: dict[str, Any], + *, + observed: dict[str, Any], + evidence: Any, + selected_checkpoint_semantic_sha256: str, +) -> None: + coherence = binding["truthful_lineage_coherence"] + certificate = observed.get("lineage_certificate") + postfit = ( + certificate.get("postfit") + if type(certificate) is dict + else None + ) + jobs = ( + certificate.get("jobs") + if type(certificate) is dict + else None + ) + member_keys = { + "token_publication", + "state_publication", + "null_publication", + "traceability_publication", + } + artifact_keys = { + "static_postfit_execution_result": "result_file", + "static_token_package": "token_file", + "static_null_receipt": "null_file", + "static_publication_receipt": "publication_file", + } + expected_artifacts = ( + { + label: postfit.get(certificate_key) + for label, certificate_key in artifact_keys.items() + } + if type(postfit) is dict + else {} + ) + members = ( + postfit.get("publication_member_sha256") + if type(postfit) is dict + else None + ) + if ( + set(coherence) + != { + "static_release_binding_file_sha256", + "static_release_binding_receipt_sha256", + "postfit_job_id", + "selected_best_checkpoint_semantic_sha256", + "certificate_artifacts", + "publication_member_sha256", + } + or coherence["static_release_binding_file_sha256"] + != binding["static_release_identity"]["binding_sha256"] + or coherence["static_release_binding_receipt_sha256"] + != evidence["binding_receipt_sha256"] + or coherence["postfit_job_id"] != evidence["postfit_job_id"] + or coherence["selected_best_checkpoint_semantic_sha256"] + != selected_checkpoint_semantic_sha256 + or type(jobs) is not dict + or jobs.get("postfit", {}).get("job_id") != evidence["postfit_job_id"] + or coherence["certificate_artifacts"] != expected_artifacts + or type(members) is not dict + or set(members) != member_keys + or coherence["publication_member_sha256"] != members + or members["token_publication"] != postfit["token_file"]["sha256"] + or members["state_publication"] != postfit["state_file"]["sha256"] + or members["null_publication"] != postfit["null_file"]["sha256"] + or members["traceability_publication"] + != postfit["traceability_file"]["sha256"] + ): + raise RuntimeError("R22 truthful lineage coherence changed") + + +def main(argv: Sequence[str] | None = None) -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--scientific-gate-source-sha256", required=True) + parser.add_argument( + "--scientific-gate-source-bytes", type=int, required=True + ) + parser.add_argument("--runtime-source", type=Path, required=True) + parser.add_argument("--runtime-source-sha256", required=True) + parser.add_argument("--runtime-source-bytes", type=int, required=True) + parser.add_argument("--final-binding", type=Path, required=True) + parser.add_argument("--final-binding-sha256", required=True) + parser.add_argument("--final-binding-bytes", type=int, required=True) + parser.add_argument("--launch-config", type=Path, required=True) + parser.add_argument("--launch-config-sha256", required=True) + parser.add_argument("--sbatch", type=Path, required=True) + parser.add_argument( + "--array-task-id", choices=tuple(map(str, range(8))), required=True + ) + parser.add_argument("--resume", choices=("auto",), required=True) + arguments = parser.parse_args(argv) + if os.fspath(WRITING_ROOT) not in sys.path: + sys.path.insert(0, os.fspath(WRITING_ROOT)) + gate = _load_module( + GATE_PATH, + expected_sha256=arguments.scientific_gate_source_sha256, + expected_bytes=arguments.scientific_gate_source_bytes, + name="_review_a5_native_static_failure_gate_exact_for_r22", + ) + runtime = _load_module( + arguments.runtime_source.absolute(), + expected_sha256=arguments.runtime_source_sha256, + expected_bytes=arguments.runtime_source_bytes, + name="_review_a5_native_eight_finalization_runtime_r22_exact", + ) + binding = _load_binding( + arguments.final_binding.absolute(), + expected_sha256=arguments.final_binding_sha256, + expected_bytes=arguments.final_binding_bytes, + ) + identity = gate.StaticReleaseIdentity( + **binding["static_release_identity"] + ) + observed, evidence = gate.validate_static_release(identity) + _validate_lineage_coherence( + binding, + observed=observed, + evidence=evidence, + selected_checkpoint_semantic_sha256=( + gate.SELECTED_BEST_CHECKPOINT_SEMANTIC_SHA256 + ), + ) + r9, _r11, _bound, _receipt = gate.load_truthful_bound_runtime( + identity=identity + ) + runtime.install_r22_runtime( + r9, + wrapper_path=Path(__file__).absolute(), + sbatch_path=arguments.sbatch.absolute(), + ) + validate_singleton_gpu_r22( + environment=os.environ, + torch_module=r9._core.torch, + array_task_id=int(arguments.array_task_id), + frozen_validator=( + gate._r16._r15._r14._r13.validate_singleton_gpu + ), + ) + with ( + r21_historical_provenance_compatibility(r9), + r21_static_null_probability_compatibility(r9), + ): + return int( + r9.main( + [ + "--launch-config", + os.fspath(arguments.launch_config.absolute()), + "--launch-config-sha256", + arguments.launch_config_sha256, + "--array-task-id", + arguments.array_task_id, + "--resume", + arguments.resume, + ] + ) + ) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r1/review_a5_native_eight_hotpath_r1.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r1/review_a5_native_eight_hotpath_r1.py new file mode 100644 index 0000000000000000000000000000000000000000..cad8df21cc293c0b6a650fa23dc39848208dabbf --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r1/review_a5_native_eight_hotpath_r1.py @@ -0,0 +1,917 @@ +"""Isolated FP32 hot-path repair for the corrected native-eight trainer. + +This module changes process-local bindings only. It does not edit predecessor +sources, submit jobs, or authorize training. The numerical training operations +remain the R5 FP32/no-AMP forward, loss, backward, clipping, AdamW, and optional +scheduler operations in their original order. +""" + +from __future__ import annotations + +import hashlib +import json +import math +from pathlib import Path +import re +from types import MappingProxyType, ModuleType +from typing import Any, Mapping, Sequence + +import torch + + +SCHEMA = "bertose_review_a5_native_eight_hotpath_20260725_r1" +STEP_CHAIN_DOMAIN = "bertose-review-a5-native-eight-hotpath-step-chain-r1" +BOUNDARY_SCHEMA = "bertose_review_a5_native_eight_hotpath_boundary_20260725_r1" +PROVENANCE_FIELDS = ( + "sequence_rows", + "roles", + "seq_token_categories", + "topology_rows", + "topology_residue_counts", + "topology_target_counts", +) +EXPECTED_SOURCE_SHA256 = MappingProxyType( + { + "r5_executor": "a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2", + "adapter_r3": "a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e", + "executor_r8": "60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630", + "training_core_r1": "34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf", + } +) +_SHA_RE = re.compile(r"^[0-9a-f]{64}$") +_INSTALLATIONS: dict[int, Mapping[str, Any]] = {} + + +class NativeEightHotpathError(RuntimeError): + """The isolated hot-path binding changed outside its narrow contract.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightHotpathError(message) + + +def _canonical_bytes(value: object) -> bytes: + return ( + json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False) + + "\n" + ).encode("utf-8") + + +def _canonical_sha256(value: object, *, domain: str) -> str: + return hashlib.sha256( + domain.encode("ascii") + b"\0" + _canonical_bytes(value) + ).hexdigest() + + +def _file_sha256(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def source_identity() -> Mapping[str, Any]: + path = Path(__file__).absolute() + payload = path.read_bytes() + return MappingProxyType( + { + "absolute_path": str(path), + "sha256": hashlib.sha256(payload).hexdigest(), + "bytes": len(payload), + } + ) + + +def _module_source_sha256(module: ModuleType) -> str: + path = Path(str(module.__file__)).absolute() + _require(path.is_file(), f"module source is absent: {path}") + return _file_sha256(path) + + +def _training_core_source_sha256(core: ModuleType) -> str: + function = vars(core).get("_run_identity") + _require(callable(function), "training core lacks the R1 run-identity helper") + path = Path(function.__code__.co_filename).absolute() + _require(path.is_file(), "training core source is absent") + return _file_sha256(path) + + +def _find_training_core(root: ModuleType) -> ModuleType: + queue = [root] + visited: set[int] = set() + while queue: + module = queue.pop(0) + if id(module) in visited: + continue + visited.add(id(module)) + namespace = vars(module) + required = { + "run_training", + "_load_r8", + "_make_static_adapter_class", + "_restore_completed_epoch", + "_checkpoint_value", + "_run_identity", + } + if required.issubset(namespace) and all( + getattr(namespace[name], "__globals__", None) is namespace + for name in ( + "_make_static_adapter_class", + "_restore_completed_epoch", + "_checkpoint_value", + "_run_identity", + ) + ): + return module + for name, value in namespace.items(): + if ( + isinstance(value, ModuleType) + and (name == "_core" or name.startswith("_r")) + ): + queue.append(value) + raise NativeEightHotpathError("cannot resolve the exact native-eight training core") + + +def _resolve_components( + root: ModuleType, +) -> tuple[ModuleType, ModuleType, ModuleType, ModuleType]: + core = _find_training_core(root) + execution_r8 = core._load_r8() + _require(isinstance(execution_r8, ModuleType), "R8 execution layer is not a module") + adapter_module = execution_r8._adapter_r3 + r5 = execution_r8._core._r6._r5 + _require( + isinstance(adapter_module, ModuleType) and isinstance(r5, ModuleType), + "R8 adapter/R5 executor graph changed", + ) + observed = { + "r5_executor": _module_source_sha256(r5), + "adapter_r3": _module_source_sha256(adapter_module), + "executor_r8": _module_source_sha256(execution_r8), + "training_core_r1": _training_core_source_sha256(core), + } + _require( + observed == dict(EXPECTED_SOURCE_SHA256), + "native-eight predecessor source identity changed", + ) + _require( + tuple(execution_r8.PROVENANCE_FIELDS) == PROVENANCE_FIELDS + and tuple(adapter_module.PROVENANCE_FIELDS) == PROVENANCE_FIELDS, + "R4 provenance field contract changed", + ) + return core, execution_r8, adapter_module, r5 + + +def _tensor_leaves(value: Any) -> list[torch.Tensor]: + if isinstance(value, torch.Tensor): + return [value] + if isinstance(value, Mapping): + result: list[torch.Tensor] = [] + for child in value.values(): + result.extend(_tensor_leaves(child)) + return result + if isinstance(value, (tuple, list)): + result = [] + for child in value: + result.extend(_tensor_leaves(child)) + return result + return [] + + +def _move_value(value: Any, device: torch.device) -> Any: + if isinstance(value, torch.Tensor): + return value.to(device=device, non_blocking=False) + if isinstance(value, Mapping): + return {key: _move_value(child, device) for key, child in value.items()} + if isinstance(value, tuple): + return tuple(_move_value(child, device) for child in value) + if isinstance(value, list): + return [_move_value(child, device) for child in value] + return value + + +def _cpu_input_surface(micros: Sequence[Any]) -> list[dict[str, Any]]: + return [ + { + "parent_indices": list(micro.parent_indices), + "parent_ids": list(micro.parent_ids), + "model_inputs": micro.model_inputs, + } + for micro in micros + ] + + +def canonical_cpu_input_sha256( + r5: ModuleType, + micros: Sequence[Any], +) -> str: + """Return the predecessor-exact digest and require an all-CPU surface.""" + + tensors = _tensor_leaves(_cpu_input_surface(micros)) + _require( + all(tensor.device.type == "cpu" for tensor in tensors), + "canonical input digest must be computed before host-to-device transfer", + ) + return str(r5._recursive_state_sha256(_cpu_input_surface(micros))) + + +def _pending_payload( + *, + plan: Any, + step_index: int, + micros: Sequence[Any], + input_sha256: str, + audit_surface: Sequence[Mapping[str, Any]], +) -> Mapping[str, Any]: + _require(_SHA_RE.fullmatch(input_sha256) is not None, "input digest is invalid") + return MappingProxyType( + { + "plan_sha256": plan.plan_sha256, + "epoch": plan.epoch, + "optimizer_step_index": step_index, + "parent_indices": tuple( + index for micro in micros for index in micro.parent_indices + ), + "parent_ids": tuple( + parent_id for micro in micros for parent_id in micro.parent_ids + ), + "input_sha256": input_sha256, + "audit_surface": tuple(audit_surface), + "audit_fields_cpu_only": True, + } + ) + + +def bind_cpu_step_digest( + executor: Any, + micros: Sequence[Any], + *, + input_sha256: str | None = None, +) -> str: + """Bind one CPU-computed digest for a direct/test executor step.""" + + plan = executor.bound_plan + _require(plan is not None, "executor has no bound plan") + r5 = getattr(type(executor), "_review_a5_hotpath_r5_module", None) + _require(isinstance(r5, ModuleType), "executor hot-path module is not installed") + observed = ( + canonical_cpu_input_sha256(r5, micros) + if input_sha256 is None + else input_sha256 + ) + executor._review_a5_hotpath_pending_step = _pending_payload( + plan=plan, + step_index=executor.next_optimizer_step, + micros=micros, + input_sha256=observed, + audit_surface=(), + ) + return observed + + +def _finalize_cpu_materialization( + *, + adapter: Any, + value: Mapping[str, Any], + plan: Any, + step_index: int, + device: torch.device, + r5: ModuleType, +) -> dict[str, Any]: + _require( + type(value) is dict and set(value) == {"micros", "step_identity"}, + "materialized step fields changed", + ) + micros = value["micros"] + identity = value["step_identity"] + _require( + type(micros) is tuple and type(identity) is dict and len(micros) == 4, + "materialized CPU step shape changed", + ) + _require( + identity.get("plan_sha256") == plan.plan_sha256 + and identity.get("epoch") == plan.epoch + and identity.get("optimizer_step_index") == step_index, + "materialized CPU identity differs from the requested plan step", + ) + input_sha256 = identity.get("model_input_sha256") + _require( + type(input_sha256) is str and _SHA_RE.fullmatch(input_sha256) is not None, + "materialized CPU input digest is absent", + ) + all_tensors = _tensor_leaves(_cpu_input_surface(micros)) + _require( + all(tensor.device.type == "cpu" for tensor in all_tensors), + "adapter hashed a training input after host-to-device transfer", + ) + + prior = getattr(adapter, "_review_a5_hotpath_pending_step", None) + audit_surface: list[Mapping[str, Any]] = [] + moved_micros: list[Any] = [] + for micro in micros: + audit = { + field: micro.model_inputs[field] + for field in PROVENANCE_FIELDS + if field in micro.model_inputs + } + if audit: + _require( + all( + tensor.device.type == "cpu" + for tensor in _tensor_leaves(audit) + ), + "audit-only provenance reached an accelerator", + ) + audit_surface.append(MappingProxyType(audit)) + numerical = { + key: child + for key, child in micro.model_inputs.items() + if key not in PROVENANCE_FIELDS + } + moved = _move_value(numerical, device) + moved_micros.append( + r5.PlannedMicrobatch( + parent_indices=micro.parent_indices, + parent_ids=micro.parent_ids, + model_inputs=MappingProxyType(moved), + ) + ) + if ( + not any(audit_surface) + and isinstance(prior, Mapping) + and prior.get("plan_sha256") == plan.plan_sha256 + and prior.get("optimizer_step_index") == step_index + ): + audit_surface = list(prior["audit_surface"]) + moved_tuple = tuple(moved_micros) + adapter._review_a5_hotpath_pending_step = _pending_payload( + plan=plan, + step_index=step_index, + micros=moved_tuple, + input_sha256=input_sha256, + audit_surface=audit_surface, + ) + return {"micros": moved_tuple, "step_identity": identity} + + +def _patch_adapter_class( + adapter_class: type, + *, + r5: ModuleType, +) -> None: + if adapter_class.__dict__.get("_review_a5_hotpath_r1_installed", False): + return + original_materialize = adapter_class.materialize_training_step + + def materialize_training_step( + self: Any, + *, + plan: Any, + step_index: int, + cell_id: str, + device: str | torch.device, + ) -> dict[str, Any]: + resolved = torch.device(device) + value = original_materialize( + self, + plan=plan, + step_index=step_index, + cell_id=cell_id, + device=torch.device("cpu"), + ) + return _finalize_cpu_materialization( + adapter=self, + value=value, + plan=plan, + step_index=step_index, + device=resolved, + r5=r5, + ) + + def contract_sha256(self: Any) -> str: + value = getattr(self, "_contract_sha256_cached", None) + _require( + type(value) is str and _SHA_RE.fullmatch(value) is not None, + "adapter cached contract digest is absent", + ) + return value + + adapter_class._review_a5_hotpath_original_materialize_training_step = ( + original_materialize + ) + adapter_class.materialize_training_step = materialize_training_step + adapter_class.contract_sha256 = property(contract_sha256) + adapter_class._review_a5_hotpath_r1_installed = True + + +def _consume_pending_step(executor: Any, plan: Any, micros: Sequence[Any]) -> str: + pending = getattr(executor, "_review_a5_hotpath_pending_step", None) + owner = executor + if pending is None: + adapter = getattr(executor.model, "_review_a5_r8_data_adapter", None) + pending = getattr(adapter, "_review_a5_hotpath_pending_step", None) + owner = adapter + _require(isinstance(pending, Mapping), "pre-transfer CPU input digest is absent") + expected_indices = tuple( + index for micro in micros for index in micro.parent_indices + ) + expected_ids = tuple( + parent_id for micro in micros for parent_id in micro.parent_ids + ) + _require( + pending.get("plan_sha256") == plan.plan_sha256 + and pending.get("epoch") == plan.epoch + and pending.get("optimizer_step_index") == executor.next_optimizer_step + and pending.get("parent_indices") == expected_indices + and pending.get("parent_ids") == expected_ids + and pending.get("audit_fields_cpu_only") is True, + "pre-transfer CPU input identity differs from the executable step", + ) + input_sha256 = pending.get("input_sha256") + _require( + type(input_sha256) is str and _SHA_RE.fullmatch(input_sha256) is not None, + "pre-transfer CPU input digest is invalid", + ) + owner._review_a5_hotpath_pending_step = None + return input_sha256 + + +def _step_chain_before(executor: Any, r5: ModuleType) -> str: + current = getattr(executor, "_review_a5_hotpath_state_chain_sha256", None) + if type(current) is str and _SHA_RE.fullmatch(current) is not None: + return current + current = r5.canonical_sha256( + { + "cell_id": executor.cell_id, + "optimizer_contract_sha256": executor.optimizer_contract_sha256, + "runtime_source_sha256": executor.runtime_source_sha256, + "initial_state_anchor": "run_identity_or_resume_boundary_not_yet_bound", + }, + domain=STEP_CHAIN_DOMAIN, + ) + executor._review_a5_hotpath_state_chain_sha256 = current + return current + + +def _build_optimized_execute_step(r5: ModuleType): + def execute_step(self: Any, micros: Sequence[Any]) -> Any: + plan = self.bound_plan + r5._require(plan is not None, "executor has no bound epoch plan") + r5._planner.verify_plan_identity(plan) + r5._require( + 0 <= self.next_optimizer_step < plan.optimizer_step_count, + "executor optimizer cursor is outside the plan", + ) + self._validate_micros(plan, micros) + r5._require( + self.grad_scaler is None and self.max_amp_retries == 0, + "optimized hot path is exact FP32/no-AMP only", + ) + step_index = self.next_optimizer_step + input_sha256 = _consume_pending_step(self, plan, micros) + model_before_sha256 = _step_chain_before(self, r5) + + self.optimizer.zero_grad(set_to_none=True) + self.model.train() + objective_losses: dict[str, Any] = { + objective: ([] if self.coefficients[objective] else None) + for objective in r5.OBJECTIVES + } + objective_sums: dict[str, float | None] = { + objective: (0.0 if self.coefficients[objective] else None) + for objective in r5.OBJECTIVES + } + zero_carrier_micros = dict.fromkeys(r5.OBJECTIVES, 0) + step_bits = plan.step_availability_bits(step_index) + + for micro, (left, right) in zip( + micros, plan.step_micro_slices(step_index) + ): + with self.autocast_context_factory(): + output = self.model(**dict(micro.model_inputs)) + r5._require( + type(output) is r5.NativeEightOutput, + "composite output type changed", + ) + r5._require(output.cell_id == self.cell_id, "composite output cell changed") + micro_bits = step_bits[left:right] + micro_total: torch.Tensor | None = None + for objective in r5.OBJECTIVES: + losses = output.parent_losses[objective] + local_indices = output.loss_parent_indices[objective] + if not self.coefficients[objective]: + r5._require( + losses is None and local_indices is None, + f"disabled {objective} emitted parent losses", + ) + continue + r5._require( + isinstance(losses, torch.Tensor) + and isinstance(local_indices, torch.Tensor) + and losses.ndim == local_indices.ndim == 1 + and losses.shape == local_indices.shape, + f"enabled {objective} parent-loss vector is absent", + ) + r5._require( + torch.isfinite(losses).all().item(), + f"{objective} parent loss is nonfinite", + ) + if objective == "sequence": + expected_global = micro.parent_indices + else: + bit = { + "topology": 0b100, + "ms": 0b010, + "static": 0b001, + }[objective] + expected_global = tuple( + parent_index + for parent_index, flags in zip( + micro.parent_indices, micro_bits + ) + if flags & bit + ) + observed_local = tuple( + int(index) + for index in local_indices.detach().cpu().tolist() + ) + r5._require( + all( + 0 <= index < len(micro.parent_indices) + for index in observed_local + ), + f"{objective} emitted a local parent outside the micro", + ) + observed_global = tuple( + micro.parent_indices[index] for index in observed_local + ) + r5._require( + observed_global == expected_global, + f"{objective} parent-loss identity differs from plan", + ) + if not observed_global: + zero_carrier_micros[objective] += 1 + continue + factor = ( + float(plan.global_factors[objective]) + / self.null_scales[objective] + / r5.SHELL_DENOMINATOR + ) + contribution = losses.sum() * factor + micro_total = ( + contribution + if micro_total is None + else micro_total + contribution + ) + detached_values = [ + float(value) for value in losses.detach().cpu().tolist() + ] + objective_losses[objective].append( + list(zip(observed_global, detached_values)) + ) + objective_sums[objective] = math.fsum( + (float(objective_sums[objective]), *detached_values) + ) + r5._require( + micro_total is not None, + "microbatch produced no active gradient term", + ) + micro_total.backward() + + detached_total, detached_normalized, detached_counts = ( + r5._planner.combine_cell_step_losses( + plan, + cell_id=self.cell_id, + step_index=step_index, + objective_micro_parent_losses=objective_losses, + null_scales=self.null_scales, + ) + ) + r5._require( + math.isfinite(float(detached_total)), + "detached exact planner loss is nonfinite", + ) + active_parameters = [ + parameter + for parameter in self.model.parameters() + if parameter.requires_grad + ] + pre_clip = r5._preclip_gradient_norm(active_parameters) + r5._require( + math.isfinite(pre_clip), + "non-AMP gradient norm is nonfinite", + ) + clip_applied = pre_clip > self.adamw.max_grad_norm + torch.nn.utils.clip_grad_norm_( + active_parameters, + self.adamw.max_grad_norm, + error_if_nonfinite=True, + ) + self.optimizer.step() + if self.scheduler is not None: + self.scheduler.step() + for name, parameter in self.model.named_parameters(): + if not parameter.requires_grad: + r5._require( + parameter.grad is None, + f"disabled parameter {name} received a gradient", + ) + + final_counts = { + objective: int(detached_counts[objective]) + for objective in r5.OBJECTIVES + } + final_normalized = { + objective: ( + None + if detached_normalized[objective] is None + else float(detached_normalized[objective]) + ) + for objective in r5.OBJECTIVES + } + final_total = float(detached_total) + model_after_sha256 = r5.canonical_sha256( + { + "previous_state_chain_sha256": model_before_sha256, + "plan_sha256": plan.plan_sha256, + "optimizer_step_index": step_index, + "input_sha256": input_sha256, + "objective_parent_sums": objective_sums, + "objective_parent_counts": final_counts, + "combined_normalized_loss": final_total, + "pre_clip_grad_norm": pre_clip, + "clip_applied": clip_applied, + }, + domain=STEP_CHAIN_DOMAIN, + ) + self._review_a5_hotpath_state_chain_sha256 = model_after_sha256 + self.optimizer.zero_grad(set_to_none=True) + self.next_optimizer_step += 1 + diagnostic = r5.StepDiagnostic( + epoch=plan.epoch, + optimizer_step_index=step_index, + plan_sha256=plan.plan_sha256, + input_sha256=input_sha256, + objective_parent_counts=MappingProxyType(final_counts), + objective_parent_sums=MappingProxyType(objective_sums), + objective_globally_normalized_losses=MappingProxyType( + final_normalized + ), + combined_normalized_loss=final_total, + zero_carrier_micro_counts=MappingProxyType(zero_carrier_micros), + pre_clip_grad_norm=pre_clip, + clip_applied=clip_applied, + amp_retry_count=0, + amp_skip_observed=False, + model_sha256_before=model_before_sha256, + model_sha256_after=model_after_sha256, + next_optimizer_step=self.next_optimizer_step, + ) + self.diagnostics.append(diagnostic) + return diagnostic + + execute_step.__name__ = "execute_step" + execute_step.__qualname__ = "NativeEightProductionExecutor.execute_step" + execute_step._review_a5_hotpath_r1 = True + return execute_step + + +def _patch_executor(r5: ModuleType) -> None: + executor_class = r5.NativeEightProductionExecutor + if getattr(executor_class, "_review_a5_hotpath_r1_installed", False): + return + executor_class._review_a5_hotpath_original_execute_step = ( + executor_class.execute_step + ) + executor_class._review_a5_hotpath_r5_module = r5 + executor_class.execute_step = _build_optimized_execute_step(r5) + executor_class._review_a5_hotpath_r1_installed = True + + +def revalidate_execution_boundary( + *, + executor: Any, + adapter: Any, + reason: str, + r5: ModuleType | None = None, + adapter_module: ModuleType | None = None, +) -> Mapping[str, Any]: + """Reopen authorities only at startup, resume, and completed-epoch boundaries.""" + + _require( + reason in {"startup", "resume", "completed_epoch"}, + "hot-path boundary reason changed", + ) + r5 = ( + r5 + if r5 is not None + else getattr(type(executor), "_review_a5_hotpath_r5_module", None) + ) + _require(isinstance(r5, ModuleType), "R5 module is absent at boundary") + if adapter_module is None: + adapter_module = getattr(type(adapter), "_review_a5_hotpath_adapter_module", None) + _require( + isinstance(adapter_module, ModuleType), + "adapter module is absent at boundary", + ) + model_authorities = dict(executor.model.reverify_component_authorities()) + execution_authorities = dict(r5.verify_execution_authorities()) + _require( + model_authorities == dict(executor.model._component_bindings) + and execution_authorities == dict(executor.component_bindings), + "live authority set changed at an explicit boundary", + ) + _require( + r5._runtime_source_sha256() == executor.runtime_source_sha256, + "executor source changed at an explicit boundary", + ) + adapter_authorities = dict(adapter.verify_authorities()) + payload = adapter.contract_payload() + contract_sha256 = adapter_module._canonical_sha256( + payload, + domain="bertose-a5-native-eight-data-adapter-contract-r7", + ) + _require( + contract_sha256 == adapter._contract_sha256_cached, + "adapter contract changed at an explicit boundary", + ) + model_state_sha256 = ( + r5._model_state_sha256(executor.model) + if reason in {"resume", "completed_epoch"} + else None + ) + if model_state_sha256 is not None: + executor._review_a5_hotpath_state_chain_sha256 = model_state_sha256 + unsigned = { + "schema": BOUNDARY_SCHEMA, + "reason": reason, + "cell_id": executor.cell_id, + "model_authority_sha256": _canonical_sha256( + model_authorities, + domain=BOUNDARY_SCHEMA + ":model-authorities", + ), + "execution_authority_sha256": _canonical_sha256( + execution_authorities, + domain=BOUNDARY_SCHEMA + ":execution-authorities", + ), + "adapter_authority_sha256": _canonical_sha256( + adapter_authorities, + domain=BOUNDARY_SCHEMA + ":adapter-authorities", + ), + "adapter_contract_sha256": contract_sha256, + "executor_source_sha256": executor.runtime_source_sha256, + "model_state_sha256": model_state_sha256, + "training_authorized": False, + "nova_submission_authorized": False, + } + receipt = MappingProxyType( + { + **unsigned, + "boundary_sha256": _canonical_sha256( + unsigned, domain=BOUNDARY_SCHEMA + ), + } + ) + history = list( + getattr(executor, "_review_a5_hotpath_boundary_receipts", ()) + ) + history.append(receipt) + executor._review_a5_hotpath_boundary_receipts = tuple(history) + return receipt + + +def _patch_training_boundaries( + core: ModuleType, + *, + execution_r8: ModuleType, + adapter_module: ModuleType, + r5: ModuleType, +) -> None: + if getattr(core, "_review_a5_hotpath_r1_boundaries_installed", False): + return + original_factory = core._make_static_adapter_class + original_run_identity = core._run_identity + original_restore = core._restore_completed_epoch + original_checkpoint = core._checkpoint_value + + def make_static_adapter_class(r8: ModuleType, bundle: Any) -> type: + value = original_factory(r8, bundle) + value._review_a5_hotpath_adapter_module = adapter_module + _patch_adapter_class(value, r5=r5) + return value + + def run_identity(*args: Any, **kwargs: Any) -> Any: + executor = kwargs["executor"] + adapter = kwargs["adapter"] + revalidate_execution_boundary( + executor=executor, + adapter=adapter, + reason="startup", + r5=r5, + adapter_module=adapter_module, + ) + value, digest = original_run_identity(*args, **kwargs) + initial = value.get("initial_model_state_sha256") + _require( + type(initial) is str and _SHA_RE.fullmatch(initial) is not None, + "run identity initial model digest is absent", + ) + executor._review_a5_hotpath_state_chain_sha256 = initial + return value, digest + + def restore_completed_epoch(*args: Any, **kwargs: Any) -> None: + original_restore(*args, **kwargs) + revalidate_execution_boundary( + executor=kwargs["executor"], + adapter=kwargs["adapter"], + reason="resume", + r5=r5, + adapter_module=adapter_module, + ) + + def checkpoint_value(*args: Any, **kwargs: Any) -> dict[str, Any]: + executor = kwargs["executor"] + adapter = getattr(executor.model, "_review_a5_r8_data_adapter", None) + _require(adapter is not None, "completed-epoch adapter binding is absent") + revalidate_execution_boundary( + executor=executor, + adapter=adapter, + reason="completed_epoch", + r5=r5, + adapter_module=adapter_module, + ) + return original_checkpoint(*args, **kwargs) + + core._review_a5_hotpath_original_make_static_adapter_class = original_factory + core._review_a5_hotpath_original_run_identity = original_run_identity + core._review_a5_hotpath_original_restore_completed_epoch = original_restore + core._review_a5_hotpath_original_checkpoint_value = original_checkpoint + core._make_static_adapter_class = make_static_adapter_class + core._run_identity = run_identity + core._restore_completed_epoch = restore_completed_epoch + core._checkpoint_value = checkpoint_value + core._review_a5_hotpath_r1_boundaries_installed = True + + +def install_optimized_execution_layer( + r9_module: ModuleType, +) -> Mapping[str, Any]: + """Install the isolated successor into one exact loaded R9 module graph.""" + + _require(isinstance(r9_module, ModuleType), "installer requires a module") + existing = _INSTALLATIONS.get(id(r9_module)) + if existing is not None: + return existing + core, execution_r8, adapter_module, r5 = _resolve_components(r9_module) + _patch_executor(r5) + adapter_class = adapter_module.NativeEightDataAdapter + adapter_class._review_a5_hotpath_adapter_module = adapter_module + _patch_adapter_class(adapter_class, r5=r5) + _patch_training_boundaries( + core, + execution_r8=execution_r8, + adapter_module=adapter_module, + r5=r5, + ) + identity = dict(source_identity()) + receipt = MappingProxyType( + { + "schema": SCHEMA, + "status": "INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED", + "source_sha256": identity["sha256"], + "source_bytes": identity["bytes"], + "predecessor_source_sha256": dict(EXPECTED_SOURCE_SHA256), + "exact_fp32_math_preserved": True, + "checkpoint_semantics_preserved": True, + "per_step_authority_file_reads": 0, + "per_step_model_state_copies": 0, + "per_step_optimizer_state_copies": 0, + "per_step_full_state_hashes": 0, + "cpu_input_digest_before_h2d": True, + "audit_fields_cuda_resident": False, + "boundary_revalidation": [ + "startup", + "resume", + "completed_epoch", + ], + "diagnostic_model_identity": "rolling_step_chain_reanchored_at_state_boundaries", + "prefetch_installed": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + ) + _INSTALLATIONS[id(r9_module)] = receipt + return receipt + + +__all__ = [ + "BOUNDARY_SCHEMA", + "EXPECTED_SOURCE_SHA256", + "NativeEightHotpathError", + "PROVENANCE_FIELDS", + "SCHEMA", + "bind_cpu_step_digest", + "canonical_cpu_input_sha256", + "install_optimized_execution_layer", + "revalidate_execution_boundary", + "source_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/load_review_a5_native_eight_hotpath_r2.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/load_review_a5_native_eight_hotpath_r2.py new file mode 100644 index 0000000000000000000000000000000000000000..91658c250a58a62737a78779a974bf054fc7fc07 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/load_review_a5_native_eight_hotpath_r2.py @@ -0,0 +1,137 @@ +"""Exact-byte loader for the isolated native-eight hot-path R2 source.""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + + +SOURCE_PATH = Path(__file__).absolute().with_name( + "review_a5_native_eight_hotpath_r2.py" +) +SOURCE_SHA256 = "941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98" +SOURCE_BYTES = 32_821 + + +def _read_exact() -> bytes: + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in SOURCE_PATH.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(SOURCE_PATH.name, leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or before.st_size != SOURCE_BYTES + ): + raise RuntimeError("hot-path R2 source size/type changed") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("hot-path R2 source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ): + raise RuntimeError("hot-path R2 source changed during read") + raw = b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + if hashlib.sha256(raw).hexdigest() != SOURCE_SHA256: + raise RuntimeError("hot-path R2 source SHA changed") + return raw + + +def load(*, module_name: str | None = None) -> ModuleType: + raw = _read_exact() + name = module_name or ( + "_review_a5_native_eight_hotpath_r2_" + + SOURCE_SHA256[:20] + ) + existing = sys.modules.get(name) + if existing is not None: + identity = getattr(existing, "__review_loaded_source_identity__", None) + if not isinstance(identity, MappingProxyType) or dict(identity) != { + "sha256": SOURCE_SHA256, + "bytes": SOURCE_BYTES, + }: + raise RuntimeError("hot-path R2 module slot changed") + return existing + module = ModuleType(name) + module.__file__ = os.fspath(SOURCE_PATH) + module.__package__ = "" + module.__review_loaded_source_identity__ = MappingProxyType( + {"sha256": SOURCE_SHA256, "bytes": SOURCE_BYTES} + ) + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +def install_optimized_execution_layer( + r9_module: ModuleType, +) -> Mapping[str, Any]: + """Narrow exact-loader forwarding API consumed by the bound R12 runtime.""" + + return load().install_optimized_execution_layer(r9_module) + + +def source_identity(): + """Return the loaded source identity rather than the loader's own identity.""" + + return load().source_identity() + + +__all__ = [ + "SOURCE_BYTES", + "SOURCE_PATH", + "SOURCE_SHA256", + "install_optimized_execution_layer", + "load", + "source_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/review_a5_native_eight_hotpath_r2.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/review_a5_native_eight_hotpath_r2.py new file mode 100644 index 0000000000000000000000000000000000000000..38a7e5cf04f0109cfbba1314fe03f0c3a9c858c3 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/review_a5_native_eight_hotpath_r2.py @@ -0,0 +1,923 @@ +"""Dual-route FP32 hot-path repair for the corrected native-eight trainer. + +R2 is an isolated, process-local successor to the frozen R1 hot-path package. +It supports both the actual R9/R1 direct-inner route and the optional outer R8 +provenance executor without editing either predecessor on disk. +""" + +from __future__ import annotations + +import copy +import hashlib +import json +import math +import os +from pathlib import Path +import re +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping, Sequence + +import torch + + +SCHEMA = "bertose_review_a5_native_eight_hotpath_20260725_r2" +STEP_CHAIN_DOMAIN = "bertose-review-a5-native-eight-hotpath-step-chain-r2" +PROVENANCE_FIELDS = ( + "sequence_rows", + "roles", + "seq_token_categories", + "topology_rows", + "topology_residue_counts", + "topology_target_counts", +) +R1_HOTPATH_PATH = ( + Path(__file__).absolute().parents[1] + / "a5_native_eight_hotpath_20260725_r1" + / "review_a5_native_eight_hotpath_r1.py" +) +R1_HOTPATH_SHA256 = ( + "3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f" +) +EXPECTED_SOURCE_SHA256 = MappingProxyType( + { + "r5_executor": "a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2", + "adapter_r3": "a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e", + "executor_r8": "60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630", + "training_core_r1": "34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf", + } +) +_SHA_RE = re.compile(r"^[0-9a-f]{64}$") +_INSTALLATIONS: dict[int, Mapping[str, Any]] = {} + + +class NativeEightHotpathR2Error(RuntimeError): + """The R2 hot-path binding changed outside its narrow contract.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightHotpathR2Error(message) + + +def _canonical_bytes(value: object) -> bytes: + return ( + json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False) + + "\n" + ).encode("utf-8") + + +def _canonical_sha256(value: object, *, domain: str) -> str: + return hashlib.sha256( + domain.encode("ascii") + b"\0" + _canonical_bytes(value) + ).hexdigest() + + +def _read_regular_nofollow(path: Path, *, maximum: int) -> bytes: + absolute = Path(path) + _require( + absolute.is_absolute() + and os.path.normpath(os.fspath(absolute)) == os.fspath(absolute) + and hasattr(os, "O_NOFOLLOW") + and hasattr(os, "O_DIRECTORY"), + "source path is not canonical/no-follow capable", + ) + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in absolute.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(absolute.name, leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + _require( + stat.S_ISREG(before.st_mode) and before.st_size <= maximum, + "source is not a bounded regular file", + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + _require(bool(chunk), "source truncated during read") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + _require( + ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + ) + == ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + ), + "source changed during read", + ) + return b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + + +def _load_r1_hotpath() -> ModuleType: + raw = _read_regular_nofollow(R1_HOTPATH_PATH, maximum=4 * 1024 * 1024) + _require( + hashlib.sha256(raw).hexdigest() == R1_HOTPATH_SHA256, + "frozen R1 hot-path source identity changed", + ) + name = "_review_a5_native_eight_hotpath_r1_pinned_for_r2" + existing = sys.modules.get(name) + if existing is not None: + return existing + module = ModuleType(name) + module.__file__ = os.fspath(R1_HOTPATH_PATH) + module.__package__ = "" + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(R1_HOTPATH_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +_r1 = _load_r1_hotpath() + + +def source_identity() -> Mapping[str, Any]: + """Return identity injected by the exact-byte R2 loader, never a path reread.""" + + value = globals().get("__review_loaded_source_identity__") + _require( + isinstance(value, Mapping) + and type(value.get("sha256")) is str + and _SHA_RE.fullmatch(value["sha256"]) is not None + and type(value.get("bytes")) is int + and value["bytes"] > 0, + "R2 must be loaded through its exact-byte loader", + ) + return MappingProxyType(dict(value)) + + +def _module_sha256(module: ModuleType) -> str: + raw = _read_regular_nofollow( + Path(str(module.__file__)).absolute(), maximum=32 * 1024 * 1024 + ) + return hashlib.sha256(raw).hexdigest() + + +def _core_source_sha256(core: ModuleType) -> str: + namespace = vars(core) + function = namespace.get( + "_review_a5_hotpath_r2_original_run_identity", + namespace.get("_run_identity"), + ) + _require(callable(function), "training core lacks the R1 run-identity helper") + raw = _read_regular_nofollow( + Path(function.__code__.co_filename).absolute(), + maximum=32 * 1024 * 1024, + ) + return hashlib.sha256(raw).hexdigest() + + +def _find_training_core(root: ModuleType) -> ModuleType: + queue = [root] + visited: set[int] = set() + required = { + "run_training", + "_load_r8", + "_make_static_adapter_class", + "_restore_completed_epoch", + "_checkpoint_value", + "_run_identity", + } + while queue: + module = queue.pop(0) + if id(module) in visited: + continue + visited.add(id(module)) + namespace = vars(module) + if required.issubset(namespace): + if namespace.get("_review_a5_hotpath_r2_boundaries_installed") is True: + return module + if all( + getattr(namespace[name], "__globals__", None) is namespace + for name in ( + "_make_static_adapter_class", + "_restore_completed_epoch", + "_checkpoint_value", + "_run_identity", + ) + ): + return module + for name, value in namespace.items(): + if ( + isinstance(value, ModuleType) + and (name == "_core" or name.startswith("_r")) + ): + queue.append(value) + raise NativeEightHotpathR2Error("cannot resolve the exact R1 training core") + + +def _resolve_components( + root: ModuleType, +) -> tuple[ModuleType, ModuleType, ModuleType, ModuleType]: + core = _find_training_core(root) + execution_r8 = core._load_r8() + adapter_module = execution_r8._adapter_r3 + r5 = execution_r8._core._r6._r5 + observed = { + "r5_executor": _module_sha256(r5), + "adapter_r3": _module_sha256(adapter_module), + "executor_r8": _module_sha256(execution_r8), + "training_core_r1": _core_source_sha256(core), + } + _require( + observed == dict(EXPECTED_SOURCE_SHA256), + "native-eight predecessor source identity changed", + ) + _require( + tuple(execution_r8.PROVENANCE_FIELDS) == PROVENANCE_FIELDS + and tuple(adapter_module.PROVENANCE_FIELDS) == PROVENANCE_FIELDS, + "six-field provenance contract changed", + ) + return core, execution_r8, adapter_module, r5 + + +def _tensor_leaves(value: Any) -> list[torch.Tensor]: + if isinstance(value, torch.Tensor): + return [value] + if isinstance(value, Mapping): + result: list[torch.Tensor] = [] + for child in value.values(): + result.extend(_tensor_leaves(child)) + return result + if isinstance(value, (tuple, list)): + result = [] + for child in value: + result.extend(_tensor_leaves(child)) + return result + return [] + + +def _move_value(value: Any, device: torch.device) -> Any: + if isinstance(value, torch.Tensor): + return value.to(device=device, non_blocking=False) + if isinstance(value, Mapping): + return {key: _move_value(child, device) for key, child in value.items()} + if isinstance(value, tuple): + return tuple(_move_value(child, device) for child in value) + if isinstance(value, list): + return [_move_value(child, device) for child in value] + return value + + +def _input_surface(micros: Sequence[Any]) -> list[dict[str, Any]]: + return [ + { + "parent_indices": list(micro.parent_indices), + "parent_ids": list(micro.parent_ids), + "model_inputs": micro.model_inputs, + } + for micro in micros + ] + + +def _provenance_surface(micros: Sequence[Any]) -> list[dict[str, Any]]: + return [ + {field: micro.model_inputs[field] for field in PROVENANCE_FIELDS} + for micro in micros + ] + + +def _sanitized_cpu_micros(micros: Sequence[Any], r5: ModuleType) -> tuple[Any, ...]: + return tuple( + r5.PlannedMicrobatch( + parent_indices=micro.parent_indices, + parent_ids=micro.parent_ids, + model_inputs=MappingProxyType( + { + key: value + for key, value in micro.model_inputs.items() + if key not in PROVENANCE_FIELDS + } + ), + ) + for micro in micros + ) + + +def _pending_payload( + *, + plan: Any, + step_index: int, + micros: Sequence[Any], + full_input_sha256: str, + forward_input_sha256: str, + provenance_sha256: str, + per_field_sha256: Mapping[str, str], +) -> Mapping[str, Any]: + for value in ( + full_input_sha256, + forward_input_sha256, + provenance_sha256, + *per_field_sha256.values(), + ): + _require( + type(value) is str and _SHA_RE.fullmatch(value) is not None, + "cached step digest is invalid", + ) + return MappingProxyType( + { + "plan_sha256": plan.plan_sha256, + "epoch": plan.epoch, + "optimizer_step_index": step_index, + "parent_indices": tuple( + index for micro in micros for index in micro.parent_indices + ), + "parent_ids": tuple( + parent_id for micro in micros for parent_id in micro.parent_ids + ), + "full_input_sha256": full_input_sha256, + "forward_input_sha256": forward_input_sha256, + "provenance_sha256": provenance_sha256, + "per_field_sha256": MappingProxyType(dict(per_field_sha256)), + "training_provenance_fields_cpu_only": True, + } + ) + + +def _finalize_cpu_materialization( + *, + adapter: Any, + value: Mapping[str, Any], + plan: Any, + step_index: int, + device: torch.device, + r5: ModuleType, +) -> dict[str, Any]: + _require( + type(value) is dict and set(value) == {"micros", "step_identity"}, + "materialized step fields changed", + ) + micros = value["micros"] + identity = value["step_identity"] + _require( + type(micros) is tuple + and len(micros) == r5._planner.MICROBATCHES_PER_STEP + and all(type(micro) is r5.PlannedMicrobatch for micro in micros) + and type(identity) is dict, + "materialized CPU step shape changed", + ) + _require( + identity.get("plan_sha256") == plan.plan_sha256 + and identity.get("epoch") == plan.epoch + and identity.get("optimizer_step_index") == step_index, + "materialized CPU step differs from the requested plan", + ) + _require( + all( + field in micro.model_inputs + for micro in micros + for field in PROVENANCE_FIELDS + ), + "original adapter omitted a provenance field", + ) + _require( + all( + tensor.device.type == "cpu" + for tensor in _tensor_leaves(_input_surface(micros)) + ), + "original adapter materialized or hashed after H2D", + ) + full_sha256 = r5._recursive_state_sha256(_input_surface(micros)) + _require( + full_sha256 == identity.get("model_input_sha256"), + "full CPU input digest differs from the authoritative identity", + ) + provenance_surface = _provenance_surface(micros) + provenance_sha256 = r5._recursive_state_sha256(provenance_surface) + _require( + provenance_sha256 == identity.get("r4_batch_provenance_sha256"), + "combined CPU provenance digest differs from the authoritative identity", + ) + per_field_sha256 = { + field: r5._recursive_state_sha256( + [micro.model_inputs[field] for micro in micros] + ) + for field in PROVENANCE_FIELDS + } + sanitized_cpu = _sanitized_cpu_micros(micros, r5) + forward_sha256 = r5._recursive_state_sha256(_input_surface(sanitized_cpu)) + + moved_micros: list[Any] = [] + for micro in micros: + numerical = { + key: value + for key, value in micro.model_inputs.items() + if key not in PROVENANCE_FIELDS + } + moved = _move_value(numerical, device) + mixed = dict(moved) + for field in PROVENANCE_FIELDS: + audit_value = micro.model_inputs[field] + _require( + all( + tensor.device.type == "cpu" + for tensor in _tensor_leaves(audit_value) + ), + "training provenance field left CPU", + ) + mixed[field] = audit_value + moved_micros.append( + r5.PlannedMicrobatch( + parent_indices=micro.parent_indices, + parent_ids=micro.parent_ids, + model_inputs=MappingProxyType(mixed), + ) + ) + moved_tuple = tuple(moved_micros) + adapter._review_a5_hotpath_r2_pending_step = _pending_payload( + plan=plan, + step_index=step_index, + micros=moved_tuple, + full_input_sha256=full_sha256, + forward_input_sha256=forward_sha256, + provenance_sha256=provenance_sha256, + per_field_sha256=per_field_sha256, + ) + return {"micros": moved_tuple, "step_identity": identity} + + +def _patch_adapter_class(adapter_class: type, *, r5: ModuleType) -> None: + if adapter_class.__dict__.get("_review_a5_hotpath_r2_installed", False): + return + _require( + not adapter_class.__dict__.get("_review_a5_hotpath_r1_installed", False), + "R2 refuses to layer over an installed R1 adapter patch", + ) + original_materialize = adapter_class.materialize_training_step + + def materialize_training_step( + self: Any, + *, + plan: Any, + step_index: int, + cell_id: str, + device: str | torch.device, + ) -> dict[str, Any]: + resolved = torch.device(device) + value = original_materialize( + self, + plan=plan, + step_index=step_index, + cell_id=cell_id, + device=torch.device("cpu"), + ) + return _finalize_cpu_materialization( + adapter=self, + value=value, + plan=plan, + step_index=step_index, + device=resolved, + r5=r5, + ) + + def contract_sha256(self: Any) -> str: + value = getattr(self, "_contract_sha256_cached", None) + _require( + type(value) is str and _SHA_RE.fullmatch(value) is not None, + "adapter cached contract digest is absent", + ) + return value + + adapter_class._review_a5_hotpath_r2_original_materialize_training_step = ( + original_materialize + ) + adapter_class.materialize_training_step = materialize_training_step + adapter_class.contract_sha256 = property(contract_sha256) + adapter_class._review_a5_hotpath_r2_installed = True + + +def _consume_pending_step( + executor: Any, plan: Any, micros: Sequence[Any] +) -> str: + adapter = getattr(executor.model, "_review_a5_r8_data_adapter", None) + pending = getattr(adapter, "_review_a5_hotpath_r2_pending_step", None) + _require(isinstance(pending, Mapping), "dual-route CPU step identity is absent") + expected_indices = tuple( + index for micro in micros for index in micro.parent_indices + ) + expected_ids = tuple( + parent_id for micro in micros for parent_id in micro.parent_ids + ) + _require( + pending.get("plan_sha256") == plan.plan_sha256 + and pending.get("epoch") == plan.epoch + and pending.get("optimizer_step_index") == executor.next_optimizer_step + and pending.get("parent_indices") == expected_indices + and pending.get("parent_ids") == expected_ids + and pending.get("training_provenance_fields_cpu_only") is True, + "dual-route CPU identity differs from the executable step", + ) + presence = [ + tuple(field in micro.model_inputs for field in PROVENANCE_FIELDS) + for micro in micros + ] + full_route = all(all(row) for row in presence) + forward_route = all(not any(row) for row in presence) + _require( + full_route or forward_route, + "partial provenance presence is forbidden", + ) + digest = pending[ + "full_input_sha256" if full_route else "forward_input_sha256" + ] + _require( + type(digest) is str and _SHA_RE.fullmatch(digest) is not None, + "selected dual-route input digest is invalid", + ) + adapter._review_a5_hotpath_r2_pending_step = None + executor._review_a5_hotpath_r2_last_input_route = ( + "direct_full" if full_route else "outer_r8_sanitized" + ) + return digest + + +def _bind_test_pending(executor: Any, micros: Sequence[Any], r5: ModuleType) -> None: + """Internal fixture helper; production receives pending state from the adapter.""" + + plan = executor.bound_plan + _require(plan is not None, "test executor has no bound plan") + full = r5._recursive_state_sha256(_input_surface(micros)) + provenance = r5._recursive_state_sha256(_provenance_surface(micros)) + sanitized = _sanitized_cpu_micros(micros, r5) + forward = r5._recursive_state_sha256(_input_surface(sanitized)) + per_field = { + field: r5._recursive_state_sha256( + [micro.model_inputs[field] for micro in micros] + ) + for field in PROVENANCE_FIELDS + } + adapter = executor.model._review_a5_r8_data_adapter + adapter._review_a5_hotpath_r2_pending_step = _pending_payload( + plan=plan, + step_index=executor.next_optimizer_step, + micros=micros, + full_input_sha256=full, + forward_input_sha256=forward, + provenance_sha256=provenance, + per_field_sha256=per_field, + ) + + +def _patch_inner_executor(r5: ModuleType) -> None: + executor_class = r5.NativeEightProductionExecutor + if executor_class.__dict__.get("_review_a5_hotpath_r2_installed", False): + return + _require( + not executor_class.__dict__.get("_review_a5_hotpath_r1_installed", False), + "R2 refuses to layer over an installed R1 executor patch", + ) + _r1._consume_pending_step = _consume_pending_step + executor_class._review_a5_hotpath_r2_original_execute_step = ( + executor_class.execute_step + ) + executor_class._review_a5_hotpath_r5_module = r5 + executor_class.execute_step = _r1._build_optimized_execute_step(r5) + executor_class._review_a5_hotpath_r2_installed = True + + +def _build_outer_r8_execute_next_step(execution_r8: ModuleType, r5: ModuleType): + def execute_next_step(self: Any) -> Any: + plan = self.bound_plan + execution_r8._require(plan is not None, "R8 executor has no bound epoch") + step_index = self.next_optimizer_step + materialized = self.data_adapter.materialize_training_step( + plan=plan, + step_index=step_index, + cell_id=self.cell_id, + device=next(self.model.parameters()).device, + ) + execution_r8._require( + isinstance(materialized, Mapping) + and set(materialized) == {"micros", "step_identity"}, + "Adapter R3 materialized-step fields changed", + ) + micros = materialized["micros"] + identity = materialized["step_identity"] + execution_r8._require( + type(micros) is tuple + and len(micros) == r5._planner.MICROBATCHES_PER_STEP + and all(type(value) is execution_r8._core.PlannedMicrobatch for value in micros), + "Adapter R3 did not return the frozen microbatch surface", + ) + base_fields = { + "schema", + "adapter_contract_sha256", + "plan_sha256", + "seed", + "epoch", + "optimizer_step_index", + "parent_indices", + "parent_ids", + "availability_bits_hex", + "sequence_stream_sha256", + "topology_surface_sha256", + "ms_stream_sha256", + "static_stream_sha256", + "model_input_sha256", + "training_authorized", + "scientific_launch_authorized", + "step_identity_sha256", + } + r4_fields = { + "sequence_topology_r4_runtime_sha256", + "sequence_topology_r4_receipt_sha256", + "sequence_topology_bfs_receipt_sha256", + "topology_loss_source_sha256", + "r4_batch_provenance_sha256", + } + execution_r8._require( + type(identity) is dict and set(identity) == base_fields | r4_fields, + "Adapter R3 step identity fields changed", + ) + identity_sha = execution_r8._r8_step_identity_sha256(identity) + expected_adapter_contract = ( + execution_r8.ADAPTER_R3_CONTRACT_SHA256 + if type(self.data_adapter) is execution_r8._adapter_r3.NativeEightDataAdapter + else self.data_adapter.contract_sha256 + ) + execution_r8._require( + identity["adapter_contract_sha256"] == expected_adapter_contract + and identity["plan_sha256"] == plan.plan_sha256 + and identity["seed"] == plan.seed + and identity["epoch"] == plan.epoch + and identity["optimizer_step_index"] == step_index + and tuple(identity["parent_indices"]) + == plan.step_parent_indices(step_index) + and tuple(identity["parent_ids"]) == plan.step_parent_ids(step_index) + and identity["availability_bits_hex"] + == plan.step_availability_bits(step_index).hex() + and identity["sequence_topology_r4_runtime_sha256"] + == execution_r8.R4_RUNTIME_SHA256 + and identity["sequence_topology_r4_receipt_sha256"] + == execution_r8.R4_RECEIPT_SHA256 + and identity["sequence_topology_bfs_receipt_sha256"] + == execution_r8.R4_BFS_RECEIPT_SHA256 + and identity["topology_loss_source_sha256"] + == execution_r8.TOPOLOGY_LOSS_SOURCE_SHA256 + and identity["training_authorized"] is False + and identity["scientific_launch_authorized"] is False, + "Adapter R3 step differs from the exact R4 plan/bindings", + ) + provenance_surface = _provenance_surface(micros) + execution_r8._require( + r5._recursive_state_sha256(provenance_surface) + == identity["r4_batch_provenance_sha256"], + "Adapter R3 combined R4 provenance digest changed", + ) + per_field = { + field: r5._recursive_state_sha256( + [micro.model_inputs[field] for micro in micros] + ) + for field in PROVENANCE_FIELDS + } + sanitized = _sanitized_cpu_micros(micros, r5) + diagnostic = self._inner.execute_step(sanitized) + unsigned = { + "schema": execution_r8.STEP_PROVENANCE_SCHEMA, + "epoch": plan.epoch, + "optimizer_step_index": step_index, + "step_identity_sha256": identity_sha, + "full_model_input_sha256": identity["model_input_sha256"], + "forward_model_input_sha256": diagnostic.input_sha256, + "r4_batch_provenance_sha256": identity[ + "r4_batch_provenance_sha256" + ], + "provenance_fields": list(PROVENANCE_FIELDS), + "provenance_field_sha256": per_field, + "training_authorized": False, + "scientific_launch_authorized": False, + } + evidence = { + **unsigned, + "evidence_sha256": execution_r8._core.canonical_sha256( + unsigned, domain=execution_r8.STEP_PROVENANCE_SCHEMA + ), + } + execution_r8._require( + diagnostic.optimizer_step_index == step_index + and diagnostic.plan_sha256 == plan.plan_sha256, + "R5 diagnostic differs from the Adapter R3 plan", + ) + self.completed_step_identities.append(identity_sha) + if not hasattr(self, "completed_r4_provenance_evidence"): + self.completed_r4_provenance_evidence = [] + self.completed_r4_provenance_evidence.append(evidence) + return diagnostic + + execute_next_step.__name__ = "execute_next_step" + execute_next_step.__qualname__ = ( + "NativeEightProductionExecutor.execute_next_step" + ) + execute_next_step._review_a5_hotpath_r2 = True + return execute_next_step + + +def _patch_outer_r8(execution_r8: ModuleType, r5: ModuleType) -> None: + executor_class = execution_r8._core._r6.NativeEightProductionExecutor + if executor_class.__dict__.get( + "_review_a5_hotpath_r2_outer_installed", False + ): + return + executor_class._review_a5_hotpath_r2_original_execute_next_step = ( + executor_class.execute_next_step + ) + executor_class.execute_next_step = _build_outer_r8_execute_next_step( + execution_r8, r5 + ) + executor_class._review_a5_hotpath_r2_outer_installed = True + + +def _revalidate_boundary( + *, + executor: Any, + adapter: Any, + reason: str, + r5: ModuleType, + adapter_module: ModuleType, +) -> Mapping[str, Any]: + return _r1.revalidate_execution_boundary( + executor=executor, + adapter=adapter, + reason=reason, + r5=r5, + adapter_module=adapter_module, + ) + + +def _patch_training_boundaries( + core: ModuleType, + *, + adapter_module: ModuleType, + r5: ModuleType, +) -> None: + if getattr(core, "_review_a5_hotpath_r2_boundaries_installed", False): + return + original_factory = core._make_static_adapter_class + original_run_identity = core._run_identity + original_restore = core._restore_completed_epoch + original_checkpoint = core._checkpoint_value + + def make_static_adapter_class(r8: ModuleType, bundle: Any) -> type: + value = original_factory(r8, bundle) + value._review_a5_hotpath_adapter_module = adapter_module + _patch_adapter_class(value, r5=r5) + return value + + def run_identity(*args: Any, **kwargs: Any) -> Any: + executor = kwargs["executor"] + adapter = kwargs["adapter"] + _revalidate_boundary( + executor=executor, + adapter=adapter, + reason="startup", + r5=r5, + adapter_module=adapter_module, + ) + value, digest = original_run_identity(*args, **kwargs) + initial = value.get("initial_model_state_sha256") + _require( + type(initial) is str and _SHA_RE.fullmatch(initial) is not None, + "run identity initial model digest is absent", + ) + executor._review_a5_hotpath_state_chain_sha256 = initial + return value, digest + + def restore_completed_epoch(*args: Any, **kwargs: Any) -> None: + original_restore(*args, **kwargs) + _revalidate_boundary( + executor=kwargs["executor"], + adapter=kwargs["adapter"], + reason="resume", + r5=r5, + adapter_module=adapter_module, + ) + + def checkpoint_value(*args: Any, **kwargs: Any) -> dict[str, Any]: + executor = kwargs["executor"] + adapter = getattr(executor.model, "_review_a5_r8_data_adapter", None) + _require(adapter is not None, "completed-epoch adapter binding is absent") + _revalidate_boundary( + executor=executor, + adapter=adapter, + reason="completed_epoch", + r5=r5, + adapter_module=adapter_module, + ) + return original_checkpoint(*args, **kwargs) + + core._review_a5_hotpath_r2_original_make_static_adapter_class = original_factory + core._review_a5_hotpath_r2_original_run_identity = original_run_identity + core._review_a5_hotpath_r2_original_restore_completed_epoch = original_restore + core._review_a5_hotpath_r2_original_checkpoint_value = original_checkpoint + core._make_static_adapter_class = make_static_adapter_class + core._run_identity = run_identity + core._restore_completed_epoch = restore_completed_epoch + core._checkpoint_value = checkpoint_value + core._review_a5_hotpath_r2_boundaries_installed = True + + +def install_optimized_execution_layer( + r9_module: ModuleType, +) -> Mapping[str, Any]: + """Install R2 into one exact loaded R9 graph; never touches disk predecessors.""" + + _require(isinstance(r9_module, ModuleType), "installer requires a module") + existing = _INSTALLATIONS.get(id(r9_module)) + if existing is not None: + return existing + core, execution_r8, adapter_module, r5 = _resolve_components(r9_module) + _patch_inner_executor(r5) + adapter_class = adapter_module.NativeEightDataAdapter + adapter_class._review_a5_hotpath_adapter_module = adapter_module + _patch_adapter_class(adapter_class, r5=r5) + _patch_outer_r8(execution_r8, r5) + _patch_training_boundaries( + core, + adapter_module=adapter_module, + r5=r5, + ) + identity = dict(source_identity()) + receipt = MappingProxyType( + { + "schema": SCHEMA, + "status": "INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED", + "source_sha256": identity["sha256"], + "source_bytes": identity["bytes"], + "frozen_r1_hotpath_sha256": R1_HOTPATH_SHA256, + "predecessor_source_sha256": dict(EXPECTED_SOURCE_SHA256), + "actual_r9_direct_route_supported": True, + "optional_outer_r8_route_supported": True, + "full_cpu_digest_validated_before_h2d": True, + "sanitized_forward_cpu_digest_distinct": True, + "partial_provenance_rejected": True, + "training_provenance_fields_cpu_only": True, + "development_transport_changed": False, + "exact_fp32_math_preserved": True, + "checkpoint_semantics_preserved": True, + "per_step_authority_file_reads": 0, + "per_step_model_state_copies": 0, + "per_step_optimizer_state_copies": 0, + "per_step_full_state_hashes": 0, + "diagnostic_model_sha_fields_semantics": ( + "rolling_step_chain_not_literal_model_state_sha256;" + "reanchored_to_literal_model_state_only_at_resume_and_completed_epoch" + ), + "prefetch_installed": False, + "amp_enabled": False, + "tf32_enabled": False, + "fused_optimizer_enabled": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + ) + _INSTALLATIONS[id(r9_module)] = receipt + core._review_a5_hotpath_r2_install_receipt = receipt + return receipt + + +__all__ = [ + "EXPECTED_SOURCE_SHA256", + "NativeEightHotpathR2Error", + "PROVENANCE_FIELDS", + "R1_HOTPATH_SHA256", + "SCHEMA", + "install_optimized_execution_layer", + "source_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/load_review_a5_native_eight_hotpath_r3.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/load_review_a5_native_eight_hotpath_r3.py new file mode 100644 index 0000000000000000000000000000000000000000..cde56df17d068c0e3f23e6ca0fd5cdf5f526b42e --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/load_review_a5_native_eight_hotpath_r3.py @@ -0,0 +1,133 @@ +"""Exact-byte loader for the isolated native-eight hot-path R3 source.""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + + +SOURCE_PATH = Path(__file__).absolute().with_name( + "review_a5_native_eight_hotpath_r3.py" +) +SOURCE_SHA256 = "a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd" +SOURCE_BYTES = 36_449 + + +def _read_exact() -> bytes: + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in SOURCE_PATH.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(SOURCE_PATH.name, leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or before.st_size != SOURCE_BYTES + or before.st_mode & 0o222 + ): + raise RuntimeError("hot-path R3 source size/type changed") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("hot-path R3 source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ): + raise RuntimeError("hot-path R3 source changed during read") + raw = b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + if hashlib.sha256(raw).hexdigest() != SOURCE_SHA256: + raise RuntimeError("hot-path R3 source SHA changed") + return raw + + +def load(*, module_name: str | None = None) -> ModuleType: + raw = _read_exact() + name = module_name or ( + "_review_a5_native_eight_hotpath_r3_" + SOURCE_SHA256[:20] + ) + existing = sys.modules.get(name) + if existing is not None: + identity = getattr(existing, "__review_loaded_source_identity__", None) + if not isinstance(identity, MappingProxyType) or dict(identity) != { + "sha256": SOURCE_SHA256, + "bytes": SOURCE_BYTES, + }: + raise RuntimeError("hot-path R3 module slot changed") + return existing + module = ModuleType(name) + module.__file__ = os.fspath(SOURCE_PATH) + module.__package__ = "" + module.__review_loaded_source_identity__ = MappingProxyType( + {"sha256": SOURCE_SHA256, "bytes": SOURCE_BYTES} + ) + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +def install_optimized_execution_layer( + r9_module: ModuleType, +) -> Mapping[str, Any]: + return load().install_optimized_execution_layer(r9_module) + + +def source_identity() -> Mapping[str, Any]: + return load().source_identity() + + +__all__ = [ + "SOURCE_BYTES", + "SOURCE_PATH", + "SOURCE_SHA256", + "install_optimized_execution_layer", + "load", + "source_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/review_a5_native_eight_hotpath_r3.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/review_a5_native_eight_hotpath_r3.py new file mode 100644 index 0000000000000000000000000000000000000000..b91314415c6816356b445cb12b883a5d65328ef5 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/review_a5_native_eight_hotpath_r3.py @@ -0,0 +1,997 @@ +"""Minimal process-local throughput successor for the native-eight R2 hot path. + +R3 changes no model arithmetic, optimizer policy, data, checkpoint bytes, or +device policy. It installs frozen R2 first, then: + +1. caches an exact, fully validated immutable epoch-plan stamp so steady-state + step checks are constant-time while build/bind/resume remain full audits; +2. replaces only R8's explicit per-parent availability/finite scalar reads with + one availability transfer and one batched finite check. + +It also adds completed-epoch chain/cursor and RNG prevalidation guards around +the existing checkpoint bytes. R1, R2, R13, and every other predecessor remain +unchanged on disk. +""" + +from __future__ import annotations + +from contextlib import contextmanager +import copy +from dataclasses import dataclass +import hashlib +import json +import os +from pathlib import Path +import random +import re +import stat +import sys +from types import MappingProxyType, MethodType, ModuleType +from typing import Any, Mapping, Sequence + +import torch + + +SCHEMA = "bertose_review_a5_native_eight_hotpath_20260726_r3" +R2_LOADER_PATH = ( + Path(__file__).absolute().parents[1] + / "a5_native_eight_hotpath_20260725_r2" + / "load_review_a5_native_eight_hotpath_r2.py" +) +R2_LOADER_SHA256 = ( + "101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae" +) +R2_LOADER_BYTES = 4_127 +R2_RUNTIME_SHA256 = ( + "941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98" +) +R8_EXECUTOR_SHA256 = ( + "60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630" +) +FROZEN_TOPOLOGY_LOSS_SHA256 = ( + "64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e" +) +R13_COORDINATION_PATHS = MappingProxyType( + { + "runner": ( + "review/multimodal/runtime/" + "a5_native_eight_training_20260726_r13_final_candidate/" + "review_a5_native_eight_training_runner_r13.py" + ), + "binding": ( + "review/multimodal/runtime/" + "a5_native_eight_training_20260726_r13_final_candidate/" + "review_a5_native_eight_final_bindings_r13.py" + ), + } +) +PROVENANCE_FIELDS = ( + "sequence_rows", + "roles", + "seq_token_categories", + "topology_rows", + "topology_residue_counts", + "topology_target_counts", +) +_SHA_RE = re.compile(r"^[0-9a-f]{64}$") +_INSTALLATIONS: dict[int, Mapping[str, Any]] = {} +_BOUNDARY_STACK: list[str] = [] + + +class NativeEightHotpathR3Error(RuntimeError): + """The narrow R3 throughput/checkpoint contract changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightHotpathR3Error(message) + + +def _canonical_bytes(value: object) -> bytes: + return ( + json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False) + + "\n" + ).encode("utf-8") + + +def _read_regular_nofollow( + path: Path, *, expected_bytes: int, expected_sha256: str +) -> bytes: + absolute = Path(path) + _require( + absolute.is_absolute() + and os.path.normpath(os.fspath(absolute)) == os.fspath(absolute) + and hasattr(os, "O_NOFOLLOW") + and hasattr(os, "O_DIRECTORY"), + "predecessor path is not canonical/no-follow capable", + ) + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in absolute.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(absolute.name, leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + _require( + stat.S_ISREG(before.st_mode) + and before.st_nlink == 1 + and before.st_size == expected_bytes, + "predecessor source size/type changed", + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + _require(bool(chunk), "predecessor source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + _require( + ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) + == ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ), + "predecessor source changed during read", + ) + raw = b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + _require( + hashlib.sha256(raw).hexdigest() == expected_sha256, + "predecessor source SHA changed", + ) + return raw + + +def _load_r2_loader() -> ModuleType: + raw = _read_regular_nofollow( + R2_LOADER_PATH, + expected_bytes=R2_LOADER_BYTES, + expected_sha256=R2_LOADER_SHA256, + ) + name = "_review_a5_native_eight_hotpath_r2_loader_pinned_for_r3" + existing = sys.modules.get(name) + if existing is not None: + return existing + module = ModuleType(name) + module.__file__ = os.fspath(R2_LOADER_PATH) + module.__package__ = "" + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(R2_LOADER_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +_r2_loader = _load_r2_loader() +_r2 = _r2_loader.load( + module_name="_review_a5_native_eight_hotpath_r2_pinned_for_r3" +) +_require( + dict(_r2.source_identity()) + == {"sha256": R2_RUNTIME_SHA256, "bytes": 32_821}, + "loaded R2 runtime identity changed", +) + + +def source_identity() -> Mapping[str, Any]: + value = globals().get("__review_loaded_source_identity__") + _require( + isinstance(value, Mapping) + and type(value.get("sha256")) is str + and _SHA_RE.fullmatch(value["sha256"]) is not None + and type(value.get("bytes")) is int + and value["bytes"] > 0, + "R3 must be loaded through its exact-byte loader", + ) + return MappingProxyType(dict(value)) + + +@dataclass(frozen=True, slots=True) +class _PlanStamp: + plan: Any + schema: str + seed: int + epoch: int + parent_count: int + optimizer_step_count: int + plan_sha256: str + training_authorized: bool + scientific_launch_authorized: bool + large_field_refs: tuple[tuple[str, Any], ...] + small_mapping_values: tuple[tuple[str, tuple[tuple[str, Any], ...]], ...] + + +_ACTIVE_PLAN_STAMP: _PlanStamp | None = None +_PLAN_AUDIT_COUNTS = { + "full": 0, + "cached": 0, + "build": 0, + "bind": 0, + "resume": 0, +} + + +_LARGE_PLAN_FIELDS = ( + "capacities", + "step_offsets", + "ordered_parent_indices", + "ordered_parent_ids", + "ordered_availability_bits", +) +_SMALL_PLAN_MAPPINGS = ( + "eligibility_counts", + "global_factors", + "stratum_counts", + "stratum_step_min", + "stratum_step_max", +) + + +def _stamp_plan(plan: Any) -> _PlanStamp: + return _PlanStamp( + plan=plan, + schema=plan.schema, + seed=plan.seed, + epoch=plan.epoch, + parent_count=plan.parent_count, + optimizer_step_count=plan.optimizer_step_count, + plan_sha256=plan.plan_sha256, + training_authorized=plan.training_authorized, + scientific_launch_authorized=plan.scientific_launch_authorized, + large_field_refs=tuple( + (name, getattr(plan, name)) for name in _LARGE_PLAN_FIELDS + ), + small_mapping_values=tuple( + (name, tuple(sorted(dict(getattr(plan, name)).items()))) + for name in _SMALL_PLAN_MAPPINGS + ), + ) + + +def _stamp_unchanged(plan: Any, stamp: _PlanStamp) -> bool: + return ( + plan is stamp.plan + and plan.schema == stamp.schema + and plan.seed == stamp.seed + and plan.epoch == stamp.epoch + and plan.parent_count == stamp.parent_count + and plan.optimizer_step_count == stamp.optimizer_step_count + and plan.plan_sha256 == stamp.plan_sha256 + and plan.training_authorized is stamp.training_authorized is False + and plan.scientific_launch_authorized + is stamp.scientific_launch_authorized + is False + and all( + getattr(plan, name) is reference + for name, reference in stamp.large_field_refs + ) + and tuple( + (name, tuple(sorted(dict(getattr(plan, name)).items()))) + for name in _SMALL_PLAN_MAPPINGS + ) + == stamp.small_mapping_values + ) + + +@contextmanager +def _full_boundary(reason: str): + _require(reason in {"build", "bind", "resume"}, "unknown full-plan boundary") + _BOUNDARY_STACK.append(reason) + try: + yield + finally: + observed = _BOUNDARY_STACK.pop() + _require(observed == reason, "full-plan boundary stack changed") + + +def _full_verify_and_stamp(plan: Any, *, planner: ModuleType, reason: str) -> None: + global _ACTIVE_PLAN_STAMP + full = planner._review_a5_hotpath_r3_full_verify_plan_identity + full(plan) + stamp = _stamp_plan(plan) + _require( + type(stamp.schema) is str + and stamp.seed == planner.COMMON_SEED + and type(stamp.epoch) is int + and stamp.epoch >= 0 + and type(stamp.parent_count) is int + and stamp.parent_count > 0 + and type(stamp.optimizer_step_count) is int + and stamp.optimizer_step_count > 0 + and _SHA_RE.fullmatch(stamp.plan_sha256) is not None, + "fully validated plan stamp is invalid", + ) + _ACTIVE_PLAN_STAMP = stamp + _PLAN_AUDIT_COUNTS["full"] += 1 + _PLAN_AUDIT_COUNTS[reason] += 1 + + +def _build_cached_verifier(planner: ModuleType): + def verify_plan_identity(plan: Any) -> None: + stamp = _ACTIVE_PLAN_STAMP + if stamp is None or stamp.plan is not plan: + _require( + bool(_BOUNDARY_STACK), + "unbound epoch plan reached a steady-state step boundary", + ) + _full_verify_and_stamp( + plan, planner=planner, reason=_BOUNDARY_STACK[-1] + ) + return + _require( + _stamp_unchanged(plan, stamp), + "fully validated immutable epoch plan changed", + ) + _PLAN_AUDIT_COUNTS["cached"] += 1 + + verify_plan_identity.__name__ = "verify_plan_identity" + verify_plan_identity.__qualname__ = ( + "review_a5_hotpath_r3_cached_verify_plan_identity" + ) + verify_plan_identity._review_a5_hotpath_r3 = True + return verify_plan_identity + + +def _patch_plan_verifier(planner: ModuleType) -> None: + if getattr(planner, "_review_a5_hotpath_r3_plan_cache_installed", False): + return + original = planner.verify_plan_identity + _require( + callable(original) + and getattr(planner, "_r4", None) is not None + and planner._r4.verify_plan_identity is original, + "R5/R4 dynamic full-plan verifier graph changed", + ) + planner._review_a5_hotpath_r3_full_verify_plan_identity = original + cached = _build_cached_verifier(planner) + planner.verify_plan_identity = cached + planner._r4.verify_plan_identity = cached + planner._review_a5_hotpath_r3_plan_cache_installed = True + + +def _patch_planner_builders(planner: ModuleType, r5: ModuleType) -> None: + if getattr(planner, "_review_a5_hotpath_r3_builders_installed", False): + return + original_production = planner.build_balanced_epoch_plan + original_fixture = planner.build_test_fixture_epoch_plan + + def build_balanced_epoch_plan(*args: Any, **kwargs: Any) -> Any: + with _full_boundary("build"): + return original_production(*args, **kwargs) + + def build_test_fixture_epoch_plan(*args: Any, **kwargs: Any) -> Any: + with _full_boundary("build"): + return original_fixture(*args, **kwargs) + + planner._review_a5_hotpath_r3_original_build_balanced_epoch_plan = ( + original_production + ) + planner._review_a5_hotpath_r3_original_build_test_fixture_epoch_plan = ( + original_fixture + ) + planner.build_balanced_epoch_plan = build_balanced_epoch_plan + planner.build_test_fixture_epoch_plan = build_test_fixture_epoch_plan + if getattr(r5, "build_test_fixture_epoch_plan", None) is original_fixture: + r5.build_test_fixture_epoch_plan = build_test_fixture_epoch_plan + planner._review_a5_hotpath_r3_builders_installed = True + + +def _patch_adapter_boundary_class(adapter_class: type, *, planner: ModuleType) -> None: + if adapter_class.__dict__.get( + "_review_a5_hotpath_r3_plan_boundaries_installed", False + ): + return + original_build = adapter_class.build_epoch_plan + original_resume = adapter_class.resume_cursor + original_validate = adapter_class.validate_resume_cursor + + def build_epoch_plan(self: Any, epoch: int) -> Any: + with _full_boundary("build"): + plan = original_build(self, epoch) + if _ACTIVE_PLAN_STAMP is None or _ACTIVE_PLAN_STAMP.plan is not plan: + _full_verify_and_stamp(plan, planner=planner, reason="build") + return plan + + def resume_cursor( + self: Any, + *, + plan: Any, + next_optimizer_step: int, + cell_id: str, + ) -> dict[str, Any]: + _full_verify_and_stamp(plan, planner=planner, reason="resume") + return original_resume( + self, + plan=plan, + next_optimizer_step=next_optimizer_step, + cell_id=cell_id, + ) + + def validate_resume_cursor( + self: Any, + cursor: Mapping[str, Any], + *, + plan: Any, + cell_id: str, + ) -> None: + _full_verify_and_stamp(plan, planner=planner, reason="resume") + return original_validate(self, cursor, plan=plan, cell_id=cell_id) + + adapter_class._review_a5_hotpath_r3_original_build_epoch_plan = original_build + adapter_class._review_a5_hotpath_r3_original_resume_cursor = original_resume + adapter_class._review_a5_hotpath_r3_original_validate_resume_cursor = ( + original_validate + ) + adapter_class.build_epoch_plan = build_epoch_plan + adapter_class.resume_cursor = resume_cursor + adapter_class.validate_resume_cursor = validate_resume_cursor + adapter_class._review_a5_hotpath_r3_plan_boundaries_installed = True + + +def _patch_executor_bind(executor_class: type, *, planner: ModuleType) -> None: + if executor_class.__dict__.get( + "_review_a5_hotpath_r3_bind_boundary_installed", False + ): + return + original = executor_class.bind_epoch_plan + + def bind_epoch_plan(self: Any, plan: Any) -> None: + _full_verify_and_stamp(plan, planner=planner, reason="bind") + return original(self, plan) + + executor_class._review_a5_hotpath_r3_original_bind_epoch_plan = original + executor_class.bind_epoch_plan = bind_epoch_plan + executor_class._review_a5_hotpath_r3_bind_boundary_installed = True + + +def plan_audit_receipt() -> Mapping[str, Any]: + stamp = _ACTIVE_PLAN_STAMP + return MappingProxyType( + { + "full_validation_counts": dict(_PLAN_AUDIT_COUNTS), + "active_plan_epoch": None if stamp is None else stamp.epoch, + "active_plan_sha256": None if stamp is None else stamp.plan_sha256, + "active_plan_retention_count": 0 if stamp is None else 1, + } + ) + + +def _optimized_r8_model_forward(model: Any, **model_inputs: Any) -> Any: + """R8-equivalent bridge with batched control-only scalar reads.""" + + execution_r8 = model._review_a5_hotpath_r3_execution_r8 + mode = getattr(model, "_review_a5_r8_provenance_mode", "train") + present = tuple(field in model_inputs for field in PROVENANCE_FIELDS) + execution_r8._require( + all(present) or not any(present), + "partial R4 provenance reached the model boundary", + ) + if all(present): + evidence = execution_r8._batch_provenance_evidence(model_inputs) + if mode == "development": + model._review_a5_r8_development_batches.append(copy.deepcopy(evidence)) + else: + execution_r8._require( + mode == "train", + "development model call bypassed the six-field R4 provenance gate", + ) + forward_inputs = dict(model_inputs) + for field in PROVENANCE_FIELDS: + forward_inputs.pop(field, None) + topology_enabled = bool(getattr(model, "enabled", {}).get("topology", False)) + topology_labels = forward_inputs.get("topology_labels") + topology_available = forward_inputs.get("topology_available") + if topology_enabled: + forward_inputs.pop("topology_labels", None) + forward_inputs.pop("topology_available", None) + original = model._review_a5_r8_original_forward + output = original(**forward_inputs) + if not topology_enabled: + return output + predictions = output.topology_token_pair_predictions + execution_r8._require( + isinstance(predictions, torch.Tensor) + and isinstance(topology_labels, torch.Tensor) + and isinstance(topology_available, torch.Tensor) + and topology_available.dtype == torch.bool + and topology_available.ndim == 1 + and topology_available.shape[0] == predictions.shape[0], + "enabled topology branch lacks exact predictions/labels/availability", + ) + module = model._review_a5_r8_topology_loss_module + parent_loss_function = model._review_a5_r8_topology_parent_loss_function + execution_r8._require( + module is not None and callable(parent_loss_function), + "topology loss is not the exact adapter-owned module", + ) + availability_cpu = topology_available.detach().to( + device=torch.device("cpu"), non_blocking=False + ) + indices = tuple( + parent + for parent, available in enumerate(availability_cpu.tolist()) + if available + ) + losses: list[torch.Tensor] = [] + for parent in indices: + parent_loss = parent_loss_function( + predictions[parent : parent + 1], + model_inputs["seq_residue_ids"][parent : parent + 1], + model_inputs["seq_attention_mask"][parent : parent + 1], + topology_labels[parent : parent + 1], + ) + execution_r8._require( + isinstance(parent_loss, torch.Tensor) and parent_loss.ndim == 0, + "adapter-owned topology loss did not return one parent scalar", + ) + losses.append(parent_loss) + topology_losses = ( + torch.stack(losses) if losses else predictions.new_empty((0,)) + ) + if losses: + execution_r8._require( + torch.isfinite(topology_losses).all().item(), + "adapter-owned topology loss did not return finite parent scalars", + ) + parent_losses = dict(output.parent_losses) + loss_parent_indices = dict(output.loss_parent_indices) + parent_losses["topology"] = topology_losses + loss_parent_indices["topology"] = torch.tensor( + indices, dtype=torch.long, device=predictions.device + ) + output.parent_losses = MappingProxyType(parent_losses) + output.loss_parent_indices = MappingProxyType(loss_parent_indices) + return output + + +def _patch_topology_bridge(execution_r8: ModuleType) -> None: + if getattr(execution_r8, "_review_a5_hotpath_r3_topology_installed", False): + return + original_forward = execution_r8._r8_model_forward + original_install = execution_r8._install_model_bridge + + def install_model_bridge(model: Any, adapter: Any) -> None: + original_install(model, adapter) + model._review_a5_hotpath_r3_execution_r8 = execution_r8 + model.forward = MethodType(_optimized_r8_model_forward, model) + + execution_r8._review_a5_hotpath_r3_original_model_forward = original_forward + execution_r8._review_a5_hotpath_r3_original_install_model_bridge = ( + original_install + ) + execution_r8._r8_model_forward = _optimized_r8_model_forward + execution_r8._install_model_bridge = install_model_bridge + execution_r8._review_a5_hotpath_r3_topology_installed = True + + +def _validate_cursor_completion( + cursor: Mapping[str, Any], + *, + plan_sha256: str, + plan_epoch: int, + completed_optimizer_steps: int, + cell_id: str, +) -> None: + _require( + type(cursor) is dict + and cursor.get("plan_sha256") == plan_sha256 + and cursor.get("epoch") == plan_epoch + and cursor.get("cell_id") == cell_id + and cursor.get("next_optimizer_step") == completed_optimizer_steps + and cursor.get("next_microbatch") == 0, + "completed checkpoint cursor is not at the exact plan boundary", + ) + planner_cursor = cursor.get("planner_cursor") + if planner_cursor is not None: + _require( + type(planner_cursor) is dict + and planner_cursor.get("plan_sha256") == plan_sha256 + and planner_cursor.get("epoch") == plan_epoch + and planner_cursor.get("next_optimizer_step") + == completed_optimizer_steps + and planner_cursor.get("next_microbatch") == 0, + "nested planner cursor is not at the completed boundary", + ) + + +def _validate_rng_before_mutation( + core: ModuleType, + value: Mapping[str, Any], + *, + require_cuda: bool = False, +) -> None: + _require( + type(value) is dict + and set(value) == {"python", "numpy", "torch_cpu", "torch_cuda"}, + "RNG checkpoint fields changed", + ) + probe = random.Random() + try: + probe.setstate(value["python"]) + except (TypeError, ValueError) as error: + raise NativeEightHotpathR3Error("Python RNG state is invalid") from error + numpy_state = value["numpy"] + _require( + type(numpy_state) is dict + and set(numpy_state) + == {"name", "keys", "position", "has_gauss", "cached_gaussian"}, + "NumPy RNG checkpoint fields changed", + ) + keys = numpy_state["keys"] + _require( + isinstance(keys, torch.Tensor) + and keys.ndim == 1 + and isinstance(value["torch_cpu"], torch.Tensor) + and value["torch_cpu"].ndim == 1 + and ( + value["torch_cuda"] is None + or ( + isinstance(value["torch_cuda"], torch.Tensor) + and value["torch_cuda"].ndim == 1 + ) + ), + "checkpoint RNG tensor state changed", + ) + _require( + not require_cuda or isinstance(value["torch_cuda"], torch.Tensor), + "CUDA executor checkpoint lacks CUDA RNG state", + ) + numpy_probe = core.np.random.RandomState() + try: + numpy_probe.set_state( + ( + numpy_state["name"], + keys.detach().cpu().numpy().astype(core.np.uint32), + int(numpy_state["position"]), + int(numpy_state["has_gauss"]), + float(numpy_state["cached_gaussian"]), + ) + ) + except (TypeError, ValueError, OverflowError) as error: + raise NativeEightHotpathR3Error("NumPy RNG state is invalid") from error + + +def _patch_checkpoint_guards(core: ModuleType) -> None: + if getattr(core, "_review_a5_hotpath_r3_checkpoint_guards_installed", False): + return + original_checkpoint = core._checkpoint_value + original_validate = core._validate_checkpoint_value + original_restore = core._restore_completed_epoch + original_restore_rng = core._restore_rng + + def checkpoint_value(*args: Any, **kwargs: Any) -> dict[str, Any]: + plan = kwargs["plan"] + executor = kwargs["executor"] + identities = kwargs["step_identity_sha256s"] + _require( + isinstance(identities, Sequence) + and not isinstance(identities, (str, bytes, bytearray)) + and len(identities) == plan.optimizer_step_count + and all( + type(value) is str and _SHA_RE.fullmatch(value) is not None + for value in identities + ) + and executor.bound_plan is plan + and executor.next_optimizer_step == plan.optimizer_step_count, + "completed checkpoint does not contain one exact identity per step", + ) + _validate_cursor_completion( + kwargs["adapter_cursor"], + plan_sha256=plan.plan_sha256, + plan_epoch=plan.epoch, + completed_optimizer_steps=plan.optimizer_step_count, + cell_id=kwargs["cell_id"], + ) + value = original_checkpoint(*args, **kwargs) + _validate_cursor_completion( + value["adapter_cursor"], + plan_sha256=value["plan_sha256"], + plan_epoch=value["plan_epoch"], + completed_optimizer_steps=value["completed_optimizer_steps"], + cell_id=value["cell_id"], + ) + _validate_rng_before_mutation( + core, + value["rng_state"], + require_cuda=next(executor.model.parameters()).device.type == "cuda", + ) + return value + + def validate_checkpoint_value(*args: Any, **kwargs: Any) -> Any: + value = args[0] if args else kwargs["value"] + _require(type(value) is dict, "checkpoint must be one plain mapping") + _validate_cursor_completion( + value.get("adapter_cursor"), + plan_sha256=value.get("plan_sha256"), + plan_epoch=value.get("plan_epoch"), + completed_optimizer_steps=value.get("completed_optimizer_steps"), + cell_id=value.get("cell_id"), + ) + _validate_rng_before_mutation(core, value.get("rng_state")) + return original_validate(*args, **kwargs) + + def restore_completed_epoch(*args: Any, **kwargs: Any) -> None: + checkpoint = kwargs["checkpoint"] + adapter = kwargs["adapter"] + executor = kwargs["executor"] + selection = kwargs["selection"] + _validate_cursor_completion( + checkpoint["adapter_cursor"], + plan_sha256=checkpoint["plan_sha256"], + plan_epoch=checkpoint["plan_epoch"], + completed_optimizer_steps=checkpoint["completed_optimizer_steps"], + cell_id=checkpoint["cell_id"], + ) + _validate_rng_before_mutation( + core, + checkpoint["rng_state"], + require_cuda=next(executor.model.parameters()).device.type == "cuda", + ) + previous_plan = adapter.build_epoch_plan( + selection.completed_epochs - 1 + ) + _require( + previous_plan.plan_sha256 == checkpoint["plan_sha256"] + and previous_plan.epoch == checkpoint["plan_epoch"] + and previous_plan.optimizer_step_count + == checkpoint["completed_optimizer_steps"] + and checkpoint["cell_id"] == executor.cell_id, + "checkpoint differs from the prevalidated resume plan/cell", + ) + adapter.validate_resume_cursor( + checkpoint["adapter_cursor"], + plan=previous_plan, + cell_id=executor.cell_id, + ) + original_restore(*args, **kwargs) + _require( + executor.bound_plan is not None + and executor.bound_plan.plan_sha256 == checkpoint["plan_sha256"] + and executor.next_optimizer_step + == checkpoint["completed_optimizer_steps"] + == executor.bound_plan.optimizer_step_count, + "restored executor is not at the exact completed plan boundary", + ) + + def restore_rng(value: Mapping[str, Any]) -> None: + _validate_rng_before_mutation(core, value) + original_restore_rng(value) + + core._review_a5_hotpath_r3_original_checkpoint_value = original_checkpoint + core._review_a5_hotpath_r3_original_validate_checkpoint_value = ( + original_validate + ) + core._review_a5_hotpath_r3_original_restore_completed_epoch = original_restore + core._review_a5_hotpath_r3_original_restore_rng = original_restore_rng + core._checkpoint_value = checkpoint_value + core._validate_checkpoint_value = validate_checkpoint_value + core._restore_completed_epoch = restore_completed_epoch + core._restore_rng = restore_rng + core._review_a5_hotpath_r3_checkpoint_guards_installed = True + + +def _patch_mutable_state_receipts(core: ModuleType) -> None: + if getattr(core, "_review_a5_hotpath_r3_rng_receipts_installed", False): + return + original = core._mutable_training_state_receipts + + def mutable_training_state_receipts( + r5: ModuleType, executor: Any + ) -> dict[str, str]: + value = original(r5, executor) + _require( + type(value) is dict + and "python_rng" not in value + and "numpy_rng" not in value, + "predecessor mutable-state receipt changed", + ) + value["python_rng"] = r5._recursive_state_sha256(random.getstate()) + value["numpy_rng"] = r5._recursive_state_sha256( + core.np.random.get_state() + ) + return value + + core._review_a5_hotpath_r3_original_mutable_training_state_receipts = original + core._mutable_training_state_receipts = mutable_training_state_receipts + core._review_a5_hotpath_r3_rng_receipts_installed = True + + +def _patch_checkpoint_manager(core: ModuleType) -> None: + manager = core.CheckpointManager + if manager.__dict__.get( + "_review_a5_hotpath_r3_commit_guard_installed", False + ): + return + _require( + manager.__name__ == "TransactionalCheckpointManagerR2" + and type(core.CHECKPOINT_INDEX_SCHEMA) is str + and "checkpoint_index" in core.CHECKPOINT_INDEX_SCHEMA, + "transactional checkpoint manager/schema binding changed", + ) + original = manager.commit + + def commit( + self: Any, + checkpoint: Mapping[str, Any], + *, + improved: bool, + epoch: int, + development_loss: float, + ) -> Mapping[str, Any]: + _require( + type(checkpoint) is dict + and checkpoint.get("schema") == core.CHECKPOINT_SCHEMA + and checkpoint.get("run_identity_sha256") + == self.run_identity_sha256 + and checkpoint.get("cell_id") == self.cell_id + and checkpoint.get("epoch") == epoch + and type(checkpoint.get("selection")) is dict + and checkpoint["selection"].get("completed_epochs") == epoch + and type(checkpoint.get("development_history")) is list + and bool(checkpoint["development_history"]) + and checkpoint["development_history"][-1].get("improved") + is improved + and checkpoint["development_history"][-1].get("development") + == checkpoint.get("latest_development") + and type(checkpoint.get("latest_development")) is dict + and checkpoint["latest_development"].get( + "total_normalized_loss" + ) + == development_loss + and checkpoint.get("training_authorized") is False + and checkpoint.get("nova_submission_authorized") is False, + "checkpoint manager received a mismatched checkpoint/epoch/loss", + ) + _validate_cursor_completion( + checkpoint["adapter_cursor"], + plan_sha256=checkpoint["plan_sha256"], + plan_epoch=checkpoint["plan_epoch"], + completed_optimizer_steps=checkpoint["completed_optimizer_steps"], + cell_id=checkpoint["cell_id"], + ) + return original( + self, + checkpoint, + improved=improved, + epoch=epoch, + development_loss=development_loss, + ) + + manager._review_a5_hotpath_r3_original_commit = original + manager.commit = commit + manager._review_a5_hotpath_r3_commit_guard_installed = True + + +def _patch_static_factory( + core: ModuleType, *, adapter_module: ModuleType, planner: ModuleType +) -> None: + if getattr(core, "_review_a5_hotpath_r3_static_factory_installed", False): + return + original = core._make_static_adapter_class + + def make_static_adapter_class(r8: ModuleType, bundle: Any) -> type: + value = original(r8, bundle) + if "build_epoch_plan" in value.__dict__: + _patch_adapter_boundary_class(value, planner=planner) + return value + + core._review_a5_hotpath_r3_original_make_static_adapter_class = original + core._make_static_adapter_class = make_static_adapter_class + core._review_a5_hotpath_r3_static_factory_installed = True + + +def install_optimized_execution_layer( + r9_module: ModuleType, +) -> Mapping[str, Any]: + """Install frozen R2, then the two narrow R3 throughput repairs.""" + + _require(isinstance(r9_module, ModuleType), "R3 installer requires R9 module") + existing = _INSTALLATIONS.get(id(r9_module)) + if existing is not None: + return existing + predecessor = _r2.install_optimized_execution_layer(r9_module) + core, execution_r8, adapter_module, r5 = _r2._resolve_components(r9_module) + _require( + dict(_r2.source_identity())["sha256"] == R2_RUNTIME_SHA256 + and _r2._module_sha256(execution_r8) == R8_EXECUTOR_SHA256 + and execution_r8.TOPOLOGY_LOSS_SOURCE_SHA256 + == FROZEN_TOPOLOGY_LOSS_SHA256, + "R2/R8/topology predecessor identity changed", + ) + planner = r5._planner + _patch_plan_verifier(planner) + _patch_planner_builders(planner, r5) + _patch_adapter_boundary_class( + adapter_module.NativeEightDataAdapter, planner=planner + ) + _patch_executor_bind(r5.NativeEightProductionExecutor, planner=planner) + _patch_topology_bridge(execution_r8) + _patch_checkpoint_guards(core) + _patch_mutable_state_receipts(core) + _patch_checkpoint_manager(core) + _patch_static_factory( + core, adapter_module=adapter_module, planner=planner + ) + identity = dict(source_identity()) + receipt = MappingProxyType( + { + "schema": SCHEMA, + "status": "INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED", + "source_sha256": identity["sha256"], + "source_bytes": identity["bytes"], + "predecessor_r2_loader_sha256": R2_LOADER_SHA256, + "predecessor_r2_runtime_sha256": R2_RUNTIME_SHA256, + "predecessor_r2_receipt": dict(predecessor), + "r8_executor_sha256": R8_EXECUTOR_SHA256, + "frozen_topology_loss_sha256": FROZEN_TOPOLOGY_LOSS_SHA256, + "full_plan_validation_boundaries": ["build", "bind", "resume"], + "per_step_plan_validation": ( + "constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp" + ), + "exact_step_slice_checks_preserved": True, + "topology_bridge_availability_transfers_per_micro_max": 1, + "topology_bridge_batched_finite_checks_per_micro_max": 1, + "frozen_topology_loss_internal_validations_preserved": True, + "checkpoint_valid_bytes_changed": False, + "checkpoint_exact_chain_length_required": True, + "checkpoint_cursor_prevalidated_before_state_mutation": True, + "python_numpy_rng_prevalidated_before_global_mutation": True, + "python_numpy_rng_in_development_mutation_receipt": True, + "transactional_checkpoint_manager_schema_checked": True, + "transactional_checkpoint_commit_semantics_checked": True, + "prefetch_installed": False, + "amp_enabled": False, + "tf32_enabled": False, + "fused_optimizer_enabled": False, + "ram_request_changed": False, + "r13_coordination_paths": dict(R13_COORDINATION_PATHS), + "r13_files_modified": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + ) + _INSTALLATIONS[id(r9_module)] = receipt + return receipt + + +__all__ = [ + "NativeEightHotpathR3Error", + "SCHEMA", + "install_optimized_execution_layer", + "plan_audit_receipt", + "source_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/load_review_a5_native_eight_hotpath_r4.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/load_review_a5_native_eight_hotpath_r4.py new file mode 100644 index 0000000000000000000000000000000000000000..d9c4bf7af119c4c3d6389729831bd70b3b3d12c4 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/load_review_a5_native_eight_hotpath_r4.py @@ -0,0 +1,133 @@ +"""Exact-byte loader for the isolated native-eight hot-path R4 source.""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + + +SOURCE_PATH = Path(__file__).absolute().with_name( + "review_a5_native_eight_hotpath_r4.py" +) +SOURCE_SHA256 = "600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649" +SOURCE_BYTES = 23_798 + + +def _read_exact() -> bytes: + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in SOURCE_PATH.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(SOURCE_PATH.name, leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or before.st_size != SOURCE_BYTES + or before.st_mode & 0o222 + ): + raise RuntimeError("hot-path R4 source size/type changed") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("hot-path R4 source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ): + raise RuntimeError("hot-path R4 source changed during read") + raw = b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + if hashlib.sha256(raw).hexdigest() != SOURCE_SHA256: + raise RuntimeError("hot-path R4 source SHA changed") + return raw + + +def load(*, module_name: str | None = None) -> ModuleType: + raw = _read_exact() + name = module_name or ( + "_review_a5_native_eight_hotpath_r4_" + SOURCE_SHA256[:20] + ) + existing = sys.modules.get(name) + if existing is not None: + identity = getattr(existing, "__review_loaded_source_identity__", None) + if not isinstance(identity, MappingProxyType) or dict(identity) != { + "sha256": SOURCE_SHA256, + "bytes": SOURCE_BYTES, + }: + raise RuntimeError("hot-path R4 module slot changed") + return existing + module = ModuleType(name) + module.__file__ = os.fspath(SOURCE_PATH) + module.__package__ = "" + module.__review_loaded_source_identity__ = MappingProxyType( + {"sha256": SOURCE_SHA256, "bytes": SOURCE_BYTES} + ) + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +def install_optimized_execution_layer( + r9_module: ModuleType, +) -> Mapping[str, Any]: + return load().install_optimized_execution_layer(r9_module) + + +def source_identity() -> Mapping[str, Any]: + return load().source_identity() + + +__all__ = [ + "SOURCE_BYTES", + "SOURCE_PATH", + "SOURCE_SHA256", + "install_optimized_execution_layer", + "load", + "source_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4.py new file mode 100644 index 0000000000000000000000000000000000000000..f048d35d0ab017ed34bc0d5ced3097ad23446aa8 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4.py @@ -0,0 +1,683 @@ +"""Isolated checkpoint-integrity successor layered over frozen hot-path R3. + +R4 changes no valid checkpoint bytes, training arithmetic, optimizer policy, +data, or device policy. It strengthens only two completed-epoch boundaries: + +1. every serialized RNG component is fully parsed by a disposable generator + before any process-global RNG, model, or optimizer state can be mutated; +2. the exact one-identity-per-step chain is bound to the final sequential + development-history row at checkpoint creation, validation, restoration, + and transactional commit. + +The frozen R3/R2/R13 sources are loaded read-only and remain unchanged. +""" + +from __future__ import annotations + +import hashlib +import json +import math +import os +from pathlib import Path +import random +import re +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping, Sequence + +import torch + + +SCHEMA = "bertose_review_a5_native_eight_hotpath_20260726_r4" +R3_LOADER_PATH = ( + Path(__file__).absolute().parents[1] + / "a5_native_eight_hotpath_20260726_r3" + / "load_review_a5_native_eight_hotpath_r3.py" +) +R3_LOADER_SHA256 = ( + "e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30" +) +R3_LOADER_BYTES = 4_013 +R3_RUNTIME_SHA256 = ( + "a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd" +) +R3_RUNTIME_BYTES = 36_449 +STEP_CHAIN_DOMAIN = "bertose-review-a5-native8-step-chain-r1" +_SHA_RE = re.compile(r"^[0-9a-f]{64}$") +_INSTALLATIONS: dict[int, Mapping[str, Any]] = {} +_CHECKPOINT_PROVENANCE: dict[int, Mapping[str, Any]] = {} + + +class NativeEightHotpathR4Error(RuntimeError): + """The isolated R4 checkpoint/RNG contract changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightHotpathR4Error(message) + + +def _read_regular_nofollow( + path: Path, *, expected_bytes: int, expected_sha256: str +) -> bytes: + absolute = Path(path) + _require( + absolute.is_absolute() + and os.path.normpath(os.fspath(absolute)) == os.fspath(absolute) + and hasattr(os, "O_NOFOLLOW") + and hasattr(os, "O_DIRECTORY"), + "predecessor path is not canonical/no-follow capable", + ) + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in absolute.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(absolute.name, leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + _require( + stat.S_ISREG(before.st_mode) + and before.st_nlink == 1 + and before.st_size == expected_bytes, + "predecessor source size/type changed", + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + _require(bool(chunk), "predecessor source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + _require( + ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) + == ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ), + "predecessor source changed during read", + ) + raw = b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + _require( + hashlib.sha256(raw).hexdigest() == expected_sha256, + "predecessor source SHA changed", + ) + return raw + + +def _load_r3_loader() -> ModuleType: + raw = _read_regular_nofollow( + R3_LOADER_PATH, + expected_bytes=R3_LOADER_BYTES, + expected_sha256=R3_LOADER_SHA256, + ) + name = "_review_a5_native_eight_hotpath_r3_loader_pinned_for_r4" + existing = sys.modules.get(name) + if existing is not None: + return existing + module = ModuleType(name) + module.__file__ = os.fspath(R3_LOADER_PATH) + module.__package__ = "" + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(R3_LOADER_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +_r3_loader = _load_r3_loader() +_r3 = _r3_loader.load( + module_name="_review_a5_native_eight_hotpath_r3_pinned_for_r4" +) +_require( + dict(_r3.source_identity()) + == {"sha256": R3_RUNTIME_SHA256, "bytes": R3_RUNTIME_BYTES}, + "loaded R3 runtime identity changed", +) + + +def source_identity() -> Mapping[str, Any]: + value = globals().get("__review_loaded_source_identity__") + _require( + isinstance(value, Mapping) + and type(value.get("sha256")) is str + and _SHA_RE.fullmatch(value["sha256"]) is not None + and type(value.get("bytes")) is int + and value["bytes"] > 0, + "R4 must be loaded through its exact-byte loader", + ) + return MappingProxyType(dict(value)) + + +def _validate_rng_before_mutation( + core: ModuleType, + value: Mapping[str, Any], + *, + require_cuda: bool = False, + cuda_device: torch.device | None = None, +) -> None: + """Fully parse every RNG state without touching process-global RNGs.""" + + _require( + type(value) is dict + and set(value) == {"python", "numpy", "torch_cpu", "torch_cuda"}, + "RNG checkpoint fields changed", + ) + + python_probe = random.Random() + try: + python_probe.setstate(value["python"]) + except (TypeError, ValueError) as error: + raise NativeEightHotpathR4Error( + "Python RNG state is invalid" + ) from error + + numpy_state = value["numpy"] + _require( + type(numpy_state) is dict + and set(numpy_state) + == {"name", "keys", "position", "has_gauss", "cached_gaussian"}, + "NumPy RNG checkpoint fields changed", + ) + keys = numpy_state["keys"] + position = numpy_state["position"] + has_gauss = numpy_state["has_gauss"] + cached_gaussian = numpy_state["cached_gaussian"] + _require( + type(numpy_state["name"]) is str + and numpy_state["name"] == "MT19937" + and type(keys) is torch.Tensor + and keys.device.type == "cpu" + and keys.dtype == torch.int64 + and tuple(keys.shape) == (624,) + and keys.is_contiguous() + and type(position) is int + and 0 <= position <= 624 + and type(has_gauss) is int + and has_gauss in {0, 1} + and type(cached_gaussian) is float + and math.isfinite(cached_gaussian), + "NumPy RNG state shape/types changed", + ) + _require( + bool(torch.all(keys >= 0).item()) + and bool(torch.all(keys <= 0xFFFFFFFF).item()), + "NumPy RNG key values are outside uint32", + ) + numpy_keys = keys.detach().numpy().astype( + core.np.uint32, copy=True, casting="unsafe" + ) + numpy_probe = core.np.random.RandomState() + try: + numpy_probe.set_state( + ( + numpy_state["name"], + numpy_keys, + position, + has_gauss, + cached_gaussian, + ) + ) + except (TypeError, ValueError, OverflowError) as error: + raise NativeEightHotpathR4Error( + "NumPy RNG state is invalid" + ) from error + + torch_cpu = value["torch_cpu"] + _require( + type(torch_cpu) is torch.Tensor + and torch_cpu.device.type == "cpu" + and torch_cpu.dtype == torch.uint8 + and torch_cpu.ndim == 1 + and torch_cpu.numel() > 0 + and torch_cpu.is_contiguous(), + "Torch CPU RNG state shape/types changed", + ) + try: + torch.Generator(device="cpu").set_state(torch_cpu.detach().clone()) + except (TypeError, ValueError, RuntimeError) as error: + raise NativeEightHotpathR4Error( + "Torch CPU RNG state is invalid" + ) from error + + torch_cuda = value["torch_cuda"] + _require( + torch_cuda is None + or ( + type(torch_cuda) is torch.Tensor + and torch_cuda.device.type == "cpu" + and torch_cuda.dtype == torch.uint8 + and torch_cuda.ndim == 1 + and torch_cuda.numel() > 0 + and torch_cuda.is_contiguous() + ), + "Torch CUDA RNG state shape/types changed", + ) + _require( + not require_cuda or type(torch_cuda) is torch.Tensor, + "CUDA executor checkpoint lacks CUDA RNG state", + ) + if torch_cuda is not None: + _require( + torch.cuda.is_available(), + "CUDA RNG checkpoint cannot be fully validated without CUDA", + ) + selected_cuda_device = ( + cuda_device + if cuda_device is not None + else torch.device("cuda", torch.cuda.current_device()) + ) + _require( + type(selected_cuda_device) is torch.device + and selected_cuda_device.type == "cuda", + "CUDA RNG validation device changed", + ) + try: + torch.Generator(device=selected_cuda_device).set_state( + torch_cuda.detach().clone() + ) + except (TypeError, ValueError, RuntimeError) as error: + raise NativeEightHotpathR4Error( + "Torch CUDA RNG state is invalid" + ) from error + + +def _validate_history_rows(history: Any) -> list[Mapping[str, Any]]: + _require( + type(history) is list and 1 <= len(history) <= 100, + "development history must be one nonempty plain list", + ) + for expected_epoch, row in enumerate(history, start=1): + _require( + type(row) is dict + and type(row.get("epoch")) is int + and row["epoch"] == expected_epoch + and type(row.get("step_identity_chain_sha256")) is str + and _SHA_RE.fullmatch( + row["step_identity_chain_sha256"] + ) + is not None, + "development history rows/chains are not sequential exact values", + ) + return history + + +def _validate_checkpoint_history_chain(checkpoint: Any) -> str: + _require(type(checkpoint) is dict, "checkpoint must be one plain mapping") + history = _validate_history_rows(checkpoint.get("development_history")) + chain = checkpoint.get("step_identity_chain_sha256") + _require( + type(chain) is str + and _SHA_RE.fullmatch(chain) is not None + and chain == history[-1]["step_identity_chain_sha256"] + and type(checkpoint.get("epoch")) is int + and checkpoint["epoch"] == len(history), + "checkpoint chain does not equal final development-history chain", + ) + return chain + + +def _expected_creation_chain( + core: ModuleType, *, plan: Any, identities: Any, history: Any +) -> str: + _require( + isinstance(identities, Sequence) + and not isinstance(identities, (str, bytes, bytearray)) + and len(identities) == plan.optimizer_step_count + and all( + type(value) is str and _SHA_RE.fullmatch(value) is not None + for value in identities + ), + "completed checkpoint does not contain one exact identity per step", + ) + rows = _validate_history_rows(history) + expected = core.canonical_sha256( + list(identities), domain=STEP_CHAIN_DOMAIN + ) + _require( + rows[-1]["step_identity_chain_sha256"] == expected + and rows[-1]["epoch"] == plan.epoch + 1, + "created checkpoint history is not bound to exact step identities", + ) + return expected + + +def _register_checkpoint_provenance( + checkpoint: dict[str, Any], + *, + origin: str, + trusted_entry_sha256: str | None = None, +) -> None: + _require( + origin == "r4_creation" + or origin.startswith("manager_verified_load:"), + "checkpoint provenance origin changed", + ) + chain = _validate_checkpoint_history_chain(checkpoint) + _require( + type(checkpoint.get("plan_sha256")) is str + and _SHA_RE.fullmatch(checkpoint["plan_sha256"]) is not None + and type(checkpoint.get("run_identity_sha256")) is str + and _SHA_RE.fullmatch(checkpoint["run_identity_sha256"]) is not None + and type(checkpoint.get("cell_id")) is str + and bool(checkpoint["cell_id"]), + "checkpoint cheap provenance fields changed", + ) + if origin == "r4_creation": + _require( + trusted_entry_sha256 is None, + "created checkpoint cannot claim a manager entry", + ) + else: + _require( + type(trusted_entry_sha256) is str + and _SHA_RE.fullmatch(trusted_entry_sha256) is not None, + "manager-verified checkpoint entry SHA changed", + ) + _CHECKPOINT_PROVENANCE[id(checkpoint)] = MappingProxyType( + { + "chain": chain, + "epoch": checkpoint["epoch"], + "plan_sha256": checkpoint["plan_sha256"], + "run_identity_sha256": checkpoint["run_identity_sha256"], + "cell_id": checkpoint["cell_id"], + "origin": origin, + "trusted_entry_sha256": trusted_entry_sha256 or "", + } + ) + + +def _require_checkpoint_provenance( + checkpoint: Any, +) -> Mapping[str, Any]: + _require(type(checkpoint) is dict, "checkpoint must be one plain mapping") + provenance = _CHECKPOINT_PROVENANCE.get(id(checkpoint)) + _require( + isinstance(provenance, Mapping) + and provenance.get("chain") + == checkpoint.get("step_identity_chain_sha256") + and provenance.get("epoch") == checkpoint.get("epoch") + and provenance.get("plan_sha256") + == checkpoint.get("plan_sha256") + and provenance.get("run_identity_sha256") + == checkpoint.get("run_identity_sha256") + and provenance.get("cell_id") == checkpoint.get("cell_id") + and ( + provenance.get("origin") == "r4_creation" + or str(provenance.get("origin", "")).startswith( + "manager_verified_load:" + ) + ), + ( + "checkpoint lacks unchanged R4 creation or manager-verified-load " + "provenance" + ), + ) + _require( + provenance["origin"] == "r4_creation" + or ( + _SHA_RE.fullmatch(provenance["trusted_entry_sha256"]) + is not None + ), + ( + "manager-loaded checkpoint lacks its immutable checkpoint-entry " + "SHA receipt" + ), + ) + return provenance + + +def _retire_checkpoint_provenance(checkpoint: Any) -> None: + _CHECKPOINT_PROVENANCE.pop(id(checkpoint), None) + + +def _patch_checkpoint_integrity(core: ModuleType) -> None: + if getattr( + core, "_review_a5_hotpath_r4_checkpoint_integrity_installed", False + ): + return + + r3_checkpoint = core._checkpoint_value + r3_validate = core._validate_checkpoint_value + r3_restore = core._restore_completed_epoch + manager = core.CheckpointManager + r3_commit = manager.commit + r3_load_latest = manager.load_latest + r3_load_best = manager.load_best + + def checkpoint_value(*args: Any, **kwargs: Any) -> dict[str, Any]: + expected = _expected_creation_chain( + core, + plan=kwargs["plan"], + identities=kwargs["step_identity_sha256s"], + history=kwargs["history"], + ) + value = r3_checkpoint(*args, **kwargs) + observed = _validate_checkpoint_history_chain(value) + _require( + observed == expected, + "created checkpoint chain differs from exact step identities", + ) + executor_device = next( + kwargs["executor"].model.parameters() + ).device + _validate_rng_before_mutation( + core, + value["rng_state"], + require_cuda=executor_device.type == "cuda", + cuda_device=( + executor_device if executor_device.type == "cuda" else None + ), + ) + _register_checkpoint_provenance(value, origin="r4_creation") + return value + + def validate_checkpoint_value(*args: Any, **kwargs: Any) -> Any: + value = args[0] if args else kwargs["value"] + _validate_checkpoint_history_chain(value) + _require_checkpoint_provenance(value) + return r3_validate(*args, **kwargs) + + def restore_completed_epoch(*args: Any, **kwargs: Any) -> None: + checkpoint = kwargs["checkpoint"] + _validate_checkpoint_history_chain(checkpoint) + _require_checkpoint_provenance(checkpoint) + executor_device = next( + kwargs["executor"].model.parameters() + ).device + _validate_rng_before_mutation( + core, + checkpoint.get("rng_state"), + require_cuda=executor_device.type == "cuda", + cuda_device=( + executor_device if executor_device.type == "cuda" else None + ), + ) + r3_restore(*args, **kwargs) + _retire_checkpoint_provenance(checkpoint) + + def commit( + self: Any, + checkpoint: Mapping[str, Any], + *, + improved: bool, + epoch: int, + development_loss: float, + ) -> Mapping[str, Any]: + _validate_checkpoint_history_chain(checkpoint) + _require_checkpoint_provenance(checkpoint) + value = r3_commit( + self, + checkpoint, + improved=improved, + epoch=epoch, + development_loss=development_loss, + ) + _retire_checkpoint_provenance(checkpoint) + return value + + def load_latest( + self: Any, *, device: torch.device + ) -> tuple[dict[str, Any], dict[str, Any]]: + checkpoint, entry = r3_load_latest(self, device=device) + _register_checkpoint_provenance( + checkpoint, + origin=f"manager_verified_load:latest:{entry['sha256']}", + trusted_entry_sha256=entry["sha256"], + ) + return checkpoint, entry + + def load_best( + self: Any, *, device: torch.device + ) -> tuple[dict[str, Any], dict[str, Any]]: + checkpoint, entry = r3_load_best(self, device=device) + _register_checkpoint_provenance( + checkpoint, + origin=f"manager_verified_load:best:{entry['sha256']}", + trusted_entry_sha256=entry["sha256"], + ) + return checkpoint, entry + + core._review_a5_hotpath_r4_original_checkpoint_value = r3_checkpoint + core._review_a5_hotpath_r4_original_validate_checkpoint_value = r3_validate + core._review_a5_hotpath_r4_original_restore_completed_epoch = r3_restore + manager._review_a5_hotpath_r4_original_commit = r3_commit + manager._review_a5_hotpath_r4_original_load_latest = r3_load_latest + manager._review_a5_hotpath_r4_original_load_best = r3_load_best + core._checkpoint_value = checkpoint_value + core._validate_checkpoint_value = validate_checkpoint_value + core._restore_completed_epoch = restore_completed_epoch + manager.commit = commit + manager.load_latest = load_latest + manager.load_best = load_best + core._review_a5_hotpath_r4_checkpoint_integrity_installed = True + manager._review_a5_hotpath_r4_commit_guard_installed = True + + +def install_optimized_execution_layer( + r9_module: ModuleType, +) -> Mapping[str, Any]: + """Install frozen R3, then the narrow R4 checkpoint-integrity guards.""" + + _require(isinstance(r9_module, ModuleType), "R4 installer requires R9 module") + existing = _INSTALLATIONS.get(id(r9_module)) + if existing is not None: + return existing + + predecessor_r3 = _r3.install_optimized_execution_layer(r9_module) + core, _execution_r8, _adapter_module, _r5 = _r3._r2._resolve_components( + r9_module + ) + _require( + predecessor_r3.get("source_sha256") == R3_RUNTIME_SHA256 + and predecessor_r3.get("source_bytes") == R3_RUNTIME_BYTES, + "installed R3 receipt identity changed", + ) + + # R3 wrappers resolve this module-global validator dynamically. Replace + # that process-local function before layering the chain guards. + _r3._validate_rng_before_mutation = _validate_rng_before_mutation + _patch_checkpoint_integrity(core) + + identity = dict(source_identity()) + inherited_keys = ( + "predecessor_r2_loader_sha256", + "predecessor_r2_runtime_sha256", + "r8_executor_sha256", + "frozen_topology_loss_sha256", + "full_plan_validation_boundaries", + "per_step_plan_validation", + "exact_step_slice_checks_preserved", + "topology_bridge_availability_transfers_per_micro_max", + "topology_bridge_batched_finite_checks_per_micro_max", + "frozen_topology_loss_internal_validations_preserved", + "checkpoint_valid_bytes_changed", + "checkpoint_exact_chain_length_required", + "python_numpy_rng_prevalidated_before_global_mutation", + "python_numpy_rng_in_development_mutation_receipt", + "transactional_checkpoint_manager_schema_checked", + "transactional_checkpoint_commit_semantics_checked", + "prefetch_installed", + "amp_enabled", + "tf32_enabled", + "fused_optimizer_enabled", + "ram_request_changed", + "r13_coordination_paths", + "r13_files_modified", + "training_authorized", + "scientific_launch_authorized", + "nova_submission_authorized", + ) + receipt_value: dict[str, Any] = { + "schema": SCHEMA, + "status": "INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED", + "source_sha256": identity["sha256"], + "source_bytes": identity["bytes"], + "predecessor_r3_loader_sha256": R3_LOADER_SHA256, + "predecessor_r3_runtime_sha256": R3_RUNTIME_SHA256, + "predecessor_r3_receipt": dict(predecessor_r3), + "predecessor_r2_receipt": dict( + predecessor_r3["predecessor_r2_receipt"] + ), + "rng_numpy_exact_mt19937_shape_types_required": True, + "rng_torch_cpu_disposable_generator_validation": True, + "rng_torch_cuda_disposable_generator_validation": True, + "rng_prevalidation_before_model_optimizer_global_mutation": True, + "development_history_sequential_rows_required": True, + "development_history_chain_fields_exact_sha256_required": True, + "checkpoint_top_level_chain_equals_last_history_row_required": True, + "checkpoint_creation_chain_recomputed_from_exact_step_identities": True, + "checkpoint_creation_or_verified_load_provenance_required": True, + "checkpoint_history_max_epochs": 100, + "checkpoint_restore_chain_recomputation_claimed": False, + "checkpoint_cursor_prevalidated_before_model_optimizer_state_mutation": True, + "checkpoint_additional_full_state_hashes": 0, + "checkpoint_lightweight_provenance_retired_after_commit_or_restore": True, + } + for key in inherited_keys: + receipt_value[key] = predecessor_r3[key] + receipt = MappingProxyType(receipt_value) + _INSTALLATIONS[id(r9_module)] = receipt + return receipt + + +__all__ = [ + "NativeEightHotpathR4Error", + "SCHEMA", + "install_optimized_execution_layer", + "source_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/load_review_a5_native_eight_hotpath_r5.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/load_review_a5_native_eight_hotpath_r5.py new file mode 100644 index 0000000000000000000000000000000000000000..74c32e26343fe4e89f7c0780d3c889db133c5379 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/load_review_a5_native_eight_hotpath_r5.py @@ -0,0 +1,133 @@ +"""Exact-byte loader for the isolated native-eight hot-path R5 source.""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + + +SOURCE_PATH = Path(__file__).absolute().with_name( + "review_a5_native_eight_hotpath_r5.py" +) +SOURCE_SHA256 = "ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8" +SOURCE_BYTES = 17_677 + + +def _read_exact() -> bytes: + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in SOURCE_PATH.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(SOURCE_PATH.name, leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or before.st_size != SOURCE_BYTES + or before.st_mode & 0o222 + ): + raise RuntimeError("hot-path R5 source size/type changed") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("hot-path R5 source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ): + raise RuntimeError("hot-path R5 source changed during read") + raw = b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + if hashlib.sha256(raw).hexdigest() != SOURCE_SHA256: + raise RuntimeError("hot-path R5 source SHA changed") + return raw + + +def load(*, module_name: str | None = None) -> ModuleType: + raw = _read_exact() + name = module_name or ( + "_review_a5_native_eight_hotpath_r5_" + SOURCE_SHA256[:20] + ) + existing = sys.modules.get(name) + if existing is not None: + identity = getattr(existing, "__review_loaded_source_identity__", None) + if not isinstance(identity, MappingProxyType) or dict(identity) != { + "sha256": SOURCE_SHA256, + "bytes": SOURCE_BYTES, + }: + raise RuntimeError("hot-path R5 module slot changed") + return existing + module = ModuleType(name) + module.__file__ = os.fspath(SOURCE_PATH) + module.__package__ = "" + module.__review_loaded_source_identity__ = MappingProxyType( + {"sha256": SOURCE_SHA256, "bytes": SOURCE_BYTES} + ) + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +def install_optimized_execution_layer( + r9_module: ModuleType, +) -> Mapping[str, Any]: + return load().install_optimized_execution_layer(r9_module) + + +def source_identity() -> Mapping[str, Any]: + return load().source_identity() + + +__all__ = [ + "SOURCE_BYTES", + "SOURCE_PATH", + "SOURCE_SHA256", + "install_optimized_execution_layer", + "load", + "source_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5.py new file mode 100644 index 0000000000000000000000000000000000000000..942909af36da32af90bdc90146989891f139061f --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5.py @@ -0,0 +1,520 @@ +"""Minimal provenance-lifecycle successor layered over frozen hot-path R4. + +R5 changes no checkpoint bytes, model/optimizer arithmetic, data, device +policy, or full-state hashing policy. It replaces only R4's process-local +checkpoint provenance sidecar: + +1. provenance is bound to retained/weakly observed checkpoint constituents, + not only ``id(checkpoint)``; +2. a tiny canonical digest covers every sequential + ``(epoch, step_identity_chain_sha256)`` pair (at most 100); +3. records retire after commit/restore success or failure, validation failure, + and garbage collection of an abandoned created/loaded checkpoint. + +Frozen R4/R3/R2 and the coordinated training runtimes remain unchanged. +""" + +from __future__ import annotations + +import hashlib +import json +import os +from pathlib import Path +import re +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping +import weakref + +import torch + + +SCHEMA = "bertose_review_a5_native_eight_hotpath_20260726_r5" +STATUS = "INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED" +R4_LOADER_PATH = ( + Path(__file__).absolute().parents[1] + / "a5_native_eight_hotpath_20260726_r4" + / "load_review_a5_native_eight_hotpath_r4.py" +) +R4_LOADER_SHA256 = ( + "662d0766a8d68638480e9c44ca4070387481d43e1c666a20363025cf5b9bc958" +) +R4_LOADER_BYTES = 4_013 +R4_RUNTIME_SHA256 = ( + "600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649" +) +R4_RUNTIME_BYTES = 23_798 +HISTORY_CHAIN_DIGEST_DOMAIN = ( + "bertose-review-a5-native8-history-chain-pairs-20260726-r5" +) +_SHA_RE = re.compile(r"^[0-9a-f]{64}$") +_INSTALLATIONS: dict[int, Mapping[str, Any]] = {} +_CHECKPOINT_PROVENANCE: dict[int, Mapping[str, Any]] = {} + + +class NativeEightHotpathR5Error(RuntimeError): + """The isolated R5 checkpoint-provenance contract changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightHotpathR5Error(message) + + +def _read_regular_nofollow( + path: Path, *, expected_bytes: int, expected_sha256: str +) -> bytes: + absolute = Path(path) + _require( + absolute.is_absolute() + and os.path.normpath(os.fspath(absolute)) == os.fspath(absolute) + and hasattr(os, "O_NOFOLLOW") + and hasattr(os, "O_DIRECTORY"), + "predecessor path is not canonical/no-follow capable", + ) + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in absolute.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(absolute.name, leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + _require( + stat.S_ISREG(before.st_mode) + and before.st_nlink == 1 + and before.st_size == expected_bytes, + "predecessor source size/type changed", + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + _require(bool(chunk), "predecessor source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + _require( + ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) + == ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ), + "predecessor source changed during read", + ) + raw = b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + _require( + hashlib.sha256(raw).hexdigest() == expected_sha256, + "predecessor source SHA changed", + ) + return raw + + +def _load_r4_loader() -> ModuleType: + raw = _read_regular_nofollow( + R4_LOADER_PATH, + expected_bytes=R4_LOADER_BYTES, + expected_sha256=R4_LOADER_SHA256, + ) + name = "_review_a5_native_eight_hotpath_r4_loader_pinned_for_r5" + existing = sys.modules.get(name) + if existing is not None: + return existing + module = ModuleType(name) + module.__file__ = os.fspath(R4_LOADER_PATH) + module.__package__ = "" + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(R4_LOADER_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +_r4_loader = _load_r4_loader() +_r4 = _r4_loader.load( + module_name="_review_a5_native_eight_hotpath_r4_pinned_for_r5" +) +_require( + dict(_r4.source_identity()) + == {"sha256": R4_RUNTIME_SHA256, "bytes": R4_RUNTIME_BYTES}, + "loaded R4 runtime identity changed", +) + + +def source_identity() -> Mapping[str, Any]: + value = globals().get("__review_loaded_source_identity__") + _require( + isinstance(value, Mapping) + and type(value.get("sha256")) is str + and _SHA_RE.fullmatch(value["sha256"]) is not None + and type(value.get("bytes")) is int + and value["bytes"] > 0, + "R5 must be loaded through its exact-byte loader", + ) + return MappingProxyType(dict(value)) + + +def _history_chain_digest(history: Any) -> str: + rows = _r4._validate_history_rows(history) + pairs = [ + [row["epoch"], row["step_identity_chain_sha256"]] + for row in rows + ] + payload = ( + json.dumps( + pairs, + sort_keys=False, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + return hashlib.sha256( + HISTORY_CHAIN_DIGEST_DOMAIN.encode("ascii") + b"\0" + payload + ).hexdigest() + + +def _retire_checkpoint_provenance(checkpoint: Any) -> None: + _CHECKPOINT_PROVENANCE.pop(id(checkpoint), None) + + +def _register_checkpoint_provenance( + checkpoint: dict[str, Any], + *, + origin: str, + trusted_entry_sha256: str | None = None, +) -> None: + _require(type(checkpoint) is dict, "checkpoint must be one plain mapping") + _retire_checkpoint_provenance(checkpoint) + chain = _r4._validate_checkpoint_history_chain(checkpoint) + history = checkpoint["development_history"] + _require( + origin == "r4_creation" + or origin.startswith("manager_verified_load:"), + "checkpoint provenance origin changed", + ) + if origin == "r4_creation": + _require( + trusted_entry_sha256 is None, + "created checkpoint cannot claim a manager entry", + ) + else: + _require( + type(trusted_entry_sha256) is str + and _SHA_RE.fullmatch(trusted_entry_sha256) is not None, + "manager-verified checkpoint entry SHA changed", + ) + _require( + type(checkpoint.get("plan_sha256")) is str + and _SHA_RE.fullmatch(checkpoint["plan_sha256"]) is not None + and type(checkpoint.get("run_identity_sha256")) is str + and _SHA_RE.fullmatch(checkpoint["run_identity_sha256"]) is not None + and type(checkpoint.get("cell_id")) is str + and bool(checkpoint["cell_id"]), + "checkpoint cheap provenance fields changed", + ) + rng_state = checkpoint.get("rng_state") + torch_cpu = ( + rng_state.get("torch_cpu") + if type(rng_state) is dict + else None + ) + _require( + type(torch_cpu) is torch.Tensor, + "checkpoint provenance lacks its Torch RNG identity sentinel", + ) + key = id(checkpoint) + nonce = object() + + def retire_abandoned(_observed: weakref.ReferenceType[Any]) -> None: + current = _CHECKPOINT_PROVENANCE.get(key) + if current is not None and current.get("nonce") is nonce: + _CHECKPOINT_PROVENANCE.pop(key, None) + + sentinel_reference = weakref.ref(torch_cpu, retire_abandoned) + _CHECKPOINT_PROVENANCE[key] = MappingProxyType( + { + "chain": chain, + "history_chain_digest": _history_chain_digest(history), + "history_owner": history, + "torch_cpu_sentinel": sentinel_reference, + "epoch": checkpoint["epoch"], + "plan_sha256": checkpoint["plan_sha256"], + "run_identity_sha256": checkpoint["run_identity_sha256"], + "cell_id": checkpoint["cell_id"], + "origin": origin, + "trusted_entry_sha256": trusted_entry_sha256 or "", + "nonce": nonce, + } + ) + + +def _require_checkpoint_provenance( + checkpoint: Any, +) -> Mapping[str, Any]: + try: + _require( + type(checkpoint) is dict, + "checkpoint must be one plain mapping", + ) + chain = _r4._validate_checkpoint_history_chain(checkpoint) + history = checkpoint["development_history"] + rng_state = checkpoint.get("rng_state") + torch_cpu = ( + rng_state.get("torch_cpu") + if type(rng_state) is dict + else None + ) + provenance = _CHECKPOINT_PROVENANCE.get(id(checkpoint)) + _require( + isinstance(provenance, Mapping) + and provenance.get("history_owner") is history + and callable(provenance.get("torch_cpu_sentinel")) + and provenance["torch_cpu_sentinel"]() is torch_cpu + and provenance.get("chain") == chain + and provenance.get("history_chain_digest") + == _history_chain_digest(history) + and provenance.get("epoch") == checkpoint.get("epoch") + and provenance.get("plan_sha256") + == checkpoint.get("plan_sha256") + and provenance.get("run_identity_sha256") + == checkpoint.get("run_identity_sha256") + and provenance.get("cell_id") == checkpoint.get("cell_id") + and ( + provenance.get("origin") == "r4_creation" + or str(provenance.get("origin", "")).startswith( + "manager_verified_load:" + ) + ), + ( + "checkpoint lacks unchanged R5 constituent-bound " + "creation/manager-load provenance" + ), + ) + _require( + provenance["origin"] == "r4_creation" + or _SHA_RE.fullmatch( + str(provenance["trusted_entry_sha256"]) + ) + is not None, + ( + "manager-loaded checkpoint lacks its immutable " + "checkpoint-entry SHA receipt" + ), + ) + return provenance + except BaseException: + _retire_checkpoint_provenance(checkpoint) + raise + + +def _patch_lifecycle_guards(core: ModuleType) -> None: + if getattr( + core, "_review_a5_hotpath_r5_lifecycle_guards_installed", False + ): + return + r4_validate = core._validate_checkpoint_value + r4_restore = core._restore_completed_epoch + manager = core.CheckpointManager + r4_commit = manager.commit + + def validate_checkpoint_value(*args: Any, **kwargs: Any) -> Any: + checkpoint = args[0] if args else kwargs["value"] + try: + return r4_validate(*args, **kwargs) + except BaseException: + _retire_checkpoint_provenance(checkpoint) + raise + + def restore_completed_epoch(*args: Any, **kwargs: Any) -> None: + checkpoint = kwargs["checkpoint"] + try: + r4_restore(*args, **kwargs) + finally: + _retire_checkpoint_provenance(checkpoint) + + def commit( + self: Any, + checkpoint: Mapping[str, Any], + *, + improved: bool, + epoch: int, + development_loss: float, + ) -> Mapping[str, Any]: + try: + return r4_commit( + self, + checkpoint, + improved=improved, + epoch=epoch, + development_loss=development_loss, + ) + finally: + _retire_checkpoint_provenance(checkpoint) + + core._review_a5_hotpath_r5_original_validate_checkpoint_value = r4_validate + core._review_a5_hotpath_r5_original_restore_completed_epoch = r4_restore + manager._review_a5_hotpath_r5_original_commit = r4_commit + core._validate_checkpoint_value = validate_checkpoint_value + core._restore_completed_epoch = restore_completed_epoch + manager.commit = commit + core._review_a5_hotpath_r5_lifecycle_guards_installed = True + manager._review_a5_hotpath_r5_commit_guard_installed = True + + +def _patch_active_r4_provenance_globals(core: ModuleType) -> None: + manager = core.CheckpointManager + functions = ( + core._checkpoint_value, + core._validate_checkpoint_value, + core._restore_completed_epoch, + manager.commit, + manager.load_latest, + manager.load_best, + ) + observed_r4_globals: list[dict[str, Any]] = [] + for function in functions: + namespace = getattr(function, "__globals__", None) + if ( + type(namespace) is dict + and namespace.get("SCHEMA") + == "bertose_review_a5_native_eight_hotpath_20260726_r4" + and all( + name in namespace + for name in ( + "_register_checkpoint_provenance", + "_require_checkpoint_provenance", + "_retire_checkpoint_provenance", + ) + ) + ): + if not any(namespace is item for item in observed_r4_globals): + observed_r4_globals.append(namespace) + _require( + bool(observed_r4_globals), + "active core does not expose one exact installed R4 wrapper namespace", + ) + for namespace in observed_r4_globals: + namespace["_CHECKPOINT_PROVENANCE"] = _CHECKPOINT_PROVENANCE + namespace["_register_checkpoint_provenance"] = ( + _register_checkpoint_provenance + ) + namespace["_require_checkpoint_provenance"] = ( + _require_checkpoint_provenance + ) + namespace["_retire_checkpoint_provenance"] = ( + _retire_checkpoint_provenance + ) + + +def install_optimized_execution_layer( + r9_module: ModuleType, +) -> Mapping[str, Any]: + """Install frozen R4, then the minimal R5 provenance-lifecycle repair.""" + + _require(isinstance(r9_module, ModuleType), "R5 installer requires R9 module") + existing = _INSTALLATIONS.get(id(r9_module)) + if existing is not None: + return existing + predecessor_r4 = _r4.install_optimized_execution_layer(r9_module) + core, _execution_r8, _adapter_module, _r5 = ( + _r4._r3._r2._resolve_components(r9_module) + ) + _require( + predecessor_r4.get("source_sha256") == R4_RUNTIME_SHA256 + and predecessor_r4.get("source_bytes") == R4_RUNTIME_BYTES + and predecessor_r4.get("scientific_launch_authorized") is False + and predecessor_r4["predecessor_r3_receipt"].get( + "scientific_launch_authorized" + ) + is False, + "installed R4 receipt identity/authorization changed", + ) + + # R4 checkpoint/manager wrappers resolve these globals dynamically. + _r4._CHECKPOINT_PROVENANCE = _CHECKPOINT_PROVENANCE + _r4._register_checkpoint_provenance = _register_checkpoint_provenance + _r4._require_checkpoint_provenance = _require_checkpoint_provenance + _r4._retire_checkpoint_provenance = _retire_checkpoint_provenance + _patch_active_r4_provenance_globals(core) + _patch_lifecycle_guards(core) + + identity = dict(source_identity()) + receipt_value: dict[str, Any] = { + "schema": SCHEMA, + "status": STATUS, + "source_sha256": identity["sha256"], + "source_bytes": identity["bytes"], + "predecessor_r4_loader_sha256": R4_LOADER_SHA256, + "predecessor_r4_runtime_sha256": R4_RUNTIME_SHA256, + "predecessor_r4_receipt": dict(predecessor_r4), + } + for key, value in predecessor_r4.items(): + if key not in {"schema", "status", "source_sha256", "source_bytes"}: + receipt_value[key] = value + receipt_value.update( + { + "checkpoint_provenance_actual_constituent_identity_bound": True, + "checkpoint_provenance_full_history_chain_digest": True, + "checkpoint_provenance_history_chain_digest_max_rows": 100, + "checkpoint_provenance_cleanup_paths": [ + "validation_failure", + "commit_success", + "commit_failure", + "restore_success", + "restore_failure", + "abandoned_creation_or_load_gc", + ], + "checkpoint_provenance_additional_full_state_hashes": 0, + "checkpoint_valid_bytes_changed": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + ) + receipt = MappingProxyType(receipt_value) + _INSTALLATIONS[id(r9_module)] = receipt + return receipt + + +__all__ = [ + "NativeEightHotpathR5Error", + "SCHEMA", + "STATUS", + "install_optimized_execution_layer", + "source_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/load_review_a5_native_eight_hotpath_r6.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/load_review_a5_native_eight_hotpath_r6.py new file mode 100644 index 0000000000000000000000000000000000000000..63f3e18a0f56c182720c337781eef351743e5aa9 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/load_review_a5_native_eight_hotpath_r6.py @@ -0,0 +1,133 @@ +"""Exact-byte loader for the isolated native-eight hot-path R6 source.""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + + +SOURCE_PATH = Path(__file__).absolute().with_name( + "review_a5_native_eight_hotpath_r6.py" +) +SOURCE_SHA256 = "73b42e5131c64284c6f748ddf81b4d187dcb57f756c88c22240d189f2afc4cef" +SOURCE_BYTES = 17_373 + + +def _read_exact() -> bytes: + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in SOURCE_PATH.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(SOURCE_PATH.name, leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or before.st_size != SOURCE_BYTES + or before.st_mode & 0o222 + ): + raise RuntimeError("hot-path R6 source size/type changed") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("hot-path R6 source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ): + raise RuntimeError("hot-path R6 source changed during read") + raw = b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + if hashlib.sha256(raw).hexdigest() != SOURCE_SHA256: + raise RuntimeError("hot-path R6 source SHA changed") + return raw + + +def load(*, module_name: str | None = None) -> ModuleType: + raw = _read_exact() + name = module_name or ( + "_review_a5_native_eight_hotpath_r6_" + SOURCE_SHA256[:20] + ) + existing = sys.modules.get(name) + if existing is not None: + identity = getattr(existing, "__review_loaded_source_identity__", None) + if not isinstance(identity, MappingProxyType) or dict(identity) != { + "sha256": SOURCE_SHA256, + "bytes": SOURCE_BYTES, + }: + raise RuntimeError("hot-path R6 module slot changed") + return existing + module = ModuleType(name) + module.__file__ = os.fspath(SOURCE_PATH) + module.__package__ = "" + module.__review_loaded_source_identity__ = MappingProxyType( + {"sha256": SOURCE_SHA256, "bytes": SOURCE_BYTES} + ) + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +def install_optimized_execution_layer( + r9_module: ModuleType, +) -> Mapping[str, Any]: + return load().install_optimized_execution_layer(r9_module) + + +def source_identity() -> Mapping[str, Any]: + return load().source_identity() + + +__all__ = [ + "SOURCE_BYTES", + "SOURCE_PATH", + "SOURCE_SHA256", + "install_optimized_execution_layer", + "load", + "source_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6.py new file mode 100644 index 0000000000000000000000000000000000000000..b4ff127f7dc7af8c2a97386522a240a5622e4559 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6.py @@ -0,0 +1,500 @@ +"""Strong-owner provenance successor layered over frozen hot-path R5. + +R6 changes no checkpoint bytes, training arithmetic, data, device policy, or +full-state hashing policy. It supersedes R5's constituent-bound sidecar with +one process-local record that strongly owns the exact checkpoint dictionary. +Registration replaces any prior record, successful validation transitions to +a fresh validated record, and commit/restore or any failure clears the record. + +Frozen R5/R4/R3/R2 sources remain unchanged. R5 is retained as negative +predecessor evidence and is not launchable because a shallow impostor reusing +its retained constituents could satisfy its provenance predicate. +""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import re +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + + +SCHEMA = "bertose_review_a5_native_eight_hotpath_20260726_r6" +STATUS = "INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED" +R5_LOADER_PATH = ( + Path(__file__).absolute().parents[1] + / "a5_native_eight_hotpath_20260726_r5" + / "load_review_a5_native_eight_hotpath_r5.py" +) +R5_LOADER_SHA256 = ( + "864a05e86c5ea91318b11373d2cdffcdd2ddd0777f141cb7ef0305f779a42ea6" +) +R5_LOADER_BYTES = 4_013 +R5_RUNTIME_SHA256 = ( + "ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8" +) +R5_RUNTIME_BYTES = 17_677 +_SHA_RE = re.compile(r"^[0-9a-f]{64}$") +_INSTALLATIONS: dict[int, Mapping[str, Any]] = {} +_CHECKPOINT_PROVENANCE: dict[int, Mapping[str, Any]] = {} +_PROVENANCE_GENERATION = 0 + + +class NativeEightHotpathR6Error(RuntimeError): + """The isolated R6 strong-owner provenance contract changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightHotpathR6Error(message) + + +def _read_regular_nofollow( + path: Path, *, expected_bytes: int, expected_sha256: str +) -> bytes: + absolute = Path(path) + _require( + absolute.is_absolute() + and os.path.normpath(os.fspath(absolute)) == os.fspath(absolute) + and hasattr(os, "O_NOFOLLOW") + and hasattr(os, "O_DIRECTORY"), + "predecessor path is not canonical/no-follow capable", + ) + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in absolute.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(absolute.name, leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + _require( + stat.S_ISREG(before.st_mode) + and before.st_nlink == 1 + and before.st_size == expected_bytes, + "predecessor source size/type changed", + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + _require(bool(chunk), "predecessor source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + _require( + ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) + == ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ), + "predecessor source changed during read", + ) + raw = b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + _require( + hashlib.sha256(raw).hexdigest() == expected_sha256, + "predecessor source SHA changed", + ) + return raw + + +def _load_r5_loader() -> ModuleType: + raw = _read_regular_nofollow( + R5_LOADER_PATH, + expected_bytes=R5_LOADER_BYTES, + expected_sha256=R5_LOADER_SHA256, + ) + name = "_review_a5_native_eight_hotpath_r5_loader_pinned_for_r6" + existing = sys.modules.get(name) + if existing is not None: + return existing + module = ModuleType(name) + module.__file__ = os.fspath(R5_LOADER_PATH) + module.__package__ = "" + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(R5_LOADER_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +_r5_loader = _load_r5_loader() +_r5 = _r5_loader.load( + module_name="_review_a5_native_eight_hotpath_r5_pinned_for_r6" +) +_require( + dict(_r5.source_identity()) + == {"sha256": R5_RUNTIME_SHA256, "bytes": R5_RUNTIME_BYTES}, + "loaded R5 runtime identity changed", +) + + +def source_identity() -> Mapping[str, Any]: + value = globals().get("__review_loaded_source_identity__") + _require( + isinstance(value, Mapping) + and type(value.get("sha256")) is str + and _SHA_RE.fullmatch(value["sha256"]) is not None + and type(value.get("bytes")) is int + and value["bytes"] > 0, + "R6 must be loaded through its exact-byte loader", + ) + return MappingProxyType(dict(value)) + + +def _retire_checkpoint_provenance(_checkpoint: Any = None) -> None: + _CHECKPOINT_PROVENANCE.clear() + + +def _register_value( + checkpoint: dict[str, Any], + *, + origin: str, + trusted_entry_sha256: str | None, +) -> Mapping[str, Any]: + global _PROVENANCE_GENERATION + _require(type(checkpoint) is dict, "checkpoint must be one plain mapping") + chain = _r5._r4._validate_checkpoint_history_chain(checkpoint) + history = checkpoint["development_history"] + _require( + origin == "r4_creation" + or origin.startswith("manager_verified_load:") + or origin.startswith("r6_validated:"), + "checkpoint provenance origin changed", + ) + if origin.startswith("manager_verified_load:"): + _require( + type(trusted_entry_sha256) is str + and _SHA_RE.fullmatch(trusted_entry_sha256) is not None, + "manager-verified checkpoint entry SHA changed", + ) + else: + _require( + trusted_entry_sha256 is None + or ( + type(trusted_entry_sha256) is str + and _SHA_RE.fullmatch(trusted_entry_sha256) is not None + ), + "validated checkpoint entry SHA changed", + ) + _require( + type(checkpoint.get("plan_sha256")) is str + and _SHA_RE.fullmatch(checkpoint["plan_sha256"]) is not None + and type(checkpoint.get("run_identity_sha256")) is str + and _SHA_RE.fullmatch(checkpoint["run_identity_sha256"]) is not None + and type(checkpoint.get("cell_id")) is str + and bool(checkpoint["cell_id"]), + "checkpoint cheap provenance fields changed", + ) + _CHECKPOINT_PROVENANCE.clear() + _PROVENANCE_GENERATION += 1 + record = MappingProxyType( + { + "checkpoint_owner": checkpoint, + "chain": chain, + "history_chain_digest": _r5._history_chain_digest(history), + "epoch": checkpoint["epoch"], + "plan_sha256": checkpoint["plan_sha256"], + "run_identity_sha256": checkpoint["run_identity_sha256"], + "cell_id": checkpoint["cell_id"], + "origin": origin, + "trusted_entry_sha256": trusted_entry_sha256 or "", + "generation": _PROVENANCE_GENERATION, + } + ) + _CHECKPOINT_PROVENANCE[id(checkpoint)] = record + _require( + len(_CHECKPOINT_PROVENANCE) == 1, + "more than one checkpoint provenance record exists", + ) + return record + + +def _register_checkpoint_provenance( + checkpoint: dict[str, Any], + *, + origin: str, + trusted_entry_sha256: str | None = None, +) -> None: + _register_value( + checkpoint, + origin=origin, + trusted_entry_sha256=trusted_entry_sha256, + ) + + +def _require_checkpoint_provenance( + checkpoint: Any, +) -> Mapping[str, Any]: + try: + _require( + type(checkpoint) is dict, + "checkpoint must be one plain mapping", + ) + chain = _r5._r4._validate_checkpoint_history_chain(checkpoint) + provenance = _CHECKPOINT_PROVENANCE.get(id(checkpoint)) + _require( + len(_CHECKPOINT_PROVENANCE) == 1 + and isinstance(provenance, Mapping) + and provenance.get("checkpoint_owner") is checkpoint + and provenance.get("chain") == chain + and provenance.get("history_chain_digest") + == _r5._history_chain_digest( + checkpoint["development_history"] + ) + and provenance.get("epoch") == checkpoint.get("epoch") + and provenance.get("plan_sha256") + == checkpoint.get("plan_sha256") + and provenance.get("run_identity_sha256") + == checkpoint.get("run_identity_sha256") + and provenance.get("cell_id") == checkpoint.get("cell_id") + and ( + provenance.get("origin") == "r4_creation" + or str(provenance.get("origin", "")).startswith( + "manager_verified_load:" + ) + or str(provenance.get("origin", "")).startswith( + "r6_validated:" + ) + ), + "checkpoint lacks exact R6 strong-owner provenance", + ) + return provenance + except BaseException: + _retire_checkpoint_provenance(checkpoint) + raise + + +def _patch_active_provenance_globals(core: ModuleType) -> None: + manager = core.CheckpointManager + functions = ( + core._checkpoint_value, + core._validate_checkpoint_value, + core._restore_completed_epoch, + manager.commit, + manager.load_latest, + manager.load_best, + ) + observed: list[dict[str, Any]] = [] + accepted_schemas = { + "bertose_review_a5_native_eight_hotpath_20260726_r4", + "bertose_review_a5_native_eight_hotpath_20260726_r5", + } + for function in functions: + namespace = getattr(function, "__globals__", None) + if ( + type(namespace) is dict + and namespace.get("SCHEMA") in accepted_schemas + and all( + name in namespace + for name in ( + "_register_checkpoint_provenance", + "_require_checkpoint_provenance", + "_retire_checkpoint_provenance", + ) + ) + and not any(namespace is item for item in observed) + ): + observed.append(namespace) + _require( + bool(observed), + "active core lacks installed R4/R5 provenance wrapper namespaces", + ) + for namespace in observed: + namespace["_CHECKPOINT_PROVENANCE"] = _CHECKPOINT_PROVENANCE + namespace["_register_checkpoint_provenance"] = ( + _register_checkpoint_provenance + ) + namespace["_require_checkpoint_provenance"] = ( + _require_checkpoint_provenance + ) + namespace["_retire_checkpoint_provenance"] = ( + _retire_checkpoint_provenance + ) + + +def _patch_lifecycle_guards(core: ModuleType) -> None: + if getattr( + core, "_review_a5_hotpath_r6_lifecycle_guards_installed", False + ): + return + r5_validate = core._validate_checkpoint_value + r5_restore = core._restore_completed_epoch + manager = core.CheckpointManager + r5_commit = manager.commit + + def validate_checkpoint_value(*args: Any, **kwargs: Any) -> Any: + checkpoint = args[0] if args else kwargs["value"] + prior: Mapping[str, Any] | None = None + try: + prior = _require_checkpoint_provenance(checkpoint) + result = r5_validate(*args, **kwargs) + except BaseException: + _retire_checkpoint_provenance(checkpoint) + raise + _retire_checkpoint_provenance(checkpoint) + trusted = str(prior.get("trusted_entry_sha256", "")) or None + _register_value( + checkpoint, + origin=f"r6_validated:{prior['origin']}", + trusted_entry_sha256=trusted, + ) + return result + + def restore_completed_epoch(*args: Any, **kwargs: Any) -> None: + checkpoint = kwargs["checkpoint"] + try: + r5_restore(*args, **kwargs) + finally: + _retire_checkpoint_provenance(checkpoint) + + def commit( + self: Any, + checkpoint: Mapping[str, Any], + *, + improved: bool, + epoch: int, + development_loss: float, + ) -> Mapping[str, Any]: + try: + return r5_commit( + self, + checkpoint, + improved=improved, + epoch=epoch, + development_loss=development_loss, + ) + finally: + _retire_checkpoint_provenance(checkpoint) + + core._review_a5_hotpath_r6_original_validate_checkpoint_value = r5_validate + core._review_a5_hotpath_r6_original_restore_completed_epoch = r5_restore + manager._review_a5_hotpath_r6_original_commit = r5_commit + core._validate_checkpoint_value = validate_checkpoint_value + core._restore_completed_epoch = restore_completed_epoch + manager.commit = commit + core._review_a5_hotpath_r6_lifecycle_guards_installed = True + manager._review_a5_hotpath_r6_commit_guard_installed = True + + +def install_optimized_execution_layer( + r9_module: ModuleType, +) -> Mapping[str, Any]: + """Install frozen R5, then the bounded strong-owner R6 sidecar.""" + + _require(isinstance(r9_module, ModuleType), "R6 installer requires R9 module") + existing = _INSTALLATIONS.get(id(r9_module)) + if existing is not None: + return existing + predecessor_r5 = _r5.install_optimized_execution_layer(r9_module) + core, _execution_r8, _adapter_module, _executor_r5 = ( + _r5._r4._r3._r2._resolve_components(r9_module) + ) + _require( + predecessor_r5.get("source_sha256") == R5_RUNTIME_SHA256 + and predecessor_r5.get("source_bytes") == R5_RUNTIME_BYTES + and predecessor_r5.get("scientific_launch_authorized") is False, + "installed R5 receipt identity/authorization changed", + ) + for module in (_r5, _r5._r4): + module._CHECKPOINT_PROVENANCE = _CHECKPOINT_PROVENANCE + module._register_checkpoint_provenance = ( + _register_checkpoint_provenance + ) + module._require_checkpoint_provenance = ( + _require_checkpoint_provenance + ) + module._retire_checkpoint_provenance = ( + _retire_checkpoint_provenance + ) + _patch_active_provenance_globals(core) + _patch_lifecycle_guards(core) + + identity = dict(source_identity()) + receipt_value: dict[str, Any] = { + "schema": SCHEMA, + "status": STATUS, + "source_sha256": identity["sha256"], + "source_bytes": identity["bytes"], + "predecessor_r5_loader_sha256": R5_LOADER_SHA256, + "predecessor_r5_runtime_sha256": R5_RUNTIME_SHA256, + "predecessor_r5_receipt": dict(predecessor_r5), + } + for key, value in predecessor_r5.items(): + if ( + key not in {"schema", "status", "source_sha256", "source_bytes"} + and not key.startswith("checkpoint_provenance_") + ): + receipt_value[key] = value + receipt_value.update( + { + "predecessor_r5_status": ( + "SUPERSEDED_NOT_LAUNCHABLE_" + "SAME_CONSTITUENT_IMPOSTOR_ACCEPTANCE" + ), + "predecessor_r5_launch_authorized": False, + "checkpoint_provenance_strong_checkpoint_owner": True, + "checkpoint_provenance_max_outstanding_records": 1, + "checkpoint_provenance_registration_replaces_prior": True, + "checkpoint_provenance_validation_success_transitions_record": True, + "checkpoint_provenance_validation_failure_retires": True, + "checkpoint_provenance_commit_restore_success_failure_retires": True, + "checkpoint_provenance_abandoned_gc_cleanup_claimed": False, + "checkpoint_provenance_process_lifetime_bounded_records": 1, + "checkpoint_provenance_full_history_chain_digest": True, + "checkpoint_provenance_history_chain_digest_max_rows": 100, + "checkpoint_provenance_additional_full_state_hashes": 0, + "checkpoint_valid_bytes_changed": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + ) + receipt = MappingProxyType(receipt_value) + _INSTALLATIONS[id(r9_module)] = receipt + return receipt + + +__all__ = [ + "NativeEightHotpathR6Error", + "SCHEMA", + "STATUS", + "install_optimized_execution_layer", + "source_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/load_review_a5_native_eight_hotpath_r7.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/load_review_a5_native_eight_hotpath_r7.py new file mode 100644 index 0000000000000000000000000000000000000000..d60c1b7ce215752b0ee14d6cada890791a6e5398 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/load_review_a5_native_eight_hotpath_r7.py @@ -0,0 +1,133 @@ +"""Exact-byte loader for the isolated native-eight hot-path R7 source.""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + + +SOURCE_PATH = Path(__file__).absolute().with_name( + "review_a5_native_eight_hotpath_r7.py" +) +SOURCE_SHA256 = "c0cb618f7856daf24666dbec07ff51b86e3fbd52c073c58bd1b7151122714f47" +SOURCE_BYTES = 20_454 + + +def _read_exact() -> bytes: + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in SOURCE_PATH.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(SOURCE_PATH.name, leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or before.st_size != SOURCE_BYTES + or before.st_mode & 0o222 + ): + raise RuntimeError("hot-path R7 source size/type changed") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("hot-path R7 source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ): + raise RuntimeError("hot-path R7 source changed during read") + raw = b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + if hashlib.sha256(raw).hexdigest() != SOURCE_SHA256: + raise RuntimeError("hot-path R7 source SHA changed") + return raw + + +def load(*, module_name: str | None = None) -> ModuleType: + raw = _read_exact() + name = module_name or ( + "_review_a5_native_eight_hotpath_r7_" + SOURCE_SHA256[:20] + ) + existing = sys.modules.get(name) + if existing is not None: + identity = getattr(existing, "__review_loaded_source_identity__", None) + if not isinstance(identity, MappingProxyType) or dict(identity) != { + "sha256": SOURCE_SHA256, + "bytes": SOURCE_BYTES, + }: + raise RuntimeError("hot-path R7 module slot changed") + return existing + module = ModuleType(name) + module.__file__ = os.fspath(SOURCE_PATH) + module.__package__ = "" + module.__review_loaded_source_identity__ = MappingProxyType( + {"sha256": SOURCE_SHA256, "bytes": SOURCE_BYTES} + ) + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +def install_optimized_execution_layer( + r9_module: ModuleType, +) -> Mapping[str, Any]: + return load().install_optimized_execution_layer(r9_module) + + +def source_identity() -> Mapping[str, Any]: + return load().source_identity() + + +__all__ = [ + "SOURCE_BYTES", + "SOURCE_PATH", + "SOURCE_SHA256", + "install_optimized_execution_layer", + "load", + "source_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7.py new file mode 100644 index 0000000000000000000000000000000000000000..431a841e0187b4fe1c56422b037424b956d66032 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7.py @@ -0,0 +1,613 @@ +"""CUDA map-location RNG metadata normalization over frozen hot-path R6. + +CheckpointManager intentionally loads model and optimizer tensors onto the +requested execution device. ``torch.load(map_location=cuda)`` also moves the +small NumPy/Torch RNG metadata tensors to CUDA, while the frozen R4 validator +correctly requires the canonical RNG representation on CPU. R7 fixes that +device-boundary mismatch at both manager load methods. After the predecessor +has verified the immutable checkpoint entry and registered strong-owner +provenance, R7 returns a new checkpoint dictionary whose three RNG tensors are +losslessly CPU-cloned. All non-RNG constituents, including model and optimizer +states, remain the exact objects loaded on the requested execution device. + +R7 does not patch or weaken the frozen R4 validator, mutate the predecessor +checkpoint, touch process-global RNG state, or change persisted checkpoint +bytes. +""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import re +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + +import torch + + +SCHEMA = "bertose_review_a5_native_eight_hotpath_20260727_r7" +STATUS = "INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED" +R6_LOADER_PATH = ( + Path(__file__).absolute().parents[1] + / "a5_native_eight_hotpath_20260726_r6" + / "load_review_a5_native_eight_hotpath_r6.py" +) +R6_LOADER_SHA256 = ( + "e2496170942db844e4ebe71d4c098b0d0cf99540d3465ed7e8e9a113469cf7d2" +) +R6_LOADER_BYTES = 4_013 +R6_RUNTIME_SHA256 = ( + "73b42e5131c64284c6f748ddf81b4d187dcb57f756c88c22240d189f2afc4cef" +) +R6_RUNTIME_BYTES = 17_373 +_SHA_RE = re.compile(r"^[0-9a-f]{64}$") +_INSTALLATIONS: dict[int, Mapping[str, Any]] = {} + + +class NativeEightHotpathR7Error(RuntimeError): + """The isolated CUDA RNG metadata normalization contract changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightHotpathR7Error(message) + + +def _read_regular_nofollow( + path: Path, *, expected_bytes: int, expected_sha256: str +) -> bytes: + absolute = Path(path) + _require( + absolute.is_absolute() + and os.path.normpath(os.fspath(absolute)) == os.fspath(absolute) + and hasattr(os, "O_NOFOLLOW") + and hasattr(os, "O_DIRECTORY"), + "predecessor path is not canonical/no-follow capable", + ) + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in absolute.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(absolute.name, leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + _require( + stat.S_ISREG(before.st_mode) + and before.st_nlink == 1 + and before.st_size == expected_bytes, + "predecessor source size/type changed", + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + _require(bool(chunk), "predecessor source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + _require( + ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) + == ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ), + "predecessor source changed during read", + ) + raw = b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + _require( + hashlib.sha256(raw).hexdigest() == expected_sha256, + "predecessor source SHA changed", + ) + return raw + + +def _load_r6_loader() -> ModuleType: + raw = _read_regular_nofollow( + R6_LOADER_PATH, + expected_bytes=R6_LOADER_BYTES, + expected_sha256=R6_LOADER_SHA256, + ) + name = "_review_a5_native_eight_hotpath_r6_loader_pinned_for_r7" + existing = sys.modules.get(name) + if existing is not None: + return existing + module = ModuleType(name) + module.__file__ = os.fspath(R6_LOADER_PATH) + module.__package__ = "" + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(R6_LOADER_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +_r6_loader = _load_r6_loader() +_r6 = _r6_loader.load( + module_name="_review_a5_native_eight_hotpath_r6_pinned_for_r7" +) +_require( + dict(_r6.source_identity()) + == {"sha256": R6_RUNTIME_SHA256, "bytes": R6_RUNTIME_BYTES}, + "loaded R6 runtime identity changed", +) +_r4 = _r6._r5._r4 +_r3 = _r4._r3 +_predecessor_validate_rng = _r4._validate_rng_before_mutation +_CHECKPOINT_PROVENANCE = _r6._CHECKPOINT_PROVENANCE + + +def source_identity() -> Mapping[str, Any]: + value = globals().get("__review_loaded_source_identity__") + _require( + isinstance(value, Mapping) + and type(value.get("sha256")) is str + and _SHA_RE.fullmatch(value["sha256"]) is not None + and type(value.get("bytes")) is int + and value["bytes"] > 0, + "R7 must be loaded through its exact-byte loader", + ) + return MappingProxyType(dict(value)) + + +def _canonical_execution_device(device: Any) -> torch.device: + _require(type(device) is torch.device, "checkpoint load device changed") + if device.type == "cpu": + _require(device.index is None, "CPU checkpoint device index changed") + elif device.type == "cuda": + _require( + type(device.index) is int and device.index >= 0, + "CUDA checkpoint device must have one explicit index", + ) + else: + raise NativeEightHotpathR7Error( + "checkpoint load device must be CPU or CUDA" + ) + return device + + +def _require_tensor_structure( + value: Any, + *, + kind: str, + expected_device: torch.device, +) -> torch.Tensor: + _require( + type(value) is torch.Tensor + and value.device == expected_device + and value.is_contiguous(), + f"{kind} tensor source device/contiguity changed", + ) + if kind == "numpy_keys": + _require( + value.dtype == torch.int64 and tuple(value.shape) == (624,), + "NumPy RNG key tensor structure changed", + ) + else: + _require( + value.dtype == torch.uint8 + and value.ndim == 1 + and value.numel() > 0, + f"{kind} tensor structure changed", + ) + return value + + +def _cpu_clone(value: torch.Tensor, *, label: str) -> torch.Tensor: + cloned = value.detach().to(device="cpu").clone() + _require( + cloned.device.type == "cpu" + and cloned.dtype == value.dtype + and tuple(cloned.shape) == tuple(value.shape) + and cloned.is_contiguous() + and cloned is not value + and ( + value.device.type != "cpu" + or cloned.data_ptr() != value.data_ptr() + ) + and torch.equal(cloned, value.detach().to(device="cpu")), + f"{label} CPU clone changed tensor structure/value/ownership", + ) + return cloned + + +def _tensor_devices(value: Any) -> list[torch.device]: + devices: list[torch.device] = [] + active: set[int] = set() + + def visit(item: Any) -> None: + if type(item) is torch.Tensor: + devices.append(item.device) + return + if isinstance(item, Mapping): + identity = id(item) + _require( + identity not in active, + "checkpoint tensor-device traversal encountered a cycle", + ) + active.add(identity) + try: + for key in sorted(item, key=lambda observed: str(observed)): + visit(item[key]) + finally: + active.remove(identity) + return + if isinstance(item, (list, tuple)): + identity = id(item) + _require( + identity not in active, + "checkpoint tensor-device traversal encountered a cycle", + ) + active.add(identity) + try: + for child in item: + visit(child) + finally: + active.remove(identity) + + visit(value) + return devices + + +def _require_loaded_tensor_device( + value: Any, + *, + label: str, + expected_device: torch.device, + require_nonempty: bool, +) -> None: + devices = _tensor_devices(value) + _require( + (not require_nonempty or bool(devices)) + and all(device == expected_device for device in devices), + f"{label} tensors did not remain on requested execution device", + ) + + +def _normalized_loaded_checkpoint( + core: ModuleType, + checkpoint: Any, + *, + device: torch.device, +) -> dict[str, Any]: + """Clone only canonical RNG tensors onto CPU in a new checkpoint root.""" + + expected_device = _canonical_execution_device(device) + _require(type(checkpoint) is dict, "loaded checkpoint root changed") + rng_state = checkpoint.get("rng_state") + _require( + type(rng_state) is dict + and set(rng_state) == {"python", "numpy", "torch_cpu", "torch_cuda"}, + "loaded RNG checkpoint fields changed", + ) + numpy_state = rng_state.get("numpy") + _require( + type(numpy_state) is dict + and set(numpy_state) + == {"name", "keys", "position", "has_gauss", "cached_gaussian"}, + "loaded NumPy RNG checkpoint fields changed", + ) + keys = _require_tensor_structure( + numpy_state.get("keys"), + kind="numpy_keys", + expected_device=expected_device, + ) + torch_cpu = _require_tensor_structure( + rng_state.get("torch_cpu"), + kind="torch_cpu_rng", + expected_device=expected_device, + ) + torch_cuda_value = rng_state.get("torch_cuda") + _require( + torch_cuda_value is not None or expected_device.type == "cpu", + "CUDA-loaded checkpoint lacks CUDA RNG state", + ) + torch_cuda = ( + None + if torch_cuda_value is None + else _require_tensor_structure( + torch_cuda_value, + kind="torch_cuda_rng", + expected_device=expected_device, + ) + ) + + _require_loaded_tensor_device( + checkpoint.get("model_state"), + label="model state", + expected_device=expected_device, + require_nonempty=True, + ) + _require_loaded_tensor_device( + checkpoint.get("optimizer_state"), + label="optimizer state", + expected_device=expected_device, + require_nonempty=True, + ) + outside_rng = { + key: item for key, item in checkpoint.items() if key != "rng_state" + } + _require_loaded_tensor_device( + outside_rng, + label="non-RNG checkpoint", + expected_device=expected_device, + require_nonempty=True, + ) + + normalized_numpy = dict(numpy_state) + normalized_numpy["keys"] = _cpu_clone(keys, label="NumPy RNG keys") + normalized_rng = dict(rng_state) + normalized_rng["numpy"] = normalized_numpy + normalized_rng["torch_cpu"] = _cpu_clone( + torch_cpu, label="Torch CPU RNG" + ) + normalized_rng["torch_cuda"] = ( + None + if torch_cuda is None + else _cpu_clone(torch_cuda, label="Torch CUDA RNG") + ) + normalized = dict(checkpoint) + normalized["rng_state"] = normalized_rng + _require( + normalized is not checkpoint + and normalized_rng is not rng_state + and normalized_numpy is not numpy_state + and normalized["model_state"] is checkpoint["model_state"] + and normalized["optimizer_state"] is checkpoint["optimizer_state"] + and all( + normalized[key] is checkpoint[key] + for key in checkpoint + if key != "rng_state" + ), + "load-boundary clone changed non-RNG checkpoint ownership", + ) + _predecessor_validate_rng( + core, + normalized_rng, + require_cuda=expected_device.type == "cuda", + cuda_device=( + expected_device if expected_device.type == "cuda" else None + ), + ) + return normalized + + +def _require_verified_entry( + checkpoint: dict[str, Any], + entry: Any, + *, + role: str, +) -> str: + _require( + role in {"latest", "best"} + and type(entry) is dict + and type(entry.get("sha256")) is str + and _SHA_RE.fullmatch(entry["sha256"]) is not None, + "predecessor checkpoint entry receipt changed", + ) + provenance = _r6._require_checkpoint_provenance(checkpoint) + expected_origin = f"manager_verified_load:{role}:{entry['sha256']}" + _require( + provenance.get("checkpoint_owner") is checkpoint + and provenance.get("origin") == expected_origin + and provenance.get("trusted_entry_sha256") == entry["sha256"], + "predecessor load provenance does not bind the verified entry", + ) + return entry["sha256"] + + +def _patch_checkpoint_load_boundary(core: ModuleType) -> None: + if getattr( + core.CheckpointManager, + "_review_a5_hotpath_r7_rng_cpu_load_boundary_installed", + False, + ): + return + manager = core.CheckpointManager + predecessor_load_latest = manager.load_latest + predecessor_load_best = manager.load_best + + def load_and_normalize( + predecessor: Any, + self: Any, + *, + device: torch.device, + role: str, + ) -> tuple[dict[str, Any], dict[str, Any]]: + loaded: dict[str, Any] | None = None + normalized: dict[str, Any] | None = None + try: + loaded, entry = predecessor(self, device=device) + trusted_entry_sha256 = _require_verified_entry( + loaded, entry, role=role + ) + normalized = _normalized_loaded_checkpoint( + core, loaded, device=device + ) + _r6._retire_checkpoint_provenance(loaded) + _r6._register_checkpoint_provenance( + normalized, + origin=( + "manager_verified_load:" + f"r7_rng_cpu:{role}:{trusted_entry_sha256}" + ), + trusted_entry_sha256=trusted_entry_sha256, + ) + replacement = _r6._require_checkpoint_provenance(normalized) + _require( + replacement.get("checkpoint_owner") is normalized + and replacement.get("trusted_entry_sha256") + == trusted_entry_sha256, + "normalized checkpoint strong-owner registration changed", + ) + return normalized, entry + except BaseException: + _r6._retire_checkpoint_provenance(loaded) + _r6._retire_checkpoint_provenance(normalized) + raise + + def load_latest( + self: Any, *, device: torch.device + ) -> tuple[dict[str, Any], dict[str, Any]]: + return load_and_normalize( + predecessor_load_latest, + self, + device=device, + role="latest", + ) + + def load_best( + self: Any, *, device: torch.device + ) -> tuple[dict[str, Any], dict[str, Any]]: + return load_and_normalize( + predecessor_load_best, + self, + device=device, + role="best", + ) + + manager._review_a5_hotpath_r7_original_load_latest = ( + predecessor_load_latest + ) + manager._review_a5_hotpath_r7_original_load_best = predecessor_load_best + manager.load_latest = load_latest + manager.load_best = load_best + manager._review_a5_hotpath_r7_rng_cpu_load_boundary_installed = True + + +def _adopt_existing_r6_provenance_if_present( + r9_module: ModuleType, +) -> bool: + """Share the already-installed exact R6 owner map used by test fixtures.""" + + global _CHECKPOINT_PROVENANCE + core, _execution_r8, _adapter_module, _executor_r5 = ( + _r6._r5._r4._r3._r2._resolve_components(r9_module) + ) + namespace = getattr(core._validate_checkpoint_value, "__globals__", None) + if not ( + type(namespace) is dict + and namespace.get("SCHEMA") == _r6.SCHEMA + and type(namespace.get("_CHECKPOINT_PROVENANCE")) is dict + ): + return False + active = namespace["_CHECKPOINT_PROVENANCE"] + _r6._CHECKPOINT_PROVENANCE = active + _r6._r5._CHECKPOINT_PROVENANCE = active + _r6._r5._r4._CHECKPOINT_PROVENANCE = active + _CHECKPOINT_PROVENANCE = active + return True + + +def install_optimized_execution_layer( + r9_module: ModuleType, +) -> Mapping[str, Any]: + """Install exact R6, then normalize RNG tensors at manager load boundary.""" + + _require(isinstance(r9_module, ModuleType), "R7 installer requires R9 module") + existing = _INSTALLATIONS.get(id(r9_module)) + if existing is not None: + return existing + adopted_existing_r6_provenance = ( + _adopt_existing_r6_provenance_if_present(r9_module) + ) + predecessor_r6 = _r6.install_optimized_execution_layer(r9_module) + _require( + predecessor_r6.get("source_sha256") == R6_RUNTIME_SHA256 + and predecessor_r6.get("source_bytes") == R6_RUNTIME_BYTES + and predecessor_r6.get("scientific_launch_authorized") is False, + "installed R6 receipt identity/authorization changed", + ) + core, _execution_r8, _adapter_module, _executor_r5 = ( + _r6._r5._r4._r3._r2._resolve_components(r9_module) + ) + _patch_checkpoint_load_boundary(core) + + identity = dict(source_identity()) + receipt_value: dict[str, Any] = { + "schema": SCHEMA, + "status": STATUS, + "source_sha256": identity["sha256"], + "source_bytes": identity["bytes"], + "predecessor_r6_loader_sha256": R6_LOADER_SHA256, + "predecessor_r6_runtime_sha256": R6_RUNTIME_SHA256, + "predecessor_r6_receipt": dict(predecessor_r6), + } + for key, item in predecessor_r6.items(): + if key not in {"schema", "status", "source_sha256", "source_bytes"}: + receipt_value[key] = item + receipt_value.update( + { + "checkpoint_load_latest_rng_cpu_normalized": True, + "checkpoint_load_best_rng_cpu_normalized": True, + "checkpoint_load_boundary_returns_new_root": True, + "checkpoint_load_boundary_non_rng_objects_preserved": True, + "cuda_map_location_rng_metadata_cpu_clone": True, + "existing_exact_r6_provenance_map_adopted": ( + adopted_existing_r6_provenance + ), + "loaded_rng_tensors_match_requested_device_required": True, + "loaded_model_optimizer_match_requested_device_required": True, + "loaded_non_rng_tensors_match_requested_device_required": True, + "rng_tensor_dtype_shape_contiguity_checks_preserved": True, + "rng_value_range_and_generator_parse_checks_preserved": True, + "frozen_r4_validator_patched": False, + "predecessor_checkpoint_mutated_by_normalization": False, + "persisted_checkpoint_bytes_changed": False, + "predecessor_provenance_retired": True, + "replacement_strong_owner_registered_same_entry_sha": True, + "load_failure_clears_provenance": True, + "global_rng_mutated_during_load_normalization": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + ) + receipt = MappingProxyType(receipt_value) + _INSTALLATIONS[id(r9_module)] = receipt + return receipt + + +__all__ = [ + "NativeEightHotpathR7Error", + "SCHEMA", + "STATUS", + "install_optimized_execution_layer", + "source_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_submission_20260727_r15_preparation/review_a5_native_eight_submission_contract_r15.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_submission_20260727_r15_preparation/review_a5_native_eight_submission_contract_r15.py new file mode 100644 index 0000000000000000000000000000000000000000..2bd304b7f907e4dd6ca4432c945945dce9641475 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_submission_20260727_r15_preparation/review_a5_native_eight_submission_contract_r15.py @@ -0,0 +1,884 @@ +"""Preparation-only Slurm contract for the strict-R6 native-eight successor. + +This source does not call Slurm and cannot submit training. It closes three +gaps in the older R13 submission surface before a later immutable executable +successor is built: + +* the job must enter through the final R15 scientific gate, which in turn + installs the exact R14 strict-R6 runtime, rather than through the R13 + sentinel binding; +* a read-only ``sbatch --test-only`` route check is required before the one + real ``sbatch --parsable`` call; and +* Nova's singleton pending-array cardinality may be rendered as either ``1`` + or ``1-1`` without weakening the exactly-one-node/task requirement. + +The static R6 terminal binding and the executable R15 wrapper/config/release +remain unresolved. All authorization flags therefore remain false. +""" + +from __future__ import annotations + +from dataclasses import dataclass +import hashlib +import os +from pathlib import Path +import re +import stat +from types import MappingProxyType +from typing import Any, Callable, Mapping, Sequence + + +SCHEMA = ( + "bertose_review_a5_native_eight_submission_contract_20260727_r15" +) +STATUS = "PREPARATION_ONLY_STATIC_TERMINAL_AND_EXECUTABLE_SUCCESSOR_UNRESOLVED" + +CELL_ORDER = ( + "A000", + "A100", + "A010", + "A001", + "A110", + "A101", + "A011", + "A111", +) +ARRAY_SPEC = "0-7" +STABLE_JOB_NAME = "a5-native8-s43-r15" +SEMANTIC_ARRAY_ID = "bertose-native8-seed43-corrected-20260727-r15" +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") +JOB_ID_RE = re.compile(r"[1-9][0-9]*\Z") +TASKS = frozenset(range(8)) + +DUPLICATE_JOB_NAME_RE = re.compile( + r"(?:" + r"a5-native8-s43-r[0-9]+" + r"|a5-native-s43-six-p15-r[0-9]+" + r"|a5-phase1-six-submit-r[0-9]+" + r")\Z" +) + +SQUEUE_ARGV = ( + "/usr/bin/squeue", + "-h", + "-r", + "--states=all", + "-o", + "%F|%K|%j|%T|%r", +) +SBATCH_TEST_ONLY_ARGV_PREFIX = ("/usr/bin/sbatch", "--test-only") +SBATCH_SUBMIT_ARGV_PREFIX = ("/usr/bin/sbatch", "--parsable") +SQUEUE_POST_ARGV_PREFIX = ("/usr/bin/squeue", "-h", "-r", "-j") +SQUEUE_POST_FORMAT = "%F|%K|%j|%T|%b" +SCONTROL_ARGV_PREFIX = ("/usr/bin/scontrol", "show", "job", "-o") + +WRITING_ROOT = Path(__file__).absolute().parents[4] +PROJECT_ROOT = WRITING_ROOT.parent +RUNTIME_ROOT = WRITING_ROOT / "review/multimodal/runtime" + +R14_STRICT_SOURCE = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260726_r14_r6_strict_candidate" + / "review_a5_native_eight_strict_successor_r14.py" +) +R14_STRICT_SOURCE_SHA256 = ( + "eda983e1b0c29357eb1b6e2f555f402a83b7176fb857488e9be5f5faed490b2d" +) +R14_STRICT_SOURCE_BYTES = 46_942 +R14_PREPARATION_BINDING = R14_STRICT_SOURCE.with_name( + "review_a5_native_eight_final_bindings_r14.py" +) +R14_PREPARATION_BINDING_SHA256 = ( + "bd6c704239e2bb4898dddda5c86274f41cd5b304b35d584ddfae3884e8bc8503" +) +R14_PREPARATION_BINDING_BYTES = 5_726 + +R13_BUILDER_SOURCE = ( + WRITING_ROOT + / "review/multimodal/scripts" + / "build_review_a5_native_eight_r11_successor_20260726_r13.py" +) +R13_BUILDER_SOURCE_SHA256 = ( + "0d577dfba85eb003de76c688e867595dc4cfb4d54c038b7382dc9a6ed4e26bab" +) +R13_BUILDER_SOURCE_BYTES = 30_438 +R13_CONTROLLER_SOURCE = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260726_r13_final_candidate" + / "review_a5_native_eight_direct_submit_controller_r13.py" +) +R13_CONTROLLER_SOURCE_SHA256 = ( + "2feb9a90db66ca277fb9e23d079ce8b089a31060e5670961a13b0e5146ed39a8" +) +R13_CONTROLLER_SOURCE_BYTES = 31_174 +R2_RUNTIME_SOURCE = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260722_r2" + / "review_a5_native_eight_training_runner_r2.py" +) +R2_RUNTIME_SOURCE_SHA256 = ( + "7e93b13b3212b3c97e30144f3e393a86a13411d5e82fe19bd55d43bc58587e30" +) +R2_RUNTIME_SOURCE_BYTES = 74_326 + +ISOLATED_NOVA_ROOT = ( + "/work/ratul1/supantha/" + "bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc" +) +R15_WRAPPER_RELATIVE = ( + "writing/review/multimodal/runtime/" + "a5_native_eight_training_20260727_r15_final/" + "run_review_a5_native_eight_training_r15.py" +) +R15_CONFIG_RELATIVE = ( + "writing/review/multimodal/inputs/" + "review_a5_native_eight_training_launch_config_20260727_r15.json" +) +R15_FINAL_BINDING_RELATIVE = ( + "writing/review/multimodal/runtime/" + "a5_native_eight_training_20260727_r15_final/" + "review_a5_native_eight_final_bindings_r15.py" +) +R15_FINAL_GATE_MODULE = ( + "review.multimodal.runtime." + "a5_native_eight_training_20260727_r15_current_static_terminal_" + "gate_preparation.review_a5_native_eight_current_terminal_gate_r15" +) +R15_FINAL_GATE_REQUIRED_CALLABLES = ( + "binding_source_value", + "validate_preparation_binding", + "validate_final_binding", + "load_bound_runtime", + "install_current_terminal_gate", + "source_closure_paths", +) +R15_STDOUT = ( + f"{ISOLATED_NOVA_ROOT}/writing/review/multimodal/outputs/" + "review_a5_native8_r15_%A_%a.out" +) +R15_STDERR = ( + f"{ISOLATED_NOVA_ROOT}/writing/review/multimodal/outputs/" + "review_a5_native8_r15_%A_%a.err" +) + +CLAIM_SCHEMA_R2 = ( + "bertose_review_a5_native_eight_duplicate_claim_20260722_r2" +) +DEVICE_LINEAGE_SCHEMA_R2 = ( + "bertose_review_a5_native_eight_device_lineage_20260722_r2" +) +CHECKPOINT_INDEX_SCHEMA_R2 = ( + "bertose_review_a5_native_eight_checkpoint_index_20260722_r2" +) +FINAL_RECEIPT_SCHEMA_R2 = ( + "bertose_review_a5_native_eight_final_selection_receipt_20260722_r2" +) + + +class NativeEightSubmissionContractR15Error(RuntimeError): + """The prospective array, duplicate, or receipt boundary changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightSubmissionContractR15Error(message) + + +@dataclass(frozen=True) +class CommandResult: + returncode: int + stdout: str + stderr: str + + +def _read_exact( + path: Path, + *, + expected_sha256: str, + expected_bytes: int, +) -> Mapping[str, Any]: + descriptor = os.open( + path, + os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0), + ) + try: + before = os.fstat(descriptor) + _require( + stat.S_ISREG(before.st_mode) + and before.st_nlink == 1 + and before.st_size == expected_bytes, + f"{path.name} source kind/size changed", + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + _require(bool(chunk), f"{path.name} source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + _require( + ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) + == ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ), + f"{path.name} source changed while read", + ) + finally: + os.close(descriptor) + payload = b"".join(chunks) + digest = hashlib.sha256(payload).hexdigest() + _require( + digest == expected_sha256 and len(payload) == expected_bytes, + f"{path.name} source identity changed", + ) + return MappingProxyType( + { + "absolute_path": os.fspath(path), + "sha256": digest, + "bytes": len(payload), + } + ) + + +def validate_bound_predecessor_sources() -> Mapping[str, Mapping[str, Any]]: + """Reopen the exact predecessors relevant to this scheduling correction.""" + + specifications = { + "r14_strict_runtime": ( + R14_STRICT_SOURCE, + R14_STRICT_SOURCE_SHA256, + R14_STRICT_SOURCE_BYTES, + ), + "r14_preparation_binding": ( + R14_PREPARATION_BINDING, + R14_PREPARATION_BINDING_SHA256, + R14_PREPARATION_BINDING_BYTES, + ), + "r13_builder": ( + R13_BUILDER_SOURCE, + R13_BUILDER_SOURCE_SHA256, + R13_BUILDER_SOURCE_BYTES, + ), + "r13_controller": ( + R13_CONTROLLER_SOURCE, + R13_CONTROLLER_SOURCE_SHA256, + R13_CONTROLLER_SOURCE_BYTES, + ), + "r2_runtime": ( + R2_RUNTIME_SOURCE, + R2_RUNTIME_SOURCE_SHA256, + R2_RUNTIME_SOURCE_BYTES, + ), + } + return MappingProxyType( + { + name: _read_exact( + path, + expected_sha256=sha256, + expected_bytes=byte_count, + ) + for name, (path, sha256, byte_count) in specifications.items() + } + ) + + +def render_sbatch( + *, + scientific_gate_sha256: str, + launch_config_sha256: str, + final_binding_sha256: str, + final_binding_bytes: int, +) -> bytes: + """Render the prospective exact array; rendering does not authorize it.""" + + _require( + SHA_RE.fullmatch(scientific_gate_sha256) is not None + and SHA_RE.fullmatch(launch_config_sha256) is not None + and SHA_RE.fullmatch(final_binding_sha256) is not None + and type(final_binding_bytes) is int + and final_binding_bytes > 0, + "prospective config/final-binding identities are unresolved", + ) + source = f"""#!/bin/bash +#SBATCH --job-name={STABLE_JOB_NAME} +#SBATCH --partition=scavenger +#SBATCH --account=ratul-scavenger +#SBATCH --qos=scavenger +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=4 +#SBATCH --gres=gpu:1 +#SBATCH --mem=144G +#SBATCH --time=2-00:00:00 +#SBATCH --array=0-7 +#SBATCH --requeue +#SBATCH --open-mode=append +#SBATCH --export=NONE +#SBATCH --chdir={ISOLATED_NOVA_ROOT} +#SBATCH --output={R15_STDOUT} +#SBATCH --error={R15_STDERR} + +set -euo pipefail +umask 077 + +PROJECT_ROOT={ISOLATED_NOVA_ROOT} +PYTHON=/work/ratul1/supantha/miniconda3/bin/python3.10 +RUNNER=${{PROJECT_ROOT}}/{R15_WRAPPER_RELATIVE} +LAUNCH_CONFIG=${{PROJECT_ROOT}}/{R15_CONFIG_RELATIVE} +FINAL_BINDING=${{PROJECT_ROOT}}/{R15_FINAL_BINDING_RELATIVE} +LAUNCH_CONFIG_SHA256={launch_config_sha256} +FINAL_BINDING_SHA256={final_binding_sha256} +FINAL_BINDING_BYTES={final_binding_bytes} +SCIENTIFIC_GATE_SOURCE_SHA256={scientific_gate_sha256} + +cd "${{PROJECT_ROOT}}" +test "$(pwd -P)" = "${{PROJECT_ROOT}}" +test -x "${{PYTHON}}" +test -f "${{RUNNER}}" +test -f "${{LAUNCH_CONFIG}}" +test -f "${{FINAL_BINDING}}" +[[ "${{LAUNCH_CONFIG_SHA256}}" =~ ^[0-9a-f]{{64}}$ ]] +[[ "${{FINAL_BINDING_SHA256}}" =~ ^[0-9a-f]{{64}}$ ]] +[[ "${{FINAL_BINDING_BYTES}}" =~ ^[1-9][0-9]*$ ]] +[[ "${{SCIENTIFIC_GATE_SOURCE_SHA256}}" =~ ^[0-9a-f]{{64}}$ ]] + +test "${{SLURM_NTASKS:?SLURM_NTASKS is required}}" = 1 +test "${{SLURM_NNODES:?SLURM_NNODES is required}}" = 1 +test "${{SLURM_CPUS_PER_TASK:?SLURM_CPUS_PER_TASK is required}}" = 4 +test "${{SLURM_GPUS_ON_NODE:?SLURM_GPUS_ON_NODE is required}}" = 1 +[[ "${{CUDA_VISIBLE_DEVICES:?CUDA_VISIBLE_DEVICES is required}}" != *,* ]] +[[ -n "${{SLURM_JOB_GPUS:?SLURM_JOB_GPUS is required}}" ]] +[[ "${{SLURM_JOB_GPUS}}" != *,* ]] +if [[ -n "${{SLURM_STEP_GPUS:-}}" ]]; then + [[ "${{SLURM_STEP_GPUS}}" != *,* ]] +fi + +case "${{SLURM_ARRAY_TASK_ID:?SLURM_ARRAY_TASK_ID is required}}" in + 0|1|2|3|4|5|6|7) ;; + *) echo "native-eight task is outside exact array 0-7: ${{SLURM_ARRAY_TASK_ID}}" >&2; exit 64 ;; +esac + +export PYTHONNOUSERSITE=1 +export PYTHONHASHSEED=0 +export PYTHONDONTWRITEBYTECODE=1 +export PYTHONUNBUFFERED=1 +export CUDA_DEVICE_ORDER=PCI_BUS_ID +export CUBLAS_WORKSPACE_CONFIG=:4096:8 +export OMP_NUM_THREADS=4 +export MKL_NUM_THREADS=4 + +exec "${{PYTHON}}" -I -W error "${{RUNNER}}" \\ + --scientific-gate-module "{R15_FINAL_GATE_MODULE}" \\ + --scientific-gate-source-sha256 "${{SCIENTIFIC_GATE_SOURCE_SHA256}}" \\ + --final-binding "${{FINAL_BINDING}}" \\ + --final-binding-sha256 "${{FINAL_BINDING_SHA256}}" \\ + --final-binding-bytes "${{FINAL_BINDING_BYTES}}" \\ + --launch-config "${{LAUNCH_CONFIG}}" \\ + --launch-config-sha256 "${{LAUNCH_CONFIG_SHA256}}" \\ + --array-task-id "${{SLURM_ARRAY_TASK_ID}}" \\ + --resume auto +""" + payload = source.encode("ascii") + validate_sbatch_surface(payload) + return payload + + +def _parse_directives(payload: bytes) -> Mapping[str, str | None]: + try: + source = payload.decode("ascii") + except UnicodeDecodeError as error: + raise NativeEightSubmissionContractR15Error( + "R15 sbatch is not ASCII" + ) from error + _require(source.startswith("#!/bin/bash\n"), "R15 sbatch shebang changed") + directives: dict[str, str | None] = {} + for line in source.splitlines(): + if not line.startswith("#SBATCH "): + continue + token = line[len("#SBATCH ") :] + _require( + token.startswith("--") and " " not in token and "\t" not in token, + "R15 sbatch directive spelling changed", + ) + if "=" in token: + key, value = token.split("=", 1) + _require(bool(value), "R15 sbatch directive argument is empty") + else: + key, value = token, None + _require(key not in directives, "R15 sbatch directive is duplicated") + directives[key] = value + return MappingProxyType(directives) + + +def validate_sbatch_surface(payload: bytes) -> Mapping[str, str | None]: + """Require one unthrottled, generic-GPU Scavenger array and exact resume.""" + + directives = _parse_directives(payload) + expected = { + "--job-name": STABLE_JOB_NAME, + "--partition": "scavenger", + "--account": "ratul-scavenger", + "--qos": "scavenger", + "--nodes": "1", + "--ntasks": "1", + "--cpus-per-task": "4", + "--gres": "gpu:1", + "--mem": "144G", + "--time": "2-00:00:00", + "--array": ARRAY_SPEC, + "--requeue": None, + "--open-mode": "append", + "--export": "NONE", + "--chdir": ISOLATED_NOVA_ROOT, + "--output": R15_STDOUT, + "--error": R15_STDERR, + } + _require(dict(directives) == expected, "R15 sbatch directive set changed") + source = payload.decode("ascii") + lowered = source.lower() + _require( + "0-7%" not in source + and "--constraint" not in directives + and "--nodelist" not in directives + and "--exclude" not in directives + and all( + token not in lowered + for token in ( + "gpu:a100", + "gpu:v100", + "gpu:h100", + "gpu:h200", + "gpu:l40s", + ) + ), + "R15 sbatch contains a throttle, device model, or placement constraint", + ) + executable = [ + line.strip() + for line in source.splitlines() + if line.strip() and not line.lstrip().startswith("#") + ] + _require( + not any( + re.search(r"(^|[;&|()\s])sbatch(?:\s|$)", line) + for line in executable + ) + and source.count('exec "${PYTHON}" -I -W error "${RUNNER}"') == 1 + and source.count('--array-task-id "${SLURM_ARRAY_TASK_ID}"') == 1 + and source.count("--resume auto") == 1 + and source.count("--scientific-gate-module") == 1 + and source.count("--scientific-gate-source-sha256") == 1 + and source.count("--final-binding-sha256") == 1, + "R15 execution, R14 integration, or resume command changed", + ) + return directives + + +def is_duplicate_job_name(value: str) -> bool: + return ( + type(value) is str + and DUPLICATE_JOB_NAME_RE.fullmatch(value) is not None + ) + + +def parse_duplicate_scan(result: CommandResult) -> frozenset[str]: + """Parse the corrected base-array/task query without scheduler mutation.""" + + _require( + type(result) is CommandResult + and result.returncode == 0 + and result.stderr == "", + "read-only duplicate scan failed", + ) + matches: set[str] = set() + for line in result.stdout.splitlines(): + columns = line.split("|") + _require(len(columns) == 5, "duplicate scan row is malformed") + array_job, task, job_name, state, reason = columns + _require( + JOB_ID_RE.fullmatch(array_job) is not None + and (task.isdigit() or task in {"", "N/A"}) + and bool(state) + and bool(reason), + "duplicate scan fields are malformed", + ) + if is_duplicate_job_name(job_name): + matches.add(array_job) + return frozenset(matches) + + +def cell_output_roots(output_root: Path) -> Mapping[str, str]: + _require( + output_root.is_absolute(), + "native-eight output root must be absolute", + ) + return MappingProxyType( + { + cell: os.fspath( + output_root + / f"review_native8_{SEMANTIC_ARRAY_ID}_{cell}_seed43" + ) + for cell in CELL_ORDER + } + ) + + +def validate_duplicate_output_preflight( + *, + scheduler_result: CommandResult, + output_roots: Mapping[str, str], + lexists: Callable[[str], bool] = os.path.lexists, +) -> Mapping[str, Any]: + matches = parse_duplicate_scan(scheduler_result) + _require(not matches, "an active native-eight array already exists") + _require( + set(output_roots) == set(CELL_ORDER) + and len(set(output_roots.values())) == len(CELL_ORDER) + and not any(lexists(path) for path in output_roots.values()), + "one or more native-eight cell output roots already exist/collide", + ) + return MappingProxyType( + { + "status": "PASS_NO_ACTIVE_OR_EXISTING_NATIVE_EIGHT_COPY", + "array": ARRAY_SPEC, + "cell_order": list(CELL_ORDER), + "active_array_match_count": 0, + "existing_cell_output_count": 0, + "one_copy_per_cell": True, + "scheduler_argv": list(SQUEUE_ARGV), + } + ) + + +def validate_test_only_result( + *, + sbatch_path: Path, + result: CommandResult, +) -> Mapping[str, Any]: + _require( + sbatch_path.is_absolute() + and type(result) is CommandResult + and result.returncode == 0, + "sbatch --test-only route proof failed", + ) + return MappingProxyType( + { + "status": "PASS_SLURM_TEST_ONLY_SCAVENGER_ROUTE", + "command_argv": [ + *SBATCH_TEST_ONLY_ARGV_PREFIX, + os.fspath(sbatch_path), + ], + "return_code": result.returncode, + "stdout_sha256": hashlib.sha256( + result.stdout.encode() + ).hexdigest(), + "stderr_sha256": hashlib.sha256( + result.stderr.encode() + ).hexdigest(), + "scheduler_mutation_call_count": 0, + "submission_call_count": 0, + } + ) + + +def _parse_key_values(line: str) -> Mapping[str, str]: + fields: dict[str, str] = {} + for token in line.strip().split(): + _require("=" in token, "scontrol token is malformed") + key, value = token.split("=", 1) + _require( + bool(key) and key not in fields, + "scontrol key is empty or duplicated", + ) + fields[key] = value + return MappingProxyType(fields) + + +def _singleton_cardinality(value: str, *, label: str) -> int: + """Accept Slurm's scalar or min-max spelling, but only for exact one.""" + + _require( + value in {"1", "1-1"}, + f"{label} is not exactly one", + ) + return 1 + + +def _parse_tres(value: str, *, label: str) -> Mapping[str, str]: + fields: dict[str, str] = {} + for token in value.split(","): + _require("=" in token, f"{label} TRES token is malformed") + key, count = token.split("=", 1) + _require( + bool(key) and bool(count) and key not in fields, + f"{label} TRES key is empty or duplicated", + ) + fields[key] = count + _require( + fields.get("gres/gpu") == "1" + and not any(key.startswith("gres/gpu:") for key in fields), + f"{label} is not generic one-GPU TRES", + ) + return MappingProxyType(fields) + + +def validate_post_submit_readback( + *, + job_id: str, + expanded_squeue: CommandResult, + scontrol: CommandResult, +) -> Mapping[str, Any]: + """Require exactly tasks 0-7 and the generic Scavenger request.""" + + _require( + JOB_ID_RE.fullmatch(job_id) is not None + and type(expanded_squeue) is CommandResult + and expanded_squeue.returncode == 0 + and expanded_squeue.stderr == "" + and type(scontrol) is CommandResult + and scontrol.returncode == 0 + and scontrol.stderr == "", + "post-submit scheduler readback failed", + ) + tasks: set[int] = set() + states: dict[str, str] = {} + for line in expanded_squeue.stdout.splitlines(): + columns = line.split("|") + _require(len(columns) == 5, "expanded squeue row is malformed") + array_job, task, job_name, state, gres = columns + _require( + array_job == job_id + and task.isdigit() + and int(task) in TASKS + and job_name == STABLE_JOB_NAME + and bool(state) + and gres == "gpu:1", + "post-submit task, job, or GRES readback changed", + ) + _require(int(task) not in tasks, "post-submit task is duplicated") + tasks.add(int(task)) + states[task] = state + _require(tasks == TASKS, "post-submit array is not exactly tasks 0-7") + + lines = [line for line in scontrol.stdout.splitlines() if line.strip()] + _require( + len(lines) == 1, + "scontrol did not return exactly one array-parent row", + ) + fields = _parse_key_values(lines[0]) + requested = _parse_tres(fields.get("ReqTRES", ""), label="ReqTRES") + tres_per_node = fields.get( + "TresPerNode", + fields.get("TRESPerNode", ""), + ) + _singleton_cardinality(fields.get("NumNodes", ""), label="NumNodes") + _singleton_cardinality(fields.get("NumTasks", ""), label="NumTasks") + _require( + fields.get("JobId") == job_id + and fields.get("JobName") == STABLE_JOB_NAME + and fields.get("ArrayTaskId") == ARRAY_SPEC + and fields.get("Partition") == "scavenger" + and fields.get("Account") == "ratul-scavenger" + and fields.get("QOS") == "scavenger" + and fields.get("CPUs/Task") == "4" + and fields.get("TimeLimit") == "2-00:00:00" + and fields.get("Requeue") == "1" + and tres_per_node == "gres/gpu:1" + and fields.get("Features", "(null)") in {"", "(null)"} + and requested.get("cpu") == "4" + and requested.get("mem") == "144G" + and requested.get("node") == "1" + and requested["gres/gpu"] == "1", + "post-submit route, resources, time, or generic-GPU boundary changed", + ) + return MappingProxyType( + { + "status": ( + "PASS_ONE_EXACT_NATIVE_EIGHT_ARRAY_0_7_GENERIC_GPU1" + ), + "job_id": job_id, + "task_ids": list(range(8)), + "task_states": states, + "partition": "scavenger", + "account": "ratul-scavenger", + "qos": "scavenger", + "gres": "gpu:1", + "constraint": None, + "concurrency_throttle": None, + "node_count": 1, + "task_count_per_array_element": 1, + "cpus_per_task": 4, + "memory": "144G", + "time_limit": "2-00:00:00", + "second_submission_call_count": 0, + } + ) + + +def runtime_receipt_contract() -> Mapping[str, Mapping[str, Any]]: + """Name the exact runtime receipts inherited from the frozen R2 core.""" + + return MappingProxyType( + { + "duplicate_claim": MappingProxyType( + { + "relative_path": "review_run_claim.json", + "schema": CLAIM_SCHEMA_R2, + "one_live_writer_lock_required": True, + "resume_attempt_ledger_required": True, + } + ), + "device_lineage": MappingProxyType( + { + "relative_path": "review_device_lineage.json", + "schema": DEVICE_LINEAGE_SCHEMA_R2, + "actual_cuda_device_receipt_required_each_attempt": True, + "cross_device_bitwise_equivalence_claimed": False, + } + ), + "checkpoint_index": MappingProxyType( + { + "relative_path": ( + "review_checkpoints/review_checkpoint_index.json" + ), + "schema": CHECKPOINT_INDEX_SCHEMA_R2, + "content_addressed_payload_required": True, + "completed_epoch_exact_resume_required": True, + "roles": [ + "latest", + "best", + "milestone_25", + "milestone_50", + "milestone_75", + "milestone_100", + ], + } + ), + "final_selection": MappingProxyType( + { + "relative_path": "review_final_selection_receipt.json", + "schema": FINAL_RECEIPT_SCHEMA_R2, + "best_checkpoint_bound": True, + "latest_checkpoint_bound": True, + "device_receipt_bound": True, + } + ), + } + ) + + +def required_final_gate_api() -> Mapping[str, Any]: + """Contract required from the separate final native scientific gate.""" + + return MappingProxyType( + { + "module": R15_FINAL_GATE_MODULE, + "required_callables": list(R15_FINAL_GATE_REQUIRED_CALLABLES), + "load_bound_runtime_signature": ( + "load_bound_runtime(binding=None) -> " + "(r9_module,r11_module,binding,installation_receipt)" + ), + "wrapper_entry_rule": ( + "load exact gate source and final binding by SHA256/bytes; " + "call final_gate.load_bound_runtime(binding=final_binding); " + "then validate singleton CUDA and call returned r9.main" + ), + "final_binding_must_bind": [ + "current static R6 terminal source and terminal binding", + "R14 strict-R6 optimization loader/runtime/test/receipt", + "R15 current-terminal gate source and package init", + "all three authorization flags false", + ], + "source_closure_required": True, + "r13_direct_load_forbidden": True, + "r14_direct_load_forbidden": True, + } + ) + + +def launch_blockers() -> tuple[str, ...]: + return ( + "static_r6_terminal_binding_not_yet_bound_into_final_successor", + "r15_final_scientific_gate_source_hash_bytes_not_yet_bound", + "r15_executable_wrapper_and_path_rebinding_not_yet_published", + "r15_launch_config_external_release_and_sbatch_not_yet_published", + "r15_source_closure_and_immutable_hash_receipt_not_yet_published", + "fresh_cpu_cuda_exact_resume_checkpoint_gates_not_yet_complete", + "fresh_test_only_duplicate_output_and_submission_receipts_absent", + ) + + +def describe_contract() -> Mapping[str, Any]: + return MappingProxyType( + { + "schema": SCHEMA, + "status": STATUS, + "semantic_array_id": SEMANTIC_ARRAY_ID, + "cell_order": list(CELL_ORDER), + "array": ARRAY_SPEC, + "partition": "scavenger", + "account": "ratul-scavenger", + "qos": "scavenger", + "gres": "gpu:1", + "concurrency_throttle": None, + "constraint": None, + "resume": "auto_exact_completed_epoch", + "requeue": True, + "final_scientific_gate": dict(required_final_gate_api()), + "r15_final_scientific_gate_required": True, + "r14_strict_runtime_transitively_required": True, + "test_only_required_before_submission": True, + "one_copy_per_cell_required": True, + "runtime_receipts": { + name: dict(value) + for name, value in runtime_receipt_contract().items() + }, + "launch_blockers": list(launch_blockers()), + "scheduler_accessed": False, + "scheduler_mutation_call_count": 0, + "submission_call_count": 0, + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + ) + + +__all__ = [ + "ARRAY_SPEC", + "CELL_ORDER", + "CommandResult", + "NativeEightSubmissionContractR15Error", + "SBATCH_SUBMIT_ARGV_PREFIX", + "SBATCH_TEST_ONLY_ARGV_PREFIX", + "SCHEMA", + "SEMANTIC_ARRAY_ID", + "SQUEUE_ARGV", + "STABLE_JOB_NAME", + "cell_output_roots", + "describe_contract", + "is_duplicate_job_name", + "launch_blockers", + "parse_duplicate_scan", + "render_sbatch", + "required_final_gate_api", + "runtime_receipt_contract", + "validate_bound_predecessor_sources", + "validate_duplicate_output_preflight", + "validate_post_submit_readback", + "validate_sbatch_surface", + "validate_test_only_result", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r1/review_a5_native_eight_training_runner_r1.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r1/review_a5_native_eight_training_runner_r1.py new file mode 100644 index 0000000000000000000000000000000000000000..a1107b380385c86823d35bd2f81344930207f97c --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r1/review_a5_native_eight_training_runner_r1.py @@ -0,0 +1,2246 @@ +"""Real corrected BERTose native-eight runner and exact-resume runtime. + +This is a no-overwrite successor to the preparation-only R8 executor and R3 +data adapter. It deliberately does not contain a Nova submission call or an +embedded release decision. A separately published, hash-bound launch config +must identify the final postfit static token package, train-only static null, +and release receipt before this CLI will run. + +The eight cells are fixed in array order:: + + A000 A100 A010 A001 A110 A101 A011 A111 + +Sequence is always enabled. The three bits enable topology, MS, and static, +respectively. Every active objective has coefficient one and the loss shell +denominator remains four. Selection is strict-lower development loss with the +earliest tied epoch retained, maximum 100 completed epochs, and patience 15. + +Only completed epochs are published. ``latest`` is therefore an exact +scientific restart point: if a job is preempted during an epoch, the unfinished +epoch is discarded and deterministically recomputed from the latest completed +model/optimizer/RNG state. The checkpoint directory retains only ``latest``, +``best``, and milestones 25/50/75/100 plus a small canonical index. +""" + +from __future__ import annotations + +import argparse +import copy +from dataclasses import asdict, dataclass +import hashlib +import importlib +import importlib.util +import io +import json +import math +import os +from pathlib import Path +import pickle +import random +import re +import signal +import stat +import sys +import tempfile +from types import MappingProxyType, ModuleType +from typing import Any, Iterable, Iterator, Mapping, Optional, Sequence + +import numpy as np +import torch + + +SCHEMA = "bertose_review_a5_native_eight_training_runner_20260722_r1" +LAUNCH_CONFIG_SCHEMA = ( + "bertose_review_a5_native_eight_training_launch_config_20260722_r1" +) +STATIC_BINDING_SCHEMA = ( + "bertose_review_a5_native_eight_static_runtime_binding_20260722_r1" +) +CHECKPOINT_SCHEMA = ( + "bertose_review_a5_native_eight_completed_epoch_checkpoint_20260722_r1" +) +CHECKPOINT_INDEX_SCHEMA = ( + "bertose_review_a5_native_eight_checkpoint_index_20260722_r1" +) +FINAL_RECEIPT_SCHEMA = ( + "bertose_review_a5_native_eight_final_selection_receipt_20260722_r1" +) +CLAIM_SCHEMA = "bertose_review_a5_native_eight_duplicate_claim_20260722_r1" + +CELL_ORDER = ( + "A000", + "A100", + "A010", + "A001", + "A110", + "A101", + "A011", + "A111", +) +CELL_BITS = { + "A000": (0, 0, 0), + "A100": (1, 0, 0), + "A010": (0, 1, 0), + "A001": (0, 0, 1), + "A110": (1, 1, 0), + "A101": (1, 0, 1), + "A011": (0, 1, 1), + "A111": (1, 1, 1), +} +OBJECTIVES = ("sequence", "topology", "ms", "static") +COMMON_SEED = 43 +MAX_EPOCHS = 100 +PATIENCE = 15 +EARLIEST_STOP_EPOCH = 16 +MILESTONE_EPOCHS = (25, 50, 75, 100) +LOSS_DENOMINATOR = 4 +STATIC_PACKAGE_SCHEMA = "bertose_a5_static_tokens_v2" +STATIC_NULL_SCHEMA = "bertose_a5_static_v2_train_only_null_adapter_20260721_r1" +STATIC_TRAIN_ROLE = "pretraining_train" +STATIC_DEVELOPMENT_ROLE = "pretraining_development" + +TRAINING_AUTHORIZED = False +NOVA_SUBMISSION_AUTHORIZED = False +AFFINOSE_SUPPORTED = False +DOWNSTREAM_SUPPORTED = False +MD_SUPPORTED = False +WEIGHT_ABLATION_SUPPORTED = False + +RUNTIME_ROOT = Path(__file__).absolute().parent +WRITING_ROOT = Path(__file__).absolute().parents[4] +R8_PATH = ( + WRITING_ROOT + / "review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r8" + / "review_a5_native_eight_executor_r8.py" +) +STATIC_MASK_PACKAGE = ( + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2." + "review_a5_static_v2_mask_null_runtime_r2" +) +STATIC_MASK_CONTRACT_PACKAGE = ( + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2." + "review_a5_static_v2_mask_contract_r2" +) + +_SHA_RE = re.compile(r"[0-9a-f]{64}") +_SAFE_ID_RE = re.compile(r"[A-Za-z0-9][A-Za-z0-9_.:-]{0,191}") +_STOP_REQUESTED = False + + +class NativeEightTrainingError(RuntimeError): + """Raised when a scientific, resume, or duplicate boundary changes.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightTrainingError(message) + + +def canonical_bytes(value: object) -> bytes: + try: + text = json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + except (TypeError, ValueError) as error: + raise NativeEightTrainingError("value is not canonical JSON") from error + return (text + "\n").encode("ascii") + + +def canonical_sha256(value: object, *, domain: str) -> str: + return hashlib.sha256(domain.encode("ascii") + b"\0" + canonical_bytes(value)).hexdigest() + + +def sha256_bytes(value: bytes) -> str: + return hashlib.sha256(value).hexdigest() + + +def _exact_sha(value: object, label: str) -> str: + _require(type(value) is str and _SHA_RE.fullmatch(value) is not None, f"{label} is not SHA-256") + return value + + +def _canonical_absolute(path: Path, label: str) -> Path: + value = Path(path) + _require(value.is_absolute(), f"{label} is not absolute") + _require(os.path.normpath(os.fspath(value)) == os.fspath(value), f"{label} is not canonical") + _require(all(part not in {"", ".", ".."} for part in value.parts[1:]), f"{label} contains unsafe components") + return value + + +def read_regular_nofollow(path: Path, *, label: str, maximum: int | None = None) -> bytes: + """Read one immutable regular file through a complete no-follow walk.""" + + absolute = _canonical_absolute(Path(path), label) + _require(hasattr(os, "O_NOFOLLOW") and hasattr(os, "O_DIRECTORY"), "no-follow traversal unavailable") + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in absolute.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(absolute.parts[-1], leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + _require(stat.S_ISREG(before.st_mode), f"{label} is not a regular file") + if maximum is not None: + _require(before.st_size <= maximum, f"{label} exceeds its size limit") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + _require(bool(chunk), f"{label} truncated while read") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + _require( + (before.st_dev, before.st_ino, before.st_size, before.st_mtime_ns, before.st_ctime_ns) + == (after.st_dev, after.st_ino, after.st_size, after.st_mtime_ns, after.st_ctime_ns), + f"{label} changed during read", + ) + return b"".join(chunks) + except OSError as error: + raise NativeEightTrainingError(f"{label} no-follow read failed: {error}") from error + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + + +def load_canonical_json(path: Path, expected_sha256: str, *, label: str) -> dict[str, Any]: + payload = read_regular_nofollow(path, label=label, maximum=64 * 1024 * 1024) + _require(sha256_bytes(payload) == _exact_sha(expected_sha256, f"{label} expected hash"), f"{label} hash changed") + try: + value = json.loads(payload.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightTrainingError(f"{label} is not canonical JSON") from error + _require(type(value) is dict and canonical_bytes(value) == payload, f"{label} canonical bytes changed") + return value + + +class _PrimitiveUnpickler(pickle.Unpickler): + """Unpickler that rejects every global/class/persistent reference.""" + + def find_class(self, module: str, name: str) -> Any: # pragma: no cover - exercised adversarially + raise NativeEightTrainingError(f"static token package contains forbidden global {module}.{name}") + + def persistent_load(self, pid: object) -> Any: # pragma: no cover - exercised adversarially + raise NativeEightTrainingError("static token package contains a persistent reference") + + +def _primitive_pickle_loads(payload: bytes) -> object: + try: + return _PrimitiveUnpickler(io.BytesIO(payload)).load() + except NativeEightTrainingError: + raise + except BaseException as error: + raise NativeEightTrainingError("static token package cannot be safely decoded") from error + + +def cell_for_array_task(array_task_id: int) -> str: + _require(type(array_task_id) is int and 0 <= array_task_id < len(CELL_ORDER), "array task must be one integer in 0..7") + return CELL_ORDER[array_task_id] + + +def coefficients_for_cell(cell_id: str) -> Mapping[str, int]: + _require(cell_id in CELL_BITS, f"unknown native-eight cell {cell_id!r}") + topology, ms, static = CELL_BITS[cell_id] + return MappingProxyType( + {"sequence": 1, "topology": topology, "ms": ms, "static": static} + ) + + +@dataclass(frozen=True, slots=True) +class SelectionState: + completed_epochs: int = 0 + best_epoch: int | None = None + best_loss: float | None = None + epochs_without_improvement: int = 0 + stop_reason: str | None = None + + def observe(self, loss: float) -> tuple["SelectionState", bool]: + _require(math.isfinite(loss) and loss >= 0.0, "development loss is not finite nonnegative") + _require(self.stop_reason is None and self.completed_epochs < MAX_EPOCHS, "selection already stopped") + epoch = self.completed_epochs + 1 + improved = self.best_loss is None or loss < self.best_loss + best_epoch = epoch if improved else self.best_epoch + best_loss = loss if improved else self.best_loss + without = 0 if improved else self.epochs_without_improvement + 1 + stop_reason: str | None = None + if without >= PATIENCE: + stop_reason = "patience_exhausted" + elif epoch >= MAX_EPOCHS: + stop_reason = "max_epochs_reached" + state = SelectionState(epoch, best_epoch, best_loss, without, stop_reason) + _require((state.stop_reason is None) or epoch >= EARLIEST_STOP_EPOCH, "early stop occurred before epoch 16") + return state, improved + + def payload(self) -> dict[str, Any]: + return asdict(self) + + @classmethod + def from_payload(cls, value: Mapping[str, Any]) -> "SelectionState": + _require(type(value) is dict and set(value) == set(asdict(cls())), "selection checkpoint fields changed") + result = cls(**dict(value)) + _require(type(result.completed_epochs) is int and 0 <= result.completed_epochs <= MAX_EPOCHS, "selection epoch changed") + if result.best_epoch is None: + _require(result.completed_epochs == 0 and result.best_loss is None, "empty selection carries a best") + else: + _require( + type(result.best_epoch) is int + and 1 <= result.best_epoch <= result.completed_epochs + and type(result.best_loss) is float + and math.isfinite(result.best_loss) + and result.best_loss >= 0.0, + "selection best changed", + ) + _require(type(result.epochs_without_improvement) is int and result.epochs_without_improvement >= 0, "selection patience counter changed") + _require(result.stop_reason in {None, "patience_exhausted", "max_epochs_reached"}, "selection stop reason changed") + return result + + +@dataclass(frozen=True, slots=True) +class LaunchConfig: + semantic_array_id: str + project_root: Path + output_root: Path + static_token_package: Path + static_token_package_sha256: str + static_null_receipt: Path + static_null_receipt_sha256: str + static_publication_receipt: Path + static_publication_receipt_sha256: str + release_receipt: Path + release_receipt_sha256: str + source_value: Mapping[str, Any] + + @classmethod + def load(cls, path: Path) -> "LaunchConfig": + payload = read_regular_nofollow(_canonical_absolute(path, "launch config"), label="launch config", maximum=4 * 1024 * 1024) + try: + value = json.loads(payload.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightTrainingError("launch config is not canonical JSON") from error + fields = { + "schema", + "semantic_array_id", + "array_spec", + "cell_order", + "bit_order", + "common_seed", + "maximum_epochs", + "patience", + "loss_coefficients", + "loss_denominator", + "selection_rule", + "checkpoint_roles", + "scheduler", + "project_root", + "output_root", + "static_token_package", + "static_null_receipt", + "static_publication_receipt", + "release_receipt", + "launch_authorized", + "official_submitted_artifacts_modified", + } + _require(type(value) is dict and set(value) == fields and canonical_bytes(value) == payload, "launch config fields or bytes changed") + semantic = value["semantic_array_id"] + _require(type(semantic) is str and _SAFE_ID_RE.fullmatch(semantic) is not None, "semantic array ID is unsafe") + _require( + value["schema"] == LAUNCH_CONFIG_SCHEMA + and value["array_spec"] == "0-7" + and value["cell_order"] == list(CELL_ORDER) + and value["bit_order"] == ["topology", "ms", "static"] + and value["common_seed"] == COMMON_SEED + and value["maximum_epochs"] == MAX_EPOCHS + and value["patience"] == PATIENCE + and value["loss_coefficients"] == [1, "topology_bit", "ms_bit", "static_bit"] + and value["loss_denominator"] == LOSS_DENOMINATOR + and value["selection_rule"] == "strict_lower_earliest_tie" + and value["checkpoint_roles"] == ["latest", "best", "milestone_25", "milestone_50", "milestone_75", "milestone_100"] + and value["scheduler"] + == { + "partition": "scavenger", + "account": "ratul-scavenger", + "qos": "scavenger", + "gres": "gpu:1", + "array": "0-7", + "concurrency_throttle": None, + "constraint": None, + } + and value["launch_authorized"] is True + and value["official_submitted_artifacts_modified"] is False, + "launch config scientific/scheduler policy changed", + ) + + def artifact(name: str) -> tuple[Path, str]: + item = value[name] + _require(type(item) is dict and set(item) == {"path", "sha256"}, f"{name} binding changed") + return _canonical_absolute(Path(item["path"]), name), _exact_sha(item["sha256"], name) + + static_tokens, static_tokens_sha = artifact("static_token_package") + static_null, static_null_sha = artifact("static_null_receipt") + static_publication, static_publication_sha = artifact("static_publication_receipt") + release, release_sha = artifact("release_receipt") + return cls( + semantic, + _canonical_absolute(Path(value["project_root"]), "project root"), + _canonical_absolute(Path(value["output_root"]), "output root"), + static_tokens, + static_tokens_sha, + static_null, + static_null_sha, + static_publication, + static_publication_sha, + release, + release_sha, + MappingProxyType(copy.deepcopy(value)), + ) + + +def _ordered_values_sha256(values: Iterable[str], *, domain: bytes) -> str: + digest = hashlib.sha256(domain + b"\0") + for value in values: + encoded = value.encode("utf-8") + digest.update(len(encoded).to_bytes(8, "big")) + digest.update(encoded) + return digest.hexdigest() + + +@dataclass(frozen=True, slots=True) +class StaticBundle: + token_package_sha256: str + null_receipt_sha256: str + publication_receipt_sha256: str + parents: Mapping[str, tuple[Mapping[str, Any], ...]] + null_scale: float + supports: tuple[tuple[int, ...], ...] + support_sha256_by_slot: tuple[str, ...] + binding_value: Mapping[str, Any] + masker: Any + + @property + def binding_sha256(self) -> str: + return str(self.binding_value["binding_sha256"]) + + @classmethod + def load(cls, config: LaunchConfig) -> "StaticBundle": + token_bytes = read_regular_nofollow(config.static_token_package, label="final static token package", maximum=2 * 1024 * 1024 * 1024) + _require(sha256_bytes(token_bytes) == config.static_token_package_sha256, "final static token package hash changed") + package = _primitive_pickle_loads(token_bytes) + _require(type(package) is dict, "final static token package root changed") + fields = { + "schema", + "status", + "official_submitted_artifacts_modified", + "parents", + "max_static_tokens", + "ordered_parent_ids_sha256", + "ordered_state_ids_sha256", + "authorization", + } + _require(set(package) == fields and package["schema"] == STATIC_PACKAGE_SCHEMA, "final static token package fields/schema changed") + _require(package["official_submitted_artifacts_modified"] is False, "static package claims an official mutation") + _require(type(package["parents"]) is dict and bool(package["parents"]), "static package parent map is empty") + _require(type(package["max_static_tokens"]) is int and 4 <= package["max_static_tokens"] <= 192 and package["max_static_tokens"] % 4 == 0, "static package width changed") + authorization = package["authorization"] + _require(type(authorization) is dict and not any(bool(value) for value in authorization.values()), "static package self-authorizes") + + parent_map: dict[str, tuple[Mapping[str, Any], ...]] = {} + parent_order: list[str] = [] + state_order: list[str] = [] + seen_states: set[str] = set() + seen_state_ints: set[int] = set() + supports: list[set[int]] = [set(), set(), set(), set()] + role_counts = {STATIC_TRAIN_ROLE: 0, STATIC_DEVELOPMENT_ROLE: 0} + state_counts = {STATIC_TRAIN_ROLE: 0, STATIC_DEVELOPMENT_ROLE: 0} + residue_counts = {STATIC_TRAIN_ROLE: 0, STATIC_DEVELOPMENT_ROLE: 0} + maximum = 0 + state_fields = { + "parent_glycorpus_id", + "canonical_structure_state_id", + "role", + "effective_wurcs", + "global_token_ids", + "residue_ids", + "slot_ids", + "state_id_int64", + } + for parent_id, raw_states in package["parents"].items(): + _require(type(parent_id) is str and bool(parent_id), "static parent ID is empty") + _require(type(raw_states) is list and bool(raw_states), f"static parent {parent_id} has no states") + normalized: list[Mapping[str, Any]] = [] + parent_role: str | None = None + local_state_ints: set[int] = set() + for raw in raw_states: + _require(type(raw) is dict and set(raw) == state_fields, f"static state fields changed for {parent_id}") + state_id = raw["canonical_structure_state_id"] + role = raw["role"] + _require(type(state_id) is str and bool(state_id) and state_id not in seen_states, "static state ID is empty or duplicated") + _require(role in role_counts, f"active static state {state_id} has a nonactive role") + _require(raw["parent_glycorpus_id"] == parent_id, "static state/parent join changed") + _require(parent_role in {None, role}, "one static parent crosses train/development roles") + parent_role = role + global_ids = raw["global_token_ids"] + residues = raw["residue_ids"] + slots = raw["slot_ids"] + state_int = raw["state_id_int64"] + _require( + type(global_ids) is list + and type(residues) is list + and type(slots) is list + and 4 <= len(global_ids) <= 192 + and len(global_ids) % 4 == 0 + and len(global_ids) == len(residues) == len(slots), + f"static state {state_id} tensor axes changed", + ) + _require(type(state_int) is int and 0 <= state_int < 2**63 and state_int not in local_state_ints, "static state int64 changed or repeats within parent") + local_state_ints.add(state_int) + seen_state_ints.add(state_int) + residue_count = len(global_ids) // 4 + expected_residues = [index for index in range(residue_count) for _ in range(4)] + expected_slots = list(range(4)) * residue_count + _require(residues == expected_residues and slots == expected_slots, f"static state {state_id} is not residue-major slot 0,1,2,3") + _require(all(type(value) is int and 0 <= value < 4096 for value in global_ids), f"static state {state_id} has an invalid global token") + for position, global_id in enumerate(global_ids): + slot = slots[position] + _require(global_id // 1024 == slot, f"static state {state_id} global/slot identity changed") + if role == STATIC_TRAIN_ROLE: + supports[slot].add(global_id % 1024) + normalized.append(MappingProxyType(copy.deepcopy(raw))) + seen_states.add(state_id) + state_order.append(state_id) + state_counts[role] += 1 + residue_counts[role] += residue_count + maximum = max(maximum, len(global_ids)) + assert parent_role is not None + role_counts[parent_role] += 1 + parent_order.append(parent_id) + parent_map[parent_id] = tuple(normalized) + _require(maximum == package["max_static_tokens"], "static package maximum width differs from states") + _require(_ordered_values_sha256(parent_order, domain=b"bertose-a5-ordered-values-v1") == package["ordered_parent_ids_sha256"], "static ordered parent identity changed") + _require(_ordered_values_sha256(state_order, domain=b"bertose-a5-ordered-values-v1") == package["ordered_state_ids_sha256"], "static ordered state identity changed") + canonical_supports = tuple(tuple(sorted(values)) for values in supports) + _require(all(len(values) >= 2 for values in canonical_supports), "static train-observed slot support is incomplete") + support_hashes = tuple( + sha256_bytes(np.asarray(values, dtype=" 0.0 and null_receipt.get("scale_hex") == scale.hex(), "static null scale changed") + probabilities_b64 = null_receipt.get("probabilities_float64_le_base64") + _require(type(probabilities_b64) is str, "static null probabilities are absent") + import base64 + + try: + probability_bytes = base64.b64decode(probabilities_b64, validate=True) + except (TypeError, ValueError) as error: + raise NativeEightTrainingError("static null probabilities are malformed") from error + _require( + len(probability_bytes) == 4 * 1024 * 8 + and sha256_bytes(probability_bytes) == null_receipt.get("probabilities_float64_le_sha256"), + "static null probability bytes changed", + ) + probabilities = np.frombuffer(probability_bytes, dtype="= 0.0) and np.allclose(probabilities.sum(axis=1), 1.0, rtol=0.0, atol=1e-15), "static null probabilities are invalid") + + publication_bytes = read_regular_nofollow(config.static_publication_receipt, label="final static publication receipt", maximum=64 * 1024 * 1024) + _require(sha256_bytes(publication_bytes) == config.static_publication_receipt_sha256, "final static publication receipt hash changed") + release_bytes = read_regular_nofollow(config.release_receipt, label="native-eight release receipt", maximum=64 * 1024 * 1024) + _require(sha256_bytes(release_bytes) == config.release_receipt_sha256, "native-eight release receipt hash changed") + + mask_module = importlib.import_module(STATIC_MASK_PACKAGE) + mask_contract = importlib.import_module(STATIC_MASK_CONTRACT_PACKAGE) + support_binding = core.get("support_binding_sha256") + _exact_sha(support_binding, "static null support binding") + masker = mask_module.StaticMaskerR2( + supported_local_ids_by_slot=canonical_supports, + expected_support_binding_sha256=support_binding, + expected_support_sha256_by_slot=support_hashes, + mask_policy=mask_contract.static_mask_policy(), + ) + binding = { + "schema": STATIC_BINDING_SCHEMA, + "token_package_sha256": config.static_token_package_sha256, + "null_receipt_sha256": config.static_null_receipt_sha256, + "publication_receipt_sha256": config.static_publication_receipt_sha256, + "release_receipt_sha256": config.release_receipt_sha256, + "parent_counts": role_counts, + "state_counts": state_counts, + "residue_counts": residue_counts, + "token_count": sum(residue_counts.values()) * 4, + "max_static_tokens": maximum, + "support_sha256_by_slot": list(support_hashes), + "support_binding_sha256": support_binding, + "masker_binding_sha256": masker.binding()["binding_sha256"], + "null_scale": scale, + "null_scale_hex": scale.hex(), + "training_authorized": False, + "nova_submission_authorized": False, + } + binding["binding_sha256"] = canonical_sha256(binding, domain=STATIC_BINDING_SCHEMA) + return cls( + config.static_token_package_sha256, + config.static_null_receipt_sha256, + config.static_publication_receipt_sha256, + MappingProxyType(parent_map), + scale, + canonical_supports, + support_hashes, + MappingProxyType(binding), + masker, + ) + + def collate( + self, + parent_ids: Sequence[str], + *, + split: str, + epoch: int, + device: torch.device, + ) -> tuple[dict[str, torch.Tensor], str]: + _require(split in {"train", "development"}, "static split changed") + _require(type(epoch) is int and epoch >= 0 and (split == "train" or epoch == 0), "static mask epoch changed") + mask_module = importlib.import_module(STATIC_MASK_PACKAGE) + expected_role = STATIC_TRAIN_ROLE if split == "train" else STATIC_DEVELOPMENT_ROLE + state_lists = [self.parents.get(parent_id, ()) for parent_id in parent_ids] + for parent_id, states in zip(parent_ids, state_lists): + for state in states: + _require(state["role"] == expected_role, f"static parent {parent_id} crossed roles") + state_count = max(1, max((len(states) for states in state_lists), default=0)) + width = max(4, max((len(state["global_token_ids"]) for states in state_lists for state in states), default=0)) + _require(width <= 192 and width % 4 == 0, "static batch width changed") + shape = (len(parent_ids), state_count, width) + token_ids = np.zeros(shape, dtype=np.int64) + attention = np.zeros(shape, dtype=bool) + residue_ids = np.full(shape, -1, dtype=np.int64) + slot_ids = np.full(shape, -1, dtype=np.int64) + state_mask = np.zeros(shape[:2], dtype=bool) + state_ids = np.full(shape[:2], -1, dtype=np.int64) + input_mask = np.zeros(shape, dtype=bool) + labels = np.full(shape, -100, dtype=np.int64) + parent_available = np.zeros(len(parent_ids), dtype=bool) + mask_surface: list[dict[str, Any]] = [] + for parent_index, (parent_id, states) in enumerate(zip(parent_ids, state_lists)): + parent_available[parent_index] = bool(states) + for state_index, state in enumerate(states): + global_ids = np.asarray(state["global_token_ids"], dtype=np.int64).reshape(-1, 4) + local_codes = global_ids - np.arange(4, dtype=np.int64).reshape(1, 4) * 1024 + recipe = mask_module.StaticMaskRecipe( + seed=COMMON_SEED if split == "train" else 0, + split=split, + epoch=epoch, + ) + masked = self.masker.mask_state( + local_codes, + enabled=True, + recipe=recipe, + parent_id=parent_id, + state_id=state["canonical_structure_state_id"], + ) + length = len(state["global_token_ids"]) + token_ids[parent_index, state_index, :length] = masked.global_input_ids.reshape(-1) + attention[parent_index, state_index, :length] = True + residue_ids[parent_index, state_index, :length] = np.asarray(state["residue_ids"], dtype=np.int64) + slot_ids[parent_index, state_index, :length] = np.asarray(state["slot_ids"], dtype=np.int64) + state_mask[parent_index, state_index] = True + state_ids[parent_index, state_index] = state["state_id_int64"] + input_mask[parent_index, state_index, :length] = masked.masked_positions.reshape(-1) + labels[parent_index, state_index, :length] = masked.global_labels.reshape(-1) + mask_surface.append( + { + "parent_id": parent_id, + "state_id": state["canonical_structure_state_id"], + "selected_residue_indices": list(masked.selected_residue_indices), + "routes": list(masked.routes), + "rng_draw_count": masked.rng_draw_count, + } + ) + arrays = { + "static_token_ids": torch.as_tensor(token_ids, dtype=torch.long, device=device), + "static_attention_mask": torch.as_tensor(attention, dtype=torch.bool, device=device), + "static_residue_ids": torch.as_tensor(residue_ids, dtype=torch.long, device=device), + "static_slot_ids": torch.as_tensor(slot_ids, dtype=torch.long, device=device), + "static_state_mask": torch.as_tensor(state_mask, dtype=torch.bool, device=device), + "static_state_ids": torch.as_tensor(state_ids, dtype=torch.long, device=device), + "static_input_mask": torch.as_tensor(input_mask, dtype=torch.bool, device=device), + "static_labels": torch.as_tensor(labels, dtype=torch.long, device=device), + "static_parent_available": torch.as_tensor(parent_available, dtype=torch.bool, device=device), + } + identity = canonical_sha256( + { + "binding_sha256": self.binding_sha256, + "split": split, + "epoch": epoch, + "parent_ids": list(parent_ids), + "mask_surface": mask_surface, + }, + domain="bertose-review-a5-static-batch-r1", + ) + return arrays, identity + + +def _load_r8() -> ModuleType: + source = read_regular_nofollow(R8_PATH, label="R8 native executor source", maximum=16 * 1024 * 1024) + name = f"_review_a5_native_eight_r8_for_training_{sha256_bytes(source)[:20]}" + existing = sys.modules.get(name) + if existing is not None: + return existing + spec = importlib.util.spec_from_file_location(name, R8_PATH) + _require(spec is not None and spec.loader is not None, "cannot create R8 module spec") + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + try: + spec.loader.exec_module(module) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +def _make_static_adapter_class(r8: ModuleType, bundle: StaticBundle) -> type: + """Create one process-local immutable successor without editing R3/R8.""" + + adapter_module = r8._adapter_r3 + r5 = r8._core._r6._r5 + base = adapter_module.NativeEightDataAdapter + + class StaticEnabledNativeEightAdapter(base): + training_authorized = False + scientific_launch_authorized = False + gpu_launch_authorized = False + nova_submission_authorized = False + execution_certified = False + + def __init__(self) -> None: + super().__init__() + self.static_bundle = bundle + all_rows = self.train_rows + self.development_rows + expected = {row.parent_id for row in all_rows if row.static_available} + _require( + expected == set(bundle.parents), + "final static parent roster differs from corrected joined availability", + ) + for row in all_rows: + states = bundle.parents.get(row.parent_id, ()) + expected_role = STATIC_TRAIN_ROLE if row.split == "train" else STATIC_DEVELOPMENT_ROLE + _require( + bool(states) is row.static_available + and all(state["role"] == expected_role for state in states), + f"final static role/availability differs for {row.parent_id}", + ) + self._contract_sha256_cached = adapter_module._canonical_sha256( + self.contract_payload(), + domain="bertose-a5-native-eight-data-adapter-contract-r7", + ) + + @classmethod + def _require_materializable_cell(cls, cell_id: str) -> tuple[bool, bool, bool]: + _require(cell_id in CELL_BITS, f"unknown native-eight cell {cell_id!r}") + return tuple(bool(value) for value in CELL_BITS[cell_id]) # type: ignore[return-value] + + def contract_payload(self) -> dict[str, Any]: + payload = super().contract_payload() + payload.update( + { + "schema": "bertose_review_a5_native_eight_data_adapter_20260722_r4_static_final", + "status": "FINAL_STATIC_POSTFIT_BOUND_RUNTIME_SUCCESSOR", + "source_sha256": sha256_bytes( + read_regular_nofollow( + Path(__file__).absolute(), + label="native-eight static successor source", + maximum=16 * 1024 * 1024, + ) + ), + "receipt_sha256": bundle.publication_receipt_sha256, + "postfit_static": dict(bundle.binding_value), + "processing_contract": { + **payload["processing_contract"], + "static": ( + "final selected EGNN/RVQ residue-major four-slot states; " + "train-only support/null and whole-residue deterministic masks" + ), + }, + "disabled_branch_contract": ( + "static-disabled cell opens no static package/loader/mask stream/payload" + ), + "static_final_token_package_bound": True, + "training_authorized": False, + "scientific_launch_authorized": False, + "gpu_launch_authorized": False, + "nova_submission_authorized": False, + "execution_certified": False, + } + ) + return payload + + @property + def contract_sha256(self) -> str: + return adapter_module._canonical_sha256( + self.contract_payload(), + domain="bertose-a5-native-eight-data-adapter-contract-r7", + ) + + def _collate_training_micro( + self, + indices: Sequence[int], + *, + cell_id: str, + epoch: int, + device: torch.device, + ) -> tuple[Any, Mapping[str, Any]]: + micro, metadata = super()._collate_training_micro( + indices, + cell_id=cell_id, + epoch=epoch, + device=device, + ) + if not CELL_BITS[cell_id][2]: + return micro, metadata + static_inputs, static_identity = bundle.collate( + micro.parent_ids, + split="train", + epoch=epoch, + device=device, + ) + inputs = dict(micro.model_inputs) + _require(not (set(inputs) & set(static_inputs)), "static training keys collide") + inputs.update(static_inputs) + enriched = r8.PlannedMicrobatch( + parent_indices=micro.parent_indices, + parent_ids=micro.parent_ids, + model_inputs=MappingProxyType(inputs), + ) + meta = dict(metadata) + meta["static_batch_identity_sha256"] = static_identity + return enriched, MappingProxyType(meta) + + def materialize_training_step( + self, + *, + plan: Any, + step_index: int, + cell_id: str, + device: str | torch.device, + ) -> dict[str, Any]: + value = super().materialize_training_step( + plan=plan, + step_index=step_index, + cell_id=cell_id, + device=device, + ) + if not CELL_BITS[cell_id][2]: + return value + micros = value["micros"] + static_surface = [ + { + "parent_ids": list(micro.parent_ids), + **{ + key: micro.model_inputs[key] + for key in ( + "static_token_ids", + "static_attention_mask", + "static_residue_ids", + "static_slot_ids", + "static_state_mask", + "static_state_ids", + "static_input_mask", + "static_labels", + "static_parent_available", + ) + }, + } + for micro in micros + ] + identity = dict(value["step_identity"]) + identity.pop("step_identity_sha256") + identity["static_stream_sha256"] = r5._recursive_state_sha256( + { + "binding_sha256": bundle.binding_sha256, + "epoch": plan.epoch, + "surface": static_surface, + } + ) + identity["step_identity_sha256"] = adapter_module._canonical_sha256( + identity, + domain="bertose-a5-native-eight-authoritative-step-r7", + ) + return {"micros": micros, "step_identity": identity} + + def resume_cursor( + self, + *, + plan: Any, + next_optimizer_step: int, + cell_id: str, + ) -> dict[str, Any]: + cursor = super().resume_cursor( + plan=plan, + next_optimizer_step=next_optimizer_step, + cell_id=cell_id, + ) + if not CELL_BITS[cell_id][2]: + return cursor + cursor.pop("cursor_sha256") + prefix, suffix = adapter_module._r2.NativeEightDataAdapter._plan_prefix_suffix( + plan, next_optimizer_step + ) + cursor["static_token_stream"] = { + "binding_sha256": bundle.binding_sha256, + "token_package_sha256": bundle.token_package_sha256, + "null_receipt_sha256": bundle.null_receipt_sha256, + "mask_seed": COMMON_SEED, + "mask_epoch": plan.epoch, + "consumed_parent_prefix_sha256": canonical_sha256( + prefix, + domain="bertose-review-a5-static-resume-prefix-r1", + ), + "remaining_parent_suffix_sha256": canonical_sha256( + suffix, + domain="bertose-review-a5-static-resume-suffix-r1", + ), + } + plain = json.loads(canonical_bytes(cursor).decode("ascii")) + return { + **plain, + "cursor_sha256": adapter_module._canonical_sha256( + plain, + domain=adapter_module.CURSOR_SCHEMA, + ), + } + + def fixed_development_contract(self, cell_id: str) -> Any: + base_contract = super().fixed_development_contract(cell_id) + if not CELL_BITS[cell_id][2]: + return base_contract + eligible = { + objective: tuple(base_contract.eligible_parent_ids[objective]) + for objective in OBJECTIVES + } + eligible["static"] = tuple( + row.parent_id + for row in self.development_rows + if row.parent_id in bundle.parents + ) + surface = { + "schema": "bertose_review_a5_native_eight_fixed_development_20260722_r4_static_final", + "cell_id": cell_id, + "parent_batch_size": 32, + "base_r3_contract_sha256": base_contract.contract_sha256, + "static_binding_sha256": bundle.binding_sha256, + "static_mask_seed": 0, + "static_mask_epoch": 0, + "eligible_parent_ids": eligible, + "training_authorized": False, + "scientific_launch_authorized": False, + } + contract = r8.FixedDevelopmentContract( + surface_sha256=canonical_sha256( + surface, + domain="bertose-review-a5-static-development-surface-r1", + ), + eligible_parent_ids=MappingProxyType(eligible), + ) + contract.validate() + return contract + + def materialize_fixed_development( + self, + cell_id: str, + *, + device: str | torch.device, + parent_batch_size: int = 32, + ) -> Iterator[Any]: + topology, ms, static = self._require_materializable_cell(cell_id) + _require(parent_batch_size == 32, "development batch size must remain 32") + if not static: + yield from super().materialize_fixed_development( + cell_id, + device=device, + parent_batch_size=parent_batch_size, + ) + return + contract = self.fixed_development_contract(cell_id) + resolved = torch.device(device) + seen: list[str] = [] + seen_ms_rows: list[int] = [] + for start in range(0, len(self.development_rows), parent_batch_size): + joined_rows = self.development_rows[start : start + parent_batch_size] + inputs, _ = self._sequence_topology_inputs( + joined_rows, + topology_active=topology, + split="development", + ) + if ms: + ms_inputs, row_indices, _ = self._development_ms_inputs(joined_rows) + inputs.update(ms_inputs) + seen_ms_rows.extend(row_indices) + parent_ids = tuple(row.parent_id for row in joined_rows) + static_inputs, _ = bundle.collate( + parent_ids, + split="development", + epoch=0, + device=torch.device("cpu"), + ) + inputs.update(static_inputs) + seen.extend(parent_ids) + yield adapter_module._r2.DevelopmentBatch( + parent_ids=parent_ids, + model_inputs=self._move_inputs(inputs, resolved), + ) + _require(tuple(seen) == contract.eligible_parent_ids["sequence"], "development parent traversal changed") + _require((ms and len(seen_ms_rows) == 49_573 and len(set(seen_ms_rows)) == len(seen_ms_rows)) or (not ms and not seen_ms_rows), "development MS traversal changed") + + def evaluate_fixed_development( + self, + inner_executor: Any, + cell_id: str, + *, + device: str | torch.device, + parent_batch_size: int = 32, + ) -> Any: + if not CELL_BITS[cell_id][2]: + return super().evaluate_fixed_development( + inner_executor, + cell_id, + device=device, + parent_batch_size=parent_batch_size, + ) + _require(type(inner_executor) is r5.NativeEightProductionExecutor, "development executor class changed") + contract = self.fixed_development_contract(cell_id) + coefficients = dict(coefficients_for_cell(cell_id)) + _require(dict(inner_executor.coefficients) == coefficients, "development cell coefficients changed") + observed: dict[str, dict[str, float]] = {objective: {} for objective in OBJECTIVES} + was_training = inner_executor.model.training + before = _mutable_training_state_receipts(r5, inner_executor) + inner_executor.model._review_a5_r8_development_batches = [] + inner_executor.model._review_a5_r8_provenance_mode = "development" + inner_executor.model.eval() + try: + with torch.no_grad(): + for batch in self.materialize_fixed_development( + cell_id, + device=device, + parent_batch_size=parent_batch_size, + ): + output = inner_executor.model(**dict(batch.model_inputs)) + for objective in OBJECTIVES: + losses = output.parent_losses[objective] + indices = output.loss_parent_indices[objective] + if not coefficients[objective]: + _require(losses is None and indices is None, f"disabled {objective} emitted development loss") + continue + _require( + isinstance(losses, torch.Tensor) + and isinstance(indices, torch.Tensor) + and losses.ndim == indices.ndim == 1 + and losses.shape == indices.shape + and torch.isfinite(losses).all().item(), + f"enabled {objective} development vector changed", + ) + for local_index, raw_loss in zip( + indices.detach().cpu().tolist(), + losses.detach().cpu().tolist(), + ): + _require(type(local_index) is int and 0 <= local_index < len(batch.parent_ids), "development parent index changed") + parent_id = batch.parent_ids[local_index] + _require(parent_id not in observed[objective], f"{objective} development parent repeated") + value = float(raw_loss) + _require(math.isfinite(value) and value >= 0.0, f"{objective} development loss changed") + observed[objective][parent_id] = value + finally: + inner_executor.model.train(was_training) + inner_executor.model._review_a5_r8_provenance_mode = "train" + _require(_mutable_training_state_receipts(r5, inner_executor) == before, "development mutated model/optimizer/RNG") + raw_means: dict[str, float | None] = {} + normalized: dict[str, float | None] = {} + counts: dict[str, int] = {} + total = 0.0 + for objective in OBJECTIVES: + if coefficients[objective]: + eligible = tuple(contract.eligible_parent_ids[objective]) + _require(set(observed[objective]) == set(eligible), f"{objective} development roster incomplete") + values = [observed[objective][parent] for parent in eligible] + mean = math.fsum(values) / len(values) + scale = inner_executor.null_scales[objective] + value = mean / scale + raw_means[objective] = mean + normalized[objective] = value + counts[objective] = len(values) + total += value / LOSS_DENOMINATOR + else: + _require(not observed[objective], f"disabled {objective} accumulated development loss") + raw_means[objective] = None + normalized[objective] = None + counts[objective] = 0 + return r8.DevelopmentResult( + raw_parent_means=MappingProxyType(raw_means), + normalized_losses=MappingProxyType(normalized), + parent_counts=MappingProxyType(counts), + total_normalized_loss=total, + surface_sha256=contract.surface_sha256, + contract_sha256=contract.contract_sha256, + ) + + StaticEnabledNativeEightAdapter.__name__ = "StaticEnabledNativeEightAdapterR4" + StaticEnabledNativeEightAdapter.__qualname__ = "StaticEnabledNativeEightAdapterR4" + return StaticEnabledNativeEightAdapter + + +def _mutable_training_state_receipts(r5: ModuleType, executor: Any) -> dict[str, str]: + cuda_rng = torch.cuda.get_rng_state(0) if torch.cuda.is_available() else None + return { + "model": r5._recursive_state_sha256(executor.model.state_dict()), + "optimizer": r5._recursive_state_sha256(executor.optimizer.state_dict()), + "scheduler": r5._recursive_state_sha256( + executor.scheduler.state_dict() if executor.scheduler is not None else None + ), + "scaler": r5._recursive_state_sha256( + executor.grad_scaler.state_dict() if executor.grad_scaler is not None else None + ), + "torch_rng": r5._recursive_state_sha256(torch.get_rng_state()), + "cuda_rng": r5._recursive_state_sha256(cuda_rng), + } + + +def _construct_static_executor(r8: ModuleType, model: Any, static_scale: float) -> Any: + """Construct the exact R5 executor class with the final static null scale.""" + + r5 = r8._core._r6._r5 + executor = r5.NativeEightProductionExecutor.__new__(r5.NativeEightProductionExecutor) + r5._require(type(model) is r5.NativeEightCompositeR5, "executor requires exact R5 model") + model.verify_live_contract() + executor.component_bindings = r5.verify_execution_authorities() + r5._require(dict(executor.component_bindings) == dict(r5.EXPECTED_EXECUTION_BINDINGS), "R5 execution authorities changed") + executor.model = model + executor.cell_id = model.config.cell_id + executor.coefficients = dict(r5._planner.cell_coefficients(executor.cell_id)) + adamw = r8.AdamWContract() + adamw.validate() + executor.adamw = adamw + executor.null_scales = { + "sequence": float(r5.SEQUENCE_NULL_SCALE), + "topology": float(r5.TOPOLOGY_NULL_SCALE), + "ms": float(r5.MS_NULL_SCALE), + "static": float(static_scale), + } + r5._require(all(math.isfinite(value) and value > 0.0 for value in executor.null_scales.values()), "final null scale is invalid") + groups = [ + group + for group in model.optimizer_parameter_groups(weight_decay=adamw.weight_decay) + if group["params"] + ] + executor.optimizer = torch.optim.AdamW( + groups, + lr=adamw.learning_rate, + betas=(adamw.beta1, adamw.beta2), + eps=adamw.epsilon, + ) + optimizer_parameters = [parameter for group in executor.optimizer.param_groups for parameter in group["params"]] + active_parameters = [parameter for parameter in model.parameters() if parameter.requires_grad] + r5._require( + len(optimizer_parameters) == len({id(parameter) for parameter in optimizer_parameters}) + and {id(parameter) for parameter in optimizer_parameters} + == {id(parameter) for parameter in active_parameters}, + "AdamW parameter membership changed", + ) + executor.active_parameter_names = tuple( + name for name, parameter in model.named_parameters() if parameter.requires_grad + ) + executor.disabled_parameter_names = tuple( + name for name, parameter in model.named_parameters() if not parameter.requires_grad + ) + executor.optimizer_contract_sha256 = r5.canonical_sha256( + { + "class": "torch.optim.AdamW", + "hyperparameters": asdict(adamw), + "active_parameter_names": list(executor.active_parameter_names), + "group_weight_decays": [ + float(group["weight_decay"]) + for group in executor.optimizer.param_groups + ], + }, + domain="bertose-a5-native-eight-adamw-r5", + ) + executor.scheduler = None + executor.grad_scaler = None + executor.max_amp_retries = 0 + from contextlib import nullcontext + + executor.autocast_context_factory = lambda: nullcontext() + executor.runtime_source_sha256 = r5._runtime_source_sha256() + executor.bound_plan = None + executor.next_optimizer_step = 0 + executor.diagnostics = [] + return executor + + +def _torch_checkpoint_bytes(value: Mapping[str, Any]) -> bytes: + buffer = io.BytesIO() + torch.save(dict(value), buffer) + return buffer.getvalue() + + +def _torch_checkpoint_loads(payload: bytes, *, device: torch.device) -> dict[str, Any]: + try: + value = torch.load(io.BytesIO(payload), map_location=device, weights_only=True) + except BaseException as error: + raise NativeEightTrainingError("checkpoint cannot be safely decoded") from error + _require(type(value) is dict, "checkpoint root changed") + return value + + +def _fsync_directory(path: Path) -> None: + descriptor = os.open(path, os.O_RDONLY | os.O_DIRECTORY | getattr(os, "O_CLOEXEC", 0)) + try: + os.fsync(descriptor) + finally: + os.close(descriptor) + + +def _atomic_replace_bytes(path: Path, payload: bytes, *, mode: int = 0o600) -> None: + _canonical_absolute(path, "atomic output") + _require(path.parent.is_dir() and not path.parent.is_symlink(), "atomic output parent changed") + descriptor, temporary = tempfile.mkstemp( + prefix=f".{path.name}.", + suffix=".tmp", + dir=path.parent, + ) + try: + os.fchmod(descriptor, mode) + with os.fdopen(descriptor, "wb", closefd=True) as stream: + descriptor = -1 + stream.write(payload) + stream.flush() + os.fsync(stream.fileno()) + os.replace(temporary, path) + _fsync_directory(path.parent) + finally: + if descriptor >= 0: + os.close(descriptor) + try: + os.unlink(temporary) + except FileNotFoundError: + pass + + +def _read_role_file(path: Path, expected_sha256: str, *, label: str) -> bytes: + payload = read_regular_nofollow(path, label=label, maximum=64 * 1024 * 1024 * 1024) + _require(sha256_bytes(payload) == _exact_sha(expected_sha256, f"{label} expected hash"), f"{label} content address changed") + return payload + + +class CheckpointManager: + """Atomic role store retaining latest, best, and four milestones only.""" + + INDEX_NAME = "review_checkpoint_index.json" + LATEST_NAME = "review_checkpoint_latest.pt" + BEST_NAME = "review_checkpoint_best.pt" + + def __init__(self, root: Path, *, run_identity_sha256: str, cell_id: str) -> None: + self.root = _canonical_absolute(root, "checkpoint root") + self.root.mkdir(parents=True, exist_ok=True) + _require(self.root.is_dir() and not self.root.is_symlink(), "checkpoint root changed") + self.run_identity_sha256 = _exact_sha(run_identity_sha256, "run identity") + _require(cell_id in CELL_ORDER, "checkpoint cell changed") + self.cell_id = cell_id + + @property + def index_path(self) -> Path: + return self.root / self.INDEX_NAME + + def _load_index_optional(self) -> dict[str, Any] | None: + if not self.index_path.exists(): + return None + payload = read_regular_nofollow(self.index_path, label="checkpoint index", maximum=4 * 1024 * 1024) + try: + value = json.loads(payload.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightTrainingError("checkpoint index is invalid") from error + fields = { + "schema", + "generation", + "run_identity_sha256", + "cell_id", + "roles", + "index_sha256", + } + _require(type(value) is dict and set(value) == fields and canonical_bytes(value) == payload, "checkpoint index fields/bytes changed") + unsigned = dict(value) + digest = unsigned.pop("index_sha256") + _require( + value["schema"] == CHECKPOINT_INDEX_SCHEMA + and type(value["generation"]) is int + and value["generation"] >= 1 + and value["run_identity_sha256"] == self.run_identity_sha256 + and value["cell_id"] == self.cell_id + and digest == canonical_sha256(unsigned, domain=CHECKPOINT_INDEX_SCHEMA), + "checkpoint index identity changed", + ) + roles = value["roles"] + _require(type(roles) is dict and set(roles) == {"latest", "best", "milestones"}, "checkpoint roles changed") + for label in ("latest", "best"): + self._validate_entry(roles[label], label) + _require(type(roles["milestones"]) is dict, "checkpoint milestones changed") + for epoch_text, entry in roles["milestones"].items(): + _require(epoch_text in {str(epoch) for epoch in MILESTONE_EPOCHS}, "checkpoint milestone epoch changed") + self._validate_entry(entry, f"milestone {epoch_text}") + _require(entry["epoch"] == int(epoch_text), "checkpoint milestone identity changed") + return value + + def _validate_entry(self, value: object, label: str) -> None: + fields = {"filename", "sha256", "bytes", "epoch", "development_loss"} + _require(type(value) is dict and set(value) == fields, f"{label} checkpoint entry changed") + _require( + type(value["filename"]) is str + and "/" not in value["filename"] + and value["filename"].startswith("review_checkpoint_") + and _SHA_RE.fullmatch(value["sha256"]) is not None + and type(value["bytes"]) is int + and value["bytes"] > 0 + and type(value["epoch"]) is int + and 1 <= value["epoch"] <= MAX_EPOCHS + and type(value["development_loss"]) is float + and math.isfinite(value["development_loss"]) + and value["development_loss"] >= 0.0, + f"{label} checkpoint entry semantics changed", + ) + + @staticmethod + def _entry(filename: str, payload: bytes, *, epoch: int, development_loss: float) -> dict[str, Any]: + return { + "filename": filename, + "sha256": sha256_bytes(payload), + "bytes": len(payload), + "epoch": epoch, + "development_loss": float(development_loss), + } + + def commit( + self, + checkpoint: Mapping[str, Any], + *, + improved: bool, + epoch: int, + development_loss: float, + ) -> Mapping[str, Any]: + payload = _torch_checkpoint_bytes(checkpoint) + latest_entry = self._entry( + self.LATEST_NAME, + payload, + epoch=epoch, + development_loss=development_loss, + ) + previous = self._load_index_optional() + if previous is None: + _require(epoch == 1 and improved, "first checkpoint must be improving epoch one") + generation = 1 + best_entry = self._entry( + self.BEST_NAME, + payload, + epoch=epoch, + development_loss=development_loss, + ) + milestones: dict[str, Any] = {} + else: + _require(epoch == previous["roles"]["latest"]["epoch"] + 1, "checkpoint epoch is not append-only") + generation = previous["generation"] + 1 + best_entry = copy.deepcopy(previous["roles"]["best"]) + milestones = copy.deepcopy(previous["roles"]["milestones"]) + if improved: + best_entry = self._entry( + self.BEST_NAME, + payload, + epoch=epoch, + development_loss=development_loss, + ) + _atomic_replace_bytes(self.root / self.LATEST_NAME, payload) + if improved: + _atomic_replace_bytes(self.root / self.BEST_NAME, payload) + if epoch in MILESTONE_EPOCHS: + name = f"review_checkpoint_milestone_{epoch:03d}.pt" + _atomic_replace_bytes(self.root / name, payload) + milestones[str(epoch)] = self._entry( + name, + payload, + epoch=epoch, + development_loss=development_loss, + ) + unsigned = { + "schema": CHECKPOINT_INDEX_SCHEMA, + "generation": generation, + "run_identity_sha256": self.run_identity_sha256, + "cell_id": self.cell_id, + "roles": { + "latest": latest_entry, + "best": best_entry, + "milestones": milestones, + }, + } + index = { + **unsigned, + "index_sha256": canonical_sha256(unsigned, domain=CHECKPOINT_INDEX_SCHEMA), + } + _atomic_replace_bytes(self.index_path, canonical_bytes(index)) + verified = self._load_index_optional() + _require(verified == index, "checkpoint index publication failed") + return MappingProxyType( + { + "checkpoint_sha256": latest_entry["sha256"], + "index_sha256": index["index_sha256"], + "best_checkpoint_sha256": best_entry["sha256"], + } + ) + + def _load_entry(self, role: str, *, device: torch.device) -> tuple[dict[str, Any], dict[str, Any]]: + index = self._load_index_optional() + _require(index is not None, "checkpoint index is absent") + _require(role in {"latest", "best"}, "unknown checkpoint role") + entry = index["roles"][role] + payload = _read_role_file( + self.root / entry["filename"], + entry["sha256"], + label=f"{role} checkpoint", + ) + _require(len(payload) == entry["bytes"], f"{role} checkpoint size changed") + return _torch_checkpoint_loads(payload, device=device), copy.deepcopy(entry) + + def load_latest(self, *, device: torch.device) -> tuple[dict[str, Any], dict[str, Any]]: + return self._load_entry("latest", device=device) + + def load_best(self, *, device: torch.device) -> tuple[dict[str, Any], dict[str, Any]]: + return self._load_entry("best", device=device) + + def exists(self) -> bool: + return self.index_path.exists() + + +def _rng_payload() -> dict[str, Any]: + numpy_state = np.random.get_state() + return { + "python": random.getstate(), + "numpy": { + "name": numpy_state[0], + "keys": torch.as_tensor(numpy_state[1].astype(np.uint32).astype(np.int64)), + "position": int(numpy_state[2]), + "has_gauss": int(numpy_state[3]), + "cached_gaussian": float(numpy_state[4]), + }, + "torch_cpu": torch.get_rng_state(), + "torch_cuda": torch.cuda.get_rng_state(0) if torch.cuda.is_available() else None, + } + + +def _restore_rng(value: Mapping[str, Any]) -> None: + _require(type(value) is dict and set(value) == {"python", "numpy", "torch_cpu", "torch_cuda"}, "RNG checkpoint fields changed") + random.setstate(tuple(value["python"])) + numpy_state = value["numpy"] + _require(type(numpy_state) is dict and set(numpy_state) == {"name", "keys", "position", "has_gauss", "cached_gaussian"}, "NumPy RNG fields changed") + keys = numpy_state["keys"] + _require(isinstance(keys, torch.Tensor) and keys.ndim == 1, "NumPy RNG keys changed") + np.random.set_state( + ( + numpy_state["name"], + keys.detach().cpu().numpy().astype(np.uint32), + int(numpy_state["position"]), + int(numpy_state["has_gauss"]), + float(numpy_state["cached_gaussian"]), + ) + ) + torch.set_rng_state(value["torch_cpu"].detach().cpu()) + if value["torch_cuda"] is not None: + _require(torch.cuda.is_available(), "CUDA RNG checkpoint cannot restore without CUDA") + torch.cuda.set_rng_state(value["torch_cuda"].detach().cpu(), 0) + + +def _configure_reproducibility() -> None: + os.environ.setdefault("CUBLAS_WORKSPACE_CONFIG", ":4096:8") + random.seed(COMMON_SEED) + np.random.seed(COMMON_SEED) + torch.manual_seed(COMMON_SEED) + if torch.cuda.is_available(): + torch.cuda.manual_seed_all(COMMON_SEED) + torch.use_deterministic_algorithms(True) + if hasattr(torch.backends, "cudnn"): + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + + +def _device_receipt(device: torch.device) -> dict[str, Any]: + _require(device.type == "cuda" and device.index == 0 and torch.cuda.is_available(), "production runner requires visible cuda:0") + properties = torch.cuda.get_device_properties(device) + value = { + "device": "cuda:0", + "name": str(properties.name), + "compute_capability": [int(properties.major), int(properties.minor)], + "total_memory_bytes": int(properties.total_memory), + "multiprocessor_count": int(properties.multi_processor_count), + "torch_version": str(torch.__version__), + "cuda_runtime": str(torch.version.cuda), + "cudnn_version": int(torch.backends.cudnn.version() or 0), + "generic_gpu_request": "gpu:1", + "accelerator_model_constraint": None, + } + value["receipt_sha256"] = canonical_sha256(value, domain="bertose-review-a5-device-r1") + return value + + +def _claim_output( + cell_root: Path, + *, + semantic_array_id: str, + array_task_id: int, + cell_id: str, + resume_mode: str, +) -> Mapping[str, Any]: + claim_path = cell_root / "review_run_claim.json" + job_id = os.environ.get("SLURM_ARRAY_JOB_ID", os.environ.get("SLURM_JOB_ID", "local")) + task_text = os.environ.get("SLURM_ARRAY_TASK_ID", str(array_task_id)) + restart_text = os.environ.get("SLURM_RESTART_COUNT", "0") + _require(task_text == str(array_task_id), "SLURM task ID differs from CLI assignment") + _require(re.fullmatch(r"(?:local|[0-9]+)", job_id) is not None, "SLURM job ID is unsafe") + _require(re.fullmatch(r"[0-9]+", restart_text) is not None, "SLURM restart count is unsafe") + value = { + "schema": CLAIM_SCHEMA, + "semantic_array_id": semantic_array_id, + "array_job_id": job_id, + "array_task_id": array_task_id, + "cell_id": cell_id, + "common_seed": COMMON_SEED, + "first_restart_count": int(restart_text), + } + value["claim_sha256"] = canonical_sha256(value, domain=CLAIM_SCHEMA) + try: + descriptor = os.open( + claim_path, + os.O_WRONLY | os.O_CREAT | os.O_EXCL | getattr(os, "O_CLOEXEC", 0), + 0o600, + ) + except FileExistsError: + payload = read_regular_nofollow(claim_path, label="existing run claim", maximum=1024 * 1024) + try: + existing = json.loads(payload.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightTrainingError("existing run claim is invalid") from error + _require(canonical_bytes(existing) == payload, "existing run claim bytes changed") + unsigned = dict(existing) + digest = unsigned.pop("claim_sha256", None) + _require( + digest == canonical_sha256(unsigned, domain=CLAIM_SCHEMA) + and existing.get("semantic_array_id") == semantic_array_id + and existing.get("array_task_id") == array_task_id + and existing.get("cell_id") == cell_id + and existing.get("common_seed") == COMMON_SEED + and existing.get("array_job_id") == job_id + and resume_mode in {"auto", "required"}, + "duplicate output claim belongs to another job/cell or resume is disabled", + ) + return MappingProxyType(existing) + else: + with os.fdopen(descriptor, "wb") as stream: + stream.write(canonical_bytes(value)) + stream.flush() + os.fsync(stream.fileno()) + _fsync_directory(cell_root) + return MappingProxyType(value) + + +def _run_identity( + *, + r8: ModuleType, + launch_config: LaunchConfig, + cell_id: str, + adapter: Any, + model: Any, + executor: Any, + static_bundle: StaticBundle | None, +) -> tuple[dict[str, Any], str]: + r5 = r8._core._r6._r5 + source_bytes = read_regular_nofollow( + Path(__file__).absolute(), + label="native-eight training runner source", + maximum=16 * 1024 * 1024, + ) + r8_bytes = read_regular_nofollow(R8_PATH, label="R8 predecessor source", maximum=16 * 1024 * 1024) + value = { + "schema": SCHEMA, + "semantic_array_id": launch_config.semantic_array_id, + "cell_id": cell_id, + "cell_bits": dict(zip(("topology", "ms", "static"), CELL_BITS[cell_id])), + "coefficients": dict(coefficients_for_cell(cell_id)), + "loss_denominator": LOSS_DENOMINATOR, + "common_seed": COMMON_SEED, + "maximum_epochs": MAX_EPOCHS, + "patience": PATIENCE, + "selection_rule": "strict_lower_earliest_tie", + "runner_source_sha256": sha256_bytes(source_bytes), + "r8_predecessor_source_sha256": sha256_bytes(r8_bytes), + "launch_config_sha256": sha256_bytes(canonical_bytes(dict(launch_config.source_value))), + "adapter_contract_sha256": adapter.contract_sha256, + "adapter_contract": adapter.contract_payload(), + "static_binding_sha256": ( + static_bundle.binding_sha256 if static_bundle is not None else None + ), + "model_configuration": asdict(model.config), + "initial_model_state_sha256": r5._model_state_sha256(model), + "optimizer_contract_sha256": executor.optimizer_contract_sha256, + "null_scales": {key: float(value) for key, value in executor.null_scales.items()}, + "software": { + "python": sys.version, + "torch": str(torch.__version__), + "numpy": str(np.__version__), + }, + "precision": "fp32_no_amp", + "completed_epoch_resume": True, + "unfinished_epoch_recomputed_from_latest": True, + "training_authorized": False, + "nova_submission_authorized": False, + } + return value, canonical_sha256(value, domain=SCHEMA) + + +def _development_payload(result: Any) -> dict[str, Any]: + return { + "raw_parent_means": dict(result.raw_parent_means), + "normalized_losses": dict(result.normalized_losses), + "parent_counts": dict(result.parent_counts), + "total_normalized_loss": float(result.total_normalized_loss), + "surface_sha256": str(result.surface_sha256), + "contract_sha256": str(result.contract_sha256), + } + + +def _checkpoint_value( + *, + run_identity: Mapping[str, Any], + run_identity_sha256: str, + cell_id: str, + plan: Any, + adapter_cursor: Mapping[str, Any], + executor: Any, + selection: SelectionState, + history: Sequence[Mapping[str, Any]], + development: Mapping[str, Any], + step_identity_sha256s: Sequence[str], + static_binding_sha256: str | None, +) -> dict[str, Any]: + _require(selection.completed_epochs == plan.epoch + 1, "checkpoint epoch/plan changed") + value = { + "schema": CHECKPOINT_SCHEMA, + "run_identity": copy.deepcopy(dict(run_identity)), + "run_identity_sha256": run_identity_sha256, + "cell_id": cell_id, + "epoch": selection.completed_epochs, + "plan_epoch": plan.epoch, + "plan_sha256": plan.plan_sha256, + "completed_optimizer_steps": plan.optimizer_step_count, + "step_identity_chain_sha256": canonical_sha256( + list(step_identity_sha256s), + domain="bertose-review-a5-native8-step-chain-r1", + ), + "adapter_cursor": copy.deepcopy(dict(adapter_cursor)), + "model_state": copy.deepcopy(executor.model.state_dict()), + "optimizer_state": copy.deepcopy(executor.optimizer.state_dict()), + "scheduler_state": ( + copy.deepcopy(executor.scheduler.state_dict()) + if executor.scheduler is not None + else None + ), + "scaler_state": ( + copy.deepcopy(executor.grad_scaler.state_dict()) + if executor.grad_scaler is not None + else None + ), + "rng_state": _rng_payload(), + "selection": selection.payload(), + "development_history": copy.deepcopy(list(history)), + "latest_development": copy.deepcopy(dict(development)), + "static_binding_sha256": static_binding_sha256, + "checkpoint_roles": [ + "latest", + "best", + "milestone_25", + "milestone_50", + "milestone_75", + "milestone_100", + ], + "training_authorized": False, + "nova_submission_authorized": False, + } + return value + + +def _validate_checkpoint_value( + value: Mapping[str, Any], + *, + run_identity: Mapping[str, Any], + run_identity_sha256: str, + cell_id: str, + static_binding_sha256: str | None, +) -> SelectionState: + fields = { + "schema", + "run_identity", + "run_identity_sha256", + "cell_id", + "epoch", + "plan_epoch", + "plan_sha256", + "completed_optimizer_steps", + "step_identity_chain_sha256", + "adapter_cursor", + "model_state", + "optimizer_state", + "scheduler_state", + "scaler_state", + "rng_state", + "selection", + "development_history", + "latest_development", + "static_binding_sha256", + "checkpoint_roles", + "training_authorized", + "nova_submission_authorized", + } + _require(type(value) is dict and set(value) == fields, "checkpoint fields changed") + selection = SelectionState.from_payload(value["selection"]) + _require( + value["schema"] == CHECKPOINT_SCHEMA + and value["run_identity"] == dict(run_identity) + and value["run_identity_sha256"] == run_identity_sha256 + and value["cell_id"] == cell_id + and value["epoch"] == selection.completed_epochs + and value["plan_epoch"] == selection.completed_epochs - 1 + and type(value["completed_optimizer_steps"]) is int + and value["completed_optimizer_steps"] > 0 + and _SHA_RE.fullmatch(value["plan_sha256"]) is not None + and _SHA_RE.fullmatch(value["step_identity_chain_sha256"]) is not None + and type(value["adapter_cursor"]) is dict + and type(value["development_history"]) is list + and len(value["development_history"]) == selection.completed_epochs + and value["latest_development"] == value["development_history"][-1]["development"] + and value["static_binding_sha256"] == static_binding_sha256 + and value["checkpoint_roles"] + == ["latest", "best", "milestone_25", "milestone_50", "milestone_75", "milestone_100"] + and value["training_authorized"] is False + and value["nova_submission_authorized"] is False, + "checkpoint scientific identity changed", + ) + return selection + + +def _verify_materialized_step( + r8: ModuleType, + *, + value: Mapping[str, Any], + adapter: Any, + plan: Any, + step_index: int, + cell_id: str, +) -> tuple[Any, str]: + _require(type(value) is dict and set(value) == {"micros", "step_identity"}, "materialized step fields changed") + micros = value["micros"] + identity = value["step_identity"] + _require(type(micros) is tuple and len(micros) == 4, "materialized microbatch count changed") + _require(type(identity) is dict, "step identity changed") + unsigned = dict(identity) + observed = unsigned.pop("step_identity_sha256", None) + expected = r8._adapter_r3._canonical_sha256( + unsigned, + domain="bertose-a5-native-eight-authoritative-step-r7", + ) + _require( + observed == expected + and identity.get("adapter_contract_sha256") == adapter.contract_sha256 + and identity.get("plan_sha256") == plan.plan_sha256 + and identity.get("epoch") == plan.epoch + and identity.get("optimizer_step_index") == step_index + and tuple(identity.get("parent_indices", ())) == plan.step_parent_indices(step_index) + and tuple(identity.get("parent_ids", ())) == plan.step_parent_ids(step_index) + and identity.get("training_authorized") is False + and identity.get("scientific_launch_authorized") is False, + "step identity differs from exact plan/adapter", + ) + _require( + (identity.get("static_stream_sha256") is None) is (not bool(CELL_BITS[cell_id][2])), + "static stream presence differs from cell bit", + ) + return micros, expected + + +def _restore_completed_epoch( + *, + r8: ModuleType, + checkpoint: Mapping[str, Any], + adapter: Any, + executor: Any, + selection: SelectionState, +) -> None: + executor.model.load_state_dict(checkpoint["model_state"], strict=True) + executor.optimizer.load_state_dict(checkpoint["optimizer_state"]) + _require(executor.scheduler is None and checkpoint["scheduler_state"] is None, "scheduler resume mode changed") + _require(executor.grad_scaler is None and checkpoint["scaler_state"] is None, "scaler resume mode changed") + previous_plan = adapter.build_epoch_plan(selection.completed_epochs - 1) + _require( + previous_plan.plan_sha256 == checkpoint["plan_sha256"] + and previous_plan.optimizer_step_count == checkpoint["completed_optimizer_steps"], + "resume plan differs from completed checkpoint", + ) + executor.bound_plan = previous_plan + executor.next_optimizer_step = previous_plan.optimizer_step_count + adapter.restore_resume_cursor( + checkpoint["adapter_cursor"], + plan=previous_plan, + cell_id=executor.cell_id, + ) + _restore_rng(checkpoint["rng_state"]) + + +def _write_final_receipt( + cell_root: Path, + *, + semantic_array_id: str, + cell_id: str, + run_identity_sha256: str, + manager: CheckpointManager, + selection: SelectionState, + history: Sequence[Mapping[str, Any]], + device_receipt: Mapping[str, Any], +) -> Mapping[str, Any]: + _require(selection.stop_reason in {"patience_exhausted", "max_epochs_reached"}, "final receipt lacks terminal selection") + _best, best_entry = manager.load_best(device=torch.device("cpu")) + _latest, latest_entry = manager.load_latest(device=torch.device("cpu")) + _require(selection.best_epoch == best_entry["epoch"], "indexed best epoch differs from selection") + unsigned = { + "schema": FINAL_RECEIPT_SCHEMA, + "semantic_array_id": semantic_array_id, + "cell_id": cell_id, + "common_seed": COMMON_SEED, + "run_identity_sha256": run_identity_sha256, + "completed_epochs": selection.completed_epochs, + "stop_reason": selection.stop_reason, + "best_epoch": selection.best_epoch, + "best_development_loss": selection.best_loss, + "best_checkpoint": best_entry, + "latest_checkpoint": latest_entry, + "development_history_sha256": canonical_sha256( + list(history), + domain="bertose-review-a5-native8-development-history-r1", + ), + "device_receipt": dict(device_receipt), + "selection_rule": "strict_lower_earliest_tie", + "maximum_epochs": MAX_EPOCHS, + "patience": PATIENCE, + "loss_coefficients": [1, *CELL_BITS[cell_id]], + "loss_denominator": LOSS_DENOMINATOR, + "training_authorized": False, + "nova_submission_authorized": False, + } + value = { + **unsigned, + "receipt_sha256": canonical_sha256(unsigned, domain=FINAL_RECEIPT_SCHEMA), + } + path = cell_root / "review_final_selection_receipt.json" + if path.exists(): + existing = read_regular_nofollow(path, label="existing final selection receipt", maximum=4 * 1024 * 1024) + _require(existing == canonical_bytes(value), "existing final selection receipt differs") + else: + _atomic_replace_bytes(path, canonical_bytes(value)) + return MappingProxyType(value) + + +def _stop_handler(signum: int, _frame: object) -> None: + global _STOP_REQUESTED + _STOP_REQUESTED = True + + +def run_training( + launch_config_path: Path, + *, + array_task_id: int, + resume_mode: str, +) -> Mapping[str, Any]: + """Run exactly one assigned cell; this function never invokes a scheduler.""" + + _require(resume_mode in {"auto", "required", "never"}, "resume mode changed") + cell_id = cell_for_array_task(array_task_id) + config = LaunchConfig.load(_canonical_absolute(launch_config_path, "launch config")) + _require( + os.fspath(config.project_root) == os.fspath(WRITING_ROOT.parent), + "launch config project root differs from runtime location", + ) + config.output_root.mkdir(parents=True, exist_ok=True) + _require(config.output_root.is_dir() and not config.output_root.is_symlink(), "output root changed") + safe_semantic = config.semantic_array_id.replace(":", "_") + cell_root = config.output_root / f"review_native8_{safe_semantic}_{cell_id}_seed43" + cell_root.mkdir(mode=0o700, exist_ok=True) + _require(cell_root.is_dir() and not cell_root.is_symlink(), "cell output root changed") + claim = _claim_output( + cell_root, + semantic_array_id=config.semantic_array_id, + array_task_id=array_task_id, + cell_id=cell_id, + resume_mode=resume_mode, + ) + release_bytes = read_regular_nofollow( + config.release_receipt, + label="native-eight release receipt", + maximum=64 * 1024 * 1024, + ) + _require(sha256_bytes(release_bytes) == config.release_receipt_sha256, "native-eight release receipt changed") + + _configure_reproducibility() + device = torch.device("cuda:0") + device_receipt = _device_receipt(device) + r8 = _load_r8() + r5 = r8._core._r6._r5 + static_active = bool(CELL_BITS[cell_id][2]) + static_bundle: StaticBundle | None = None + if static_active: + static_bundle = StaticBundle.load(config) + adapter_class = _make_static_adapter_class(r8, static_bundle) + adapter = adapter_class() + else: + # Do not open the final static token/null/publication artifacts here. + adapter = r8._adapter_r3.NativeEightDataAdapter() + try: + model_config = r8.NativeEightConfig( + cell_id=cell_id, + seq_vocab_size=int(r5.SEQUENCE_VOCAB_SIZE), + ) + model = r8.NativeEightCompositeR5(model_config) + r8._install_model_bridge(model, adapter) + model.to(device) + if static_bundle is None: + executor = r5.NativeEightProductionExecutor( + model, + max_amp_retries=0, + ) + else: + executor = _construct_static_executor(r8, model, static_bundle.null_scale) + run_identity, run_identity_sha = _run_identity( + r8=r8, + launch_config=config, + cell_id=cell_id, + adapter=adapter, + model=model, + executor=executor, + static_bundle=static_bundle, + ) + checkpoint_root = cell_root / "review_checkpoints" + manager = CheckpointManager( + checkpoint_root, + run_identity_sha256=run_identity_sha, + cell_id=cell_id, + ) + if resume_mode == "required": + _require(manager.exists(), "resume was required but latest checkpoint is absent") + if resume_mode == "never": + _require(not manager.exists(), "resume was disabled but checkpoint state exists") + + selection = SelectionState() + history: list[dict[str, Any]] = [] + if manager.exists(): + checkpoint, latest_entry = manager.load_latest(device=device) + selection = _validate_checkpoint_value( + checkpoint, + run_identity=run_identity, + run_identity_sha256=run_identity_sha, + cell_id=cell_id, + static_binding_sha256=( + static_bundle.binding_sha256 if static_bundle is not None else None + ), + ) + _require(latest_entry["epoch"] == selection.completed_epochs, "latest checkpoint/index epoch changed") + history = copy.deepcopy(checkpoint["development_history"]) + _restore_completed_epoch( + r8=r8, + checkpoint=checkpoint, + adapter=adapter, + executor=executor, + selection=selection, + ) + + signal.signal(signal.SIGTERM, _stop_handler) + if hasattr(signal, "SIGUSR1"): + signal.signal(signal.SIGUSR1, _stop_handler) + while selection.stop_reason is None: + epoch_index = selection.completed_epochs + _require(epoch_index < MAX_EPOCHS, "training exceeded max100") + plan = adapter.build_epoch_plan(epoch_index) + executor.bind_epoch_plan(plan) + step_identity_sha256s: list[str] = [] + while executor.next_optimizer_step < plan.optimizer_step_count: + step_index = executor.next_optimizer_step + materialized = adapter.materialize_training_step( + plan=plan, + step_index=step_index, + cell_id=cell_id, + device=device, + ) + micros, step_identity = _verify_materialized_step( + r8, + value=materialized, + adapter=adapter, + plan=plan, + step_index=step_index, + cell_id=cell_id, + ) + diagnostic = executor.execute_step(micros) + _require( + diagnostic.optimizer_step_index == step_index + and diagnostic.plan_sha256 == plan.plan_sha256 + and diagnostic.input_sha256 + == materialized["step_identity"]["model_input_sha256"], + "optimizer diagnostic differs from materialized input", + ) + step_identity_sha256s.append(step_identity) + if _STOP_REQUESTED: + raise NativeEightTrainingError( + "termination requested; latest completed epoch remains resumable" + ) + development = adapter.evaluate_fixed_development( + executor, + cell_id, + device=device, + parent_batch_size=32, + ) + development_value = _development_payload(development) + next_selection, improved = selection.observe( + development_value["total_normalized_loss"] + ) + history.append( + { + "epoch": next_selection.completed_epochs, + "development": development_value, + "improved": improved, + "best_epoch": next_selection.best_epoch, + "best_loss": next_selection.best_loss, + "epochs_without_improvement": next_selection.epochs_without_improvement, + "stop_reason": next_selection.stop_reason, + "step_identity_chain_sha256": canonical_sha256( + step_identity_sha256s, + domain="bertose-review-a5-native8-step-chain-r1", + ), + } + ) + adapter_cursor = adapter.resume_cursor( + plan=plan, + next_optimizer_step=plan.optimizer_step_count, + cell_id=cell_id, + ) + checkpoint = _checkpoint_value( + run_identity=run_identity, + run_identity_sha256=run_identity_sha, + cell_id=cell_id, + plan=plan, + adapter_cursor=adapter_cursor, + executor=executor, + selection=next_selection, + history=history, + development=development_value, + step_identity_sha256s=step_identity_sha256s, + static_binding_sha256=( + static_bundle.binding_sha256 if static_bundle is not None else None + ), + ) + commit = manager.commit( + checkpoint, + improved=improved, + epoch=next_selection.completed_epochs, + development_loss=development_value["total_normalized_loss"], + ) + selection = next_selection + print( + canonical_bytes( + { + "event": "completed_epoch", + "cell_id": cell_id, + "epoch": selection.completed_epochs, + "development_total_normalized_loss": development_value[ + "total_normalized_loss" + ], + "improved": improved, + "best_epoch": selection.best_epoch, + "epochs_without_improvement": selection.epochs_without_improvement, + "stop_reason": selection.stop_reason, + "checkpoint_sha256": commit["checkpoint_sha256"], + } + ).decode("ascii").rstrip(), + flush=True, + ) + + final = _write_final_receipt( + cell_root, + semantic_array_id=config.semantic_array_id, + cell_id=cell_id, + run_identity_sha256=run_identity_sha, + manager=manager, + selection=selection, + history=history, + device_receipt=device_receipt, + ) + return MappingProxyType( + { + "status": "COMPLETE", + "cell_id": cell_id, + "array_task_id": array_task_id, + "claim_sha256": claim["claim_sha256"], + "run_identity_sha256": run_identity_sha, + "final_receipt_sha256": final["receipt_sha256"], + "best_epoch": final["best_epoch"], + "completed_epochs": final["completed_epochs"], + } + ) + finally: + close = getattr(adapter, "close", None) + if callable(close): + close() + + +def describe_contract() -> Mapping[str, Any]: + return MappingProxyType( + { + "schema": SCHEMA, + "cell_order": list(CELL_ORDER), + "cell_bits": {key: list(value) for key, value in CELL_BITS.items()}, + "common_seed": COMMON_SEED, + "loss_coefficients": [1, "topology_bit", "ms_bit", "static_bit"], + "loss_denominator": LOSS_DENOMINATOR, + "maximum_epochs": MAX_EPOCHS, + "patience": PATIENCE, + "selection_rule": "strict_lower_earliest_tie", + "checkpoint_roles": [ + "latest", + "best", + "milestone_25", + "milestone_50", + "milestone_75", + "milestone_100", + ], + "resume": "exact_completed_epoch_state; unfinished epoch deterministically recomputed", + "scheduler": { + "partition": "scavenger", + "account": "ratul-scavenger", + "qos": "scavenger", + "gres": "gpu:1", + "array": "0-7", + "concurrency_throttle": None, + "constraint": None, + }, + "same_gpu_anchor_required": False, + "capacity_replay_required": False, + "duplicate_claim_required": True, + "training_authorized": False, + "nova_submission_authorized": False, + } + ) + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--launch-config", type=Path) + parser.add_argument("--array-task-id", type=int) + parser.add_argument( + "--resume", + choices=("auto", "required", "never"), + default="auto", + ) + parser.add_argument("--describe", action="store_true") + parser.add_argument("--validate-launch-config-only", action="store_true") + return parser + + +def main(argv: Sequence[str] | None = None) -> int: + args = build_parser().parse_args(argv) + if args.describe: + print(canonical_bytes(dict(describe_contract())).decode("ascii"), end="") + return 0 + _require(args.launch_config is not None, "--launch-config is required") + config = LaunchConfig.load(_canonical_absolute(args.launch_config, "launch config")) + if args.validate_launch_config_only: + print( + canonical_bytes( + { + "status": "PASS_LAUNCH_CONFIG_STRUCTURE_ONLY_NO_DATA_OR_GPU_OPENED", + "semantic_array_id": config.semantic_array_id, + "launch_config_sha256": sha256_bytes( + canonical_bytes(dict(config.source_value)) + ), + } + ).decode("ascii"), + end="", + ) + return 0 + _require(args.array_task_id is not None, "--array-task-id is required") + result = run_training( + args.launch_config, + array_task_id=args.array_task_id, + resume_mode=args.resume, + ) + print(canonical_bytes(dict(result)).decode("ascii"), end="") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) + + +__all__ = [ + "CELL_BITS", + "CELL_ORDER", + "CHECKPOINT_INDEX_SCHEMA", + "CHECKPOINT_SCHEMA", + "COMMON_SEED", + "CheckpointManager", + "EARLIEST_STOP_EPOCH", + "LAUNCH_CONFIG_SCHEMA", + "LOSS_DENOMINATOR", + "LaunchConfig", + "MAX_EPOCHS", + "MILESTONE_EPOCHS", + "NativeEightTrainingError", + "PATIENCE", + "SCHEMA", + "STATIC_BINDING_SCHEMA", + "SelectionState", + "StaticBundle", + "canonical_bytes", + "canonical_sha256", + "cell_for_array_task", + "coefficients_for_cell", + "describe_contract", + "main", + "run_training", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/review_a5_native_eight_training_runner_r2.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/review_a5_native_eight_training_runner_r2.py new file mode 100644 index 0000000000000000000000000000000000000000..3e76f7dae35f6afdc7b6c15d543ea47073b7cec6 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/review_a5_native_eight_training_runner_r2.py @@ -0,0 +1,1861 @@ +"""R2 fail-closed successor for the corrected native-eight trainer. + +R2 retains the audited R1 scientific training loop through an exact source +hash, while replacing three operational boundaries discovered before launch: + +* the final post-fit static package/null/publication R3 lineage is validated; +* checkpoints are committed through immutable content-addressed payloads and + one atomic index publication, preserving the previous resume point across + interruption; and +* the separately hash-pinned CLI wrapper can load this module under ``-I``. + +This module contains no scheduler call and does not authorize Nova submission. +""" + +from __future__ import annotations + +import base64 +import copy +import fcntl +import hashlib +import json +import math +import os +from pathlib import Path +import re +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + +import numpy as np +import torch + + +R1_SOURCE_SHA256 = "34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf" +R1_SOURCE = ( + Path(__file__).absolute().parent.parent + / "a5_native_eight_training_20260722_r1" + / "review_a5_native_eight_training_runner_r1.py" +) + +SCHEMA_R2 = "bertose_review_a5_native_eight_training_runner_20260722_r2" +LAUNCH_CONFIG_SCHEMA_R2 = ( + "bertose_review_a5_native_eight_training_launch_config_20260722_r2" +) +STATIC_BINDING_SCHEMA_R2 = ( + "bertose_review_a5_native_eight_static_runtime_binding_20260722_r2" +) +CHECKPOINT_SCHEMA_R2 = ( + "bertose_review_a5_native_eight_completed_epoch_checkpoint_20260722_r2" +) +CHECKPOINT_INDEX_SCHEMA_R2 = ( + "bertose_review_a5_native_eight_checkpoint_index_20260722_r2" +) +FINAL_RECEIPT_SCHEMA_R2 = ( + "bertose_review_a5_native_eight_final_selection_receipt_20260722_r2" +) +CLAIM_SCHEMA_R2 = "bertose_review_a5_native_eight_duplicate_claim_20260722_r2" +DEVICE_LINEAGE_SCHEMA_R2 = ( + "bertose_review_a5_native_eight_device_lineage_20260722_r2" +) +EXTERNAL_RELEASE_SCHEMA_R2 = ( + "bertose_a5_native_eight_external_release_20260722_r2" +) +EXTERNAL_RELEASE_STATUS_R2 = "PASS_RELEASED_FOR_ONE_NATIVE_EIGHT_ARRAY" +DUPLICATE_PREFLIGHT_SCHEMA_R2 = ( + "bertose_a5_native_eight_live_duplicate_preflight_20260722_r2" +) +LAUNCH_CONFIG_SEMANTIC_DOMAIN_R2 = ( + "bertose-a5-native-eight-launch-config-release-sha-elided-r2" +) +SBATCH_SEMANTIC_DOMAIN_R2 = ( + b"bertose-a5-native-eight-sbatch-launch-config-pin-elided-r2\0" +) + +POSTFIT_WRITER_SCHEMA = "bertose_a5_static_v2_postfit_production_writer_20260722_r4" +POSTFIT_EXPORT_SCHEMA = ( + "bertose_a5_static_v2_direct_train_development_export_20260722_r4" +) +POSTFIT_NULL_SCHEMA = "bertose_a5_static_v2_published_train_only_null_20260722_r4" +POSTFIT_PUBLICATION_SCHEMA = "bertose_a5_static_v2_postfit_publication_20260722_r4" +POSTFIT_JOIN_SCHEMA = "bertose_a5_static_v2_direct_state_sequence_join_20260722_r4" +POSTFIT_TOKEN_STATUS = "FROZEN_PREPARATION_ONLY" +POSTFIT_NULL_STATUS = "PASS_TRAIN_ONLY_STATIC_NULL_READY_FOR_NATIVE_ABLATION_BINDING" +POSTFIT_PUBLICATION_STATUS = "PASS_IMMUTABLE_REVIEW_POSTFIT_PUBLICATION" +# Replaced only after the R4 owner sends the frozen source declaration. This +# invalid non-SHA sentinel keeps even an otherwise well-formed release closed. +POSTFIT_WRITER_SOURCE_SHA256 = "PENDING_FROZEN_R4_WRITER_SOURCE_SHA256" + +POSTFIT_CLOSED_AUTHORIZATION = { + "ablation_launch_authorized": False, + "affinose_authorized": False, + "downstream_authorized": False, + "nova_submission_authorized": False, + "automatic_promotion_authorized": False, +} + +POSTFIT_ACTIVE_COUNTS = { + "pretraining_train": { + "parent_count": 22_980, + "state_count": 34_408, + "residue_count": 205_801, + }, + "pretraining_development": { + "parent_count": 5_390, + "state_count": 7_964, + "residue_count": 51_237, + }, + "all": { + "parent_count": 28_370, + "state_count": 42_372, + "residue_count": 257_038, + "token_count": 1_028_152, + }, +} + +POSTFIT_AUTHORITY_ROLE_COUNTS = { + "excluded_exact_or_verified_graph_identity": 3_179, + "excluded_later_role_nonfit_identity": 35, + "outside_sequence_authority": 423, + "pretraining_development": 7_964, + "pretraining_train": 34_408, + "static_ineligible": 5_430, + "static_ineligible_incomplete_alpha_beta_pair": 622, + "static_transform_only_exact_development_overlap": 3, + "static_transform_only_exact_excluded_overlap": 2_638, +} + +CORE_CLOSED_AUTHORIZATION = { + "training_authorized": False, + "scientific_launch_authorized": False, + "gpu_launch_authorized": False, + "nova_submission_authorized": False, + "downstream_evaluation_authorized": False, + "inference_authorized": False, + "external_release_authorized": False, + "test_opening_authorized": False, +} + + +def _read_regular_nofollow(path: Path, *, maximum: int) -> bytes: + """Read one absolute regular file without following any path component.""" + + absolute = Path(path) + if ( + not absolute.is_absolute() + or os.path.normpath(os.fspath(absolute)) != os.fspath(absolute) + or not hasattr(os, "O_NOFOLLOW") + or not hasattr(os, "O_DIRECTORY") + ): + raise RuntimeError("R2 pinned source path is not canonical/no-follow capable") + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in absolute.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(absolute.parts[-1], leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + if not stat.S_ISREG(before.st_mode) or before.st_size > maximum: + raise RuntimeError("R2 pinned source is not a bounded regular file") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("R2 pinned source truncated during read") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + ): + raise RuntimeError("R2 pinned source changed during read") + return b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + + +def _load_r1_core() -> ModuleType: + payload = _read_regular_nofollow(R1_SOURCE, maximum=16 * 1024 * 1024) + if hashlib.sha256(payload).hexdigest() != R1_SOURCE_SHA256: + raise RuntimeError("R1 native-eight source bytes differ from the R2 pin") + name = "_review_a5_native_eight_training_core_r1_pinned_for_r2" + module = ModuleType(name) + module.__file__ = os.fspath(R1_SOURCE) + module.__package__ = "" + sys.modules[name] = module + try: + code = compile(payload, os.fspath(R1_SOURCE), "exec", dont_inherit=True) + exec(code, module.__dict__) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +_core = _load_r1_core() + +# Give every inherited function the R2 schemas and bind run identity to this R2 +# source. This is process-local; the immutable R1 module on disk is untouched. +_core.SCHEMA = SCHEMA_R2 +_core.LAUNCH_CONFIG_SCHEMA = LAUNCH_CONFIG_SCHEMA_R2 +_core.STATIC_BINDING_SCHEMA = STATIC_BINDING_SCHEMA_R2 +_core.CHECKPOINT_SCHEMA = CHECKPOINT_SCHEMA_R2 +_core.CHECKPOINT_INDEX_SCHEMA = CHECKPOINT_INDEX_SCHEMA_R2 +_core.FINAL_RECEIPT_SCHEMA = FINAL_RECEIPT_SCHEMA_R2 +_core.CLAIM_SCHEMA = CLAIM_SCHEMA_R2 +_core.STATIC_NULL_SCHEMA = POSTFIT_NULL_SCHEMA +_core.__file__ = os.fspath(Path(__file__).absolute()) +_core.RUNTIME_ROOT = Path(__file__).absolute().parent + +RUNNER_SOURCE_PATH = Path(__file__).absolute() +WRAPPER_SOURCE_PATH = RUNNER_SOURCE_PATH.parent / "run_review_a5_native_eight_training_r2.py" +SBATCH_SOURCE_PATH = ( + _core.WRITING_ROOT + / "review/multimodal/slurm" + / "review_a5_native_eight_seed43_scavenger_20260722_r2.sbatch" +) + +_ACTIVE_CLAIM_LOCKS: dict[str, int] = {} +_ACTIVE_CLAIM_CONTEXTS: dict[str, Mapping[str, Any]] = {} +_VALIDATED_EXTERNAL_RELEASE: Mapping[str, Any] | None = None +_EXTERNAL_LAUNCH_CONFIG_FILE_SHA256: str | None = None + + +def _unsigned_receipt_sha256(value: Mapping[str, Any], *, label: str) -> str: + unsigned = dict(value) + signed = unsigned.pop("receipt_sha256", None) + _core._exact_sha(signed, f"{label} receipt") + _core._require( + signed == _core.sha256_bytes(_core.canonical_bytes(unsigned)), + f"{label} receipt signature changed", + ) + return str(signed) + + +def _validate_publication_file( + value: object, + *, + expected_path: Path, + expected_sha256: str, + expected_size: int, + label: str, +) -> None: + fields = { + "absolute_path", + "size_bytes", + "file_sha256", + "mode_octal", + "nlink", + "exclusive_no_overwrite", + "sealed_readback_passed", + "idempotent_identical_reuse_supported", + } + _core._require(type(value) is dict and set(value) == fields, f"{label} publication fields changed") + _core._require( + value["absolute_path"] == os.fspath(expected_path) + and value["size_bytes"] == expected_size + and value["file_sha256"] == expected_sha256 + and value["mode_octal"] == "0400" + and value["nlink"] == 1 + and value["exclusive_no_overwrite"] is True + and value["sealed_readback_passed"] is True + and value["idempotent_identical_reuse_supported"] is True, + f"{label} publication identity changed", + ) + + +def _launch_config_release_elided_semantic_sha256( + source_value: Mapping[str, Any], +) -> str: + """Hash every config field except the circular release-file SHA value.""" + + value = copy.deepcopy(dict(source_value)) + release = value.get("release_receipt") + _core._require( + type(release) is dict and set(release) == {"path", "sha256"}, + "launch config release binding changed", + ) + release["sha256"] = "0" * 64 + return _core.canonical_sha256(value, domain=LAUNCH_CONFIG_SEMANTIC_DOMAIN_R2) + + +def _sbatch_launch_config_pin_elided_semantic_sha256(payload: bytes) -> str: + """Hash exact sbatch bytes after eliding only its config-pin value.""" + + try: + text = payload.decode("ascii") + except UnicodeDecodeError as error: + raise _core.NativeEightTrainingError("sbatch source is not ASCII") from error + pattern = re.compile( + r"(?m)^LAUNCH_CONFIG_SHA256=(?:[0-9a-f]{64}|FINAL_RELEASE_MUST_PIN_LAUNCH_CONFIG_SHA256)$" + ) + matches = list(pattern.finditer(text)) + _core._require(len(matches) == 1, "sbatch config-pin assignment changed") + normalized = pattern.sub("LAUNCH_CONFIG_SHA256=" + "0" * 64, text).encode("ascii") + return hashlib.sha256(SBATCH_SEMANTIC_DOMAIN_R2 + normalized).hexdigest() + + +def _validate_source_binding( + value: object, *, expected_path: Path, label: str +) -> str: + _core._require( + type(value) is dict + and set(value) == {"absolute_path", "sha256", "bytes"}, + f"{label} source binding fields changed", + ) + path = _core._canonical_absolute(Path(value["absolute_path"]), f"{label} source") + _core._require(path == expected_path, f"{label} source path changed") + payload = _core.read_regular_nofollow( + path, label=f"{label} source", maximum=64 * 1024 * 1024 + ) + observed = _core.sha256_bytes(payload) + _core._require( + value["sha256"] == observed and value["bytes"] == len(payload), + f"{label} source bytes changed", + ) + return observed + + +def _validate_duplicate_preflight( + value: object, *, semantic_array_id: str +) -> Mapping[str, Any]: + fields = { + "schema", + "status", + "semantic_array_id", + "cell_order", + "array_spec", + "active_job_match_count", + "existing_output_root_count", + "slurm_query_receipt_sha256", + "output_scan_receipt_sha256", + "one_copy_only", + "observed_at_utc", + "valid_for_immediate_single_submission_only", + "receipt_sha256", + } + _core._require(type(value) is dict and set(value) == fields, "duplicate preflight fields changed") + unsigned = dict(value) + signed = unsigned.pop("receipt_sha256") + _core._require( + value["schema"] == DUPLICATE_PREFLIGHT_SCHEMA_R2 + and value["status"] == "PASS_NO_ACTIVE_OR_EXISTING_NATIVE_EIGHT_COPY" + and value["semantic_array_id"] == semantic_array_id + and value["cell_order"] == list(_core.CELL_ORDER) + and value["array_spec"] == "0-7" + and value["active_job_match_count"] == 0 + and value["existing_output_root_count"] == 0 + and value["one_copy_only"] is True + and type(value["observed_at_utc"]) is str + and re.fullmatch( + r"20[0-9]{2}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z", + value["observed_at_utc"], + ) + is not None + and value["valid_for_immediate_single_submission_only"] is True + and _core._exact_sha( + value["slurm_query_receipt_sha256"], "duplicate SLURM query" + ) + and _core._exact_sha( + value["output_scan_receipt_sha256"], "duplicate output scan" + ) + and signed + == _core.canonical_sha256(unsigned, domain=DUPLICATE_PREFLIGHT_SCHEMA_R2), + "live duplicate preflight changed or is not clean", + ) + return MappingProxyType(copy.deepcopy(value)) + + +def _validate_external_release_r2( + config: Any, *, launch_config_path: Path +) -> Mapping[str, Any]: + """Validate, but never create, the final external one-array release.""" + + release = _core.load_canonical_json( + config.release_receipt, + config.release_receipt_sha256, + label="native-eight external release receipt", + ) + fields = { + "schema", + "status", + "semantic_array_id", + "source_bindings", + "launch_config_binding", + "postfit_bindings", + "experiment", + "scheduler", + "live_duplicate_preflight", + "safety", + "exclusions", + "authorization", + "official_submitted_artifacts_modified", + "receipt_sha256", + } + _core._require(type(release) is dict and set(release) == fields, "external release fields changed") + unsigned = dict(release) + signed = unsigned.pop("receipt_sha256") + _core._require( + release["schema"] == EXTERNAL_RELEASE_SCHEMA_R2 + and release["status"] == EXTERNAL_RELEASE_STATUS_R2 + and release["semantic_array_id"] == config.semantic_array_id + and release["official_submitted_artifacts_modified"] is False + and signed + == _core.canonical_sha256(unsigned, domain=EXTERNAL_RELEASE_SCHEMA_R2), + "external release identity/signature changed", + ) + + source_bindings = release["source_bindings"] + _core._require( + type(source_bindings) is dict + and set(source_bindings) == {"runner", "wrapper", "sbatch"}, + "external release source roster changed", + ) + runner_path = RUNNER_SOURCE_PATH + wrapper_path = WRAPPER_SOURCE_PATH + sbatch_path = SBATCH_SOURCE_PATH + _validate_source_binding(source_bindings["runner"], expected_path=runner_path, label="R2 runner") + _validate_source_binding(source_bindings["wrapper"], expected_path=wrapper_path, label="R2 wrapper") + sbatch_bytes = _core.read_regular_nofollow( + sbatch_path, label="R2 sbatch config-pin readback", maximum=4 * 1024 * 1024 + ) + sbatch_binding = source_bindings["sbatch"] + _core._require( + type(sbatch_binding) is dict + and set(sbatch_binding) + == { + "absolute_path", + "launch_config_pin_elided_semantic_sha256", + "full_file_must_pin_exact_launch_config_sha256", + } + and sbatch_binding["absolute_path"] == os.fspath(sbatch_path) + and sbatch_binding["launch_config_pin_elided_semantic_sha256"] + == _sbatch_launch_config_pin_elided_semantic_sha256(sbatch_bytes) + and sbatch_binding["full_file_must_pin_exact_launch_config_sha256"] is True + and _EXTERNAL_LAUNCH_CONFIG_FILE_SHA256 is not None + and ( + b"LAUNCH_CONFIG_SHA256=" + + _EXTERNAL_LAUNCH_CONFIG_FILE_SHA256.encode("ascii") + + b"\n" + ) + in sbatch_bytes, + "sbatch does not pin the exact full launch-config file SHA-256", + ) + + config_binding = release["launch_config_binding"] + _core._require( + type(config_binding) is dict + and set(config_binding) + == { + "absolute_path", + "release_sha_elided_semantic_sha256", + "full_file_sha256_must_be_pinned_by_sbatch_and_wrapper", + } + and config_binding["absolute_path"] + == os.fspath(_core._canonical_absolute(launch_config_path, "launch config")), + "launch config release binding fields changed", + ) + # The absolute config path is validated by the R2 main entry point. The + # release binds the acyclic semantic surface, with only its own file SHA + # replaced by zero; the full file SHA is independently pinned by sbatch. + _core._require( + config_binding["release_sha_elided_semantic_sha256"] + == _launch_config_release_elided_semantic_sha256(config.source_value) + and config_binding[ + "full_file_sha256_must_be_pinned_by_sbatch_and_wrapper" + ] + is True, + "launch config semantic binding changed", + ) + + postfit = release["postfit_bindings"] + postfit_fields = { + "writer_schema", + "writer_source_sha256", + "publication_file_sha256", + "publication_receipt_semantic_sha256", + "token_file_sha256", + "token_package_semantic_sha256", + "token_export_receipt_sha256", + "token_null_receipt_sha256", + "null_file_sha256", + "null_receipt_semantic_sha256", + "export_receipt_semantic_sha256", + "join_receipt_semantic_sha256", + "selected_checkpoint_semantic_sha256", + "selected_model_state_sha256", + "export_model_state_sha256", + "support_replay_receipt_sha256", + "selected_support_identity_sha256", + "rvq_identity_sha256", + "device_execution_identity_sha256", + "source_authority_file_sha256", + "source_closure_sha256", + "ordered_parent_inference_receipt_sha256", + "ordered_parent_ids_sha256", + "ordered_state_ids_sha256", + "active_counts", + "authority_role_counts", + "sequence_ordered_residue_identity_equals_each_state_graph_residue_identity", + "parent_and_state_wurcs_ordered_node_sequence_exact", + "parent_sequence_wurcs_byte_equality_required", + "development_used_for_support_or_null_fit", + "excluded_later_role_nonfit_identity_count", + } + _core._require( + type(postfit) is dict + and set(postfit) == postfit_fields + and postfit["writer_schema"] == POSTFIT_WRITER_SCHEMA + and postfit["writer_source_sha256"] + == _core._exact_sha( + POSTFIT_WRITER_SOURCE_SHA256, "frozen R4 writer source" + ) + and postfit["publication_file_sha256"] + == config.static_publication_receipt_sha256 + and postfit["token_file_sha256"] == config.static_token_package_sha256 + and postfit["null_file_sha256"] == config.static_null_receipt_sha256 + and postfit["active_counts"] == POSTFIT_ACTIVE_COUNTS + and postfit["authority_role_counts"] == POSTFIT_AUTHORITY_ROLE_COUNTS + and postfit[ + "sequence_ordered_residue_identity_equals_each_state_graph_residue_identity" + ] + is True + and postfit["parent_and_state_wurcs_ordered_node_sequence_exact"] is True + and postfit["parent_sequence_wurcs_byte_equality_required"] is False + and postfit["development_used_for_support_or_null_fit"] is False + and postfit["excluded_later_role_nonfit_identity_count"] == 35, + "external release post-fit science/count binding changed", + ) + for key in postfit_fields - { + "writer_schema", + "writer_source_sha256", + "active_counts", + "authority_role_counts", + "sequence_ordered_residue_identity_equals_each_state_graph_residue_identity", + "parent_and_state_wurcs_ordered_node_sequence_exact", + "parent_sequence_wurcs_byte_equality_required", + "development_used_for_support_or_null_fit", + "excluded_later_role_nonfit_identity_count", + }: + _core._exact_sha(postfit[key], f"external release post-fit {key}") + + experiment = release["experiment"] + _core._require( + experiment + == { + "cell_order": list(_core.CELL_ORDER), + "cell_bits": {key: list(value) for key, value in _core.CELL_BITS.items()}, + "common_seed": 43, + "sequence_always_active": True, + "loss_coefficients": [1, "topology_bit", "ms_bit", "static_bit"], + "loss_denominator": 4, + "maximum_epochs": 100, + "patience": 15, + "selection_rule": "strict_lower_earliest_tie", + "checkpoint_roles": [ + "latest", + "best", + "milestone_25", + "milestone_50", + "milestone_75", + "milestone_100", + ], + }, + "external release experiment changed", + ) + _core._require( + release["scheduler"] + == { + "partition": "scavenger", + "account": "ratul-scavenger", + "qos": "scavenger", + "gres": "gpu:1", + "array": "0-7", + "concurrency_throttle": None, + "constraint": None, + "open_mode": "append", + "requeue": True, + }, + "external release scheduler changed", + ) + _validate_duplicate_preflight( + release["live_duplicate_preflight"], + semantic_array_id=config.semantic_array_id, + ) + expected_roots = { + cell: os.fspath( + config.output_root + / f"review_native8_{config.semantic_array_id.replace(':', '_')}_{cell}_seed43" + ) + for cell in _core.CELL_ORDER + } + _core._require( + release["safety"] + == { + "one_copy_only": True, + "single_array_only": True, + "output_root": os.fspath(config.output_root), + "cell_output_roots": expected_roots, + "cell_output_roots_absent_at_release": { + cell: True for cell in _core.CELL_ORDER + }, + "output_namespace_scan_passed": True, + "live_duplicate_preflight_required": True, + "cross_job_exact_resume_is_not_a_second_copy": True, + "new_fresh_array_after_release_authorized": False, + }, + "external release safety/one-copy boundary changed", + ) + _core._require( + release["exclusions"] + == { + "wa2_authorized": False, + "wa3_authorized": False, + "weight_ablation_authorized": False, + "md_authorized": False, + "affinose_authorized": False, + "downstream_authorized": False, + "phase2_representation_graph_authorized": False, + }, + "external release exclusions changed", + ) + _core._require( + release["authorization"] + == { + "training_authorized": True, + "nova_submission_authorized": True, + "one_native_eight_array_authorized": True, + "manual_exact_resume_authorized": True, + "automatic_second_array_authorized": False, + "automatic_scientific_promotion_authorized": False, + }, + "external release authorization scope changed", + ) + return MappingProxyType(copy.deepcopy(release)) + + +def _load_static_bundle_r2(cls: type, config: Any) -> Any: + """Load the exact post-fit R3 static package and all lineage receipts.""" + + _core._require( + _VALIDATED_EXTERNAL_RELEASE is not None + and _VALIDATED_EXTERNAL_RELEASE.get("semantic_array_id") + == config.semantic_array_id, + "static bundle cannot open before the external release is validated", + ) + + token_bytes = _core.read_regular_nofollow( + config.static_token_package, + label="final static token package", + maximum=2 * 1024 * 1024 * 1024, + ) + _core._require( + _core.sha256_bytes(token_bytes) == config.static_token_package_sha256, + "final static token package hash changed", + ) + package = _core._primitive_pickle_loads(token_bytes) + token_fields = { + "schema", + "status", + "official_submitted_artifacts_modified", + "parents", + "max_static_tokens", + "ordered_parent_ids_sha256", + "ordered_state_ids_sha256", + "export_receipt_sha256", + "null_receipt_sha256", + "authorization", + } + _core._require( + type(package) is dict + and set(package) == token_fields + and package["schema"] == _core.STATIC_PACKAGE_SCHEMA + and package["status"] == POSTFIT_TOKEN_STATUS, + "final static token package fields/schema/status changed", + ) + _core._require( + package["official_submitted_artifacts_modified"] is False + and package["authorization"] == POSTFIT_CLOSED_AUTHORIZATION, + "static package mutation/authorization boundary changed", + ) + token_export_receipt_sha256 = _core._exact_sha( + package["export_receipt_sha256"], "token export receipt" + ) + token_null_receipt_sha256 = _core._exact_sha( + package["null_receipt_sha256"], "token null receipt" + ) + _core._require( + type(package["parents"]) is dict and bool(package["parents"]), + "static package parent map is empty", + ) + _core._require( + type(package["max_static_tokens"]) is int + and 4 <= package["max_static_tokens"] <= 192 + and package["max_static_tokens"] % 4 == 0, + "static package width changed", + ) + + parent_map: dict[str, tuple[Mapping[str, Any], ...]] = {} + parent_order: list[str] = [] + state_order: list[str] = [] + seen_states: set[str] = set() + seen_state_ints: set[int] = set() + supports: list[set[int]] = [set(), set(), set(), set()] + role_counts = {_core.STATIC_TRAIN_ROLE: 0, _core.STATIC_DEVELOPMENT_ROLE: 0} + state_counts = {_core.STATIC_TRAIN_ROLE: 0, _core.STATIC_DEVELOPMENT_ROLE: 0} + residue_counts = {_core.STATIC_TRAIN_ROLE: 0, _core.STATIC_DEVELOPMENT_ROLE: 0} + maximum = 0 + state_fields = { + "parent_glycorpus_id", + "canonical_structure_state_id", + "role", + "effective_wurcs", + "global_token_ids", + "residue_ids", + "slot_ids", + "state_id_int64", + } + for parent_id, raw_states in package["parents"].items(): + _core._require(type(parent_id) is str and bool(parent_id), "static parent ID is empty") + _core._require( + type(raw_states) is list and bool(raw_states), + f"static parent {parent_id} has no states", + ) + normalized: list[Mapping[str, Any]] = [] + parent_role: str | None = None + for raw in raw_states: + _core._require( + type(raw) is dict and set(raw) == state_fields, + f"static state fields changed for {parent_id}", + ) + state_id = raw["canonical_structure_state_id"] + role = raw["role"] + state_int = raw["state_id_int64"] + _core._require( + type(state_id) is str and bool(state_id) and state_id not in seen_states, + "static state ID is empty or duplicated", + ) + _core._require(role in role_counts, f"active static state {state_id} has a nonactive role") + _core._require(raw["parent_glycorpus_id"] == parent_id, "static state/parent join changed") + _core._require(parent_role in {None, role}, "one static parent crosses train/development roles") + _core._require( + type(raw["effective_wurcs"]) is str and bool(raw["effective_wurcs"]), + f"static state {state_id} effective WURCS is empty", + ) + _core._require( + type(state_int) is int and 0 <= state_int < 2**63 and state_int not in seen_state_ints, + "static state int64 changed or collides globally", + ) + parent_role = role + global_ids = raw["global_token_ids"] + residues = raw["residue_ids"] + slots = raw["slot_ids"] + _core._require( + type(global_ids) is list + and type(residues) is list + and type(slots) is list + and 4 <= len(global_ids) <= 192 + and len(global_ids) % 4 == 0 + and len(global_ids) == len(residues) == len(slots), + f"static state {state_id} tensor axes changed", + ) + residue_count = len(global_ids) // 4 + expected_residues = [index for index in range(residue_count) for _ in range(4)] + expected_slots = list(range(4)) * residue_count + _core._require( + residues == expected_residues and slots == expected_slots, + f"static state {state_id} is not residue-major slot 0,1,2,3", + ) + _core._require( + all(type(value) is int and 0 <= value < 4096 for value in global_ids), + f"static state {state_id} has an invalid global token", + ) + for position, global_id in enumerate(global_ids): + slot = slots[position] + _core._require( + global_id // 1024 == slot, + f"static state {state_id} global/slot identity changed", + ) + if role == _core.STATIC_TRAIN_ROLE: + supports[slot].add(global_id % 1024) + normalized.append(MappingProxyType(copy.deepcopy(raw))) + seen_states.add(state_id) + seen_state_ints.add(state_int) + state_order.append(state_id) + state_counts[role] += 1 + residue_counts[role] += residue_count + maximum = max(maximum, len(global_ids)) + assert parent_role is not None + role_counts[parent_role] += 1 + parent_order.append(parent_id) + parent_map[parent_id] = tuple(normalized) + + _core._require(maximum == package["max_static_tokens"], "static package maximum width differs from states") + _core._require( + _core._ordered_values_sha256(parent_order, domain=b"bertose-a5-ordered-values-v1") + == package["ordered_parent_ids_sha256"], + "static ordered parent identity changed", + ) + _core._require( + _core._ordered_values_sha256(state_order, domain=b"bertose-a5-ordered-values-v1") + == package["ordered_state_ids_sha256"], + "static ordered state identity changed", + ) + observed_active_counts = { + _core.STATIC_TRAIN_ROLE: { + "parent_count": role_counts[_core.STATIC_TRAIN_ROLE], + "state_count": state_counts[_core.STATIC_TRAIN_ROLE], + "residue_count": residue_counts[_core.STATIC_TRAIN_ROLE], + }, + _core.STATIC_DEVELOPMENT_ROLE: { + "parent_count": role_counts[_core.STATIC_DEVELOPMENT_ROLE], + "state_count": state_counts[_core.STATIC_DEVELOPMENT_ROLE], + "residue_count": residue_counts[_core.STATIC_DEVELOPMENT_ROLE], + }, + "all": { + "parent_count": sum(role_counts.values()), + "state_count": sum(state_counts.values()), + "residue_count": sum(residue_counts.values()), + "token_count": sum(residue_counts.values()) * 4, + }, + } + _core._require( + observed_active_counts == POSTFIT_ACTIVE_COUNTS, + "static token package differs from the frozen production counts", + ) + canonical_supports = tuple(tuple(sorted(values)) for values in supports) + _core._require( + all(len(values) >= 2 for values in canonical_supports), + "static train-observed slot support is incomplete", + ) + support_hashes = tuple( + _core.sha256_bytes(np.asarray(values, dtype=" 0.0 + and null_receipt["scale_hex"] == scale.hex() + and core_receipt.get("scale") == scale + and core_receipt.get("scale_hex") == scale.hex(), + "static null scale changed", + ) + probabilities_b64 = null_receipt["probabilities_float64_le_base64"] + _core._require( + type(probabilities_b64) is str + and null_receipt["probabilities_dtype"] == "float64_le" + and null_receipt["probabilities_shape"] == [4, 1024], + "static null probability layout changed", + ) + try: + probability_bytes = base64.b64decode(probabilities_b64, validate=True) + except (TypeError, ValueError) as error: + raise _core.NativeEightTrainingError("static null probabilities are malformed") from error + _core._require( + len(probability_bytes) == 4 * 1024 * 8 + and _core.sha256_bytes(probability_bytes) + == null_receipt["probabilities_float64_le_sha256"] + == core_receipt.get("probabilities_combined_sha256"), + "static null probability bytes changed", + ) + probabilities = np.frombuffer(probability_bytes, dtype="= 0.0) + and np.allclose(probabilities.sum(axis=1), 1.0, rtol=0.0, atol=1e-15) + and [ + _core.sha256_bytes(probabilities[slot].tobytes()) for slot in range(4) + ] + == core_receipt.get("probabilities_sha256_by_slot"), + "static null probabilities are invalid", + ) + + publication = _core.load_canonical_json( + config.static_publication_receipt, + config.static_publication_receipt_sha256, + label="final static publication receipt", + ) + publication_fields = { + "schema", + "status", + "production_mode", + "writer_schema", + "selected_handoff_file_sha256", + "selected_handoff_receipt_sha256", + "support_replay_receipt_sha256", + "export_receipt", + "export_receipt_sha256", + "null_receipt_sha256", + "join_receipt", + "join_receipt_sha256", + "preserved_authority_role_counts", + "token_publication", + "state_publication", + "null_publication", + "traceability_publication", + "receipt_written_last", + "resume_is_verify_or_continue_without_overwrite", + "development_used_for_support_or_null_fit", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } + _core._require( + set(publication) == publication_fields + and publication["schema"] == POSTFIT_PUBLICATION_SCHEMA + and publication["status"] == POSTFIT_PUBLICATION_STATUS + and publication["production_mode"] is True + and publication["writer_schema"] == POSTFIT_WRITER_SCHEMA + and publication["receipt_written_last"] is True + and publication["resume_is_verify_or_continue_without_overwrite"] is True + and publication["development_used_for_support_or_null_fit"] is False + and publication["official_submitted_artifacts_modified"] is False + and publication["authorization"] == POSTFIT_CLOSED_AUTHORIZATION, + "static publication production/authorization boundary changed", + ) + publication_semantic_sha256 = _unsigned_receipt_sha256(publication, label="static publication") + export_receipt = publication["export_receipt"] + join_receipt = publication["join_receipt"] + _core._require(type(export_receipt) is dict and type(join_receipt) is dict, "static publication lineage receipts are absent") + export_semantic_sha256 = _unsigned_receipt_sha256(export_receipt, label="static export") + join_semantic_sha256 = _unsigned_receipt_sha256(join_receipt, label="static join") + token_semantic_sha256 = _core.sha256_bytes(_core.canonical_bytes(package)) + _core._require( + export_receipt.get("schema") == POSTFIT_EXPORT_SCHEMA + and export_receipt.get("status") == "PASS_DIRECT_TRAIN_FULL_DEVELOPMENT_RVQ_EXPORT" + and export_receipt.get("production_mode") is True + and export_receipt.get("development_used_for_support_or_null_fit") is False + and export_receipt.get("exact_counts") == observed_active_counts + and export_receipt.get("ordered_parent_ids_sha256") + == package["ordered_parent_ids_sha256"] + and export_receipt.get("ordered_state_ids_sha256") + == package["ordered_state_ids_sha256"] + and export_receipt.get("selected_checkpoint_semantic_sha256") + == null_receipt["selected_checkpoint_semantic_sha256"] + and export_receipt.get("selected_model_state_sha256") + == null_receipt["selected_model_state_sha256"] + and export_receipt.get("rvq_identity_sha256") == null_receipt["rvq_identity_sha256"] + and export_receipt.get("source_authority_file_sha256") + == null_receipt["source_authority_file_sha256"] + and export_receipt.get("source_closure_sha256") + == null_receipt["source_closure_sha256"] + and export_receipt.get("null_receipt_sha256") == token_null_receipt_sha256 + and export_receipt.get("authorization") == POSTFIT_CLOSED_AUTHORIZATION + and export_semantic_sha256 == publication["export_receipt_sha256"] + == token_export_receipt_sha256 + and publication["null_receipt_sha256"] == token_null_receipt_sha256 + and join_receipt.get("schema") == POSTFIT_JOIN_SCHEMA + and join_receipt.get("status") == "PASS_STATE_SPECIFIC_SUCCESSOR_JOIN" + and join_receipt.get("production_mode", True) is True + and join_receipt.get("parent_sequence_wurcs_byte_equality_required") is False + and join_receipt.get( + "sequence_ordered_residue_identity_equals_each_state_graph_residue_identity" + ) + is True + and join_receipt.get("parent_and_state_wurcs_ordered_node_sequence_exact") + is True + and join_receipt.get("token_state_count") == sum(state_counts.values()) + and join_receipt.get("token_parent_count") == sum(role_counts.values()) + and join_receipt.get("token_package_sha256") == token_semantic_sha256 + and join_receipt.get("authorization") == POSTFIT_CLOSED_AUTHORIZATION + and join_semantic_sha256 == publication["join_receipt_sha256"], + "static post-fit export/join/token/null lineage changed", + ) + released_postfit = _VALIDATED_EXTERNAL_RELEASE["postfit_bindings"] + _core._require( + released_postfit["publication_receipt_semantic_sha256"] + == publication_semantic_sha256 + and released_postfit["token_package_semantic_sha256"] + == token_semantic_sha256 + and released_postfit["token_export_receipt_sha256"] + == token_export_receipt_sha256 + and released_postfit["token_null_receipt_sha256"] + == token_null_receipt_sha256 + and released_postfit["null_receipt_semantic_sha256"] + == null_semantic_sha256 + and released_postfit["export_receipt_semantic_sha256"] + == export_semantic_sha256 + and released_postfit["join_receipt_semantic_sha256"] + == join_semantic_sha256 + and released_postfit["selected_checkpoint_semantic_sha256"] + == null_receipt["selected_checkpoint_semantic_sha256"] + and released_postfit["selected_model_state_sha256"] + == null_receipt["selected_model_state_sha256"] + and released_postfit["rvq_identity_sha256"] + == null_receipt["rvq_identity_sha256"] + and released_postfit["source_authority_file_sha256"] + == null_receipt["source_authority_file_sha256"] + and released_postfit["source_closure_sha256"] + == null_receipt["source_closure_sha256"] + and released_postfit["ordered_parent_inference_receipt_sha256"] + == null_receipt["ordered_parent_inference_receipt_sha256"] + and released_postfit["selected_support_identity_sha256"] + == null_receipt["support_identity_sha256"] + and released_postfit["ordered_parent_ids_sha256"] + == package["ordered_parent_ids_sha256"] + and released_postfit["ordered_state_ids_sha256"] + == package["ordered_state_ids_sha256"] + and released_postfit[ + "sequence_ordered_residue_identity_equals_each_state_graph_residue_identity" + ] + is True + and released_postfit["parent_and_state_wurcs_ordered_node_sequence_exact"] + is True, + "parsed post-fit science identities differ from the external release", + ) + for field in ( + "selected_handoff_file_sha256", + "selected_handoff_receipt_sha256", + "support_replay_receipt_sha256", + ): + _core._exact_sha(publication[field], f"static publication {field}") + _core._require( + publication["preserved_authority_role_counts"] + == POSTFIT_AUTHORITY_ROLE_COUNTS, + "static publication did not preserve the frozen authority role ledger", + ) + _validate_publication_file( + publication["token_publication"], + expected_path=config.static_token_package, + expected_sha256=config.static_token_package_sha256, + expected_size=len(token_bytes), + label="static token", + ) + null_file_bytes = _core.read_regular_nofollow( + config.static_null_receipt, + label="final train-only static null receipt readback", + maximum=64 * 1024 * 1024, + ) + _validate_publication_file( + publication["null_publication"], + expected_path=config.static_null_receipt, + expected_sha256=config.static_null_receipt_sha256, + expected_size=len(null_file_bytes), + label="static null", + ) + + release_bytes = _core.read_regular_nofollow( + config.release_receipt, + label="native-eight release receipt", + maximum=64 * 1024 * 1024, + ) + _core._require( + _core.sha256_bytes(release_bytes) == config.release_receipt_sha256, + "native-eight release receipt hash changed", + ) + + mask_module = __import__(_core.STATIC_MASK_PACKAGE, fromlist=["StaticMaskerR2"]) + mask_contract = __import__( + _core.STATIC_MASK_CONTRACT_PACKAGE, fromlist=["static_mask_policy"] + ) + support_binding = _core._exact_sha( + core_receipt.get("support_binding_sha256"), "static null support binding" + ) + masker = mask_module.StaticMaskerR2( + supported_local_ids_by_slot=canonical_supports, + expected_support_binding_sha256=support_binding, + expected_support_sha256_by_slot=support_hashes, + mask_policy=mask_contract.static_mask_policy(), + ) + binding = { + "schema": STATIC_BINDING_SCHEMA_R2, + "token_package_sha256": config.static_token_package_sha256, + "token_package_semantic_sha256": token_semantic_sha256, + "token_export_receipt_sha256": token_export_receipt_sha256, + "token_null_receipt_sha256": token_null_receipt_sha256, + "null_receipt_sha256": config.static_null_receipt_sha256, + "publication_receipt_sha256": config.static_publication_receipt_sha256, + "publication_receipt_semantic_sha256": publication_semantic_sha256, + "release_receipt_sha256": config.release_receipt_sha256, + "parent_counts": role_counts, + "state_counts": state_counts, + "residue_counts": residue_counts, + "token_count": sum(residue_counts.values()) * 4, + "max_static_tokens": maximum, + "support_sha256_by_slot": list(support_hashes), + "support_binding_sha256": support_binding, + "masker_binding_sha256": masker.binding()["binding_sha256"], + "null_scale": scale, + "null_scale_hex": scale.hex(), + "training_authorized": False, + "nova_submission_authorized": False, + } + binding["binding_sha256"] = _core.canonical_sha256( + binding, domain=STATIC_BINDING_SCHEMA_R2 + ) + return cls( + config.static_token_package_sha256, + config.static_null_receipt_sha256, + config.static_publication_receipt_sha256, + MappingProxyType(parent_map), + scale, + canonical_supports, + support_hashes, + MappingProxyType(binding), + masker, + ) + + +_PAYLOAD_RE = re.compile(r"review_checkpoint_payload_e([0-9]{3})_([0-9a-f]{64})[.]pt\Z") + + +class TransactionalCheckpointManagerR2(_core.CheckpointManager): + """One-index transaction over immutable, content-addressed payload files.""" + + def _validate_entry(self, value: object, label: str) -> None: + super()._validate_entry(value, label) + assert type(value) is dict + match = _PAYLOAD_RE.fullmatch(value["filename"]) + _core._require( + match is not None + and int(match.group(1)) == value["epoch"] + and match.group(2) == value["sha256"], + f"{label} checkpoint is not content addressed", + ) + + def _load_entry( + self, role: str, *, device: torch.device + ) -> tuple[dict[str, Any], dict[str, Any]]: + index = self._load_index_optional() + _core._require(index is not None, "checkpoint index is absent") + # If the prior process died after the atomic index swap, that index is + # already the committed truth. Reconcile only unreferenced payloads. + self._cleanup_unreferenced_payloads(index) + return super()._load_entry(role, device=device) + + @staticmethod + def _payload_name(*, epoch: int, payload_sha256: str) -> str: + return f"review_checkpoint_payload_e{epoch:03d}_{payload_sha256}.pt" + + def _publish_payload(self, path: Path, payload: bytes) -> None: + flags = ( + os.O_WRONLY + | os.O_CREAT + | os.O_EXCL + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + try: + descriptor = os.open(path, flags, 0o600) + except FileExistsError: + existing = _core.read_regular_nofollow( + path, label="existing transactional checkpoint payload", maximum=64 * 1024 * 1024 * 1024 + ) + _core._require(existing == payload, "content-addressed checkpoint payload bytes changed") + return + try: + with os.fdopen(descriptor, "wb", closefd=True) as stream: + descriptor = -1 + stream.write(payload) + stream.flush() + os.fsync(stream.fileno()) + finally: + if descriptor >= 0: + os.close(descriptor) + _core._fsync_directory(self.root) + + def _transaction_fault_point(self, point: str) -> None: + """Overridden only by focused tests to simulate an uncatchable interruption.""" + + def _cleanup_unreferenced_payloads(self, index: Mapping[str, Any]) -> None: + roles = index["roles"] + entries = [roles["latest"], roles["best"], *roles["milestones"].values()] + referenced = {entry["filename"] for entry in entries} + changed = False + directory_descriptor = os.open( + self.root, + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0), + ) + try: + for entry in os.scandir(self.root): + if _PAYLOAD_RE.fullmatch(entry.name) is None or entry.name in referenced: + continue + _core._require( + entry.is_file(follow_symlinks=False), + "unreferenced checkpoint payload is not a regular file", + ) + os.unlink(entry.name, dir_fd=directory_descriptor) + changed = True + finally: + os.close(directory_descriptor) + if changed: + _core._fsync_directory(self.root) + + def commit( + self, + checkpoint: Mapping[str, Any], + *, + improved: bool, + epoch: int, + development_loss: float, + ) -> Mapping[str, Any]: + payload = _core._torch_checkpoint_bytes(checkpoint) + payload_sha256 = _core.sha256_bytes(payload) + filename = self._payload_name(epoch=epoch, payload_sha256=payload_sha256) + latest_entry = self._entry( + filename, payload, epoch=epoch, development_loss=development_loss + ) + previous = self._load_index_optional() + if previous is None: + _core._require(epoch == 1 and improved, "first checkpoint must be improving epoch one") + generation = 1 + best_entry = copy.deepcopy(latest_entry) + milestones: dict[str, Any] = {} + else: + _core._require( + epoch == previous["roles"]["latest"]["epoch"] + 1, + "checkpoint epoch is not append-only", + ) + generation = previous["generation"] + 1 + best_entry = copy.deepcopy(previous["roles"]["best"]) + milestones = copy.deepcopy(previous["roles"]["milestones"]) + if improved: + best_entry = copy.deepcopy(latest_entry) + if epoch in _core.MILESTONE_EPOCHS: + milestones[str(epoch)] = copy.deepcopy(latest_entry) + + # The only new data written before commit is an immutable payload. + # Every byte named by the previous index remains untouched. + self._publish_payload(self.root / filename, payload) + self._transaction_fault_point("after_payload_before_index") + + unsigned = { + "schema": CHECKPOINT_INDEX_SCHEMA_R2, + "generation": generation, + "run_identity_sha256": self.run_identity_sha256, + "cell_id": self.cell_id, + "roles": { + "latest": latest_entry, + "best": best_entry, + "milestones": milestones, + }, + } + index = { + **unsigned, + "index_sha256": _core.canonical_sha256( + unsigned, domain=CHECKPOINT_INDEX_SCHEMA_R2 + ), + } + _core._atomic_replace_bytes(self.index_path, _core.canonical_bytes(index)) + verified = self._load_index_optional() + _core._require(verified == index, "checkpoint index publication failed") + self._transaction_fault_point("after_index_before_cleanup") + self._cleanup_unreferenced_payloads(index) + return MappingProxyType( + { + "checkpoint_sha256": latest_entry["sha256"], + "index_sha256": index["index_sha256"], + "best_checkpoint_sha256": best_entry["sha256"], + } + ) + + +def _scheduler_attempt(array_task_id: int) -> dict[str, Any]: + array_job_id = os.environ.get( + "SLURM_ARRAY_JOB_ID", os.environ.get("SLURM_JOB_ID", "local") + ) + slurm_job_id = os.environ.get("SLURM_JOB_ID", array_job_id) + task_text = os.environ.get("SLURM_ARRAY_TASK_ID", str(array_task_id)) + restart_text = os.environ.get("SLURM_RESTART_COUNT", "0") + _core._require( + task_text == str(array_task_id), + "SLURM task ID differs from CLI assignment", + ) + _core._require( + re.fullmatch(r"(?:local|[0-9]+)", array_job_id) is not None + and re.fullmatch(r"(?:local|[0-9]+)", slurm_job_id) is not None, + "SLURM job identity is unsafe", + ) + _core._require( + re.fullmatch(r"[0-9]+", restart_text) is not None, + "SLURM restart count is unsafe", + ) + return { + "array_job_id": array_job_id, + "slurm_job_id": slurm_job_id, + "array_task_id": array_task_id, + "restart_count": int(restart_text), + } + + +def _claim_output_r2( + cell_root: Path, + *, + semantic_array_id: str, + array_task_id: int, + cell_id: str, + resume_mode: str, +) -> Mapping[str, Any]: + """Hold a live one-writer lock and publish sequential resume attempts.""" + + _core._require(resume_mode in {"auto", "required", "never"}, "resume mode changed") + key = os.fspath(cell_root) + _core._require(key not in _ACTIVE_CLAIM_LOCKS, "this process already holds the cell claim") + lock_path = cell_root / "review_run_claim.lock" + descriptor = os.open( + lock_path, + os.O_RDWR + | os.O_CREAT + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0), + 0o600, + ) + try: + info = os.fstat(descriptor) + _core._require(stat.S_ISREG(info.st_mode), "run claim lock is not regular") + try: + fcntl.flock(descriptor, fcntl.LOCK_EX | fcntl.LOCK_NB) + except BlockingIOError as error: + raise _core.NativeEightTrainingError( + "another live process already owns this cell output" + ) from error + + attempt = _scheduler_attempt(array_task_id) + claim_path = cell_root / "review_run_claim.json" + if claim_path.exists() or claim_path.is_symlink(): + payload = _core.read_regular_nofollow( + claim_path, label="existing R2 run claim", maximum=4 * 1024 * 1024 + ) + try: + existing = json.loads(payload.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise _core.NativeEightTrainingError("existing R2 run claim is invalid") from error + fields = { + "schema", + "semantic_array_id", + "array_task_id", + "cell_id", + "common_seed", + "attempts", + "claim_sha256", + } + unsigned = dict(existing) + signed = unsigned.pop("claim_sha256", None) + _core._require( + type(existing) is dict + and set(existing) == fields + and _core.canonical_bytes(existing) == payload + and signed == _core.canonical_sha256(unsigned, domain=CLAIM_SCHEMA_R2) + and existing["schema"] == CLAIM_SCHEMA_R2 + and existing["semantic_array_id"] == semantic_array_id + and existing["array_task_id"] == array_task_id + and existing["cell_id"] == cell_id + and existing["common_seed"] == _core.COMMON_SEED + and type(existing["attempts"]) is list + and bool(existing["attempts"]) + and len(existing["attempts"]) < 1024 + and resume_mode in {"auto", "required"}, + "existing claim identity changed or resume is disabled", + ) + _core._require( + not (cell_root / "review_final_selection_receipt.json").exists(), + "completed cell cannot be claimed again", + ) + if resume_mode == "required": + _core._require( + ( + cell_root + / "review_checkpoints" + / _core.CheckpointManager.INDEX_NAME + ).exists(), + "resume required but no committed checkpoint index exists", + ) + attempts = copy.deepcopy(existing["attempts"]) + for ordinal, previous in enumerate(attempts, start=1): + _core._require( + type(previous) is dict + and set(previous) + == { + "attempt_ordinal", + "array_job_id", + "slurm_job_id", + "array_task_id", + "restart_count", + } + and previous["attempt_ordinal"] == ordinal + and re.fullmatch( + r"(?:local|[0-9]+)", previous["array_job_id"] + ) + is not None + and re.fullmatch( + r"(?:local|[0-9]+)", previous["slurm_job_id"] + ) + is not None + and previous["array_task_id"] == array_task_id + and type(previous["restart_count"]) is int + and previous["restart_count"] >= 0, + "claim attempt ledger changed", + ) + identity = { + field: attempt[field] + for field in ( + "array_job_id", + "slurm_job_id", + "array_task_id", + "restart_count", + ) + } + _core._require( + all( + { + field: previous[field] + for field in identity + } + != identity + for previous in attempts + ), + "the same scheduler attempt is already recorded", + ) + else: + _core._require(resume_mode != "required", "resume required but no prior run claim exists") + _core._require( + not (cell_root / "review_checkpoints" / _core.CheckpointManager.INDEX_NAME).exists() + and not (cell_root / "review_final_selection_receipt.json").exists(), + "checkpoint/final state exists without its durable claim", + ) + attempts = [] + + attempt_value = { + "attempt_ordinal": len(attempts) + 1, + **attempt, + } + attempts.append(attempt_value) + unsigned_claim = { + "schema": CLAIM_SCHEMA_R2, + "semantic_array_id": semantic_array_id, + "array_task_id": array_task_id, + "cell_id": cell_id, + "common_seed": _core.COMMON_SEED, + "attempts": attempts, + } + claim = { + **unsigned_claim, + "claim_sha256": _core.canonical_sha256( + unsigned_claim, domain=CLAIM_SCHEMA_R2 + ), + } + _core._atomic_replace_bytes(claim_path, _core.canonical_bytes(claim)) + _ACTIVE_CLAIM_LOCKS[key] = descriptor + _ACTIVE_CLAIM_CONTEXTS[key] = MappingProxyType( + { + "cell_root": cell_root, + "semantic_array_id": semantic_array_id, + "cell_id": cell_id, + "claim_sha256": claim["claim_sha256"], + "attempt": MappingProxyType(copy.deepcopy(attempt_value)), + } + ) + descriptor = -1 + return MappingProxyType(claim) + finally: + if descriptor >= 0: + try: + fcntl.flock(descriptor, fcntl.LOCK_UN) + finally: + os.close(descriptor) + + +def _active_claim_context() -> Mapping[str, Any]: + _core._require( + len(_ACTIVE_CLAIM_CONTEXTS) == 1, + "device lineage requires exactly one live cell claim", + ) + return next(iter(_ACTIVE_CLAIM_CONTEXTS.values())) + + +def _record_device_lineage(base_device_receipt: Mapping[str, Any]) -> dict[str, Any]: + context = _active_claim_context() + cell_root = context["cell_root"] + attempt = dict(context["attempt"]) + path = cell_root / "review_device_lineage.json" + if path.exists() or path.is_symlink(): + payload = _core.read_regular_nofollow( + path, label="existing device lineage", maximum=8 * 1024 * 1024 + ) + try: + existing = json.loads(payload.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise _core.NativeEightTrainingError("device lineage is invalid") from error + unsigned = dict(existing) + signed = unsigned.pop("receipt_sha256", None) + _core._require( + type(existing) is dict + and set(existing) + == { + "schema", + "semantic_array_id", + "cell_id", + "common_seed", + "attempt_devices", + "receipt_sha256", + } + and _core.canonical_bytes(existing) == payload + and signed + == _core.canonical_sha256(unsigned, domain=DEVICE_LINEAGE_SCHEMA_R2) + and existing["schema"] == DEVICE_LINEAGE_SCHEMA_R2 + and existing["semantic_array_id"] == context["semantic_array_id"] + and existing["cell_id"] == context["cell_id"] + and existing["common_seed"] == _core.COMMON_SEED + and type(existing["attempt_devices"]) is list, + "device lineage identity changed", + ) + devices = copy.deepcopy(existing["attempt_devices"]) + else: + devices = [] + claim_payload = _core.read_regular_nofollow( + cell_root / "review_run_claim.json", + label="device-lineage run claim", + maximum=4 * 1024 * 1024, + ) + try: + claim = json.loads(claim_payload.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise _core.NativeEightTrainingError("device-lineage run claim is invalid") from error + unsigned_claim = dict(claim) + signed_claim = unsigned_claim.pop("claim_sha256", None) + _core._require( + _core.canonical_bytes(claim) == claim_payload + and signed_claim == context["claim_sha256"] + and signed_claim + == _core.canonical_sha256(unsigned_claim, domain=CLAIM_SCHEMA_R2) + and type(claim.get("attempts")) is list + and claim["attempts"][-1] == attempt + and len(devices) < attempt["attempt_ordinal"], + "device lineage/claim attempt binding changed", + ) + for index, observed in enumerate(devices): + _core._require( + type(observed) is dict + and set(observed) + == { + "attempt_ordinal", + "array_job_id", + "slurm_job_id", + "array_task_id", + "restart_count", + "device_receipt", + } + and { + field: observed[field] + for field in claim["attempts"][index] + } + == claim["attempts"][index], + "existing device lineage attempt differs from the claim ledger", + ) + # A process can die after acquiring its claim but before CUDA discovery. + # Preserve those attempts explicitly instead of making later resume fail. + for missing in claim["attempts"][len(devices) : -1]: + devices.append({**copy.deepcopy(missing), "device_receipt": None}) + device_value = { + **attempt, + "device_receipt": copy.deepcopy(dict(base_device_receipt)), + } + devices.append(device_value) + unsigned_lineage = { + "schema": DEVICE_LINEAGE_SCHEMA_R2, + "semantic_array_id": context["semantic_array_id"], + "cell_id": context["cell_id"], + "common_seed": _core.COMMON_SEED, + "attempt_devices": devices, + } + lineage = { + **unsigned_lineage, + "receipt_sha256": _core.canonical_sha256( + unsigned_lineage, domain=DEVICE_LINEAGE_SCHEMA_R2 + ), + } + _core._atomic_replace_bytes(path, _core.canonical_bytes(lineage)) + current_unsigned = { + **copy.deepcopy(dict(base_device_receipt)), + "attempt_ordinal": attempt["attempt_ordinal"], + "device_lineage_path": os.fspath(path), + "device_lineage_receipt_sha256": lineage["receipt_sha256"], + } + current_unsigned.pop("receipt_sha256", None) + return { + **current_unsigned, + "receipt_sha256": _core.canonical_sha256( + current_unsigned, domain="bertose-review-a5-device-r2" + ), + } + + +_inherited_device_receipt = _core._device_receipt + + +def _device_receipt_r2(device: torch.device) -> dict[str, Any]: + return _record_device_lineage(_inherited_device_receipt(device)) + + +def _release_claim_locks_for_tests() -> None: + """Focused-test cleanup; production retains locks until process exit.""" + + for descriptor in _ACTIVE_CLAIM_LOCKS.values(): + try: + fcntl.flock(descriptor, fcntl.LOCK_UN) + finally: + os.close(descriptor) + _ACTIVE_CLAIM_LOCKS.clear() + _ACTIVE_CLAIM_CONTEXTS.clear() + + +_core.StaticBundle.load = classmethod(_load_static_bundle_r2) +_core.CheckpointManager = TransactionalCheckpointManagerR2 +_core._claim_output = _claim_output_r2 +_core._device_receipt = _device_receipt_r2 + +_inherited_run_training = _core.run_training + + +def _run_training_r2( + launch_config_path: Path, + *, + array_task_id: int, + resume_mode: str, +) -> Mapping[str, Any]: + global _VALIDATED_EXTERNAL_RELEASE + path = _core._canonical_absolute(launch_config_path, "launch config") + payload = _core.read_regular_nofollow( + path, label="R2 launch config execution readback", maximum=4 * 1024 * 1024 + ) + _core._require( + _EXTERNAL_LAUNCH_CONFIG_FILE_SHA256 is not None + and _core.sha256_bytes(payload) == _EXTERNAL_LAUNCH_CONFIG_FILE_SHA256, + "training cannot bypass the externally pinned launch-config entry point", + ) + config = _core.LaunchConfig.load(path) + _VALIDATED_EXTERNAL_RELEASE = _validate_external_release_r2( + config, launch_config_path=path + ) + return _inherited_run_training( + path, + array_task_id=array_task_id, + resume_mode=resume_mode, + ) + + +_core.run_training = _run_training_r2 + + +_inherited_describe_contract = _core.describe_contract + + +def describe_contract() -> Mapping[str, Any]: + value = dict(_inherited_describe_contract()) + value.update( + { + "schema": SCHEMA_R2, + "static_postfit_contract": { + "writer_schema": POSTFIT_WRITER_SCHEMA, + "token_key_count": 10, + "null_schema": POSTFIT_NULL_SCHEMA, + "publication_schema": POSTFIT_PUBLICATION_SCHEMA, + "lineage_bound": True, + }, + "checkpoint_transaction": ( + "immutable_content_addressed_payload_then_atomic_index_then_cleanup" + ), + "isolated_cli_source_pin_required": True, + "external_launch_config_sha256_required": True, + "cross_job_resume_claim": ( + "exclusive_live_flock_plus_append_only_scheduler_attempt_ledger" + ), + "requeue_device_lineage_required": True, + "training_authorized": False, + "nova_submission_authorized": False, + } + ) + return MappingProxyType(value) + + +_core.describe_contract = describe_contract + + +def main(argv: list[str] | tuple[str, ...] | None = None) -> int: + """Require an external SHA-256 pin before the launch config is trusted.""" + + global _EXTERNAL_LAUNCH_CONFIG_FILE_SHA256 + arguments = list(sys.argv[1:] if argv is None else argv) + if "--describe" in arguments: + _core._require( + arguments == ["--describe"], + "--describe cannot be combined with launch arguments", + ) + return _core.main(arguments) + _core._require( + arguments.count("--launch-config-sha256") == 1, + "exactly one external --launch-config-sha256 is required", + ) + pin_index = arguments.index("--launch-config-sha256") + _core._require( + pin_index + 1 < len(arguments), + "--launch-config-sha256 lacks its value", + ) + expected_sha256 = _core._exact_sha( + arguments[pin_index + 1], "external launch config pin" + ) + del arguments[pin_index : pin_index + 2] + _core._require( + arguments.count("--launch-config") == 1, + "exactly one --launch-config path is required", + ) + config_index = arguments.index("--launch-config") + _core._require(config_index + 1 < len(arguments), "--launch-config lacks its path") + config_path = _core._canonical_absolute( + Path(arguments[config_index + 1]), "launch config" + ) + config_bytes = _core.read_regular_nofollow( + config_path, label="externally pinned launch config", maximum=4 * 1024 * 1024 + ) + _core._require( + _core.sha256_bytes(config_bytes) == expected_sha256, + "launch config differs from its external command-line pin", + ) + _EXTERNAL_LAUNCH_CONFIG_FILE_SHA256 = expected_sha256 + return _core.main(arguments) + +# Export the inherited public API for focused fixtures without copying the R1 +# scientific implementation. R2 replacements win for the two changed types. +for _name in getattr(_core, "__all__", ()): + if _name not in globals(): + globals()[_name] = getattr(_core, _name) +StaticBundle = _core.StaticBundle +CheckpointManager = TransactionalCheckpointManagerR2 +LaunchConfig = _core.LaunchConfig +NativeEightTrainingError = _core.NativeEightTrainingError +canonical_bytes = _core.canonical_bytes +sha256_bytes = _core.sha256_bytes + + +def __getattr__(name: str) -> Any: + return getattr(_core, name) + + +__all__ = sorted( + set(getattr(_core, "__all__", ())) + | { + "CheckpointManager", + "TransactionalCheckpointManagerR2", + "describe_contract", + "main", + } +) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/run_review_a5_native_eight_training_r2.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/run_review_a5_native_eight_training_r2.py new file mode 100644 index 0000000000000000000000000000000000000000..5d64d263fa5025ad818406bc7d80228a23a47588 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/run_review_a5_native_eight_training_r2.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +"""Hash-pinned isolated CLI for the native-eight R2 runtime.""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import stat +import sys +from types import ModuleType + + +RUNNER_SHA256 = "7e93b13b3212b3c97e30144f3e393a86a13411d5e82fe19bd55d43bc58587e30" +WRAPPER_PATH = Path(__file__).absolute() +RUNNER_PATH = WRAPPER_PATH.parent / "review_a5_native_eight_training_runner_r2.py" +WRITING_ROOT = WRAPPER_PATH.parents[4] + + +def _read_runner() -> bytes: + if ( + not RUNNER_PATH.is_absolute() + or os.path.normpath(os.fspath(RUNNER_PATH)) != os.fspath(RUNNER_PATH) + or not hasattr(os, "O_NOFOLLOW") + or not hasattr(os, "O_DIRECTORY") + ): + raise RuntimeError("R2 runner path is not canonical/no-follow capable") + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in RUNNER_PATH.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(RUNNER_PATH.parts[-1], leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + if not stat.S_ISREG(before.st_mode) or before.st_size > 16 * 1024 * 1024: + raise RuntimeError("R2 runner is not a bounded regular file") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("R2 runner truncated during read") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + ): + raise RuntimeError("R2 runner changed during read") + payload = b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + if hashlib.sha256(payload).hexdigest() != RUNNER_SHA256: + raise RuntimeError("R2 runner differs from the isolated wrapper pin") + return payload + + +def _load_runner() -> ModuleType: + payload = _read_runner() + writing = os.fspath(WRITING_ROOT) + if writing not in sys.path: + # ``-I`` intentionally removes the script/current directory. Add only + # the canonical writing root needed by the pinned runtime's declared + # ``review.*`` package imports. + sys.path.insert(0, writing) + name = "_review_a5_native_eight_training_runner_r2_pinned_cli" + module = ModuleType(name) + module.__file__ = os.fspath(RUNNER_PATH) + module.__package__ = "" + sys.modules[name] = module + try: + code = compile(payload, os.fspath(RUNNER_PATH), "exec", dont_inherit=True) + exec(code, module.__dict__) + except BaseException: + sys.modules.pop(name, None) + raise + if not callable(getattr(module, "main", None)): + raise RuntimeError("R2 runner does not expose its pinned CLI") + return module + + +if __name__ == "__main__": + raise SystemExit(_load_runner().main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/review_a5_native_eight_training_runner_r3.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/review_a5_native_eight_training_runner_r3.py new file mode 100644 index 0000000000000000000000000000000000000000..5afd07bc363945e92ec11578be5590597dc08d3a --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/review_a5_native_eight_training_runner_r3.py @@ -0,0 +1,719 @@ +"""R3 preparation successor for the corrected native-eight trainer. + +R3 loads the exact no-overwrite R2 source and tightens only release evidence +and wording boundaries. It does not submit a scheduler job and remains +fail-closed until the final static R4, launch config, and external release are +separately frozen. +""" + +from __future__ import annotations + +import copy +from datetime import datetime, timezone +import hashlib +import os +from pathlib import Path +import re +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + + +R2_SOURCE_SHA256 = "7e93b13b3212b3c97e30144f3e393a86a13411d5e82fe19bd55d43bc58587e30" +R2_SOURCE = ( + Path(__file__).absolute().parent.parent + / "a5_native_eight_training_20260722_r2" + / "review_a5_native_eight_training_runner_r2.py" +) + +SCHEMA_R3 = "bertose_review_a5_native_eight_training_runner_20260722_r3" +LAUNCH_CONFIG_SCHEMA_R3 = ( + "bertose_review_a5_native_eight_training_launch_config_20260722_r3" +) +STATIC_BINDING_SCHEMA_R3 = ( + "bertose_review_a5_native_eight_static_runtime_binding_20260722_r3" +) +CHECKPOINT_SCHEMA_R3 = ( + "bertose_review_a5_native_eight_completed_epoch_checkpoint_20260722_r3" +) +CHECKPOINT_INDEX_SCHEMA_R3 = ( + "bertose_review_a5_native_eight_checkpoint_index_20260722_r3" +) +FINAL_RECEIPT_SCHEMA_R3 = ( + "bertose_review_a5_native_eight_final_selection_receipt_20260722_r3" +) +CLAIM_SCHEMA_R3 = "bertose_review_a5_native_eight_duplicate_claim_20260722_r3" +DEVICE_LINEAGE_SCHEMA_R3 = ( + "bertose_review_a5_native_eight_device_lineage_20260722_r3" +) +EXTERNAL_RELEASE_SCHEMA_R3 = ( + "bertose_a5_native_eight_external_release_20260722_r3" +) +DUPLICATE_PREFLIGHT_SCHEMA_R3 = ( + "bertose_a5_native_eight_live_duplicate_preflight_20260722_r3" +) +SCHEDULER_SCAN_SCHEMA_R3 = ( + "bertose_a5_native_eight_scheduler_duplicate_scan_20260722_r3" +) +OUTPUT_SCAN_SCHEMA_R3 = ( + "bertose_a5_native_eight_output_duplicate_scan_20260722_r3" +) +PREFLIGHT_FRESHNESS_SECONDS = 300 +PRODUCTION_ADAPTER_R3_CONTRACT_SHA256 = ( + "a3b681f307bad96abb8e446eb8efd769f29ccb65728d424295c89c9ba065224f" +) +PRODUCTION_A110_EPOCH0_STEP0_IDENTITY_SHA256 = ( + "bb8bfc933cf3d5f1ff8519e0c2f07d364baa066c537ff00c4314d9a9aa350862" +) + + +def _read_regular_nofollow(path: Path, *, maximum: int) -> bytes: + absolute = Path(path) + if ( + not absolute.is_absolute() + or os.path.normpath(os.fspath(absolute)) != os.fspath(absolute) + or not hasattr(os, "O_NOFOLLOW") + or not hasattr(os, "O_DIRECTORY") + ): + raise RuntimeError("R3 predecessor path is not canonical/no-follow capable") + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in absolute.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(absolute.parts[-1], leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + if not stat.S_ISREG(before.st_mode) or before.st_size > maximum: + raise RuntimeError("R3 predecessor is not a bounded regular file") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("R3 predecessor truncated during read") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + ): + raise RuntimeError("R3 predecessor changed during read") + return b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + + +def _load_r2() -> ModuleType: + payload = _read_regular_nofollow(R2_SOURCE, maximum=16 * 1024 * 1024) + if hashlib.sha256(payload).hexdigest() != R2_SOURCE_SHA256: + raise RuntimeError("R2 native-eight source bytes differ from the R3 pin") + name = "_review_a5_native_eight_training_r2_pinned_for_r3" + module = ModuleType(name) + module.__file__ = os.fspath(R2_SOURCE) + module.__package__ = "" + sys.modules[name] = module + try: + exec( + compile(payload, os.fspath(R2_SOURCE), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +_r2 = _load_r2() +_core = _r2._core + +RUNNER_SOURCE_PATH = Path(__file__).absolute() +WRAPPER_SOURCE_PATH = RUNNER_SOURCE_PATH.parent / "run_review_a5_native_eight_training_r3.py" +SBATCH_SOURCE_PATH = ( + _core.WRITING_ROOT + / "review/multimodal/slurm" + / "review_a5_native_eight_seed43_scavenger_20260722_r3.sbatch" +) + +# Process-local R3 identities. R2 and R1 bytes on disk remain untouched. +for _name, _value in { + "SCHEMA_R2": SCHEMA_R3, + "LAUNCH_CONFIG_SCHEMA_R2": LAUNCH_CONFIG_SCHEMA_R3, + "STATIC_BINDING_SCHEMA_R2": STATIC_BINDING_SCHEMA_R3, + "CHECKPOINT_SCHEMA_R2": CHECKPOINT_SCHEMA_R3, + "CHECKPOINT_INDEX_SCHEMA_R2": CHECKPOINT_INDEX_SCHEMA_R3, + "FINAL_RECEIPT_SCHEMA_R2": FINAL_RECEIPT_SCHEMA_R3, + "CLAIM_SCHEMA_R2": CLAIM_SCHEMA_R3, + "DEVICE_LINEAGE_SCHEMA_R2": DEVICE_LINEAGE_SCHEMA_R3, + "EXTERNAL_RELEASE_SCHEMA_R2": EXTERNAL_RELEASE_SCHEMA_R3, + "DUPLICATE_PREFLIGHT_SCHEMA_R2": DUPLICATE_PREFLIGHT_SCHEMA_R3, + "RUNNER_SOURCE_PATH": RUNNER_SOURCE_PATH, + "WRAPPER_SOURCE_PATH": WRAPPER_SOURCE_PATH, + "SBATCH_SOURCE_PATH": SBATCH_SOURCE_PATH, +}.items(): + setattr(_r2, _name, _value) + +for _name, _value in { + "SCHEMA": SCHEMA_R3, + "LAUNCH_CONFIG_SCHEMA": LAUNCH_CONFIG_SCHEMA_R3, + "STATIC_BINDING_SCHEMA": STATIC_BINDING_SCHEMA_R3, + "CHECKPOINT_SCHEMA": CHECKPOINT_SCHEMA_R3, + "CHECKPOINT_INDEX_SCHEMA": CHECKPOINT_INDEX_SCHEMA_R3, + "FINAL_RECEIPT_SCHEMA": FINAL_RECEIPT_SCHEMA_R3, + "CLAIM_SCHEMA": CLAIM_SCHEMA_R3, +}.items(): + setattr(_core, _name, _value) +_core.__file__ = os.fspath(RUNNER_SOURCE_PATH) +_core.RUNTIME_ROOT = RUNNER_SOURCE_PATH.parent + + +SEQUENCE_SURFACE_SUCCESSOR_RULE_R3 = ( + "branch-open token 5 with residue -1 retains its exact 0..69 or unknown-202 " + "tree depth; start/end/linkage/padding negative-residue positions remain depth zero" +) + + +def _install_sequence_surface_successor_r3(r8: ModuleType) -> None: + """Repair the R4 validator/producer mismatch without editing R4/R5 bytes.""" + + r5 = r8._core._r6._r5 + r4 = r5._composite._r4 + current = r4.validate_sequence_surface + if getattr(current, "_review_native8_r3_sequence_successor", False): + return + _core._require( + r4.SEQUENCE_BRANCH_MARKER_ID == 5 + and r4.SEQUENCE_SPECIAL_IDS == frozenset(range(10)), + "sequence special/branch identity changed before R3 repair", + ) + + def validate_sequence_surface_r3( + config: Any, + *, + token_ids: Any, + attention_mask: Any, + residue_ids: Any, + branch_depths: Any, + linkage_types: Any, + labels: Any, + ) -> Any: + marker = ( + attention_mask.bool() + & token_ids.eq(r4.SEQUENCE_BRANCH_MARKER_ID) + & residue_ids.eq(-1) + ) + invalid_negative = ( + attention_mask.bool() + & residue_ids.lt(0) + & branch_depths.ne(0) + & ~marker + ) + marker_depths = branch_depths[marker] + _core._require( + not invalid_negative.any() + and ( + marker_depths.numel() == 0 + or ( + marker_depths.ge(0).all() + and ( + marker_depths.le(69) | marker_depths.eq(202) + ).all() + ) + ), + "R3 sequence tree depth is not confined to exact branch-open markers", + ) + # Exercise every predecessor check after zeroing only the field that + # the predecessor incorrectly rejected. The actual model embedding + # still receives the untouched branch_depths tensor. + predecessor_depths = branch_depths.clone() + predecessor_depths[marker] = 0 + return current( + config, + token_ids=token_ids, + attention_mask=attention_mask, + residue_ids=residue_ids, + branch_depths=predecessor_depths, + linkage_types=linkage_types, + labels=labels, + ) + + validate_sequence_surface_r3._review_native8_r3_sequence_successor = True + validate_sequence_surface_r3._review_native8_r3_rule = ( + SEQUENCE_SURFACE_SUCCESSOR_RULE_R3 + ) + r4.validate_sequence_surface = validate_sequence_surface_r3 + + +_inherited_load_r8 = _core._load_r8 + + +def _load_r8_r3() -> ModuleType: + r8 = _inherited_load_r8() + _install_sequence_surface_successor_r3(r8) + return r8 + + +_core._load_r8 = _load_r8_r3 + + +def _parse_utc(value: object, *, label: str) -> datetime: + _core._require( + type(value) is str + and re.fullmatch( + r"20[0-9]{2}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z", + value, + ) + is not None, + f"{label} is not canonical UTC", + ) + try: + parsed = datetime.strptime(value, "%Y-%m-%dT%H:%M:%SZ").replace( + tzinfo=timezone.utc + ) + except ValueError as error: + raise _core.NativeEightTrainingError(f"{label} is invalid") from error + return parsed + + +def _load_bound_receipt(value: object, *, label: str) -> tuple[dict[str, Any], bytes]: + _core._require( + type(value) is dict + and set(value) == {"absolute_path", "sha256", "bytes"}, + f"{label} binding fields changed", + ) + path = _core._canonical_absolute(Path(value["absolute_path"]), f"{label} path") + _core._require(path.name.startswith("review_"), f"{label} is not review-prefixed") + payload = _core.read_regular_nofollow( + path, label=label, maximum=16 * 1024 * 1024 + ) + _core._require( + _core.sha256_bytes(payload) == value["sha256"] + and len(payload) == value["bytes"], + f"{label} bytes differ from binding", + ) + observed = _core.load_canonical_json(path, value["sha256"], label=label) + return observed, payload + + +def _validate_signed_receipt( + value: Mapping[str, Any], *, schema: str, label: str +) -> str: + unsigned = dict(value) + signed = unsigned.pop("receipt_sha256", None) + _core._require( + signed == _core.canonical_sha256(unsigned, domain=schema), + f"{label} signature changed", + ) + return str(signed) + + +def _validate_scheduler_scan( + value: Mapping[str, Any], + *, + semantic_array_id: str, + stable_job_name: str, + observed_at_utc: str, +) -> None: + fields = { + "schema", + "status", + "semantic_array_id", + "stable_job_name", + "captured_at_utc", + "command_argv", + "return_code", + "stdout", + "stderr", + "active_array_match_count", + "receipt_sha256", + } + _core._require(type(value) is dict and set(value) == fields, "scheduler scan fields changed") + _core._require( + value["schema"] == SCHEDULER_SCAN_SCHEMA_R3 + and value["status"] == "PASS_NO_ACTIVE_NATIVE_EIGHT_ARRAY" + and value["semantic_array_id"] == semantic_array_id + and value["stable_job_name"] == stable_job_name + and value["captured_at_utc"] == observed_at_utc + and value["command_argv"] + == ["/usr/bin/squeue", "-h", "-r", "-o", "%A|%a|%j|%T|%r"] + and value["return_code"] == 0 + and type(value["stdout"]) is str + and value["stderr"] == "", + "scheduler duplicate scan command/result changed", + ) + matching_arrays: set[str] = set() + for line in value["stdout"].splitlines(): + columns = line.split("|") + _core._require(len(columns) == 5, "scheduler duplicate scan row is malformed") + array_job, task, job_name, state, reason = columns + _core._require(array_job.isdigit(), "scheduler scan array job is malformed") + _core._require( + task.isdigit() or task in {"", "N/A"}, + "scheduler scan task is malformed", + ) + _core._require(bool(state) and bool(reason), "scheduler scan state/reason is empty") + if job_name == stable_job_name: + matching_arrays.add(array_job) + _core._require( + len(matching_arrays) == value["active_array_match_count"] == 0, + "scheduler scan contains an active native-eight array", + ) + _validate_signed_receipt(value, schema=SCHEDULER_SCAN_SCHEMA_R3, label="scheduler scan") + + +def _validate_output_scan( + value: Mapping[str, Any], + *, + config: Any, + observed_at_utc: str, +) -> None: + fields = { + "schema", + "status", + "semantic_array_id", + "captured_at_utc", + "output_root", + "cell_output_roots", + "existing_output_root_count", + "existing_paths", + "receipt_sha256", + } + _core._require(type(value) is dict and set(value) == fields, "output scan fields changed") + expected_roots = { + cell: os.fspath( + config.output_root + / f"review_native8_{config.semantic_array_id.replace(':', '_')}_{cell}_seed43" + ) + for cell in _core.CELL_ORDER + } + _core._require( + value["schema"] == OUTPUT_SCAN_SCHEMA_R3 + and value["status"] == "PASS_NO_NATIVE_EIGHT_OUTPUT_ROOTS" + and value["semantic_array_id"] == config.semantic_array_id + and value["captured_at_utc"] == observed_at_utc + and value["output_root"] == os.fspath(config.output_root) + and value["cell_output_roots"] == expected_roots + and value["existing_output_root_count"] == 0 + and value["existing_paths"] == [], + "output duplicate scan changed or found an existing cell root", + ) + _validate_signed_receipt(value, schema=OUTPUT_SCAN_SCHEMA_R3, label="output scan") + + +_DUPLICATE_CONTEXT_CONFIG: Any | None = None + + +def _validate_duplicate_preflight_r3( + value: object, *, semantic_array_id: str +) -> Mapping[str, Any]: + config = _DUPLICATE_CONTEXT_CONFIG + _core._require(config is not None, "R3 duplicate preflight lacks launch-config context") + fields = { + "schema", + "status", + "semantic_array_id", + "cell_order", + "array_spec", + "stable_job_name", + "active_job_match_count", + "existing_output_root_count", + "scheduler_scan_receipt", + "output_scan_receipt", + "one_copy_only", + "observed_at_utc", + "validated_at_utc", + "freshness_seconds", + "valid_for_immediate_single_submission_only", + "receipt_sha256", + } + _core._require(type(value) is dict and set(value) == fields, "R3 duplicate preflight fields changed") + observed = _parse_utc(value["observed_at_utc"], label="duplicate observation time") + validated = _parse_utc(value["validated_at_utc"], label="duplicate validation time") + _core._require( + value["schema"] == DUPLICATE_PREFLIGHT_SCHEMA_R3 + and value["status"] == "PASS_NO_ACTIVE_OR_EXISTING_NATIVE_EIGHT_COPY" + and value["semantic_array_id"] == semantic_array_id + and value["cell_order"] == list(_core.CELL_ORDER) + and value["array_spec"] == "0-7" + and value["stable_job_name"] == "a5-native8-s43-r3" + and value["active_job_match_count"] == 0 + and value["existing_output_root_count"] == 0 + and value["one_copy_only"] is True + and value["freshness_seconds"] == PREFLIGHT_FRESHNESS_SECONDS + and observed <= validated + and (validated - observed).total_seconds() <= PREFLIGHT_FRESHNESS_SECONDS + and value["valid_for_immediate_single_submission_only"] is True, + "R3 duplicate preflight changed or is internally stale", + ) + scheduler, _ = _load_bound_receipt( + value["scheduler_scan_receipt"], label="R3 scheduler duplicate scan" + ) + output, _ = _load_bound_receipt( + value["output_scan_receipt"], label="R3 output duplicate scan" + ) + _validate_scheduler_scan( + scheduler, + semantic_array_id=semantic_array_id, + stable_job_name=value["stable_job_name"], + observed_at_utc=value["observed_at_utc"], + ) + _validate_output_scan(output, config=config, observed_at_utc=value["observed_at_utc"]) + _validate_signed_receipt( + value, schema=DUPLICATE_PREFLIGHT_SCHEMA_R3, label="R3 duplicate preflight" + ) + return MappingProxyType(copy.deepcopy(value)) + + +def validate_pre_submit_freshness_r3( + value: Mapping[str, Any], *, now_utc: str +) -> None: + """Live controller check; jobs do not reapply this after queue waiting.""" + + observed = _parse_utc(value.get("observed_at_utc"), label="pre-submit observation time") + validated = _parse_utc(value.get("validated_at_utc"), label="pre-submit validation time") + now = _parse_utc(now_utc, label="pre-submit current time") + _core._require( + observed <= validated <= now + and (now - observed).total_seconds() <= PREFLIGHT_FRESHNESS_SECONDS, + "duplicate preflight is stale at submission time", + ) + + +def _parse_sbatch_directives_r3(payload: bytes) -> Mapping[str, str | None]: + try: + source = payload.decode("ascii") + except UnicodeDecodeError as error: + raise _core.NativeEightTrainingError("R3 sbatch is not ASCII") from error + _core._require(source.startswith("#!/bin/bash\n"), "R3 sbatch shebang changed") + directives: dict[str, str | None] = {} + for line in source.splitlines(): + if not line.startswith("#SBATCH "): + continue + token = line[len("#SBATCH ") :] + _core._require( + token.startswith("--") and " " not in token and "\t" not in token, + "R3 sbatch directive spelling changed", + ) + if "=" in token: + key, argument = token.split("=", 1) + _core._require(bool(argument), "R3 sbatch directive argument is empty") + else: + key, argument = token, None + _core._require(key not in directives, "R3 sbatch directive is duplicated") + directives[key] = argument + expected = { + "--job-name": "a5-native8-s43-r3", + "--partition": "scavenger", + "--account": "ratul-scavenger", + "--qos": "scavenger", + "--nodes": "1", + "--ntasks": "1", + "--cpus-per-task": "4", + "--gres": "gpu:1", + "--mem": "128G", + "--time": "2-00:00:00", + "--array": "0-7", + "--requeue": None, + "--open-mode": "append", + "--export": "NONE", + "--chdir": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training", + "--output": "writing/review/multimodal/outputs/review_a5_native8_r3_%A_%a.out", + "--error": "writing/review/multimodal/outputs/review_a5_native8_r3_%A_%a.err", + } + _core._require(directives == expected, "R3 sbatch directive set changed") + lowered = source.lower() + _core._require( + "0-7%" not in lowered + and "--constraint" not in directives + and "--nodelist" not in directives + and all(name not in lowered for name in ("gpu:a100", "gpu:v100", "gpu:h100")), + "R3 sbatch contains a throttle, device model, or placement constraint", + ) + executable = [ + line.strip() + for line in source.splitlines() + if line.strip() and not line.lstrip().startswith("#") + ] + _core._require( + not any( + re.search(r"(^|[;&|()\s])sbatch(?:\s|$)", line) for line in executable + ), + "R3 sbatch contains a nested submission", + ) + required_fragments = ( + "set -euo pipefail", + 'exec "${PYTHON}" -I -W error "${RUNNER}"', + '--launch-config-sha256 "${LAUNCH_CONFIG_SHA256}"', + '--array-task-id "${SLURM_ARRAY_TASK_ID}"', + "--resume auto", + ) + _core._require( + all(fragment in source for fragment in required_fragments), + "R3 sbatch execution/config/resume command changed", + ) + _core._require( + len( + re.findall( + r"(?m)^LAUNCH_CONFIG_SHA256=(?:[0-9a-f]{64}|FINAL_RELEASE_MUST_PIN_LAUNCH_CONFIG_SHA256)$", + source, + ) + ) + == 1, + "R3 sbatch launch-config pin assignment changed", + ) + return MappingProxyType(directives) + + +_inherited_validate_external_release = _r2._validate_external_release_r2 +_r2._validate_duplicate_preflight = _validate_duplicate_preflight_r3 + + +def _validate_external_release_r3( + config: Any, *, launch_config_path: Path +) -> Mapping[str, Any]: + global _DUPLICATE_CONTEXT_CONFIG + _core._require(_DUPLICATE_CONTEXT_CONFIG is None, "R3 release validation re-entered") + _DUPLICATE_CONTEXT_CONFIG = config + try: + release = _inherited_validate_external_release( + config, launch_config_path=launch_config_path + ) + finally: + _DUPLICATE_CONTEXT_CONFIG = None + sbatch_bytes = _core.read_regular_nofollow( + _r2.SBATCH_SOURCE_PATH, + label="R3 sbatch directive validation", + maximum=4 * 1024 * 1024, + ) + directives = _parse_sbatch_directives_r3(sbatch_bytes) + _core._require( + release["scheduler"] + == { + "partition": directives["--partition"], + "account": directives["--account"], + "qos": directives["--qos"], + "gres": directives["--gres"], + "array": directives["--array"], + "concurrency_throttle": None, + "constraint": None, + "open_mode": directives["--open-mode"], + "requeue": directives["--requeue"] is None, + }, + "R3 release scheduler differs from parsed sbatch directives", + ) + return release + + +def validate_pre_submit_release_r3( + config: Any, *, launch_config_path: Path, now_utc: str +) -> Mapping[str, Any]: + """Final-controller entry point immediately before the one sbatch call.""" + + release = _validate_external_release_r3( + config, launch_config_path=launch_config_path + ) + validate_pre_submit_freshness_r3( + release["live_duplicate_preflight"], now_utc=now_utc + ) + return release + + +_r2._validate_external_release_r2 = _validate_external_release_r3 + + +_inherited_describe_contract = _r2.describe_contract + + +def describe_contract() -> Mapping[str, Any]: + value = dict(_inherited_describe_contract()) + value.update( + { + "schema": SCHEMA_R3, + "resume": ( + "exact completed-epoch model, AdamW, RNG, and adapter-cursor state; " + "unfinished epoch is recomputed under the same pinned runtime" + ), + "device_lineage_disclosed_across_attempts": True, + "generic_gpu_cross_job_resume_supported": True, + "bitwise_cross_architecture_equivalence_claimed": False, + "pre_submit_duplicate_receipts_dereferenced": True, + "pre_submit_freshness_seconds": PREFLIGHT_FRESHNESS_SECONDS, + "job_side_freshness_rechecked_after_queue_wait": False, + "pre_submit_external_release_validator_required": True, + "sequence_surface_successor_rule": SEQUENCE_SURFACE_SUCCESSOR_RULE_R3, + "production_adapter_r3_contract_sha256": ( + PRODUCTION_ADAPTER_R3_CONTRACT_SHA256 + ), + "production_a110_epoch0_step0_identity_sha256": ( + PRODUCTION_A110_EPOCH0_STEP0_IDENTITY_SHA256 + ), + "training_authorized": False, + "nova_submission_authorized": False, + } + ) + return MappingProxyType(value) + + +_r2.describe_contract = describe_contract +_core.describe_contract = describe_contract + + +def main(argv: list[str] | tuple[str, ...] | None = None) -> int: + return _r2.main(argv) + + +# R3 aliases retain the tested R2 implementations while all schema globals are +# process-locally rebound above. +TransactionalCheckpointManagerR3 = _r2.TransactionalCheckpointManagerR2 +CheckpointManager = TransactionalCheckpointManagerR3 +StaticBundle = _r2.StaticBundle +LaunchConfig = _r2.LaunchConfig +NativeEightTrainingError = _r2.NativeEightTrainingError +canonical_bytes = _r2.canonical_bytes +sha256_bytes = _r2.sha256_bytes +CELL_ORDER = _core.CELL_ORDER +CELL_BITS = _core.CELL_BITS +OBJECTIVES = _core.OBJECTIVES +LOSS_DENOMINATOR = _core.LOSS_DENOMINATOR +POSTFIT_WRITER_SOURCE_SHA256 = _r2.POSTFIT_WRITER_SOURCE_SHA256 +POSTFIT_ACTIVE_COUNTS = _r2.POSTFIT_ACTIVE_COUNTS +POSTFIT_AUTHORITY_ROLE_COUNTS = _r2.POSTFIT_AUTHORITY_ROLE_COUNTS +EXTERNAL_RELEASE_STATUS_R3 = _r2.EXTERNAL_RELEASE_STATUS_R2 + + +def __getattr__(name: str) -> Any: + return getattr(_r2, name) + + +__all__ = sorted( + set(getattr(_r2, "__all__", ())) + | { + "CheckpointManager", + "TransactionalCheckpointManagerR3", + "describe_contract", + "main", + "validate_pre_submit_freshness_r3", + "validate_pre_submit_release_r3", + } +) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/run_review_a5_native_eight_training_r3.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/run_review_a5_native_eight_training_r3.py new file mode 100644 index 0000000000000000000000000000000000000000..8b8865f482be7230b067258d97d9f8b0d11fb700 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/run_review_a5_native_eight_training_r3.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +"""Hash-pinned isolated CLI for the native-eight R3 preparation runtime.""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import stat +import sys +from types import ModuleType + + +RUNNER_SHA256 = "550588ca033718273de2e35825b8b9faffe4a5fb747ff8775fe17bb31050d9be" +WRAPPER_PATH = Path(__file__).absolute() +RUNNER_PATH = WRAPPER_PATH.parent / "review_a5_native_eight_training_runner_r3.py" +WRITING_ROOT = WRAPPER_PATH.parents[4] + + +def _read_runner() -> bytes: + if ( + not RUNNER_PATH.is_absolute() + or os.path.normpath(os.fspath(RUNNER_PATH)) != os.fspath(RUNNER_PATH) + or not hasattr(os, "O_NOFOLLOW") + or not hasattr(os, "O_DIRECTORY") + ): + raise RuntimeError("R3 runner path is not canonical/no-follow capable") + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in RUNNER_PATH.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(RUNNER_PATH.parts[-1], leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + if not stat.S_ISREG(before.st_mode) or before.st_size > 16 * 1024 * 1024: + raise RuntimeError("R3 runner is not a bounded regular file") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("R3 runner truncated during read") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + ): + raise RuntimeError("R3 runner changed during read") + payload = b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + if hashlib.sha256(payload).hexdigest() != RUNNER_SHA256: + raise RuntimeError("R3 runner differs from the isolated wrapper pin") + return payload + + +def _load_runner() -> ModuleType: + payload = _read_runner() + writing = os.fspath(WRITING_ROOT) + if writing not in sys.path: + sys.path.insert(0, writing) + name = "_review_a5_native_eight_training_runner_r3_pinned_cli" + module = ModuleType(name) + module.__file__ = os.fspath(RUNNER_PATH) + module.__package__ = "" + sys.modules[name] = module + try: + exec( + compile(payload, os.fspath(RUNNER_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + if not callable(getattr(module, "main", None)): + raise RuntimeError("R3 runner does not expose its pinned CLI") + return module + + +if __name__ == "__main__": + raise SystemExit(_load_runner().main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/review_a5_native_eight_training_runner_r8.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/review_a5_native_eight_training_runner_r8.py new file mode 100644 index 0000000000000000000000000000000000000000..5cfcc2fa91be9b41344346bf507732bd161c21e9 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/review_a5_native_eight_training_runner_r8.py @@ -0,0 +1,339 @@ +"""Minimal R3 native-eight child for the direct static-v2 publication. + +The proven R3 trainer is loaded from exact bytes. This child changes only the +process-local static publication boundary: it validates the complete direct R2 +publication and owner amendment, derives a non-persistent predecessor-shaped +view, and then runs every inherited R3 science/resume/checkpoint check. +""" + +from __future__ import annotations + +import copy +import hashlib +import os +from pathlib import Path +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping, Sequence + + +R3_SOURCE = ( + Path(__file__).absolute().parents[1] + / "a5_native_eight_training_20260722_r3" + / "review_a5_native_eight_training_runner_r3.py" +) +R3_SOURCE_SHA256 = "550588ca033718273de2e35825b8b9faffe4a5fb747ff8775fe17bb31050d9be" +R3_SOURCE_BYTES = 25_611 +BRIDGE_SOURCE = ( + Path(__file__).absolute().parents[1] + / "a5_native_eight_direct_static_bridge_20260724_r1" + / "review_a5_native_eight_direct_static_bridge_r1.py" +) +BRIDGE_SOURCE_SHA256 = "c71ba654568a24993bc1733b26b6863b11e5c198c53871a6183b485ab96540f0" +BRIDGE_SOURCE_BYTES = 37_921 +DIRECT_POSTFIT_SOURCE = ( + Path(__file__).absolute().parents[1] + / "a5_static_v2_postfit_direct_publication_20260724_r2" + / "review_a5_static_v2_postfit_direct_publication_r2.py" +) +DIRECT_POSTFIT_SOURCE_SHA256 = ( + "8e57c17fd43f3894f94f980cf70a0d6d7f183cf04c26780c3fe30c1932bb7abb" +) +DIRECT_POSTFIT_SOURCE_BYTES = 40_020 + +RUNNER_PATH = Path(__file__).absolute() +WRAPPER_PATH = RUNNER_PATH.parent / "run_review_a5_native_eight_training_r8.py" +PROJECT_ROOT = RUNNER_PATH.parents[5] +SBATCH_PATH = ( + PROJECT_ROOT + / "writing/review/multimodal/slurm" + / "review_a5_native_eight_seed43_scavenger_20260724_r8.sbatch" +) +OWNER_AMENDMENT_PATH = ( + PROJECT_ROOT + / "writing/review/multimodal" + / "review_a5_static_v2_direct_development_publication_owner_amendment_20260724_r1.json" +) +SCHEMA_R8 = "bertose_review_a5_native_eight_training_runner_20260724_r8" +STATIC_BINDING_SCHEMA_R8 = ( + "bertose_review_a5_native_eight_direct_static_runtime_binding_20260724_r8" +) + + +class NativeEightTrainingR8Error(RuntimeError): + """The minimal direct-static successor failed closed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightTrainingR8Error(message) + + +def _read_exact(path: Path, *, sha256: str, size: int, label: str) -> bytes: + raw = path.read_bytes() + _require( + hashlib.sha256(raw).hexdigest() == sha256 and len(raw) == size, + f"{label} source identity changed", + ) + return raw + + +def _load_module(path: Path, raw: bytes, name: str) -> ModuleType: + module = ModuleType(name) + module.__file__ = os.fspath(path) + module.__package__ = "" + sys.modules[name] = module + try: + exec(compile(raw, os.fspath(path), "exec", dont_inherit=True), module.__dict__) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +_r3 = _load_module( + R3_SOURCE, + _read_exact( + R3_SOURCE, + sha256=R3_SOURCE_SHA256, + size=R3_SOURCE_BYTES, + label="proven native-eight R3", + ), + "_review_a5_native_eight_training_r3_pinned_for_r8_direct_static", +) +_r2 = _r3._r2 +_core = _r3._core + +# The external release must bind this successor's exact three launch sources. +for _module in (_r3, _r2): + _module.RUNNER_SOURCE_PATH = RUNNER_PATH + _module.WRAPPER_SOURCE_PATH = WRAPPER_PATH + _module.SBATCH_SOURCE_PATH = SBATCH_PATH +_core.__file__ = os.fspath(RUNNER_PATH) +_core.RUNTIME_ROOT = RUNNER_PATH.parent + + +def _load_bridge() -> ModuleType: + bridge = _load_module( + BRIDGE_SOURCE, + _read_exact( + BRIDGE_SOURCE, + sha256=BRIDGE_SOURCE_SHA256, + size=BRIDGE_SOURCE_BYTES, + label="direct-static bridge", + ), + "_review_a5_native_eight_direct_static_bridge_pinned_for_r8", + ) + _require( + { + "CLOSED_AUTHORIZATION", + "NULL_STATUS", + "OWNER_AMENDMENT_FILE_SHA256", + "WRITER_SOURCE_SHA256", + "build_in_memory_view", + "validate_bound_publication_files", + }.issubset(set(getattr(bridge, "__all__", ()))), + "direct-static bridge public API changed", + ) + return bridge + + +# Bind the exact producer implementation too; it is never executed here. +_read_exact( + DIRECT_POSTFIT_SOURCE, + sha256=DIRECT_POSTFIT_SOURCE_SHA256, + size=DIRECT_POSTFIT_SOURCE_BYTES, + label="direct postfit producer", +) +_bridge = _load_bridge() +_inherited_static_loader = _r2._load_static_bundle_r2 +_original_pickle_loads = _core._primitive_pickle_loads +_original_load_json = _core.load_canonical_json + +_r2.POSTFIT_WRITER_SOURCE_SHA256 = _bridge.WRITER_SOURCE_SHA256 +_r2.POSTFIT_CLOSED_AUTHORIZATION = dict(_bridge.CLOSED_AUTHORIZATION) +_r2.POSTFIT_NULL_STATUS = _bridge.NULL_STATUS +_r2.STATIC_BINDING_SCHEMA_R2 = STATIC_BINDING_SCHEMA_R8 +_core.STATIC_BINDING_SCHEMA = STATIC_BINDING_SCHEMA_R8 + + +def _load_direct_static_bundle(cls: type, config: Any) -> Any: + """Validate direct artifacts, then reuse the proven R3 deep loader.""" + + token_bytes = _core.read_regular_nofollow( + config.static_token_package, + label="direct static token package", + maximum=2 * 1024 * 1024 * 1024, + ) + _require( + _core.sha256_bytes(token_bytes) == config.static_token_package_sha256, + "direct static token file hash changed", + ) + direct_package = _original_pickle_loads(token_bytes) + _require(type(direct_package) is dict, "direct static token package changed") + direct_null = _original_load_json( + config.static_null_receipt, + config.static_null_receipt_sha256, + label="direct train-only static null", + ) + direct_publication = _original_load_json( + config.static_publication_receipt, + config.static_publication_receipt_sha256, + label="direct static publication", + ) + owner = _original_load_json( + OWNER_AMENDMENT_PATH, + _bridge.OWNER_AMENDMENT_FILE_SHA256, + label="direct-development owner amendment", + ) + current_release = _r2._VALIDATED_EXTERNAL_RELEASE + _require( + current_release is not None + and type(current_release.get("postfit_bindings")) is dict, + "external release was not validated before direct static load", + ) + view = _bridge.build_in_memory_view( + direct_publication=direct_publication, + token_package=direct_package, + null_receipt=direct_null, + released_postfit=current_release["postfit_bindings"], + publication_file_sha256=config.static_publication_receipt_sha256, + token_file_sha256=config.static_token_package_sha256, + null_file_sha256=config.static_null_receipt_sha256, + owner_amendment=owner, + owner_amendment_file_sha256=_bridge.OWNER_AMENDMENT_FILE_SHA256, + ) + _bridge.validate_bound_publication_files( + direct_publication, + publication_directory=config.static_publication_receipt.parent, + ) + + compatibility_release = copy.deepcopy(dict(current_release)) + compatibility_release["postfit_bindings"] = copy.deepcopy( + dict(view.released_postfit) + ) + + def pickle_view(payload: bytes) -> object: + decoded = _original_pickle_loads(payload) + if _core.sha256_bytes(payload) == config.static_token_package_sha256: + _require( + decoded == direct_package, + "direct token package changed during compatibility load", + ) + return copy.deepcopy(dict(view.token_package)) + return decoded + + def json_view(path: Path, expected_sha256: str, *, label: str) -> dict[str, Any]: + decoded = _original_load_json(path, expected_sha256, label=label) + if Path(path) == config.static_null_receipt: + _require(decoded == direct_null, "direct null changed during compatibility load") + return copy.deepcopy(dict(view.null_receipt)) + if Path(path) == config.static_publication_receipt: + _require( + decoded == direct_publication, + "direct publication changed during compatibility load", + ) + return copy.deepcopy(dict(view.publication_receipt)) + return decoded + + original_release = current_release + _core._primitive_pickle_loads = pickle_view + _core.load_canonical_json = json_view + _r2._VALIDATED_EXTERNAL_RELEASE = MappingProxyType(compatibility_release) + try: + bundle = _inherited_static_loader(cls, config) + finally: + _r2._VALIDATED_EXTERNAL_RELEASE = original_release + _core.load_canonical_json = _original_load_json + _core._primitive_pickle_loads = _original_pickle_loads + + binding = copy.deepcopy(dict(bundle.binding_value)) + predecessor_binding_sha256 = binding.pop("binding_sha256") + binding["schema"] = STATIC_BINDING_SCHEMA_R8 + binding.update( + { + "predecessor_compatibility_binding_sha256": predecessor_binding_sha256, + "direct_static_bridge_source_sha256": BRIDGE_SOURCE_SHA256, + "direct_postfit_producer_source_sha256": DIRECT_POSTFIT_SOURCE_SHA256, + "direct_static_bridge_evidence": copy.deepcopy(dict(view.evidence)), + "direct_publication_validated_before_compatibility_view": True, + "compatibility_view_persisted": False, + } + ) + binding["binding_sha256"] = _core.canonical_sha256( + binding, + domain=STATIC_BINDING_SCHEMA_R8, + ) + return cls( + bundle.token_package_sha256, + bundle.null_receipt_sha256, + bundle.publication_receipt_sha256, + bundle.parents, + bundle.null_scale, + bundle.supports, + bundle.support_sha256_by_slot, + MappingProxyType(binding), + bundle.masker, + ) + + +_load_direct_static_bundle._review_a5_direct_static_r8 = True +_core.StaticBundle.load = classmethod(_load_direct_static_bundle) +_r2._review_a5_direct_static_r8_installed = True + +_inherited_describe_contract = _r3.describe_contract + + +def describe_contract() -> Mapping[str, Any]: + value = dict(_inherited_describe_contract()) + value.update( + { + "schema": SCHEMA_R8, + "predecessor_runner_sha256": R3_SOURCE_SHA256, + "direct_static_bridge_source_sha256": BRIDGE_SOURCE_SHA256, + "direct_postfit_producer_source_sha256": DIRECT_POSTFIT_SOURCE_SHA256, + "static_binding_schema": STATIC_BINDING_SCHEMA_R8, + "direct_publication_status": _bridge.DIRECT_PUBLICATION_STATUS, + "direct_package_status": _bridge.PACKAGE_STATUS, + "direct_null_status": _bridge.NULL_STATUS, + "direct_export_status": _bridge.EXPORT_STATUS, + "direct_publication_validated_before_compatibility_view": True, + "compatibility_view_persisted": False, + "fairness_gate_required": False, + "capacity_gate_required": False, + "device_class_constraint_required": False, + "training_authorized": False, + "nova_submission_authorized": False, + } + ) + return MappingProxyType(value) + + +_r2.describe_contract = describe_contract +_core.describe_contract = describe_contract + + +def main(argv: Sequence[str] | None = None) -> int: + return int(_r3.main(argv)) + + +def __getattr__(name: str) -> Any: + return getattr(_r3, name) + + +__all__ = sorted( + set(getattr(_r3, "__all__", ())) + | { + "BRIDGE_SOURCE_SHA256", + "DIRECT_POSTFIT_SOURCE_SHA256", + "NativeEightTrainingR8Error", + "R3_SOURCE_SHA256", + "STATIC_BINDING_SCHEMA_R8", + "describe_contract", + "main", + } +) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/run_review_a5_native_eight_training_r8.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/run_review_a5_native_eight_training_r8.py new file mode 100644 index 0000000000000000000000000000000000000000..37700530c15f6cd2c9cb5557dab5d1b81670f4c5 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/run_review_a5_native_eight_training_r8.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 +"""Hash-pinned isolated CLI for the direct-static native-eight R8 child.""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import stat +import sys +from types import ModuleType + + +SOURCE_SHA256 = "cbc9fc0179ecb1e7c449fa37a574f38ff3e912e13db5c984d87e05e3e347a0e1" +SOURCE_BYTES = 11_844 +WRAPPER_PATH = Path(__file__).absolute() +SOURCE_PATH = WRAPPER_PATH.parent / "review_a5_native_eight_training_runner_r8.py" + + +def _load() -> ModuleType: + dflags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW + fflags = os.O_RDONLY | os.O_NOFOLLOW + directory_fd = os.open(os.sep, dflags) + file_fd: int | None = None + try: + for part in SOURCE_PATH.parts[1:-1]: + child = os.open(part, dflags, dir_fd=directory_fd) + os.close(directory_fd) + directory_fd = child + file_fd = os.open(SOURCE_PATH.name, fflags, dir_fd=directory_fd) + before = os.fstat(file_fd) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or before.st_size != SOURCE_BYTES + ): + raise RuntimeError("training R8 source identity changed") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(file_fd, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("training R8 source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(file_fd) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ): + raise RuntimeError("training R8 source changed during read") + raw = b"".join(chunks) + finally: + if file_fd is not None: + os.close(file_fd) + os.close(directory_fd) + if hashlib.sha256(raw).hexdigest() != SOURCE_SHA256: + raise RuntimeError("training R8 source SHA changed") + name = "_review_a5_native_eight_training_r8_pinned_cli" + module = ModuleType(name) + module.__file__ = os.fspath(SOURCE_PATH) + module.__package__ = "" + sys.modules[name] = module + try: + exec(compile(raw, os.fspath(SOURCE_PATH), "exec", dont_inherit=True), module.__dict__) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +if __name__ == "__main__": + raise SystemExit(_load().main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/review_a5_native_eight_training_runner_r9.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/review_a5_native_eight_training_runner_r9.py new file mode 100644 index 0000000000000000000000000000000000000000..85963fcc56ab25c8bde614f29ef640e0f03393bf --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/review_a5_native_eight_training_runner_r9.py @@ -0,0 +1,244 @@ +"""Minimal isolated-Nova-path successor for the audited native-eight R8. + +The exact R8 science, data, resume, checkpoint, and direct-static bridge remain +unchanged. This child changes only the inherited R3 launcher-path validator: +the Slurm working directory and log files must live under one exact isolated +Nova root, while every non-path directive is still validated by the pinned R3 +implementation through R8. +""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping, Sequence + + +R8_SOURCE = ( + Path(__file__).absolute().parents[1] + / "a5_native_eight_training_20260724_r8" + / "review_a5_native_eight_training_runner_r8.py" +) +R8_SOURCE_SHA256 = "cbc9fc0179ecb1e7c449fa37a574f38ff3e912e13db5c984d87e05e3e347a0e1" +R8_SOURCE_BYTES = 11_844 + +RUNNER_PATH = Path(__file__).absolute() +WRAPPER_PATH = RUNNER_PATH.parent / "run_review_a5_native_eight_training_r9.py" +PROJECT_ROOT = RUNNER_PATH.parents[5] +SBATCH_PATH = ( + PROJECT_ROOT + / "writing/review/multimodal/slurm" + / "review_a5_native_eight_seed43_scavenger_20260724_r9_isolated.sbatch" +) + +ISOLATED_NOVA_ROOT = ( + "/work/ratul1/supantha/" + "bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc" +) +PREDECESSOR_SHARED_NOVA_ROOT = ( + "/work/ratul1/supantha/glycan-SD-VS/" + "bert_training_v3/v3.1_cluster_training" +) +ISOLATED_STDOUT = ( + f"{ISOLATED_NOVA_ROOT}/writing/review/multimodal/outputs/" + "review_a5_native8_r3_%A_%a.out" +) +ISOLATED_STDERR = ( + f"{ISOLATED_NOVA_ROOT}/writing/review/multimodal/outputs/" + "review_a5_native8_r3_%A_%a.err" +) +ISOLATED_RUNNER_RELATIVE = ( + "writing/review/multimodal/runtime/" + "a5_native_eight_training_20260724_r9_isolated_path/" + "run_review_a5_native_eight_training_r9.py" +) +ISOLATED_LAUNCH_CONFIG_RELATIVE = ( + "writing/review/multimodal/inputs/" + "review_a5_native_eight_training_launch_config_final_r9_isolated.json" +) + +SCHEMA_R9 = ( + "bertose_review_a5_native_eight_training_runner_20260724_r9_isolated_path" +) + + +class NativeEightTrainingR9Error(RuntimeError): + """The isolated-path successor changed outside its narrow contract.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightTrainingR9Error(message) + + +def _read_exact(path: Path, *, sha256: str, size: int, label: str) -> bytes: + raw = path.read_bytes() + _require( + hashlib.sha256(raw).hexdigest() == sha256 and len(raw) == size, + f"{label} source identity changed", + ) + return raw + + +def _load_module(path: Path, raw: bytes, name: str) -> ModuleType: + module = ModuleType(name) + module.__file__ = os.fspath(path) + module.__package__ = "" + sys.modules[name] = module + try: + exec(compile(raw, os.fspath(path), "exec", dont_inherit=True), module.__dict__) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +_r8 = _load_module( + R8_SOURCE, + _read_exact( + R8_SOURCE, + sha256=R8_SOURCE_SHA256, + size=R8_SOURCE_BYTES, + label="audited native-eight R8", + ), + "_review_a5_native_eight_training_r8_pinned_for_r9_isolated_path", +) +_r3 = _r8._r3 +_r2 = _r8._r2 +_core = _r8._core + +# Rebind only the three externally released launch sources. All predecessor +# files remain unchanged on disk. +for _module in (_r3, _r2): + _module.RUNNER_SOURCE_PATH = RUNNER_PATH + _module.WRAPPER_SOURCE_PATH = WRAPPER_PATH + _module.SBATCH_SOURCE_PATH = SBATCH_PATH +_r8.RUNNER_PATH = RUNNER_PATH +_r8.WRAPPER_PATH = WRAPPER_PATH +_r8.SBATCH_PATH = SBATCH_PATH +_core.__file__ = os.fspath(RUNNER_PATH) +_core.RUNTIME_ROOT = RUNNER_PATH.parent + +_inherited_parse_sbatch_directives = _r3._parse_sbatch_directives_r3 + + +def _parse_sbatch_directives_r9( + payload: bytes, +) -> Mapping[str, str | None]: + """Validate exact isolated paths, then reuse every inherited R3 check.""" + + try: + source = payload.decode("ascii") + except UnicodeDecodeError as error: + raise NativeEightTrainingR9Error( + "isolated R9 sbatch is not ASCII" + ) from error + + new_to_old = { + f"#SBATCH --chdir={ISOLATED_NOVA_ROOT}": ( + f"#SBATCH --chdir={PREDECESSOR_SHARED_NOVA_ROOT}" + ), + f"#SBATCH --output={ISOLATED_STDOUT}": ( + "#SBATCH --output=writing/review/multimodal/outputs/" + "review_a5_native8_r3_%A_%a.out" + ), + f"#SBATCH --error={ISOLATED_STDERR}": ( + "#SBATCH --error=writing/review/multimodal/outputs/" + "review_a5_native8_r3_%A_%a.err" + ), + } + for new_line, old_line in new_to_old.items(): + _require( + source.count(new_line + "\n") == 1 + and source.count(old_line + "\n") == 0, + "isolated R9 sbatch path directive changed", + ) + + expected_assignments = ( + f"PROJECT_ROOT={ISOLATED_NOVA_ROOT}", + f"RUNNER=${{PROJECT_ROOT}}/{ISOLATED_RUNNER_RELATIVE}", + f"LAUNCH_CONFIG=${{PROJECT_ROOT}}/{ISOLATED_LAUNCH_CONFIG_RELATIVE}", + ) + _require( + all(source.count(line + "\n") == 1 for line in expected_assignments) + and f"PROJECT_ROOT={PREDECESSOR_SHARED_NOVA_ROOT}" not in source + and "/work/ratul1/supantha/glycan-SD-VS/" not in source, + "isolated R9 execution path assignment changed", + ) + + compatibility_source = source + for new_line, old_line in new_to_old.items(): + compatibility_source = compatibility_source.replace(new_line, old_line) + predecessor = dict( + _inherited_parse_sbatch_directives( + compatibility_source.encode("ascii") + ) + ) + predecessor.update( + { + "--chdir": ISOLATED_NOVA_ROOT, + "--output": ISOLATED_STDOUT, + "--error": ISOLATED_STDERR, + } + ) + return MappingProxyType(predecessor) + + +# The inherited external-release validator resolves this global at call time. +# No controller, fairness, capacity, or device-class layer is introduced. +_r3._parse_sbatch_directives_r3 = _parse_sbatch_directives_r9 + +_inherited_describe_contract = _r8.describe_contract + + +def describe_contract() -> Mapping[str, Any]: + value = dict(_inherited_describe_contract()) + value.update( + { + "schema": SCHEMA_R9, + "predecessor_runner_sha256": R8_SOURCE_SHA256, + "isolated_nova_root": ISOLATED_NOVA_ROOT, + "isolated_stdout": ISOLATED_STDOUT, + "isolated_stderr": ISOLATED_STDERR, + "isolated_path_change_only": True, + "training_authorized": False, + "nova_submission_authorized": False, + } + ) + return MappingProxyType(value) + + +_r8.describe_contract = describe_contract +_r3.describe_contract = describe_contract +_r2.describe_contract = describe_contract +_core.describe_contract = describe_contract + + +def main(argv: Sequence[str] | None = None) -> int: + return int(_r8.main(argv)) + + +def __getattr__(name: str) -> Any: + return getattr(_r8, name) + + +__all__ = sorted( + set(getattr(_r8, "__all__", ())) + | { + "ISOLATED_NOVA_ROOT", + "ISOLATED_STDERR", + "ISOLATED_STDOUT", + "NativeEightTrainingR9Error", + "R8_SOURCE_SHA256", + "SCHEMA_R9", + "describe_contract", + "main", + } +) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/run_review_a5_native_eight_training_r9.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/run_review_a5_native_eight_training_r9.py new file mode 100644 index 0000000000000000000000000000000000000000..4ccbf53baf8a0b4c3192b6599899db466aada91c --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/run_review_a5_native_eight_training_r9.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 +"""Hash-pinned isolated CLI for the native-eight R9 isolated-path child.""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import stat +import sys +from types import ModuleType + + +SOURCE_SHA256 = "4430560565a18da0e68700d60526d3dec15fabd79854111d1e85deb59e2381c8" +SOURCE_BYTES = 7_443 +WRAPPER_PATH = Path(__file__).absolute() +SOURCE_PATH = WRAPPER_PATH.parent / "review_a5_native_eight_training_runner_r9.py" + + +def _load() -> ModuleType: + dflags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW + fflags = os.O_RDONLY | os.O_NOFOLLOW + directory_fd = os.open(os.sep, dflags) + file_fd: int | None = None + try: + for part in SOURCE_PATH.parts[1:-1]: + child = os.open(part, dflags, dir_fd=directory_fd) + os.close(directory_fd) + directory_fd = child + file_fd = os.open(SOURCE_PATH.name, fflags, dir_fd=directory_fd) + before = os.fstat(file_fd) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or before.st_size != SOURCE_BYTES + ): + raise RuntimeError("training R9 source identity changed") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(file_fd, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("training R9 source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(file_fd) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ): + raise RuntimeError("training R9 source changed during read") + raw = b"".join(chunks) + finally: + if file_fd is not None: + os.close(file_fd) + os.close(directory_fd) + if hashlib.sha256(raw).hexdigest() != SOURCE_SHA256: + raise RuntimeError("training R9 source SHA changed") + name = "_review_a5_native_eight_training_r9_pinned_cli" + module = ModuleType(name) + module.__file__ = os.fspath(SOURCE_PATH) + module.__package__ = "" + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +if __name__ == "__main__": + raise SystemExit(_load().main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r11_certification_gate_candidate/review_a5_native_eight_certification_gate_r11.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r11_certification_gate_candidate/review_a5_native_eight_certification_gate_r11.py new file mode 100644 index 0000000000000000000000000000000000000000..9ff2732cf45be81df482143115a0b52b75751a2d --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r11_certification_gate_candidate/review_a5_native_eight_certification_gate_r11.py @@ -0,0 +1,1456 @@ +"""Fail-closed R11 candidate around the exact native-eight R9 runtime. + +This module does not submit or authorize training. The completed R6 source +identity, path, schema, and exact job-specific status are fixed here. A future +hash-pinned successor runner may pass only the final R6 binding-file identity +through ``TerminalCertificatePinR11``. Until that binding exists, +installation cannot validate a release and launch remains closed. + +The public installation path accepts no validator callback and no alternate +module or artifact path. It gates the actual byte-pinned R9 module graph, +replaces both the job-side R2 validator and the inherited R3 controller entry, +and returns the signed R11 release rather than the predecessor compatibility +view used only inside the frozen R3 validator. +""" + +from __future__ import annotations + +import copy +from dataclasses import dataclass +import hashlib +import inspect +import json +import os +from pathlib import Path +import re +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + + +SCHEMA_R11 = ( + "bertose_a5_native_eight_external_release_20260725_r11_" + "certification_gate_candidate" +) +INSTALLATION_SCHEMA_R11 = ( + "bertose_a5_native_eight_certification_gate_installation_20260725_r11" +) +GATE_PROVENANCE_SCHEMA_R11 = ( + "bertose_a5_native_eight_certification_gate_provenance_20260725_r11" +) +PREDECESSOR_SCHEMA = "bertose_a5_native_eight_external_release_20260722_r3" +RELEASE_STATUS = "PASS_RELEASED_FOR_ONE_NATIVE_EIGHT_ARRAY" + +GATE_SOURCE_PATH = Path(__file__).absolute() +WRITING_ROOT = GATE_SOURCE_PATH.parents[4] +RUNTIME_ROOT = WRITING_ROOT / "review/multimodal/runtime" + +R9_SOURCE_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260724_r9_isolated_path" + / "review_a5_native_eight_training_runner_r9.py" +) +R9_SOURCE_SHA256 = ( + "4430560565a18da0e68700d60526d3dec15fabd79854111d1e85deb59e2381c8" +) +R9_SOURCE_BYTES = 7_443 +R8_SOURCE_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260724_r8" + / "review_a5_native_eight_training_runner_r8.py" +) +R8_SOURCE_SHA256 = ( + "cbc9fc0179ecb1e7c449fa37a574f38ff3e912e13db5c984d87e05e3e347a0e1" +) +R8_SOURCE_BYTES = 11_844 +R3_SOURCE_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260722_r3" + / "review_a5_native_eight_training_runner_r3.py" +) +R3_SOURCE_SHA256 = ( + "550588ca033718273de2e35825b8b9faffe4a5fb747ff8775fe17bb31050d9be" +) +R3_SOURCE_BYTES = 25_611 +R2_SOURCE_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260722_r2" + / "review_a5_native_eight_training_runner_r2.py" +) +R2_SOURCE_SHA256 = ( + "7e93b13b3212b3c97e30144f3e393a86a13411d5e82fe19bd55d43bc58587e30" +) +R2_SOURCE_BYTES = 74_326 +R1_SOURCE_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260722_r1" + / "review_a5_native_eight_training_runner_r1.py" +) +R1_SOURCE_SHA256 = ( + "34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf" +) +R1_SOURCE_BYTES = 97_336 + +TERMINAL_SOURCE_PATH = ( + RUNTIME_ROOT + / "a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification" + / "review_a5_static_v2_terminal_certification_r6.py" +) +TERMINAL_SOURCE_SHA256 = ( + "bdb0fa37804531f6446cee9411c9730fde792eb9674054e56b883156f36da4cb" +) +TERMINAL_SOURCE_BYTES = 133_704 +TERMINAL_BINDING_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs" + / "review_a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification" + / "review_a5_static_v2_postfit_terminal_certification_binding_r6.json" +) +TERMINAL_BINDING_SCHEMA_R6 = ( + "bertose_a5_static_v2_postfit_terminal_certification_20260725_r6" +) +TERMINAL_BINDING_STATUS_R6 = ( + "PASS_EXACT_R6_TERMINAL_JOB_11762534_AND_R2_PUBLICATION" +) +TERMINAL_VALIDATOR_NAME = "validate_release_binding" + +SEQUENCE_SUMMARY_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs" + / "review_a5_sequence_v4_two_run_reproduction_20260722_r1" + / "review_a5_sequence_v4_two_run_reproduction_summary.json" +) +SEQUENCE_RECEIPT_PATH = ( + SEQUENCE_SUMMARY_PATH.parent + / "review_a5_sequence_v4_two_run_reproduction_receipt.json" +) +BFS_SUMMARY_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs" + / "review_a5_sequence_topology_bfs_replay_all_20260722_r1" + / "review_a5_sequence_topology_bfs_replay_all_summary_r1.json" +) +BFS_RECEIPT_PATH = ( + BFS_SUMMARY_PATH.parent + / "review_a5_sequence_topology_bfs_replay_all_receipt_r1.json" +) + +FIXED_EVIDENCE_BINDINGS = { + "sequence_summary": { + "absolute_path": os.fspath(SEQUENCE_SUMMARY_PATH), + "sha256": ( + "d6b3dad73d8c9cc78a7c721e7969280d0ff6500773402545bc2ff143b125f56c" + ), + "bytes": 6_916, + }, + "sequence_receipt": { + "absolute_path": os.fspath(SEQUENCE_RECEIPT_PATH), + "sha256": ( + "ba9591529f3747706fbc169fe8262e23ca31a810473d10c284fb01d9190ebe42" + ), + "bytes": 1_166, + }, + "bfs_summary": { + "absolute_path": os.fspath(BFS_SUMMARY_PATH), + "sha256": ( + "da7814d20c81c0d072544cfc5761e8fae0292def176d63b863083389c9caa0ff" + ), + "bytes": 8_477, + }, + "bfs_receipt": { + "absolute_path": os.fspath(BFS_RECEIPT_PATH), + "sha256": ( + "eae6b3772cd08c65cdc26bdf7ec525742452aad4a35b4d5aa9a7a5936dc3bf73" + ), + "bytes": 1_348, + }, +} + +PREDECESSOR_FIELDS = frozenset( + { + "schema", + "status", + "semantic_array_id", + "source_bindings", + "launch_config_binding", + "postfit_bindings", + "experiment", + "scheduler", + "live_duplicate_preflight", + "safety", + "exclusions", + "authorization", + "official_submitted_artifacts_modified", + "receipt_sha256", + } +) +R11_ADDITIONAL_FIELDS = frozenset( + {"certification_bindings", "certification_gate"} +) +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") +ZERO_SHA256 = "0" * 64 + + +class CertificationGateR11Error(RuntimeError): + """The R11 candidate, R9 graph, or required certificate changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise CertificationGateR11Error(message) + + +def canonical_bytes(value: Any) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def canonical_sha256(value: Any, *, domain: str) -> str: + return hashlib.sha256( + domain.encode("ascii") + b"\0" + canonical_bytes(value) + ).hexdigest() + + +def _plain_sha256(value: Any) -> str: + return hashlib.sha256(canonical_bytes(value)).hexdigest() + + +def _sha(value: Any, label: str) -> str: + _require( + isinstance(value, str) + and SHA_RE.fullmatch(value) is not None + and value != ZERO_SHA256, + f"{label} is not a nonzero SHA-256", + ) + return value + + +def _positive_size(value: Any, label: str) -> int: + _require( + type(value) is int and 0 < value <= 64 * 1024 * 1024, + f"{label} is not a bounded positive byte count", + ) + return value + + +@dataclass(frozen=True, slots=True) +class TerminalCertificatePinR11: + """R6 source constants plus future binding-file identity inputs.""" + + source_sha256: str + source_size_bytes: int + binding_sha256: str + binding_size_bytes: int + binding_schema: str + binding_status: str + + def __post_init__(self) -> None: + _require( + self.source_sha256 == TERMINAL_SOURCE_SHA256, + "R6 terminal validator source SHA-256 changed", + ) + _require( + self.source_size_bytes == TERMINAL_SOURCE_BYTES, + "R6 terminal validator source size changed", + ) + _sha(self.binding_sha256, "R6 terminal certification binding") + _positive_size( + self.binding_size_bytes, "R6 terminal certification binding size" + ) + _require( + self.binding_schema == TERMINAL_BINDING_SCHEMA_R6, + "R6 terminal certification schema changed", + ) + _require( + self.binding_status == TERMINAL_BINDING_STATUS_R6, + "R6 terminal certification status changed", + ) + + def as_dict(self) -> dict[str, Any]: + return { + "source_sha256": self.source_sha256, + "source_size_bytes": self.source_size_bytes, + "binding_sha256": self.binding_sha256, + "binding_size_bytes": self.binding_size_bytes, + "binding_schema": self.binding_schema, + "binding_status": self.binding_status, + } + + +def _canonical_absolute(path: Path, *, label: str) -> Path: + value = Path(path) + _require( + value.is_absolute() + and os.path.normpath(os.fspath(value)) == os.fspath(value) + and hasattr(os, "O_NOFOLLOW") + and hasattr(os, "O_DIRECTORY"), + f"{label} path is not canonical/no-follow capable", + ) + return value + + +def _read_exact_file( + path: Path, + *, + expected_sha256: str, + expected_size_bytes: int, + label: str, + require_read_only: bool, +) -> bytes: + """Read one exact file without following any path component.""" + + absolute = _canonical_absolute(path, label=label) + expected_sha = _sha(expected_sha256, f"{label} expected") + expected_size = _positive_size(expected_size_bytes, f"{label} expected size") + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = ( + os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + directory_descriptor = os.open(os.sep, directory_flags) + descriptor: int | None = None + try: + for component in absolute.parts[1:-1]: + child = os.open( + component, directory_flags, dir_fd=directory_descriptor + ) + os.close(directory_descriptor) + directory_descriptor = child + descriptor = os.open( + absolute.name, leaf_flags, dir_fd=directory_descriptor + ) + before = os.fstat(descriptor) + _require( + stat.S_ISREG(before.st_mode) + and before.st_nlink == 1 + and before.st_size == expected_size + and (not require_read_only or before.st_mode & 0o222 == 0), + f"{label} is not the exact immutable regular file", + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + _require(bool(chunk), f"{label} truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + except OSError as error: + raise CertificationGateR11Error( + f"{label} has a missing or symlinked path component" + ) from error + finally: + if descriptor is not None: + os.close(descriptor) + os.close(directory_descriptor) + identity = lambda value: ( + value.st_dev, + value.st_ino, + value.st_size, + value.st_mtime_ns, + value.st_ctime_ns, + value.st_mode, + value.st_nlink, + ) + raw = b"".join(chunks) + _require( + identity(before) == identity(after) + and len(raw) == expected_size + and hashlib.sha256(raw).hexdigest() == expected_sha, + f"{label} bytes changed", + ) + return raw + + +def _read_observed_file(path: Path, *, label: str) -> bytes: + """Observe an unpinned source through one stable component-wise read.""" + + absolute = _canonical_absolute(path, label=label) + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = ( + os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + directory_descriptor = os.open(os.sep, directory_flags) + descriptor: int | None = None + try: + for component in absolute.parts[1:-1]: + child = os.open( + component, directory_flags, dir_fd=directory_descriptor + ) + os.close(directory_descriptor) + directory_descriptor = child + descriptor = os.open( + absolute.name, leaf_flags, dir_fd=directory_descriptor + ) + before = os.fstat(descriptor) + _require( + stat.S_ISREG(before.st_mode) + and before.st_nlink == 1 + and 0 < before.st_size <= 64 * 1024 * 1024, + f"{label} is not one bounded regular source", + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + _require(bool(chunk), f"{label} truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + except OSError as error: + raise CertificationGateR11Error( + f"{label} has a missing or symlinked path component" + ) from error + finally: + if descriptor is not None: + os.close(descriptor) + os.close(directory_descriptor) + identity = lambda value: ( + value.st_dev, + value.st_ino, + value.st_size, + value.st_mtime_ns, + value.st_ctime_ns, + value.st_mode, + value.st_nlink, + ) + _require(identity(before) == identity(after), f"{label} changed while read") + return b"".join(chunks) + + +def _load_canonical_binding( + binding: Mapping[str, Any], + *, + label: str, + require_read_only: bool = True, + require_canonical: bool = True, +) -> tuple[bytes, dict[str, Any]]: + _require( + isinstance(binding, Mapping) + and set(binding) == {"absolute_path", "sha256", "bytes"}, + f"{label} binding fields changed", + ) + path = _canonical_absolute( + Path(str(binding["absolute_path"])), label=label + ) + raw = _read_exact_file( + path, + expected_sha256=_sha(binding.get("sha256"), f"{label} file"), + expected_size_bytes=_positive_size( + binding.get("bytes"), f"{label} bytes" + ), + label=label, + require_read_only=require_read_only, + ) + try: + value = json.loads(raw.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise CertificationGateR11Error(f"{label} is not JSON") from error + _require( + type(value) is dict + and (not require_canonical or canonical_bytes(value) == raw), + ( + f"{label} is not canonical JSON" + if require_canonical + else f"{label} JSON root changed" + ), + ) + return raw, value + + +def _observe_source_binding( + path: Path, + *, + expected_sha256: str | None = None, + expected_size_bytes: int | None = None, + label: str, +) -> dict[str, Any]: + if expected_sha256 is None or expected_size_bytes is None: + raw = _read_observed_file(path, label=label) + expected_sha256 = hashlib.sha256(raw).hexdigest() + expected_size_bytes = len(raw) + raw = _read_exact_file( + path, + expected_sha256=expected_sha256, + expected_size_bytes=expected_size_bytes, + label=label, + require_read_only=False, + ) + return { + "absolute_path": os.fspath(Path(path)), + "sha256": hashlib.sha256(raw).hexdigest(), + "bytes": len(raw), + } + + +def _fixed_evidence(binding: Mapping[str, Any], name: str) -> None: + _require( + isinstance(binding, Mapping) + and dict(binding) == FIXED_EVIDENCE_BINDINGS[name], + f"{name.replace('_', ' ')} binding changed", + ) + + +def _validate_sequence(summary: Any, receipt: Any) -> None: + _require( + type(summary) is dict + and summary.get("schema") + == "bertose_a5_sequence_v4_two_run_reproduction_v1" + and summary.get("status") + == "PASS_TWO_DISTINCT_FRESH_FREEZES_ALL_DECLARED_BYTES_IDENTICAL" + and summary.get("bpe_fit_audit", {}).get("fit_parent_count") == 221_899 + and summary.get("bpe_fit_audit", {}).get( + "development_fit_parent_count" + ) + == 0 + and summary.get("reproduction", {}).get("fresh_output_run_count") == 2 + and summary.get("reproduction", {}).get( + "all_members_run1_run2_official_byte_for_byte_identical" + ) + is True + and type(receipt) is dict + and receipt.get("schema") + == "bertose_a5_sequence_v4_two_run_reproduction_receipt_v1" + and receipt.get("status") == "PASS_RECEIPT_LAST" + and receipt.get("summary") + == { + "bytes": FIXED_EVIDENCE_BINDINGS["sequence_summary"]["bytes"], + "sha256": FIXED_EVIDENCE_BINDINGS["sequence_summary"]["sha256"], + }, + "sequence two-run reproduction evidence changed", + ) + for value in (summary, receipt): + for key in ( + "training_authorized", + "scientific_launch_authorized", + "gpu_launch_authorized", + "nova_submission_authorized", + "checkpoint_resume_authorized", + "downstream_evaluation_authorized", + "official_submitted_or_predecessor_artifacts_modified", + ): + _require(value.get(key) is False, f"sequence evidence opened {key}") + + +def _validate_bfs(summary: Any, receipt: Any) -> None: + _require( + type(summary) is dict + and summary.get("schema") + == "bertose_a5_sequence_topology_exhaustive_independent_bfs_replay_v1" + and summary.get("status") == "PASS_ALL_93047_ZERO_MISMATCH" + and summary.get("scope", {}).get("authority_successor_rows") == 93_047 + and summary.get("scope", {}).get("target_role_counts") + == { + "excluded_exact_or_verified_graph_identity": 3_483, + "pretraining_development": 17_650, + "pretraining_train": 71_914, + } + and type(receipt) is dict + and receipt.get("schema") + == ( + "bertose_a5_sequence_topology_exhaustive_independent_" + "bfs_replay_receipt_v1" + ) + and receipt.get("status") + == "PASS_RECEIPT_LAST_ALL_93047_ZERO_MISMATCH" + and receipt.get("verified_target_rows") == 93_047 + and receipt.get("all_mismatch_counts_zero") is True + and receipt.get("summary") + == { + "bytes": FIXED_EVIDENCE_BINDINGS["bfs_summary"]["bytes"], + "name": BFS_SUMMARY_PATH.name, + "sha256": FIXED_EVIDENCE_BINDINGS["bfs_summary"]["sha256"], + }, + "exhaustive BFS replay evidence changed", + ) + for value in (summary, receipt): + for key in ( + "training_authorized", + "scientific_launch_authorized", + "gpu_launch_authorized", + "nova_submission_authorized", + "checkpoint_resume_authorized", + "downstream_evaluation_authorized", + "official_submitted_or_predecessor_artifacts_modified", + ): + _require(value.get(key) is False, f"BFS evidence opened {key}") + _require( + value.get("affinose_authorized") is False, + "BFS evidence opened AFFINose", + ) + + +def _load_terminal_validator_at_path( + pin: TerminalCertificatePinR11, *, source_path: Path +) -> ModuleType: + _require( + type(pin) is TerminalCertificatePinR11, + "terminal certificate pin type changed", + ) + raw = _read_exact_file( + source_path, + expected_sha256=pin.source_sha256, + expected_size_bytes=pin.source_size_bytes, + label="R6 terminal certification validator source", + require_read_only=True, + ) + module_name = ( + "_review_a5_static_v2_terminal_certification_r6_pinned_for_r11_" + + pin.source_sha256[:16] + ) + module = ModuleType(module_name) + module.__file__ = os.fspath(Path(source_path)) + module.__package__ = "" + previous = sys.modules.get(module_name) + sys.modules[module_name] = module + try: + exec( + compile( + raw, + os.fspath(source_path), + "exec", + dont_inherit=True, + ), + module.__dict__, + ) + validator = getattr(module, TERMINAL_VALIDATOR_NAME, None) + signature = ( + inspect.signature(validator) + if inspect.isfunction(validator) + else None + ) + _require( + getattr(module, "BINDING_SCHEMA", None) == pin.binding_schema + and getattr(module, "BINDING_STATUS", None) == pin.binding_status + and inspect.isfunction(validator) + and validator.__module__ == module_name + and signature is not None + and list(signature.parameters) + == ["binding_path", "expected_sha256", "expected_size_bytes"] + and all( + parameter.kind + is inspect.Parameter.POSITIONAL_OR_KEYWORD + and parameter.default is inspect.Parameter.empty + for parameter in signature.parameters.values() + ) + and { + "BINDING_SCHEMA", + "BINDING_STATUS", + TERMINAL_VALIDATOR_NAME, + } + <= set(getattr(module, "__all__", ())), + "R6 terminal certification validator API changed", + ) + finally: + if previous is None: + sys.modules.pop(module_name, None) + else: + sys.modules[module_name] = previous + return module + + +def _validate_terminal_at_paths( + binding: Mapping[str, Any], + *, + pin: TerminalCertificatePinR11, + source_path: Path, + binding_path: Path, +) -> dict[str, Any]: + expected_binding = { + "absolute_path": os.fspath(Path(binding_path)), + "sha256": pin.binding_sha256, + "bytes": pin.binding_size_bytes, + } + _require( + isinstance(binding, Mapping) and dict(binding) == expected_binding, + "R6 terminal certification binding changed", + ) + raw_before, observed_before = _load_canonical_binding( + binding, label="R6 terminal certification binding" + ) + _require( + observed_before.get("schema") == pin.binding_schema + and observed_before.get("status") == pin.binding_status + and observed_before.get("successor_job_id") == "11762534" + and observed_before.get("native_ablation_data_binding_authorized") + is False + and observed_before.get("nova_submission_authorized") is False + and observed_before.get("official_submitted_artifacts_modified") + is False, + "R6 terminal certification semantics changed", + ) + unsigned = copy.deepcopy(observed_before) + signed = _sha( + unsigned.pop("receipt_sha256", None), + "R6 terminal certification receipt", + ) + _require( + _plain_sha256(unsigned) == signed, + "R6 terminal certification self-hash changed", + ) + authorization = observed_before.get("authorization") + _require( + isinstance(authorization, Mapping) + and all( + value is False + for key, value in authorization.items() + if key.endswith("_authorized") + ), + "R6 terminal certification authorization changed", + ) + module = _load_terminal_validator_at_path(pin, source_path=source_path) + validator = getattr(module, TERMINAL_VALIDATOR_NAME) + validated = validator( + Path(binding_path), + pin.binding_sha256, + pin.binding_size_bytes, + ) + raw_after, observed_after = _load_canonical_binding( + binding, label="R6 terminal certification binding post-validation" + ) + _require( + raw_after == raw_before + and observed_after == observed_before + and type(validated) is dict + and validated == observed_before, + "R6 terminal certification validator readback changed", + ) + return { + "terminal_binding_file_sha256": pin.binding_sha256, + "terminal_binding_receipt_sha256": signed, + "terminal_validator_source_sha256": pin.source_sha256, + "terminal_validator_api": ( + "validate_release_binding(" + "binding_path,expected_sha256,expected_size_bytes)" + ), + } + + +def _build_certification_bindings_at_path( + pin: TerminalCertificatePinR11, *, binding_path: Path +) -> dict[str, Any]: + _require( + type(pin) is TerminalCertificatePinR11, + "terminal certificate pin type changed", + ) + return { + "static_terminal_certification": { + "absolute_path": os.fspath(Path(binding_path)), + "sha256": pin.binding_sha256, + "bytes": pin.binding_size_bytes, + }, + "sequence_two_run_reproduction": { + "summary": copy.deepcopy(FIXED_EVIDENCE_BINDINGS["sequence_summary"]), + "receipt": copy.deepcopy(FIXED_EVIDENCE_BINDINGS["sequence_receipt"]), + }, + "topology_exhaustive_bfs_replay": { + "summary": copy.deepcopy(FIXED_EVIDENCE_BINDINGS["bfs_summary"]), + "receipt": copy.deepcopy(FIXED_EVIDENCE_BINDINGS["bfs_receipt"]), + }, + } + + +def build_certification_bindings( + *, terminal_pin: TerminalCertificatePinR11 +) -> dict[str, Any]: + """Bind only the fixed R6 and four fixed sequence/topology files.""" + + return _build_certification_bindings_at_path( + terminal_pin, binding_path=TERMINAL_BINDING_PATH + ) + + +def _validate_certification_bindings_at_paths( + bindings: Mapping[str, Any], + *, + terminal_pin: TerminalCertificatePinR11, + terminal_source_path: Path, + terminal_binding_path: Path, +) -> dict[str, Any]: + _require( + isinstance(bindings, Mapping) + and set(bindings) + == { + "static_terminal_certification", + "sequence_two_run_reproduction", + "topology_exhaustive_bfs_replay", + }, + "R11 certification roster changed", + ) + evidence = _validate_terminal_at_paths( + bindings["static_terminal_certification"], + pin=terminal_pin, + source_path=terminal_source_path, + binding_path=terminal_binding_path, + ) + sequence = bindings["sequence_two_run_reproduction"] + topology = bindings["topology_exhaustive_bfs_replay"] + _require( + isinstance(sequence, Mapping) + and set(sequence) == {"summary", "receipt"} + and isinstance(topology, Mapping) + and set(topology) == {"summary", "receipt"}, + "sequence/topology certification fields changed", + ) + _fixed_evidence(sequence["summary"], "sequence_summary") + _fixed_evidence(sequence["receipt"], "sequence_receipt") + _fixed_evidence(topology["summary"], "bfs_summary") + _fixed_evidence(topology["receipt"], "bfs_receipt") + _, sequence_summary = _load_canonical_binding( + sequence["summary"], + label="sequence two-run summary", + require_canonical=False, + ) + _, sequence_receipt = _load_canonical_binding( + sequence["receipt"], + label="sequence two-run receipt", + require_canonical=False, + ) + _, bfs_summary = _load_canonical_binding( + topology["summary"], + label="exhaustive BFS summary", + require_canonical=False, + ) + _, bfs_receipt = _load_canonical_binding( + topology["receipt"], + label="exhaustive BFS receipt", + require_canonical=False, + ) + _validate_sequence(sequence_summary, sequence_receipt) + _validate_bfs(bfs_summary, bfs_receipt) + evidence.update( + { + "sequence_two_run_summary_sha256": FIXED_EVIDENCE_BINDINGS[ + "sequence_summary" + ]["sha256"], + "sequence_two_run_receipt_sha256": FIXED_EVIDENCE_BINDINGS[ + "sequence_receipt" + ]["sha256"], + "topology_exhaustive_bfs_summary_sha256": FIXED_EVIDENCE_BINDINGS[ + "bfs_summary" + ]["sha256"], + "topology_exhaustive_bfs_receipt_sha256": FIXED_EVIDENCE_BINDINGS[ + "bfs_receipt" + ]["sha256"], + "all_five_evidence_files_reopened_before_predecessor_validation": True, + } + ) + return evidence + + +def validate_certification_bindings( + bindings: Mapping[str, Any], + *, + terminal_pin: TerminalCertificatePinR11, +) -> dict[str, Any]: + """Validate the fixed production paths; no path or callback is injectable.""" + + return _validate_certification_bindings_at_paths( + bindings, + terminal_pin=terminal_pin, + terminal_source_path=TERMINAL_SOURCE_PATH, + terminal_binding_path=TERMINAL_BINDING_PATH, + ) + + +def _validate_predecessor_release( + predecessor_release: Mapping[str, Any], +) -> tuple[dict[str, Any], str]: + _require( + type(predecessor_release) is dict + and set(predecessor_release) == PREDECESSOR_FIELDS + and predecessor_release.get("schema") == PREDECESSOR_SCHEMA + and predecessor_release.get("status") == RELEASE_STATUS, + "predecessor external release shape changed", + ) + predecessor = copy.deepcopy(predecessor_release) + unsigned = copy.deepcopy(predecessor) + signed = _sha( + unsigned.pop("receipt_sha256", None), + "predecessor release receipt", + ) + _require( + canonical_sha256(unsigned, domain=PREDECESSOR_SCHEMA) == signed, + "predecessor external release signature changed", + ) + return predecessor, signed + + +def _gate_provenance_at_paths( + predecessor_receipt_sha256: str, + *, + terminal_pin: TerminalCertificatePinR11, + terminal_source_path: Path, +) -> dict[str, Any]: + return { + "schema": GATE_PROVENANCE_SCHEMA_R11, + "gate_source": _observe_source_binding( + GATE_SOURCE_PATH, label="R11 certification gate source" + ), + "r9_runner_source": _observe_source_binding( + R9_SOURCE_PATH, + expected_sha256=R9_SOURCE_SHA256, + expected_size_bytes=R9_SOURCE_BYTES, + label="native-eight R9 runner source", + ), + "terminal_validator_source": { + "absolute_path": os.fspath(Path(terminal_source_path)), + "sha256": terminal_pin.source_sha256, + "bytes": terminal_pin.source_size_bytes, + }, + "terminal_binding_schema": terminal_pin.binding_schema, + "terminal_binding_status": terminal_pin.binding_status, + "terminal_validator_name": TERMINAL_VALIDATOR_NAME, + "predecessor_schema": PREDECESSOR_SCHEMA, + "predecessor_receipt_sha256": predecessor_receipt_sha256, + "launch_authorized_by_this_candidate": False, + } + + +def _build_r11_release_at_paths( + predecessor_release: Mapping[str, Any], + *, + terminal_pin: TerminalCertificatePinR11, + terminal_source_path: Path, + terminal_binding_path: Path, +) -> dict[str, Any]: + predecessor, signed = _validate_predecessor_release(predecessor_release) + value = copy.deepcopy(predecessor) + value.pop("receipt_sha256") + value["schema"] = SCHEMA_R11 + value["certification_bindings"] = _build_certification_bindings_at_path( + terminal_pin, binding_path=terminal_binding_path + ) + value["certification_gate"] = _gate_provenance_at_paths( + signed, + terminal_pin=terminal_pin, + terminal_source_path=terminal_source_path, + ) + value["receipt_sha256"] = canonical_sha256(value, domain=SCHEMA_R11) + return value + + +def build_r11_release( + predecessor_release: Mapping[str, Any], + *, + terminal_pin: TerminalCertificatePinR11, +) -> dict[str, Any]: + """Build, but never persist, the signed R11 release.""" + + return _build_r11_release_at_paths( + predecessor_release, + terminal_pin=terminal_pin, + terminal_source_path=TERMINAL_SOURCE_PATH, + terminal_binding_path=TERMINAL_BINDING_PATH, + ) + + +def _validate_gate_provenance_at_path( + value: Any, + *, + predecessor_receipt_sha256: str, + terminal_pin: TerminalCertificatePinR11, + terminal_source_path: Path, +) -> None: + _require( + type(value) is dict + and set(value) + == { + "schema", + "gate_source", + "r9_runner_source", + "terminal_validator_source", + "terminal_binding_schema", + "terminal_binding_status", + "terminal_validator_name", + "predecessor_schema", + "predecessor_receipt_sha256", + "launch_authorized_by_this_candidate", + }, + "R11 gate provenance fields changed", + ) + expected = _gate_provenance_at_paths( + predecessor_receipt_sha256, + terminal_pin=terminal_pin, + terminal_source_path=terminal_source_path, + ) + _require(value == expected, "R11 gate provenance changed") + + +def _validate_r11_release_value_at_paths( + release: Mapping[str, Any], + *, + terminal_pin: TerminalCertificatePinR11, + terminal_source_path: Path, + terminal_binding_path: Path, +) -> tuple[dict[str, Any], dict[str, Any], dict[str, Any]]: + _require( + type(release) is dict + and set(release) == PREDECESSOR_FIELDS | R11_ADDITIONAL_FIELDS + and release.get("schema") == SCHEMA_R11 + and release.get("status") == RELEASE_STATUS, + "R11 external release fields/schema/status changed", + ) + certified = copy.deepcopy(release) + unsigned = copy.deepcopy(certified) + signed = _sha(unsigned.pop("receipt_sha256", None), "R11 release receipt") + _require( + canonical_sha256(unsigned, domain=SCHEMA_R11) == signed, + "R11 external release signature changed", + ) + gate = certified["certification_gate"] + _require( + isinstance(gate, Mapping), + "R11 gate provenance is not a mapping", + ) + predecessor_receipt = _sha( + gate.get("predecessor_receipt_sha256"), + "R11 predecessor receipt", + ) + _validate_gate_provenance_at_path( + gate, + predecessor_receipt_sha256=predecessor_receipt, + terminal_pin=terminal_pin, + terminal_source_path=terminal_source_path, + ) + evidence = _validate_certification_bindings_at_paths( + certified["certification_bindings"], + terminal_pin=terminal_pin, + terminal_source_path=terminal_source_path, + terminal_binding_path=terminal_binding_path, + ) + predecessor = copy.deepcopy(certified) + predecessor.pop("certification_bindings") + predecessor.pop("certification_gate") + predecessor.pop("receipt_sha256") + predecessor["schema"] = PREDECESSOR_SCHEMA + predecessor["receipt_sha256"] = predecessor_receipt + validated_predecessor, observed_receipt = _validate_predecessor_release( + predecessor + ) + _require( + observed_receipt == predecessor_receipt, + "R11 predecessor receipt reconstruction changed", + ) + return certified, validated_predecessor, evidence + + +def validate_r11_release_value( + release: Mapping[str, Any], + *, + terminal_pin: TerminalCertificatePinR11, +) -> tuple[dict[str, Any], dict[str, Any], dict[str, Any]]: + """Validate the signed R11 release at fixed production paths.""" + + return _validate_r11_release_value_at_paths( + release, + terminal_pin=terminal_pin, + terminal_source_path=TERMINAL_SOURCE_PATH, + terminal_binding_path=TERMINAL_BINDING_PATH, + ) + + +def _function_identity( + function: Any, + *, + name: str, + source_path: Path, + signature: str, + label: str, +) -> None: + _require( + inspect.isfunction(function) + and function.__name__ == name + and Path(function.__code__.co_filename) == source_path + and str(inspect.signature(function)) == signature, + f"{label} function identity changed", + ) + + +def _validate_actual_r9_module(module: ModuleType) -> dict[str, Any]: + _require(type(module) is ModuleType, "R11 installer requires one real module") + _require( + Path(str(getattr(module, "__file__", ""))) == R9_SOURCE_PATH, + "R11 installer did not receive the exact R9 runner module", + ) + for path, sha256, size, label in ( + (R9_SOURCE_PATH, R9_SOURCE_SHA256, R9_SOURCE_BYTES, "R9 runner"), + (R8_SOURCE_PATH, R8_SOURCE_SHA256, R8_SOURCE_BYTES, "R8 runner"), + (R3_SOURCE_PATH, R3_SOURCE_SHA256, R3_SOURCE_BYTES, "R3 runner"), + (R2_SOURCE_PATH, R2_SOURCE_SHA256, R2_SOURCE_BYTES, "R2 runner"), + (R1_SOURCE_PATH, R1_SOURCE_SHA256, R1_SOURCE_BYTES, "R1 runner"), + ): + _read_exact_file( + path, + expected_sha256=sha256, + expected_size_bytes=size, + label=f"native-eight {label} source", + require_read_only=False, + ) + r8 = getattr(module, "_r8", None) + r3 = getattr(module, "_r3", None) + r2 = getattr(module, "_r2", None) + core = getattr(module, "_core", None) + _require( + all(type(value) is ModuleType for value in (r8, r3, r2, core)) + and r3 is r8._r3 + and r2 is r8._r2 + and core is r8._core + and r2 is r3._r2 + and core is r3._core + and core is r2._core, + "R9/R8/R3/R2/core module graph changed", + ) + _require( + Path(r8.__file__) == R8_SOURCE_PATH + and Path(r3.__file__) == R3_SOURCE_PATH + and Path(r2.__file__) == R2_SOURCE_PATH + and module.RUNNER_PATH == R9_SOURCE_PATH + and r3.RUNNER_SOURCE_PATH == R9_SOURCE_PATH + and r2.RUNNER_SOURCE_PATH == R9_SOURCE_PATH + and r3.WRAPPER_SOURCE_PATH == module.WRAPPER_PATH + and r2.WRAPPER_SOURCE_PATH == module.WRAPPER_PATH + and r3.SBATCH_SOURCE_PATH == module.SBATCH_PATH + and r2.SBATCH_SOURCE_PATH == module.SBATCH_PATH + and r3._parse_sbatch_directives_r3 + is module._parse_sbatch_directives_r9, + "R9 isolated source/path rebinding changed", + ) + predecessor_validator = r3._validate_external_release_r3 + predecessor_pre_submit = r3.validate_pre_submit_release_r3 + freshness_validator = r3.validate_pre_submit_freshness_r3 + _require( + r2._validate_external_release_r2 is predecessor_validator + and not getattr( + predecessor_validator, "_review_a5_r11_certification_gate", False + ) + and not hasattr(module, "_review_a5_r11_gate_installation"), + "R9 release gate was already installed or replaced", + ) + _function_identity( + predecessor_validator, + name="_validate_external_release_r3", + source_path=R3_SOURCE_PATH, + signature=( + "(config: 'Any', *, launch_config_path: 'Path') " + "-> 'Mapping[str, Any]'" + ), + label="R3 external release validator", + ) + _function_identity( + predecessor_pre_submit, + name="validate_pre_submit_release_r3", + source_path=R3_SOURCE_PATH, + signature=( + "(config: 'Any', *, launch_config_path: 'Path', now_utc: 'str') " + "-> 'Mapping[str, Any]'" + ), + label="R3 pre-submit validator", + ) + _function_identity( + freshness_validator, + name="validate_pre_submit_freshness_r3", + source_path=R3_SOURCE_PATH, + signature=( + "(value: 'Mapping[str, Any]', *, now_utc: 'str') -> 'None'" + ), + label="R3 freshness validator", + ) + _function_identity( + core.load_canonical_json, + name="load_canonical_json", + source_path=R1_SOURCE_PATH, + signature=( + "(path: 'Path', expected_sha256: 'str', *, label: 'str') " + "-> 'dict[str, Any]'" + ), + label="R1 canonical loader", + ) + _function_identity( + module.main, + name="main", + source_path=R9_SOURCE_PATH, + signature="(argv: 'Sequence[str] | None' = None) -> 'int'", + label="R9 main", + ) + _function_identity( + r8.main, + name="main", + source_path=R8_SOURCE_PATH, + signature="(argv: 'Sequence[str] | None' = None) -> 'int'", + label="R8 main", + ) + _function_identity( + r3.main, + name="main", + source_path=R3_SOURCE_PATH, + signature=( + "(argv: 'list[str] | tuple[str, ...] | None' = None) -> 'int'" + ), + label="R3 main", + ) + _function_identity( + r2.main, + name="main", + source_path=R2_SOURCE_PATH, + signature=( + "(argv: 'list[str] | tuple[str, ...] | None' = None) -> 'int'" + ), + label="R2 main", + ) + _function_identity( + core.main, + name="main", + source_path=R1_SOURCE_PATH, + signature="(argv: 'Sequence[str] | None' = None) -> 'int'", + label="R1 main", + ) + _function_identity( + r2._run_training_r2, + name="_run_training_r2", + source_path=R2_SOURCE_PATH, + signature=( + "(launch_config_path: 'Path', *, array_task_id: 'int', " + "resume_mode: 'str') -> 'Mapping[str, Any]'" + ), + label="R2 job-side training entry", + ) + _require( + module.main.__globals__ is module.__dict__ + and module.main.__globals__.get("_r8") is r8 + and r8.main.__globals__ is r8.__dict__ + and r8.main.__globals__.get("_r3") is r3 + and r3.main.__globals__ is r3.__dict__ + and r3.main.__globals__.get("_r2") is r2 + and r2.main.__globals__ is r2.__dict__ + and r2.main.__globals__.get("_core") is core + and core.main.__globals__ is core.__dict__ + and core.run_training is r2._run_training_r2 + and core.main.__globals__.get("run_training") is r2._run_training_r2 + and r2._run_training_r2.__globals__ is r2.__dict__ + and r2._run_training_r2.__globals__.get( + "_validate_external_release_r2" + ) + is predecessor_validator, + "R9 executable main/training route changed", + ) + return { + "r8": r8, + "r3": r3, + "r2": r2, + "core": core, + "predecessor_validator": predecessor_validator, + "predecessor_pre_submit": predecessor_pre_submit, + "freshness_validator": freshness_validator, + "canonical_loader": core.load_canonical_json, + } + + +def _install_r11_external_release_gate_at_paths( + module: ModuleType, + *, + terminal_pin: TerminalCertificatePinR11, + terminal_source_path: Path, + terminal_binding_path: Path, +) -> Mapping[str, Any]: + _require( + type(terminal_pin) is TerminalCertificatePinR11, + "terminal certificate pin type changed", + ) + graph = _validate_actual_r9_module(module) + r3 = graph["r3"] + r2 = graph["r2"] + core = graph["core"] + predecessor_validator = graph["predecessor_validator"] + freshness_validator = graph["freshness_validator"] + original_loader = graph["canonical_loader"] + active = False + + def validate_external_release_r11( + config: Any, *, launch_config_path: Path + ) -> Mapping[str, Any]: + nonlocal active + _require(not active, "R11 external release validation re-entered") + _require( + r2._validate_external_release_r2 is validate_external_release_r11 + and r3._validate_external_release_r3 + is validate_external_release_r11 + and core.load_canonical_json is original_loader, + "R11 installed validator graph changed", + ) + active = True + try: + release_path = Path(config.release_receipt) + release_sha256 = _sha( + config.release_receipt_sha256, + "R11 configured external release", + ) + release = original_loader( + release_path, + release_sha256, + label="native-eight external release receipt", + ) + certified, predecessor, _evidence = ( + _validate_r11_release_value_at_paths( + release, + terminal_pin=terminal_pin, + terminal_source_path=terminal_source_path, + terminal_binding_path=terminal_binding_path, + ) + ) + substitution_count = 0 + + def predecessor_release_loader( + path: Path, expected_sha256: str, *, label: str + ) -> dict[str, Any]: + nonlocal substitution_count + if Path(path) == release_path: + _require( + expected_sha256 == release_sha256 + and label == "native-eight external release receipt" + and substitution_count == 0, + "R11 predecessor loader release identity changed", + ) + substitution_count += 1 + return copy.deepcopy(predecessor) + return original_loader( + path, expected_sha256, label=label + ) + + core.load_canonical_json = predecessor_release_loader + try: + observed = predecessor_validator( + config, launch_config_path=launch_config_path + ) + finally: + core.load_canonical_json = original_loader + _require( + substitution_count == 1 + and core.load_canonical_json is original_loader + and dict(observed) == predecessor, + "R3 predecessor release validation readback changed", + ) + return MappingProxyType(copy.deepcopy(certified)) + finally: + if core.load_canonical_json is not original_loader: + core.load_canonical_json = original_loader + active = False + + def validate_pre_submit_release_r11( + config: Any, *, launch_config_path: Path, now_utc: str + ) -> Mapping[str, Any]: + release = validate_external_release_r11( + config, launch_config_path=launch_config_path + ) + freshness_validator( + release["live_duplicate_preflight"], now_utc=now_utc + ) + return release + + validate_external_release_r11._review_a5_r11_certification_gate = True + validate_pre_submit_release_r11._review_a5_r11_certification_gate = True + r2._validate_external_release_r2 = validate_external_release_r11 + r3._validate_external_release_r3 = validate_external_release_r11 + r3.validate_pre_submit_release_r3 = validate_pre_submit_release_r11 + r3.validate_pre_submit_release_r11 = validate_pre_submit_release_r11 + module.validate_pre_submit_release_r11 = validate_pre_submit_release_r11 + + receipt: dict[str, Any] = { + "schema": INSTALLATION_SCHEMA_R11, + "status": "PASS_ACTUAL_R9_JOB_AND_CONTROLLER_ENTRY_GATED", + "r9_runner_source_sha256": R9_SOURCE_SHA256, + "gate_source": _observe_source_binding( + GATE_SOURCE_PATH, label="R11 certification gate source" + ), + "terminal_certificate_pin": terminal_pin.as_dict(), + "terminal_source_path": os.fspath(Path(terminal_source_path)), + "terminal_binding_path": os.fspath(Path(terminal_binding_path)), + "patched_entries": [ + "_r2._validate_external_release_r2", + "_r3._validate_external_release_r3", + "_r3.validate_pre_submit_release_r3", + "_r3.validate_pre_submit_release_r11", + "r9.validate_pre_submit_release_r11", + ], + "inherited_r3_pre_submit_called": False, + "returns_signed_r11_release": True, + "launch_authorized": False, + } + receipt["receipt_sha256"] = canonical_sha256( + receipt, domain=INSTALLATION_SCHEMA_R11 + ) + installation = MappingProxyType(copy.deepcopy(receipt)) + module._review_a5_r11_gate_installation = installation + return installation + + +def install_r11_external_release_gate( + module: ModuleType, + *, + terminal_pin: TerminalCertificatePinR11, +) -> Mapping[str, Any]: + """Gate the exact R9 graph using only the fixed production R6 paths.""" + + return _install_r11_external_release_gate_at_paths( + module, + terminal_pin=terminal_pin, + terminal_source_path=TERMINAL_SOURCE_PATH, + terminal_binding_path=TERMINAL_BINDING_PATH, + ) + + +def describe_candidate() -> Mapping[str, Any]: + """Describe this preparation without implying launch authorization.""" + + return MappingProxyType( + { + "schema": SCHEMA_R11, + "status": "PREPARATION_ONLY_WAITING_FOR_R6_BINDING_IDENTITY", + "r9_runner_source_sha256": R9_SOURCE_SHA256, + "terminal_source_path": os.fspath(TERMINAL_SOURCE_PATH), + "terminal_source_sha256": TERMINAL_SOURCE_SHA256, + "terminal_source_bytes": TERMINAL_SOURCE_BYTES, + "terminal_binding_path": os.fspath(TERMINAL_BINDING_PATH), + "terminal_binding_schema": TERMINAL_BINDING_SCHEMA_R6, + "terminal_binding_status": TERMINAL_BINDING_STATUS_R6, + "terminal_binding_sha256": "PENDING_AFTER_JOB_11762534_COMPLETES", + "terminal_binding_size_bytes": ( + "PENDING_AFTER_JOB_11762534_COMPLETES" + ), + "terminal_validator_name": TERMINAL_VALIDATOR_NAME, + "training_authorized": False, + "gpu_launch_authorized": False, + "nova_submission_authorized": False, + } + ) + + +__all__ = [ + "CertificationGateR11Error", + "SCHEMA_R11", + "TERMINAL_BINDING_PATH", + "TERMINAL_BINDING_SCHEMA_R6", + "TERMINAL_BINDING_STATUS_R6", + "TERMINAL_SOURCE_PATH", + "TERMINAL_SOURCE_SHA256", + "TERMINAL_SOURCE_BYTES", + "TerminalCertificatePinR11", + "build_certification_bindings", + "build_r11_release", + "canonical_bytes", + "canonical_sha256", + "describe_candidate", + "install_r11_external_release_gate", + "validate_certification_bindings", + "validate_r11_release_value", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_final_bindings_r12.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_final_bindings_r12.py new file mode 100644 index 0000000000000000000000000000000000000000..db2b4b6adbd50d2d40f0f71b2de69056efdffd9d --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_final_bindings_r12.py @@ -0,0 +1,31 @@ +"""Single unresolved source-binding point for the native-eight R12 successor. + +Only this small file is to be replaced after both the terminal R6 certificate +and the isolated utilization layer are frozen. The executable runner rejects +these preparation sentinels. No predecessor or shared runtime is modified. +""" + +SCHEMA = "bertose_review_a5_native_eight_final_bindings_20260725_r12" +STATUS = ( + "PREPARATION_ONLY_WAITING_FOR_R6_TERMINAL_BINDING_" + "AND_OPTIMIZATION_IDENTITY" +) + +R11_SOURCE_SHA256 = "ce7626823c2980bc21b46a7eec6c1961a87dc5512525e553c49f2c7d57bf0430" +R11_SOURCE_BYTES = 49_854 + +R6_TERMINAL_SOURCE_SHA256 = ( + "bdb0fa37804531f6446cee9411c9730fde792eb9674054e56b883156f36da4cb" +) +R6_TERMINAL_SOURCE_BYTES = 133_704 + +R6_TERMINAL_BINDING_SHA256 = "PENDING_JOB_11762534_TERMINAL_BINDING" +R6_TERMINAL_BINDING_BYTES = 0 + +OPTIMIZATION_SOURCE_RELATIVE = "PENDING_ISOLATED_OPTIMIZATION_MODULE" +OPTIMIZATION_SOURCE_SHA256 = "PENDING_ISOLATED_OPTIMIZATION_SHA256" +OPTIMIZATION_SOURCE_BYTES = 0 +OPTIMIZATION_INSTALLER_NAME = "install_optimized_execution_layer" + +TRAINING_AUTHORIZED = False +NOVA_SUBMISSION_AUTHORIZED = False diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_training_runner_r12.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_training_runner_r12.py new file mode 100644 index 0000000000000000000000000000000000000000..2bb6d7b237f434eb6dae1b99757fdb575fdafab6 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_training_runner_r12.py @@ -0,0 +1,661 @@ +"""Minimal R11-integrated successor around the exact native-eight R9 science. + +The R9 runner is loaded byte-for-byte. This outer runner changes no cell, +loss, optimizer, checkpoint, or resume rule. Before delegating to R9 it: + +* exact-loads and installs one separately certified utilization layer; +* exact-loads and installs the final R11 release gate; +* requires one Slurm task and exactly one CUDA-visible device; and +* rebinds only the wrapper/sbatch paths and their audited launcher parser. + +The one small ``review_a5_native_eight_final_bindings_r12.py`` file remains +preparation-only until final R6, R11, and utilization-layer identities freeze. +""" + +from __future__ import annotations + +import argparse +import hashlib +import inspect +import json +import os +from pathlib import Path +import re +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping, Sequence + + +SCHEMA_R12 = "bertose_review_a5_native_eight_training_20260725_r12_r11_integrated" +RUNNER_PATH = Path(__file__).absolute() +RUNTIME_DIRECTORY = RUNNER_PATH.parent +WRAPPER_PATH = RUNTIME_DIRECTORY / "run_review_a5_native_eight_training_r12.py" +BINDING_SOURCE_PATH = ( + RUNTIME_DIRECTORY / "review_a5_native_eight_final_bindings_r12.py" +) +PROJECT_ROOT = RUNNER_PATH.parents[5] +WRITING_ROOT = PROJECT_ROOT / "writing" + +R9_SOURCE_PATH = ( + WRITING_ROOT + / "review/multimodal/runtime" + / "a5_native_eight_training_20260724_r9_isolated_path" + / "review_a5_native_eight_training_runner_r9.py" +) +R9_SOURCE_SHA256 = "4430560565a18da0e68700d60526d3dec15fabd79854111d1e85deb59e2381c8" +R9_SOURCE_BYTES = 7_443 +R11_SOURCE_PATH = ( + WRITING_ROOT + / "review/multimodal/runtime" + / "a5_native_eight_training_20260725_r11_certification_gate_candidate" + / "review_a5_native_eight_certification_gate_r11.py" +) + +SBATCH_PATH = ( + WRITING_ROOT + / "review/multimodal/slurm" + / "review_a5_native_eight_seed43_scavenger_20260725_r12_r11.sbatch" +) +LAUNCH_CONFIG_PATH = ( + WRITING_ROOT + / "review/multimodal/inputs" + / "review_a5_native_eight_training_launch_config_20260725_r12_r11.json" +) +ISOLATED_NOVA_ROOT = ( + "/work/ratul1/supantha/" + "bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc" +) +SBATCH_STDOUT = ( + f"{ISOLATED_NOVA_ROOT}/writing/review/multimodal/outputs/" + "review_a5_native8_r12_%A_%a.out" +) +SBATCH_STDERR = ( + f"{ISOLATED_NOVA_ROOT}/writing/review/multimodal/outputs/" + "review_a5_native8_r12_%A_%a.err" +) +SBATCH_WRAPPER_RELATIVE = ( + "writing/review/multimodal/runtime/" + "a5_native_eight_training_20260725_r12_r11_integrated/" + "run_review_a5_native_eight_training_r12.py" +) +SBATCH_CONFIG_RELATIVE = ( + "writing/review/multimodal/inputs/" + "review_a5_native_eight_training_launch_config_20260725_r12_r11.json" +) + +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") +FINAL_BINDING_STATUS = "BOUND_FINAL_R6_R11_AND_OPTIMIZATION_IDENTITIES" +FINAL_BINDING_SCHEMA = "bertose_review_a5_native_eight_final_bindings_20260725_r12" +EXPECTED_INSTALLER_SIGNATURE = "(r9_module: 'ModuleType') -> 'Mapping[str, Any]'" + + +class NativeEightTrainingR12Error(RuntimeError): + """The isolated R12 launch/runtime boundary changed or is not final.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightTrainingR12Error(message) + + +def canonical_bytes(value: Any) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def _read_regular_nofollow( + path: Path, + *, + maximum: int, + require_read_only: bool, +) -> bytes: + absolute = Path(path) + _require( + absolute.is_absolute() + and os.path.normpath(os.fspath(absolute)) == os.fspath(absolute), + f"{absolute} is not an exact absolute path", + ) + flags = os.O_RDONLY | getattr(os, "O_NOFOLLOW", 0) + descriptor = os.open(absolute, flags) + try: + before = os.fstat(descriptor) + _require( + stat.S_ISREG(before.st_mode) + and before.st_nlink == 1 + and 0 < before.st_size <= maximum + and (not require_read_only or before.st_mode & 0o222 == 0), + f"{absolute} is not one bounded immutable regular file", + ) + payload = bytearray() + while len(payload) < before.st_size: + chunk = os.read(descriptor, min(1 << 20, before.st_size - len(payload))) + _require(bool(chunk), f"{absolute} truncated while reading") + payload.extend(chunk) + after = os.fstat(descriptor) + _require( + ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) + == ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ), + f"{absolute} changed while reading", + ) + return bytes(payload) + finally: + os.close(descriptor) + + +def _load_module( + path: Path, + *, + expected_sha256: str, + expected_bytes: int, + name: str, + require_read_only: bool, +) -> ModuleType: + _require( + SHA_RE.fullmatch(expected_sha256) is not None + and type(expected_bytes) is int + and 0 < expected_bytes <= 64 * 1024 * 1024, + f"{path.name} final source binding is unresolved", + ) + raw = _read_regular_nofollow( + path, + maximum=64 * 1024 * 1024, + require_read_only=require_read_only, + ) + _require( + len(raw) == expected_bytes + and hashlib.sha256(raw).hexdigest() == expected_sha256, + f"{path.name} source identity changed", + ) + module = ModuleType(name) + module.__file__ = os.fspath(path) + module.__package__ = "" + sys.modules[name] = module + try: + exec(compile(raw, os.fspath(path), "exec", dont_inherit=True), module.__dict__) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +def _binding_source_value() -> Mapping[str, Any]: + raw = _read_regular_nofollow( + BINDING_SOURCE_PATH, + maximum=64 * 1024, + require_read_only=False, + ) + module = ModuleType("_review_a5_native_eight_final_bindings_r12_observed") + module.__file__ = os.fspath(BINDING_SOURCE_PATH) + exec( + compile(raw, os.fspath(BINDING_SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + names = ( + "SCHEMA", + "STATUS", + "R11_SOURCE_SHA256", + "R11_SOURCE_BYTES", + "R6_TERMINAL_SOURCE_SHA256", + "R6_TERMINAL_SOURCE_BYTES", + "R6_TERMINAL_BINDING_SHA256", + "R6_TERMINAL_BINDING_BYTES", + "OPTIMIZATION_SOURCE_RELATIVE", + "OPTIMIZATION_SOURCE_SHA256", + "OPTIMIZATION_SOURCE_BYTES", + "OPTIMIZATION_INSTALLER_NAME", + "TRAINING_AUTHORIZED", + "NOVA_SUBMISSION_AUTHORIZED", + ) + value = {name: getattr(module, name, None) for name in names} + if value.get("STATUS") == FINAL_BINDING_STATUS: + frozen = _read_regular_nofollow( + BINDING_SOURCE_PATH, + maximum=64 * 1024, + require_read_only=True, + ) + _require( + frozen == raw, + "final R6/R11/optimization binding changed during immutable readback", + ) + return MappingProxyType( + { + **value, + "binding_source_sha256": hashlib.sha256(raw).hexdigest(), + "binding_source_bytes": len(raw), + } + ) + + +def describe_binding() -> Mapping[str, Any]: + value = dict(_binding_source_value()) + value.update( + { + "runner_schema": SCHEMA_R12, + "r9_source_sha256": R9_SOURCE_SHA256, + "training_authorized": False, + "nova_submission_authorized": False, + } + ) + return MappingProxyType(value) + + +def _validate_final_binding(value: Mapping[str, Any]) -> None: + _require( + value.get("SCHEMA") == FINAL_BINDING_SCHEMA + and value.get("STATUS") == FINAL_BINDING_STATUS + and SHA_RE.fullmatch(str(value.get("R11_SOURCE_SHA256", ""))) is not None + and type(value.get("R11_SOURCE_BYTES")) is int + and 0 < value["R11_SOURCE_BYTES"] <= 64 * 1024 * 1024 + and SHA_RE.fullmatch( + str(value.get("R6_TERMINAL_SOURCE_SHA256", "")) + ) + is not None + and type(value.get("R6_TERMINAL_SOURCE_BYTES")) is int + and 0 < value["R6_TERMINAL_SOURCE_BYTES"] <= 64 * 1024 * 1024 + and SHA_RE.fullmatch( + str(value.get("R6_TERMINAL_BINDING_SHA256", "")) + ) + is not None + and type(value.get("R6_TERMINAL_BINDING_BYTES")) is int + and 0 < value["R6_TERMINAL_BINDING_BYTES"] <= 64 * 1024 * 1024 + and type(value.get("OPTIMIZATION_SOURCE_RELATIVE")) is str + and value["OPTIMIZATION_SOURCE_RELATIVE"].startswith( + "review/multimodal/runtime/" + ) + and ".." not in Path(value["OPTIMIZATION_SOURCE_RELATIVE"]).parts + and SHA_RE.fullmatch( + str(value.get("OPTIMIZATION_SOURCE_SHA256", "")) + ) + is not None + and type(value.get("OPTIMIZATION_SOURCE_BYTES")) is int + and 0 < value["OPTIMIZATION_SOURCE_BYTES"] <= 64 * 1024 * 1024 + and value.get("OPTIMIZATION_INSTALLER_NAME") + == "install_optimized_execution_layer" + and value.get("TRAINING_AUTHORIZED") is False + and value.get("NOVA_SUBMISSION_AUTHORIZED") is False, + "final R6/R11/optimization binding is unresolved or changed", + ) + + +def _compatibility_sbatch_source(source: str) -> str: + replacements = { + "#SBATCH --cpus-per-task=8": "#SBATCH --cpus-per-task=4", + f"#SBATCH --output={SBATCH_STDOUT}": ( + "#SBATCH --output=" + f"{ISOLATED_NOVA_ROOT}/writing/review/multimodal/outputs/" + "review_a5_native8_r3_%A_%a.out" + ), + f"#SBATCH --error={SBATCH_STDERR}": ( + "#SBATCH --error=" + f"{ISOLATED_NOVA_ROOT}/writing/review/multimodal/outputs/" + "review_a5_native8_r3_%A_%a.err" + ), + f"RUNNER=${{PROJECT_ROOT}}/{SBATCH_WRAPPER_RELATIVE}": ( + "RUNNER=${PROJECT_ROOT}/writing/review/multimodal/runtime/" + "a5_native_eight_training_20260724_r9_isolated_path/" + "run_review_a5_native_eight_training_r9.py" + ), + f"LAUNCH_CONFIG=${{PROJECT_ROOT}}/{SBATCH_CONFIG_RELATIVE}": ( + "LAUNCH_CONFIG=${PROJECT_ROOT}/writing/review/multimodal/inputs/" + "review_a5_native_eight_training_launch_config_final_r9_isolated.json" + ), + } + compatible = source + for current, predecessor in replacements.items(): + _require( + compatible.count(current + "\n") == 1, + f"R12 sbatch line changed: {current}", + ) + compatible = compatible.replace(current, predecessor) + return compatible + + +def validate_sbatch_surface( + payload: bytes, + *, + inherited_parser: Any | None = None, +) -> Mapping[str, str | None]: + try: + source = payload.decode("ascii") + except UnicodeDecodeError as error: + raise NativeEightTrainingR12Error("R12 sbatch is not ASCII") from error + directives: dict[str, str | None] = {} + for line in source.splitlines(): + if not line.startswith("#SBATCH "): + continue + token = line[len("#SBATCH ") :] + _require( + token.startswith("--") and " " not in token and "\t" not in token, + "R12 sbatch directive spelling changed", + ) + key, separator, argument = token.partition("=") + value = argument if separator else None + _require(key not in directives and (not separator or bool(value)), "R12 sbatch directive changed") + directives[key] = value + expected = { + "--job-name": "a5-native8-s43-r3", + "--partition": "scavenger", + "--account": "ratul-scavenger", + "--qos": "scavenger", + "--nodes": "1", + "--ntasks": "1", + "--cpus-per-task": "8", + "--gres": "gpu:1", + "--mem": "128G", + "--time": "2-00:00:00", + "--array": "0-7", + "--requeue": None, + "--open-mode": "append", + "--export": "NONE", + "--chdir": ISOLATED_NOVA_ROOT, + "--output": SBATCH_STDOUT, + "--error": SBATCH_STDERR, + } + _require( + directives == expected + and "0-7%" not in source + and "--constraint" not in directives + and "--nodelist" not in directives + and all(token not in source.lower() for token in ("gpu:a100", "gpu:v100", "gpu:h100")), + "R12 sbatch is not the exact generic unthrottled native-eight array", + ) + required = ( + "set -euo pipefail", + "export OMP_NUM_THREADS=4", + "export MKL_NUM_THREADS=4", + 'test "${SLURM_NTASKS:?SLURM_NTASKS is required}" = 1', + 'test "${SLURM_CPUS_PER_TASK:?SLURM_CPUS_PER_TASK is required}" = 8', + 'test "${SLURM_GPUS_ON_NODE:?SLURM_GPUS_ON_NODE is required}" = 1', + '[[ "${CUDA_VISIBLE_DEVICES:?CUDA_VISIBLE_DEVICES is required}" != *,* ]]', + 'if [[ -n "${SLURM_STEP_GPUS:-}" ]]; then', + '[[ "${SLURM_STEP_GPUS}" != *,* ]]', + 'exec "${PYTHON}" -I -W error "${RUNNER}"', + '--r6-binding-sha256 "${R6_BINDING_SHA256}"', + '--r6-binding-bytes "${R6_BINDING_BYTES}"', + '--launch-config-sha256 "${LAUNCH_CONFIG_SHA256}"', + '--array-task-id "${SLURM_ARRAY_TASK_ID}"', + "--resume auto", + ) + _require( + all(source.count(fragment) == 1 for fragment in required), + "R12 sbatch singleton-device, binding, config, or resume command changed", + ) + _require( + len( + re.findall( + r"(?m)^LAUNCH_CONFIG_SHA256=(?:[0-9a-f]{64}|FINAL_RELEASE_MUST_PIN_LAUNCH_CONFIG_SHA256)$", + source, + ) + ) + == 1 + and len( + re.findall( + r"(?m)^R6_BINDING_SHA256=(?:[0-9a-f]{64}|FINAL_R6_BINDING_SHA256)$", + source, + ) + ) + == 1 + and len( + re.findall( + r"(?m)^R6_BINDING_BYTES=(?:[1-9][0-9]*|FINAL_R6_BINDING_BYTES)$", + source, + ) + ) + == 1, + "R12 sbatch binding assignments changed", + ) + if inherited_parser is not None: + inherited_parser(_compatibility_sbatch_source(source).encode("ascii")) + return MappingProxyType(directives) + + +def validate_singleton_gpu( + *, + environment: Mapping[str, str], + torch_module: Any, + array_task_id: int, +) -> Mapping[str, Any]: + visible = environment.get("CUDA_VISIBLE_DEVICES", "") + job_gpus = environment.get("SLURM_JOB_GPUS", "") + step_gpus = environment.get("SLURM_STEP_GPUS") + _require( + environment.get("SLURM_NTASKS") == "1" + and environment.get("SLURM_NNODES") == "1" + and environment.get("SLURM_CPUS_PER_TASK") == "8" + and environment.get("SLURM_GPUS_ON_NODE") == "1" + and environment.get("SLURM_ARRAY_TASK_ID") == str(array_task_id) + and str(environment.get("SLURM_ARRAY_JOB_ID", "")).isdigit() + and str(environment.get("SLURM_JOB_ID", "")).isdigit() + and visible not in {"", "-1"} + and len(visible.split(",")) == 1 + and visible.strip() == visible + and job_gpus + and len(job_gpus.split(",")) == 1 + and ( + step_gpus is None + or ( + step_gpus not in {"", "-1"} + and step_gpus.strip() == step_gpus + and len(step_gpus.split(",")) == 1 + ) + ), + "Slurm task/allocation does not bind exactly one visible GPU", + ) + cuda = getattr(torch_module, "cuda", None) + _require( + cuda is not None + and cuda.is_available() is True + and cuda.device_count() == 1, + "PyTorch does not observe exactly one CUDA device", + ) + cuda.set_device(0) + _require(cuda.current_device() == 0, "PyTorch current CUDA device is not logical device zero") + properties = cuda.get_device_properties(0) + name = str(getattr(properties, "name", "")).strip() + total_memory = int(getattr(properties, "total_memory", 0)) + _require(bool(name) and total_memory > 0, "CUDA device properties are incomplete") + return MappingProxyType( + { + "status": "PASS_EXACT_SINGLETON_SLURM_CUDA_BINDING", + "array_task_id": array_task_id, + "cuda_visible_devices": visible, + "slurm_job_gpus": job_gpus, + "slurm_gpus_on_node": environment["SLURM_GPUS_ON_NODE"], + "slurm_step_gpus": step_gpus, + "torch_cuda_device_count": 1, + "torch_current_device": 0, + "device_name": name, + "device_total_memory": total_memory, + "device_model_constrained": False, + } + ) + + +def install_bound_runtime( + *, + r9: ModuleType, + r11: ModuleType, + optimization: ModuleType, + binding: Mapping[str, Any], +) -> Mapping[str, Any]: + """Install the two isolated layers in deterministic order for tests/jobs.""" + + _validate_final_binding(binding) + r9.WRAPPER_PATH = WRAPPER_PATH + r9.SBATCH_PATH = SBATCH_PATH + r9._r3.WRAPPER_SOURCE_PATH = WRAPPER_PATH + r9._r2.WRAPPER_SOURCE_PATH = WRAPPER_PATH + r9._r3.SBATCH_SOURCE_PATH = SBATCH_PATH + r9._r2.SBATCH_SOURCE_PATH = SBATCH_PATH + inherited_parser = r9._parse_sbatch_directives_r9 + + def parser(payload: bytes) -> Mapping[str, str | None]: + return validate_sbatch_surface(payload, inherited_parser=inherited_parser) + + r9._parse_sbatch_directives_r9 = parser + r9._r3._parse_sbatch_directives_r3 = parser + + installer_name = str(binding["OPTIMIZATION_INSTALLER_NAME"]) + installer = getattr(optimization, installer_name, None) + _require( + inspect.isfunction(installer) + and installer.__name__ == installer_name, + "optimization installer API changed", + ) + optimization_receipt = installer(r9) + _require( + isinstance(optimization_receipt, Mapping) + and optimization_receipt.get("exact_fp32_math_preserved") is True + and optimization_receipt.get("checkpoint_semantics_preserved") is True + and optimization_receipt.get("per_step_authority_file_reads") == 0, + "optimization installer did not preserve the required science/runtime boundary", + ) + pin = r11.TerminalCertificatePinR11( + source_sha256=binding["R6_TERMINAL_SOURCE_SHA256"], + source_size_bytes=binding["R6_TERMINAL_SOURCE_BYTES"], + binding_sha256=binding["R6_TERMINAL_BINDING_SHA256"], + binding_size_bytes=binding["R6_TERMINAL_BINDING_BYTES"], + binding_schema=r11.TERMINAL_BINDING_SCHEMA_R6, + binding_status=r11.TERMINAL_BINDING_STATUS_R6, + ) + gate_receipt = r11.install_r11_external_release_gate(r9, terminal_pin=pin) + _require( + isinstance(gate_receipt, Mapping) + and gate_receipt.get("status") + == "PASS_ACTUAL_R9_JOB_AND_CONTROLLER_ENTRY_GATED", + "R11 gate installation did not bind the actual R9 entry", + ) + return MappingProxyType( + { + "schema": SCHEMA_R12, + "status": "PASS_OPTIMIZATION_THEN_R11_INSTALLED_BEFORE_R9_MAIN", + "optimization": dict(optimization_receipt), + "r11_gate": dict(gate_receipt), + "r9_source_sha256": R9_SOURCE_SHA256, + "r9_science_checkpoint_bytes_unchanged": True, + "training_authorized": False, + "nova_submission_authorized": False, + } + ) + + +def load_bound_runtime() -> tuple[ + ModuleType, + ModuleType, + Mapping[str, Any], + Mapping[str, Any], +]: + binding = _binding_source_value() + _validate_final_binding(binding) + r9 = _load_module( + R9_SOURCE_PATH, + expected_sha256=R9_SOURCE_SHA256, + expected_bytes=R9_SOURCE_BYTES, + name="_review_a5_native_eight_r9_exact_for_r12", + require_read_only=True, + ) + r11 = _load_module( + R11_SOURCE_PATH, + expected_sha256=str(binding["R11_SOURCE_SHA256"]), + expected_bytes=int(binding["R11_SOURCE_BYTES"]), + name="_review_a5_native_eight_r11_exact_for_r12", + require_read_only=True, + ) + optimization_path = WRITING_ROOT / str(binding["OPTIMIZATION_SOURCE_RELATIVE"]) + optimization = _load_module( + optimization_path, + expected_sha256=str(binding["OPTIMIZATION_SOURCE_SHA256"]), + expected_bytes=int(binding["OPTIMIZATION_SOURCE_BYTES"]), + name="_review_a5_native_eight_optimization_exact_for_r12", + require_read_only=True, + ) + installation = install_bound_runtime( + r9=r9, + r11=r11, + optimization=optimization, + binding=binding, + ) + return r9, r11, binding, installation + + +def _outer_arguments(argv: Sequence[str] | None) -> tuple[argparse.Namespace, list[str]]: + parser = argparse.ArgumentParser(add_help=False) + parser.add_argument("--describe-r12-binding", action="store_true") + parser.add_argument("--r6-binding-sha256") + parser.add_argument("--r6-binding-bytes", type=int) + return parser.parse_known_args(argv) + + +def _array_task_id(argv: Sequence[str]) -> int: + for index, token in enumerate(argv): + if token == "--array-task-id" and index + 1 < len(argv): + value = argv[index + 1] + _require(value in {str(number) for number in range(8)}, "array task is outside 0-7") + return int(value) + raise NativeEightTrainingR12Error("--array-task-id is required for CUDA training") + + +def main(argv: Sequence[str] | None = None) -> int: + outer, remaining = _outer_arguments(argv) + if outer.describe_r12_binding: + print(canonical_bytes(dict(describe_binding())).decode("ascii"), end="") + return 0 + r9, _r11, binding, _installation = load_bound_runtime() + _require( + outer.r6_binding_sha256 == binding["R6_TERMINAL_BINDING_SHA256"] + and outer.r6_binding_bytes == binding["R6_TERMINAL_BINDING_BYTES"], + "sbatch R6 terminal binding pin differs from the final binding source", + ) + structure_only = "--validate-launch-config-only" in remaining or "--describe" in remaining + if not structure_only: + task_id = _array_task_id(remaining) + validate_singleton_gpu( + environment=os.environ, + torch_module=r9._core.torch, + array_task_id=task_id, + ) + return int(r9.main(remaining)) + + +__all__ = [ + "BINDING_SOURCE_PATH", + "NativeEightTrainingR12Error", + "R9_SOURCE_SHA256", + "R9_SOURCE_BYTES", + "SBATCH_PATH", + "SCHEMA_R12", + "canonical_bytes", + "describe_binding", + "install_bound_runtime", + "load_bound_runtime", + "main", + "validate_sbatch_surface", + "validate_singleton_gpu", +] + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/run_review_a5_native_eight_training_r12.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/run_review_a5_native_eight_training_r12.py new file mode 100644 index 0000000000000000000000000000000000000000..cfcfa595f0025fa62d7b6e089ec0d177185fa285 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/run_review_a5_native_eight_training_r12.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +"""Hash-pinned CLI for the preparation-only native-eight R12 successor.""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import stat +import sys +from types import ModuleType + + +SOURCE_SHA256 = "47e973c7c4ed5bc6686e5d7795b00d3eea5c2da8c2a15fc534a7cc24c1744ee1" +SOURCE_BYTES = 23_200 +SOURCE_PATH = ( + Path(__file__).absolute().parent + / "review_a5_native_eight_training_runner_r12.py" +) + + +def _load() -> ModuleType: + descriptor = os.open( + SOURCE_PATH, + os.O_RDONLY | getattr(os, "O_NOFOLLOW", 0), + ) + try: + before = os.fstat(descriptor) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or before.st_size != SOURCE_BYTES + ): + raise RuntimeError("native-eight R12 source identity changed") + raw = bytearray() + while len(raw) < before.st_size: + chunk = os.read(descriptor, min(1 << 20, before.st_size - len(raw))) + if not chunk: + raise RuntimeError("native-eight R12 source truncated") + raw.extend(chunk) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ): + raise RuntimeError("native-eight R12 source changed while reading") + finally: + os.close(descriptor) + payload = bytes(raw) + if hashlib.sha256(payload).hexdigest() != SOURCE_SHA256: + raise RuntimeError("native-eight R12 source SHA-256 changed") + name = "_review_a5_native_eight_training_r12_pinned_cli" + module = ModuleType(name) + module.__file__ = os.fspath(SOURCE_PATH) + module.__package__ = "" + sys.modules[name] = module + try: + exec( + compile(payload, os.fspath(SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + return module + + +if __name__ == "__main__": + raise SystemExit(_load().main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_direct_submit_controller_r13.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_direct_submit_controller_r13.py new file mode 100644 index 0000000000000000000000000000000000000000..9b9d71fa055b6bf946333c9910aaee9625517fac --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_direct_submit_controller_r13.py @@ -0,0 +1,939 @@ +"""One-shot, receipt-persisting controller for the final R13 native-eight array. + +Production uses only the fixed Slurm binaries and fixed R13 paths. Focused +tests may explicitly inject a scheduler, clock, temporary closure, and receipt +path. There is no retry, fallback, hold, release, cancellation, or second +submission path. +""" + +from __future__ import annotations + +import copy +from datetime import datetime, timezone +import hashlib +import json +import os +from pathlib import Path +import re +import subprocess +from typing import Any, Callable, Mapping, Sequence + +from review.multimodal.runtime.a5_native_eight_training_20260726_r13_final_candidate import ( + review_a5_native_eight_training_runner_r13 as runner, +) +from review.multimodal.scripts import ( + build_review_a5_native_eight_r11_successor_20260726_r13 as builder, +) + + +SCHEMA = ( + "bertose_review_a5_native_eight_direct_submit_controller_20260726_r13" +) +SQUEUE_POST_FORMAT = "%F|%K|%j|%T|%b" +SQUEUE_POST_ARGV_PREFIX = ("/usr/bin/squeue", "-h", "-r", "-j") +SBATCH_ARGV_PREFIX = ("/usr/bin/sbatch", "--parsable") +SCONTROL_ARGV_PREFIX = ("/usr/bin/scontrol", "show", "job", "-o") +JOB_ID_RE = re.compile(r"[1-9][0-9]*\Z") +TASKS = frozenset(range(8)) +PRODUCTION_SUBMISSION_RECEIPT_PATH = ( + runner.WRITING_ROOT + / "review/multimodal/outputs" + / "review_a5_native_eight_r11_handoff_20260726_r13" + / "review_submission_ledger" + / "review_a5_native_eight_submission_receipt_20260726_r13.json" +) +SUBMISSION_FENCE_SUFFIX = "_one_shot_fence" +ACCEPTANCE_TOMBSTONE_SUFFIX = "_accepted_job_tombstone" + + +class NativeEightDirectSubmitR13Error(RuntimeError): + """The immutable bundle, one-shot submission, or readback failed closed.""" + + +class NativeEightSubmittedButUncertifiedR13Error( + NativeEightDirectSubmitR13Error +): + """Slurm accepted the job but receipt certification did not complete.""" + + def __init__(self, job_id: str, message: str): + super().__init__(f"submitted job {job_id} is uncertified: {message}") + self.job_id = job_id + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightDirectSubmitR13Error(message) + + +def canonical_bytes(value: Any) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def _canonical_sha256(value: Any, *, domain: str) -> str: + return hashlib.sha256( + domain.encode("ascii") + b"\0" + canonical_bytes(value) + ).hexdigest() + + +def _utc_now() -> datetime: + return datetime.now(timezone.utc) + + +def _parse_utc(value: Any, *, label: str) -> datetime: + _require( + type(value) is str + and re.fullmatch( + r"20[0-9]{2}-[0-9]{2}-[0-9]{2}T" + r"[0-9]{2}:[0-9]{2}:[0-9]{2}Z", + value, + ) + is not None, + f"{label} is not canonical UTC", + ) + try: + return datetime.strptime(value, "%Y-%m-%dT%H:%M:%SZ").replace( + tzinfo=timezone.utc + ) + except ValueError as error: + raise NativeEightDirectSubmitR13Error( + f"{label} is invalid" + ) from error + + +def _read_immutable(path: Path, *, maximum: int) -> bytes: + return runner.read_regular_nofollow( + path, + maximum=maximum, + require_read_only=True, + ) + + +def _read_canonical( + path: Path, + *, + expected: Mapping[str, Any] | None = None, +) -> dict[str, Any]: + payload = _read_immutable(path, maximum=64 * 1024 * 1024) + if expected is not None: + _require( + dict(expected) + == { + "absolute_path": os.fspath(path), + "sha256": hashlib.sha256(payload).hexdigest(), + "bytes": len(payload), + }, + f"{path.name} differs from its exact bundle binding", + ) + try: + value = json.loads(payload.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightDirectSubmitR13Error( + f"{path.name} is not canonical JSON" + ) from error + _require( + type(value) is dict and canonical_bytes(value) == payload, + f"{path.name} JSON bytes changed", + ) + return value + + +def _file_identity(path: Path) -> dict[str, Any]: + payload = _read_immutable(path, maximum=64 * 1024 * 1024) + return { + "absolute_path": os.fspath(path), + "sha256": hashlib.sha256(payload).hexdigest(), + "bytes": len(payload), + } + + +def _validate_bundle_receipt( + *, + path: Path, + paths: builder.BundlePaths, + source_closure_paths: Mapping[str, Path], + production: bool, +) -> tuple[dict[str, Any], Mapping[str, Any]]: + _require( + path == paths.bundle_receipt, + "R13 bundle receipt path changed", + ) + value = _read_canonical(path) + unsigned = copy.deepcopy(value) + signed = unsigned.pop("receipt_sha256", None) + _require( + value.get("schema") == builder.SCHEMA + and value.get("status") + == ( + "PASS_R11_INTEGRATED_NATIVE_EIGHT_R13_BUNDLE_" + "PREPARED_NOT_SUBMITTED" + ) + and signed == _canonical_sha256(unsigned, domain=builder.SCHEMA) + and value.get("semantic_array_id") == builder.SEMANTIC_ARRAY_ID + and value.get("array") == "0-7" + and value.get("gres") == "gpu:1" + and value.get("cpus_per_task") == 8 + and value.get("omp_threads") == 4 + and value.get("mkl_threads") == 4 + and value.get("concurrency_throttle") is None + and value.get("constraint") is None + and value.get("preflight_freshness_seconds") + == builder.PREFLIGHT_FRESHNESS_SECONDS + and value.get("scheduler_read_call_count") == 1 + and value.get("scheduler_mutation_call_count") == 0 + and value.get("submission_call_count") == 0 + and value.get("historical_base_release_freshness_relied_upon") + is False + and value.get("new_r13_duplicate_preflight_freshness_required") + is True + and value.get("completed_production_epoch_resume_certified") is False + and value.get("resume_evidence_scope") + == ( + "exact_checkpoint_boundary_fixtures_only;" + "no_completed_production_epoch_claim" + ) + and value.get("experiment_unchanged_from_r9") is True + and value.get("checkpoint_schema_unchanged_from_r9") is True + and value.get("sequence_vocab_compatibility_required") is True + and value.get("training_authorized") is False + and value.get("nova_submission_authorized") is False + and value.get("production_inputs") is production, + "R13 bundle identity, science, or launch boundary changed", + ) + _require( + value.get("r9_runner") == _file_identity(runner.R9_SOURCE_PATH), + "R13 exact R9 runner binding changed", + ) + files = value.get("files") + _require( + type(files) is dict and len(files) == 5, + "R13 bundle file roster changed", + ) + expected_file_paths = { + paths.scheduler_scan, + paths.output_scan, + paths.external_release, + paths.launch_config, + paths.sbatch, + } + _require( + { + Path(binding.get("absolute_path", "")) + for binding in files.values() + if isinstance(binding, Mapping) + } + == expected_file_paths, + "R13 bundle does not bind the exact five artifact paths", + ) + sbatch_binding: Mapping[str, Any] | None = None + for binding in files.values(): + _require( + type(binding) is dict + and set(binding) == {"absolute_path", "sha256", "bytes"}, + "R13 bundle file binding changed", + ) + file_path = Path(binding["absolute_path"]) + observed = _file_identity(file_path) + _require(observed == binding, f"R13 bundle file changed: {file_path}") + if file_path == paths.sbatch: + sbatch_binding = binding + _require( + sbatch_binding is not None, + "submitted sbatch is absent from the R13 bundle", + ) + + expected_paths = dict(source_closure_paths) + closure = value.get("source_closure") + _require( + type(closure) is dict + and set(closure) == set(expected_paths) + and all(path.is_absolute() for path in expected_paths.values()), + "R13 source closure roster changed", + ) + for name, expected_path in expected_paths.items(): + _require( + closure[name] == _file_identity(expected_path), + f"R13 source closure changed: {name}", + ) + if production: + binding = runner._binding_source_value() + smoke = value.get("model_construction_smoke") + _require( + isinstance(smoke, Mapping), + "production model-construction smoke is absent", + ) + runner.validate_model_construction_smoke_receipt(smoke) + _require( + paths == builder.BundlePaths.production() + and expected_paths + == builder.production_source_closure_paths(binding), + "production controller paths were caller-replaced", + ) + else: + _require( + value.get("model_construction_smoke") is None, + "test bundle injected a production model smoke", + ) + return value, sbatch_binding + + +def _fresh_duplicate_output_preflight( + *, + scheduler: builder.Scheduler, + clock: builder.Clock, + output_roots: Mapping[str, str], +) -> tuple[str, str]: + started = clock() + result = scheduler(builder.SQUEUE_ARGV) + _require( + type(result) is builder.CommandResult + and result.returncode == 0 + and result.stderr == "", + "immediate pre-submit scheduler scan failed", + ) + matches: set[str] = set() + for line in result.stdout.splitlines(): + columns = line.split("|") + _require( + len(columns) == 5, + "immediate scheduler row is malformed", + ) + array_job, task, job_name, state, reason = columns + _require( + array_job.isdigit() + and (task.isdigit() or task in {"", "N/A"}) + and bool(state) + and bool(reason), + "immediate scheduler row fields are malformed", + ) + if builder.is_native_eight_duplicate_job_name(job_name): + matches.add(array_job) + _require( + not matches, + "an active native-eight array exists immediately before submission", + ) + _require( + set(output_roots) == set(builder.CELL_ORDER) + and not any(os.path.lexists(path) for path in output_roots.values()), + "a native-eight cell output exists immediately before submission", + ) + finished = clock() + elapsed = (finished - started).total_seconds() + _require( + 0 <= elapsed <= builder.PREFLIGHT_FRESHNESS_SECONDS, + "immediate preflight exceeded 300 seconds", + ) + return builder._utc(started), builder._utc(finished) + + +def _rehash_source_closure( + source_closure_paths: Mapping[str, Path], + expected: Mapping[str, Any], +) -> Mapping[str, Any]: + observed = { + name: _file_identity(path) + for name, path in sorted(source_closure_paths.items()) + } + _require( + observed == dict(expected), + "R13 source closure changed immediately before sbatch", + ) + return observed + + +def _rehash_sbatch( + path: Path, + expected: Mapping[str, Any], +) -> None: + observed = _file_identity(path) + _require( + observed == dict(expected), + "R13 sbatch changed immediately before submission", + ) + runner.validate_sbatch_surface( + _read_immutable(path, maximum=4 * 1024 * 1024) + ) + + +def _validate_production_launch_release( + *, + paths: builder.BundlePaths, + now_utc: str, +) -> None: + r9, _r11, _binding, _installation = runner.load_bound_runtime() + config = r9.LaunchConfig.load(paths.launch_config) + observed = r9.validate_pre_submit_release_r11( + config, + launch_config_path=paths.launch_config, + now_utc=now_utc, + ) + release = _read_canonical(paths.external_release) + _require( + dict(observed) == release + and config.semantic_array_id == builder.SEMANTIC_ARRAY_ID + and config.source_value["array_spec"] == "0-7" + and config.source_value["cell_order"] == list(builder.CELL_ORDER) + and config.source_value["common_seed"] == 43 + and config.source_value["maximum_epochs"] == 100 + and config.source_value["patience"] == 15 + and config.source_value["loss_denominator"] == 4 + and config.source_value["scheduler"] + == { + "partition": "scavenger", + "account": "ratul-scavenger", + "qos": "scavenger", + "gres": "gpu:1", + "array": "0-7", + "concurrency_throttle": None, + "constraint": None, + }, + "production launch config or R11 release validation changed", + ) + + +def _parse_job_id(stdout: str) -> str: + value = stdout.strip() + parts = value.split(";") + _require( + len(parts) in {1, 2} + and JOB_ID_RE.fullmatch(parts[0]) is not None + and ( + len(parts) == 1 + or re.fullmatch(r"[A-Za-z0-9_.-]+", parts[1]) is not None + ), + "sbatch --parsable returned a malformed job identity", + ) + return parts[0] + + +def _parse_key_values(line: str) -> dict[str, str]: + fields: dict[str, str] = {} + for token in line.strip().split(): + _require("=" in token, "scontrol readback token is malformed") + key, value = token.split("=", 1) + _require( + bool(key) and key not in fields, + "scontrol readback key is empty or duplicated", + ) + fields[key] = value + return fields + + +def _parse_tres(value: str, *, label: str) -> dict[str, str]: + result: dict[str, str] = {} + for token in value.split(","): + _require("=" in token, f"{label} contains a malformed TRES token") + key, count = token.split("=", 1) + _require( + bool(key) and bool(count) and key not in result, + f"{label} contains a duplicate TRES", + ) + result[key] = count + _require( + result.get("gres/gpu") == "1" + and not any(key.startswith("gres/gpu:") for key in result), + f"{label} is not generic one-GPU TRES", + ) + return result + + +def validate_post_submit_receipt( + *, + job_id: str, + expanded_squeue: builder.CommandResult, + scontrol: builder.CommandResult, +) -> Mapping[str, Any]: + """Require exactly tasks 0-7 and the exact generic Scavenger request.""" + + _require( + JOB_ID_RE.fullmatch(job_id) is not None, + "post-submit job ID is malformed", + ) + _require( + type(expanded_squeue) is builder.CommandResult + and expanded_squeue.returncode == 0 + and expanded_squeue.stderr == "" + and type(scontrol) is builder.CommandResult + and scontrol.returncode == 0 + and scontrol.stderr == "", + "post-submit scheduler readback failed", + ) + tasks: set[int] = set() + states: dict[str, str] = {} + for line in expanded_squeue.stdout.splitlines(): + columns = line.split("|") + _require( + len(columns) == 5, + "expanded post-submit squeue row is malformed", + ) + array_job, task, job_name, state, gres = columns + _require( + array_job == job_id + and task.isdigit() + and int(task) in TASKS + and job_name == builder.STABLE_JOB_NAME + and bool(state) + and gres == "gpu:1", + "post-submit task, job, or GRES readback changed", + ) + _require( + int(task) not in tasks, + "post-submit array task is duplicated", + ) + tasks.add(int(task)) + states[task] = state + _require(tasks == TASKS, "post-submit array is not exactly tasks 0-7") + + lines = [line for line in scontrol.stdout.splitlines() if line.strip()] + _require( + len(lines) == 1, + "scontrol did not return exactly one array-parent row", + ) + fields = _parse_key_values(lines[0]) + req_tres = _parse_tres( + fields.get("ReqTRES", ""), + label="scontrol ReqTRES", + ) + tres_per_node = fields.get( + "TresPerNode", + fields.get("TRESPerNode", ""), + ) + _require( + fields.get("JobId") == job_id + and fields.get("JobName") == builder.STABLE_JOB_NAME + and fields.get("ArrayTaskId") == "0-7" + and fields.get("Partition") == "scavenger" + and fields.get("Account") == "ratul-scavenger" + and fields.get("QOS") == "scavenger" + and fields.get("NumNodes") == "1" + and fields.get("NumTasks") == "1" + and fields.get("CPUs/Task") == "8" + and fields.get("Requeue") == "1" + and tres_per_node == "gres/gpu:1" + and fields.get("Features", "(null)") in {"(null)", ""} + and req_tres["gres/gpu"] == "1", + "post-submit scheduler or generic-GPU boundary changed", + ) + return { + "schema": SCHEMA, + "status": ( + "PASS_ONE_EXACT_NATIVE_EIGHT_ARRAY_TASKS_0_7_GENERIC_GPU1" + ), + "job_id": job_id, + "task_ids": list(range(8)), + "task_states": states, + "requested_tres": req_tres, + "tres_per_node": tres_per_node, + "partition": "scavenger", + "account": "ratul-scavenger", + "qos": "scavenger", + "constraint": None, + "concurrency_throttle": None, + "second_submission_call_count": 0, + } + + +def _production_scheduler(argv: Sequence[str]) -> builder.CommandResult: + _require( + tuple(argv[: len(SBATCH_ARGV_PREFIX)]) == SBATCH_ARGV_PREFIX + or tuple(argv[: len(SCONTROL_ARGV_PREFIX)]) == SCONTROL_ARGV_PREFIX + or tuple(argv[:4]) == SQUEUE_POST_ARGV_PREFIX + or tuple(argv) == builder.SQUEUE_ARGV, + "production scheduler command is outside the fixed controller surface", + ) + completed = subprocess.run( + list(argv), + check=False, + capture_output=True, + text=True, + timeout=30, + ) + return builder.CommandResult( + completed.returncode, + completed.stdout, + completed.stderr, + ) + + +def _open_directory_nofollow(path: Path) -> int: + _require(path.is_absolute(), "receipt directory is not absolute") + flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, flags) + for component in path.parts[1:]: + child = os.open(component, flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + return descriptor + except OSError as error: + if descriptor is not None: + os.close(descriptor) + raise NativeEightDirectSubmitR13Error( + "receipt parent is not one no-follow directory path" + ) from error + + +def _prepare_receipt_parent(path: Path) -> None: + path.parent.mkdir(mode=0o700, parents=True, exist_ok=True) + descriptor = _open_directory_nofollow(path.parent) + os.close(descriptor) + + +def _fence_path(submission_receipt_path: Path) -> Path: + return submission_receipt_path.with_name( + submission_receipt_path.stem + + SUBMISSION_FENCE_SUFFIX + + submission_receipt_path.suffix + ) + + +def _acceptance_path(submission_receipt_path: Path) -> Path: + return submission_receipt_path.with_name( + submission_receipt_path.stem + + ACCEPTANCE_TOMBSTONE_SUFFIX + + submission_receipt_path.suffix + ) + + +def _publish_receipt_exclusive(path: Path, payload: bytes) -> None: + _require( + path.is_absolute() + and path.name.startswith("review_") + and not os.path.lexists(path), + "submission receipt target is unsafe or already exists", + ) + parent_descriptor = _open_directory_nofollow(path.parent) + descriptor: int | None = None + try: + try: + descriptor = os.open( + path.name, + os.O_WRONLY + | os.O_CREAT + | os.O_EXCL + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0), + 0o600, + dir_fd=parent_descriptor, + ) + view = memoryview(payload) + while view: + written = os.write(descriptor, view) + _require(written > 0, "submission receipt write stalled") + view = view[written:] + os.fsync(descriptor) + os.fchmod(descriptor, 0o400) + os.fsync(descriptor) + finally: + if descriptor is not None: + os.close(descriptor) + os.fsync(parent_descriptor) + finally: + os.close(parent_descriptor) + _require( + _read_immutable(path, maximum=len(payload)) == payload, + "immutable submission receipt readback changed", + ) + + +def _submit_once_bound( + *, + paths: builder.BundlePaths, + output_roots: Mapping[str, str], + submission_receipt_path: Path, + source_closure_paths: Mapping[str, Path], + scheduler: builder.Scheduler, + clock: builder.Clock, + production: bool, +) -> Mapping[str, Any]: + """Internal one-shot implementation; public production has no injections.""" + + bundle, sbatch_binding = _validate_bundle_receipt( + path=paths.bundle_receipt, + paths=paths, + source_closure_paths=source_closure_paths, + production=production, + ) + runner.validate_sbatch_surface( + _read_immutable(paths.sbatch, maximum=4 * 1024 * 1024) + ) + _prepare_receipt_parent(submission_receipt_path) + fence_path = _fence_path(submission_receipt_path) + acceptance_path = _acceptance_path(submission_receipt_path) + _require( + not os.path.lexists(submission_receipt_path) + and not os.path.lexists(fence_path) + and not os.path.lexists(acceptance_path), + ( + "immutable submission receipt, one-shot fence, or accepted-job " + "tombstone already exists" + ), + ) + now = clock() + observed = _parse_utc( + bundle["observed_at_utc"], + label="bundle observation", + ) + validated = _parse_utc( + bundle["validated_at_utc"], + label="bundle validation", + ) + current = now.astimezone(timezone.utc) + _require( + observed <= validated <= current + and (current - observed).total_seconds() + <= builder.PREFLIGHT_FRESHNESS_SECONDS, + "prepared R13 bundle is stale before direct submission", + ) + if production: + _validate_production_launch_release( + paths=paths, + now_utc=builder._utc(now), + ) + immediate_observed, immediate_validated = ( + _fresh_duplicate_output_preflight( + scheduler=scheduler, + clock=clock, + output_roots=output_roots, + ) + ) + fence_unsigned = { + "schema": SCHEMA, + "status": "ONE_SHOT_SUBMISSION_FENCE_CREATED_BEFORE_SBATCH", + "semantic_array_id": builder.SEMANTIC_ARRAY_ID, + "bundle_receipt": _file_identity(paths.bundle_receipt), + "sbatch": copy.deepcopy(dict(sbatch_binding)), + "immediate_preflight_observed_at_utc": immediate_observed, + "immediate_preflight_validated_at_utc": immediate_validated, + "automatic_retry_authorized": False, + "automatic_second_array_authorized": False, + "production": production, + } + fence = { + **fence_unsigned, + "receipt_sha256": _canonical_sha256( + fence_unsigned, + domain=SCHEMA, + ), + } + _publish_receipt_exclusive(fence_path, canonical_bytes(fence)) + _rehash_source_closure( + source_closure_paths, + bundle["source_closure"], + ) + _rehash_sbatch(paths.sbatch, sbatch_binding) + + submitted = scheduler( + (*SBATCH_ARGV_PREFIX, os.fspath(paths.sbatch)) + ) + _require( + type(submitted) is builder.CommandResult + and submitted.returncode == 0, + "the one direct sbatch call failed", + ) + sbatch_streams = { + "stdout_sha256": hashlib.sha256( + submitted.stdout.encode() + ).hexdigest(), + "stdout_bytes": len(submitted.stdout.encode()), + "stderr_sha256": hashlib.sha256( + submitted.stderr.encode() + ).hexdigest(), + "stderr_bytes": len(submitted.stderr.encode()), + "stderr_may_contain_scavenger_job_submit_warning": True, + } + try: + job_id = _parse_job_id(submitted.stdout) + except NativeEightDirectSubmitR13Error as error: + raise NativeEightSubmittedButUncertifiedR13Error( + "UNRESOLVED", + ( + "sbatch succeeded but its parsable identity was malformed; " + f"stdout_sha256={sbatch_streams['stdout_sha256']}; " + f"stderr_sha256={sbatch_streams['stderr_sha256']}; " + "the immutable one-shot fence forbids retry" + ), + ) from error + acceptance_unsigned = { + "schema": SCHEMA, + "status": "SBATCH_ACCEPTED_JOB_ID_PERSISTED_BEFORE_READBACK", + "job_id": job_id, + "semantic_array_id": builder.SEMANTIC_ARRAY_ID, + "bundle_receipt": _file_identity(paths.bundle_receipt), + "sbatch": copy.deepcopy(dict(sbatch_binding)), + "one_shot_fence": _file_identity(fence_path), + "sbatch_streams": sbatch_streams, + "automatic_retry_authorized": False, + "automatic_second_array_authorized": False, + "production": production, + } + acceptance = { + **acceptance_unsigned, + "receipt_sha256": _canonical_sha256( + acceptance_unsigned, + domain=SCHEMA, + ), + } + try: + _publish_receipt_exclusive( + acceptance_path, + canonical_bytes(acceptance), + ) + except BaseException as error: + raise NativeEightSubmittedButUncertifiedR13Error( + job_id, + ( + "sbatch returned a valid job ID but the immutable acceptance " + "tombstone could not be persisted; the one-shot fence " + "forbids retry" + ), + ) from error + try: + expanded = scheduler( + (*SQUEUE_POST_ARGV_PREFIX, job_id, "-o", SQUEUE_POST_FORMAT) + ) + controlled = scheduler((*SCONTROL_ARGV_PREFIX, job_id)) + post = validate_post_submit_receipt( + job_id=job_id, + expanded_squeue=expanded, + scontrol=controlled, + ) + unsigned = { + "schema": SCHEMA, + "status": ( + "PASS_ONE_DIRECT_SUBMISSION_EXACT_READBACK_AND_" + "IMMUTABLE_RECEIPT" + ), + "job_id": job_id, + "semantic_array_id": builder.SEMANTIC_ARRAY_ID, + "bundle_receipt": _file_identity(paths.bundle_receipt), + "sbatch": copy.deepcopy(dict(sbatch_binding)), + "one_shot_fence": _file_identity(fence_path), + "accepted_job_tombstone": _file_identity(acceptance_path), + "sbatch_streams": sbatch_streams, + "source_closure_rehashed_immediately_before_sbatch": True, + "immediate_preflight_observed_at_utc": immediate_observed, + "immediate_preflight_validated_at_utc": immediate_validated, + "post_submit": post, + "scheduler_calls": { + "fresh_duplicate_scan": 1, + "sbatch": 1, + "expanded_squeue": 1, + "scontrol": 1, + "retry": 0, + "fallback": 0, + "cancel": 0, + "hold": 0, + "release": 0, + }, + "training_authorized_by_controller": False, + "automatic_second_array_authorized": False, + } + receipt = { + **unsigned, + "receipt_sha256": _canonical_sha256(unsigned, domain=SCHEMA), + } + payload = canonical_bytes(receipt) + _publish_receipt_exclusive(submission_receipt_path, payload) + _require( + _read_canonical(submission_receipt_path) == receipt, + "persisted submission receipt canonical readback changed", + ) + return receipt + except NativeEightSubmittedButUncertifiedR13Error: + raise + except BaseException as error: + raise NativeEightSubmittedButUncertifiedR13Error( + job_id, + str(error), + ) from error + + +def _submit_once_injected_for_tests( + *, + paths: builder.BundlePaths, + output_roots: Mapping[str, str], + submission_receipt_path: Path, + source_closure_paths: Mapping[str, Path], + scheduler: builder.Scheduler, + clock: builder.Clock, +) -> Mapping[str, Any]: + """Exercise the controller with isolated files and a fake scheduler.""" + + _require( + paths != builder.BundlePaths.production() + and submission_receipt_path != PRODUCTION_SUBMISSION_RECEIPT_PATH + and scheduler is not _production_scheduler, + "the private test seam cannot target production paths or scheduler", + ) + return _submit_once_bound( + paths=paths, + output_roots=output_roots, + submission_receipt_path=submission_receipt_path, + source_closure_paths=source_closure_paths, + scheduler=scheduler, + clock=clock, + production=False, + ) + + +def submit_once() -> Mapping[str, Any]: + """Submit the fixed production bundle exactly once after all live gates.""" + + paths = builder.BundlePaths.production() + binding = runner._binding_source_value() + return _submit_once_bound( + paths=paths, + output_roots=builder._cell_output_roots(paths), + submission_receipt_path=PRODUCTION_SUBMISSION_RECEIPT_PATH, + source_closure_paths=builder.production_source_closure_paths(binding), + scheduler=_production_scheduler, + clock=_utc_now, + production=True, + ) + + +def describe_contract() -> Mapping[str, Any]: + return { + "schema": SCHEMA, + "status": "PREPARATION_ONLY_NO_SCHEDULER_CALL_MADE", + "array": "0-7", + "gres": "gpu:1", + "partition": "scavenger", + "preflight_freshness_seconds": builder.PREFLIGHT_FRESHNESS_SECONDS, + "submit_call_count_when_invoked": 1, + "retry_call_count": 0, + "fallback_call_count": 0, + "cancel_call_count": 0, + "hold_release_call_count": 0, + "scavenger_sbatch_stderr_warning_allowed_after_zero_exit": True, + "accepted_job_id_persisted_before_post_submit_readback": True, + "training_authorized": False, + "nova_submission_authorized": False, + } + + +__all__ = [ + "NativeEightDirectSubmitR13Error", + "NativeEightSubmittedButUncertifiedR13Error", + "PRODUCTION_SUBMISSION_RECEIPT_PATH", + "SCHEMA", + "canonical_bytes", + "describe_contract", + "submit_once", + "validate_post_submit_receipt", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py new file mode 100644 index 0000000000000000000000000000000000000000..19714043a2d9f308ff29a62f4bc6207a5ae1e200 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py @@ -0,0 +1,80 @@ +"""Preparation-only identities for the immutable native-eight R13 child. + +The terminal R6 binding fields deliberately remain sentinels until the exact +terminal JSON exists. This file is never rewritten in place: the final +binding must be published as a new immutable successor. +""" + +SCHEMA = "bertose_review_a5_native_eight_final_bindings_20260726_r13" +STATUS = "PREPARATION_ONLY_WAITING_FOR_R6_TERMINAL_BINDING" + +R12_PREDECESSOR_SOURCE_SHA256 = ( + "47e973c7c4ed5bc6686e5d7795b00d3eea5c2da8c2a15fc534a7cc24c1744ee1" +) +R12_PREDECESSOR_SOURCE_BYTES = 23_200 + +R9_SOURCE_SHA256 = ( + "4430560565a18da0e68700d60526d3dec15fabd79854111d1e85deb59e2381c8" +) +R9_SOURCE_BYTES = 7_443 +R11_SOURCE_SHA256 = ( + "ce7626823c2980bc21b46a7eec6c1961a87dc5512525e553c49f2c7d57bf0430" +) +R11_SOURCE_BYTES = 49_854 +R6_TERMINAL_SOURCE_SHA256 = ( + "bdb0fa37804531f6446cee9411c9730fde792eb9674054e56b883156f36da4cb" +) +R6_TERMINAL_SOURCE_BYTES = 133_704 +R6_TERMINAL_BINDING_SHA256 = "PENDING_JOB_11762534_TERMINAL_BINDING" +R6_TERMINAL_BINDING_BYTES = 0 + +# The preparation sentinel currently binds R2. A no-overwrite final binding +# may replace only these exact loader/runtime identities with the independently +# certified hotpath successor; the R13 runner resolves them dynamically. +OPTIMIZATION_SOURCE_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/" + "load_review_a5_native_eight_hotpath_r2.py" +) +OPTIMIZATION_SOURCE_SHA256 = ( + "101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae" +) +OPTIMIZATION_SOURCE_BYTES = 4_127 + +# The loader's transitive runtime and its explicit predecessor roster are +# separately bound so the final pre-submit closure can reopen every byte. +OPTIMIZATION_RUNTIME_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/" + "review_a5_native_eight_hotpath_r2.py" +) +OPTIMIZATION_RUNTIME_SHA256 = ( + "941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98" +) +OPTIMIZATION_RUNTIME_BYTES = 32_821 +OPTIMIZATION_R1_HOTPATH_SHA256 = ( + "3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f" +) +OPTIMIZATION_R1_HOTPATH_BYTES = 33_246 +OPTIMIZATION_R5_EXECUTOR_SHA256 = ( + "a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2" +) +OPTIMIZATION_R5_EXECUTOR_BYTES = 74_648 +OPTIMIZATION_ADAPTER_R3_SHA256 = ( + "a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e" +) +OPTIMIZATION_ADAPTER_R3_BYTES = 41_304 +OPTIMIZATION_EXECUTOR_R8_SHA256 = ( + "60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630" +) +OPTIMIZATION_EXECUTOR_R8_BYTES = 52_743 +TRAINING_CORE_R1_SHA256 = ( + "34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf" +) +TRAINING_CORE_R1_BYTES = 97_336 + +OPTIMIZATION_INSTALLER_NAME = "install_optimized_execution_layer" +OPTIMIZATION_INSTALLER_SIGNATURE = ( + "(r9_module: 'ModuleType') -> 'Mapping[str, Any]'" +) + +TRAINING_AUTHORIZED = False +NOVA_SUBMISSION_AUTHORIZED = False diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py new file mode 100644 index 0000000000000000000000000000000000000000..474e728ef4b196ef2281636ac3258331032f2a43 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py @@ -0,0 +1,1706 @@ +"""Hardened, launch-closed R13 child around the exact R12/R11/R9 runtime. + +R13 changes no cell, data, loss, optimizer, checkpoint, resume, or selection +rule. It gives the frozen R12 outer runtime a new immutable path namespace and +adds an explicit no-follow/read-only closure for the utilization loader, its +runtime source, and every predecessor source named by that utilization layer. +""" + +from __future__ import annotations + +import argparse +from dataclasses import dataclass +import gc +import hashlib +import inspect +import json +import os +from pathlib import Path +import re +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping, Sequence + + +SCHEMA_R13 = ( + "bertose_review_a5_native_eight_training_20260726_r13_final_candidate" +) +FINAL_BINDING_SCHEMA = ( + "bertose_review_a5_native_eight_final_bindings_20260726_r13" +) +FINAL_BINDING_STATUS = "BOUND_FINAL_R6_R11_AND_OPTIMIZATION_IDENTITIES_R13" +EXPECTED_INSTALLER_SIGNATURE = ( + "(r9_module: 'ModuleType') -> 'Mapping[str, Any]'" +) +SEQUENCE_VOCAB_SIZE = 2_114 +SEQUENCE_RECEIPT_SHA256 = ( + "399df3de2b6c4d5e88aa442c8326214ab9cff2e8f0411e6921762bbade1475ba" +) +SEQUENCE_VOCABULARY_SHA256 = ( + "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b" +) +SEQUENCE_BPE_SOURCE_SHA256 = ( + "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4" +) +COMPOSITE_R5_SOURCE_SHA256 = ( + "24c35257fc61e1c9c77630d2b0075775a7f46b6500ecb5f175ef8f42bd214e0e" +) +ADAPTER_R3_SEQUENCE_TOPOLOGY_RECEIPT_SHA256 = ( + "654f5b9728c3dfd2588c4b570b0e3a1bcab8feb366af28eeead36f9beb37d921" +) +CELL_ORDER = ("A000", "A100", "A010", "A001", "A110", "A101", "A011", "A111") +EXPECTED_MODEL_PARAMETER_COUNT = 137_718_965 +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") + +RUNNER_PATH = Path(__file__).absolute() +RUNTIME_DIRECTORY = RUNNER_PATH.parent +WRAPPER_PATH = RUNTIME_DIRECTORY / "run_review_a5_native_eight_training_r13.py" +BINDING_SOURCE_PATH = ( + RUNTIME_DIRECTORY / "review_a5_native_eight_final_bindings_r13.py" +) +PROJECT_ROOT = RUNNER_PATH.parents[5] +WRITING_ROOT = PROJECT_ROOT / "writing" +RUNTIME_ROOT = WRITING_ROOT / "review/multimodal/runtime" + +R12_PREDECESSOR_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260725_r12_r11_integrated" + / "review_a5_native_eight_training_runner_r12.py" +) +R12_PREDECESSOR_SHA256 = ( + "47e973c7c4ed5bc6686e5d7795b00d3eea5c2da8c2a15fc534a7cc24c1744ee1" +) +R12_PREDECESSOR_BYTES = 23_200 +R9_SOURCE_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260724_r9_isolated_path" + / "review_a5_native_eight_training_runner_r9.py" +) +R9_SOURCE_SHA256 = ( + "4430560565a18da0e68700d60526d3dec15fabd79854111d1e85deb59e2381c8" +) +R9_SOURCE_BYTES = 7_443 +R11_SOURCE_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260725_r11_certification_gate_candidate" + / "review_a5_native_eight_certification_gate_r11.py" +) +R11_SOURCE_SHA256 = ( + "ce7626823c2980bc21b46a7eec6c1961a87dc5512525e553c49f2c7d57bf0430" +) +R11_SOURCE_BYTES = 49_854 +R6_TERMINAL_SOURCE_PATH = ( + RUNTIME_ROOT + / "a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification" + / "review_a5_static_v2_terminal_certification_r6.py" +) +R6_TERMINAL_SOURCE_SHA256 = ( + "bdb0fa37804531f6446cee9411c9730fde792eb9674054e56b883156f36da4cb" +) +R6_TERMINAL_SOURCE_BYTES = 133_704 +R6_TERMINAL_BINDING_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs" + / "review_a5_static_v2_postfit_direct_publication_20260725_" + "r6_terminal_certification" + / "review_a5_static_v2_postfit_terminal_certification_binding_r6.json" +) + +OPTIMIZATION_LOADER_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_hotpath_20260725_r2" + / "load_review_a5_native_eight_hotpath_r2.py" +) +OPTIMIZATION_LOADER_SHA256 = ( + "101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae" +) +OPTIMIZATION_LOADER_BYTES = 4_127 +OPTIMIZATION_RUNTIME_PATH = OPTIMIZATION_LOADER_PATH.with_name( + "review_a5_native_eight_hotpath_r2.py" +) +OPTIMIZATION_RUNTIME_SHA256 = ( + "941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98" +) +OPTIMIZATION_RUNTIME_BYTES = 32_821 +OPTIMIZATION_R3_LOADER_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_hotpath_20260726_r3" + / "load_review_a5_native_eight_hotpath_r3.py" +) +OPTIMIZATION_R3_LOADER_SHA256 = ( + "e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30" +) +OPTIMIZATION_R3_LOADER_BYTES = 4_013 +OPTIMIZATION_R3_RUNTIME_PATH = OPTIMIZATION_R3_LOADER_PATH.with_name( + "review_a5_native_eight_hotpath_r3.py" +) +OPTIMIZATION_R3_RUNTIME_SHA256 = ( + "a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd" +) +OPTIMIZATION_R3_RUNTIME_BYTES = 36_449 +FROZEN_TOPOLOGY_LOSS_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs" + / "review_a5_official_ragged_sequence_topology_runtime_20260721_r3" + / "review_a5_topology_loss_v2.py" +) +FROZEN_TOPOLOGY_LOSS_SHA256 = ( + "64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e" +) +FROZEN_TOPOLOGY_LOSS_BYTES = 8_067 +OPTIMIZATION_R1_HOTPATH_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_hotpath_20260725_r1" + / "review_a5_native_eight_hotpath_r1.py" +) +OPTIMIZATION_R1_HOTPATH_SHA256 = ( + "3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f" +) +OPTIMIZATION_R1_HOTPATH_BYTES = 33_246 +OPTIMIZATION_R5_EXECUTOR_PATH = ( + RUNTIME_ROOT + / "a5_pretraining_failclosed_integration_20260721_r5" + / "review_a5_native_eight_executor_r5.py" +) +OPTIMIZATION_R5_EXECUTOR_SHA256 = ( + "a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2" +) +OPTIMIZATION_R5_EXECUTOR_BYTES = 74_648 +OPTIMIZATION_ADAPTER_R3_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_data_adapter_20260721_r3" + / "review_a5_native_eight_data_adapter_r3.py" +) +OPTIMIZATION_ADAPTER_R3_SHA256 = ( + "a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e" +) +OPTIMIZATION_ADAPTER_R3_BYTES = 41_304 +OPTIMIZATION_EXECUTOR_R8_PATH = ( + RUNTIME_ROOT + / "a5_pretraining_failclosed_integration_20260721_r8" + / "review_a5_native_eight_executor_r8.py" +) +OPTIMIZATION_EXECUTOR_R8_SHA256 = ( + "60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630" +) +OPTIMIZATION_EXECUTOR_R8_BYTES = 52_743 +TRAINING_CORE_R1_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260722_r1" + / "review_a5_native_eight_training_runner_r1.py" +) +TRAINING_CORE_R1_SHA256 = ( + "34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf" +) +TRAINING_CORE_R1_BYTES = 97_336 + +ISOLATED_NOVA_ROOT = ( + "/work/ratul1/supantha/" + "bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc" +) +SBATCH_PATH = ( + WRITING_ROOT + / "review/multimodal/slurm" + / "review_a5_native_eight_seed43_scavenger_20260726_r13_r11.sbatch" +) +LAUNCH_CONFIG_PATH = ( + WRITING_ROOT + / "review/multimodal/inputs" + / "review_a5_native_eight_training_launch_config_20260726_r13_r11.json" +) +SBATCH_STDOUT = ( + f"{ISOLATED_NOVA_ROOT}/writing/review/multimodal/outputs/" + "review_a5_native8_r13_%A_%a.out" +) +SBATCH_STDERR = ( + f"{ISOLATED_NOVA_ROOT}/writing/review/multimodal/outputs/" + "review_a5_native8_r13_%A_%a.err" +) +SBATCH_WRAPPER_RELATIVE = ( + "writing/review/multimodal/runtime/" + "a5_native_eight_training_20260726_r13_final_candidate/" + "run_review_a5_native_eight_training_r13.py" +) +SBATCH_CONFIG_RELATIVE = ( + "writing/review/multimodal/inputs/" + "review_a5_native_eight_training_launch_config_20260726_r13_r11.json" +) + +_FIXED_SOURCE_SPECS = MappingProxyType( + { + "r12_predecessor": ( + R12_PREDECESSOR_PATH, + R12_PREDECESSOR_SHA256, + R12_PREDECESSOR_BYTES, + ), + "r9_runner": (R9_SOURCE_PATH, R9_SOURCE_SHA256, R9_SOURCE_BYTES), + "r11_gate": (R11_SOURCE_PATH, R11_SOURCE_SHA256, R11_SOURCE_BYTES), + "r6_terminal_validator": ( + R6_TERMINAL_SOURCE_PATH, + R6_TERMINAL_SOURCE_SHA256, + R6_TERMINAL_SOURCE_BYTES, + ), + "optimization_r1_hotpath": ( + OPTIMIZATION_R1_HOTPATH_PATH, + OPTIMIZATION_R1_HOTPATH_SHA256, + OPTIMIZATION_R1_HOTPATH_BYTES, + ), + "optimization_predecessor_r2_loader": ( + OPTIMIZATION_LOADER_PATH, + OPTIMIZATION_LOADER_SHA256, + OPTIMIZATION_LOADER_BYTES, + ), + "optimization_predecessor_r2_runtime": ( + OPTIMIZATION_RUNTIME_PATH, + OPTIMIZATION_RUNTIME_SHA256, + OPTIMIZATION_RUNTIME_BYTES, + ), + "optimization_predecessor_r3_loader": ( + OPTIMIZATION_R3_LOADER_PATH, + OPTIMIZATION_R3_LOADER_SHA256, + OPTIMIZATION_R3_LOADER_BYTES, + ), + "optimization_predecessor_r3_runtime": ( + OPTIMIZATION_R3_RUNTIME_PATH, + OPTIMIZATION_R3_RUNTIME_SHA256, + OPTIMIZATION_R3_RUNTIME_BYTES, + ), + "optimization_frozen_topology_loss": ( + FROZEN_TOPOLOGY_LOSS_PATH, + FROZEN_TOPOLOGY_LOSS_SHA256, + FROZEN_TOPOLOGY_LOSS_BYTES, + ), + "optimization_r5_executor": ( + OPTIMIZATION_R5_EXECUTOR_PATH, + OPTIMIZATION_R5_EXECUTOR_SHA256, + OPTIMIZATION_R5_EXECUTOR_BYTES, + ), + "optimization_adapter_r3": ( + OPTIMIZATION_ADAPTER_R3_PATH, + OPTIMIZATION_ADAPTER_R3_SHA256, + OPTIMIZATION_ADAPTER_R3_BYTES, + ), + "optimization_executor_r8": ( + OPTIMIZATION_EXECUTOR_R8_PATH, + OPTIMIZATION_EXECUTOR_R8_SHA256, + OPTIMIZATION_EXECUTOR_R8_BYTES, + ), + "training_core_r1": ( + TRAINING_CORE_R1_PATH, + TRAINING_CORE_R1_SHA256, + TRAINING_CORE_R1_BYTES, + ), + } +) + + +class NativeEightTrainingR13Error(RuntimeError): + """The immutable R13 runtime or source closure changed.""" + + +@dataclass(frozen=True, slots=True) +class PreparedExactProductionA111: + """Read-only preparation objects for a later isolated step diagnostic.""" + + r9: ModuleType + r11: ModuleType + binding: Mapping[str, Any] + installation: Mapping[str, Any] + launch_config: Any + static_bundle: Any + adapter: Any + epoch_plan: Any + model: Any + executor: Any + run_identity: Mapping[str, Any] + run_identity_sha256: str + preparation_receipt: Mapping[str, Any] + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightTrainingR13Error(message) + + +def canonical_bytes(value: Any) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def read_regular_nofollow( + path: Path, + *, + maximum: int, + require_read_only: bool, +) -> bytes: + """Read one canonical regular file without following any path component.""" + + absolute = Path(path) + _require( + absolute.is_absolute() + and os.path.normpath(os.fspath(absolute)) == os.fspath(absolute) + and ".." not in absolute.parts + and hasattr(os, "O_NOFOLLOW") + and hasattr(os, "O_DIRECTORY"), + f"{absolute} is not one canonical no-follow path", + ) + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0) + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in absolute.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + leaf = os.open(absolute.name, leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + _require( + stat.S_ISREG(before.st_mode) + and before.st_nlink == 1 + and 0 < before.st_size <= maximum + and (not require_read_only or before.st_mode & 0o222 == 0), + f"{absolute} is not one bounded immutable regular file", + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + _require(bool(chunk), f"{absolute} truncated while reading") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + _require( + ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) + == ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ), + f"{absolute} changed while reading", + ) + return b"".join(chunks) + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + + +def read_exact_source( + path: Path, + *, + expected_sha256: str, + expected_bytes: int, + require_read_only: bool = True, +) -> bytes: + _require( + SHA_RE.fullmatch(expected_sha256) is not None + and type(expected_bytes) is int + and 0 < expected_bytes <= 64 * 1024 * 1024, + f"{path.name} source identity is unresolved", + ) + raw = read_regular_nofollow( + path, + maximum=64 * 1024 * 1024, + require_read_only=require_read_only, + ) + _require( + len(raw) == expected_bytes + and hashlib.sha256(raw).hexdigest() == expected_sha256, + f"{path.name} source identity changed", + ) + return raw + + +def _load_exact_module( + path: Path, + *, + expected_sha256: str, + expected_bytes: int, + name: str, +) -> ModuleType: + raw = read_exact_source( + path, + expected_sha256=expected_sha256, + expected_bytes=expected_bytes, + ) + module = ModuleType(name) + module.__file__ = os.fspath(path) + module.__package__ = "" + previous = sys.modules.get(name) + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(path), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + if previous is None: + sys.modules.pop(name, None) + else: + sys.modules[name] = previous + raise + return module + + +_r12 = _load_exact_module( + R12_PREDECESSOR_PATH, + expected_sha256=R12_PREDECESSOR_SHA256, + expected_bytes=R12_PREDECESSOR_BYTES, + name="_review_a5_native_eight_r12_pinned_for_r13", +) + +# Rebind only outer paths/schemas. The exact R9 science remains the one loaded +# by the frozen R12 predecessor. +for _name, _value in { + "SCHEMA_R12": SCHEMA_R13, + "RUNNER_PATH": RUNNER_PATH, + "RUNTIME_DIRECTORY": RUNTIME_DIRECTORY, + "WRAPPER_PATH": WRAPPER_PATH, + "BINDING_SOURCE_PATH": BINDING_SOURCE_PATH, + "SBATCH_PATH": SBATCH_PATH, + "LAUNCH_CONFIG_PATH": LAUNCH_CONFIG_PATH, + "SBATCH_STDOUT": SBATCH_STDOUT, + "SBATCH_STDERR": SBATCH_STDERR, + "SBATCH_WRAPPER_RELATIVE": SBATCH_WRAPPER_RELATIVE, + "SBATCH_CONFIG_RELATIVE": SBATCH_CONFIG_RELATIVE, + "FINAL_BINDING_STATUS": FINAL_BINDING_STATUS, + "FINAL_BINDING_SCHEMA": FINAL_BINDING_SCHEMA, + "EXPECTED_INSTALLER_SIGNATURE": EXPECTED_INSTALLER_SIGNATURE, +}.items(): + setattr(_r12, _name, _value) + + +_BINDING_NAMES = ( + "SCHEMA", + "STATUS", + "R12_PREDECESSOR_SOURCE_SHA256", + "R12_PREDECESSOR_SOURCE_BYTES", + "R9_SOURCE_SHA256", + "R9_SOURCE_BYTES", + "R11_SOURCE_SHA256", + "R11_SOURCE_BYTES", + "R6_TERMINAL_SOURCE_SHA256", + "R6_TERMINAL_SOURCE_BYTES", + "R6_TERMINAL_BINDING_SHA256", + "R6_TERMINAL_BINDING_BYTES", + "OPTIMIZATION_SOURCE_RELATIVE", + "OPTIMIZATION_SOURCE_SHA256", + "OPTIMIZATION_SOURCE_BYTES", + "OPTIMIZATION_RUNTIME_RELATIVE", + "OPTIMIZATION_RUNTIME_SHA256", + "OPTIMIZATION_RUNTIME_BYTES", + "OPTIMIZATION_R1_HOTPATH_SHA256", + "OPTIMIZATION_R1_HOTPATH_BYTES", + "OPTIMIZATION_R5_EXECUTOR_SHA256", + "OPTIMIZATION_R5_EXECUTOR_BYTES", + "OPTIMIZATION_ADAPTER_R3_SHA256", + "OPTIMIZATION_ADAPTER_R3_BYTES", + "OPTIMIZATION_EXECUTOR_R8_SHA256", + "OPTIMIZATION_EXECUTOR_R8_BYTES", + "TRAINING_CORE_R1_SHA256", + "TRAINING_CORE_R1_BYTES", + "OPTIMIZATION_INSTALLER_NAME", + "OPTIMIZATION_INSTALLER_SIGNATURE", + "TRAINING_AUTHORIZED", + "NOVA_SUBMISSION_AUTHORIZED", +) + + +def _binding_source_value() -> Mapping[str, Any]: + raw = read_regular_nofollow( + BINDING_SOURCE_PATH, + maximum=64 * 1024, + require_read_only=False, + ) + module = ModuleType("_review_a5_native_eight_r13_binding_observed") + module.__file__ = os.fspath(BINDING_SOURCE_PATH) + exec( + compile(raw, os.fspath(BINDING_SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + value = {name: getattr(module, name, None) for name in _BINDING_NAMES} + if value.get("STATUS") == FINAL_BINDING_STATUS: + frozen = read_regular_nofollow( + BINDING_SOURCE_PATH, + maximum=64 * 1024, + require_read_only=True, + ) + _require(frozen == raw, "final R13 binding changed during readback") + return MappingProxyType( + { + **value, + "binding_source_sha256": hashlib.sha256(raw).hexdigest(), + "binding_source_bytes": len(raw), + } + ) + + +def _bound_runtime_relative_path(value: Any, *, label: str) -> Path: + _require( + type(value) is str + and bool(value) + and "\\" not in value + and not value.startswith("/") + and os.path.normpath(value) == value, + f"{label} is not one canonical relative path", + ) + relative = Path(value) + _require( + not relative.is_absolute() + and relative.parts[:3] == ("review", "multimodal", "runtime") + and len(relative.parts) >= 5 + and all(component not in {"", ".", ".."} for component in relative.parts) + and relative.suffix == ".py", + f"{label} is outside the versioned review runtime", + ) + absolute = WRITING_ROOT / relative + _require( + absolute.is_absolute() + and os.path.normpath(os.fspath(absolute)) == os.fspath(absolute) + and absolute.parent != RUNTIME_ROOT, + f"{label} does not name a versioned runtime child", + ) + return absolute + + +def _optimization_source_specs( + value: Mapping[str, Any], +) -> Mapping[str, tuple[Path, str, int]]: + loader = _bound_runtime_relative_path( + value.get("OPTIMIZATION_SOURCE_RELATIVE"), + label="optimization loader", + ) + runtime = _bound_runtime_relative_path( + value.get("OPTIMIZATION_RUNTIME_RELATIVE"), + label="optimization runtime", + ) + loader_sha = value.get("OPTIMIZATION_SOURCE_SHA256") + loader_bytes = value.get("OPTIMIZATION_SOURCE_BYTES") + runtime_sha = value.get("OPTIMIZATION_RUNTIME_SHA256") + runtime_bytes = value.get("OPTIMIZATION_RUNTIME_BYTES") + _require( + loader != runtime + and loader.parent == runtime.parent + and SHA_RE.fullmatch(str(loader_sha or "")) is not None + and type(loader_bytes) is int + and 0 < loader_bytes <= 64 * 1024 * 1024 + and SHA_RE.fullmatch(str(runtime_sha or "")) is not None + and type(runtime_bytes) is int + and 0 < runtime_bytes <= 64 * 1024 * 1024, + "optimization loader/runtime identity is unresolved", + ) + return MappingProxyType( + { + "optimization_loader": ( + loader, + str(loader_sha), + int(loader_bytes), + ), + "optimization_runtime": ( + runtime, + str(runtime_sha), + int(runtime_bytes), + ), + } + ) + + +def _all_source_specs( + value: Mapping[str, Any], +) -> Mapping[str, tuple[Path, str, int]]: + return MappingProxyType( + { + **dict(_FIXED_SOURCE_SPECS), + **dict(_optimization_source_specs(value)), + } + ) + + +def _validate_fixed_binding(value: Mapping[str, Any]) -> None: + expected = { + "R12_PREDECESSOR_SOURCE_SHA256": R12_PREDECESSOR_SHA256, + "R12_PREDECESSOR_SOURCE_BYTES": R12_PREDECESSOR_BYTES, + "R9_SOURCE_SHA256": R9_SOURCE_SHA256, + "R9_SOURCE_BYTES": R9_SOURCE_BYTES, + "R11_SOURCE_SHA256": R11_SOURCE_SHA256, + "R11_SOURCE_BYTES": R11_SOURCE_BYTES, + "R6_TERMINAL_SOURCE_SHA256": R6_TERMINAL_SOURCE_SHA256, + "R6_TERMINAL_SOURCE_BYTES": R6_TERMINAL_SOURCE_BYTES, + "OPTIMIZATION_R1_HOTPATH_SHA256": OPTIMIZATION_R1_HOTPATH_SHA256, + "OPTIMIZATION_R1_HOTPATH_BYTES": OPTIMIZATION_R1_HOTPATH_BYTES, + "OPTIMIZATION_R5_EXECUTOR_SHA256": OPTIMIZATION_R5_EXECUTOR_SHA256, + "OPTIMIZATION_R5_EXECUTOR_BYTES": OPTIMIZATION_R5_EXECUTOR_BYTES, + "OPTIMIZATION_ADAPTER_R3_SHA256": OPTIMIZATION_ADAPTER_R3_SHA256, + "OPTIMIZATION_ADAPTER_R3_BYTES": OPTIMIZATION_ADAPTER_R3_BYTES, + "OPTIMIZATION_EXECUTOR_R8_SHA256": OPTIMIZATION_EXECUTOR_R8_SHA256, + "OPTIMIZATION_EXECUTOR_R8_BYTES": OPTIMIZATION_EXECUTOR_R8_BYTES, + "TRAINING_CORE_R1_SHA256": TRAINING_CORE_R1_SHA256, + "TRAINING_CORE_R1_BYTES": TRAINING_CORE_R1_BYTES, + "OPTIMIZATION_INSTALLER_NAME": "install_optimized_execution_layer", + "OPTIMIZATION_INSTALLER_SIGNATURE": EXPECTED_INSTALLER_SIGNATURE, + "TRAINING_AUTHORIZED": False, + "NOVA_SUBMISSION_AUTHORIZED": False, + } + _require( + value.get("SCHEMA") == FINAL_BINDING_SCHEMA + and all(value.get(key) == expected_value for key, expected_value in expected.items()), + "fixed R13 source binding changed", + ) + _optimization_source_specs(value) + + +def _validate_final_binding(value: Mapping[str, Any]) -> None: + _validate_fixed_binding(value) + _require( + value.get("STATUS") == FINAL_BINDING_STATUS + and SHA_RE.fullmatch( + str(value.get("R6_TERMINAL_BINDING_SHA256", "")) + ) + is not None + and type(value.get("R6_TERMINAL_BINDING_BYTES")) is int + and 0 < value["R6_TERMINAL_BINDING_BYTES"] <= 64 * 1024 * 1024, + "final R13 terminal binding is unresolved", + ) + + +def validate_fixed_source_closure( + binding: Mapping[str, Any] | None = None, +) -> Mapping[str, Mapping[str, Any]]: + value = binding or _binding_source_value() + _validate_fixed_binding(value) + observed: dict[str, Mapping[str, Any]] = {} + for name, (path, digest, size) in _all_source_specs(value).items(): + raw = read_exact_source( + path, + expected_sha256=digest, + expected_bytes=size, + ) + observed[name] = MappingProxyType( + { + "absolute_path": os.fspath(path), + "sha256": hashlib.sha256(raw).hexdigest(), + "bytes": len(raw), + } + ) + return MappingProxyType(observed) + + +def validate_final_source_closure( + binding: Mapping[str, Any], +) -> Mapping[str, Mapping[str, Any]]: + _validate_final_binding(binding) + observed = dict(validate_fixed_source_closure(binding)) + terminal_raw = read_exact_source( + R6_TERMINAL_BINDING_PATH, + expected_sha256=str(binding["R6_TERMINAL_BINDING_SHA256"]), + expected_bytes=int(binding["R6_TERMINAL_BINDING_BYTES"]), + ) + observed["r6_terminal_binding"] = MappingProxyType( + { + "absolute_path": os.fspath(R6_TERMINAL_BINDING_PATH), + "sha256": hashlib.sha256(terminal_raw).hexdigest(), + "bytes": len(terminal_raw), + } + ) + return MappingProxyType(observed) + + +def source_closure_paths(binding: Mapping[str, Any]) -> Mapping[str, Path]: + _validate_final_binding(binding) + return MappingProxyType( + { + **{ + name: path + for name, (path, _digest, _size) in _all_source_specs( + binding + ).items() + }, + "r6_terminal_binding": R6_TERMINAL_BINDING_PATH, + } + ) + + +def _validate_optimization_module( + optimization: ModuleType, + binding: Mapping[str, Any], +) -> None: + specifications = _optimization_source_specs(binding) + runtime_path, runtime_sha256, runtime_bytes = specifications[ + "optimization_runtime" + ] + installer_name = str(binding["OPTIMIZATION_INSTALLER_NAME"]) + installer = getattr(optimization, installer_name, None) + identity_function = getattr(optimization, "source_identity", None) + _require( + inspect.isfunction(installer) + and installer.__name__ == installer_name + and str(inspect.signature(installer)) + == binding["OPTIMIZATION_INSTALLER_SIGNATURE"] + and Path(getattr(optimization, "SOURCE_PATH", "")) == runtime_path + and getattr(optimization, "SOURCE_SHA256", None) == runtime_sha256 + and getattr(optimization, "SOURCE_BYTES", None) == runtime_bytes + and inspect.isfunction(identity_function), + "R13 optimization loader API or transitive pin changed", + ) + identity = identity_function() + _require( + isinstance(identity, Mapping) + and dict(identity) + == { + "sha256": runtime_sha256, + "bytes": runtime_bytes, + }, + "R13 optimization source_identity changed", + ) + + +def install_sequence_vocab_compatibility( + r9: ModuleType, +) -> Mapping[str, Any]: + """Bridge one missing frozen-R5 public alias without changing any bytes.""" + + _require(isinstance(r9, ModuleType), "vocabulary bridge requires R9 module") + core = getattr(r9, "_core", None) + _require( + isinstance(core, ModuleType) and callable(getattr(core, "_load_r8", None)), + "vocabulary bridge cannot resolve training core", + ) + execution_r8 = core._load_r8() + adapter = getattr(execution_r8, "_adapter_r3", None) + execution_core = getattr(execution_r8, "_core", None) + r6 = getattr(execution_core, "_r6", None) + r5 = getattr(r6, "_r5", None) + composite = getattr(r5, "_composite", None) + _require( + isinstance(adapter, ModuleType) + and isinstance(r5, ModuleType) + and isinstance(composite, ModuleType), + "vocabulary bridge cannot resolve exact R5/composite/adapter graph", + ) + public_present = hasattr(r5, "SEQUENCE_VOCAB_SIZE") + public_before = getattr(r5, "SEQUENCE_VOCAB_SIZE", None) + _require( + not public_present + or (type(public_before) is int and public_before == SEQUENCE_VOCAB_SIZE), + "R5 public sequence vocabulary alias conflicts with frozen BPE", + ) + expected_components = getattr(composite, "EXPECTED_COMPONENT_BINDINGS", None) + observed_components = composite.verify_component_authorities() + _require( + getattr(r5, "COMPOSITE_SOURCE_SHA256", None) + == COMPOSITE_R5_SOURCE_SHA256 + and type(getattr(composite, "SEQUENCE_VOCAB_SIZE", None)) is int + and composite.SEQUENCE_VOCAB_SIZE == SEQUENCE_VOCAB_SIZE + and composite.SEQUENCE_RECEIPT_SHA256 == SEQUENCE_RECEIPT_SHA256 + and composite.SEQUENCE_VOCABULARY_SHA256 + == SEQUENCE_VOCABULARY_SHA256 + and composite.SEQUENCE_BPE_SOURCE_SHA256 + == SEQUENCE_BPE_SOURCE_SHA256 + and isinstance(expected_components, Mapping) + and dict(observed_components) == dict(expected_components) + and observed_components.get("sequence_receipt") + == SEQUENCE_RECEIPT_SHA256 + and observed_components.get("sequence_vocabulary") + == SEQUENCE_VOCABULARY_SHA256 + and observed_components.get("sequence_bpe_source") + == SEQUENCE_BPE_SOURCE_SHA256 + and getattr(adapter, "R4_RECEIPT_SHA256", None) + == ADAPTER_R3_SEQUENCE_TOPOLOGY_RECEIPT_SHA256, + "frozen composite/BPE/adapter vocabulary identity changed", + ) + setattr(r5, "SEQUENCE_VOCAB_SIZE", SEQUENCE_VOCAB_SIZE) + _require( + type(r5.SEQUENCE_VOCAB_SIZE) is int + and r5.SEQUENCE_VOCAB_SIZE == composite.SEQUENCE_VOCAB_SIZE, + "R5 sequence vocabulary compatibility alias did not bind exactly", + ) + cached = getattr( + r5, + "_review_a5_r13_sequence_vocab_compatibility_receipt", + None, + ) + if cached is not None: + _require( + isinstance(cached, Mapping) + and cached.get("status") + == "PASS_PROCESS_LOCAL_EXACT_SEQUENCE_VOCAB_ALIAS" + and cached.get("sequence_vocab_size") == SEQUENCE_VOCAB_SIZE + and cached.get("composite_source_sha256") + == COMPOSITE_R5_SOURCE_SHA256 + and cached.get("sequence_receipt_sha256") + == SEQUENCE_RECEIPT_SHA256 + and cached.get("sequence_vocabulary_sha256") + == SEQUENCE_VOCABULARY_SHA256 + and cached.get("sequence_bpe_source_sha256") + == SEQUENCE_BPE_SOURCE_SHA256 + and cached.get("adapter_r3_source_sha256") + == OPTIMIZATION_ADAPTER_R3_SHA256 + and cached.get("process_local_only") is True + and cached.get("predecessor_files_modified") is False + and cached.get("training_authorized") is False + and cached.get("nova_submission_authorized") is False, + "cached R13 sequence vocabulary receipt changed", + ) + r9._review_a5_r13_sequence_vocab_compatibility_receipt = cached + return cached + receipt = MappingProxyType( + { + "schema": ( + "bertose_review_a5_native_eight_sequence_vocab_" + "compatibility_20260726_r13" + ), + "status": "PASS_PROCESS_LOCAL_EXACT_SEQUENCE_VOCAB_ALIAS", + "patched_entry": "r5.SEQUENCE_VOCAB_SIZE", + "public_attribute_preexisting": public_present, + "sequence_vocab_size": SEQUENCE_VOCAB_SIZE, + "composite_source_sha256": COMPOSITE_R5_SOURCE_SHA256, + "sequence_receipt_sha256": SEQUENCE_RECEIPT_SHA256, + "sequence_vocabulary_sha256": SEQUENCE_VOCABULARY_SHA256, + "sequence_bpe_source_sha256": SEQUENCE_BPE_SOURCE_SHA256, + "adapter_r3_source_sha256": OPTIMIZATION_ADAPTER_R3_SHA256, + "adapter_sequence_topology_receipt_sha256": ( + ADAPTER_R3_SEQUENCE_TOPOLOGY_RECEIPT_SHA256 + ), + "process_local_only": True, + "predecessor_files_modified": False, + "training_authorized": False, + "nova_submission_authorized": False, + } + ) + r5._review_a5_r13_sequence_vocab_compatibility_receipt = receipt + r9._review_a5_r13_sequence_vocab_compatibility_receipt = receipt + return receipt + + +def _model_construction_smoke( + r9: ModuleType, + *, + cells: Sequence[str], +) -> Mapping[str, Any]: + _require( + tuple(cells) + and len(set(cells)) == len(cells) + and set(cells).issubset(CELL_ORDER), + "model-construction smoke cell roster changed", + ) + vocab_receipt = install_sequence_vocab_compatibility(r9) + execution_r8 = r9._core._load_r8() + r5 = execution_r8._core._r6._r5 + counts: dict[str, int] = {} + for cell_id in cells: + config = execution_r8.NativeEightConfig( + cell_id=cell_id, + seq_vocab_size=int(r5.SEQUENCE_VOCAB_SIZE), + ) + model = execution_r8.NativeEightCompositeR5(config) + count = sum(parameter.numel() for parameter in model.parameters()) + _require( + count == EXPECTED_MODEL_PARAMETER_COUNT, + f"{cell_id} model-construction parameter count changed", + ) + counts[cell_id] = count + del model + gc.collect() + return MappingProxyType( + { + "schema": ( + "bertose_review_a5_native_eight_exact_model_construction_" + "smoke_20260726_r13" + ), + "status": "PASS_EXACT_R9_MODEL_CONSTRUCTION_ONLY", + "cell_order": list(cells), + "parameter_count_by_cell": counts, + "sequence_vocab_size": SEQUENCE_VOCAB_SIZE, + "sequence_vocab_bridge": dict(vocab_receipt), + "model_construction_only": True, + "training_step_executed": False, + "optimizer_step_executed": False, + "checkpoint_written": False, + "resume_executed": False, + "completed_production_epoch_claimed": False, + "training_authorized": False, + "nova_submission_authorized": False, + } + ) + + +def run_exact_model_construction_smoke( + r9: ModuleType, +) -> Mapping[str, Any]: + """Construct all eight exact models without data, optimizer, or training.""" + + receipt = _model_construction_smoke(r9, cells=CELL_ORDER) + validate_model_construction_smoke_receipt(receipt) + return receipt + + +def validate_model_construction_smoke_receipt(value: Any) -> None: + """Require every identity and negative claim from the exact eight-cell smoke.""" + + expected_keys = { + "schema", + "status", + "cell_order", + "parameter_count_by_cell", + "sequence_vocab_size", + "sequence_vocab_bridge", + "model_construction_only", + "training_step_executed", + "optimizer_step_executed", + "checkpoint_written", + "resume_executed", + "completed_production_epoch_claimed", + "training_authorized", + "nova_submission_authorized", + } + bridge = value.get("sequence_vocab_bridge") if isinstance(value, Mapping) else None + _require( + isinstance(value, Mapping) + and set(value) == expected_keys + and value.get("schema") + == ( + "bertose_review_a5_native_eight_exact_model_construction_" + "smoke_20260726_r13" + ) + and value.get("status") == "PASS_EXACT_R9_MODEL_CONSTRUCTION_ONLY" + and value.get("cell_order") == list(CELL_ORDER) + and value.get("parameter_count_by_cell") + == {cell: EXPECTED_MODEL_PARAMETER_COUNT for cell in CELL_ORDER} + and value.get("sequence_vocab_size") == SEQUENCE_VOCAB_SIZE + and value.get("model_construction_only") is True + and value.get("training_step_executed") is False + and value.get("optimizer_step_executed") is False + and value.get("checkpoint_written") is False + and value.get("resume_executed") is False + and value.get("completed_production_epoch_claimed") is False + and value.get("training_authorized") is False + and value.get("nova_submission_authorized") is False, + "exact eight-cell model-construction smoke receipt changed", + ) + _require( + isinstance(bridge, Mapping) + and bridge.get("schema") + == ( + "bertose_review_a5_native_eight_sequence_vocab_" + "compatibility_20260726_r13" + ) + and bridge.get("status") + == "PASS_PROCESS_LOCAL_EXACT_SEQUENCE_VOCAB_ALIAS" + and bridge.get("patched_entry") == "r5.SEQUENCE_VOCAB_SIZE" + and bridge.get("public_attribute_preexisting") is False + and bridge.get("sequence_vocab_size") == SEQUENCE_VOCAB_SIZE + and bridge.get("composite_source_sha256") + == COMPOSITE_R5_SOURCE_SHA256 + and bridge.get("sequence_receipt_sha256") == SEQUENCE_RECEIPT_SHA256 + and bridge.get("sequence_vocabulary_sha256") + == SEQUENCE_VOCABULARY_SHA256 + and bridge.get("sequence_bpe_source_sha256") + == SEQUENCE_BPE_SOURCE_SHA256 + and bridge.get("adapter_r3_source_sha256") + == OPTIMIZATION_ADAPTER_R3_SHA256 + and bridge.get("adapter_sequence_topology_receipt_sha256") + == ADAPTER_R3_SEQUENCE_TOPOLOGY_RECEIPT_SHA256 + and bridge.get("process_local_only") is True + and bridge.get("predecessor_files_modified") is False + and bridge.get("training_authorized") is False + and bridge.get("nova_submission_authorized") is False, + "exact sequence-vocabulary bridge smoke receipt changed", + ) + + +def _validate_r2_optimization_receipt(value: Any) -> None: + expected_predecessors = { + "r5_executor": OPTIMIZATION_R5_EXECUTOR_SHA256, + "adapter_r3": OPTIMIZATION_ADAPTER_R3_SHA256, + "executor_r8": OPTIMIZATION_EXECUTOR_R8_SHA256, + "training_core_r1": TRAINING_CORE_R1_SHA256, + } + _require( + isinstance(value, Mapping) + and value.get("source_sha256") == OPTIMIZATION_RUNTIME_SHA256 + and value.get("source_bytes") == OPTIMIZATION_RUNTIME_BYTES + and value.get("frozen_r1_hotpath_sha256") + == OPTIMIZATION_R1_HOTPATH_SHA256 + and value.get("predecessor_source_sha256") == expected_predecessors + and value.get("exact_fp32_math_preserved") is True + and value.get("checkpoint_semantics_preserved") is True + and value.get("per_step_authority_file_reads") == 0 + and value.get("per_step_model_state_copies") == 0 + and value.get("per_step_optimizer_state_copies") == 0 + and value.get("per_step_full_state_hashes") == 0 + and value.get("prefetch_installed") is False + and value.get("amp_enabled") is False + and value.get("tf32_enabled") is False + and value.get("fused_optimizer_enabled") is False + and value.get("training_authorized") is False + and value.get("nova_submission_authorized") is False, + "R13 frozen R2 optimization receipt changed", + ) + + +def _validate_r3_optimization_receipt(value: Any) -> None: + predecessor = value.get("predecessor_r2_receipt") if isinstance( + value, Mapping + ) else None + _validate_r2_optimization_receipt(predecessor) + _require( + value.get("source_sha256") == OPTIMIZATION_R3_RUNTIME_SHA256 + and value.get("source_bytes") == OPTIMIZATION_R3_RUNTIME_BYTES + and value.get("predecessor_r2_loader_sha256") + == OPTIMIZATION_LOADER_SHA256 + and value.get("predecessor_r2_runtime_sha256") + == OPTIMIZATION_RUNTIME_SHA256 + and value.get("r8_executor_sha256") + == OPTIMIZATION_EXECUTOR_R8_SHA256 + and value.get("frozen_topology_loss_sha256") + == FROZEN_TOPOLOGY_LOSS_SHA256 + and value.get("full_plan_validation_boundaries") + == ["build", "bind", "resume"] + and value.get("exact_step_slice_checks_preserved") is True + and value.get("topology_bridge_availability_transfers_per_micro_max") + == 1 + and value.get("topology_bridge_batched_finite_checks_per_micro_max") + == 1 + and value.get("frozen_topology_loss_internal_validations_preserved") + is True + and value.get("checkpoint_valid_bytes_changed") is False + and value.get("checkpoint_exact_chain_length_required") is True + and value.get( + "checkpoint_cursor_prevalidated_before_state_mutation" + ) + is True + and value.get("python_numpy_rng_prevalidated_before_global_mutation") + is True + and value.get("python_numpy_rng_in_development_mutation_receipt") + is True + and value.get("transactional_checkpoint_manager_schema_checked") + is True + and value.get("transactional_checkpoint_commit_semantics_checked") + is True + and value.get("prefetch_installed") is False + and value.get("amp_enabled") is False + and value.get("tf32_enabled") is False + and value.get("fused_optimizer_enabled") is False + and value.get("ram_request_changed") is False + and value.get("r13_files_modified") is False + and value.get("training_authorized") is False + and value.get("nova_submission_authorized") is False, + "R13 frozen R3 optimization receipt changed", + ) + + +def _validate_bound_optimization_receipt( + value: Any, + *, + runtime_sha256: str, + runtime_bytes: int, +) -> str: + _require( + isinstance(value, Mapping) + and value.get("source_sha256") == runtime_sha256 + and value.get("source_bytes") == runtime_bytes, + "R13 bound optimization receipt identity changed", + ) + predecessor_r2 = value.get("predecessor_r2_receipt") + if predecessor_r2 is None: + _require( + runtime_sha256 == OPTIMIZATION_RUNTIME_SHA256 + and runtime_bytes == OPTIMIZATION_RUNTIME_BYTES, + "non-R2 optimization omitted its exact predecessor receipt", + ) + _validate_r2_optimization_receipt(value) + return "frozen_r2" + predecessor_r3 = value.get("predecessor_r3_receipt") + if predecessor_r3 is None: + _require( + runtime_sha256 == OPTIMIZATION_R3_RUNTIME_SHA256 + and runtime_bytes == OPTIMIZATION_R3_RUNTIME_BYTES, + "R3 successor runtime identity changed", + ) + _validate_r3_optimization_receipt(value) + optimization_kind = "r3_successor_over_frozen_r2" + else: + _validate_r3_optimization_receipt(predecessor_r3) + inherited_keys = ( + "predecessor_r2_loader_sha256", + "predecessor_r2_runtime_sha256", + "predecessor_r2_receipt", + "r8_executor_sha256", + "frozen_topology_loss_sha256", + "full_plan_validation_boundaries", + "per_step_plan_validation", + "exact_step_slice_checks_preserved", + "topology_bridge_availability_transfers_per_micro_max", + "topology_bridge_batched_finite_checks_per_micro_max", + "frozen_topology_loss_internal_validations_preserved", + "checkpoint_valid_bytes_changed", + "checkpoint_exact_chain_length_required", + "python_numpy_rng_prevalidated_before_global_mutation", + "python_numpy_rng_in_development_mutation_receipt", + "transactional_checkpoint_manager_schema_checked", + "transactional_checkpoint_commit_semantics_checked", + "prefetch_installed", + "amp_enabled", + "tf32_enabled", + "fused_optimizer_enabled", + "ram_request_changed", + "r13_coordination_paths", + "r13_files_modified", + "training_authorized", + "scientific_launch_authorized", + "nova_submission_authorized", + ) + _require( + value.get("predecessor_r3_loader_sha256") + == OPTIMIZATION_R3_LOADER_SHA256 + and value.get("predecessor_r3_runtime_sha256") + == OPTIMIZATION_R3_RUNTIME_SHA256 + and all( + value.get(key) == predecessor_r3.get(key) + for key in inherited_keys + ) + and "checkpoint_cursor_prevalidated_before_state_mutation" + not in value + and value.get( + "checkpoint_cursor_prevalidated_before_" + "model_optimizer_state_mutation" + ) + is True + and value.get("rng_numpy_exact_mt19937_shape_types_required") + is True + and value.get("rng_torch_cpu_disposable_generator_validation") + is True + and value.get("rng_torch_cuda_disposable_generator_validation") + is True + and value.get( + "rng_prevalidation_before_model_optimizer_global_mutation" + ) + is True + and value.get("development_history_sequential_rows_required") + is True + and value.get( + "development_history_chain_fields_exact_sha256_required" + ) + is True + and value.get( + "checkpoint_top_level_chain_equals_last_history_row_required" + ) + is True + and value.get( + "checkpoint_creation_chain_recomputed_from_exact_step_identities" + ) + is True + and value.get( + "checkpoint_creation_or_verified_load_provenance_required" + ) + is True + and value.get("checkpoint_history_max_epochs") == 100 + and value.get("checkpoint_restore_chain_recomputation_claimed") + is False + and value.get("checkpoint_additional_full_state_hashes") == 0 + and value.get( + "checkpoint_lightweight_provenance_" + "retired_after_commit_or_restore" + ) + is True, + "R13 R4 optimization successor receipt changed", + ) + optimization_kind = "r4_successor_over_frozen_r3" + bridge_status = value.get("r12_compatibility_bridge") + if bridge_status is None: + _require( + "exact_fp32_math_preserved" not in value + and "checkpoint_semantics_preserved" not in value + and "per_step_authority_file_reads" not in value + and "r12_compatibility_bridge_process_local_only" not in value + and "r12_compatibility_bridge_source_modified" not in value, + "unmarked R12 optimization compatibility fields appeared", + ) + else: + _require( + bridge_status + == ( + "TOP_LEVEL_R2_PRESERVATION_FIELDS_COPIED_FROM_" + "EXACT_NESTED_PREDECESSOR" + ) + and value.get("exact_fp32_math_preserved") + == predecessor_r2.get("exact_fp32_math_preserved") + is True + and value.get("checkpoint_semantics_preserved") + == predecessor_r2.get("checkpoint_semantics_preserved") + is True + and value.get("per_step_authority_file_reads") + == predecessor_r2.get("per_step_authority_file_reads") + == 0 + and value.get("r12_compatibility_bridge_process_local_only") + is True + and value.get("r12_compatibility_bridge_source_modified") is False, + "R12 optimization compatibility bridge changed", + ) + return optimization_kind + + +def _optimization_module_for_frozen_r12( + optimization: ModuleType, + binding: Mapping[str, Any], +) -> ModuleType: + """Adapt a nested R2 receipt to frozen R12's old read surface.""" + + installer_name = str(binding["OPTIMIZATION_INSTALLER_NAME"]) + installer = getattr(optimization, installer_name) + specifications = _optimization_source_specs(binding) + _runtime_path, runtime_sha256, runtime_bytes = specifications[ + "optimization_runtime" + ] + compatibility = ModuleType( + "_review_a5_native_eight_r13_process_local_r12_compatibility" + ) + + def install_optimized_execution_layer( + r9_module: ModuleType, + ) -> Mapping[str, Any]: + observed = installer(r9_module) + kind = _validate_bound_optimization_receipt( + observed, + runtime_sha256=runtime_sha256, + runtime_bytes=runtime_bytes, + ) + if kind == "frozen_r2": + return observed + predecessor = observed["predecessor_r2_receipt"] + bridged = { + **dict(observed), + "exact_fp32_math_preserved": predecessor[ + "exact_fp32_math_preserved" + ], + "checkpoint_semantics_preserved": predecessor[ + "checkpoint_semantics_preserved" + ], + "per_step_authority_file_reads": predecessor[ + "per_step_authority_file_reads" + ], + "r12_compatibility_bridge": ( + "TOP_LEVEL_R2_PRESERVATION_FIELDS_COPIED_FROM_" + "EXACT_NESTED_PREDECESSOR" + ), + "r12_compatibility_bridge_process_local_only": True, + "r12_compatibility_bridge_source_modified": False, + } + _validate_bound_optimization_receipt( + bridged, + runtime_sha256=runtime_sha256, + runtime_bytes=runtime_bytes, + ) + return MappingProxyType(bridged) + + setattr( + compatibility, + installer_name, + install_optimized_execution_layer, + ) + return compatibility + + +def install_bound_runtime( + *, + r9: ModuleType, + r11: ModuleType, + optimization: ModuleType, + binding: Mapping[str, Any], +) -> Mapping[str, Any]: + """Install the exact optimization layer before the exact R11 gate.""" + + _validate_final_binding(binding) + validate_fixed_source_closure(binding) + _validate_optimization_module(optimization, binding) + vocab_receipt = install_sequence_vocab_compatibility(r9) + r12_optimization = _optimization_module_for_frozen_r12( + optimization, + binding, + ) + receipt = _r12.install_bound_runtime( + r9=r9, + r11=r11, + optimization=r12_optimization, + binding=binding, + ) + optimization_receipt = receipt.get("optimization") + specifications = _optimization_source_specs(binding) + _runtime_path, runtime_sha256, runtime_bytes = specifications[ + "optimization_runtime" + ] + optimization_kind = _validate_bound_optimization_receipt( + optimization_receipt, + runtime_sha256=runtime_sha256, + runtime_bytes=runtime_bytes, + ) + if optimization_kind in { + "r3_successor_over_frozen_r2", + "r4_successor_over_frozen_r3", + }: + _require( + optimization_receipt.get("r12_compatibility_bridge") + == ( + "TOP_LEVEL_R2_PRESERVATION_FIELDS_COPIED_FROM_" + "EXACT_NESTED_PREDECESSOR" + ), + "optimization successor did not cross the frozen R12 boundary", + ) + return MappingProxyType( + { + **dict(receipt), + "schema": SCHEMA_R13, + "status": "PASS_R13_CLOSURE_OPTIMIZATION_THEN_R11_INSTALLED", + "installation_order": [ + "sequence_vocab_compatibility", + "optimization_exact_bound_successor", + "release_gate_r11", + ], + "optimization_kind": optimization_kind, + "sequence_vocab_compatibility": dict(vocab_receipt), + "source_closure": { + name: dict(item) + for name, item in validate_fixed_source_closure(binding).items() + }, + "training_authorized": False, + "nova_submission_authorized": False, + } + ) + + +# The exact R12 installation helper calls this global dynamically. +_r12._validate_final_binding = _validate_final_binding + + +def load_bound_runtime() -> tuple[ + ModuleType, + ModuleType, + Mapping[str, Any], + Mapping[str, Any], +]: + binding = _binding_source_value() + validate_final_source_closure(binding) + r9 = _load_exact_module( + R9_SOURCE_PATH, + expected_sha256=R9_SOURCE_SHA256, + expected_bytes=R9_SOURCE_BYTES, + name="_review_a5_native_eight_r9_exact_for_r13", + ) + r11 = _load_exact_module( + R11_SOURCE_PATH, + expected_sha256=R11_SOURCE_SHA256, + expected_bytes=R11_SOURCE_BYTES, + name="_review_a5_native_eight_r11_exact_for_r13", + ) + specifications = _optimization_source_specs(binding) + optimization_path, optimization_sha256, optimization_bytes = specifications[ + "optimization_loader" + ] + optimization = _load_exact_module( + optimization_path, + expected_sha256=optimization_sha256, + expected_bytes=optimization_bytes, + name="_review_a5_native_eight_optimization_loader_exact_for_r13", + ) + installation = install_bound_runtime( + r9=r9, + r11=r11, + optimization=optimization, + binding=binding, + ) + return r9, r11, binding, installation + + +def prepare_exact_production_a111( + *, + launch_config_path: Path = LAUNCH_CONFIG_PATH, + expected_launch_config_sha256: str, + device: str = "cuda:0", +) -> PreparedExactProductionA111: + """Prepare exact A111 epoch zero without a step, checkpoint, or write. + + This entry is intentionally unavailable while the R13 final binding is a + sentinel. It mirrors the production constructor through the point where + the full epoch-zero plan is bound, then returns the live exact objects for + a separately authorized diagnostic. + """ + + _require( + Path(launch_config_path) == LAUNCH_CONFIG_PATH + and SHA_RE.fullmatch(expected_launch_config_sha256) is not None + and device in {"cpu", "cuda:0"}, + "A111 preparation requires the fixed config, exact hash, and one device", + ) + r9, r11, binding, installation = load_bound_runtime() + config_raw = read_regular_nofollow( + LAUNCH_CONFIG_PATH, + maximum=4 * 1024 * 1024, + require_read_only=True, + ) + _require( + hashlib.sha256(config_raw).hexdigest() + == expected_launch_config_sha256, + "fixed R13 launch config hash changed", + ) + r2 = getattr(getattr(r9, "_r8", None), "_r2", None) + core = getattr(r9, "_core", None) + _require( + isinstance(r2, ModuleType) + and isinstance(core, ModuleType) + and callable(getattr(core, "_load_r8", None)) + and callable(getattr(core, "_configure_reproducibility", None)), + "exact R9 training core API changed", + ) + r2._EXTERNAL_LAUNCH_CONFIG_FILE_SHA256 = ( + expected_launch_config_sha256 + ) + config = core.LaunchConfig.load(LAUNCH_CONFIG_PATH) + _require( + config.semantic_array_id + == "bertose-native8-seed43-corrected-20260726-r13", + "fixed R13 semantic array identity changed", + ) + release = r2._validate_external_release_r2( + config, + launch_config_path=LAUNCH_CONFIG_PATH, + ) + _require( + isinstance(release, Mapping) + and release.get("semantic_array_id") == config.semantic_array_id, + "job-time R11 external release validation changed", + ) + r2._VALIDATED_EXTERNAL_RELEASE = release + core._configure_reproducibility() + r8 = core._load_r8() + r5 = r8._core._r6._r5 + install_sequence_vocab_compatibility(r9) + static_bundle = core.StaticBundle.load(config) + adapter_class = core._make_static_adapter_class(r8, static_bundle) + adapter = adapter_class() + _require( + len(adapter.train_rows) == 221_827, + "exact A111 training-parent roster changed", + ) + plan = adapter.build_epoch_plan(0) + _require( + plan.epoch == 0 + and plan.parent_count == 221_827 + and len(plan.ordered_parent_ids) == 221_827 + and plan.optimizer_step_count == 1_734, + "exact A111 epoch-zero plan shape changed", + ) + model_config = r8.NativeEightConfig( + cell_id="A111", + seq_vocab_size=int(r5.SEQUENCE_VOCAB_SIZE), + ) + model = r8.NativeEightCompositeR5(model_config) + r8._install_model_bridge(model, adapter) + torch_module = core.torch + target_device = torch_module.device(device) + if target_device.type == "cuda": + _require( + target_device.index == 0 + and torch_module.cuda.is_available() is True + and torch_module.cuda.device_count() == 1, + "exact A111 CUDA preparation requires singleton cuda:0", + ) + model.to(target_device) + executor = core._construct_static_executor( + r8, + model, + static_bundle.null_scale, + ) + run_identity, run_identity_sha256 = core._run_identity( + r8=r8, + launch_config=config, + cell_id="A111", + adapter=adapter, + model=model, + executor=executor, + static_bundle=static_bundle, + ) + executor.bind_epoch_plan(plan) + parameter_count = sum( + parameter.numel() for parameter in model.parameters() + ) + _require( + parameter_count == EXPECTED_MODEL_PARAMETER_COUNT + and executor.cell_id == "A111" + and dict(executor.coefficients) + == {"sequence": 1, "topology": 1, "ms": 1, "static": 1} + and executor.next_optimizer_step == 0 + and executor.bound_plan is plan, + "exact A111 model/executor preparation changed", + ) + receipt = MappingProxyType( + { + "schema": ( + "bertose_review_a5_native_eight_exact_production_a111_" + "preparation_20260726_r13" + ), + "status": "PASS_EXACT_A111_EPOCH_ZERO_PREPARED_NOT_EXECUTED", + "cell_id": "A111", + "train_parent_count": 221_827, + "optimizer_step_count": 1_734, + "epoch": 0, + "model_parameter_count": parameter_count, + "device": str(target_device), + "run_identity_sha256": run_identity_sha256, + "static_binding_sha256": static_bundle.binding_sha256, + "executor_next_optimizer_step": executor.next_optimizer_step, + "training_step_executed": False, + "optimizer_step_executed": False, + "checkpoint_written": False, + "resume_executed": False, + "completed_production_epoch_claimed": False, + "output_path_created": False, + "training_authorized": False, + "nova_submission_authorized": False, + } + ) + return PreparedExactProductionA111( + r9=r9, + r11=r11, + binding=binding, + installation=installation, + launch_config=config, + static_bundle=static_bundle, + adapter=adapter, + epoch_plan=plan, + model=model, + executor=executor, + run_identity=MappingProxyType(dict(run_identity)), + run_identity_sha256=run_identity_sha256, + preparation_receipt=receipt, + ) + + +def describe_binding() -> Mapping[str, Any]: + value = dict(_binding_source_value()) + value.update( + { + "runner_schema": SCHEMA_R13, + "array": "0-7", + "gres": "gpu:1", + "concurrency_throttle": None, + "constraint": None, + "training_authorized": False, + "nova_submission_authorized": False, + } + ) + return MappingProxyType(value) + + +def validate_sbatch_surface( + payload: bytes, + *, + inherited_parser: Any | None = None, +) -> Mapping[str, str | None]: + return _r12.validate_sbatch_surface( + payload, + inherited_parser=inherited_parser, + ) + + +validate_singleton_gpu = _r12.validate_singleton_gpu + + +def _array_task_id(argv: Sequence[str]) -> int: + for index, token in enumerate(argv): + if token == "--array-task-id" and index + 1 < len(argv): + value = argv[index + 1] + _require( + value in {str(number) for number in range(8)}, + "array task is outside 0-7", + ) + return int(value) + raise NativeEightTrainingR13Error( + "--array-task-id is required for CUDA training" + ) + + +def main(argv: Sequence[str] | None = None) -> int: + parser = argparse.ArgumentParser(add_help=False) + parser.add_argument("--describe-r13-binding", action="store_true") + parser.add_argument("--r6-binding-sha256") + parser.add_argument("--r6-binding-bytes", type=int) + outer, remaining = parser.parse_known_args(argv) + if outer.describe_r13_binding: + print(canonical_bytes(dict(describe_binding())).decode("ascii"), end="") + return 0 + r9, _r11, binding, _installation = load_bound_runtime() + _require( + outer.r6_binding_sha256 == binding["R6_TERMINAL_BINDING_SHA256"] + and outer.r6_binding_bytes == binding["R6_TERMINAL_BINDING_BYTES"], + "sbatch R6 terminal binding pin differs from R13 binding", + ) + structure_only = ( + "--validate-launch-config-only" in remaining or "--describe" in remaining + ) + if not structure_only: + task_id = _array_task_id(remaining) + validate_singleton_gpu( + environment=os.environ, + torch_module=r9._core.torch, + array_task_id=task_id, + ) + return int(r9.main(remaining)) + + +__all__ = [ + "BINDING_SOURCE_PATH", + "EXPECTED_INSTALLER_SIGNATURE", + "FINAL_BINDING_SCHEMA", + "FINAL_BINDING_STATUS", + "NativeEightTrainingR13Error", + "PreparedExactProductionA111", + "R9_SOURCE_BYTES", + "R9_SOURCE_SHA256", + "SBATCH_PATH", + "SCHEMA_R13", + "canonical_bytes", + "describe_binding", + "install_bound_runtime", + "install_sequence_vocab_compatibility", + "load_bound_runtime", + "main", + "prepare_exact_production_a111", + "read_exact_source", + "read_regular_nofollow", + "run_exact_model_construction_smoke", + "source_closure_paths", + "validate_final_source_closure", + "validate_fixed_source_closure", + "validate_model_construction_smoke_receipt", + "validate_sbatch_surface", + "validate_singleton_gpu", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/run_review_a5_native_eight_training_r13.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/run_review_a5_native_eight_training_r13.py new file mode 100644 index 0000000000000000000000000000000000000000..10b7996b0a45466771fe54c809283c254df29e07 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/run_review_a5_native_eight_training_r13.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +"""Hash-pinned CLI for the launch-closed native-eight R13 candidate.""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import stat +import sys +from types import ModuleType + + +SOURCE_SHA256 = "17cf8ab216b354ec1de7574ebebd7bfe02b5935da605b4131e45c7aa13982d5b" +SOURCE_BYTES = 60_696 +SOURCE_PATH = Path(__file__).absolute().with_name( + "review_a5_native_eight_training_runner_r13.py" +) + + +def _load() -> ModuleType: + descriptor = os.open( + SOURCE_PATH, + os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0), + ) + try: + before = os.fstat(descriptor) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or before.st_size != SOURCE_BYTES + or before.st_mode & 0o222 + ): + raise RuntimeError("native-eight R13 source is not immutable") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise RuntimeError("native-eight R13 source truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ): + raise RuntimeError("native-eight R13 source changed during read") + finally: + os.close(descriptor) + raw = b"".join(chunks) + if hashlib.sha256(raw).hexdigest() != SOURCE_SHA256: + raise RuntimeError("native-eight R13 source SHA-256 changed") + name = "_review_a5_native_eight_training_r13_pinned_cli" + module = ModuleType(name) + module.__file__ = os.fspath(SOURCE_PATH) + module.__package__ = "" + previous = sys.modules.get(name) + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + if previous is None: + sys.modules.pop(name, None) + else: + sys.modules[name] = previous + raise + return module + + +if __name__ == "__main__": + raise SystemExit(_load().main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/__init__.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..f82426c506d3d3dcd2e87e9bfd308d006597d00e --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/__init__.py @@ -0,0 +1 @@ +"""Launch-closed R14 strict R6 integration candidate for native eight.""" diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_final_bindings_r14.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_final_bindings_r14.py new file mode 100644 index 0000000000000000000000000000000000000000..a6ca13cb89673c436cd4eab497f59785a98bc3ff --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_final_bindings_r14.py @@ -0,0 +1,158 @@ +"""Preparation-only exact bindings for the R14 strict R6 integration. + +The frozen R6 optimization successor is fully pinned here. The separate +static-representation R6 terminal binding is still absent, so this source is +deliberately launch-closed and must not be promoted or submitted. +""" + +SCHEMA = "bertose_review_a5_native_eight_final_bindings_20260726_r14" +STATUS = "PREPARATION_ONLY_WAITING_FOR_STATIC_R6_TERMINAL_BINDING" + +R13_PREDECESSOR_SOURCE_SHA256 = ( + "17cf8ab216b354ec1de7574ebebd7bfe02b5935da605b4131e45c7aa13982d5b" +) +R13_PREDECESSOR_SOURCE_BYTES = 60_696 +R13_PACKAGE_INIT_SHA256 = ( + "773035c83f54a5d7b002faa1d2f1f670b41546692eea8aa4efc46b2c5d4eb268" +) +R13_PACKAGE_INIT_BYTES = 77 + +R12_PREDECESSOR_SOURCE_SHA256 = ( + "47e973c7c4ed5bc6686e5d7795b00d3eea5c2da8c2a15fc534a7cc24c1744ee1" +) +R12_PREDECESSOR_SOURCE_BYTES = 23_200 +R9_SOURCE_SHA256 = ( + "4430560565a18da0e68700d60526d3dec15fabd79854111d1e85deb59e2381c8" +) +R9_SOURCE_BYTES = 7_443 +R11_SOURCE_SHA256 = ( + "ce7626823c2980bc21b46a7eec6c1961a87dc5512525e553c49f2c7d57bf0430" +) +R11_SOURCE_BYTES = 49_854 + +R6_TERMINAL_SOURCE_SHA256 = ( + "bdb0fa37804531f6446cee9411c9730fde792eb9674054e56b883156f36da4cb" +) +R6_TERMINAL_SOURCE_BYTES = 133_704 +R6_TERMINAL_BINDING_SHA256 = "PENDING_STATIC_R6_TERMINAL_BINDING" +R6_TERMINAL_BINDING_BYTES = 0 + +OPTIMIZATION_SOURCE_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/" + "load_review_a5_native_eight_hotpath_r6.py" +) +OPTIMIZATION_SOURCE_SHA256 = ( + "e2496170942db844e4ebe71d4c098b0d0cf99540d3465ed7e8e9a113469cf7d2" +) +OPTIMIZATION_SOURCE_BYTES = 4_013 +OPTIMIZATION_RUNTIME_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/" + "review_a5_native_eight_hotpath_r6.py" +) +OPTIMIZATION_RUNTIME_SHA256 = ( + "73b42e5131c64284c6f748ddf81b4d187dcb57f756c88c22240d189f2afc4cef" +) +OPTIMIZATION_RUNTIME_BYTES = 17_373 +OPTIMIZATION_TEST_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/" + "test_review_a5_native_eight_hotpath_r6.py" +) +OPTIMIZATION_TEST_SHA256 = ( + "8acb8f578f94d6ad25a966615052bb1d3be0848914c513a02aa40970743986b3" +) +OPTIMIZATION_TEST_BYTES = 20_399 + +OPTIMIZATION_RECEIPT_SCHEMA = ( + "bertose_review_a5_native_eight_hotpath_20260726_r6" +) +OPTIMIZATION_RECEIPT_STATUS = "INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED" +OPTIMIZATION_INTEGRITY_RECEIPT_RELATIVE = ( + "review/multimodal/outputs/" + "review_a5_native_eight_hotpath_20260726_r6/" + "review_a5_native_eight_hotpath_r6_integrity_receipt.json" +) +OPTIMIZATION_INTEGRITY_RECEIPT_SHA256 = ( + "0c078ce52e2eb6d6feaeb1a1c2af1794ef33aef56aca7959f76a93f39d152692" +) +OPTIMIZATION_INTEGRITY_RECEIPT_BYTES = 3_933 +OPTIMIZATION_INTEGRITY_RECEIPT_SCHEMA = ( + "bertose_review_a5_native_eight_hotpath_integrity_receipt_20260726_r6" +) +OPTIMIZATION_INTEGRITY_RECEIPT_STATUS = ( + "PASS_STRONG_OWNER_PROVENANCE_SUCCESSOR_" + "PREPARATION_ONLY_LAUNCH_CLOSED" +) + +OPTIMIZATION_PREDECESSOR_R5_STATUS = ( + "SUPERSEDED_NOT_LAUNCHABLE_SAME_CONSTITUENT_IMPOSTOR_ACCEPTANCE" +) +OPTIMIZATION_PREDECESSOR_R5_SOURCE_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/" + "load_review_a5_native_eight_hotpath_r5.py" +) +OPTIMIZATION_PREDECESSOR_R5_SOURCE_SHA256 = ( + "864a05e86c5ea91318b11373d2cdffcdd2ddd0777f141cb7ef0305f779a42ea6" +) +OPTIMIZATION_PREDECESSOR_R5_SOURCE_BYTES = 4_013 +OPTIMIZATION_PREDECESSOR_R5_RUNTIME_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/" + "review_a5_native_eight_hotpath_r5.py" +) +OPTIMIZATION_PREDECESSOR_R5_RUNTIME_SHA256 = ( + "ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8" +) +OPTIMIZATION_PREDECESSOR_R5_RUNTIME_BYTES = 17_677 +OPTIMIZATION_PREDECESSOR_R5_TEST_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/" + "test_review_a5_native_eight_hotpath_r5.py" +) +OPTIMIZATION_PREDECESSOR_R5_TEST_SHA256 = ( + "fb36b4b6e474ecce6c61565a55e50092e6bbe8405d1e4bdd6032af4fdbdacd01" +) +OPTIMIZATION_PREDECESSOR_R5_TEST_BYTES = 20_423 +OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_RELATIVE = ( + "review/multimodal/outputs/" + "review_a5_native_eight_hotpath_20260726_r5/" + "review_a5_native_eight_hotpath_r5_integrity_receipt.json" +) +OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_SHA256 = ( + "59a2fd53e9e75f6f8ec258d76e103adb61c908ab0ace6718a348739f5b70d8bd" +) +OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_BYTES = 3_995 +OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_SCHEMA = ( + "bertose_review_a5_native_eight_hotpath_integrity_receipt_20260726_r5" +) +OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_STATUS = ( + "PASS_LOCAL_PROVENANCE_LIFECYCLE_SUCCESSOR_" + "PREPARATION_ONLY_LAUNCH_CLOSED" +) + +OPTIMIZATION_R1_HOTPATH_SHA256 = ( + "3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f" +) +OPTIMIZATION_R1_HOTPATH_BYTES = 33_246 +OPTIMIZATION_R5_EXECUTOR_SHA256 = ( + "a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2" +) +OPTIMIZATION_R5_EXECUTOR_BYTES = 74_648 +OPTIMIZATION_ADAPTER_R3_SHA256 = ( + "a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e" +) +OPTIMIZATION_ADAPTER_R3_BYTES = 41_304 +OPTIMIZATION_EXECUTOR_R8_SHA256 = ( + "60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630" +) +OPTIMIZATION_EXECUTOR_R8_BYTES = 52_743 +TRAINING_CORE_R1_SHA256 = ( + "34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf" +) +TRAINING_CORE_R1_BYTES = 97_336 + +OPTIMIZATION_INSTALLER_NAME = "install_optimized_execution_layer" +OPTIMIZATION_INSTALLER_SIGNATURE = ( + "(r9_module: 'ModuleType') -> 'Mapping[str, Any]'" +) + +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +NOVA_SUBMISSION_AUTHORIZED = False diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_strict_successor_r14.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_strict_successor_r14.py new file mode 100644 index 0000000000000000000000000000000000000000..0dfe924fe8fa8328223414f9f7690448310f0ef1 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_strict_successor_r14.py @@ -0,0 +1,1280 @@ +"""Strict, launch-closed R6 integration over the exact R13 runtime graph. + +This child changes no experiment or training behavior. It closes only the +receipt and source-closure gaps found by independent audit: + +* exact R2/R3/R4/R5/R6 receipt schemas and launch-closed status; +* three explicit false authorization flags at every hot-path layer; +* exact R3 per-step validation semantics; +* exact integer types for history limits and full-state hash counts; +* exact frozen R6 loader/runtime/test/integrity-receipt bindings; and +* explicit package ``__init__.py`` membership in the production closure. + +The static-representation R6 terminal binding is still absent. Consequently +the checked-in binding remains preparation-only and ``load_bound_runtime()`` +fails closed unless tests inject a structurally final, non-authorizing binding. +""" + +from __future__ import annotations + +import copy +import hashlib +import inspect +import json +import os +from pathlib import Path +import re +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + +from review.multimodal.runtime.a5_native_eight_training_20260726_r13_final_candidate import ( + review_a5_native_eight_training_runner_r13 as _r13, +) + + +SCHEMA_R14 = ( + "bertose_review_a5_native_eight_training_20260726_" + "r14_r6_strict_candidate" +) +INSTALLATION_STATUS = "INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED" +FINAL_BINDING_SCHEMA = ( + "bertose_review_a5_native_eight_final_bindings_20260726_r14" +) +PREPARATION_BINDING_STATUS = ( + "PREPARATION_ONLY_WAITING_FOR_STATIC_R6_TERMINAL_BINDING" +) +FINAL_BINDING_STATUS = ( + "BOUND_FINAL_STATIC_R6_R11_AND_R6_STRICT_OPTIMIZATION_IDENTITIES_R14" +) +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") +AUTHORIZATION_FIELDS = ( + "training_authorized", + "scientific_launch_authorized", + "nova_submission_authorized", +) +EXPECTED_R3_PER_STEP_PLAN_VALIDATION = ( + "constant_time_exact_object_hash_epoch_field_identity_and_mapping_stamp" +) +SUPERSEDED_R5_STATUS = ( + "SUPERSEDED_NOT_LAUNCHABLE_SAME_CONSTITUENT_IMPOSTOR_ACCEPTANCE" +) + +RUNNER_PATH = Path(__file__).absolute() +RUNTIME_DIRECTORY = RUNNER_PATH.parent +PACKAGE_INIT_PATH = RUNTIME_DIRECTORY / "__init__.py" +BINDING_SOURCE_PATH = ( + RUNTIME_DIRECTORY / "review_a5_native_eight_final_bindings_r14.py" +) +WRITING_ROOT = _r13.WRITING_ROOT +RUNTIME_ROOT = WRITING_ROOT / "review/multimodal/runtime" + +R13_PACKAGE_DIRECTORY = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260726_r13_final_candidate" +) +R13_PACKAGE_INIT_PATH = R13_PACKAGE_DIRECTORY / "__init__.py" +R13_PACKAGE_INIT_SHA256 = ( + "773035c83f54a5d7b002faa1d2f1f670b41546692eea8aa4efc46b2c5d4eb268" +) +R13_PACKAGE_INIT_BYTES = 77 +R13_RUNNER_PATH = ( + R13_PACKAGE_DIRECTORY / "review_a5_native_eight_training_runner_r13.py" +) +R13_RUNNER_SHA256 = ( + "17cf8ab216b354ec1de7574ebebd7bfe02b5935da605b4131e45c7aa13982d5b" +) +R13_RUNNER_BYTES = 60_696 +R13_WRAPPER_PATH = ( + R13_PACKAGE_DIRECTORY / "run_review_a5_native_eight_training_r13.py" +) +R13_CONTROLLER_PATH = ( + R13_PACKAGE_DIRECTORY + / "review_a5_native_eight_direct_submit_controller_r13.py" +) +R13_BUILDER_PATH = ( + WRITING_ROOT + / "review/multimodal/scripts" + / "build_review_a5_native_eight_r11_successor_20260726_r13.py" +) + +R2_SCHEMA = "bertose_review_a5_native_eight_hotpath_20260725_r2" +R3_SCHEMA = "bertose_review_a5_native_eight_hotpath_20260726_r3" +R4_SCHEMA = "bertose_review_a5_native_eight_hotpath_20260726_r4" +R5_SCHEMA = "bertose_review_a5_native_eight_hotpath_20260726_r5" +R6_SCHEMA = "bertose_review_a5_native_eight_hotpath_20260726_r6" + +R2_RUNTIME_SHA256 = _r13.OPTIMIZATION_RUNTIME_SHA256 +R2_RUNTIME_BYTES = _r13.OPTIMIZATION_RUNTIME_BYTES +R3_RUNTIME_SHA256 = _r13.OPTIMIZATION_R3_RUNTIME_SHA256 +R3_RUNTIME_BYTES = _r13.OPTIMIZATION_R3_RUNTIME_BYTES +R4_LOADER_SHA256 = ( + "662d0766a8d68638480e9c44ca4070387481d43e1c666a20363025cf5b9bc958" +) +R4_RUNTIME_SHA256 = ( + "600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649" +) +R4_RUNTIME_BYTES = 23_798 +R5_LOADER_SHA256 = ( + "864a05e86c5ea91318b11373d2cdffcdd2ddd0777f141cb7ef0305f779a42ea6" +) +R5_LOADER_BYTES = 4_013 +R5_LOADER_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/" + "load_review_a5_native_eight_hotpath_r5.py" +) +R5_RUNTIME_SHA256 = ( + "ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8" +) +R5_RUNTIME_BYTES = 17_677 +R5_RUNTIME_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/" + "review_a5_native_eight_hotpath_r5.py" +) +R5_TEST_SHA256 = ( + "fb36b4b6e474ecce6c61565a55e50092e6bbe8405d1e4bdd6032af4fdbdacd01" +) +R5_TEST_BYTES = 20_423 +R5_TEST_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/" + "test_review_a5_native_eight_hotpath_r5.py" +) +R5_INTEGRITY_RECEIPT_SHA256 = ( + "59a2fd53e9e75f6f8ec258d76e103adb61c908ab0ace6718a348739f5b70d8bd" +) +R5_INTEGRITY_RECEIPT_BYTES = 3_995 +R5_INTEGRITY_RELATIVE = ( + "review/multimodal/outputs/" + "review_a5_native_eight_hotpath_20260726_r5/" + "review_a5_native_eight_hotpath_r5_integrity_receipt.json" +) +R5_INTEGRITY_SCHEMA = ( + "bertose_review_a5_native_eight_hotpath_integrity_receipt_20260726_r5" +) +R5_INTEGRITY_STATUS = ( + "PASS_LOCAL_PROVENANCE_LIFECYCLE_SUCCESSOR_" + "PREPARATION_ONLY_LAUNCH_CLOSED" +) + +R6_LOADER_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/" + "load_review_a5_native_eight_hotpath_r6.py" +) +R6_LOADER_SHA256 = ( + "e2496170942db844e4ebe71d4c098b0d0cf99540d3465ed7e8e9a113469cf7d2" +) +R6_LOADER_BYTES = 4_013 +R6_RUNTIME_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/" + "review_a5_native_eight_hotpath_r6.py" +) +R6_RUNTIME_SHA256 = ( + "73b42e5131c64284c6f748ddf81b4d187dcb57f756c88c22240d189f2afc4cef" +) +R6_RUNTIME_BYTES = 17_373 +R6_TEST_RELATIVE = ( + "review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/" + "test_review_a5_native_eight_hotpath_r6.py" +) +R6_TEST_SHA256 = ( + "8acb8f578f94d6ad25a966615052bb1d3be0848914c513a02aa40970743986b3" +) +R6_TEST_BYTES = 20_399 +R6_INTEGRITY_RELATIVE = ( + "review/multimodal/outputs/" + "review_a5_native_eight_hotpath_20260726_r6/" + "review_a5_native_eight_hotpath_r6_integrity_receipt.json" +) +R6_INTEGRITY_SHA256 = ( + "0c078ce52e2eb6d6feaeb1a1c2af1794ef33aef56aca7959f76a93f39d152692" +) +R6_INTEGRITY_BYTES = 3_933 +R6_INTEGRITY_SCHEMA = ( + "bertose_review_a5_native_eight_hotpath_integrity_receipt_20260726_r6" +) +R6_INTEGRITY_STATUS = ( + "PASS_STRONG_OWNER_PROVENANCE_SUCCESSOR_" + "PREPARATION_ONLY_LAUNCH_CLOSED" +) + +_BINDING_NAMES = ( + "SCHEMA", + "STATUS", + "R13_PREDECESSOR_SOURCE_SHA256", + "R13_PREDECESSOR_SOURCE_BYTES", + "R13_PACKAGE_INIT_SHA256", + "R13_PACKAGE_INIT_BYTES", + "R12_PREDECESSOR_SOURCE_SHA256", + "R12_PREDECESSOR_SOURCE_BYTES", + "R9_SOURCE_SHA256", + "R9_SOURCE_BYTES", + "R11_SOURCE_SHA256", + "R11_SOURCE_BYTES", + "R6_TERMINAL_SOURCE_SHA256", + "R6_TERMINAL_SOURCE_BYTES", + "R6_TERMINAL_BINDING_SHA256", + "R6_TERMINAL_BINDING_BYTES", + "OPTIMIZATION_SOURCE_RELATIVE", + "OPTIMIZATION_SOURCE_SHA256", + "OPTIMIZATION_SOURCE_BYTES", + "OPTIMIZATION_RUNTIME_RELATIVE", + "OPTIMIZATION_RUNTIME_SHA256", + "OPTIMIZATION_RUNTIME_BYTES", + "OPTIMIZATION_TEST_RELATIVE", + "OPTIMIZATION_TEST_SHA256", + "OPTIMIZATION_TEST_BYTES", + "OPTIMIZATION_RECEIPT_SCHEMA", + "OPTIMIZATION_RECEIPT_STATUS", + "OPTIMIZATION_INTEGRITY_RECEIPT_RELATIVE", + "OPTIMIZATION_INTEGRITY_RECEIPT_SHA256", + "OPTIMIZATION_INTEGRITY_RECEIPT_BYTES", + "OPTIMIZATION_INTEGRITY_RECEIPT_SCHEMA", + "OPTIMIZATION_INTEGRITY_RECEIPT_STATUS", + "OPTIMIZATION_PREDECESSOR_R5_STATUS", + "OPTIMIZATION_PREDECESSOR_R5_SOURCE_RELATIVE", + "OPTIMIZATION_PREDECESSOR_R5_SOURCE_SHA256", + "OPTIMIZATION_PREDECESSOR_R5_SOURCE_BYTES", + "OPTIMIZATION_PREDECESSOR_R5_RUNTIME_RELATIVE", + "OPTIMIZATION_PREDECESSOR_R5_RUNTIME_SHA256", + "OPTIMIZATION_PREDECESSOR_R5_RUNTIME_BYTES", + "OPTIMIZATION_PREDECESSOR_R5_TEST_RELATIVE", + "OPTIMIZATION_PREDECESSOR_R5_TEST_SHA256", + "OPTIMIZATION_PREDECESSOR_R5_TEST_BYTES", + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_RELATIVE", + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_SHA256", + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_BYTES", + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_SCHEMA", + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_STATUS", + "OPTIMIZATION_R1_HOTPATH_SHA256", + "OPTIMIZATION_R1_HOTPATH_BYTES", + "OPTIMIZATION_R5_EXECUTOR_SHA256", + "OPTIMIZATION_R5_EXECUTOR_BYTES", + "OPTIMIZATION_ADAPTER_R3_SHA256", + "OPTIMIZATION_ADAPTER_R3_BYTES", + "OPTIMIZATION_EXECUTOR_R8_SHA256", + "OPTIMIZATION_EXECUTOR_R8_BYTES", + "TRAINING_CORE_R1_SHA256", + "TRAINING_CORE_R1_BYTES", + "OPTIMIZATION_INSTALLER_NAME", + "OPTIMIZATION_INSTALLER_SIGNATURE", + "TRAINING_AUTHORIZED", + "SCIENTIFIC_LAUNCH_AUTHORIZED", + "NOVA_SUBMISSION_AUTHORIZED", +) + + +class NativeEightStrictSuccessorR14Error(RuntimeError): + """The R14 binding, strict receipt chain, or source closure changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightStrictSuccessorR14Error(message) + + +def _read_bound_file( + path: Path, + *, + expected_sha256: str, + expected_bytes: int, + require_read_only: bool, +) -> bytes: + _require( + type(expected_sha256) is str + and SHA_RE.fullmatch(expected_sha256) is not None + and type(expected_bytes) is int + and expected_bytes > 0, + f"{path.name} identity has unresolved types", + ) + raw = _r13.read_regular_nofollow( + path, + maximum=64 * 1024 * 1024, + require_read_only=require_read_only, + ) + _require( + len(raw) == expected_bytes + and hashlib.sha256(raw).hexdigest() == expected_sha256, + f"{path.name} exact identity changed", + ) + return raw + + +_read_bound_file( + R13_RUNNER_PATH, + expected_sha256=R13_RUNNER_SHA256, + expected_bytes=R13_RUNNER_BYTES, + require_read_only=False, +) +_read_bound_file( + R13_PACKAGE_INIT_PATH, + expected_sha256=R13_PACKAGE_INIT_SHA256, + expected_bytes=R13_PACKAGE_INIT_BYTES, + require_read_only=False, +) + + +def _relative_review_path(value: Any, *, label: str) -> Path: + _require( + type(value) is str + and bool(value) + and not value.startswith("/") + and "\\" not in value + and os.path.normpath(value) == value, + f"{label} is not one canonical relative path", + ) + relative = Path(value) + _require( + not relative.is_absolute() + and relative.parts[:2] == ("review", "multimodal") + and all(part not in {"", ".", ".."} for part in relative.parts), + f"{label} is outside review/multimodal", + ) + return WRITING_ROOT / relative + + +def binding_source_value() -> Mapping[str, Any]: + raw = _r13.read_regular_nofollow( + BINDING_SOURCE_PATH, + maximum=64 * 1024, + require_read_only=False, + ) + module = ModuleType("_review_a5_native_eight_r14_binding_observed") + module.__file__ = os.fspath(BINDING_SOURCE_PATH) + exec( + compile(raw, os.fspath(BINDING_SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + value = {name: getattr(module, name, None) for name in _BINDING_NAMES} + if value.get("STATUS") == FINAL_BINDING_STATUS: + frozen = _r13.read_regular_nofollow( + BINDING_SOURCE_PATH, + maximum=64 * 1024, + require_read_only=True, + ) + _require(frozen == raw, "final R14 binding changed during readback") + return MappingProxyType( + { + **value, + "binding_source_sha256": hashlib.sha256(raw).hexdigest(), + "binding_source_bytes": len(raw), + } + ) + + +def _validate_fixed_binding(value: Mapping[str, Any]) -> None: + expected = { + "SCHEMA": FINAL_BINDING_SCHEMA, + "R13_PREDECESSOR_SOURCE_SHA256": R13_RUNNER_SHA256, + "R13_PREDECESSOR_SOURCE_BYTES": R13_RUNNER_BYTES, + "R13_PACKAGE_INIT_SHA256": R13_PACKAGE_INIT_SHA256, + "R13_PACKAGE_INIT_BYTES": R13_PACKAGE_INIT_BYTES, + "R12_PREDECESSOR_SOURCE_SHA256": _r13.R12_PREDECESSOR_SHA256, + "R12_PREDECESSOR_SOURCE_BYTES": _r13.R12_PREDECESSOR_BYTES, + "R9_SOURCE_SHA256": _r13.R9_SOURCE_SHA256, + "R9_SOURCE_BYTES": _r13.R9_SOURCE_BYTES, + "R11_SOURCE_SHA256": _r13.R11_SOURCE_SHA256, + "R11_SOURCE_BYTES": _r13.R11_SOURCE_BYTES, + "R6_TERMINAL_SOURCE_SHA256": _r13.R6_TERMINAL_SOURCE_SHA256, + "R6_TERMINAL_SOURCE_BYTES": _r13.R6_TERMINAL_SOURCE_BYTES, + "OPTIMIZATION_SOURCE_RELATIVE": R6_LOADER_RELATIVE, + "OPTIMIZATION_SOURCE_SHA256": R6_LOADER_SHA256, + "OPTIMIZATION_SOURCE_BYTES": R6_LOADER_BYTES, + "OPTIMIZATION_RUNTIME_RELATIVE": R6_RUNTIME_RELATIVE, + "OPTIMIZATION_RUNTIME_SHA256": R6_RUNTIME_SHA256, + "OPTIMIZATION_RUNTIME_BYTES": R6_RUNTIME_BYTES, + "OPTIMIZATION_TEST_RELATIVE": R6_TEST_RELATIVE, + "OPTIMIZATION_TEST_SHA256": R6_TEST_SHA256, + "OPTIMIZATION_TEST_BYTES": R6_TEST_BYTES, + "OPTIMIZATION_RECEIPT_SCHEMA": R6_SCHEMA, + "OPTIMIZATION_RECEIPT_STATUS": INSTALLATION_STATUS, + "OPTIMIZATION_INTEGRITY_RECEIPT_RELATIVE": R6_INTEGRITY_RELATIVE, + "OPTIMIZATION_INTEGRITY_RECEIPT_SHA256": R6_INTEGRITY_SHA256, + "OPTIMIZATION_INTEGRITY_RECEIPT_BYTES": R6_INTEGRITY_BYTES, + "OPTIMIZATION_INTEGRITY_RECEIPT_SCHEMA": R6_INTEGRITY_SCHEMA, + "OPTIMIZATION_INTEGRITY_RECEIPT_STATUS": R6_INTEGRITY_STATUS, + "OPTIMIZATION_PREDECESSOR_R5_STATUS": SUPERSEDED_R5_STATUS, + "OPTIMIZATION_PREDECESSOR_R5_SOURCE_RELATIVE": R5_LOADER_RELATIVE, + "OPTIMIZATION_PREDECESSOR_R5_SOURCE_SHA256": R5_LOADER_SHA256, + "OPTIMIZATION_PREDECESSOR_R5_SOURCE_BYTES": R5_LOADER_BYTES, + "OPTIMIZATION_PREDECESSOR_R5_RUNTIME_RELATIVE": R5_RUNTIME_RELATIVE, + "OPTIMIZATION_PREDECESSOR_R5_RUNTIME_SHA256": R5_RUNTIME_SHA256, + "OPTIMIZATION_PREDECESSOR_R5_RUNTIME_BYTES": R5_RUNTIME_BYTES, + "OPTIMIZATION_PREDECESSOR_R5_TEST_RELATIVE": R5_TEST_RELATIVE, + "OPTIMIZATION_PREDECESSOR_R5_TEST_SHA256": R5_TEST_SHA256, + "OPTIMIZATION_PREDECESSOR_R5_TEST_BYTES": R5_TEST_BYTES, + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_RELATIVE": ( + R5_INTEGRITY_RELATIVE + ), + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_SHA256": ( + R5_INTEGRITY_RECEIPT_SHA256 + ), + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_BYTES": ( + R5_INTEGRITY_RECEIPT_BYTES + ), + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_SCHEMA": ( + R5_INTEGRITY_SCHEMA + ), + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_STATUS": ( + R5_INTEGRITY_STATUS + ), + "OPTIMIZATION_R1_HOTPATH_SHA256": _r13.OPTIMIZATION_R1_HOTPATH_SHA256, + "OPTIMIZATION_R1_HOTPATH_BYTES": _r13.OPTIMIZATION_R1_HOTPATH_BYTES, + "OPTIMIZATION_R5_EXECUTOR_SHA256": _r13.OPTIMIZATION_R5_EXECUTOR_SHA256, + "OPTIMIZATION_R5_EXECUTOR_BYTES": _r13.OPTIMIZATION_R5_EXECUTOR_BYTES, + "OPTIMIZATION_ADAPTER_R3_SHA256": _r13.OPTIMIZATION_ADAPTER_R3_SHA256, + "OPTIMIZATION_ADAPTER_R3_BYTES": _r13.OPTIMIZATION_ADAPTER_R3_BYTES, + "OPTIMIZATION_EXECUTOR_R8_SHA256": _r13.OPTIMIZATION_EXECUTOR_R8_SHA256, + "OPTIMIZATION_EXECUTOR_R8_BYTES": _r13.OPTIMIZATION_EXECUTOR_R8_BYTES, + "TRAINING_CORE_R1_SHA256": _r13.TRAINING_CORE_R1_SHA256, + "TRAINING_CORE_R1_BYTES": _r13.TRAINING_CORE_R1_BYTES, + "OPTIMIZATION_INSTALLER_NAME": "install_optimized_execution_layer", + "OPTIMIZATION_INSTALLER_SIGNATURE": _r13.EXPECTED_INSTALLER_SIGNATURE, + "TRAINING_AUTHORIZED": False, + "SCIENTIFIC_LAUNCH_AUTHORIZED": False, + "NOVA_SUBMISSION_AUTHORIZED": False, + } + _require( + isinstance(value, Mapping) + and all(value.get(key) == expected_value for key, expected_value in expected.items()) + and all( + type(value.get(key)) is type(expected_value) + for key, expected_value in expected.items() + if type(expected_value) in {int, bool} + ), + "fixed R14 R6/source/receipt binding changed", + ) + _require( + _relative_review_path( + value["OPTIMIZATION_SOURCE_RELATIVE"], + label="optimization loader", + ) + != _relative_review_path( + value["OPTIMIZATION_RUNTIME_RELATIVE"], + label="optimization runtime", + ), + "R6 loader/runtime paths collapsed", + ) + _relative_review_path( + value["OPTIMIZATION_TEST_RELATIVE"], + label="optimization test", + ) + _relative_review_path( + value["OPTIMIZATION_INTEGRITY_RECEIPT_RELATIVE"], + label="optimization integrity receipt", + ) + + +def validate_preparation_binding(value: Mapping[str, Any]) -> None: + _validate_fixed_binding(value) + _require( + value.get("STATUS") == PREPARATION_BINDING_STATUS + and value.get("R6_TERMINAL_BINDING_SHA256") + == "PENDING_STATIC_R6_TERMINAL_BINDING" + and type(value.get("R6_TERMINAL_BINDING_BYTES")) is int + and value.get("R6_TERMINAL_BINDING_BYTES") == 0, + "R14 preparation sentinel changed", + ) + + +def validate_final_binding(value: Mapping[str, Any]) -> None: + _validate_fixed_binding(value) + _require( + value.get("STATUS") == FINAL_BINDING_STATUS + and type(value.get("R6_TERMINAL_BINDING_SHA256")) is str + and SHA_RE.fullmatch(value["R6_TERMINAL_BINDING_SHA256"]) is not None + and type(value.get("R6_TERMINAL_BINDING_BYTES")) is int + and 0 < value["R6_TERMINAL_BINDING_BYTES"] <= 64 * 1024 * 1024, + "final R14 static R6 terminal binding is unresolved", + ) + + +def _require_authorization_false(value: Mapping[str, Any], *, label: str) -> None: + _require( + all(field in value and value[field] is False for field in AUTHORIZATION_FIELDS), + f"{label} authorization is not exactly launch-closed", + ) + + +def _require_hotpath_identity( + value: Any, + *, + schema: str, + source_sha256: str, + source_bytes: int, + label: str, +) -> Mapping[str, Any]: + _require( + isinstance(value, Mapping) + and value.get("schema") == schema + and value.get("status") == INSTALLATION_STATUS + and value.get("source_sha256") == source_sha256 + and type(value.get("source_bytes")) is int + and value.get("source_bytes") == source_bytes, + f"{label} schema/status/source identity changed", + ) + _require_authorization_false(value, label=label) + return value + + +def _validate_r2_receipt(value: Any) -> None: + observed = _require_hotpath_identity( + value, + schema=R2_SCHEMA, + source_sha256=R2_RUNTIME_SHA256, + source_bytes=R2_RUNTIME_BYTES, + label="R2 receipt", + ) + _require( + type(observed.get("per_step_full_state_hashes")) is int + and observed["per_step_full_state_hashes"] == 0, + "R2 full-state hash count is not exact integer zero", + ) + _r13._validate_r2_optimization_receipt(observed) + + +def _validate_r3_receipt(value: Any) -> None: + observed = _require_hotpath_identity( + value, + schema=R3_SCHEMA, + source_sha256=R3_RUNTIME_SHA256, + source_bytes=R3_RUNTIME_BYTES, + label="R3 receipt", + ) + _require( + observed.get("per_step_plan_validation") + == EXPECTED_R3_PER_STEP_PLAN_VALIDATION, + "R3 per-step plan validation declaration changed", + ) + _validate_r2_receipt(observed.get("predecessor_r2_receipt")) + _r13._validate_r3_optimization_receipt(observed) + + +def _validate_r4_receipt(value: Any) -> None: + observed = _require_hotpath_identity( + value, + schema=R4_SCHEMA, + source_sha256=R4_RUNTIME_SHA256, + source_bytes=R4_RUNTIME_BYTES, + label="R4 receipt", + ) + _require( + observed.get("predecessor_r3_loader_sha256") + == _r13.OPTIMIZATION_R3_LOADER_SHA256 + and observed.get("predecessor_r3_runtime_sha256") + == R3_RUNTIME_SHA256 + and type(observed.get("checkpoint_history_max_epochs")) is int + and observed["checkpoint_history_max_epochs"] == 100 + and type(observed.get("checkpoint_additional_full_state_hashes")) is int + and observed["checkpoint_additional_full_state_hashes"] == 0, + "R4 predecessor/history/full-state fields changed", + ) + _validate_r3_receipt(observed.get("predecessor_r3_receipt")) + _r13._validate_bound_optimization_receipt( + observed, + runtime_sha256=R4_RUNTIME_SHA256, + runtime_bytes=R4_RUNTIME_BYTES, + ) + + +def validate_superseded_r5_receipt(value: Any) -> None: + """Validate exact frozen R5 only as superseded predecessor evidence.""" + + observed = _require_hotpath_identity( + value, + schema=R5_SCHEMA, + source_sha256=R5_RUNTIME_SHA256, + source_bytes=R5_RUNTIME_BYTES, + label="superseded R5 receipt", + ) + _require( + observed.get("predecessor_r4_loader_sha256") == R4_LOADER_SHA256 + and observed.get("predecessor_r4_runtime_sha256") == R4_RUNTIME_SHA256 + and type( + observed.get("checkpoint_provenance_history_chain_digest_max_rows") + ) + is int + and observed["checkpoint_provenance_history_chain_digest_max_rows"] + == 100 + and type( + observed.get("checkpoint_provenance_additional_full_state_hashes") + ) + is int + and observed["checkpoint_provenance_additional_full_state_hashes"] == 0, + "superseded R5 predecessor/history/full-state fields changed", + ) + _validate_r4_receipt(observed.get("predecessor_r4_receipt")) + _r13._validate_bound_optimization_receipt( + observed, + runtime_sha256=R5_RUNTIME_SHA256, + runtime_bytes=R5_RUNTIME_BYTES, + ) + + +def validate_strict_r6_receipt( + value: Any, + *, + binding: Mapping[str, Any], +) -> None: + """Require the exact R6 receipt and every nested launch-closed layer.""" + + _validate_fixed_binding(binding) + observed = _require_hotpath_identity( + value, + schema=str(binding["OPTIMIZATION_RECEIPT_SCHEMA"]), + source_sha256=str(binding["OPTIMIZATION_RUNTIME_SHA256"]), + source_bytes=int(binding["OPTIMIZATION_RUNTIME_BYTES"]), + label="R6 receipt", + ) + required_true = ( + "checkpoint_provenance_strong_checkpoint_owner", + "checkpoint_provenance_registration_replaces_prior", + "checkpoint_provenance_validation_success_transitions_record", + "checkpoint_provenance_validation_failure_retires", + "checkpoint_provenance_commit_restore_success_failure_retires", + "checkpoint_provenance_full_history_chain_digest", + ) + forbidden_legacy = ( + "checkpoint_provenance_actual_constituent_identity_bound", + "checkpoint_provenance_cleanup_paths", + ) + _require( + observed.get("predecessor_r5_loader_sha256") == R5_LOADER_SHA256 + and observed.get("predecessor_r5_runtime_sha256") == R5_RUNTIME_SHA256 + and observed.get("predecessor_r5_status") == SUPERSEDED_R5_STATUS + and observed.get("predecessor_r5_launch_authorized") is False + and all(observed.get(field) is True for field in required_true) + and observed.get("checkpoint_provenance_abandoned_gc_cleanup_claimed") + is False + and type( + observed.get("checkpoint_provenance_max_outstanding_records") + ) + is int + and observed["checkpoint_provenance_max_outstanding_records"] == 1 + and type( + observed.get("checkpoint_provenance_process_lifetime_bounded_records") + ) + is int + and observed[ + "checkpoint_provenance_process_lifetime_bounded_records" + ] + == 1 + and type( + observed.get("checkpoint_provenance_history_chain_digest_max_rows") + ) + is int + and observed["checkpoint_provenance_history_chain_digest_max_rows"] + == 100 + and type( + observed.get("checkpoint_provenance_additional_full_state_hashes") + ) + is int + and observed["checkpoint_provenance_additional_full_state_hashes"] == 0 + and observed.get("checkpoint_valid_bytes_changed") is False + and all(field not in observed for field in forbidden_legacy), + "R6 strong-owner/history/full-state/supersession fields changed", + ) + validate_superseded_r5_receipt(observed.get("predecessor_r5_receipt")) + _r13._validate_bound_optimization_receipt( + observed, + runtime_sha256=str(binding["OPTIMIZATION_RUNTIME_SHA256"]), + runtime_bytes=int(binding["OPTIMIZATION_RUNTIME_BYTES"]), + ) + + +def validate_predecessor_r5_integrity_receipt_value( + value: Any, + *, + binding: Mapping[str, Any], +) -> None: + """Require exact frozen R5 evidence while preserving its superseded status.""" + + _validate_fixed_binding(binding) + _require( + type(value) is dict + and value.get("schema") + == binding[ + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_SCHEMA" + ] + and value.get("status") + == binding[ + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_STATUS" + ], + "superseded R5 integrity receipt schema/status changed", + ) + authorization = value.get("authorization") + _require( + type(authorization) is dict + and set(authorization) + == { + "nova_accessed", + "nova_submission_authorized", + "production_epoch_executed", + "scientific_launch_authorized", + "training_authorized", + } + and all(item is False for item in authorization.values()), + "superseded R5 integrity receipt authorization changed", + ) + closure = value.get("closure") + _require( + type(closure) is dict + and set(closure) == {"loader", "runtime", "test"} + and closure["loader"] + == { + "bytes": binding["OPTIMIZATION_PREDECESSOR_R5_SOURCE_BYTES"], + "mode": "0444", + "path": binding[ + "OPTIMIZATION_PREDECESSOR_R5_SOURCE_RELATIVE" + ], + "sha256": binding[ + "OPTIMIZATION_PREDECESSOR_R5_SOURCE_SHA256" + ], + } + and closure["runtime"] + == { + "bytes": binding["OPTIMIZATION_PREDECESSOR_R5_RUNTIME_BYTES"], + "mode": "0444", + "path": binding[ + "OPTIMIZATION_PREDECESSOR_R5_RUNTIME_RELATIVE" + ], + "sha256": binding[ + "OPTIMIZATION_PREDECESSOR_R5_RUNTIME_SHA256" + ], + } + and closure["test"] + == { + "bytes": binding["OPTIMIZATION_PREDECESSOR_R5_TEST_BYTES"], + "mode": "0444", + "path": binding[ + "OPTIMIZATION_PREDECESSOR_R5_TEST_RELATIVE" + ], + "sha256": binding["OPTIMIZATION_PREDECESSOR_R5_TEST_SHA256"], + }, + "superseded R5 integrity receipt source closure changed", + ) + guards = value.get("guards") + integration = value.get("integration") + _require( + type(guards) is dict + and type( + guards.get( + "additional_full_model_optimizer_or_checkpoint_state_hashes" + ) + ) + is int + and guards[ + "additional_full_model_optimizer_or_checkpoint_state_hashes" + ] + == 0 + and type(guards.get("history_epoch_chain_pair_digest")) is dict + and type( + guards["history_epoch_chain_pair_digest"].get("maximum_rows") + ) + is int + and guards["history_epoch_chain_pair_digest"]["maximum_rows"] == 100 + and type(integration) is dict + and integration.get("outer_scientific_launch_authorized") is False + and integration.get("predecessor_r3_scientific_launch_authorized") + is False + and integration.get("predecessor_r4_scientific_launch_authorized") + is False, + "superseded R5 integrity receipt type/authorization claims changed", + ) + + +def validate_predecessor_r5_integrity_receipt( + binding: Mapping[str, Any], +) -> Mapping[str, Any]: + _validate_fixed_binding(binding) + path = _relative_review_path( + binding["OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_RELATIVE"], + label="superseded R5 integrity receipt", + ) + raw = _read_bound_file( + path, + expected_sha256=str( + binding[ + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_SHA256" + ] + ), + expected_bytes=int( + binding[ + "OPTIMIZATION_PREDECESSOR_R5_INTEGRITY_RECEIPT_BYTES" + ] + ), + require_read_only=True, + ) + try: + value = json.loads(raw.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightStrictSuccessorR14Error( + "superseded R5 integrity receipt is not ASCII JSON" + ) from error + validate_predecessor_r5_integrity_receipt_value( + value, + binding=binding, + ) + return MappingProxyType(value) + + +def validate_integrity_receipt_value( + value: Any, + *, + binding: Mapping[str, Any], +) -> None: + _validate_fixed_binding(binding) + _require( + type(value) is dict + and value.get("schema") + == binding["OPTIMIZATION_INTEGRITY_RECEIPT_SCHEMA"] + and value.get("status") + == binding["OPTIMIZATION_INTEGRITY_RECEIPT_STATUS"], + "R6 integrity receipt schema/status changed", + ) + authorization = value.get("authorization") + _require( + type(authorization) is dict + and set(authorization) + == { + "nova_accessed", + "nova_submission_authorized", + "production_epoch_executed", + "scientific_launch_authorized", + "training_authorized", + } + and all(item is False for item in authorization.values()), + "R6 integrity receipt authorization changed", + ) + closure = value.get("closure") + _require( + type(closure) is dict + and set(closure) == {"loader", "runtime", "test"} + and closure["loader"] + == { + "bytes": binding["OPTIMIZATION_SOURCE_BYTES"], + "mode": "0444", + "path": binding["OPTIMIZATION_SOURCE_RELATIVE"], + "sha256": binding["OPTIMIZATION_SOURCE_SHA256"], + } + and closure["runtime"] + == { + "bytes": binding["OPTIMIZATION_RUNTIME_BYTES"], + "mode": "0444", + "path": binding["OPTIMIZATION_RUNTIME_RELATIVE"], + "sha256": binding["OPTIMIZATION_RUNTIME_SHA256"], + } + and closure["test"] + == { + "bytes": binding["OPTIMIZATION_TEST_BYTES"], + "mode": "0444", + "path": binding["OPTIMIZATION_TEST_RELATIVE"], + "sha256": binding["OPTIMIZATION_TEST_SHA256"], + }, + "R6 integrity receipt source closure changed", + ) + guards = value.get("guards") + semantics = value.get("outer_receipt_semantics") + tests = value.get("tests") + exact_integer_types = ( + type(guards.get("history_chain_digest_max_rows")) is int + and guards["history_chain_digest_max_rows"] == 100 + and type(guards.get("maximum_outstanding_provenance_records")) is int + and guards["maximum_outstanding_provenance_records"] == 1 + and type(guards.get("process_lifetime_bounded_records")) is int + and guards["process_lifetime_bounded_records"] == 1 + and type( + guards.get( + "additional_full_model_optimizer_or_checkpoint_state_hashes" + ) + ) + is int + and guards[ + "additional_full_model_optimizer_or_checkpoint_state_hashes" + ] + == 0 + ) + _require( + type(guards) is dict + and guards.get("abandoned_gc_cleanup_claimed") is False + and guards.get("strong_checkpoint_owner_identity_required") is True + and exact_integer_types + and type(semantics) is dict + and semantics.get("legacy_r5_provenance_fields_flattened") is False + and semantics.get("predecessor_r5_status") == SUPERSEDED_R5_STATUS + and semantics.get("predecessor_r5_launch_authorized") is False + and type(semantics.get("r6_history_chain_digest_max_rows")) is int + and semantics["r6_history_chain_digest_max_rows"] == 100 + and type(semantics.get("r6_maximum_outstanding_records")) is int + and semantics["r6_maximum_outstanding_records"] == 1 + and type(semantics.get("r6_additional_full_state_hashes")) is int + and semantics["r6_additional_full_state_hashes"] == 0 + and type(tests) is dict + and tests.get("fresh_process_integration") is True, + "R6 integrity receipt strong-owner/type claims changed", + ) + predecessor = value.get("predecessor_r5") + _require( + type(predecessor) is dict + and predecessor.get("status") == SUPERSEDED_R5_STATUS + and predecessor.get("loader") + == {"bytes": R5_LOADER_BYTES, "sha256": R5_LOADER_SHA256} + and predecessor.get("runtime") + == {"bytes": R5_RUNTIME_BYTES, "sha256": R5_RUNTIME_SHA256} + and predecessor.get("receipt") + == { + "bytes": R5_INTEGRITY_RECEIPT_BYTES, + "sha256": R5_INTEGRITY_RECEIPT_SHA256, + }, + "R6 integrity receipt superseded-R5 binding changed", + ) + + +def validate_integrity_receipt( + binding: Mapping[str, Any], +) -> Mapping[str, Any]: + _validate_fixed_binding(binding) + path = _relative_review_path( + binding["OPTIMIZATION_INTEGRITY_RECEIPT_RELATIVE"], + label="optimization integrity receipt", + ) + raw = _read_bound_file( + path, + expected_sha256=str( + binding["OPTIMIZATION_INTEGRITY_RECEIPT_SHA256"] + ), + expected_bytes=int(binding["OPTIMIZATION_INTEGRITY_RECEIPT_BYTES"]), + require_read_only=True, + ) + try: + value = json.loads(raw.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightStrictSuccessorR14Error( + "R6 integrity receipt is not ASCII JSON" + ) from error + validate_integrity_receipt_value(value, binding=binding) + validate_predecessor_r5_integrity_receipt(binding) + return MappingProxyType(value) + + +def r13_compatibility_binding( + binding: Mapping[str, Any], +) -> Mapping[str, Any]: + validate_final_binding(binding) + return MappingProxyType( + { + "SCHEMA": _r13.FINAL_BINDING_SCHEMA, + "STATUS": _r13.FINAL_BINDING_STATUS, + "R12_PREDECESSOR_SOURCE_SHA256": ( + binding["R12_PREDECESSOR_SOURCE_SHA256"] + ), + "R12_PREDECESSOR_SOURCE_BYTES": ( + binding["R12_PREDECESSOR_SOURCE_BYTES"] + ), + "R9_SOURCE_SHA256": binding["R9_SOURCE_SHA256"], + "R9_SOURCE_BYTES": binding["R9_SOURCE_BYTES"], + "R11_SOURCE_SHA256": binding["R11_SOURCE_SHA256"], + "R11_SOURCE_BYTES": binding["R11_SOURCE_BYTES"], + "R6_TERMINAL_SOURCE_SHA256": ( + binding["R6_TERMINAL_SOURCE_SHA256"] + ), + "R6_TERMINAL_SOURCE_BYTES": binding["R6_TERMINAL_SOURCE_BYTES"], + "R6_TERMINAL_BINDING_SHA256": ( + binding["R6_TERMINAL_BINDING_SHA256"] + ), + "R6_TERMINAL_BINDING_BYTES": ( + binding["R6_TERMINAL_BINDING_BYTES"] + ), + "OPTIMIZATION_SOURCE_RELATIVE": ( + binding["OPTIMIZATION_SOURCE_RELATIVE"] + ), + "OPTIMIZATION_SOURCE_SHA256": ( + binding["OPTIMIZATION_SOURCE_SHA256"] + ), + "OPTIMIZATION_SOURCE_BYTES": ( + binding["OPTIMIZATION_SOURCE_BYTES"] + ), + "OPTIMIZATION_RUNTIME_RELATIVE": ( + binding["OPTIMIZATION_RUNTIME_RELATIVE"] + ), + "OPTIMIZATION_RUNTIME_SHA256": ( + binding["OPTIMIZATION_RUNTIME_SHA256"] + ), + "OPTIMIZATION_RUNTIME_BYTES": ( + binding["OPTIMIZATION_RUNTIME_BYTES"] + ), + "OPTIMIZATION_R1_HOTPATH_SHA256": ( + binding["OPTIMIZATION_R1_HOTPATH_SHA256"] + ), + "OPTIMIZATION_R1_HOTPATH_BYTES": ( + binding["OPTIMIZATION_R1_HOTPATH_BYTES"] + ), + "OPTIMIZATION_R5_EXECUTOR_SHA256": ( + binding["OPTIMIZATION_R5_EXECUTOR_SHA256"] + ), + "OPTIMIZATION_R5_EXECUTOR_BYTES": ( + binding["OPTIMIZATION_R5_EXECUTOR_BYTES"] + ), + "OPTIMIZATION_ADAPTER_R3_SHA256": ( + binding["OPTIMIZATION_ADAPTER_R3_SHA256"] + ), + "OPTIMIZATION_ADAPTER_R3_BYTES": ( + binding["OPTIMIZATION_ADAPTER_R3_BYTES"] + ), + "OPTIMIZATION_EXECUTOR_R8_SHA256": ( + binding["OPTIMIZATION_EXECUTOR_R8_SHA256"] + ), + "OPTIMIZATION_EXECUTOR_R8_BYTES": ( + binding["OPTIMIZATION_EXECUTOR_R8_BYTES"] + ), + "TRAINING_CORE_R1_SHA256": binding["TRAINING_CORE_R1_SHA256"], + "TRAINING_CORE_R1_BYTES": binding["TRAINING_CORE_R1_BYTES"], + "OPTIMIZATION_INSTALLER_NAME": ( + binding["OPTIMIZATION_INSTALLER_NAME"] + ), + "OPTIMIZATION_INSTALLER_SIGNATURE": ( + binding["OPTIMIZATION_INSTALLER_SIGNATURE"] + ), + "TRAINING_AUTHORIZED": False, + "NOVA_SUBMISSION_AUTHORIZED": False, + } + ) + + +def _strict_optimization_module( + optimization: ModuleType, + *, + binding: Mapping[str, Any], +) -> ModuleType: + installer_name = str(binding["OPTIMIZATION_INSTALLER_NAME"]) + installer = getattr(optimization, installer_name) + strict = ModuleType("_review_a5_r14_strict_r6_process_local_adapter") + strict.SOURCE_PATH = _relative_review_path( + binding["OPTIMIZATION_RUNTIME_RELATIVE"], + label="optimization runtime", + ) + strict.SOURCE_SHA256 = binding["OPTIMIZATION_RUNTIME_SHA256"] + strict.SOURCE_BYTES = binding["OPTIMIZATION_RUNTIME_BYTES"] + + def install_optimized_execution_layer( + r9_module: ModuleType, + ) -> Mapping[str, Any]: + receipt = installer(r9_module) + validate_strict_r6_receipt(receipt, binding=binding) + return receipt + + def source_identity() -> Mapping[str, Any]: + identity = optimization.source_identity() + _require( + isinstance(identity, Mapping) + and dict(identity) + == { + "sha256": binding["OPTIMIZATION_RUNTIME_SHA256"], + "bytes": binding["OPTIMIZATION_RUNTIME_BYTES"], + }, + "R6 optimization source identity changed", + ) + return identity + + _require( + inspect.isfunction(installer) + and str(inspect.signature(installer)) + == binding["OPTIMIZATION_INSTALLER_SIGNATURE"], + "R6 optimization installer API changed", + ) + setattr(strict, installer_name, install_optimized_execution_layer) + strict.source_identity = source_identity + return strict + + +def load_bound_runtime( + *, + binding: Mapping[str, Any] | None = None, +) -> tuple[ModuleType, ModuleType, Mapping[str, Any], Mapping[str, Any]]: + """Install exact R6 through R13/R12/R11/R9 without authorizing launch.""" + + value = binding_source_value() if binding is None else binding + validate_final_binding(value) + validate_integrity_receipt(value) + compatibility = r13_compatibility_binding(value) + r9 = _r13._load_exact_module( + _r13.R9_SOURCE_PATH, + expected_sha256=_r13.R9_SOURCE_SHA256, + expected_bytes=_r13.R9_SOURCE_BYTES, + name="_review_a5_native_eight_r9_exact_for_r14", + ) + r11 = _r13._load_exact_module( + _r13.R11_SOURCE_PATH, + expected_sha256=_r13.R11_SOURCE_SHA256, + expected_bytes=_r13.R11_SOURCE_BYTES, + name="_review_a5_native_eight_r11_exact_for_r14", + ) + loader_path = _relative_review_path( + value["OPTIMIZATION_SOURCE_RELATIVE"], + label="optimization loader", + ) + optimization = _r13._load_exact_module( + loader_path, + expected_sha256=str(value["OPTIMIZATION_SOURCE_SHA256"]), + expected_bytes=int(value["OPTIMIZATION_SOURCE_BYTES"]), + name="_review_a5_native_eight_r6_loader_exact_for_r14", + ) + strict_optimization = _strict_optimization_module( + optimization, + binding=value, + ) + predecessor = _r13.install_bound_runtime( + r9=r9, + r11=r11, + optimization=strict_optimization, + binding=compatibility, + ) + optimization_receipt = predecessor.get("optimization") + validate_strict_r6_receipt(optimization_receipt, binding=value) + _require( + predecessor.get("schema") == _r13.SCHEMA_R13 + and predecessor.get("status") + == "PASS_R13_CLOSURE_OPTIMIZATION_THEN_R11_INSTALLED" + and predecessor.get("training_authorized") is False + and predecessor.get("nova_submission_authorized") is False, + "exact R13 installation boundary changed", + ) + receipt = MappingProxyType( + { + "schema": SCHEMA_R14, + "status": INSTALLATION_STATUS, + "predecessor_r13_schema": predecessor["schema"], + "predecessor_r13_status": predecessor["status"], + "optimization_kind": ( + "r6_strong_owner_successor_over_superseded_r5" + ), + "optimization": copy.deepcopy(dict(optimization_receipt)), + "receipt_schema_bound_by_final_binding": ( + value["OPTIMIZATION_RECEIPT_SCHEMA"] + ), + "integrity_receipt_schema_bound_by_final_binding": ( + value["OPTIMIZATION_INTEGRITY_RECEIPT_SCHEMA"] + ), + "installation_order": [ + "sequence_vocab_compatibility", + "strict_r6_receipt_validation", + "r13_r12_compatibility", + "release_gate_r11", + ], + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + ) + validate_installation_receipt(receipt, binding=value) + return r9, r11, MappingProxyType(dict(value)), receipt + + +def validate_installation_receipt( + value: Any, + *, + binding: Mapping[str, Any], +) -> None: + _require( + isinstance(value, Mapping) + and value.get("schema") == SCHEMA_R14 + and value.get("status") == INSTALLATION_STATUS + and value.get("predecessor_r13_schema") == _r13.SCHEMA_R13 + and value.get("predecessor_r13_status") + == "PASS_R13_CLOSURE_OPTIMIZATION_THEN_R11_INSTALLED" + and value.get("optimization_kind") + == "r6_strong_owner_successor_over_superseded_r5" + and value.get("receipt_schema_bound_by_final_binding") + == binding["OPTIMIZATION_RECEIPT_SCHEMA"] + and value.get("integrity_receipt_schema_bound_by_final_binding") + == binding["OPTIMIZATION_INTEGRITY_RECEIPT_SCHEMA"], + "R14 installation receipt schema/status/bindings changed", + ) + _require_authorization_false(value, label="R14 installation receipt") + validate_strict_r6_receipt(value.get("optimization"), binding=binding) + + +def source_closure_paths( + binding: Mapping[str, Any], +) -> Mapping[str, Path]: + """Return the exact runtime closure, including both package init sources.""" + + compatibility = r13_compatibility_binding(binding) + paths = dict(_r13.source_closure_paths(compatibility)) + paths.update( + { + "r13_package_init": R13_PACKAGE_INIT_PATH, + "r13_runner": R13_RUNNER_PATH, + "r13_wrapper": R13_WRAPPER_PATH, + "r13_controller": R13_CONTROLLER_PATH, + "r13_builder": R13_BUILDER_PATH, + "r14_package_init": PACKAGE_INIT_PATH, + "r14_strict_runner": RUNNER_PATH, + "r14_final_binding": BINDING_SOURCE_PATH, + "optimization_test": _relative_review_path( + binding["OPTIMIZATION_TEST_RELATIVE"], + label="optimization test", + ), + "optimization_integrity_receipt": _relative_review_path( + binding["OPTIMIZATION_INTEGRITY_RECEIPT_RELATIVE"], + label="optimization integrity receipt", + ), + "optimization_predecessor_r5_loader": _relative_review_path( + binding["OPTIMIZATION_PREDECESSOR_R5_SOURCE_RELATIVE"], + label="superseded R5 loader", + ), + "optimization_predecessor_r5_runtime": _relative_review_path( + binding["OPTIMIZATION_PREDECESSOR_R5_RUNTIME_RELATIVE"], + label="superseded R5 runtime", + ), + "optimization_predecessor_r5_test": _relative_review_path( + binding["OPTIMIZATION_PREDECESSOR_R5_TEST_RELATIVE"], + label="superseded R5 test", + ), + "optimization_predecessor_r5_integrity_receipt": ( + _relative_review_path( + binding[ + "OPTIMIZATION_PREDECESSOR_R5_" + "INTEGRITY_RECEIPT_RELATIVE" + ], + label="superseded R5 integrity receipt", + ) + ), + } + ) + _require( + "r14_package_init" in paths + and "r13_package_init" in paths + and len(set(paths.values())) == len(paths), + "R14 source closure omitted/collapsed a package init", + ) + return MappingProxyType(paths) + + +def describe_binding() -> Mapping[str, Any]: + value = binding_source_value() + validate_preparation_binding(value) + validate_integrity_receipt(value) + return value + + +__all__ = [ + "FINAL_BINDING_SCHEMA", + "FINAL_BINDING_STATUS", + "INSTALLATION_STATUS", + "NativeEightStrictSuccessorR14Error", + "PREPARATION_BINDING_STATUS", + "SCHEMA_R14", + "binding_source_value", + "describe_binding", + "load_bound_runtime", + "r13_compatibility_binding", + "source_closure_paths", + "validate_final_binding", + "validate_installation_receipt", + "validate_integrity_receipt", + "validate_integrity_receipt_value", + "validate_predecessor_r5_integrity_receipt", + "validate_predecessor_r5_integrity_receipt_value", + "validate_preparation_binding", + "validate_strict_r6_receipt", + "validate_superseded_r5_receipt", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/__init__.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..082bddee70c4d949be36715d22da350a131b3457 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/__init__.py @@ -0,0 +1 @@ +"""Launch-closed R15 gate for the current static terminal successor.""" diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_bindings_r15.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_bindings_r15.py new file mode 100644 index 0000000000000000000000000000000000000000..1b7ac2d5f3a7a0cb6b577b65a7d7588d6e3d488f --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_bindings_r15.py @@ -0,0 +1,60 @@ +"""Preparation-only bindings for the R15 current-static terminal gate. + +The current terminal validator and binding are intentionally unresolved until +job 11766708 and its corrected terminal child both complete with exit 0:0. +This file is not a launch authority and must never be rewritten in place. +""" + +SCHEMA = ( + "bertose_review_a5_native_eight_current_terminal_bindings_20260727_r15" +) +STATUS = "PREPARATION_ONLY_WAITING_FOR_CURRENT_STATIC_TERMINAL_BINDING" + +R14_PACKAGE_INIT_SHA256 = ( + "737b1caa9086f8ac1556c05625d1b5391b8cae58e9d98a7755fa72f44e94c7ba" +) +R14_PACKAGE_INIT_BYTES = 74 +R14_STRICT_SOURCE_SHA256 = ( + "eda983e1b0c29357eb1b6e2f555f402a83b7176fb857488e9be5f5faed490b2d" +) +R14_STRICT_SOURCE_BYTES = 46_942 +R14_BINDING_SOURCE_SHA256 = ( + "bd6c704239e2bb4898dddda5c86274f41cd5b304b35d584ddfae3884e8bc8503" +) +R14_BINDING_SOURCE_BYTES = 5_726 +R14_TEST_SOURCE_SHA256 = ( + "0de5bbc59ca7c00dca89286d0519ffcdcbead8014175c0aba8f798739f50c2cd" +) +R14_TEST_SOURCE_BYTES = 20_070 +R14_BUILDER_SOURCE_SHA256 = ( + "7d2d2657201e344a3c5fd8c1fca60d41a9f304ce8b15b5e47cd937fe21220479" +) +R14_BUILDER_SOURCE_BYTES = 4_336 + +CURRENT_TERMINAL_VALIDATOR_SOURCE_RELATIVE = ( + "PENDING_CURRENT_STATIC_TERMINAL_VALIDATOR_SOURCE" +) +CURRENT_TERMINAL_VALIDATOR_SOURCE_SHA256 = ( + "PENDING_CURRENT_STATIC_TERMINAL_VALIDATOR_SOURCE_SHA256" +) +CURRENT_TERMINAL_VALIDATOR_SOURCE_BYTES = 0 +CURRENT_TERMINAL_BINDING_RELATIVE = ( + "PENDING_CURRENT_STATIC_TERMINAL_BINDING" +) +CURRENT_TERMINAL_BINDING_SHA256 = ( + "PENDING_CURRENT_STATIC_TERMINAL_BINDING_SHA256" +) +CURRENT_TERMINAL_BINDING_BYTES = 0 +CURRENT_TERMINAL_BINDING_SCHEMA = ( + "PENDING_CURRENT_STATIC_TERMINAL_BINDING_SCHEMA" +) +CURRENT_TERMINAL_BINDING_STATUS = ( + "PENDING_CURRENT_STATIC_TERMINAL_BINDING_STATUS" +) +CURRENT_TERMINAL_VALIDATOR_NAME = "validate_release_binding" +CURRENT_STATIC_SUCCESSOR_JOB_ID = "11766708" +OBSOLETE_MISMATCHED_TERMINAL_JOB_ID = "11766709" + +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +NOVA_SUBMISSION_AUTHORIZED = False diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_gate_r15.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_gate_r15.py new file mode 100644 index 0000000000000000000000000000000000000000..bb02cd9dcbfdcdef3c10c0c0b659feda1c82922d --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_gate_r15.py @@ -0,0 +1,1177 @@ +"""Launch-closed R15 gate for the current static terminal successor. + +R14 correctly installs the strict R6 checkpoint hot path, but its inherited +R11 release gate is permanently pinned to obsolete static job 11762534. This +versioned layer installs R14 first, verifies that exact inherited R11 gate, +then replaces only the release-validation entries with a gate bound to the +forthcoming terminal certificate for current job 11766708. + +The checked-in binding is deliberately incomplete. No training or submission +is authorized until a new immutable binding pins the current terminal +validator source and canonical certificate bytes. +""" + +from __future__ import annotations + +import copy +import hashlib +import inspect +import json +import os +from pathlib import Path +import re +from types import CodeType, MappingProxyType, ModuleType +from typing import Any, Mapping + +from review.multimodal.runtime.a5_native_eight_training_20260726_r14_r6_strict_candidate import ( + review_a5_native_eight_strict_successor_r14 as _r14, +) + + +SCHEMA_R15 = ( + "bertose_review_a5_native_eight_training_20260727_" + "r15_current_static_terminal_gate" +) +INSTALLATION_STATUS = "INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED" +RELEASE_SCHEMA_R15 = ( + "bertose_a5_native_eight_external_release_20260727_" + "r15_current_static_terminal_gate" +) +RELEASE_STATUS = "PASS_RELEASED_FOR_ONE_NATIVE_EIGHT_ARRAY" +PREDECESSOR_SCHEMA = "bertose_a5_native_eight_external_release_20260722_r3" +FINAL_BINDING_SCHEMA = ( + "bertose_review_a5_native_eight_current_terminal_bindings_20260727_r15" +) +PREPARATION_BINDING_STATUS = ( + "PREPARATION_ONLY_WAITING_FOR_CURRENT_STATIC_TERMINAL_BINDING" +) +FINAL_BINDING_STATUS = ( + "BOUND_CURRENT_STATIC_TERMINAL_11766708_AND_STRICT_R14_R15" +) +AUTHORIZATION_FIELDS = ( + "TRAINING_AUTHORIZED", + "SCIENTIFIC_LAUNCH_AUTHORIZED", + "NOVA_SUBMISSION_AUTHORIZED", +) +CURRENT_JOB_ID = "11766708" +OBSOLETE_TERMINAL_JOB_ID = "11766709" +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") +ZERO_SHA256 = "0" * 64 + +RUNNER_PATH = Path(__file__).absolute() +RUNTIME_DIRECTORY = RUNNER_PATH.parent +PACKAGE_INIT_PATH = RUNTIME_DIRECTORY / "__init__.py" +BINDING_SOURCE_PATH = ( + RUNTIME_DIRECTORY / "review_a5_native_eight_current_terminal_bindings_r15.py" +) +TEST_PATH = ( + RUNTIME_DIRECTORY / "test_review_a5_native_eight_current_terminal_gate_r15.py" +) +WRITING_ROOT = RUNNER_PATH.parents[4] +RUNTIME_ROOT = WRITING_ROOT / "review/multimodal/runtime" + +R14_DIRECTORY = ( + RUNTIME_ROOT / "a5_native_eight_training_20260726_r14_r6_strict_candidate" +) +R14_PACKAGE_INIT_PATH = R14_DIRECTORY / "__init__.py" +R14_STRICT_PATH = ( + R14_DIRECTORY / "review_a5_native_eight_strict_successor_r14.py" +) +R14_BINDING_PATH = ( + R14_DIRECTORY / "review_a5_native_eight_final_bindings_r14.py" +) +R14_TEST_PATH = ( + R14_DIRECTORY / "test_review_a5_native_eight_strict_successor_r14.py" +) +R14_BUILDER_PATH = ( + WRITING_ROOT + / "review/multimodal/scripts/" + "build_review_a5_native_eight_r11_successor_20260726_r14.py" +) +R13_RUNNER_PATH = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260726_r13_final_candidate" + / "review_a5_native_eight_training_runner_r13.py" +) +R13_RUNNER_SHA256 = ( + "17cf8ab216b354ec1de7574ebebd7bfe02b5935da605b4131e45c7aa13982d5b" +) +R13_RUNNER_BYTES = 60_696 + +R4_DIRECTORY = RUNTIME_ROOT / "a5_native_eight_hotpath_20260726_r4" +R4_LOADER_PATH = R4_DIRECTORY / "load_review_a5_native_eight_hotpath_r4.py" +R4_RUNTIME_PATH = R4_DIRECTORY / "review_a5_native_eight_hotpath_r4.py" +R4_TEST_PATH = R4_DIRECTORY / "test_review_a5_native_eight_hotpath_r4.py" +R4_INTEGRITY_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r4/" + "review_a5_native_eight_hotpath_r4_integrity_receipt.json" +) +SUBMISSION_DIRECTORY = ( + RUNTIME_ROOT / "a5_native_eight_submission_20260727_r15_preparation" +) +SUBMISSION_PACKAGE_INIT_PATH = SUBMISSION_DIRECTORY / "__init__.py" +SUBMISSION_CONTRACT_PATH = ( + SUBMISSION_DIRECTORY / "review_a5_native_eight_submission_contract_r15.py" +) +SUBMISSION_TEST_PATH = ( + SUBMISSION_DIRECTORY + / "test_review_a5_native_eight_submission_contract_r15.py" +) +SUBMISSION_PACKAGE_INIT_SHA256 = ( + "71acc02bbdc797924631115278a47fa8ca934e032027def2c4793d11f63a04ac" +) +SUBMISSION_PACKAGE_INIT_BYTES = 70 +SUBMISSION_CONTRACT_SHA256 = ( + "35c7a13da662f49bec07b63f590c8fb3d9cc4578633a179da42ff2650a2d7865" +) +SUBMISSION_CONTRACT_BYTES = 29_305 +SUBMISSION_TEST_SHA256 = ( + "0769e6185df0451651804b84345a7ab651f9425299eef53717b6377fa86e6e78" +) +SUBMISSION_TEST_BYTES = 11_109 + +_BINDING_NAMES = ( + "SCHEMA", + "STATUS", + "R14_PACKAGE_INIT_SHA256", + "R14_PACKAGE_INIT_BYTES", + "R14_STRICT_SOURCE_SHA256", + "R14_STRICT_SOURCE_BYTES", + "R14_BINDING_SOURCE_SHA256", + "R14_BINDING_SOURCE_BYTES", + "R14_TEST_SOURCE_SHA256", + "R14_TEST_SOURCE_BYTES", + "R14_BUILDER_SOURCE_SHA256", + "R14_BUILDER_SOURCE_BYTES", + "CURRENT_TERMINAL_VALIDATOR_SOURCE_RELATIVE", + "CURRENT_TERMINAL_VALIDATOR_SOURCE_SHA256", + "CURRENT_TERMINAL_VALIDATOR_SOURCE_BYTES", + "CURRENT_TERMINAL_BINDING_RELATIVE", + "CURRENT_TERMINAL_BINDING_SHA256", + "CURRENT_TERMINAL_BINDING_BYTES", + "CURRENT_TERMINAL_BINDING_SCHEMA", + "CURRENT_TERMINAL_BINDING_STATUS", + "CURRENT_TERMINAL_VALIDATOR_NAME", + "CURRENT_STATIC_SUCCESSOR_JOB_ID", + "OBSOLETE_MISMATCHED_TERMINAL_JOB_ID", + "TRAINING_AUTHORIZED", + "SCIENTIFIC_LAUNCH_AUTHORIZED", + "NOVA_SUBMISSION_AUTHORIZED", +) + +PREDECESSOR_FIELDS = frozenset( + { + "schema", + "status", + "semantic_array_id", + "source_bindings", + "launch_config_binding", + "postfit_bindings", + "experiment", + "scheduler", + "live_duplicate_preflight", + "safety", + "exclusions", + "authorization", + "official_submitted_artifacts_modified", + "receipt_sha256", + } +) +R15_ADDITIONAL_FIELDS = frozenset( + { + "current_static_terminal_certification", + "current_static_terminal_gate", + } +) + + +class NativeEightCurrentTerminalGateR15Error(RuntimeError): + """The R15 terminal authority, release, or installed graph changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightCurrentTerminalGateR15Error(message) + + +def canonical_bytes(value: Any) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def canonical_sha256(value: Any, *, domain: str) -> str: + return hashlib.sha256( + domain.encode("ascii") + b"\0" + canonical_bytes(value) + ).hexdigest() + + +def _plain_sha256(value: Any) -> str: + return hashlib.sha256(canonical_bytes(value)).hexdigest() + + +def _relative_review_path(value: Any, *, label: str) -> Path: + _require( + type(value) is str + and value + and not value.startswith("/") + and "\\" not in value + and os.path.normpath(value) == value, + f"{label} is not one canonical relative path", + ) + relative = Path(value) + _require( + relative.parts[:2] == ("review", "multimodal") + and all(part not in {"", ".", ".."} for part in relative.parts), + f"{label} is outside review/multimodal", + ) + return WRITING_ROOT / relative + + +def _read_exact( + path: Path, + *, + expected_sha256: str, + expected_bytes: int, + require_read_only: bool, + label: str, +) -> bytes: + _require( + type(expected_sha256) is str + and SHA_RE.fullmatch(expected_sha256) is not None + and expected_sha256 != ZERO_SHA256 + and type(expected_bytes) is int + and 0 < expected_bytes <= 64 * 1024 * 1024, + f"{label} identity is unresolved", + ) + raw = _r14._r13.read_regular_nofollow( + Path(path), + maximum=64 * 1024 * 1024, + require_read_only=require_read_only, + ) + _require( + len(raw) == expected_bytes + and hashlib.sha256(raw).hexdigest() == expected_sha256, + f"{label} exact bytes changed", + ) + return raw + + +def _compiled_function_code( + raw: bytes, + *, + path: Path, + function_name: str, +) -> CodeType: + root = compile(raw, os.fspath(path), "exec", dont_inherit=True) + pending = [root] + observed: list[CodeType] = [] + while pending: + code = pending.pop() + for item in code.co_consts: + if isinstance(item, CodeType): + pending.append(item) + if item.co_name == function_name: + observed.append(item) + _require( + len(observed) == 1, + f"{path.name} exact {function_name} code object changed", + ) + return observed[0] + + +def _same_executable_code(observed: CodeType, expected: CodeType) -> bool: + # Some predecessor bytecode was imported from a pyc generated with a + # different debug-range setting. The line table is diagnostic metadata; + # every executable/code-identity field must still be identical. + return observed.replace(co_linetable=expected.co_linetable) == expected + + +def _validate_imported_predecessor_identity() -> None: + r14_raw = _read_exact( + R14_STRICT_PATH, + expected_sha256=( + "eda983e1b0c29357eb1b6e2f555f402a83b7176fb857488e9be5f5faed490b2d" + ), + expected_bytes=46_942, + require_read_only=False, + label="imported R14 strict source", + ) + r13_raw = _read_exact( + R13_RUNNER_PATH, + expected_sha256=R13_RUNNER_SHA256, + expected_bytes=R13_RUNNER_BYTES, + require_read_only=False, + label="imported R13 runner source", + ) + _require( + Path(_r14.__file__).absolute() == R14_STRICT_PATH + and _r14.RUNNER_PATH == R14_STRICT_PATH + and getattr(_r14, "_r13", None) is not None + and Path(_r14._r13.__file__).absolute() == R13_RUNNER_PATH + and _r14._r13.RUNNER_PATH == R13_RUNNER_PATH, + "imported R14/R13 module path changed", + ) + for module, raw, path, names in ( + ( + _r14, + r14_raw, + R14_STRICT_PATH, + ("load_bound_runtime", "validate_final_binding"), + ), + ( + _r14._r13, + r13_raw, + R13_RUNNER_PATH, + ("_load_exact_module", "install_bound_runtime"), + ), + ): + for name in names: + function = getattr(module, name, None) + expected = _compiled_function_code( + raw, + path=path, + function_name=name, + ) + _require( + inspect.isfunction(function) + and function.__globals__ is module.__dict__ + and _same_executable_code(function.__code__, expected), + f"imported {path.name} {name} implementation changed", + ) + + +def binding_source_value() -> Mapping[str, Any]: + raw = _r14._r13.read_regular_nofollow( + BINDING_SOURCE_PATH, + maximum=64 * 1024, + require_read_only=False, + ) + module = ModuleType("_review_a5_native_eight_r15_binding_observed") + module.__file__ = os.fspath(BINDING_SOURCE_PATH) + exec( + compile(raw, os.fspath(BINDING_SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + value = {name: getattr(module, name, None) for name in _BINDING_NAMES} + if value.get("STATUS") == FINAL_BINDING_STATUS: + frozen = _r14._r13.read_regular_nofollow( + BINDING_SOURCE_PATH, + maximum=64 * 1024, + require_read_only=True, + ) + _require(frozen == raw, "final R15 binding changed during readback") + return MappingProxyType( + { + **value, + "binding_source_sha256": hashlib.sha256(raw).hexdigest(), + "binding_source_bytes": len(raw), + } + ) + + +def _validate_fixed_binding(value: Mapping[str, Any]) -> None: + _validate_imported_predecessor_identity() + expected = { + "SCHEMA": FINAL_BINDING_SCHEMA, + "R14_PACKAGE_INIT_SHA256": ( + "737b1caa9086f8ac1556c05625d1b5391b8cae58e9d98a7755fa72f44e94c7ba" + ), + "R14_PACKAGE_INIT_BYTES": 74, + "R14_STRICT_SOURCE_SHA256": ( + "eda983e1b0c29357eb1b6e2f555f402a83b7176fb857488e9be5f5faed490b2d" + ), + "R14_STRICT_SOURCE_BYTES": 46_942, + "R14_BINDING_SOURCE_SHA256": ( + "bd6c704239e2bb4898dddda5c86274f41cd5b304b35d584ddfae3884e8bc8503" + ), + "R14_BINDING_SOURCE_BYTES": 5_726, + "R14_TEST_SOURCE_SHA256": ( + "0de5bbc59ca7c00dca89286d0519ffcdcbead8014175c0aba8f798739f50c2cd" + ), + "R14_TEST_SOURCE_BYTES": 20_070, + "R14_BUILDER_SOURCE_SHA256": ( + "7d2d2657201e344a3c5fd8c1fca60d41a9f304ce8b15b5e47cd937fe21220479" + ), + "R14_BUILDER_SOURCE_BYTES": 4_336, + "CURRENT_TERMINAL_VALIDATOR_NAME": "validate_release_binding", + "CURRENT_STATIC_SUCCESSOR_JOB_ID": CURRENT_JOB_ID, + "OBSOLETE_MISMATCHED_TERMINAL_JOB_ID": OBSOLETE_TERMINAL_JOB_ID, + "TRAINING_AUTHORIZED": False, + "SCIENTIFIC_LAUNCH_AUTHORIZED": False, + "NOVA_SUBMISSION_AUTHORIZED": False, + } + _require( + isinstance(value, Mapping) + and all(value.get(key) == item for key, item in expected.items()) + and all( + type(value.get(key)) is type(item) + for key, item in expected.items() + if type(item) in {int, bool} + ), + "fixed R15/R14 binding changed", + ) + for path, sha_key, bytes_key, label in ( + ( + R14_PACKAGE_INIT_PATH, + "R14_PACKAGE_INIT_SHA256", + "R14_PACKAGE_INIT_BYTES", + "R14 package init", + ), + ( + R14_STRICT_PATH, + "R14_STRICT_SOURCE_SHA256", + "R14_STRICT_SOURCE_BYTES", + "R14 strict source", + ), + ( + R14_BINDING_PATH, + "R14_BINDING_SOURCE_SHA256", + "R14_BINDING_SOURCE_BYTES", + "R14 binding source", + ), + ( + R14_TEST_PATH, + "R14_TEST_SOURCE_SHA256", + "R14_TEST_SOURCE_BYTES", + "R14 focused test", + ), + ( + R14_BUILDER_PATH, + "R14_BUILDER_SOURCE_SHA256", + "R14_BUILDER_SOURCE_BYTES", + "R14 closure builder", + ), + ): + _read_exact( + path, + expected_sha256=str(value[sha_key]), + expected_bytes=int(value[bytes_key]), + require_read_only=False, + label=label, + ) + for path, digest, size, label in ( + ( + SUBMISSION_PACKAGE_INIT_PATH, + SUBMISSION_PACKAGE_INIT_SHA256, + SUBMISSION_PACKAGE_INIT_BYTES, + "R15 submission package init", + ), + ( + SUBMISSION_CONTRACT_PATH, + SUBMISSION_CONTRACT_SHA256, + SUBMISSION_CONTRACT_BYTES, + "R15 measured submission contract", + ), + ( + SUBMISSION_TEST_PATH, + SUBMISSION_TEST_SHA256, + SUBMISSION_TEST_BYTES, + "R15 measured submission contract test", + ), + ): + _read_exact( + path, + expected_sha256=digest, + expected_bytes=size, + require_read_only=False, + label=label, + ) + + +def validate_preparation_binding(value: Mapping[str, Any]) -> None: + _validate_fixed_binding(value) + _require( + value.get("STATUS") == PREPARATION_BINDING_STATUS + and value.get("CURRENT_TERMINAL_VALIDATOR_SOURCE_RELATIVE") + == "PENDING_CURRENT_STATIC_TERMINAL_VALIDATOR_SOURCE" + and value.get("CURRENT_TERMINAL_VALIDATOR_SOURCE_SHA256") + == "PENDING_CURRENT_STATIC_TERMINAL_VALIDATOR_SOURCE_SHA256" + and type(value.get("CURRENT_TERMINAL_VALIDATOR_SOURCE_BYTES")) is int + and value.get("CURRENT_TERMINAL_VALIDATOR_SOURCE_BYTES") == 0 + and value.get("CURRENT_TERMINAL_BINDING_RELATIVE") + == "PENDING_CURRENT_STATIC_TERMINAL_BINDING" + and value.get("CURRENT_TERMINAL_BINDING_SHA256") + == "PENDING_CURRENT_STATIC_TERMINAL_BINDING_SHA256" + and type(value.get("CURRENT_TERMINAL_BINDING_BYTES")) is int + and value.get("CURRENT_TERMINAL_BINDING_BYTES") == 0 + and str(value.get("CURRENT_TERMINAL_BINDING_SCHEMA", "")).startswith( + "PENDING_" + ) + and str(value.get("CURRENT_TERMINAL_BINDING_STATUS", "")).startswith( + "PENDING_" + ), + "R15 preparation sentinel changed", + ) + + +def validate_final_binding(value: Mapping[str, Any]) -> None: + _validate_fixed_binding(value) + _require( + value.get("STATUS") == FINAL_BINDING_STATUS + and type(value.get("CURRENT_TERMINAL_VALIDATOR_SOURCE_SHA256")) + is str + and SHA_RE.fullmatch( + value["CURRENT_TERMINAL_VALIDATOR_SOURCE_SHA256"] + ) + is not None + and type(value.get("CURRENT_TERMINAL_VALIDATOR_SOURCE_BYTES")) is int + and 0 < value["CURRENT_TERMINAL_VALIDATOR_SOURCE_BYTES"] + <= 64 * 1024 * 1024 + and type(value.get("CURRENT_TERMINAL_BINDING_SHA256")) is str + and SHA_RE.fullmatch(value["CURRENT_TERMINAL_BINDING_SHA256"]) + is not None + and type(value.get("CURRENT_TERMINAL_BINDING_BYTES")) is int + and 0 < value["CURRENT_TERMINAL_BINDING_BYTES"] + <= 64 * 1024 * 1024 + and type(value.get("CURRENT_TERMINAL_BINDING_SCHEMA")) is str + and not value["CURRENT_TERMINAL_BINDING_SCHEMA"].startswith( + "PENDING_" + ) + and type(value.get("CURRENT_TERMINAL_BINDING_STATUS")) is str + and not value["CURRENT_TERMINAL_BINDING_STATUS"].startswith( + "PENDING_" + ), + "final current-static terminal binding is unresolved", + ) + _relative_review_path( + value["CURRENT_TERMINAL_VALIDATOR_SOURCE_RELATIVE"], + label="current terminal validator source", + ) + _relative_review_path( + value["CURRENT_TERMINAL_BINDING_RELATIVE"], + label="current terminal binding", + ) + + +def _authorization_false(value: Any, *, label: str) -> None: + authorization = value.get("authorization") if isinstance( + value, Mapping + ) else None + authorization_keys = ( + [ + key + for key in authorization + if str(key).endswith("_authorized") + ] + if isinstance(authorization, Mapping) + else [] + ) + _require( + isinstance(authorization, Mapping) + and bool(authorization) + and bool(authorization_keys) + and all( + authorization[key] is False for key in authorization_keys + ), + f"{label} authorization changed", + ) + + +def _load_current_terminal_authority( + binding: Mapping[str, Any], +) -> tuple[dict[str, Any], Mapping[str, Any]]: + validate_final_binding(binding) + source_path = _relative_review_path( + binding["CURRENT_TERMINAL_VALIDATOR_SOURCE_RELATIVE"], + label="current terminal validator source", + ) + binding_path = _relative_review_path( + binding["CURRENT_TERMINAL_BINDING_RELATIVE"], + label="current terminal binding", + ) + source_raw = _read_exact( + source_path, + expected_sha256=str( + binding["CURRENT_TERMINAL_VALIDATOR_SOURCE_SHA256"] + ), + expected_bytes=int( + binding["CURRENT_TERMINAL_VALIDATOR_SOURCE_BYTES"] + ), + require_read_only=True, + label="current terminal validator source", + ) + module = ModuleType( + "_review_a5_static_v2_current_terminal_validator_exact_for_r15" + ) + module.__file__ = os.fspath(source_path) + exec( + compile(source_raw, os.fspath(source_path), "exec", dont_inherit=True), + module.__dict__, + ) + validator = getattr( + module, str(binding["CURRENT_TERMINAL_VALIDATOR_NAME"]), None + ) + validator_parameters = ( + inspect.signature(validator).parameters + if inspect.isfunction(validator) + else {} + ) + _require( + getattr(module, "BINDING_SCHEMA", None) + == binding["CURRENT_TERMINAL_BINDING_SCHEMA"] + and getattr(module, "BINDING_STATUS", None) + == binding["CURRENT_TERMINAL_BINDING_STATUS"] + and inspect.isfunction(validator) + and validator.__module__ == module.__name__ + and list(validator_parameters) + == ["binding_path", "expected_sha256", "expected_size_bytes"] + and all( + parameter.kind + is inspect.Parameter.POSITIONAL_OR_KEYWORD + and parameter.default is inspect.Parameter.empty + for parameter in validator_parameters.values() + ) + and { + "BINDING_SCHEMA", + "BINDING_STATUS", + str(binding["CURRENT_TERMINAL_VALIDATOR_NAME"]), + } + <= set(getattr(module, "__all__", ())), + "current terminal validator API changed", + ) + binding_raw = _read_exact( + binding_path, + expected_sha256=str(binding["CURRENT_TERMINAL_BINDING_SHA256"]), + expected_bytes=int(binding["CURRENT_TERMINAL_BINDING_BYTES"]), + require_read_only=True, + label="current terminal certification binding", + ) + try: + observed = json.loads(binding_raw.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightCurrentTerminalGateR15Error( + "current terminal binding is not canonical JSON" + ) from error + unsigned = copy.deepcopy(observed) if type(observed) is dict else {} + signed = unsigned.pop("receipt_sha256", None) + corrected_terminal_job_id = ( + observed.get("corrected_terminal_job_id") + if type(observed) is dict + else None + ) + _require( + type(observed) is dict + and canonical_bytes(observed) == binding_raw + and observed.get("schema") + == binding["CURRENT_TERMINAL_BINDING_SCHEMA"] + and observed.get("status") + == binding["CURRENT_TERMINAL_BINDING_STATUS"] + and observed.get("successor_job_id") == CURRENT_JOB_ID + and type(corrected_terminal_job_id) is str + and corrected_terminal_job_id.isdigit() + and corrected_terminal_job_id != OBSOLETE_TERMINAL_JOB_ID + and observed.get("both_jobs_terminal_completed_zero") is True + and observed.get("native_ablation_data_binding_authorized") is False + and observed.get("nova_submission_authorized") is False + and observed.get("official_submitted_artifacts_modified") is False + and type(signed) is str + and SHA_RE.fullmatch(signed) is not None + and _plain_sha256(unsigned) == signed, + "current terminal certification semantics changed", + ) + _authorization_false(observed, label="current terminal certification") + validated = validator( + binding_path, + binding["CURRENT_TERMINAL_BINDING_SHA256"], + binding["CURRENT_TERMINAL_BINDING_BYTES"], + ) + after = _read_exact( + binding_path, + expected_sha256=str(binding["CURRENT_TERMINAL_BINDING_SHA256"]), + expected_bytes=int(binding["CURRENT_TERMINAL_BINDING_BYTES"]), + require_read_only=True, + label="current terminal certification binding post-validation", + ) + _require( + after == binding_raw + and type(validated) is dict + and validated == observed, + "current terminal validator readback changed", + ) + evidence = MappingProxyType( + { + "terminal_validator_source_sha256": binding[ + "CURRENT_TERMINAL_VALIDATOR_SOURCE_SHA256" + ], + "terminal_binding_file_sha256": binding[ + "CURRENT_TERMINAL_BINDING_SHA256" + ], + "terminal_binding_receipt_sha256": signed, + "successor_job_id": CURRENT_JOB_ID, + "corrected_terminal_job_id": corrected_terminal_job_id, + "both_jobs_terminal_completed_zero": True, + } + ) + return observed, evidence + + +def _terminal_identity(binding: Mapping[str, Any]) -> dict[str, Any]: + return { + "absolute_path": os.fspath( + _relative_review_path( + binding["CURRENT_TERMINAL_BINDING_RELATIVE"], + label="current terminal binding", + ) + ), + "sha256": binding["CURRENT_TERMINAL_BINDING_SHA256"], + "bytes": binding["CURRENT_TERMINAL_BINDING_BYTES"], + } + + +def _terminal_gate_provenance( + binding: Mapping[str, Any], + *, + predecessor_receipt_sha256: str, +) -> dict[str, Any]: + return { + "schema": SCHEMA_R15, + "r14_strict_source_sha256": binding["R14_STRICT_SOURCE_SHA256"], + "terminal_validator_source": { + "absolute_path": os.fspath( + _relative_review_path( + binding["CURRENT_TERMINAL_VALIDATOR_SOURCE_RELATIVE"], + label="current terminal validator source", + ) + ), + "sha256": binding[ + "CURRENT_TERMINAL_VALIDATOR_SOURCE_SHA256" + ], + "bytes": binding["CURRENT_TERMINAL_VALIDATOR_SOURCE_BYTES"], + }, + "terminal_binding_schema": binding[ + "CURRENT_TERMINAL_BINDING_SCHEMA" + ], + "terminal_binding_status": binding[ + "CURRENT_TERMINAL_BINDING_STATUS" + ], + "terminal_successor_job_id": CURRENT_JOB_ID, + "predecessor_schema": PREDECESSOR_SCHEMA, + "predecessor_receipt_sha256": predecessor_receipt_sha256, + "old_r11_terminal_gate_invoked": False, + "launch_authorized_by_this_gate": False, + } + + +def _validate_predecessor_release( + value: Any, +) -> tuple[dict[str, Any], str]: + _require( + type(value) is dict + and set(value) == PREDECESSOR_FIELDS + and value.get("schema") == PREDECESSOR_SCHEMA + and value.get("status") == RELEASE_STATUS, + "R15 predecessor R3 release shape changed", + ) + predecessor = copy.deepcopy(value) + unsigned = copy.deepcopy(predecessor) + signed = unsigned.pop("receipt_sha256", None) + _require( + type(signed) is str + and SHA_RE.fullmatch(signed) is not None + and canonical_sha256(unsigned, domain=PREDECESSOR_SCHEMA) == signed, + "R15 predecessor R3 release signature changed", + ) + return predecessor, signed + + +def build_current_release( + predecessor_release: Mapping[str, Any], + *, + binding: Mapping[str, Any], +) -> dict[str, Any]: + """Build one signed R15 release without writing or authorizing training.""" + + validate_final_binding(binding) + predecessor, signed = _validate_predecessor_release( + copy.deepcopy(dict(predecessor_release)) + ) + value = copy.deepcopy(predecessor) + value.pop("receipt_sha256") + value["schema"] = RELEASE_SCHEMA_R15 + value["current_static_terminal_certification"] = _terminal_identity( + binding + ) + value["current_static_terminal_gate"] = _terminal_gate_provenance( + binding, predecessor_receipt_sha256=signed + ) + value["receipt_sha256"] = canonical_sha256( + value, domain=RELEASE_SCHEMA_R15 + ) + return value + + +def validate_current_release_value( + release: Mapping[str, Any], + *, + binding: Mapping[str, Any], +) -> tuple[dict[str, Any], dict[str, Any], Mapping[str, Any]]: + validate_final_binding(binding) + _require( + type(release) is dict + and set(release) == PREDECESSOR_FIELDS | R15_ADDITIONAL_FIELDS + and release.get("schema") == RELEASE_SCHEMA_R15 + and release.get("status") == RELEASE_STATUS, + "R15 current-static external release shape changed", + ) + certified = copy.deepcopy(release) + unsigned = copy.deepcopy(certified) + signed = unsigned.pop("receipt_sha256", None) + _require( + type(signed) is str + and SHA_RE.fullmatch(signed) is not None + and canonical_sha256(unsigned, domain=RELEASE_SCHEMA_R15) == signed, + "R15 current-static external release signature changed", + ) + gate = certified["current_static_terminal_gate"] + _require( + type(gate) is dict + and gate + == _terminal_gate_provenance( + binding, + predecessor_receipt_sha256=gate.get( + "predecessor_receipt_sha256", "" + ), + ), + "R15 terminal gate provenance changed", + ) + terminal_identity = certified["current_static_terminal_certification"] + _require( + type(terminal_identity) is dict + and terminal_identity == _terminal_identity(binding), + "R15 terminal binding identity changed", + ) + _terminal_value, evidence = _load_current_terminal_authority(binding) + predecessor = copy.deepcopy(certified) + predecessor.pop("current_static_terminal_certification") + predecessor.pop("current_static_terminal_gate") + predecessor.pop("receipt_sha256") + predecessor["schema"] = PREDECESSOR_SCHEMA + predecessor["receipt_sha256"] = gate["predecessor_receipt_sha256"] + validated, predecessor_signed = _validate_predecessor_release(predecessor) + _require( + predecessor_signed == gate["predecessor_receipt_sha256"], + "R15 predecessor receipt bridge changed", + ) + return certified, validated, evidence + + +def install_current_terminal_gate( + r9_module: ModuleType, + *, + terminal_binding: Mapping[str, Any], +) -> Mapping[str, Any]: + """Replace exact installed R11 validation with the current R15 gate.""" + + validate_final_binding(terminal_binding) + _load_current_terminal_authority(terminal_binding) + _require(type(r9_module) is ModuleType, "R15 requires one exact R9 module") + r8 = getattr(r9_module, "_r8", None) + r3 = getattr(r9_module, "_r3", None) + r2 = getattr(r9_module, "_r2", None) + core = getattr(r9_module, "_core", None) + _require( + all(type(item) is ModuleType for item in (r8, r3, r2, core)) + and r3 is r8._r3 + and r2 is r8._r2 + and core is r8._core + and r2 is r3._r2 + and core is r3._core is r2._core, + "R15 exact R9 module graph changed", + ) + inherited = r2._validate_external_release_r2 + inherited_pre_submit = r3.validate_pre_submit_release_r3 + _require( + inspect.isfunction(inherited) + and getattr(inherited, "_review_a5_r11_certification_gate", False) + is True + and r3._validate_external_release_r3 is inherited + and not hasattr(r9_module, "_review_a5_r15_gate_installation"), + "R15 did not receive the exact installed R11 graph", + ) + inherited_closure = inspect.getclosurevars(inherited).nonlocals + pre_submit_closure = inspect.getclosurevars( + inherited_pre_submit + ).nonlocals + predecessor_validator = inherited_closure.get("predecessor_validator") + original_loader = inherited_closure.get("original_loader") + freshness_validator = pre_submit_closure.get("freshness_validator") + _require( + inspect.isfunction(predecessor_validator) + and predecessor_validator.__name__ == "_validate_external_release_r3" + and inspect.isfunction(original_loader) + and original_loader.__name__ == "load_canonical_json" + and inspect.isfunction(freshness_validator) + and freshness_validator.__name__ + == "validate_pre_submit_freshness_r3" + and core.load_canonical_json is original_loader, + "R15 inherited R11 closure boundary changed", + ) + active = False + + def validate_external_release_r15( + config: Any, *, launch_config_path: Path + ) -> Mapping[str, Any]: + nonlocal active + _require(not active, "R15 external release validation re-entered") + _require( + r2._validate_external_release_r2 + is validate_external_release_r15 + and r3._validate_external_release_r3 + is validate_external_release_r15 + and core.load_canonical_json is original_loader, + "R15 installed release-validator graph changed", + ) + active = True + try: + release_path = Path(config.release_receipt) + release_sha256 = config.release_receipt_sha256 + _require( + type(release_sha256) is str + and SHA_RE.fullmatch(release_sha256) is not None, + "R15 configured release SHA changed", + ) + release = original_loader( + release_path, + release_sha256, + label="native-eight external release receipt", + ) + certified, predecessor, _evidence = ( + validate_current_release_value( + release, + binding=terminal_binding, + ) + ) + substitutions = 0 + + def predecessor_loader( + path: Path, expected_sha256: str, *, label: str + ) -> dict[str, Any]: + nonlocal substitutions + if Path(path) == release_path: + _require( + expected_sha256 == release_sha256 + and label == "native-eight external release receipt" + and substitutions == 0, + "R15 predecessor loader identity changed", + ) + substitutions += 1 + return copy.deepcopy(predecessor) + return original_loader(path, expected_sha256, label=label) + + core.load_canonical_json = predecessor_loader + try: + observed = predecessor_validator( + config, launch_config_path=launch_config_path + ) + finally: + core.load_canonical_json = original_loader + _require( + substitutions == 1 + and dict(observed) == predecessor + and core.load_canonical_json is original_loader, + "R15 predecessor R3 validation readback changed", + ) + return MappingProxyType(copy.deepcopy(certified)) + finally: + core.load_canonical_json = original_loader + active = False + + def validate_pre_submit_release_r15( + config: Any, *, launch_config_path: Path, now_utc: str + ) -> Mapping[str, Any]: + release = validate_external_release_r15( + config, launch_config_path=launch_config_path + ) + freshness_validator( + release["live_duplicate_preflight"], now_utc=now_utc + ) + return release + + validate_external_release_r15._review_a5_r15_current_terminal_gate = True + validate_pre_submit_release_r15._review_a5_r15_current_terminal_gate = True + r2._validate_external_release_r2 = validate_external_release_r15 + r3._validate_external_release_r3 = validate_external_release_r15 + r3.validate_pre_submit_release_r3 = validate_pre_submit_release_r15 + r3.validate_pre_submit_release_r15 = validate_pre_submit_release_r15 + r9_module.validate_pre_submit_release_r15 = validate_pre_submit_release_r15 + receipt: dict[str, Any] = { + "schema": SCHEMA_R15, + "status": INSTALLATION_STATUS, + "predecessor_gate": "exact_installed_r11", + "predecessor_validator": "_validate_external_release_r3", + "current_static_successor_job_id": CURRENT_JOB_ID, + "old_r11_terminal_gate_invoked": False, + "patched_entries": [ + "_r2._validate_external_release_r2", + "_r3._validate_external_release_r3", + "_r3.validate_pre_submit_release_r3", + "_r3.validate_pre_submit_release_r15", + "r9.validate_pre_submit_release_r15", + ], + "terminal_validator_source_sha256": terminal_binding[ + "CURRENT_TERMINAL_VALIDATOR_SOURCE_SHA256" + ], + "terminal_binding_sha256": terminal_binding[ + "CURRENT_TERMINAL_BINDING_SHA256" + ], + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + receipt["receipt_sha256"] = canonical_sha256( + receipt, domain=SCHEMA_R15 + ) + installation = MappingProxyType(copy.deepcopy(receipt)) + r9_module._review_a5_r15_gate_installation = installation + return installation + + +def _r14_final_binding(binding: Mapping[str, Any]) -> Mapping[str, Any]: + value = dict(_r14.binding_source_value()) + value.pop("binding_source_sha256") + value.pop("binding_source_bytes") + value.update( + { + "STATUS": _r14.FINAL_BINDING_STATUS, + "R6_TERMINAL_BINDING_SHA256": binding[ + "CURRENT_TERMINAL_BINDING_SHA256" + ], + "R6_TERMINAL_BINDING_BYTES": binding[ + "CURRENT_TERMINAL_BINDING_BYTES" + ], + } + ) + _r14.validate_final_binding(value) + return MappingProxyType(value) + + +def load_bound_runtime( + binding: Mapping[str, Any] | None = None, +) -> tuple[ModuleType, ModuleType, Mapping[str, Any], Mapping[str, Any]]: + """Install exact R14, then supersede only its obsolete R11 terminal gate.""" + + value = binding_source_value() if binding is None else binding + validate_final_binding(value) + _load_current_terminal_authority(value) + r14_binding = _r14_final_binding(value) + r9, r11, _observed_r14, r14_receipt = _r14.load_bound_runtime( + binding=r14_binding + ) + current_gate = install_current_terminal_gate( + r9, + terminal_binding=value, + ) + receipt: dict[str, Any] = { + "schema": SCHEMA_R15, + "status": INSTALLATION_STATUS, + "predecessor_r14_schema": r14_receipt["schema"], + "predecessor_r14_status": r14_receipt["status"], + "current_terminal_gate": dict(current_gate), + "installation_order": [ + "strict_r14_r6_checkpoint_hotpath", + "verify_exact_installed_r11_boundary", + "current_static_terminal_gate_r15", + ], + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + receipt["receipt_sha256"] = canonical_sha256( + receipt, domain=SCHEMA_R15 + ) + return ( + r9, + r11, + MappingProxyType(dict(value)), + MappingProxyType(copy.deepcopy(receipt)), + ) + + +def source_closure_paths( + binding: Mapping[str, Any], +) -> Mapping[str, Path]: + """Return the final closure, including omitted R4 and all R14/R15 surfaces.""" + + validate_final_binding(binding) + paths = dict(_r14.source_closure_paths(_r14_final_binding(binding))) + obsolete_binding_path = paths.pop("r6_terminal_binding", None) + _require( + obsolete_binding_path == _r14._r13.R6_TERMINAL_BINDING_PATH, + "R15 inherited obsolete terminal-binding closure changed", + ) + paths.update( + { + "r4_loader_transitive": R4_LOADER_PATH, + "r4_runtime_transitive": R4_RUNTIME_PATH, + "r4_test_transitive": R4_TEST_PATH, + "r4_integrity_receipt_transitive": R4_INTEGRITY_PATH, + "r14_test": R14_TEST_PATH, + "r14_builder": R14_BUILDER_PATH, + "r15_package_init": PACKAGE_INIT_PATH, + "r15_current_terminal_gate": RUNNER_PATH, + "r15_current_terminal_binding": BINDING_SOURCE_PATH, + "r15_current_terminal_test": TEST_PATH, + "r15_submission_package_init": SUBMISSION_PACKAGE_INIT_PATH, + "r15_submission_contract": SUBMISSION_CONTRACT_PATH, + "r15_submission_contract_test": SUBMISSION_TEST_PATH, + "current_terminal_validator_source": _relative_review_path( + binding["CURRENT_TERMINAL_VALIDATOR_SOURCE_RELATIVE"], + label="current terminal validator source", + ), + "current_terminal_binding": _relative_review_path( + binding["CURRENT_TERMINAL_BINDING_RELATIVE"], + label="current terminal binding", + ), + } + ) + _require( + len(paths) == len(set(paths.values())) + and all(path.is_absolute() for path in paths.values()), + "R15 source closure has omitted or collapsed identities", + ) + return MappingProxyType(paths) + + +def describe_preparation() -> Mapping[str, Any]: + value = binding_source_value() + validate_preparation_binding(value) + return MappingProxyType( + { + "schema": SCHEMA_R15, + "status": PREPARATION_BINDING_STATUS, + "current_static_successor_job_id": CURRENT_JOB_ID, + "old_r11_terminal_gate_superseded": True, + "source_closure_bound": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + ) + + +__all__ = [ + "FINAL_BINDING_STATUS", + "INSTALLATION_STATUS", + "NativeEightCurrentTerminalGateR15Error", + "PREPARATION_BINDING_STATUS", + "RELEASE_SCHEMA_R15", + "SCHEMA_R15", + "binding_source_value", + "build_current_release", + "describe_preparation", + "install_current_terminal_gate", + "load_bound_runtime", + "source_closure_paths", + "validate_current_release_value", + "validate_final_binding", + "validate_preparation_binding", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation/review_a5_native_eight_final_bindings_r16.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation/review_a5_native_eight_final_bindings_r16.py new file mode 100644 index 0000000000000000000000000000000000000000..13351ecb75a4d98cac79a9c9134c5fa50be9214a --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation/review_a5_native_eight_final_bindings_r16.py @@ -0,0 +1,79 @@ +"""Immutable preparation binding for the native-eight R16 successor. + +All already-complete identities are exact. The current static/postfit adapter +is deliberately unresolved until its jobs and publication artifacts finish. +This source is not a training or Nova submission authority. +""" + +SCHEMA = "bertose_review_a5_native_eight_final_bindings_20260727_r16" +STATUS = "PREPARATION_ONLY_WAITING_FOR_CURRENT_STATIC_POSTFIT_ADAPTER" + +R15_GATE_SOURCE_SHA256 = ( + "1556d6e2643edfc80b6b6782164ab47560e259ff55791c50dcffdd9b9afc001f" +) +R15_GATE_SOURCE_BYTES = 41_461 +R15_BINDING_SOURCE_SHA256 = ( + "1f21427486260e8b56795f7137f0f7322ae768d80645db6636414e5961aa3224" +) +R15_BINDING_SOURCE_BYTES = 2_041 +R15_TEST_SOURCE_SHA256 = ( + "3af72f2c3f77efb589ce639eb53a77622b72d95c086cb840a294450edc633716" +) +R15_TEST_SOURCE_BYTES = 15_061 +R10_SCHEDULER_BUILDER_SHA256 = ( + "45a5fe8afde2a54300523e08ed4ce6f05f98773fd4f78d1ab1c816dff7da055b" +) +R10_SCHEDULER_BUILDER_BYTES = 13_672 +R10_SCHEDULER_TEST_SHA256 = ( + "230e99db1f4f5f268c8ae19d622c2c0d8dd521e086665e3afd5df81fbc5aa401" +) +R10_SCHEDULER_TEST_BYTES = 14_382 + +R7_LOADER_SHA256 = ( + "fa9538829ff3ccfaf3d3f4346c7e735c70758661eb6bf3da5eece2e7e96e0fb6" +) +R7_LOADER_BYTES = 4_013 +R7_RUNTIME_SHA256 = ( + "c0cb618f7856daf24666dbec07ff51b86e3fbd52c073c58bd1b7151122714f47" +) +R7_RUNTIME_BYTES = 20_454 +R7_TEST_SHA256 = ( + "08115565db0ab8e75b76cde340a8609c7f36727b8f32ba6e936608d04bd67bb8" +) +R7_TEST_BYTES = 20_804 +R7_INTEGRITY_RECEIPT_SHA256 = ( + "912bc1391ff66c3fd704e61266de508adcf9ed587d7e136932508029b77cb956" +) +R7_INTEGRITY_RECEIPT_BYTES = 2_968 + +CUDA_TERMINAL_CERTIFICATION_SHA256 = ( + "2a3b28bd980b144eb42f9688f411adfbced054b9e7bad9fac4de37c6180064f8" +) +CUDA_TERMINAL_CERTIFICATION_BYTES = 4_862 +CUDA_SUCCESS_RECEIPT_SHA256 = ( + "6a1bc65c568a17dc45f1102cd122ac43c62a8ee3b28e06ec855577857cc41ce0" +) +CUDA_SUCCESS_RECEIPT_BYTES = 127_461 +CUDA_SUCCESS_RECEIPT_DOMAIN_SHA256 = ( + "0e491d188a71df9c51dc9deb5df8faea2f88f5096f65ac83a5cde5b53c1762a3" +) + +STATIC_POSTFIT_ADAPTER_SOURCE_RELATIVE = ( + "PENDING_CURRENT_STATIC_POSTFIT_ADAPTER_SOURCE" +) +STATIC_POSTFIT_ADAPTER_SOURCE_SHA256 = ( + "PENDING_CURRENT_STATIC_POSTFIT_ADAPTER_SOURCE_SHA256" +) +STATIC_POSTFIT_ADAPTER_SOURCE_BYTES = 0 +STATIC_POSTFIT_BINDING_RELATIVE = "PENDING_CURRENT_STATIC_POSTFIT_BINDING" +STATIC_POSTFIT_BINDING_SHA256 = ( + "PENDING_CURRENT_STATIC_POSTFIT_BINDING_SHA256" +) +STATIC_POSTFIT_BINDING_BYTES = 0 +STATIC_POSTFIT_BINDING_SCHEMA = "PENDING_CURRENT_STATIC_POSTFIT_BINDING_SCHEMA" +STATIC_POSTFIT_BINDING_STATUS = "PENDING_CURRENT_STATIC_POSTFIT_BINDING_STATUS" +STATIC_POSTFIT_VALIDATOR_NAME = "validate_release_binding" + +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +NOVA_SUBMISSION_AUTHORIZED = False diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation/review_a5_native_eight_release_successor_r16.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation/review_a5_native_eight_release_successor_r16.py new file mode 100644 index 0000000000000000000000000000000000000000..9636fdaa8fc4ef44dd0ad1626076512083fbb2ce --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation/review_a5_native_eight_release_successor_r16.py @@ -0,0 +1,868 @@ +"""Launch-closed R16 successor over R15, hot-path R7, and CUDA R5 proof. + +The R15 scientific gate remains the owner of the current static terminal +bridge. R16 adds the exact R7 load-boundary fix and the completed real-CUDA +resume proof. It cannot load the training runtime until a separate immutable +static/postfit adapter is supplied; the checked-in binding is intentionally a +preparation sentinel. +""" + +from __future__ import annotations + +import copy +import hashlib +import inspect +import json +import os +from pathlib import Path +import re +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + +from review.multimodal.runtime.a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation import ( + review_a5_native_eight_current_terminal_gate_r15 as _r15, +) + + +SCHEMA = "bertose_review_a5_native_eight_release_successor_20260727_r16" +STATUS = "INSTALLED_PREPARATION_ONLY_STATIC_POSTFIT_ADAPTER_UNRESOLVED" +FINAL_BINDING_SCHEMA = ( + "bertose_review_a5_native_eight_final_bindings_20260727_r16" +) +PREPARATION_BINDING_STATUS = ( + "PREPARATION_ONLY_WAITING_FOR_CURRENT_STATIC_POSTFIT_ADAPTER" +) +FINAL_BINDING_STATUS = ( + "BOUND_CURRENT_STATIC_POSTFIT_R15_HOTPATH_R7_AND_CUDA_R5_R16" +) +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") +ZERO_SHA256 = "0" * 64 +STATIC_SUCCESSOR_JOB_ID = "11766708" +STATIC_TERMINAL_JOB_ID = "11766891" +POSTFIT_JOB_ID = "11767383" + +RUNNER_PATH = Path(__file__).absolute() +RUNTIME_DIRECTORY = RUNNER_PATH.parent +BINDING_SOURCE_PATH = ( + RUNTIME_DIRECTORY / "review_a5_native_eight_final_bindings_r16.py" +) +TEST_PATH = ( + RUNTIME_DIRECTORY / "test_review_a5_native_eight_release_successor_r16.py" +) +WRITING_ROOT = RUNNER_PATH.parents[4] +RUNTIME_ROOT = WRITING_ROOT / "review/multimodal/runtime" +OUTPUT_ROOT = WRITING_ROOT / "review/multimodal/outputs" + +R15_DIRECTORY = ( + RUNTIME_ROOT + / "a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation" +) +R15_GATE_PATH = ( + R15_DIRECTORY / "review_a5_native_eight_current_terminal_gate_r15.py" +) +R15_BINDING_PATH = ( + R15_DIRECTORY / "review_a5_native_eight_current_terminal_bindings_r15.py" +) +R15_TEST_PATH = ( + R15_DIRECTORY / "test_review_a5_native_eight_current_terminal_gate_r15.py" +) +R10_SCHEDULER_BUILDER_PATH = ( + WRITING_ROOT + / "review/multimodal/scripts/" + "build_review_a5_native_eight_publication_handoff_20260726_r10.py" +) +R10_SCHEDULER_TEST_PATH = ( + WRITING_ROOT + / "review/multimodal/tests/" + "test_build_review_a5_native_eight_publication_handoff_20260726_r10.py" +) + +R7_DIRECTORY = ( + RUNTIME_ROOT + / "a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization" +) +R7_LOADER_PATH = R7_DIRECTORY / "load_review_a5_native_eight_hotpath_r7.py" +R7_RUNTIME_PATH = R7_DIRECTORY / "review_a5_native_eight_hotpath_r7.py" +R7_TEST_PATH = R7_DIRECTORY / "test_review_a5_native_eight_hotpath_r7.py" +R7_INTEGRITY_PATH = ( + OUTPUT_ROOT + / "review_a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization" + / "review_a5_native_eight_hotpath_r7_integrity_receipt.json" +) + +CUDA_TERMINAL_PATH = ( + OUTPUT_ROOT + / "review_a5_native_eight_cuda_resume_diagnostic_20260727_" + "r5_submission_readback_11767377" + / "review_a5_native_eight_cuda_resume_diagnostic_r5_" + "11767377_terminal_certification_receipt.json" +) +CUDA_SUCCESS_PATH = ( + OUTPUT_ROOT + / "review_a5_native_eight_cuda_resume_diagnostic_20260727_" + "r5_synthetic_device_receipt_fix" + / "review_a5_native_eight_cuda_resume_diagnostic_receipt_r5.json" +) + +_BINDING_NAMES = ( + "SCHEMA", + "STATUS", + "R15_GATE_SOURCE_SHA256", + "R15_GATE_SOURCE_BYTES", + "R15_BINDING_SOURCE_SHA256", + "R15_BINDING_SOURCE_BYTES", + "R15_TEST_SOURCE_SHA256", + "R15_TEST_SOURCE_BYTES", + "R10_SCHEDULER_BUILDER_SHA256", + "R10_SCHEDULER_BUILDER_BYTES", + "R10_SCHEDULER_TEST_SHA256", + "R10_SCHEDULER_TEST_BYTES", + "R7_LOADER_SHA256", + "R7_LOADER_BYTES", + "R7_RUNTIME_SHA256", + "R7_RUNTIME_BYTES", + "R7_TEST_SHA256", + "R7_TEST_BYTES", + "R7_INTEGRITY_RECEIPT_SHA256", + "R7_INTEGRITY_RECEIPT_BYTES", + "CUDA_TERMINAL_CERTIFICATION_SHA256", + "CUDA_TERMINAL_CERTIFICATION_BYTES", + "CUDA_SUCCESS_RECEIPT_SHA256", + "CUDA_SUCCESS_RECEIPT_BYTES", + "CUDA_SUCCESS_RECEIPT_DOMAIN_SHA256", + "STATIC_POSTFIT_ADAPTER_SOURCE_RELATIVE", + "STATIC_POSTFIT_ADAPTER_SOURCE_SHA256", + "STATIC_POSTFIT_ADAPTER_SOURCE_BYTES", + "STATIC_POSTFIT_BINDING_RELATIVE", + "STATIC_POSTFIT_BINDING_SHA256", + "STATIC_POSTFIT_BINDING_BYTES", + "STATIC_POSTFIT_BINDING_SCHEMA", + "STATIC_POSTFIT_BINDING_STATUS", + "STATIC_POSTFIT_VALIDATOR_NAME", + "TRAINING_AUTHORIZED", + "SCIENTIFIC_LAUNCH_AUTHORIZED", + "NOVA_SUBMISSION_AUTHORIZED", +) + + +class NativeEightReleaseSuccessorR16Error(RuntimeError): + """The R16 source, proof, adapter, or installation boundary changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightReleaseSuccessorR16Error(message) + + +def canonical_bytes(value: Any) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def canonical_sha256(value: Any, *, domain: str) -> str: + return hashlib.sha256( + domain.encode("ascii") + b"\0" + canonical_bytes(value) + ).hexdigest() + + +def _read_exact( + path: Path, + *, + expected_sha256: str, + expected_bytes: int, + require_read_only: bool, +) -> bytes: + _require( + path.is_absolute() + and os.path.normpath(os.fspath(path)) == os.fspath(path) + and SHA_RE.fullmatch(expected_sha256) is not None + and expected_sha256 != ZERO_SHA256 + and type(expected_bytes) is int + and 0 < expected_bytes <= 64 * 1024 * 1024, + f"{path.name} exact identity is unresolved", + ) + descriptor = os.open( + path, + os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0), + ) + try: + before = os.fstat(descriptor) + _require( + stat.S_ISREG(before.st_mode) + and before.st_nlink == 1 + and before.st_size == expected_bytes + and (not require_read_only or before.st_mode & 0o222 == 0), + f"{path.name} type, size, link, or mode changed", + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + _require(bool(chunk), f"{path.name} truncated") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + _require( + ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_nlink, + ) + == ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_nlink, + ), + f"{path.name} changed while read", + ) + finally: + os.close(descriptor) + raw = b"".join(chunks) + _require( + len(raw) == expected_bytes + and hashlib.sha256(raw).hexdigest() == expected_sha256, + f"{path.name} SHA-256 changed", + ) + return raw + + +def _relative_review_path(value: Any, *, label: str) -> Path: + _require( + type(value) is str + and value + and not value.startswith("/") + and "\\" not in value + and os.path.normpath(value) == value, + f"{label} is not one canonical relative path", + ) + relative = Path(value) + _require( + relative.parts[:2] == ("review", "multimodal") + and all(part not in {"", ".", ".."} for part in relative.parts), + f"{label} is outside review/multimodal", + ) + return WRITING_ROOT / relative + + +def binding_source_value() -> Mapping[str, Any]: + raw = _r15._r14._r13.read_regular_nofollow( + BINDING_SOURCE_PATH, + maximum=64 * 1024, + require_read_only=False, + ) + module = ModuleType("_review_a5_native_eight_r16_binding_observed") + module.__file__ = os.fspath(BINDING_SOURCE_PATH) + exec( + compile(raw, os.fspath(BINDING_SOURCE_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + return MappingProxyType( + { + **{name: getattr(module, name, None) for name in _BINDING_NAMES}, + "binding_source_sha256": hashlib.sha256(raw).hexdigest(), + "binding_source_bytes": len(raw), + } + ) + + +def _fixed_expected() -> Mapping[str, Any]: + return MappingProxyType( + { + "SCHEMA": FINAL_BINDING_SCHEMA, + "R15_GATE_SOURCE_SHA256": ( + "1556d6e2643edfc80b6b6782164ab47560e259ff55791c50dcffdd9b9afc001f" + ), + "R15_GATE_SOURCE_BYTES": 41_461, + "R15_BINDING_SOURCE_SHA256": ( + "1f21427486260e8b56795f7137f0f7322ae768d80645db6636414e5961aa3224" + ), + "R15_BINDING_SOURCE_BYTES": 2_041, + "R15_TEST_SOURCE_SHA256": ( + "3af72f2c3f77efb589ce639eb53a77622b72d95c086cb840a294450edc633716" + ), + "R15_TEST_SOURCE_BYTES": 15_061, + "R10_SCHEDULER_BUILDER_SHA256": ( + "45a5fe8afde2a54300523e08ed4ce6f05f98773fd4f78d1ab1c816dff7da055b" + ), + "R10_SCHEDULER_BUILDER_BYTES": 13_672, + "R10_SCHEDULER_TEST_SHA256": ( + "230e99db1f4f5f268c8ae19d622c2c0d8dd521e086665e3afd5df81fbc5aa401" + ), + "R10_SCHEDULER_TEST_BYTES": 14_382, + "R7_LOADER_SHA256": ( + "fa9538829ff3ccfaf3d3f4346c7e735c70758661eb6bf3da5eece2e7e96e0fb6" + ), + "R7_LOADER_BYTES": 4_013, + "R7_RUNTIME_SHA256": ( + "c0cb618f7856daf24666dbec07ff51b86e3fbd52c073c58bd1b7151122714f47" + ), + "R7_RUNTIME_BYTES": 20_454, + "R7_TEST_SHA256": ( + "08115565db0ab8e75b76cde340a8609c7f36727b8f32ba6e936608d04bd67bb8" + ), + "R7_TEST_BYTES": 20_804, + "R7_INTEGRITY_RECEIPT_SHA256": ( + "912bc1391ff66c3fd704e61266de508adcf9ed587d7e136932508029b77cb956" + ), + "R7_INTEGRITY_RECEIPT_BYTES": 2_968, + "CUDA_TERMINAL_CERTIFICATION_SHA256": ( + "2a3b28bd980b144eb42f9688f411adfbced054b9e7bad9fac4de37c6180064f8" + ), + "CUDA_TERMINAL_CERTIFICATION_BYTES": 4_862, + "CUDA_SUCCESS_RECEIPT_SHA256": ( + "6a1bc65c568a17dc45f1102cd122ac43c62a8ee3b28e06ec855577857cc41ce0" + ), + "CUDA_SUCCESS_RECEIPT_BYTES": 127_461, + "CUDA_SUCCESS_RECEIPT_DOMAIN_SHA256": ( + "0e491d188a71df9c51dc9deb5df8faea2f88f5096f65ac83a5cde5b53c1762a3" + ), + "STATIC_POSTFIT_VALIDATOR_NAME": "validate_release_binding", + "TRAINING_AUTHORIZED": False, + "SCIENTIFIC_LAUNCH_AUTHORIZED": False, + "NOVA_SUBMISSION_AUTHORIZED": False, + } + ) + + +def _validate_fixed_binding(value: Mapping[str, Any]) -> None: + expected = _fixed_expected() + _require( + isinstance(value, Mapping) + and all(value.get(key) == item for key, item in expected.items()), + "fixed R16 binding changed", + ) + for path, sha_key, bytes_key in ( + ( + R15_GATE_PATH, + "R15_GATE_SOURCE_SHA256", + "R15_GATE_SOURCE_BYTES", + ), + ( + R15_BINDING_PATH, + "R15_BINDING_SOURCE_SHA256", + "R15_BINDING_SOURCE_BYTES", + ), + (R15_TEST_PATH, "R15_TEST_SOURCE_SHA256", "R15_TEST_SOURCE_BYTES"), + ( + R10_SCHEDULER_BUILDER_PATH, + "R10_SCHEDULER_BUILDER_SHA256", + "R10_SCHEDULER_BUILDER_BYTES", + ), + ( + R10_SCHEDULER_TEST_PATH, + "R10_SCHEDULER_TEST_SHA256", + "R10_SCHEDULER_TEST_BYTES", + ), + (R7_LOADER_PATH, "R7_LOADER_SHA256", "R7_LOADER_BYTES"), + (R7_RUNTIME_PATH, "R7_RUNTIME_SHA256", "R7_RUNTIME_BYTES"), + (R7_TEST_PATH, "R7_TEST_SHA256", "R7_TEST_BYTES"), + ( + R7_INTEGRITY_PATH, + "R7_INTEGRITY_RECEIPT_SHA256", + "R7_INTEGRITY_RECEIPT_BYTES", + ), + ( + CUDA_TERMINAL_PATH, + "CUDA_TERMINAL_CERTIFICATION_SHA256", + "CUDA_TERMINAL_CERTIFICATION_BYTES", + ), + ( + CUDA_SUCCESS_PATH, + "CUDA_SUCCESS_RECEIPT_SHA256", + "CUDA_SUCCESS_RECEIPT_BYTES", + ), + ): + _read_exact( + path, + expected_sha256=str(value[sha_key]), + expected_bytes=int(value[bytes_key]), + require_read_only=path in { + R7_LOADER_PATH, + R7_RUNTIME_PATH, + R7_TEST_PATH, + R7_INTEGRITY_PATH, + CUDA_TERMINAL_PATH, + CUDA_SUCCESS_PATH, + }, + ) + + +def validate_preparation_binding(value: Mapping[str, Any]) -> None: + _validate_fixed_binding(value) + _require( + value.get("STATUS") == PREPARATION_BINDING_STATUS + and value.get("STATIC_POSTFIT_ADAPTER_SOURCE_RELATIVE") + == "PENDING_CURRENT_STATIC_POSTFIT_ADAPTER_SOURCE" + and str( + value.get("STATIC_POSTFIT_ADAPTER_SOURCE_SHA256", "") + ).startswith("PENDING_") + and value.get("STATIC_POSTFIT_ADAPTER_SOURCE_BYTES") == 0 + and value.get("STATIC_POSTFIT_BINDING_RELATIVE") + == "PENDING_CURRENT_STATIC_POSTFIT_BINDING" + and str(value.get("STATIC_POSTFIT_BINDING_SHA256", "")).startswith( + "PENDING_" + ) + and value.get("STATIC_POSTFIT_BINDING_BYTES") == 0 + and str(value.get("STATIC_POSTFIT_BINDING_SCHEMA", "")).startswith( + "PENDING_" + ) + and str(value.get("STATIC_POSTFIT_BINDING_STATUS", "")).startswith( + "PENDING_" + ), + "R16 preparation sentinel changed", + ) + + +def validate_final_binding(value: Mapping[str, Any]) -> None: + _validate_fixed_binding(value) + _require( + value.get("STATUS") == FINAL_BINDING_STATUS + and SHA_RE.fullmatch( + str(value.get("STATIC_POSTFIT_ADAPTER_SOURCE_SHA256", "")) + ) + is not None + and type(value.get("STATIC_POSTFIT_ADAPTER_SOURCE_BYTES")) is int + and value["STATIC_POSTFIT_ADAPTER_SOURCE_BYTES"] > 0 + and SHA_RE.fullmatch( + str(value.get("STATIC_POSTFIT_BINDING_SHA256", "")) + ) + is not None + and type(value.get("STATIC_POSTFIT_BINDING_BYTES")) is int + and value["STATIC_POSTFIT_BINDING_BYTES"] > 0 + and not str(value.get("STATIC_POSTFIT_BINDING_SCHEMA", "")).startswith( + "PENDING_" + ) + and not str(value.get("STATIC_POSTFIT_BINDING_STATUS", "")).startswith( + "PENDING_" + ), + "final R16 static/postfit adapter is unresolved", + ) + _relative_review_path( + value["STATIC_POSTFIT_ADAPTER_SOURCE_RELATIVE"], + label="static/postfit adapter source", + ) + _relative_review_path( + value["STATIC_POSTFIT_BINDING_RELATIVE"], + label="static/postfit binding", + ) + + +def validate_cuda_terminal_proof( + binding: Mapping[str, Any], +) -> Mapping[str, Any]: + _validate_fixed_binding(binding) + terminal_raw = _read_exact( + CUDA_TERMINAL_PATH, + expected_sha256=binding["CUDA_TERMINAL_CERTIFICATION_SHA256"], + expected_bytes=binding["CUDA_TERMINAL_CERTIFICATION_BYTES"], + require_read_only=True, + ) + success_raw = _read_exact( + CUDA_SUCCESS_PATH, + expected_sha256=binding["CUDA_SUCCESS_RECEIPT_SHA256"], + expected_bytes=binding["CUDA_SUCCESS_RECEIPT_BYTES"], + require_read_only=True, + ) + terminal = json.loads(terminal_raw) + success = json.loads(success_raw) + _require( + terminal.get("schema") + == ( + "bertose_review_a5_native_eight_cuda_resume_diagnostic_" + "r5_terminal_certification_20260727" + ) + and terminal.get("status") + == "PASS_TERMINAL_CERTIFIED_REAL_CUDA_EXACT_RESUME" + and terminal.get("job", {}).get("job_id") == "11767377" + and terminal.get("job", {}).get("state") == "COMPLETED" + and terminal.get("job", {}).get("exit_code") == "0:0" + and terminal.get("route", {}).get("requested_gres") == "gpu:1" + and terminal.get("route", {}).get("gpu_feature_constraint") is None + and terminal.get("cuda_success_receipt", {}).get("file_sha256") + == binding["CUDA_SUCCESS_RECEIPT_SHA256"] + and terminal.get("cuda_success_receipt", {}).get( + "self_domain_sha256" + ) + == binding["CUDA_SUCCESS_RECEIPT_DOMAIN_SHA256"] + and terminal.get("cuda_exact_resume_proof", {}).get( + "load_latest_executed" + ) + is True + and terminal.get("cuda_exact_resume_proof", {}).get( + "load_best_executed" + ) + is True + and terminal.get("cuda_exact_resume_proof", {}).get( + "interrupted_uninterrupted_exact_match" + ) + is True + and terminal.get("scope", {}).get("cuda_exact_resume_gate_certified") + is True + and terminal.get("scope", {}).get("nova_submission_authorized") + is False, + "CUDA R5 terminal certification semantics changed", + ) + unsigned = copy.deepcopy(success) + signed = unsigned.pop("receipt_sha256", None) + _require( + success.get("schema") + == "bertose_review_a5_native_eight_cuda_resume_diagnostic_20260727_r5" + and success.get("status") + == ( + "PASS_REAL_CUDA_R7_BOTH_LOADS_EXACT_RESUME_DRAWS_" + "AND_DEVICE_RECEIPT" + ) + and signed == binding["CUDA_SUCCESS_RECEIPT_DOMAIN_SHA256"] + and canonical_sha256(unsigned, domain=success["schema"]) == signed + and success.get("load_latest_executed") is True + and success.get("load_best_executed") is True + and success.get("interrupted_uninterrupted_exact_match") is True + and success.get("r7_runtime_sha256") == binding["R7_RUNTIME_SHA256"] + and success.get("r7_test_sha256") == binding["R7_TEST_SHA256"] + and success.get("r7_integrity_receipt_sha256") + == binding["R7_INTEGRITY_RECEIPT_SHA256"] + and success.get("training_authorized") is False + and success.get("scientific_launch_authorized") is False + and success.get("nova_submission_authorized") is False, + "CUDA R5 success receipt semantics changed", + ) + return MappingProxyType( + { + "terminal_certification_sha256": binding[ + "CUDA_TERMINAL_CERTIFICATION_SHA256" + ], + "success_receipt_sha256": binding["CUDA_SUCCESS_RECEIPT_SHA256"], + "success_receipt_domain_sha256": signed, + "load_latest_executed": True, + "load_best_executed": True, + "exact_resume_certified": True, + } + ) + + +def _authorization_false(value: Mapping[str, Any]) -> bool: + authorization = value.get("authorization") + keys = ( + [ + key + for key in authorization + if str(key).endswith("_authorized") + ] + if isinstance(authorization, Mapping) + else [] + ) + return bool(keys) and all(authorization[key] is False for key in keys) + + +def validate_static_postfit_adapter( + binding: Mapping[str, Any], +) -> tuple[dict[str, Any], Mapping[str, Any]]: + validate_final_binding(binding) + source_path = _relative_review_path( + binding["STATIC_POSTFIT_ADAPTER_SOURCE_RELATIVE"], + label="static/postfit adapter source", + ) + binding_path = _relative_review_path( + binding["STATIC_POSTFIT_BINDING_RELATIVE"], + label="static/postfit binding", + ) + source_raw = _read_exact( + source_path, + expected_sha256=binding["STATIC_POSTFIT_ADAPTER_SOURCE_SHA256"], + expected_bytes=binding["STATIC_POSTFIT_ADAPTER_SOURCE_BYTES"], + require_read_only=True, + ) + module = ModuleType("_review_a5_native_eight_r16_static_postfit_adapter") + module.__file__ = os.fspath(source_path) + exec( + compile(source_raw, os.fspath(source_path), "exec", dont_inherit=True), + module.__dict__, + ) + validator = getattr(module, binding["STATIC_POSTFIT_VALIDATOR_NAME"], None) + parameters = ( + inspect.signature(validator).parameters + if inspect.isfunction(validator) + else {} + ) + _require( + getattr(module, "BINDING_SCHEMA", None) + == binding["STATIC_POSTFIT_BINDING_SCHEMA"] + and getattr(module, "BINDING_STATUS", None) + == binding["STATIC_POSTFIT_BINDING_STATUS"] + and inspect.isfunction(validator) + and list(parameters) + == ["binding_path", "expected_sha256", "expected_size_bytes"] + and { + "BINDING_SCHEMA", + "BINDING_STATUS", + binding["STATIC_POSTFIT_VALIDATOR_NAME"], + } + <= set(getattr(module, "__all__", ())), + "static/postfit adapter API changed", + ) + binding_raw = _read_exact( + binding_path, + expected_sha256=binding["STATIC_POSTFIT_BINDING_SHA256"], + expected_bytes=binding["STATIC_POSTFIT_BINDING_BYTES"], + require_read_only=True, + ) + observed = json.loads(binding_raw) + unsigned = copy.deepcopy(observed) + signed = unsigned.pop("receipt_sha256", None) + _require( + canonical_bytes(observed) == binding_raw + and observed.get("schema") == binding["STATIC_POSTFIT_BINDING_SCHEMA"] + and observed.get("status") == binding["STATIC_POSTFIT_BINDING_STATUS"] + and observed.get("successor_job_id") == STATIC_SUCCESSOR_JOB_ID + and observed.get("corrected_terminal_job_id") + == STATIC_TERMINAL_JOB_ID + and observed.get("both_jobs_terminal_completed_zero") is True + and observed.get("postfit_job_id") == POSTFIT_JOB_ID + and observed.get("postfit_terminal_completed_zero") is True + and observed.get("postfit_publication_status") + == "PASS_DIRECT_FULL_DEVELOPMENT_STATIC_PACKAGE_PUBLISHED" + and SHA_RE.fullmatch( + str(observed.get("postfit_publication_file_sha256", "")) + ) + is not None + and SHA_RE.fullmatch( + str(observed.get("selected_best_checkpoint_semantic_sha256", "")) + ) + is not None + and observed.get("native_ablation_data_binding_authorized") is False + and observed.get("nova_submission_authorized") is False + and observed.get("official_submitted_artifacts_modified") is False + and _authorization_false(observed) + and SHA_RE.fullmatch(str(signed)) is not None + and hashlib.sha256(canonical_bytes(unsigned)).hexdigest() == signed, + "static/postfit terminal binding semantics changed", + ) + validated = validator( + binding_path, + binding["STATIC_POSTFIT_BINDING_SHA256"], + binding["STATIC_POSTFIT_BINDING_BYTES"], + ) + _require( + type(validated) is dict and validated == observed, + "static/postfit adapter validation readback changed", + ) + return observed, MappingProxyType( + { + "adapter_source_sha256": binding[ + "STATIC_POSTFIT_ADAPTER_SOURCE_SHA256" + ], + "binding_file_sha256": binding["STATIC_POSTFIT_BINDING_SHA256"], + "binding_receipt_sha256": signed, + "static_successor_job_id": STATIC_SUCCESSOR_JOB_ID, + "static_terminal_job_id": STATIC_TERMINAL_JOB_ID, + "postfit_job_id": POSTFIT_JOB_ID, + } + ) + + +def required_static_postfit_adapter_surface() -> Mapping[str, Any]: + return MappingProxyType( + { + "module_constants": ["BINDING_SCHEMA", "BINDING_STATUS"], + "validator": ( + "validate_release_binding(" + "binding_path, expected_sha256, expected_size_bytes)" + ), + "validator_exported_in___all__": True, + "binding_required_fields": [ + "schema", + "status", + "successor_job_id=11766708", + "corrected_terminal_job_id=11766891", + "both_jobs_terminal_completed_zero=true", + "postfit_job_id=11767383", + "postfit_terminal_completed_zero=true", + ( + "postfit_publication_status=" + "PASS_DIRECT_FULL_DEVELOPMENT_STATIC_PACKAGE_PUBLISHED" + ), + "postfit_publication_file_sha256", + "selected_best_checkpoint_semantic_sha256", + "native_ablation_data_binding_authorized=false", + "nova_submission_authorized=false", + "official_submitted_artifacts_modified=false", + "authorization.*_authorized=false", + "receipt_sha256", + ], + "current_status": "UNRESOLVED_LAUNCH_CLOSED", + } + ) + + +def _r15_final_binding(binding: Mapping[str, Any]) -> Mapping[str, Any]: + value = dict(_r15.binding_source_value()) + value.update( + { + "STATUS": _r15.FINAL_BINDING_STATUS, + "CURRENT_TERMINAL_VALIDATOR_SOURCE_RELATIVE": binding[ + "STATIC_POSTFIT_ADAPTER_SOURCE_RELATIVE" + ], + "CURRENT_TERMINAL_VALIDATOR_SOURCE_SHA256": binding[ + "STATIC_POSTFIT_ADAPTER_SOURCE_SHA256" + ], + "CURRENT_TERMINAL_VALIDATOR_SOURCE_BYTES": binding[ + "STATIC_POSTFIT_ADAPTER_SOURCE_BYTES" + ], + "CURRENT_TERMINAL_BINDING_RELATIVE": binding[ + "STATIC_POSTFIT_BINDING_RELATIVE" + ], + "CURRENT_TERMINAL_BINDING_SHA256": binding[ + "STATIC_POSTFIT_BINDING_SHA256" + ], + "CURRENT_TERMINAL_BINDING_BYTES": binding[ + "STATIC_POSTFIT_BINDING_BYTES" + ], + "CURRENT_TERMINAL_BINDING_SCHEMA": binding[ + "STATIC_POSTFIT_BINDING_SCHEMA" + ], + "CURRENT_TERMINAL_BINDING_STATUS": binding[ + "STATIC_POSTFIT_BINDING_STATUS" + ], + } + ) + _r15.validate_final_binding(value) + return MappingProxyType(value) + + +def _load_r7_loader(binding: Mapping[str, Any]) -> ModuleType: + raw = _read_exact( + R7_LOADER_PATH, + expected_sha256=binding["R7_LOADER_SHA256"], + expected_bytes=binding["R7_LOADER_BYTES"], + require_read_only=True, + ) + name = "_review_a5_native_eight_hotpath_r7_loader_pinned_for_r16" + module = sys.modules.get(name) + if module is not None: + return module + module = ModuleType(name) + module.__file__ = os.fspath(R7_LOADER_PATH) + module.__package__ = "" + sys.modules[name] = module + try: + exec( + compile(raw, os.fspath(R7_LOADER_PATH), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(name, None) + raise + _require( + module.SOURCE_SHA256 == binding["R7_RUNTIME_SHA256"] + and module.SOURCE_BYTES == binding["R7_RUNTIME_BYTES"], + "R7 loader target identity changed", + ) + return module + + +def load_bound_runtime( + binding: Mapping[str, Any] | None = None, +) -> tuple[ModuleType, ModuleType, Mapping[str, Any], Mapping[str, Any]]: + """Install R15 then exact R7; impossible with the checked-in sentinel.""" + + value = binding_source_value() if binding is None else binding + validate_final_binding(value) + _observed, adapter = validate_static_postfit_adapter(value) + cuda = validate_cuda_terminal_proof(value) + r9, r11, _r15_binding, r15_receipt = _r15.load_bound_runtime( + binding=_r15_final_binding(value) + ) + r7_receipt = _load_r7_loader(value).install_optimized_execution_layer(r9) + _require( + r7_receipt.get("schema") + == "bertose_review_a5_native_eight_hotpath_20260727_r7" + and r7_receipt.get("source_sha256") == value["R7_RUNTIME_SHA256"] + and r7_receipt.get("checkpoint_load_latest_rng_cpu_normalized") is True + and r7_receipt.get("checkpoint_load_best_rng_cpu_normalized") is True + and r7_receipt.get("training_authorized") is False + and r7_receipt.get("scientific_launch_authorized") is False + and r7_receipt.get("nova_submission_authorized") is False, + "installed R7 receipt changed", + ) + receipt = { + "schema": SCHEMA, + "status": STATUS, + "installation_order": [ + "r15_current_static_terminal_gate", + "hotpath_r7_cuda_rng_cpu_normalization", + "cuda_r5_terminal_exact_resume_proof", + ], + "r15_receipt_sha256": r15_receipt["receipt_sha256"], + "r7_runtime_sha256": value["R7_RUNTIME_SHA256"], + "cuda_terminal_certification_sha256": cuda[ + "terminal_certification_sha256" + ], + "static_postfit_adapter_receipt_sha256": adapter[ + "binding_receipt_sha256" + ], + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + receipt["receipt_sha256"] = canonical_sha256(receipt, domain=SCHEMA) + return ( + r9, + r11, + MappingProxyType(dict(value)), + MappingProxyType(receipt), + ) + + +def describe_preparation() -> Mapping[str, Any]: + value = binding_source_value() + validate_preparation_binding(value) + cuda = validate_cuda_terminal_proof(value) + return MappingProxyType( + { + "schema": SCHEMA, + "status": PREPARATION_BINDING_STATUS, + "r15_current_terminal_gate_bound": True, + "hotpath_r7_bound": True, + "cuda_r5_terminal_proof": dict(cuda), + "static_postfit_adapter": dict( + required_static_postfit_adapter_surface() + ), + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + ) + + +__all__ = [ + "FINAL_BINDING_SCHEMA", + "FINAL_BINDING_STATUS", + "NativeEightReleaseSuccessorR16Error", + "PREPARATION_BINDING_STATUS", + "SCHEMA", + "STATUS", + "binding_source_value", + "describe_preparation", + "load_bound_runtime", + "required_static_postfit_adapter_surface", + "validate_cuda_terminal_proof", + "validate_final_binding", + "validate_preparation_binding", + "validate_static_postfit_adapter", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_balanced_planner_r4.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_balanced_planner_r4.py new file mode 100644 index 0000000000000000000000000000000000000000..6b1c068c316aa9ea376b5dffa265718a3d418c83 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_balanced_planner_r4.py @@ -0,0 +1,607 @@ +"""Deterministic native-eight epoch planner with exact sparse-objective weights. + +This isolated review runtime fixes two defects in the earlier candidate planner: + +* parent uniqueness is checked with an O(N) seen set, never list membership; +* sparse objective losses are not means of the carriers found in each step. + +For objective ``o`` with ``N_o`` eligible parents and ``S`` optimizer steps, a +step contributes ``(S / N_o) * sum(parent_losses_o_in_step)``. Consequently, +the arithmetic mean of the S step objectives is exactly the equal-parent epoch +mean. This remains true for any deterministic microbatch split. + +Parents carrying optional objectives are deterministically stratified by their +three-bit topology/MS/static availability pattern. Each nonzero stratum is +hash ordered and round-robined over steps with a seeded offset; sequence-only +parents fill the remaining balanced capacities. This tightens carrier-count +variance without changing the exact global-normalization correctness law. + +The source is preparation-only. It cannot authorize training or submission. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from fractions import Fraction +import hashlib +import json +import math +from collections.abc import Mapping, Sequence +from typing import Any, Optional, TypeVar + + +SCHEMA = "bertose_a5_native_eight_balanced_epoch_plan_20260721_r4" +CURSOR_SCHEMA = "bertose_a5_native_eight_balanced_epoch_cursor_20260721_r4" +OBJECTIVES = ("sequence", "topology", "ms", "static") +OPTIONAL_OBJECTIVES = ("topology", "ms", "static") +CELL_ORDER = ("A000", "A100", "A010", "A001", "A110", "A101", "A011", "A111") +CELL_BITS = { + "A000": (0, 0, 0), + "A100": (1, 0, 0), + "A010": (0, 1, 0), + "A001": (0, 0, 1), + "A110": (1, 1, 0), + "A101": (1, 0, 1), + "A011": (0, 1, 1), + "A111": (1, 1, 1), +} +FROZEN_TRAIN_PATTERN_COUNTS = { + "000": 147_444, + "001": 978, + "010": 1_491, + "011": 0, + "100": 49_345, + "101": 21_605, + "110": 567, + "111": 397, +} +FROZEN_TRAIN_ELIGIBILITY_COUNTS = { + "sequence": 221_827, + "topology": 71_914, + "ms": 2_455, + "static": 22_980, +} +COMMON_SEED = 43 +NOMINAL_EFFECTIVE_BATCH = 128 +MICROBATCHES_PER_STEP = 4 +SHELL_DENOMINATOR = 4 + +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +EXECUTION_CERTIFIED = False + + +class BalancedPlannerError(RuntimeError): + """Fail-closed planner/reduction error.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise BalancedPlannerError(message) + + +def _valid_sha256(value: object) -> bool: + return ( + type(value) is str + and len(value) == 64 + and all(character in "0123456789abcdef" for character in value) + ) + + +def _canonical_bytes(value: object) -> bytes: + return ( + json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False) + + "\n" + ).encode("utf-8") + + +def canonical_sha256(value: object, *, domain: str) -> str: + return hashlib.sha256(domain.encode("ascii") + b"\0" + _canonical_bytes(value)).hexdigest() + + +def _stable_key(*parts: object) -> bytes: + return hashlib.sha256( + b"bertose-a5-native-eight-balanced-plan-r4\0" + _canonical_bytes([str(part) for part in parts]) + ).digest() + + +def cell_coefficients(cell_id: str) -> dict[str, int]: + _require(cell_id in CELL_BITS, f"unknown native-eight cell {cell_id}") + topology, ms, static = CELL_BITS[cell_id] + return {"sequence": 1, "topology": topology, "ms": ms, "static": static} + + +def _balanced_capacities(parent_count: int) -> tuple[int, ...]: + _require(type(parent_count) is int and parent_count > 0, "parent count is invalid") + step_count = math.ceil(parent_count / NOMINAL_EFFECTIVE_BATCH) + base, larger = divmod(parent_count, step_count) + capacities = (base + 1,) * larger + (base,) * (step_count - larger) + _require(sum(capacities) == parent_count, "balanced capacities lost parents") + _require(max(capacities) <= NOMINAL_EFFECTIVE_BATCH, "balanced capacity exceeds 128") + _require(min(capacities) >= MICROBATCHES_PER_STEP, "capacity cannot form four micros") + _require(max(capacities) - min(capacities) <= 1, "balanced capacities differ by more than one") + return capacities + + +def micro_sizes(capacity: int) -> tuple[int, ...]: + _require(type(capacity) is int and capacity >= MICROBATCHES_PER_STEP, "step capacity is invalid") + base, larger = divmod(capacity, MICROBATCHES_PER_STEP) + sizes = (base + 1,) * larger + (base,) * (MICROBATCHES_PER_STEP - larger) + _require(sum(sizes) == capacity and min(sizes) > 0, "micro split lost a parent") + _require(max(sizes) <= 32, "microbatch exceeds 32") + return sizes + + +def _availability_bits(availability: Mapping[str, Any]) -> int: + _require(set(availability) == set(OBJECTIVES), "availability objective set changed") + _require(availability.get("sequence") is True, "sequence-ineligible parent entered the planner") + bits = 0 + for shift, objective in enumerate(reversed(OPTIONAL_OBJECTIVES)): + flag = availability[objective] + _require(type(flag) is bool, f"{objective} availability is not boolean") + bits |= int(flag) << shift + return bits + + +def availability_pattern_counts( + parent_rows: Sequence[Mapping[str, Any]], +) -> dict[str, int]: + """Read the exact optional-objective histogram without constructing an order.""" + + _require(isinstance(parent_rows, Sequence) and len(parent_rows) > 0, "parent roster is empty") + counts = {format(bits, "03b"): 0 for bits in range(8)} + for row in parent_rows: + bits = _availability_bits(row.get("availability", {})) + counts[format(bits, "03b")] += 1 + return counts + + +@dataclass(frozen=True, slots=True) +class FrozenEpochPlan: + schema: str + seed: int + epoch: int + parent_count: int + optimizer_step_count: int + capacities: tuple[int, ...] + step_offsets: tuple[int, ...] + ordered_parent_indices: tuple[int, ...] + ordered_parent_ids: tuple[str, ...] + ordered_availability_bits: bytes + eligibility_counts: Mapping[str, int] + global_factors: Mapping[str, float] + stratum_counts: Mapping[str, int] + stratum_step_min: Mapping[str, int] + stratum_step_max: Mapping[str, int] + plan_sha256: str + training_authorized: bool = False + scientific_launch_authorized: bool = False + + def step_parent_indices(self, step_index: int) -> tuple[int, ...]: + _require(type(step_index) is int and 0 <= step_index < self.optimizer_step_count, "step index is outside plan") + left, right = self.step_offsets[step_index : step_index + 2] + return self.ordered_parent_indices[left:right] + + def step_parent_ids(self, step_index: int) -> tuple[str, ...]: + _require(type(step_index) is int and 0 <= step_index < self.optimizer_step_count, "step index is outside plan") + left, right = self.step_offsets[step_index : step_index + 2] + return self.ordered_parent_ids[left:right] + + def step_availability_bits(self, step_index: int) -> bytes: + _require(type(step_index) is int and 0 <= step_index < self.optimizer_step_count, "step index is outside plan") + left, right = self.step_offsets[step_index : step_index + 2] + return self.ordered_availability_bits[left:right] + + def step_micro_slices(self, step_index: int) -> tuple[tuple[int, int], ...]: + capacity = self.capacities[step_index] + result: list[tuple[int, int]] = [] + cursor = 0 + for size in micro_sizes(capacity): + result.append((cursor, cursor + size)) + cursor += size + _require(cursor == capacity, "micro slices do not cover the step") + return tuple(result) + + +def _plan_identity_payload(plan: FrozenEpochPlan) -> dict[str, Any]: + return { + "schema": plan.schema, + "seed": plan.seed, + "epoch": plan.epoch, + "parent_count": plan.parent_count, + "optimizer_step_count": plan.optimizer_step_count, + "capacities": list(plan.capacities), + "step_offsets": list(plan.step_offsets), + "ordered_parent_indices": list(plan.ordered_parent_indices), + "ordered_parent_ids": list(plan.ordered_parent_ids), + "ordered_availability_bits_hex": plan.ordered_availability_bits.hex(), + "eligibility_counts": dict(plan.eligibility_counts), + "global_factors_hex": { + objective: float(value).hex() for objective, value in plan.global_factors.items() + }, + "stratum_counts": dict(plan.stratum_counts), + "stratum_step_min": dict(plan.stratum_step_min), + "stratum_step_max": dict(plan.stratum_step_max), + "training_authorized": False, + "scientific_launch_authorized": False, + } + + +def verify_plan_identity(plan: FrozenEpochPlan) -> None: + _require(plan.schema == SCHEMA, "plan schema changed") + _require(plan.seed == COMMON_SEED, "plan seed changed") + _require(plan.training_authorized is False and plan.scientific_launch_authorized is False, "plan self-authorizes") + _require(len(plan.ordered_parent_indices) == plan.parent_count, "plan index count changed") + _require(len(plan.ordered_parent_ids) == plan.parent_count, "plan ID count changed") + _require(len(plan.ordered_availability_bits) == plan.parent_count, "plan availability count changed") + _require(len(plan.capacities) == plan.optimizer_step_count, "plan capacity count changed") + _require(len(plan.step_offsets) == plan.optimizer_step_count + 1, "plan offset count changed") + _require(plan.step_offsets[0] == 0 and plan.step_offsets[-1] == plan.parent_count, "plan offsets are incomplete") + _require(all(right - left == capacity for left, right, capacity in zip(plan.step_offsets, plan.step_offsets[1:], plan.capacities)), "plan offsets/capacities differ") + _require(len(set(plan.ordered_parent_indices)) == plan.parent_count, "plan duplicates a parent index") + _require(len(set(plan.ordered_parent_ids)) == plan.parent_count, "plan duplicates a parent ID") + _require(set(plan.ordered_parent_indices) == set(range(plan.parent_count)), "plan index set is not exact one-pass") + _require(set(plan.eligibility_counts) == set(OBJECTIVES), "plan eligibility set changed") + _require(set(plan.global_factors) == set(OBJECTIVES), "plan global-factor set changed") + for objective in OBJECTIVES: + count = plan.eligibility_counts[objective] + factor = plan.global_factors[objective] + _require(type(count) is int and count > 0, f"{objective} eligibility count is invalid") + _require(math.isfinite(factor) and factor == plan.optimizer_step_count / count, f"{objective} global factor changed") + expected = canonical_sha256(_plan_identity_payload(plan), domain=SCHEMA) + _require(plan.plan_sha256 == expected, "plan identity SHA-256 changed") + + +def _build_balanced_epoch_plan( + parent_rows: Sequence[Mapping[str, Any]], + *, + epoch: int, + seed: int = COMMON_SEED, +) -> FrozenEpochPlan: + """Build a common one-pass plan with tightly balanced optional strata.""" + + _require(type(epoch) is int and epoch >= 0, "epoch is invalid") + _require(seed == COMMON_SEED, "native-eight seed must be exactly 43") + _require(isinstance(parent_rows, Sequence) and len(parent_rows) > 0, "parent roster is empty") + + # The seen set is the explicit O(N) duplicate-preflight repair. + seen: set[str] = set() + parent_ids: list[str] = [] + parent_bits: list[int] = [] + strata: dict[int, list[int]] = {bits: [] for bits in range(8)} + for index, row in enumerate(parent_rows): + parent_id = row.get("parent_id") + _require(type(parent_id) is str and bool(parent_id), "parent ID is blank") + _require(parent_id not in seen, "parent ID is duplicated") + seen.add(parent_id) + bits = _availability_bits(row.get("availability", {})) + parent_ids.append(parent_id) + parent_bits.append(bits) + strata[bits].append(index) + + parent_count = len(parent_ids) + capacities = _balanced_capacities(parent_count) + step_count = len(capacities) + steps: list[list[int]] = [[] for _ in capacities] + step_stratum_counts: dict[int, list[int]] = { + bits: [0] * step_count for bits in range(1, 8) + } + + # Optional strata are assigned first. Every stratum count differs by at + # most one across steps; a deterministic offset avoids aligning all extras. + for bits in range(1, 8): + ordered = strata[bits] + ordered.sort(key=lambda index: (_stable_key(SCHEMA, seed, epoch, "stratum", bits, parent_ids[index]), parent_ids[index])) + offset = int.from_bytes(_stable_key(SCHEMA, seed, epoch, "offset", bits)[:8], "big") % step_count + for ordinal, parent_index in enumerate(ordered): + step_index = (offset + ordinal) % step_count + steps[step_index].append(parent_index) + step_stratum_counts[bits][step_index] += 1 + + for step_index, (step, capacity) in enumerate(zip(steps, capacities)): + _require(len(step) <= capacity, f"optional strata overflow step {step_index}") + + sequence_only = strata[0] + sequence_only.sort(key=lambda index: (_stable_key(SCHEMA, seed, epoch, "sequence-only", parent_ids[index]), parent_ids[index])) + cursor = 0 + for step_index, capacity in enumerate(capacities): + needed = capacity - len(steps[step_index]) + steps[step_index].extend(sequence_only[cursor : cursor + needed]) + cursor += needed + _require(len(steps[step_index]) == capacity, f"sequence-only fill underflowed step {step_index}") + steps[step_index].sort(key=lambda index: (_stable_key(SCHEMA, seed, epoch, "inside-step", step_index, parent_ids[index]), parent_ids[index])) + _require(cursor == len(sequence_only), "sequence-only fill did not consume its exact roster") + + ordered_indices = tuple(index for step in steps for index in step) + _require(len(ordered_indices) == parent_count, "plan length changed") + _require(len(set(ordered_indices)) == parent_count, "plan is not exact one-pass") + _require(set(ordered_indices) == set(range(parent_count)), "plan omitted a parent") + ordered_ids = tuple(parent_ids[index] for index in ordered_indices) + ordered_bits = bytes(parent_bits[index] for index in ordered_indices) + + offsets = [0] + for capacity in capacities: + offsets.append(offsets[-1] + capacity) + + eligibility_counts = { + "sequence": parent_count, + "topology": sum(bool(bits & 0b100) for bits in parent_bits), + "ms": sum(bool(bits & 0b010) for bits in parent_bits), + "static": sum(bool(bits & 0b001) for bits in parent_bits), + } + _require(all(eligibility_counts[objective] > 0 for objective in OBJECTIVES), "planner lacks an objective roster") + global_factors = { + objective: step_count / eligibility_counts[objective] + for objective in OBJECTIVES + } + stratum_counts = {format(bits, "03b"): len(strata[bits]) for bits in range(8)} + stratum_min = { + format(bits, "03b"): min(step_stratum_counts[bits]) for bits in range(1, 8) + } + stratum_max = { + format(bits, "03b"): max(step_stratum_counts[bits]) for bits in range(1, 8) + } + for bits in range(1, 8): + label = format(bits, "03b") + _require(stratum_max[label] - stratum_min[label] <= 1, f"stratum {label} is not round-robin balanced") + + provisional = FrozenEpochPlan( + schema=SCHEMA, + seed=seed, + epoch=epoch, + parent_count=parent_count, + optimizer_step_count=step_count, + capacities=capacities, + step_offsets=tuple(offsets), + ordered_parent_indices=ordered_indices, + ordered_parent_ids=ordered_ids, + ordered_availability_bits=ordered_bits, + eligibility_counts=eligibility_counts, + global_factors=global_factors, + stratum_counts=stratum_counts, + stratum_step_min=stratum_min, + stratum_step_max=stratum_max, + plan_sha256="0" * 64, + ) + plan = FrozenEpochPlan( + **{ + field: getattr(provisional, field) + for field in provisional.__dataclass_fields__ + if field != "plan_sha256" + }, + plan_sha256=canonical_sha256(_plan_identity_payload(provisional), domain=SCHEMA), + ) + verify_plan_identity(plan) + return plan + + +def build_balanced_epoch_plan( + parent_rows: Sequence[Mapping[str, Any]], + *, + epoch: int, + seed: int = COMMON_SEED, +) -> FrozenEpochPlan: + """Build only the exact frozen seed-43 training-roster plan. + + The exact eight-pattern histogram is a scientific identity, not a tuning + hint. A different roster must fail before any epoch order is usable. + """ + + _require( + availability_pattern_counts(parent_rows) == FROZEN_TRAIN_PATTERN_COUNTS, + "train availability-pattern histogram changed", + ) + plan = _build_balanced_epoch_plan(parent_rows, epoch=epoch, seed=seed) + _require( + dict(plan.eligibility_counts) == FROZEN_TRAIN_ELIGIBILITY_COUNTS, + "train objective-eligibility counts changed", + ) + return plan + + +def build_test_fixture_epoch_plan( + parent_rows: Sequence[Mapping[str, Any]], + *, + epoch: int, + seed: int = COMMON_SEED, + isolated_test_fixture: bool, +) -> FrozenEpochPlan: + """Explicit nonproduction helper for small deterministic CPU fixtures.""" + + _require(isolated_test_fixture is True, "small-roster planner is test-fixture only") + return _build_balanced_epoch_plan(parent_rows, epoch=epoch, seed=seed) + + +def expected_step_parent_indices( + plan: FrozenEpochPlan, + *, + step_index: int, + objective: str, +) -> tuple[int, ...]: + verify_plan_identity(plan) + _require(objective in OBJECTIVES, "unknown objective") + indices = plan.step_parent_indices(step_index) + if objective == "sequence": + return indices + bit = {"topology": 0b100, "ms": 0b010, "static": 0b001}[objective] + bits = plan.step_availability_bits(step_index) + return tuple(index for index, flags in zip(indices, bits) if flags & bit) + + +T = TypeVar("T") + + +def exact_step_parent_sum( + plan: FrozenEpochPlan, + *, + step_index: int, + objective: str, + micro_parent_losses: Sequence[Sequence[tuple[int, T]]], +) -> tuple[T, int]: + """Sum each expected parent once, invariant to microbatch partitioning.""" + + expected = expected_step_parent_indices(plan, step_index=step_index, objective=objective) + expected_set = set(expected) + observed: set[int] = set() + total: Optional[T] = None + for micro in micro_parent_losses: + for parent_index, value in micro: + _require(type(parent_index) is int and parent_index in expected_set, f"{objective} loss parent is outside the step roster") + _require(parent_index not in observed, f"{objective} loss parent repeats") + observed.add(parent_index) + total = value if total is None else total + value # type: ignore[operator] + _require(observed == expected_set, f"{objective} step parent losses are incomplete") + _require(total is not None, f"{objective} step has no parent loss") + return total, len(observed) + + +def globally_normalized_step_loss( + plan: FrozenEpochPlan, + *, + step_index: int, + objective: str, + micro_parent_losses: Sequence[Sequence[tuple[int, T]]], +) -> tuple[T, int]: + parent_sum, count = exact_step_parent_sum( + plan, + step_index=step_index, + objective=objective, + micro_parent_losses=micro_parent_losses, + ) + return parent_sum * plan.global_factors[objective], count # type: ignore[operator] + + +def combine_cell_step_losses( + plan: FrozenEpochPlan, + *, + cell_id: str, + step_index: int, + objective_micro_parent_losses: Mapping[str, Optional[Sequence[Sequence[tuple[int, T]]]]], + null_scales: Mapping[str, float], +) -> tuple[T, dict[str, Optional[T]], dict[str, int]]: + """Apply exact 1/0 coefficients and the constant four-slot shell.""" + + coefficients = cell_coefficients(cell_id) + _require(set(objective_micro_parent_losses) == set(OBJECTIVES), "step loss objective set changed") + _require(set(null_scales) == set(OBJECTIVES), "null scale objective set changed") + normalized: dict[str, Optional[T]] = {} + counts: dict[str, int] = {} + total: Optional[T] = None + for objective in OBJECTIVES: + scale = null_scales[objective] + _require(type(scale) in (int, float) and math.isfinite(float(scale)) and float(scale) > 0, f"{objective} null scale is invalid") + micro_losses = objective_micro_parent_losses[objective] + if coefficients[objective]: + _require(micro_losses is not None, f"enabled {objective} objective is absent") + step_loss, count = globally_normalized_step_loss( + plan, + step_index=step_index, + objective=objective, + micro_parent_losses=micro_losses, + ) + value = step_loss / float(scale) # type: ignore[operator] + normalized[objective] = value + counts[objective] = count + total = value if total is None else total + value # type: ignore[operator] + else: + _require(micro_losses is None, f"disabled {objective} objective received loss or mask data") + normalized[objective] = None + counts[objective] = 0 + _require(total is not None, "cell step has no active loss") + return total / SHELL_DENOMINATOR, normalized, counts # type: ignore[operator] + + +def epoch_coefficient_proof(plan: FrozenEpochPlan) -> dict[str, dict[str, float | int | bool]]: + """Return the exact scalar coefficient proof for every objective.""" + + verify_plan_identity(plan) + result: dict[str, dict[str, float | int | bool]] = {} + for objective in OBJECTIVES: + count = plan.eligibility_counts[objective] + per_parent_step_coefficient = plan.global_factors[objective] + per_parent_epoch_average_coefficient = per_parent_step_coefficient / plan.optimizer_step_count + exact_epoch_coefficient = Fraction(plan.optimizer_step_count, count) / plan.optimizer_step_count + result[objective] = { + "eligible_parent_count": count, + "optimizer_step_count": plan.optimizer_step_count, + "step_sum_factor": per_parent_step_coefficient, + "epoch_average_per_parent_coefficient": per_parent_epoch_average_coefficient, + "expected_equal_parent_coefficient": 1.0 / count, + "exact_equal_parent": exact_epoch_coefficient == Fraction(1, count), + } + return result + + +def make_resume_cursor(plan: FrozenEpochPlan, *, next_optimizer_step: int) -> dict[str, Any]: + verify_plan_identity(plan) + _require(type(next_optimizer_step) is int and 0 <= next_optimizer_step <= plan.optimizer_step_count, "resume step is outside plan") + unsigned = { + "schema": CURSOR_SCHEMA, + "plan_sha256": plan.plan_sha256, + "seed": plan.seed, + "epoch": plan.epoch, + "next_optimizer_step": next_optimizer_step, + "next_microbatch": 0, + "training_authorized": False, + "scientific_launch_authorized": False, + } + return {**unsigned, "cursor_sha256": canonical_sha256(unsigned, domain=CURSOR_SCHEMA)} + + +def validate_resume_cursor(plan: FrozenEpochPlan, cursor: Mapping[str, Any]) -> None: + _require(set(cursor) == { + "schema", "plan_sha256", "seed", "epoch", "next_optimizer_step", + "next_microbatch", "training_authorized", "scientific_launch_authorized", + "cursor_sha256", + }, "resume cursor fields changed") + expected = make_resume_cursor(plan, next_optimizer_step=cursor.get("next_optimizer_step")) + _require(dict(cursor) == expected, "resume cursor does not match the exact plan boundary") + + +def contract_summary() -> dict[str, Any]: + return { + "schema": SCHEMA, + "status": "PREPARATION_ONLY_BALANCED_GLOBAL_NORMALIZATION_LAUNCH_CLOSED", + "cells": list(CELL_ORDER), + "common_seed": COMMON_SEED, + "nominal_effective_batch": NOMINAL_EFFECTIVE_BATCH, + "microbatches_per_step": MICROBATCHES_PER_STEP, + "sparse_objective_law": "S_over_N_o_times_sum_parent_losses_in_step", + "epoch_mean_identity": "mean_over_S_steps_equals_equal_parent_mean", + "optional_variance_control": "seven_exact_bit_pattern_strata_hash_ordered_round_robin", + "duplicate_check_complexity": "O(N)_seen_set", + "frozen_train_pattern_counts": dict(FROZEN_TRAIN_PATTERN_COUNTS), + "frozen_train_eligibility_counts": dict(FROZEN_TRAIN_ELIGIBILITY_COUNTS), + "shell_denominator": SHELL_DENOMINATOR, + "wa_or_adaptive_weighting_supported": False, + "downstream_or_affinose_in_scope": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "execution_certified": False, + } + + +__all__ = [ + "BalancedPlannerError", + "CELL_ORDER", + "COMMON_SEED", + "FROZEN_TRAIN_ELIGIBILITY_COUNTS", + "FROZEN_TRAIN_PATTERN_COUNTS", + "FrozenEpochPlan", + "OBJECTIVES", + "SHELL_DENOMINATOR", + "availability_pattern_counts", + "build_balanced_epoch_plan", + "build_test_fixture_epoch_plan", + "cell_coefficients", + "combine_cell_step_losses", + "contract_summary", + "epoch_coefficient_proof", + "exact_step_parent_sum", + "expected_step_parent_indices", + "globally_normalized_step_loss", + "make_resume_cursor", + "micro_sizes", + "validate_resume_cursor", + "verify_plan_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_composite_r4.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_composite_r4.py new file mode 100644 index 0000000000000000000000000000000000000000..ab0dabebcbc972dea0d6de9ea60280a18bd0cc82 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_composite_r4.py @@ -0,0 +1,1513 @@ +"""Isolated real four-modality A5 composite for the eight native cells. + +This module owns the model implementation instead of importing the stale shared +A5 stack. It consumes, but does not recreate, four independently certified +processing products: + +* corrected sequence BPE tokens plus residue, rooted-depth, and linkage arrays; +* exact undirected-BFS topology distances aligned to the sequence residue axis; +* raw-acquisition MS targets produced by 10-Da binning, per-bin maximum, + base-peak normalization, TOP30 retention, and LOW/MED/HIGH intensity tokens; +* GLYCAM state graphs encoded by the fitted EGNN and four-stage RVQ into four + ordered 1024-code slots per residue. + +The model preserves the submitted A5 encoder capacities, topology-before-fusion +and sequence-MLM-after-fusion connectivity. The acquisition and static-state +axes are explicit. Every objective returns one raw loss per eligible parent; +normalization and the fixed four-slot shell belong to the separately versioned +balanced planner. + +This source is preparation-only. It contains no AFFINose or downstream path +and cannot authorize training or submission. +""" + +from __future__ import annotations + +from dataclasses import dataclass +import math +from types import MappingProxyType +from typing import Any, Mapping, Optional, Sequence + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +SCHEMA = "bertose_a5_native_eight_real_composite_20260721_r4" +OBJECTIVES = ("sequence", "topology", "ms", "static") +CELL_ORDER = ("A000", "A100", "A010", "A001", "A110", "A101", "A011", "A111") +CELL_BITS = MappingProxyType( + { + "A000": (False, False, False), + "A100": (True, False, False), + "A010": (False, True, False), + "A001": (False, False, True), + "A110": (True, True, False), + "A101": (True, False, True), + "A011": (False, True, True), + "A111": (True, True, True), + } +) + +SEQUENCE_PAD_ID = 0 +SEQUENCE_START_ID = 2 +SEQUENCE_END_ID = 3 +SEQUENCE_MASK_ID = 4 +SEQUENCE_BRANCH_MARKER_ID = 5 +SEQUENCE_SPECIAL_IDS = frozenset(range(10)) +SEQUENCE_ALLOWED_INPUT_SPECIAL_IDS = frozenset({1, 2, 3, 4, 5}) +BRANCH_DEPTH_VOCAB_SIZE = 203 +BRANCH_DEPTH_UNKNOWN_ID = 202 +LINKAGE_VOCAB_SIZE = 10 +LINKAGE_UNKNOWN_ID = 9 + +MS_VOCAB_SIZE = 242 +MS_PAD_ID = 2 +MS_START_PREFIX = (0, 3, 5) +MS_END_ID = 1 +MS_MZ_MIN = 29 +MS_MZ_MAX = 241 +MS_INTENSITY_IDS = frozenset({26, 27, 28}) +MS_MAX_LENGTH = 64 + +STATIC_SLOT_COUNT = 4 +STATIC_CODES_PER_SLOT = 1024 +STATIC_GLOBAL_VOCAB_SIZE = 4096 +STATIC_MAX_RESIDUES = 48 +STATIC_VALID_TOKEN_CEILING = STATIC_MAX_RESIDUES * STATIC_SLOT_COUNT +STATIC_POSITION_CAPACITY = 200 + +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +EXECUTION_CERTIFIED = False +AFFINOSE_SUPPORTED = False +DOWNSTREAM_SUPPORTED = False +ADAPTIVE_OR_WA_SENSITIVITY_SUPPORTED = False + + +class CompositeError(RuntimeError): + """Fail-closed model or batch-contract error.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise CompositeError(message) + + +def _integer_tensor(value: object, name: str) -> torch.Tensor: + _require(isinstance(value, torch.Tensor), f"{name} must be a tensor") + _require( + value.dtype + in { + torch.int8, + torch.int16, + torch.int32, + torch.int64, + torch.uint8, + }, + f"{name} must use an integer dtype", + ) + return value + + +def _bool_tensor(value: object, name: str) -> torch.Tensor: + _require(isinstance(value, torch.Tensor) and value.dtype == torch.bool, f"{name} must be bool") + return value + + +def _same_device(reference: torch.Tensor, values: Mapping[str, Optional[torch.Tensor]]) -> None: + for name, value in values.items(): + if value is not None: + _require(value.device == reference.device, f"{name} is on another device") + + +def _contiguous_prefix(mask: torch.Tensor, name: str) -> None: + _require(mask.ndim >= 2, f"{name} must have a token axis") + flattened = mask.reshape(-1, mask.shape[-1]).to(torch.int8) + _require(not (flattened[:, 1:] > flattened[:, :-1]).any(), f"{name} is not a contiguous prefix") + + +def _group_mean( + values: torch.Tensor, + group_indices: torch.Tensor, + *, + group_count: int, +) -> tuple[torch.Tensor, torch.Tensor]: + """Differentiable equal-item mean within each observed group.""" + + _require(values.ndim == 1, "grouped values must be one-dimensional") + _integer_tensor(group_indices, "group indices") + _require(group_indices.ndim == 1 and group_indices.shape == values.shape, "group indices disagree") + _require(type(group_count) is int and group_count > 0, "group count is invalid") + _require(not group_indices.lt(0).any() and not group_indices.ge(group_count).any(), "group index outside range") + sums = values.new_zeros(group_count).index_add(0, group_indices.long(), values) + counts = values.new_zeros(group_count).index_add( + 0, + group_indices.long(), + torch.ones_like(values), + ) + observed = counts.gt(0) + return sums[observed] / counts[observed], observed.nonzero(as_tuple=False).squeeze(-1) + + +@dataclass(frozen=True, slots=True) +class NativeEightConfig: + cell_id: str + seq_vocab_size: int + seq_hidden_size: int = 768 + seq_num_layers: int = 12 + seq_num_heads: int = 12 + seq_max_length: int = 256 + cnn_kernel_size: int = 3 + branch_depth_vocab_size: int = BRANCH_DEPTH_VOCAB_SIZE + linkage_vocab_size: int = LINKAGE_VOCAB_SIZE + + ms_vocab_size: int = MS_VOCAB_SIZE + ms_hidden_size: int = 384 + ms_num_layers: int = 6 + ms_num_heads: int = 6 + ms_max_length: int = MS_MAX_LENGTH + + static_vocab_size: int = STATIC_GLOBAL_VOCAB_SIZE + static_hidden_size: int = 512 + static_num_layers: int = 8 + static_num_heads: int = 8 + static_max_length: int = STATIC_POSITION_CAPACITY + static_valid_token_ceiling: int = STATIC_VALID_TOKEN_CEILING + + cross_attention_heads: int = 8 + fusion_hidden_size: int = 768 + fusion_num_layers: int = 2 + topology_projection_size: int = 128 + hidden_dropout_prob: float = 0.1 + attention_dropout_prob: float = 0.1 + layer_norm_eps: float = 1e-12 + initializer_range: float = 0.02 + isolated_test_fixture: bool = False + training_authorized: bool = False + scientific_launch_authorized: bool = False + + def validate(self) -> None: + _require(self.cell_id in CELL_BITS, "unknown native-eight cell") + integer_fields = ( + "seq_vocab_size", + "seq_hidden_size", + "seq_num_layers", + "seq_num_heads", + "seq_max_length", + "cnn_kernel_size", + "branch_depth_vocab_size", + "linkage_vocab_size", + "ms_vocab_size", + "ms_hidden_size", + "ms_num_layers", + "ms_num_heads", + "ms_max_length", + "static_vocab_size", + "static_hidden_size", + "static_num_layers", + "static_num_heads", + "static_max_length", + "static_valid_token_ceiling", + "cross_attention_heads", + "fusion_hidden_size", + "fusion_num_layers", + "topology_projection_size", + ) + for name in integer_fields: + value = getattr(self, name) + _require(type(value) is int and value > 0, f"{name} must be a positive exact integer") + _require(self.seq_hidden_size % self.seq_num_heads == 0, "sequence hidden/head mismatch") + _require(self.seq_hidden_size % 3 == 0, "sequence hidden size must support three CNN scales") + _require(self.ms_hidden_size % self.ms_num_heads == 0, "MS hidden/head mismatch") + _require(self.static_hidden_size % self.static_num_heads == 0, "static hidden/head mismatch") + _require(self.seq_hidden_size % self.cross_attention_heads == 0, "cross-attention hidden/head mismatch") + _require(self.cnn_kernel_size % 2 == 1, "CNN base kernel must be odd") + _require(self.branch_depth_vocab_size == 203, "branch table must include exact unknown ID 202") + _require(self.linkage_vocab_size == 10, "linkage table must include exact unknown ID 9") + _require(self.seq_max_length == 256, "sequence position capacity must remain 256") + _require(self.ms_vocab_size == 242 and self.ms_max_length == 64, "MS vocabulary/length must remain 242/64") + _require(self.static_vocab_size == 4096, "static global vocabulary must remain 4096") + _require( + self.static_max_length == 200 and self.static_valid_token_ceiling == 192, + "static envelope must remain 48*4=192 valid positions within capacity 200", + ) + _require(self.fusion_hidden_size == self.seq_hidden_size, "fusion output must match sequence hidden size") + _require(self.fusion_num_layers == 2, "fusion must remain the submitted two-linear MLP") + for name in ("hidden_dropout_prob", "attention_dropout_prob"): + value = getattr(self, name) + _require(type(value) is float and 0 <= value < 1, f"{name} must be a float in [0,1)") + _require(type(self.layer_norm_eps) is float and self.layer_norm_eps > 0, "layer-norm epsilon invalid") + _require(type(self.initializer_range) is float and self.initializer_range > 0, "initializer range invalid") + _require(self.training_authorized is False and self.scientific_launch_authorized is False, "config self-authorizes") + if not self.isolated_test_fixture: + expected = { + "seq_hidden_size": 768, + "seq_num_layers": 12, + "seq_num_heads": 12, + "ms_hidden_size": 384, + "ms_num_layers": 6, + "ms_num_heads": 6, + "static_hidden_size": 512, + "static_num_layers": 8, + "static_num_heads": 8, + "cross_attention_heads": 8, + "fusion_hidden_size": 768, + "topology_projection_size": 128, + } + for name, value in expected.items(): + _require(getattr(self, name) == value, f"production {name} changed") + + @property + def enabled(self) -> Mapping[str, bool]: + topology, ms, static = CELL_BITS[self.cell_id] + return MappingProxyType( + {"sequence": True, "topology": topology, "ms": ms, "static": static} + ) + + +class SelfAttention(nn.Module): + def __init__(self, hidden_size: int, heads: int, dropout: float) -> None: + super().__init__() + self.heads = heads + self.head_size = hidden_size // heads + self.query = nn.Linear(hidden_size, hidden_size) + self.key = nn.Linear(hidden_size, hidden_size) + self.value = nn.Linear(hidden_size, hidden_size) + self.dropout = nn.Dropout(dropout) + + def _split(self, value: torch.Tensor) -> torch.Tensor: + batch, length, _ = value.shape + return value.view(batch, length, self.heads, self.head_size).permute(0, 2, 1, 3) + + def forward(self, hidden: torch.Tensor, attention_mask: torch.Tensor) -> torch.Tensor: + query = self._split(self.query(hidden)) + key = self._split(self.key(hidden)) + value = self._split(self.value(hidden)) + scores = torch.matmul(query, key.transpose(-1, -2)) / math.sqrt(self.head_size) + scores = scores.masked_fill(~attention_mask[:, None, None, :], -10_000.0) + probabilities = self.dropout(torch.softmax(scores, dim=-1)) + context = torch.matmul(probabilities, value).permute(0, 2, 1, 3).contiguous() + return context.view(hidden.shape) + + +class EncoderLayer(nn.Module): + def __init__( + self, + hidden_size: int, + heads: int, + hidden_dropout: float, + attention_dropout: float, + layer_norm_eps: float, + ) -> None: + super().__init__() + self.attention = SelfAttention(hidden_size, heads, attention_dropout) + self.attention_output = nn.Linear(hidden_size, hidden_size) + self.attention_norm = nn.LayerNorm(hidden_size, eps=layer_norm_eps) + self.intermediate = nn.Linear(hidden_size, hidden_size * 4) + self.output = nn.Linear(hidden_size * 4, hidden_size) + self.output_norm = nn.LayerNorm(hidden_size, eps=layer_norm_eps) + self.dropout = nn.Dropout(hidden_dropout) + + def forward(self, hidden: torch.Tensor, attention_mask: torch.Tensor) -> torch.Tensor: + attended = self.dropout(self.attention_output(self.attention(hidden, attention_mask))) + hidden = self.attention_norm(hidden + attended) + feed_forward = self.dropout(self.output(F.gelu(self.intermediate(hidden)))) + return self.output_norm(hidden + feed_forward) + + +def _run_layers( + hidden: torch.Tensor, + attention_mask: torch.Tensor, + layers: nn.ModuleList, +) -> torch.Tensor: + for layer in layers: + hidden = layer(hidden, attention_mask) + return hidden + + +class ExactSequenceEmbeddings(nn.Module): + """BPE/tree/linkage embeddings with no clamp path.""" + + def __init__(self, config: NativeEightConfig) -> None: + super().__init__() + self.token_embeddings = nn.Embedding(config.seq_vocab_size, config.seq_hidden_size, padding_idx=0) + self.position_embeddings = nn.Embedding(config.seq_max_length, config.seq_hidden_size) + self.branch_embeddings = nn.Embedding(203, config.seq_hidden_size) + self.linkage_embeddings = nn.Embedding(10, config.seq_hidden_size) + channels = config.seq_hidden_size // 3 + self.convolutions = nn.ModuleList( + [ + nn.Conv1d( + config.seq_hidden_size, + channels, + kernel_size=config.cnn_kernel_size + 2 * offset, + padding=(config.cnn_kernel_size + 2 * offset) // 2, + ) + for offset in range(3) + ] + ) + self.convolution_projection = nn.Linear(channels * 3, config.seq_hidden_size) + self.input_norm = nn.LayerNorm(config.seq_hidden_size, eps=config.layer_norm_eps) + self.output_norm = nn.LayerNorm(config.seq_hidden_size, eps=config.layer_norm_eps) + self.dropout = nn.Dropout(config.hidden_dropout_prob) + self.register_buffer("position_ids", torch.arange(config.seq_max_length).view(1, -1)) + + def forward( + self, + token_ids: torch.Tensor, + branch_depths: torch.Tensor, + linkage_types: torch.Tensor, + ) -> torch.Tensor: + _require(not branch_depths.lt(0).any() and not branch_depths.ge(203).any(), "branch depth outside exact 0-202 domain") + _require(not linkage_types.lt(0).any() and not linkage_types.ge(10).any(), "linkage ID outside exact 0-9 domain") + length = token_ids.shape[1] + _require(length <= self.position_embeddings.num_embeddings, "sequence exceeds position capacity") + hidden = ( + self.token_embeddings(token_ids) + + self.position_embeddings(self.position_ids[:, :length]) + + self.branch_embeddings(branch_depths) + + self.linkage_embeddings(linkage_types) + ) + hidden = self.input_norm(hidden) + convolution_input = hidden.transpose(1, 2) + convolution_hidden = torch.cat( + [F.gelu(layer(convolution_input)) for layer in self.convolutions], dim=1 + ).transpose(1, 2) + return self.output_norm(hidden + self.dropout(self.convolution_projection(convolution_hidden))) + + +class MaskAwareDiscreteEmbeddings(nn.Module): + def __init__( + self, + *, + vocab_size: int, + hidden_size: int, + max_length: int, + dropout: float, + layer_norm_eps: float, + ) -> None: + super().__init__() + self.code_embeddings = nn.Embedding(vocab_size, hidden_size) + self.position_embeddings = nn.Embedding(max_length, hidden_size) + self.mask_embedding = nn.Parameter(torch.empty(hidden_size)) + self.norm = nn.LayerNorm(hidden_size, eps=layer_norm_eps) + self.dropout = nn.Dropout(dropout) + self.register_buffer("position_ids", torch.arange(max_length).view(1, -1)) + + def forward( + self, + token_ids: torch.Tensor, + input_mask: torch.Tensor, + ) -> torch.Tensor: + length = token_ids.shape[1] + _require(length <= self.position_embeddings.num_embeddings, "discrete input exceeds position capacity") + code = self.code_embeddings(token_ids) + code = torch.where(input_mask.unsqueeze(-1), self.mask_embedding.view(1, 1, -1), code) + hidden = code + self.position_embeddings(self.position_ids[:, :length]) + return self.dropout(self.norm(hidden)) + + +class StaticEmbeddings(nn.Module): + def __init__(self, config: NativeEightConfig) -> None: + super().__init__() + self.code_embeddings = nn.Embedding(4096, config.static_hidden_size) + self.slot_embeddings = nn.Embedding(4, config.static_hidden_size) + self.position_embeddings = nn.Embedding(200, config.static_hidden_size) + self.mask_embedding = nn.Parameter(torch.empty(config.static_hidden_size)) + self.norm = nn.LayerNorm(config.static_hidden_size, eps=config.layer_norm_eps) + self.dropout = nn.Dropout(config.hidden_dropout_prob) + self.register_buffer("position_ids", torch.arange(200).view(1, -1)) + + def forward( + self, + global_ids: torch.Tensor, + slot_ids: torch.Tensor, + input_mask: torch.Tensor, + ) -> torch.Tensor: + length = global_ids.shape[1] + _require(length <= 200, "static input exceeds position capacity") + code = self.code_embeddings(global_ids) + code = torch.where(input_mask.unsqueeze(-1), self.mask_embedding.view(1, 1, -1), code) + safe_slots = torch.where(slot_ids.ge(0), slot_ids, torch.zeros_like(slot_ids)) + slot = self.slot_embeddings(safe_slots) + slot = torch.where(slot_ids.ge(0).unsqueeze(-1), slot, torch.zeros_like(slot)) + hidden = code + slot + self.position_embeddings(self.position_ids[:, :length]) + return self.dropout(self.norm(hidden)) + + +class SlotConditionedHead(nn.Module): + def __init__(self, hidden_size: int) -> None: + super().__init__() + self.heads = nn.ModuleList([nn.Linear(hidden_size, 1024) for _ in range(4)]) + + def forward( + self, + hidden: torch.Tensor, + slot_ids: torch.Tensor, + attention_mask: torch.Tensor, + ) -> torch.Tensor: + logits = hidden.new_zeros(*hidden.shape[:2], 1024) + for slot_id, head in enumerate(self.heads): + selected = attention_mask & slot_ids.eq(slot_id) + if selected.any(): + logits[selected] = head(hidden[selected]) + return logits + + +class ResidueCrossAttention(nn.Module): + def __init__(self, config: NativeEightConfig) -> None: + super().__init__() + self.heads = config.cross_attention_heads + self.head_size = config.seq_hidden_size // config.cross_attention_heads + self.query = nn.Linear(config.seq_hidden_size, config.seq_hidden_size) + self.key = nn.Linear(config.static_hidden_size, config.seq_hidden_size) + self.value = nn.Linear(config.static_hidden_size, config.seq_hidden_size) + self.output = nn.Linear(config.seq_hidden_size, config.seq_hidden_size) + self.norm = nn.LayerNorm(config.seq_hidden_size, eps=config.layer_norm_eps) + self.dropout = nn.Dropout(config.hidden_dropout_prob) + + def _split(self, value: torch.Tensor) -> torch.Tensor: + batch, length, _ = value.shape + return value.view(batch, length, self.heads, self.head_size).permute(0, 2, 1, 3) + + def forward( + self, + sequence_hidden: torch.Tensor, + static_hidden: torch.Tensor, + sequence_residue_ids: torch.Tensor, + static_residue_ids: torch.Tensor, + sequence_attention: torch.Tensor, + static_attention: torch.Tensor, + ) -> torch.Tensor: + allowed = static_sequence_alignment_mask( + sequence_residue_ids=sequence_residue_ids, + static_residue_ids=static_residue_ids, + sequence_attention=sequence_attention, + static_attention=static_attention, + ) + query = self._split(self.query(sequence_hidden)) + key = self._split(self.key(static_hidden)) + value = self._split(self.value(static_hidden)) + scores = torch.matmul(query, key.transpose(-1, -2)) / math.sqrt(self.head_size) + scores = scores.masked_fill(~allowed.unsqueeze(1), -10_000.0) + probabilities = torch.softmax(scores, dim=-1) * allowed.unsqueeze(1).to(scores.dtype) + probabilities = probabilities / probabilities.sum(dim=-1, keepdim=True).clamp_min(1e-12) + context = torch.matmul(probabilities, value).permute(0, 2, 1, 3).contiguous() + context = context.view(sequence_hidden.shape) + return self.norm(sequence_hidden + self.dropout(self.output(context))) + + +def static_sequence_alignment_mask( + *, + sequence_residue_ids: torch.Tensor, + static_residue_ids: torch.Tensor, + sequence_attention: torch.Tensor, + static_attention: torch.Tensor, +) -> torch.Tensor: + """Frozen A5 rule: start is global, residue pieces exact, others bypass.""" + + _require(sequence_residue_ids.ndim == 2 and static_residue_ids.ndim == 2, "cross-attention residue arrays must be batched") + _require(sequence_attention.shape == sequence_residue_ids.shape, "sequence cross-attention mask changed") + _require(static_attention.shape == static_residue_ids.shape, "static cross-attention mask changed") + exact_residue = ( + sequence_residue_ids.unsqueeze(2).eq(static_residue_ids.unsqueeze(1)) + & sequence_residue_ids.unsqueeze(2).ge(0) + ) + start_query = torch.zeros_like(sequence_attention) + start_query[:, 0] = sequence_attention[:, 0] + global_start = start_query.unsqueeze(2) & static_attention.unsqueeze(1) + return ( + (exact_residue | global_start) + & sequence_attention.unsqueeze(2) + & static_attention.unsqueeze(1) + ) + + +def validate_sequence_surface( + config: NativeEightConfig, + *, + token_ids: torch.Tensor, + attention_mask: torch.Tensor, + residue_ids: torch.Tensor, + branch_depths: torch.Tensor, + linkage_types: torch.Tensor, + labels: Optional[torch.Tensor], +) -> torch.Tensor: + _integer_tensor(token_ids, "sequence token IDs") + _integer_tensor(residue_ids, "sequence residue IDs") + _integer_tensor(branch_depths, "sequence branch depths") + _integer_tensor(linkage_types, "sequence linkage types") + attention = _bool_tensor(attention_mask, "sequence attention mask") + _require( + token_ids.shape + == attention.shape + == residue_ids.shape + == branch_depths.shape + == linkage_types.shape, + "sequence arrays are absent, stale, or misaligned", + ) + _require(token_ids.ndim == 2 and token_ids.shape[0] > 0, "sequence arrays must be [parent,token]") + _require(token_ids.shape[1] <= 256, "sequence row exceeded the certified objective envelope") + _require(not token_ids.lt(0).any() and not token_ids.ge(config.seq_vocab_size).any(), "sequence token outside fitted BPE vocabulary") + _require(not branch_depths.lt(0).any() and not branch_depths.ge(203).any(), "sequence branch depth outside 0-202") + _require(not linkage_types.lt(0).any() and not linkage_types.ge(10).any(), "sequence linkage ID outside 0-9") + _contiguous_prefix(attention, "sequence attention") + lengths = attention.sum(dim=1) + _require(not lengths.lt(2).any(), "sequence requires start/end tokens") + _require(token_ids[:, 0].eq(2).all(), "sequence start token changed") + last = token_ids.gather(1, lengths.sub(1).unsqueeze(1)).squeeze(1) + _require(last.eq(3).all(), "sequence end token changed") + positions = torch.arange(token_ids.shape[1], device=token_ids.device).view(1, -1) + _require(not (attention & positions.ne(0) & token_ids.eq(2)).any(), "sequence start token repeats") + _require( + not (attention & positions.ne(lengths.sub(1).unsqueeze(1)) & token_ids.eq(3)).any(), + "sequence end token occurs early", + ) + _require(not (attention & token_ids.eq(0)).any(), "attended sequence token is padding") + _require(not ((~attention) & token_ids.ne(0)).any(), "sequence padding token changed") + _require(not ((~attention) & residue_ids.ne(-1)).any(), "sequence padding residue sentinel changed") + _require( + not ((~attention) & (branch_depths.ne(0) | linkage_types.ne(0))).any(), + "sequence padded auxiliary channels are nonzero", + ) + _require(not residue_ids.lt(-2).any(), "sequence residue sentinel is below -2") + forbidden_special = torch.zeros_like(attention) + for token_id in SEQUENCE_SPECIAL_IDS - SEQUENCE_ALLOWED_INPUT_SPECIAL_IDS: + forbidden_special |= token_ids.eq(token_id) + _require(not (attention & forbidden_special).any(), "inactive sequence special token is present") + known_special = token_ids.eq(2) | token_ids.eq(3) | token_ids.eq(5) + _require( + torch.equal(attention & residue_ids.eq(-1), attention & known_special), + "sequence special-token residue identity changed", + ) + linkage_positions = attention & residue_ids.eq(-2) + _require( + torch.equal(linkage_positions, attention & linkage_types.ne(0)), + "sequence linkage channel no longer identifies exactly the linkage pieces", + ) + _require( + not (attention & residue_ids.lt(0) & branch_depths.ne(0)).any(), + "non-residue sequence position carries a branch depth", + ) + for parent in range(token_ids.shape[0]): + represented = torch.unique( + residue_ids[parent][attention[parent] & residue_ids[parent].ge(0)], + sorted=True, + ) + _require(represented.numel() > 0, "sequence parent has no residue-bearing BPE piece") + expected = torch.arange(represented.numel(), device=represented.device, dtype=represented.dtype) + _require(torch.equal(represented, expected), "sequence residue domain is not contiguous zero-based") + if labels is not None: + _integer_tensor(labels, "sequence labels") + _require(labels.shape == token_ids.shape, "sequence labels are misaligned") + selected = labels.ne(-100) + _require(not (selected & ~attention).any(), "sequence padding carries an MLM target") + _require(not (selected & residue_ids.eq(-1)).any(), "sequence special token carries an MLM target") + _require( + not (selected & (labels.lt(0) | labels.ge(config.seq_vocab_size))).any(), + "sequence MLM target outside fitted vocabulary", + ) + special_target = torch.zeros_like(selected) + for token_id in SEQUENCE_SPECIAL_IDS: + special_target |= labels.eq(token_id) + _require(not (selected & special_target).any(), "sequence MLM target is a reserved special ID") + _require(selected.any(dim=1).all(), "sequence-eligible parent lacks an MLM target") + _same_device( + token_ids, + { + "sequence attention": attention, + "sequence residues": residue_ids, + "sequence branches": branch_depths, + "sequence linkages": linkage_types, + "sequence labels": labels, + }, + ) + return attention + + +def validate_topology_surface( + *, + labels: torch.Tensor, + available: torch.Tensor, + sequence_residue_ids: torch.Tensor, + sequence_attention: torch.Tensor, +) -> None: + _integer_tensor(labels, "topology distances") + availability = _bool_tensor(available, "topology availability") + batch = sequence_residue_ids.shape[0] + _require(labels.ndim == 3 and labels.shape[0] == batch and labels.shape[1] == labels.shape[2], "topology distances must be batched square") + _require(availability.shape == (batch,), "topology availability must be one flag per parent") + for parent in range(batch): + represented = torch.unique( + sequence_residue_ids[parent][sequence_attention[parent] & sequence_residue_ids[parent].ge(0)], + sorted=True, + ) + residue_count = represented.numel() + active = labels[parent, :residue_count, :residue_count] + outside = labels[parent].clone() + outside[:residue_count, :residue_count] = -1 + _require(outside.eq(-1).all(), "topology padding outside the residue square changed") + if availability[parent]: + _require(residue_count >= 2, "topology parent has fewer than two residues") + _require(not active.lt(0).any(), "topology active square contains padding") + _require(torch.equal(active, active.transpose(0, 1)), "topology distance matrix is not symmetric") + _require(torch.diagonal(active).eq(0).all(), "topology distance diagonal is not zero") + off_diagonal = ~torch.eye(residue_count, dtype=torch.bool, device=labels.device) + _require(active[off_diagonal].gt(0).all(), "topology distinct-residue distance is not positive") + # This explicit adversarial guard catches the smallest stale/non-BFS + # surface; the exact all-parent BFS proof remains bound upstream. + if residue_count == 2: + _require(active[0, 1].item() == 1, "two-residue connected glycan must have BFS distance one") + else: + _require(labels[parent].eq(-1).all(), "topology-ineligible parent carries distances") + + +def topology_parent_losses_inverse_bpe( + token_pair_predictions: torch.Tensor, + *, + sequence_residue_ids: torch.Tensor, + sequence_attention: torch.Tensor, + topology_labels: torch.Tensor, + topology_available: torch.Tensor, +) -> tuple[torch.Tensor, torch.Tensor]: + """Frozen MSE: retain token-replica errors with inverse pair multiplicity.""" + + validate_topology_surface( + labels=topology_labels, + available=topology_available, + sequence_residue_ids=sequence_residue_ids, + sequence_attention=sequence_attention, + ) + _require( + token_pair_predictions.ndim == 3 + and token_pair_predictions.shape[0] == sequence_residue_ids.shape[0] + and token_pair_predictions.shape[1:] == sequence_residue_ids.shape[1:] * 2, + "topology token-pair predictions are misaligned", + ) + parent_losses: list[torch.Tensor] = [] + parent_indices: list[int] = [] + for parent in topology_available.nonzero(as_tuple=False).squeeze(-1).tolist(): + residues = sequence_residue_ids[parent] + active_positions = sequence_attention[parent] & residues.ge(0) + residue_count = int(torch.unique(residues[active_positions]).numel()) + represented = residues[active_positions] + multiplicity = torch.bincount(represented, minlength=residue_count) + _require(multiplicity.shape[0] == residue_count and multiplicity.gt(0).all(), "topology residue lacks a BPE representative") + safe = residues.clamp_min(0).clamp_max(residue_count - 1) + left = safe.unsqueeze(1) + right = safe.unsqueeze(0) + valid = ( + active_positions.unsqueeze(1) + & active_positions.unsqueeze(0) + & left.ne(right) + ) + denominator = ( + 2.0 + * multiplicity.index_select(0, safe).to(torch.float64).unsqueeze(1) + * multiplicity.index_select(0, safe).to(torch.float64).unsqueeze(0) + ) + weights = torch.where(valid, denominator.reciprocal(), torch.zeros_like(denominator)) + weights = weights.to(device=token_pair_predictions.device, dtype=token_pair_predictions.dtype) + targets = topology_labels[parent, :residue_count, :residue_count][ + left, + right, + ].to(device=token_pair_predictions.device, dtype=token_pair_predictions.dtype) + pair_mass = weights.sum() + expected_pair_mass = residue_count * (residue_count - 1) / 2 + _require( + math.isclose(float(pair_mass.detach().cpu()), expected_pair_mass, rel_tol=1e-6, abs_tol=1e-6), + "topology inverse-multiplicity mass changed", + ) + squared = (token_pair_predictions[parent] - targets).square() + parent_losses.append((squared * weights).sum() / pair_mass) + parent_indices.append(parent) + _require(bool(parent_losses), "topology step has no eligible parent") + return torch.stack(parent_losses), torch.tensor(parent_indices, dtype=torch.long, device=token_pair_predictions.device) + + +def validate_ms_surface( + *, + batch_size: int, + token_ids: torch.Tensor, + attention_mask: torch.Tensor, + input_mask: torch.Tensor, + labels: Optional[torch.Tensor], + acquisition_parent_indices: torch.Tensor, + parent_available: torch.Tensor, + mode: str, +) -> torch.Tensor: + _integer_tensor(token_ids, "MS token IDs") + attention = _bool_tensor(attention_mask, "MS attention") + masked = _bool_tensor(input_mask, "MS input mask") + _integer_tensor(acquisition_parent_indices, "MS acquisition parent indices") + available = _bool_tensor(parent_available, "MS parent availability") + _require(mode in {"train", "development"}, "MS mode must be train or development") + _require(token_ids.ndim == 2 and 0 < token_ids.shape[1] <= 64, "MS acquisitions must be nonempty [acquisition,<=64]") + _require(token_ids.shape == attention.shape == masked.shape, "MS token/attention/mask arrays are misaligned") + _require(acquisition_parent_indices.shape == (token_ids.shape[0],), "MS acquisition-parent axis is misaligned") + _require(available.shape == (batch_size,), "MS availability must be one flag per parent") + _require(not acquisition_parent_indices.lt(0).any() and not acquisition_parent_indices.ge(batch_size).any(), "MS acquisition parent index outside batch") + _require(not token_ids.lt(0).any() and not token_ids.ge(242).any(), "MS token outside 0-241") + _contiguous_prefix(attention, "MS attention") + lengths = attention.sum(dim=1) + _require(not lengths.lt(6).any(), "MS acquisition is shorter than one peak envelope") + _require(token_ids[:, :3].eq(torch.tensor(MS_START_PREFIX, device=token_ids.device)).all(), "MS no-RT prefix changed") + _require(token_ids.gather(1, lengths.sub(1).unsqueeze(1)).squeeze(1).eq(1).all(), "MS end token changed") + _require(not ((~attention) & token_ids.ne(2)).any(), "MS padding token changed") + _require(not (masked & ~attention).any(), "MS padding is input-masked") + for acquisition in range(token_ids.shape[0]): + length = int(lengths[acquisition].item()) + body = token_ids[acquisition, 3 : length - 1] + _require(body.numel() > 0 and body.numel() % 2 == 0, "MS peak-pair body changed") + mz = body[0::2] + intensity = body[1::2] + _require((mz.ge(29) & mz.le(241)).all(), "MS m/z token outside TOP30 10-Da vocabulary") + _require(torch.isin(intensity, torch.tensor((26, 27, 28), device=intensity.device)).all(), "MS intensity is not LOW/MED/HIGH") + _require(torch.unique(mz).numel() == mz.numel(), "MS acquisition repeats an m/z bin") + counts = torch.bincount(acquisition_parent_indices.long(), minlength=batch_size) + _require(torch.equal(counts.gt(0), available), "MS acquisitions disagree with parent availability") + if mode == "train": + _require(not counts.gt(1).any(), "training must select exactly one deterministic acquisition per available parent") + if labels is not None: + _integer_tensor(labels, "MS labels") + _require(labels.shape == token_ids.shape, "MS labels are misaligned") + selected = labels.ne(-100) + _require(not (selected & ~attention).any(), "MS padding carries a target") + _require(not (masked & ~selected).any(), "MS input mask is outside selected targets") + for acquisition in range(token_ids.shape[0]): + length = int(lengths[acquisition].item()) + selected_body = selected[acquisition, 3 : length - 1].reshape(-1, 2) + _require( + ((selected_body.sum(dim=1) == 0) | (selected_body.sum(dim=1) == 2)).all(), + "MS masking split an m/z-intensity physical pair", + ) + _require(selected_body.any(), "MS acquisition has no selected peak pair") + mz_labels = labels[acquisition, 3 : length - 1 : 2] + intensity_labels = labels[acquisition, 4 : length - 1 : 2] + _require( + ((mz_labels.eq(-100)) | (mz_labels.ge(29) & mz_labels.le(241))).all(), + "MS m/z target outside family", + ) + _require( + ((intensity_labels.eq(-100)) | torch.isin(intensity_labels, torch.tensor((26, 27, 28), device=labels.device))).all(), + "MS intensity target outside LOW/MED/HIGH family", + ) + return attention + + +def ms_parent_losses( + logits: torch.Tensor, + *, + labels: torch.Tensor, + attention_mask: torch.Tensor, + acquisition_parent_indices: torch.Tensor, + batch_size: int, +) -> tuple[torch.Tensor, torch.Tensor]: + """Family-equal acquisition loss, then equal-acquisition parent loss.""" + + token_losses = F.cross_entropy( + logits.reshape(-1, logits.shape[-1]), + labels.reshape(-1), + ignore_index=-100, + reduction="none", + ).reshape(labels.shape) + lengths = attention_mask.sum(dim=1) + acquisition_losses: list[torch.Tensor] = [] + for acquisition in range(labels.shape[0]): + length = int(lengths[acquisition].item()) + mz_selected = labels[acquisition, 3 : length - 1 : 2].ne(-100) + intensity_selected = labels[acquisition, 4 : length - 1 : 2].ne(-100) + _require(mz_selected.any() and intensity_selected.any(), "MS family-equal loss lacks a selected family") + mz_loss = token_losses[acquisition, 3 : length - 1 : 2][mz_selected].mean() + intensity_loss = token_losses[acquisition, 4 : length - 1 : 2][intensity_selected].mean() + acquisition_losses.append((mz_loss + intensity_loss) / 2) + return _group_mean( + torch.stack(acquisition_losses), + acquisition_parent_indices.long(), + group_count=batch_size, + ) + + +def validate_static_surface( + *, + batch_size: int, + token_ids: torch.Tensor, + attention_mask: torch.Tensor, + residue_ids: torch.Tensor, + slot_ids: torch.Tensor, + state_mask: torch.Tensor, + state_ids: torch.Tensor, + input_mask: torch.Tensor, + labels: Optional[torch.Tensor], + parent_available: torch.Tensor, + sequence_residue_ids: torch.Tensor, + sequence_attention: torch.Tensor, +) -> torch.Tensor: + _integer_tensor(token_ids, "static global IDs") + attention = _bool_tensor(attention_mask, "static attention") + _integer_tensor(residue_ids, "static residue IDs") + _integer_tensor(slot_ids, "static slot IDs") + states = _bool_tensor(state_mask, "static state mask") + _integer_tensor(state_ids, "static state IDs") + masked = _bool_tensor(input_mask, "static input mask") + available = _bool_tensor(parent_available, "static parent availability") + _require(token_ids.ndim == 3 and token_ids.shape[0] == batch_size, "static codes must be [parent,state,token]") + _require( + token_ids.shape == attention.shape == residue_ids.shape == slot_ids.shape == masked.shape, + "static code/attention/residue/slot/mask arrays are misaligned", + ) + _require(state_ids.shape == states.shape == token_ids.shape[:2], "static state axis is misaligned") + _require(available.shape == (batch_size,), "static availability must be one flag per parent") + _require(token_ids.shape[-1] <= 200 and token_ids.shape[-1] % 4 == 0, "static width must preserve four slots within capacity 200") + _contiguous_prefix(attention, "static attention") + lengths = attention.sum(dim=-1) + _require(not lengths.gt(192).any(), "static valid positions exceed max48*4=192; truncation is forbidden") + _require((lengths % 4).eq(0).all(), "static state length split a four-code residue tuple") + _require(torch.equal(states, lengths.gt(0)), "static state mask disagrees with valid tokens") + _require(torch.equal(available, states.any(dim=1)), "static states disagree with parent availability") + _require(not (states & state_ids.lt(0)).any(), "active static state ID is negative") + _require(not ((~states) & state_ids.ne(-1)).any(), "inactive static state ID must be -1") + _require(not (attention & (token_ids.lt(0) | token_ids.ge(4096))).any(), "active static global code outside 0-4095") + _require(not ((~attention) & token_ids.ne(0)).any(), "static padding global code changed") + _require(not ((~attention) & (residue_ids.ne(-1) | slot_ids.ne(-1))).any(), "static padding residue/slot sentinel changed") + _require(not (attention & (slot_ids.lt(0) | slot_ids.ge(4))).any(), "active static slot outside 0-3") + observed_slots = torch.div(token_ids.clamp_min(0), 1024, rounding_mode="floor") + _require(not (attention & observed_slots.ne(slot_ids)).any(), "static global code is not slot*1024+local") + _require(not (masked & ~attention).any(), "static padding is input-masked") + masked_groups = masked.reshape(*masked.shape[:2], -1, 4).sum(dim=-1) + _require(((masked_groups == 0) | (masked_groups == 4)).all(), "static masking split a four-code residue tuple") + if labels is not None: + _integer_tensor(labels, "static labels") + _require(labels.shape == token_ids.shape, "static labels are misaligned") + selected = labels.ne(-100) + _require(not (selected & ~attention).any(), "inactive static position carries a target") + selected_groups = selected.reshape(*selected.shape[:2], -1, 4).sum(dim=-1) + _require(((selected_groups == 0) | (selected_groups == 4)).all(), "static targets split a four-code residue tuple") + _require(torch.equal(masked, masked & selected), "static input mask is outside selected tuples") + label_slots = torch.div(labels.clamp_min(0), 1024, rounding_mode="floor") + _require(not (selected & (labels.lt(0) | labels.ge(4096))).any(), "static target outside 0-4095") + _require(not (selected & label_slots.ne(slot_ids)).any(), "static target belongs to another RVQ slot") + _require((selected_groups.sum(dim=-1).gt(0) | ~states).all(), "active static state has no selected residue tuple") + for parent in range(batch_size): + sequence_domain = torch.unique( + sequence_residue_ids[parent][sequence_attention[parent] & sequence_residue_ids[parent].ge(0)], + sorted=True, + ) + active_state_ids = state_ids[parent][states[parent]] + _require(torch.unique(active_state_ids).numel() == active_state_ids.numel(), "duplicate static state ID within parent") + for state in states[parent].nonzero(as_tuple=False).squeeze(-1).tolist(): + length = int(lengths[parent, state].item()) + state_residues = residue_ids[parent, state, :length].reshape(-1, 4) + state_slots = slot_ids[parent, state, :length].reshape(-1, 4) + expected_residues = torch.arange( + length // 4, + device=residue_ids.device, + dtype=residue_ids.dtype, + ).unsqueeze(1).expand(-1, 4) + expected_slots = torch.arange(4, device=slot_ids.device, dtype=slot_ids.dtype).view(1, 4).expand(length // 4, -1) + _require(torch.equal(state_residues, expected_residues), "static ordered materializer residue axis is permuted") + _require(torch.equal(state_slots, expected_slots), "static RVQ slot order is not 0,1,2,3 per residue") + _require( + torch.equal(torch.unique(state_residues, sorted=True), sequence_domain), + "static residue-node axis disagrees with corrected sequence RES axis", + ) + return attention + + +def static_parent_losses( + local_logits: torch.Tensor, + *, + global_labels: torch.Tensor, + slot_ids: torch.Tensor, + attention_mask: torch.Tensor, + active_parent_indices: torch.Tensor, + active_state_indices: torch.Tensor, + batch_size: int, +) -> tuple[torch.Tensor, torch.Tensor]: + """Four slot CEs -> equal-slot residue -> equal-residue state -> equal-state parent.""" + + _require(local_logits.shape[:-1] == global_labels.shape and local_logits.shape[-1] == 1024, "static logits/labels changed") + selected = global_labels.ne(-100) + local_labels = torch.full_like(global_labels, -100) + local_labels[selected] = global_labels[selected].remainder(1024) + token_loss = F.cross_entropy( + local_logits.reshape(-1, 1024), + local_labels.reshape(-1), + ignore_index=-100, + reduction="none", + ).reshape(global_labels.shape) + state_losses: list[torch.Tensor] = [] + for state in range(global_labels.shape[0]): + length = int(attention_mask[state].sum().item()) + losses = token_loss[state, :length].reshape(-1, 4) + valid = selected[state, :length].reshape(-1, 4) + selected_residues = valid.any(dim=1) + _require(((valid.sum(dim=1) == 0) | (valid.sum(dim=1) == 4)).all(), "static loss saw a partial slot tuple") + _require(selected_residues.any(), "static state loss has no selected residue") + # Each residue contributes the mean of its four slot-specific CEs. + state_losses.append(losses[selected_residues].mean(dim=1).mean()) + state_loss_tensor = torch.stack(state_losses) + return _group_mean( + state_loss_tensor, + active_parent_indices.long(), + group_count=batch_size, + ) + + +def _token_parent_losses( + logits: torch.Tensor, + labels: torch.Tensor, + replica_parent_indices: torch.Tensor, + *, + batch_size: int, +) -> tuple[torch.Tensor, torch.Tensor]: + repeated_labels = labels.index_select(0, replica_parent_indices.long()) + flat = F.cross_entropy( + logits.reshape(-1, logits.shape[-1]), + repeated_labels.reshape(-1), + ignore_index=-100, + reduction="none", + ).reshape(repeated_labels.shape) + selected = repeated_labels.ne(-100) + counts = selected.sum(dim=1) + _require(counts.gt(0).all(), "sequence fusion replica has no MLM target") + replica_losses = (flat * selected).sum(dim=1) / counts + return _group_mean( + replica_losses, + replica_parent_indices.long(), + group_count=batch_size, + ) + + +@dataclass(slots=True) +class NativeEightOutput: + cell_id: str + sequence_logits: torch.Tensor + sequence_replica_parent_indices: torch.Tensor + shared_parent_hidden: torch.Tensor + topology_token_pair_predictions: Optional[torch.Tensor] + ms_logits: Optional[torch.Tensor] + static_local_logits: Optional[torch.Tensor] + parent_losses: Mapping[str, Optional[torch.Tensor]] + loss_parent_indices: Mapping[str, Optional[torch.Tensor]] + training_authorized: bool = False + scientific_launch_authorized: bool = False + + +def _group_mean_tensor( + values: torch.Tensor, + group_indices: torch.Tensor, + *, + group_count: int, +) -> tuple[torch.Tensor, torch.Tensor]: + _require(values.ndim >= 1 and values.shape[0] == group_indices.shape[0], "tensor group axis changed") + sums = values.new_zeros((group_count, *values.shape[1:])).index_add(0, group_indices.long(), values) + counts = values.new_zeros(group_count).index_add( + 0, + group_indices.long(), + torch.ones(group_indices.shape[0], device=values.device, dtype=values.dtype), + ) + observed = counts.gt(0) + scale_shape = (group_count,) + (1,) * (values.ndim - 1) + return sums / counts.clamp_min(1).reshape(scale_shape), observed + + +def _first_token_pool(hidden: torch.Tensor, attention: torch.Tensor) -> torch.Tensor: + _require(hidden.ndim == 3 and attention.shape == hidden.shape[:2], "first-token pool shape changed") + _require(attention[:, 0].all(), "first-token pool requires an attended envelope token") + return hidden[:, 0] + + +class NativeEightCompositeR4(nn.Module): + """Real isolated A5 composite with explicit sparse hierarchy reductions.""" + + training_authorized = False + scientific_launch_authorized = False + execution_certified = False + + def __init__(self, config: NativeEightConfig) -> None: + super().__init__() + _require(type(config) is NativeEightConfig, "composite requires exact r4 config") + config.validate() + self.config = config + self.enabled = dict(config.enabled) + + self.sequence_embeddings = ExactSequenceEmbeddings(config) + self.sequence_layers = nn.ModuleList( + [ + EncoderLayer( + config.seq_hidden_size, + config.seq_num_heads, + config.hidden_dropout_prob, + config.attention_dropout_prob, + config.layer_norm_eps, + ) + for _ in range(config.seq_num_layers) + ] + ) + self.sequence_head = nn.Linear(config.seq_hidden_size, config.seq_vocab_size) + + self.topology_projection = nn.Linear(config.seq_hidden_size, config.topology_projection_size) + self.topology_head = nn.Sequential( + nn.Linear(config.topology_projection_size, 64), + nn.ReLU(), + nn.Linear(64, 1), + ) + + self.ms_embeddings = MaskAwareDiscreteEmbeddings( + vocab_size=242, + hidden_size=config.ms_hidden_size, + max_length=64, + dropout=config.hidden_dropout_prob, + layer_norm_eps=config.layer_norm_eps, + ) + self.ms_layers = nn.ModuleList( + [ + EncoderLayer( + config.ms_hidden_size, + config.ms_num_heads, + config.hidden_dropout_prob, + config.attention_dropout_prob, + config.layer_norm_eps, + ) + for _ in range(config.ms_num_layers) + ] + ) + self.ms_projection = nn.Linear(config.ms_hidden_size, config.seq_hidden_size) + self.ms_head = nn.Linear(config.ms_hidden_size, 242) + + self.static_embeddings = StaticEmbeddings(config) + self.static_layers = nn.ModuleList( + [ + EncoderLayer( + config.static_hidden_size, + config.static_num_heads, + config.hidden_dropout_prob, + config.attention_dropout_prob, + config.layer_norm_eps, + ) + for _ in range(config.static_num_layers) + ] + ) + self.static_projection = nn.Linear(config.static_hidden_size, config.seq_hidden_size) + self.static_head = SlotConditionedHead(config.static_hidden_size) + self.static_cross_attention = ResidueCrossAttention(config) + + self.fusion = nn.Sequential( + nn.Linear(config.seq_hidden_size * 3, config.fusion_hidden_size), + nn.LayerNorm(config.fusion_hidden_size, eps=config.layer_norm_eps), + nn.GELU(), + nn.Dropout(config.hidden_dropout_prob), + nn.Linear(config.fusion_hidden_size, config.fusion_hidden_size), + ) + self.apply(self._initialize) + self._freeze_disabled_exclusive_modules() + self._parameter_shape_identity = tuple( + (name, tuple(parameter.shape)) for name, parameter in self.named_parameters() + ) + self._disabled_parameter_names = frozenset( + name for name, parameter in self.named_parameters() if not parameter.requires_grad + ) + + def _initialize(self, module: nn.Module) -> None: + if isinstance(module, nn.Linear): + nn.init.normal_(module.weight, mean=0.0, std=self.config.initializer_range) + if module.bias is not None: + nn.init.zeros_(module.bias) + elif isinstance(module, nn.Embedding): + nn.init.normal_(module.weight, mean=0.0, std=self.config.initializer_range) + if module.padding_idx is not None: + with torch.no_grad(): + module.weight[module.padding_idx].zero_() + elif isinstance(module, nn.LayerNorm): + nn.init.ones_(module.weight) + nn.init.zeros_(module.bias) + elif isinstance(module, (MaskAwareDiscreteEmbeddings, StaticEmbeddings)): + nn.init.normal_(module.mask_embedding, mean=0.0, std=self.config.initializer_range) + + def _freeze_disabled_exclusive_modules(self) -> None: + groups: dict[str, tuple[nn.Module, ...]] = { + "topology": (self.topology_projection, self.topology_head), + "ms": (self.ms_embeddings, self.ms_layers, self.ms_projection, self.ms_head), + "static": ( + self.static_embeddings, + self.static_layers, + self.static_projection, + self.static_head, + self.static_cross_attention, + ), + } + for objective, modules in groups.items(): + if not self.enabled[objective]: + for module in modules: + module.requires_grad_(False) + + def verify_live_contract(self) -> None: + _require(type(self) is NativeEightCompositeR4, "composite cannot be subclassed") + _require(self.config.training_authorized is False, "config training flag changed") + _require(self.config.scientific_launch_authorized is False, "config launch flag changed") + _require( + tuple((name, tuple(parameter.shape)) for name, parameter in self.named_parameters()) + == self._parameter_shape_identity, + "model parameter architecture changed after construction", + ) + for name, parameter in self.named_parameters(): + if name in self._disabled_parameter_names: + _require(parameter.requires_grad is False, f"disabled parameter re-enabled: {name}") + + def optimizer_parameter_groups(self, *, weight_decay: float) -> tuple[dict[str, Any], dict[str, Any]]: + _require(type(weight_decay) is float and math.isfinite(weight_decay) and weight_decay >= 0, "weight decay is invalid") + decay: list[nn.Parameter] = [] + no_decay: list[nn.Parameter] = [] + for name, parameter in self.named_parameters(): + if not parameter.requires_grad: + continue + if name.endswith("bias") or "norm." in name.lower() or "layernorm" in name.lower(): + no_decay.append(parameter) + else: + decay.append(parameter) + included = {id(parameter) for parameter in (*decay, *no_decay)} + expected = {id(parameter) for parameter in self.parameters() if parameter.requires_grad} + _require(included == expected, "optimizer groups omit or duplicate an enabled parameter") + _require(not ({id(parameter) for parameter in self.parameters() if not parameter.requires_grad} & included), "optimizer contains a disabled parameter") + return ( + {"params": decay, "weight_decay": weight_decay}, + {"params": no_decay, "weight_decay": 0.0}, + ) + + @staticmethod + def _bundle_presence(values: Mapping[str, object], name: str) -> bool: + present = {key: value is not None for key, value in values.items()} + _require(not (any(present.values()) and not all(present.values())), f"partial {name} bundle") + return all(present.values()) + + def forward( + self, + *, + seq_token_ids: torch.Tensor, + seq_attention_mask: torch.Tensor, + seq_residue_ids: torch.Tensor, + seq_branch_depths: torch.Tensor, + seq_linkage_types: torch.Tensor, + seq_labels: Optional[torch.Tensor] = None, + topology_labels: Optional[torch.Tensor] = None, + topology_available: Optional[torch.Tensor] = None, + ms_token_ids: Optional[torch.Tensor] = None, + ms_attention_mask: Optional[torch.Tensor] = None, + ms_input_mask: Optional[torch.Tensor] = None, + ms_labels: Optional[torch.Tensor] = None, + ms_acquisition_parent_indices: Optional[torch.Tensor] = None, + ms_parent_available: Optional[torch.Tensor] = None, + ms_mode: Optional[str] = None, + static_token_ids: Optional[torch.Tensor] = None, + static_attention_mask: Optional[torch.Tensor] = None, + static_residue_ids: Optional[torch.Tensor] = None, + static_slot_ids: Optional[torch.Tensor] = None, + static_state_mask: Optional[torch.Tensor] = None, + static_state_ids: Optional[torch.Tensor] = None, + static_input_mask: Optional[torch.Tensor] = None, + static_labels: Optional[torch.Tensor] = None, + static_parent_available: Optional[torch.Tensor] = None, + ) -> NativeEightOutput: + self.verify_live_contract() + sequence_attention = validate_sequence_surface( + self.config, + token_ids=seq_token_ids, + attention_mask=seq_attention_mask, + residue_ids=seq_residue_ids, + branch_depths=seq_branch_depths, + linkage_types=seq_linkage_types, + labels=seq_labels, + ) + batch_size = seq_token_ids.shape[0] + sequence_hidden = _run_layers( + self.sequence_embeddings(seq_token_ids, seq_branch_depths, seq_linkage_types), + sequence_attention, + self.sequence_layers, + ) + + topology_predictions: Optional[torch.Tensor] = None + topology_loss: Optional[torch.Tensor] = None + topology_loss_indices: Optional[torch.Tensor] = None + topology_bundle = self._bundle_presence( + {"labels": topology_labels, "availability": topology_available}, + "topology target", + ) + if not self.enabled["topology"]: + _require(not topology_bundle, "disabled topology branch received payload") + else: + projected = self.topology_projection(sequence_hidden) + pair_hidden = torch.abs(projected.unsqueeze(2) - projected.unsqueeze(1)) + topology_predictions = self.topology_head(pair_hidden).squeeze(-1) + if topology_bundle: + topology_loss, topology_loss_indices = topology_parent_losses_inverse_bpe( + topology_predictions, + sequence_residue_ids=seq_residue_ids, + sequence_attention=sequence_attention, + topology_labels=topology_labels, + topology_available=topology_available, + ) + + static_logits: Optional[torch.Tensor] = None + static_loss: Optional[torch.Tensor] = None + static_loss_indices: Optional[torch.Tensor] = None + parent_sequence_hidden = sequence_hidden + parent_static_pool = sequence_hidden.new_zeros(batch_size, self.config.seq_hidden_size) + static_core = { + "token_ids": static_token_ids, + "attention": static_attention_mask, + "residues": static_residue_ids, + "slots": static_slot_ids, + "states": static_state_mask, + "state_ids": static_state_ids, + "input_mask": static_input_mask, + "availability": static_parent_available, + } + static_bundle = self._bundle_presence(static_core, "static") + if not self.enabled["static"]: + _require(not static_bundle and static_labels is None, "disabled static branch received payload") + else: + _require(static_bundle, "enabled static branch requires the complete state bundle") + static_attention = validate_static_surface( + batch_size=batch_size, + token_ids=static_token_ids, + attention_mask=static_attention_mask, + residue_ids=static_residue_ids, + slot_ids=static_slot_ids, + state_mask=static_state_mask, + state_ids=static_state_ids, + input_mask=static_input_mask, + labels=static_labels, + parent_available=static_parent_available, + sequence_residue_ids=seq_residue_ids, + sequence_attention=sequence_attention, + ) + active_state_coordinates = static_state_mask.nonzero(as_tuple=False) + active_parents = active_state_coordinates[:, 0] + active_states = active_state_coordinates[:, 1] + active_token_ids = static_token_ids[active_parents, active_states] + active_attention = static_attention[active_parents, active_states] + active_residue_ids = static_residue_ids[active_parents, active_states] + active_slot_ids = static_slot_ids[active_parents, active_states] + active_input_mask = static_input_mask[active_parents, active_states] + static_hidden = _run_layers( + self.static_embeddings(active_token_ids, active_slot_ids, active_input_mask), + active_attention, + self.static_layers, + ) + static_logits = self.static_head(static_hidden, active_slot_ids, active_attention) + cross_state_hidden = self.static_cross_attention( + sequence_hidden.index_select(0, active_parents), + static_hidden, + seq_residue_ids.index_select(0, active_parents), + active_residue_ids, + sequence_attention.index_select(0, active_parents), + active_attention, + ) + averaged_cross, observed_static = _group_mean_tensor( + cross_state_hidden, + active_parents, + group_count=batch_size, + ) + parent_sequence_hidden = torch.where( + observed_static.view(-1, 1, 1), + averaged_cross, + sequence_hidden, + ) + valid_weights = active_attention.to(static_hidden.dtype).unsqueeze(-1) + state_pool = (static_hidden * valid_weights).sum(dim=1) / valid_weights.sum(dim=1) + projected_state_pool = self.static_projection(state_pool) + parent_static_pool, _ = _group_mean_tensor( + projected_state_pool, + active_parents, + group_count=batch_size, + ) + if static_labels is not None: + active_labels = static_labels[active_parents, active_states] + static_loss, static_loss_indices = static_parent_losses( + static_logits, + global_labels=active_labels, + slot_ids=active_slot_ids, + attention_mask=active_attention, + active_parent_indices=active_parents, + active_state_indices=active_states, + batch_size=batch_size, + ) + + ms_logits: Optional[torch.Tensor] = None + ms_loss: Optional[torch.Tensor] = None + ms_loss_indices: Optional[torch.Tensor] = None + acquisition_pool: Optional[torch.Tensor] = None + ms_core = { + "token_ids": ms_token_ids, + "attention": ms_attention_mask, + "input_mask": ms_input_mask, + "parent_indices": ms_acquisition_parent_indices, + "availability": ms_parent_available, + "mode": ms_mode, + } + ms_bundle = self._bundle_presence(ms_core, "MS acquisition") + if not self.enabled["ms"]: + _require(not ms_bundle and ms_labels is None, "disabled MS branch received payload") + else: + _require(ms_bundle, "enabled MS branch requires the complete acquisition bundle") + ms_attention = validate_ms_surface( + batch_size=batch_size, + token_ids=ms_token_ids, + attention_mask=ms_attention_mask, + input_mask=ms_input_mask, + labels=ms_labels, + acquisition_parent_indices=ms_acquisition_parent_indices, + parent_available=ms_parent_available, + mode=ms_mode, + ) + ms_hidden = _run_layers( + self.ms_embeddings(ms_token_ids, ms_input_mask), + ms_attention, + self.ms_layers, + ) + ms_logits = self.ms_head(ms_hidden) + acquisition_pool = self.ms_projection(_first_token_pool(ms_hidden, ms_attention)) + if ms_labels is not None: + ms_loss, ms_loss_indices = ms_parent_losses( + ms_logits, + labels=ms_labels, + attention_mask=ms_attention, + acquisition_parent_indices=ms_acquisition_parent_indices, + batch_size=batch_size, + ) + + if self.enabled["ms"]: + missing_parent_indices = (~ms_parent_available).nonzero(as_tuple=False).squeeze(-1) + replica_parent_indices = torch.cat( + (ms_acquisition_parent_indices.long(), missing_parent_indices.long()), dim=0 + ) + replica_ms_pool = torch.cat( + ( + acquisition_pool, + parent_sequence_hidden.new_zeros(missing_parent_indices.numel(), self.config.seq_hidden_size), + ), + dim=0, + ) + else: + replica_parent_indices = torch.arange(batch_size, device=seq_token_ids.device) + replica_ms_pool = parent_sequence_hidden.new_zeros(batch_size, self.config.seq_hidden_size) + _require( + torch.unique(replica_parent_indices).numel() == batch_size, + "fusion replica axis omitted a sequence parent", + ) + replica_base_hidden = parent_sequence_hidden.index_select(0, replica_parent_indices) + replica_sequence_pool = _first_token_pool( + replica_base_hidden, + sequence_attention.index_select(0, replica_parent_indices), + ) + replica_static_pool = parent_static_pool.index_select(0, replica_parent_indices) + fusion_residual = self.fusion( + torch.cat((replica_sequence_pool, replica_ms_pool, replica_static_pool), dim=-1) + ) + shared_replica_hidden = replica_base_hidden + fusion_residual.unsqueeze(1) + sequence_logits = self.sequence_head(shared_replica_hidden) + shared_parent_hidden, observed_sequence = _group_mean_tensor( + shared_replica_hidden, + replica_parent_indices, + group_count=batch_size, + ) + _require(observed_sequence.all(), "shared parent representation is incomplete") + + sequence_loss: Optional[torch.Tensor] = None + sequence_loss_indices: Optional[torch.Tensor] = None + if seq_labels is not None: + sequence_loss, sequence_loss_indices = _token_parent_losses( + sequence_logits, + seq_labels, + replica_parent_indices, + batch_size=batch_size, + ) + _require( + torch.equal(sequence_loss_indices, torch.arange(batch_size, device=seq_token_ids.device)), + "sequence parent loss axis changed", + ) + + parent_losses = MappingProxyType( + { + "sequence": sequence_loss, + "topology": topology_loss, + "ms": ms_loss, + "static": static_loss, + } + ) + loss_parent_indices = MappingProxyType( + { + "sequence": sequence_loss_indices, + "topology": topology_loss_indices, + "ms": ms_loss_indices, + "static": static_loss_indices, + } + ) + for objective in OBJECTIVES: + if not self.enabled[objective]: + _require(parent_losses[objective] is None, f"disabled {objective} objective executed") + _require(loss_parent_indices[objective] is None, f"disabled {objective} objective emitted indices") + return NativeEightOutput( + cell_id=self.config.cell_id, + sequence_logits=sequence_logits, + sequence_replica_parent_indices=replica_parent_indices, + shared_parent_hidden=shared_parent_hidden, + topology_token_pair_predictions=topology_predictions, + ms_logits=ms_logits, + static_local_logits=static_logits, + parent_losses=parent_losses, + loss_parent_indices=loss_parent_indices, + ) + + +def contract_summary() -> dict[str, Any]: + return { + "schema": SCHEMA, + "status": "PREPARATION_ONLY_REAL_FOUR_MODALITY_COMPOSITE_LAUNCH_CLOSED", + "cells": list(CELL_ORDER), + "processing_boundaries": { + "sequence": "corrected_BPE_plus_residue_rooted_depth_linkage_exact_no_clamp", + "topology": "exact_undirected_BFS_pre_fusion_inverse_BPE_unique_pairs", + "ms": "raw_10Da_per_bin_max_base_peak_TOP30_LOW_MED_HIGH_acquisition_axis", + "static": "GLYCAM_graph_EGNN_four_stage_RVQ_state_axis_slot_conditioned", + }, + "sequence_mlm_source": "post_fusion_acquisition_averaged_equal_parent", + "topology_source": "pre_fusion_sequence_hidden", + "static_pool": "valid_token_state_then_equal_parent", + "static_loss": "slot_CE_to_residue_to_state_to_equal_parent", + "static_envelope": "48_residues_times_4_equals_192_valid_within_200_positions_no_truncation", + "ms_loss": "family_equal_acquisition_then_equal_acquisition_parent", + "disabled_branch_policy": "no_payload_no_forward_no_gradient_no_optimizer_no_decay_update", + "affinose_supported": False, + "downstream_supported": False, + "wa2_wa3_gradnorm_supported": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "execution_certified": False, + } + + +__all__ = [ + "BRANCH_DEPTH_UNKNOWN_ID", + "CELL_ORDER", + "CompositeError", + "LINKAGE_UNKNOWN_ID", + "MS_MAX_LENGTH", + "NativeEightCompositeR4", + "NativeEightConfig", + "NativeEightOutput", + "OBJECTIVES", + "STATIC_GLOBAL_VOCAB_SIZE", + "STATIC_POSITION_CAPACITY", + "STATIC_VALID_TOKEN_CEILING", + "contract_summary", + "ms_parent_losses", + "static_parent_losses", + "topology_parent_losses_inverse_bpe", + "validate_ms_surface", + "validate_sequence_surface", + "validate_static_surface", + "validate_topology_surface", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_balanced_planner_r5.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_balanced_planner_r5.py new file mode 100644 index 0000000000000000000000000000000000000000..b8bac467d9da360e6c8bab642e5623224fe67549 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_balanced_planner_r5.py @@ -0,0 +1,405 @@ +"""Launch-closed successor planner with whole-step sparse-objective coverage. + +The r4 planner proved the exact equal-parent coefficient law, but independently +round-robining the seven availability strata could leave an optimizer step +without any MS carrier even though the frozen MS roster is larger than the +number of optimizer steps. This successor preserves the r4 reduction and +resume semantics while assigning the union of all MS-bearing strata first. + +Every returned plan fails closed when an objective with at least ``S`` eligible +parents is missing from any optimizer step. The construction is deliberately +specialized to the one frozen production histogram: union scheduling repairs +the sparse MS objective, while the large topology-only and topology+static +strata independently cover every step. Arbitrary test histograms are not +promised a feasible plan merely because one exists. The source is +preparation-only; it cannot authorize training or submission. +""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import stat +import sys +from types import ModuleType +from typing import Any, Mapping, Sequence + + +SCHEMA = "bertose_a5_native_eight_balanced_epoch_plan_20260721_r5" +CURSOR_SCHEMA = "bertose_a5_native_eight_balanced_epoch_cursor_20260721_r5" +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +EXECUTION_CERTIFIED = False + +R4_SOURCE_PATH = ( + Path(__file__).absolute().parents[1] + / "a5_pretraining_failclosed_integration_20260721_r4" + / "review_a5_native_eight_balanced_planner_r4.py" +) +R4_SOURCE_SHA256 = "2c985edfe747bae712c41689da8be2abb5096bd97a8771691b3676d3a8af49fd" + + +class PlannerR5BootstrapError(RuntimeError): + """Raised before a predecessor with changed bytes can be loaded.""" + + +def _read_regular_nofollow(path: Path) -> bytes: + if not hasattr(os, "O_NOFOLLOW") or not hasattr(os, "O_DIRECTORY"): + raise PlannerR5BootstrapError("platform lacks no-follow traversal") + absolute = Path(path) + if not absolute.is_absolute(): + raise PlannerR5BootstrapError("predecessor path must be absolute") + parts = absolute.parts + if not parts or parts[0] != os.sep or any(part in {"", ".", ".."} for part in parts[1:]): + raise PlannerR5BootstrapError("predecessor path is not canonical") + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + descriptor: int | None = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in parts[1:-1]: + next_descriptor = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = next_descriptor + leaf_descriptor = os.open(parts[-1], leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf_descriptor + metadata = os.fstat(descriptor) + if not stat.S_ISREG(metadata.st_mode): + raise PlannerR5BootstrapError("predecessor is not a regular file") + chunks: list[bytes] = [] + while True: + chunk = os.read(descriptor, 1024 * 1024) + if not chunk: + break + chunks.append(chunk) + payload = b"".join(chunks) + if len(payload) != metadata.st_size: + raise PlannerR5BootstrapError("predecessor changed while reading") + return payload + except OSError as error: + raise PlannerR5BootstrapError(f"predecessor no-follow open failed: {error}") from error + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + + +def _load_r4() -> ModuleType: + source = _read_regular_nofollow(R4_SOURCE_PATH) + if hashlib.sha256(source).hexdigest() != R4_SOURCE_SHA256: + raise PlannerR5BootstrapError("balanced planner r4 bytes changed") + module_name = f"_review_a5_balanced_planner_r4_bound_{id(source)}" + module = ModuleType(module_name) + module.__file__ = os.fspath(R4_SOURCE_PATH) + module.__package__ = "" + sys.modules[module_name] = module + exec(compile(source, os.fspath(R4_SOURCE_PATH), "exec"), module.__dict__) + return module + + +_r4 = _load_r4() +_r4_verify_plan_identity = _r4.verify_plan_identity +_r4.SCHEMA = SCHEMA +_r4.CURSOR_SCHEMA = CURSOR_SCHEMA + +BalancedPlannerError = _r4.BalancedPlannerError +FrozenEpochPlan = _r4.FrozenEpochPlan +OBJECTIVES = _r4.OBJECTIVES +OPTIONAL_OBJECTIVES = _r4.OPTIONAL_OBJECTIVES +CELL_ORDER = _r4.CELL_ORDER +CELL_BITS = _r4.CELL_BITS +FROZEN_TRAIN_PATTERN_COUNTS = _r4.FROZEN_TRAIN_PATTERN_COUNTS +FROZEN_TRAIN_ELIGIBILITY_COUNTS = _r4.FROZEN_TRAIN_ELIGIBILITY_COUNTS +COMMON_SEED = _r4.COMMON_SEED +NOMINAL_EFFECTIVE_BATCH = _r4.NOMINAL_EFFECTIVE_BATCH +MICROBATCHES_PER_STEP = _r4.MICROBATCHES_PER_STEP +SHELL_DENOMINATOR = _r4.SHELL_DENOMINATOR + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise BalancedPlannerError(message) + + +def step_objective_counts(plan: FrozenEpochPlan) -> dict[str, tuple[int, ...]]: + """Return exact carrier counts for every objective in every step.""" + + result = {objective: [] for objective in OBJECTIVES} + for step_index in range(plan.optimizer_step_count): + bits = plan.step_availability_bits(step_index) + result["sequence"].append(len(bits)) + result["topology"].append(sum(bool(value & 0b100) for value in bits)) + result["ms"].append(sum(bool(value & 0b010) for value in bits)) + result["static"].append(sum(bool(value & 0b001) for value in bits)) + return {objective: tuple(values) for objective, values in result.items()} + + +def verify_plan_identity(plan: FrozenEpochPlan) -> None: + """Preserve r4 identity checks and enforce feasible whole-step coverage.""" + + _r4_verify_plan_identity(plan) + counts = step_objective_counts(plan) + for objective in OBJECTIVES: + observed = counts[objective] + _require(sum(observed) == plan.eligibility_counts[objective], f"{objective} carrier total changed") + if plan.eligibility_counts[objective] >= plan.optimizer_step_count: + _require(min(observed) > 0, f"{objective} is absent from an optimizer step") + + +# Every r4 reducer resolves this symbol dynamically. Rebinding only the +# isolated loaded module makes all inherited operations enforce the r5 gate. +_r4.verify_plan_identity = verify_plan_identity + + +def _build_covered_epoch_plan( + parent_rows: Sequence[Mapping[str, Any]], + *, + epoch: int, + seed: int = COMMON_SEED, +) -> FrozenEpochPlan: + _require(type(epoch) is int and epoch >= 0, "epoch is invalid") + _require(seed == COMMON_SEED, "native-eight seed must be exactly 43") + _require(isinstance(parent_rows, Sequence) and len(parent_rows) > 0, "parent roster is empty") + + seen: set[str] = set() + parent_ids: list[str] = [] + parent_bits: list[int] = [] + strata: dict[int, list[int]] = {bits: [] for bits in range(8)} + for index, row in enumerate(parent_rows): + parent_id = row.get("parent_id") + _require(type(parent_id) is str and bool(parent_id), "parent ID is blank") + _require(parent_id not in seen, "parent ID is duplicated") + seen.add(parent_id) + bits = _r4._availability_bits(row.get("availability", {})) + parent_ids.append(parent_id) + parent_bits.append(bits) + strata[bits].append(index) + + parent_count = len(parent_ids) + capacities = _r4._balanced_capacities(parent_count) + step_count = len(capacities) + steps: list[list[int]] = [[] for _ in capacities] + step_stratum_counts: dict[int, list[int]] = { + bits: [0] * step_count for bits in range(1, 8) + } + + # The scientific defect repair: schedule all MS-bearing patterns as one + # union, so N_MS >= S proves at least one MS parent in every step. + ms_union = [ + index + for bits in range(1, 8) + if bits & 0b010 + for index in strata[bits] + ] + ms_union.sort( + key=lambda index: ( + _r4._stable_key(SCHEMA, seed, epoch, "ms-union", parent_ids[index]), + parent_ids[index], + ) + ) + ms_offset = int.from_bytes( + _r4._stable_key(SCHEMA, seed, epoch, "ms-union-offset")[:8], "big" + ) % step_count + for ordinal, parent_index in enumerate(ms_union): + step_index = (ms_offset + ordinal) % step_count + steps[step_index].append(parent_index) + step_stratum_counts[parent_bits[parent_index]][step_index] += 1 + + # Non-MS optional patterns retain deterministic per-pattern round robin. + for bits in range(1, 8): + if bits & 0b010: + continue + ordered = strata[bits] + ordered.sort( + key=lambda index: ( + _r4._stable_key(SCHEMA, seed, epoch, "stratum", bits, parent_ids[index]), + parent_ids[index], + ) + ) + offset = int.from_bytes( + _r4._stable_key(SCHEMA, seed, epoch, "offset", bits)[:8], "big" + ) % step_count + for ordinal, parent_index in enumerate(ordered): + step_index = (offset + ordinal) % step_count + steps[step_index].append(parent_index) + step_stratum_counts[bits][step_index] += 1 + + for step_index, (step, capacity) in enumerate(zip(steps, capacities)): + _require(len(step) <= capacity, f"optional strata overflow step {step_index}") + + sequence_only = strata[0] + sequence_only.sort( + key=lambda index: ( + _r4._stable_key(SCHEMA, seed, epoch, "sequence-only", parent_ids[index]), + parent_ids[index], + ) + ) + cursor = 0 + for step_index, capacity in enumerate(capacities): + needed = capacity - len(steps[step_index]) + steps[step_index].extend(sequence_only[cursor : cursor + needed]) + cursor += needed + _require(len(steps[step_index]) == capacity, f"sequence-only fill underflowed step {step_index}") + steps[step_index].sort( + key=lambda index: ( + _r4._stable_key(SCHEMA, seed, epoch, "inside-step", step_index, parent_ids[index]), + parent_ids[index], + ) + ) + _require(cursor == len(sequence_only), "sequence-only fill did not consume its exact roster") + + ordered_indices = tuple(index for step in steps for index in step) + _require(len(ordered_indices) == parent_count, "plan length changed") + _require(len(set(ordered_indices)) == parent_count, "plan is not exact one-pass") + _require(set(ordered_indices) == set(range(parent_count)), "plan omitted a parent") + ordered_ids = tuple(parent_ids[index] for index in ordered_indices) + ordered_bits = bytes(parent_bits[index] for index in ordered_indices) + offsets = [0] + for capacity in capacities: + offsets.append(offsets[-1] + capacity) + + eligibility_counts = { + "sequence": parent_count, + "topology": sum(bool(bits & 0b100) for bits in parent_bits), + "ms": sum(bool(bits & 0b010) for bits in parent_bits), + "static": sum(bool(bits & 0b001) for bits in parent_bits), + } + _require(all(value > 0 for value in eligibility_counts.values()), "planner lacks an objective roster") + global_factors = { + objective: step_count / eligibility_counts[objective] + for objective in OBJECTIVES + } + stratum_counts = {format(bits, "03b"): len(strata[bits]) for bits in range(8)} + stratum_min = { + format(bits, "03b"): min(step_stratum_counts[bits]) for bits in range(1, 8) + } + stratum_max = { + format(bits, "03b"): max(step_stratum_counts[bits]) for bits in range(1, 8) + } + provisional = FrozenEpochPlan( + schema=SCHEMA, + seed=seed, + epoch=epoch, + parent_count=parent_count, + optimizer_step_count=step_count, + capacities=capacities, + step_offsets=tuple(offsets), + ordered_parent_indices=ordered_indices, + ordered_parent_ids=ordered_ids, + ordered_availability_bits=ordered_bits, + eligibility_counts=eligibility_counts, + global_factors=global_factors, + stratum_counts=stratum_counts, + stratum_step_min=stratum_min, + stratum_step_max=stratum_max, + plan_sha256="0" * 64, + ) + plan = FrozenEpochPlan( + **{ + field: getattr(provisional, field) + for field in provisional.__dataclass_fields__ + if field != "plan_sha256" + }, + plan_sha256=_r4.canonical_sha256(_r4._plan_identity_payload(provisional), domain=SCHEMA), + ) + verify_plan_identity(plan) + return plan + + +def build_balanced_epoch_plan( + parent_rows: Sequence[Mapping[str, Any]], + *, + epoch: int, + seed: int = COMMON_SEED, +) -> FrozenEpochPlan: + _require( + _r4.availability_pattern_counts(parent_rows) == FROZEN_TRAIN_PATTERN_COUNTS, + "train availability-pattern histogram changed", + ) + plan = _build_covered_epoch_plan(parent_rows, epoch=epoch, seed=seed) + _require( + dict(plan.eligibility_counts) == FROZEN_TRAIN_ELIGIBILITY_COUNTS, + "train objective-eligibility counts changed", + ) + return plan + + +def build_test_fixture_epoch_plan( + parent_rows: Sequence[Mapping[str, Any]], + *, + epoch: int, + seed: int = COMMON_SEED, + isolated_test_fixture: bool, +) -> FrozenEpochPlan: + _require(isolated_test_fixture is True, "small-roster planner is test-fixture only") + return _build_covered_epoch_plan(parent_rows, epoch=epoch, seed=seed) + + +availability_pattern_counts = _r4.availability_pattern_counts +cell_coefficients = _r4.cell_coefficients +combine_cell_step_losses = _r4.combine_cell_step_losses +epoch_coefficient_proof = _r4.epoch_coefficient_proof +exact_step_parent_sum = _r4.exact_step_parent_sum +expected_step_parent_indices = _r4.expected_step_parent_indices +globally_normalized_step_loss = _r4.globally_normalized_step_loss +make_resume_cursor = _r4.make_resume_cursor +micro_sizes = _r4.micro_sizes +validate_resume_cursor = _r4.validate_resume_cursor + + +def contract_summary() -> dict[str, Any]: + return { + "schema": SCHEMA, + "status": "PREPARATION_ONLY_WHOLE_STEP_COVERAGE_LAUNCH_CLOSED", + "corrected_predecessor_sha256": R4_SOURCE_SHA256, + "cells": list(CELL_ORDER), + "common_seed": COMMON_SEED, + "nominal_effective_batch": NOMINAL_EFFECTIVE_BATCH, + "microbatches_per_step": MICROBATCHES_PER_STEP, + "sparse_objective_law": "S_over_N_o_times_sum_parent_losses_in_step", + "epoch_mean_identity": "mean_over_S_steps_equals_equal_parent_mean", + "coverage_law": "every_returned_plan_rejects_empty_steps_when_N_o_at_least_S", + "coverage_construction_scope": "exact_frozen_training_histogram_only", + "ms_assignment": "union_of_all_MS_bearing_patterns_round_robin_first", + "frozen_train_pattern_counts": dict(FROZEN_TRAIN_PATTERN_COUNTS), + "frozen_train_eligibility_counts": dict(FROZEN_TRAIN_ELIGIBILITY_COUNTS), + "shell_denominator": SHELL_DENOMINATOR, + "wa_or_adaptive_weighting_supported": False, + "downstream_or_affinose_in_scope": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "execution_certified": False, + } + + +__all__ = [ + "BalancedPlannerError", + "CELL_ORDER", + "COMMON_SEED", + "FROZEN_TRAIN_ELIGIBILITY_COUNTS", + "FROZEN_TRAIN_PATTERN_COUNTS", + "FrozenEpochPlan", + "OBJECTIVES", + "R4_SOURCE_SHA256", + "SHELL_DENOMINATOR", + "availability_pattern_counts", + "build_balanced_epoch_plan", + "build_test_fixture_epoch_plan", + "cell_coefficients", + "combine_cell_step_losses", + "contract_summary", + "epoch_coefficient_proof", + "exact_step_parent_sum", + "expected_step_parent_indices", + "globally_normalized_step_loss", + "make_resume_cursor", + "micro_sizes", + "step_objective_counts", + "validate_resume_cursor", + "verify_plan_identity", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_composite_r5.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_composite_r5.py new file mode 100644 index 0000000000000000000000000000000000000000..933a5730b833195be2d3e5c15caea1557b7db5fc --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_composite_r5.py @@ -0,0 +1,1267 @@ +"""Fail-closed r5 successor for the native A5 eight-cell composite. + +This isolated successor preserves the submitted four-modality architecture while +closing the r4 integration gaps found during the processing audit. It loads the +explicitly identified corrected r4 predecessor from verified bytes, records both +known r4 hash observations in a separate lineage receipt, overrides only the +repaired contracts, and binds the frozen topology-loss source and final +acquisition-level MS runtime through complete no-follow directory traversal. + +The static-v2 EGNN/RVQ fit and exported four-code package do not yet exist. +Consequently this module is preparation-only and cannot authorize training, +submission, AFFINose, or downstream execution. +""" + +from __future__ import annotations + +import hashlib +import json +import math +import os +from pathlib import Path +import stat +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping, Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +SCHEMA = "bertose_a5_native_eight_real_composite_20260721_r5" +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +EXECUTION_CERTIFIED = False +AFFINOSE_SUPPORTED = False +DOWNSTREAM_SUPPORTED = False +STATIC_FINAL_RELEASE_BOUND = False + +WRITING_ROOT = Path(__file__).absolute().parents[4] +PROJECT_ROOT = WRITING_ROOT.parent +R4_SOURCE_PATH = ( + WRITING_ROOT + / "review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4" + / "review_a5_native_eight_composite_r4.py" +) +R4_SOURCE_SHA256 = "52a311636e7631b97711aab63aec28e2ada47a446d1aecc1a47921d584f69f9d" +R4_LINEAGE_RECEIPT_PATH = ( + Path(__file__).absolute().parent / "review_a5_native_eight_r4_lineage_receipt_r1.json" +) +R4_LINEAGE_RECEIPT_SHA256 = "b5fbdff168de23676208484ccccc3cc32f613ea411d193e6d8930456e8edeeef" + +FROZEN_TOPOLOGY_LOSS_SOURCE_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3" + / "review_a5_topology_loss_v2.py" +) +FROZEN_TOPOLOGY_LOSS_SOURCE_SHA256 = ( + "64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e" +) + +SEQUENCE_PACKAGE_ROOT = ( + PROJECT_ROOT / "data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" +) +SEQUENCE_RECEIPT_NAME = "review_sequence_package_receipt.json" +SEQUENCE_SUMMARY_NAME = "review_sequence_package_summary.json" +SEQUENCE_VOCABULARY_NAME = "review_bpe_vocabulary.json" +SEQUENCE_BPE_SOURCE_NAME = "review_frozen_training_a5_wurcs_bpe.py" +SEQUENCE_TREE_SOURCE_NAME = "review_frozen_sequence_tree_runtime.py" +SEQUENCE_RECEIPT_SHA256 = "399df3de2b6c4d5e88aa442c8326214ab9cff2e8f0411e6921762bbade1475ba" +SEQUENCE_SUMMARY_SHA256 = "93ed219d807d4a7735be96bf7cf6a59a0bd407619925ee194aed6d473048cdf0" +SEQUENCE_VOCABULARY_SHA256 = "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b" +SEQUENCE_BPE_SOURCE_SHA256 = "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4" +SEQUENCE_TREE_SOURCE_SHA256 = "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04" +SEQUENCE_VOCAB_SIZE = 2114 + +MS_PACKAGE_ROOT = PROJECT_ROOT / "data/review_ms_acquisition_top30_runtime_20260721_r3" +MS_AUTHORITY_NAME = "review_a5_ms_acquisition_top30_runtime_authority.json" +MS_RECEIPT_NAME = "review_a5_ms_acquisition_top30_runtime_receipt.json" +MS_CERTIFICATE_NAME = "review_a5_ms_acquisition_top30_runtime_independent_certificate.json" +MS_AUTHORITY_SHA256 = "48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4" +MS_RECEIPT_SHA256 = "f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4" +MS_CERTIFICATE_SHA256 = "53098620a5c22dafdc951ba743515b4b10b1673c02f0aa4d881db669584902fa" +MS_RUNTIME_SHA256 = "68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6" +MS_RUNTIME_SOURCE_PATH = ( + WRITING_ROOT + / "review/multimodal/runtime/a5_ms_acquisition_top30_v3_20260721_r3" + / "review_a5_ms_acquisition_top30_runtime_v3.py" +) +MS_NULL_SCALE = 3.006098541980086 +EXPECTED_COMPONENT_BINDINGS = MappingProxyType( + { + "r4_source": R4_SOURCE_SHA256, + "r4_lineage_receipt": R4_LINEAGE_RECEIPT_SHA256, + "topology_loss_source": FROZEN_TOPOLOGY_LOSS_SOURCE_SHA256, + "sequence_receipt": SEQUENCE_RECEIPT_SHA256, + "sequence_summary": SEQUENCE_SUMMARY_SHA256, + "sequence_vocabulary": SEQUENCE_VOCABULARY_SHA256, + "sequence_bpe_source": SEQUENCE_BPE_SOURCE_SHA256, + "sequence_tree_source": SEQUENCE_TREE_SOURCE_SHA256, + "ms_authority": MS_AUTHORITY_SHA256, + "ms_receipt": MS_RECEIPT_SHA256, + "ms_certificate": MS_CERTIFICATE_SHA256, + "ms_runtime": MS_RUNTIME_SHA256, + } +) + + +class R5BootstrapError(RuntimeError): + """Raised when an exact predecessor/component byte binding cannot reopen.""" + + +def _read_regular_nofollow(path: Path, *, label: str) -> bytes: + """Read a regular file through an entirely no-follow absolute path chain.""" + + if not hasattr(os, "O_NOFOLLOW") or not hasattr(os, "O_DIRECTORY"): + raise R5BootstrapError("platform lacks required no-follow directory traversal") + absolute = Path(path) + if not absolute.is_absolute(): + raise R5BootstrapError(f"{label} path must be absolute") + parts = absolute.parts + if not parts or parts[0] != os.sep or any(part in {"", ".", ".."} for part in parts[1:]): + raise R5BootstrapError(f"{label} path is not canonical absolute syntax") + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + descriptor: Optional[int] = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in parts[1:-1]: + next_descriptor = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = next_descriptor + leaf_descriptor = os.open(parts[-1], leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf_descriptor + metadata = os.fstat(descriptor) + if not stat.S_ISREG(metadata.st_mode): + raise R5BootstrapError(f"{label} is not a regular no-follow file") + chunks: list[bytes] = [] + while True: + chunk = os.read(descriptor, 1024 * 1024) + if not chunk: + break + chunks.append(chunk) + payload = b"".join(chunks) + if len(payload) != metadata.st_size: + raise R5BootstrapError(f"{label} changed while being read") + return payload + except OSError as error: + raise R5BootstrapError(f"{label} no-follow open failed: {error}") from error + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + + +def _sha256(payload: bytes) -> str: + return hashlib.sha256(payload).hexdigest() + + +def _load_bound_r4() -> ModuleType: + source = _read_regular_nofollow(R4_SOURCE_PATH, label="native-eight r4 source") + if _sha256(source) != R4_SOURCE_SHA256: + raise R5BootstrapError("native-eight r4 source hash changed") + module_name = f"_review_a5_native_eight_r4_bound_{id(source)}" + module = ModuleType(module_name) + module.__file__ = os.fspath(R4_SOURCE_PATH) + module.__package__ = "" + sys.modules[module_name] = module + exec(compile(source, os.fspath(R4_SOURCE_PATH), "exec"), module.__dict__) + return module + + +_r4 = _load_bound_r4() + +CompositeError = _r4.CompositeError +NativeEightConfig = _r4.NativeEightConfig +NativeEightOutput = _r4.NativeEightOutput +CELL_ORDER = _r4.CELL_ORDER +CELL_BITS = _r4.CELL_BITS +OBJECTIVES = _r4.OBJECTIVES +static_sequence_alignment_mask = _r4.static_sequence_alignment_mask +_integer_tensor = _r4._integer_tensor +_bool_tensor = _r4._bool_tensor +_same_device = _r4._same_device +_contiguous_prefix = _r4._contiguous_prefix +_group_mean = _r4._group_mean +_group_mean_tensor = _r4._group_mean_tensor +_run_layers = _r4._run_layers +_first_token_pool = _r4._first_token_pool + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise CompositeError(message) + + +def _read_bound_json(path: Path, expected_sha256: str, *, label: str) -> tuple[dict[str, Any], str]: + payload = _read_regular_nofollow(path, label=label) + observed = _sha256(payload) + _require(observed == expected_sha256, f"{label} hash changed") + try: + document = json.loads(payload.decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise CompositeError(f"{label} is not canonical readable JSON") from error + _require(type(document) is dict, f"{label} JSON root changed") + return document, observed + + +def verify_component_authorities() -> Mapping[str, str]: + """Reopen the exact sequence, topology, and final packed-MS releases.""" + + lineage, lineage_sha = _read_bound_json( + R4_LINEAGE_RECEIPT_PATH, + R4_LINEAGE_RECEIPT_SHA256, + label="native-eight r4 lineage receipt", + ) + _require(lineage.get("training_authorized") is False, "r4 lineage receipt training flag changed") + _require(lineage.get("scientific_launch_authorized") is False, "r4 lineage receipt launch flag changed") + current_predecessor = lineage.get("current_corrected_predecessor") + earlier_readback = lineage.get("earlier_readback") + _require( + type(current_predecessor) is dict + and current_predecessor.get("sha256") == R4_SOURCE_SHA256, + "r4 lineage receipt current predecessor changed", + ) + _require( + type(earlier_readback) is dict + and earlier_readback.get("sha256") + == "0c45700a062295385d16cd23c66487633c5a18fce326c2901b1860d4a8d7abff", + "r4 lineage receipt earlier readback changed", + ) + topology_source = _read_regular_nofollow( + FROZEN_TOPOLOGY_LOSS_SOURCE_PATH, + label="frozen R3 topology loss source", + ) + _require( + _sha256(topology_source) == FROZEN_TOPOLOGY_LOSS_SOURCE_SHA256, + "frozen R3 topology loss source hash changed", + ) + sequence_receipt, sequence_receipt_sha = _read_bound_json( + SEQUENCE_PACKAGE_ROOT / SEQUENCE_RECEIPT_NAME, + SEQUENCE_RECEIPT_SHA256, + label="final sequence package receipt", + ) + sequence_summary, sequence_summary_sha = _read_bound_json( + SEQUENCE_PACKAGE_ROOT / SEQUENCE_SUMMARY_NAME, + SEQUENCE_SUMMARY_SHA256, + label="final sequence package summary", + ) + sequence_vocabulary, sequence_vocabulary_sha = _read_bound_json( + SEQUENCE_PACKAGE_ROOT / SEQUENCE_VOCABULARY_NAME, + SEQUENCE_VOCABULARY_SHA256, + label="final sequence BPE vocabulary", + ) + sequence_bpe_source = _read_regular_nofollow( + SEQUENCE_PACKAGE_ROOT / SEQUENCE_BPE_SOURCE_NAME, + label="final sequence BPE runtime source", + ) + sequence_tree_source = _read_regular_nofollow( + SEQUENCE_PACKAGE_ROOT / SEQUENCE_TREE_SOURCE_NAME, + label="final sequence tree runtime source", + ) + _require( + _sha256(sequence_bpe_source) == SEQUENCE_BPE_SOURCE_SHA256, + "final sequence BPE runtime source hash changed", + ) + _require( + _sha256(sequence_tree_source) == SEQUENCE_TREE_SOURCE_SHA256, + "final sequence tree runtime source hash changed", + ) + for name, document in ( + ("receipt", sequence_receipt), + ("summary", sequence_summary), + ): + for flag in ( + "training_authorized", + "scientific_launch_authorized", + "gpu_launch_authorized", + "nova_submission_authorized", + "checkpoint_resume_authorized", + "downstream_evaluation_authorized", + ): + _require(document.get(flag) is False, f"sequence {name} {flag} changed") + _require( + sequence_receipt.get("summary") + == { + "bytes": 7777, + "name": SEQUENCE_SUMMARY_NAME, + "sha256": SEQUENCE_SUMMARY_SHA256, + }, + "sequence receipt summary binding changed", + ) + sequence_payloads = sequence_receipt.get("payloads") + _require(type(sequence_payloads) is dict, "sequence receipt payload ledger changed") + for name, expected_sha in ( + (SEQUENCE_VOCABULARY_NAME, SEQUENCE_VOCABULARY_SHA256), + (SEQUENCE_BPE_SOURCE_NAME, SEQUENCE_BPE_SOURCE_SHA256), + (SEQUENCE_TREE_SOURCE_NAME, SEQUENCE_TREE_SOURCE_SHA256), + ): + binding = sequence_payloads.get(name) + _require( + type(binding) is dict + and binding.get("name") == name + and binding.get("sha256") == expected_sha, + f"sequence receipt binding changed for {name}", + ) + sequence_bpe = sequence_summary.get("bpe") + _require( + type(sequence_bpe) is dict + and sequence_bpe.get("fit_parent_count") == 221899 + and sequence_bpe.get("fit_roles") == ["pretraining_train"] + and sequence_bpe.get("vocabulary_size") == SEQUENCE_VOCAB_SIZE + and sequence_bpe.get("vocabulary_sha256") == SEQUENCE_VOCABULARY_SHA256, + "final sequence train-only BPE fit binding changed", + ) + source_bindings = sequence_summary.get("source_bindings") + _require( + type(source_bindings) is dict + and source_bindings.get("pretokenizer") == SEQUENCE_BPE_SOURCE_SHA256 + and source_bindings.get("tree_runtime") == SEQUENCE_TREE_SOURCE_SHA256 + and source_bindings.get("vocabulary") == SEQUENCE_VOCABULARY_SHA256, + "final sequence runtime source binding changed", + ) + token_to_id = sequence_vocabulary.get("token_to_id") + special_tokens = sequence_vocabulary.get("special_tokens") + _require( + type(token_to_id) is dict + and len(token_to_id) == SEQUENCE_VOCAB_SIZE + and set(token_to_id.values()) == set(range(SEQUENCE_VOCAB_SIZE)), + "final sequence vocabulary ID domain changed", + ) + _require( + special_tokens + == { + "[PAD]": 0, + "[UNK]": 1, + "[START]": 2, + "[END]": 3, + "[MASK]": 4, + "[BRANCH_OPEN]": 5, + "[BRANCH_CLOSE]": 6, + "[LINK]": 7, + "[MOD]": 8, + "[RESIDUE_ERROR]": 9, + }, + "final sequence reserved-token map changed", + ) + authority, authority_sha = _read_bound_json( + MS_PACKAGE_ROOT / MS_AUTHORITY_NAME, + MS_AUTHORITY_SHA256, + label="final MS authority", + ) + receipt, receipt_sha = _read_bound_json( + MS_PACKAGE_ROOT / MS_RECEIPT_NAME, + MS_RECEIPT_SHA256, + label="final MS receipt", + ) + certificate, certificate_sha = _read_bound_json( + MS_PACKAGE_ROOT / MS_CERTIFICATE_NAME, + MS_CERTIFICATE_SHA256, + label="final MS independent certificate", + ) + runtime_source = _read_regular_nofollow( + MS_RUNTIME_SOURCE_PATH, + label="final MS runtime source", + ) + runtime_sha = _sha256(runtime_source) + _require(runtime_sha == MS_RUNTIME_SHA256, "final MS runtime source hash changed") + for name, document in ( + ("authority", authority), + ("receipt", receipt), + ("certificate", certificate), + ): + _require(document.get("training_authorized") is False, f"MS {name} training flag changed") + _require( + document.get("scientific_launch_authorized") is False, + f"MS {name} scientific-launch flag changed", + ) + counts = authority.get("counts") + _require( + type(counts) is dict + and counts.get("train_parent_count") == 2455 + and counts.get("train_acquisition_count") == 175483 + and counts.get("development_parent_count") == 580 + and counts.get("development_acquisition_count") == 49573, + "final MS authority population changed", + ) + null_ruler = authority.get("null_ruler") + _require(type(null_ruler) is dict, "final MS null ruler is absent") + _require(null_ruler.get("development_rows_used_for_fit") == 0, "MS null used development rows") + _require( + math.isclose(float(null_ruler.get("scale")), MS_NULL_SCALE, rel_tol=0.0, abs_tol=0.0), + "final MS null scale changed", + ) + implementation = authority.get("implementation") + _require( + type(implementation) is dict + and implementation.get("name") == MS_RUNTIME_SOURCE_PATH.name + and implementation.get("sha256") == runtime_sha, + "final MS runtime source binding changed", + ) + for name, document in (("receipt", receipt), ("certificate", certificate)): + binding = document.get("authority") + _require( + type(binding) is dict and binding.get("sha256") == MS_AUTHORITY_SHA256, + f"MS {name} no longer binds the final authority", + ) + checks = certificate.get("checks") + _require(type(checks) is dict and len(checks) == 41 and all(value is True for value in checks.values()), "MS independent certificate is incomplete") + for required in ( + "one_shared_replacement_route_per_selected_physical_pair", + "exact_3_over_20_pair_count_boundaries_n20_n40_pass", + "static_state_then_parent_nesting_kept_separate", + "training_and_scientific_launch_false", + ): + _require(checks.get(required) is True, f"MS independent certificate lacks {required}") + return MappingProxyType( + { + "r4_source": R4_SOURCE_SHA256, + "r4_lineage_receipt": lineage_sha, + "topology_loss_source": FROZEN_TOPOLOGY_LOSS_SOURCE_SHA256, + "sequence_receipt": sequence_receipt_sha, + "sequence_summary": sequence_summary_sha, + "sequence_vocabulary": sequence_vocabulary_sha, + "sequence_bpe_source": SEQUENCE_BPE_SOURCE_SHA256, + "sequence_tree_source": SEQUENCE_TREE_SOURCE_SHA256, + "ms_authority": authority_sha, + "ms_receipt": receipt_sha, + "ms_certificate": certificate_sha, + "ms_runtime": runtime_sha, + } + ) + + +def validate_r5_config(config: NativeEightConfig) -> None: + """Validate inherited architecture plus the immutable production BPE size.""" + + _require(type(config) is NativeEightConfig, "r5 config type changed") + config.validate() + if not config.isolated_test_fixture: + _require( + config.seq_vocab_size == SEQUENCE_VOCAB_SIZE, + "production sequence vocabulary must match the final bound BPE package", + ) + + +def validate_sequence_surface( + config: NativeEightConfig, + *, + token_ids: torch.Tensor, + attention_mask: torch.Tensor, + residue_ids: torch.Tensor, + branch_depths: torch.Tensor, + linkage_types: torch.Tensor, + labels: Optional[torch.Tensor], +) -> torch.Tensor: + attention = _r4.validate_sequence_surface( + config, + token_ids=token_ids, + attention_mask=attention_mask, + residue_ids=residue_ids, + branch_depths=branch_depths, + linkage_types=linkage_types, + labels=labels, + ) + invalid_depth = branch_depths.gt(69) & branch_depths.ne(202) + _require( + not invalid_depth.any(), + "sequence branch depth must be an exact observed 0-69 value or unknown 202", + ) + return attention + + +def topology_parent_losses_inverse_bpe( + token_pair_predictions: torch.Tensor, + *, + sequence_residue_ids: torch.Tensor, + sequence_attention: torch.Tensor, + topology_labels: torch.Tensor, + topology_available: torch.Tensor, +) -> tuple[torch.Tensor, torch.Tensor]: + """Frozen R3 token-error MSE with 1/(2*k_r*k_s) replica weights.""" + + _r4.validate_topology_surface( + labels=topology_labels, + available=topology_available, + sequence_residue_ids=sequence_residue_ids, + sequence_attention=sequence_attention, + ) + _require( + token_pair_predictions.ndim == 3 + and token_pair_predictions.shape[0] == sequence_residue_ids.shape[0] + and token_pair_predictions.shape[1:] == sequence_residue_ids.shape[1:] * 2, + "topology token-pair predictions are misaligned", + ) + parent_losses: list[torch.Tensor] = [] + parent_indices: list[int] = [] + for parent in topology_available.nonzero(as_tuple=False).squeeze(-1).tolist(): + residues = sequence_residue_ids[parent] + active_positions = sequence_attention[parent] & residues.ge(0) + residue_count = int(torch.unique(residues[active_positions]).numel()) + represented = residues[active_positions] + multiplicity = torch.bincount(represented, minlength=residue_count) + _require( + multiplicity.shape[0] == residue_count and multiplicity.gt(0).all(), + "topology residue lacks a BPE representative", + ) + safe = residues.clamp_min(0).clamp_max(residue_count - 1) + left = safe.unsqueeze(1) + right = safe.unsqueeze(0) + valid = active_positions.unsqueeze(1) & active_positions.unsqueeze(0) & left.ne(right) + denominator = ( + 2.0 + * multiplicity.index_select(0, safe).to(torch.float64).unsqueeze(1) + * multiplicity.index_select(0, safe).to(torch.float64).unsqueeze(0) + ) + weights64 = torch.where(valid, denominator.reciprocal(), torch.zeros_like(denominator)) + pair_mass64 = weights64.sum() + expected_mass = residue_count * (residue_count - 1) / 2 + _require( + math.isclose(float(pair_mass64.detach().cpu()), expected_mass, rel_tol=1e-10, abs_tol=1e-10), + "topology inverse-multiplicity mass changed", + ) + # The frozen mathematical objective is retained, but accumulation is + # forced out of FP16/BF16 under AMP so valid max-envelope errors cannot + # overflow or perturb the exact inverse-multiplicity mass check. + loss_dtype = torch.float64 if token_pair_predictions.dtype == torch.float64 else torch.float32 + weights = weights64.to(device=token_pair_predictions.device, dtype=loss_dtype) + targets = topology_labels[parent, :residue_count, :residue_count][left, right].to( + device=token_pair_predictions.device, + dtype=loss_dtype, + ) + pair_mass = weights.sum() + squared_token_errors = (token_pair_predictions[parent].to(loss_dtype) - targets).square() + parent_losses.append((squared_token_errors * weights).sum() / pair_mass) + parent_indices.append(parent) + if not parent_losses: + return ( + token_pair_predictions.new_empty((0,)), + torch.empty((0,), dtype=torch.long, device=token_pair_predictions.device), + ) + return ( + torch.stack(parent_losses), + torch.tensor(parent_indices, dtype=torch.long, device=token_pair_predictions.device), + ) + + +def _expected_selected_units(unit_count: int) -> int: + _require(type(unit_count) is int and unit_count > 0, "mask unit count must be positive") + return max(1, (3 * unit_count) // 20) + + +def validate_ms_surface( + *, + batch_size: int, + token_ids: torch.Tensor, + attention_mask: torch.Tensor, + input_mask: torch.Tensor, + labels: Optional[torch.Tensor], + acquisition_parent_indices: torch.Tensor, + parent_available: torch.Tensor, + mode: str, +) -> torch.Tensor: + """Validate original TOP30 grammar and one shared route per selected pair.""" + + _integer_tensor(token_ids, "MS token IDs") + attention = _bool_tensor(attention_mask, "MS attention") + masked = _bool_tensor(input_mask, "MS input mask") + _integer_tensor(acquisition_parent_indices, "MS acquisition parent indices") + available = _bool_tensor(parent_available, "MS parent availability") + _require(mode in {"train", "development"}, "MS mode must be train or development") + _require(token_ids.ndim == 2 and 0 < token_ids.shape[1] <= 64, "MS acquisitions must be [acquisition,<=64]") + _require(token_ids.shape == attention.shape == masked.shape, "MS token/attention/mask arrays are misaligned") + _require(acquisition_parent_indices.shape == (token_ids.shape[0],), "MS acquisition-parent axis is misaligned") + _require(available.shape == (batch_size,), "MS availability must be one flag per parent") + _require(not acquisition_parent_indices.lt(0).any() and not acquisition_parent_indices.ge(batch_size).any(), "MS acquisition parent index outside batch") + _require(not token_ids.lt(0).any() and not token_ids.ge(242).any(), "MS token outside 0-241") + _contiguous_prefix(attention, "MS attention") + lengths = attention.sum(dim=1) + _require(not lengths.lt(6).any(), "MS acquisition is shorter than one peak envelope") + prefix = torch.tensor((0, 3, 5), device=token_ids.device, dtype=token_ids.dtype) + _require(token_ids[:, :3].eq(prefix).all(), "MS no-RT prefix changed") + _require(token_ids.gather(1, lengths.sub(1).unsqueeze(1)).squeeze(1).eq(1).all(), "MS end token changed") + _require(not ((~attention) & token_ids.ne(2)).any(), "MS padding token changed") + _require(not (masked & ~attention).any(), "MS padding is input-masked") + selected = None + if labels is not None: + _integer_tensor(labels, "MS labels") + _require(labels.shape == token_ids.shape, "MS labels are misaligned") + selected = labels.ne(-100) + _require(not (selected & ~attention).any(), "MS padding carries a target") + _require(not (masked & ~selected).any(), "MS input mask is outside selected targets") + else: + _require(not masked.any(), "MS input masking requires labels") + + for acquisition in range(token_ids.shape[0]): + length = int(lengths[acquisition].item()) + body = token_ids[acquisition, 3 : length - 1] + _require(body.numel() > 0 and body.numel() % 2 == 0, "MS peak-pair body changed") + input_pairs = body.reshape(-1, 2) + _require((input_pairs[:, 0].ge(29) & input_pairs[:, 0].le(241)).all(), "MS m/z input outside family") + _require(torch.isin(input_pairs[:, 1], torch.tensor((26, 27, 28), device=token_ids.device)).all(), "MS intensity input outside family") + original_pairs = input_pairs.clone() + if selected is not None: + allowed = torch.zeros_like(selected[acquisition]) + allowed[3 : length - 1] = True + _require(not (selected[acquisition] & ~allowed).any(), "MS target occurs outside the peak-pair body") + selected_pairs = selected[acquisition, 3 : length - 1].reshape(-1, 2) + selected_counts = selected_pairs.sum(dim=1) + _require(((selected_counts == 0) | (selected_counts == 2)).all(), "MS targets split an m/z-intensity physical pair") + expected = _expected_selected_units(input_pairs.shape[0]) + _require(int(selected_counts.eq(2).sum().item()) == expected, "MS selected-pair count is not max(1,floor(3N/20))") + mask_pairs = masked[acquisition, 3 : length - 1].reshape(-1, 2) + mask_counts = mask_pairs.sum(dim=1) + _require(((mask_counts == 0) | (mask_counts == 2)).all(), "MS mask route split a physical pair") + label_pairs = labels[acquisition, 3 : length - 1].reshape(-1, 2) + chosen = selected_counts.eq(2) + original_pairs[chosen] = label_pairs[chosen] + _require((label_pairs[chosen, 0].ge(29) & label_pairs[chosen, 0].le(241)).all(), "MS m/z target outside family") + _require(torch.isin(label_pairs[chosen, 1], torch.tensor((26, 27, 28), device=token_ids.device)).all(), "MS intensity target outside family") + unmasked_chosen = chosen & mask_counts.eq(0) + if unmasked_chosen.any(): + equality = input_pairs[unmasked_chosen].eq(label_pairs[unmasked_chosen]) + _require( + (equality.all(dim=1) | (~equality).all(dim=1)).all(), + "MS selected pair does not share one unchanged/random route", + ) + _require(torch.unique(original_pairs[:, 0]).numel() == original_pairs.shape[0], "MS original labels repeat an m/z bin") + + counts = torch.bincount(acquisition_parent_indices.long(), minlength=batch_size) + _require(torch.equal(counts.gt(0), available), "MS acquisitions disagree with parent availability") + if mode == "train": + _require(not counts.gt(1).any(), "training must select exactly one deterministic acquisition per available parent") + _same_device( + token_ids, + { + "MS attention": attention, + "MS mask": masked, + "MS labels": labels, + "MS acquisition parents": acquisition_parent_indices, + "MS availability": available, + }, + ) + return attention + + +def ms_parent_losses( + logits: torch.Tensor, + *, + labels: torch.Tensor, + attention_mask: torch.Tensor, + acquisition_parent_indices: torch.Tensor, + batch_size: int, +) -> tuple[torch.Tensor, torch.Tensor]: + if labels.shape[0] == 0: + return logits.new_empty((0,)), torch.empty((0,), dtype=torch.long, device=logits.device) + return _r4.ms_parent_losses( + logits, + labels=labels, + attention_mask=attention_mask, + acquisition_parent_indices=acquisition_parent_indices, + batch_size=batch_size, + ) + + +def validate_static_surface( + *, + batch_size: int, + token_ids: torch.Tensor, + attention_mask: torch.Tensor, + residue_ids: torch.Tensor, + slot_ids: torch.Tensor, + state_mask: torch.Tensor, + state_ids: torch.Tensor, + input_mask: torch.Tensor, + labels: Optional[torch.Tensor], + parent_available: torch.Tensor, + sequence_residue_ids: torch.Tensor, + sequence_attention: torch.Tensor, +) -> torch.Tensor: + attention = _r4.validate_static_surface( + batch_size=batch_size, + token_ids=token_ids, + attention_mask=attention_mask, + residue_ids=residue_ids, + slot_ids=slot_ids, + state_mask=state_mask, + state_ids=state_ids, + input_mask=input_mask, + labels=labels, + parent_available=parent_available, + sequence_residue_ids=sequence_residue_ids, + sequence_attention=sequence_attention, + ) + if labels is None: + _require(not input_mask.any(), "static input masking requires labels") + return attention + selected = labels.ne(-100) + lengths = attention.sum(dim=-1) + for parent, state in state_mask.nonzero(as_tuple=False).tolist(): + length = int(lengths[parent, state].item()) + unit_count = length // 4 + chosen = selected[parent, state, :length].reshape(unit_count, 4) + chosen_count = chosen.sum(dim=1) + expected = _expected_selected_units(unit_count) + _require(int(chosen_count.eq(4).sum().item()) == expected, "static selected-tuple count is not max(1,floor(3N/20))") + masked = input_mask[parent, state, :length].reshape(unit_count, 4) + unmasked_chosen = chosen_count.eq(4) & masked.sum(dim=1).eq(0) + if unmasked_chosen.any(): + inputs = token_ids[parent, state, :length].reshape(unit_count, 4)[unmasked_chosen] + targets = labels[parent, state, :length].reshape(unit_count, 4)[unmasked_chosen] + equality = inputs.eq(targets) + _require( + (equality.all(dim=1) | (~equality).all(dim=1)).all(), + "static selected tuple does not share one unchanged/random route", + ) + return attention + + +def static_parent_losses( + local_logits: torch.Tensor, + *, + global_labels: torch.Tensor, + slot_ids: torch.Tensor, + attention_mask: torch.Tensor, + active_parent_indices: torch.Tensor, + active_state_indices: torch.Tensor, + batch_size: int, +) -> tuple[torch.Tensor, torch.Tensor]: + if global_labels.shape[0] == 0: + return local_logits.new_empty((0,)), torch.empty((0,), dtype=torch.long, device=local_logits.device) + return _r4.static_parent_losses( + local_logits, + global_labels=global_labels, + slot_ids=slot_ids, + attention_mask=attention_mask, + active_parent_indices=active_parent_indices, + active_state_indices=active_state_indices, + batch_size=batch_size, + ) + + +def state_then_parent_separate_from_acquisition_expansion( + *, + base_parent_hidden: torch.Tensor, + static_state_hidden: torch.Tensor, + static_state_pool: torch.Tensor, + static_state_parent_indices: torch.Tensor, + replica_parent_indices: torch.Tensor, + replica_ms_pool: torch.Tensor, + replica_ms_present: torch.Tensor, + fusion: nn.Module, +) -> torch.Tensor: + """Fuse each state per acquisition view, then average states within that view. + + Acquisition views remain a separate outer axis. The caller may subsequently + average those view representations/losses within parent, but must never pool + states before the nonlinear fusion transform. + """ + + _require(base_parent_hidden.ndim == 3 and base_parent_hidden.shape[0] > 0, "base parent hidden shape changed") + batch_size, _, hidden_size = base_parent_hidden.shape + _require(static_state_hidden.ndim == 3 and static_state_hidden.shape[1:] == base_parent_hidden.shape[1:], "static state hidden shape changed") + _require(static_state_pool.shape == (static_state_hidden.shape[0], hidden_size), "static state pool shape changed") + _integer_tensor(static_state_parent_indices, "static state parent indices") + _integer_tensor(replica_parent_indices, "acquisition replica parent indices") + present = _bool_tensor(replica_ms_present, "acquisition MS presence") + _require(static_state_parent_indices.shape == (static_state_hidden.shape[0],), "static state-parent axis changed") + _require(replica_parent_indices.ndim == 1 and replica_parent_indices.numel() > 0, "acquisition replica axis is empty") + _require(replica_ms_pool.shape == (replica_parent_indices.shape[0], hidden_size), "acquisition pool shape changed") + _require(present.shape == replica_parent_indices.shape, "acquisition presence shape changed") + _require(not static_state_parent_indices.lt(0).any() and not static_state_parent_indices.ge(batch_size).any(), "static state parent outside batch") + _require(not replica_parent_indices.lt(0).any() and not replica_parent_indices.ge(batch_size).any(), "replica parent outside batch") + if static_state_parent_indices.numel() > 1: + _require(not (static_state_parent_indices[1:] < static_state_parent_indices[:-1]).any(), "static states are not parent-major") + counts = torch.bincount(static_state_parent_indices.long(), minlength=batch_size) + replica_counts = counts.index_select(0, replica_parent_indices.long()) + effective_counts = replica_counts.clamp_min(1) + replica_axis = torch.arange(replica_parent_indices.numel(), device=replica_parent_indices.device) + combination_replica = torch.repeat_interleave(replica_axis, effective_counts) + total = int(effective_counts.sum().item()) + group_starts = torch.cumsum(effective_counts, dim=0) - effective_counts + within_group = torch.arange(total, device=replica_parent_indices.device) - torch.repeat_interleave(group_starts, effective_counts) + state_starts = torch.cumsum(counts, dim=0) - counts + repeated_state_starts = torch.repeat_interleave( + state_starts.index_select(0, replica_parent_indices.long()), + effective_counts, + ) + combination_has_state = torch.repeat_interleave(replica_counts.gt(0), effective_counts) + combination_state = repeated_state_starts + within_group + combination_parent = replica_parent_indices.index_select(0, combination_replica.long()) + combination_base = base_parent_hidden.index_select(0, combination_parent.long()) + combination_static_pool = base_parent_hidden.new_zeros((total, hidden_size)) + if static_state_hidden.shape[0] > 0 and combination_has_state.any(): + safe_state = combination_state.clamp_max(static_state_hidden.shape[0] - 1) + selected_state_hidden = static_state_hidden.index_select(0, safe_state.long()) + selected_state_pool = static_state_pool.index_select(0, safe_state.long()) + combination_base = torch.where( + combination_has_state.view(-1, 1, 1), + selected_state_hidden, + combination_base, + ) + combination_static_pool = torch.where( + combination_has_state.view(-1, 1), + selected_state_pool, + combination_static_pool, + ) + combination_ms_pool = replica_ms_pool.index_select(0, combination_replica.long()) + combination_ms_present = present.index_select(0, combination_replica.long()) + carrier = combination_has_state | combination_ms_present + residual = combination_base.new_zeros((total, hidden_size)) + if carrier.any(): + carrier_indices = carrier.nonzero(as_tuple=False).squeeze(-1) + fusion_input = torch.cat( + ( + combination_base.index_select(0, carrier_indices)[:, 0], + combination_ms_pool.index_select(0, carrier_indices), + combination_static_pool.index_select(0, carrier_indices), + ), + dim=-1, + ) + active_residual = fusion(fusion_input) + _require(active_residual.shape == (carrier_indices.numel(), hidden_size), "fusion residual shape changed") + residual = residual.index_copy(0, carrier_indices, active_residual) + combination_shared = combination_base + residual.unsqueeze(1) + view_hidden, observed = _group_mean_tensor( + combination_shared, + combination_replica, + group_count=replica_parent_indices.numel(), + ) + _require(observed.all(), "state-first acquisition view is incomplete") + return view_hidden + + +class ResidueCrossAttentionR5(_r4.ResidueCrossAttention): + """Historical global/exact alignment with bit-exact unmatched bypass.""" + + def __init__(self, config: NativeEightConfig) -> None: + super().__init__(config) + self.attention_dropout = nn.Dropout(config.attention_dropout_prob) + + def forward( + self, + sequence_hidden: torch.Tensor, + static_hidden: torch.Tensor, + sequence_residue_ids: torch.Tensor, + static_residue_ids: torch.Tensor, + sequence_attention: torch.Tensor, + static_attention: torch.Tensor, + ) -> torch.Tensor: + allowed = static_sequence_alignment_mask( + sequence_residue_ids=sequence_residue_ids, + static_residue_ids=static_residue_ids, + sequence_attention=sequence_attention, + static_attention=static_attention, + ) + query = self._split(self.query(sequence_hidden)) + key = self._split(self.key(static_hidden)) + value = self._split(self.value(static_hidden)) + scores = torch.matmul(query, key.transpose(-1, -2)) / math.sqrt(self.head_size) + scores = scores.masked_fill(~allowed.unsqueeze(1), -10_000.0) + probabilities = torch.softmax(scores, dim=-1) * allowed.unsqueeze(1).to(scores.dtype) + normalizer = probabilities.sum(dim=-1, keepdim=True) + safe_normalizer = torch.where( + normalizer.gt(0), + normalizer, + torch.ones_like(normalizer), + ) + probabilities = self.attention_dropout(probabilities / safe_normalizer) + context = torch.matmul(probabilities, value).permute(0, 2, 1, 3).contiguous() + context = context.view(sequence_hidden.shape) + updated = self.norm(sequence_hidden + self.dropout(self.output(context))) + matched_query = allowed.any(dim=-1) + return torch.where(matched_query.unsqueeze(-1), updated, sequence_hidden) + + +class NativeEightCompositeR5(_r4.NativeEightCompositeR4): + """R5 composite with exact sparse carriers and state-first fusion.""" + + training_authorized = False + scientific_launch_authorized = False + execution_certified = False + + def __init__(self, config: NativeEightConfig) -> None: + validate_r5_config(config) + self._component_bindings = verify_component_authorities() + super().__init__(config) + _require( + type(self.static_cross_attention) is _r4.ResidueCrossAttention, + "r4 static cross-attention class changed", + ) + # Preserve the already initialized parameters and exact parameter names; + # only replace the inherited forward contract. + self.static_cross_attention.__class__ = ResidueCrossAttentionR5 + self.static_cross_attention.attention_dropout = nn.Dropout( + config.attention_dropout_prob + ) + + def _freeze_disabled_exclusive_modules(self) -> None: + _r4.NativeEightCompositeR4._freeze_disabled_exclusive_modules(self) + if not self.enabled["ms"] and not self.enabled["static"]: + self.fusion.requires_grad_(False) + + def verify_live_contract(self) -> None: + _require(type(self) is NativeEightCompositeR5, "r5 composite cannot be subclassed") + _require(self.config.training_authorized is False, "config training flag changed") + _require(self.config.scientific_launch_authorized is False, "config launch flag changed") + _require(STATIC_FINAL_RELEASE_BOUND is False, "static release was silently promoted") + # Component files are reopened at construction and by the explicit + # preflight/resume hook below. A forward pass performs no filesystem + # I/O, so this guard cannot starve the GPU data path. + _require( + dict(self._component_bindings) == dict(EXPECTED_COMPONENT_BINDINGS), + "bound component authority changed", + ) + _require( + tuple((name, tuple(parameter.shape)) for name, parameter in self.named_parameters()) + == self._parameter_shape_identity, + "model parameter architecture changed after construction", + ) + for name, parameter in self.named_parameters(): + if name in self._disabled_parameter_names: + _require(parameter.requires_grad is False, f"disabled parameter re-enabled: {name}") + + def reverify_component_authorities(self) -> Mapping[str, str]: + """Exact no-follow hook for job preflight and every resume boundary.""" + + observed = verify_component_authorities() + _require(dict(observed) == dict(self._component_bindings), "live component authority changed") + return observed + + def forward( + self, + *, + seq_token_ids: torch.Tensor, + seq_attention_mask: torch.Tensor, + seq_residue_ids: torch.Tensor, + seq_branch_depths: torch.Tensor, + seq_linkage_types: torch.Tensor, + seq_labels: Optional[torch.Tensor] = None, + topology_labels: Optional[torch.Tensor] = None, + topology_available: Optional[torch.Tensor] = None, + ms_token_ids: Optional[torch.Tensor] = None, + ms_attention_mask: Optional[torch.Tensor] = None, + ms_input_mask: Optional[torch.Tensor] = None, + ms_labels: Optional[torch.Tensor] = None, + ms_acquisition_parent_indices: Optional[torch.Tensor] = None, + ms_parent_available: Optional[torch.Tensor] = None, + ms_mode: Optional[str] = None, + static_token_ids: Optional[torch.Tensor] = None, + static_attention_mask: Optional[torch.Tensor] = None, + static_residue_ids: Optional[torch.Tensor] = None, + static_slot_ids: Optional[torch.Tensor] = None, + static_state_mask: Optional[torch.Tensor] = None, + static_state_ids: Optional[torch.Tensor] = None, + static_input_mask: Optional[torch.Tensor] = None, + static_labels: Optional[torch.Tensor] = None, + static_parent_available: Optional[torch.Tensor] = None, + ) -> NativeEightOutput: + self.verify_live_contract() + sequence_attention = validate_sequence_surface( + self.config, + token_ids=seq_token_ids, + attention_mask=seq_attention_mask, + residue_ids=seq_residue_ids, + branch_depths=seq_branch_depths, + linkage_types=seq_linkage_types, + labels=seq_labels, + ) + batch_size = seq_token_ids.shape[0] + sequence_hidden = _run_layers( + self.sequence_embeddings(seq_token_ids, seq_branch_depths, seq_linkage_types), + sequence_attention, + self.sequence_layers, + ) + + topology_predictions: Optional[torch.Tensor] = None + topology_loss: Optional[torch.Tensor] = None + topology_loss_indices: Optional[torch.Tensor] = None + topology_bundle = self._bundle_presence( + {"labels": topology_labels, "availability": topology_available}, + "topology target", + ) + if not self.enabled["topology"]: + _require(not topology_bundle, "disabled topology branch received payload") + else: + projected = self.topology_projection(sequence_hidden) + pair_hidden = torch.abs(projected.unsqueeze(2) - projected.unsqueeze(1)) + topology_predictions = self.topology_head(pair_hidden).squeeze(-1) + if topology_bundle: + topology_loss, topology_loss_indices = topology_parent_losses_inverse_bpe( + topology_predictions, + sequence_residue_ids=seq_residue_ids, + sequence_attention=sequence_attention, + topology_labels=topology_labels, + topology_available=topology_available, + ) + + empty_parent_indices = torch.empty((0,), dtype=torch.long, device=seq_token_ids.device) + cross_state_hidden = sequence_hidden.new_empty((0, sequence_hidden.shape[1], sequence_hidden.shape[2])) + projected_state_pool = sequence_hidden.new_empty((0, sequence_hidden.shape[2])) + active_parents = empty_parent_indices + active_states = empty_parent_indices + static_logits: Optional[torch.Tensor] = None + static_loss: Optional[torch.Tensor] = None + static_loss_indices: Optional[torch.Tensor] = None + static_core = { + "token_ids": static_token_ids, + "attention": static_attention_mask, + "residues": static_residue_ids, + "slots": static_slot_ids, + "states": static_state_mask, + "state_ids": static_state_ids, + "input_mask": static_input_mask, + "availability": static_parent_available, + } + static_bundle = self._bundle_presence(static_core, "static") + if not self.enabled["static"]: + _require(not static_bundle and static_labels is None, "disabled static branch received payload") + else: + _require(static_bundle, "enabled static branch requires the complete state bundle") + static_attention = validate_static_surface( + batch_size=batch_size, + token_ids=static_token_ids, + attention_mask=static_attention_mask, + residue_ids=static_residue_ids, + slot_ids=static_slot_ids, + state_mask=static_state_mask, + state_ids=static_state_ids, + input_mask=static_input_mask, + labels=static_labels, + parent_available=static_parent_available, + sequence_residue_ids=seq_residue_ids, + sequence_attention=sequence_attention, + ) + active_coordinates = static_state_mask.nonzero(as_tuple=False) + active_parents = active_coordinates[:, 0] + active_states = active_coordinates[:, 1] + if active_coordinates.shape[0] > 0: + active_token_ids = static_token_ids[active_parents, active_states] + active_attention = static_attention[active_parents, active_states] + active_residue_ids = static_residue_ids[active_parents, active_states] + active_slot_ids = static_slot_ids[active_parents, active_states] + active_input_mask = static_input_mask[active_parents, active_states] + static_hidden = _run_layers( + self.static_embeddings(active_token_ids, active_slot_ids, active_input_mask), + active_attention, + self.static_layers, + ) + static_logits = self.static_head(static_hidden, active_slot_ids, active_attention) + cross_state_hidden = self.static_cross_attention( + sequence_hidden.index_select(0, active_parents), + static_hidden, + seq_residue_ids.index_select(0, active_parents), + active_residue_ids, + sequence_attention.index_select(0, active_parents), + active_attention, + ) + valid_weights = active_attention.to(static_hidden.dtype).unsqueeze(-1) + state_pool = (static_hidden * valid_weights).sum(dim=1) / valid_weights.sum(dim=1) + projected_state_pool = self.static_projection(state_pool) + if static_labels is not None: + static_loss, static_loss_indices = static_parent_losses( + static_logits, + global_labels=static_labels[active_parents, active_states], + slot_ids=active_slot_ids, + attention_mask=active_attention, + active_parent_indices=active_parents, + active_state_indices=active_states, + batch_size=batch_size, + ) + else: + static_logits = sequence_hidden.new_empty((0, static_token_ids.shape[-1], 1024)) + if static_labels is not None: + static_loss = sequence_hidden.new_empty((0,)) + static_loss_indices = empty_parent_indices + + ms_logits: Optional[torch.Tensor] = None + ms_loss: Optional[torch.Tensor] = None + ms_loss_indices: Optional[torch.Tensor] = None + acquisition_pool = sequence_hidden.new_empty((0, sequence_hidden.shape[-1])) + ms_core = { + "token_ids": ms_token_ids, + "attention": ms_attention_mask, + "input_mask": ms_input_mask, + "parent_indices": ms_acquisition_parent_indices, + "availability": ms_parent_available, + "mode": ms_mode, + } + ms_bundle = self._bundle_presence(ms_core, "MS acquisition") + if not self.enabled["ms"]: + _require(not ms_bundle and ms_labels is None, "disabled MS branch received payload") + else: + _require(ms_bundle, "enabled MS branch requires the complete acquisition bundle") + ms_attention = validate_ms_surface( + batch_size=batch_size, + token_ids=ms_token_ids, + attention_mask=ms_attention_mask, + input_mask=ms_input_mask, + labels=ms_labels, + acquisition_parent_indices=ms_acquisition_parent_indices, + parent_available=ms_parent_available, + mode=ms_mode, + ) + if ms_token_ids.shape[0] > 0: + ms_hidden = _run_layers( + self.ms_embeddings(ms_token_ids, ms_input_mask), + ms_attention, + self.ms_layers, + ) + ms_logits = self.ms_head(ms_hidden) + acquisition_pool = self.ms_projection(_first_token_pool(ms_hidden, ms_attention)) + if ms_labels is not None: + ms_loss, ms_loss_indices = ms_parent_losses( + ms_logits, + labels=ms_labels, + attention_mask=ms_attention, + acquisition_parent_indices=ms_acquisition_parent_indices, + batch_size=batch_size, + ) + else: + ms_logits = sequence_hidden.new_empty((0, ms_token_ids.shape[1], 242)) + if ms_labels is not None: + ms_loss = sequence_hidden.new_empty((0,)) + ms_loss_indices = empty_parent_indices + + if self.enabled["ms"]: + missing_parents = (~ms_parent_available).nonzero(as_tuple=False).squeeze(-1) + replica_parent_indices = torch.cat((ms_acquisition_parent_indices.long(), missing_parents.long())) + replica_ms_pool = torch.cat( + ( + acquisition_pool, + sequence_hidden.new_zeros((missing_parents.numel(), sequence_hidden.shape[-1])), + ) + ) + replica_ms_present = torch.cat( + ( + torch.ones(ms_acquisition_parent_indices.numel(), dtype=torch.bool, device=seq_token_ids.device), + torch.zeros(missing_parents.numel(), dtype=torch.bool, device=seq_token_ids.device), + ) + ) + else: + replica_parent_indices = torch.arange(batch_size, device=seq_token_ids.device) + replica_ms_pool = sequence_hidden.new_zeros((batch_size, sequence_hidden.shape[-1])) + replica_ms_present = torch.zeros(batch_size, dtype=torch.bool, device=seq_token_ids.device) + _require(torch.unique(replica_parent_indices).numel() == batch_size, "fusion replica axis omitted a sequence parent") + shared_replica_hidden = state_then_parent_separate_from_acquisition_expansion( + base_parent_hidden=sequence_hidden, + static_state_hidden=cross_state_hidden, + static_state_pool=projected_state_pool, + static_state_parent_indices=active_parents, + replica_parent_indices=replica_parent_indices, + replica_ms_pool=replica_ms_pool, + replica_ms_present=replica_ms_present, + fusion=self.fusion, + ) + sequence_logits = self.sequence_head(shared_replica_hidden) + shared_parent_hidden, observed_sequence = _group_mean_tensor( + shared_replica_hidden, + replica_parent_indices, + group_count=batch_size, + ) + _require(observed_sequence.all(), "shared parent representation is incomplete") + + sequence_loss: Optional[torch.Tensor] = None + sequence_loss_indices: Optional[torch.Tensor] = None + if seq_labels is not None: + sequence_loss, sequence_loss_indices = _r4._token_parent_losses( + sequence_logits, + seq_labels, + replica_parent_indices, + batch_size=batch_size, + ) + _require( + torch.equal(sequence_loss_indices, torch.arange(batch_size, device=seq_token_ids.device)), + "sequence parent loss axis changed", + ) + + parent_losses = MappingProxyType( + {"sequence": sequence_loss, "topology": topology_loss, "ms": ms_loss, "static": static_loss} + ) + loss_parent_indices = MappingProxyType( + { + "sequence": sequence_loss_indices, + "topology": topology_loss_indices, + "ms": ms_loss_indices, + "static": static_loss_indices, + } + ) + for objective in OBJECTIVES: + if not self.enabled[objective]: + _require(parent_losses[objective] is None, f"disabled {objective} objective executed") + _require(loss_parent_indices[objective] is None, f"disabled {objective} objective emitted indices") + return NativeEightOutput( + cell_id=self.config.cell_id, + sequence_logits=sequence_logits, + sequence_replica_parent_indices=replica_parent_indices, + shared_parent_hidden=shared_parent_hidden, + topology_token_pair_predictions=topology_predictions, + ms_logits=ms_logits, + static_local_logits=static_logits, + parent_losses=parent_losses, + loss_parent_indices=loss_parent_indices, + ) + + +def contract_summary() -> dict[str, Any]: + return { + "schema": SCHEMA, + "status": "PREPARATION_ONLY_R5_STATIC_RELEASE_ABSENT_LAUNCH_CLOSED", + "cells": list(CELL_ORDER), + "component_bindings": dict(verify_component_authorities()), + "sequence_vocab_size": SEQUENCE_VOCAB_SIZE, + "sequence_package": SEQUENCE_PACKAGE_ROOT.name, + "static_final_release_bound": STATIC_FINAL_RELEASE_BOUND, + "training_authorized": TRAINING_AUTHORIZED, + "scientific_launch_authorized": SCIENTIFIC_LAUNCH_AUTHORIZED, + "execution_certified": EXECUTION_CERTIFIED, + "static_alignment": "first_sequence_token_global; exact_residue_pieces_same_residue_only", + "static_unmatched_query_policy": "bit_exact_sequence_hidden_bypass_no_static_gradient", + "joint_view_reduction": "per_state_nonlinear_fusion_then_equal_state_hidden_within_each_acquisition_view_then_equal_acquisition_view_within_parent", + "zero_carrier_policy": "enabled sparse micros return empty objective carriers; external planner proves step completeness", + "fusion_zero_policy": "no MS/static carrier means exact zero residual and no fusion forward", + "mask_contract": "max(1,floor(3N/20)); one shared 80/10/10 route per MS pair or static four-code tuple", + "topology_loss": "frozen_R3_per_token_squared_error_weight_1_over_2krks", + "ms_grammar": "unique m/z bins checked on reconstructed original labels; random-input collision permitted", + "branch_depth_domain": "0..69_or_explicit_unknown_202", + "affinose_supported": AFFINOSE_SUPPORTED, + "downstream_supported": DOWNSTREAM_SUPPORTED, + } + + +__all__ = [ + "AFFINOSE_SUPPORTED", + "CELL_BITS", + "CELL_ORDER", + "CompositeError", + "DOWNSTREAM_SUPPORTED", + "MS_AUTHORITY_SHA256", + "MS_CERTIFICATE_SHA256", + "MS_NULL_SCALE", + "MS_RECEIPT_SHA256", + "NativeEightCompositeR5", + "NativeEightConfig", + "NativeEightOutput", + "OBJECTIVES", + "R5BootstrapError", + "ResidueCrossAttentionR5", + "SCHEMA", + "SEQUENCE_VOCAB_SIZE", + "STATIC_FINAL_RELEASE_BOUND", + "contract_summary", + "ms_parent_losses", + "state_then_parent_separate_from_acquisition_expansion", + "static_parent_losses", + "static_sequence_alignment_mask", + "topology_parent_losses_inverse_bpe", + "validate_r5_config", + "validate_ms_surface", + "validate_sequence_surface", + "validate_static_surface", + "verify_component_authorities", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_executor_r5.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_executor_r5.py new file mode 100644 index 0000000000000000000000000000000000000000..914fd6b9ed18ee6c663079353f49baa02d190dc3 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_executor_r5.py @@ -0,0 +1,1745 @@ +"""Launch-closed production executor successor for the native A5 eight cells. + +This isolated module binds the final r5 composite and balanced planner by exact +bytes. It executes the composite's real per-parent loss vectors with the +planner's exact ``(S / N_o) * sum(parent losses in step)`` law. Sparse +objectives may be absent from individual microbatches. Only parameters left +active by the composite enter AdamW. + +The final static-v2 EGNN/RVQ token package and train-only null authority are +still absent. Static-active production construction and every launch flag +therefore remain closed. Small CPU fixtures may exercise the complete control +flow but cannot authorize training, Nova submission, AFFINose, or downstream +execution. +""" + +from __future__ import annotations + +import copy +import hashlib +import io +import json +import math +import os +from pathlib import Path +import random +import stat +import struct +import sys +import tempfile +from contextlib import nullcontext +from dataclasses import asdict, dataclass +from types import MappingProxyType, ModuleType +from typing import Any, Callable, Mapping, Optional, Sequence + +import numpy as np +import torch + + +SCHEMA = "bertose_a5_native_eight_production_executor_20260721_r5" +RESUME_SCHEMA = "bertose_a5_native_eight_optimizer_boundary_resume_20260721_r5" +DEVELOPMENT_SCHEMA = "bertose_a5_native_eight_fixed_development_20260721_r5" +SELECTION_SCHEMA = "bertose_a5_native_eight_strict_lower_selection_20260721_r5" +CHECKPOINT_SCHEMA = "bertose_a5_native_eight_atomic_checkpoint_20260721_r5" + +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +EXECUTION_CERTIFIED = False +NOVA_SUBMISSION_AUTHORIZED = False +AFFINOSE_SUPPORTED = False +DOWNSTREAM_SUPPORTED = False +STATIC_FINAL_RELEASE_BOUND = False + +MAX_EPOCHS = 100 +PATIENCE = 15 +EARLIEST_STOP_EPOCH = 16 +MILESTONE_EPOCHS = (25, 50, 75, 100) +SHELL_DENOMINATOR = 4.0 +COMMON_SEED = 43 + +WRITING_ROOT = Path(__file__).absolute().parents[4] +RUNTIME_ROOT = Path(__file__).absolute().parent +COMPOSITE_SOURCE_PATH = RUNTIME_ROOT / "review_a5_native_eight_composite_r5.py" +PLANNER_SOURCE_PATH = RUNTIME_ROOT / "review_a5_native_eight_balanced_planner_r5.py" +COMPOSITE_SOURCE_SHA256 = "24c35257fc61e1c9c77630d2b0075775a7f46b6500ecb5f175ef8f42bd214e0e" +PLANNER_SOURCE_SHA256 = "1b9b05c812603db7b216aa989214a3c3715f80032b3a8b82577ae2b9e48f048d" +PLANNER_CERTIFICATE_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_native_eight_balanced_planner_r5_certificate_20260721_r1" + / "review_a5_native_eight_balanced_planner_r5_certificate_r1.md" +) +PLANNER_CERTIFICATE_SHA256 = "4b3198f26e45d84ffced87280e7ac6cd59932bb92cf4da66db1eefb099b897bf" + +SEQUENCE_NULL_ROOT = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1" +) +SEQUENCE_NULL_NAME = "review_a5_official_sequence_train_only_null.json" +SEQUENCE_NULL_RECEIPT_NAME = "review_a5_official_sequence_train_only_null_receipt.json" +SEQUENCE_MASK_RUNTIME_NAME = "review_frozen_sequence_masking_runtime.py" +SEQUENCE_NULL_SHA256 = "b10556643abf560b9e8622e8ae67936d2d3ca8867433db485e785f31d049a8fb" +SEQUENCE_NULL_RECEIPT_SHA256 = "f4eb239f56e472d57dd3a3848c1a6c142e193cb326320ac8bf134b96ac35102a" +SEQUENCE_MASK_RUNTIME_SHA256 = "831bebd2dcf6a8308d01ec62eb6e1132fe7edbbc666c1c83787335acc576b19c" +SEQUENCE_NULL_SCALE = 4.9674945244448905 + +TOPOLOGY_NULL_ROOT = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1" +) +TOPOLOGY_NULL_NAME = "review_a5_official_topology_train_only_null.json" +TOPOLOGY_NULL_RECEIPT_NAME = "review_a5_official_topology_train_only_null_receipt.json" +TOPOLOGY_NULL_SHA256 = "a752ffd350fbe38aa0e6f6b42b76137f4f72d76fa9a7f5d3609bc47c65c552de" +TOPOLOGY_NULL_RECEIPT_SHA256 = "dace4cb5df71912f5aa7531bb0ce87db3b63d726b2a12aa41facabf9d54b5c35" +TOPOLOGY_NULL_SCALE = 2.0932970080357696 +MS_NULL_SCALE = 3.006098541980086 +STATIC_NULL_SCALE: None = None +STATIC_NULL_AUTHORITY_SHA256: None = None + + +class NativeEightExecutorError(RuntimeError): + """Raised whenever an execution, selection, or resume gate drifts.""" + + +class ExecutorBootstrapError(NativeEightExecutorError): + """Raised when an exact source or authority cannot be reopened safely.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightExecutorError(message) + + +def _valid_sha256(value: object) -> bool: + return ( + type(value) is str + and len(value) == 64 + and all(character in "0123456789abcdef" for character in value) + ) + + +def _sha256(payload: bytes) -> str: + return hashlib.sha256(payload).hexdigest() + + +def _read_regular_nofollow(path: Path, *, label: str) -> bytes: + if not hasattr(os, "O_NOFOLLOW") or not hasattr(os, "O_DIRECTORY"): + raise ExecutorBootstrapError("platform lacks complete no-follow traversal") + absolute = Path(path) + if not absolute.is_absolute(): + raise ExecutorBootstrapError(f"{label} path is not absolute") + parts = absolute.parts + if not parts or parts[0] != os.sep or any(part in {"", ".", ".."} for part in parts[1:]): + raise ExecutorBootstrapError(f"{label} path is not canonical") + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + descriptor: Optional[int] = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in parts[1:-1]: + next_descriptor = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = next_descriptor + leaf_descriptor = os.open(parts[-1], leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf_descriptor + metadata = os.fstat(descriptor) + if not stat.S_ISREG(metadata.st_mode): + raise ExecutorBootstrapError(f"{label} is not a regular no-follow file") + chunks: list[bytes] = [] + while True: + chunk = os.read(descriptor, 1024 * 1024) + if not chunk: + break + chunks.append(chunk) + payload = b"".join(chunks) + if len(payload) != metadata.st_size: + raise ExecutorBootstrapError(f"{label} changed while reading") + return payload + except OSError as error: + raise ExecutorBootstrapError(f"{label} no-follow open failed: {error}") from error + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + + +def _load_bound_module(path: Path, expected_sha256: str, *, label: str) -> ModuleType: + source = _read_regular_nofollow(path, label=label) + if _sha256(source) != expected_sha256: + raise ExecutorBootstrapError(f"{label} hash changed") + module_name = f"_review_a5_executor_bound_{label.replace(' ', '_')}_{id(source)}" + module = ModuleType(module_name) + module.__file__ = os.fspath(path) + module.__package__ = "" + sys.modules[module_name] = module + exec(compile(source, os.fspath(path), "exec"), module.__dict__) + return module + + +_composite = _load_bound_module( + COMPOSITE_SOURCE_PATH, + COMPOSITE_SOURCE_SHA256, + label="native-eight composite r5", +) +_planner = _load_bound_module( + PLANNER_SOURCE_PATH, + PLANNER_SOURCE_SHA256, + label="native-eight balanced planner r5", +) + +NativeEightCompositeR5 = _composite.NativeEightCompositeR5 +NativeEightConfig = _composite.NativeEightConfig +NativeEightOutput = _composite.NativeEightOutput +FrozenEpochPlan = _planner.FrozenEpochPlan +OBJECTIVES = tuple(_planner.OBJECTIVES) +CELL_ORDER = tuple(_planner.CELL_ORDER) +build_test_fixture_epoch_plan = _planner.build_test_fixture_epoch_plan + + +def _read_bound_json( + path: Path, + expected_sha256: str, + *, + label: str, +) -> tuple[dict[str, Any], str]: + payload = _read_regular_nofollow(path, label=label) + observed = _sha256(payload) + _require(observed == expected_sha256, f"{label} hash changed") + try: + value = json.loads(payload.decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise ExecutorBootstrapError(f"{label} is not readable canonical JSON") from error + _require(type(value) is dict, f"{label} JSON root changed") + return value, observed + + +def _false_release_flags(document: Mapping[str, Any], *, label: str) -> None: + for field in ( + "training_authorized", + "scientific_launch_authorized", + "gpu_launch_authorized", + "nova_submission_authorized", + "checkpoint_resume_authorized", + "downstream_evaluation_authorized", + ): + _require(document.get(field) is False, f"{label} {field} changed") + + +def verify_execution_authorities() -> Mapping[str, str]: + """Reopen the exact composite/planner and three available null rulers.""" + + composite_source = _read_regular_nofollow( + COMPOSITE_SOURCE_PATH, + label="native-eight composite r5 source", + ) + planner_source = _read_regular_nofollow( + PLANNER_SOURCE_PATH, + label="native-eight planner r5 source", + ) + planner_certificate = _read_regular_nofollow( + PLANNER_CERTIFICATE_PATH, + label="native-eight planner r5 certificate", + ) + _require(_sha256(composite_source) == COMPOSITE_SOURCE_SHA256, "composite r5 hash changed") + _require(_sha256(planner_source) == PLANNER_SOURCE_SHA256, "planner r5 hash changed") + _require( + _sha256(planner_certificate) == PLANNER_CERTIFICATE_SHA256, + "planner r5 certificate hash changed", + ) + component_bindings = dict(_composite.verify_component_authorities()) + _require(component_bindings == dict(_composite.EXPECTED_COMPONENT_BINDINGS), "composite component authorities changed") + planner_summary = _planner.contract_summary() + _require(planner_summary.get("training_authorized") is False, "planner training flag changed") + _require(planner_summary.get("scientific_launch_authorized") is False, "planner launch flag changed") + _require(planner_summary.get("sparse_objective_law") == "S_over_N_o_times_sum_parent_losses_in_step", "planner sparse law changed") + + sequence_null, sequence_null_sha = _read_bound_json( + SEQUENCE_NULL_ROOT / SEQUENCE_NULL_NAME, + SEQUENCE_NULL_SHA256, + label="final sequence null authority", + ) + sequence_receipt, sequence_receipt_sha = _read_bound_json( + SEQUENCE_NULL_ROOT / SEQUENCE_NULL_RECEIPT_NAME, + SEQUENCE_NULL_RECEIPT_SHA256, + label="final sequence null receipt", + ) + topology_null, topology_null_sha = _read_bound_json( + TOPOLOGY_NULL_ROOT / TOPOLOGY_NULL_NAME, + TOPOLOGY_NULL_SHA256, + label="final topology null authority", + ) + topology_receipt, topology_receipt_sha = _read_bound_json( + TOPOLOGY_NULL_ROOT / TOPOLOGY_NULL_RECEIPT_NAME, + TOPOLOGY_NULL_RECEIPT_SHA256, + label="final topology null receipt", + ) + mask_runtime = _read_regular_nofollow( + SEQUENCE_NULL_ROOT / SEQUENCE_MASK_RUNTIME_NAME, + label="final fixed-mask runtime source", + ) + mask_runtime_sha = _sha256(mask_runtime) + _require(mask_runtime_sha == SEQUENCE_MASK_RUNTIME_SHA256, "fixed-mask runtime source hash changed") + for name, document in ( + ("sequence null authority", sequence_null), + ("sequence null receipt", sequence_receipt), + ("topology null authority", topology_null), + ("topology null receipt", topology_receipt), + ): + _false_release_flags(document, label=name) + sequence_result = sequence_null.get("result") + _require( + type(sequence_result) is dict + and sequence_result.get("fit_role") == "pretraining_train_only_sequence_objective_eligible" + and sequence_result.get("parent_count") == 221827 + and sequence_result.get("vocabulary_size") == 2114 + and float(sequence_result.get("scale")).hex() == SEQUENCE_NULL_SCALE.hex(), + "final sequence null result changed", + ) + _require( + sequence_null.get("source_bindings", {}).get("sequence_receipt") + == _composite.SEQUENCE_RECEIPT_SHA256, + "sequence null no longer binds the final sequence package", + ) + _require( + sequence_null.get("source_bindings", {}).get("masking_runtime") + == SEQUENCE_MASK_RUNTIME_SHA256, + "sequence null fixed-mask source binding changed", + ) + _require( + sequence_receipt.get("summary", {}).get("sha256") == SEQUENCE_NULL_SHA256, + "sequence null receipt summary binding changed", + ) + topology_result = topology_null.get("result") + _require( + type(topology_result) is dict + and topology_result.get("fit_role") == "pretraining_train_only_preserved_structure_gate" + and topology_result.get("parent_count") == 71914 + and topology_result.get("unordered_pair_count") == 1635514 + and float(topology_result.get("scale")).hex() == TOPOLOGY_NULL_SCALE.hex(), + "final topology null result changed", + ) + _require( + topology_receipt.get("summary", {}).get("sha256") == TOPOLOGY_NULL_SHA256, + "topology null receipt summary binding changed", + ) + _require(float(_composite.MS_NULL_SCALE).hex() == MS_NULL_SCALE.hex(), "final MS null scale changed") + return MappingProxyType( + { + "composite_source": COMPOSITE_SOURCE_SHA256, + "planner_source": PLANNER_SOURCE_SHA256, + "planner_certificate": PLANNER_CERTIFICATE_SHA256, + "sequence_null": sequence_null_sha, + "sequence_null_receipt": sequence_receipt_sha, + "sequence_mask_runtime": mask_runtime_sha, + "topology_null": topology_null_sha, + "topology_null_receipt": topology_receipt_sha, + "ms_authority": component_bindings["ms_authority"], + "ms_runtime": component_bindings["ms_runtime"], + } + ) + + +EXPECTED_EXECUTION_BINDINGS = MappingProxyType(dict(verify_execution_authorities())) + + +def production_null_scales() -> Mapping[str, Optional[float]]: + return MappingProxyType( + { + "sequence": SEQUENCE_NULL_SCALE, + "topology": TOPOLOGY_NULL_SCALE, + "ms": MS_NULL_SCALE, + "static": STATIC_NULL_SCALE, + } + ) + + +def _canonical_bytes(value: object) -> bytes: + return ( + json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False) + + "\n" + ).encode("utf-8") + + +def canonical_sha256(value: object, *, domain: str) -> str: + return hashlib.sha256(domain.encode("ascii") + b"\0" + _canonical_bytes(value)).hexdigest() + + +def _recursive_state_sha256(value: Any) -> str: + digest = hashlib.sha256(b"bertose-a5-native-eight-executor-state-r5\0") + + def update(item: Any) -> None: + if isinstance(item, torch.Tensor): + tensor = item.detach().cpu().contiguous() + digest.update(b"tensor\0" + str(tensor.dtype).encode("ascii") + b"\0") + digest.update(_canonical_bytes(list(tensor.shape))) + digest.update(tensor.reshape(-1).view(torch.uint8).numpy().tobytes(order="C")) + elif isinstance(item, np.ndarray): + array = np.ascontiguousarray(item) + digest.update(b"ndarray\0" + str(array.dtype).encode("ascii") + b"\0") + digest.update(_canonical_bytes(list(array.shape))) + digest.update(array.tobytes(order="C")) + elif isinstance(item, Mapping): + digest.update(b"mapping\0") + for key in sorted(item, key=lambda observed: str(observed)): + update(str(key)) + update(item[key]) + elif isinstance(item, (list, tuple)): + digest.update(b"sequence\0" + struct.pack("!Q", len(item))) + for child in item: + update(child) + elif item is None or isinstance(item, (str, int, float, bool)): + digest.update(b"scalar\0" + _canonical_bytes(item)) + else: + raise NativeEightExecutorError( + f"state hash encountered unsupported type {type(item).__name__}" + ) + + update(value) + return digest.hexdigest() + + +def _runtime_source_sha256() -> str: + return _sha256( + _read_regular_nofollow(Path(__file__).absolute(), label="native-eight executor r5 source") + ) + + +def _capture_rng_state() -> dict[str, Any]: + return { + "python": random.getstate(), + "numpy": copy.deepcopy(np.random.get_state()), + "torch": torch.get_rng_state().clone(), + "cuda": ( + [state.clone() for state in torch.cuda.get_rng_state_all()] + if torch.cuda.is_available() + else [] + ), + "cuda_available": torch.cuda.is_available(), + "cuda_device_count": torch.cuda.device_count() if torch.cuda.is_available() else 0, + } + + +def _restore_rng_state(state: Mapping[str, Any]) -> None: + _require( + set(state) + == { + "python", + "numpy", + "torch", + "cuda", + "cuda_available", + "cuda_device_count", + }, + "RNG state fields changed", + ) + current_cuda = torch.cuda.is_available() + current_count = torch.cuda.device_count() if current_cuda else 0 + _require( + state["cuda_available"] is current_cuda + and state["cuda_device_count"] == current_count + and len(state["cuda"]) == current_count, + "RNG restore CUDA identity changed", + ) + random.setstate(state["python"]) + np.random.set_state(state["numpy"]) + torch.set_rng_state(state["torch"]) + if current_cuda: + torch.cuda.set_rng_state_all(state["cuda"]) + + +def _model_state_sha256(model: torch.nn.Module) -> str: + return _recursive_state_sha256(model.state_dict()) + + +def _preclip_gradient_norm(parameters: Sequence[torch.nn.Parameter]) -> float: + squares = [ + parameter.grad.detach().double().square().sum() + for parameter in parameters + if parameter.grad is not None + ] + if not squares: + return 0.0 + return float(torch.stack(squares).sum().sqrt().item()) + + +@dataclass(frozen=True, slots=True) +class AdamWContract: + learning_rate: float = 5e-5 + weight_decay: float = 0.01 + beta1: float = 0.9 + beta2: float = 0.999 + epsilon: float = 1e-8 + max_grad_norm: float = 1.0 + + def validate(self) -> None: + for name in ( + "learning_rate", + "weight_decay", + "beta1", + "beta2", + "epsilon", + "max_grad_norm", + ): + value = getattr(self, name) + _require(type(value) is float and math.isfinite(value), f"AdamW {name} is invalid") + _require(self.learning_rate > 0, "AdamW learning rate must be positive") + _require(self.weight_decay >= 0, "AdamW weight decay must be nonnegative") + _require(0 <= self.beta1 < 1 and 0 <= self.beta2 < 1, "AdamW beta changed") + _require(self.epsilon > 0 and self.max_grad_norm > 0, "AdamW epsilon/clip is invalid") + + +@dataclass(frozen=True, slots=True) +class PlannedMicrobatch: + parent_indices: tuple[int, ...] + parent_ids: tuple[str, ...] + model_inputs: Mapping[str, Any] + + +@dataclass(frozen=True, slots=True) +class StepDiagnostic: + epoch: int + optimizer_step_index: int + plan_sha256: str + input_sha256: str + objective_parent_counts: Mapping[str, int] + objective_parent_sums: Mapping[str, Optional[float]] + objective_globally_normalized_losses: Mapping[str, Optional[float]] + combined_normalized_loss: float + zero_carrier_micro_counts: Mapping[str, int] + pre_clip_grad_norm: float + clip_applied: bool + amp_retry_count: int + amp_skip_observed: bool + model_sha256_before: str + model_sha256_after: str + next_optimizer_step: int + training_authorized: bool = False + scientific_launch_authorized: bool = False + + +class NativeEightProductionExecutor: + """Execute real r5 composite losses at exact planner boundaries.""" + + training_authorized = False + scientific_launch_authorized = False + execution_certified = False + + def __init__( + self, + model: NativeEightCompositeR5, + *, + adamw: AdamWContract = AdamWContract(), + scheduler_factory: Optional[Callable[[torch.optim.Optimizer], Any]] = None, + grad_scaler: Optional[Any] = None, + autocast_context_factory: Optional[Callable[[], Any]] = None, + max_amp_retries: int = 2, + isolated_test_null_scales: Optional[Mapping[str, float]] = None, + ) -> None: + _require(type(model) is NativeEightCompositeR5, "executor requires exact r5 composite") + model.verify_live_contract() + self.component_bindings = verify_execution_authorities() + _require( + dict(self.component_bindings) == dict(EXPECTED_EXECUTION_BINDINGS), + "executor authority set changed", + ) + self.model = model + self.cell_id = model.config.cell_id + self.coefficients = dict(_planner.cell_coefficients(self.cell_id)) + adamw.validate() + self.adamw = adamw + fixture = model.config.isolated_test_fixture + if fixture: + _require( + isolated_test_null_scales is not None + and set(isolated_test_null_scales) == set(OBJECTIVES), + "isolated executor requires four fixture null scales", + ) + self.null_scales = { + objective: float(isolated_test_null_scales[objective]) + for objective in OBJECTIVES + } + else: + _require(isolated_test_null_scales is None, "production executor received fixture null scales") + _require( + not self.coefficients["static"], + "static-active production execution is blocked until final static null authority", + ) + self.null_scales = { + "sequence": SEQUENCE_NULL_SCALE, + "topology": TOPOLOGY_NULL_SCALE, + "ms": MS_NULL_SCALE, + # Planner validates all four slots even when the coefficient is + # zero. This sentinel is never used while static is disabled. + "static": 1.0, + } + _require( + all(math.isfinite(value) and value > 0 for value in self.null_scales.values()), + "executor null scale is not finite positive", + ) + + groups = [ + group + for group in model.optimizer_parameter_groups(weight_decay=adamw.weight_decay) + if group["params"] + ] + self.optimizer = torch.optim.AdamW( + groups, + lr=adamw.learning_rate, + betas=(adamw.beta1, adamw.beta2), + eps=adamw.epsilon, + ) + optimizer_parameters = [ + parameter + for group in self.optimizer.param_groups + for parameter in group["params"] + ] + active_parameters = [parameter for parameter in model.parameters() if parameter.requires_grad] + _require( + len(optimizer_parameters) == len({id(parameter) for parameter in optimizer_parameters}), + "AdamW repeats an active parameter", + ) + _require( + {id(parameter) for parameter in optimizer_parameters} + == {id(parameter) for parameter in active_parameters}, + "AdamW omits an active parameter or includes a disabled parameter", + ) + self.active_parameter_names = tuple( + name for name, parameter in model.named_parameters() if parameter.requires_grad + ) + self.disabled_parameter_names = tuple( + name for name, parameter in model.named_parameters() if not parameter.requires_grad + ) + self.optimizer_contract_sha256 = canonical_sha256( + { + "class": "torch.optim.AdamW", + "hyperparameters": asdict(adamw), + "active_parameter_names": list(self.active_parameter_names), + "group_weight_decays": [float(group["weight_decay"]) for group in self.optimizer.param_groups], + }, + domain="bertose-a5-native-eight-adamw-r5", + ) + self.scheduler = scheduler_factory(self.optimizer) if scheduler_factory is not None else None + self.grad_scaler = grad_scaler + if grad_scaler is not None: + for method in ( + "state_dict", + "load_state_dict", + "scale", + "unscale_", + "step", + "update", + "get_scale", + ): + _require(hasattr(grad_scaler, method), f"AMP scaler lacks {method}") + _require( + type(max_amp_retries) is int and max_amp_retries >= 0, + "AMP retry bound is invalid", + ) + self.max_amp_retries = max_amp_retries + self.autocast_context_factory = ( + autocast_context_factory + if autocast_context_factory is not None + else lambda: nullcontext() + ) + self.runtime_source_sha256 = _runtime_source_sha256() + self.bound_plan: Optional[FrozenEpochPlan] = None + self.next_optimizer_step = 0 + self.diagnostics: list[StepDiagnostic] = [] + + def bind_epoch_plan(self, plan: FrozenEpochPlan) -> None: + _require(type(plan) is FrozenEpochPlan, "executor plan type changed") + _planner.verify_plan_identity(plan) + if self.bound_plan is None: + _require(plan.epoch == 0, "fresh executor must bind epoch zero") + else: + _require( + self.next_optimizer_step == self.bound_plan.optimizer_step_count, + "executor changed epoch before finishing the current plan", + ) + _require(plan.epoch == self.bound_plan.epoch + 1, "executor epoch sequence changed") + self.bound_plan = plan + self.next_optimizer_step = 0 + + def _validate_micros( + self, + plan: FrozenEpochPlan, + micros: Sequence[PlannedMicrobatch], + ) -> None: + _require( + len(micros) == _planner.MICROBATCHES_PER_STEP, + "executor requires exactly four planned microbatches", + ) + step_indices = plan.step_parent_indices(self.next_optimizer_step) + step_ids = plan.step_parent_ids(self.next_optimizer_step) + for micro, (left, right) in zip( + micros, + plan.step_micro_slices(self.next_optimizer_step), + ): + _require(type(micro) is PlannedMicrobatch, "executor microbatch type changed") + _require(micro.parent_indices == step_indices[left:right], "micro parent indices differ from plan") + _require(micro.parent_ids == step_ids[left:right], "micro parent IDs differ from plan") + _require(isinstance(micro.model_inputs, Mapping), "micro model inputs are absent") + sequence_tokens = micro.model_inputs.get("seq_token_ids") + _require( + isinstance(sequence_tokens, torch.Tensor) + and sequence_tokens.ndim == 2 + and sequence_tokens.shape[0] == len(micro.parent_indices), + "micro sequence batch axis differs from the plan", + ) + + def execute_step(self, micros: Sequence[PlannedMicrobatch]) -> StepDiagnostic: + plan = self.bound_plan + _require(plan is not None, "executor has no bound epoch plan") + _planner.verify_plan_identity(plan) + _require( + 0 <= self.next_optimizer_step < plan.optimizer_step_count, + "executor optimizer cursor is outside the plan", + ) + self._validate_micros(plan, micros) + self.model.reverify_component_authorities() + _require( + _runtime_source_sha256() == self.runtime_source_sha256, + "executor source changed after construction", + ) + step_index = self.next_optimizer_step + input_surface = [ + { + "parent_indices": list(micro.parent_indices), + "parent_ids": list(micro.parent_ids), + "model_inputs": micro.model_inputs, + } + for micro in micros + ] + input_sha256 = _recursive_state_sha256(input_surface) + retry_rng = _capture_rng_state() + model_before_state = copy.deepcopy(self.model.state_dict()) + optimizer_before_state = copy.deepcopy(self.optimizer.state_dict()) + scaler_before_state = ( + copy.deepcopy(self.grad_scaler.state_dict()) + if self.grad_scaler is not None + else None + ) + model_before_sha256 = _model_state_sha256(self.model) + optimizer_before_sha256 = _recursive_state_sha256(optimizer_before_state) + disabled_before_sha256 = _recursive_state_sha256( + { + name: parameter.detach().clone() + for name, parameter in self.model.named_parameters() + if not parameter.requires_grad + } + ) + amp_retry_count = 0 + amp_skip_observed = False + final_parent_losses: Optional[dict[str, Optional[list[list[tuple[int, float]]]]]] = None + final_parent_sums: Optional[dict[str, Optional[float]]] = None + final_counts: Optional[dict[str, int]] = None + pre_clip = 0.0 + clip_applied = False + + while True: + if amp_retry_count: + _restore_rng_state(retry_rng) + _require( + _recursive_state_sha256(input_surface) == input_sha256, + "effective-step input bytes changed before AMP replay", + ) + self.optimizer.zero_grad(set_to_none=True) + self.model.train() + objective_losses: dict[str, Optional[list[list[tuple[int, float]]]]] = { + objective: ([] if self.coefficients[objective] else None) + for objective in OBJECTIVES + } + objective_sums: dict[str, Optional[float]] = { + objective: (0.0 if self.coefficients[objective] else None) + for objective in OBJECTIVES + } + zero_carrier_micros = dict.fromkeys(OBJECTIVES, 0) + + step_bits = plan.step_availability_bits(step_index) + for micro, (left, right) in zip(micros, plan.step_micro_slices(step_index)): + with self.autocast_context_factory(): + output = self.model(**dict(micro.model_inputs)) + _require(type(output) is NativeEightOutput, "composite output type changed") + _require(output.cell_id == self.cell_id, "composite output cell changed") + micro_bits = step_bits[left:right] + micro_total: Optional[torch.Tensor] = None + for objective in OBJECTIVES: + losses = output.parent_losses[objective] + local_indices = output.loss_parent_indices[objective] + if not self.coefficients[objective]: + _require( + losses is None and local_indices is None, + f"disabled {objective} emitted parent losses", + ) + continue + _require( + isinstance(losses, torch.Tensor) + and isinstance(local_indices, torch.Tensor) + and losses.ndim == local_indices.ndim == 1 + and losses.shape == local_indices.shape, + f"enabled {objective} parent-loss vector is absent", + ) + _require(torch.isfinite(losses).all().item(), f"{objective} parent loss is nonfinite") + if objective == "sequence": + expected_global = micro.parent_indices + else: + bit = {"topology": 0b100, "ms": 0b010, "static": 0b001}[objective] + expected_global = tuple( + parent_index + for parent_index, flags in zip(micro.parent_indices, micro_bits) + if flags & bit + ) + observed_local = tuple(int(index) for index in local_indices.detach().cpu().tolist()) + _require( + all(0 <= index < len(micro.parent_indices) for index in observed_local), + f"{objective} emitted a local parent outside the micro", + ) + observed_global = tuple(micro.parent_indices[index] for index in observed_local) + _require(observed_global == expected_global, f"{objective} parent-loss identity differs from plan") + if not observed_global: + zero_carrier_micros[objective] += 1 + continue + factor = ( + float(plan.global_factors[objective]) + / self.null_scales[objective] + / SHELL_DENOMINATOR + ) + contribution = losses.sum() * factor + micro_total = contribution if micro_total is None else micro_total + contribution + detached_values = [float(value) for value in losses.detach().cpu().tolist()] + rows = list(zip(observed_global, detached_values)) + objective_losses[objective].append(rows) # type: ignore[union-attr] + objective_sums[objective] = math.fsum( + (float(objective_sums[objective]), *detached_values) + ) + _require(micro_total is not None, "microbatch produced no active gradient term") + if self.grad_scaler is None: + micro_total.backward() + else: + self.grad_scaler.scale(micro_total).backward() + + detached_total, detached_normalized, detached_counts = _planner.combine_cell_step_losses( + plan, + cell_id=self.cell_id, + step_index=step_index, + objective_micro_parent_losses=objective_losses, + null_scales=self.null_scales, + ) + _require(math.isfinite(float(detached_total)), "detached exact planner loss is nonfinite") + if self.grad_scaler is not None: + self.grad_scaler.unscale_(self.optimizer) + active_parameters = [parameter for parameter in self.model.parameters() if parameter.requires_grad] + pre_clip = _preclip_gradient_norm(active_parameters) + finite_gradients = math.isfinite(pre_clip) + if self.grad_scaler is None: + _require(finite_gradients, "non-AMP gradient norm is nonfinite") + clip_applied = finite_gradients and pre_clip > self.adamw.max_grad_norm + if finite_gradients: + torch.nn.utils.clip_grad_norm_( + active_parameters, + self.adamw.max_grad_norm, + error_if_nonfinite=True, + ) + + skipped = False + if self.grad_scaler is None: + self.optimizer.step() + else: + old_scale = float(self.grad_scaler.get_scale()) + self.grad_scaler.step(self.optimizer) + self.grad_scaler.update() + skipped = float(self.grad_scaler.get_scale()) < old_scale + if not finite_gradients and not skipped: + self.model.load_state_dict(model_before_state, strict=True) + self.optimizer.load_state_dict(optimizer_before_state) + self.grad_scaler.load_state_dict(scaler_before_state) + self.optimizer.zero_grad(set_to_none=True) + _restore_rng_state(retry_rng) + raise NativeEightExecutorError( + "AMP scaler failed to skip a nonfinite unscaled gradient" + ) + if not skipped: + _require(finite_gradients, "successful AMP step retained nonfinite gradients") + final_parent_losses = objective_losses + final_parent_sums = objective_sums + final_counts = {objective: int(detached_counts[objective]) for objective in OBJECTIVES} + final_normalized = { + objective: ( + None + if detached_normalized[objective] is None + else float(detached_normalized[objective]) + ) + for objective in OBJECTIVES + } + final_total = float(detached_total) + final_zero_carrier = zero_carrier_micros + break + + amp_skip_observed = True + amp_retry_count += 1 + if ( + _model_state_sha256(self.model) != model_before_sha256 + or _recursive_state_sha256(self.optimizer.state_dict()) + != optimizer_before_sha256 + ): + self.model.load_state_dict(model_before_state, strict=True) + self.optimizer.load_state_dict(optimizer_before_state) + self.grad_scaler.load_state_dict(scaler_before_state) + self.optimizer.zero_grad(set_to_none=True) + _restore_rng_state(retry_rng) + raise NativeEightExecutorError("AMP skip mutated model or optimizer state") + if amp_retry_count > self.max_amp_retries: + self.model.load_state_dict(model_before_state, strict=True) + self.optimizer.load_state_dict(optimizer_before_state) + self.grad_scaler.load_state_dict(scaler_before_state) + self.optimizer.zero_grad(set_to_none=True) + _restore_rng_state(retry_rng) + raise NativeEightExecutorError( + f"AMP retry bound exhausted after {amp_retry_count} skipped attempts" + ) + + _require(final_parent_losses is not None and final_parent_sums is not None and final_counts is not None, "successful step diagnostics are absent") + if self.scheduler is not None: + self.scheduler.step() + disabled_after_sha256 = _recursive_state_sha256( + { + name: parameter.detach().clone() + for name, parameter in self.model.named_parameters() + if not parameter.requires_grad + } + ) + _require( + disabled_after_sha256 == disabled_before_sha256, + "disabled parameter changed through gradient or AdamW decay", + ) + for name, parameter in self.model.named_parameters(): + if not parameter.requires_grad: + _require(parameter.grad is None, f"disabled parameter {name} received a gradient") + model_after_sha256 = _model_state_sha256(self.model) + self.optimizer.zero_grad(set_to_none=True) + self.next_optimizer_step += 1 + diagnostic = StepDiagnostic( + epoch=plan.epoch, + optimizer_step_index=step_index, + plan_sha256=plan.plan_sha256, + input_sha256=input_sha256, + objective_parent_counts=MappingProxyType(final_counts), + objective_parent_sums=MappingProxyType(final_parent_sums), + objective_globally_normalized_losses=MappingProxyType(final_normalized), + combined_normalized_loss=final_total, + zero_carrier_micro_counts=MappingProxyType(final_zero_carrier), + pre_clip_grad_norm=pre_clip, + clip_applied=clip_applied, + amp_retry_count=amp_retry_count, + amp_skip_observed=amp_skip_observed, + model_sha256_before=model_before_sha256, + model_sha256_after=model_after_sha256, + next_optimizer_step=self.next_optimizer_step, + ) + self.diagnostics.append(diagnostic) + return diagnostic + + +@dataclass(frozen=True, slots=True) +class DevelopmentBatch: + parent_ids: tuple[str, ...] + model_inputs: Mapping[str, Any] + + +def fixed_development_surface_sha256(batches: Sequence[DevelopmentBatch]) -> str: + _require(bool(batches), "fixed development surface is empty") + normalized: list[dict[str, Any]] = [] + seen: set[str] = set() + for batch in batches: + _require(type(batch) is DevelopmentBatch, "development batch type changed") + _require(batch.parent_ids and all(type(value) is str and value for value in batch.parent_ids), "development parent ID is blank") + _require(not (seen & set(batch.parent_ids)), "development parent repeats across batches") + seen.update(batch.parent_ids) + tokens = batch.model_inputs.get("seq_token_ids") + _require( + isinstance(tokens, torch.Tensor) + and tokens.ndim == 2 + and tokens.shape[0] == len(batch.parent_ids), + "development sequence batch axis changed", + ) + normalized.append( + { + "parent_ids": list(batch.parent_ids), + # Hash every tensor and scalar input, not just boolean masks: + # random/unchanged replacement routes also alter token IDs. + "model_inputs": batch.model_inputs, + } + ) + return _recursive_state_sha256(normalized) + + +@dataclass(frozen=True, slots=True) +class FixedDevelopmentContract: + surface_sha256: str + eligible_parent_ids: Mapping[str, tuple[str, ...]] + + def validate(self) -> None: + _require(_valid_sha256(self.surface_sha256), "development surface identity is not SHA-256") + _require(set(self.eligible_parent_ids) == set(OBJECTIVES), "development objective roster changed") + for objective in OBJECTIVES: + values = self.eligible_parent_ids[objective] + _require(type(values) is tuple, f"{objective} development roster is not frozen") + _require( + all(type(value) is str and value for value in values) + and len(values) == len(set(values)), + f"{objective} development roster is blank or duplicated", + ) + _require(bool(self.eligible_parent_ids["sequence"]), "development sequence roster is empty") + + @property + def contract_sha256(self) -> str: + self.validate() + return canonical_sha256( + { + "schema": DEVELOPMENT_SCHEMA, + "surface_sha256": self.surface_sha256, + "eligible_parent_ids": { + objective: list(self.eligible_parent_ids[objective]) + for objective in OBJECTIVES + }, + "mask_stream": "fixed_seed0_epoch0_no_caller_control", + "training_authorized": False, + "scientific_launch_authorized": False, + }, + domain=DEVELOPMENT_SCHEMA, + ) + + +@dataclass(frozen=True, slots=True) +class DevelopmentResult: + raw_parent_means: Mapping[str, Optional[float]] + normalized_losses: Mapping[str, Optional[float]] + parent_counts: Mapping[str, int] + total_normalized_loss: float + surface_sha256: str + contract_sha256: str + training_authorized: bool = False + scientific_launch_authorized: bool = False + + @property + def result_sha256(self) -> str: + return canonical_sha256( + { + "schema": DEVELOPMENT_SCHEMA, + "raw_parent_means": dict(self.raw_parent_means), + "normalized_losses": dict(self.normalized_losses), + "parent_counts": dict(self.parent_counts), + "total_normalized_loss": self.total_normalized_loss, + "surface_sha256": self.surface_sha256, + "contract_sha256": self.contract_sha256, + "training_authorized": False, + "scientific_launch_authorized": False, + }, + domain="bertose-a5-native-eight-development-result-r5", + ) + + +def evaluate_fixed_development( + executor: NativeEightProductionExecutor, + batches: Sequence[DevelopmentBatch], + *, + contract: FixedDevelopmentContract, + autocast_context_factory: Optional[Callable[[], Any]] = None, +) -> DevelopmentResult: + """Evaluate one immutable seed-0/epoch-0 development corruption surface.""" + + _require(type(executor) is NativeEightProductionExecutor, "development executor type changed") + contract.validate() + observed_surface = fixed_development_surface_sha256(batches) + _require(observed_surface == contract.surface_sha256, "development masks or inputs changed") + executor.model.reverify_component_authorities() + context_factory = ( + autocast_context_factory + if autocast_context_factory is not None + else executor.autocast_context_factory + ) + observed: dict[str, dict[str, float]] = {objective: {} for objective in OBJECTIVES} + seen_sequence_parents: set[str] = set() + was_training = executor.model.training + executor.model.eval() + try: + with torch.no_grad(): + for batch in batches: + _require(not (seen_sequence_parents & set(batch.parent_ids)), "development parent repeats") + seen_sequence_parents.update(batch.parent_ids) + with context_factory(): + output = executor.model(**dict(batch.model_inputs)) + _require(type(output) is NativeEightOutput, "development composite output type changed") + for objective in OBJECTIVES: + losses = output.parent_losses[objective] + local_indices = output.loss_parent_indices[objective] + if not executor.coefficients[objective]: + _require( + losses is None and local_indices is None, + f"disabled {objective} produced development losses", + ) + continue + _require( + isinstance(losses, torch.Tensor) + and isinstance(local_indices, torch.Tensor) + and losses.ndim == local_indices.ndim == 1 + and losses.shape == local_indices.shape + and torch.isfinite(losses).all().item(), + f"enabled {objective} development vector is invalid", + ) + for local_index, value in zip( + local_indices.detach().cpu().tolist(), + losses.detach().cpu().tolist(), + ): + _require( + type(local_index) is int and 0 <= local_index < len(batch.parent_ids), + f"{objective} development parent index is outside batch", + ) + parent_id = batch.parent_ids[local_index] + _require(parent_id not in observed[objective], f"{objective} development parent repeats") + numeric = float(value) + _require(math.isfinite(numeric) and numeric >= 0, f"{objective} development loss is invalid") + observed[objective][parent_id] = numeric + finally: + executor.model.train(was_training) + + raw: dict[str, Optional[float]] = {} + normalized: dict[str, Optional[float]] = {} + counts: dict[str, int] = {} + total = 0.0 + for objective in OBJECTIVES: + expected = contract.eligible_parent_ids[objective] + if executor.coefficients[objective]: + _require( + set(observed[objective]) == set(expected), + f"{objective} development roster is incomplete or contains extras", + ) + values = [observed[objective][parent_id] for parent_id in expected] + _require(bool(values), f"{objective} enabled development roster is empty") + mean = math.fsum(values) / len(values) + value = mean / executor.null_scales[objective] + raw[objective] = mean + normalized[objective] = value + counts[objective] = len(values) + total += value / SHELL_DENOMINATOR + else: + _require(not observed[objective], f"disabled {objective} accumulated development values") + raw[objective] = None + normalized[objective] = None + counts[objective] = 0 + _require(math.isfinite(total) and total >= 0, "total normalized development loss is invalid") + return DevelopmentResult( + raw_parent_means=MappingProxyType(raw), + normalized_losses=MappingProxyType(normalized), + parent_counts=MappingProxyType(counts), + total_normalized_loss=total, + surface_sha256=observed_surface, + contract_sha256=contract.contract_sha256, + ) + + +class StrictLowerSelection: + """Sequential max-100/patience-15 selection with earliest-epoch ties.""" + + def __init__(self, *, development_contract_sha256: str) -> None: + _require(_valid_sha256(development_contract_sha256), "selection development contract is invalid") + self.development_contract_sha256 = development_contract_sha256 + self.completed_epochs = 0 + self.best_epoch: Optional[int] = None + self.best_loss: Optional[float] = None + self.best_result_sha256: Optional[str] = None + self.epochs_without_improvement = 0 + self.stop_reason: Optional[str] = None + self.history: list[dict[str, Any]] = [] + + def observe(self, *, epoch: int, result: DevelopmentResult) -> dict[str, Any]: + _require(self.stop_reason is None, "selection received an epoch after stopping") + _require(type(epoch) is int and epoch == self.completed_epochs + 1, "selection epoch sequence changed") + _require(1 <= epoch <= MAX_EPOCHS, "selection epoch exceeds max100") + _require( + result.contract_sha256 == self.development_contract_sha256, + "selection development contract changed", + ) + loss = result.total_normalized_loss + _require(math.isfinite(loss) and loss >= 0, "selection loss is invalid") + improved = self.best_loss is None or loss < self.best_loss + if improved: + self.best_epoch = epoch + self.best_loss = loss + self.best_result_sha256 = result.result_sha256 + self.epochs_without_improvement = 0 + else: + self.epochs_without_improvement += 1 + self.completed_epochs = epoch + patience_stop = ( + epoch >= EARLIEST_STOP_EPOCH + and self.epochs_without_improvement >= PATIENCE + ) + if patience_stop: + self.stop_reason = "patience_exhausted" + elif epoch == MAX_EPOCHS: + self.stop_reason = "max_epochs_reached" + record = { + "epoch": epoch, + "total_normalized_loss": loss, + "development_result_sha256": result.result_sha256, + "improved": improved, + "best_epoch": self.best_epoch, + "best_loss": self.best_loss, + "epochs_without_improvement": self.epochs_without_improvement, + "should_stop": self.stop_reason is not None, + "stop_reason": self.stop_reason, + "training_authorized": False, + "scientific_launch_authorized": False, + } + self.history.append(record) + return copy.deepcopy(record) + + def state_dict(self) -> dict[str, Any]: + value = { + "schema": SELECTION_SCHEMA, + "development_contract_sha256": self.development_contract_sha256, + "completed_epochs": self.completed_epochs, + "best_epoch": self.best_epoch, + "best_loss": self.best_loss, + "best_result_sha256": self.best_result_sha256, + "epochs_without_improvement": self.epochs_without_improvement, + "stop_reason": self.stop_reason, + "history": copy.deepcopy(self.history), + "max_epochs": MAX_EPOCHS, + "patience": PATIENCE, + "earliest_stop_epoch": EARLIEST_STOP_EPOCH, + "improvement_rule": "strict_lower", + "tie_rule": "earliest_epoch_retained", + "training_authorized": False, + "scientific_launch_authorized": False, + } + return { + **value, + "selection_sha256": canonical_sha256(value, domain=SELECTION_SCHEMA), + } + + def load_state_dict(self, state: Mapping[str, Any]) -> None: + _require(state.get("schema") == SELECTION_SCHEMA, "selection resume schema changed") + unsigned = dict(state) + observed_sha = unsigned.pop("selection_sha256", None) + _require( + observed_sha == canonical_sha256(unsigned, domain=SELECTION_SCHEMA), + "selection resume digest changed", + ) + _require( + state.get("development_contract_sha256") + == self.development_contract_sha256, + "selection resume development contract changed", + ) + _require( + state.get("max_epochs") == MAX_EPOCHS + and state.get("patience") == PATIENCE + and state.get("earliest_stop_epoch") == EARLIEST_STOP_EPOCH + and state.get("improvement_rule") == "strict_lower" + and state.get("tie_rule") == "earliest_epoch_retained", + "selection policy changed on resume", + ) + completed = state.get("completed_epochs") + history = state.get("history") + _require(type(completed) is int and 0 <= completed <= MAX_EPOCHS, "selection completed epoch changed") + _require(type(history) is list and len(history) == completed, "selection history length changed") + self.completed_epochs = completed + self.best_epoch = state.get("best_epoch") + self.best_loss = state.get("best_loss") + self.best_result_sha256 = state.get("best_result_sha256") + self.epochs_without_improvement = state.get("epochs_without_improvement") + self.stop_reason = state.get("stop_reason") + self.history = copy.deepcopy(history) + + +def _optimizer_to_parameter_device(optimizer: torch.optim.Optimizer) -> None: + for group in optimizer.param_groups: + parameters = group["params"] + if not parameters: + continue + device = parameters[0].device + for state in optimizer.state.values(): + for key, value in tuple(state.items()): + if isinstance(value, torch.Tensor): + state[key] = value.to(device=device) + + +def capture_optimizer_boundary_resume( + executor: NativeEightProductionExecutor, + *, + selection: StrictLowerSelection, + development_contract: FixedDevelopmentContract, + data_cursors: Mapping[str, Any], +) -> dict[str, Any]: + """Capture every mutable training state only between optimizer steps.""" + + _require(type(executor) is NativeEightProductionExecutor, "resume executor type changed") + plan = executor.bound_plan + _require(plan is not None, "resume capture has no epoch plan") + _planner.verify_plan_identity(plan) + _require( + 0 <= executor.next_optimizer_step <= plan.optimizer_step_count, + "resume optimizer cursor is outside plan", + ) + _require( + all(parameter.grad is None for parameter in executor.model.parameters()), + "resume capture occurred inside gradient accumulation", + ) + cursor = copy.deepcopy(dict(data_cursors)) + _require( + cursor.get("optimizer_step") == executor.next_optimizer_step + and cursor.get("next_microbatch") == 0, + "data cursor is not at the optimizer boundary", + ) + development_contract.validate() + _require( + selection.development_contract_sha256 == development_contract.contract_sha256, + "resume selection/development contracts differ", + ) + _require( + _runtime_source_sha256() == executor.runtime_source_sha256, + "executor source changed before resume capture", + ) + observed_bindings = verify_execution_authorities() + _require( + dict(observed_bindings) == dict(executor.component_bindings), + "executor authorities changed before resume capture", + ) + plan_cursor = _planner.make_resume_cursor( + plan, + next_optimizer_step=executor.next_optimizer_step, + ) + rng_state = _capture_rng_state() + payload = { + "model_state": copy.deepcopy(executor.model.state_dict()), + "optimizer_state": copy.deepcopy(executor.optimizer.state_dict()), + "scheduler_state": ( + copy.deepcopy(executor.scheduler.state_dict()) + if executor.scheduler is not None + else None + ), + "scaler_state": ( + copy.deepcopy(executor.grad_scaler.state_dict()) + if executor.grad_scaler is not None + else None + ), + "rng_state": rng_state, + "plan_cursor": plan_cursor, + "data_cursors": cursor, + "selection_state": selection.state_dict(), + "cell_id": executor.cell_id, + "null_scales": copy.deepcopy(executor.null_scales), + "optimizer_contract_sha256": executor.optimizer_contract_sha256, + "executor_runtime_sha256": executor.runtime_source_sha256, + "execution_bindings": dict(executor.component_bindings), + "development_contract_sha256": development_contract.contract_sha256, + "static_final_release_bound": STATIC_FINAL_RELEASE_BOUND, + "static_null_authority_sha256": STATIC_NULL_AUTHORITY_SHA256, + "training_authorized": False, + "scientific_launch_authorized": False, + } + unsigned = { + "schema": RESUME_SCHEMA, + "cell_id": executor.cell_id, + "plan_sha256": plan.plan_sha256, + "plan_epoch": plan.epoch, + "next_optimizer_step": executor.next_optimizer_step, + "next_microbatch": 0, + "model_state_sha256": _recursive_state_sha256(payload["model_state"]), + "optimizer_state_sha256": _recursive_state_sha256(payload["optimizer_state"]), + "scheduler_state_sha256": _recursive_state_sha256(payload["scheduler_state"]), + "scaler_state_sha256": _recursive_state_sha256(payload["scaler_state"]), + "rng_state_sha256": _recursive_state_sha256(payload["rng_state"]), + "plan_cursor_sha256": _recursive_state_sha256(payload["plan_cursor"]), + "data_cursors_sha256": _recursive_state_sha256(payload["data_cursors"]), + "selection_state_sha256": _recursive_state_sha256(payload["selection_state"]), + "optimizer_contract_sha256": executor.optimizer_contract_sha256, + "executor_runtime_sha256": executor.runtime_source_sha256, + "execution_bindings_sha256": canonical_sha256( + payload["execution_bindings"], + domain="bertose-a5-native-eight-execution-bindings-r5", + ), + "development_contract_sha256": development_contract.contract_sha256, + "amp_enabled": executor.grad_scaler is not None, + "scheduler_enabled": executor.scheduler is not None, + "static_final_release_bound": False, + "training_authorized": False, + "scientific_launch_authorized": False, + } + return { + "payload": payload, + "envelope": { + **unsigned, + "resume_sha256": canonical_sha256(unsigned, domain=RESUME_SCHEMA), + }, + } + + +def restore_optimizer_boundary_resume( + executor: NativeEightProductionExecutor, + checkpoint: Mapping[str, Any], + *, + plan: FrozenEpochPlan, + selection: StrictLowerSelection, + development_contract: FixedDevelopmentContract, +) -> dict[str, Any]: + """Restore an exact plan-bound checkpoint into a fresh executor.""" + + _require(type(executor) is NativeEightProductionExecutor, "resume target executor type changed") + _require(executor.bound_plan is None and not executor.diagnostics, "resume target is not fresh") + _require(set(checkpoint) == {"payload", "envelope"}, "resume checkpoint fields changed") + payload = checkpoint["payload"] + envelope = checkpoint["envelope"] + _require(isinstance(payload, Mapping) and isinstance(envelope, Mapping), "resume checkpoint mapping changed") + _require(envelope.get("schema") == RESUME_SCHEMA, "resume schema changed") + unsigned = dict(envelope) + observed_resume_sha = unsigned.pop("resume_sha256", None) + _require( + observed_resume_sha == canonical_sha256(unsigned, domain=RESUME_SCHEMA), + "resume envelope digest changed", + ) + _planner.verify_plan_identity(plan) + _require( + envelope.get("plan_sha256") == plan.plan_sha256 + and envelope.get("plan_epoch") == plan.epoch, + "resume epoch plan changed", + ) + _planner.validate_resume_cursor(plan, payload.get("plan_cursor")) + next_step = payload["plan_cursor"]["next_optimizer_step"] + _require( + envelope.get("next_optimizer_step") == next_step + and envelope.get("next_microbatch") == 0 + and payload["plan_cursor"]["next_microbatch"] == 0, + "resume is not at an optimizer boundary", + ) + cursor = payload.get("data_cursors") + _require( + isinstance(cursor, Mapping) + and cursor.get("optimizer_step") == next_step + and cursor.get("next_microbatch") == 0, + "resume data cursor changed", + ) + development_contract.validate() + _require( + envelope.get("development_contract_sha256") + == payload.get("development_contract_sha256") + == development_contract.contract_sha256 + == selection.development_contract_sha256, + "resume development contract changed", + ) + _require( + envelope.get("cell_id") == payload.get("cell_id") == executor.cell_id, + "resume cell changed", + ) + _require(payload.get("null_scales") == executor.null_scales, "resume null scales changed") + _require( + envelope.get("optimizer_contract_sha256") + == payload.get("optimizer_contract_sha256") + == executor.optimizer_contract_sha256, + "resume AdamW contract changed", + ) + current_runtime = _runtime_source_sha256() + _require( + envelope.get("executor_runtime_sha256") + == payload.get("executor_runtime_sha256") + == executor.runtime_source_sha256 + == current_runtime, + "resume executor runtime changed", + ) + current_bindings = dict(verify_execution_authorities()) + _require( + payload.get("execution_bindings") == current_bindings == dict(executor.component_bindings), + "resume execution authority changed", + ) + _require( + envelope.get("execution_bindings_sha256") + == canonical_sha256( + current_bindings, + domain="bertose-a5-native-eight-execution-bindings-r5", + ), + "resume execution authority digest changed", + ) + _require( + payload.get("static_final_release_bound") is False + and envelope.get("static_final_release_bound") is False + and payload.get("static_null_authority_sha256") is None, + "resume silently promoted the static release", + ) + checks = { + "model_state_sha256": payload["model_state"], + "optimizer_state_sha256": payload["optimizer_state"], + "scheduler_state_sha256": payload["scheduler_state"], + "scaler_state_sha256": payload["scaler_state"], + "rng_state_sha256": payload["rng_state"], + "plan_cursor_sha256": payload["plan_cursor"], + "data_cursors_sha256": payload["data_cursors"], + "selection_state_sha256": payload["selection_state"], + } + for field, value in checks.items(): + _require(envelope.get(field) == _recursive_state_sha256(value), f"resume {field} changed") + scheduler_enabled = executor.scheduler is not None + amp_enabled = executor.grad_scaler is not None + _require(envelope.get("scheduler_enabled") is scheduler_enabled, "resume scheduler mode changed") + _require(envelope.get("amp_enabled") is amp_enabled, "resume AMP mode changed") + _require((payload["scheduler_state"] is not None) is scheduler_enabled, "resume scheduler state presence changed") + _require((payload["scaler_state"] is not None) is amp_enabled, "resume scaler state presence changed") + _require( + payload.get("training_authorized") is False + and payload.get("scientific_launch_authorized") is False + and envelope.get("training_authorized") is False + and envelope.get("scientific_launch_authorized") is False, + "resume checkpoint self-authorizes", + ) + + executor.model.load_state_dict(payload["model_state"], strict=True) + executor.optimizer.load_state_dict(payload["optimizer_state"]) + _optimizer_to_parameter_device(executor.optimizer) + if scheduler_enabled: + executor.scheduler.load_state_dict(payload["scheduler_state"]) + if amp_enabled: + executor.grad_scaler.load_state_dict(payload["scaler_state"]) + selection.load_state_dict(payload["selection_state"]) + _restore_rng_state(payload["rng_state"]) + executor.bound_plan = plan + executor.next_optimizer_step = next_step + executor.model.reverify_component_authorities() + executor.optimizer.zero_grad(set_to_none=True) + return copy.deepcopy(dict(cursor)) + + +def serialize_checkpoint(checkpoint: Mapping[str, Any]) -> bytes: + buffer = io.BytesIO() + torch.save(dict(checkpoint), buffer) + return buffer.getvalue() + + +def deserialize_checkpoint(payload: bytes) -> dict[str, Any]: + _require(type(payload) is bytes and payload, "checkpoint bytes are empty") + try: + value = torch.load(io.BytesIO(payload), map_location="cpu", weights_only=False) + except Exception as error: + raise NativeEightExecutorError("checkpoint bytes cannot be loaded") from error + _require(type(value) is dict, "checkpoint root changed") + return value + + +class AtomicCheckpointStore: + """Retain only atomically published latest, best, and reached milestones.""" + + def __init__(self, root: Path) -> None: + self.root = Path(root).absolute() + _require(self.root.is_dir() and not self.root.is_symlink(), "checkpoint root is not a regular directory") + + @property + def latest_path(self) -> Path: + return self.root / "review_latest_checkpoint_r5.pt" + + @property + def best_path(self) -> Path: + return self.root / "review_best_checkpoint_r5.pt" + + def milestone_path(self, epoch: int) -> Path: + _require(epoch in MILESTONE_EPOCHS, "checkpoint epoch is not a declared milestone") + return self.root / f"review_milestone_epoch_{epoch:03d}_checkpoint_r5.pt" + + def _reject_symlink_target(self, path: Path) -> None: + try: + metadata = os.lstat(path) + except FileNotFoundError: + return + _require(not stat.S_ISLNK(metadata.st_mode), f"checkpoint target is a symlink: {path.name}") + _require(stat.S_ISREG(metadata.st_mode), f"checkpoint target is not regular: {path.name}") + + def _temporary_bytes(self, payload: bytes) -> Path: + descriptor, name = tempfile.mkstemp(prefix=".review_a5_executor_r5_", dir=self.root) + temporary = Path(name) + try: + with os.fdopen(descriptor, "wb") as handle: + handle.write(payload) + handle.flush() + os.fsync(handle.fileno()) + return temporary + except Exception: + try: + temporary.unlink() + except FileNotFoundError: + pass + raise + + def _atomic_replace(self, path: Path, payload: bytes) -> None: + self._reject_symlink_target(path) + temporary = self._temporary_bytes(payload) + try: + os.replace(temporary, path) + directory_descriptor = os.open(self.root, os.O_RDONLY | os.O_DIRECTORY) + try: + os.fsync(directory_descriptor) + finally: + os.close(directory_descriptor) + finally: + try: + temporary.unlink() + except FileNotFoundError: + pass + + def _atomic_create(self, path: Path, payload: bytes) -> None: + _require(not path.exists() and not path.is_symlink(), f"milestone already exists: {path.name}") + temporary = self._temporary_bytes(payload) + try: + os.link(temporary, path) + directory_descriptor = os.open(self.root, os.O_RDONLY | os.O_DIRECTORY) + try: + os.fsync(directory_descriptor) + finally: + os.close(directory_descriptor) + except FileExistsError as error: + raise NativeEightExecutorError(f"milestone raced with an existing file: {path.name}") from error + finally: + try: + temporary.unlink() + except FileNotFoundError: + pass + + def _retained_checkpoint_names(self) -> set[str]: + return { + path.name + for path in self.root.iterdir() + if path.name.endswith("_checkpoint_r5.pt") + } + + def commit_completed_epoch( + self, + checkpoint: Mapping[str, Any], + *, + selection_record: Mapping[str, Any], + ) -> Mapping[str, str]: + epoch = selection_record.get("epoch") + _require(type(epoch) is int and 1 <= epoch <= MAX_EPOCHS, "checkpoint commit epoch changed") + _require(type(selection_record.get("improved")) is bool, "checkpoint improvement flag changed") + selection_state = checkpoint.get("payload", {}).get("selection_state", {}) + _require(selection_state.get("completed_epochs") == epoch, "checkpoint selection epoch differs from commit") + plan_epoch = checkpoint.get("envelope", {}).get("plan_epoch") + next_step = checkpoint.get("envelope", {}).get("next_optimizer_step") + _require(plan_epoch == epoch - 1, "checkpoint plan/completed epoch mismatch") + payload = serialize_checkpoint(checkpoint) + hashes: dict[str, str] = {} + self._atomic_replace(self.latest_path, payload) + hashes["latest"] = _sha256(payload) + if selection_record["improved"]: + self._atomic_replace(self.best_path, payload) + hashes["best"] = _sha256(payload) + else: + _require(self.best_path.is_file() and not self.best_path.is_symlink(), "nonimproving epoch lacks prior best") + if epoch in MILESTONE_EPOCHS: + milestone = self.milestone_path(epoch) + self._atomic_create(milestone, payload) + hashes[f"milestone_{epoch}"] = _sha256(payload) + _require(type(next_step) is int and next_step >= 0, "checkpoint optimizer boundary is invalid") + expected_names = { + self.latest_path.name, + self.best_path.name, + *( + self.milestone_path(value).name + for value in MILESTONE_EPOCHS + if value <= epoch + ), + } + _require( + self._retained_checkpoint_names() == expected_names, + "checkpoint retention contains an extra or missing checkpoint", + ) + return MappingProxyType(hashes) + + def load_latest(self) -> dict[str, Any]: + payload = _read_regular_nofollow(self.latest_path, label="latest native-eight checkpoint") + return deserialize_checkpoint(payload) + + def load_best(self) -> dict[str, Any]: + payload = _read_regular_nofollow(self.best_path, label="best native-eight checkpoint") + return deserialize_checkpoint(payload) + + +def contract_summary() -> dict[str, Any]: + return { + "schema": SCHEMA, + "status": "PREPARATION_ONLY_STATIC_FINAL_RELEASE_ABSENT_LAUNCH_CLOSED", + "cells": list(CELL_ORDER), + "bound_sources": dict(verify_execution_authorities()), + "loss_reduction": "real_composite_parent_vectors_then_S_over_N_o_step_sum_then_fixed_null_then_divide_4", + "sparse_micro_policy": "zero_carrier_micro_allowed_complete_effective_step_required", + "optimizer": "AdamW_active_parameters_only", + "amp": "same_input_and_rng_replay_bounded_retry_no_cursor_or_scheduler_advance_on_skip", + "selection": { + "maximum_epochs": MAX_EPOCHS, + "patience": PATIENCE, + "earliest_stop_epoch": EARLIEST_STOP_EPOCH, + "improvement_rule": "strict_lower", + "tie_rule": "earliest_epoch_retained", + "development_masks": "fixed_seed0_epoch0_hash_bound", + }, + "resume": "exact_model_optimizer_scheduler_scaler_rng_plan_data_selection_at_optimizer_boundary", + "checkpoint_retention": "atomic_latest_best_reached_25_50_75_100_milestones_only", + "available_null_scales": { + "sequence": SEQUENCE_NULL_SCALE, + "topology": TOPOLOGY_NULL_SCALE, + "ms": MS_NULL_SCALE, + "static": None, + }, + "static_final_release_bound": STATIC_FINAL_RELEASE_BOUND, + "training_authorized": TRAINING_AUTHORIZED, + "scientific_launch_authorized": SCIENTIFIC_LAUNCH_AUTHORIZED, + "execution_certified": EXECUTION_CERTIFIED, + "nova_submission_authorized": NOVA_SUBMISSION_AUTHORIZED, + "affinose_supported": AFFINOSE_SUPPORTED, + "downstream_supported": DOWNSTREAM_SUPPORTED, + } + + +__all__ = [ + "AFFINOSE_SUPPORTED", + "AdamWContract", + "AtomicCheckpointStore", + "CELL_ORDER", + "COMMON_SEED", + "DEVELOPMENT_SCHEMA", + "DOWNSTREAM_SUPPORTED", + "DevelopmentBatch", + "DevelopmentResult", + "EARLIEST_STOP_EPOCH", + "FixedDevelopmentContract", + "FrozenEpochPlan", + "MAX_EPOCHS", + "MILESTONE_EPOCHS", + "NativeEightCompositeR5", + "NativeEightConfig", + "NativeEightExecutorError", + "NativeEightProductionExecutor", + "OBJECTIVES", + "PATIENCE", + "PLANNER_SOURCE_SHA256", + "PlannedMicrobatch", + "SCHEMA", + "SEQUENCE_NULL_SCALE", + "SHELL_DENOMINATOR", + "STATIC_FINAL_RELEASE_BOUND", + "STATIC_NULL_AUTHORITY_SHA256", + "STATIC_NULL_SCALE", + "StepDiagnostic", + "StrictLowerSelection", + "TOPOLOGY_NULL_SCALE", + "MS_NULL_SCALE", + "capture_optimizer_boundary_resume", + "build_test_fixture_epoch_plan", + "contract_summary", + "deserialize_checkpoint", + "evaluate_fixed_development", + "fixed_development_surface_sha256", + "production_null_scales", + "restore_optimizer_boundary_resume", + "serialize_checkpoint", + "verify_execution_authorities", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_r4_lineage_receipt_r1.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_r4_lineage_receipt_r1.json new file mode 100644 index 0000000000000000000000000000000000000000..db8e145caaaab206f4d65b60b4c11a6711906597 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_r4_lineage_receipt_r1.json @@ -0,0 +1,31 @@ +{ + "current_corrected_predecessor": { + "changes_from_earlier_readback": [ + "restored the historical first sequence token to all-static-code attention rule", + "replaced mean-prediction SmoothL1 topology reduction with inverse-multiplicity per-token squared error" + ], + "current_bytes_bound_by_r5": true, + "observed_patch_timestamp_local": "2026-07-21T08:48:01+06:00", + "observed_patch_timestamp_utc": "2026-07-21T02:48:01Z", + "sha256": "52a311636e7631b97711aab63aec28e2ada47a446d1aecc1a47921d584f69f9d" + }, + "earlier_readback": { + "bytes_preserved_as_a_separate_file": false, + "readback_timestamp_local": "2026-07-21T08:42:41+06:00", + "readback_timestamp_utc": "2026-07-21T02:42:41Z", + "sha256": "0c45700a062295385d16cd23c66487633c5a18fce326c2901b1860d4a8d7abff", + "warning_fatal_tests": "19/19 PASS" + }, + "evidence": { + "creation_timestamp_local": "2026-07-21T08:33:06+06:00", + "rollout_id": "019f816c-563d-7633-8dd7-c2cf45192755", + "rollout_observation": "The earlier hash was printed before a later explicit apply_patch in the same rollout. The later patch content and filesystem modification time agree." + }, + "official_or_submitted_artifacts_modified": false, + "r4_path": "review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_composite_r4.py", + "r5_policy": "Bind the explicitly corrected 52a predecessor by exact no-follow bytes. Do not call it identical to the earlier 0c readback and do not edit r4.", + "schema": "bertose_a5_native_eight_r4_lineage_receipt_20260721_r1", + "scientific_launch_authorized": false, + "status": "PASS_LINEAGE_RECONCILED_PREPARATION_ONLY", + "training_authorized": false +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r6/review_a5_native_eight_executor_r6.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r6/review_a5_native_eight_executor_r6.py new file mode 100644 index 0000000000000000000000000000000000000000..abc6a309d2877585beef664604d980be4cfc373b --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r6/review_a5_native_eight_executor_r6.py @@ -0,0 +1,2192 @@ +"""Launch-closed native-eight executor r6 safety successor. + +R6 leaves every r5 byte unchanged and adds four fail-closed boundaries: + +* training inputs must come from one separately frozen, hash-bound adapter; + callers cannot pass arbitrary ``model_inputs`` to the executor; +* resume binds the adapter's semantic cursor and the exact scheduler, scaler, + autocast, retry, and optimizer policies; +* selection state is replayed from its epoch history instead of trusting a + self-reported best epoch or patience counter; +* checkpoints use a bounded non-pickle codec and a descriptor-anchored, + single-index transactional store. + +The final static EGNN/RVQ adapter and static null authority are not yet bound. +All launch flags therefore remain false. This module cannot submit Nova jobs, +run AFFINose, or run downstream evaluation. +""" + +from __future__ import annotations + +import copy +import fcntl +import hashlib +import inspect +import json +import math +import os +from pathlib import Path +import random +import secrets +import stat +import struct +import sys +from dataclasses import dataclass +from types import MappingProxyType, ModuleType +from typing import Any, Callable, Mapping, Optional, Sequence + +import numpy as np +import torch + + +SCHEMA = "bertose_a5_native_eight_production_executor_20260721_r6" +RESUME_SCHEMA = "bertose_a5_native_eight_optimizer_boundary_resume_20260721_r6" +SELECTION_SCHEMA = "bertose_a5_native_eight_strict_lower_selection_20260721_r6" +CHECKPOINT_CODEC_SCHEMA = "bertose_a5_safe_checkpoint_codec_20260721_r6" +CHECKPOINT_INDEX_SCHEMA = "bertose_a5_checkpoint_transaction_index_20260721_r6" +CHECKPOINT_MAGIC = b"BERTOSE-A5-R6-CKPT\x00" +CHECKPOINT_DIGEST_BYTES = 32 +MAX_MANIFEST_BYTES = 512 * 1024 * 1024 +MAX_CHECKPOINT_BYTES = 64 * 1024 * 1024 * 1024 +MAX_CODEC_DEPTH = 128 +MAX_CODEC_NODES = 20_000_000 +MAX_TENSOR_RANK = 16 + +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +EXECUTION_CERTIFIED = False +NOVA_SUBMISSION_AUTHORIZED = False +AFFINOSE_SUPPORTED = False +DOWNSTREAM_SUPPORTED = False +STATIC_FINAL_RELEASE_BOUND = False + +MAX_EPOCHS = 100 +PATIENCE = 15 +EARLIEST_STOP_EPOCH = 16 +MILESTONE_EPOCHS = (25, 50, 75, 100) + +RUNTIME_ROOT = Path(__file__).absolute().parent +R5_SOURCE_PATH = ( + RUNTIME_ROOT.parent + / "a5_pretraining_failclosed_integration_20260721_r5" + / "review_a5_native_eight_executor_r5.py" +) +R5_SOURCE_SHA256 = "a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2" + +# Filled only after the separately built production adapter is immutable and +# independently certified. ``None`` is intentionally a production hard stop. +EXPECTED_ADAPTER_SOURCE_SHA256: Optional[str] = None +EXPECTED_ADAPTER_RECEIPT_SHA256: Optional[str] = None + + +class NativeEightExecutorR6Error(RuntimeError): + """Fail-closed r6 execution, selection, resume, or storage error.""" + + +class ExecutorR6BootstrapError(NativeEightExecutorR6Error): + """An exact predecessor or dependency could not be reopened safely.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightExecutorR6Error(message) + + +def _valid_sha256(value: object) -> bool: + return ( + type(value) is str + and len(value) == 64 + and all(character in "0123456789abcdef" for character in value) + ) + + +def _sha256(payload: bytes) -> str: + return hashlib.sha256(payload).hexdigest() + + +def _canonical_bytes(value: object) -> bytes: + return ( + json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False) + + "\n" + ).encode("utf-8") + + +def canonical_sha256(value: object, *, domain: str) -> str: + return hashlib.sha256(domain.encode("ascii") + b"\0" + _canonical_bytes(value)).hexdigest() + + +def _read_regular_nofollow(path: Path, *, label: str) -> bytes: + """Read one absolute regular file through a no-follow descriptor chain.""" + + if not hasattr(os, "O_NOFOLLOW") or not hasattr(os, "O_DIRECTORY"): + raise ExecutorR6BootstrapError("platform lacks complete no-follow traversal") + absolute = Path(path) + if not absolute.is_absolute(): + raise ExecutorR6BootstrapError(f"{label} path is not absolute") + parts = absolute.parts + if not parts or parts[0] != os.sep or any(part in {"", ".", ".."} for part in parts[1:]): + raise ExecutorR6BootstrapError(f"{label} path is not canonical") + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + descriptor: Optional[int] = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in parts[1:-1]: + next_descriptor = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = next_descriptor + leaf_descriptor = os.open(parts[-1], leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf_descriptor + metadata = os.fstat(descriptor) + if not stat.S_ISREG(metadata.st_mode): + raise ExecutorR6BootstrapError(f"{label} is not a regular no-follow file") + pieces: list[bytes] = [] + while True: + block = os.read(descriptor, 1024 * 1024) + if not block: + break + pieces.append(block) + payload = b"".join(pieces) + if len(payload) != metadata.st_size: + raise ExecutorR6BootstrapError(f"{label} changed while reading") + return payload + except OSError as error: + raise ExecutorR6BootstrapError(f"{label} no-follow open failed: {error}") from error + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + + +def _load_bound_module(path: Path, expected_sha256: str, *, label: str) -> ModuleType: + source = _read_regular_nofollow(path, label=label) + if _sha256(source) != expected_sha256: + raise ExecutorR6BootstrapError(f"{label} hash changed") + name = f"_review_a5_executor_r6_bound_{label.replace(' ', '_')}_{id(source)}" + module = ModuleType(name) + module.__file__ = os.fspath(path) + module.__package__ = "" + sys.modules[name] = module + exec(compile(source, os.fspath(path), "exec"), module.__dict__) + return module + + +_r5 = _load_bound_module(R5_SOURCE_PATH, R5_SOURCE_SHA256, label="native-eight executor r5") + +NativeEightCompositeR5 = _r5.NativeEightCompositeR5 +NativeEightConfig = _r5.NativeEightConfig +NativeEightOutput = _r5.NativeEightOutput +FrozenEpochPlan = _r5.FrozenEpochPlan +PlannedMicrobatch = _r5.PlannedMicrobatch +DevelopmentBatch = _r5.DevelopmentBatch +DevelopmentResult = _r5.DevelopmentResult +FixedDevelopmentContract = _r5.FixedDevelopmentContract +AdamWContract = _r5.AdamWContract +StepDiagnostic = _r5.StepDiagnostic +OBJECTIVES = tuple(_r5.OBJECTIVES) +CELL_ORDER = tuple(_r5.CELL_ORDER) + + +def _runtime_source_sha256() -> str: + return _sha256( + _read_regular_nofollow(Path(__file__).absolute(), label="native-eight executor r6 source") + ) + + +def _class_identity(value: object) -> dict[str, str]: + cls = value if inspect.isclass(value) else type(value) + return {"module": cls.__module__, "qualname": cls.__qualname__} + + +def _plain_policy(value: object, *, label: str) -> object: + """Return a finite JSON-safe policy value with string mapping keys.""" + + if value is None or type(value) in {bool, int, str}: + return value + if type(value) is float: + _require(math.isfinite(value), f"{label} contains a nonfinite float") + return value + if isinstance(value, Mapping): + _require( + all(type(key) is str and key for key in value), + f"{label} mapping key is not a nonblank string", + ) + return { + key: _plain_policy(value[key], label=f"{label}.{key}") + for key in sorted(value) + } + if isinstance(value, (tuple, list)): + return [_plain_policy(item, label=f"{label}[]") for item in value] + raise NativeEightExecutorR6Error( + f"{label} contains unsupported policy type {type(value).__name__}" + ) + + +def _code_constant_payload(value: object) -> object: + if value is None or type(value) in {bool, int, str}: + return value + if type(value) is float: + return {"float_hex": value.hex()} + if type(value) is bytes: + return {"bytes_hex": value.hex()} + if type(value) is tuple: + return {"tuple": [_code_constant_payload(item) for item in value]} + if inspect.iscode(value): + return { + "code": { + "bytecode_sha256": _sha256(value.co_code), + "constants": [_code_constant_payload(item) for item in value.co_consts], + "names": list(value.co_names), + "varnames": list(value.co_varnames), + "freevars": list(value.co_freevars), + } + } + return {"type": _class_identity(value)} + + +def _callable_payload(function: Callable[..., Any]) -> dict[str, object]: + payload: dict[str, object] = { + "identity": { + "module": getattr(function, "__module__", type(function).__module__), + "qualname": getattr(function, "__qualname__", type(function).__qualname__), + } + } + code = getattr(function, "__code__", None) + if code is not None: + payload["code"] = _code_constant_payload(code) + payload["defaults"] = _code_constant_payload(getattr(function, "__defaults__", None)) + payload["kwdefaults"] = _plain_policy( + getattr(function, "__kwdefaults__", None), label="callable kwdefaults" + ) + closure = getattr(function, "__closure__", None) + if closure: + values = [] + for cell in closure: + try: + content = cell.cell_contents + except ValueError: + content = None + try: + values.append(_plain_policy(content, label="callable closure")) + except NativeEightExecutorR6Error: + values.append({"type": _class_identity(content)}) + payload["closure"] = values + else: + payload["class"] = _class_identity(function) + payload["sha256"] = canonical_sha256( + payload, domain="bertose-a5-native-eight-callable-policy-r6" + ) + return payload + + +def _scheduler_payload( + scheduler: Optional[Any], explicit_configuration: Optional[Mapping[str, Any]] +) -> object: + if scheduler is None: + _require(explicit_configuration is None, "scheduler configuration exists without a scheduler") + return None + _require(explicit_configuration is not None, "scheduler lacks an explicit configuration") + lambdas = getattr(scheduler, "lr_lambdas", None) + return { + "class": _class_identity(scheduler), + "configuration": _plain_policy(explicit_configuration, label="scheduler configuration"), + "lr_lambdas": ( + [_callable_payload(value) for value in lambdas] + if isinstance(lambdas, (list, tuple)) + else None + ), + } + + +def _scaler_payload( + scaler: Optional[Any], explicit_configuration: Optional[Mapping[str, Any]] +) -> object: + if scaler is None: + _require(explicit_configuration is None, "scaler configuration exists without a scaler") + return None + _require(explicit_configuration is not None, "AMP scaler lacks an explicit configuration") + return { + "class": _class_identity(scaler), + "configuration": _plain_policy(explicit_configuration, label="scaler configuration"), + } + + +def _autocast_payload( + factory: Callable[[], Any], explicit_configuration: Optional[Mapping[str, Any]] +) -> object: + return { + "factory": _callable_payload(factory), + "configuration": ( + {"mode": "disabled_nullcontext"} + if explicit_configuration is None + else _plain_policy(explicit_configuration, label="autocast configuration") + ), + } + + +def _float_equal(left: object, right: object) -> bool: + if left is None or right is None: + return left is None and right is None + return type(left) is float and type(right) is float and left.hex() == right.hex() + + +class StrictLowerSelection: + """Max-100/patience-15 selector whose complete history is replay-validated.""" + + def __init__(self, *, development_contract_sha256: str) -> None: + _require( + _valid_sha256(development_contract_sha256), + "selection development contract is invalid", + ) + self.development_contract_sha256 = development_contract_sha256 + self.completed_epochs = 0 + self.best_epoch: Optional[int] = None + self.best_loss: Optional[float] = None + self.best_result_sha256: Optional[str] = None + self.epochs_without_improvement = 0 + self.stop_reason: Optional[str] = None + self.history: list[dict[str, Any]] = [] + + def observe(self, *, epoch: int, result: DevelopmentResult) -> dict[str, Any]: + _require(self.stop_reason is None, "selection received an epoch after stopping") + _require( + type(epoch) is int and epoch == self.completed_epochs + 1, + "selection epoch sequence changed", + ) + _require(1 <= epoch <= MAX_EPOCHS, "selection epoch exceeds max100") + _require( + result.contract_sha256 == self.development_contract_sha256, + "selection development contract changed", + ) + loss = float(result.total_normalized_loss) + _require(math.isfinite(loss) and loss >= 0, "selection loss is invalid") + _require(_valid_sha256(result.result_sha256), "selection result identity is invalid") + improved = self.best_loss is None or loss < self.best_loss + if improved: + self.best_epoch = epoch + self.best_loss = loss + self.best_result_sha256 = result.result_sha256 + self.epochs_without_improvement = 0 + else: + self.epochs_without_improvement += 1 + self.completed_epochs = epoch + if epoch >= EARLIEST_STOP_EPOCH and self.epochs_without_improvement >= PATIENCE: + self.stop_reason = "patience_exhausted" + elif epoch == MAX_EPOCHS: + self.stop_reason = "max_epochs_reached" + record = { + "epoch": epoch, + "total_normalized_loss": loss, + "development_result_sha256": result.result_sha256, + "improved": improved, + "best_epoch": self.best_epoch, + "best_loss": self.best_loss, + "best_result_sha256": self.best_result_sha256, + "epochs_without_improvement": self.epochs_without_improvement, + "should_stop": self.stop_reason is not None, + "stop_reason": self.stop_reason, + "training_authorized": False, + "scientific_launch_authorized": False, + } + self.history.append(record) + return copy.deepcopy(record) + + def state_dict(self) -> dict[str, Any]: + unsigned = { + "schema": SELECTION_SCHEMA, + "development_contract_sha256": self.development_contract_sha256, + "completed_epochs": self.completed_epochs, + "best_epoch": self.best_epoch, + "best_loss": self.best_loss, + "best_result_sha256": self.best_result_sha256, + "epochs_without_improvement": self.epochs_without_improvement, + "stop_reason": self.stop_reason, + "history": copy.deepcopy(self.history), + "max_epochs": MAX_EPOCHS, + "patience": PATIENCE, + "earliest_stop_epoch": EARLIEST_STOP_EPOCH, + "improvement_rule": "strict_lower", + "tie_rule": "earliest_epoch_retained", + "training_authorized": False, + "scientific_launch_authorized": False, + } + return { + **unsigned, + "selection_sha256": canonical_sha256(unsigned, domain=SELECTION_SCHEMA), + } + + @staticmethod + def validate_state(state: Mapping[str, Any]) -> Mapping[str, Any]: + required = { + "schema", + "development_contract_sha256", + "completed_epochs", + "best_epoch", + "best_loss", + "best_result_sha256", + "epochs_without_improvement", + "stop_reason", + "history", + "max_epochs", + "patience", + "earliest_stop_epoch", + "improvement_rule", + "tie_rule", + "training_authorized", + "scientific_launch_authorized", + "selection_sha256", + } + _require(set(state) == required, "selection resume fields changed") + unsigned = dict(state) + observed_sha = unsigned.pop("selection_sha256") + _require( + observed_sha == canonical_sha256(unsigned, domain=SELECTION_SCHEMA), + "selection resume digest changed", + ) + _require(state["schema"] == SELECTION_SCHEMA, "selection resume schema changed") + _require(_valid_sha256(state["development_contract_sha256"]), "selection development contract changed") + _require( + state["max_epochs"] == MAX_EPOCHS + and state["patience"] == PATIENCE + and state["earliest_stop_epoch"] == EARLIEST_STOP_EPOCH + and state["improvement_rule"] == "strict_lower" + and state["tie_rule"] == "earliest_epoch_retained" + and state["training_authorized"] is False + and state["scientific_launch_authorized"] is False, + "selection policy or release flags changed", + ) + completed = state["completed_epochs"] + history = state["history"] + _require(type(completed) is int and 0 <= completed <= MAX_EPOCHS, "selection completed epoch changed") + _require(type(history) is list and len(history) == completed, "selection history length changed") + + best_epoch: Optional[int] = None + best_loss: Optional[float] = None + best_result: Optional[str] = None + without = 0 + stop: Optional[str] = None + record_fields = { + "epoch", + "total_normalized_loss", + "development_result_sha256", + "improved", + "best_epoch", + "best_loss", + "best_result_sha256", + "epochs_without_improvement", + "should_stop", + "stop_reason", + "training_authorized", + "scientific_launch_authorized", + } + for expected_epoch, record in enumerate(history, start=1): + _require(type(record) is dict and set(record) == record_fields, "selection history record fields changed") + _require(stop is None, "selection history continues after stop") + loss = record["total_normalized_loss"] + result_sha = record["development_result_sha256"] + _require( + record["epoch"] == expected_epoch + and type(loss) is float + and math.isfinite(loss) + and loss >= 0 + and _valid_sha256(result_sha) + and record["training_authorized"] is False + and record["scientific_launch_authorized"] is False, + "selection history epoch, loss, result, or flags changed", + ) + improved = best_loss is None or loss < best_loss + if improved: + best_epoch = expected_epoch + best_loss = loss + best_result = result_sha + without = 0 + else: + without += 1 + if expected_epoch >= EARLIEST_STOP_EPOCH and without >= PATIENCE: + stop = "patience_exhausted" + elif expected_epoch == MAX_EPOCHS: + stop = "max_epochs_reached" + _require( + record["improved"] is improved + and record["best_epoch"] == best_epoch + and _float_equal(record["best_loss"], best_loss) + and record["best_result_sha256"] == best_result + and record["epochs_without_improvement"] == without + and record["should_stop"] is (stop is not None) + and record["stop_reason"] == stop, + "selection history semantic replay failed", + ) + _require( + state["best_epoch"] == best_epoch + and _float_equal(state["best_loss"], best_loss) + and state["best_result_sha256"] == best_result + and state["epochs_without_improvement"] == without + and state["stop_reason"] == stop, + "selection summary differs from replayed history", + ) + return MappingProxyType( + { + "completed_epochs": completed, + "best_epoch": best_epoch, + "best_loss": best_loss, + "best_result_sha256": best_result, + "epochs_without_improvement": without, + "stop_reason": stop, + "last_improved": (history[-1]["improved"] if history else None), + } + ) + + def load_state_dict(self, state: Mapping[str, Any]) -> None: + derived = self.validate_state(state) + _require( + state["development_contract_sha256"] == self.development_contract_sha256, + "selection resume development contract changed", + ) + self.completed_epochs = int(derived["completed_epochs"]) + self.best_epoch = derived["best_epoch"] + self.best_loss = derived["best_loss"] + self.best_result_sha256 = derived["best_result_sha256"] + self.epochs_without_improvement = int(derived["epochs_without_improvement"]) + self.stop_reason = derived["stop_reason"] + self.history = copy.deepcopy(state["history"]) + + +def _adapter_contract(adapter: Any) -> tuple[dict[str, Any], str]: + for name in ( + "contract_payload", + "verify_authorities", + "build_epoch_plan", + "materialize_training_step", + "resume_cursor", + "validate_resume_cursor", + "restore_resume_cursor", + ): + _require(callable(getattr(adapter, name, None)), f"data adapter lacks {name}") + payload = adapter.contract_payload() + _require(type(payload) is dict, "data adapter contract payload changed") + _require( + payload.get("training_authorized") is False + and payload.get("scientific_launch_authorized") is False, + "data adapter contract self-authorizes", + ) + for field in ("source_sha256", "receipt_sha256"): + _require(_valid_sha256(payload.get(field)), f"data adapter {field} changed") + contract_sha = canonical_sha256( + payload, domain="bertose-a5-native-eight-data-adapter-contract-r6" + ) + declared = getattr(adapter, "contract_sha256", None) + _require(declared == contract_sha, "data adapter contract digest changed") + authorities = adapter.verify_authorities() + _require(isinstance(authorities, Mapping), "data adapter authorities changed") + _require( + canonical_sha256( + dict(authorities), + domain="bertose-a5-native-eight-data-adapter-authorities-r6", + ) + == payload.get("authority_set_sha256"), + "data adapter authority set differs from its contract", + ) + return payload, contract_sha + + +def _step_identity_sha256(value: Mapping[str, Any]) -> str: + unsigned = dict(value) + observed = unsigned.pop("step_identity_sha256", None) + expected = canonical_sha256( + unsigned, domain="bertose-a5-native-eight-authoritative-step-r6" + ) + _require(observed == expected, "adapter step identity digest changed") + return expected + + +class NativeEightProductionExecutor: + """R6 owner of adapter materialization and the r5 mathematical executor.""" + + training_authorized = False + scientific_launch_authorized = False + execution_certified = False + + def __init__( + self, + model: NativeEightCompositeR5, + *, + data_adapter: Any, + adamw: AdamWContract = AdamWContract(), + scheduler_factory: Optional[Callable[[torch.optim.Optimizer], Any]] = None, + scheduler_configuration: Optional[Mapping[str, Any]] = None, + grad_scaler: Optional[Any] = None, + scaler_configuration: Optional[Mapping[str, Any]] = None, + autocast_context_factory: Optional[Callable[[], Any]] = None, + autocast_configuration: Optional[Mapping[str, Any]] = None, + max_amp_retries: int = 2, + isolated_test_null_scales: Optional[Mapping[str, float]] = None, + isolated_test_adapter: bool = False, + ) -> None: + _require(type(model) is NativeEightCompositeR5, "r6 requires the exact r5 composite") + adapter_payload, adapter_sha = _adapter_contract(data_adapter) + fixture = bool(model.config.isolated_test_fixture) + if isolated_test_adapter: + _require(fixture, "production model cannot use an isolated adapter fixture") + _require(adapter_payload.get("isolated_test_fixture") is True, "adapter fixture flag is absent") + else: + _require(not fixture, "isolated model requires an isolated adapter fixture") + _require( + EXPECTED_ADAPTER_SOURCE_SHA256 is not None + and EXPECTED_ADAPTER_RECEIPT_SHA256 is not None, + "production adapter dependency has not been frozen", + ) + _require( + adapter_payload["source_sha256"] == EXPECTED_ADAPTER_SOURCE_SHA256 + and adapter_payload["receipt_sha256"] == EXPECTED_ADAPTER_RECEIPT_SHA256, + "production adapter source or receipt changed", + ) + inner = _r5.NativeEightProductionExecutor( + model, + adamw=adamw, + scheduler_factory=scheduler_factory, + grad_scaler=grad_scaler, + autocast_context_factory=autocast_context_factory, + max_amp_retries=max_amp_retries, + isolated_test_null_scales=isolated_test_null_scales, + ) + self._inner = inner + self.data_adapter = data_adapter + self.adapter_contract_payload = MappingProxyType(copy.deepcopy(adapter_payload)) + self.adapter_contract_sha256 = adapter_sha + self.adapter_authorities = MappingProxyType(dict(data_adapter.verify_authorities())) + scheduler_policy = _scheduler_payload(inner.scheduler, scheduler_configuration) + scaler_policy = _scaler_payload(inner.grad_scaler, scaler_configuration) + autocast_policy = _autocast_payload( + inner.autocast_context_factory, autocast_configuration + ) + self.execution_policy_payload = MappingProxyType( + { + "schema": "bertose_a5_native_eight_execution_policy_20260721_r6", + "r5_executor_source_sha256": R5_SOURCE_SHA256, + "r6_executor_source_sha256": _runtime_source_sha256(), + "optimizer_contract_sha256": inner.optimizer_contract_sha256, + "scheduler": scheduler_policy, + "scaler": scaler_policy, + "autocast": autocast_policy, + "max_amp_retries": max_amp_retries, + "adapter_contract_sha256": adapter_sha, + "training_authorized": False, + "scientific_launch_authorized": False, + } + ) + self.execution_policy_sha256 = canonical_sha256( + dict(self.execution_policy_payload), + domain="bertose-a5-native-eight-execution-policy-r6", + ) + self.completed_step_identities: list[str] = [] + + @property + def model(self) -> NativeEightCompositeR5: + return self._inner.model + + @property + def optimizer(self) -> torch.optim.Optimizer: + return self._inner.optimizer + + @property + def scheduler(self) -> Optional[Any]: + return self._inner.scheduler + + @property + def grad_scaler(self) -> Optional[Any]: + return self._inner.grad_scaler + + @property + def cell_id(self) -> str: + return self._inner.cell_id + + @property + def bound_plan(self) -> Optional[FrozenEpochPlan]: + return self._inner.bound_plan + + @property + def next_optimizer_step(self) -> int: + return self._inner.next_optimizer_step + + @property + def diagnostics(self) -> Sequence[StepDiagnostic]: + return tuple(self._inner.diagnostics) + + def reverify_contract(self) -> None: + _require(_runtime_source_sha256() == self.execution_policy_payload["r6_executor_source_sha256"], "r6 source changed") + observed_payload, observed_sha = _adapter_contract(self.data_adapter) + _require( + observed_sha == self.adapter_contract_sha256 + and observed_payload == dict(self.adapter_contract_payload) + and dict(self.data_adapter.verify_authorities()) == dict(self.adapter_authorities), + "data adapter changed after executor construction", + ) + self.model.reverify_component_authorities() + + def bind_epoch(self, epoch: int) -> FrozenEpochPlan: + _require(type(epoch) is int and 0 <= epoch < MAX_EPOCHS, "r6 epoch is invalid") + self.reverify_contract() + plan = self.data_adapter.build_epoch_plan(epoch) + _require(type(plan) is FrozenEpochPlan, "adapter returned a non-r5 epoch plan") + self._inner.bind_epoch_plan(plan) + self.completed_step_identities = [] + cursor = self.data_adapter.resume_cursor( + plan=plan, + next_optimizer_step=0, + cell_id=self.cell_id, + ) + self.data_adapter.validate_resume_cursor( + cursor, + plan=plan, + cell_id=self.cell_id, + ) + return plan + + def execute_step(self, *_: Any, **__: Any) -> StepDiagnostic: + raise NativeEightExecutorR6Error( + "r6 rejects caller model_inputs; use execute_next_step()" + ) + + def execute_next_step(self) -> StepDiagnostic: + plan = self.bound_plan + _require(plan is not None, "r6 executor has no bound epoch") + self.reverify_contract() + step_index = self.next_optimizer_step + materialized = self.data_adapter.materialize_training_step( + plan=plan, + step_index=step_index, + cell_id=self.cell_id, + device=next(self.model.parameters()).device, + ) + _require( + isinstance(materialized, Mapping) + and set(materialized) == {"micros", "step_identity"}, + "adapter materialized-step fields changed", + ) + micros = materialized["micros"] + identity = materialized["step_identity"] + _require( + type(micros) is tuple + and len(micros) == _r5._planner.MICROBATCHES_PER_STEP + and all(type(value) is PlannedMicrobatch for value in micros), + "adapter did not return four authoritative r5 microbatches", + ) + required_identity = { + "schema", + "adapter_contract_sha256", + "plan_sha256", + "seed", + "epoch", + "optimizer_step_index", + "parent_indices", + "parent_ids", + "availability_bits_hex", + "sequence_stream_sha256", + "topology_surface_sha256", + "ms_stream_sha256", + "static_stream_sha256", + "model_input_sha256", + "training_authorized", + "scientific_launch_authorized", + "step_identity_sha256", + } + _require(type(identity) is dict and set(identity) == required_identity, "adapter step identity fields changed") + identity_sha = _step_identity_sha256(identity) + expected_indices = plan.step_parent_indices(step_index) + expected_ids = plan.step_parent_ids(step_index) + _require( + identity["adapter_contract_sha256"] == self.adapter_contract_sha256 + and identity["plan_sha256"] == plan.plan_sha256 + and identity["seed"] == plan.seed + and identity["epoch"] == plan.epoch + and identity["optimizer_step_index"] == step_index + and tuple(identity["parent_indices"]) == expected_indices + and tuple(identity["parent_ids"]) == expected_ids + and identity["availability_bits_hex"] == plan.step_availability_bits(step_index).hex() + and identity["training_authorized"] is False + and identity["scientific_launch_authorized"] is False, + "adapter step identity differs from the exact plan", + ) + for field in ( + "sequence_stream_sha256", + "topology_surface_sha256", + "ms_stream_sha256", + "model_input_sha256", + ): + _require(_valid_sha256(identity[field]), f"adapter {field} changed") + _require( + identity["static_stream_sha256"] is None + or _valid_sha256(identity["static_stream_sha256"]), + "adapter static stream identity changed", + ) + diagnostic = self._inner.execute_step(micros) + _require( + diagnostic.optimizer_step_index == step_index + and diagnostic.plan_sha256 == plan.plan_sha256 + and diagnostic.input_sha256 == identity["model_input_sha256"], + "r5 diagnostic differs from authoritative adapter input", + ) + self.completed_step_identities.append(identity_sha) + return diagnostic + + def adapter_resume_cursor(self) -> Mapping[str, Any]: + plan = self.bound_plan + _require(plan is not None, "adapter cursor has no epoch plan") + cursor = self.data_adapter.resume_cursor( + plan=plan, + next_optimizer_step=self.next_optimizer_step, + cell_id=self.cell_id, + ) + self.data_adapter.validate_resume_cursor(cursor, plan=plan, cell_id=self.cell_id) + return MappingProxyType(copy.deepcopy(dict(cursor))) + + +def _base_checkpoint_semantics(checkpoint: Mapping[str, Any]) -> Mapping[str, Any]: + """Validate every r5 envelope hash plus r6 selection semantics before load.""" + + _require(set(checkpoint) == {"payload", "envelope"}, "base checkpoint fields changed") + payload = checkpoint["payload"] + envelope = checkpoint["envelope"] + _require(type(payload) is dict and type(envelope) is dict, "base checkpoint mapping changed") + payload_fields = { + "model_state", + "optimizer_state", + "scheduler_state", + "scaler_state", + "rng_state", + "plan_cursor", + "data_cursors", + "selection_state", + "cell_id", + "null_scales", + "optimizer_contract_sha256", + "executor_runtime_sha256", + "execution_bindings", + "development_contract_sha256", + "static_final_release_bound", + "static_null_authority_sha256", + "training_authorized", + "scientific_launch_authorized", + } + envelope_fields = { + "schema", + "cell_id", + "plan_sha256", + "plan_epoch", + "next_optimizer_step", + "next_microbatch", + "model_state_sha256", + "optimizer_state_sha256", + "scheduler_state_sha256", + "scaler_state_sha256", + "rng_state_sha256", + "plan_cursor_sha256", + "data_cursors_sha256", + "selection_state_sha256", + "optimizer_contract_sha256", + "executor_runtime_sha256", + "execution_bindings_sha256", + "development_contract_sha256", + "amp_enabled", + "scheduler_enabled", + "static_final_release_bound", + "training_authorized", + "scientific_launch_authorized", + "resume_sha256", + } + _require(set(payload) == payload_fields, "base checkpoint payload fields changed") + _require(set(envelope) == envelope_fields, "base checkpoint envelope fields changed") + _require(envelope["schema"] == _r5.RESUME_SCHEMA, "base resume schema changed") + unsigned = dict(envelope) + observed_resume = unsigned.pop("resume_sha256") + _require( + observed_resume == _r5.canonical_sha256(unsigned, domain=_r5.RESUME_SCHEMA), + "base resume envelope digest changed", + ) + state_hashes = { + "model_state_sha256": "model_state", + "optimizer_state_sha256": "optimizer_state", + "scheduler_state_sha256": "scheduler_state", + "scaler_state_sha256": "scaler_state", + "rng_state_sha256": "rng_state", + "plan_cursor_sha256": "plan_cursor", + "data_cursors_sha256": "data_cursors", + "selection_state_sha256": "selection_state", + } + for envelope_field, payload_field in state_hashes.items(): + _require( + envelope[envelope_field] + == _r5._recursive_state_sha256(payload[payload_field]), + f"base resume {payload_field} state digest changed", + ) + _require( + envelope["cell_id"] == payload["cell_id"] + and envelope["optimizer_contract_sha256"] == payload["optimizer_contract_sha256"] + and envelope["executor_runtime_sha256"] == payload["executor_runtime_sha256"] + and envelope["development_contract_sha256"] == payload["development_contract_sha256"], + "base resume duplicated identity fields disagree", + ) + _require( + envelope["execution_bindings_sha256"] + == _r5.canonical_sha256( + payload["execution_bindings"], + domain="bertose-a5-native-eight-execution-bindings-r5", + ), + "base execution binding digest changed", + ) + cursor = payload["plan_cursor"] + _require(type(cursor) is dict, "base plan cursor changed") + cursor_unsigned = dict(cursor) + cursor_sha = cursor_unsigned.pop("cursor_sha256", None) + _require( + cursor_sha + == _r5.canonical_sha256( + cursor_unsigned, domain=_r5._planner.CURSOR_SCHEMA + ), + "base plan cursor digest changed", + ) + _require( + cursor.get("schema") == _r5._planner.CURSOR_SCHEMA + and cursor.get("plan_sha256") == envelope["plan_sha256"] + and cursor.get("epoch") == envelope["plan_epoch"] + and cursor.get("next_optimizer_step") == envelope["next_optimizer_step"] + and cursor.get("next_microbatch") == envelope["next_microbatch"] == 0 + and cursor.get("training_authorized") is False + and cursor.get("scientific_launch_authorized") is False, + "base plan cursor semantics changed", + ) + _require( + bool(envelope["scheduler_enabled"]) + is (payload["scheduler_state"] is not None) + and bool(envelope["amp_enabled"]) is (payload["scaler_state"] is not None), + "base scheduler/scaler state presence changed", + ) + _require( + type(envelope["scheduler_enabled"]) is bool + and type(envelope["amp_enabled"]) is bool, + "base scheduler/scaler mode is not boolean", + ) + _require( + payload["training_authorized"] is False + and payload["scientific_launch_authorized"] is False + and envelope["training_authorized"] is False + and envelope["scientific_launch_authorized"] is False + and payload["static_final_release_bound"] is False + and envelope["static_final_release_bound"] is False + and payload["static_null_authority_sha256"] is None, + "base checkpoint self-authorizes or promotes static", + ) + selection = StrictLowerSelection.validate_state(payload["selection_state"]) + _require( + payload["cell_id"] in CELL_ORDER + and payload["development_contract_sha256"] + == payload["selection_state"]["development_contract_sha256"] + and payload["executor_runtime_sha256"] == R5_SOURCE_SHA256 + and payload["execution_bindings"] == dict(_r5.verify_execution_authorities()), + "base cell, development contract, runtime, or authorities changed", + ) + return MappingProxyType( + { + "payload": payload, + "envelope": envelope, + "selection": selection, + } + ) + + +def _step_identity_chain(values: Sequence[str]) -> str: + _require( + all(_valid_sha256(value) for value in values), + "completed adapter step identity is invalid", + ) + return canonical_sha256( + list(values), domain="bertose-a5-native-eight-completed-step-chain-r6" + ) + + +def capture_optimizer_boundary_resume( + executor: NativeEightProductionExecutor, + *, + selection: StrictLowerSelection, + development_contract: Any, +) -> dict[str, Any]: + """Capture an adapter-bound checkpoint between optimizer steps only.""" + + _require(type(executor) is NativeEightProductionExecutor, "r6 resume executor type changed") + executor.reverify_contract() + plan = executor.bound_plan + _require(plan is not None, "r6 resume has no epoch plan") + adapter_cursor = dict(executor.adapter_resume_cursor()) + step_identities = list(executor.completed_step_identities) + _require( + len(step_identities) == executor.next_optimizer_step, + "r6 completed adapter step identity count changed", + ) + data_cursor = { + "optimizer_step": executor.next_optimizer_step, + "next_microbatch": 0, + "adapter_cursor": adapter_cursor, + "adapter_cursor_sha256": canonical_sha256( + adapter_cursor, + domain="bertose-a5-native-eight-adapter-resume-cursor-r6", + ), + "completed_step_identities": step_identities, + "completed_step_chain_sha256": _step_identity_chain(step_identities), + } + base = _r5.capture_optimizer_boundary_resume( + executor._inner, + selection=selection, + development_contract=development_contract, + data_cursors=data_cursor, + ) + _base_checkpoint_semantics(base) + r6_state = { + "schema": RESUME_SCHEMA, + "r5_executor_source_sha256": R5_SOURCE_SHA256, + "r6_executor_source_sha256": _runtime_source_sha256(), + "execution_policy": dict(executor.execution_policy_payload), + "execution_policy_sha256": executor.execution_policy_sha256, + "adapter_contract": dict(executor.adapter_contract_payload), + "adapter_contract_sha256": executor.adapter_contract_sha256, + "adapter_authorities": dict(executor.adapter_authorities), + "adapter_cursor": adapter_cursor, + "adapter_cursor_sha256": data_cursor["adapter_cursor_sha256"], + "completed_step_identities": step_identities, + "completed_step_chain_sha256": data_cursor["completed_step_chain_sha256"], + "plan_optimizer_step_count": plan.optimizer_step_count, + "training_authorized": False, + "scientific_launch_authorized": False, + "static_final_release_bound": False, + } + payload = {"base_checkpoint": base, "r6_state": r6_state} + unsigned = { + "schema": RESUME_SCHEMA, + "cell_id": executor.cell_id, + "plan_sha256": plan.plan_sha256, + "plan_epoch": plan.epoch, + "next_optimizer_step": executor.next_optimizer_step, + "next_microbatch": 0, + "plan_optimizer_step_count": plan.optimizer_step_count, + "base_checkpoint_sha256": _r5._recursive_state_sha256(base), + "r6_state_sha256": _r5._recursive_state_sha256(r6_state), + "selection_state_sha256": _r5._recursive_state_sha256( + base["payload"]["selection_state"] + ), + "development_contract_sha256": base["payload"]["development_contract_sha256"], + "execution_policy_sha256": executor.execution_policy_sha256, + "adapter_contract_sha256": executor.adapter_contract_sha256, + "adapter_cursor_sha256": data_cursor["adapter_cursor_sha256"], + "completed_step_chain_sha256": data_cursor["completed_step_chain_sha256"], + "training_authorized": False, + "scientific_launch_authorized": False, + "static_final_release_bound": False, + } + return { + "payload": payload, + "envelope": { + **unsigned, + "resume_sha256": canonical_sha256(unsigned, domain=RESUME_SCHEMA), + }, + } + + +def validate_checkpoint_semantics(checkpoint: Mapping[str, Any]) -> Mapping[str, Any]: + """Validate r6 and nested r5 semantics without constructing Python objects.""" + + _require(set(checkpoint) == {"payload", "envelope"}, "r6 checkpoint fields changed") + payload = checkpoint["payload"] + envelope = checkpoint["envelope"] + _require( + type(payload) is dict + and set(payload) == {"base_checkpoint", "r6_state"} + and type(envelope) is dict, + "r6 checkpoint mapping changed", + ) + envelope_fields = { + "schema", + "cell_id", + "plan_sha256", + "plan_epoch", + "next_optimizer_step", + "next_microbatch", + "plan_optimizer_step_count", + "base_checkpoint_sha256", + "r6_state_sha256", + "selection_state_sha256", + "development_contract_sha256", + "execution_policy_sha256", + "adapter_contract_sha256", + "adapter_cursor_sha256", + "completed_step_chain_sha256", + "training_authorized", + "scientific_launch_authorized", + "static_final_release_bound", + "resume_sha256", + } + _require(set(envelope) == envelope_fields, "r6 resume envelope fields changed") + _require(envelope["schema"] == RESUME_SCHEMA, "r6 resume schema changed") + unsigned = dict(envelope) + observed = unsigned.pop("resume_sha256") + _require( + observed == canonical_sha256(unsigned, domain=RESUME_SCHEMA), + "r6 resume envelope digest changed", + ) + base_info = _base_checkpoint_semantics(payload["base_checkpoint"]) + base_payload = base_info["payload"] + base_envelope = base_info["envelope"] + state = payload["r6_state"] + state_fields = { + "schema", + "r5_executor_source_sha256", + "r6_executor_source_sha256", + "execution_policy", + "execution_policy_sha256", + "adapter_contract", + "adapter_contract_sha256", + "adapter_authorities", + "adapter_cursor", + "adapter_cursor_sha256", + "completed_step_identities", + "completed_step_chain_sha256", + "plan_optimizer_step_count", + "training_authorized", + "scientific_launch_authorized", + "static_final_release_bound", + } + _require(type(state) is dict and set(state) == state_fields, "r6 resume state fields changed") + _require( + envelope["base_checkpoint_sha256"] + == _r5._recursive_state_sha256(payload["base_checkpoint"]) + and envelope["r6_state_sha256"] == _r5._recursive_state_sha256(state) + and envelope["selection_state_sha256"] + == _r5._recursive_state_sha256(base_payload["selection_state"]), + "r6 nested state digest changed", + ) + _require( + state["schema"] == RESUME_SCHEMA + and state["r5_executor_source_sha256"] == R5_SOURCE_SHA256 + and _valid_sha256(state["r6_executor_source_sha256"]), + "r6 source lineage changed", + ) + _require( + state["execution_policy_sha256"] + == canonical_sha256( + state["execution_policy"], + domain="bertose-a5-native-eight-execution-policy-r6", + ) + == envelope["execution_policy_sha256"], + "r6 execution policy digest changed", + ) + _require( + state["adapter_contract_sha256"] + == canonical_sha256( + state["adapter_contract"], + domain="bertose-a5-native-eight-data-adapter-contract-r6", + ) + == envelope["adapter_contract_sha256"], + "r6 adapter contract digest changed", + ) + _require( + _valid_sha256(state["adapter_contract"].get("source_sha256")) + and _valid_sha256(state["adapter_contract"].get("receipt_sha256")) + and state["adapter_contract"].get("training_authorized") is False + and state["adapter_contract"].get("scientific_launch_authorized") is False, + "r6 adapter contract source, receipt, or flags changed", + ) + _require( + canonical_sha256( + state["adapter_authorities"], + domain="bertose-a5-native-eight-data-adapter-authorities-r6", + ) + == state["adapter_contract"].get("authority_set_sha256"), + "r6 adapter authority digest changed", + ) + _require( + state["adapter_cursor_sha256"] + == canonical_sha256( + state["adapter_cursor"], + domain="bertose-a5-native-eight-adapter-resume-cursor-r6", + ) + == envelope["adapter_cursor_sha256"], + "r6 adapter cursor digest changed", + ) + identities = state["completed_step_identities"] + _require(type(identities) is list, "r6 completed step identity list changed") + chain = _step_identity_chain(identities) + _require( + chain + == state["completed_step_chain_sha256"] + == envelope["completed_step_chain_sha256"], + "r6 completed step identity chain changed", + ) + next_step = envelope["next_optimizer_step"] + step_count = envelope["plan_optimizer_step_count"] + _require( + type(next_step) is int + and type(step_count) is int + and 0 <= next_step <= step_count + and len(identities) == next_step + and envelope["next_microbatch"] == 0, + "r6 optimizer boundary changed", + ) + data_cursor = base_payload["data_cursors"] + _require( + type(data_cursor) is dict + and set(data_cursor) + == { + "optimizer_step", + "next_microbatch", + "adapter_cursor", + "adapter_cursor_sha256", + "completed_step_identities", + "completed_step_chain_sha256", + } + and data_cursor["optimizer_step"] == next_step + and data_cursor["next_microbatch"] == 0 + and data_cursor["adapter_cursor"] == state["adapter_cursor"] + and data_cursor["adapter_cursor_sha256"] == envelope["adapter_cursor_sha256"] + and data_cursor["completed_step_identities"] == identities + and data_cursor["completed_step_chain_sha256"] == chain, + "r6 base/adaptor data cursor changed", + ) + _require( + envelope["cell_id"] == base_envelope["cell_id"] + and envelope["plan_sha256"] == base_envelope["plan_sha256"] + and envelope["plan_epoch"] == base_envelope["plan_epoch"] + and next_step == base_envelope["next_optimizer_step"] + and envelope["development_contract_sha256"] + == base_payload["development_contract_sha256"], + "r6 and base checkpoint identities disagree", + ) + _require( + state["plan_optimizer_step_count"] == step_count + and state["training_authorized"] is False + and state["scientific_launch_authorized"] is False + and state["static_final_release_bound"] is False + and envelope["training_authorized"] is False + and envelope["scientific_launch_authorized"] is False + and envelope["static_final_release_bound"] is False, + "r6 checkpoint self-authorizes or promotes static", + ) + return MappingProxyType( + { + "base": base_info, + "state": state, + "selection": base_info["selection"], + "epoch_complete": next_step == step_count, + } + ) + + +def restore_optimizer_boundary_resume( + executor: NativeEightProductionExecutor, + checkpoint: Mapping[str, Any], + *, + selection: StrictLowerSelection, + development_contract: Any, +) -> Mapping[str, Any]: + """Restore only after safe decode and full r6 semantic validation.""" + + _require(type(executor) is NativeEightProductionExecutor, "r6 restore executor type changed") + _require(executor.bound_plan is None and not executor.diagnostics, "r6 restore target is not fresh") + validated = validate_checkpoint_semantics(checkpoint) + state = validated["state"] + envelope = checkpoint["envelope"] + executor.reverify_contract() + _require( + state["r6_executor_source_sha256"] == _runtime_source_sha256() + and state["execution_policy"] == dict(executor.execution_policy_payload) + and state["execution_policy_sha256"] == executor.execution_policy_sha256, + "r6 restore execution policy differs from current executor", + ) + _require( + state["adapter_contract"] == dict(executor.adapter_contract_payload) + and state["adapter_contract_sha256"] == executor.adapter_contract_sha256 + and state["adapter_authorities"] == dict(executor.adapter_authorities), + "r6 restore data adapter differs from current executor", + ) + plan = executor.data_adapter.build_epoch_plan(envelope["plan_epoch"]) + _require( + type(plan) is FrozenEpochPlan + and plan.plan_sha256 == envelope["plan_sha256"] + and plan.optimizer_step_count == envelope["plan_optimizer_step_count"], + "r6 restore adapter epoch plan changed", + ) + executor.data_adapter.validate_resume_cursor( + state["adapter_cursor"], plan=plan, cell_id=executor.cell_id + ) + _r5.restore_optimizer_boundary_resume( + executor._inner, + copy.deepcopy(checkpoint["payload"]["base_checkpoint"]), + plan=plan, + selection=selection, + development_contract=development_contract, + ) + executor.data_adapter.restore_resume_cursor( + state["adapter_cursor"], plan=plan, cell_id=executor.cell_id + ) + executor.completed_step_identities = list(state["completed_step_identities"]) + _require( + executor.next_optimizer_step == len(executor.completed_step_identities), + "r6 restored step identity count changed", + ) + return MappingProxyType(copy.deepcopy(dict(state["adapter_cursor"]))) + + +_TORCH_DTYPES: Mapping[str, torch.dtype] = MappingProxyType( + { + str(dtype): dtype + for dtype in ( + torch.bool, + torch.uint8, + torch.int8, + torch.int16, + torch.int32, + torch.int64, + torch.float16, + torch.bfloat16, + torch.float32, + torch.float64, + torch.complex64, + torch.complex128, + ) + } +) + + +class _SafeCheckpointEncoder: + def __init__(self) -> None: + self.blobs: list[bytes] = [] + self.nodes = 0 + + def _node(self, depth: int) -> None: + self.nodes += 1 + _require(depth <= MAX_CODEC_DEPTH, "checkpoint nesting exceeds the codec bound") + _require(self.nodes <= MAX_CODEC_NODES, "checkpoint node count exceeds the codec bound") + + def _blob(self, payload: bytes) -> int: + _require(len(payload) <= MAX_CHECKPOINT_BYTES, "one checkpoint blob is too large") + index = len(self.blobs) + self.blobs.append(payload) + return index + + def encode(self, value: Any, *, depth: int = 0) -> dict[str, Any]: + self._node(depth) + if value is None: + return {"t": "none"} + if type(value) is bool: + return {"t": "bool", "v": value} + if type(value) is int: + return {"t": "int", "v": str(value)} + if type(value) is float: + _require(math.isfinite(value), "checkpoint scalar float is nonfinite") + return {"t": "float", "v": value.hex()} + if type(value) is str: + return {"t": "str", "v": value} + if type(value) is bytes: + return {"t": "bytes", "v": value.hex()} + if isinstance(value, torch.Tensor): + tensor = value.detach().cpu().contiguous() + dtype_name = str(tensor.dtype) + _require(dtype_name in _TORCH_DTYPES, f"unsupported checkpoint tensor dtype {dtype_name}") + _require(tensor.layout == torch.strided, "checkpoint tensor is not dense strided") + _require(tensor.ndim <= MAX_TENSOR_RANK, "checkpoint tensor rank exceeds the codec bound") + if tensor.numel(): + raw = tensor.reshape(-1).view(torch.uint8).numpy().tobytes(order="C") + else: + raw = b"" + return { + "t": "torch", + "dtype": dtype_name, + "shape": list(tensor.shape), + "blob": self._blob(raw), + } + if isinstance(value, np.ndarray): + array = np.ascontiguousarray(value) + _require( + not array.dtype.hasobject + and array.dtype.fields is None + and array.dtype.kind in "biufc", + "checkpoint ndarray dtype is unsafe", + ) + _require(array.ndim <= MAX_TENSOR_RANK, "checkpoint ndarray rank exceeds the codec bound") + return { + "t": "numpy", + "dtype": array.dtype.str, + "shape": list(array.shape), + "blob": self._blob(array.tobytes(order="C")), + } + if isinstance(value, Mapping): + encoded_items = [ + [self.encode(key, depth=depth + 1), self.encode(item, depth=depth + 1)] + for key, item in value.items() + ] + encoded_items.sort(key=lambda pair: _canonical_bytes(pair[0])) + return {"t": "map", "v": encoded_items} + if type(value) is list: + return { + "t": "list", + "v": [self.encode(item, depth=depth + 1) for item in value], + } + if type(value) is tuple: + return { + "t": "tuple", + "v": [self.encode(item, depth=depth + 1) for item in value], + } + raise NativeEightExecutorR6Error( + f"unsupported safe-checkpoint type {type(value).__name__}" + ) + + +class _SafeCheckpointDecoder: + def __init__(self, blobs: Sequence[bytes]) -> None: + self.blobs = blobs + self.nodes = 0 + + def _node(self, depth: int) -> None: + self.nodes += 1 + _require(depth <= MAX_CODEC_DEPTH, "checkpoint nesting exceeds the codec bound") + _require(self.nodes <= MAX_CODEC_NODES, "checkpoint node count exceeds the codec bound") + + def _blob(self, index: object) -> bytes: + _require(type(index) is int and 0 <= index < len(self.blobs), "checkpoint blob index changed") + return self.blobs[index] + + def decode(self, node: Any, *, depth: int = 0) -> Any: + self._node(depth) + _require(type(node) is dict and type(node.get("t")) is str, "checkpoint node changed") + tag = node["t"] + if tag == "none": + _require(set(node) == {"t"}, "none checkpoint node changed") + return None + if tag == "bool": + _require(set(node) == {"t", "v"} and type(node["v"]) is bool, "bool checkpoint node changed") + return node["v"] + if tag == "int": + _require(set(node) == {"t", "v"} and type(node["v"]) is str, "int checkpoint node changed") + text = node["v"] + _require(text == "0" or text.lstrip("-").isdigit(), "checkpoint integer spelling changed") + value = int(text) + _require(str(value) == text, "checkpoint integer is noncanonical") + return value + if tag == "float": + _require(set(node) == {"t", "v"} and type(node["v"]) is str, "float checkpoint node changed") + try: + value = float.fromhex(node["v"]) + except ValueError as error: + raise NativeEightExecutorR6Error("checkpoint float is invalid") from error + _require(math.isfinite(value) and value.hex() == node["v"], "checkpoint float is noncanonical") + return value + if tag == "str": + _require(set(node) == {"t", "v"} and type(node["v"]) is str, "string checkpoint node changed") + return node["v"] + if tag == "bytes": + _require(set(node) == {"t", "v"} and type(node["v"]) is str, "bytes checkpoint node changed") + try: + return bytes.fromhex(node["v"]) + except ValueError as error: + raise NativeEightExecutorR6Error("checkpoint bytes hex is invalid") from error + if tag in {"list", "tuple"}: + _require(set(node) == {"t", "v"} and type(node["v"]) is list, "sequence checkpoint node changed") + values = [self.decode(item, depth=depth + 1) for item in node["v"]] + return values if tag == "list" else tuple(values) + if tag == "map": + _require(set(node) == {"t", "v"} and type(node["v"]) is list, "mapping checkpoint node changed") + result: dict[Any, Any] = {} + identities: set[tuple[str, str]] = set() + previous: Optional[bytes] = None + for pair in node["v"]: + _require(type(pair) is list and len(pair) == 2, "checkpoint mapping pair changed") + encoded_key = _canonical_bytes(pair[0]) + _require(previous is None or previous < encoded_key, "checkpoint mapping keys are unsorted or duplicated") + previous = encoded_key + key = self.decode(pair[0], depth=depth + 1) + _require(type(key) in {str, int}, "checkpoint mapping key type is unsafe") + identity = (type(key).__name__, str(key)) + _require(identity not in identities, "checkpoint mapping key repeats") + identities.add(identity) + result[key] = self.decode(pair[1], depth=depth + 1) + return result + if tag == "torch": + _require(set(node) == {"t", "dtype", "shape", "blob"}, "tensor checkpoint node changed") + dtype = _TORCH_DTYPES.get(node["dtype"]) + shape = node["shape"] + _require(dtype is not None, "checkpoint tensor dtype is not allowed") + _require( + type(shape) is list + and len(shape) <= MAX_TENSOR_RANK + and all(type(value) is int and value >= 0 for value in shape), + "checkpoint tensor shape changed", + ) + count = math.prod(shape) + itemsize = torch.empty((), dtype=dtype).element_size() + blob = self._blob(node["blob"]) + _require(len(blob) == count * itemsize, "checkpoint tensor byte count changed") + if count == 0: + return torch.empty(tuple(shape), dtype=dtype) + raw = torch.frombuffer(bytearray(blob), dtype=torch.uint8).clone() + return raw.view(dtype).reshape(tuple(shape)) + if tag == "numpy": + _require(set(node) == {"t", "dtype", "shape", "blob"}, "ndarray checkpoint node changed") + _require(type(node["dtype"]) is str, "checkpoint ndarray dtype changed") + try: + dtype = np.dtype(node["dtype"]) + except TypeError as error: + raise NativeEightExecutorR6Error("checkpoint ndarray dtype is invalid") from error + _require( + not dtype.hasobject and dtype.fields is None and dtype.kind in "biufc", + "checkpoint ndarray dtype is unsafe", + ) + shape = node["shape"] + _require( + type(shape) is list + and len(shape) <= MAX_TENSOR_RANK + and all(type(value) is int and value >= 0 for value in shape), + "checkpoint ndarray shape changed", + ) + count = math.prod(shape) + blob = self._blob(node["blob"]) + _require(len(blob) == count * dtype.itemsize, "checkpoint ndarray byte count changed") + return np.frombuffer(blob, dtype=dtype).copy().reshape(tuple(shape)) + raise NativeEightExecutorR6Error(f"unknown checkpoint node tag {tag!r}") + + +def serialize_checkpoint(checkpoint: Mapping[str, Any]) -> bytes: + """Serialize one semantically valid checkpoint without Python pickle.""" + + validate_checkpoint_semantics(checkpoint) + encoder = _SafeCheckpointEncoder() + tree = encoder.encode(dict(checkpoint)) + blob_receipts = [ + {"index": index, "bytes": len(blob), "sha256": _sha256(blob)} + for index, blob in enumerate(encoder.blobs) + ] + manifest = { + "schema": CHECKPOINT_CODEC_SCHEMA, + "tree": tree, + "blobs": blob_receipts, + "node_count": encoder.nodes, + "training_authorized": False, + "scientific_launch_authorized": False, + } + manifest_bytes = _canonical_bytes(manifest) + _require(len(manifest_bytes) <= MAX_MANIFEST_BYTES, "checkpoint manifest is too large") + prefix = ( + CHECKPOINT_MAGIC + + struct.pack("!Q", len(manifest_bytes)) + + manifest_bytes + + b"".join(encoder.blobs) + ) + _require(len(prefix) + CHECKPOINT_DIGEST_BYTES <= MAX_CHECKPOINT_BYTES, "checkpoint exceeds size bound") + return prefix + hashlib.sha256(prefix).digest() + + +def deserialize_checkpoint(payload: bytes) -> dict[str, Any]: + """Hash raw bytes first, then parse only the bounded non-executable codec.""" + + _require(type(payload) is bytes and payload, "checkpoint bytes are empty") + _require(len(payload) <= MAX_CHECKPOINT_BYTES, "checkpoint bytes exceed the size bound") + minimum = len(CHECKPOINT_MAGIC) + 8 + CHECKPOINT_DIGEST_BYTES + _require(len(payload) >= minimum and payload.startswith(CHECKPOINT_MAGIC), "checkpoint magic changed") + prefix = payload[:-CHECKPOINT_DIGEST_BYTES] + observed_digest = payload[-CHECKPOINT_DIGEST_BYTES:] + _require( + hashlib.sha256(prefix).digest() == observed_digest, + "checkpoint raw-byte digest changed before parsing", + ) + manifest_length = struct.unpack( + "!Q", prefix[len(CHECKPOINT_MAGIC) : len(CHECKPOINT_MAGIC) + 8] + )[0] + _require(0 < manifest_length <= MAX_MANIFEST_BYTES, "checkpoint manifest length changed") + start = len(CHECKPOINT_MAGIC) + 8 + stop = start + manifest_length + _require(stop <= len(prefix), "checkpoint manifest is truncated") + try: + manifest = json.loads(prefix[start:stop].decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightExecutorR6Error("checkpoint manifest is not valid JSON") from error + _require( + type(manifest) is dict + and set(manifest) + == { + "schema", + "tree", + "blobs", + "node_count", + "training_authorized", + "scientific_launch_authorized", + } + and manifest["schema"] == CHECKPOINT_CODEC_SCHEMA + and manifest["training_authorized"] is False + and manifest["scientific_launch_authorized"] is False, + "checkpoint codec manifest changed", + ) + _require( + _canonical_bytes(manifest) == prefix[start:stop], + "checkpoint manifest JSON is not canonical", + ) + receipts = manifest["blobs"] + _require(type(receipts) is list, "checkpoint blob receipt list changed") + blobs: list[bytes] = [] + cursor = stop + for expected_index, receipt in enumerate(receipts): + _require( + type(receipt) is dict + and set(receipt) == {"index", "bytes", "sha256"} + and receipt["index"] == expected_index + and type(receipt["bytes"]) is int + and receipt["bytes"] >= 0 + and _valid_sha256(receipt["sha256"]), + "checkpoint blob receipt changed", + ) + right = cursor + receipt["bytes"] + _require(right <= len(prefix), "checkpoint blob is truncated") + blob = prefix[cursor:right] + _require(_sha256(blob) == receipt["sha256"], "checkpoint blob digest changed") + blobs.append(blob) + cursor = right + _require(cursor == len(prefix), "checkpoint has trailing unreceipted bytes") + decoder = _SafeCheckpointDecoder(blobs) + value = decoder.decode(manifest["tree"]) + _require( + decoder.nodes == manifest["node_count"] + and type(value) is dict, + "checkpoint decoded node count or root changed", + ) + validate_checkpoint_semantics(value) + return value + + +class _PinnedDirectory: + """Keep every directory component open and revalidate name-to-inode edges.""" + + def __init__(self, path: Path) -> None: + absolute = Path(path).absolute() + parts = absolute.parts + _require( + parts and parts[0] == os.sep and all(part not in {"", ".", ".."} for part in parts[1:]), + "checkpoint root is not canonical absolute", + ) + flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | getattr(os, "O_NOFOLLOW", 0) + | getattr(os, "O_CLOEXEC", 0) + ) + descriptors: list[int] = [] + edges: list[tuple[int, str, int, int, int]] = [] + try: + current = os.open(os.sep, flags) + descriptors.append(current) + for component in parts[1:]: + child = os.open(component, flags, dir_fd=current) + metadata = os.fstat(child) + _require(stat.S_ISDIR(metadata.st_mode), "checkpoint path component is not a directory") + descriptors.append(child) + edges.append((current, component, child, metadata.st_dev, metadata.st_ino)) + current = child + except BaseException: + for descriptor in reversed(descriptors): + try: + os.close(descriptor) + except OSError: + pass + raise + self.path = absolute + self._descriptors = descriptors + self._edges = edges + self.fd = descriptors[-1] + self._closed = False + self.verify() + + def verify(self) -> None: + _require(not self._closed, "checkpoint directory is closed") + for parent, name, child, device, inode in self._edges: + try: + named = os.stat(name, dir_fd=parent, follow_symlinks=False) + opened = os.fstat(child) + except OSError as error: + raise NativeEightExecutorR6Error( + f"checkpoint directory identity cannot be revalidated: {error}" + ) from error + _require( + stat.S_ISDIR(named.st_mode) + and (named.st_dev, named.st_ino) == (device, inode) + and (opened.st_dev, opened.st_ino) == (device, inode), + "checkpoint directory path was replaced after pinning", + ) + + def close(self) -> None: + if self._closed: + return + self._closed = True + for descriptor in reversed(self._descriptors): + try: + os.close(descriptor) + except OSError: + pass + + def __enter__(self) -> "_PinnedDirectory": + self.verify() + return self + + def __exit__(self, *_: object) -> None: + self.close() + + +def _checkpoint_blob_name(digest: str) -> str: + _require(_valid_sha256(digest), "checkpoint blob digest is invalid") + return f"review_checkpoint_blob_{digest}.r6ckpt" + + +def _is_checkpoint_blob_name(name: str) -> bool: + prefix = "review_checkpoint_blob_" + suffix = ".r6ckpt" + return ( + type(name) is str + and name.startswith(prefix) + and name.endswith(suffix) + and _valid_sha256(name[len(prefix) : -len(suffix)]) + ) + + +class AtomicCheckpointStore: + """One transactional logical index over immutable content-addressed blobs.""" + + INDEX_NAME = "review_checkpoint_transaction_index_r6.json" + LOCK_NAME = ".review_checkpoint_transaction_r6.lock" + + def __init__( + self, + root: Path, + *, + fault_hook: Optional[Callable[[str], None]] = None, + ) -> None: + self.root = Path(root).absolute() + self._directory = _PinnedDirectory(self.root) + self._fault_hook = fault_hook + flags = ( + os.O_RDWR + | os.O_CREAT + | getattr(os, "O_NOFOLLOW", 0) + | getattr(os, "O_CLOEXEC", 0) + ) + try: + self._lock_fd = os.open( + self.LOCK_NAME, flags, 0o600, dir_fd=self._directory.fd + ) + metadata = os.fstat(self._lock_fd) + _require(stat.S_ISREG(metadata.st_mode), "checkpoint transaction lock is not regular") + except BaseException: + self._directory.close() + raise + + def close(self) -> None: + if getattr(self, "_lock_fd", None) is not None: + try: + os.close(self._lock_fd) + finally: + self._lock_fd = None + self._directory.close() + + def __enter__(self) -> "AtomicCheckpointStore": + self._directory.verify() + return self + + def __exit__(self, *_: object) -> None: + self.close() + + def _fault(self, stage: str) -> None: + if self._fault_hook is not None: + self._fault_hook(stage) + + def _acquire(self, *, exclusive: bool) -> None: + self._directory.verify() + _require(self._lock_fd is not None, "checkpoint transaction lock is closed") + fcntl.flock(self._lock_fd, fcntl.LOCK_EX if exclusive else fcntl.LOCK_SH) + self._directory.verify() + + def _release(self) -> None: + _require(self._lock_fd is not None, "checkpoint transaction lock is closed") + fcntl.flock(self._lock_fd, fcntl.LOCK_UN) + + def _validate_name(self, name: str) -> None: + _require( + type(name) is str + and name + and name not in {".", ".."} + and os.sep not in name + and (os.altsep is None or os.altsep not in name), + "checkpoint leaf name is unsafe", + ) + + def _read_leaf(self, name: str, *, maximum: int) -> bytes: + self._validate_name(name) + self._directory.verify() + flags = os.O_RDONLY | getattr(os, "O_NOFOLLOW", 0) | getattr(os, "O_CLOEXEC", 0) + try: + descriptor = os.open(name, flags, dir_fd=self._directory.fd) + except OSError as error: + raise NativeEightExecutorR6Error(f"checkpoint leaf cannot be opened: {name}: {error}") from error + try: + metadata = os.fstat(descriptor) + _require(stat.S_ISREG(metadata.st_mode), f"checkpoint leaf is not regular: {name}") + _require(0 <= metadata.st_size <= maximum, f"checkpoint leaf is too large: {name}") + pieces: list[bytes] = [] + remaining = metadata.st_size + while remaining: + block = os.read(descriptor, min(1024 * 1024, remaining)) + _require(bool(block), f"checkpoint leaf truncated during read: {name}") + pieces.append(block) + remaining -= len(block) + payload = b"".join(pieces) + _require(len(payload) == metadata.st_size, f"checkpoint leaf changed during read: {name}") + return payload + finally: + os.close(descriptor) + + def _leaf_exists(self, name: str) -> bool: + self._validate_name(name) + self._directory.verify() + try: + metadata = os.stat(name, dir_fd=self._directory.fd, follow_symlinks=False) + except FileNotFoundError: + return False + _require(stat.S_ISREG(metadata.st_mode), f"checkpoint leaf is not regular: {name}") + return True + + def _write_exclusive(self, name: str, payload: bytes, *, mode: int = 0o440) -> None: + self._validate_name(name) + self._directory.verify() + flags = ( + os.O_WRONLY + | os.O_CREAT + | os.O_EXCL + | getattr(os, "O_NOFOLLOW", 0) + | getattr(os, "O_CLOEXEC", 0) + ) + descriptor = os.open(name, flags, mode, dir_fd=self._directory.fd) + try: + view = memoryview(payload) + while view: + written = os.write(descriptor, view) + _require(written > 0, "checkpoint write made no progress") + view = view[written:] + os.fsync(descriptor) + os.fchmod(descriptor, mode) + except BaseException: + try: + os.unlink(name, dir_fd=self._directory.fd) + except OSError: + pass + raise + finally: + os.close(descriptor) + + def _write_blob(self, payload: bytes) -> tuple[str, str]: + digest = _sha256(payload) + name = _checkpoint_blob_name(digest) + if self._leaf_exists(name): + _require( + _sha256(self._read_leaf(name, maximum=MAX_CHECKPOINT_BYTES)) == digest, + "existing checkpoint blob bytes differ from its name", + ) + else: + self._write_exclusive(name, payload) + return name, digest + + def _index_bytes(self, unsigned: Mapping[str, Any]) -> bytes: + value = { + **dict(unsigned), + "index_sha256": canonical_sha256(unsigned, domain=CHECKPOINT_INDEX_SCHEMA), + } + return _canonical_bytes(value) + + def _load_index_optional(self) -> Optional[dict[str, Any]]: + if not self._leaf_exists(self.INDEX_NAME): + return None + payload = self._read_leaf(self.INDEX_NAME, maximum=16 * 1024 * 1024) + try: + value = json.loads(payload.decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightExecutorR6Error("checkpoint transaction index is invalid JSON") from error + _require(type(value) is dict and _canonical_bytes(value) == payload, "checkpoint index is not canonical") + fields = { + "schema", + "generation", + "previous_index_sha256", + "roles", + "training_authorized", + "scientific_launch_authorized", + "index_sha256", + } + _require(set(value) == fields and value["schema"] == CHECKPOINT_INDEX_SCHEMA, "checkpoint index fields changed") + unsigned = dict(value) + observed = unsigned.pop("index_sha256") + _require( + observed == canonical_sha256(unsigned, domain=CHECKPOINT_INDEX_SCHEMA), + "checkpoint index digest changed", + ) + _require( + type(value["generation"]) is int + and value["generation"] >= 1 + and (value["previous_index_sha256"] is None or _valid_sha256(value["previous_index_sha256"])) + and value["training_authorized"] is False + and value["scientific_launch_authorized"] is False, + "checkpoint index generation or flags changed", + ) + roles = value["roles"] + _require( + type(roles) is dict and set(roles) == {"latest", "best", "milestones"}, + "checkpoint index roles changed", + ) + for label, entry in (("latest", roles["latest"]), ("best", roles["best"])): + self._validate_entry(entry, label=label) + milestones = roles["milestones"] + _require(type(milestones) is dict, "checkpoint milestone index changed") + latest_epoch = roles["latest"]["epoch"] + expected_keys = [str(value) for value in MILESTONE_EPOCHS if value <= latest_epoch] + _require(sorted(milestones, key=int) == expected_keys, "checkpoint milestone keys changed") + for key, entry in milestones.items(): + _require(int(key) in MILESTONE_EPOCHS, "checkpoint milestone epoch changed") + self._validate_entry(entry, label=f"milestone {key}") + _require(entry["epoch"] == int(key), "checkpoint milestone entry epoch changed") + return value + + @staticmethod + def _validate_entry(entry: Any, *, label: str) -> None: + _require( + type(entry) is dict + and set(entry) + == {"blob_name", "checkpoint_sha256", "epoch", "cell_id", "resume_sha256"} + and _is_checkpoint_blob_name(entry["blob_name"]) + and _valid_sha256(entry["checkpoint_sha256"]) + and entry["blob_name"] == _checkpoint_blob_name(entry["checkpoint_sha256"]) + and type(entry["epoch"]) is int + and 1 <= entry["epoch"] <= MAX_EPOCHS + and entry["cell_id"] in CELL_ORDER + and _valid_sha256(entry["resume_sha256"]), + f"checkpoint {label} entry changed", + ) + + def _publish_index(self, payload: bytes) -> None: + temporary = f".review_checkpoint_index_{secrets.token_hex(16)}.tmp" + self._write_exclusive(temporary, payload, mode=0o600) + self._fault("before_index_replace") + try: + self._directory.verify() + os.replace( + temporary, + self.INDEX_NAME, + src_dir_fd=self._directory.fd, + dst_dir_fd=self._directory.fd, + ) + os.fsync(self._directory.fd) + finally: + try: + os.unlink(temporary, dir_fd=self._directory.fd) + except FileNotFoundError: + pass + + def _referenced_blobs(self, index: Optional[Mapping[str, Any]]) -> set[str]: + if index is None: + return set() + roles = index["roles"] + entries = [roles["latest"], roles["best"], *roles["milestones"].values()] + return {entry["blob_name"] for entry in entries} + + def _recover_orphans(self, index: Optional[Mapping[str, Any]]) -> None: + """Remove only exact r6 blob names absent from the committed index.""" + + self._directory.verify() + referenced = self._referenced_blobs(index) + for name in os.listdir(self._directory.fd): + if _is_checkpoint_blob_name(name) and name not in referenced: + metadata = os.stat(name, dir_fd=self._directory.fd, follow_symlinks=False) + _require(stat.S_ISREG(metadata.st_mode), "orphan checkpoint blob is not regular") + os.unlink(name, dir_fd=self._directory.fd) + os.fsync(self._directory.fd) + + def commit_completed_epoch(self, checkpoint: Mapping[str, Any]) -> Mapping[str, str]: + self._acquire(exclusive=True) + try: + validated = validate_checkpoint_semantics(checkpoint) + _require(validated["epoch_complete"] is True, "checkpoint commit plan is not fully complete") + envelope = checkpoint["envelope"] + selection = validated["selection"] + epoch = selection["completed_epochs"] + _require( + type(epoch) is int + and epoch == envelope["plan_epoch"] + 1 + and epoch >= 1, + "checkpoint selection epoch differs from completed plan", + ) + improved = selection["last_improved"] + _require(type(improved) is bool, "checkpoint cannot derive improvement from selection history") + serialized = serialize_checkpoint(checkpoint) + previous = self._load_index_optional() + if previous is None: + _require(epoch == 1 and improved, "first checkpoint must be improving epoch one") + generation = 1 + previous_sha = None + previous_milestones: dict[str, Any] = {} + previous_best = None + else: + latest_epoch = previous["roles"]["latest"]["epoch"] + _require(epoch == latest_epoch + 1, "checkpoint epochs are not committed sequentially") + generation = previous["generation"] + 1 + previous_sha = previous["index_sha256"] + previous_milestones = copy.deepcopy(previous["roles"]["milestones"]) + previous_best = copy.deepcopy(previous["roles"]["best"]) + self._recover_orphans(previous) + blob_name, checkpoint_sha = self._write_blob(serialized) + entry = { + "blob_name": blob_name, + "checkpoint_sha256": checkpoint_sha, + "epoch": epoch, + "cell_id": envelope["cell_id"], + "resume_sha256": envelope["resume_sha256"], + } + self._fault("after_blob_before_index") + best = copy.deepcopy(entry) if improved else previous_best + _require(best is not None, "nonimproving checkpoint lacks a committed best") + milestones = previous_milestones + if epoch in MILESTONE_EPOCHS: + _require(str(epoch) not in milestones, "checkpoint milestone already committed") + milestones[str(epoch)] = copy.deepcopy(entry) + unsigned = { + "schema": CHECKPOINT_INDEX_SCHEMA, + "generation": generation, + "previous_index_sha256": previous_sha, + "roles": { + "latest": copy.deepcopy(entry), + "best": best, + "milestones": milestones, + }, + "training_authorized": False, + "scientific_launch_authorized": False, + } + index_payload = self._index_bytes(unsigned) + self._publish_index(index_payload) + self._fault("after_index_replace") + committed = self._load_index_optional() + _require(committed is not None and committed["roles"]["latest"] == entry, "checkpoint index publication failed") + self._recover_orphans(committed) + return MappingProxyType( + { + "checkpoint_sha256": checkpoint_sha, + "index_sha256": committed["index_sha256"], + } + ) + finally: + self._release() + + def _load_role(self, role: str, *, milestone: Optional[int] = None) -> dict[str, Any]: + self._acquire(exclusive=False) + try: + index = self._load_index_optional() + _require(index is not None, "checkpoint transaction index is absent") + if role == "milestone": + _require(milestone in MILESTONE_EPOCHS, "checkpoint milestone request changed") + entry = index["roles"]["milestones"].get(str(milestone)) + _require(entry is not None, "requested checkpoint milestone has not been reached") + else: + _require(role in {"latest", "best"}, "checkpoint logical role changed") + entry = index["roles"][role] + self._validate_entry(entry, label=role) + payload = self._read_leaf(entry["blob_name"], maximum=MAX_CHECKPOINT_BYTES) + _require(_sha256(payload) == entry["checkpoint_sha256"], "checkpoint blob differs from index") + checkpoint = deserialize_checkpoint(payload) + _require( + checkpoint["envelope"]["resume_sha256"] == entry["resume_sha256"] + and checkpoint["envelope"]["cell_id"] == entry["cell_id"], + "checkpoint blob semantic identity differs from index", + ) + return checkpoint + finally: + self._release() + + def load_latest(self) -> dict[str, Any]: + return self._load_role("latest") + + def load_best(self) -> dict[str, Any]: + return self._load_role("best") + + def load_milestone(self, epoch: int) -> dict[str, Any]: + return self._load_role("milestone", milestone=epoch) + + +def contract_summary() -> dict[str, Any]: + return { + "schema": SCHEMA, + "status": "PREPARATION_ONLY_ADAPTER_AND_STATIC_FINAL_RELEASE_UNBOUND_LAUNCH_CLOSED", + "r5_executor_source_sha256": R5_SOURCE_SHA256, + "production_adapter_source_sha256": EXPECTED_ADAPTER_SOURCE_SHA256, + "production_adapter_receipt_sha256": EXPECTED_ADAPTER_RECEIPT_SHA256, + "caller_model_inputs_supported": False, + "execution_entrypoint": "adapter_owned_execute_next_step_only", + "execution_policy_binding": ( + "optimizer_scheduler_callable_scaler_autocast_retry_and_adapter" + ), + "selection": { + "maximum_epochs": MAX_EPOCHS, + "patience": PATIENCE, + "earliest_stop_epoch": EARLIEST_STOP_EPOCH, + "improvement_rule": "strict_lower", + "tie_rule": "earliest_epoch_retained", + "resume_validation": "full_history_semantic_replay", + }, + "resume": "nested_r5_state_plus_semantic_adapter_cursor_and_step_identity_chain", + "checkpoint_codec": "bounded_non_pickle_raw_hash_before_canonical_json_parse", + "checkpoint_store": ( + "pinned_directory_descriptor_content_addressed_blobs_single_transaction_index" + ), + "checkpoint_commit": "completed_epoch_only_improvement_derived_from_replayed_selection", + "static_final_release_bound": STATIC_FINAL_RELEASE_BOUND, + "training_authorized": TRAINING_AUTHORIZED, + "scientific_launch_authorized": SCIENTIFIC_LAUNCH_AUTHORIZED, + "execution_certified": EXECUTION_CERTIFIED, + "nova_submission_authorized": NOVA_SUBMISSION_AUTHORIZED, + "affinose_supported": AFFINOSE_SUPPORTED, + "downstream_supported": DOWNSTREAM_SUPPORTED, + } + + +__all__ = [ + "AFFINOSE_SUPPORTED", + "AdamWContract", + "AtomicCheckpointStore", + "CELL_ORDER", + "DevelopmentBatch", + "DevelopmentResult", + "DOWNSTREAM_SUPPORTED", + "EARLIEST_STOP_EPOCH", + "EXPECTED_ADAPTER_RECEIPT_SHA256", + "EXPECTED_ADAPTER_SOURCE_SHA256", + "FixedDevelopmentContract", + "FrozenEpochPlan", + "MAX_EPOCHS", + "MILESTONE_EPOCHS", + "NativeEightCompositeR5", + "NativeEightConfig", + "NativeEightExecutorR6Error", + "NativeEightProductionExecutor", + "OBJECTIVES", + "PATIENCE", + "PlannedMicrobatch", + "R5_SOURCE_SHA256", + "SCHEMA", + "STATIC_FINAL_RELEASE_BOUND", + "StepDiagnostic", + "StrictLowerSelection", + "capture_optimizer_boundary_resume", + "contract_summary", + "deserialize_checkpoint", + "restore_optimizer_boundary_resume", + "serialize_checkpoint", + "validate_checkpoint_semantics", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r7/review_a5_native_eight_executor_r7.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r7/review_a5_native_eight_executor_r7.py new file mode 100644 index 0000000000000000000000000000000000000000..f9f6f7b926e03c44e98c1b5a1cb83fafa0eb82d4 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r7/review_a5_native_eight_executor_r7.py @@ -0,0 +1,3109 @@ +"""Launch-closed deterministic native-eight executor r7. + +R7 is a no-overwrite successor to executor r6. It repairs boundaries that +cannot be repaired by a receipt alone: + +* one frozen adapter owns the exact r5 planner/executor class identities; +* execution-policy identities are stable across Python processes and bind the + actual optimizer, scheduler, scaler, autocast, and retry implementations; +* one state machine enforces train-complete -> matching fixed-development -> + strict-lower decision -> completed-epoch publication; +* every checkpoint binds one run, cell, adapter, development surface, policy, + and predecessor checkpoint; +* the transaction index rejects mixed lineages and treats an already-renamed + identical checkpoint as an idempotent successful commit; and +* the non-pickle codec rejects noncanonical or unreferenced blob surfaces. + +The immutable adapter-r2 source/receipt and corrected native-eight scientific +child authority are bound read-only below. They are preparation evidence, not +launch authorization: static-tokenizer, CUDA, route, duplicate, and final +release gates remain pending. Isolated CPU fixtures may exercise this module +but cannot authorize training, Nova submission, AFFINose, or downstream +evaluation. +""" + +from __future__ import annotations + +import copy +from contextlib import nullcontext +from dataclasses import asdict, dataclass +import fcntl +import hashlib +import inspect +import json +import math +import os +from pathlib import Path +import re +import secrets +import stat +import struct +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Callable, Mapping, Optional, Sequence + +import numpy as np +import torch + + +SCHEMA = "bertose_a5_native_eight_deterministic_executor_20260721_r7" +RUN_SCHEMA = "bertose_a5_native_eight_run_contract_20260721_r7" +POLICY_SCHEMA = "bertose_a5_native_eight_exact_execution_policy_20260721_r7" +CHECKPOINT_SCHEMA = "bertose_a5_native_eight_completed_epoch_checkpoint_20260721_r7" +CHECKPOINT_CODEC_SCHEMA = "bertose_a5_safe_checkpoint_codec_20260721_r7" +CHECKPOINT_INDEX_SCHEMA = "bertose_a5_checkpoint_transaction_index_20260721_r7" +DEVELOPMENT_WITNESS_SCHEMA = "bertose_a5_matching_development_witness_20260721_r7" + +CHECKPOINT_MAGIC = b"BERTOSE-A5-R7-CKPT\x00" +CHECKPOINT_DIGEST_BYTES = 32 +MAX_MANIFEST_BYTES = 512 * 1024 * 1024 +MAX_CHECKPOINT_BYTES = 64 * 1024 * 1024 * 1024 +MAX_CODEC_DEPTH = 128 +MAX_CODEC_NODES = 20_000_000 +MAX_TENSOR_RANK = 16 +MAX_SHAPE_DIMENSION = (1 << 63) - 1 + +MAX_EPOCHS = 100 +PATIENCE = 15 +EARLIEST_STOP_EPOCH = 16 +MILESTONE_EPOCHS = (25, 50, 75, 100) +PRODUCTION_TRAINABLE_CELLS = ( + "A000", + "A100", + "A010", + "A001", + "A110", + "A101", + "A011", + "A111", +) +HISTORICAL_EVIDENCE_ONLY_CELLS = ("A000", "A111") + +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +EXECUTION_CERTIFIED = False +NOVA_SUBMISSION_AUTHORIZED = False +AFFINOSE_SUPPORTED = False +DOWNSTREAM_SUPPORTED = False +STATIC_FINAL_RELEASE_BOUND = False + +RUNTIME_ROOT = Path(__file__).absolute().parent +WRITING_ROOT = Path(__file__).absolute().parents[4] +R6_SOURCE_PATH = ( + RUNTIME_ROOT.parent + / "a5_pretraining_failclosed_integration_20260721_r6" + / "review_a5_native_eight_executor_r6.py" +) +R6_SOURCE_SHA256 = "e47e6e9810db0e8ec9d37ce5533f762e287b162f811bfadc347666f5ad78db82" + +# Immutable adapter-r2 handoff, independently rehashed and tested before this +# binding. These preparation-only artifacts cannot self-authorize launch. +ADAPTER_R2_SOURCE_PATH: Optional[Path] = ( + WRITING_ROOT + / "review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r2" + / "review_a5_native_eight_data_adapter_r2.py" +) +ADAPTER_R2_SOURCE_SHA256: Optional[str] = ( + "9f8f167148aa234df413e4c3d4e1846881781c8e5a19bd91b0b178b260a3a537" +) +ADAPTER_R2_RECEIPT_PATH: Optional[Path] = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r2" + / "review_a5_native_eight_data_adapter_receipt_r2.json" +) +ADAPTER_R2_RECEIPT_SHA256: Optional[str] = ( + "3b2118e128a5550ba4918b4f4f2c6d8045e319b7cff37b76d74dce6b3220c9f0" +) + +SCIENTIFIC_BOUNDARY_AUTHORITY_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1" + / "review_a5_native_eight_scientific_boundary_child_authority_r1.json" +) +SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256 = ( + "1238f76e5da5184d16d33077bf3e5342033918fadb4eba84242c47cb1b1322cc" +) +SCIENTIFIC_BOUNDARY_RECEIPT_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1" + / "review_a5_native_eight_scientific_boundary_child_receipt_r1.json" +) +SCIENTIFIC_BOUNDARY_RECEIPT_SHA256 = ( + "fb65dddf0bc61b4c73b5dc5ec796967e65263e9d7bdc4882e07684e882280fdb" +) + + +class NativeEightExecutorR7Error(RuntimeError): + """Fail-closed r7 policy, lifecycle, checkpoint, or store error.""" + + +class ExecutorR7BootstrapError(NativeEightExecutorR7Error): + """A frozen source, receipt, or deterministic module identity changed.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightExecutorR7Error(message) + + +def _valid_sha256(value: object) -> bool: + return ( + type(value) is str + and len(value) == 64 + and all(character in "0123456789abcdef" for character in value) + ) + + +def _valid_execution_device(value: object) -> bool: + if type(value) is not str: + return False + try: + parsed = torch.device(value) + except (RuntimeError, ValueError): + return False + return str(parsed) == value and ( + value == "cpu" or bool(re.fullmatch(r"cuda:[0-9]+", value)) + ) + + +def _observed_hardware_profile(device: torch.device) -> dict[str, Any]: + if device.type == "cpu": + return {"device_type": "cpu", "logical_device": "cpu"} + _require( + device.type == "cuda" + and device.index is not None + and torch.cuda.is_available(), + "indexed CUDA hardware profile is unavailable", + ) + properties = torch.cuda.get_device_properties(device) + cudnn_version = torch.backends.cudnn.version() + profile = { + "device_type": "cuda", + "logical_device": str(device), + "product_name": str(properties.name), + "total_memory_bytes": int(properties.total_memory), + "compute_capability_major": int(properties.major), + "compute_capability_minor": int(properties.minor), + "multiprocessor_count": int(properties.multi_processor_count), + "torch_cuda_version": str(torch.version.cuda), + "cudnn_version": ( + int(cudnn_version) if cudnn_version is not None else None + ), + } + _require( + profile["product_name"] + and profile["total_memory_bytes"] > 0 + and profile["compute_capability_major"] > 0 + and profile["multiprocessor_count"] > 0 + and profile["torch_cuda_version"] not in {"", "None"}, + "CUDA hardware profile is incomplete", + ) + return profile + + +def _validate_hardware_profile(value: object, *, execution_device: str) -> str: + _require(type(value) is dict, "hardware profile is not exact") + if execution_device == "cpu": + _require( + value == {"device_type": "cpu", "logical_device": "cpu"}, + "CPU hardware profile changed", + ) + else: + fields = { + "device_type", + "logical_device", + "product_name", + "total_memory_bytes", + "compute_capability_major", + "compute_capability_minor", + "multiprocessor_count", + "torch_cuda_version", + "cudnn_version", + } + _require( + set(value) == fields + and value["device_type"] == "cuda" + and value["logical_device"] == execution_device + and type(value["product_name"]) is str + and bool(value["product_name"]) + and type(value["total_memory_bytes"]) is int + and value["total_memory_bytes"] > 0 + and type(value["compute_capability_major"]) is int + and value["compute_capability_major"] > 0 + and type(value["compute_capability_minor"]) is int + and value["compute_capability_minor"] >= 0 + and type(value["multiprocessor_count"]) is int + and value["multiprocessor_count"] > 0 + and type(value["torch_cuda_version"]) is str + and bool(value["torch_cuda_version"]) + and ( + value["cudnn_version"] is None + or ( + type(value["cudnn_version"]) is int + and value["cudnn_version"] > 0 + ) + ), + "CUDA hardware profile fields changed", + ) + return canonical_sha256(value, domain="bertose-a5-run-hardware-profile-r7") + + +def _sha256(payload: bytes) -> str: + return hashlib.sha256(payload).hexdigest() + + +def _canonical_bytes(value: object) -> bytes: + return ( + json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False) + + "\n" + ).encode("utf-8") + + +def canonical_sha256(value: object, *, domain: str) -> str: + return hashlib.sha256(domain.encode("ascii") + b"\0" + _canonical_bytes(value)).hexdigest() + + +def _read_regular_nofollow(path: Path, *, label: str, maximum: Optional[int] = None) -> bytes: + if not hasattr(os, "O_NOFOLLOW") or not hasattr(os, "O_DIRECTORY"): + raise ExecutorR7BootstrapError("platform lacks complete no-follow traversal") + absolute = Path(path) + if not absolute.is_absolute(): + raise ExecutorR7BootstrapError(f"{label} path is not absolute") + parts = absolute.parts + if not parts or parts[0] != os.sep or any(part in {"", ".", ".."} for part in parts[1:]): + raise ExecutorR7BootstrapError(f"{label} path is not canonical") + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + descriptor: Optional[int] = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in parts[1:-1]: + next_descriptor = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = next_descriptor + leaf_descriptor = os.open(parts[-1], leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf_descriptor + before = os.fstat(descriptor) + if not stat.S_ISREG(before.st_mode): + raise ExecutorR7BootstrapError(f"{label} is not a regular no-follow file") + if maximum is not None and before.st_size > maximum: + raise ExecutorR7BootstrapError(f"{label} exceeds its byte bound") + pieces: list[bytes] = [] + remaining = before.st_size + while remaining: + block = os.read(descriptor, min(1024 * 1024, remaining)) + if not block: + raise ExecutorR7BootstrapError(f"{label} truncated during read") + pieces.append(block) + remaining -= len(block) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + ): + raise ExecutorR7BootstrapError(f"{label} changed while reading") + return b"".join(pieces) + except OSError as error: + raise ExecutorR7BootstrapError(f"{label} no-follow open failed: {error}") from error + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + + +def _load_bound_module(path: Path, expected_sha256: str, *, label: str) -> ModuleType: + source = _read_regular_nofollow(path, label=label) + observed = _sha256(source) + if observed != expected_sha256: + raise ExecutorR7BootstrapError(f"{label} hash changed") + safe_label = re.sub(r"[^a-zA-Z0-9_]", "_", label) + module_name = f"_review_a5_r7_bound_{safe_label}_{expected_sha256[:20]}" + existing = sys.modules.get(module_name) + if existing is not None: + if ( + getattr(existing, "__r7_bound_source_sha256__", None) != expected_sha256 + or getattr(existing, "__r7_bound_source_path__", None) != os.fspath(path) + ): + raise ExecutorR7BootstrapError(f"{label} deterministic module slot was poisoned") + return existing + module = ModuleType(module_name) + module.__file__ = os.fspath(path) + module.__package__ = "" + module.__r7_bound_source_sha256__ = expected_sha256 + module.__r7_bound_source_path__ = os.fspath(path) + sys.modules[module_name] = module + try: + exec(compile(source, os.fspath(path), "exec"), module.__dict__) + except BaseException: + sys.modules.pop(module_name, None) + raise + return module + + +_r6 = _load_bound_module(R6_SOURCE_PATH, R6_SOURCE_SHA256, label="native_eight_executor_r6") + + +def _production_adapter_module() -> Optional[ModuleType]: + values = ( + ADAPTER_R2_SOURCE_PATH, + ADAPTER_R2_SOURCE_SHA256, + ADAPTER_R2_RECEIPT_PATH, + ADAPTER_R2_RECEIPT_SHA256, + ) + if all(value is None for value in values): + return None + _require(all(value is not None for value in values), "adapter-r2 binding is partial") + assert ADAPTER_R2_SOURCE_PATH is not None + assert ADAPTER_R2_SOURCE_SHA256 is not None + assert ADAPTER_R2_RECEIPT_PATH is not None + assert ADAPTER_R2_RECEIPT_SHA256 is not None + receipt = _read_regular_nofollow(ADAPTER_R2_RECEIPT_PATH, label="adapter-r2 receipt") + _require(_sha256(receipt) == ADAPTER_R2_RECEIPT_SHA256, "adapter-r2 receipt hash changed") + try: + receipt_value = json.loads(receipt.decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise ExecutorR7BootstrapError("adapter-r2 receipt is invalid JSON") from error + source = _read_regular_nofollow(ADAPTER_R2_SOURCE_PATH, label="adapter-r2 source") + launch_flags = ( + "training_authorized", + "scientific_launch_authorized", + "gpu_launch_authorized", + "nova_submission_authorized", + "execution_certified", + ) + _require( + type(receipt_value) is dict + and _canonical_bytes(receipt_value) == receipt + and receipt_value.get("runtime_source") + == { + "name": ADAPTER_R2_SOURCE_PATH.name, + "bytes": len(source), + "sha256": ADAPTER_R2_SOURCE_SHA256, + } + and all(receipt_value.get(flag) is False for flag in launch_flags), + "adapter-r2 receipt is noncanonical, self-authorizing, or does not bind its source", + ) + adapter = _load_bound_module( + ADAPTER_R2_SOURCE_PATH, + ADAPTER_R2_SOURCE_SHA256, + label="native_eight_data_adapter_r2", + ) + _require( + getattr(adapter, "RECEIPT_SCHEMA", None) == receipt_value.get("schema") + and Path(getattr(adapter, "ADAPTER_RECEIPT_PATH", "")).absolute() + == ADAPTER_R2_RECEIPT_PATH, + "adapter-r2 exported receipt identity differs from the bound receipt", + ) + return adapter + + +_adapter_r2 = _production_adapter_module() + + +def _bind_r6_to_adapter_stack(adapter: ModuleType) -> None: + """Make r6 consume the one adapter-owned r5 module and exact classes.""" + + r5 = getattr(adapter, "R5_EXECUTOR_MODULE", None) + _require(isinstance(r5, ModuleType), "adapter-r2 lacks its exact r5 executor module") + required = ( + "NativeEightCompositeR5", + "NativeEightConfig", + "NativeEightOutput", + "FrozenEpochPlan", + "PlannedMicrobatch", + "DevelopmentBatch", + "DevelopmentResult", + "FixedDevelopmentContract", + "AdamWContract", + "StepDiagnostic", + ) + for name in required: + _require(getattr(adapter, name, None) is getattr(r5, name, None), f"adapter-r2 {name} identity split") + _r6._r5 = r5 + _require( + ADAPTER_R2_SOURCE_SHA256 is not None + and ADAPTER_R2_RECEIPT_SHA256 is not None, + "adapter-r2 stack cannot bind without exact source and receipt hashes", + ) + _r6.EXPECTED_ADAPTER_SOURCE_SHA256 = ADAPTER_R2_SOURCE_SHA256 + _r6.EXPECTED_ADAPTER_RECEIPT_SHA256 = ADAPTER_R2_RECEIPT_SHA256 + for name in required: + setattr(_r6, name, getattr(adapter, name)) + _r6.OBJECTIVES = tuple(r5.OBJECTIVES) + _r6.CELL_ORDER = tuple(r5.CELL_ORDER) + + +if _adapter_r2 is not None: + _bind_r6_to_adapter_stack(_adapter_r2) + + +NativeEightCompositeR5 = _r6.NativeEightCompositeR5 +NativeEightConfig = _r6.NativeEightConfig +FrozenEpochPlan = _r6.FrozenEpochPlan +PlannedMicrobatch = _r6.PlannedMicrobatch +DevelopmentResult = _r6.DevelopmentResult +FixedDevelopmentContract = _r6.FixedDevelopmentContract +AdamWContract = _r6.AdamWContract +StepDiagnostic = _r6.StepDiagnostic +StrictLowerSelection = _r6.StrictLowerSelection +OBJECTIVES = tuple(_r6.OBJECTIVES) +CELL_ORDER = tuple(_r6.CELL_ORDER) +_require( + tuple(PRODUCTION_TRAINABLE_CELLS) == CELL_ORDER + and set(HISTORICAL_EVIDENCE_ONLY_CELLS).issubset(CELL_ORDER), + "corrected native-eight fresh-fit boundary changed", +) + + +def _load_scientific_boundary() -> Mapping[str, Any]: + authority_bytes = _read_regular_nofollow( + SCIENTIFIC_BOUNDARY_AUTHORITY_PATH, + label="native-eight scientific child authority", + maximum=1024 * 1024, + ) + receipt_bytes = _read_regular_nofollow( + SCIENTIFIC_BOUNDARY_RECEIPT_PATH, + label="native-eight scientific child receipt", + maximum=1024 * 1024, + ) + _require( + _sha256(authority_bytes) == SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256 + and _sha256(receipt_bytes) == SCIENTIFIC_BOUNDARY_RECEIPT_SHA256, + "native-eight scientific authority or receipt hash changed", + ) + try: + authority = json.loads(authority_bytes.decode("utf-8")) + receipt = json.loads(receipt_bytes.decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise ExecutorR7BootstrapError( + "native-eight scientific authority or receipt is invalid JSON" + ) from error + + expected_authority_reference = { + "path": ( + "writing/review/multimodal/outputs/" + "review_a5_native_eight_scientific_boundary_20260721_r1/" + "review_a5_native_eight_scientific_boundary_child_authority_r1.json" + ), + "bytes": len(authority_bytes), + "sha256": SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256, + } + _require( + type(receipt) is dict + and receipt.get("schema") + == "bertose_review_a5_native_eight_scientific_boundary_child_receipt_r1" + and receipt.get("status") + == "PASS_PREPARATION_ONLY_CHILD_WRITTEN_LAUNCH_CLOSED" + and receipt.get("authority") == expected_authority_reference + and receipt.get("output_file_count") == 2 + and receipt.get("receipt_written_after_authority") is True + and receipt.get("official_submitted_artifacts_modified") is False + and receipt.get("authorization_surface_present") is False + and receipt.get("training_authorized") is False + and receipt.get("scientific_launch_authorized") is False + and receipt.get("execution_certified") is False + and receipt.get("submission_occurred") is False, + "native-eight scientific receipt changed or self-authorizes", + ) + + _require( + type(authority) is dict + and authority.get("schema") + == "bertose_review_a5_native_eight_scientific_boundary_child_authority_r1" + and authority.get("status") + == "PREPARATION_ONLY_SCIENTIFIC_BOUNDARY_FROZEN_LAUNCH_CLOSED" + and authority.get("fresh_fit_count") == 8 + and authority.get("pretraining_seed") == 43 + and authority.get("official_submitted_artifacts_modified") is False + and authority.get("downstream_metrics_used") is False + and authority.get("all_required_launch_dependencies_complete") is False + and authority.get("authorization_surface_present") is False + and authority.get("training_authorized") is False + and authority.get("scientific_launch_authorized") is False + and authority.get("execution_certified") is False + and authority.get("job_submission_allowed") is False + and authority.get("submission_occurred") is False, + "native-eight scientific authority changed or self-authorizes", + ) + + design = authority.get("scientific_design") + _require( + type(design) is dict + and design.get("cell_count") == 8 + and design.get("fit_reuse_count") == 0 + and design.get("cell_order") == list(CELL_ORDER) + and design.get("bit_order") == ["topology", "ms", "static"] + and design.get("factor_objectives") == ["topology", "ms", "static"] + and design.get("sequence_always_enabled") is True + and design.get("native_runtime_required") is True, + "native-eight factorial design changed", + ) + expected_bits = { + "A000": (0, 0, 0), + "A100": (1, 0, 0), + "A010": (0, 1, 0), + "A001": (0, 0, 1), + "A110": (1, 1, 0), + "A101": (1, 0, 1), + "A011": (0, 1, 1), + "A111": (1, 1, 1), + } + plans = authority.get("cell_plans") + _require(type(plans) is list and len(plans) == 8, "native-eight cell plans changed") + for array_task_id, (cell_id, plan) in enumerate(zip(CELL_ORDER, plans)): + topology, ms, static = expected_bits[cell_id] + _require( + type(plan) is dict + and plan.get("array_task_id") == array_task_id + and plan.get("cell_id") == cell_id + and plan.get("seed") == 43 + and plan.get("fresh_fit_required") is True + and plan.get("historical_checkpoint_reuse") is False + and plan.get("status") == "PREPARATION_ONLY_LAUNCH_CLOSED" + and plan.get("factor_bits") + == {"topology": topology, "ms": ms, "static": static} + and plan.get("objective_coefficients") + == { + "sequence": 1, + "topology": topology, + "ms": ms, + "static": static, + }, + f"native-eight cell plan {cell_id} changed", + ) + + loss = authority.get("loss_contract") + _require( + type(loss) is dict + and loss.get("objective_order") == list(OBJECTIVES) + and loss.get("active_coefficient") == 1 + and loss.get("disabled_coefficient") == 0 + and loss.get("constant_shell_denominator") == 4 + and loss.get("adaptive_or_epochwise_weight_optimization") is False + and loss.get("gradnorm") is False + and loss.get("weight_sensitivity_runs") == [], + "native-eight fixed loss contract changed", + ) + selection = authority.get("selection_contract") + _require( + type(selection) is dict + and selection.get("maximum_completed_epochs") == MAX_EPOCHS + and selection.get("patience_completed_development_evaluations") == PATIENCE + and selection.get("earliest_possible_stop_epoch") == EARLIEST_STOP_EPOCH + and selection.get("improvement") + == "strictly_lower_finite_total_normalized_development_loss" + and selection.get("min_delta") == 0 + and selection.get("tie_rule") == "retain_earlier_epoch" + and selection.get("development_partition") == "pretraining_development_only" + and selection.get("downstream_or_test_selection") is False, + "native-eight selection contract changed", + ) + route = authority.get("planned_scheduler_route") + _require( + type(route) is dict + and route.get("activation_status") == "PENDING_ALL_FINAL_GATES" + and route.get("array_indices") == list(range(8)) + and route.get("array_spec") == "0-7%4" + and route.get("max_concurrent") == 4 + and route.get("no_duplicate_normal_and_scavenger_copy") is True + and route.get("normal_ratul_first") is True + and route.get("scavenger_fallback_only") is True + and route.get("submission_occurred") is False, + "native-eight scheduler staging changed or activated", + ) + exclusions = authority.get("scope_exclusions") + for excluded in ( + "WA2", + "WA3", + "GradNorm", + "adaptive_weighting", + "weight_grid_search", + "MD", + "AFFINose", + "downstream_tasks", + ): + _require( + type(exclusions) is dict and exclusions.get(excluded) is True, + f"native-eight scope exclusion {excluded} changed", + ) + dependencies = authority.get("launch_dependencies") + _require( + type(dependencies) is dict + and bool(dependencies) + and all( + type(status) is str and status.startswith("PENDING") + for status in dependencies.values() + ), + "native-eight launch dependency surface changed or became active", + ) + static = authority.get("completed_component_evidence", {}).get("static_graph") + _require( + type(static) is dict + and static.get("learned_egnn_rvq_package_status") == "PENDING" + and static.get("static_null_status") == "PENDING", + "native-eight authority no longer proves the static gate pending", + ) + return MappingProxyType(copy.deepcopy(authority)) + + +_scientific_boundary_authority = _load_scientific_boundary() + + +def _plain(value: object, *, label: str) -> object: + if value is None or type(value) in {bool, int, str}: + return value + if type(value) is float: + _require(math.isfinite(value), f"{label} contains a nonfinite float") + return {"float_hex": value.hex()} + if isinstance(value, Mapping): + _require( + all(type(key) is str and key for key in value), + f"{label} mapping key is not a nonblank string", + ) + return {key: _plain(value[key], label=f"{label}.{key}") for key in sorted(value)} + if type(value) in {list, tuple}: + return [_plain(item, label=f"{label}[]") for item in value] + raise NativeEightExecutorR7Error(f"{label} contains unsupported type {type(value).__name__}") + + +def _source_receipt(value: object) -> Mapping[str, object]: + try: + path_text = inspect.getsourcefile(value) or inspect.getfile(value) + except (TypeError, OSError): + path_text = None + if path_text is None: + return MappingProxyType({"source_file_sha256": None}) + path = Path(path_text).absolute() + try: + payload = _read_regular_nofollow(path, label="policy implementation source") + except ExecutorR7BootstrapError: + return MappingProxyType({"source_file_sha256": None}) + return MappingProxyType({"source_file_sha256": _sha256(payload)}) + + +def _code_payload(code: Any) -> object: + if code is None: + return None + _require(inspect.iscode(code), "callable code object changed") + constants: list[object] = [] + for value in code.co_consts: + if inspect.iscode(value): + constants.append(_code_payload(value)) + elif value is None or type(value) in {bool, int, str}: + constants.append(value) + elif type(value) is float: + constants.append({"float_hex": value.hex()}) + elif type(value) is bytes: + constants.append({"bytes_hex": value.hex()}) + elif type(value) is tuple: + constants.append([_plain(item, label="code constant") for item in value]) + else: + constants.append({"type": f"{type(value).__module__}.{type(value).__qualname__}"}) + return { + "bytecode_sha256": _sha256(code.co_code), + "constants": constants, + "names": list(code.co_names), + "varnames": list(code.co_varnames), + "freevars": list(code.co_freevars), + "cellvars": list(code.co_cellvars), + "argcount": code.co_argcount, + "kwonlyargcount": code.co_kwonlyargcount, + "posonlyargcount": code.co_posonlyargcount, + "flags": code.co_flags, + } + + +def _global_value_payload( + value: object, + *, + label: str, + callable_stack: Optional[set[str]] = None, + depth: int = 0, + dependency_module: Optional[str] = None, +) -> object: + try: + return _plain(value, label=label) + except NativeEightExecutorR7Error: + pass + if inspect.ismodule(value): + version = getattr(value, "__version__", None) + return { + "kind": "module", + "name": getattr(value, "__name__", None), + "version": str(version) if version is not None else None, + **dict(_source_receipt(value)), + } + if inspect.isfunction(value) or inspect.ismethod(value): + target_module = getattr(value, "__module__", None) + try: + source_path_text = inspect.getsourcefile(value) or inspect.getfile(value) + source_path = Path(source_path_text).absolute() + project_local = source_path.is_relative_to(WRITING_ROOT) + except (TypeError, OSError, ValueError): + project_local = False + if ( + dependency_module is not None + and target_module != dependency_module + and not project_local + ): + return { + "kind": "external_callable", + "module": target_module, + "qualname": getattr(value, "__qualname__", type(value).__qualname__), + "code": _code_payload(getattr(value, "__code__", None)), + **dict(_source_receipt(value)), + } + return { + "kind": "callable", + "fingerprint": dict( + _callable_fingerprint( + value, + label=label, + callable_stack=callable_stack, + depth=depth + 1, + dependency_module=dependency_module, + ) + ), + } + if inspect.isclass(value): + return { + "kind": "class", + "module": value.__module__, + "qualname": value.__qualname__, + **dict(_source_receipt(value)), + } + if type(value).__module__ == "typing": + return { + "kind": "typing", + "class": f"{type(value).__module__}.{type(value).__qualname__}", + "repr": repr(value), + **dict(_source_receipt(type(value))), + } + state = getattr(value, "__dict__", None) + _require(isinstance(state, Mapping), f"{label} global is not fingerprintable") + return { + "kind": "object", + "class": f"{type(value).__module__}.{type(value).__qualname__}", + "state": _plain(dict(state), label=f"{label} state"), + **dict(_source_receipt(type(value))), + } + + +def _callable_fingerprint( + function: Callable[..., Any], + *, + label: str, + callable_stack: Optional[set[str]] = None, + depth: int = 0, + dependency_module: Optional[str] = None, +) -> Mapping[str, object]: + _require(callable(function), f"{label} is not callable") + _require(depth <= 64, f"{label} callable dependency graph exceeds depth bound") + target = function + state: object = None + if not inspect.isfunction(function) and not inspect.ismethod(function): + state = _plain(dict(getattr(function, "__dict__", {})), label=f"{label} callable state") + target = function.__call__ + code = getattr(target, "__code__", None) + _require(inspect.iscode(code), f"{label} lacks inspectable Python code") + identity = { + "module": getattr(target, "__module__", type(function).__module__), + "qualname": getattr(target, "__qualname__", type(function).__qualname__), + } + dependency_module = dependency_module or identity["module"] + code_payload = _code_payload(code) + graph_key = canonical_sha256( + {"identity": identity, "code": code_payload}, + domain="bertose-a5-callable-graph-node-r7", + ) + stack = callable_stack if callable_stack is not None else set() + if graph_key in stack: + cycle_payload = { + "identity": identity, + "code": code_payload, + "recursive_reference_sha256": graph_key, + **dict(_source_receipt(target)), + } + return MappingProxyType( + { + **cycle_payload, + "sha256": canonical_sha256( + cycle_payload, + domain="bertose-a5-exact-callable-r7", + ), + } + ) + stack.add(graph_key) + closure_values: list[object] = [] + try: + for cell in getattr(target, "__closure__", None) or (): + try: + content = cell.cell_contents + except ValueError: + content = None + closure_values.append( + _global_value_payload( + content, + label=f"{label} closure", + callable_stack=stack, + depth=depth, + dependency_module=dependency_module, + ) + ) + globals_payload: dict[str, object] = {} + namespace = getattr(target, "__globals__", {}) + for name in sorted(set(code.co_names)): + if name in namespace and name != "__builtins__": + globals_payload[name] = _global_value_payload( + namespace[name], + label=f"{label} global {name}", + callable_stack=stack, + depth=depth, + dependency_module=dependency_module, + ) + payload = { + "identity": identity, + "code": code_payload, + "defaults": _plain(getattr(target, "__defaults__", None), label=f"{label} defaults"), + "kwdefaults": _plain(getattr(target, "__kwdefaults__", None), label=f"{label} kwdefaults"), + "closure": closure_values, + "referenced_globals": globals_payload, + "callable_object_state": state, + **dict(_source_receipt(target)), + } + return MappingProxyType( + { + **payload, + "sha256": canonical_sha256(payload, domain="bertose-a5-exact-callable-r7"), + } + ) + finally: + stack.remove(graph_key) + + +def _class_fingerprint(value: object, *, methods: Sequence[str]) -> Mapping[str, object]: + cls = value if inspect.isclass(value) else type(value) + method_payload: dict[str, object] = {} + for name in methods: + method = getattr(cls, name, None) + _require(callable(method), f"{cls.__qualname__}.{name} is absent") + method_payload[name] = dict(_callable_fingerprint(method, label=f"{cls.__qualname__}.{name}")) + payload = { + "module": cls.__module__, + "qualname": cls.__qualname__, + "methods": method_payload, + **dict(_source_receipt(cls)), + } + return MappingProxyType( + {**payload, "sha256": canonical_sha256(payload, domain="bertose-a5-exact-class-r7")} + ) + + +def _disabled_autocast_factory() -> Any: + return nullcontext() + + +@dataclass(frozen=True, slots=True) +class ExactPolicyConfiguration: + scheduler: Optional[Mapping[str, Any]] + scaler: Optional[Mapping[str, Any]] + autocast: Mapping[str, Any] + max_amp_retries: int + + def validate(self) -> None: + _require( + type(self.max_amp_retries) is int and self.max_amp_retries >= 0, + "exact retry bound is invalid", + ) + for label, value in (("scheduler", self.scheduler), ("scaler", self.scaler)): + if value is not None: + _require(isinstance(value, Mapping), f"{label} configuration is not a mapping") + _plain(value, label=f"{label} configuration") + _require(isinstance(self.autocast, Mapping), "autocast configuration is absent") + _require(type(self.autocast.get("enabled")) is bool, "autocast enabled flag is not exact") + _plain(self.autocast, label="autocast configuration") + + +class NativeEightDeterministicExecutor: + """R7 policy-bound wrapper around the adapter-owned r6 mathematical path.""" + + training_authorized = False + scientific_launch_authorized = False + execution_certified = False + + def __init__( + self, + model: Any, + *, + data_adapter: Any, + policy_configuration: ExactPolicyConfiguration, + adamw: Any = None, + scheduler_factory: Optional[Callable[[torch.optim.Optimizer], Any]] = None, + grad_scaler: Optional[Any] = None, + autocast_context_factory: Optional[Callable[[], Any]] = None, + isolated_test_null_scales: Optional[Mapping[str, float]] = None, + isolated_test_adapter: bool = False, + ) -> None: + policy_configuration.validate() + if isolated_test_adapter: + _require( + bool(getattr(model.config, "isolated_test_fixture", False)), + "isolated adapter requires an isolated model fixture", + ) + else: + _require(_adapter_r2 is not None, "production adapter-r2 remains unbound") + _require( + type(data_adapter) is getattr(_adapter_r2, "NativeEightDataAdapter", None), + "production data adapter is not the exact frozen adapter-r2 class", + ) + _require( + getattr(model.config, "cell_id", None) + in PRODUCTION_TRAINABLE_CELLS, + "production executor cell is outside the corrected fresh native eight", + ) + if adamw is None: + adamw = AdamWContract() + if scheduler_factory is None: + _require(policy_configuration.scheduler is None, "scheduler policy exists without factory") + else: + _require(policy_configuration.scheduler is not None, "scheduler factory lacks exact policy") + if grad_scaler is None: + _require(policy_configuration.scaler is None, "scaler policy exists without scaler") + else: + _require(policy_configuration.scaler is not None, "scaler lacks exact policy") + if autocast_context_factory is None: + _require(policy_configuration.autocast.get("enabled") is False, "enabled autocast lacks factory") + autocast_context_factory = _disabled_autocast_factory + else: + _require( + policy_configuration.autocast.get("enabled") is True, + "custom autocast factory is not explicitly enabled", + ) + self.base = _r6.NativeEightProductionExecutor( + model, + data_adapter=data_adapter, + adamw=adamw, + scheduler_factory=scheduler_factory, + scheduler_configuration=policy_configuration.scheduler, + grad_scaler=grad_scaler, + scaler_configuration=policy_configuration.scaler, + autocast_context_factory=autocast_context_factory, + autocast_configuration=policy_configuration.autocast, + max_amp_retries=policy_configuration.max_amp_retries, + isolated_test_null_scales=isolated_test_null_scales, + isolated_test_adapter=isolated_test_adapter, + ) + self._scheduler_factory = scheduler_factory + self._autocast_factory = autocast_context_factory + self._policy_configuration = policy_configuration + self._initial_scheduler_state_sha256 = _r6._r5._recursive_state_sha256( + self.base.scheduler.state_dict() if self.base.scheduler is not None else None + ) + self._initial_scaler_state_sha256 = _r6._r5._recursive_state_sha256( + self.base.grad_scaler.state_dict() if self.base.grad_scaler is not None else None + ) + self._static_policy_payload = self._build_policy_payload() + self.execution_policy_sha256 = canonical_sha256( + self._static_policy_payload, domain=POLICY_SCHEMA + ) + + @property + def model(self) -> Any: + return self.base.model + + @property + def optimizer(self) -> torch.optim.Optimizer: + return self.base.optimizer + + @property + def cell_id(self) -> str: + return self.base.cell_id + + @property + def bound_plan(self) -> Any: + return self.base.bound_plan + + @property + def next_optimizer_step(self) -> int: + return self.base.next_optimizer_step + + def _build_policy_payload(self) -> dict[str, Any]: + optimizer = self.base.optimizer + observed_r5_runtime_sha256 = _r6._r5._runtime_source_sha256() + observed_r5_bindings = dict(_r6._r5.verify_execution_authorities()) + _require( + observed_r5_runtime_sha256 == self.base._inner.runtime_source_sha256 + and observed_r5_bindings + == dict(self.base._inner.component_bindings), + "r5 executor runtime or component binding changed", + ) + optimizer_groups = [] + for group in optimizer.param_groups: + optimizer_groups.append( + { + key: _plain(value, label=f"optimizer group {key}") + for key, value in sorted(group.items()) + if key not in {"params", "lr", "initial_lr"} + } + ) + scheduler = self.base.scheduler + scaler = self.base.grad_scaler + payload = { + "schema": POLICY_SCHEMA, + "r7_source_sha256": _sha256( + _read_regular_nofollow(Path(__file__).absolute(), label="executor r7 source") + ), + "r6_source_sha256": R6_SOURCE_SHA256, + "r6_execution_policy_sha256": self.base.execution_policy_sha256, + "r6_execution_policy": _plain( + dict(self.base.execution_policy_payload), + label="r6 execution policy", + ), + "r5_executor_runtime_sha256": observed_r5_runtime_sha256, + "r5_execution_bindings": _plain( + observed_r5_bindings, + label="r5 execution bindings", + ), + "adapter_contract_sha256": self.base.adapter_contract_sha256, + "adapter_r2_source_sha256": ADAPTER_R2_SOURCE_SHA256, + "adapter_r2_receipt_sha256": ADAPTER_R2_RECEIPT_SHA256, + "scientific_boundary_authority_sha256": ( + SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256 + ), + "scientific_boundary_receipt_sha256": ( + SCIENTIFIC_BOUNDARY_RECEIPT_SHA256 + ), + "optimizer_contract_sha256": self.base._inner.optimizer_contract_sha256, + "optimizer_class": dict( + _class_fingerprint( + optimizer, + methods=("step", "zero_grad", "state_dict", "load_state_dict"), + ) + ), + "optimizer_defaults": _plain(optimizer.defaults, label="optimizer defaults"), + "optimizer_groups": optimizer_groups, + "scheduler_factory": ( + dict(_callable_fingerprint(self._scheduler_factory, label="scheduler factory")) + if self._scheduler_factory is not None + else None + ), + "scheduler_class": ( + dict( + _class_fingerprint( + scheduler, + methods=("step", "state_dict", "load_state_dict"), + ) + ) + if scheduler is not None + else None + ), + "scheduler_behavior_callables": ( + [ + dict(_callable_fingerprint(function, label="scheduler behavior callable")) + for function in getattr(scheduler, "lr_lambdas", ()) + ] + if scheduler is not None + else None + ), + "scheduler_configuration": _plain( + self._policy_configuration.scheduler, + label="scheduler configuration", + ), + "initial_scheduler_state_sha256": self._initial_scheduler_state_sha256, + "scaler_class": ( + dict( + _class_fingerprint( + scaler, + methods=( + "scale", + "unscale_", + "step", + "update", + "get_scale", + "state_dict", + "load_state_dict", + ), + ) + ) + if scaler is not None + else None + ), + "scaler_configuration": _plain( + self._policy_configuration.scaler, + label="scaler configuration", + ), + "initial_scaler_state_sha256": self._initial_scaler_state_sha256, + "autocast_factory": dict( + _callable_fingerprint(self._autocast_factory, label="autocast factory") + ), + "autocast_configuration": _plain( + self._policy_configuration.autocast, + label="autocast configuration", + ), + "max_amp_retries": self._policy_configuration.max_amp_retries, + "python_version": sys.version, + "torch_version": str(torch.__version__), + "numpy_version": str(np.__version__), + "training_authorized": False, + "scientific_launch_authorized": False, + } + return payload + + def reverify_policy(self) -> None: + self.base.reverify_contract() + observed = self._build_policy_payload() + _require(observed == self._static_policy_payload, "execution policy implementation changed") + _require( + canonical_sha256(observed, domain=POLICY_SCHEMA) == self.execution_policy_sha256, + "execution policy digest changed", + ) + + def bind_epoch(self, epoch: int) -> Any: + self.reverify_policy() + return self.base.bind_epoch(epoch) + + def execute_next_step(self) -> Any: + self.reverify_policy() + diagnostic = self.base.execute_next_step() + self.reverify_policy() + return diagnostic + + +@dataclass(frozen=True, slots=True) +class DevelopmentWitness: + epoch: int + result_payload: Mapping[str, Any] + result_sha256: str + model_state_sha256: str + model_training_modes_sha256: str + optimizer_state_sha256: str + scheduler_state_sha256: str + scaler_state_sha256: str + rng_state_sha256: str + witness_sha256: str + + +def _development_result_payload(result: Any) -> dict[str, Any]: + return { + "raw_parent_means": dict(result.raw_parent_means), + "normalized_losses": dict(result.normalized_losses), + "parent_counts": dict(result.parent_counts), + "total_normalized_loss": float(result.total_normalized_loss), + "surface_sha256": result.surface_sha256, + "contract_sha256": result.contract_sha256, + "training_authorized": False, + "scientific_launch_authorized": False, + } + + +def _mutable_state_receipts(executor: NativeEightDeterministicExecutor) -> dict[str, str]: + inner = executor.base._inner + return { + "model_state_sha256": _r6._r5._model_state_sha256(inner.model), + "model_training_modes_sha256": _r6._r5._recursive_state_sha256( + [(name, bool(module.training)) for name, module in inner.model.named_modules()] + ), + "optimizer_state_sha256": _r6._r5._recursive_state_sha256(inner.optimizer.state_dict()), + "scheduler_state_sha256": _r6._r5._recursive_state_sha256( + inner.scheduler.state_dict() if inner.scheduler is not None else None + ), + "scaler_state_sha256": _r6._r5._recursive_state_sha256( + inner.grad_scaler.state_dict() if inner.grad_scaler is not None else None + ), + "rng_state_sha256": _r6._r5._recursive_state_sha256(_r6._r5._capture_rng_state()), + } + + +def _make_development_witness( + *, epoch: int, result: Any, receipts: Mapping[str, str] +) -> DevelopmentWitness: + payload = _development_result_payload(result) + unsigned = { + "schema": DEVELOPMENT_WITNESS_SCHEMA, + "epoch": epoch, + "result_payload": payload, + "result_sha256": result.result_sha256, + **dict(receipts), + "training_authorized": False, + "scientific_launch_authorized": False, + } + return DevelopmentWitness( + epoch=epoch, + result_payload=MappingProxyType(payload), + result_sha256=result.result_sha256, + model_state_sha256=receipts["model_state_sha256"], + model_training_modes_sha256=receipts["model_training_modes_sha256"], + optimizer_state_sha256=receipts["optimizer_state_sha256"], + scheduler_state_sha256=receipts["scheduler_state_sha256"], + scaler_state_sha256=receipts["scaler_state_sha256"], + rng_state_sha256=receipts["rng_state_sha256"], + witness_sha256=canonical_sha256(unsigned, domain=DEVELOPMENT_WITNESS_SCHEMA), + ) + + +def _development_contract_payload(contract: Any) -> dict[str, Any]: + _require(type(contract) is FixedDevelopmentContract, "development contract class split") + contract.validate() + payload = { + "surface_sha256": contract.surface_sha256, + "eligible_parent_ids": { + objective: list(contract.eligible_parent_ids[objective]) + for objective in OBJECTIVES + }, + } + _require( + canonical_sha256( + { + "schema": _r6._r5.DEVELOPMENT_SCHEMA, + **payload, + "mask_stream": "fixed_seed0_epoch0_no_caller_control", + "training_authorized": False, + "scientific_launch_authorized": False, + }, + domain=_r6._r5.DEVELOPMENT_SCHEMA, + ) + == contract.contract_sha256, + "development contract payload does not reproduce its digest", + ) + return payload + + +class DeterministicRun: + """One enforceable native-eight epoch/development/publication state machine.""" + + READY = "ready_for_train_epoch" + TRAINING = "training_epoch" + NEEDS_DEVELOPMENT = "train_complete_needs_matching_development" + DECIDED = "development_decision_recorded_needs_commit" + STOPPED = "early_stop_or_max100_committed" + SELECTED_BEST = "final_selected_best_restored_read_only" + FAILED = "fatal_runtime_or_development_integrity_failure" + + def __init__( + self, + executor: NativeEightDeterministicExecutor, + *, + run_instance_id: str, + device: str | torch.device, + development_parent_batch_size: int = 32, + ) -> None: + _require( + type(run_instance_id) is str + and bool(re.fullmatch(r"[a-zA-Z0-9][a-zA-Z0-9_.-]{0,127}", run_instance_id)), + "run instance ID is unsafe", + ) + _require( + type(development_parent_batch_size) is int + and development_parent_batch_size == 32, + "development parent batch size must be the frozen value 32", + ) + self.executor = executor + self.data_adapter = executor.base.data_adapter + self.cell_id = executor.cell_id + self.device = torch.device(device) + self.isolated_test_fixture = bool( + getattr(executor.model.config, "isolated_test_fixture", False) + ) + if self.isolated_test_fixture: + _require( + self.device.type == "cpu" and self.device.index is None, + "isolated fixture run requires exact cpu device", + ) + else: + _require( + self.device.type == "cuda" and self.device.index is not None, + "production run requires an exact indexed CUDA device", + ) + self.hardware_profile = MappingProxyType( + _observed_hardware_profile(self.device) + ) + self.hardware_profile_sha256 = _validate_hardware_profile( + dict(self.hardware_profile), + execution_device=str(self.device), + ) + self._verify_execution_device() + self.development_parent_batch_size = development_parent_batch_size + self.development_contract = self.data_adapter.fixed_development_contract(self.cell_id) + _require( + type(self.development_contract) is FixedDevelopmentContract + and callable(getattr(self.development_contract, "validate", None)), + "development contract is not the exact adapter-owned r5 class", + ) + self.development_contract.validate() + development_contract_payload = _development_contract_payload( + self.development_contract + ) + self.selection = StrictLowerSelection( + development_contract_sha256=self.development_contract.contract_sha256 + ) + model_config = asdict(executor.model.config) + initialization_receipts = _mutable_state_receipts(executor) + run_payload = { + "schema": RUN_SCHEMA, + "run_instance_id": run_instance_id, + "cell_id": self.cell_id, + "common_seed": 43, + "isolated_test_fixture": self.isolated_test_fixture, + "execution_device": str(self.device), + "hardware_profile": dict(self.hardware_profile), + "hardware_profile_sha256": self.hardware_profile_sha256, + "adapter_contract_sha256": executor.base.adapter_contract_sha256, + "adapter_r2_source_sha256": ADAPTER_R2_SOURCE_SHA256, + "adapter_r2_receipt_sha256": ADAPTER_R2_RECEIPT_SHA256, + "scientific_boundary_authority_sha256": ( + SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256 + ), + "scientific_boundary_receipt_sha256": ( + SCIENTIFIC_BOUNDARY_RECEIPT_SHA256 + ), + "development_contract_sha256": self.development_contract.contract_sha256, + "development_contract": development_contract_payload, + "development_parent_batch_size": development_parent_batch_size, + "execution_policy_sha256": executor.execution_policy_sha256, + "model_configuration": _plain(model_config, label="model configuration"), + "initial_model_state_sha256": initialization_receipts[ + "model_state_sha256" + ], + "initial_model_training_modes_sha256": initialization_receipts[ + "model_training_modes_sha256" + ], + "initial_optimizer_state_sha256": initialization_receipts[ + "optimizer_state_sha256" + ], + "maximum_epochs": MAX_EPOCHS, + "patience": PATIENCE, + "earliest_stop_epoch": EARLIEST_STOP_EPOCH, + "improvement_rule": "strict_lower", + "tie_rule": "earliest_epoch_retained", + "training_authorized": False, + "scientific_launch_authorized": False, + "static_final_release_bound": False, + } + self.run_contract = MappingProxyType(run_payload) + self.run_contract_sha256 = canonical_sha256(run_payload, domain=RUN_SCHEMA) + self.phase = self.READY + self.development_history: list[DevelopmentWitness] = [] + self.previous_committed_checkpoint_sha256: Optional[str] = None + self._pending_checkpoint_sha256: Optional[str] = None + self._pending_runtime_receipts: Optional[dict[str, str]] = None + self._pending_selection_state_sha256: Optional[str] = None + + def _verify_execution_device(self) -> None: + devices = { + str(value.device) + for value in ( + *tuple(self.executor.model.parameters()), + *tuple(self.executor.model.buffers()), + ) + } + _require( + devices == {str(self.device)} + and _observed_hardware_profile(self.device) + == dict(self.hardware_profile), + "model tensors or hardware differ from the exact run device/profile", + ) + + def begin_next_epoch(self) -> Any: + _require(self.phase == self.READY, "run is not ready for a new epoch") + _require(self.selection.stop_reason is None, "run attempted to train after stopping") + self._verify_execution_device() + epoch = self.selection.completed_epochs + _require(epoch < MAX_EPOCHS, "run attempted to exceed max100") + plan = self.executor.bind_epoch(epoch) + _require(plan.epoch == epoch, "bound plan differs from the exact run epoch") + self.phase = self.TRAINING + return plan + + def execute_next_step(self) -> Any: + _require(self.phase == self.TRAINING, "run step is outside its training phase") + self._verify_execution_device() + try: + diagnostic = self.executor.execute_next_step() + except BaseException: + self.phase = self.FAILED + raise + plan = self.executor.bound_plan + _require(plan is not None, "run lost its epoch plan") + if self.executor.next_optimizer_step == plan.optimizer_step_count: + self.phase = self.NEEDS_DEVELOPMENT + self._verify_execution_device() + return diagnostic + + def evaluate_matching_development_and_decide(self) -> Mapping[str, Any]: + _require( + self.phase == self.NEEDS_DEVELOPMENT, + "development evaluation is not immediately after a complete train epoch", + ) + plan = self.executor.bound_plan + _require( + plan is not None and self.executor.next_optimizer_step == plan.optimizer_step_count, + "development evaluation has an incomplete train epoch", + ) + self.executor.reverify_policy() + self._verify_execution_device() + before = _mutable_state_receipts(self.executor) + try: + result = self.data_adapter.evaluate_fixed_development( + self.executor.base._inner, + self.cell_id, + device=self.device, + parent_batch_size=self.development_parent_batch_size, + ) + except BaseException: + self.phase = self.FAILED + raise + if type(result) is not DevelopmentResult: + self.phase = self.FAILED + raise NativeEightExecutorR7Error( + "adapter returned a split development-result class" + ) + if result.contract_sha256 != self.development_contract.contract_sha256: + self.phase = self.FAILED + raise NativeEightExecutorR7Error( + "development result contract differs from the run" + ) + after = _mutable_state_receipts(self.executor) + if after != before: + self.phase = self.FAILED + raise NativeEightExecutorR7Error( + "development evaluation mutated training or RNG state" + ) + self._verify_execution_device() + try: + self.executor.reverify_policy() + _validate_development_result_against_contract( + result, + contract=self.development_contract, + coefficients=self.executor.base._inner.coefficients, + null_scales=self.executor.base._inner.null_scales, + ) + except BaseException: + self.phase = self.FAILED + raise + epoch = plan.epoch + 1 + try: + decision = self.selection.observe(epoch=epoch, result=result) + witness = _make_development_witness( + epoch=epoch, + result=result, + receipts=after, + ) + except BaseException: + self.phase = self.FAILED + raise + self.development_history.append(witness) + self.phase = self.DECIDED + return MappingProxyType( + { + "decision": copy.deepcopy(decision), + "witness_sha256": witness.witness_sha256, + } + ) + + def capture_completed_epoch_checkpoint(self) -> dict[str, Any]: + _require(self.phase == self.DECIDED, "run checkpoint lacks a development decision") + self._verify_execution_device() + self.executor.reverify_policy() + plan = self.executor.bound_plan + _require( + plan is not None + and self.executor.next_optimizer_step == plan.optimizer_step_count + and self.selection.completed_epochs == plan.epoch + 1, + "run checkpoint is not one complete decided epoch", + ) + base = _r6.capture_optimizer_boundary_resume( + self.executor.base, + selection=self.selection, + development_contract=self.development_contract, + ) + history = [ + { + "epoch": item.epoch, + "result_payload": dict(item.result_payload), + "result_sha256": item.result_sha256, + "model_state_sha256": item.model_state_sha256, + "model_training_modes_sha256": item.model_training_modes_sha256, + "optimizer_state_sha256": item.optimizer_state_sha256, + "scheduler_state_sha256": item.scheduler_state_sha256, + "scaler_state_sha256": item.scaler_state_sha256, + "rng_state_sha256": item.rng_state_sha256, + "witness_sha256": item.witness_sha256, + } + for item in self.development_history + ] + state = { + "schema": CHECKPOINT_SCHEMA, + "run_contract": dict(self.run_contract), + "run_contract_sha256": self.run_contract_sha256, + "cell_id": self.cell_id, + "epoch": self.selection.completed_epochs, + "phase": self.DECIDED, + "execution_policy_sha256": self.executor.execution_policy_sha256, + "adapter_contract_sha256": self.executor.base.adapter_contract_sha256, + "development_contract_sha256": self.development_contract.contract_sha256, + "previous_committed_checkpoint_sha256": self.previous_committed_checkpoint_sha256, + "development_history": history, + "training_authorized": False, + "scientific_launch_authorized": False, + "static_final_release_bound": False, + } + payload = {"base_r6_checkpoint": base, "run_state": state} + unsigned = { + "schema": CHECKPOINT_SCHEMA, + "run_contract_sha256": self.run_contract_sha256, + "cell_id": self.cell_id, + "epoch": self.selection.completed_epochs, + "plan_sha256": plan.plan_sha256, + "base_r6_checkpoint_sha256": _r6._r5._recursive_state_sha256(base), + "run_state_sha256": _r6._r5._recursive_state_sha256(state), + "execution_policy_sha256": self.executor.execution_policy_sha256, + "adapter_contract_sha256": self.executor.base.adapter_contract_sha256, + "development_contract_sha256": self.development_contract.contract_sha256, + "previous_committed_checkpoint_sha256": self.previous_committed_checkpoint_sha256, + "training_authorized": False, + "scientific_launch_authorized": False, + "static_final_release_bound": False, + } + checkpoint = { + "payload": payload, + "envelope": { + **unsigned, + "resume_sha256": canonical_sha256(unsigned, domain=CHECKPOINT_SCHEMA), + }, + } + validate_checkpoint_semantics(checkpoint) + self.executor.reverify_policy() + self._pending_checkpoint_sha256 = _sha256(serialize_checkpoint(checkpoint)) + self._pending_runtime_receipts = _mutable_state_receipts(self.executor) + self._pending_selection_state_sha256 = _r6._r5._recursive_state_sha256( + self.selection.state_dict() + ) + return checkpoint + + def mark_checkpoint_committed(self, checkpoint_sha256: str) -> None: + _require(self.phase == self.DECIDED, "run commit acknowledgement is out of order") + _require(_valid_sha256(checkpoint_sha256), "committed checkpoint digest is invalid") + _require( + checkpoint_sha256 == self._pending_checkpoint_sha256, + "commit acknowledgement differs from this run's exact pending checkpoint bytes", + ) + _require( + self._pending_runtime_receipts == _mutable_state_receipts(self.executor) + and self._pending_selection_state_sha256 + == _r6._r5._recursive_state_sha256(self.selection.state_dict()), + "run state changed after checkpoint capture and before commit acknowledgement", + ) + self.previous_committed_checkpoint_sha256 = checkpoint_sha256 + self._pending_checkpoint_sha256 = None + self._pending_runtime_receipts = None + self._pending_selection_state_sha256 = None + self.phase = self.STOPPED if self.selection.stop_reason is not None else self.READY + + def restore_committed_checkpoint( + self, + checkpoint: Mapping[str, Any], + *, + checkpoint_sha256: str, + ) -> None: + _require( + self.phase == self.READY + and self.executor.bound_plan is None + and self.selection.completed_epochs == 0, + "restore target is not a fresh deterministic run", + ) + _require(_valid_sha256(checkpoint_sha256), "restore checkpoint digest is invalid") + validated = validate_checkpoint_semantics(checkpoint) + _require( + _sha256(serialize_checkpoint(checkpoint)) == checkpoint_sha256, + "restore checkpoint bytes differ from the supplied content address", + ) + state = validated["run_state"] + _require( + state["run_contract"] == dict(self.run_contract) + and state["run_contract_sha256"] == self.run_contract_sha256 + and state["execution_policy_sha256"] == self.executor.execution_policy_sha256 + and state["adapter_contract_sha256"] == self.executor.base.adapter_contract_sha256 + and state["development_contract_sha256"] + == self.development_contract.contract_sha256, + "restore run, policy, adapter, or development identity changed", + ) + try: + self.executor.reverify_policy() + self._verify_execution_device() + _r6.restore_optimizer_boundary_resume( + self.executor.base, + copy.deepcopy(checkpoint["payload"]["base_r6_checkpoint"]), + selection=self.selection, + development_contract=self.development_contract, + ) + self.development_history = [ + DevelopmentWitness( + epoch=row["epoch"], + result_payload=MappingProxyType( + copy.deepcopy(row["result_payload"]) + ), + result_sha256=row["result_sha256"], + model_state_sha256=row["model_state_sha256"], + model_training_modes_sha256=row[ + "model_training_modes_sha256" + ], + optimizer_state_sha256=row["optimizer_state_sha256"], + scheduler_state_sha256=row["scheduler_state_sha256"], + scaler_state_sha256=row["scaler_state_sha256"], + rng_state_sha256=row["rng_state_sha256"], + witness_sha256=row["witness_sha256"], + ) + for row in state["development_history"] + ] + self.previous_committed_checkpoint_sha256 = checkpoint_sha256 + self._pending_checkpoint_sha256 = None + self._pending_runtime_receipts = None + self._pending_selection_state_sha256 = None + self.phase = ( + self.STOPPED + if self.selection.stop_reason is not None + else self.READY + ) + self._verify_execution_device() + _require( + _mutable_state_receipts(self.executor) + == { + key: getattr(self.development_history[-1], key) + for key in ( + "model_state_sha256", + "model_training_modes_sha256", + "optimizer_state_sha256", + "scheduler_state_sha256", + "scaler_state_sha256", + "rng_state_sha256", + ) + }, + "restored runtime state differs from the matching development witness", + ) + self.executor.reverify_policy() + except BaseException: + self.phase = self.FAILED + raise + + def restore_final_selected_best( + self, + checkpoint: Mapping[str, Any], + *, + checkpoint_sha256: str, + terminal_latest_checkpoint: Mapping[str, Any], + terminal_latest_checkpoint_sha256: str, + final_selection_receipt: Mapping[str, Any], + ) -> None: + fields = { + "schema", + "run_contract_sha256", + "latest_epoch", + "latest_checkpoint_sha256", + "stop_reason", + "best_epoch", + "best_checkpoint_sha256", + "best_result_sha256", + "training_authorized", + "scientific_launch_authorized", + "receipt_sha256", + } + _require( + type(final_selection_receipt) is dict + and set(final_selection_receipt) == fields, + "final selection receipt fields changed", + ) + unsigned = dict(final_selection_receipt) + receipt_sha = unsigned.pop("receipt_sha256") + _require( + receipt_sha + == canonical_sha256( + unsigned, + domain="bertose-a5-final-selected-best-receipt-r7", + ) + and final_selection_receipt["schema"] + == "bertose_a5_final_selected_best_receipt_20260721_r7" + and final_selection_receipt["run_contract_sha256"] + == self.run_contract_sha256 + and final_selection_receipt["best_checkpoint_sha256"] + == checkpoint_sha256 + and final_selection_receipt["latest_checkpoint_sha256"] + == terminal_latest_checkpoint_sha256 + and final_selection_receipt["stop_reason"] + in {"patience_exhausted", "max_epochs_reached"} + and final_selection_receipt["training_authorized"] is False + and final_selection_receipt["scientific_launch_authorized"] is False, + "final selection receipt identity, stop, or flags changed", + ) + validated = validate_checkpoint_semantics(checkpoint) + terminal_validated = validate_checkpoint_semantics( + terminal_latest_checkpoint + ) + _require( + _valid_sha256(terminal_latest_checkpoint_sha256) + and _sha256(serialize_checkpoint(terminal_latest_checkpoint)) + == terminal_latest_checkpoint_sha256 + and terminal_latest_checkpoint["envelope"]["run_contract_sha256"] + == self.run_contract_sha256 + and terminal_latest_checkpoint["envelope"]["epoch"] + == final_selection_receipt["latest_epoch"] + and terminal_validated["selection"]["stop_reason"] + == final_selection_receipt["stop_reason"] + and terminal_validated["selection"]["best_epoch"] + == final_selection_receipt["best_epoch"] + and terminal_validated["selection"]["best_result_sha256"] + == final_selection_receipt["best_result_sha256"], + "final selection receipt lacks its exact terminal checkpoint proof", + ) + _require( + checkpoint["envelope"]["epoch"] == final_selection_receipt["best_epoch"] + and validated["run_state"]["development_history"][-1]["result_sha256"] + == final_selection_receipt["best_result_sha256"], + "selected-best checkpoint differs from the final decision", + ) + best_epoch = checkpoint["envelope"]["epoch"] + _require( + validated["run_state"]["development_history"] + == terminal_validated["run_state"]["development_history"][:best_epoch] + and checkpoint["payload"]["base_r6_checkpoint"]["payload"][ + "base_checkpoint" + ]["payload"]["selection_state"]["history"] + == terminal_latest_checkpoint["payload"]["base_r6_checkpoint"][ + "payload" + ]["base_checkpoint"]["payload"]["selection_state"]["history"][ + :best_epoch + ], + "selected-best checkpoint is not the exact terminal history prefix", + ) + self.restore_committed_checkpoint( + checkpoint, + checkpoint_sha256=checkpoint_sha256, + ) + self.phase = self.SELECTED_BEST + + +def _validate_development_result_payload(payload: Any) -> tuple[Any, str]: + fields = { + "raw_parent_means", + "normalized_losses", + "parent_counts", + "total_normalized_loss", + "surface_sha256", + "contract_sha256", + "training_authorized", + "scientific_launch_authorized", + } + _require(type(payload) is dict and set(payload) == fields, "development result fields changed") + _require( + type(payload["raw_parent_means"]) is dict + and type(payload["normalized_losses"]) is dict + and type(payload["parent_counts"]) is dict + and set(payload["raw_parent_means"]) == set(OBJECTIVES) + and set(payload["normalized_losses"]) == set(OBJECTIVES) + and set(payload["parent_counts"]) == set(OBJECTIVES), + "development objective mappings changed", + ) + total = payload["total_normalized_loss"] + _require( + type(total) is float + and math.isfinite(total) + and total >= 0 + and _valid_sha256(payload["surface_sha256"]) + and _valid_sha256(payload["contract_sha256"]) + and payload["training_authorized"] is False + and payload["scientific_launch_authorized"] is False, + "development result scalar identity or flags changed", + ) + for objective in OBJECTIVES: + raw = payload["raw_parent_means"][objective] + normalized = payload["normalized_losses"][objective] + count = payload["parent_counts"][objective] + _require(type(count) is int and count >= 0, f"{objective} development count changed") + if count == 0: + _require(raw is None and normalized is None, f"{objective} absent development value changed") + else: + _require( + type(raw) is float + and type(normalized) is float + and math.isfinite(raw) + and math.isfinite(normalized) + and raw >= 0 + and normalized >= 0, + f"{objective} development value changed", + ) + result = DevelopmentResult( + raw_parent_means=MappingProxyType(dict(payload["raw_parent_means"])), + normalized_losses=MappingProxyType(dict(payload["normalized_losses"])), + parent_counts=MappingProxyType(dict(payload["parent_counts"])), + total_normalized_loss=total, + surface_sha256=payload["surface_sha256"], + contract_sha256=payload["contract_sha256"], + ) + return result, result.result_sha256 + + +def _validate_development_result_against_contract( + result: Any, + *, + contract: Any, + coefficients: Mapping[str, Any], + null_scales: Mapping[str, Any], +) -> None: + """Bind the returned values to the exact frozen surface, roster, and /4 shell.""" + + _require(type(result) is DevelopmentResult, "development result class split") + contract_payload = _development_contract_payload(contract) + _, computed_result_sha256 = _validate_development_result_payload( + _development_result_payload(result) + ) + _require( + computed_result_sha256 == result.result_sha256 + and result.surface_sha256 == contract_payload["surface_sha256"] + and result.contract_sha256 == contract.contract_sha256, + "development result digest, surface, or contract changed", + ) + _require( + type(coefficients) is dict + and set(coefficients) == set(OBJECTIVES) + and all(type(coefficients[objective]) is int for objective in OBJECTIVES) + and type(null_scales) is dict + and set(null_scales) == set(OBJECTIVES), + "development coefficients or null scales changed", + ) + reconstructed_total = 0.0 + for objective in OBJECTIVES: + raw = result.raw_parent_means[objective] + normalized = result.normalized_losses[objective] + count = result.parent_counts[objective] + if coefficients[objective]: + expected_count = len( + contract_payload["eligible_parent_ids"][objective] + ) + _require( + expected_count > 0 + and count == expected_count + and type(raw) is float + and type(normalized) is float + and type(null_scales[objective]) is float + and math.isfinite(null_scales[objective]) + and null_scales[objective] > 0 + and normalized.hex() + == (raw / null_scales[objective]).hex(), + f"{objective} development roster or normalization changed", + ) + reconstructed_total += normalized / 4.0 + else: + _require( + count == 0 and raw is None and normalized is None, + f"disabled {objective} development result changed", + ) + _require( + reconstructed_total.hex() == result.total_normalized_loss.hex(), + "development total is not the fixed normalized /4 shell", + ) + + +def validate_checkpoint_semantics(checkpoint: Mapping[str, Any]) -> Mapping[str, Any]: + """Validate full r7 run/development/predecessor semantics before mutation.""" + + _require(type(checkpoint) is dict and set(checkpoint) == {"payload", "envelope"}, "r7 checkpoint root changed") + payload = checkpoint["payload"] + envelope = checkpoint["envelope"] + _require( + type(payload) is dict + and set(payload) == {"base_r6_checkpoint", "run_state"} + and type(envelope) is dict, + "r7 checkpoint payload or envelope changed", + ) + envelope_fields = { + "schema", + "run_contract_sha256", + "cell_id", + "epoch", + "plan_sha256", + "base_r6_checkpoint_sha256", + "run_state_sha256", + "execution_policy_sha256", + "adapter_contract_sha256", + "development_contract_sha256", + "previous_committed_checkpoint_sha256", + "training_authorized", + "scientific_launch_authorized", + "static_final_release_bound", + "resume_sha256", + } + _require(set(envelope) == envelope_fields and envelope["schema"] == CHECKPOINT_SCHEMA, "r7 envelope fields changed") + unsigned_envelope = dict(envelope) + observed_resume = unsigned_envelope.pop("resume_sha256") + _require( + observed_resume == canonical_sha256(unsigned_envelope, domain=CHECKPOINT_SCHEMA), + "r7 resume envelope digest changed", + ) + base_info = _r6.validate_checkpoint_semantics(payload["base_r6_checkpoint"]) + _require(base_info["epoch_complete"] is True, "r7 checkpoint contains an incomplete r6 epoch") + base_payload = base_info["base"]["payload"] + base_envelope = base_info["base"]["envelope"] + state = payload["run_state"] + state_fields = { + "schema", + "run_contract", + "run_contract_sha256", + "cell_id", + "epoch", + "phase", + "execution_policy_sha256", + "adapter_contract_sha256", + "development_contract_sha256", + "previous_committed_checkpoint_sha256", + "development_history", + "training_authorized", + "scientific_launch_authorized", + "static_final_release_bound", + } + _require(type(state) is dict and set(state) == state_fields, "r7 run-state fields changed") + _require(state["schema"] == CHECKPOINT_SCHEMA, "r7 run-state schema changed") + run_contract = state["run_contract"] + run_fields = { + "schema", + "run_instance_id", + "cell_id", + "common_seed", + "isolated_test_fixture", + "execution_device", + "hardware_profile", + "hardware_profile_sha256", + "adapter_contract_sha256", + "adapter_r2_source_sha256", + "adapter_r2_receipt_sha256", + "scientific_boundary_authority_sha256", + "scientific_boundary_receipt_sha256", + "development_contract_sha256", + "development_contract", + "development_parent_batch_size", + "execution_policy_sha256", + "model_configuration", + "initial_model_state_sha256", + "initial_model_training_modes_sha256", + "initial_optimizer_state_sha256", + "maximum_epochs", + "patience", + "earliest_stop_epoch", + "improvement_rule", + "tie_rule", + "training_authorized", + "scientific_launch_authorized", + "static_final_release_bound", + } + _require(type(run_contract) is dict and set(run_contract) == run_fields, "r7 run contract fields changed") + run_sha = canonical_sha256(run_contract, domain=RUN_SCHEMA) + _require( + run_contract["schema"] == RUN_SCHEMA + and run_contract["cell_id"] in CELL_ORDER + and run_contract["common_seed"] == 43 + and type(run_contract["isolated_test_fixture"]) is bool + and _valid_execution_device(run_contract["execution_device"]) + and _valid_sha256(run_contract["hardware_profile_sha256"]) + and _valid_sha256(run_contract["adapter_contract_sha256"]) + and run_contract["adapter_r2_source_sha256"] == ADAPTER_R2_SOURCE_SHA256 + and run_contract["adapter_r2_receipt_sha256"] == ADAPTER_R2_RECEIPT_SHA256 + and run_contract["scientific_boundary_authority_sha256"] + == SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256 + and run_contract["scientific_boundary_receipt_sha256"] + == SCIENTIFIC_BOUNDARY_RECEIPT_SHA256 + and _valid_sha256(run_contract["development_contract_sha256"]) + and type(run_contract["development_contract"]) is dict + and run_contract["development_parent_batch_size"] == 32 + and _valid_sha256(run_contract["execution_policy_sha256"]) + and _valid_sha256(run_contract["initial_model_state_sha256"]) + and _valid_sha256(run_contract["initial_model_training_modes_sha256"]) + and _valid_sha256(run_contract["initial_optimizer_state_sha256"]) + and run_contract["maximum_epochs"] == MAX_EPOCHS + and run_contract["patience"] == PATIENCE + and run_contract["earliest_stop_epoch"] == EARLIEST_STOP_EPOCH + and run_contract["improvement_rule"] == "strict_lower" + and run_contract["tie_rule"] == "earliest_epoch_retained" + and run_contract["training_authorized"] is False + and run_contract["scientific_launch_authorized"] is False + and run_contract["static_final_release_bound"] is False, + "r7 run policy, cell, adapter, or flags changed", + ) + _require( + _validate_hardware_profile( + run_contract["hardware_profile"], + execution_device=run_contract["execution_device"], + ) + == run_contract["hardware_profile_sha256"], + "r7 hardware profile digest changed", + ) + _require( + ( + run_contract["isolated_test_fixture"] is True + and run_contract["execution_device"] == "cpu" + ) + or ( + run_contract["isolated_test_fixture"] is False + and run_contract["cell_id"] in PRODUCTION_TRAINABLE_CELLS + and bool( + re.fullmatch( + r"cuda:[0-9]+", + run_contract["execution_device"], + ) + ) + ), + "r7 fixture/production cell or device boundary changed", + ) + development_contract_payload = run_contract["development_contract"] + _require( + set(development_contract_payload) + == {"surface_sha256", "eligible_parent_ids"} + and _valid_sha256(development_contract_payload["surface_sha256"]) + and type(development_contract_payload["eligible_parent_ids"]) is dict + and set(development_contract_payload["eligible_parent_ids"]) + == set(OBJECTIVES), + "r7 frozen development contract payload changed", + ) + eligible_parent_ids: dict[str, tuple[str, ...]] = {} + for objective in OBJECTIVES: + values = development_contract_payload["eligible_parent_ids"][objective] + _require( + type(values) is list + and all(type(value) is str and value for value in values) + and len(values) == len(set(values)), + f"r7 {objective} development roster changed", + ) + eligible_parent_ids[objective] = tuple(values) + reconstructed_contract = FixedDevelopmentContract( + surface_sha256=development_contract_payload["surface_sha256"], + eligible_parent_ids=MappingProxyType(eligible_parent_ids), + ) + reconstructed_contract.validate() + _require( + reconstructed_contract.contract_sha256 + == run_contract["development_contract_sha256"], + "r7 frozen development payload differs from its contract digest", + ) + _require( + run_sha + == state["run_contract_sha256"] + == envelope["run_contract_sha256"], + "r7 run contract digest changed", + ) + _require( + envelope["base_r6_checkpoint_sha256"] + == _r6._r5._recursive_state_sha256(payload["base_r6_checkpoint"]) + and envelope["run_state_sha256"] == _r6._r5._recursive_state_sha256(state), + "r7 nested checkpoint digest changed", + ) + epoch = state["epoch"] + _require( + type(epoch) is int + and 1 <= epoch <= MAX_EPOCHS + and state["phase"] == DeterministicRun.DECIDED + and state["cell_id"] == run_contract["cell_id"] == envelope["cell_id"] == base_envelope["cell_id"] + and epoch == envelope["epoch"] == base_envelope["plan_epoch"] + 1 + and envelope["plan_sha256"] == base_envelope["plan_sha256"], + "r7 epoch, phase, plan, or cell changed", + ) + for field in ( + "execution_policy_sha256", + "adapter_contract_sha256", + "development_contract_sha256", + ): + _require( + state[field] == envelope[field] == run_contract[field], + f"r7 {field} disagrees across identities", + ) + _require( + state["development_contract_sha256"] == base_payload["development_contract_sha256"], + "r7 and r6 development contracts disagree", + ) + predecessor = state["previous_committed_checkpoint_sha256"] + _require( + predecessor == envelope["previous_committed_checkpoint_sha256"] + and ((epoch == 1 and predecessor is None) or (epoch > 1 and _valid_sha256(predecessor))), + "r7 predecessor checkpoint lineage changed", + ) + _require( + state["training_authorized"] is False + and state["scientific_launch_authorized"] is False + and state["static_final_release_bound"] is False + and envelope["training_authorized"] is False + and envelope["scientific_launch_authorized"] is False + and envelope["static_final_release_bound"] is False, + "r7 checkpoint self-authorizes or promotes static", + ) + history = state["development_history"] + selection_state = base_payload["selection_state"] + selection_history = selection_state["history"] + _require( + type(history) is list + and len(history) == epoch == len(selection_history) + and selection_state["completed_epochs"] == epoch, + "r7 development/selection history length changed", + ) + witness_fields = { + "epoch", + "result_payload", + "result_sha256", + "model_state_sha256", + "model_training_modes_sha256", + "optimizer_state_sha256", + "scheduler_state_sha256", + "scaler_state_sha256", + "rng_state_sha256", + "witness_sha256", + } + coefficients = dict(_r6._r5._planner.cell_coefficients(state["cell_id"])) + null_scales = base_payload["null_scales"] + _require( + type(null_scales) is dict + and set(null_scales) == set(OBJECTIVES) + and all( + type(null_scales[objective]) is float + and math.isfinite(null_scales[objective]) + and null_scales[objective] > 0 + for objective in OBJECTIVES + ), + "r7 checkpoint null scales changed", + ) + for expected_epoch, (witness, decision) in enumerate(zip(history, selection_history), start=1): + _require(type(witness) is dict and set(witness) == witness_fields, "r7 development witness fields changed") + validated_result, computed_result_sha = _validate_development_result_payload( + witness["result_payload"] + ) + _validate_development_result_against_contract( + validated_result, + contract=reconstructed_contract, + coefficients=coefficients, + null_scales=null_scales, + ) + _require( + witness["epoch"] == expected_epoch + and witness["result_sha256"] == computed_result_sha + and witness["result_payload"]["contract_sha256"] + == state["development_contract_sha256"] + and decision["epoch"] == expected_epoch + and decision["development_result_sha256"] == computed_result_sha + and decision["total_normalized_loss"] + == witness["result_payload"]["total_normalized_loss"], + "r7 development witness differs from semantic selection history", + ) + reconstructed_total = 0.0 + for objective in OBJECTIVES: + raw = witness["result_payload"]["raw_parent_means"][objective] + normalized = witness["result_payload"]["normalized_losses"][objective] + count = witness["result_payload"]["parent_counts"][objective] + if coefficients[objective]: + _require( + count > 0 + and type(raw) is float + and type(normalized) is float + and normalized.hex() + == (raw / null_scales[objective]).hex(), + f"r7 {objective} development normalization changed", + ) + reconstructed_total += normalized / 4.0 + else: + _require( + count == 0 and raw is None and normalized is None, + f"r7 disabled {objective} development surface changed", + ) + _require( + reconstructed_total.hex() + == witness["result_payload"]["total_normalized_loss"].hex(), + "r7 development total is not the fixed coefficient/4 loss", + ) + for name in ( + "model_state_sha256", + "model_training_modes_sha256", + "optimizer_state_sha256", + "scheduler_state_sha256", + "scaler_state_sha256", + "rng_state_sha256", + ): + _require(_valid_sha256(witness[name]), f"r7 witness {name} changed") + witness_unsigned = { + "schema": DEVELOPMENT_WITNESS_SCHEMA, + "epoch": expected_epoch, + "result_payload": witness["result_payload"], + "result_sha256": witness["result_sha256"], + "model_state_sha256": witness["model_state_sha256"], + "model_training_modes_sha256": witness[ + "model_training_modes_sha256" + ], + "optimizer_state_sha256": witness["optimizer_state_sha256"], + "scheduler_state_sha256": witness["scheduler_state_sha256"], + "scaler_state_sha256": witness["scaler_state_sha256"], + "rng_state_sha256": witness["rng_state_sha256"], + "training_authorized": False, + "scientific_launch_authorized": False, + } + _require( + witness["witness_sha256"] + == canonical_sha256(witness_unsigned, domain=DEVELOPMENT_WITNESS_SCHEMA), + "r7 development witness digest changed", + ) + latest = history[-1] + _require( + latest["model_state_sha256"] == base_envelope["model_state_sha256"] + and latest["optimizer_state_sha256"] == base_envelope["optimizer_state_sha256"] + and latest["scheduler_state_sha256"] == base_envelope["scheduler_state_sha256"] + and latest["scaler_state_sha256"] == base_envelope["scaler_state_sha256"] + and latest["rng_state_sha256"] == base_envelope["rng_state_sha256"], + "r7 latest development decision does not bind the checkpointed model state", + ) + return MappingProxyType( + { + "base": base_info, + "run_state": state, + "run_contract": run_contract, + "selection": base_info["selection"], + } + ) + + +def _validate_codec_tree( + node: Any, + *, + blob_count: int, + depth: int = 0, + counters: Optional[dict[str, Any]] = None, +) -> dict[str, Any]: + """Reject every tree that the canonical r6 encoder could not emit.""" + + if counters is None: + counters = {"nodes": 0, "blob_refs": []} + counters["nodes"] += 1 + _require(depth <= MAX_CODEC_DEPTH, "checkpoint tree exceeds depth bound") + _require(counters["nodes"] <= MAX_CODEC_NODES, "checkpoint tree exceeds node bound") + _require(type(node) is dict and type(node.get("t")) is str, "checkpoint codec node changed") + tag = node["t"] + scalar_fields = { + "none": {"t"}, + "bool": {"t", "v"}, + "int": {"t", "v"}, + "float": {"t", "v"}, + "str": {"t", "v"}, + "bytes": {"t", "v"}, + } + if tag in scalar_fields: + _require(set(node) == scalar_fields[tag], f"{tag} checkpoint node changed") + if tag == "bool": + _require(type(node["v"]) is bool, "checkpoint bool changed") + elif tag == "int": + _require( + type(node["v"]) is str + and (node["v"] == "0" or node["v"].lstrip("-").isdigit()) + and str(int(node["v"])) == node["v"], + "checkpoint integer is noncanonical", + ) + elif tag == "float": + _require(type(node["v"]) is str, "checkpoint float changed") + try: + value = float.fromhex(node["v"]) + except ValueError as error: + raise NativeEightExecutorR7Error("checkpoint float is invalid") from error + _require(math.isfinite(value) and value.hex() == node["v"], "checkpoint float is noncanonical") + elif tag == "str": + _require(type(node["v"]) is str, "checkpoint string changed") + elif tag == "bytes": + _require(type(node["v"]) is str, "checkpoint bytes changed") + try: + decoded = bytes.fromhex(node["v"]) + except ValueError as error: + raise NativeEightExecutorR7Error("checkpoint bytes hex is invalid") from error + _require(decoded.hex() == node["v"], "checkpoint bytes hex is noncanonical") + return counters + if tag in {"list", "tuple"}: + _require(set(node) == {"t", "v"} and type(node["v"]) is list, "checkpoint sequence node changed") + for item in node["v"]: + _validate_codec_tree(item, blob_count=blob_count, depth=depth + 1, counters=counters) + return counters + if tag == "map": + _require(set(node) == {"t", "v"} and type(node["v"]) is list, "checkpoint map node changed") + previous: Optional[bytes] = None + for pair in node["v"]: + _require(type(pair) is list and len(pair) == 2, "checkpoint map pair changed") + _require(type(pair[0]) is dict, "checkpoint map key node changed") + key_bytes = _canonical_bytes(pair[0]) + _require(previous is None or previous < key_bytes, "checkpoint map keys are unsorted or duplicated") + previous = key_bytes + _require(pair[0].get("t") in {"str", "int"}, "checkpoint map key type is not canonical") + _validate_codec_tree(pair[0], blob_count=blob_count, depth=depth + 1, counters=counters) + _validate_codec_tree(pair[1], blob_count=blob_count, depth=depth + 1, counters=counters) + return counters + if tag in {"torch", "numpy"}: + _require(set(node) == {"t", "dtype", "shape", "blob"}, "checkpoint array node changed") + shape = node["shape"] + _require( + type(shape) is list + and len(shape) <= MAX_TENSOR_RANK + and all(type(value) is int and 0 <= value <= MAX_SHAPE_DIMENSION for value in shape), + "checkpoint array shape changed", + ) + _require(type(node["blob"]) is int and 0 <= node["blob"] < blob_count, "checkpoint blob reference changed") + counters["blob_refs"].append(node["blob"]) + if tag == "torch": + _require( + type(node["dtype"]) is str and node["dtype"] in _r6._TORCH_DTYPES, + "checkpoint torch dtype changed", + ) + itemsize = torch.empty((), dtype=_r6._TORCH_DTYPES[node["dtype"]]).element_size() + else: + _require(type(node["dtype"]) is str, "checkpoint numpy dtype changed") + try: + dtype = np.dtype(node["dtype"]) + except TypeError as error: + raise NativeEightExecutorR7Error("checkpoint numpy dtype is invalid") from error + _require( + not dtype.hasobject + and dtype.fields is None + and dtype.kind in "biufc" + and dtype.str == node["dtype"], + "checkpoint numpy dtype is unsafe or noncanonical", + ) + itemsize = dtype.itemsize + count = math.prod(shape) + _require(count == 0 or count <= MAX_CHECKPOINT_BYTES // itemsize, "checkpoint array element count exceeds bound") + return counters + raise NativeEightExecutorR7Error(f"unknown checkpoint codec tag {tag!r}") + + +class _CanonicalCheckpointEncoder(_r6._SafeCheckpointEncoder): + """Assign blob indices only after mapping keys are canonically ordered.""" + + def encode(self, value: Any, *, depth: int = 0) -> dict[str, Any]: + if not isinstance(value, Mapping): + return super().encode(value, depth=depth) + self._node(depth) + staged: list[tuple[bytes, dict[str, Any], Any]] = [] + for key, item in value.items(): + encoded_key = self.encode(key, depth=depth + 1) + staged.append((_canonical_bytes(encoded_key), encoded_key, item)) + staged.sort(key=lambda row: row[0]) + _require( + all(staged[index - 1][0] < staged[index][0] for index in range(1, len(staged))), + "checkpoint mapping keys collide after canonical encoding", + ) + return { + "t": "map", + "v": [ + [encoded_key, self.encode(item, depth=depth + 1)] + for _, encoded_key, item in staged + ], + } + + +def serialize_checkpoint(checkpoint: Mapping[str, Any]) -> bytes: + validate_checkpoint_semantics(checkpoint) + encoder = _CanonicalCheckpointEncoder() + tree = encoder.encode(dict(checkpoint)) + manifest = { + "schema": CHECKPOINT_CODEC_SCHEMA, + "tree": tree, + "blobs": [ + {"index": index, "bytes": len(blob), "sha256": _sha256(blob)} + for index, blob in enumerate(encoder.blobs) + ], + "node_count": encoder.nodes, + "training_authorized": False, + "scientific_launch_authorized": False, + } + counters = _validate_codec_tree(tree, blob_count=len(encoder.blobs)) + _require( + counters["nodes"] == encoder.nodes + and len(counters["blob_refs"]) == len(encoder.blobs) + and sorted(counters["blob_refs"]) == list(range(len(encoder.blobs))), + "canonical encoder emitted a non-one-to-one blob surface", + ) + manifest_bytes = _canonical_bytes(manifest) + _require(len(manifest_bytes) <= MAX_MANIFEST_BYTES, "checkpoint manifest exceeds bound") + prefix = CHECKPOINT_MAGIC + struct.pack("!Q", len(manifest_bytes)) + manifest_bytes + b"".join(encoder.blobs) + _require(len(prefix) + CHECKPOINT_DIGEST_BYTES <= MAX_CHECKPOINT_BYTES, "checkpoint exceeds byte bound") + return prefix + hashlib.sha256(prefix).digest() + + +def deserialize_checkpoint(payload: bytes) -> dict[str, Any]: + _require(type(payload) is bytes and payload, "checkpoint bytes are empty") + _require(len(payload) <= MAX_CHECKPOINT_BYTES, "checkpoint exceeds byte bound") + minimum = len(CHECKPOINT_MAGIC) + 8 + CHECKPOINT_DIGEST_BYTES + _require(len(payload) >= minimum and payload.startswith(CHECKPOINT_MAGIC), "checkpoint magic changed") + prefix = payload[:-CHECKPOINT_DIGEST_BYTES] + _require( + hashlib.sha256(prefix).digest() == payload[-CHECKPOINT_DIGEST_BYTES:], + "checkpoint raw-byte digest changed before parsing", + ) + manifest_length = struct.unpack( + "!Q", prefix[len(CHECKPOINT_MAGIC) : len(CHECKPOINT_MAGIC) + 8] + )[0] + _require(0 < manifest_length <= MAX_MANIFEST_BYTES, "checkpoint manifest length changed") + start = len(CHECKPOINT_MAGIC) + 8 + stop = start + manifest_length + _require(stop <= len(prefix), "checkpoint manifest is truncated") + try: + manifest = json.loads(prefix[start:stop].decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightExecutorR7Error("checkpoint manifest is invalid JSON") from error + _require( + type(manifest) is dict + and set(manifest) + == {"schema", "tree", "blobs", "node_count", "training_authorized", "scientific_launch_authorized"} + and manifest["schema"] == CHECKPOINT_CODEC_SCHEMA + and manifest["training_authorized"] is False + and manifest["scientific_launch_authorized"] is False + and _canonical_bytes(manifest) == prefix[start:stop], + "checkpoint codec manifest changed or is noncanonical", + ) + receipts = manifest["blobs"] + _require(type(receipts) is list, "checkpoint blob receipts changed") + blobs: list[bytes] = [] + cursor = stop + for expected_index, receipt in enumerate(receipts): + _require( + type(receipt) is dict + and set(receipt) == {"index", "bytes", "sha256"} + and receipt["index"] == expected_index + and type(receipt["bytes"]) is int + and receipt["bytes"] >= 0 + and _valid_sha256(receipt["sha256"]), + "checkpoint blob receipt changed", + ) + right = cursor + receipt["bytes"] + _require(right <= len(prefix), "checkpoint blob is truncated") + blob = prefix[cursor:right] + _require(_sha256(blob) == receipt["sha256"], "checkpoint blob digest changed") + blobs.append(blob) + cursor = right + _require(cursor == len(prefix), "checkpoint has trailing unreceipted bytes") + counters = _validate_codec_tree(manifest["tree"], blob_count=len(blobs)) + _require( + type(manifest["node_count"]) is int + and counters["nodes"] == manifest["node_count"] + and len(counters["blob_refs"]) == len(blobs) + and sorted(counters["blob_refs"]) == list(range(len(blobs))), + "checkpoint node count or blob reference surface is noncanonical", + ) + decoder = _r6._SafeCheckpointDecoder(blobs) + value = decoder.decode(manifest["tree"]) + _require(decoder.nodes == manifest["node_count"] and type(value) is dict, "checkpoint decoded root changed") + validate_checkpoint_semantics(value) + return value + + +def _checkpoint_blob_name(digest: str) -> str: + _require(_valid_sha256(digest), "checkpoint blob digest is invalid") + return f"review_checkpoint_blob_{digest}.r7ckpt" + + +def _is_checkpoint_blob_name(name: object) -> bool: + return ( + type(name) is str + and bool( + re.fullmatch( + r"review_checkpoint_blob_[0-9a-f]{64}\.r7ckpt", + name, + ) + ) + ) + + +def _is_index_temporary_name(name: object) -> bool: + return ( + type(name) is str + and bool(re.fullmatch(r"\.review_checkpoint_index_r7_[0-9a-f]{32}\.tmp", name)) + ) + + +class AtomicCheckpointStore(_r6.AtomicCheckpointStore): + """Descriptor-pinned, lineage-bound, crash-idempotent r7 checkpoint store.""" + + INDEX_NAME = "review_checkpoint_transaction_index_r7.json" + LOCK_NAME = ".review_checkpoint_transaction_r7.lock" + + def __init__( + self, + root: Path, + *, + fault_hook: Optional[Callable[[str], None]] = None, + ) -> None: + super().__init__(root, fault_hook=fault_hook) + lock = os.fstat(self._lock_fd) + self._lock_identity = (lock.st_dev, lock.st_ino) + + def _verify_lock_identity(self) -> None: + _require(self._lock_fd is not None, "checkpoint lock is closed") + try: + named = os.stat( + self.LOCK_NAME, + dir_fd=self._directory.fd, + follow_symlinks=False, + ) + opened = os.fstat(self._lock_fd) + except OSError as error: + raise NativeEightExecutorR7Error( + f"checkpoint lock identity cannot be revalidated: {error}" + ) from error + _require( + stat.S_ISREG(named.st_mode) + and (named.st_dev, named.st_ino) == self._lock_identity + and (opened.st_dev, opened.st_ino) == self._lock_identity, + "checkpoint lock leaf was replaced after pinning", + ) + + def _acquire(self, *, exclusive: bool) -> None: + self._directory.verify() + self._verify_lock_identity() + fcntl.flock(self._lock_fd, fcntl.LOCK_EX if exclusive else fcntl.LOCK_SH) + try: + self._directory.verify() + self._verify_lock_identity() + except BaseException: + fcntl.flock(self._lock_fd, fcntl.LOCK_UN) + raise + + def _write_blob(self, payload: bytes) -> tuple[str, str]: + digest = _sha256(payload) + name = _checkpoint_blob_name(digest) + if self._leaf_exists(name): + _require( + _sha256(self._read_leaf(name, maximum=MAX_CHECKPOINT_BYTES)) == digest, + "existing r7 checkpoint blob differs from its content address", + ) + else: + self._write_exclusive(name, payload) + return name, digest + + @staticmethod + def _validate_entry(entry: Any, *, label: str) -> None: + fields = { + "blob_name", + "checkpoint_sha256", + "epoch", + "cell_id", + "resume_sha256", + "run_contract_sha256", + "execution_policy_sha256", + "adapter_contract_sha256", + "development_contract_sha256", + "previous_committed_checkpoint_sha256", + "development_result_sha256", + } + _require( + type(entry) is dict + and set(entry) == fields + and _is_checkpoint_blob_name(entry["blob_name"]) + and _valid_sha256(entry["checkpoint_sha256"]) + and entry["blob_name"] == _checkpoint_blob_name(entry["checkpoint_sha256"]) + and type(entry["epoch"]) is int + and 1 <= entry["epoch"] <= MAX_EPOCHS + and entry["cell_id"] in CELL_ORDER + and _valid_sha256(entry["resume_sha256"]) + and _valid_sha256(entry["run_contract_sha256"]) + and _valid_sha256(entry["execution_policy_sha256"]) + and _valid_sha256(entry["adapter_contract_sha256"]) + and _valid_sha256(entry["development_contract_sha256"]) + and ( + entry["previous_committed_checkpoint_sha256"] is None + or _valid_sha256(entry["previous_committed_checkpoint_sha256"]) + ) + and _valid_sha256(entry["development_result_sha256"]), + f"checkpoint {label} entry changed", + ) + + def _index_bytes(self, unsigned: Mapping[str, Any]) -> bytes: + value = { + **dict(unsigned), + "index_sha256": canonical_sha256(unsigned, domain=CHECKPOINT_INDEX_SCHEMA), + } + return _canonical_bytes(value) + + def _load_index_optional(self) -> Optional[dict[str, Any]]: + if not self._leaf_exists(self.INDEX_NAME): + return None + payload = self._read_leaf(self.INDEX_NAME, maximum=16 * 1024 * 1024) + try: + value = json.loads(payload.decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightExecutorR7Error("checkpoint index is invalid JSON") from error + fields = { + "schema", + "generation", + "previous_index_sha256", + "run_contract_sha256", + "cell_id", + "execution_policy_sha256", + "adapter_contract_sha256", + "development_contract_sha256", + "roles", + "training_authorized", + "scientific_launch_authorized", + "index_sha256", + } + _require( + type(value) is dict + and set(value) == fields + and value["schema"] == CHECKPOINT_INDEX_SCHEMA + and _canonical_bytes(value) == payload, + "checkpoint index fields or canonical bytes changed", + ) + unsigned = dict(value) + observed = unsigned.pop("index_sha256") + _require( + observed == canonical_sha256(unsigned, domain=CHECKPOINT_INDEX_SCHEMA), + "checkpoint index digest changed", + ) + _require( + type(value["generation"]) is int + and value["generation"] >= 1 + and ( + value["previous_index_sha256"] is None + or _valid_sha256(value["previous_index_sha256"]) + ) + and _valid_sha256(value["run_contract_sha256"]) + and value["cell_id"] in CELL_ORDER + and _valid_sha256(value["execution_policy_sha256"]) + and _valid_sha256(value["adapter_contract_sha256"]) + and _valid_sha256(value["development_contract_sha256"]) + and value["training_authorized"] is False + and value["scientific_launch_authorized"] is False, + "checkpoint index identity, generation, or flags changed", + ) + roles = value["roles"] + _require(type(roles) is dict and set(roles) == {"latest", "best", "milestones"}, "checkpoint roles changed") + self._validate_entry(roles["latest"], label="latest") + self._validate_entry(roles["best"], label="best") + for entry in (roles["latest"], roles["best"]): + _require( + entry["run_contract_sha256"] == value["run_contract_sha256"] + and entry["cell_id"] == value["cell_id"] + and entry["execution_policy_sha256"] == value["execution_policy_sha256"] + and entry["adapter_contract_sha256"] == value["adapter_contract_sha256"] + and entry["development_contract_sha256"] == value["development_contract_sha256"], + "checkpoint logical role differs from index lineage", + ) + milestones = roles["milestones"] + _require(type(milestones) is dict, "checkpoint milestones changed") + latest_epoch = roles["latest"]["epoch"] + expected_keys = [str(epoch) for epoch in MILESTONE_EPOCHS if epoch <= latest_epoch] + _require(sorted(milestones, key=int) == expected_keys, "checkpoint milestone keys changed") + for key, entry in milestones.items(): + _require(int(key) in MILESTONE_EPOCHS, "checkpoint milestone epoch changed") + self._validate_entry(entry, label=f"milestone {key}") + _require( + entry["epoch"] == int(key) + and entry["run_contract_sha256"] == value["run_contract_sha256"] + and entry["cell_id"] == value["cell_id"] + and entry["execution_policy_sha256"] == value["execution_policy_sha256"] + and entry["adapter_contract_sha256"] == value["adapter_contract_sha256"] + and entry["development_contract_sha256"] == value["development_contract_sha256"], + "checkpoint milestone differs from index lineage", + ) + return value + + def _publish_index(self, payload: bytes) -> None: + temporary = f".review_checkpoint_index_r7_{secrets.token_hex(16)}.tmp" + self._write_exclusive(temporary, payload, mode=0o600) + try: + self._fault("before_index_replace") + self._directory.verify() + self._verify_lock_identity() + os.replace( + temporary, + self.INDEX_NAME, + src_dir_fd=self._directory.fd, + dst_dir_fd=self._directory.fd, + ) + os.fsync(self._directory.fd) + finally: + try: + os.unlink(temporary, dir_fd=self._directory.fd) + except FileNotFoundError: + pass + + @staticmethod + def _entries(index: Optional[Mapping[str, Any]]) -> list[Mapping[str, Any]]: + if index is None: + return [] + roles = index["roles"] + return [roles["latest"], roles["best"], *roles["milestones"].values()] + + def _recover_uncommitted_files(self, index: Optional[Mapping[str, Any]]) -> None: + referenced = {entry["blob_name"] for entry in self._entries(index)} + self._directory.verify() + self._verify_lock_identity() + for name in os.listdir(self._directory.fd): + if ( + (_is_checkpoint_blob_name(name) and name not in referenced) + or _is_index_temporary_name(name) + ): + metadata = os.stat(name, dir_fd=self._directory.fd, follow_symlinks=False) + _require(stat.S_ISREG(metadata.st_mode), "recoverable checkpoint leaf is not regular") + os.unlink(name, dir_fd=self._directory.fd) + os.fsync(self._directory.fd) + + def _load_entry_checkpoint(self, entry: Mapping[str, Any]) -> dict[str, Any]: + self._validate_entry(entry, label="referenced") + payload = self._read_leaf(entry["blob_name"], maximum=MAX_CHECKPOINT_BYTES) + _require(_sha256(payload) == entry["checkpoint_sha256"], "checkpoint blob differs from index") + checkpoint = deserialize_checkpoint(payload) + validated = validate_checkpoint_semantics(checkpoint) + state = validated["run_state"] + envelope = checkpoint["envelope"] + latest_witness = state["development_history"][-1] + _require( + envelope["resume_sha256"] == entry["resume_sha256"] + and envelope["epoch"] == entry["epoch"] + and envelope["cell_id"] == entry["cell_id"] + and envelope["run_contract_sha256"] == entry["run_contract_sha256"] + and envelope["execution_policy_sha256"] == entry["execution_policy_sha256"] + and envelope["adapter_contract_sha256"] == entry["adapter_contract_sha256"] + and envelope["development_contract_sha256"] == entry["development_contract_sha256"] + and envelope["previous_committed_checkpoint_sha256"] + == entry["previous_committed_checkpoint_sha256"] + and latest_witness["result_sha256"] == entry["development_result_sha256"], + "checkpoint blob semantic identity differs from index", + ) + return checkpoint + + def _verify_referenced_blobs(self, index: Mapping[str, Any]) -> None: + seen: set[str] = set() + for entry in self._entries(index): + if entry["blob_name"] in seen: + continue + seen.add(entry["blob_name"]) + self._load_entry_checkpoint(entry) + + def commit_completed_epoch(self, checkpoint: Mapping[str, Any]) -> Mapping[str, Any]: + self._acquire(exclusive=True) + try: + validated = validate_checkpoint_semantics(checkpoint) + state = validated["run_state"] + envelope = checkpoint["envelope"] + selection = validated["selection"] + epoch = envelope["epoch"] + _require(selection["completed_epochs"] == epoch, "checkpoint selection epoch changed") + improved = selection["last_improved"] + _require(type(improved) is bool, "checkpoint improvement cannot be derived") + serialized = serialize_checkpoint(checkpoint) + checkpoint_sha = _sha256(serialized) + entry = { + "blob_name": _checkpoint_blob_name(checkpoint_sha), + "checkpoint_sha256": checkpoint_sha, + "epoch": epoch, + "cell_id": envelope["cell_id"], + "resume_sha256": envelope["resume_sha256"], + "run_contract_sha256": envelope["run_contract_sha256"], + "execution_policy_sha256": envelope["execution_policy_sha256"], + "adapter_contract_sha256": envelope["adapter_contract_sha256"], + "development_contract_sha256": envelope["development_contract_sha256"], + "previous_committed_checkpoint_sha256": envelope[ + "previous_committed_checkpoint_sha256" + ], + "development_result_sha256": state["development_history"][-1][ + "result_sha256" + ], + } + previous = self._load_index_optional() + if previous is not None: + self._verify_referenced_blobs(previous) + latest = previous["roles"]["latest"] + previous_latest_checkpoint = self._load_entry_checkpoint(latest) + if latest["checkpoint_sha256"] == checkpoint_sha: + _require(latest == entry, "idempotent checkpoint digest has different semantics") + self._recover_uncommitted_files(previous) + return MappingProxyType( + { + "checkpoint_sha256": checkpoint_sha, + "index_sha256": previous["index_sha256"], + "idempotent": True, + } + ) + _require( + envelope["run_contract_sha256"] == previous["run_contract_sha256"] + and envelope["cell_id"] == previous["cell_id"] + and envelope["execution_policy_sha256"] + == previous["execution_policy_sha256"] + and envelope["adapter_contract_sha256"] + == previous["adapter_contract_sha256"] + and envelope["development_contract_sha256"] + == previous["development_contract_sha256"], + "checkpoint attempts to mix run, cell, policy, adapter, or development lineage", + ) + _require( + epoch == latest["epoch"] + 1 + and envelope["previous_committed_checkpoint_sha256"] + == latest["checkpoint_sha256"], + "checkpoint predecessor or epoch sequence changed", + ) + _require( + state["development_history"][:-1] + == previous_latest_checkpoint["payload"]["run_state"][ + "development_history" + ] + and checkpoint["payload"]["base_r6_checkpoint"]["payload"][ + "base_checkpoint" + ]["payload"]["selection_state"]["history"][:-1] + == previous_latest_checkpoint["payload"]["base_r6_checkpoint"][ + "payload" + ]["base_checkpoint"]["payload"]["selection_state"]["history"], + "checkpoint scientific history is not an exact append-only successor", + ) + generation = previous["generation"] + 1 + previous_index_sha = previous["index_sha256"] + previous_best = copy.deepcopy(previous["roles"]["best"]) + milestones = copy.deepcopy(previous["roles"]["milestones"]) + else: + _require( + epoch == 1 + and improved + and envelope["previous_committed_checkpoint_sha256"] is None, + "first checkpoint is not improving epoch one with a null predecessor", + ) + generation = 1 + previous_index_sha = None + previous_best = None + milestones = {} + self._recover_uncommitted_files(previous) + blob_name, observed_sha = self._write_blob(serialized) + _require(blob_name == entry["blob_name"] and observed_sha == checkpoint_sha, "checkpoint blob write identity changed") + self._fault("after_blob_before_index") + best = copy.deepcopy(entry) if improved else previous_best + _require(best is not None, "nonimproving checkpoint lacks a prior best") + if epoch in MILESTONE_EPOCHS: + _require(str(epoch) not in milestones, "checkpoint milestone repeats") + milestones[str(epoch)] = copy.deepcopy(entry) + unsigned_index = { + "schema": CHECKPOINT_INDEX_SCHEMA, + "generation": generation, + "previous_index_sha256": previous_index_sha, + "run_contract_sha256": envelope["run_contract_sha256"], + "cell_id": envelope["cell_id"], + "execution_policy_sha256": envelope["execution_policy_sha256"], + "adapter_contract_sha256": envelope["adapter_contract_sha256"], + "development_contract_sha256": envelope["development_contract_sha256"], + "roles": { + "latest": copy.deepcopy(entry), + "best": best, + "milestones": milestones, + }, + "training_authorized": False, + "scientific_launch_authorized": False, + } + self._publish_index(self._index_bytes(unsigned_index)) + self._fault("after_index_replace") + committed = self._load_index_optional() + _require( + committed is not None and committed["roles"]["latest"] == entry, + "checkpoint index publication failed", + ) + self._verify_referenced_blobs(committed) + self._recover_uncommitted_files(committed) + return MappingProxyType( + { + "checkpoint_sha256": checkpoint_sha, + "index_sha256": committed["index_sha256"], + "idempotent": False, + } + ) + finally: + self._release() + + def _load_role(self, role: str, *, milestone: Optional[int] = None) -> dict[str, Any]: + self._acquire(exclusive=False) + try: + index = self._load_index_optional() + _require(index is not None, "checkpoint transaction index is absent") + if role == "milestone": + _require(milestone in MILESTONE_EPOCHS, "checkpoint milestone request changed") + entry = index["roles"]["milestones"].get(str(milestone)) + _require(entry is not None, "requested checkpoint milestone is absent") + else: + _require(role in {"latest", "best"}, "checkpoint logical role changed") + entry = index["roles"][role] + return self._load_entry_checkpoint(entry) + finally: + self._release() + + def load_latest(self) -> dict[str, Any]: + return self._load_role("latest") + + def load_best(self) -> dict[str, Any]: + return self._load_role("best") + + def load_milestone(self, epoch: int) -> dict[str, Any]: + return self._load_role("milestone", milestone=epoch) + + def latest_checkpoint_sha256(self) -> str: + self._acquire(exclusive=False) + try: + index = self._load_index_optional() + _require(index is not None, "checkpoint transaction index is absent") + return index["roles"]["latest"]["checkpoint_sha256"] + finally: + self._release() + + def load_final_selected_best(self) -> Mapping[str, Any]: + """Return best bytes only after latest proves a terminal max/patience decision.""" + + self._acquire(exclusive=False) + try: + index = self._load_index_optional() + _require(index is not None, "checkpoint transaction index is absent") + latest_entry = index["roles"]["latest"] + best_entry = index["roles"]["best"] + latest = self._load_entry_checkpoint(latest_entry) + best = self._load_entry_checkpoint(best_entry) + latest_selection = validate_checkpoint_semantics(latest)["selection"] + _require( + latest_selection["stop_reason"] + in {"patience_exhausted", "max_epochs_reached"} + and latest_selection["best_epoch"] == best_entry["epoch"] + and latest_selection["best_result_sha256"] + == best_entry["development_result_sha256"], + "latest checkpoint does not prove the indexed final best", + ) + unsigned = { + "schema": "bertose_a5_final_selected_best_receipt_20260721_r7", + "run_contract_sha256": index["run_contract_sha256"], + "latest_epoch": latest_entry["epoch"], + "latest_checkpoint_sha256": latest_entry[ + "checkpoint_sha256" + ], + "stop_reason": latest_selection["stop_reason"], + "best_epoch": best_entry["epoch"], + "best_checkpoint_sha256": best_entry["checkpoint_sha256"], + "best_result_sha256": best_entry["development_result_sha256"], + "training_authorized": False, + "scientific_launch_authorized": False, + } + receipt = { + **unsigned, + "receipt_sha256": canonical_sha256( + unsigned, + domain="bertose-a5-final-selected-best-receipt-r7", + ), + } + return MappingProxyType( + { + "checkpoint": best, + "checkpoint_sha256": best_entry["checkpoint_sha256"], + "terminal_latest_checkpoint": latest, + "terminal_latest_checkpoint_sha256": latest_entry[ + "checkpoint_sha256" + ], + "selection_receipt": receipt, + } + ) + finally: + self._release() + + +def contract_summary() -> Mapping[str, Any]: + return MappingProxyType( + { + "schema": SCHEMA, + "status": ( + "PREPARATION_ONLY_ADAPTER_R2_UNBOUND_LAUNCH_CLOSED" + if _adapter_r2 is None + else "PREPARATION_ONLY_ADAPTER_R2_BOUND_OTHER_GATES_PENDING" + ), + "r6_source_sha256": R6_SOURCE_SHA256, + "adapter_r2_source_sha256": ADAPTER_R2_SOURCE_SHA256, + "adapter_r2_receipt_sha256": ADAPTER_R2_RECEIPT_SHA256, + "scientific_boundary_authority_sha256": ( + SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256 + ), + "scientific_boundary_receipt_sha256": ( + SCIENTIFIC_BOUNDARY_RECEIPT_SHA256 + ), + "scientific_boundary_status": _scientific_boundary_authority[ + "status" + ], + "class_identity_owner": "one_exact_adapter_r2_loaded_once", + "execution_policy": ( + "cross_process_stable_optimizer_scheduler_scaler_autocast_retry_behavior" + ), + "lifecycle": ( + "complete_train_epoch_then_matching_fixed_development_then_decision_then_commit" + ), + "selection": { + "maximum_epochs": MAX_EPOCHS, + "patience": PATIENCE, + "earliest_stop_epoch": EARLIEST_STOP_EPOCH, + "improvement_rule": "strict_lower", + "tie_rule": "earliest_epoch_retained", + }, + "production_trainable_cells": list(PRODUCTION_TRAINABLE_CELLS), + "historical_evidence_only_cells": list( + HISTORICAL_EVIDENCE_ONLY_CELLS + ), + "hardware_route": ( + "per_run_observed_profile_pinned_accepted_product_set_pending" + ), + "checkpoint_codec": "bounded_non_pickle_canonical_one_to_one_blob_surface", + "checkpoint_store": ( + "descriptor_and_lock_pinned_lineage_bound_crash_idempotent_transaction_index" + ), + "training_authorized": False, + "scientific_launch_authorized": False, + "execution_certified": False, + "nova_submission_authorized": False, + "affinose_supported": False, + "downstream_supported": False, + "static_final_release_bound": False, + } + ) + + +__all__ = [ + "ADAPTER_R2_RECEIPT_SHA256", + "ADAPTER_R2_SOURCE_SHA256", + "AFFINOSE_SUPPORTED", + "AdamWContract", + "AtomicCheckpointStore", + "CELL_ORDER", + "CHECKPOINT_CODEC_SCHEMA", + "CHECKPOINT_DIGEST_BYTES", + "CHECKPOINT_MAGIC", + "DeterministicRun", + "DevelopmentResult", + "DOWNSTREAM_SUPPORTED", + "EARLIEST_STOP_EPOCH", + "EXECUTION_CERTIFIED", + "ExactPolicyConfiguration", + "FixedDevelopmentContract", + "FrozenEpochPlan", + "HISTORICAL_EVIDENCE_ONLY_CELLS", + "MAX_EPOCHS", + "MILESTONE_EPOCHS", + "NOVA_SUBMISSION_AUTHORIZED", + "NativeEightCompositeR5", + "NativeEightConfig", + "NativeEightDeterministicExecutor", + "NativeEightExecutorR7Error", + "OBJECTIVES", + "PATIENCE", + "PlannedMicrobatch", + "PRODUCTION_TRAINABLE_CELLS", + "R6_SOURCE_SHA256", + "SCHEMA", + "SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256", + "SCIENTIFIC_BOUNDARY_RECEIPT_SHA256", + "StepDiagnostic", + "StrictLowerSelection", + "canonical_sha256", + "contract_summary", + "deserialize_checkpoint", + "serialize_checkpoint", + "validate_checkpoint_semantics", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r8/review_a5_native_eight_executor_r8.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r8/review_a5_native_eight_executor_r8.py new file mode 100644 index 0000000000000000000000000000000000000000..cbc97655a84666616d764258349ef03f6e73cee9 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r8/review_a5_native_eight_executor_r8.py @@ -0,0 +1,1205 @@ +"""Preparation-only native-eight executor R8 bound to Adapter R3/R4. + +R8 is an immutable, no-overwrite successor to executor R7. It executes a +deterministic in-memory successor of the exact R7 source, changing only the +generation labels and the Adapter-R2 source/receipt binding. The successor +then adds the four pieces that cannot be represented by an Adapter receipt: + +* the exact Adapter-R3 release/verification/contract and certified R4/BFS + identities are re-attested at import and every policy boundary; +* all six R4 provenance-only fields are hashed before being removed from the + dictionary passed to the R5 model; +* topology parent losses are recomputed only by + ``adapter.topology_loss_module.parent_balanced_unique_residue_pair_loss``; +* step and development provenance evidence is carried into the resume and + completed-epoch checkpoint, while legacy R2/R3 cursors/checkpoints fail. + +The mathematical/lifecycle/store implementation remains R7's exact code and +is loaded in an isolated module namespace. All training, scientific, GPU, +Nova, AFFINose, and downstream flags remain false. Static-active production +cells remain blocked by Adapter R3 until final EGNN/RVQ tokens and the +train-only static null are certified in a later adapter successor. +""" + +from __future__ import annotations + +import contextvars +import copy +import hashlib +import json +import os +from pathlib import Path +import re +import stat +import sys +from types import MappingProxyType, MethodType, ModuleType +from typing import Any, Mapping, Optional, Sequence + +import torch + + +SCHEMA = "bertose_a5_native_eight_deterministic_executor_20260721_r8" +PROVENANCE_SCHEMA = "bertose_a5_native_eight_r4_provenance_evidence_20260721_r8" +STEP_PROVENANCE_SCHEMA = "bertose_a5_native_eight_r4_step_provenance_20260721_r8" +DEVELOPMENT_PROVENANCE_SCHEMA = ( + "bertose_a5_native_eight_r4_development_provenance_20260721_r8" +) + +TRAINING_AUTHORIZED = False +SCIENTIFIC_LAUNCH_AUTHORIZED = False +EXECUTION_CERTIFIED = False +NOVA_SUBMISSION_AUTHORIZED = False +AFFINOSE_SUPPORTED = False +DOWNSTREAM_SUPPORTED = False +STATIC_FINAL_RELEASE_BOUND = False + +RUNTIME_ROOT = Path(__file__).absolute().parent +WRITING_ROOT = Path(__file__).absolute().parents[4] +R7_SOURCE_PATH = ( + RUNTIME_ROOT.parent + / "a5_pretraining_failclosed_integration_20260721_r7" + / "review_a5_native_eight_executor_r7.py" +) +R7_SOURCE_SHA256 = "e068a3c233fc3fd94fe3b8618edb9bd8c87fd81b97dff2666206fb870f0f898a" +R8_TRANSFORMED_CORE_SHA256 = ( + "05c32b50bb08c2809c3fab0eda6342754f164517da8b8f798a112ad791db6caf" +) + +ADAPTER_R3_SOURCE_SHA256 = ( + "a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e" +) +ADAPTER_R3_RELEASE_RECEIPT_SHA256 = ( + "e29df7a91d0c30238abe9155e600fb1b77b0d3d3481f6599d2ca0d2185371b9f" +) +ADAPTER_R3_VERIFICATION_RECEIPT_SHA256 = ( + "a92f4b951476e84af006015c97698f07d5e03e7a182c54c82b7d7c5c0e68ffb3" +) +ADAPTER_R3_CONTRACT_SHA256 = ( + "a3b681f307bad96abb8e446eb8efd769f29ccb65728d424295c89c9ba065224f" +) +R4_RUNTIME_SHA256 = "efc56a84cb82f30c0566da83a38bf0f02fdd507e02d116d827c1bbd827151ecf" +R4_RECEIPT_SHA256 = "654f5b9728c3dfd2588c4b570b0e3a1bcab8feb366af28eeead36f9beb37d921" +R4_BFS_RECEIPT_SHA256 = ( + "f20a1dd444f2760ccd8605d53ad716ceb55112fd32d3409826bcaf78ff2c6c3d" +) +TOPOLOGY_LOSS_SOURCE_SHA256 = ( + "64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e" +) +SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256 = ( + "1238f76e5da5184d16d33077bf3e5342033918fadb4eba84242c47cb1b1322cc" +) +SCIENTIFIC_BOUNDARY_RECEIPT_SHA256 = ( + "fb65dddf0bc61b4c73b5dc5ec796967e65263e9d7bdc4882e07684e882280fdb" +) + +MS_AUTHORITY_SHA256 = "48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4" +MS_RECEIPT_SHA256 = "f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4" +MS_CERTIFICATE_SHA256 = "53098620a5c22dafdc951ba743515b4b10b1673c02f0aa4d881db669584902fa" +MS_RUNTIME_SHA256 = "68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6" +MS_PARENT_MANIFEST_SHA256 = ( + "10dc3fa7622e2a7e448d775f4082fdc84aa0622f9a7a74bcfaeed491c0eb7d39" +) +STATIC_R7_AUTHORITY_SHA256 = ( + "59cf794d52341847b08aaa7f4212d1203dec4df89609157d924fda50d54f7602" +) +STATIC_R7_RECEIPT_SHA256 = ( + "0729fa35e7a34a51ee77d2752f008a783d582b845e6c8dd9ae694eb9edb61d9c" +) +STATIC_R7_SUMMARY_SHA256 = ( + "f95235a74962fd8aec04b0a14ad17aea3e2bcec27826102d5d26d3f907871908" +) + +PROVENANCE_FIELDS = ( + "sequence_rows", + "roles", + "seq_token_categories", + "topology_rows", + "topology_residue_counts", + "topology_target_counts", +) + +ADAPTER_R3_VERIFICATION_RECEIPT_PATH = ( + WRITING_ROOT + / "review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3" + / "review_a5_native_eight_data_adapter_verification_receipt_r1.json" +) + + +class NativeEightExecutorR8Error(RuntimeError): + """Fail-closed R8 binding, provenance, cursor, or checkpoint error.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeEightExecutorR8Error(message) + + +def _sha256(payload: bytes) -> str: + return hashlib.sha256(payload).hexdigest() + + +def _valid_sha256(value: object) -> bool: + return ( + type(value) is str + and len(value) == 64 + and all(character in "0123456789abcdef" for character in value) + ) + + +def _canonical_bytes(value: object) -> bytes: + return ( + json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False) + + "\n" + ).encode("utf-8") + + +def _read_regular_nofollow(path: Path, *, label: str) -> bytes: + absolute = Path(path) + _require(absolute.is_absolute(), f"{label} path is not absolute") + _require(hasattr(os, "O_NOFOLLOW") and hasattr(os, "O_DIRECTORY"), "no-follow traversal unavailable") + parts = absolute.parts + _require(parts and parts[0] == os.sep and all(part not in {"", ".", ".."} for part in parts[1:]), f"{label} path is noncanonical") + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + descriptor: Optional[int] = None + try: + descriptor = os.open(os.sep, directory_flags) + for component in parts[1:-1]: + next_descriptor = os.open(component, directory_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = next_descriptor + leaf = os.open(parts[-1], leaf_flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = leaf + before = os.fstat(descriptor) + _require(stat.S_ISREG(before.st_mode), f"{label} is not a regular file") + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1024 * 1024, remaining)) + _require(bool(chunk), f"{label} truncated during read") + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + _require( + (before.st_dev, before.st_ino, before.st_size, before.st_mtime_ns) + == (after.st_dev, after.st_ino, after.st_size, after.st_mtime_ns), + f"{label} changed during read", + ) + return b"".join(chunks) + except OSError as error: + raise NativeEightExecutorR8Error(f"{label} no-follow read failed: {error}") from error + finally: + if descriptor is not None: + try: + os.close(descriptor) + except OSError: + pass + + +def _transform_r7_source(source: bytes) -> bytes: + replacements = ( + (b"a5_native_eight_data_adapter_20260721_r2", b"a5_native_eight_data_adapter_20260721_r3"), + (b"review_a5_native_eight_data_adapter_r2.py", b"review_a5_native_eight_data_adapter_r3.py"), + (b"9f8f167148aa234df413e4c3d4e1846881781c8e5a19bd91b0b178b260a3a537", ADAPTER_R3_SOURCE_SHA256.encode("ascii")), + (b"review_a5_native_eight_data_adapter_receipt_r2.json", b"review_a5_native_eight_data_adapter_receipt_r3.json"), + (b"3b2118e128a5550ba4918b4f4f2c6d8045e319b7cff37b76d74dce6b3220c9f0", ADAPTER_R3_RELEASE_RECEIPT_SHA256.encode("ascii")), + (b"R7", b"R8"), + (b"r7", b"r8"), + ) + transformed = source + expected_counts = (2, 1, 1, 1, 1, 33, 65) + for (old, new), expected_count in zip(replacements, expected_counts): + _require(transformed.count(old) == expected_count, "R7 successor transformation surface changed") + transformed = transformed.replace(old, new) + _require(_sha256(transformed) == R8_TRANSFORMED_CORE_SHA256, "transformed R8 core hash changed") + return transformed + + +def _load_core() -> ModuleType: + source = _read_regular_nofollow(R7_SOURCE_PATH, label="executor R7 predecessor") + _require(_sha256(source) == R7_SOURCE_SHA256, "executor R7 predecessor hash changed") + transformed = _transform_r7_source(source) + module_name = f"_review_a5_native_eight_r8_core_{R8_TRANSFORMED_CORE_SHA256[:20]}" + existing = sys.modules.get(module_name) + if existing is not None: + _require(getattr(existing, "__r8_transformed_core_sha256__", None) == R8_TRANSFORMED_CORE_SHA256, "R8 core module slot changed") + return existing + module = ModuleType(module_name) + # The predecessor path is retained so its relative R6 binding stays exact. + module.__file__ = os.fspath(R7_SOURCE_PATH) + module.__package__ = "" + module.__r8_transformed_core_sha256__ = R8_TRANSFORMED_CORE_SHA256 + sys.modules[module_name] = module + try: + exec(compile(transformed, os.fspath(R7_SOURCE_PATH), "exec"), module.__dict__) + except BaseException: + sys.modules.pop(module_name, None) + raise + return module + + +_core = _load_core() +_adapter_r3 = _core._adapter_r2 +_require(_adapter_r3 is not None, "Adapter R3 did not bind into the isolated R8 core") +# Present one catchable error API across the transformed predecessor and the +# R8 successor checks below. Python resolves this global at each _require(). +NativeEightExecutorR8Error = _core.NativeEightExecutorR8Error + + +def _verify_exact_adapter_r3() -> Mapping[str, str]: + verification_bytes = _read_regular_nofollow( + ADAPTER_R3_VERIFICATION_RECEIPT_PATH, + label="Adapter R3 verification receipt", + ) + _require(_sha256(verification_bytes) == ADAPTER_R3_VERIFICATION_RECEIPT_SHA256, "Adapter R3 verification receipt hash changed") + try: + verification = json.loads(verification_bytes.decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeEightExecutorR8Error("Adapter R3 verification receipt is invalid") from error + _require(_canonical_bytes(verification) == verification_bytes, "Adapter R3 verification receipt is noncanonical") + artifacts = verification.get("artifacts") + identities = verification.get("identities") + _require( + type(artifacts) is dict + and artifacts.get("runtime_source", {}).get("sha256") == ADAPTER_R3_SOURCE_SHA256 + and artifacts.get("release_receipt", {}).get("sha256") == ADAPTER_R3_RELEASE_RECEIPT_SHA256 + and type(identities) is dict + and identities.get("adapter_contract_sha256") == ADAPTER_R3_CONTRACT_SHA256 + and verification.get("status") == "PASS_PREPARATION_ONLY_R4_MIGRATION_CERTIFIED_LAUNCH_CLOSED", + "Adapter R3 verification surface changed", + ) + for flag in ( + "training_authorized", + "scientific_launch_authorized", + "gpu_launch_authorized", + "nova_submission_authorized", + "execution_certified", + "affinose_supported", + "downstream_supported", + "weight_ablation_supported", + ): + _require(verification.get(flag) is False, f"Adapter R3 verification self-authorizes {flag}") + with _adapter_r3.NativeEightDataAdapter() as adapter: + _require(adapter.contract_sha256 == ADAPTER_R3_CONTRACT_SHA256, "Adapter R3 contract digest changed") + observed = dict(adapter.verify_authorities()) + exact = { + "sequence_topology_r4_runtime": R4_RUNTIME_SHA256, + "sequence_topology_r4_receipt": R4_RECEIPT_SHA256, + "sequence_topology_r4_bfs_receipt": R4_BFS_RECEIPT_SHA256, + "topology_loss_source": TOPOLOGY_LOSS_SOURCE_SHA256, + "ms_runtime": MS_RUNTIME_SHA256, + "ms_authority": MS_AUTHORITY_SHA256, + "ms_receipt": MS_RECEIPT_SHA256, + "ms_certificate": MS_CERTIFICATE_SHA256, + "ms_parent_manifest": MS_PARENT_MANIFEST_SHA256, + "static_r7_authority": STATIC_R7_AUTHORITY_SHA256, + "static_r7_receipt": STATIC_R7_RECEIPT_SHA256, + "static_r7_summary": STATIC_R7_SUMMARY_SHA256, + "scientific_boundary_authority": SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256, + "scientific_boundary_receipt": SCIENTIFIC_BOUNDARY_RECEIPT_SHA256, + } + for key, expected in exact.items(): + _require(observed.get(key) == expected, f"Adapter R3 direct authority changed: {key}") + return MappingProxyType(observed) + + +_ADAPTER_R3_AUTHORITIES = _verify_exact_adapter_r3() +_original_r6_adapter_contract = _core._r6._adapter_contract + + +def _r8_adapter_transport_contract(adapter: Any) -> tuple[dict[str, Any], str]: + """Validate R3 exactly while retaining R6's internal transport domain.""" + + if type(adapter) is not _adapter_r3.NativeEightDataAdapter: + return _original_r6_adapter_contract(adapter) + payload = adapter.contract_payload() + _require(type(payload) is dict, "Adapter R3 contract payload changed") + _require( + payload.get("source_sha256") == ADAPTER_R3_SOURCE_SHA256 + and payload.get("receipt_sha256") == ADAPTER_R3_RELEASE_RECEIPT_SHA256 + and adapter.contract_sha256 == ADAPTER_R3_CONTRACT_SHA256 + and payload.get("training_authorized") is False + and payload.get("scientific_launch_authorized") is False, + "Adapter R3 contract source, receipt, digest, or flags changed", + ) + observed = dict(adapter.verify_authorities()) + _require(observed == dict(_ADAPTER_R3_AUTHORITIES), "Adapter R3 live authorities changed") + _require( + _core.canonical_sha256( + observed, + domain="bertose-a5-native-eight-data-adapter-authorities-r7", + ) + == payload.get("authority_set_sha256"), + "Adapter R3 authority-set digest changed", + ) + # R6's nested checkpoint format retains its frozen transport-domain digest; + # R8 separately and mandatorily binds the declared R3 digest above. + transport_sha = _core._r6.canonical_sha256( + payload, + domain="bertose-a5-native-eight-data-adapter-contract-r6", + ) + return payload, transport_sha + + +_core._r6._adapter_contract = _r8_adapter_transport_contract + + +def _provenance_field_hashes(model_inputs: Mapping[str, Any]) -> dict[str, str]: + _require(set(PROVENANCE_FIELDS).issubset(model_inputs), "R4 provenance field was dropped") + return { + field: _core._r6._r5._recursive_state_sha256(model_inputs[field]) + for field in PROVENANCE_FIELDS + } + + +def _batch_provenance_evidence(model_inputs: Mapping[str, Any]) -> dict[str, Any]: + hashes = _provenance_field_hashes(model_inputs) + unsigned = { + "provenance_fields": list(PROVENANCE_FIELDS), + "provenance_field_sha256": hashes, + "training_authorized": False, + "scientific_launch_authorized": False, + } + return { + **unsigned, + "evidence_sha256": _core.canonical_sha256( + unsigned, + domain="bertose-a5-r4-provenance-batch-r8", + ), + } + + +def _r8_model_forward(model: Any, **model_inputs: Any) -> Any: + """Remove audit-only fields and replace only the topology loss reduction.""" + + mode = getattr(model, "_review_a5_r8_provenance_mode", "train") + present = tuple(field in model_inputs for field in PROVENANCE_FIELDS) + _require(all(present) or not any(present), "partial R4 provenance reached the model boundary") + if all(present): + evidence = _batch_provenance_evidence(model_inputs) + if mode == "development": + model._review_a5_r8_development_batches.append(copy.deepcopy(evidence)) + else: + _require( + mode == "train", + "development model call bypassed the six-field R4 provenance gate", + ) + forward_inputs = dict(model_inputs) + for field in PROVENANCE_FIELDS: + forward_inputs.pop(field, None) + topology_enabled = bool(getattr(model, "enabled", {}).get("topology", False)) + topology_labels = forward_inputs.get("topology_labels") + topology_available = forward_inputs.get("topology_available") + # The predecessor model still owns the topology head, but its detached + # local reduction must not execute in R8. Withhold only the two target + # fields, obtain the differentiable predictions, then call the one module + # bound by Adapter R3 below. + if topology_enabled: + forward_inputs.pop("topology_labels", None) + forward_inputs.pop("topology_available", None) + original = model._review_a5_r8_original_forward + output = original(**forward_inputs) + if not topology_enabled: + return output + predictions = output.topology_token_pair_predictions + _require( + isinstance(predictions, torch.Tensor) + and isinstance(topology_labels, torch.Tensor) + and isinstance(topology_available, torch.Tensor), + "enabled topology branch lacks exact predictions/labels/availability", + ) + module = model._review_a5_r8_topology_loss_module + parent_loss_function = model._review_a5_r8_topology_parent_loss_function + _require( + module is not None and callable(parent_loss_function), + "topology loss is not the exact adapter-owned module", + ) + losses: list[torch.Tensor] = [] + indices: list[int] = [] + for parent in range(predictions.shape[0]): + if not bool(topology_available[parent].item()): + continue + parent_loss = parent_loss_function( + predictions[parent : parent + 1], + model_inputs["seq_residue_ids"][parent : parent + 1], + model_inputs["seq_attention_mask"][parent : parent + 1], + topology_labels[parent : parent + 1], + ) + _require( + isinstance(parent_loss, torch.Tensor) + and parent_loss.ndim == 0 + and torch.isfinite(parent_loss).item(), + "adapter-owned topology loss did not return one finite parent scalar", + ) + losses.append(parent_loss) + indices.append(parent) + parent_losses = dict(output.parent_losses) + loss_parent_indices = dict(output.loss_parent_indices) + parent_losses["topology"] = ( + torch.stack(losses) + if losses + else predictions.new_empty((0,)) + ) + loss_parent_indices["topology"] = torch.tensor( + indices, + dtype=torch.long, + device=predictions.device, + ) + output.parent_losses = MappingProxyType(parent_losses) + output.loss_parent_indices = MappingProxyType(loss_parent_indices) + return output + + +def _install_model_bridge(model: Any, adapter: Any) -> None: + _require(not hasattr(model, "_review_a5_r8_original_forward"), "R8 model bridge installed twice") + model._review_a5_r8_original_forward = model.forward + model._review_a5_r8_data_adapter = adapter + topology_module = ( + adapter.topology_loss_module + if bool(getattr(model, "enabled", {}).get("topology", False)) + else None + ) + topology_parent_loss_function = ( + getattr(topology_module, "parent_balanced_unique_residue_pair_loss", None) + if topology_module is not None + else None + ) + _require( + topology_module is None or callable(topology_parent_loss_function), + "Adapter R3 topology loss module lacks the certified parent loss", + ) + # Acquire the receipt-bound adapter-owned callable once at bridge install. + # Adapter R3 re-verifies its authorities at every optimizer-step boundary; + # resolving the property again for every microbatch would only repeat file + # hashing inside the hot model-forward path. + model._review_a5_r8_topology_loss_module = topology_module + model._review_a5_r8_topology_parent_loss_function = topology_parent_loss_function + model._review_a5_r8_provenance_mode = "train" + model._review_a5_r8_development_batches = [] + model.forward = MethodType(_r8_model_forward, model) + + +_original_executor_init = _core.NativeEightDeterministicExecutor.__init__ +_original_policy_builder = _core.NativeEightDeterministicExecutor._build_policy_payload + + +def _r8_executor_init(self: Any, model: Any, *, data_adapter: Any, **kwargs: Any) -> None: + _install_model_bridge(model, data_adapter) + _original_executor_init(self, model, data_adapter=data_adapter, **kwargs) + + +def _r8_policy_builder(self: Any) -> dict[str, Any]: + payload = _original_policy_builder(self) + payload["r8_successor_binding"] = { + "r8_successor_source_sha256": _sha256( + _read_regular_nofollow( + Path(__file__).absolute(), + label="executor R8 successor source", + ) + ), + "r7_predecessor_source_sha256": R7_SOURCE_SHA256, + "transformed_core_sha256": R8_TRANSFORMED_CORE_SHA256, + "adapter_r3_source_sha256": ADAPTER_R3_SOURCE_SHA256, + "adapter_r3_release_receipt_sha256": ADAPTER_R3_RELEASE_RECEIPT_SHA256, + "adapter_r3_verification_receipt_sha256": ADAPTER_R3_VERIFICATION_RECEIPT_SHA256, + "adapter_r3_declared_contract_sha256": ADAPTER_R3_CONTRACT_SHA256, + "r4_runtime_sha256": R4_RUNTIME_SHA256, + "r4_receipt_sha256": R4_RECEIPT_SHA256, + "r4_bfs_receipt_sha256": R4_BFS_RECEIPT_SHA256, + "topology_loss_source_sha256": TOPOLOGY_LOSS_SOURCE_SHA256, + "provenance_fields": list(PROVENANCE_FIELDS), + "forward_contract": "validate_and_hash_six_r4_fields_then_remove_only_from_model_call", + "topology_contract": "adapter.topology_loss_module_per_eligible_parent_slice", + "training_authorized": False, + "scientific_launch_authorized": False, + } + return payload + + +_core.NativeEightDeterministicExecutor.__init__ = _r8_executor_init +_core.NativeEightDeterministicExecutor._build_policy_payload = _r8_policy_builder + + +_original_bind_epoch = _core._r6.NativeEightProductionExecutor.bind_epoch + + +def _r8_bind_epoch(self: Any, epoch: int) -> Any: + plan = _original_bind_epoch(self, epoch) + self.completed_r4_provenance_evidence = [] + return plan + + +def _r8_step_identity_sha256(identity: Mapping[str, Any]) -> str: + unsigned = dict(identity) + observed = unsigned.pop("step_identity_sha256", None) + expected = _core.canonical_sha256( + unsigned, + domain="bertose-a5-native-eight-authoritative-step-r7", + ) + _require(observed == expected, "Adapter R3 step identity digest changed") + return expected + + +def _r8_execute_next_step(self: Any) -> Any: + plan = self.bound_plan + _require(plan is not None, "R8 executor has no bound epoch") + self.reverify_contract() + step_index = self.next_optimizer_step + materialized = self.data_adapter.materialize_training_step( + plan=plan, + step_index=step_index, + cell_id=self.cell_id, + device=next(self.model.parameters()).device, + ) + _require( + isinstance(materialized, Mapping) + and set(materialized) == {"micros", "step_identity"}, + "Adapter R3 materialized-step fields changed", + ) + micros = materialized["micros"] + identity = materialized["step_identity"] + _require( + type(micros) is tuple + and len(micros) == _core._r6._r5._planner.MICROBATCHES_PER_STEP, + "Adapter R3 did not return the frozen microbatch count", + ) + _require(all(type(value) is _core.PlannedMicrobatch for value in micros), "Adapter R3 microbatch class split") + base_fields = { + "schema", "adapter_contract_sha256", "plan_sha256", "seed", "epoch", + "optimizer_step_index", "parent_indices", "parent_ids", "availability_bits_hex", + "sequence_stream_sha256", "topology_surface_sha256", "ms_stream_sha256", + "static_stream_sha256", "model_input_sha256", "training_authorized", + "scientific_launch_authorized", "step_identity_sha256", + } + r4_fields = { + "sequence_topology_r4_runtime_sha256", + "sequence_topology_r4_receipt_sha256", + "sequence_topology_bfs_receipt_sha256", + "topology_loss_source_sha256", + "r4_batch_provenance_sha256", + } + _require(type(identity) is dict and set(identity) == base_fields | r4_fields, "Adapter R3 step identity fields changed") + identity_sha = _r8_step_identity_sha256(identity) + expected_adapter_contract = ( + ADAPTER_R3_CONTRACT_SHA256 + if type(self.data_adapter) is _adapter_r3.NativeEightDataAdapter + else self.data_adapter.contract_sha256 + ) + _require( + identity["adapter_contract_sha256"] == expected_adapter_contract + and identity["plan_sha256"] == plan.plan_sha256 + and identity["seed"] == plan.seed + and identity["epoch"] == plan.epoch + and identity["optimizer_step_index"] == step_index + and tuple(identity["parent_indices"]) == plan.step_parent_indices(step_index) + and tuple(identity["parent_ids"]) == plan.step_parent_ids(step_index) + and identity["availability_bits_hex"] == plan.step_availability_bits(step_index).hex() + and identity["sequence_topology_r4_runtime_sha256"] == R4_RUNTIME_SHA256 + and identity["sequence_topology_r4_receipt_sha256"] == R4_RECEIPT_SHA256 + and identity["sequence_topology_bfs_receipt_sha256"] == R4_BFS_RECEIPT_SHA256 + and identity["topology_loss_source_sha256"] == TOPOLOGY_LOSS_SOURCE_SHA256 + and identity["training_authorized"] is False + and identity["scientific_launch_authorized"] is False, + "Adapter R3 step differs from the exact R4 plan/bindings", + ) + provenance_surface = [ + {field: micro.model_inputs[field] for field in PROVENANCE_FIELDS} + for micro in micros + ] + _require( + _core._r6._r5._recursive_state_sha256(provenance_surface) + == identity["r4_batch_provenance_sha256"], + "Adapter R3 combined R4 provenance digest changed", + ) + per_field = { + field: _core._r6._r5._recursive_state_sha256( + [micro.model_inputs[field] for micro in micros] + ) + for field in PROVENANCE_FIELDS + } + sanitized = tuple( + _core.PlannedMicrobatch( + parent_indices=micro.parent_indices, + parent_ids=micro.parent_ids, + model_inputs=MappingProxyType( + { + key: value + for key, value in micro.model_inputs.items() + if key not in PROVENANCE_FIELDS + } + ), + ) + for micro in micros + ) + diagnostic = self._inner.execute_step(sanitized) + unsigned = { + "schema": STEP_PROVENANCE_SCHEMA, + "epoch": plan.epoch, + "optimizer_step_index": step_index, + "step_identity_sha256": identity_sha, + "full_model_input_sha256": identity["model_input_sha256"], + "forward_model_input_sha256": diagnostic.input_sha256, + "r4_batch_provenance_sha256": identity["r4_batch_provenance_sha256"], + "provenance_fields": list(PROVENANCE_FIELDS), + "provenance_field_sha256": per_field, + "training_authorized": False, + "scientific_launch_authorized": False, + } + evidence = { + **unsigned, + "evidence_sha256": _core.canonical_sha256(unsigned, domain=STEP_PROVENANCE_SCHEMA), + } + _require( + diagnostic.optimizer_step_index == step_index + and diagnostic.plan_sha256 == plan.plan_sha256, + "R5 diagnostic differs from the Adapter R3 plan", + ) + self.completed_step_identities.append(identity_sha) + if not hasattr(self, "completed_r4_provenance_evidence"): + self.completed_r4_provenance_evidence = [] + self.completed_r4_provenance_evidence.append(evidence) + return diagnostic + + +_core._r6.NativeEightProductionExecutor.bind_epoch = _r8_bind_epoch +_core._r6.NativeEightProductionExecutor.execute_next_step = _r8_execute_next_step + + +_internal_checkpoint_operation: contextvars.ContextVar[bool] = contextvars.ContextVar( + "review_a5_r8_internal_checkpoint_operation", + default=False, +) +_original_validate_checkpoint_semantics = _core.validate_checkpoint_semantics +_OriginalDeterministicRun = _core.DeterministicRun + + +def _validate_cursor_r3_r4(cursor: Any, *, isolated_fixture: bool) -> None: + _require(type(cursor) is dict, "R8 checkpoint adapter cursor is not exact") + _require( + cursor.get("schema") == "bertose_a5_native_eight_data_cursor_20260721_r3", + "legacy R2 adapter cursor is rejected", + ) + r4 = cursor.get("sequence_topology_r4") + masker = cursor.get("sequence_mask_stream", {}).get("masker_state") + _require( + type(r4) is dict + and r4.get("runtime_sha256") == R4_RUNTIME_SHA256 + and r4.get("runtime_receipt_sha256") == R4_RECEIPT_SHA256 + and r4.get("bfs_replay_receipt_sha256") == R4_BFS_RECEIPT_SHA256 + and r4.get("topology_loss_source_sha256") == TOPOLOGY_LOSS_SOURCE_SHA256, + "R8 checkpoint lacks the exact R4 cursor binding", + ) + _require( + type(masker) is dict + and masker.get("schema") == "bertose_a5_official_sequence_masker_resume_v4", + "legacy R3 sequence/topology masker cursor is rejected", + ) + if not isolated_fixture: + _require( + r4.get("predecessor_receipt_sha256") + == _adapter_r3.FROZEN_R3_RUNTIME_RECEIPT_SHA256 + and r4.get("store_manifest_identity_sha256"), + "production R4 cursor predecessor/store identity changed", + ) + + +def _validate_step_evidence( + row: Any, + *, + expected_step: int, + expected_plan_epoch: int, + expected_step_identity_sha256: str, +) -> None: + _require(type(row) is dict, "R8 step provenance evidence changed") + unsigned = dict(row) + observed = unsigned.pop("evidence_sha256", None) + _require( + set(unsigned) + == { + "schema", "epoch", "optimizer_step_index", "step_identity_sha256", + "full_model_input_sha256", "forward_model_input_sha256", + "r4_batch_provenance_sha256", "provenance_fields", + "provenance_field_sha256", "training_authorized", + "scientific_launch_authorized", + } + and unsigned["schema"] == STEP_PROVENANCE_SCHEMA + and unsigned["epoch"] == expected_plan_epoch + and unsigned["optimizer_step_index"] == expected_step + and unsigned["step_identity_sha256"] == expected_step_identity_sha256 + and unsigned["provenance_fields"] == list(PROVENANCE_FIELDS) + and type(unsigned["provenance_field_sha256"]) is dict + and set(unsigned["provenance_field_sha256"]) == set(PROVENANCE_FIELDS) + and all(_valid_sha256(value) for value in unsigned["provenance_field_sha256"].values()) + and all( + _valid_sha256(unsigned[field]) + for field in ( + "step_identity_sha256", "full_model_input_sha256", + "forward_model_input_sha256", "r4_batch_provenance_sha256", + ) + ) + and unsigned["training_authorized"] is False + and unsigned["scientific_launch_authorized"] is False + and observed == _core.canonical_sha256(unsigned, domain=STEP_PROVENANCE_SCHEMA), + "R8 step provenance evidence digest/fields changed", + ) + + +def _validate_development_evidence( + row: Any, + *, + expected_epoch: int, + expected_witness: Mapping[str, Any], +) -> None: + _require(type(row) is dict, "R8 development provenance evidence changed") + unsigned = dict(row) + observed = unsigned.pop("evidence_sha256", None) + _require( + set(unsigned) + == { + "schema", "epoch", "batch_count", "batch_chain_sha256", + "provenance_fields", "provenance_field_chain_sha256", + "development_result_sha256", "development_contract_sha256", + "development_surface_sha256", "development_witness_sha256", + "training_authorized", "scientific_launch_authorized", + } + and unsigned["schema"] == DEVELOPMENT_PROVENANCE_SCHEMA + and unsigned["epoch"] == expected_epoch + and type(unsigned["batch_count"]) is int + and unsigned["batch_count"] > 0 + and _valid_sha256(unsigned["batch_chain_sha256"]) + and unsigned["provenance_fields"] == list(PROVENANCE_FIELDS) + and type(unsigned["provenance_field_chain_sha256"]) is dict + and set(unsigned["provenance_field_chain_sha256"]) == set(PROVENANCE_FIELDS) + and all(_valid_sha256(value) for value in unsigned["provenance_field_chain_sha256"].values()) + and unsigned["development_result_sha256"] + == expected_witness["result_sha256"] + and unsigned["development_contract_sha256"] + == expected_witness["result_payload"]["contract_sha256"] + and unsigned["development_surface_sha256"] + == expected_witness["result_payload"]["surface_sha256"] + and unsigned["development_witness_sha256"] + == expected_witness["witness_sha256"] + and unsigned["training_authorized"] is False + and unsigned["scientific_launch_authorized"] is False + and observed == _core.canonical_sha256(unsigned, domain=DEVELOPMENT_PROVENANCE_SCHEMA), + "R8 development provenance evidence digest/fields changed", + ) + + +def validate_checkpoint_semantics(checkpoint: Mapping[str, Any]) -> Mapping[str, Any]: + state = checkpoint.get("payload", {}).get("run_state") if isinstance(checkpoint, Mapping) else None + envelope = checkpoint.get("envelope") if isinstance(checkpoint, Mapping) else None + if ( + _internal_checkpoint_operation.get() + and type(state) is dict + and "r4_provenance_evidence" not in state + ): + return _original_validate_checkpoint_semantics(checkpoint) + _require(type(state) is dict and type(envelope) is dict, "R8 checkpoint root changed") + evidence = state.get("r4_provenance_evidence") + _require(type(evidence) is dict, "legacy R7 checkpoint is rejected") + epoch = state.get("epoch") + _require(type(epoch) is int and epoch >= 1, "R8 checkpoint epoch changed") + unsigned_evidence = dict(evidence) + observed_evidence_sha = unsigned_evidence.pop("evidence_sha256", None) + required = { + "schema", "adapter_r3_source_sha256", "adapter_r3_release_receipt_sha256", + "adapter_r3_verification_receipt_sha256", "adapter_r3_contract_sha256", + "r4_runtime_sha256", "r4_receipt_sha256", "r4_bfs_receipt_sha256", + "topology_loss_source_sha256", "cell_id", "plan_epoch", "plan_sha256", + "adapter_cursor_sha256", "completed_step_chain_sha256", + "provenance_fields", "training_steps", + "development_epochs", "training_authorized", "scientific_launch_authorized", + } + _require( + set(unsigned_evidence) == required + and unsigned_evidence["schema"] == PROVENANCE_SCHEMA + and unsigned_evidence["adapter_r3_source_sha256"] == ADAPTER_R3_SOURCE_SHA256 + and unsigned_evidence["adapter_r3_release_receipt_sha256"] == ADAPTER_R3_RELEASE_RECEIPT_SHA256 + and unsigned_evidence["adapter_r3_verification_receipt_sha256"] == ADAPTER_R3_VERIFICATION_RECEIPT_SHA256 + and unsigned_evidence["adapter_r3_contract_sha256"] == ADAPTER_R3_CONTRACT_SHA256 + and unsigned_evidence["r4_runtime_sha256"] == R4_RUNTIME_SHA256 + and unsigned_evidence["r4_receipt_sha256"] == R4_RECEIPT_SHA256 + and unsigned_evidence["r4_bfs_receipt_sha256"] == R4_BFS_RECEIPT_SHA256 + and unsigned_evidence["topology_loss_source_sha256"] == TOPOLOGY_LOSS_SOURCE_SHA256 + and unsigned_evidence["cell_id"] == state.get("cell_id") + and unsigned_evidence["plan_epoch"] == epoch - 1 + and unsigned_evidence["plan_sha256"] == envelope.get("plan_sha256") + and _valid_sha256(unsigned_evidence["adapter_cursor_sha256"]) + and _valid_sha256(unsigned_evidence["completed_step_chain_sha256"]) + and unsigned_evidence["provenance_fields"] == list(PROVENANCE_FIELDS) + and unsigned_evidence["training_authorized"] is False + and unsigned_evidence["scientific_launch_authorized"] is False + and observed_evidence_sha + == _core.canonical_sha256(unsigned_evidence, domain=PROVENANCE_SCHEMA) + and envelope.get("r4_provenance_evidence_sha256") == observed_evidence_sha, + "R8 checkpoint provenance binding/digest changed", + ) + training_steps = unsigned_evidence["training_steps"] + development_epochs = unsigned_evidence["development_epochs"] + _require(type(training_steps) is list and type(development_epochs) is list, "R8 provenance histories changed") + r6_checkpoint = checkpoint["payload"]["base_r6_checkpoint"] + r6_state = r6_checkpoint["payload"]["r6_state"] + r6_envelope = r6_checkpoint["envelope"] + completed_identities = r6_state.get("completed_step_identities") + _require( + type(completed_identities) is list + and len(completed_identities) == len(training_steps) + and unsigned_evidence["adapter_cursor_sha256"] + == r6_envelope.get("adapter_cursor_sha256") + and unsigned_evidence["completed_step_chain_sha256"] + == r6_envelope.get("completed_step_chain_sha256") + and unsigned_evidence["plan_epoch"] == r6_envelope.get("plan_epoch") + and unsigned_evidence["plan_sha256"] == r6_envelope.get("plan_sha256"), + "R8 provenance evidence differs from the nested resume boundary", + ) + for index, row in enumerate(training_steps): + _validate_step_evidence( + row, + expected_step=index, + expected_plan_epoch=epoch - 1, + expected_step_identity_sha256=completed_identities[index], + ) + _require( + type(epoch) is int + and len(development_epochs) == epoch + and len(training_steps) + == checkpoint["payload"]["base_r6_checkpoint"]["envelope"]["plan_optimizer_step_count"], + "R8 provenance evidence count changed", + ) + history = state.get("development_history") + _require(type(history) is list and len(history) == epoch, "R8 development history changed") + for expected_epoch, (row, witness) in enumerate( + zip(development_epochs, history), + start=1, + ): + _validate_development_evidence( + row, + expected_epoch=expected_epoch, + expected_witness=witness, + ) + run_contract = state.get("run_contract") + _require(type(run_contract) is dict, "R8 run contract is absent") + cursor = checkpoint["payload"]["base_r6_checkpoint"]["payload"]["r6_state"]["adapter_cursor"] + _validate_cursor_r3_r4(cursor, isolated_fixture=run_contract.get("isolated_test_fixture") is True) + _require( + cursor.get("cell_id") == state.get("cell_id") + and cursor.get("epoch") == epoch - 1 + and cursor.get("plan_sha256") == envelope.get("plan_sha256") + and cursor.get("next_optimizer_step") + == r6_envelope.get("plan_optimizer_step_count"), + "R8 Adapter-R3 cursor differs from the completed checkpoint boundary", + ) + if run_contract.get("isolated_test_fixture") is False: + _require( + cursor.get("adapter_contract_sha256") == ADAPTER_R3_CONTRACT_SHA256 + and r6_state.get("adapter_contract", {}).get("source_sha256") + == ADAPTER_R3_SOURCE_SHA256 + and r6_state.get("adapter_contract", {}).get("receipt_sha256") + == ADAPTER_R3_RELEASE_RECEIPT_SHA256, + "production checkpoint does not bind the declared Adapter-R3 contract", + ) + stripped = copy.deepcopy(dict(checkpoint)) + stripped_state = stripped["payload"]["run_state"] + stripped_envelope = stripped["envelope"] + stripped_state.pop("r4_provenance_evidence") + stripped_envelope.pop("r4_provenance_evidence_sha256") + stripped_envelope["run_state_sha256"] = _core._r6._r5._recursive_state_sha256(stripped_state) + stripped_envelope.pop("resume_sha256") + stripped_envelope["resume_sha256"] = _core.canonical_sha256( + stripped_envelope, + domain=_core.CHECKPOINT_SCHEMA, + ) + validated = _original_validate_checkpoint_semantics(stripped) + return MappingProxyType( + { + "base": validated["base"], + "run_state": state, + "run_contract": run_contract, + "selection": validated["selection"], + "r4_provenance_evidence": evidence, + } + ) + + +_core.validate_checkpoint_semantics = validate_checkpoint_semantics + + +class DeterministicRun(_OriginalDeterministicRun): + """R7 lifecycle plus R4 step/development/checkpoint provenance evidence.""" + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.development_r4_provenance: list[dict[str, Any]] = [] + + def evaluate_matching_development_and_decide(self) -> Mapping[str, Any]: + model = self.executor.model + model._review_a5_r8_development_batches = [] + model._review_a5_r8_provenance_mode = "development" + try: + result = super().evaluate_matching_development_and_decide() + finally: + model._review_a5_r8_provenance_mode = "train" + batches = copy.deepcopy(model._review_a5_r8_development_batches) + if not batches and self.isolated_test_fixture: + provider = getattr(self.data_adapter, "development_provenance_batches", None) + _require(callable(provider), "fixture development lacks R4 provenance evidence") + batches = copy.deepcopy(provider(self.cell_id)) + _require(bool(batches), "development evaluation emitted no R4 provenance evidence") + for batch in batches: + _require( + type(batch) is dict + and batch.get("provenance_fields") == list(PROVENANCE_FIELDS) + and set(batch.get("provenance_field_sha256", {})) == set(PROVENANCE_FIELDS) + and _valid_sha256(batch.get("evidence_sha256")), + "development R4 batch evidence changed", + ) + epoch = self.selection.completed_epochs + unsigned = { + "schema": DEVELOPMENT_PROVENANCE_SCHEMA, + "epoch": epoch, + "batch_count": len(batches), + "batch_chain_sha256": _core._r6._r5._recursive_state_sha256( + [batch["evidence_sha256"] for batch in batches] + ), + "provenance_fields": list(PROVENANCE_FIELDS), + "provenance_field_chain_sha256": { + field: _core._r6._r5._recursive_state_sha256( + [batch["provenance_field_sha256"][field] for batch in batches] + ) + for field in PROVENANCE_FIELDS + }, + "development_result_sha256": self.development_history[-1].result_sha256, + "development_contract_sha256": self.development_history[-1].result_payload[ + "contract_sha256" + ], + "development_surface_sha256": self.development_history[-1].result_payload[ + "surface_sha256" + ], + "development_witness_sha256": self.development_history[-1].witness_sha256, + "training_authorized": False, + "scientific_launch_authorized": False, + } + self.development_r4_provenance.append( + { + **unsigned, + "evidence_sha256": _core.canonical_sha256( + unsigned, + domain=DEVELOPMENT_PROVENANCE_SCHEMA, + ), + } + ) + return result + + def capture_completed_epoch_checkpoint(self) -> dict[str, Any]: + token = _internal_checkpoint_operation.set(True) + try: + checkpoint = super().capture_completed_epoch_checkpoint() + finally: + _internal_checkpoint_operation.reset(token) + steps = copy.deepcopy( + getattr(self.executor.base, "completed_r4_provenance_evidence", []) + ) + plan = self.executor.bound_plan + _require(plan is not None, "R8 checkpoint lost its completed epoch plan") + r6_checkpoint = checkpoint["payload"]["base_r6_checkpoint"] + unsigned = { + "schema": PROVENANCE_SCHEMA, + "adapter_r3_source_sha256": ADAPTER_R3_SOURCE_SHA256, + "adapter_r3_release_receipt_sha256": ADAPTER_R3_RELEASE_RECEIPT_SHA256, + "adapter_r3_verification_receipt_sha256": ADAPTER_R3_VERIFICATION_RECEIPT_SHA256, + "adapter_r3_contract_sha256": ADAPTER_R3_CONTRACT_SHA256, + "r4_runtime_sha256": R4_RUNTIME_SHA256, + "r4_receipt_sha256": R4_RECEIPT_SHA256, + "r4_bfs_receipt_sha256": R4_BFS_RECEIPT_SHA256, + "topology_loss_source_sha256": TOPOLOGY_LOSS_SOURCE_SHA256, + "cell_id": self.cell_id, + "plan_epoch": plan.epoch, + "plan_sha256": plan.plan_sha256, + "adapter_cursor_sha256": r6_checkpoint["envelope"][ + "adapter_cursor_sha256" + ], + "completed_step_chain_sha256": r6_checkpoint["envelope"][ + "completed_step_chain_sha256" + ], + "provenance_fields": list(PROVENANCE_FIELDS), + "training_steps": steps, + "development_epochs": copy.deepcopy(self.development_r4_provenance), + "training_authorized": False, + "scientific_launch_authorized": False, + } + evidence = { + **unsigned, + "evidence_sha256": _core.canonical_sha256(unsigned, domain=PROVENANCE_SCHEMA), + } + state = checkpoint["payload"]["run_state"] + envelope = checkpoint["envelope"] + state["r4_provenance_evidence"] = evidence + envelope["r4_provenance_evidence_sha256"] = evidence["evidence_sha256"] + envelope["run_state_sha256"] = _core._r6._r5._recursive_state_sha256(state) + envelope.pop("resume_sha256") + envelope["resume_sha256"] = _core.canonical_sha256( + envelope, + domain=_core.CHECKPOINT_SCHEMA, + ) + validate_checkpoint_semantics(checkpoint) + self._pending_checkpoint_sha256 = _sha256(_core.serialize_checkpoint(checkpoint)) + return checkpoint + + def restore_committed_checkpoint( + self, + checkpoint: Mapping[str, Any], + *, + checkpoint_sha256: str, + ) -> None: + super().restore_committed_checkpoint( + checkpoint, + checkpoint_sha256=checkpoint_sha256, + ) + evidence = checkpoint["payload"]["run_state"]["r4_provenance_evidence"] + self.development_r4_provenance = copy.deepcopy(evidence["development_epochs"]) + self.executor.base.completed_r4_provenance_evidence = copy.deepcopy( + evidence["training_steps"] + ) + + +_core.DeterministicRun = DeterministicRun + + +# Public API is the isolated successor core plus the R8 provenance validator. +NativeEightCompositeR5 = _core.NativeEightCompositeR5 +NativeEightConfig = _core.NativeEightConfig +NativeEightDeterministicExecutor = _core.NativeEightDeterministicExecutor +ExactPolicyConfiguration = _core.ExactPolicyConfiguration +AtomicCheckpointStore = _core.AtomicCheckpointStore +DevelopmentResult = _core.DevelopmentResult +FixedDevelopmentContract = _core.FixedDevelopmentContract +FrozenEpochPlan = _core.FrozenEpochPlan +PlannedMicrobatch = _core.PlannedMicrobatch +StepDiagnostic = _core.StepDiagnostic +StrictLowerSelection = _core.StrictLowerSelection +AdamWContract = _core.AdamWContract +OBJECTIVES = tuple(_core.OBJECTIVES) +CELL_ORDER = tuple(_core.CELL_ORDER) +PRODUCTION_TRAINABLE_CELLS = tuple(_core.PRODUCTION_TRAINABLE_CELLS) +HISTORICAL_EVIDENCE_ONLY_CELLS = tuple(_core.HISTORICAL_EVIDENCE_ONLY_CELLS) +MAX_EPOCHS = _core.MAX_EPOCHS +PATIENCE = _core.PATIENCE +EARLIEST_STOP_EPOCH = _core.EARLIEST_STOP_EPOCH +MILESTONE_EPOCHS = tuple(_core.MILESTONE_EPOCHS) +CHECKPOINT_MAGIC = _core.CHECKPOINT_MAGIC +CHECKPOINT_DIGEST_BYTES = _core.CHECKPOINT_DIGEST_BYTES +CHECKPOINT_SCHEMA = _core.CHECKPOINT_SCHEMA +CHECKPOINT_CODEC_SCHEMA = _core.CHECKPOINT_CODEC_SCHEMA +CHECKPOINT_INDEX_SCHEMA = _core.CHECKPOINT_INDEX_SCHEMA +canonical_sha256 = _core.canonical_sha256 +serialize_checkpoint = _core.serialize_checkpoint +deserialize_checkpoint = _core.deserialize_checkpoint + + +def contract_summary() -> Mapping[str, Any]: + core_summary = dict(_core.contract_summary()) + return MappingProxyType( + { + "schema": SCHEMA, + "status": "PASS_PREPARATION_ONLY_ADAPTER_R3_R4_BOUND_STATIC_FINAL_TOKENS_PENDING_LAUNCH_CLOSED", + "r7_predecessor_source_sha256": R7_SOURCE_SHA256, + "r8_transformed_core_sha256": R8_TRANSFORMED_CORE_SHA256, + "adapter_r3_source_sha256": ADAPTER_R3_SOURCE_SHA256, + "adapter_r3_release_receipt_sha256": ADAPTER_R3_RELEASE_RECEIPT_SHA256, + "adapter_r3_verification_receipt_sha256": ADAPTER_R3_VERIFICATION_RECEIPT_SHA256, + "adapter_r3_contract_sha256": ADAPTER_R3_CONTRACT_SHA256, + "r4_runtime_sha256": R4_RUNTIME_SHA256, + "r4_receipt_sha256": R4_RECEIPT_SHA256, + "r4_bfs_receipt_sha256": R4_BFS_RECEIPT_SHA256, + "topology_loss_source_sha256": TOPOLOGY_LOSS_SOURCE_SHA256, + "scientific_boundary_authority_sha256": SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256, + "scientific_boundary_receipt_sha256": SCIENTIFIC_BOUNDARY_RECEIPT_SHA256, + "direct_ms_authorities": { + "runtime": MS_RUNTIME_SHA256, + "authority": MS_AUTHORITY_SHA256, + "receipt": MS_RECEIPT_SHA256, + "certificate": MS_CERTIFICATE_SHA256, + "parent_manifest": MS_PARENT_MANIFEST_SHA256, + }, + "direct_static_r7_authorities": { + "authority": STATIC_R7_AUTHORITY_SHA256, + "receipt": STATIC_R7_RECEIPT_SHA256, + "summary": STATIC_R7_SUMMARY_SHA256, + }, + "provenance_fields": list(PROVENANCE_FIELDS), + "topology_loss_route": "adapter.topology_loss_module_per_eligible_parent_slice", + "cursor_route": "adapter_r3_plus_sequence_topology_r4_only", + "selection": core_summary["selection"], + "production_trainable_cells": list(PRODUCTION_TRAINABLE_CELLS), + "historical_evidence_only_cells": list(HISTORICAL_EVIDENCE_ONLY_CELLS), + "fixed_loss_coefficients": [1, "topology_bit", "ms_bit", "static_bit"], + "fixed_loss_denominator": 4, + "static_active_production_materialization_authorized": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "execution_certified": False, + "nova_submission_authorized": False, + "affinose_supported": False, + "downstream_supported": False, + "md_supported": False, + "weight_ablation_supported": False, + } + ) + + +__all__ = [ + "ADAPTER_R3_CONTRACT_SHA256", + "ADAPTER_R3_RELEASE_RECEIPT_SHA256", + "ADAPTER_R3_SOURCE_SHA256", + "ADAPTER_R3_VERIFICATION_RECEIPT_SHA256", + "AFFINOSE_SUPPORTED", + "AdamWContract", + "AtomicCheckpointStore", + "CELL_ORDER", + "CHECKPOINT_CODEC_SCHEMA", + "CHECKPOINT_DIGEST_BYTES", + "CHECKPOINT_INDEX_SCHEMA", + "CHECKPOINT_MAGIC", + "CHECKPOINT_SCHEMA", + "DEVELOPMENT_PROVENANCE_SCHEMA", + "DeterministicRun", + "DevelopmentResult", + "DOWNSTREAM_SUPPORTED", + "EARLIEST_STOP_EPOCH", + "EXECUTION_CERTIFIED", + "ExactPolicyConfiguration", + "FixedDevelopmentContract", + "FrozenEpochPlan", + "HISTORICAL_EVIDENCE_ONLY_CELLS", + "MAX_EPOCHS", + "MILESTONE_EPOCHS", + "NOVA_SUBMISSION_AUTHORIZED", + "NativeEightCompositeR5", + "NativeEightConfig", + "NativeEightDeterministicExecutor", + "NativeEightExecutorR8Error", + "OBJECTIVES", + "PATIENCE", + "PRODUCTION_TRAINABLE_CELLS", + "PROVENANCE_FIELDS", + "R4_BFS_RECEIPT_SHA256", + "R4_RECEIPT_SHA256", + "R4_RUNTIME_SHA256", + "R7_SOURCE_SHA256", + "R8_TRANSFORMED_CORE_SHA256", + "SCHEMA", + "SCIENTIFIC_BOUNDARY_AUTHORITY_SHA256", + "SCIENTIFIC_BOUNDARY_RECEIPT_SHA256", + "STEP_PROVENANCE_SCHEMA", + "StepDiagnostic", + "StrictLowerSelection", + "TOPOLOGY_LOSS_SOURCE_SHA256", + "canonical_sha256", + "contract_summary", + "deserialize_checkpoint", + "serialize_checkpoint", + "validate_checkpoint_semantics", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_failure_release_chain_20260727_r1_preparation/review_a5_native_static_failure_release_gate_r1.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_failure_release_chain_20260727_r1_preparation/review_a5_native_static_failure_release_gate_r1.py new file mode 100644 index 0000000000000000000000000000000000000000..acfebc95e7615d19003c236439054117db7a57c2 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_failure_release_chain_20260727_r1_preparation/review_a5_native_static_failure_release_gate_r1.py @@ -0,0 +1,787 @@ +"""Narrow native release-gate successor for the truthful static lineage. + +This layer reuses the frozen native predecessor release validator. It changes +only the static release evidence: the original trainer remains FAILED/1:0, and +successful CPU handoff repair plus successful GPU postfit are required before +the native release can validate. + +The checked-in module is preparation-only. It accepts explicit immutable +adapter/binding identities after future jobs H and P complete; it does not +change R16/R19, submit a job, or authorize launch by itself. +""" + +from __future__ import annotations + +from dataclasses import dataclass +import copy +import hashlib +import inspect +import json +import os +from pathlib import Path +import re +import sys +from types import MappingProxyType, ModuleType +from typing import Any, Mapping + +from review.multimodal.runtime.a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation import ( + review_a5_native_eight_current_terminal_gate_r15 as _r15, +) +from review.multimodal.runtime.a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation import ( + review_a5_native_eight_release_successor_r16 as _r16, +) + + +SCHEMA = "bertose_review_a5_native_static_failure_release_gate_20260727_r1" +STATUS = "PREPARATION_ONLY_FUTURE_STATIC_ADAPTER_BINDING_REQUIRED" +RELEASE_SCHEMA = ( + "bertose_a5_native_eight_external_release_20260727_" + "r20_truthful_static_failure_successor" +) +RELEASE_STATUS = _r15.RELEASE_STATUS +BINDING_SCHEMA = ( + "bertose_review_a5_static_failed_after_fit_release_binding_20260727_r1" +) +BINDING_STATUS = ( + "PASS_STATIC_FIT_COMPLETE_TERMINAL_REPAIR_AND_POSTFIT_LAUNCH_CLOSED" +) +SELECTED_BEST_CHECKPOINT_SEMANTIC_SHA256 = ( + "79582ef6b692956cc2fc82d0f026412a6327ea281ddc94801136b301da8f7efd" +) +TRAINER_JOB_ID = "11766708" +TERMINAL_CHILD_JOB_ID = "11766891" +SUPERSEDED_POSTFIT_JOB_ID = "11767383" +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") +WRITING_ROOT = Path(__file__).absolute().parents[4] +ADDITIONAL_FIELDS = frozenset( + {"truthful_static_failure_release", "truthful_static_failure_gate"} +) +R16_SOURCE_SHA256 = ( + "689db8aaf51d15288f01b196c5ad2fe8ee3ca8aab3ff525695abaa9f25060ff6" +) +R16_SOURCE_BYTES = 30_917 +R14_SOURCE_SHA256 = ( + "eda983e1b0c29357eb1b6e2f555f402a83b7176fb857488e9be5f5faed490b2d" +) +R14_SOURCE_BYTES = 46_942 + + +class NativeStaticFailureReleaseGateR1Error(RuntimeError): + """The narrow static successor or inherited native gate changed.""" + + +@dataclass(frozen=True, slots=True) +class StaticReleaseIdentity: + adapter_source_relative: str + adapter_source_sha256: str + adapter_source_bytes: int + binding_relative: str + binding_sha256: str + binding_bytes: int + validator_name: str = "validate_release_binding" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeStaticFailureReleaseGateR1Error(message) + + +def canonical_bytes(value: Any) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def canonical_sha256(value: Any, *, domain: str) -> str: + return hashlib.sha256( + domain.encode("ascii") + b"\0" + canonical_bytes(value) + ).hexdigest() + + +def _safe_path(value: Any, *, label: str) -> Path: + _require( + type(value) is str + and value + and not value.startswith("/") + and "\\" not in value + and os.path.normpath(value) == value, + f"{label} is not one canonical relative path", + ) + parts = Path(value).parts + _require( + parts[:2] == ("review", "multimodal") + and all(part not in {"", ".", ".."} for part in parts), + f"{label} is outside review/multimodal", + ) + return WRITING_ROOT / value + + +def _read_exact( + path: Path, + *, + expected_sha256: str, + expected_bytes: int, + label: str, +) -> bytes: + _require( + SHA_RE.fullmatch(str(expected_sha256)) is not None + and type(expected_bytes) is int + and 0 < expected_bytes <= 64 << 20, + f"{label} exact identity is unresolved", + ) + raw = _r15._r14._r13.read_regular_nofollow( + Path(path), + maximum=64 << 20, + require_read_only=True, + ) + _require( + len(raw) == expected_bytes + and hashlib.sha256(raw).hexdigest() == expected_sha256, + f"{label} exact bytes changed", + ) + return raw + + +def _load_exact_r14() -> ModuleType: + """Execute the pinned R14 bytes instead of trusting its prior import.""" + + source_path = Path(_r15._r14.__file__).absolute() + _require( + source_path + == WRITING_ROOT + / "review/multimodal/runtime/" + "a5_native_eight_training_20260726_r14_r6_strict_candidate/" + "review_a5_native_eight_strict_successor_r14.py", + "frozen R14 source path changed", + ) + raw = _r15._r14._r13.read_regular_nofollow( + source_path, + maximum=1 << 20, + require_read_only=False, + ) + _require( + len(raw) == R14_SOURCE_BYTES + and hashlib.sha256(raw).hexdigest() == R14_SOURCE_SHA256, + "frozen R14 source bytes changed", + ) + module_name = "_review_a5_truthful_static_exact_r14" + module = ModuleType(module_name) + module.__file__ = os.fspath(source_path) + module.__package__ = _r15._r14.__package__ + sys.modules[module_name] = module + try: + exec( + compile( + raw, + os.fspath(source_path), + "exec", + dont_inherit=True, + ), + module.__dict__, + ) + except BaseException: + sys.modules.pop(module_name, None) + raise + _require( + getattr(module, "SCHEMA_R14", None) == _r15._r14.SCHEMA_R14 + and Path(module.RUNNER_PATH).absolute() == source_path + and module._r13 is _r15._r14._r13, + "exact R14 module graph changed", + ) + return module + + +def _identity_value(identity: StaticReleaseIdentity) -> dict[str, Any]: + return { + "adapter_source": { + "relative_path": identity.adapter_source_relative, + "sha256": identity.adapter_source_sha256, + "bytes": identity.adapter_source_bytes, + }, + "binding": { + "relative_path": identity.binding_relative, + "sha256": identity.binding_sha256, + "bytes": identity.binding_bytes, + "schema": BINDING_SCHEMA, + "status": BINDING_STATUS, + }, + "validator_name": identity.validator_name, + } + + +def validate_static_release( + identity: StaticReleaseIdentity, +) -> tuple[dict[str, Any], Mapping[str, Any]]: + """Load the explicit adapter and validate its immutable final binding.""" + + source_path = _safe_path( + identity.adapter_source_relative, label="static adapter source" + ) + binding_path = _safe_path( + identity.binding_relative, label="static release binding" + ) + source_raw = _read_exact( + source_path, + expected_sha256=identity.adapter_source_sha256, + expected_bytes=identity.adapter_source_bytes, + label="static adapter source", + ) + module_name = "_review_a5_truthful_static_adapter_exact_for_gate" + module = ModuleType(module_name) + module.__file__ = os.fspath(source_path) + sys.modules[module_name] = module + try: + exec( + compile( + source_raw, + os.fspath(source_path), + "exec", + dont_inherit=True, + ), + module.__dict__, + ) + except BaseException: + sys.modules.pop(module_name, None) + raise + validator = getattr(module, identity.validator_name, None) + parameters = ( + inspect.signature(validator).parameters + if inspect.isfunction(validator) + else {} + ) + _require( + getattr(module, "BINDING_SCHEMA", None) == BINDING_SCHEMA + and getattr(module, "BINDING_STATUS", None) == BINDING_STATUS + and inspect.isfunction(validator) + and list(parameters) + == ["binding_path", "expected_sha256", "expected_size_bytes"] + and { + "BINDING_SCHEMA", + "BINDING_STATUS", + identity.validator_name, + } + <= set(getattr(module, "__all__", ())), + "truthful static adapter API changed", + ) + binding_raw = _read_exact( + binding_path, + expected_sha256=identity.binding_sha256, + expected_bytes=identity.binding_bytes, + label="static release binding", + ) + try: + observed = json.loads(binding_raw.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise NativeStaticFailureReleaseGateR1Error( + "static release binding is not JSON" + ) from error + _require( + type(observed) is dict and canonical_bytes(observed) == binding_raw, + "static release binding is not canonical JSON", + ) + validated = validator( + binding_path, identity.binding_sha256, identity.binding_bytes + ) + _require( + type(validated) is dict + and validated == observed + and observed.get("schema") == BINDING_SCHEMA + and observed.get("status") == BINDING_STATUS + and observed.get("trainer_job_id") == TRAINER_JOB_ID + and observed.get("trainer_terminal_state") == "FAILED" + and observed.get("trainer_exit_code") == "1:0" + and observed.get("trainer_completed_zero") is False + and observed.get("terminal_child_job_id") == TERMINAL_CHILD_JOB_ID + and observed.get("terminal_child_completed_zero") is True + and observed.get("repair_job_completed_zero") is True + and observed.get("postfit_job_completed_zero") is True + and observed.get("postfit_job_id") != SUPERSEDED_POSTFIT_JOB_ID + and observed.get("selected_best_checkpoint_semantic_sha256") + == SELECTED_BEST_CHECKPOINT_SEMANTIC_SHA256 + and observed.get("native_ablation_data_binding_authorized") is False + and observed.get("official_submitted_artifacts_modified") is False, + "truthful static binding scheduler/science semantics changed", + ) + authorization = observed.get("authorization") + authorization_keys = ( + [ + key + for key in authorization + if str(key).endswith("_authorized") + ] + if isinstance(authorization, Mapping) + else [] + ) + _require( + bool(authorization_keys) + and all(authorization[key] is False for key in authorization_keys), + "truthful static binding authorization is not closed", + ) + unsigned = copy.deepcopy(observed) + signed = unsigned.pop("receipt_sha256", None) + _require( + SHA_RE.fullmatch(str(signed)) is not None + and hashlib.sha256(canonical_bytes(unsigned)).hexdigest() == signed, + "truthful static binding self-hash changed", + ) + return observed, MappingProxyType( + { + "adapter_source_sha256": identity.adapter_source_sha256, + "binding_file_sha256": identity.binding_sha256, + "binding_receipt_sha256": signed, + "trainer_job_id": TRAINER_JOB_ID, + "trainer_state": "FAILED", + "trainer_exit_code": "1:0", + "repair_job_id": observed["repair_job_id"], + "postfit_job_id": observed["postfit_job_id"], + "selected_best_checkpoint_semantic_sha256": ( + SELECTED_BEST_CHECKPOINT_SEMANTIC_SHA256 + ), + } + ) + + +def _gate_provenance( + identity: StaticReleaseIdentity, + *, + predecessor_receipt_sha256: str, +) -> dict[str, Any]: + return { + "schema": SCHEMA, + "predecessor_schema": _r15.PREDECESSOR_SCHEMA, + "predecessor_receipt_sha256": predecessor_receipt_sha256, + "static_release_identity": _identity_value(identity), + "original_trainer_completed_zero_claimed": False, + "old_success_only_r15_gate_invoked": False, + "launch_authorized_by_this_gate": False, + } + + +def build_native_release( + predecessor_release: Mapping[str, Any], + *, + identity: StaticReleaseIdentity, +) -> dict[str, Any]: + """Build one signed native release bridge without writing or launching.""" + + _observed, evidence = validate_static_release(identity) + predecessor, predecessor_signed = _r15._validate_predecessor_release( + copy.deepcopy(dict(predecessor_release)) + ) + value = copy.deepcopy(predecessor) + value.pop("receipt_sha256") + value["schema"] = RELEASE_SCHEMA + value["truthful_static_failure_release"] = { + **_identity_value(identity), + "binding_receipt_sha256": evidence["binding_receipt_sha256"], + "trainer_job_id": TRAINER_JOB_ID, + "trainer_state": "FAILED", + "trainer_exit_code": "1:0", + "repair_job_id": evidence["repair_job_id"], + "postfit_job_id": evidence["postfit_job_id"], + "selected_best_checkpoint_semantic_sha256": ( + SELECTED_BEST_CHECKPOINT_SEMANTIC_SHA256 + ), + } + value["truthful_static_failure_gate"] = _gate_provenance( + identity, predecessor_receipt_sha256=predecessor_signed + ) + value["receipt_sha256"] = canonical_sha256( + value, domain=RELEASE_SCHEMA + ) + return value + + +def validate_native_release_value( + release: Mapping[str, Any], + *, + identity: StaticReleaseIdentity, +) -> tuple[dict[str, Any], dict[str, Any], Mapping[str, Any]]: + """Validate the R20 bridge, exact adapter, and frozen predecessor.""" + + _require( + type(release) is dict + and set(release) == _r15.PREDECESSOR_FIELDS | ADDITIONAL_FIELDS + and release.get("schema") == RELEASE_SCHEMA + and release.get("status") == RELEASE_STATUS, + "truthful static native release shape changed", + ) + certified = copy.deepcopy(release) + unsigned = copy.deepcopy(certified) + signed = unsigned.pop("receipt_sha256", None) + _require( + SHA_RE.fullmatch(str(signed)) is not None + and canonical_sha256(unsigned, domain=RELEASE_SCHEMA) == signed, + "truthful static native release signature changed", + ) + gate = certified["truthful_static_failure_gate"] + _require( + type(gate) is dict + and gate + == _gate_provenance( + identity, + predecessor_receipt_sha256=gate.get( + "predecessor_receipt_sha256", "" + ), + ), + "truthful static gate provenance changed", + ) + observed, evidence = validate_static_release(identity) + static_release = certified["truthful_static_failure_release"] + _require( + type(static_release) is dict + and static_release["adapter_source"] + == _identity_value(identity)["adapter_source"] + and static_release["binding"] + == _identity_value(identity)["binding"] + and static_release["validator_name"] == identity.validator_name + and static_release["binding_receipt_sha256"] + == evidence["binding_receipt_sha256"] + and static_release["trainer_job_id"] == TRAINER_JOB_ID + and static_release["trainer_state"] == "FAILED" + and static_release["trainer_exit_code"] == "1:0" + and static_release["repair_job_id"] == evidence["repair_job_id"] + and static_release["postfit_job_id"] == evidence["postfit_job_id"] + and static_release["selected_best_checkpoint_semantic_sha256"] + == SELECTED_BEST_CHECKPOINT_SEMANTIC_SHA256 + and observed["trainer_completed_zero"] is False, + "truthful static release identity changed", + ) + predecessor = copy.deepcopy(certified) + predecessor.pop("truthful_static_failure_release") + predecessor.pop("truthful_static_failure_gate") + predecessor.pop("receipt_sha256") + predecessor["schema"] = _r15.PREDECESSOR_SCHEMA + predecessor["receipt_sha256"] = gate["predecessor_receipt_sha256"] + validated_predecessor, predecessor_signed = ( + _r15._validate_predecessor_release(predecessor) + ) + _require( + predecessor_signed == gate["predecessor_receipt_sha256"], + "truthful static predecessor bridge changed", + ) + return certified, validated_predecessor, evidence + + +def install_release_validation_layer( + r9_module: ModuleType, + *, + identity: StaticReleaseIdentity, +) -> Mapping[str, Any]: + """Replace only the installed R11 release entries in one live R9 graph.""" + + validate_static_release(identity) + _require(type(r9_module) is ModuleType, "native gate requires exact R9") + r8 = getattr(r9_module, "_r8", None) + r3 = getattr(r9_module, "_r3", None) + r2 = getattr(r9_module, "_r2", None) + core = getattr(r9_module, "_core", None) + _require( + all(type(item) is ModuleType for item in (r8, r3, r2, core)) + and r3 is r8._r3 + and r2 is r8._r2 + and core is r8._core + and r2 is r3._r2 + and core is r3._core is r2._core, + "native R9 module graph changed", + ) + inherited = r2._validate_external_release_r2 + inherited_pre_submit = r3.validate_pre_submit_release_r3 + _require( + inspect.isfunction(inherited) + and getattr(inherited, "_review_a5_r11_certification_gate", False) + is True + and r3._validate_external_release_r3 is inherited + and not hasattr(r9_module, "_review_a5_truthful_static_gate"), + "truthful successor did not receive exact installed R11 graph", + ) + inherited_closure = inspect.getclosurevars(inherited).nonlocals + pre_submit_closure = inspect.getclosurevars( + inherited_pre_submit + ).nonlocals + predecessor_validator = inherited_closure.get("predecessor_validator") + original_loader = inherited_closure.get("original_loader") + freshness_validator = pre_submit_closure.get("freshness_validator") + _require( + inspect.isfunction(predecessor_validator) + and predecessor_validator.__name__ == "_validate_external_release_r3" + and inspect.isfunction(original_loader) + and original_loader.__name__ == "load_canonical_json" + and inspect.isfunction(freshness_validator) + and freshness_validator.__name__ + == "validate_pre_submit_freshness_r3" + and core.load_canonical_json is original_loader, + "inherited R11 closure boundary changed", + ) + active = False + + def validate_external_release_truthful( + config: Any, *, launch_config_path: Path + ) -> Mapping[str, Any]: + nonlocal active + _require(not active, "truthful external release re-entered") + active = True + try: + release_path = Path(config.release_receipt) + release_sha256 = config.release_receipt_sha256 + _require( + SHA_RE.fullmatch(str(release_sha256)) is not None, + "configured release SHA changed", + ) + release = original_loader( + release_path, + release_sha256, + label="native-eight external release receipt", + ) + certified, predecessor, _evidence = ( + validate_native_release_value(release, identity=identity) + ) + substitutions = 0 + + def predecessor_loader( + path: Path, expected_sha256: str, *, label: str + ) -> dict[str, Any]: + nonlocal substitutions + if Path(path) == release_path: + _require( + expected_sha256 == release_sha256 + and label == "native-eight external release receipt" + and substitutions == 0, + "predecessor loader identity changed", + ) + substitutions += 1 + return copy.deepcopy(predecessor) + return original_loader(path, expected_sha256, label=label) + + core.load_canonical_json = predecessor_loader + try: + inherited_observed = predecessor_validator( + config, launch_config_path=launch_config_path + ) + finally: + core.load_canonical_json = original_loader + _require( + substitutions == 1 + and dict(inherited_observed) == predecessor, + "frozen predecessor validation readback changed", + ) + return MappingProxyType(copy.deepcopy(certified)) + finally: + core.load_canonical_json = original_loader + active = False + + def validate_pre_submit_release_truthful( + config: Any, *, launch_config_path: Path, now_utc: str + ) -> Mapping[str, Any]: + release = validate_external_release_truthful( + config, launch_config_path=launch_config_path + ) + freshness_validator( + release["live_duplicate_preflight"], now_utc=now_utc + ) + return release + + validate_external_release_truthful._review_a5_truthful_static_gate = True + validate_pre_submit_release_truthful._review_a5_truthful_static_gate = True + r2._validate_external_release_r2 = validate_external_release_truthful + r3._validate_external_release_r3 = validate_external_release_truthful + r3.validate_pre_submit_release_r3 = validate_pre_submit_release_truthful + r3.validate_pre_submit_release_truthful = ( + validate_pre_submit_release_truthful + ) + r9_module.validate_pre_submit_release_truthful = ( + validate_pre_submit_release_truthful + ) + receipt: dict[str, Any] = { + "schema": SCHEMA, + "status": "INSTALLED_PREPARATION_ONLY_LAUNCH_CLOSED", + "predecessor_gate": "exact_installed_r11", + "old_success_only_r15_gate_invoked": False, + "trainer_job_id": TRAINER_JOB_ID, + "trainer_state": "FAILED", + "trainer_exit_code": "1:0", + "static_release_identity": _identity_value(identity), + "patched_entries": [ + "_r2._validate_external_release_r2", + "_r3._validate_external_release_r3", + "_r3.validate_pre_submit_release_r3", + "_r3.validate_pre_submit_release_truthful", + "r9.validate_pre_submit_release_truthful", + ], + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + receipt["receipt_sha256"] = canonical_sha256(receipt, domain=SCHEMA) + installed = MappingProxyType(copy.deepcopy(receipt)) + r9_module._review_a5_truthful_static_gate = installed + return installed + + +def _r14_truthful_compatibility_binding( + identity: StaticReleaseIdentity, + *, + r14_module: ModuleType, +) -> Mapping[str, Any]: + """Build the exact R14 binding without invoking obsolete static gates. + + R14/R13 require a syntactically resolved terminal-binding identity for + their process-local compatibility structure, but their installation path + does not open or invoke that old R6 terminal authority. The identity here + is the exact truthful successor binding. The successor then replaces the + freshly installed R11 release validator before any launch validation. + """ + + _require(type(r14_module) is ModuleType, "exact R14 module is absent") + value = dict(r14_module.binding_source_value()) + value.update( + { + "STATUS": r14_module.FINAL_BINDING_STATUS, + "R6_TERMINAL_BINDING_SHA256": identity.binding_sha256, + "R6_TERMINAL_BINDING_BYTES": identity.binding_bytes, + } + ) + r14_module.validate_final_binding(value) + return MappingProxyType(value) + + +def load_truthful_bound_runtime( + *, + identity: StaticReleaseIdentity, +) -> tuple[ModuleType, ModuleType, Mapping[str, Any], Mapping[str, Any]]: + """Load frozen R14/R11, install the truthful gate, then frozen R7/CUDA. + + This is the narrow replacement for ``R16.load_bound_runtime``. It never + calls R15's success-only static adapter or terminal authority. All + non-static scientific/runtime layers remain the exact R14, R7, and CUDA + identities already frozen by R16. A separate R20 execution wrapper must + install the frozen-R19-derived scheduler/runtime layer afterward. + """ + + _observed, static_evidence = validate_static_release(identity) + r16_source = _read_exact( + Path(_r16.__file__).absolute(), + expected_sha256=R16_SOURCE_SHA256, + expected_bytes=R16_SOURCE_BYTES, + label="frozen R16 scientific successor", + ) + _require( + len(r16_source) == R16_SOURCE_BYTES, + "frozen R16 scientific successor changed", + ) + r16_binding = dict(_r16.binding_source_value()) + _r16.validate_preparation_binding(r16_binding) + cuda = _r16.validate_cuda_terminal_proof(r16_binding) + r14 = _load_exact_r14() + r14_binding = _r14_truthful_compatibility_binding( + identity, r14_module=r14 + ) + r9, r11, _observed_r14, r14_receipt = ( + r14.load_bound_runtime(binding=r14_binding) + ) + truthful_gate = install_release_validation_layer( + r9, identity=identity + ) + r7_receipt = _r16._load_r7_loader( + r16_binding + ).install_optimized_execution_layer(r9) + _require( + r7_receipt.get("schema") + == "bertose_review_a5_native_eight_hotpath_20260727_r7" + and r7_receipt.get("source_sha256") + == r16_binding["R7_RUNTIME_SHA256"] + and r7_receipt.get("checkpoint_load_latest_rng_cpu_normalized") + is True + and r7_receipt.get("checkpoint_load_best_rng_cpu_normalized") + is True + and r7_receipt.get("training_authorized") is False + and r7_receipt.get("scientific_launch_authorized") is False + and r7_receipt.get("nova_submission_authorized") is False, + "frozen R7 installation changed", + ) + receipt: dict[str, Any] = { + "schema": SCHEMA, + "status": "INSTALLED_TRUTHFUL_STATIC_GATE_R14_R7_CUDA_LAUNCH_CLOSED", + "installation_order": [ + "frozen_r14_modalities_strict_hotpath_and_r11", + "truthful_static_failure_release_gate", + "frozen_r7_cuda_rng_cpu_normalization", + "frozen_cuda_r5_terminal_exact_resume_proof", + ], + "obsolete_r15_success_only_loader_invoked": False, + "obsolete_r6_terminal_binding_opened_or_invoked": False, + "frozen_r14_source_sha256": R14_SOURCE_SHA256, + "r14_receipt_schema": r14_receipt["schema"], + "truthful_gate_receipt_sha256": truthful_gate["receipt_sha256"], + "static_binding_file_sha256": identity.binding_sha256, + "static_binding_receipt_sha256": static_evidence[ + "binding_receipt_sha256" + ], + "r7_runtime_sha256": r16_binding["R7_RUNTIME_SHA256"], + "cuda_terminal_certification_sha256": cuda[ + "terminal_certification_sha256" + ], + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + receipt["receipt_sha256"] = canonical_sha256(receipt, domain=SCHEMA) + bound = MappingProxyType( + { + "r16_preparation_binding": copy.deepcopy(r16_binding), + "r14_truthful_compatibility_binding": copy.deepcopy( + dict(r14_binding) + ), + "static_release_identity": _identity_value(identity), + } + ) + return ( + r9, + r11, + bound, + MappingProxyType(copy.deepcopy(receipt)), + ) + + +def describe_preparation() -> Mapping[str, Any]: + return MappingProxyType( + { + "schema": SCHEMA, + "status": STATUS, + "consumes_future_repair_and_postfit_ids": True, + "preserves_trainer_failed_1_0": True, + "requires_repair_completed_0_0": True, + "requires_postfit_completed_0_0": True, + "reuses_frozen_native_predecessor_release": True, + "loads_frozen_r14_then_truthful_gate_then_r7_cuda": True, + "obsolete_r15_success_only_loader_invoked": False, + "mutates_r16_or_r19_source": False, + "training_authorized": False, + "scientific_launch_authorized": False, + "nova_submission_authorized": False, + } + ) + + +__all__ = [ + "BINDING_SCHEMA", + "BINDING_STATUS", + "NativeStaticFailureReleaseGateR1Error", + "RELEASE_SCHEMA", + "SCHEMA", + "STATUS", + "StaticReleaseIdentity", + "build_native_release", + "describe_preparation", + "install_release_validation_layer", + "load_truthful_bound_runtime", + "validate_native_release_value", + "validate_static_release", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_epoch_boundary_resume_20260725_r1/run_review_a5_static_v2_epoch_boundary_resume_r1_scavenger_v100.sbatch b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_epoch_boundary_resume_20260725_r1/run_review_a5_static_v2_epoch_boundary_resume_r1_scavenger_v100.sbatch new file mode 100644 index 0000000000000000000000000000000000000000..fc5c8f390cc0835d765ab5cea753e0ec89487e97 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_epoch_boundary_resume_20260725_r1/run_review_a5_static_v2_epoch_boundary_resume_r1_scavenger_v100.sbatch @@ -0,0 +1,60 @@ +#!/bin/bash +#SBATCH --job-name=review_a5_sv2_af805f5d2cb8c32e +#SBATCH --partition=scavenger +#SBATCH --account=ratul-scavenger +#SBATCH --qos=scavenger +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=4 +#SBATCH --gres=gpu:1 +#SBATCH --constraint=v100&nova18 +#SBATCH --mem=128G +#SBATCH --time=48:00:00 +#SBATCH --requeue +#SBATCH --open-mode=append +#SBATCH --export=NONE +#SBATCH --chdir=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing +#SBATCH --output=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/slurm/review_a5_static_v2_epoch_boundary_resume_r1_%j.out +#SBATCH --error=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/slurm/review_a5_static_v2_epoch_boundary_resume_r1_%j.err + +set -euo pipefail +umask 077 + +readonly WRITING_ROOT=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing +readonly PYTHON=/work/ratul1/supantha/miniconda3/bin/python3.10 +readonly LAUNCHER="${WRITING_ROOT}/review/multimodal/runtime/a5_static_v2_epoch_boundary_resume_20260725_r1/run_review_a5_static_v2_epoch_boundary_resume_r1.py" +readonly LAUNCHER_SHA256=b198471e6c57c7c452952b3fd701ad5d6880b132dd4d8c3988fa6b7bea20bedd +readonly LAUNCHER_SIZE=39736 +readonly CONTINUATION_RECEIPT="${WRITING_ROOT}/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_epoch_boundary_continuation_${SLURM_JOB_ID}_r1.json" +readonly EXECUTION_BUNDLE="${WRITING_ROOT}/review/multimodal/outputs/review_a5_static_v2_postcache_full_fit_release_documents_20260724_r19_device_boundary_vendor/review_a5_static_v2_full_fit_direct_bundle_r19.json" +readonly OWNER_AUTHORITY="${WRITING_ROOT}/review/multimodal/outputs/review_a5_static_v2_postcache_full_fit_release_documents_20260724_r19_device_boundary_vendor/review_a5_static_v2_full_fit_direct_authority_r19.json" +readonly SUBMISSION_RECEIPT="${WRITING_ROOT}/review/multimodal/outputs/review_a5_static_v2_postcache_full_fit_release_documents_20260724_r19_device_boundary_vendor/review_submission_ledger/review_a5_static_v2_submission_receipt_af805f5d2cb8c32e74423071ea4c3e3613413d3a324928cdf820ad226f59130c.json" + +cd "${WRITING_ROOT}" +test "${SLURM_JOB_NAME}" = review_a5_sv2_af805f5d2cb8c32e +test "${SLURM_JOB_PARTITION}" = scavenger +test "${SLURM_JOB_ACCOUNT}" = ratul-scavenger +test "${SLURM_JOB_QOS}" = scavenger +test "${SLURM_GPUS_ON_NODE:?}" = 1 +test -z "${SLURM_ARRAY_JOB_ID:-}" +test -z "${SLURM_ARRAY_TASK_ID:-}" +test -f "${LAUNCHER}" && test ! -L "${LAUNCHER}" +test "$(stat -c '%s' "${LAUNCHER}")" = "${LAUNCHER_SIZE}" +test "$(sha256sum "${LAUNCHER}" | awk '{print $1}')" = "${LAUNCHER_SHA256}" +test -f "${CONTINUATION_RECEIPT}" && test ! -L "${CONTINUATION_RECEIPT}" + +unset PYTHONPATH PYTHONHOME +export PYTHONNOUSERSITE=1 +export PYTHONDONTWRITEBYTECODE=1 +export PYTHONUNBUFFERED=1 +export CUDA_DEVICE_ORDER=PCI_BUS_ID +export CUBLAS_WORKSPACE_CONFIG=:4096:8 +export NVIDIA_TF32_OVERRIDE=0 +export OMP_NUM_THREADS="${SLURM_CPUS_PER_TASK}" +export MKL_NUM_THREADS="${SLURM_CPUS_PER_TASK}" + +exec "${PYTHON}" -B -I -W error "${LAUNCHER}" run \ + --continuation-receipt "${CONTINUATION_RECEIPT}" \ + --execution-bundle "${EXECUTION_BUNDLE}" \ + --owner-authority "${OWNER_AUTHORITY}" \ + --submission-receipt "${SUBMISSION_RECEIPT}" diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_checkpoint_store_r2.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_checkpoint_store_r2.py new file mode 100644 index 0000000000000000000000000000000000000000..826ddd009500296200b9d1c9df47046f9c438b9c --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_checkpoint_store_r2.py @@ -0,0 +1,1237 @@ +"""Bounded exact-resume checkpoint store for static-v2 operations. + +The durable surface retains only a replaceable latest snapshot, a replaceable +best snapshot, and explicitly declared immutable milestones. Latest receipts +commit to their predecessor, while verification reads only the current head +and one external anti-rewind anchor: it never rescans an unbounded generation +history. Crash reconciliation accepts only the single well-defined state in +which a fully verified local head is exactly one receipt ahead of the anchor. +""" + +from __future__ import annotations + +import copy +import fcntl +import hashlib +import io +import os +import shutil +import stat +import struct +from pathlib import Path +from typing import Any, Mapping, Sequence + +import numpy as np +import torch + +from . import StaticV2OpsError, closed_authorization +from .review_a5_static_v2_ops_common_r2 import ( + SHA256_ZERO, + canonical_json_bytes, + open_secure_directory, + parse_canonical_json, + read_regular_at, + require_basename, + require_exact_keys, + require_sha256, + sha256_bytes, + sha256_json, + write_atomic_at, + write_exclusive_at, +) + + +STORE_SCHEMA = "bertose_a5_static_v2_bounded_checkpoint_store_20260721_r2" +CHECKPOINT_SCHEMA = "bertose_a5_static_v2_exact_resume_checkpoint_20260721_r2" +GROUP_CHECKPOINT_SCHEMA = ( + "bertose_a5_static_v2_group_exact_resume_checkpoint_20260721_r2" +) +LATEST_RECEIPT_SCHEMA = ( + "bertose_a5_static_v2_latest_checkpoint_receipt_20260721_r2" +) +DERIVED_RECEIPT_SCHEMA = ( + "bertose_a5_static_v2_retained_checkpoint_receipt_20260721_r2" +) +HEAD_SCHEMA = "bertose_a5_static_v2_checkpoint_head_20260721_r2" +DERIVED_HEAD_SCHEMA = "bertose_a5_static_v2_retained_checkpoint_head_20260721_r2" +ANCHOR_SCHEMA = "bertose_a5_static_v2_external_anti_rewind_anchor_20260721_r2" +MAX_LATEST_DIRECTORY_ENTRIES = 8 + + +def _is_complete_post_epoch_boundary(value: Mapping[str, Any]) -> bool: + """True only before the next epoch plan/work starts. + + Milestones are immutable. Retaining merely because ``epoch_index`` has a + declared value would attempt to overwrite the same milestone after every + micro-pack of the following epoch. + """ + + training = value.get("training_state") + if not isinstance(training, Mapping) or training.get("epoch_index", 0) <= 0: + return False + if value.get("schema") == GROUP_CHECKPOINT_SCHEMA: + return ( + training.get("phase") == "epoch_group_boundary" + and training.get("group_cursor") == 0 + and training.get("epoch_successful_group_steps") == 0 + and training.get("epoch_group_plan_sha256") == SHA256_ZERO + and tuple(training.get("ordered_group_binding_sha256", ())) == () + and training.get("planned_group_count") == 0 + ) + if value.get("schema") == CHECKPOINT_SCHEMA: + return ( + training.get("phase") == "epoch_pack_boundary" + and training.get("pack_cursor") == 0 + and training.get("epoch_successful_optimizer_steps") == 0 + and training.get("epoch_pack_plan_sha256") == SHA256_ZERO + and tuple(training.get("ordered_pack_binding_sha256", ())) == () + and training.get("planned_pack_count") == 0 + ) + return False + + +def semantic_tree_sha256(value: Any) -> str: + digest = hashlib.sha256() + + def update(item: Any) -> None: + if torch.is_tensor(item): + tensor = item.detach().contiguous().cpu() + digest.update(b"tensor\0") + digest.update(str(tensor.dtype).encode("ascii") + b"\0") + digest.update(np.asarray(tensor.shape, dtype=" bytes: + buffer = io.BytesIO() + torch.save(dict(value), buffer) + return buffer.getvalue() + + +def _torch_load(value: bytes) -> dict[str, Any]: + try: + result = torch.load(io.BytesIO(value), map_location="cpu", weights_only=True) + except BaseException as exc: + raise StaticV2OpsError("static-v2 checkpoint weights-only parse failed") from exc + if not isinstance(result, dict): + raise StaticV2OpsError("static-v2 checkpoint is not a dictionary") + return result + + +def _reject_physical_device_binding(value: Any, path: str = "checkpoint") -> None: + if isinstance(value, Mapping): + for key, item in value.items(): + key_text = str(key).lower() + if "uuid" in key_text or "physical_instance" in key_text or "pci_bus" in key_text: + raise StaticV2OpsError( + f"static-v2 checkpoint binds physical device at {path}.{key}" + ) + _reject_physical_device_binding(item, f"{path}.{key}") + elif isinstance(value, (list, tuple)): + for index, item in enumerate(value): + _reject_physical_device_binding(item, f"{path}[{index}]") + + +def _validate_group_checkpoint(value: Mapping[str, Any]) -> None: + """Validate the promoted exact 30-parent group transaction checkpoint.""" + + binding = value["binding"] + if not isinstance(binding, Mapping): + raise StaticV2OpsError("static-v2 group checkpoint binding is malformed") + for field, label in ( + ("portable_execution_class_sha256", "portable execution class"), + ("runtime_construction_receipt_sha256", "runtime construction receipt"), + ("science_runtime_receipt_sha256", "science runtime receipt"), + ("fit_policy_correction_authority_sha256", "fit-policy correction"), + ("optimizer_group_roster_sha256", "optimizer-group roster"), + ("base_group_binding_sequence_sha256", "base group sequence"), + ("optimizer_group_policy_sha256", "optimizer-group policy"), + ("resource_caps_sha256", "resource caps"), + ("optimizer_group_inventory_table_sha256", "group inventory table"), + ("production_adapter_source_sha256", "production adapter source"), + ("production_adapter_receipt_sha256", "production adapter receipt"), + ("train_graph_source_receipt_sha256", "train graph source receipt"), + ("production_epoch_adapter_source_sha256", "production epoch adapter source"), + ("production_epoch_adapter_receipt_sha256", "production epoch adapter receipt"), + ("selection_pack_roster_receipt_sha256", "selection pack roster receipt"), + ("production_run_source_sha256", "production run source"), + ("production_run_receipt_sha256", "production run receipt"), + ): + require_sha256(binding.get(field), label) + if ( + binding.get("final_train_parent_count") != 22_980 + or binding.get("optimizer_group_parent_count") != 30 + or binding.get("optimizer_group_count") != 766 + or binding.get("max_optimizer_attempts_per_group") != 3 + or binding.get("rvq_lloyd_iterations") != 5 + ): + raise StaticV2OpsError("static-v2 group checkpoint policy changed") + _reject_physical_device_binding(binding) + + training = value["training_state"] + if not isinstance(training, Mapping): + raise StaticV2OpsError("static-v2 group training state is malformed") + integer_fields = ( + "epoch_index", + "group_cursor", + "micro_pack_cursor", + "optimizer_step", + "ema_commit_count", + "epoch_successful_group_steps", + "ordinal_hint", + "planned_group_count", + "active_group_attempt_ordinal", + "pending_group_residue_count", + "batch_attempt_count", + "eligible_development_epoch_count", + "ineligible_development_epoch_count", + ) + for field in integer_fields: + number = training.get(field) + if type(number) is not int or number < 0: + raise StaticV2OpsError( + f"static-v2 group checkpoint {field} is malformed" + ) + if training["active_group_attempt_ordinal"] > 3: + raise StaticV2OpsError("static-v2 group retry ordinal exceeds three") + initialization_sha256 = require_sha256( + training.get("initialization_receipt_sha256"), + "initialization receipt", + ) + production_spec = ( + isinstance(value.get("construction_spec"), Mapping) + and value["construction_spec"].get("schema") + == "bertose_a5_static_v2_frozen_r8_construction_spec_20260721_r2" + ) + if not isinstance(training.get("selection_transcript"), list) or ( + production_spec + and initialization_sha256 == SHA256_ZERO + and training.get("initialization_complete") + ): + raise StaticV2OpsError("static-v2 group epoch receipt state changed") + initialization_receipt = training.get("initialization_receipt") + if initialization_receipt is not None: + if ( + not isinstance(initialization_receipt, Mapping) + or initialization_receipt.get("receipt_sha256") + != training["initialization_receipt_sha256"] + ): + raise StaticV2OpsError("static-v2 initialization receipt changed") + unsigned_initialization = dict(initialization_receipt) + unsigned_initialization.pop("receipt_sha256", None) + if sha256_json(unsigned_initialization) != training[ + "initialization_receipt_sha256" + ]: + raise StaticV2OpsError("static-v2 initialization receipt is inconsistent") + selection_transcript = training["selection_transcript"] + if ( + training["eligible_development_epoch_count"] + + training["ineligible_development_epoch_count"] + != len(selection_transcript) + or len(selection_transcript) != training["epoch_index"] + ): + raise StaticV2OpsError("static-v2 selection epoch counts changed") + for epoch_index, entry in enumerate(selection_transcript): + if ( + not isinstance(entry, Mapping) + or entry.get("epoch_index") != epoch_index + or type(entry.get("candidate_eligible")) is not bool + ): + raise StaticV2OpsError("static-v2 selection transcript changed") + require_sha256( + entry.get("selection_receipt_sha256"), + f"selection transcript epoch {epoch_index}", + ) + if entry["candidate_eligible"]: + try: + loss = float.fromhex(entry["selection_loss_hex"]) + except (KeyError, TypeError, ValueError) as error: + raise StaticV2OpsError( + "static-v2 eligible selection loss changed" + ) from error + if not np.isfinite(loss): + raise StaticV2OpsError("static-v2 eligible selection loss is nonfinite") + elif "selection_loss_hex" in entry: + raise StaticV2OpsError("static-v2 ineligible epoch contains a loss") + phase = training.get("phase") + phases = { + "pre_initialization", + "epoch_group_boundary", + "group_micro_accumulating", + "group_optimizer_pending", + "group_optimizer_succeeded_ema_pending", + "epoch_finalization_pending", + "terminal_group_retry_exhausted", + "selected_best_restored", + } + if phase not in phases: + raise StaticV2OpsError("static-v2 group checkpoint phase changed") + if type(training.get("initialization_complete")) is not bool: + raise StaticV2OpsError("static-v2 group initializer flag is malformed") + plan_sha = require_sha256( + training.get("epoch_group_plan_sha256"), "epoch group plan" + ) + ordered = training.get("ordered_group_binding_sha256") + if ( + not isinstance(ordered, tuple) + or training["planned_group_count"] != len(ordered) + or len(ordered) != len(set(ordered)) + ): + raise StaticV2OpsError("static-v2 group plan roster changed") + for index, digest in enumerate(ordered): + require_sha256(digest, f"ordered optimizer group {index}") + active = require_sha256( + training.get("active_group_binding_sha256"), "active optimizer group" + ) + retry = require_sha256( + training.get("retry_group_binding_sha256"), "retry optimizer group" + ) + precommit = require_sha256( + training.get("pending_ema_precommit_sha256"), "pending EMA precommit" + ) + parents = training.get("active_group_parent_ids") + micros = training.get("active_group_micro_pack_binding_sha256") + micro_parent_counts = training.get("active_micro_pack_parent_count") + if ( + not isinstance(parents, tuple) + or not isinstance(micros, tuple) + or not isinstance(micro_parent_counts, tuple) + or len(micro_parent_counts) != len(micros) + or any(type(count) is not int or count <= 0 for count in micro_parent_counts) + ): + raise StaticV2OpsError("static-v2 active group roster is malformed") + if len(parents) != len(set(parents)) or any( + not isinstance(parent, str) or not parent for parent in parents + ): + raise StaticV2OpsError("static-v2 active parent roster changed") + for index, digest in enumerate(micros): + require_sha256(digest, f"active micro-pack {index}") + if ( + not isinstance(training.get("pending_gradients"), Mapping) + or not isinstance(training.get("pending_ema_stats"), Mapping) + or not isinstance(training.get("group_attempt_rng_state"), Mapping) + or not isinstance(training.get("transcript"), list) + ): + raise StaticV2OpsError("static-v2 pending group transaction changed") + loss_finite = training.get("pending_group_loss_finite") + plan_unbound = plan_sha == SHA256_ZERO + if plan_unbound != (ordered == () and training["planned_group_count"] == 0): + raise StaticV2OpsError("static-v2 group plan binding is inconsistent") + active_open = active != SHA256_ZERO + pending_phases = { + "group_micro_accumulating", + "group_optimizer_pending", + "group_optimizer_succeeded_ema_pending", + } + if phase == "pre_initialization": + if training["initialization_complete"] or not plan_unbound or active_open: + raise StaticV2OpsError( + "static-v2 pre-initialization group checkpoint contains work" + ) + elif not training["initialization_complete"]: + raise StaticV2OpsError("static-v2 group checkpoint lost initialization") + if phase in pending_phases: + cursor = training["group_cursor"] + if ( + plan_unbound + or cursor >= len(ordered) + or ordered[cursor] != active + or len(parents) != 30 + or not micros + or sum(micro_parent_counts) != 30 + or training["micro_pack_cursor"] <= 0 + or training["micro_pack_cursor"] > len(micros) + or not training["group_attempt_rng_state"] + or training["active_group_attempt_ordinal"] not in (1, 2, 3) + or retry != active + or precommit == SHA256_ZERO + or not training["pending_ema_stats"] + or training["pending_group_residue_count"] <= 0 + or not torch.is_tensor(loss_finite) + or loss_finite.dtype != torch.bool + or loss_finite.numel() != 1 + ): + raise StaticV2OpsError( + "static-v2 pending group transaction is inconsistent" + ) + if phase == "group_micro_accumulating" and training[ + "micro_pack_cursor" + ] >= len(micros): + raise StaticV2OpsError("static-v2 accumulating group is already complete") + if phase != "group_micro_accumulating" and training[ + "micro_pack_cursor" + ] != len(micros): + raise StaticV2OpsError("static-v2 optimizer phase has incomplete micros") + elif phase == "epoch_group_boundary": + if ( + active_open + or parents + or micros + or micro_parent_counts + or training["micro_pack_cursor"] != 0 + ): + raise StaticV2OpsError("static-v2 group boundary retains active bytes") + if ( + precommit != SHA256_ZERO + or training["pending_ema_stats"] + or loss_finite is not None + ): + raise StaticV2OpsError("static-v2 group boundary retains EMA bytes") + if not plan_unbound and training["group_cursor"] > len(ordered): + raise StaticV2OpsError("static-v2 group cursor exceeds its plan") + if retry != SHA256_ZERO and training["active_group_attempt_ordinal"] not in ( + 1, + 2, + ): + raise StaticV2OpsError("static-v2 group retry boundary changed") + elif phase == "epoch_finalization_pending": + if ( + plan_unbound + or training["group_cursor"] != len(ordered) + or active_open + or "pending_development_loss" not in training + ): + raise StaticV2OpsError("static-v2 pending group epoch changed") + elif phase == "terminal_group_retry_exhausted": + if active_open or retry == SHA256_ZERO or training[ + "active_group_attempt_ordinal" + ] != 3: + raise StaticV2OpsError("static-v2 terminal retry state changed") + semantic_tree_sha256(value) + + +def validate_checkpoint(value: Mapping[str, Any]) -> None: + required = { + "schema", + "binding", + "construction_spec", + "training_state", + "model_state", + "optimizer_state", + "scheduler_state", + "scaler_state", + "rng_state", + } + require_exact_keys(value, required, "checkpoint") + if value["schema"] == GROUP_CHECKPOINT_SCHEMA: + _validate_group_checkpoint(value) + return + if value["schema"] != CHECKPOINT_SCHEMA: + raise StaticV2OpsError("static-v2 checkpoint schema changed") + if not isinstance(value["binding"], Mapping): + raise StaticV2OpsError("static-v2 checkpoint binding is malformed") + require_sha256( + value["binding"].get("portable_execution_class_sha256"), + "portable execution class", + ) + for field, label in ( + ("base_pack_roster_sha256", "base pack roster"), + ("base_pack_binding_sequence_sha256", "base pack binding sequence"), + ("pack_epoch_order_policy_sha256", "pack epoch-order policy"), + ( + "fit_policy_correction_authority_sha256", + "fit-policy correction authority", + ), + ): + require_sha256(value["binding"].get(field), label) + if value["binding"].get("optimizer_parent_denominator") != 32: + raise StaticV2OpsError( + "static-v2 historical pack checkpoint denominator changed" + ) + _reject_physical_device_binding(value["binding"]) + training = value["training_state"] + if not isinstance(training, Mapping): + raise StaticV2OpsError("static-v2 checkpoint training state is malformed") + for field in ("epoch_index", "pack_cursor", "optimizer_step", "ordinal_hint"): + number = training.get(field) + if type(number) is not int or number < 0: + raise StaticV2OpsError(f"static-v2 checkpoint {field} is malformed") + phase = training.get("phase") + if phase not in { + "pre_initialization", + "epoch_pack_boundary", + "backward_optimizer_pending", + "optimizer_succeeded_ema_pending", + "epoch_finalization_pending", + "selected_best_restored", + }: + raise StaticV2OpsError("static-v2 checkpoint phase changed") + initialization_complete = training.get("initialization_complete") + if type(initialization_complete) is not bool: + raise StaticV2OpsError( + "static-v2 checkpoint initialization flag is malformed" + ) + plan_sha = require_sha256( + training.get("epoch_pack_plan_sha256"), "checkpoint epoch pack plan" + ) + ordered = training.get("ordered_pack_binding_sha256") + planned_count = training.get("planned_pack_count") + if ( + not isinstance(ordered, tuple) + or type(planned_count) is not int + or planned_count < 0 + or planned_count != len(ordered) + or len(ordered) != len(set(ordered)) + ): + raise StaticV2OpsError("static-v2 checkpoint epoch pack roster changed") + for index, digest in enumerate(ordered): + require_sha256(digest, f"checkpoint ordered pack {index}") + active_batch = require_sha256( + training.get("active_batch_binding_sha256"), + "checkpoint active batch", + ) + active_parent_count = training.get("active_batch_parent_count") + active_parent_fraction = training.get("active_batch_parent_fraction") + if ( + type(active_parent_count) is not int + or active_parent_count < 0 + or active_parent_count > 32 + or isinstance(active_parent_fraction, bool) + or not isinstance(active_parent_fraction, (int, float)) + or not np.isfinite(float(active_parent_fraction)) + or float(active_parent_fraction) != active_parent_count / 32 + ): + raise StaticV2OpsError( + "static-v2 checkpoint active parent weighting changed" + ) + successful_steps = training.get("epoch_successful_optimizer_steps") + if type(successful_steps) is not int or successful_steps < 0: + raise StaticV2OpsError( + "static-v2 checkpoint successful-step count is malformed" + ) + if type(training.get("batch_attempt_count")) is not int or training[ + "batch_attempt_count" + ] < 0: + raise StaticV2OpsError( + "static-v2 checkpoint batch-attempt count is malformed" + ) + if not isinstance(training.get("transcript"), list): + raise StaticV2OpsError("static-v2 checkpoint transcript is malformed") + if not isinstance(training.get("pending_gradients"), Mapping): + raise StaticV2OpsError( + "static-v2 checkpoint pending gradients are malformed" + ) + if not isinstance(training.get("pending_ema_stats"), Mapping) or not isinstance( + training.get("attempt_rng_state"), Mapping + ): + raise StaticV2OpsError("static-v2 checkpoint pending transaction changed") + + plan_unbound = plan_sha == SHA256_ZERO + if plan_unbound != (planned_count == 0 and ordered == ()): + raise StaticV2OpsError("static-v2 checkpoint plan binding is inconsistent") + if phase == "pre_initialization": + if ( + initialization_complete + or not plan_unbound + or training["pack_cursor"] != 0 + or active_batch != SHA256_ZERO + or successful_steps != 0 + ): + raise StaticV2OpsError( + "static-v2 pre-initialization checkpoint contains completed work" + ) + else: + if not initialization_complete: + raise StaticV2OpsError( + "static-v2 post-initialization checkpoint lost its initializer" + ) + if phase == "epoch_pack_boundary": + if ( + active_batch != SHA256_ZERO + or active_parent_count != 0 + or float(active_parent_fraction) != 0.0 + ): + raise StaticV2OpsError( + "static-v2 pack-boundary checkpoint retains an active batch" + ) + if plan_unbound: + if training["pack_cursor"] != 0 or successful_steps != 0: + raise StaticV2OpsError( + "static-v2 unbound epoch boundary contains completed work" + ) + elif training["pack_cursor"] > planned_count: + raise StaticV2OpsError( + "static-v2 checkpoint cursor exceeds its epoch plan" + ) + elif phase in { + "backward_optimizer_pending", + "optimizer_succeeded_ema_pending", + }: + cursor = training["pack_cursor"] + if ( + plan_unbound + or cursor >= planned_count + or active_batch != ordered[cursor] + or active_parent_count <= 0 + or not training["attempt_rng_state"] + ): + raise StaticV2OpsError( + "static-v2 pending transaction disagrees with its pack cursor" + ) + elif phase == "epoch_finalization_pending": + if ( + plan_unbound + or training["pack_cursor"] != planned_count + or active_batch != SHA256_ZERO + or active_parent_count != 0 + or "pending_development_loss" not in training + ): + raise StaticV2OpsError( + "static-v2 pending epoch finalization disagrees with its plan" + ) + # Hashing traverses the entire safe tree and rejects unsupported types. + semantic_tree_sha256(value) + + +class BoundedCheckpointStore: + """Single-writer latest/best/milestone store with external anchor.""" + + def __init__( + self, + root: Path, + *, + external_anchor: Path, + run_id: str, + contract_sha256: str, + declared_milestone_epochs: Sequence[int], + ) -> None: + self.root = Path(root) + self.external_anchor = Path(external_anchor) + self.run_id = str(run_id) + if not self.run_id or "/" in self.run_id: + raise StaticV2OpsError("static-v2 checkpoint run ID is malformed") + self.contract_sha256 = require_sha256(contract_sha256, "checkpoint contract") + milestones = tuple(sorted(declared_milestone_epochs)) + if ( + len(milestones) != len(set(milestones)) + or any(type(epoch) is not int or epoch < 0 for epoch in milestones) + ): + raise StaticV2OpsError("static-v2 declared milestones are malformed") + self.declared_milestones = milestones + try: + anchor_inside_root = self.external_anchor.resolve().is_relative_to( + self.root.resolve() + ) + except AttributeError: # pragma: no cover - Python <3.9 compatibility + anchor_inside_root = str(self.external_anchor.resolve()).startswith( + str(self.root.resolve()) + os.sep + ) + if anchor_inside_root: + raise StaticV2OpsError("static-v2 anti-rewind anchor must be outside run root") + self._prepare_directories() + + def _prepare_directories(self) -> None: + self.root.mkdir(mode=0o750, parents=True, exist_ok=True) + for name in ("latest", "best", "milestones"): + path = self.root / name + path.mkdir(mode=0o750, exist_ok=True) + if path.is_symlink(): + raise StaticV2OpsError("static-v2 checkpoint subdirectory is symlinked") + self.external_anchor.parent.mkdir(mode=0o750, parents=True, exist_ok=True) + lock = self.root / "writer.lock" + lock.touch(mode=0o640, exist_ok=True) + if not self.external_anchor.exists(): + anchor = { + "schema": ANCHOR_SCHEMA, + "run_id": self.run_id, + "contract_sha256": self.contract_sha256, + "ordinal": 0, + "latest_receipt_sha256": SHA256_ZERO, + "authorization": closed_authorization(), + } + fd = open_secure_directory(self.external_anchor.parent) + try: + write_exclusive_at(fd, self.external_anchor.name, canonical_json_bytes(anchor)) + except FileExistsError: + pass + finally: + os.close(fd) + + def _lock(self) -> int: + descriptor = os.open( + self.root / "writer.lock", + os.O_RDWR | getattr(os, "O_NOFOLLOW", 0), + ) + fcntl.flock(descriptor, fcntl.LOCK_EX) + return descriptor + + def _read_anchor(self) -> dict[str, Any]: + fd = open_secure_directory(self.external_anchor.parent) + try: + value = parse_canonical_json( + read_regular_at(fd, self.external_anchor.name), "anti-rewind anchor" + ) + finally: + os.close(fd) + require_exact_keys( + value, + { + "schema", + "run_id", + "contract_sha256", + "ordinal", + "latest_receipt_sha256", + "authorization", + }, + "anti-rewind anchor", + ) + if ( + value["schema"] != ANCHOR_SCHEMA + or value["run_id"] != self.run_id + or value["contract_sha256"] != self.contract_sha256 + or value["authorization"] != closed_authorization() + or type(value["ordinal"]) is not int + or value["ordinal"] < 0 + ): + raise StaticV2OpsError("static-v2 anti-rewind anchor changed") + require_sha256(value["latest_receipt_sha256"], "anchor head") + return value + + def _write_anchor(self, ordinal: int, receipt_sha256: str) -> None: + value = { + "schema": ANCHOR_SCHEMA, + "run_id": self.run_id, + "contract_sha256": self.contract_sha256, + "ordinal": ordinal, + "latest_receipt_sha256": require_sha256(receipt_sha256, "anchor head"), + "authorization": closed_authorization(), + } + fd = open_secure_directory(self.external_anchor.parent) + try: + write_atomic_at(fd, self.external_anchor.name, canonical_json_bytes(value)) + finally: + os.close(fd) + + @staticmethod + def _object_names(payload_sha256: str, receipt_sha256: str) -> tuple[str, str]: + return f"payload-{payload_sha256}.pt", f"receipt-{receipt_sha256}.json" + + def _read_head(self) -> dict[str, Any] | None: + directory = self.root / "latest" + fd = open_secure_directory(directory) + try: + try: + raw = read_regular_at(fd, "head.json") + except FileNotFoundError: + return None + head = parse_canonical_json(raw, "latest head") + finally: + os.close(fd) + require_exact_keys( + head, + { + "schema", + "run_id", + "contract_sha256", + "ordinal", + "payload_filename", + "payload_sha256", + "receipt_filename", + "receipt_sha256", + }, + "latest head", + ) + if ( + head["schema"] != HEAD_SCHEMA + or head["run_id"] != self.run_id + or head["contract_sha256"] != self.contract_sha256 + or type(head["ordinal"]) is not int + or head["ordinal"] <= 0 + ): + raise StaticV2OpsError("static-v2 latest head changed") + for field in ("payload_filename", "receipt_filename"): + require_basename(head[field], field) + require_sha256(head["payload_sha256"], "head payload") + require_sha256(head["receipt_sha256"], "head receipt") + return head + + def _verify_local_head(self) -> tuple[dict[str, Any], dict[str, Any], bytes] | None: + head = self._read_head() + if head is None: + return None + fd = open_secure_directory(self.root / "latest") + try: + receipt_bytes = read_regular_at(fd, head["receipt_filename"]) + payload_bytes = read_regular_at(fd, head["payload_filename"]) + finally: + os.close(fd) + if sha256_bytes(receipt_bytes) != head["receipt_sha256"]: + raise StaticV2OpsError("static-v2 latest receipt bytes changed") + if sha256_bytes(payload_bytes) != head["payload_sha256"]: + raise StaticV2OpsError("static-v2 latest payload bytes changed") + receipt = parse_canonical_json(receipt_bytes, "latest receipt") + require_exact_keys( + receipt, + { + "schema", + "store_schema", + "run_id", + "contract_sha256", + "ordinal", + "predecessor_receipt_sha256", + "payload_sha256", + "payload_size_bytes", + "checkpoint_semantic_sha256", + "epoch_index", + "phase", + "binding_sha256", + "authorization", + }, + "latest receipt", + ) + if ( + receipt["schema"] != LATEST_RECEIPT_SCHEMA + or receipt["store_schema"] != STORE_SCHEMA + or receipt["run_id"] != self.run_id + or receipt["contract_sha256"] != self.contract_sha256 + or receipt["ordinal"] != head["ordinal"] + or receipt["payload_sha256"] != head["payload_sha256"] + or receipt["payload_size_bytes"] != len(payload_bytes) + or receipt["authorization"] != closed_authorization() + ): + raise StaticV2OpsError("static-v2 latest receipt binding changed") + require_sha256(receipt["predecessor_receipt_sha256"], "predecessor receipt") + require_sha256(receipt["checkpoint_semantic_sha256"], "checkpoint semantic") + require_sha256(receipt["binding_sha256"], "checkpoint binding") + checkpoint = _torch_load(payload_bytes) + validate_checkpoint(checkpoint) + if semantic_tree_sha256(checkpoint) != receipt["checkpoint_semantic_sha256"]: + raise StaticV2OpsError("static-v2 latest checkpoint semantics changed") + if sha256_json(checkpoint["binding"]) != receipt["binding_sha256"]: + raise StaticV2OpsError("static-v2 latest checkpoint binding changed") + return head, receipt, payload_bytes + + def reconcile_and_verify(self) -> tuple[dict[str, Any], dict[str, Any], bytes] | None: + """Verify current head and reconcile only one crash-safe ahead state.""" + + lock = self._lock() + try: + local = self._verify_local_head() + anchor = self._read_anchor() + if local is None: + if anchor["ordinal"] != 0 or anchor["latest_receipt_sha256"] != SHA256_ZERO: + raise StaticV2OpsError("static-v2 anchor exists without local head") + return None + head, receipt, payload = local + if ( + anchor["ordinal"] == head["ordinal"] + and anchor["latest_receipt_sha256"] == head["receipt_sha256"] + ): + self._cleanup_latest(head) + return local + if ( + head["ordinal"] == anchor["ordinal"] + 1 + and receipt["predecessor_receipt_sha256"] + == anchor["latest_receipt_sha256"] + ): + self._write_anchor(head["ordinal"], head["receipt_sha256"]) + self._cleanup_latest(head) + return local + raise StaticV2OpsError("static-v2 latest head violates anti-rewind anchor") + finally: + os.close(lock) + + def _cleanup_latest(self, head: Mapping[str, Any]) -> None: + directory = self.root / "latest" + names = list(os.listdir(directory)) + if len(names) > MAX_LATEST_DIRECTORY_ENTRIES: + raise StaticV2OpsError("static-v2 latest directory exceeds recovery bound") + retained = {"head.json", head["payload_filename"], head["receipt_filename"]} + for name in names: + if name not in retained: + path = directory / name + if path.is_symlink() or not path.is_file(): + raise StaticV2OpsError("static-v2 latest orphan is not a regular file") + path.unlink() + fd = open_secure_directory(directory) + try: + os.fsync(fd) + finally: + os.close(fd) + + def peek_latest_receipt(self) -> dict[str, Any] | None: + """Read/verify metadata before any model or RVQ initialization.""" + + local = self.reconcile_and_verify() + return None if local is None else copy.deepcopy(local[1]) + + def load_latest(self) -> dict[str, Any] | None: + local = self.reconcile_and_verify() + return None if local is None else _torch_load(local[2]) + + def _retain_derived( + self, + category: str, + *, + payload: bytes, + latest_receipt_sha256: str, + checkpoint_semantic_sha256: str, + epoch_index: int, + ) -> None: + if category == "best": + directory = self.root / "best" + replaceable = True + elif category.startswith("milestone-"): + directory = self.root / "milestones" / category + replaceable = False + directory.mkdir(mode=0o750, exist_ok=True) + else: + raise StaticV2OpsError("static-v2 retention category changed") + receipt = { + "schema": DERIVED_RECEIPT_SCHEMA, + "store_schema": STORE_SCHEMA, + "run_id": self.run_id, + "contract_sha256": self.contract_sha256, + "category": category, + "source_latest_receipt_sha256": latest_receipt_sha256, + "payload_sha256": sha256_bytes(payload), + "payload_size_bytes": len(payload), + "checkpoint_semantic_sha256": checkpoint_semantic_sha256, + "epoch_index": epoch_index, + "authorization": closed_authorization(), + } + receipt_bytes = canonical_json_bytes(receipt) + receipt_sha256 = sha256_bytes(receipt_bytes) + payload_sha256 = sha256_bytes(payload) + fd = open_secure_directory(directory) + try: + if replaceable: + payload_name = f"payload-{payload_sha256}.pt" + receipt_name = f"receipt-{receipt_sha256}.json" + try: + write_exclusive_at(fd, payload_name, payload) + except FileExistsError: + if read_regular_at(fd, payload_name) != payload: + raise StaticV2OpsError("static-v2 best payload object changed") + try: + write_exclusive_at(fd, receipt_name, receipt_bytes) + except FileExistsError: + if read_regular_at(fd, receipt_name) != receipt_bytes: + raise StaticV2OpsError("static-v2 best receipt object changed") + head = { + "schema": DERIVED_HEAD_SCHEMA, + "category": category, + "payload_filename": payload_name, + "payload_sha256": payload_sha256, + "receipt_filename": receipt_name, + "receipt_sha256": receipt_sha256, + } + write_atomic_at(fd, "head.json", canonical_json_bytes(head)) + names = list(os.listdir(directory)) + if len(names) > 8: + raise StaticV2OpsError("static-v2 best recovery set exceeds bound") + retained = {"head.json", payload_name, receipt_name} + for name in names: + if name not in retained: + path = directory / name + if path.is_symlink() or not path.is_file(): + raise StaticV2OpsError("static-v2 best orphan is not regular") + path.unlink() + os.fsync(fd) + else: + try: + write_exclusive_at(fd, "payload.pt", payload) + except FileExistsError: + if read_regular_at(fd, "payload.pt") != payload: + raise StaticV2OpsError("static-v2 immutable milestone changed") + try: + write_exclusive_at(fd, "receipt.json", receipt_bytes) + except FileExistsError: + if read_regular_at(fd, "receipt.json") != receipt_bytes: + raise StaticV2OpsError("static-v2 immutable milestone changed") + os.fsync(fd) + finally: + os.close(fd) + + def _load_retained_directory( + self, directory: Path, *, expected_category: str, replaceable: bool + ) -> dict[str, Any]: + fd = open_secure_directory(directory) + try: + if replaceable: + head = parse_canonical_json( + read_regular_at(fd, "head.json"), "retained checkpoint head" + ) + require_exact_keys( + head, + { + "schema", + "category", + "payload_filename", + "payload_sha256", + "receipt_filename", + "receipt_sha256", + }, + "retained checkpoint head", + ) + if ( + head["schema"] != DERIVED_HEAD_SCHEMA + or head["category"] != expected_category + ): + raise StaticV2OpsError("static-v2 retained head changed") + payload_name = require_basename( + head["payload_filename"], "retained payload" + ) + receipt_name = require_basename( + head["receipt_filename"], "retained receipt" + ) + payload_expected = require_sha256( + head["payload_sha256"], "retained payload" + ) + receipt_expected = require_sha256( + head["receipt_sha256"], "retained receipt" + ) + else: + payload_name = "payload.pt" + receipt_name = "receipt.json" + payload_expected = None + receipt_expected = None + payload = read_regular_at(fd, payload_name) + receipt_bytes = read_regular_at(fd, receipt_name) + finally: + os.close(fd) + if payload_expected is not None and sha256_bytes(payload) != payload_expected: + raise StaticV2OpsError("static-v2 retained payload bytes changed") + if receipt_expected is not None and sha256_bytes(receipt_bytes) != receipt_expected: + raise StaticV2OpsError("static-v2 retained receipt bytes changed") + receipt = parse_canonical_json(receipt_bytes, "retained checkpoint receipt") + require_exact_keys( + receipt, + { + "schema", + "store_schema", + "run_id", + "contract_sha256", + "category", + "source_latest_receipt_sha256", + "payload_sha256", + "payload_size_bytes", + "checkpoint_semantic_sha256", + "epoch_index", + "authorization", + }, + "retained checkpoint receipt", + ) + if ( + receipt["schema"] != DERIVED_RECEIPT_SCHEMA + or receipt["store_schema"] != STORE_SCHEMA + or receipt["run_id"] != self.run_id + or receipt["contract_sha256"] != self.contract_sha256 + or receipt["category"] != expected_category + or receipt["payload_sha256"] != sha256_bytes(payload) + or receipt["payload_size_bytes"] != len(payload) + or receipt["authorization"] != closed_authorization() + ): + raise StaticV2OpsError("static-v2 retained receipt binding changed") + require_sha256(receipt["source_latest_receipt_sha256"], "retained source") + require_sha256(receipt["checkpoint_semantic_sha256"], "retained semantic") + checkpoint = _torch_load(payload) + validate_checkpoint(checkpoint) + if semantic_tree_sha256(checkpoint) != receipt["checkpoint_semantic_sha256"]: + raise StaticV2OpsError("static-v2 retained checkpoint semantics changed") + return checkpoint + + def load_best(self) -> dict[str, Any]: + return self._load_retained_directory( + self.root / "best", expected_category="best", replaceable=True + ) + + def load_milestone(self, epoch_index: int) -> dict[str, Any]: + if epoch_index not in self.declared_milestones: + raise StaticV2OpsError("static-v2 requested milestone is undeclared") + category = f"milestone-{epoch_index:04d}" + return self._load_retained_directory( + self.root / "milestones" / category, + expected_category=category, + replaceable=False, + ) + + def publish( + self, + checkpoint: Mapping[str, Any], + *, + retain_as_best: bool, + ) -> dict[str, Any]: + value = copy.deepcopy(dict(checkpoint)) + validate_checkpoint(value) + if sha256_json(value["binding"]) != self.contract_sha256: + raise StaticV2OpsError("static-v2 checkpoint/store contract changed") + payload = _torch_bytes(value) + payload_sha = sha256_bytes(payload) + semantic_sha = semantic_tree_sha256(value) + epoch_index = int(value["training_state"]["epoch_index"]) + phase = str(value["training_state"]["phase"]) + lock = self._lock() + try: + current = self._verify_local_head() + anchor = self._read_anchor() + if current is None: + if anchor["ordinal"] != 0 or anchor["latest_receipt_sha256"] != SHA256_ZERO: + raise StaticV2OpsError("static-v2 initial anchor changed") + ordinal = 1 + predecessor = SHA256_ZERO + else: + head, _receipt, _payload = current + if ( + anchor["ordinal"] != head["ordinal"] + or anchor["latest_receipt_sha256"] != head["receipt_sha256"] + ): + raise StaticV2OpsError( + "static-v2 publish requires reconciled anchor/head" + ) + ordinal = head["ordinal"] + 1 + predecessor = head["receipt_sha256"] + receipt = { + "schema": LATEST_RECEIPT_SCHEMA, + "store_schema": STORE_SCHEMA, + "run_id": self.run_id, + "contract_sha256": self.contract_sha256, + "ordinal": ordinal, + "predecessor_receipt_sha256": predecessor, + "payload_sha256": payload_sha, + "payload_size_bytes": len(payload), + "checkpoint_semantic_sha256": semantic_sha, + "epoch_index": epoch_index, + "phase": phase, + "binding_sha256": sha256_json(value["binding"]), + "authorization": closed_authorization(), + } + receipt_bytes = canonical_json_bytes(receipt) + receipt_sha = sha256_bytes(receipt_bytes) + payload_name, receipt_name = self._object_names(payload_sha, receipt_sha) + latest_fd = open_secure_directory(self.root / "latest") + try: + try: + write_exclusive_at(latest_fd, payload_name, payload) + except FileExistsError: + if read_regular_at(latest_fd, payload_name) != payload: + raise StaticV2OpsError("static-v2 payload object changed") + try: + write_exclusive_at(latest_fd, receipt_name, receipt_bytes) + except FileExistsError: + if read_regular_at(latest_fd, receipt_name) != receipt_bytes: + raise StaticV2OpsError("static-v2 receipt object changed") + head_value = { + "schema": HEAD_SCHEMA, + "run_id": self.run_id, + "contract_sha256": self.contract_sha256, + "ordinal": ordinal, + "payload_filename": payload_name, + "payload_sha256": payload_sha, + "receipt_filename": receipt_name, + "receipt_sha256": receipt_sha, + } + write_atomic_at(latest_fd, "head.json", canonical_json_bytes(head_value)) + finally: + os.close(latest_fd) + # This ordering creates one recoverable state: local head exactly + # one ahead of anchor. reconcile_and_verify handles only that case. + self._write_anchor(ordinal, receipt_sha) + self._cleanup_latest(head_value) + if retain_as_best: + self._retain_derived( + "best", + payload=payload, + latest_receipt_sha256=receipt_sha, + checkpoint_semantic_sha256=semantic_sha, + epoch_index=epoch_index, + ) + retained_milestone = ( + epoch_index in self.declared_milestones + and _is_complete_post_epoch_boundary(value) + ) + if retained_milestone: + self._retain_derived( + f"milestone-{epoch_index:04d}", + payload=payload, + latest_receipt_sha256=receipt_sha, + checkpoint_semantic_sha256=semantic_sha, + epoch_index=epoch_index, + ) + return { + "store_schema": STORE_SCHEMA, + "latest_receipt_sha256": receipt_sha, + "checkpoint_semantic_sha256": semantic_sha, + "ordinal": ordinal, + "retained_as_best": bool(retain_as_best), + "retained_as_declared_milestone": retained_milestone, + "authorization": closed_authorization(), + } + finally: + os.close(lock) + + def audit_retention(self) -> dict[str, Any]: + """Bounded name audit; never follows or scans receipt ancestry.""" + + latest_names = sorted(os.listdir(self.root / "latest")) + best_names = sorted(os.listdir(self.root / "best")) + milestone_names = sorted(os.listdir(self.root / "milestones")) + allowed_milestones = {f"milestone-{epoch:04d}" for epoch in self.declared_milestones} + if len(latest_names) > 3 or len(best_names) > 3: + raise StaticV2OpsError("static-v2 replaceable retention set changed") + if best_names and ( + "head.json" not in best_names + or len([name for name in best_names if name.startswith("payload-")]) != 1 + or len([name for name in best_names if name.startswith("receipt-")]) != 1 + ): + raise StaticV2OpsError("static-v2 best retention members changed") + if set(milestone_names) - allowed_milestones: + raise StaticV2OpsError("static-v2 undeclared milestone exists") + for name in milestone_names: + members = sorted(os.listdir(self.root / "milestones" / name)) + if members != ["payload.pt", "receipt.json"]: + raise StaticV2OpsError("static-v2 milestone members changed") + return { + "schema": STORE_SCHEMA, + "latest_entry_count": len(latest_names), + "best_entry_count": len(best_names), + "retained_milestones": milestone_names, + "declared_milestones": sorted(allowed_milestones), + "unbounded_chain_scan_performed": False, + "authorization": closed_authorization(), + } + + +__all__ = [ + "ANCHOR_SCHEMA", + "CHECKPOINT_SCHEMA", + "STORE_SCHEMA", + "BoundedCheckpointStore", + "semantic_tree_sha256", + "validate_checkpoint", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/review_a5_static_v2_postfit_direct_publication_r2.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/review_a5_static_v2_postfit_direct_publication_r2.py new file mode 100644 index 0000000000000000000000000000000000000000..dd53609baf77c8f1c16289bbc870e79848eb30b0 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/review_a5_static_v2_postfit_direct_publication_r2.py @@ -0,0 +1,1054 @@ +"""Direct full-development static-v2 export after selected-checkpoint freeze. + +This successor is intentionally narrow. It preserves the exact R4 model, +graph, inference, shard, null, join, and serialization implementations. The +only superseded policy is the historical post-selection capacity split: +after the selected checkpoint is frozen, every pretraining-development parent +is encoded once in the same read-only inference route. Development never +updates the model/RVQ, fits code support, fits the null, or selects a +checkpoint. +""" + +from __future__ import annotations + +from contextlib import contextmanager +import hashlib +import io +import json +import os +from pathlib import Path +import pickle +import re +import stat +from typing import Any, Iterator, Mapping, Sequence + +import numpy as np +import torch + +from ..a5_static_v2_20260721_r8 import review_a5_static_v2_r8 as r8 +from ..a5_static_v2_complete_development_inference_20260722_r2 import ( + review_a5_static_v2_complete_development_inference_r2 as complete_dev, +) +from ..a5_static_v2_postfit_production_20260722_r4 import ( + StaticV2PostfitProductionError, + closed_launch_authorization, +) +from ..a5_static_v2_postfit_production_20260722_r4 import ( + review_a5_static_v2_postfit_executor_r4 as executor, +) +from ..a5_static_v2_postfit_production_20260722_r4 import ( + review_a5_static_v2_postfit_writer_r4 as writer, +) + + +SCHEMA = "bertose_a5_static_v2_direct_development_postfit_20260724_r2" +PUBLICATION_SCHEMA = ( + "bertose_a5_static_v2_direct_development_publication_20260724_r2" +) +AMENDMENT_SCHEMA = ( + "bertose_a5_static_v2_direct_development_publication_owner_" + "amendment_20260724_r1" +) +R4_EXECUTOR_SHA256 = ( + "a3fd9ab11032e5df3de13f5f43be630a703904b78002de8263827eec589acfce" +) +R4_WRITER_SHA256 = ( + "ceffd07edb6b8b322baecd95e023053ad8c783cc97cdb2edfc03c0b4fdeeaab6" +) +COMPLETE_DEV_R2_SHA256 = ( + "9794d59c8efa0102d56fa26fee7024ada2c4484a4cf54c411e6c3ea471571558" +) +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") +EXPECTED_COUNTS = { + writer.TRAIN_ROLE: { + "parent_count": 22_980, + "state_count": 34_408, + "residue_count": 205_801, + }, + writer.DEVELOPMENT_ROLE: { + "parent_count": 5_390, + "state_count": 7_964, + "residue_count": 51_237, + }, + "all": { + "parent_count": 28_370, + "state_count": 42_372, + "residue_count": 257_038, + "token_count": 1_028_152, + }, +} +HISTORICAL_HELD_COUNTS = { + "parent_count": 1_036, + "state_count": 1_532, + "residue_count": 9_740, +} +PUBLICATION_FILENAMES = frozenset( + { + writer.TOKEN_FILENAME, + writer.STATE_FILENAME, + writer.NULL_FILENAME, + writer.TRACE_FILENAME, + writer.RECEIPT_FILENAME, + } +) + + +class DirectDevelopmentPostfitError(RuntimeError): + """The prospective direct-development export contract changed.""" + + +def _sha(value: Any, label: str) -> str: + if ( + not isinstance(value, str) + or SHA_RE.fullmatch(value) is None + or value == "0" * 64 + ): + raise DirectDevelopmentPostfitError(f"{label} is not SHA-256") + return value + + +def _file_sha256(path: Path) -> str: + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + + +def _verify_regular_source(path: Path, expected_sha256: str, label: str) -> None: + source = Path(path).absolute() + metadata = os.stat(source, follow_symlinks=False) + if ( + not stat.S_ISREG(metadata.st_mode) + or stat.S_ISLNK(metadata.st_mode) + or _file_sha256(source) != expected_sha256 + ): + raise DirectDevelopmentPostfitError(f"{label} predecessor bytes changed") + + +def verify_frozen_predecessors() -> None: + """Rehash the three predecessor modules before importing their behavior.""" + + _verify_regular_source( + Path(executor.__file__), + R4_EXECUTOR_SHA256, + "R4 executor", + ) + _verify_regular_source( + Path(writer.__file__), + R4_WRITER_SHA256, + "R4 writer", + ) + _verify_regular_source( + Path(complete_dev.__file__), + COMPLETE_DEV_R2_SHA256, + "complete-development R2", + ) + + +def load_owner_amendment( + path: Path, *, expected_file_sha256: str +) -> tuple[dict[str, Any], str]: + """Open and validate the prospective supersession before graph payloads.""" + + supplied = Path(path) + absolute = supplied.absolute() + expected = _sha(expected_file_sha256, "owner amendment file") + if supplied != absolute or not absolute.name.startswith("review_"): + raise DirectDevelopmentPostfitError( + "owner amendment path is not absolute/review-prefixed" + ) + raw = executor.read_regular_nofollow( + absolute, + label="direct-development owner amendment", + expected_file_sha256=expected, + require_review_name=True, + ) + try: + value = json.loads(raw) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise DirectDevelopmentPostfitError( + "owner amendment is not canonical JSON" + ) from error + if ( + not isinstance(value, dict) + or writer.canonical_json_bytes(value) != raw + ): + raise DirectDevelopmentPostfitError("owner amendment bytes changed") + unsigned = dict(value) + receipt_sha = _sha( + unsigned.pop("receipt_sha256", None), "owner amendment receipt" + ) + authorization = { + "affinose_authorized": False, + "downstream_evaluation_authorized": False, + "native_ablation_data_binding_authorized": False, + "nova_submission_authorized": False, + "postfit_execution_authorized": True, + "postfit_static_publication_authorized": True, + } + historical = value.get("historical_boundary") + predecessor = value.get("predecessor_policy") + if ( + writer.sha256_json(unsigned) != receipt_sha + or value.get("schema") != AMENDMENT_SCHEMA + or value.get("status") + != "OWNER_DIRECTED_PROSPECTIVE_SUPERSESSION_OF_HISTORICAL_CAPACITY_GATE" + or value.get("scope") + != "selected_checkpoint_static_token_export_for_native_eight_only" + or value.get("authorization") != authorization + or value.get("exact_active_counts") != EXPECTED_COUNTS + or value.get("development_policy") + != { + "checkpoint_selection_may_use_direct_development_codes": False, + "development_may_fit_rvq_or_support": False, + "encode_complete_development_once_after_checkpoint_freeze": True, + "model_or_rvq_updates_allowed": False, + } + or value.get("null_and_support_policy") + != { + "development_used_for_null_fit": False, + "development_used_for_support_fit": False, + "fit_from_pretraining_train_only": True, + } + or historical + != { + "capacity_graph_or_pdb_payload_opened_before_amendment": False, + "historical_held_parent_count": 1_036, + "historical_held_residue_count": 9_740, + "historical_held_state_count": 1_532, + "preserve_membership_as_provenance": True, + "supersede_as_postfit_publication_gate": True, + } + or predecessor + != { + "complete_development_adapter_source_sha256": COMPLETE_DEV_R2_SHA256, + "postfit_r4_executor_source_sha256": R4_EXECUTOR_SHA256, + "postfit_r4_writer_source_sha256": R4_WRITER_SHA256, + "predecessors_remain_unchanged": True, + } + or value.get("official_submitted_artifacts_modified") is not False + ): + raise DirectDevelopmentPostfitError( + "owner amendment policy, counts, or self-hash changed" + ) + return value, expected + + +def _historical_held_provenance( + sources: Sequence[executor.SourceStaticState], +) -> dict[str, Any]: + development = tuple( + value for value in sources if value.role == writer.DEVELOPMENT_ROLE + ) + held = tuple( + value for value in development if r8.static_v2_capacity_audit_parent(value.parent_id) + ) + parent_ids = tuple(dict.fromkeys(value.parent_id for value in held)) + counts = { + "parent_count": len(parent_ids), + "state_count": len(held), + "residue_count": sum(len(value.ordered_residue_ids) for value in held), + } + if counts != HISTORICAL_HELD_COUNTS: + raise DirectDevelopmentPostfitError( + "historical held-development provenance changed" + ) + value: dict[str, Any] = { + "schema": ( + "bertose_a5_static_v2_historical_capacity_membership_" + "provenance_20260724_r2" + ), + "status": "PRESERVED_AS_PROVENANCE_NOT_AN_EXECUTION_GATE", + "counts": counts, + "ordered_parent_ids_sha256": writer.ordered_values_sha256(parent_ids), + "ordered_state_ids_sha256": writer.ordered_values_sha256( + [item.state_id for item in held] + ), + "graph_or_pdb_payload_opened_while_computing_provenance": False, + "used_for_training_or_checkpoint_selection": False, + "used_as_postfit_publication_gate": False, + } + value["receipt_sha256"] = writer.sha256_json(value) + return value + + +def _filter_static_sequence_join_rows( + *, + sources: Sequence[executor.SourceStaticState], + index_rows: Sequence[Mapping[str, Any]], + residue_ids: np.ndarray, + attention_mask: np.ndarray, +) -> list[dict[str, Any]]: + """Parse sequence structure only for parents with certified static states.""" + + if ( + residue_ids.shape != attention_mask.shape + or residue_ids.shape[0] != len(index_rows) + ): + raise DirectDevelopmentPostfitError( + "sequence join array shapes changed" + ) + static_parent_ids = { + source.parent_id for source in sources + } + if not static_parent_ids: + raise DirectDevelopmentPostfitError( + "static parent filter is empty" + ) + from ..a5_static_v2_20260721_r7 import ( + review_a5_static_graph_materializer_r7 as materializer, + ) + + result: list[dict[str, Any]] = [] + seen_static: set[str] = set() + for original_index, row in enumerate(index_rows): + if int(row["sequence_row"]) != original_index: + raise DirectDevelopmentPostfitError( + "complete sequence authority is not contiguous" + ) + parent = row["parent_glycorpus_id"] + if parent not in static_parent_ids: + continue + if parent in seen_static: + raise DirectDevelopmentPostfitError( + "complete sequence authority repeats a static parent" + ) + active = np.asarray(attention_mask[original_index]).astype( + bool, copy=False + ) + represented = sorted( + { + int(value) + for value in np.asarray(residue_ids[original_index])[active] + if int(value) >= 0 + } + ) + if not represented or represented != list(range(len(represented))): + raise DirectDevelopmentPostfitError( + "static sequence residue domain is not contiguous" + ) + ordered_wurcs_nodes = tuple( + str(value) + for value in materializer.parse_wurcs_edge_tree( + row["canonical_wurcs"] + ).nodes + ) + if len(represented) > len(ordered_wurcs_nodes): + raise DirectDevelopmentPostfitError( + "static sequence residue domain exceeds parent WURCS" + ) + result.append( + { + "sequence_row": len(result), + "parent_glycorpus_id": parent, + "canonical_wurcs": row["canonical_wurcs"], + "pretraining_partition": row["pretraining_partition"], + "represented_residue_count": len(represented), + "ordered_residue_ids": list( + ordered_wurcs_nodes[: len(represented)] + ), + } + ) + seen_static.add(parent) + if seen_static != static_parent_ids: + raise DirectDevelopmentPostfitError( + "one or more static parents are absent from sequence authority" + ) + return result + + +def load_static_sequence_join_rows( + *, + sources: Sequence[executor.SourceStaticState], + index_path: Path, + residue_ids_path: Path, + attention_mask_path: Path, +) -> tuple[list[dict[str, Any]], dict[str, Any]]: + """Hash all sequence inputs, but parse only static-eligible parents.""" + + index_rows, index_sha = executor._gzip_tsv_rows( + index_path, + "sequence-v3 parent index", + expected_file_sha256=executor.SEQUENCE_INDEX_FILE_SHA256, + ) + residue_raw = executor.read_regular_nofollow( + Path(residue_ids_path).absolute(), + label="sequence-v3 residue IDs", + expected_file_sha256=executor.SEQUENCE_RESIDUE_IDS_FILE_SHA256, + require_readonly=True, + ) + attention_raw = executor.read_regular_nofollow( + Path(attention_mask_path).absolute(), + label="sequence-v3 attention mask", + expected_file_sha256=executor.SEQUENCE_ATTENTION_MASK_FILE_SHA256, + require_readonly=True, + ) + try: + residue_ids = np.load(io.BytesIO(residue_raw), allow_pickle=False) + attention_mask = np.load( + io.BytesIO(attention_raw), allow_pickle=False + ) + except (OSError, ValueError) as error: + raise DirectDevelopmentPostfitError( + "sequence-v3 join arrays are malformed" + ) from error + result = _filter_static_sequence_join_rows( + sources=sources, + index_rows=index_rows, + residue_ids=residue_ids, + attention_mask=attention_mask, + ) + static_parent_order = [ + row["parent_glycorpus_id"] for row in result + ] + closure: dict[str, Any] = { + "sequence_index_file_sha256": index_sha, + "sequence_residue_ids_file_sha256": writer.sha256_bytes( + residue_raw + ), + "sequence_attention_mask_file_sha256": writer.sha256_bytes( + attention_raw + ), + "complete_sequence_row_count": len(index_rows), + "static_sequence_row_count": len(result), + "ordered_static_sequence_parent_ids_sha256": ( + writer.ordered_values_sha256(static_parent_order) + ), + "complete_sequence_files_hashed_and_shape_checked": True, + "nonstatic_sequence_wurcs_not_parsed_as_static_graphs": True, + } + closure["sequence_join_closure_sha256"] = writer.sha256_json(closure) + return result, closure + + +@contextmanager +def direct_development_inference_policy( + *, + sources: Sequence[executor.SourceStaticState], + amendment_receipt_sha256: str, +) -> Iterator[dict[str, Any]]: + """Prospectively treat all development parents as read-only inference rows.""" + + _sha(amendment_receipt_sha256, "owner amendment receipt") + if complete_dev.r8 is not r8: + raise DirectDevelopmentPostfitError( + "complete-development and executor capacity predicates diverged" + ) + provenance = _historical_held_provenance(sources) + original = r8.static_v2_capacity_audit_parent + + def all_development_is_direct(parent_id: str) -> bool: + # Retain the predecessor's input validation while superseding only the + # true/false split used after checkpoint selection. + original(parent_id) + return False + + r8.static_v2_capacity_audit_parent = all_development_is_direct + try: + yield provenance + finally: + r8.static_v2_capacity_audit_parent = original + + +def _preflight_output_namespaces( + *, + output_directory: Path, + shard_directory: Path, + sources: Sequence[executor.SourceStaticState], + shard_size: int, +) -> dict[str, Any]: + output = Path(output_directory).absolute() + shards = Path(shard_directory).absolute() + if ( + Path(output_directory) != output + or Path(shard_directory) != shards + or output == shards + or output in shards.parents + or shards in output.parents + or not output.name.startswith("review_") + or not shards.name.startswith("review_") + or output.is_symlink() + or shards.is_symlink() + or (output.exists() and not output.is_dir()) + or (shards.exists() and not shards.is_dir()) + or not output.parent.is_dir() + or not shards.parent.is_dir() + or type(shard_size) is not int + or shard_size < 1 + ): + raise DirectDevelopmentPostfitError( + "direct postfit output namespaces are malformed" + ) + output_names = set(os.listdir(output)) if output.exists() else set() + if not output_names.issubset(PUBLICATION_FILENAMES): + raise DirectDevelopmentPostfitError( + "direct publication namespace contains foreign files" + ) + if writer.RECEIPT_FILENAME in output_names and output_names != set( + PUBLICATION_FILENAMES + ): + raise DirectDevelopmentPostfitError( + "direct terminal receipt precedes complete publication" + ) + for name in sorted(output_names): + metadata = os.stat(output / name, follow_symlinks=False) + if not stat.S_ISREG(metadata.st_mode) or stat.S_ISLNK(metadata.st_mode): + raise DirectDevelopmentPostfitError( + "direct publication namespace contains a linked/nonregular member" + ) + groups = executor._complete_parent_groups(sources) + shard_count = (len(groups) + shard_size - 1) // shard_size + expected_shards = { + f"review_a5_static_v2_encoded_state_shard_{index:04d}_r4.json" + for index in range(shard_count) + } + shard_names = set(os.listdir(shards)) if shards.exists() else set() + if not shard_names.issubset(expected_shards): + raise DirectDevelopmentPostfitError( + "direct shard namespace contains stale or foreign files" + ) + for name in sorted(shard_names): + metadata = os.stat(shards / name, follow_symlinks=False) + if not stat.S_ISREG(metadata.st_mode) or stat.S_ISLNK(metadata.st_mode): + raise DirectDevelopmentPostfitError( + "direct shard namespace contains a linked/nonregular member" + ) + value: dict[str, Any] = { + "schema": "bertose_a5_static_v2_direct_output_preflight_20260724_r2", + "expected_shard_count": shard_count, + "expected_publication_member_count": len(PUBLICATION_FILENAMES), + "permitted_publication_filenames": sorted(PUBLICATION_FILENAMES), + "permitted_shard_filename_pattern": ( + "review_a5_static_v2_encoded_state_shard_NNNN_r4.json" + ), + "resume_is_write_missing_or_verify_identical": True, + } + value["receipt_sha256"] = writer.sha256_json(value) + return value + + +def _publication_receipt_keys() -> set[str]: + return { + "schema", + "status", + "production_mode", + "predecessor_writer_schema", + "owner_amendment_file_sha256", + "owner_amendment_receipt_sha256", + "historical_held_provenance", + "historical_held_provenance_receipt_sha256", + "selected_handoff_file_sha256", + "selected_handoff_receipt_sha256", + "support_replay_receipt_sha256", + "export_receipt", + "export_receipt_sha256", + "null_receipt_sha256", + "join_receipt", + "join_receipt_sha256", + "parent_inference_manifest_sha256", + "preserved_authority_role_counts", + "token_publication", + "state_publication", + "null_publication", + "traceability_publication", + "receipt_written_last", + "resume_is_verify_or_continue_without_overwrite", + "development_used_for_support_or_null_fit", + "development_used_for_checkpoint_selection_after_amendment", + "model_or_rvq_updated_during_direct_development_encoding", + "native_ablation_data_binding_authorized", + "nova_submission_authorized", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } + + +def publish_direct_bundle( + output_directory: Path, + *, + amendment_file_sha256: str, + amendment_receipt_sha256: str, + historical_provenance: Mapping[str, Any], + rows: Sequence[writer.EncodedStaticState], + parent_inference_receipts: Sequence[Mapping[str, Any]], + authority_rows: Sequence[Mapping[str, Any]], + sequence_rows: Sequence[Mapping[str, Any]], + export_receipt: Mapping[str, Any], + null_artifact: Mapping[str, Any], + selected_handoff_file_sha256: str, + selected_handoff_receipt_sha256: str, + support_replay_receipt_sha256: str, + selected_checkpoint_semantic_sha256: str, + selected_model_state_sha256: str, + export_model_state_sha256: str, + selected_support_identity_sha256: str, + rvq_identity_sha256: str, + device_execution_identity_sha256: str, + source_authority_file_sha256: str, + source_closure_sha256: str, + production_mode: bool, +) -> dict[str, Any]: + """Revive the frozen R4 publication body under the direct amendment.""" + + root = Path(output_directory).absolute() + if ( + Path(output_directory) != root + or root.is_symlink() + or (root.exists() and not root.is_dir()) + or not root.name.startswith("review_") + ): + raise DirectDevelopmentPostfitError( + "direct publication output is not absolute/review-prefixed" + ) + amendment_file_sha256 = _sha( + amendment_file_sha256, "owner amendment file" + ) + amendment_receipt_sha256 = _sha( + amendment_receipt_sha256, "owner amendment receipt" + ) + selected_handoff_file_sha256 = _sha( + selected_handoff_file_sha256, "selected handoff file" + ) + selected_handoff_receipt_sha256 = _sha( + selected_handoff_receipt_sha256, "selected handoff receipt" + ) + support_replay_receipt_sha256 = _sha( + support_replay_receipt_sha256, "support replay receipt" + ) + historical = dict(historical_provenance) + historical_sha = _sha( + historical.get("receipt_sha256"), "historical held provenance" + ) + unsigned_historical = dict(historical) + unsigned_historical.pop("receipt_sha256") + if writer.sha256_json(unsigned_historical) != historical_sha: + raise DirectDevelopmentPostfitError( + "historical held provenance self-hash changed" + ) + normalized = tuple( + sorted( + (row.normalized() for row in rows), + key=lambda value: value.authority_index, + ) + ) + expected_export, expected_null, _ = writer.build_export_and_null( + normalized, + parent_inference_receipts=parent_inference_receipts, + selected_checkpoint_semantic_sha256=_sha( + selected_checkpoint_semantic_sha256, "selected checkpoint" + ), + selected_model_state_sha256=_sha( + selected_model_state_sha256, "selected model state" + ), + export_model_state_sha256=_sha( + export_model_state_sha256, "export model state" + ), + support_replay_receipt_sha256=support_replay_receipt_sha256, + selected_support_identity_sha256=_sha( + selected_support_identity_sha256, "selected support identity" + ), + rvq_identity_sha256=_sha(rvq_identity_sha256, "RVQ identity"), + device_execution_identity_sha256=_sha( + device_execution_identity_sha256, "device identity" + ), + source_authority_file_sha256=_sha( + source_authority_file_sha256, "source authority" + ), + source_closure_sha256=_sha(source_closure_sha256, "source closure"), + selected_checkpoint_inference_authority_binding_sha256=( + _sha( + parent_inference_receipts[0]["scientific_bindings"][ + "selected_checkpoint_inference_authority_binding_sha256" + ], + "selected inference authority", + ) + ), + production_mode=production_mode, + expected_counts=( + None if production_mode else writer._role_counts(normalized) + ), + ) + if ( + dict(export_receipt) != expected_export + or dict(null_artifact) != expected_null + or export_receipt.get("exact_counts") + != ( + EXPECTED_COUNTS + if production_mode + else writer._role_counts(normalized) + ) + or export_receipt.get("development_used_for_support_or_null_fit") + is not False + ): + raise DirectDevelopmentPostfitError( + "direct export/null differs from full train-only recomputation" + ) + encoded_by_state = {row.state_id: row for row in normalized} + state_bytes, preserved_role_counts = writer._state_tsv_bytes( + authority_rows, + encoded_by_state, + production_mode=production_mode, + ) + package, join = writer.build_token_package( + normalized, + sequence_rows=sequence_rows, + export_receipt_sha256=export_receipt["receipt_sha256"], + null_receipt_sha256=null_artifact["receipt_sha256"], + ) + token_bytes = pickle.dumps(package, protocol=5, fix_imports=False) + if ( + pickle.dumps( + pickle.loads(token_bytes), protocol=5, fix_imports=False + ) + != token_bytes + ): + raise DirectDevelopmentPostfitError( + "direct protocol-5 token pickle is nondeterministic" + ) + null_bytes = writer.canonical_json_bytes(dict(null_artifact)) + token_sha = writer.sha256_bytes(token_bytes) + state_sha = writer.sha256_bytes(state_bytes) + null_sha = writer.sha256_bytes(null_bytes) + trace_text = ( + "# Static-v2 direct full-development publication R2\n\n" + f"- Owner amendment file SHA-256: `{amendment_file_sha256}`.\n" + f"- Owner amendment receipt SHA-256: `{amendment_receipt_sha256}`.\n" + f"- Historical held-membership provenance SHA-256: `{historical_sha}`.\n" + f"- Selected-best handoff file SHA-256: `{selected_handoff_file_sha256}`.\n" + f"- Selected checkpoint semantic SHA-256: `{export_receipt['selected_checkpoint_semantic_sha256']}`.\n" + f"- Train-only null receipt SHA-256: `{null_artifact['receipt_sha256']}`.\n" + f"- Token file SHA-256: `{token_sha}`.\n" + f"- State authority file SHA-256: `{state_sha}`.\n" + f"- Static null file SHA-256: `{null_sha}`.\n" + "- All development parents were encoded only after checkpoint freeze.\n" + "- Development updated neither the model/RVQ nor train support and was not used to fit the null.\n" + "- The historical capacity split is preserved only as provenance and is not a publication gate.\n" + "- Official/submitted artifacts were left unchanged; native-eight and Nova launch remain separately closed.\n" + ).encode("utf-8") + if not root.exists(): + root.mkdir(mode=0o750, parents=False) + token_publication = writer._write_or_verify( + root / writer.TOKEN_FILENAME, + token_bytes, + label="direct static-v2 token package", + ) + state_publication = writer._write_or_verify( + root / writer.STATE_FILENAME, + state_bytes, + label="direct static-v2 state authority", + ) + null_publication = writer._write_or_verify( + root / writer.NULL_FILENAME, + null_bytes, + label="direct static-v2 train-only null", + ) + trace_publication = writer._write_or_verify( + root / writer.TRACE_FILENAME, + trace_text, + label="direct static-v2 traceability", + ) + receipt: dict[str, Any] = { + "schema": PUBLICATION_SCHEMA, + "status": ( + "PASS_DIRECT_FULL_DEVELOPMENT_STATIC_PUBLICATION_READBACK" + if production_mode + else "PASS_DIRECT_FIXTURE_PUBLICATION_NOT_PRODUCTION_EVIDENCE" + ), + "production_mode": production_mode, + "predecessor_writer_schema": writer.WRITER_SCHEMA, + "owner_amendment_file_sha256": amendment_file_sha256, + "owner_amendment_receipt_sha256": amendment_receipt_sha256, + "historical_held_provenance": historical, + "historical_held_provenance_receipt_sha256": historical_sha, + "selected_handoff_file_sha256": selected_handoff_file_sha256, + "selected_handoff_receipt_sha256": selected_handoff_receipt_sha256, + "support_replay_receipt_sha256": support_replay_receipt_sha256, + "export_receipt": dict(export_receipt), + "export_receipt_sha256": export_receipt["receipt_sha256"], + "null_receipt_sha256": null_artifact["receipt_sha256"], + "join_receipt": join, + "join_receipt_sha256": join["receipt_sha256"], + "parent_inference_manifest_sha256": export_receipt[ + "parent_inference_manifest_sha256" + ], + "preserved_authority_role_counts": preserved_role_counts, + "token_publication": token_publication, + "state_publication": state_publication, + "null_publication": null_publication, + "traceability_publication": trace_publication, + "receipt_written_last": True, + "resume_is_verify_or_continue_without_overwrite": True, + "development_used_for_support_or_null_fit": False, + "development_used_for_checkpoint_selection_after_amendment": False, + "model_or_rvq_updated_during_direct_development_encoding": False, + "native_ablation_data_binding_authorized": False, + "nova_submission_authorized": False, + "official_submitted_artifacts_modified": False, + "authorization": closed_launch_authorization(), + } + receipt["receipt_sha256"] = writer.sha256_json(receipt) + if set(receipt) != _publication_receipt_keys(): + raise DirectDevelopmentPostfitError( + "direct publication receipt exact keys changed" + ) + raw = writer.canonical_json_bytes(receipt) + writer._write_or_verify( + root / writer.RECEIPT_FILENAME, + raw, + label="direct postfit publication receipt", + ) + observed = json.loads( + executor.read_regular_nofollow( + root / writer.RECEIPT_FILENAME, + label="direct postfit publication receipt", + expected_file_sha256=writer.sha256_bytes(raw), + require_review_name=True, + require_readonly=True, + ) + ) + if observed != receipt: + raise DirectDevelopmentPostfitError( + "direct publication receipt readback changed" + ) + return receipt + + +def run_direct_postfit( + *, + amendment_path: Path, + expected_amendment_file_sha256: str, + handoff_path: Path, + expected_handoff_file_sha256: str, + authority_path: Path, + fingerprint_path: Path, + vocabulary_path: Path, + template_registry_path: Path, + sequence_index_path: Path, + sequence_residue_ids_path: Path, + sequence_attention_mask_path: Path, + output_directory: Path, + shard_directory: Path, + device_type: str, + shard_size: int = 128, +) -> dict[str, Any]: + """Run the exact R4 path with direct full-development inference enabled.""" + + verify_frozen_predecessors() + amendment, amendment_file_sha = load_owner_amendment( + amendment_path, + expected_file_sha256=expected_amendment_file_sha256, + ) + authority, sources, source_closure = executor.load_r7_source_surface( + authority_path=authority_path, + fingerprint_path=fingerprint_path, + ) + historical = _historical_held_provenance(sources) + roster = executor.seal_complete_development_roster( + sources, + source_closure=source_closure, + ) + sequence_rows, sequence_closure = load_static_sequence_join_rows( + sources=sources, + index_path=sequence_index_path, + residue_ids_path=sequence_residue_ids_path, + attention_mask_path=sequence_attention_mask_path, + ) + sequence_join = executor.validate_sequence_source_join( + sources, sequence_rows + ) + graph_loader, materializer_closure = executor.build_r7_graph_loader( + vocabulary_path=vocabulary_path, + template_registry_path=template_registry_path, + ) + with direct_development_inference_policy( + sources=sources, + amendment_receipt_sha256=amendment["receipt_sha256"], + ): + output_preflight = _preflight_output_namespaces( + output_directory=output_directory, + shard_directory=shard_directory, + sources=sources, + shard_size=shard_size, + ) + full_source_closure: dict[str, Any] = { + "schema": ( + "bertose_a5_static_v2_direct_postfit_source_closure_20260724_r2" + ), + "r7": dict(source_closure), + "materializer": dict(materializer_closure), + "sequence": dict(sequence_closure), + "output_preflight": output_preflight, + "sequence_static_join_receipt_sha256": sequence_join["receipt_sha256"], + "owner_amendment_file_sha256": amendment_file_sha, + "owner_amendment_receipt_sha256": amendment["receipt_sha256"], + "historical_held_provenance_receipt_sha256": historical[ + "receipt_sha256" + ], + "historical_capacity_gate_superseded_before_payload_open": True, + "gpu_inference_started_during_source_validation": False, + } + full_source_closure["source_closure_sha256"] = writer.sha256_json( + full_source_closure + ) + restored = executor.restore_certified_selected_model( + handoff_path, + expected_handoff_file_sha256=expected_handoff_file_sha256, + device_type=device_type, + ) + device = torch.device("cuda:0" if device_type == "cuda" else "cpu") + before = r8.module_state_sha256(restored.model) + with direct_development_inference_policy( + sources=sources, + amendment_receipt_sha256=amendment["receipt_sha256"], + ) as replayed_historical: + if replayed_historical != historical: + raise DirectDevelopmentPostfitError( + "historical provenance changed between preflight and inference" + ) + encoding = executor.encode_or_reopen_shards( + model=restored.model, + sources=sources, + graph_loader=graph_loader, + shard_directory=shard_directory, + shard_size=shard_size, + device=device, + selected_checkpoint_semantic_sha256=( + restored.checkpoint_semantic_sha256 + ), + selected_model_state_sha256=restored.selected_model_state_sha256, + export_model_state_sha256=restored.export_model_state_sha256, + support_replay_receipt_sha256=restored.support_replay_receipt[ + "receipt_sha256" + ], + selected_support_identity_sha256=( + restored.selected_support_identity_sha256 + ), + rvq_identity_sha256=restored.rvq_identity_sha256, + r9_segment_pack_receipt_sha256=( + restored.r9_segment_pack_receipt_sha256 + ), + device_execution_identity_sha256=( + restored.device_execution_identity_sha256 + ), + source_authority_file_sha256=source_closure[ + "authority_file_sha256" + ], + selected_checkpoint_inference_authority_binding_sha256=( + restored.selected_checkpoint_inference_authority.binding_sha256 + ), + complete_development_roster=roster, + selected_inference_authority=( + restored.selected_checkpoint_inference_authority + ), + model_state_hasher=r8.module_state_sha256, + ) + after = r8.module_state_sha256(restored.model) + counts = writer._role_counts(encoding.rows) + if ( + before != after + or encoding.held_capacity_parent_ids + or counts != EXPECTED_COUNTS + or len(encoding.parent_inference_receipts) != 28_370 + ): + raise DirectDevelopmentPostfitError( + "direct full-development encoding counts/model state changed" + ) + export, null_artifact, _ = writer.build_export_and_null( + encoding.rows, + parent_inference_receipts=encoding.parent_inference_receipts, + selected_checkpoint_semantic_sha256=( + restored.checkpoint_semantic_sha256 + ), + selected_model_state_sha256=restored.selected_model_state_sha256, + export_model_state_sha256=restored.export_model_state_sha256, + support_replay_receipt_sha256=restored.support_replay_receipt[ + "receipt_sha256" + ], + selected_support_identity_sha256=( + restored.selected_support_identity_sha256 + ), + rvq_identity_sha256=restored.rvq_identity_sha256, + device_execution_identity_sha256=( + restored.device_execution_identity_sha256 + ), + source_authority_file_sha256=source_closure[ + "authority_file_sha256" + ], + source_closure_sha256=full_source_closure[ + "source_closure_sha256" + ], + selected_checkpoint_inference_authority_binding_sha256=( + restored.selected_checkpoint_inference_authority.binding_sha256 + ), + production_mode=True, + ) + publication = publish_direct_bundle( + output_directory, + amendment_file_sha256=amendment_file_sha, + amendment_receipt_sha256=amendment["receipt_sha256"], + historical_provenance=historical, + rows=encoding.rows, + parent_inference_receipts=encoding.parent_inference_receipts, + authority_rows=authority, + sequence_rows=sequence_rows, + export_receipt=export, + null_artifact=null_artifact, + selected_handoff_file_sha256=restored.handoff_file_sha256, + selected_handoff_receipt_sha256=restored.handoff_receipt_sha256, + support_replay_receipt_sha256=restored.support_replay_receipt[ + "receipt_sha256" + ], + selected_checkpoint_semantic_sha256=( + restored.checkpoint_semantic_sha256 + ), + selected_model_state_sha256=restored.selected_model_state_sha256, + export_model_state_sha256=restored.export_model_state_sha256, + selected_support_identity_sha256=( + restored.selected_support_identity_sha256 + ), + rvq_identity_sha256=restored.rvq_identity_sha256, + device_execution_identity_sha256=( + restored.device_execution_identity_sha256 + ), + source_authority_file_sha256=source_closure[ + "authority_file_sha256" + ], + source_closure_sha256=full_source_closure[ + "source_closure_sha256" + ], + production_mode=True, + ) + result: dict[str, Any] = { + "schema": SCHEMA, + "status": "PASS_DIRECT_FULL_DEVELOPMENT_STATIC_PACKAGE_PUBLISHED", + "owner_amendment_file_sha256": amendment_file_sha, + "owner_amendment_receipt_sha256": amendment["receipt_sha256"], + "historical_held_provenance_receipt_sha256": historical[ + "receipt_sha256" + ], + "source_closure_sha256": full_source_closure[ + "source_closure_sha256" + ], + "encoded_counts": counts, + "selected_checkpoint_semantic_sha256": ( + restored.checkpoint_semantic_sha256 + ), + "model_state_unchanged_during_encoding": True, + "development_used_for_support_or_null_fit": False, + "publication_receipt_sha256": publication["receipt_sha256"], + "native_ablation_data_binding_authorized": False, + "nova_submission_authorized": False, + "official_submitted_artifacts_modified": False, + "authorization": closed_launch_authorization(), + } + result["receipt_sha256"] = writer.sha256_json(result) + return result + + +__all__ = [ + "DirectDevelopmentPostfitError", + "direct_development_inference_policy", + "load_static_sequence_join_rows", + "load_owner_amendment", + "publish_direct_bundle", + "run_direct_postfit", + "verify_frozen_predecessors", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/run_review_a5_static_v2_postfit_direct_publication_r2.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/run_review_a5_static_v2_postfit_direct_publication_r2.py new file mode 100644 index 0000000000000000000000000000000000000000..7ea30c0c64f8f504c331847a4e77d1c0ddcf0196 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/run_review_a5_static_v2_postfit_direct_publication_r2.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +"""CLI for the direct full-development static-v2 publication R2 successor.""" + +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +from .review_a5_static_v2_postfit_direct_publication_r2 import run_direct_postfit + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--owner-amendment", type=Path, required=True) + parser.add_argument("--owner-amendment-sha256", required=True) + parser.add_argument("--selected-best-handoff", type=Path, required=True) + parser.add_argument("--selected-best-handoff-sha256", required=True) + parser.add_argument("--r7-authority", type=Path, required=True) + parser.add_argument("--r7-fingerprint-ledger", type=Path, required=True) + parser.add_argument("--r7-vocabulary", type=Path, required=True) + parser.add_argument("--r7-template-registry", type=Path, required=True) + parser.add_argument("--sequence-index", type=Path, required=True) + parser.add_argument("--sequence-residue-ids", type=Path, required=True) + parser.add_argument("--sequence-attention-mask", type=Path, required=True) + parser.add_argument("--output-directory", type=Path, required=True) + parser.add_argument("--shard-directory", type=Path, required=True) + parser.add_argument("--device", choices=("cpu", "cuda"), required=True) + parser.add_argument("--shard-size", type=int, default=128) + arguments = parser.parse_args() + result = run_direct_postfit( + amendment_path=arguments.owner_amendment.absolute(), + expected_amendment_file_sha256=arguments.owner_amendment_sha256, + handoff_path=arguments.selected_best_handoff.absolute(), + expected_handoff_file_sha256=arguments.selected_best_handoff_sha256, + authority_path=arguments.r7_authority.absolute(), + fingerprint_path=arguments.r7_fingerprint_ledger.absolute(), + vocabulary_path=arguments.r7_vocabulary.absolute(), + template_registry_path=arguments.r7_template_registry.absolute(), + sequence_index_path=arguments.sequence_index.absolute(), + sequence_residue_ids_path=arguments.sequence_residue_ids.absolute(), + sequence_attention_mask_path=arguments.sequence_attention_mask.absolute(), + output_directory=arguments.output_directory.absolute(), + shard_directory=arguments.shard_directory.absolute(), + device_type=arguments.device, + shard_size=arguments.shard_size, + ) + print(json.dumps(result, sort_keys=True, separators=(",", ":"))) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r4_terminal_certification/review_a5_static_v2_terminal_certification_r4.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r4_terminal_certification/review_a5_static_v2_terminal_certification_r4.py new file mode 100644 index 0000000000000000000000000000000000000000..62834b92d77d8996c83aa8206f840b5765672fe2 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r4_terminal_certification/review_a5_static_v2_terminal_certification_r4.py @@ -0,0 +1,1708 @@ +"""Strict, read-only terminal certification around the frozen R2 publisher. + +This module does not train, submit, or open the native-eight launch. It +validates exact R6 terminal artifacts and job-11762305 lineage, calls only the +frozen R2 direct publisher, persists that exact result, and publishes one +outer receipt that a later native-eight release must bind. +""" + +from __future__ import annotations + +import copy +import hashlib +import io +import importlib +import inspect +import json +import os +from pathlib import Path +import stat +import sys +from typing import Any, Mapping + + +BINDING_SCHEMA = ( + "bertose_a5_static_v2_postfit_terminal_certification_20260725_r4" +) +BINDING_STATUS = ( + "PASS_EXACT_R6_TERMINAL_JOB_11762305_AND_R2_PUBLICATION" +) +TERMINAL_EVIDENCE_SCHEMA = ( + "bertose_a5_static_v2_job_11762305_terminal_evidence_20260725_r4" +) +TERMINAL_EVIDENCE_STATUS = "PASS_EXACT_ONE_V100_TERMINAL_EXECUTION" +EXPECTED_JOB_ID = "11762305" +PARENT_JOB_ID = "11759687" +EXPECTED_JOB_NAME = "review_a5_sv2_af805f5d2cb8c32e" +EXPECTED_RESUME_CLASS = ( + "f73fda38334de1b0b41af0db00d15514a7a41519932f3f6332faecaf0290e358" +) +EXPECTED_CHECKPOINT_CONTRACT = ( + "d4214b58b5dbe9af571b83739fdaf5a399c0d6d4e31a55f89a8f901f8855c8a9" +) +EXPECTED_SUBMISSION_PAYLOAD_SHA256 = ( + "2cd0573ffe936a5d7831809b521fc045f296e7eeb0783a9107f867cdd8431381" +) +EXPECTED_CONTINUATION_FILE_SHA256 = ( + "ebeb65fbc7f5ddc59172eba7ac93edd461c60f4f98504374420601e49dcd6f10" +) +EXPECTED_CONTINUATION_RECEIPT_SHA256 = ( + "d4d68ec73cf466a23bc6a41ff9df78456ab17a6bd8708b54d3c025ba3b7de6ee" +) +EXPECTED_MEMORY_AMENDMENT_FILE_SHA256 = ( + "06b1709c47a543295ae9a94a619378a5fe8bd29b53ee115549a1ea0128caa3eb" +) +EXPECTED_MEMORY_AMENDMENT_RECEIPT_SHA256 = ( + "97efa462b63d61c3e57f108d4901ba83c654be96cd7c4a48314b25bcb161fb4b" +) +EXPECTED_MEMORY_APPLIED_FILE_SHA256 = ( + "f2bafe61f181590983b6bd05e3e95437d40724e14d07dc4346ad762b5ba73df3" +) +EXPECTED_MEMORY_APPLIED_RECEIPT_SHA256 = ( + "824d4a5e76599e413ee0b847119aa80f5feb437d38e0919845a93ce62de36c2b" +) +EXPECTED_R6_RUNTIME_SHA256 = ( + "30c8f300f1c93c2c09bb1effadafa5e02c546750a51e31b1e16bca8329fef538" +) +EXPECTED_R6_HANDOFF_SHA256 = ( + "d55943d72ec819cd44a183d51a150b80ec11a89153a85400bd14a8a51498eb0c" +) +EXPECTED_R2_SOURCE_SHA256 = ( + "8e57c17fd43f3894f94f980cf70a0d6d7f183cf04c26780c3fe30c1932bb7abb" +) +ZERO_SHA256 = "0" * 64 +EMPTY_SHA256 = hashlib.sha256(b"").hexdigest() +RUNTIME_ROOT = Path(__file__).absolute().parents[1] +ACTIVE_R6_PACKAGE = ( + "review.multimodal.runtime." + "a5_static_v2_full_fit_production_20260723_r10_postcache_r3" +) +ACTIVE_R6_RUNTIME_PATH = ( + RUNTIME_ROOT + / "a5_static_v2_full_fit_production_20260723_r10_postcache_r3" + / "review_a5_static_v2_full_fit_runtime_r6.py" +) +ACTIVE_R6_HANDOFF_PATH = ACTIVE_R6_RUNTIME_PATH.with_name( + "review_a5_static_v2_selected_best_handoff_r6.py" +) +R2_MODULE_NAME = ( + "review.multimodal.runtime." + "a5_static_v2_postfit_direct_publication_20260724_r2." + "review_a5_static_v2_postfit_direct_publication_r2" +) +R2_SOURCE_PATH = ( + RUNTIME_ROOT + / "a5_static_v2_postfit_direct_publication_20260724_r2" + / "review_a5_static_v2_postfit_direct_publication_r2.py" +) +_DEPENDENCY_CACHE: tuple[Any, Any, Any] | None = None + +_TERMINAL_EVIDENCE_KEYS = frozenset( + { + "schema", + "status", + "scheduler", + "production_documents", + "terminal_checkpoint", + "checkpoint_cadence", + "official_submitted_artifacts_modified", + "ablation_or_downstream_opened", + "receipt_sha256", + } +) +_SCHEDULER_KEYS = frozenset( + { + "job_id", + "job_name", + "state", + "exit_code", + "allocation_count", + "partition", + "account", + "qos", + "constraint_tokens", + "requested_gres", + "requested_memory", + "allocated_node_count", + "allocated_gpu_count", + "allocated_gpu_type", + "alloc_tres", + "stderr_size_bytes", + "stderr_sha256", + "sacct_stdout_sha256", + "scontrol_stdout_sha256", + "sacct_command_argv", + "scontrol_command_argv", + "parent_sacct_command_argv", + "sacct_capture", + "scontrol_capture", + "parent_sacct_capture", + } +) +_EMBEDDED_FILE_BINDING_KEYS = frozenset( + {"absolute_path", "file_sha256", "size_bytes"} +) +_PRODUCTION_DOCUMENT_KEYS = frozenset( + {"execution_bundle", "owner_authority", "submission_receipt"} +) +_TERMINAL_CHECKPOINT_KEYS = frozenset( + { + "head_file_sha256", + "receipt_file_sha256", + "payload_file_sha256", + "checkpoint_semantic_sha256", + "checkpoint_ordinal", + "epoch_index", + "phase", + "group_cursor", + "micro_pack_cursor", + "epoch_group_plan_sha256", + "epoch_successful_group_steps", + "planned_group_count", + "ordered_group_binding_sha256", + "terminal_status", + "contract_sha256", + } +) +_BINDING_KEYS = frozenset( + { + "schema", + "status", + "successor_job_id", + "bound_artifacts", + "terminal_evidence_file_sha256", + "terminal_evidence_receipt_sha256", + "continuation_file_sha256", + "continuation_receipt_sha256", + "memory_amendment_file_sha256", + "memory_amendment_receipt_sha256", + "memory_applied_file_sha256", + "memory_applied_receipt_sha256", + "r6_runtime_source_sha256", + "r6_handoff_source_sha256", + "r2_direct_source_sha256", + "full_fit_result_file_sha256", + "full_fit_result_receipt_sha256", + "selected_handoff_file_sha256", + "selected_handoff_receipt_sha256", + "selected_checkpoint_semantic_sha256", + "direct_publication_file_sha256", + "direct_publication_receipt_sha256", + "persisted_r2_result_file_sha256", + "persisted_r2_result_receipt_sha256", + "terminal_continuation_required_for_native_eight_release", + "native_ablation_data_binding_authorized", + "nova_submission_authorized", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } +) +_BOUND_ARTIFACT_KEYS = frozenset( + { + "terminal_evidence", + "continuation", + "memory_amendment", + "memory_applied", + "full_fit_result", + "selected_handoff", + "direct_publication", + "persisted_r2_result", + } +) +_ARTIFACT_BINDING_KEYS = frozenset( + {"absolute_path", "file_sha256", "size_bytes", "receipt_sha256"} +) +_R2_RESULT_KEYS = frozenset( + { + "schema", + "status", + "owner_amendment_file_sha256", + "owner_amendment_receipt_sha256", + "historical_held_provenance_receipt_sha256", + "source_closure_sha256", + "encoded_counts", + "selected_checkpoint_semantic_sha256", + "model_state_unchanged_during_encoding", + "development_used_for_support_or_null_fit", + "publication_receipt_sha256", + "native_ablation_data_binding_authorized", + "nova_submission_authorized", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } +) + + +class TerminalCertificationR4Error(RuntimeError): + """An immutable terminal or direct-publication binding changed.""" + + +def canonical_bytes(value: Any) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def sha256_json(value: Any) -> str: + return hashlib.sha256(canonical_bytes(value)).hexdigest() + + +def _sha(value: Any, label: str) -> str: + if ( + not isinstance(value, str) + or len(value) != 64 + or any(character not in "0123456789abcdef" for character in value) + or value == ZERO_SHA256 + ): + raise TerminalCertificationR4Error(f"{label} is not SHA-256") + return value + + +def _read_immutable( + path: Path, + *, + label: str, + expected_sha256: str | None = None, + maximum: int = 64 * 1024 * 1024, + require_review_name: bool = True, +) -> tuple[bytes, str]: + """Read through a component-wise O_NOFOLLOW descriptor chain.""" + + supplied = Path(path) + absolute = supplied.absolute() + if ( + supplied != absolute + or os.path.normpath(os.fspath(absolute)) != os.fspath(absolute) + or (require_review_name and not absolute.name.startswith("review_")) + or maximum < 1 + or not hasattr(os, "O_NOFOLLOW") + or not hasattr(os, "O_DIRECTORY") + ): + raise TerminalCertificationR4Error(f"{label} path is unsafe") + directory_flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + file_flags = ( + os.O_RDONLY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + directory = os.open(os.sep, directory_flags) + descriptor: int | None = None + try: + for component in absolute.parts[1:-1]: + child = os.open(component, directory_flags, dir_fd=directory) + os.close(directory) + directory = child + descriptor = os.open(absolute.name, file_flags, dir_fd=directory) + before = os.fstat(descriptor) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or before.st_mode & 0o222 + or before.st_size < 1 + or before.st_size > maximum + ): + raise TerminalCertificationR4Error( + f"{label} is not one bounded immutable file" + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise TerminalCertificationR4Error( + f"{label} truncated while read" + ) + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + if ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_mode, + before.st_nlink, + ) != ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_mode, + after.st_nlink, + ): + raise TerminalCertificationR4Error(f"{label} changed while read") + except OSError as error: + raise TerminalCertificationR4Error( + f"{label} path has a missing/symlinked component" + ) from error + finally: + if descriptor is not None: + os.close(descriptor) + os.close(directory) + raw = b"".join(chunks) + digest = hashlib.sha256(raw).hexdigest() + if expected_sha256 is not None and digest != _sha( + expected_sha256, f"{label} expected file" + ): + raise TerminalCertificationR4Error(f"{label} file hash changed") + return raw, digest + + +def _canonical_file( + path: Path, + *, + label: str, + expected_sha256: str | None = None, +) -> tuple[dict[str, Any], str]: + raw, digest = _read_immutable( + path, label=label, expected_sha256=expected_sha256 + ) + try: + value = json.loads(raw.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise TerminalCertificationR4Error( + f"{label} is not canonical JSON" + ) from error + if type(value) is not dict or canonical_bytes(value) != raw: + raise TerminalCertificationR4Error(f"{label} JSON bytes changed") + return value, digest + + +def _canonical_raw(raw: bytes, label: str) -> dict[str, Any]: + try: + value = json.loads(raw.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise TerminalCertificationR4Error( + f"{label} is not canonical JSON" + ) from error + if type(value) is not dict or canonical_bytes(value) != raw: + raise TerminalCertificationR4Error(f"{label} JSON bytes changed") + return value + + +def _self_hash(value: Mapping[str, Any], label: str) -> str: + unsigned = copy.deepcopy(dict(value)) + observed = _sha(unsigned.pop("receipt_sha256", None), f"{label} receipt") + if sha256_json(unsigned) != observed: + raise TerminalCertificationR4Error(f"{label} self-hash changed") + return observed + + +def _dependencies() -> tuple[Any, Any, Any]: + """Hash exact source bytes before importing any production dependency.""" + + global _DEPENDENCY_CACHE + for path, expected, label in ( + (ACTIVE_R6_RUNTIME_PATH, EXPECTED_R6_RUNTIME_SHA256, "active R6 runtime"), + (ACTIVE_R6_HANDOFF_PATH, EXPECTED_R6_HANDOFF_SHA256, "R6 handoff"), + (R2_SOURCE_PATH, EXPECTED_R2_SOURCE_SHA256, "R2 direct publisher"), + ): + _read_immutable( + path, + label=f"{label} source", + expected_sha256=expected, + maximum=4 * 1024 * 1024, + ) + if _DEPENDENCY_CACHE is not None: + return _DEPENDENCY_CACHE + runtime_r6 = importlib.import_module( + f"{ACTIVE_R6_PACKAGE}.review_a5_static_v2_full_fit_runtime_r6" + ) + handoff_r6 = importlib.import_module( + f"{ACTIVE_R6_PACKAGE}.review_a5_static_v2_selected_best_handoff_r6" + ) + direct_r2 = importlib.import_module(R2_MODULE_NAME) + for module, path in ( + (runtime_r6, ACTIVE_R6_RUNTIME_PATH), + (handoff_r6, ACTIVE_R6_HANDOFF_PATH), + (direct_r2, R2_SOURCE_PATH), + ): + if Path(module.__file__).absolute() != path: + raise TerminalCertificationR4Error( + "production dependency imported from an unbound path" + ) + _DEPENDENCY_CACHE = runtime_r6, handoff_r6, direct_r2 + return _DEPENDENCY_CACHE + + +def _validate_continuation_and_memory( + *, + continuation_path: Path, + memory_amendment_path: Path, + memory_applied_path: Path, +) -> tuple[dict[str, Any], dict[str, Any], dict[str, Any]]: + continuation, _ = _canonical_file( + continuation_path, + label="continuation receipt", + expected_sha256=EXPECTED_CONTINUATION_FILE_SHA256, + ) + amendment, _ = _canonical_file( + memory_amendment_path, + label="memory amendment", + expected_sha256=EXPECTED_MEMORY_AMENDMENT_FILE_SHA256, + ) + applied, _ = _canonical_file( + memory_applied_path, + label="memory applied receipt", + expected_sha256=EXPECTED_MEMORY_APPLIED_FILE_SHA256, + ) + if ( + _self_hash(continuation, "continuation receipt") + != EXPECTED_CONTINUATION_RECEIPT_SHA256 + or continuation.get("successor_job_id") != EXPECTED_JOB_ID + or continuation.get("scheduler_job_name") != EXPECTED_JOB_NAME + or continuation.get("generic_gpu_request") != "gpu:1" + or continuation.get("constraint_tokens") != ["nova18", "v100"] + or continuation.get("resume_device_class_sha256") + != EXPECTED_RESUME_CLASS + or continuation.get("checkpoint_contract_sha256") + != EXPECTED_CHECKPOINT_CONTRACT + or continuation.get("second_runnable_copy_authorized") is not False + or _self_hash(amendment, "memory amendment") + != EXPECTED_MEMORY_AMENDMENT_RECEIPT_SHA256 + or amendment.get("job_id") != EXPECTED_JOB_ID + or amendment.get("continuation_receipt_file_sha256") + != EXPECTED_CONTINUATION_FILE_SHA256 + or amendment.get("continuation_receipt_sha256") + != EXPECTED_CONTINUATION_RECEIPT_SHA256 + or amendment.get("prior_min_memory_bytes") != 137_438_953_472 + or amendment.get("amended_min_memory_bytes") != 68_719_476_736 + or amendment.get("sbatch_source_modified") is not False + or amendment.get("second_runnable_copy_created") is not False + or amendment.get("checkpoint_or_scientific_state_changed") is not False + or _self_hash(applied, "memory applied receipt") + != EXPECTED_MEMORY_APPLIED_RECEIPT_SHA256 + or applied.get("job_id") != EXPECTED_JOB_ID + or applied.get("amendment_file_sha256") + != EXPECTED_MEMORY_AMENDMENT_FILE_SHA256 + or applied.get("amendment_receipt_sha256") + != EXPECTED_MEMORY_AMENDMENT_RECEIPT_SHA256 + or applied.get("prior_min_memory_bytes") != 137_438_953_472 + or applied.get("amended_min_memory_bytes") != 68_719_476_736 + or applied.get("action_applied") is not True + or applied.get("one_runnable_copy_only") is not True + or applied.get("checkpoint_or_scientific_state_changed") is not False + or applied.get("scheduler_readback", {}).get("requested_memory") != "64G" + ): + raise TerminalCertificationR4Error( + "continuation or memory-rightsizing lineage changed" + ) + return continuation, amendment, applied + + +def _reopen_embedded_capture( + binding: Any, *, label: str, maximum: int = 16 * 1024 * 1024 +) -> bytes: + if ( + not isinstance(binding, Mapping) + or set(binding) != _EMBEDDED_FILE_BINDING_KEYS + or type(binding.get("size_bytes")) is not int + or binding["size_bytes"] < 1 + ): + raise TerminalCertificationR4Error( + f"{label} embedded binding changed" + ) + raw, observed = _read_immutable( + Path(str(binding["absolute_path"])), + label=label, + expected_sha256=str(binding["file_sha256"]), + maximum=maximum, + ) + if len(raw) != binding["size_bytes"] or observed != binding["file_sha256"]: + raise TerminalCertificationR4Error(f"{label} readback changed") + return raw + + +def _parse_tres(value: str) -> dict[str, str]: + result: dict[str, str] = {} + for token in value.split(","): + if "=" not in token: + raise TerminalCertificationR4Error("AllocTRES is malformed") + key, item = token.split("=", 1) + if not key or not item or key in result: + raise TerminalCertificationR4Error("AllocTRES is ambiguous") + result[key] = item + return result + + +def _validate_scheduler_captures(scheduler: Mapping[str, Any]) -> None: + successor_argv = [ + "sacct", + "-n", + "-X", + "-P", + "-j", + EXPECTED_JOB_ID, + "--format=JobIDRaw,JobName,State,ExitCode,Partition,Account,QOS,ReqMem,AllocTRES,NodeList,Constraints", + ] + parent_argv = [ + "sacct", + "-n", + "-X", + "-P", + "-j", + PARENT_JOB_ID, + "--format=JobIDRaw,JobName,State,ExitCode,Partition,Account,QOS,ReqMem,AllocTRES,NodeList,Constraints", + ] + scontrol_argv = ["scontrol", "show", "job", "-dd", "-o", EXPECTED_JOB_ID] + if ( + scheduler.get("sacct_command_argv") != successor_argv + or scheduler.get("parent_sacct_command_argv") != parent_argv + or scheduler.get("scontrol_command_argv") != scontrol_argv + ): + raise TerminalCertificationR4Error( + "scheduler evidence command changed" + ) + sacct_raw = _reopen_embedded_capture( + scheduler.get("sacct_capture"), label="successor sacct capture" + ) + parent_raw = _reopen_embedded_capture( + scheduler.get("parent_sacct_capture"), label="parent sacct capture" + ) + scontrol_raw = _reopen_embedded_capture( + scheduler.get("scontrol_capture"), label="successor scontrol capture" + ) + try: + sacct_text = sacct_raw.decode("ascii") + parent_text = parent_raw.decode("ascii") + scontrol_text = scontrol_raw.decode("ascii") + except UnicodeDecodeError as error: + raise TerminalCertificationR4Error( + "scheduler evidence is not ASCII" + ) from error + rows = [ + line.split("|") for line in sacct_text.splitlines() if line.strip() + ] + parent_rows = [ + line.split("|") for line in parent_text.splitlines() if line.strip() + ] + if len(rows) != 1 or len(rows[0]) != 11: + raise TerminalCertificationR4Error( + "successor does not have exactly one allocation row" + ) + row = rows[0] + tres = _parse_tres(row[8]) + constraints = sorted( + token for token in row[10].replace(",", "&").split("&") if token + ) + if ( + row[:8] + != [ + EXPECTED_JOB_ID, + EXPECTED_JOB_NAME, + "COMPLETED", + "0:0", + "scavenger", + "ratul-scavenger", + "scavenger", + "64G", + ] + or tres.get("gres/gpu") != "1" + or tres.get("gres/gpu:v100") != "1" + or tres.get("node") != "1" + or tres.get("mem") != "64G" + or constraints != ["nova18", "v100"] + or len(parent_rows) != 1 + or len(parent_rows[0]) != 11 + or parent_rows[0][0] != PARENT_JOB_ID + or parent_rows[0][1] != EXPECTED_JOB_NAME + or not parent_rows[0][2].startswith("CANCELLED") + or f"JobId={EXPECTED_JOB_ID}" not in scontrol_text + or "ReqTRES=" not in scontrol_text + or "gres/gpu=1" not in scontrol_text + or "gres/gpu:v100=1" not in scontrol_text + or "MinMemoryNode=64G" not in scontrol_text + ): + raise TerminalCertificationR4Error( + "scheduler allocation/cancellation proof changed" + ) + if ( + hashlib.sha256(sacct_raw).hexdigest() + != scheduler.get("sacct_stdout_sha256") + or hashlib.sha256(scontrol_raw).hexdigest() + != scheduler.get("scontrol_stdout_sha256") + ): + raise TerminalCertificationR4Error( + "scheduler raw capture hashes changed" + ) + + +def _validate_terminal_evidence( + path: Path, +) -> tuple[dict[str, Any], str]: + value, file_sha = _canonical_file(path, label="terminal evidence") + receipt_sha = _self_hash(value, "terminal evidence") + scheduler = value.get("scheduler") + checkpoint = value.get("terminal_checkpoint") + if ( + set(value) != _TERMINAL_EVIDENCE_KEYS + or value.get("schema") != TERMINAL_EVIDENCE_SCHEMA + or value.get("status") != TERMINAL_EVIDENCE_STATUS + or not isinstance(scheduler, Mapping) + or set(scheduler) != _SCHEDULER_KEYS + or scheduler.get("job_id") != EXPECTED_JOB_ID + or scheduler.get("job_name") != EXPECTED_JOB_NAME + or scheduler.get("state") != "COMPLETED" + or scheduler.get("exit_code") != "0:0" + or scheduler.get("allocation_count") != 1 + or scheduler.get("partition") != "scavenger" + or scheduler.get("account") != "ratul-scavenger" + or scheduler.get("qos") != "scavenger" + or scheduler.get("constraint_tokens") != ["nova18", "v100"] + or scheduler.get("requested_gres") != "gpu:1" + or scheduler.get("requested_memory") != "64G" + or scheduler.get("allocated_node_count") != 1 + or scheduler.get("allocated_gpu_count") != 1 + or scheduler.get("allocated_gpu_type") != "v100" + or scheduler.get("alloc_tres") + != {"gpu": 1, "gpu_type": "v100", "node": 1} + or scheduler.get("stderr_size_bytes") != 0 + or scheduler.get("stderr_sha256") != EMPTY_SHA256 + or value.get("checkpoint_cadence") + != "startup_then_completed_epoch_and_terminal_only" + or value.get("official_submitted_artifacts_modified") is not False + or value.get("ablation_or_downstream_opened") is not False + or not isinstance(checkpoint, Mapping) + or set(checkpoint) != _TERMINAL_CHECKPOINT_KEYS + or checkpoint.get("contract_sha256") != EXPECTED_CHECKPOINT_CONTRACT + or checkpoint.get("phase") != "epoch_group_boundary" + or checkpoint.get("group_cursor") != 0 + or checkpoint.get("micro_pack_cursor") != 0 + or checkpoint.get("epoch_group_plan_sha256") != ZERO_SHA256 + or checkpoint.get("epoch_successful_group_steps") != 0 + or checkpoint.get("planned_group_count") != 0 + or checkpoint.get("ordered_group_binding_sha256") != [] + or checkpoint.get("terminal_status") + not in {"EARLY_STOPPED_WITH_CANDIDATE", "MAX_EPOCHS_WITH_CANDIDATE"} + or type(checkpoint.get("checkpoint_ordinal")) is not int + or checkpoint["checkpoint_ordinal"] <= 28_363 + or type(checkpoint.get("epoch_index")) is not int + or checkpoint["epoch_index"] < 13 + ): + raise TerminalCertificationR4Error( + "terminal scheduler/checkpoint evidence changed" + ) + for field in ( + "sacct_stdout_sha256", + "scontrol_stdout_sha256", + ): + _sha(scheduler.get(field), f"terminal scheduler {field}") + for field in ( + "head_file_sha256", + "receipt_file_sha256", + "payload_file_sha256", + "checkpoint_semantic_sha256", + ): + _sha(checkpoint.get(field), f"terminal checkpoint {field}") + _validate_scheduler_captures(scheduler) + return value, file_sha + + +def _reopen_production_documents( + terminal_evidence: Mapping[str, Any], +) -> tuple[Any, Mapping[str, Any], Mapping[str, Any]]: + runtime_r6, _handoff_r6, _direct_r2 = _dependencies() + slots = terminal_evidence.get("production_documents") + if not isinstance(slots, Mapping) or set(slots) != _PRODUCTION_DOCUMENT_KEYS: + raise TerminalCertificationR4Error( + "terminal production-document bindings changed" + ) + paths: dict[str, Path] = {} + for label in sorted(_PRODUCTION_DOCUMENT_KEYS): + binding = slots[label] + raw = _reopen_embedded_capture( + binding, label=f"production {label}", maximum=64 * 1024 * 1024 + ) + value = _canonical_raw(raw, f"production {label}") + _self_hash( + value, + ( + f"production {label}" + if "bundle_payload_sha256" not in value + and "authority_payload_sha256" not in value + else f"production {label}" + ), + ) if "receipt_sha256" in value else None + paths[label] = Path(str(binding["absolute_path"])) + previous = os.environ.get("SLURM_JOB_ID") + os.environ["SLURM_JOB_ID"] = PARENT_JOB_ID + try: + documents, bundle, _authority, submission = ( + runtime_r6._authorized_runtime_documents( + execution_bundle_path=paths["execution_bundle"], + owner_authority_path=paths["owner_authority"], + action="fit", + submission_receipt_path=paths["submission_receipt"], + ) + ) + except Exception as error: + raise TerminalCertificationR4Error( + "active production documents did not reconstruct" + ) from error + finally: + if previous is None: + os.environ.pop("SLURM_JOB_ID", None) + else: + os.environ["SLURM_JOB_ID"] = previous + if submission is None: + raise TerminalCertificationR4Error( + "production submission binding is absent" + ) + return documents, bundle.value, submission.value + + +def _validate_r6_result_and_handoff( + *, + full_fit_result_path: Path, + selected_handoff_path: Path, +) -> tuple[dict[str, Any], str, dict[str, Any], str]: + runtime_r6, handoff_r6, _direct_r2 = _dependencies() + result, result_file_sha = _canonical_file( + full_fit_result_path, label="R6 full-fit result" + ) + selected, selected_file_sha = _canonical_file( + selected_handoff_path, label="R6 selected-best handoff" + ) + try: + result = runtime_r6._validate_full_fit_result_structure(result) + selected = handoff_r6._validate_selected_best_handoff_structure(selected) + except Exception as error: + raise TerminalCertificationR4Error( + "exact production R6 result/handoff validation failed" + ) from error + if ( + selected.get("full_fit_result_file_sha256") != result_file_sha + or selected.get("full_fit_result_receipt_sha256") + != result.get("receipt_sha256") + or selected.get("selected_best_handoff_absolute_path") + != os.fspath(Path(selected_handoff_path)) + or selected.get("selected_best_checkpoint_semantic_sha256") + != result.get("selected_restore_receipt", {}).get( + "selected_best_checkpoint_semantic_sha256" + ) + ): + raise TerminalCertificationR4Error( + "R6 result and selected handoff are not the same terminal fit" + ) + return result, result_file_sha, selected, selected_file_sha + + +def _replay_terminal_checkpoint( + *, + result: Mapping[str, Any], + selected: Mapping[str, Any], + terminal_evidence: Mapping[str, Any], +) -> dict[str, Any]: + runtime_r6, _handoff_r6, _direct_r2 = _dependencies() + root = Path(str(selected["checkpoint_root_absolute_path"])).absolute() + latest = root / "latest" + head_raw, head_sha = _read_immutable( + latest / "head.json", + label="terminal latest head", + require_review_name=False, + maximum=1024 * 1024, + ) + head = _canonical_raw(head_raw, "terminal latest head") + receipt_name = str(head.get("receipt_filename", "")) + payload_name = str(head.get("payload_filename", "")) + if ( + Path(receipt_name).name != receipt_name + or Path(payload_name).name != payload_name + or not receipt_name + or not payload_name + ): + raise TerminalCertificationR4Error( + "terminal checkpoint object names changed" + ) + receipt_raw, receipt_file_sha = _read_immutable( + latest / receipt_name, + label="terminal latest receipt", + require_review_name=False, + maximum=4 * 1024 * 1024, + ) + payload_raw, payload_file_sha = _read_immutable( + latest / payload_name, + label="terminal latest payload", + require_review_name=False, + maximum=4 * 1024 * 1024 * 1024, + ) + receipt = _canonical_raw(receipt_raw, "terminal latest receipt") + try: + checkpoint = runtime_r6.checkpoint_store_r2._torch_load(payload_raw) + runtime_r6.checkpoint_store_r2.validate_checkpoint(checkpoint) + semantic = runtime_r6.checkpoint_store_r2.semantic_tree_sha256( + checkpoint + ) + except Exception as error: + raise TerminalCertificationR4Error( + "terminal checkpoint payload validation failed" + ) from error + state = checkpoint.get("training_state") + evidence = terminal_evidence["terminal_checkpoint"] + if ( + not isinstance(state, Mapping) + or head_sha != evidence["head_file_sha256"] + or receipt_file_sha != evidence["receipt_file_sha256"] + or payload_file_sha != evidence["payload_file_sha256"] + or head.get("receipt_sha256") != receipt_file_sha + or head.get("payload_sha256") != payload_file_sha + or receipt.get("payload_sha256") != payload_file_sha + or receipt.get("payload_size_bytes") != len(payload_raw) + or receipt.get("contract_sha256") != EXPECTED_CHECKPOINT_CONTRACT + or receipt.get("checkpoint_semantic_sha256") != semantic + or semantic != evidence["checkpoint_semantic_sha256"] + or head.get("ordinal") != evidence["checkpoint_ordinal"] + or receipt.get("ordinal") != evidence["checkpoint_ordinal"] + or state.get("epoch_index") != evidence["epoch_index"] + or receipt.get("epoch_index") != evidence["epoch_index"] + or state.get("phase") != evidence["phase"] + or receipt.get("phase") != evidence["phase"] + or state.get("group_cursor") != 0 + or state.get("micro_pack_cursor") != 0 + or state.get("epoch_group_plan_sha256") != ZERO_SHA256 + or state.get("epoch_successful_group_steps") != 0 + or state.get("planned_group_count") != 0 + or state.get("ordered_group_binding_sha256") != () + or state.get("terminal_status") != evidence["terminal_status"] + or result.get("terminal_status") != evidence["terminal_status"] + or result.get("terminal_epoch_index") != evidence["epoch_index"] + or selected.get("independent_checkpoint_latest_semantic_sha256") + != semantic + ): + raise TerminalCertificationR4Error( + "terminal latest checkpoint replay changed" + ) + return checkpoint + + +def _open_directory_nofollow(path: Path, label: str) -> int: + supplied = Path(path) + absolute = supplied.absolute() + if ( + supplied != absolute + or not hasattr(os, "O_NOFOLLOW") + or not hasattr(os, "O_DIRECTORY") + ): + raise TerminalCertificationR4Error(f"{label} path is unsafe") + flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + descriptor = os.open(os.sep, flags) + try: + for component in absolute.parts[1:]: + child = os.open(component, flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + return descriptor + except OSError as error: + os.close(descriptor) + raise TerminalCertificationR4Error( + f"{label} has a missing/symlinked component" + ) from error + + +def _replay_cuda_attempt_chain( + *, + result: Mapping[str, Any], + selected: Mapping[str, Any], + checkpoint: Mapping[str, Any], + production_context: tuple[Any, Mapping[str, Any], Mapping[str, Any]], +) -> dict[str, Any]: + runtime_r6, _handoff_r6, _direct_r2 = _dependencies() + audit = result["cuda_attempt_ledger_audit_receipt"] + root = Path(str(audit["directory_absolute_path"])).absolute() + count = audit["committed_entry_count"] + descriptor = _open_directory_nofollow(root, "CUDA attempt ledger") + try: + names = sorted(os.listdir(descriptor)) + finally: + os.close(descriptor) + expected_names = [ + f"review_a5_static_v2_cuda_attempt_{index:03d}_r6.json" + for index in range(count) + ] + if ( + type(count) is not int + or count < 2 + or names != expected_names + or audit.get("physical_entry_count") != count + or audit.get("pending_next_entry") is not False + ): + raise TerminalCertificationR4Error( + "CUDA attempt ledger membership changed" + ) + previous_head = ZERO_SHA256 + previous_root = ZERO_SHA256 + entry_receipts: list[str] = [] + terminal_live = result["live_cuda_observation_receipt"] + documents, execution_bundle, submission_receipt = production_context + stable_live_fields = ( + "observed_exact_accelerator_model_name", + "observed_exact_compute_capability", + "observed_exact_user_space_software", + "resolved_resume_device_class", + "resume_device_class_sha256", + "cross_class_exact_resume_authorized", + "exact_resume_requires_same_resume_device_class_sha256", + ) + for index, name in enumerate(names): + entry, _ = _canonical_file( + root / name, label=f"CUDA attempt {index}" + ) + expected_keys = { + "schema", + "attempt_index", + "scheduler_job_id", + "slurm_restart_count", + "live_cuda_observation_receipt", + "live_cuda_observation_receipt_sha256", + "resume_device_class_sha256", + "predecessor_entry_sha256", + "predecessor_root_sha256", + "authorization", + "entry_content_sha256", + "root_sha256", + "receipt_sha256", + } + live = entry.get("live_cuda_observation_receipt") + if not isinstance(live, Mapping): + raise TerminalCertificationR4Error( + "CUDA attempt live receipt is absent" + ) + live_sha = _self_hash(live, f"CUDA attempt {index} live receipt") + try: + validated_live = runtime_r6._validate_live_cuda_observation_receipt( + documents=documents, + execution_bundle=execution_bundle, + submission_receipt=submission_receipt, + receipt=live, + ) + except Exception as error: + raise TerminalCertificationR4Error( + f"CUDA attempt {index} live device proof did not reconstruct" + ) from error + entry_sha = _self_hash(entry, f"CUDA attempt {index}") + content = { + key: entry[key] + for key in expected_keys + if key + not in {"entry_content_sha256", "root_sha256", "receipt_sha256"} + } + content_sha = sha256_json(content) + root_sha = sha256_json( + { + "schema": ( + "bertose_a5_static_v2_cuda_attempt_root_step_20260722_r6" + ), + "predecessor_root_sha256": previous_root, + "entry_content_sha256": content_sha, + } + ) + expected_job = PARENT_JOB_ID if index == 0 else EXPECTED_JOB_ID + expected_restart = 0 if index == 0 else index - 1 + if ( + set(entry) != expected_keys + or entry.get("schema") + != runtime_r6.CUDA_ATTEMPT_LEDGER_ENTRY_SCHEMA + or entry.get("attempt_index") != index + or entry.get("scheduler_job_id") != expected_job + or entry.get("slurm_restart_count") != expected_restart + or entry.get("predecessor_entry_sha256") != previous_head + or entry.get("predecessor_root_sha256") != previous_root + or entry.get("live_cuda_observation_receipt_sha256") != live_sha + or entry.get("resume_device_class_sha256") + != EXPECTED_RESUME_CLASS + or live.get("resume_device_class_sha256") != EXPECTED_RESUME_CLASS + or live.get("submission_receipt_sha256") + != EXPECTED_SUBMISSION_PAYLOAD_SHA256 + or any( + live.get(field) != terminal_live.get(field) + for field in stable_live_fields + ) + or validated_live != dict(live) + or entry.get("entry_content_sha256") != content_sha + or entry.get("root_sha256") != root_sha + or entry.get("authorization") != runtime_r6.closed_authorization() + ): + raise TerminalCertificationR4Error( + "CUDA attempt chain replay changed" + ) + previous_head, previous_root = entry_sha, root_sha + entry_receipts.append(entry_sha) + state = checkpoint["training_state"] + selected_binding = selected["terminal_cuda_attempt_ledger_binding"] + if ( + audit.get("entry_receipt_sha256") != entry_receipts + or audit.get("committed_head_sha256") != previous_head + or audit.get("committed_root_sha256") != previous_root + or audit.get("resume_device_class_sha256") != EXPECTED_RESUME_CLASS + or selected.get("terminal_cuda_attempt_entry_receipt_sha256") + != entry_receipts + or selected_binding + != {"count": count, "head_sha256": previous_head, "root_sha256": previous_root} + or state.get("cuda_attempt_ledger_count") != count + or state.get("cuda_attempt_ledger_head_sha256") != previous_head + or state.get("cuda_attempt_ledger_root_sha256") != previous_root + ): + raise TerminalCertificationR4Error( + "CUDA attempt ledger terminal binding changed" + ) + return dict(audit) + + +def _replay_scientific_ledger( + *, + result: Mapping[str, Any], + selected: Mapping[str, Any], + checkpoint: Mapping[str, Any], +) -> dict[str, Any]: + _runtime_r6, handoff_r6, _direct_r2 = _dependencies() + terminal_count = result["terminal_epoch_index"] + selected_count = selected["selected_best_epoch_index"] + 1 + epoch_adapter = checkpoint["binding"][ + "production_epoch_adapter_receipt_sha256" + ] + try: + replay = dict( + handoff_r6._independent_ledger_audit( + directory=Path( + str(selected["scientific_ledger_directory_absolute_path"]) + ), + expected_count=terminal_count, + selected_count=selected_count, + epoch_adapter_receipt_sha256=epoch_adapter, + ) + ) + except Exception as error: + raise TerminalCertificationR4Error( + "scientific ledger independent replay failed" + ) from error + if ( + replay != selected.get("independent_scientific_ledger_audit") + or replay.get("receipt_sha256") + != selected.get("independent_scientific_ledger_audit_sha256") + or replay.get("committed_head_sha256") + != checkpoint["training_state"].get( + "scientific_ledger_head_sha256" + ) + or replay.get("committed_root_sha256") + != checkpoint["training_state"].get( + "scientific_ledger_root_sha256" + ) + ): + raise TerminalCertificationR4Error( + "scientific ledger replay differs from terminal checkpoint" + ) + return replay + + +def _validate_r2_result_and_publication( + *, + result_path: Path, + publication_path: Path, + selected: Mapping[str, Any], +) -> tuple[dict[str, Any], str, dict[str, Any], str]: + _runtime_r6, _handoff_r6, direct_r2 = _dependencies() + result, result_file_sha = _canonical_file( + result_path, label="persisted R2 direct result" + ) + publication, publication_file_sha = _canonical_file( + publication_path, label="R2 direct publication" + ) + result_receipt = _self_hash(result, "persisted R2 direct result") + publication_receipt = _self_hash(publication, "R2 direct publication") + if ( + set(result) != _R2_RESULT_KEYS + or result.get("schema") != direct_r2.SCHEMA + or result.get("status") + != "PASS_DIRECT_FULL_DEVELOPMENT_STATIC_PACKAGE_PUBLISHED" + or result.get("native_ablation_data_binding_authorized") is not False + or result.get("nova_submission_authorized") is not False + or result.get("official_submitted_artifacts_modified") is not False + or result.get("authorization") != direct_r2.closed_launch_authorization() + or set(publication) != direct_r2._publication_receipt_keys() + or publication.get("schema") != direct_r2.PUBLICATION_SCHEMA + or publication.get("status") + != "PASS_DIRECT_FULL_DEVELOPMENT_STATIC_PUBLICATION_READBACK" + or publication.get("production_mode") is not True + or publication.get("selected_handoff_file_sha256") + != selected.get("_certified_file_sha256") + or publication.get("selected_handoff_receipt_sha256") + != selected.get("receipt_sha256") + or publication.get("export_receipt", {}).get( + "selected_checkpoint_semantic_sha256" + ) + != selected.get("selected_best_checkpoint_semantic_sha256") + or result.get("selected_checkpoint_semantic_sha256") + != selected.get("selected_best_checkpoint_semantic_sha256") + or result.get("publication_receipt_sha256") != publication_receipt + ): + raise TerminalCertificationR4Error( + "R2 result/publication is not exact production output" + ) + result["_certified_file_sha256"] = result_file_sha + result["_certified_receipt_sha256"] = result_receipt + publication["_certified_file_sha256"] = publication_file_sha + publication["_certified_receipt_sha256"] = publication_receipt + return result, result_file_sha, publication, publication_file_sha + + +def _artifact_binding( + path: Path, value: Mapping[str, Any], file_sha256: str +) -> dict[str, Any]: + raw = canonical_bytes(dict(value)) + return { + "absolute_path": os.fspath(Path(path)), + "file_sha256": file_sha256, + "size_bytes": len(raw), + "receipt_sha256": _self_hash(value, Path(path).name), + } + + +def _publish_exclusive(path: Path, value: Mapping[str, Any]) -> None: + absolute = Path(path) + if ( + absolute != absolute.absolute() + or not absolute.name.startswith("review_") + or not absolute.parent.is_dir() + or not hasattr(os, "O_NOFOLLOW") + ): + raise TerminalCertificationR4Error("R4 output path is unsafe") + raw = canonical_bytes(dict(value)) + flags = ( + os.O_WRONLY + | os.O_CREAT + | os.O_EXCL + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + descriptor: int | None = None + try: + descriptor = os.open(absolute, flags, 0o600) + offset = 0 + while offset < len(raw): + written = os.write(descriptor, raw[offset:]) + if written <= 0: + raise OSError("short write") + offset += written + os.fsync(descriptor) + os.fchmod(descriptor, 0o400) + os.fsync(descriptor) + except OSError as error: + raise TerminalCertificationR4Error( + f"{absolute.name} exclusive publication failed" + ) from error + finally: + if descriptor is not None: + os.close(descriptor) + reopened, _ = _read_immutable( + absolute, + label=absolute.name, + expected_sha256=hashlib.sha256(raw).hexdigest(), + maximum=len(raw), + ) + if reopened != raw: + raise TerminalCertificationR4Error( + f"{absolute.name} publication readback changed" + ) + + +def _validate_terminal_inputs( + *, + terminal_evidence_path: Path, + continuation_path: Path, + memory_amendment_path: Path, + memory_applied_path: Path, + full_fit_result_path: Path, + selected_handoff_path: Path, +) -> dict[str, Any]: + _dependencies() + continuation, amendment, applied = _validate_continuation_and_memory( + continuation_path=continuation_path, + memory_amendment_path=memory_amendment_path, + memory_applied_path=memory_applied_path, + ) + terminal_evidence, evidence_file_sha = _validate_terminal_evidence( + terminal_evidence_path + ) + production_context = _reopen_production_documents(terminal_evidence) + result, result_file_sha, selected, selected_file_sha = ( + _validate_r6_result_and_handoff( + full_fit_result_path=full_fit_result_path, + selected_handoff_path=selected_handoff_path, + ) + ) + selected["_certified_file_sha256"] = selected_file_sha + checkpoint = _replay_terminal_checkpoint( + result=result, + selected=selected, + terminal_evidence=terminal_evidence, + ) + _replay_cuda_attempt_chain( + result=result, + selected=selected, + checkpoint=checkpoint, + production_context=production_context, + ) + _replay_scientific_ledger( + result=result, + selected=selected, + checkpoint=checkpoint, + ) + return { + "terminal_evidence": terminal_evidence, + "terminal_evidence_file_sha256": evidence_file_sha, + "continuation": continuation, + "memory_amendment": amendment, + "memory_applied": applied, + "result": result, + "result_file_sha256": result_file_sha, + "selected": selected, + "selected_file_sha256": selected_file_sha, + } + + +def _validate_binding_value( + *, + binding: Mapping[str, Any], + binding_file_sha256: str, + artifacts: Mapping[str, Any], + direct_result: Mapping[str, Any], + direct_result_file_sha256: str, + direct_publication: Mapping[str, Any], + direct_publication_file_sha256: str, +) -> dict[str, Any]: + _runtime_r6, _handoff_r6, direct_r2 = _dependencies() + value = dict(binding) + receipt = _self_hash(value, "R4 terminal certification binding") + bound = value.get("bound_artifacts") + if ( + set(value) != _BINDING_KEYS + or value.get("schema") != BINDING_SCHEMA + or value.get("status") != BINDING_STATUS + or value.get("successor_job_id") != EXPECTED_JOB_ID + or not isinstance(bound, Mapping) + or set(bound) != _BOUND_ARTIFACT_KEYS + or any( + not isinstance(item, Mapping) + or set(item) != _ARTIFACT_BINDING_KEYS + for item in bound.values() + ) + or value.get("terminal_evidence_file_sha256") + != artifacts["terminal_evidence_file_sha256"] + or value.get("terminal_evidence_receipt_sha256") + != artifacts["terminal_evidence"]["receipt_sha256"] + or value.get("continuation_file_sha256") + != EXPECTED_CONTINUATION_FILE_SHA256 + or value.get("continuation_receipt_sha256") + != EXPECTED_CONTINUATION_RECEIPT_SHA256 + or value.get("memory_amendment_file_sha256") + != EXPECTED_MEMORY_AMENDMENT_FILE_SHA256 + or value.get("memory_amendment_receipt_sha256") + != EXPECTED_MEMORY_AMENDMENT_RECEIPT_SHA256 + or value.get("memory_applied_file_sha256") + != EXPECTED_MEMORY_APPLIED_FILE_SHA256 + or value.get("memory_applied_receipt_sha256") + != EXPECTED_MEMORY_APPLIED_RECEIPT_SHA256 + or value.get("r6_runtime_source_sha256") + != EXPECTED_R6_RUNTIME_SHA256 + or value.get("r6_handoff_source_sha256") + != EXPECTED_R6_HANDOFF_SHA256 + or value.get("r2_direct_source_sha256") + != EXPECTED_R2_SOURCE_SHA256 + or value.get("full_fit_result_file_sha256") + != artifacts["result_file_sha256"] + or value.get("full_fit_result_receipt_sha256") + != artifacts["result"]["receipt_sha256"] + or value.get("selected_handoff_file_sha256") + != artifacts["selected_file_sha256"] + or value.get("selected_handoff_receipt_sha256") + != artifacts["selected"]["receipt_sha256"] + or value.get("selected_checkpoint_semantic_sha256") + != artifacts["selected"]["selected_best_checkpoint_semantic_sha256"] + or value.get("direct_publication_file_sha256") + != direct_publication_file_sha256 + or value.get("direct_publication_receipt_sha256") + != direct_publication["_certified_receipt_sha256"] + or value.get("persisted_r2_result_file_sha256") + != direct_result_file_sha256 + or value.get("persisted_r2_result_receipt_sha256") + != direct_result["_certified_receipt_sha256"] + or value.get( + "terminal_continuation_required_for_native_eight_release" + ) + is not True + or value.get("native_ablation_data_binding_authorized") is not False + or value.get("nova_submission_authorized") is not False + or value.get("official_submitted_artifacts_modified") is not False + or value.get("authorization") != direct_r2.closed_launch_authorization() + ): + raise TerminalCertificationR4Error( + "R4 terminal certification outer binding changed" + ) + value["_validated_binding_file_sha256"] = binding_file_sha256 + value["_validated_binding_receipt_sha256"] = receipt + return value + + +def validate_terminal_publication_binding( + *, + binding_path: Path, + expected_binding_file_sha256: str, + terminal_evidence_path: Path, + continuation_path: Path, + memory_amendment_path: Path, + memory_applied_path: Path, + full_fit_result_path: Path, + selected_handoff_path: Path, + direct_publication_path: Path, + persisted_r2_result_path: Path, +) -> dict[str, Any]: + """Reopen all terminal inputs and return one validated outer binding.""" + + binding, binding_file_sha = _canonical_file( + binding_path, + label="R4 terminal certification binding", + expected_sha256=expected_binding_file_sha256, + ) + artifacts = _validate_terminal_inputs( + terminal_evidence_path=terminal_evidence_path, + continuation_path=continuation_path, + memory_amendment_path=memory_amendment_path, + memory_applied_path=memory_applied_path, + full_fit_result_path=full_fit_result_path, + selected_handoff_path=selected_handoff_path, + ) + direct_result, direct_result_file_sha, publication, publication_file_sha = ( + _validate_r2_result_and_publication( + result_path=persisted_r2_result_path, + publication_path=direct_publication_path, + selected=artifacts["selected"], + ) + ) + expected_paths = { + "terminal_evidence": terminal_evidence_path, + "continuation": continuation_path, + "memory_amendment": memory_amendment_path, + "memory_applied": memory_applied_path, + "full_fit_result": full_fit_result_path, + "selected_handoff": selected_handoff_path, + "direct_publication": direct_publication_path, + "persisted_r2_result": persisted_r2_result_path, + } + expected_files = { + "terminal_evidence": artifacts["terminal_evidence_file_sha256"], + "continuation": EXPECTED_CONTINUATION_FILE_SHA256, + "memory_amendment": EXPECTED_MEMORY_AMENDMENT_FILE_SHA256, + "memory_applied": EXPECTED_MEMORY_APPLIED_FILE_SHA256, + "full_fit_result": artifacts["result_file_sha256"], + "selected_handoff": artifacts["selected_file_sha256"], + "direct_publication": publication_file_sha, + "persisted_r2_result": direct_result_file_sha, + } + expected_receipts = { + "terminal_evidence": artifacts["terminal_evidence"]["receipt_sha256"], + "continuation": EXPECTED_CONTINUATION_RECEIPT_SHA256, + "memory_amendment": EXPECTED_MEMORY_AMENDMENT_RECEIPT_SHA256, + "memory_applied": EXPECTED_MEMORY_APPLIED_RECEIPT_SHA256, + "full_fit_result": artifacts["result"]["receipt_sha256"], + "selected_handoff": artifacts["selected"]["receipt_sha256"], + "direct_publication": publication["_certified_receipt_sha256"], + "persisted_r2_result": direct_result["_certified_receipt_sha256"], + } + for name, item in binding["bound_artifacts"].items(): + if ( + item["absolute_path"] != os.fspath(Path(expected_paths[name])) + or item["file_sha256"] != expected_files[name] + or item["receipt_sha256"] != expected_receipts[name] + or item["size_bytes"] + != Path(expected_paths[name]).stat().st_size + ): + raise TerminalCertificationR4Error( + f"R4 bound artifact {name} changed" + ) + return _validate_binding_value( + binding=binding, + binding_file_sha256=binding_file_sha, + artifacts=artifacts, + direct_result=direct_result, + direct_result_file_sha256=direct_result_file_sha, + direct_publication=publication, + direct_publication_file_sha256=publication_file_sha, + ) + + +def validate_release_binding( + binding_path: Path, + expected_sha256: str, + expected_size_bytes: int, +) -> dict[str, Any]: + """Strict three-argument adapter for the native-eight release builder.""" + + binding, observed = _canonical_file( + binding_path, + label="R4 native-eight terminal binding", + expected_sha256=expected_sha256, + ) + if ( + type(expected_size_bytes) is not int + or expected_size_bytes < 1 + or Path(binding_path).stat().st_size != expected_size_bytes + or observed != expected_sha256 + or not isinstance(binding.get("bound_artifacts"), Mapping) + ): + raise TerminalCertificationR4Error( + "R4 native-eight terminal binding pin changed" + ) + paths = { + name: Path(str(value.get("absolute_path", ""))) + for name, value in binding["bound_artifacts"].items() + if isinstance(value, Mapping) + } + if set(paths) != _BOUND_ARTIFACT_KEYS: + raise TerminalCertificationR4Error( + "R4 native-eight artifact path roster changed" + ) + return validate_terminal_publication_binding( + binding_path=Path(binding_path), + expected_binding_file_sha256=expected_sha256, + terminal_evidence_path=paths["terminal_evidence"], + continuation_path=paths["continuation"], + memory_amendment_path=paths["memory_amendment"], + memory_applied_path=paths["memory_applied"], + full_fit_result_path=paths["full_fit_result"], + selected_handoff_path=paths["selected_handoff"], + direct_publication_path=paths["direct_publication"], + persisted_r2_result_path=paths["persisted_r2_result"], + ) + + +def _bound_path( + path: Path, *, file_sha256: str, receipt_sha256: str +) -> dict[str, Any]: + return { + "absolute_path": os.fspath(Path(path)), + "file_sha256": file_sha256, + "size_bytes": Path(path).stat().st_size, + "receipt_sha256": receipt_sha256, + } + + +def run_certified_direct_postfit( + *, + terminal_evidence_path: Path, + continuation_path: Path, + memory_amendment_path: Path, + memory_applied_path: Path, + full_fit_result_path: Path, + selected_handoff_path: Path, + persisted_r2_result_path: Path, + binding_output_path: Path, + r2_arguments: Mapping[str, Any], +) -> dict[str, Any]: + """Run only frozen R2 after full terminal validation and bind its outputs.""" + + artifacts = _validate_terminal_inputs( + terminal_evidence_path=terminal_evidence_path, + continuation_path=continuation_path, + memory_amendment_path=memory_amendment_path, + memory_applied_path=memory_applied_path, + full_fit_result_path=full_fit_result_path, + selected_handoff_path=selected_handoff_path, + ) + _runtime_r6, _handoff_r6, direct_r2 = _dependencies() + arguments = dict(r2_arguments) + expected_arguments = set( + inspect.signature(direct_r2.run_direct_postfit).parameters + ) + output_directory = Path(str(arguments.get("output_directory", ""))) + handoff_path = Path(str(arguments.get("handoff_path", ""))) + publication_path = ( + output_directory / direct_r2.writer.RECEIPT_FILENAME + ) + if ( + set(arguments) != expected_arguments + or handoff_path != Path(selected_handoff_path) + or arguments.get("expected_handoff_file_sha256") + != artifacts["selected_file_sha256"] + or Path(persisted_r2_result_path).parent != output_directory + or Path(binding_output_path).parent != output_directory + or Path(persisted_r2_result_path).name + != "review_a5_static_v2_postfit_direct_result_r4.json" + or Path(binding_output_path).name + != "review_a5_static_v2_postfit_terminal_certification_binding_r4.json" + or os.path.lexists(persisted_r2_result_path) + or os.path.lexists(binding_output_path) + ): + raise TerminalCertificationR4Error( + "R2 direct call/output contract changed" + ) + try: + produced = dict(direct_r2.run_direct_postfit(**arguments)) + except Exception as error: + raise TerminalCertificationR4Error( + "frozen R2 direct postfit failed" + ) from error + produced_receipt = _self_hash(produced, "R2 direct result") + if ( + set(produced) != _R2_RESULT_KEYS + or produced.get("schema") != direct_r2.SCHEMA + or produced.get("status") + != "PASS_DIRECT_FULL_DEVELOPMENT_STATIC_PACKAGE_PUBLISHED" + ): + raise TerminalCertificationR4Error( + "frozen R2 returned a non-production result" + ) + _publish_exclusive(persisted_r2_result_path, produced) + direct_result, direct_result_file_sha, publication, publication_file_sha = ( + _validate_r2_result_and_publication( + result_path=persisted_r2_result_path, + publication_path=publication_path, + selected=artifacts["selected"], + ) + ) + bound = { + "terminal_evidence": _bound_path( + terminal_evidence_path, + file_sha256=artifacts["terminal_evidence_file_sha256"], + receipt_sha256=artifacts["terminal_evidence"]["receipt_sha256"], + ), + "continuation": _bound_path( + continuation_path, + file_sha256=EXPECTED_CONTINUATION_FILE_SHA256, + receipt_sha256=EXPECTED_CONTINUATION_RECEIPT_SHA256, + ), + "memory_amendment": _bound_path( + memory_amendment_path, + file_sha256=EXPECTED_MEMORY_AMENDMENT_FILE_SHA256, + receipt_sha256=EXPECTED_MEMORY_AMENDMENT_RECEIPT_SHA256, + ), + "memory_applied": _bound_path( + memory_applied_path, + file_sha256=EXPECTED_MEMORY_APPLIED_FILE_SHA256, + receipt_sha256=EXPECTED_MEMORY_APPLIED_RECEIPT_SHA256, + ), + "full_fit_result": _bound_path( + full_fit_result_path, + file_sha256=artifacts["result_file_sha256"], + receipt_sha256=artifacts["result"]["receipt_sha256"], + ), + "selected_handoff": _bound_path( + selected_handoff_path, + file_sha256=artifacts["selected_file_sha256"], + receipt_sha256=artifacts["selected"]["receipt_sha256"], + ), + "direct_publication": _bound_path( + publication_path, + file_sha256=publication_file_sha, + receipt_sha256=publication["_certified_receipt_sha256"], + ), + "persisted_r2_result": _bound_path( + persisted_r2_result_path, + file_sha256=direct_result_file_sha, + receipt_sha256=direct_result["_certified_receipt_sha256"], + ), + } + value: dict[str, Any] = { + "schema": BINDING_SCHEMA, + "status": BINDING_STATUS, + "successor_job_id": EXPECTED_JOB_ID, + "bound_artifacts": bound, + "terminal_evidence_file_sha256": artifacts[ + "terminal_evidence_file_sha256" + ], + "terminal_evidence_receipt_sha256": artifacts["terminal_evidence"][ + "receipt_sha256" + ], + "continuation_file_sha256": EXPECTED_CONTINUATION_FILE_SHA256, + "continuation_receipt_sha256": EXPECTED_CONTINUATION_RECEIPT_SHA256, + "memory_amendment_file_sha256": ( + EXPECTED_MEMORY_AMENDMENT_FILE_SHA256 + ), + "memory_amendment_receipt_sha256": ( + EXPECTED_MEMORY_AMENDMENT_RECEIPT_SHA256 + ), + "memory_applied_file_sha256": EXPECTED_MEMORY_APPLIED_FILE_SHA256, + "memory_applied_receipt_sha256": ( + EXPECTED_MEMORY_APPLIED_RECEIPT_SHA256 + ), + "r6_runtime_source_sha256": EXPECTED_R6_RUNTIME_SHA256, + "r6_handoff_source_sha256": EXPECTED_R6_HANDOFF_SHA256, + "r2_direct_source_sha256": EXPECTED_R2_SOURCE_SHA256, + "full_fit_result_file_sha256": artifacts["result_file_sha256"], + "full_fit_result_receipt_sha256": artifacts["result"][ + "receipt_sha256" + ], + "selected_handoff_file_sha256": artifacts["selected_file_sha256"], + "selected_handoff_receipt_sha256": artifacts["selected"][ + "receipt_sha256" + ], + "selected_checkpoint_semantic_sha256": artifacts["selected"][ + "selected_best_checkpoint_semantic_sha256" + ], + "direct_publication_file_sha256": publication_file_sha, + "direct_publication_receipt_sha256": publication[ + "_certified_receipt_sha256" + ], + "persisted_r2_result_file_sha256": direct_result_file_sha, + "persisted_r2_result_receipt_sha256": produced_receipt, + "terminal_continuation_required_for_native_eight_release": True, + "native_ablation_data_binding_authorized": False, + "nova_submission_authorized": False, + "official_submitted_artifacts_modified": False, + "authorization": direct_r2.closed_launch_authorization(), + } + value["receipt_sha256"] = sha256_json(value) + _publish_exclusive(binding_output_path, value) + observed = validate_terminal_publication_binding( + binding_path=binding_output_path, + expected_binding_file_sha256=hashlib.sha256( + canonical_bytes(value) + ).hexdigest(), + terminal_evidence_path=terminal_evidence_path, + continuation_path=continuation_path, + memory_amendment_path=memory_amendment_path, + memory_applied_path=memory_applied_path, + full_fit_result_path=full_fit_result_path, + selected_handoff_path=selected_handoff_path, + direct_publication_path=publication_path, + persisted_r2_result_path=persisted_r2_result_path, + ) + if observed["receipt_sha256"] != value["receipt_sha256"]: + raise TerminalCertificationR4Error( + "R4 outer binding final readback changed" + ) + return value + + +__all__ = [ + "BINDING_SCHEMA", + "BINDING_STATUS", + "TERMINAL_EVIDENCE_SCHEMA", + "TERMINAL_EVIDENCE_STATUS", + "TerminalCertificationR4Error", + "canonical_bytes", + "run_certified_direct_postfit", + "sha256_json", + "validate_release_binding", + "validate_terminal_publication_binding", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r5_terminal_certification/__init__.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r5_terminal_certification/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e939faa633b6e759e1c402712819c5310c2621a3 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r5_terminal_certification/__init__.py @@ -0,0 +1,21 @@ +"""Launch-closed terminal certification for static-v2 successor 11762446.""" + +from .review_a5_static_v2_terminal_certification_r5 import ( + BINDING_SCHEMA, + BINDING_STATUS, + TerminalCertificationR5Error, + build_terminal_evidence, + run_certified_direct_postfit, + validate_release_binding, + validate_terminal_publication_binding, +) + +__all__ = [ + "BINDING_SCHEMA", + "BINDING_STATUS", + "TerminalCertificationR5Error", + "build_terminal_evidence", + "run_certified_direct_postfit", + "validate_release_binding", + "validate_terminal_publication_binding", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r5_terminal_certification/review_a5_static_v2_terminal_certification_r5.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r5_terminal_certification/review_a5_static_v2_terminal_certification_r5.py new file mode 100644 index 0000000000000000000000000000000000000000..8e3866e989411784fe6805a7226ddbfb85e87eb0 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r5_terminal_certification/review_a5_static_v2_terminal_certification_r5.py @@ -0,0 +1,2829 @@ +"""Preterminal strict certification for static-v2 successor job 11762446. + +This source is preparation-only while the successor is pending. It performs +no scheduler mutation and publishes no evidence until fixed scheduler queries +prove that job 11762446 completed successfully. The obsolete R4 draft remains +untouched. This R5 successor retains its exact R6 checkpoint/ledger replay, +adds the cancelled-before-start 11762305 lineage explicitly, freezes the whole +R2 invocation surface, and reopens every direct-publication member. +""" + +from __future__ import annotations + +from dataclasses import dataclass +import copy +import hashlib +import importlib +import inspect +import json +import os +from pathlib import Path +import re +import stat +import subprocess +from types import MappingProxyType, ModuleType +from typing import Any, Mapping, Sequence + + +BINDING_SCHEMA = ( + "bertose_a5_static_v2_postfit_terminal_certification_20260725_r5" +) +BINDING_STATUS = ( + "PASS_EXACT_R6_TERMINAL_JOB_11762446_AND_R2_PUBLICATION" +) +TERMINAL_EVIDENCE_SCHEMA = ( + "bertose_a5_static_v2_job_11762446_terminal_evidence_20260725_r5" +) +TERMINAL_EVIDENCE_STATUS = ( + "PASS_EXACT_ONE_V100_SUCCESSOR_WITH_CANCELLED_UNUSED_PREDECESSOR" +) + +SUCCESSOR_JOB_ID = "11762446" +CANCELLED_UNUSED_JOB_ID = "11762305" +EXECUTED_PARENT_JOB_ID = "11759687" +PARENT_DEPENDENT_JOB_ID = "11759688" +JOB_NAME = "review_a5_sv2_af805f5d2cb8c32e" +ZERO_SHA256 = "0" * 64 +EMPTY_SHA256 = hashlib.sha256(b"").hexdigest() +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") + +WRITING_ROOT = Path(__file__).absolute().parents[4] +REMOTE_ROOT = WRITING_ROOT.parent +RUNTIME_ROOT = WRITING_ROOT / "review/multimodal/runtime" +OUTPUT_ROOT = WRITING_ROOT / "review/multimodal/outputs" + +R5_OUTPUT_DIRECTORY = ( + OUTPUT_ROOT + / "review_a5_static_v2_postfit_direct_publication_" + "20260725_r5_terminal_certification" +) +TERMINAL_EVIDENCE_PATH = ( + R5_OUTPUT_DIRECTORY + / "review_a5_static_v2_job_11762446_terminal_evidence_r5.json" +) +PERSISTED_R2_RESULT_PATH = ( + R5_OUTPUT_DIRECTORY + / "review_a5_static_v2_postfit_direct_result_r5.json" +) +BINDING_OUTPUT_PATH = ( + R5_OUTPUT_DIRECTORY + / "review_a5_static_v2_postfit_terminal_certification_binding_r5.json" +) + +FIT_DIRECTORY = ( + OUTPUT_ROOT + / "review_a5_static_v2_postcache_full_fit_execution_" + "20260724_r3_terminal_lineage" +) +FULL_FIT_RESULT_PATH = FIT_DIRECTORY / "review_fit_result.json" +SELECTED_HANDOFF_PATH = FIT_DIRECTORY / "review_selected_best_handoff.json" + +CONTINUATION_DIRECTORY = ( + OUTPUT_ROOT / "review_a5_static_v2_epoch_boundary_resume_20260725_r1" +) +CONTINUATION_PATH = ( + CONTINUATION_DIRECTORY + / "review_a5_static_v2_epoch_boundary_continuation_11762446_r1.json" +) +CONTINUATION_FILE_SHA256 = ( + "8ff3181d22567728c0a10580c1e775da0714f17561ace81034fc673813f54af6" +) +CONTINUATION_RECEIPT_SHA256 = ( + "6fd0cf5482904937babd3ff93c2908bc7693ea88fa80c8efc3e169fda747e738" +) +MEMORY_AMENDMENT_PATH = ( + CONTINUATION_DIRECTORY + / "review_a5_static_v2_scheduler_memory_amendment_11762446_r2.json" +) +MEMORY_AMENDMENT_FILE_SHA256 = ( + "85711141c9d0e84dee228df84d02df7d4693fb4b85b1ae8163466e208f5e9fd6" +) +MEMORY_AMENDMENT_RECEIPT_SHA256 = ( + "f650808b563c41db13ead25f46538a5b804924189cdcbbffe50bc05e8ee536fe" +) +MEMORY_APPLIED_PATH = ( + CONTINUATION_DIRECTORY + / "review_a5_static_v2_scheduler_memory_rightsizing_applied_11762446_r2.json" +) +MEMORY_APPLIED_FILE_SHA256 = ( + "f7adbf64e17c3a2afc677b7af9f05e50e37b4d681f38f0fc192634ca0447e4f4" +) +MEMORY_APPLIED_RECEIPT_SHA256 = ( + "600aeaa3ce59d1aba7aa40d2f5c6d0ae257b5abbe5e9cd26589a4ab304df8413" +) + +CHECKPOINT_CONTRACT_SHA256 = ( + "d4214b58b5dbe9af571b83739fdaf5a399c0d6d4e31a55f89a8f901f8855c8a9" +) +RESUME_DEVICE_CLASS_SHA256 = ( + "f73fda38334de1b0b41af0db00d15514a7a41519932f3f6332faecaf0290e358" +) +SUBMISSION_PAYLOAD_SHA256 = ( + "2cd0573ffe936a5d7831809b521fc045f296e7eeb0783a9107f867cdd8431381" +) + +R4_PREDECESSOR_PATH = ( + RUNTIME_ROOT + / "a5_static_v2_postfit_direct_publication_" + "20260725_r4_terminal_certification" + / "review_a5_static_v2_terminal_certification_r4.py" +) +R4_PREDECESSOR_SHA256 = ( + "3b9632e840265e1a5c1d226f3fe7fb8cd4c448f810f3826c59e19c25132dd04f" +) +R4_PREDECESSOR_SIZE_BYTES = 64_464 +ACTIVE_R6_RUNTIME_SHA256 = ( + "30c8f300f1c93c2c09bb1effadafa5e02c546750a51e31b1e16bca8329fef538" +) +ACTIVE_R6_HANDOFF_SHA256 = ( + "d55943d72ec819cd44a183d51a150b80ec11a89153a85400bd14a8a51498eb0c" +) +R2_CORE_SHA256 = ( + "8e57c17fd43f3894f94f980cf70a0d6d7f183cf04c26780c3fe30c1932bb7abb" +) +R2_CORE_SIZE_BYTES = 40_020 +R2_CLI_SHA256 = ( + "c46a7d4644899a5e7551e2dd5eb30666e01e0f36e2f65a2cd821b8c5565258dc" +) +R2_CLI_SIZE_BYTES = 2_601 +R2_INIT_SHA256 = ( + "c82bc8867412ec7bb3ea4cdb80c91f039175903ee09c64050de6bdde07c32bea" +) +R2_INIT_SIZE_BYTES = 65 +R2_SBATCH_SHA256 = ( + "78197215ed27816b4397c77e8c32d52a142c95e58085606aa85addce3b37105c" +) +R2_SBATCH_SIZE_BYTES = 4_877 + +R2_PACKAGE_DIRECTORY = ( + RUNTIME_ROOT / "a5_static_v2_postfit_direct_publication_20260724_r2" +) +R2_CORE_PATH = ( + R2_PACKAGE_DIRECTORY / "review_a5_static_v2_postfit_direct_publication_r2.py" +) +R2_CLI_PATH = ( + R2_PACKAGE_DIRECTORY / "run_review_a5_static_v2_postfit_direct_publication_r2.py" +) +R2_INIT_PATH = R2_PACKAGE_DIRECTORY / "__init__.py" +R2_SBATCH_PATH = ( + WRITING_ROOT + / "review/multimodal/slurm/" + "review_a5_static_v2_postfit_direct_publication_20260724_r2.sbatch" +) +R2_MODULE_NAME = ( + "review.multimodal.runtime." + "a5_static_v2_postfit_direct_publication_20260724_r2." + "review_a5_static_v2_postfit_direct_publication_r2" +) + +OWNER_AMENDMENT_PATH = ( + WRITING_ROOT + / "review/multimodal/" + "review_a5_static_v2_direct_development_publication_owner_" + "amendment_20260724_r1.json" +) +OWNER_AMENDMENT_FILE_SHA256 = ( + "876a3746653254a812d5607d1115abfa112fcefb0772b3828efcb26865dfaf7d" +) +OWNER_AMENDMENT_RECEIPT_SHA256 = ( + "672d247a416280617634b8f51c7c69716fd7a6fe010db4109fe634b25c531b93" +) + +R2_INPUT_DIRECTORY = ( + WRITING_ROOT + / "review/multimodal/inputs/" + "review_a5_static_v2_postfit_direct_inputs_20260724_r1" +) +SEQUENCE_DIRECTORY = ( + REMOTE_ROOT / "data/review_sequences_a5_non_iar_80_20_parser_v3_failclosed_20260720_r3" +) +R2_INPUT_BINDINGS = MappingProxyType( + { + "authority_path": ( + R2_INPUT_DIRECTORY / "review_a5_static_graph_v2_authority_r7.tsv.gz", + "59cf794d52341847b08aaa7f4212d1203dec4df89609157d924fda50d54f7602", + 14_602_716, + ), + "fingerprint_path": ( + R2_INPUT_DIRECTORY + / "review_a5_static_graph_v2_fingerprint_ledger_r7.tsv.gz", + "999ce7e9d0c70c79ddb0762d271567ae508b04fa34cc92112ce3be7392b3ada9", + 7_260_424, + ), + "vocabulary_path": ( + R2_INPUT_DIRECTORY + / "review_a5_static_graph_v2_feature_vocabulary_r7.json", + "8ffc04fa6e1522dcab1375ccc9a451def4eec0d53bb840067e653fa9994841bf", + 6_944, + ), + "template_registry_path": ( + R2_INPUT_DIRECTORY / "review_a5_static_glycam_template_registry_r7.json", + "ffbbe2126eb6131ab8b64ab5809b79b29e5534785cbe6fcfe1bba04b93e06050", + 868_036, + ), + "sequence_index_path": ( + SEQUENCE_DIRECTORY / "review_sequence_parent_index.tsv.gz", + "c61e766dbffc4a1d88c7c7fb94deb683943c0861403350e79ab09c70b317fa52", + 17_392_883, + ), + "sequence_residue_ids_path": ( + SEQUENCE_DIRECTORY / "review_residue_ids.npy", + "074b585b74ac1f2d726991b47d3b75516b86ef27f0e07dc3aec0af726a553741", + 143_978_624, + ), + "sequence_attention_mask_path": ( + SEQUENCE_DIRECTORY / "review_attention_mask.npy", + "6c42b020d59b42405da279b8265d7a2041893c57808821cb7943e3503450e549", + 71_989_376, + ), + } +) +R2_OUTPUT_DIRECTORY = ( + OUTPUT_ROOT / "review_a5_static_v2_postfit_direct_publication_20260724_r2" +) +R2_SHARD_DIRECTORY = ( + OUTPUT_ROOT / "review_a5_static_v2_postfit_direct_shards_20260724_r2" +) +R2_DEVICE_TYPE = "cuda" +R2_SHARD_SIZE = 128 +R2_EXPECTED_SHARD_COUNT = 222 + +EXPECTED_COUNTS = MappingProxyType( + { + "pretraining_train": { + "parent_count": 22_980, + "state_count": 34_408, + "residue_count": 205_801, + }, + "pretraining_development": { + "parent_count": 5_390, + "state_count": 7_964, + "residue_count": 51_237, + }, + "all": { + "parent_count": 28_370, + "state_count": 42_372, + "residue_count": 257_038, + "token_count": 1_028_152, + }, + } +) +EXPECTED_AUTHORITY_ROLE_COUNTS = MappingProxyType( + { + "excluded_exact_or_verified_graph_identity": 3_179, + "excluded_later_role_nonfit_identity": 35, + "outside_sequence_authority": 423, + "pretraining_development": 7_964, + "pretraining_train": 34_408, + "static_ineligible": 5_430, + "static_ineligible_incomplete_alpha_beta_pair": 622, + "static_transform_only_exact_development_overlap": 3, + "static_transform_only_exact_excluded_overlap": 2_638, + } +) + +R2_PUBLICATION_FILENAMES = MappingProxyType( + { + "token_publication": "review_a5_static_tokens_v2_r4.pkl", + "state_publication": "review_a5_static_v2_state_authority_r4.tsv", + "null_publication": "review_a5_static_v2_train_only_null_r4.json", + "traceability_publication": ( + "review_a5_static_v2_postfit_traceability_r4.md" + ), + } +) +R2_RECEIPT_FILENAME = "review_a5_static_v2_postfit_publication_receipt_r4.json" + +PRODUCTION_DOCUMENT_BINDINGS = MappingProxyType( + { + "execution_bundle": ( + OUTPUT_ROOT + / "review_a5_static_v2_postcache_full_fit_release_documents_" + "20260724_r19_device_boundary_vendor/" + "review_a5_static_v2_full_fit_direct_bundle_r19.json", + "fb7ef6d0427e42a2a6d94fbe0f2aa41e205d840180b4e4f81eebd3f0d0c0395d", + ), + "owner_authority": ( + OUTPUT_ROOT + / "review_a5_static_v2_postcache_full_fit_release_documents_" + "20260724_r19_device_boundary_vendor/" + "review_a5_static_v2_full_fit_direct_authority_r19.json", + "14a3b3ac5167bd558a6db53e4940aff3a19fd54b24a4d43d026c4d958d4a93cc", + ), + "submission_receipt": ( + OUTPUT_ROOT + / "review_a5_static_v2_postcache_full_fit_release_documents_" + "20260724_r19_device_boundary_vendor/review_submission_ledger/" + "review_a5_static_v2_submission_receipt_" + "af805f5d2cb8c32e74423071ea4c3e3613413d3a324928cdf820ad226f59130c.json", + "878d3eb5b6bbc4903b57d164d5641a47b9b5ec7effec46eb6dae0ef1852ec817", + ), + } +) + +CAPTURE_FILENAMES = MappingProxyType( + { + "successor_sacct_capture": ( + "review_a5_static_v2_job_11762446_sacct_r5.txt" + ), + "successor_scontrol_capture": ( + "review_a5_static_v2_job_11762446_scontrol_r5.txt" + ), + "executed_parent_sacct_capture": ( + "review_a5_static_v2_job_11759687_sacct_r5.txt" + ), + "cancelled_unused_sacct_capture": ( + "review_a5_static_v2_job_11762305_sacct_r5.txt" + ), + } +) + +SACCT_FORMAT = ( + "JobIDRaw,JobName,State,ExitCode,Elapsed,Partition,Account,QOS," + "ReqMem,AllocTRES,NodeList,Constraints" +) +SUCCESSOR_SACCT_ARGV = ( + "sacct", "-n", "-X", "-P", "-j", SUCCESSOR_JOB_ID, f"--format={SACCT_FORMAT}" +) +EXECUTED_PARENT_SACCT_ARGV = ( + "sacct", "-n", "-X", "-P", "-j", EXECUTED_PARENT_JOB_ID, + f"--format={SACCT_FORMAT}" +) +CANCELLED_UNUSED_SACCT_ARGV = ( + "sacct", "-n", "-X", "-P", "-j", CANCELLED_UNUSED_JOB_ID, + f"--format={SACCT_FORMAT}" +) +SUCCESSOR_SCONTROL_ARGV = ( + "scontrol", "show", "job", "-dd", "-o", SUCCESSOR_JOB_ID +) + +_R2_RESULT_KEYS = frozenset( + { + "schema", + "status", + "owner_amendment_file_sha256", + "owner_amendment_receipt_sha256", + "historical_held_provenance_receipt_sha256", + "source_closure_sha256", + "encoded_counts", + "selected_checkpoint_semantic_sha256", + "model_state_unchanged_during_encoding", + "development_used_for_support_or_null_fit", + "publication_receipt_sha256", + "native_ablation_data_binding_authorized", + "nova_submission_authorized", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } +) +_PUBLICATION_BINDING_KEYS = frozenset( + { + "absolute_path", + "size_bytes", + "file_sha256", + "mode_octal", + "nlink", + "exclusive_no_overwrite", + "sealed_readback_passed", + "idempotent_identical_reuse_supported", + } +) +_EMBEDDED_FILE_BINDING_KEYS = frozenset( + {"absolute_path", "file_sha256", "size_bytes"} +) + + +class TerminalCertificationR5Error(RuntimeError): + """The frozen terminal/publication surface changed.""" + + +@dataclass(frozen=True) +class ImmutableRead: + raw: bytes + file_sha256: str + size_bytes: int + mode: int + nlink: int + + +def canonical_bytes(value: Any) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def sha256_json(value: Any) -> str: + return hashlib.sha256(canonical_bytes(value)).hexdigest() + + +def _sha(value: Any, label: str, *, allow_zero: bool = False) -> str: + if ( + not isinstance(value, str) + or SHA_RE.fullmatch(value) is None + or (not allow_zero and value == ZERO_SHA256) + ): + raise TerminalCertificationR5Error(f"{label} is not SHA-256") + return value + + +def _absolute_normalized(path: Path, label: str) -> Path: + supplied = Path(path) + absolute = supplied.absolute() + if ( + supplied != absolute + or os.path.normpath(os.fspath(absolute)) != os.fspath(absolute) + or not hasattr(os, "O_NOFOLLOW") + or not hasattr(os, "O_DIRECTORY") + ): + raise TerminalCertificationR5Error(f"{label} path is unsafe") + return absolute + + +def _open_directory_nofollow(path: Path, label: str) -> int: + absolute = _absolute_normalized(path, label) + flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + descriptor = os.open(os.sep, flags) + try: + for component in absolute.parts[1:]: + child = os.open(component, flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + return descriptor + except OSError as error: + os.close(descriptor) + raise TerminalCertificationR5Error( + f"{label} has a missing or linked component" + ) from error + + +def read_immutable( + path: Path, + *, + label: str, + expected_sha256: str | None = None, + expected_size_bytes: int | None = None, + maximum: int = 4 * 1024 * 1024 * 1024, + require_review_name: bool = True, + require_readonly: bool = True, + allow_empty: bool = False, +) -> ImmutableRead: + """Read one regular file through a component-wise no-follow chain.""" + + absolute = _absolute_normalized(path, label) + if ( + (require_review_name and not absolute.name.startswith("review_")) + or type(maximum) is not int + or maximum < 0 + or (expected_size_bytes is not None and type(expected_size_bytes) is not int) + ): + raise TerminalCertificationR5Error(f"{label} read contract is unsafe") + parent = _open_directory_nofollow(absolute.parent, f"{label} parent") + descriptor: int | None = None + try: + descriptor = os.open( + absolute.name, + os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0), + dir_fd=parent, + ) + before = os.fstat(descriptor) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or (require_readonly and before.st_mode & 0o222) + or before.st_size > maximum + or (before.st_size == 0 and not allow_empty) + ): + raise TerminalCertificationR5Error( + f"{label} is not one bounded regular file" + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise TerminalCertificationR5Error( + f"{label} truncated while read" + ) + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + before_tuple = ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_mode, + before.st_nlink, + ) + after_tuple = ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_mode, + after.st_nlink, + ) + if before_tuple != after_tuple: + raise TerminalCertificationR5Error(f"{label} changed while read") + except OSError as error: + raise TerminalCertificationR5Error( + f"{label} has a missing or linked final component" + ) from error + finally: + if descriptor is not None: + os.close(descriptor) + os.close(parent) + raw = b"".join(chunks) + digest = hashlib.sha256(raw).hexdigest() + if ( + len(raw) != before.st_size + or ( + expected_sha256 is not None + and digest != _sha(expected_sha256, f"{label} expected file") + ) + or ( + expected_size_bytes is not None + and len(raw) != expected_size_bytes + ) + ): + raise TerminalCertificationR5Error(f"{label} readback changed") + return ImmutableRead( + raw=raw, + file_sha256=digest, + size_bytes=len(raw), + mode=before.st_mode, + nlink=before.st_nlink, + ) + + +def _canonical_from_read(observed: ImmutableRead, label: str) -> dict[str, Any]: + try: + value = json.loads(observed.raw.decode("ascii")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise TerminalCertificationR5Error( + f"{label} is not canonical JSON" + ) from error + if type(value) is not dict or canonical_bytes(value) != observed.raw: + raise TerminalCertificationR5Error(f"{label} canonical bytes changed") + return value + + +def read_canonical( + path: Path, + *, + label: str, + expected_sha256: str | None = None, + expected_size_bytes: int | None = None, + maximum: int = 64 * 1024 * 1024, + require_readonly: bool = True, +) -> tuple[dict[str, Any], ImmutableRead]: + observed = read_immutable( + path, + label=label, + expected_sha256=expected_sha256, + expected_size_bytes=expected_size_bytes, + maximum=maximum, + require_readonly=require_readonly, + ) + return _canonical_from_read(observed, label), observed + + +def _self_hash(value: Mapping[str, Any], label: str) -> str: + unsigned = copy.deepcopy(dict(value)) + observed = _sha(unsigned.pop("receipt_sha256", None), f"{label} receipt") + if sha256_json(unsigned) != observed: + raise TerminalCertificationR5Error(f"{label} self-hash changed") + return observed + + +def _file_binding(path: Path, observed: ImmutableRead) -> dict[str, Any]: + return { + "absolute_path": os.fspath(Path(path)), + "file_sha256": observed.file_sha256, + "size_bytes": observed.size_bytes, + } + + +def _reopen_file_binding( + value: Any, + *, + label: str, + maximum: int = 4 * 1024 * 1024 * 1024, + require_readonly: bool = True, + allow_empty: bool = False, +) -> ImmutableRead: + if ( + not isinstance(value, Mapping) + or set(value) != _EMBEDDED_FILE_BINDING_KEYS + or type(value.get("absolute_path")) is not str + or type(value.get("size_bytes")) is not int + or value["size_bytes"] < 0 + ): + raise TerminalCertificationR5Error(f"{label} binding changed") + return read_immutable( + Path(value["absolute_path"]), + label=label, + expected_sha256=str(value.get("file_sha256")), + expected_size_bytes=value["size_bytes"], + maximum=maximum, + require_readonly=require_readonly, + allow_empty=allow_empty, + ) + + +def _publish_bytes_exclusive(path: Path, payload: bytes, label: str) -> ImmutableRead: + absolute = _absolute_normalized(path, label) + if not absolute.name.startswith("review_"): + raise TerminalCertificationR5Error(f"{label} is not review-prefixed") + parent = _open_directory_nofollow(absolute.parent, f"{label} parent") + descriptor: int | None = None + try: + descriptor = os.open( + absolute.name, + os.O_WRONLY + | os.O_CREAT + | os.O_EXCL + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0), + 0o600, + dir_fd=parent, + ) + offset = 0 + while offset < len(payload): + written = os.write(descriptor, payload[offset:]) + if written <= 0: + raise OSError("short write") + offset += written + os.fsync(descriptor) + os.fchmod(descriptor, 0o400) + os.fsync(descriptor) + except OSError as error: + raise TerminalCertificationR5Error( + f"{label} exclusive publication failed" + ) from error + finally: + if descriptor is not None: + os.close(descriptor) + os.close(parent) + return read_immutable( + absolute, + label=label, + expected_sha256=hashlib.sha256(payload).hexdigest(), + expected_size_bytes=len(payload), + maximum=max(len(payload), 1), + allow_empty=not payload, + ) + + +def _publish_canonical_exclusive( + path: Path, value: Mapping[str, Any], label: str +) -> ImmutableRead: + return _publish_bytes_exclusive(path, canonical_bytes(dict(value)), label) + + +_R4_PRIVATE: ModuleType | None = None + + +def _load_r4_private() -> ModuleType: + """Load pinned R4 bytes privately, retargeting only executed-job identity.""" + + global _R4_PRIVATE + source = read_immutable( + R4_PREDECESSOR_PATH, + label="R4 predecessor source", + expected_sha256=R4_PREDECESSOR_SHA256, + expected_size_bytes=R4_PREDECESSOR_SIZE_BYTES, + maximum=R4_PREDECESSOR_SIZE_BYTES, + require_readonly=False, + ) + if _R4_PRIVATE is not None: + return _R4_PRIVATE + module = ModuleType("_a5_static_v2_terminal_r4_for_r5") + module.__file__ = os.fspath(R4_PREDECESSOR_PATH) + module.__package__ = "" + exec( + compile( + source.raw, + os.fspath(R4_PREDECESSOR_PATH), + "exec", + dont_inherit=True, + ), + module.__dict__, + ) + module.EXPECTED_JOB_ID = SUCCESSOR_JOB_ID + module.PARENT_JOB_ID = EXECUTED_PARENT_JOB_ID + module.BINDING_STATUS = BINDING_STATUS + module.BINDING_SCHEMA = BINDING_SCHEMA + module.TERMINAL_EVIDENCE_SCHEMA = TERMINAL_EVIDENCE_SCHEMA + module.TERMINAL_EVIDENCE_STATUS = TERMINAL_EVIDENCE_STATUS + _R4_PRIVATE = module + return module + + +def _production_dependencies() -> tuple[ModuleType, Any, Any, Any]: + r4 = _load_r4_private() + try: + runtime_r6, handoff_r6, direct_r2 = r4._dependencies() + except Exception as error: + raise TerminalCertificationR5Error( + "pinned R4/R6/R2 dependencies failed to load" + ) from error + if ( + r4.EXPECTED_R6_RUNTIME_SHA256 != ACTIVE_R6_RUNTIME_SHA256 + or r4.EXPECTED_R6_HANDOFF_SHA256 != ACTIVE_R6_HANDOFF_SHA256 + or r4.EXPECTED_R2_SOURCE_SHA256 != R2_CORE_SHA256 + or Path(direct_r2.__file__).absolute() != R2_CORE_PATH + ): + raise TerminalCertificationR5Error( + "R4 production dependency closure changed" + ) + return r4, runtime_r6, handoff_r6, direct_r2 + + +def _require_exact_path(observed: Path, expected: Path, label: str) -> Path: + value = _absolute_normalized(Path(observed), label) + if value != expected: + raise TerminalCertificationR5Error(f"{label} path changed") + return value + + +def _validate_continuation_lineage( + *, + continuation_path: Path, + memory_amendment_path: Path, + memory_applied_path: Path, +) -> dict[str, Any]: + _require_exact_path(continuation_path, CONTINUATION_PATH, "continuation") + _require_exact_path( + memory_amendment_path, MEMORY_AMENDMENT_PATH, "memory amendment" + ) + _require_exact_path(memory_applied_path, MEMORY_APPLIED_PATH, "memory applied") + continuation, continuation_read = read_canonical( + CONTINUATION_PATH, + label="successor continuation", + expected_sha256=CONTINUATION_FILE_SHA256, + expected_size_bytes=2_833, + ) + amendment, amendment_read = read_canonical( + MEMORY_AMENDMENT_PATH, + label="successor memory amendment", + expected_sha256=MEMORY_AMENDMENT_FILE_SHA256, + expected_size_bytes=1_575, + require_readonly=False, + ) + applied, applied_read = read_canonical( + MEMORY_APPLIED_PATH, + label="successor memory applied", + expected_sha256=MEMORY_APPLIED_FILE_SHA256, + expected_size_bytes=1_391, + require_readonly=False, + ) + readback = applied.get("scheduler_readback") + if ( + _self_hash(continuation, "successor continuation") + != CONTINUATION_RECEIPT_SHA256 + or continuation.get("schema") + != "bertose_a5_static_v2_epoch_boundary_continuation_20260725_r1" + or continuation.get("status") + != "OWNER_AUTHORIZED_CANCELLED_JOB_EPOCH_BOUNDARY_SUCCESSOR_ONLY" + or continuation.get("successor_job_id") != SUCCESSOR_JOB_ID + or continuation.get("parent_job_id") != EXECUTED_PARENT_JOB_ID + or continuation.get("parent_dependent_job_id") != PARENT_DEPENDENT_JOB_ID + or continuation.get("scheduler_job_name") != JOB_NAME + or continuation.get("generic_gpu_request") != "gpu:1" + or continuation.get("constraint_tokens") != ["nova18", "v100"] + or continuation.get("checkpoint_policy") + != "one_startup_publication_then_completed_epochs_only" + or continuation.get("maximum_replay_scope") + != "current_incomplete_epoch_only" + or continuation.get("resume_device_class_sha256") + != RESUME_DEVICE_CLASS_SHA256 + or continuation.get("checkpoint_contract_sha256") + != CHECKPOINT_CONTRACT_SHA256 + or continuation.get("parent_submission_payload_sha256") + != SUBMISSION_PAYLOAD_SHA256 + or continuation.get("second_runnable_copy_authorized") is not False + or continuation.get("ablation_or_downstream_opened") is not False + or _self_hash(amendment, "successor memory amendment") + != MEMORY_AMENDMENT_RECEIPT_SHA256 + or amendment.get("schema") + != "bertose_a5_static_v2_pending_job_memory_rightsizing_20260725_r2" + or amendment.get("status") + != "OWNER_AUTHORIZED_PENDING_JOB_SCHEDULER_MEMORY_RIGHTSIZING_ONLY" + or amendment.get("job_id") != SUCCESSOR_JOB_ID + or amendment.get("continuation_receipt_file_sha256") + != CONTINUATION_FILE_SHA256 + or amendment.get("continuation_receipt_sha256") + != CONTINUATION_RECEIPT_SHA256 + or amendment.get("prior_min_memory_bytes") != 137_438_953_472 + or amendment.get("amended_min_memory_bytes") != 68_719_476_736 + or amendment.get("checkpoint_or_scientific_state_changed") is not False + or amendment.get("second_runnable_copy_created") is not False + or amendment.get("sbatch_source_modified") is not False + or _self_hash(applied, "successor memory applied") + != MEMORY_APPLIED_RECEIPT_SHA256 + or applied.get("schema") + != ( + "bertose_a5_static_v2_pending_job_memory_rightsizing_applied_" + "20260725_r2" + ) + or applied.get("status") + != "PASS_SCHEDULER_MEMORY_RIGHTSIZING_APPLIED_WITHOUT_RESUBMISSION" + or applied.get("job_id") != SUCCESSOR_JOB_ID + or applied.get("amendment_file_sha256") + != MEMORY_AMENDMENT_FILE_SHA256 + or applied.get("amendment_receipt_sha256") + != MEMORY_AMENDMENT_RECEIPT_SHA256 + or applied.get("prior_min_memory_bytes") != 137_438_953_472 + or applied.get("amended_min_memory_bytes") != 68_719_476_736 + or applied.get("checkpoint_or_scientific_state_changed") is not False + or applied.get("one_runnable_copy_only") is not True + or not isinstance(readback, Mapping) + or readback.get("job_id", SUCCESSOR_JOB_ID) != SUCCESSOR_JOB_ID + or readback.get("requested_memory") != "64G" + or readback.get("requested_gres") != "gpu:1" + or readback.get("partition") != "scavenger" + or readback.get("account") != "ratul-scavenger" + or readback.get("qos") != "scavenger" + ): + raise TerminalCertificationR5Error( + "successor continuation/memory lineage changed" + ) + return { + "continuation": continuation, + "continuation_read": continuation_read, + "memory_amendment": amendment, + "memory_amendment_read": amendment_read, + "memory_applied": applied, + "memory_applied_read": applied_read, + } + + +def _validate_r2_frozen_surface() -> tuple[Any, dict[str, ImmutableRead]]: + """Rehash every fixed R2 source/input before the hard-coded call.""" + + _r4, _runtime_r6, _handoff_r6, direct_r2 = _production_dependencies() + observed: dict[str, ImmutableRead] = {} + fixed_sources = ( + ("r2_sbatch", R2_SBATCH_PATH, R2_SBATCH_SHA256, R2_SBATCH_SIZE_BYTES), + ("r2_core", R2_CORE_PATH, R2_CORE_SHA256, R2_CORE_SIZE_BYTES), + ("r2_cli", R2_CLI_PATH, R2_CLI_SHA256, R2_CLI_SIZE_BYTES), + ("r2_init", R2_INIT_PATH, R2_INIT_SHA256, R2_INIT_SIZE_BYTES), + ( + "owner_amendment", + OWNER_AMENDMENT_PATH, + OWNER_AMENDMENT_FILE_SHA256, + 1_949, + ), + ) + for label, path, digest, size in fixed_sources: + observed[label] = read_immutable( + path, + label=label.replace("_", " "), + expected_sha256=digest, + expected_size_bytes=size, + maximum=max(size, 1), + require_review_name=path.name.startswith("review_"), + require_readonly=False, + ) + amendment = _canonical_from_read( + observed["owner_amendment"], "owner amendment" + ) + if ( + _self_hash(amendment, "owner amendment") + != OWNER_AMENDMENT_RECEIPT_SHA256 + or amendment.get("exact_active_counts") != dict(EXPECTED_COUNTS) + ): + raise TerminalCertificationR5Error( + "owner amendment hash/count surface changed" + ) + for label, (path, digest, size) in R2_INPUT_BINDINGS.items(): + observed[label] = read_immutable( + path, + label=f"R2 {label}", + expected_sha256=digest, + expected_size_bytes=size, + maximum=size, + require_review_name=True, + require_readonly=True, + ) + expected_parameters = ( + "amendment_path", + "expected_amendment_file_sha256", + "handoff_path", + "expected_handoff_file_sha256", + "authority_path", + "fingerprint_path", + "vocabulary_path", + "template_registry_path", + "sequence_index_path", + "sequence_residue_ids_path", + "sequence_attention_mask_path", + "output_directory", + "shard_directory", + "device_type", + "shard_size", + ) + signature = inspect.signature(direct_r2.run_direct_postfit) + if ( + tuple(signature.parameters) != expected_parameters + or dict(direct_r2.EXPECTED_COUNTS) != dict(EXPECTED_COUNTS) + or Path(direct_r2.__file__).absolute() != R2_CORE_PATH + or R2_OUTPUT_DIRECTORY == R2_SHARD_DIRECTORY + or R2_OUTPUT_DIRECTORY in R2_SHARD_DIRECTORY.parents + or R2_SHARD_DIRECTORY in R2_OUTPUT_DIRECTORY.parents + ): + raise TerminalCertificationR5Error( + "frozen R2 function/count/output surface changed" + ) + return direct_r2, observed + + +def _r2_invocation( + *, selected_handoff_file_sha256: str +) -> dict[str, Any]: + _sha(selected_handoff_file_sha256, "selected handoff file") + result: dict[str, Any] = { + "amendment_path": OWNER_AMENDMENT_PATH, + "expected_amendment_file_sha256": OWNER_AMENDMENT_FILE_SHA256, + "handoff_path": SELECTED_HANDOFF_PATH, + "expected_handoff_file_sha256": selected_handoff_file_sha256, + "output_directory": R2_OUTPUT_DIRECTORY, + "shard_directory": R2_SHARD_DIRECTORY, + "device_type": R2_DEVICE_TYPE, + "shard_size": R2_SHARD_SIZE, + } + for name, (path, _digest, _size) in R2_INPUT_BINDINGS.items(): + result[name] = path + return result + + +def _require_r2_environment() -> None: + expected = { + "PYTHONDONTWRITEBYTECODE": "1", + "PYTHONNOUSERSITE": "1", + "PYTHONHASHSEED": "0", + "PYTHONUNBUFFERED": "1", + "CUDA_DEVICE_ORDER": "PCI_BUS_ID", + "CUBLAS_WORKSPACE_CONFIG": ":4096:8", + "NVIDIA_TF32_OVERRIDE": "0", + } + if ( + any(os.environ.get(key) != value for key, value in expected.items()) + or not os.environ.get("CUDA_VISIBLE_DEVICES", "").strip() + or os.environ.get("OMP_NUM_THREADS") != os.environ.get("SLURM_CPUS_PER_TASK") + or os.environ.get("MKL_NUM_THREADS") != os.environ.get("SLURM_CPUS_PER_TASK") + or os.environ.get("SLURM_CPUS_PER_TASK") != "4" + ): + raise TerminalCertificationR5Error( + "frozen R2 CUDA/environment surface changed" + ) + + +def _pipe_rows(raw: bytes, label: str) -> list[list[str]]: + try: + text = raw.decode("ascii") + except UnicodeDecodeError as error: + raise TerminalCertificationR5Error( + f"{label} is not ASCII" + ) from error + rows = [ + [field.strip() for field in line.split("|")] + for line in text.splitlines() + if line.strip() + ] + if any(len(row) != 12 for row in rows): + raise TerminalCertificationR5Error(f"{label} row is malformed") + return rows + + +def _parse_tres(value: str, label: str) -> dict[str, str]: + result: dict[str, str] = {} + if not value: + return result + for token in value.split(","): + if token.count("=") != 1: + raise TerminalCertificationR5Error(f"{label} TRES is malformed") + key, item = token.split("=", 1) + if not key or not item or key in result: + raise TerminalCertificationR5Error(f"{label} TRES is ambiguous") + result[key] = item + return result + + +def _require_exact_one_v100_tres(value: str, label: str) -> dict[str, str]: + parsed = _parse_tres(value, label) + gpu = {key: item for key, item in parsed.items() if key.startswith("gres/gpu")} + if ( + gpu != {"gres/gpu": "1", "gres/gpu:v100": "1"} + or parsed.get("node") != "1" + or parsed.get("mem") != "64G" + ): + raise TerminalCertificationR5Error( + f"{label} is not exactly one allocated V100" + ) + return parsed + + +def _constraint_tokens(value: str) -> list[str]: + if value in {"", "(null)", "None", "none", "N/A"}: + return [] + return sorted( + token for token in re.split(r"[&,+]", value) if token + ) + + +def _scontrol_fields(raw: bytes) -> dict[str, str]: + try: + text = raw.decode("ascii").strip() + except UnicodeDecodeError as error: + raise TerminalCertificationR5Error( + "successor scontrol is not ASCII" + ) from error + fields: dict[str, str] = {} + for token in text.split(): + if "=" not in token: + continue + key, value = token.split("=", 1) + if key in fields: + raise TerminalCertificationR5Error( + f"successor scontrol repeats {key}" + ) + fields[key] = value + return fields + + +def _validate_scheduler_raw( + *, + successor_sacct_raw: bytes, + successor_scontrol_raw: bytes, + executed_parent_sacct_raw: bytes, + cancelled_unused_sacct_raw: bytes, +) -> dict[str, Any]: + successor_rows = _pipe_rows(successor_sacct_raw, "successor sacct") + parent_rows = _pipe_rows(executed_parent_sacct_raw, "executed parent sacct") + cancelled_rows = _pipe_rows( + cancelled_unused_sacct_raw, "cancelled unused sacct" + ) + if len(successor_rows) != 1 or len(parent_rows) != 1 or len(cancelled_rows) != 1: + raise TerminalCertificationR5Error( + "scheduler history does not have one row per job" + ) + successor = successor_rows[0] + parent = parent_rows[0] + cancelled = cancelled_rows[0] + successor_tres = _require_exact_one_v100_tres( + successor[9], "successor AllocTRES" + ) + parent_tres = _parse_tres(parent[9], "executed parent AllocTRES") + if ( + successor[:4] + != [SUCCESSOR_JOB_ID, JOB_NAME, "COMPLETED", "0:0"] + or successor[5:9] + != ["scavenger", "ratul-scavenger", "scavenger", "64G"] + or successor[4] in {"", "00:00:00"} + or successor[10] in {"", "None assigned", "None"} + or _constraint_tokens(successor[11]) != ["nova18", "v100"] + or parent[0] != EXECUTED_PARENT_JOB_ID + or parent[1] != JOB_NAME + or not parent[2].startswith("CANCELLED") + or parent[4] in {"", "00:00:00"} + or parent[10] in {"", "None assigned", "None"} + or parent_tres.get("gres/gpu") != "1" + or cancelled[0] != CANCELLED_UNUSED_JOB_ID + or cancelled[1] != JOB_NAME + or not cancelled[2].startswith("CANCELLED") + or cancelled[3] != "0:0" + or cancelled[4] != "00:00:00" + or cancelled[9] != "" + or cancelled[10] not in {"None assigned", "None", ""} + ): + raise TerminalCertificationR5Error( + "executed/cancelled scheduler lineage changed" + ) + scontrol = _scontrol_fields(successor_scontrol_raw) + required = { + "JobId": SUCCESSOR_JOB_ID, + "JobName": JOB_NAME, + "JobState": "COMPLETED", + "ExitCode": "0:0", + "Partition": "scavenger", + "Account": "ratul-scavenger", + "QOS": "scavenger", + "MinMemoryNode": "64G", + "TresPerNode": "gres/gpu:1", + "Features": "v100&nova18", + "WorkDir": os.fspath(WRITING_ROOT), + } + if any(scontrol.get(key) != value for key, value in required.items()): + raise TerminalCertificationR5Error( + "successor scontrol route changed" + ) + request_tres = _parse_tres(scontrol.get("ReqTRES", ""), "scontrol ReqTRES") + allocated_tres = _require_exact_one_v100_tres( + scontrol.get("AllocTRES", ""), "scontrol AllocTRES" + ) + if ( + {key: item for key, item in request_tres.items() if key.startswith("gres/gpu")} + != {"gres/gpu": "1"} + or request_tres.get("node") != "1" + or request_tres.get("mem") != "64G" + or not scontrol.get("StdErr", "").startswith(os.sep) + or not scontrol.get("StdOut", "").startswith(os.sep) + or scontrol.get("Command") + != str( + RUNTIME_ROOT + / "a5_static_v2_epoch_boundary_resume_20260725_r1/" + "run_review_a5_static_v2_epoch_boundary_resume_r1_scavenger_v100.sbatch" + ) + ): + raise TerminalCertificationR5Error( + "successor request/allocation/log binding changed" + ) + return { + "job_id": SUCCESSOR_JOB_ID, + "job_name": JOB_NAME, + "state": "COMPLETED", + "exit_code": "0:0", + "elapsed": successor[4], + "partition": "scavenger", + "account": "ratul-scavenger", + "qos": "scavenger", + "requested_memory": "64G", + "requested_gres": "gpu:1", + "constraint_tokens": ["nova18", "v100"], + "allocated_node": successor[10], + "allocated_gpu_count": 1, + "allocated_gpu_type": "v100", + "allocated_tres": successor_tres, + "scontrol_allocated_tres": allocated_tres, + "stderr_absolute_path": scontrol["StdErr"], + "stdout_absolute_path": scontrol["StdOut"], + "executed_attempt_job_ids": [EXECUTED_PARENT_JOB_ID, SUCCESSOR_JOB_ID], + "cancelled_unused_job_id": CANCELLED_UNUSED_JOB_ID, + "cancelled_unused_elapsed": "00:00:00", + "cancelled_unused_had_allocation": False, + } + + +def _checkpoint_object( + *, + checkpoint_root: Path, + category: str, + runtime_r6: Any, +) -> tuple[dict[str, Any], dict[str, Any]]: + if category not in {"latest", "best"}: + raise TerminalCertificationR5Error("checkpoint category changed") + directory = checkpoint_root / category + head_read = read_immutable( + directory / "head.json", + label=f"{category} checkpoint head", + maximum=1024 * 1024, + require_review_name=False, + ) + head = _canonical_from_read(head_read, f"{category} checkpoint head") + receipt_name = head.get("receipt_filename") + payload_name = head.get("payload_filename") + if ( + type(receipt_name) is not str + or type(payload_name) is not str + or Path(receipt_name).name != receipt_name + or Path(payload_name).name != payload_name + ): + raise TerminalCertificationR5Error( + f"{category} checkpoint object names changed" + ) + receipt_read = read_immutable( + directory / receipt_name, + label=f"{category} checkpoint receipt", + maximum=4 * 1024 * 1024, + require_review_name=False, + ) + payload_read = read_immutable( + directory / payload_name, + label=f"{category} checkpoint payload", + maximum=4 * 1024 * 1024 * 1024, + require_review_name=False, + ) + receipt = _canonical_from_read( + receipt_read, f"{category} checkpoint receipt" + ) + try: + checkpoint = runtime_r6.checkpoint_store_r2._torch_load(payload_read.raw) + runtime_r6.checkpoint_store_r2.validate_checkpoint(checkpoint) + semantic = runtime_r6.checkpoint_store_r2.semantic_tree_sha256(checkpoint) + except Exception as error: + raise TerminalCertificationR5Error( + f"{category} checkpoint payload failed exact R6 validation" + ) from error + state = checkpoint.get("training_state") + if ( + not isinstance(state, Mapping) + or head.get("payload_sha256") != payload_read.file_sha256 + or head.get("receipt_sha256") != receipt_read.file_sha256 + or receipt.get("payload_sha256") != payload_read.file_sha256 + or receipt.get("payload_size_bytes") != payload_read.size_bytes + or receipt.get("contract_sha256") != CHECKPOINT_CONTRACT_SHA256 + or receipt.get("checkpoint_semantic_sha256") != semantic + ): + raise TerminalCertificationR5Error( + f"{category} checkpoint byte/semantic binding changed" + ) + evidence: dict[str, Any] = { + "head_file_sha256": head_read.file_sha256, + "head_size_bytes": head_read.size_bytes, + "receipt_file_sha256": receipt_read.file_sha256, + "receipt_size_bytes": receipt_read.size_bytes, + "payload_file_sha256": payload_read.file_sha256, + "payload_size_bytes": payload_read.size_bytes, + "checkpoint_semantic_sha256": semantic, + "epoch_index": state.get("epoch_index"), + "phase": state.get("phase"), + "contract_sha256": CHECKPOINT_CONTRACT_SHA256, + } + if category == "latest": + evidence.update( + { + "checkpoint_ordinal": head.get("ordinal"), + "group_cursor": state.get("group_cursor"), + "micro_pack_cursor": state.get("micro_pack_cursor"), + "epoch_group_plan_sha256": state.get( + "epoch_group_plan_sha256" + ), + "epoch_successful_group_steps": state.get( + "epoch_successful_group_steps" + ), + "planned_group_count": state.get("planned_group_count"), + "ordered_group_binding_sha256": list( + state.get("ordered_group_binding_sha256", ()) + ), + "terminal_status": state.get("terminal_status"), + } + ) + else: + evidence.update( + { + "category": head.get("category"), + "source_latest_receipt_sha256": receipt.get( + "source_latest_receipt_sha256" + ), + "best_epoch_index": state.get("best_epoch_index"), + "scientific_ledger_count": state.get( + "scientific_ledger_count" + ), + } + ) + return evidence, checkpoint + + +def _validate_best_checkpoint( + *, + selected: Mapping[str, Any], + best_evidence: Mapping[str, Any], + best_checkpoint: Mapping[str, Any], +) -> None: + state = best_checkpoint.get("training_state") + if ( + not isinstance(state, Mapping) + or best_evidence.get("category") != "best" + or best_evidence.get("checkpoint_semantic_sha256") + != selected.get("selected_best_checkpoint_semantic_sha256") + or best_evidence.get("checkpoint_semantic_sha256") + != selected.get("best_checkpoint_readback_semantic_sha256") + or best_evidence.get("checkpoint_semantic_sha256") + != selected.get("independent_checkpoint_best_semantic_sha256") + or best_evidence.get("best_epoch_index") + != selected.get("selected_best_epoch_index") + or state.get("epoch_index") + != selected.get("selected_best_epoch_index") + 1 + or state.get("scientific_ledger_count") + != selected.get("selected_best_epoch_index") + 1 + or state.get("last_epoch_improved") is not True + or best_checkpoint.get("binding", {}).get( + "resume_device_class_sha256" + ) + != RESUME_DEVICE_CLASS_SHA256 + ): + raise TerminalCertificationR5Error( + "selected best checkpoint replay changed" + ) + + +def _production_document_evidence() -> dict[str, dict[str, Any]]: + result: dict[str, dict[str, Any]] = {} + for label, (path, digest) in PRODUCTION_DOCUMENT_BINDINGS.items(): + observed = read_immutable( + path, + label=f"production {label}", + expected_sha256=digest, + maximum=64 * 1024 * 1024, + ) + result[label] = _file_binding(path, observed) + return result + + +def _validate_production_documents( + value: Any, +) -> dict[str, dict[str, Any]]: + if ( + not isinstance(value, Mapping) + or set(value) != set(PRODUCTION_DOCUMENT_BINDINGS) + ): + raise TerminalCertificationR5Error( + "terminal production-document roster changed" + ) + expected = _production_document_evidence() + for label, binding in value.items(): + observed = _reopen_file_binding( + binding, + label=f"terminal production {label}", + maximum=64 * 1024 * 1024, + ) + path, digest = PRODUCTION_DOCUMENT_BINDINGS[label] + if ( + Path(binding["absolute_path"]) != path + or observed.file_sha256 != digest + or dict(binding) != expected[label] + ): + raise TerminalCertificationR5Error( + f"terminal production {label} changed" + ) + return expected + + +def _validate_terminal_checkpoint_shapes( + *, + latest: Mapping[str, Any], + best: Mapping[str, Any], +) -> None: + latest_keys = { + "head_file_sha256", + "head_size_bytes", + "receipt_file_sha256", + "receipt_size_bytes", + "payload_file_sha256", + "payload_size_bytes", + "checkpoint_semantic_sha256", + "checkpoint_ordinal", + "epoch_index", + "phase", + "group_cursor", + "micro_pack_cursor", + "epoch_group_plan_sha256", + "epoch_successful_group_steps", + "planned_group_count", + "ordered_group_binding_sha256", + "terminal_status", + "contract_sha256", + } + best_keys = { + "head_file_sha256", + "head_size_bytes", + "receipt_file_sha256", + "receipt_size_bytes", + "payload_file_sha256", + "payload_size_bytes", + "checkpoint_semantic_sha256", + "epoch_index", + "phase", + "contract_sha256", + "category", + "source_latest_receipt_sha256", + "best_epoch_index", + "scientific_ledger_count", + } + if ( + set(latest) != latest_keys + or set(best) != best_keys + or latest.get("contract_sha256") != CHECKPOINT_CONTRACT_SHA256 + or best.get("contract_sha256") != CHECKPOINT_CONTRACT_SHA256 + or latest.get("phase") != "epoch_group_boundary" + or latest.get("group_cursor") != 0 + or latest.get("micro_pack_cursor") != 0 + or latest.get("epoch_group_plan_sha256") != ZERO_SHA256 + or latest.get("epoch_successful_group_steps") != 0 + or latest.get("planned_group_count") != 0 + or latest.get("ordered_group_binding_sha256") != [] + or latest.get("terminal_status") + not in {"EARLY_STOPPED_WITH_CANDIDATE", "MAX_EPOCHS_WITH_CANDIDATE"} + or type(latest.get("checkpoint_ordinal")) is not int + or latest["checkpoint_ordinal"] <= 28_363 + or type(latest.get("epoch_index")) is not int + or latest["epoch_index"] < 13 + or best.get("category") != "best" + or type(best.get("best_epoch_index")) is not int + or best.get("scientific_ledger_count") != best["best_epoch_index"] + 1 + ): + raise TerminalCertificationR5Error( + "terminal latest/best checkpoint evidence changed" + ) + for label, checkpoint in (("latest", latest), ("best", best)): + for field in ( + "head_file_sha256", + "receipt_file_sha256", + "payload_file_sha256", + "checkpoint_semantic_sha256", + ): + _sha(checkpoint.get(field), f"{label} checkpoint {field}") + for field in ( + "head_size_bytes", + "receipt_size_bytes", + "payload_size_bytes", + ): + if type(checkpoint.get(field)) is not int or checkpoint[field] < 1: + raise TerminalCertificationR5Error( + f"{label} checkpoint {field} changed" + ) + + +def _validate_scheduler_evidence(value: Any) -> dict[str, Any]: + if not isinstance(value, Mapping): + raise TerminalCertificationR5Error("terminal scheduler is absent") + capture_keys = set(CAPTURE_FILENAMES) + expected_keys = { + "summary", + "commands", + "stderr_capture", + *capture_keys, + } + if set(value) != expected_keys: + raise TerminalCertificationR5Error( + "terminal scheduler evidence keys changed" + ) + commands = value.get("commands") + if commands != { + "successor_sacct": list(SUCCESSOR_SACCT_ARGV), + "successor_scontrol": list(SUCCESSOR_SCONTROL_ARGV), + "executed_parent_sacct": list(EXECUTED_PARENT_SACCT_ARGV), + "cancelled_unused_sacct": list(CANCELLED_UNUSED_SACCT_ARGV), + }: + raise TerminalCertificationR5Error( + "terminal scheduler command surface changed" + ) + raws: dict[str, bytes] = {} + for label in capture_keys: + expected_path = R5_OUTPUT_DIRECTORY / CAPTURE_FILENAMES[label] + binding = value[label] + if ( + not isinstance(binding, Mapping) + or Path(str(binding.get("absolute_path", ""))) != expected_path + ): + raise TerminalCertificationR5Error( + f"terminal {label} path changed" + ) + raws[label] = _reopen_file_binding( + binding, label=label, maximum=16 * 1024 * 1024 + ).raw + summary = _validate_scheduler_raw( + successor_sacct_raw=raws["successor_sacct_capture"], + successor_scontrol_raw=raws["successor_scontrol_capture"], + executed_parent_sacct_raw=raws["executed_parent_sacct_capture"], + cancelled_unused_sacct_raw=raws["cancelled_unused_sacct_capture"], + ) + if value.get("summary") != summary: + raise TerminalCertificationR5Error( + "terminal scheduler summary differs from raw captures" + ) + stderr = value.get("stderr_capture") + if ( + not isinstance(stderr, Mapping) + or Path(str(stderr.get("absolute_path", ""))) + != Path(summary["stderr_absolute_path"]) + ): + raise TerminalCertificationR5Error( + "terminal stderr does not match scontrol" + ) + stderr_read = _reopen_file_binding( + stderr, + label="terminal successor stderr", + maximum=64 * 1024 * 1024, + require_readonly=False, + allow_empty=True, + ) + if stderr_read.size_bytes != 0 or stderr_read.file_sha256 != EMPTY_SHA256: + raise TerminalCertificationR5Error( + "terminal successor stderr is not empty" + ) + return summary + + +_TERMINAL_EVIDENCE_KEYS = frozenset( + { + "schema", + "status", + "job_lineage", + "continuation", + "memory_amendment", + "memory_applied", + "scheduler", + "production_documents", + "terminal_checkpoint", + "selected_best_checkpoint", + "checkpoint_cadence", + "official_submitted_artifacts_modified", + "ablation_or_downstream_opened", + "authorization", + "receipt_sha256", + } +) + + +def _validate_terminal_evidence_value( + value: Mapping[str, Any], + *, + terminal_evidence_path: Path, + continuation_path: Path, + memory_amendment_path: Path, + memory_applied_path: Path, + full_fit_result_path: Path, + selected_handoff_path: Path, +) -> dict[str, Any]: + if ( + set(value) != _TERMINAL_EVIDENCE_KEYS + or value.get("schema") != TERMINAL_EVIDENCE_SCHEMA + or value.get("status") != TERMINAL_EVIDENCE_STATUS + or value.get("job_lineage") + != [ + { + "job_id": EXECUTED_PARENT_JOB_ID, + "role": "executed_parent_attempt", + }, + { + "job_id": CANCELLED_UNUSED_JOB_ID, + "role": "cancelled_before_start_unused_successor", + }, + { + "job_id": SUCCESSOR_JOB_ID, + "role": "only_executed_successor", + }, + ] + or value.get("checkpoint_cadence") + != "startup_then_completed_epoch_and_terminal_only" + or value.get("official_submitted_artifacts_modified") is not False + or value.get("ablation_or_downstream_opened") is not False + or value.get("authorization") + != { + "native_ablation_data_binding_authorized": False, + "nova_submission_authorized": False, + "postfit_publication_authorized": False, + } + ): + raise TerminalCertificationR5Error( + "terminal evidence policy/status changed" + ) + receipt = _self_hash(value, "terminal evidence") + lineage = _validate_continuation_lineage( + continuation_path=continuation_path, + memory_amendment_path=memory_amendment_path, + memory_applied_path=memory_applied_path, + ) + expected_lineage_bindings = { + "continuation": _file_binding( + CONTINUATION_PATH, lineage["continuation_read"] + ), + "memory_amendment": _file_binding( + MEMORY_AMENDMENT_PATH, lineage["memory_amendment_read"] + ), + "memory_applied": _file_binding( + MEMORY_APPLIED_PATH, lineage["memory_applied_read"] + ), + } + if any( + value.get(label) != binding + for label, binding in expected_lineage_bindings.items() + ): + raise TerminalCertificationR5Error( + "terminal continuation/memory file binding changed" + ) + _validate_scheduler_evidence(value.get("scheduler")) + _validate_production_documents(value.get("production_documents")) + latest = value.get("terminal_checkpoint") + best = value.get("selected_best_checkpoint") + if not isinstance(latest, Mapping) or not isinstance(best, Mapping): + raise TerminalCertificationR5Error( + "terminal latest/best evidence is absent" + ) + _validate_terminal_checkpoint_shapes(latest=latest, best=best) + + r4, runtime_r6, _handoff_r6, _direct_r2 = _production_dependencies() + try: + result, result_file_sha, selected, selected_file_sha = ( + r4._validate_r6_result_and_handoff( + full_fit_result_path=full_fit_result_path, + selected_handoff_path=selected_handoff_path, + ) + ) + if ( + Path(full_fit_result_path) != FULL_FIT_RESULT_PATH + or Path(selected_handoff_path) != SELECTED_HANDOFF_PATH + or selected.get("scheduler_job_id") != SUCCESSOR_JOB_ID + or result.get("resume_device_class_sha256") + != RESUME_DEVICE_CLASS_SHA256 + or selected.get("resume_device_class_sha256") + != RESUME_DEVICE_CLASS_SHA256 + ): + raise TerminalCertificationR5Error( + "R6 result/handoff successor identity changed" + ) + production_context = r4._reopen_production_documents(value) + terminal_checkpoint = r4._replay_terminal_checkpoint( + result=result, + selected=selected, + terminal_evidence=value, + ) + r4._replay_cuda_attempt_chain( + result=result, + selected=selected, + checkpoint=terminal_checkpoint, + production_context=production_context, + ) + r4._replay_scientific_ledger( + result=result, + selected=selected, + checkpoint=terminal_checkpoint, + ) + best_reopened, best_checkpoint = _checkpoint_object( + checkpoint_root=Path( + str(selected["checkpoint_root_absolute_path"]) + ), + category="best", + runtime_r6=runtime_r6, + ) + _validate_best_checkpoint( + selected=selected, + best_evidence=best_reopened, + best_checkpoint=best_checkpoint, + ) + if dict(best) != best_reopened: + raise TerminalCertificationR5Error( + "selected best evidence differs from live best checkpoint" + ) + except TerminalCertificationR5Error: + raise + except Exception as error: + raise TerminalCertificationR5Error( + "exact R6 terminal replay failed" + ) from error + return { + "value": dict(value), + "receipt_sha256": receipt, + "result": result, + "result_file_sha256": result_file_sha, + "selected": selected, + "selected_file_sha256": selected_file_sha, + } + + +def validate_terminal_evidence( + *, + terminal_evidence_path: Path, + continuation_path: Path = CONTINUATION_PATH, + memory_amendment_path: Path = MEMORY_AMENDMENT_PATH, + memory_applied_path: Path = MEMORY_APPLIED_PATH, + full_fit_result_path: Path = FULL_FIT_RESULT_PATH, + selected_handoff_path: Path = SELECTED_HANDOFF_PATH, +) -> dict[str, Any]: + _require_exact_path( + terminal_evidence_path, TERMINAL_EVIDENCE_PATH, "terminal evidence" + ) + value, _read = read_canonical( + terminal_evidence_path, + label="R5 terminal evidence", + maximum=64 * 1024 * 1024, + ) + return _validate_terminal_evidence_value( + value, + terminal_evidence_path=terminal_evidence_path, + continuation_path=continuation_path, + memory_amendment_path=memory_amendment_path, + memory_applied_path=memory_applied_path, + full_fit_result_path=full_fit_result_path, + selected_handoff_path=selected_handoff_path, + ) + + +def _run_fixed_capture(argv: Sequence[str], label: str) -> bytes: + completed = subprocess.run( + list(argv), + check=False, + capture_output=True, + timeout=30, + ) + if completed.returncode != 0 or completed.stderr: + raise TerminalCertificationR5Error(f"{label} command failed") + return bytes(completed.stdout) + + +def _ensure_r5_output_directory() -> None: + parent = _open_directory_nofollow( + R5_OUTPUT_DIRECTORY.parent, "R5 output parent" + ) + try: + try: + os.mkdir(R5_OUTPUT_DIRECTORY.name, mode=0o750, dir_fd=parent) + except FileExistsError: + pass + finally: + os.close(parent) + descriptor = _open_directory_nofollow( + R5_OUTPUT_DIRECTORY, "R5 output directory" + ) + os.close(descriptor) + + +def build_terminal_evidence() -> dict[str, Any]: + """Capture exact terminal truth; pending/failed jobs publish nothing.""" + + if os.path.lexists(TERMINAL_EVIDENCE_PATH): + raise TerminalCertificationR5Error( + "R5 terminal evidence already exists" + ) + successor_sacct = _run_fixed_capture( + SUCCESSOR_SACCT_ARGV, "successor sacct" + ) + successor_scontrol = _run_fixed_capture( + SUCCESSOR_SCONTROL_ARGV, "successor scontrol" + ) + executed_parent_sacct = _run_fixed_capture( + EXECUTED_PARENT_SACCT_ARGV, "executed parent sacct" + ) + cancelled_unused_sacct = _run_fixed_capture( + CANCELLED_UNUSED_SACCT_ARGV, "cancelled unused sacct" + ) + summary = _validate_scheduler_raw( + successor_sacct_raw=successor_sacct, + successor_scontrol_raw=successor_scontrol, + executed_parent_sacct_raw=executed_parent_sacct, + cancelled_unused_sacct_raw=cancelled_unused_sacct, + ) + stderr_path = Path(summary["stderr_absolute_path"]) + stderr_read = read_immutable( + stderr_path, + label="successor stderr", + expected_sha256=EMPTY_SHA256, + expected_size_bytes=0, + maximum=64 * 1024 * 1024, + require_review_name=True, + require_readonly=False, + allow_empty=True, + ) + lineage = _validate_continuation_lineage( + continuation_path=CONTINUATION_PATH, + memory_amendment_path=MEMORY_AMENDMENT_PATH, + memory_applied_path=MEMORY_APPLIED_PATH, + ) + r4, runtime_r6, _handoff_r6, _direct_r2 = _production_dependencies() + try: + result, _result_file_sha, selected, _selected_file_sha = ( + r4._validate_r6_result_and_handoff( + full_fit_result_path=FULL_FIT_RESULT_PATH, + selected_handoff_path=SELECTED_HANDOFF_PATH, + ) + ) + except Exception as error: + raise TerminalCertificationR5Error( + "terminal R6 result/handoff is not complete" + ) from error + if selected.get("scheduler_job_id") != SUCCESSOR_JOB_ID: + raise TerminalCertificationR5Error( + "terminal handoff does not belong to successor" + ) + checkpoint_root = Path(str(selected["checkpoint_root_absolute_path"])) + latest_evidence, latest_checkpoint = _checkpoint_object( + checkpoint_root=checkpoint_root, + category="latest", + runtime_r6=runtime_r6, + ) + best_evidence, best_checkpoint = _checkpoint_object( + checkpoint_root=checkpoint_root, + category="best", + runtime_r6=runtime_r6, + ) + _validate_terminal_checkpoint_shapes( + latest=latest_evidence, best=best_evidence + ) + _validate_best_checkpoint( + selected=selected, + best_evidence=best_evidence, + best_checkpoint=best_checkpoint, + ) + if ( + result.get("terminal_epoch_index") != latest_evidence["epoch_index"] + or result.get("terminal_status") != latest_evidence["terminal_status"] + or runtime_r6.checkpoint_store_r2.semantic_tree_sha256(latest_checkpoint) + != latest_evidence["checkpoint_semantic_sha256"] + ): + raise TerminalCertificationR5Error( + "terminal result/latest checkpoint changed" + ) + production_documents = _production_document_evidence() + raw_captures = { + "successor_sacct_capture": successor_sacct, + "successor_scontrol_capture": successor_scontrol, + "executed_parent_sacct_capture": executed_parent_sacct, + "cancelled_unused_sacct_capture": cancelled_unused_sacct, + } + scheduler: dict[str, Any] = { + "summary": summary, + "commands": { + "successor_sacct": list(SUCCESSOR_SACCT_ARGV), + "successor_scontrol": list(SUCCESSOR_SCONTROL_ARGV), + "executed_parent_sacct": list(EXECUTED_PARENT_SACCT_ARGV), + "cancelled_unused_sacct": list(CANCELLED_UNUSED_SACCT_ARGV), + }, + "stderr_capture": _file_binding(stderr_path, stderr_read), + } + for label, raw in raw_captures.items(): + path = R5_OUTPUT_DIRECTORY / CAPTURE_FILENAMES[label] + scheduler[label] = { + "absolute_path": os.fspath(path), + "file_sha256": hashlib.sha256(raw).hexdigest(), + "size_bytes": len(raw), + } + value: dict[str, Any] = { + "schema": TERMINAL_EVIDENCE_SCHEMA, + "status": TERMINAL_EVIDENCE_STATUS, + "job_lineage": [ + { + "job_id": EXECUTED_PARENT_JOB_ID, + "role": "executed_parent_attempt", + }, + { + "job_id": CANCELLED_UNUSED_JOB_ID, + "role": "cancelled_before_start_unused_successor", + }, + { + "job_id": SUCCESSOR_JOB_ID, + "role": "only_executed_successor", + }, + ], + "continuation": _file_binding( + CONTINUATION_PATH, lineage["continuation_read"] + ), + "memory_amendment": _file_binding( + MEMORY_AMENDMENT_PATH, lineage["memory_amendment_read"] + ), + "memory_applied": _file_binding( + MEMORY_APPLIED_PATH, lineage["memory_applied_read"] + ), + "scheduler": scheduler, + "production_documents": production_documents, + "terminal_checkpoint": latest_evidence, + "selected_best_checkpoint": best_evidence, + "checkpoint_cadence": ( + "startup_then_completed_epoch_and_terminal_only" + ), + "official_submitted_artifacts_modified": False, + "ablation_or_downstream_opened": False, + "authorization": { + "native_ablation_data_binding_authorized": False, + "nova_submission_authorized": False, + "postfit_publication_authorized": False, + }, + } + value["receipt_sha256"] = sha256_json(value) + + # No path is created until every scheduler/checkpoint/scientific precondition + # above has passed in memory. + _ensure_r5_output_directory() + for label, raw in raw_captures.items(): + _publish_bytes_exclusive( + R5_OUTPUT_DIRECTORY / CAPTURE_FILENAMES[label], + raw, + label, + ) + _publish_canonical_exclusive( + TERMINAL_EVIDENCE_PATH, value, "R5 terminal evidence" + ) + validated = validate_terminal_evidence( + terminal_evidence_path=TERMINAL_EVIDENCE_PATH + ) + if validated["receipt_sha256"] != value["receipt_sha256"]: + raise TerminalCertificationR5Error( + "R5 terminal evidence final readback changed" + ) + return value + + +def _publication_member( + *, + publication: Mapping[str, Any], + label: str, +) -> ImmutableRead: + binding = publication.get(label) + expected_name = R2_PUBLICATION_FILENAMES[label] + expected_path = R2_OUTPUT_DIRECTORY / expected_name + if ( + not isinstance(binding, Mapping) + or set(binding) != _PUBLICATION_BINDING_KEYS + or Path(str(binding.get("absolute_path", ""))) != expected_path + or type(binding.get("size_bytes")) is not int + or binding["size_bytes"] < 1 + or binding.get("mode_octal") != "0400" + or binding.get("nlink") != 1 + or binding.get("exclusive_no_overwrite") is not True + or binding.get("sealed_readback_passed") is not True + or binding.get("idempotent_identical_reuse_supported") is not True + ): + raise TerminalCertificationR5Error( + f"R2 {label} binding changed" + ) + observed = read_immutable( + expected_path, + label=f"R2 {label}", + expected_sha256=str(binding.get("file_sha256")), + expected_size_bytes=binding["size_bytes"], + maximum=4 * 1024 * 1024 * 1024, + ) + if stat.S_IMODE(observed.mode) != 0o400 or observed.nlink != 1: + raise TerminalCertificationR5Error( + f"R2 {label} sealing changed" + ) + return observed + + +def _validate_r2_output_namespace() -> None: + descriptor = _open_directory_nofollow( + R2_OUTPUT_DIRECTORY, "R2 publication directory" + ) + try: + names = sorted(os.listdir(descriptor)) + finally: + os.close(descriptor) + expected = sorted( + [*R2_PUBLICATION_FILENAMES.values(), R2_RECEIPT_FILENAME] + ) + if names != expected: + raise TerminalCertificationR5Error( + "R2 publication namespace has missing/foreign members" + ) + + +def _validate_r2_shards( + *, + export: Mapping[str, Any], + selected_checkpoint_semantic_sha256: str, +) -> dict[str, Any]: + descriptor = _open_directory_nofollow( + R2_SHARD_DIRECTORY, "R2 shard directory" + ) + try: + names = sorted(os.listdir(descriptor)) + finally: + os.close(descriptor) + expected_names = [ + f"review_a5_static_v2_encoded_state_shard_{index:04d}_r4.json" + for index in range(R2_EXPECTED_SHARD_COUNT) + ] + if names != expected_names: + raise TerminalCertificationR5Error( + "R2 shard membership is not exact 0000..0221" + ) + scientific_fields = ( + "selected_checkpoint_semantic_sha256", + "selected_model_state_sha256", + "export_model_state_sha256", + "support_replay_receipt_sha256", + "selected_support_identity_sha256", + "rvq_identity_sha256", + "device_execution_identity_sha256", + "source_authority_file_sha256", + "selected_checkpoint_inference_authority_binding_sha256", + "r6_top_level_python_bundle_sha256", + "complete_development_adapter_source_sha256", + "complete_development_adapter_receipt_sha256", + ) + file_hashes: list[str] = [] + receipt_hashes: list[str] = [] + row_count = 0 + parent_receipt_count = 0 + for index, name in enumerate(names): + shard, observed = read_canonical( + R2_SHARD_DIRECTORY / name, + label=f"R2 shard {index}", + maximum=512 * 1024 * 1024, + ) + rows = shard.get("rows") + descriptors = shard.get("descriptors") + parent_receipts = shard.get("parent_inference_receipts") + if ( + shard.get("schema") + != "bertose_a5_static_v2_encoded_state_shard_20260722_r4" + or shard.get("status") != "PASS_REAL_MODEL_ENCODED_IMMUTABLE_SHARD" + or shard.get("shard_index") != index + or shard.get("selected_checkpoint_semantic_sha256") + != selected_checkpoint_semantic_sha256 + or shard.get("caller_supplied_code_path_used") is not False + or shard.get("official_submitted_artifacts_modified") is not False + or not isinstance(rows, list) + or not isinstance(descriptors, list) + or not isinstance(parent_receipts, list) + or shard.get("row_count") != len(rows) + or shard.get("rows_sha256") != sha256_json(rows) + or any( + shard.get(field) != export.get(field) + for field in scientific_fields + ) + ): + raise TerminalCertificationR5Error( + f"R2 shard {index} scientific/row binding changed" + ) + receipt_hashes.append(_self_hash(shard, f"R2 shard {index}")) + file_hashes.append(observed.file_sha256) + row_count += len(rows) + parent_receipt_count += len(parent_receipts) + if ( + row_count != EXPECTED_COUNTS["all"]["state_count"] + or parent_receipt_count != EXPECTED_COUNTS["all"]["parent_count"] + ): + raise TerminalCertificationR5Error( + "R2 shard aggregate state/parent counts changed" + ) + value = { + "schema": "bertose_a5_static_v2_r5_shard_reopen_audit_20260725", + "shard_count": R2_EXPECTED_SHARD_COUNT, + "row_count": row_count, + "parent_inference_receipt_count": parent_receipt_count, + "ordered_file_sha256": file_hashes, + "ordered_receipt_sha256": receipt_hashes, + } + value["receipt_sha256"] = sha256_json(value) + return value + + +def _validate_r2_values( + *, + result: Mapping[str, Any], + publication: Mapping[str, Any], + selected: Mapping[str, Any], + selected_handoff_file_sha256: str, + direct_r2: Any, +) -> tuple[str, str]: + result_receipt = _self_hash(result, "persisted R2 result") + publication_receipt = _self_hash(publication, "R2 publication") + export = publication.get("export_receipt") + null_receipt = publication.get("null_receipt_sha256") + join = publication.get("join_receipt") + historical = publication.get("historical_held_provenance") + if ( + set(result) != _R2_RESULT_KEYS + or result.get("schema") + != "bertose_a5_static_v2_direct_development_postfit_20260724_r2" + or result.get("status") + != "PASS_DIRECT_FULL_DEVELOPMENT_STATIC_PACKAGE_PUBLISHED" + or result.get("owner_amendment_file_sha256") + != OWNER_AMENDMENT_FILE_SHA256 + or result.get("owner_amendment_receipt_sha256") + != OWNER_AMENDMENT_RECEIPT_SHA256 + or result.get("encoded_counts") != dict(EXPECTED_COUNTS) + or result.get("model_state_unchanged_during_encoding") is not True + or result.get("development_used_for_support_or_null_fit") is not False + or result.get("native_ablation_data_binding_authorized") is not False + or result.get("nova_submission_authorized") is not False + or result.get("official_submitted_artifacts_modified") is not False + or result.get("authorization") + != direct_r2.closed_launch_authorization() + or set(publication) != direct_r2._publication_receipt_keys() + or publication.get("schema") + != "bertose_a5_static_v2_direct_development_publication_20260724_r2" + or publication.get("status") + != "PASS_DIRECT_FULL_DEVELOPMENT_STATIC_PUBLICATION_READBACK" + or publication.get("production_mode") is not True + or publication.get("owner_amendment_file_sha256") + != OWNER_AMENDMENT_FILE_SHA256 + or publication.get("owner_amendment_receipt_sha256") + != OWNER_AMENDMENT_RECEIPT_SHA256 + or publication.get("selected_handoff_file_sha256") + != selected_handoff_file_sha256 + or publication.get("selected_handoff_receipt_sha256") + != selected.get("receipt_sha256") + or publication.get("development_used_for_support_or_null_fit") is not False + or publication.get( + "development_used_for_checkpoint_selection_after_amendment" + ) + is not False + or publication.get( + "model_or_rvq_updated_during_direct_development_encoding" + ) + is not False + or publication.get("native_ablation_data_binding_authorized") is not False + or publication.get("nova_submission_authorized") is not False + or publication.get("official_submitted_artifacts_modified") is not False + or publication.get("authorization") + != direct_r2.closed_launch_authorization() + or not isinstance(export, Mapping) + or export.get("exact_counts") != dict(EXPECTED_COUNTS) + or export.get("selected_checkpoint_semantic_sha256") + != selected.get("selected_best_checkpoint_semantic_sha256") + or export.get("development_used_for_support_or_null_fit") is not False + or export.get("legacy_selection_capacity_role_split_used") is not False + or export.get("caller_supplied_code_path_used") is not False + or publication.get("export_receipt_sha256") + != export.get("receipt_sha256") + or result.get("source_closure_sha256") + != export.get("source_closure_sha256") + or result.get("selected_checkpoint_semantic_sha256") + != selected.get("selected_best_checkpoint_semantic_sha256") + or result.get("publication_receipt_sha256") != publication_receipt + or publication.get("preserved_authority_role_counts") + != dict(EXPECTED_AUTHORITY_ROLE_COUNTS) + or not isinstance(historical, Mapping) + or historical.get("counts") + != {"parent_count": 1_036, "state_count": 1_532, "residue_count": 9_740} + or historical.get("used_as_postfit_publication_gate") is not False + or not isinstance(join, Mapping) + or join.get("sequence_row_count") != 28_370 + or join.get("static_parent_count") != 28_370 + or join.get("token_state_count") != 42_372 + or join.get("token_parent_count") != 28_370 + or publication.get("join_receipt_sha256") != join.get("receipt_sha256") + or publication.get("null_receipt_sha256") != null_receipt + ): + raise TerminalCertificationR5Error( + "R2 result/publication exact counts, amendment, or policy changed" + ) + _self_hash(export, "R2 export receipt") + _self_hash(join, "R2 join receipt") + _self_hash(historical, "R2 historical provenance") + return result_receipt, publication_receipt + + +def _validate_r2_result_and_publication( + *, + result_path: Path, + selected: Mapping[str, Any], + selected_handoff_file_sha256: str, +) -> dict[str, Any]: + _require_exact_path( + result_path, PERSISTED_R2_RESULT_PATH, "persisted R2 result" + ) + direct_r2, _surface = _validate_r2_frozen_surface() + result, result_read = read_canonical( + PERSISTED_R2_RESULT_PATH, + label="persisted R2 result", + maximum=16 * 1024 * 1024, + ) + publication_path = R2_OUTPUT_DIRECTORY / R2_RECEIPT_FILENAME + publication, publication_read = read_canonical( + publication_path, + label="R2 publication receipt", + maximum=64 * 1024 * 1024, + ) + result_receipt, publication_receipt = _validate_r2_values( + result=result, + publication=publication, + selected=selected, + selected_handoff_file_sha256=selected_handoff_file_sha256, + direct_r2=direct_r2, + ) + _validate_r2_output_namespace() + members = { + label: _publication_member(publication=publication, label=label) + for label in R2_PUBLICATION_FILENAMES + } + null_value = _canonical_from_read( + members["null_publication"], "R2 null publication" + ) + if ( + _self_hash(null_value, "R2 null publication") + != publication.get("null_receipt_sha256") + or null_value.get("schema") + != "bertose_a5_static_v2_published_train_only_null_20260722_r4" + or null_value.get("status") + != "FROZEN_PREPARATION_ONLY_TRAIN_ONLY_STATIC_NULL" + or null_value.get("train_state_count") != 34_408 + or null_value.get("development_state_count_read_during_fit") != 0 + or null_value.get("fit_used_training_only") is not True + or null_value.get("selected_checkpoint_semantic_sha256") + != selected.get("selected_best_checkpoint_semantic_sha256") + ): + raise TerminalCertificationR5Error( + "R2 train-only null publication changed" + ) + shard_audit = _validate_r2_shards( + export=publication["export_receipt"], + selected_checkpoint_semantic_sha256=selected[ + "selected_best_checkpoint_semantic_sha256" + ], + ) + return { + "result": result, + "result_read": result_read, + "result_receipt_sha256": result_receipt, + "publication": publication, + "publication_read": publication_read, + "publication_receipt_sha256": publication_receipt, + "members": members, + "shard_audit": shard_audit, + } + + +def _r2_invocation_contract( + *, selected_handoff_file_sha256: str +) -> dict[str, Any]: + value: dict[str, Any] = { + "schema": "bertose_a5_static_v2_r2_invocation_contract_20260725_r5", + "sbatch": { + "absolute_path": os.fspath(R2_SBATCH_PATH), + "file_sha256": R2_SBATCH_SHA256, + "size_bytes": R2_SBATCH_SIZE_BYTES, + }, + "r2_core": { + "absolute_path": os.fspath(R2_CORE_PATH), + "file_sha256": R2_CORE_SHA256, + "size_bytes": R2_CORE_SIZE_BYTES, + }, + "owner_amendment": { + "absolute_path": os.fspath(OWNER_AMENDMENT_PATH), + "file_sha256": OWNER_AMENDMENT_FILE_SHA256, + "receipt_sha256": OWNER_AMENDMENT_RECEIPT_SHA256, + }, + "selected_handoff": { + "absolute_path": os.fspath(SELECTED_HANDOFF_PATH), + "file_sha256": selected_handoff_file_sha256, + }, + "inputs": { + label: { + "absolute_path": os.fspath(path), + "file_sha256": digest, + "size_bytes": size, + } + for label, (path, digest, size) in R2_INPUT_BINDINGS.items() + }, + "output_directory": os.fspath(R2_OUTPUT_DIRECTORY), + "shard_directory": os.fspath(R2_SHARD_DIRECTORY), + "device_type": R2_DEVICE_TYPE, + "shard_size": R2_SHARD_SIZE, + "arbitrary_callback_accepted": False, + "arbitrary_result_accepted": False, + } + value["receipt_sha256"] = sha256_json(value) + return value + + +_BOUND_FILE_KEYS = frozenset( + {"absolute_path", "file_sha256", "size_bytes", "receipt_sha256"} +) +_BOUND_FILES = frozenset( + { + "terminal_evidence", + "continuation", + "memory_amendment", + "memory_applied", + "full_fit_result", + "selected_handoff", + "direct_publication", + "persisted_r2_result", + "token_publication", + "state_publication", + "null_publication", + "traceability_publication", + } +) +_BINDING_KEYS = frozenset( + { + "schema", + "status", + "successor_job_id", + "cancelled_unused_job_id", + "executed_attempt_job_ids", + "bound_files", + "terminal_evidence_receipt_sha256", + "full_fit_result_receipt_sha256", + "selected_handoff_receipt_sha256", + "selected_checkpoint_semantic_sha256", + "r4_predecessor_source_sha256", + "active_r6_runtime_source_sha256", + "active_r6_handoff_source_sha256", + "r2_direct_source_sha256", + "r2_invocation_contract", + "r2_invocation_contract_sha256", + "r2_result_receipt_sha256", + "r2_publication_receipt_sha256", + "r2_shard_audit", + "r2_shard_audit_sha256", + "publication_members_reopened", + "terminal_latest_and_selected_best_reopened", + "terminal_continuation_required_for_native_eight_release", + "native_ablation_data_binding_authorized", + "nova_submission_authorized", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } +) + + +def _bound_file( + *, + path: Path, + observed: ImmutableRead, + receipt_sha256: str | None, +) -> dict[str, Any]: + if receipt_sha256 is not None: + _sha(receipt_sha256, f"{path.name} receipt") + return { + "absolute_path": os.fspath(path), + "file_sha256": observed.file_sha256, + "size_bytes": observed.size_bytes, + "receipt_sha256": receipt_sha256, + } + + +def _build_bound_files( + *, + terminal_read: ImmutableRead, + terminal_receipt_sha256: str, + lineage: Mapping[str, Any], + result: Mapping[str, Any], + result_read: ImmutableRead, + selected: Mapping[str, Any], + selected_read: ImmutableRead, + r2: Mapping[str, Any], +) -> dict[str, dict[str, Any]]: + members = r2["members"] + publication = r2["publication"] + null_value = _canonical_from_read( + members["null_publication"], "R2 bound null" + ) + return { + "terminal_evidence": _bound_file( + path=TERMINAL_EVIDENCE_PATH, + observed=terminal_read, + receipt_sha256=terminal_receipt_sha256, + ), + "continuation": _bound_file( + path=CONTINUATION_PATH, + observed=lineage["continuation_read"], + receipt_sha256=CONTINUATION_RECEIPT_SHA256, + ), + "memory_amendment": _bound_file( + path=MEMORY_AMENDMENT_PATH, + observed=lineage["memory_amendment_read"], + receipt_sha256=MEMORY_AMENDMENT_RECEIPT_SHA256, + ), + "memory_applied": _bound_file( + path=MEMORY_APPLIED_PATH, + observed=lineage["memory_applied_read"], + receipt_sha256=MEMORY_APPLIED_RECEIPT_SHA256, + ), + "full_fit_result": _bound_file( + path=FULL_FIT_RESULT_PATH, + observed=result_read, + receipt_sha256=str(result["receipt_sha256"]), + ), + "selected_handoff": _bound_file( + path=SELECTED_HANDOFF_PATH, + observed=selected_read, + receipt_sha256=str(selected["receipt_sha256"]), + ), + "direct_publication": _bound_file( + path=R2_OUTPUT_DIRECTORY / R2_RECEIPT_FILENAME, + observed=r2["publication_read"], + receipt_sha256=r2["publication_receipt_sha256"], + ), + "persisted_r2_result": _bound_file( + path=PERSISTED_R2_RESULT_PATH, + observed=r2["result_read"], + receipt_sha256=r2["result_receipt_sha256"], + ), + "token_publication": _bound_file( + path=R2_OUTPUT_DIRECTORY + / R2_PUBLICATION_FILENAMES["token_publication"], + observed=members["token_publication"], + receipt_sha256=None, + ), + "state_publication": _bound_file( + path=R2_OUTPUT_DIRECTORY + / R2_PUBLICATION_FILENAMES["state_publication"], + observed=members["state_publication"], + receipt_sha256=None, + ), + "null_publication": _bound_file( + path=R2_OUTPUT_DIRECTORY + / R2_PUBLICATION_FILENAMES["null_publication"], + observed=members["null_publication"], + receipt_sha256=_self_hash(null_value, "R2 bound null"), + ), + "traceability_publication": _bound_file( + path=R2_OUTPUT_DIRECTORY + / R2_PUBLICATION_FILENAMES["traceability_publication"], + observed=members["traceability_publication"], + receipt_sha256=None, + ), + } + + +def _reopen_bound_file( + name: str, binding: Mapping[str, Any] +) -> ImmutableRead: + expected_paths = { + "terminal_evidence": TERMINAL_EVIDENCE_PATH, + "continuation": CONTINUATION_PATH, + "memory_amendment": MEMORY_AMENDMENT_PATH, + "memory_applied": MEMORY_APPLIED_PATH, + "full_fit_result": FULL_FIT_RESULT_PATH, + "selected_handoff": SELECTED_HANDOFF_PATH, + "direct_publication": R2_OUTPUT_DIRECTORY / R2_RECEIPT_FILENAME, + "persisted_r2_result": PERSISTED_R2_RESULT_PATH, + "token_publication": ( + R2_OUTPUT_DIRECTORY / R2_PUBLICATION_FILENAMES["token_publication"] + ), + "state_publication": ( + R2_OUTPUT_DIRECTORY / R2_PUBLICATION_FILENAMES["state_publication"] + ), + "null_publication": ( + R2_OUTPUT_DIRECTORY / R2_PUBLICATION_FILENAMES["null_publication"] + ), + "traceability_publication": ( + R2_OUTPUT_DIRECTORY + / R2_PUBLICATION_FILENAMES["traceability_publication"] + ), + } + if ( + name not in expected_paths + or set(binding) != _BOUND_FILE_KEYS + or Path(str(binding.get("absolute_path", ""))) != expected_paths[name] + or type(binding.get("size_bytes")) is not int + or binding["size_bytes"] < 1 + or ( + binding.get("receipt_sha256") is not None + and SHA_RE.fullmatch(str(binding.get("receipt_sha256"))) is None + ) + ): + raise TerminalCertificationR5Error(f"R5 bound file {name} changed") + return read_immutable( + expected_paths[name], + label=f"R5 bound {name}", + expected_sha256=str(binding.get("file_sha256")), + expected_size_bytes=binding["size_bytes"], + maximum=4 * 1024 * 1024 * 1024, + require_readonly=name + not in {"memory_amendment", "memory_applied"}, + ) + + +def _validate_binding_value( + *, + binding: Mapping[str, Any], + terminal: Mapping[str, Any], + terminal_read: ImmutableRead, + lineage: Mapping[str, Any], + result: Mapping[str, Any], + result_read: ImmutableRead, + selected: Mapping[str, Any], + selected_read: ImmutableRead, + r2: Mapping[str, Any], + direct_r2: Any, +) -> dict[str, Any]: + value = dict(binding) + receipt = _self_hash(value, "R5 terminal certification binding") + invocation = _r2_invocation_contract( + selected_handoff_file_sha256=selected_read.file_sha256 + ) + expected_bound = _build_bound_files( + terminal_read=terminal_read, + terminal_receipt_sha256=terminal["receipt_sha256"], + lineage=lineage, + result=result, + result_read=result_read, + selected=selected, + selected_read=selected_read, + r2=r2, + ) + if ( + set(value) != _BINDING_KEYS + or value.get("schema") != BINDING_SCHEMA + or value.get("status") != BINDING_STATUS + or value.get("successor_job_id") != SUCCESSOR_JOB_ID + or value.get("cancelled_unused_job_id") != CANCELLED_UNUSED_JOB_ID + or value.get("executed_attempt_job_ids") + != [EXECUTED_PARENT_JOB_ID, SUCCESSOR_JOB_ID] + or value.get("bound_files") != expected_bound + or value.get("terminal_evidence_receipt_sha256") + != terminal["receipt_sha256"] + or value.get("full_fit_result_receipt_sha256") + != result["receipt_sha256"] + or value.get("selected_handoff_receipt_sha256") + != selected["receipt_sha256"] + or value.get("selected_checkpoint_semantic_sha256") + != selected["selected_best_checkpoint_semantic_sha256"] + or value.get("r4_predecessor_source_sha256") + != R4_PREDECESSOR_SHA256 + or value.get("active_r6_runtime_source_sha256") + != ACTIVE_R6_RUNTIME_SHA256 + or value.get("active_r6_handoff_source_sha256") + != ACTIVE_R6_HANDOFF_SHA256 + or value.get("r2_direct_source_sha256") != R2_CORE_SHA256 + or value.get("r2_invocation_contract") != invocation + or value.get("r2_invocation_contract_sha256") + != invocation["receipt_sha256"] + or value.get("r2_result_receipt_sha256") + != r2["result_receipt_sha256"] + or value.get("r2_publication_receipt_sha256") + != r2["publication_receipt_sha256"] + or value.get("r2_shard_audit") != r2["shard_audit"] + or value.get("r2_shard_audit_sha256") + != r2["shard_audit"]["receipt_sha256"] + or value.get("publication_members_reopened") + != [ + "token_publication", + "state_publication", + "null_publication", + "traceability_publication", + ] + or value.get("terminal_latest_and_selected_best_reopened") is not True + or value.get( + "terminal_continuation_required_for_native_eight_release" + ) + is not True + or value.get("native_ablation_data_binding_authorized") is not False + or value.get("nova_submission_authorized") is not False + or value.get("official_submitted_artifacts_modified") is not False + or value.get("authorization") + != direct_r2.closed_launch_authorization() + ): + raise TerminalCertificationR5Error( + "R5 terminal certification binding changed" + ) + bound = value.get("bound_files") + if not isinstance(bound, Mapping) or set(bound) != _BOUND_FILES: + raise TerminalCertificationR5Error("R5 bound-file roster changed") + for name, item in bound.items(): + observed = _reopen_bound_file(name, item) + if observed.file_sha256 != expected_bound[name]["file_sha256"]: + raise TerminalCertificationR5Error( + f"R5 bound-file {name} readback changed" + ) + if receipt != value["receipt_sha256"]: + raise TerminalCertificationR5Error("R5 binding self-hash changed") + return value + + +def validate_terminal_publication_binding( + *, + binding_path: Path, + expected_binding_file_sha256: str, +) -> dict[str, Any]: + """Read-only deep validation of the completed R5 outer binding.""" + + _require_exact_path(binding_path, BINDING_OUTPUT_PATH, "R5 binding") + binding, binding_read = read_canonical( + BINDING_OUTPUT_PATH, + label="R5 terminal certification binding", + expected_sha256=expected_binding_file_sha256, + maximum=512 * 1024 * 1024, + ) + terminal_artifacts = validate_terminal_evidence( + terminal_evidence_path=TERMINAL_EVIDENCE_PATH + ) + terminal, terminal_read = read_canonical( + TERMINAL_EVIDENCE_PATH, + label="R5 bound terminal evidence", + maximum=64 * 1024 * 1024, + ) + lineage = _validate_continuation_lineage( + continuation_path=CONTINUATION_PATH, + memory_amendment_path=MEMORY_AMENDMENT_PATH, + memory_applied_path=MEMORY_APPLIED_PATH, + ) + result, result_read = read_canonical( + FULL_FIT_RESULT_PATH, + label="R5 bound full-fit result", + maximum=64 * 1024 * 1024, + ) + selected, selected_read = read_canonical( + SELECTED_HANDOFF_PATH, + label="R5 bound selected handoff", + maximum=64 * 1024 * 1024, + ) + if ( + result != terminal_artifacts["result"] + or selected != terminal_artifacts["selected"] + ): + raise TerminalCertificationR5Error( + "R5 terminal result/handoff readback changed" + ) + direct_r2, _surface = _validate_r2_frozen_surface() + r2 = _validate_r2_result_and_publication( + result_path=PERSISTED_R2_RESULT_PATH, + selected=selected, + selected_handoff_file_sha256=selected_read.file_sha256, + ) + validated = _validate_binding_value( + binding=binding, + terminal=terminal, + terminal_read=terminal_read, + lineage=lineage, + result=result, + result_read=result_read, + selected=selected, + selected_read=selected_read, + r2=r2, + direct_r2=direct_r2, + ) + if binding_read.file_sha256 != expected_binding_file_sha256: + raise TerminalCertificationR5Error( + "R5 binding file hash changed during validation" + ) + return validated + + +def validate_release_binding( + binding_path: Path, + expected_sha256: str, + expected_size_bytes: int, +) -> dict[str, Any]: + """Exact callback-free three-argument adapter for native-eight release.""" + + _require_exact_path(binding_path, BINDING_OUTPUT_PATH, "R5 release binding") + observed = read_immutable( + BINDING_OUTPUT_PATH, + label="R5 native-eight release binding", + expected_sha256=expected_sha256, + expected_size_bytes=expected_size_bytes, + maximum=512 * 1024 * 1024, + ) + validated = validate_terminal_publication_binding( + binding_path=BINDING_OUTPUT_PATH, + expected_binding_file_sha256=expected_sha256, + ) + if canonical_bytes(validated) != observed.raw: + raise TerminalCertificationR5Error( + "R5 release adapter did not return exact binding bytes" + ) + return validated + + +def run_certified_direct_postfit() -> dict[str, Any]: + """Hard-call frozen R2 only after exact successor terminal validation.""" + + if ( + os.path.lexists(PERSISTED_R2_RESULT_PATH) + or os.path.lexists(BINDING_OUTPUT_PATH) + ): + raise TerminalCertificationR5Error( + "R5 result/binding output already exists" + ) + terminal_artifacts = validate_terminal_evidence( + terminal_evidence_path=TERMINAL_EVIDENCE_PATH + ) + terminal, terminal_read = read_canonical( + TERMINAL_EVIDENCE_PATH, + label="R5 postfit terminal evidence", + maximum=64 * 1024 * 1024, + ) + lineage = _validate_continuation_lineage( + continuation_path=CONTINUATION_PATH, + memory_amendment_path=MEMORY_AMENDMENT_PATH, + memory_applied_path=MEMORY_APPLIED_PATH, + ) + result, result_read = read_canonical( + FULL_FIT_RESULT_PATH, + label="R5 postfit full-fit result", + maximum=64 * 1024 * 1024, + ) + selected, selected_read = read_canonical( + SELECTED_HANDOFF_PATH, + label="R5 postfit selected handoff", + maximum=64 * 1024 * 1024, + ) + if ( + result != terminal_artifacts["result"] + or selected != terminal_artifacts["selected"] + ): + raise TerminalCertificationR5Error( + "R5 postfit terminal inputs changed" + ) + _require_r2_environment() + direct_r2, _surface = _validate_r2_frozen_surface() + invocation = _r2_invocation( + selected_handoff_file_sha256=selected_read.file_sha256 + ) + try: + produced = dict(direct_r2.run_direct_postfit(**invocation)) + except Exception as error: + raise TerminalCertificationR5Error( + "frozen R2 direct postfit hard-call failed" + ) from error + publication, _publication_read = read_canonical( + R2_OUTPUT_DIRECTORY / R2_RECEIPT_FILENAME, + label="new R2 publication receipt", + maximum=64 * 1024 * 1024, + ) + _validate_r2_values( + result=produced, + publication=publication, + selected=selected, + selected_handoff_file_sha256=selected_read.file_sha256, + direct_r2=direct_r2, + ) + _publish_canonical_exclusive( + PERSISTED_R2_RESULT_PATH, + produced, + "R5 persisted R2 result", + ) + r2 = _validate_r2_result_and_publication( + result_path=PERSISTED_R2_RESULT_PATH, + selected=selected, + selected_handoff_file_sha256=selected_read.file_sha256, + ) + bound_files = _build_bound_files( + terminal_read=terminal_read, + terminal_receipt_sha256=terminal["receipt_sha256"], + lineage=lineage, + result=result, + result_read=result_read, + selected=selected, + selected_read=selected_read, + r2=r2, + ) + invocation_contract = _r2_invocation_contract( + selected_handoff_file_sha256=selected_read.file_sha256 + ) + value: dict[str, Any] = { + "schema": BINDING_SCHEMA, + "status": BINDING_STATUS, + "successor_job_id": SUCCESSOR_JOB_ID, + "cancelled_unused_job_id": CANCELLED_UNUSED_JOB_ID, + "executed_attempt_job_ids": [ + EXECUTED_PARENT_JOB_ID, + SUCCESSOR_JOB_ID, + ], + "bound_files": bound_files, + "terminal_evidence_receipt_sha256": terminal["receipt_sha256"], + "full_fit_result_receipt_sha256": result["receipt_sha256"], + "selected_handoff_receipt_sha256": selected["receipt_sha256"], + "selected_checkpoint_semantic_sha256": selected[ + "selected_best_checkpoint_semantic_sha256" + ], + "r4_predecessor_source_sha256": R4_PREDECESSOR_SHA256, + "active_r6_runtime_source_sha256": ACTIVE_R6_RUNTIME_SHA256, + "active_r6_handoff_source_sha256": ACTIVE_R6_HANDOFF_SHA256, + "r2_direct_source_sha256": R2_CORE_SHA256, + "r2_invocation_contract": invocation_contract, + "r2_invocation_contract_sha256": invocation_contract[ + "receipt_sha256" + ], + "r2_result_receipt_sha256": r2["result_receipt_sha256"], + "r2_publication_receipt_sha256": r2[ + "publication_receipt_sha256" + ], + "r2_shard_audit": r2["shard_audit"], + "r2_shard_audit_sha256": r2["shard_audit"]["receipt_sha256"], + "publication_members_reopened": [ + "token_publication", + "state_publication", + "null_publication", + "traceability_publication", + ], + "terminal_latest_and_selected_best_reopened": True, + "terminal_continuation_required_for_native_eight_release": True, + "native_ablation_data_binding_authorized": False, + "nova_submission_authorized": False, + "official_submitted_artifacts_modified": False, + "authorization": direct_r2.closed_launch_authorization(), + } + value["receipt_sha256"] = sha256_json(value) + binding_read = _publish_canonical_exclusive( + BINDING_OUTPUT_PATH, + value, + "R5 terminal certification binding", + ) + validated = validate_release_binding( + BINDING_OUTPUT_PATH, + binding_read.file_sha256, + binding_read.size_bytes, + ) + if validated != value: + raise TerminalCertificationR5Error( + "R5 outer binding final readback changed" + ) + return value + + +__all__ = [ + "BINDING_SCHEMA", + "BINDING_STATUS", + "TerminalCertificationR5Error", + "build_terminal_evidence", + "run_certified_direct_postfit", + "validate_release_binding", + "validate_terminal_evidence", + "validate_terminal_publication_binding", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/__init__.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..777acba06c6cb360e50d7f0c98c6e81aa3b43d4b --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/__init__.py @@ -0,0 +1,21 @@ +"""Launch-closed terminal certification for static-v2 successor 11762534.""" + +from .review_a5_static_v2_terminal_certification_r6 import ( + BINDING_SCHEMA, + BINDING_STATUS, + TerminalCertificationR6Error, + build_terminal_evidence, + run_certified_direct_postfit, + validate_release_binding, + validate_terminal_publication_binding, +) + +__all__ = [ + "BINDING_SCHEMA", + "BINDING_STATUS", + "TerminalCertificationR6Error", + "build_terminal_evidence", + "run_certified_direct_postfit", + "validate_release_binding", + "validate_terminal_publication_binding", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/review_a5_static_v2_production_module_roster_r6.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/review_a5_static_v2_production_module_roster_r6.json new file mode 100644 index 0000000000000000000000000000000000000000..b5ad17ae08c1b861a94ee0e7f6c1f76400fb8cf2 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/review_a5_static_v2_production_module_roster_r6.json @@ -0,0 +1,263 @@ +{ + "dynamic_optional_modules": [ + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260722_r6.review_a5_static_v2_readonly_selected_best_r6" + ], + "file_modules": { + "review.multimodal.runtime.a5_static_v2_20260721_r7.review_a5_static_graph_materializer_r7": { + "path": "review/multimodal/runtime/a5_static_v2_20260721_r7/review_a5_static_graph_materializer_r7.py", + "sha256": "da8d6dab478ace650fa5af3e99c72dedaf65a6cbc2bf62373fa2082bef748cea", + "size_bytes": 93845 + }, + "review.multimodal.runtime.a5_static_v2_20260721_r8.review_a5_static_v2_r8": { + "path": "review/multimodal/runtime/a5_static_v2_20260721_r8/review_a5_static_v2_r8.py", + "sha256": "351d868a3820170d55ec3b70a0588cdca7af716e059981c12788444b000b4ade", + "size_bytes": 191005 + }, + "review.multimodal.runtime.a5_static_v2_20260722_r9": { + "path": "review/multimodal/runtime/a5_static_v2_20260722_r9/__init__.py", + "sha256": "f41f83ba8c203b68402fa53a5439e2f49e3addfea0a527eaec330d5a9fb68371", + "size_bytes": 507 + }, + "review.multimodal.runtime.a5_static_v2_20260722_r9.review_a5_static_v2_r9_segment_pack": { + "path": "review/multimodal/runtime/a5_static_v2_20260722_r9/review_a5_static_v2_r9_segment_pack.py", + "sha256": "d759be8b69aaf83f52282039249683c06c920467c637c1303062766fa42236b4", + "size_bytes": 9497 + }, + "review.multimodal.runtime.a5_static_v2_complete_development_inference_20260722_r2": { + "path": "review/multimodal/runtime/a5_static_v2_complete_development_inference_20260722_r2/__init__.py", + "sha256": "d3bb35b4f437592a09302a28e65d5682b8e2511407418a11a8212fab2340444b", + "size_bytes": 73 + }, + "review.multimodal.runtime.a5_static_v2_complete_development_inference_20260722_r2.review_a5_static_v2_complete_development_inference_r2": { + "path": "review/multimodal/runtime/a5_static_v2_complete_development_inference_20260722_r2/review_a5_static_v2_complete_development_inference_r2.py", + "sha256": "9794d59c8efa0102d56fa26fee7024ada2c4484a4cf54c411e6c3ea471571558", + "size_bytes": 93638 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_20260721_r1": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_20260721_r1/__init__.py", + "sha256": "192c5322e25685dfe5bfad6ce1a2f66a38527cdf01c9a4ec7c005d77ad37ae46", + "size_bytes": 1063 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_20260721_r1.review_a5_static_v2_full_fit_runtime_r1": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_20260721_r1/review_a5_static_v2_full_fit_runtime_r1.py", + "sha256": "98676620d04d531e4858231ad5236397eb185af1470e28104114a3a9ffe54e28", + "size_bytes": 26756 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_20260721_r1.review_a5_static_v2_prepared_pack_cache_r1": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_20260721_r1/review_a5_static_v2_prepared_pack_cache_r1.py", + "sha256": "7eb0ec7ea5d4a08507928e595c3db8de992b70fc0ae0c4fe2468737649ca662d", + "size_bytes": 42904 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260721_r2": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260721_r2/__init__.py", + "sha256": "34fa4a22d90f8d80b52433435dfd5d63c6258834698c7cd01c72812379b11500", + "size_bytes": 1188 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260721_r2.review_a5_static_v2_full_fit_production_gates_r2": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260721_r2/review_a5_static_v2_full_fit_production_gates_r2.py", + "sha256": "15017a815cdfb034b8a7158cf8860318d535f13d296268966cc730ada961a896", + "size_bytes": 60630 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260721_r2.review_a5_static_v2_retry_safe_cache_r2": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260721_r2/review_a5_static_v2_retry_safe_cache_r2.py", + "sha256": "2268c746903fc630f8ecf7ae3974f6b2bbedf18ca9f896aadb88a22e6e404a3d", + "size_bytes": 33867 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260722_r6": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260722_r6/__init__.py", + "sha256": "0f601448c2608dfad8011145c1db23fbd431d376b219248c5d4adddac85da5d4", + "size_bytes": 1219 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260722_r6.review_a5_static_v2_checkpoint_store_r6": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260722_r6/review_a5_static_v2_checkpoint_store_r6.py", + "sha256": "7eb01216ec8ab525ccca23ea5141c55e14139075e1005279b43ae9bbef25ce01", + "size_bytes": 51289 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260722_r6.review_a5_static_v2_readonly_selected_best_r6": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260722_r6/review_a5_static_v2_readonly_selected_best_r6.py", + "sha256": "1af730dbccf2b212f39240c881fdeb4422613ed79e8ab0334d94c7f49d5c818d", + "size_bytes": 27719 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260722_r6.review_a5_static_v2_resume_crosscheck_r6": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260722_r6/review_a5_static_v2_resume_crosscheck_r6.py", + "sha256": "04056223f387c7cff71eec923ac90e6790b7521fffebc49242c6a00bc5d2bcc4", + "size_bytes": 11562 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260723_r10_postcache_r3": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260723_r10_postcache_r3/__init__.py", + "sha256": "79d4f0cc0f048f1c4dc3671411a9ee48573c0d543da32ac9dd697e287f09918d", + "size_bytes": 1253 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260723_r10_postcache_r3.review_a5_static_v2_checkpoint_store_r6": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260723_r10_postcache_r3/review_a5_static_v2_checkpoint_store_r6.py", + "sha256": "7eb01216ec8ab525ccca23ea5141c55e14139075e1005279b43ae9bbef25ce01", + "size_bytes": 51289 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260723_r10_postcache_r3.review_a5_static_v2_exact_r8_spool_r6": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260723_r10_postcache_r3/review_a5_static_v2_exact_r8_spool_r6.py", + "sha256": "845a51215bdf0c8c0f874db96b705f46e02ad094a42c5d5c4f7c56133db0608f", + "size_bytes": 63356 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260723_r10_postcache_r3.review_a5_static_v2_full_fit_runtime_r6": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260723_r10_postcache_r3/review_a5_static_v2_full_fit_runtime_r6.py", + "sha256": "30c8f300f1c93c2c09bb1effadafa5e02c546750a51e31b1e16bca8329fef538", + "size_bytes": 204416 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260723_r10_postcache_r3.review_a5_static_v2_grad_scaler_resume_r5": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260723_r10_postcache_r3/review_a5_static_v2_grad_scaler_resume_r5.py", + "sha256": "7fb4a1bee4e04d2333905cd29e0ceb7d0d08d5d17893e2ab8211480112c35ac0", + "size_bytes": 18948 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260723_r10_postcache_r3.review_a5_static_v2_r9_integration_r6": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260723_r10_postcache_r3/review_a5_static_v2_r9_integration_r6.py", + "sha256": "b7af4e625d6c5bd2ff70396d486ec95df0e94fad7f20d7c4563138db9e4fa96e", + "size_bytes": 9978 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260723_r10_postcache_r3.review_a5_static_v2_resume_crosscheck_r6": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260723_r10_postcache_r3/review_a5_static_v2_resume_crosscheck_r6.py", + "sha256": "04056223f387c7cff71eec923ac90e6790b7521fffebc49242c6a00bc5d2bcc4", + "size_bytes": 11562 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260723_r10_postcache_r3.review_a5_static_v2_selected_best_handoff_r6": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260723_r10_postcache_r3/review_a5_static_v2_selected_best_handoff_r6.py", + "sha256": "d55943d72ec819cd44a183d51a150b80ec11a89153a85400bd14a8a51498eb0c", + "size_bytes": 55390 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_production_20260723_r10_postcache_r3.review_a5_static_v2_streaming_cache_r6": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_production_20260723_r10_postcache_r3/review_a5_static_v2_streaming_cache_r6.py", + "sha256": "b19d7e672d74fb370d31111fea917daf6df9e2b20a49d24276a0c2a86f2df4ec", + "size_bytes": 31014 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_resume_20260723_r3": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_resume_20260723_r3/__init__.py", + "sha256": "c6ed4003df0feda54914177e452ca7ba167e7b9a42ac5eb75ccf737c5a4d4e2e", + "size_bytes": 76 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_resume_20260723_r3.review_a5_static_v2_grad_scaler_resume_r3": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_resume_20260723_r3/review_a5_static_v2_grad_scaler_resume_r3.py", + "sha256": "c6782ea4a131bd07d5a9980fec4b3d8905426ad19c971b264cb1efcd8648d6d3", + "size_bytes": 73421 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_resume_20260723_r4": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_resume_20260723_r4/__init__.py", + "sha256": "d6be801cfcd48d3614358aa519d87b2ce39529731d72f15c4bd83f4b8ad09640", + "size_bytes": 58 + }, + "review.multimodal.runtime.a5_static_v2_full_fit_resume_20260723_r4.review_a5_static_v2_grad_scaler_resume_r4": { + "path": "review/multimodal/runtime/a5_static_v2_full_fit_resume_20260723_r4/review_a5_static_v2_grad_scaler_resume_r4.py", + "sha256": "8e346577f0ac24bca98279378818e682b67d17a21ed2286d92ad28629ec3f427", + "size_bytes": 63412 + }, + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2": { + "path": "review/multimodal/runtime/a5_static_v2_ops_20260721_r2/__init__.py", + "sha256": "1d0e07c286a94e827458ef5727918661663e401f44473bbbce7c14ea2bb36b17", + "size_bytes": 983 + }, + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2.review_a5_static_v2_checkpoint_store_r2": { + "path": "review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_checkpoint_store_r2.py", + "sha256": "f2e558c52bf166d6e7f42ecdd92995f2b70c8a174eab8d6814875399fb69732e", + "size_bytes": 52873 + }, + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2.review_a5_static_v2_frozen_r7_graph_source_r2": { + "path": "review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_frozen_r7_graph_source_r2.py", + "sha256": "249cf009b9418cd2d4aecf333f048459b152aa266afabf6ee59cc949b1f422e1", + "size_bytes": 33186 + }, + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2.review_a5_static_v2_group_fit_runtime_r2": { + "path": "review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_group_fit_runtime_r2.py", + "sha256": "73fa7d8c57f8238972493bdc07c9777d20f1857d4c214dcb4eb4c6a5a557651b", + "size_bytes": 54540 + }, + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2.review_a5_static_v2_mask_contract_r2": { + "path": "review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_mask_contract_r2.py", + "sha256": "5bc2049031612114929636db650f7b317767c72d936ce7cbe5c6b2d3fa558cb8", + "size_bytes": 5838 + }, + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2.review_a5_static_v2_mask_null_runtime_r2": { + "path": "review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_mask_null_runtime_r2.py", + "sha256": "5ea7241a3c05cebc47aa6eac0855454f30366e1ed599020bd4a5a7a4606ab0a8", + "size_bytes": 25897 + }, + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2.review_a5_static_v2_ops_common_r2": { + "path": "review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_ops_common_r2.py", + "sha256": "f4a1c67d242653935f7c05acef35e57cbcc53a35d31773cdec3976b6ecc728a2", + "size_bytes": 6774 + }, + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2.review_a5_static_v2_optimizer_groups_r2": { + "path": "review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_optimizer_groups_r2.py", + "sha256": "b2b4b61a549b5dea48034f540cd021d968c20b45ab339a7147326739c83a61b9", + "size_bytes": 21973 + }, + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2.review_a5_static_v2_production_epoch_adapter_r2": { + "path": "review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_production_epoch_adapter_r2.py", + "sha256": "135604841e5ed61e60c46e3cb6e55981820d49762a9154fac5001cbdc3d864f8", + "size_bytes": 23636 + }, + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2.review_a5_static_v2_production_group_adapter_r2": { + "path": "review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_production_group_adapter_r2.py", + "sha256": "4028f8616a44517c3b27aeb06789ae21f66a3e9ba027ceb9d31677f6cb9ec436", + "size_bytes": 16560 + }, + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2.review_a5_static_v2_production_run_r2": { + "path": "review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_production_run_r2.py", + "sha256": "721156083f8d8588c84f2dfa6a748dda3a120ac04da617ad11184304fda1a647", + "size_bytes": 14799 + }, + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2.review_a5_static_v2_runtime_construction_binding_r2": { + "path": "review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_runtime_construction_binding_r2.py", + "sha256": "c0d67c7aa094d5a6397d5ec86c28accff38e712bc95626ce4c5862a6c9ccac0c", + "size_bytes": 35392 + }, + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2.review_a5_static_v2_science_pack_prefetch_r2": { + "path": "review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_science_pack_prefetch_r2.py", + "sha256": "47981492523d3b3936f960460b47f3566291615930265fe42c7eb88bac1d37e5", + "size_bytes": 16217 + }, + "review.multimodal.runtime.a5_static_v2_postfit_direct_publication_20260724_r2": { + "path": "review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/__init__.py", + "sha256": "c82bc8866c89726ab63c3bbfea52329fd51caf720b927babbcd3215e0be1c2dc", + "size_bytes": 65 + }, + "review.multimodal.runtime.a5_static_v2_postfit_direct_publication_20260724_r2.review_a5_static_v2_postfit_direct_publication_r2": { + "path": "review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/review_a5_static_v2_postfit_direct_publication_r2.py", + "sha256": "8e57c17fd43f3894f94f980cf70a0d6d7f183cf04c26780c3fe30c1932bb7abb", + "size_bytes": 40020 + }, + "review.multimodal.runtime.a5_static_v2_postfit_prep_20260721_r1": { + "path": "review/multimodal/runtime/a5_static_v2_postfit_prep_20260721_r1/__init__.py", + "sha256": "eb881143e8901966f2212793c5b21d8c4936342a9f704a7f02308777053705f7", + "size_bytes": 1226 + }, + "review.multimodal.runtime.a5_static_v2_postfit_prep_20260721_r1.review_a5_static_v2_postfit_common_r1": { + "path": "review/multimodal/runtime/a5_static_v2_postfit_prep_20260721_r1/review_a5_static_v2_postfit_common_r1.py", + "sha256": "16b9a4258c3351331b32d29ed9efdaf831519af10417992a83818680bb26ee20", + "size_bytes": 14139 + }, + "review.multimodal.runtime.a5_static_v2_postfit_production_20260722_r4": { + "path": "review/multimodal/runtime/a5_static_v2_postfit_production_20260722_r4/__init__.py", + "sha256": "897d01d034be113b39b38d9116cb47147b5ebb75f30e318e150c9658fc5c76d8", + "size_bytes": 1068 + }, + "review.multimodal.runtime.a5_static_v2_postfit_production_20260722_r4.review_a5_static_v2_postfit_executor_r4": { + "path": "review/multimodal/runtime/a5_static_v2_postfit_production_20260722_r4/review_a5_static_v2_postfit_executor_r4.py", + "sha256": "a3fd9ab11032e5df3de13f5f43be630a703904b78002de8263827eec589acfce", + "size_bytes": 85587 + }, + "review.multimodal.runtime.a5_static_v2_postfit_production_20260722_r4.review_a5_static_v2_postfit_writer_r4": { + "path": "review/multimodal/runtime/a5_static_v2_postfit_production_20260722_r4/review_a5_static_v2_postfit_writer_r4.py", + "sha256": "ceffd07edb6b8b322baecd95e023053ad8c783cc97cdb2edfc03c0b4fdeeaab6", + "size_bytes": 84752 + } + }, + "namespace_modules": { + "review.multimodal.runtime.a5_static_v2_20260721_r7": [ + "review/multimodal/runtime/a5_static_v2_20260721_r7" + ], + "review.multimodal.runtime.a5_static_v2_20260721_r8": [ + "review/multimodal/runtime/a5_static_v2_20260721_r8" + ] + }, + "official_or_submitted_artifacts_modified": false, + "schema": "bertose_a5_static_v2_terminal_production_module_roster_20260725_r1", + "status": "EXACT_CLEAN_PROCESS_PROJECT_RUNTIME_SOURCE_ROSTER" +} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/review_a5_static_v2_terminal_certification_r6.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/review_a5_static_v2_terminal_certification_r6.py new file mode 100644 index 0000000000000000000000000000000000000000..28a1ae08bca726c04fd9a10f9056da84bf5607c5 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/review_a5_static_v2_terminal_certification_r6.py @@ -0,0 +1,3766 @@ +"""Preterminal strict certification for static-v2 successor job 11762534. + +This source is preparation-only while the successor is pending. It performs +no scheduler mutation and publishes no evidence until fixed scheduler queries +prove that job 11762534 completed successfully. The obsolete R4 draft remains +untouched. This R6 successor retains its exact R6 checkpoint/ledger replay, +adds both cancelled-before-start successors 11762305 and 11762446 as unused +zero-runtime lineage, freezes the whole R2 invocation surface, and reopens +every direct-publication member. +""" + +from __future__ import annotations + +from dataclasses import dataclass +import copy +import hashlib +import importlib +import inspect +import json +import os +from pathlib import Path +import re +import stat +import subprocess +import sys +from types import CodeType, MappingProxyType, ModuleType +from typing import Any, Mapping, Sequence + + +BINDING_SCHEMA = ( + "bertose_a5_static_v2_postfit_terminal_certification_20260725_r6" +) +BINDING_STATUS = ( + "PASS_EXACT_R6_TERMINAL_JOB_11762534_AND_R2_PUBLICATION" +) +TERMINAL_EVIDENCE_SCHEMA = ( + "bertose_a5_static_v2_job_11762534_terminal_evidence_20260725_r6" +) +TERMINAL_EVIDENCE_STATUS = ( + "PASS_EXACT_ONE_V100_SUCCESSOR_WITH_CANCELLED_UNUSED_PREDECESSORS" +) + +SUCCESSOR_JOB_ID = "11762534" +CANCELLED_UNUSED_JOB_IDS = ("11762305", "11762446") +EXECUTED_PARENT_JOB_ID = "11759687" +PARENT_DEPENDENT_JOB_ID = "11759688" +JOB_NAME = "review_a5_sv2_af805f5d2cb8c32e" +ZERO_SHA256 = "0" * 64 +EMPTY_SHA256 = hashlib.sha256(b"").hexdigest() +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") + +WRITING_ROOT = Path(__file__).absolute().parents[4] +REMOTE_ROOT = WRITING_ROOT.parent +RUNTIME_ROOT = WRITING_ROOT / "review/multimodal/runtime" +OUTPUT_ROOT = WRITING_ROOT / "review/multimodal/outputs" +SUCCESSOR_STDOUT_PATH = ( + REMOTE_ROOT + / "slurm" + / f"review_a5_static_v2_epoch_boundary_resume_r1_{SUCCESSOR_JOB_ID}.out" +) +SUCCESSOR_STDERR_PATH = ( + REMOTE_ROOT + / "slurm" + / f"review_a5_static_v2_epoch_boundary_resume_r1_{SUCCESSOR_JOB_ID}.err" +) + +R6_OUTPUT_DIRECTORY = ( + OUTPUT_ROOT + / "review_a5_static_v2_postfit_direct_publication_" + "20260725_r6_terminal_certification" +) +TERMINAL_EVIDENCE_PATH = ( + R6_OUTPUT_DIRECTORY + / "review_a5_static_v2_job_11762534_terminal_evidence_r6.json" +) +PERSISTED_R2_RESULT_PATH = ( + R6_OUTPUT_DIRECTORY + / "review_a5_static_v2_postfit_direct_result_r6.json" +) +BINDING_OUTPUT_PATH = ( + R6_OUTPUT_DIRECTORY + / "review_a5_static_v2_postfit_terminal_certification_binding_r6.json" +) + +FIT_DIRECTORY = ( + OUTPUT_ROOT + / "review_a5_static_v2_postcache_full_fit_execution_" + "20260724_r3_terminal_lineage" +) +FULL_FIT_RESULT_PATH = FIT_DIRECTORY / "review_fit_result.json" +SELECTED_HANDOFF_PATH = FIT_DIRECTORY / "review_selected_best_handoff.json" + +CONTINUATION_DIRECTORY = ( + OUTPUT_ROOT / "review_a5_static_v2_epoch_boundary_resume_20260725_r1" +) +CONTINUATION_PATH = ( + CONTINUATION_DIRECTORY + / "review_a5_static_v2_epoch_boundary_continuation_11762534_r1.json" +) +CONTINUATION_FILE_SHA256 = ( + "163374c5c6b049908d935f0d92d8f1a1adda761550761db9b2cb423bfb450ee1" +) +CONTINUATION_RECEIPT_SHA256 = ( + "ddcf206531b9ab2db553b2e7773a6787d0ca9c0344b7985d70dc06d75e9814b8" +) +MEMORY_AMENDMENT_PATH = ( + CONTINUATION_DIRECTORY + / "review_a5_static_v2_scheduler_memory_amendment_11762534_r3.json" +) +MEMORY_AMENDMENT_FILE_SHA256 = ( + "0d96b7867eeec85dbf14eb8f55b745b7c354edb5d16ac702d17b97bf850c79af" +) +MEMORY_AMENDMENT_RECEIPT_SHA256 = ( + "0763d56c90aea0841298cfc3bb99ab773312c9116d1e3207b48c908bdedfcb2b" +) +MEMORY_APPLIED_PATH = ( + CONTINUATION_DIRECTORY + / "review_a5_static_v2_scheduler_memory_rightsizing_applied_11762534_r3.json" +) +MEMORY_APPLIED_FILE_SHA256 = ( + "6796f0b163dcf21af5dfe3048b53e8d2660fe10290e22222232a6c7f6668396c" +) +MEMORY_APPLIED_RECEIPT_SHA256 = ( + "90d9c8ead2ec77d43c5774f4df331fdb2dba8fb27c4e6674f193d495510d5fca" +) + +CHECKPOINT_CONTRACT_SHA256 = ( + "d4214b58b5dbe9af571b83739fdaf5a399c0d6d4e31a55f89a8f901f8855c8a9" +) +RESUME_DEVICE_CLASS_SHA256 = ( + "f73fda38334de1b0b41af0db00d15514a7a41519932f3f6332faecaf0290e358" +) +SUBMISSION_PAYLOAD_SHA256 = ( + "2cd0573ffe936a5d7831809b521fc045f296e7eeb0783a9107f867cdd8431381" +) + +R4_PREDECESSOR_PATH = ( + RUNTIME_ROOT + / "a5_static_v2_postfit_direct_publication_" + "20260725_r4_terminal_certification" + / "review_a5_static_v2_terminal_certification_r4.py" +) +R4_PREDECESSOR_SHA256 = ( + "3b9632e840265e1a5c1d226f3fe7fb8cd4c448f810f3826c59e19c25132dd04f" +) +R4_PREDECESSOR_SIZE_BYTES = 64_464 +R5_PREDECESSOR_PATH = ( + RUNTIME_ROOT + / "a5_static_v2_postfit_direct_publication_" + "20260725_r5_terminal_certification" + / "review_a5_static_v2_terminal_certification_r5.py" +) +R5_PREDECESSOR_SHA256 = ( + "04d724ee84f67565e2f0229db99006c8f64d2492564643f6e60af25930cf12a1" +) +R5_PREDECESSOR_SIZE_BYTES = 101_721 +ACTIVE_R6_RUNTIME_SHA256 = ( + "30c8f300f1c93c2c09bb1effadafa5e02c546750a51e31b1e16bca8329fef538" +) +ACTIVE_R6_RUNTIME_SIZE_BYTES = 204_416 +ACTIVE_R6_HANDOFF_SHA256 = ( + "d55943d72ec819cd44a183d51a150b80ec11a89153a85400bd14a8a51498eb0c" +) +ACTIVE_R6_HANDOFF_SIZE_BYTES = 55_390 +ACTIVE_R6_PACKAGE = ( + "review.multimodal.runtime." + "a5_static_v2_full_fit_production_20260723_r10_postcache_r3" +) +ACTIVE_R6_RUNTIME_MODULE_NAME = ( + f"{ACTIVE_R6_PACKAGE}.review_a5_static_v2_full_fit_runtime_r6" +) +ACTIVE_R6_HANDOFF_MODULE_NAME = ( + f"{ACTIVE_R6_PACKAGE}.review_a5_static_v2_selected_best_handoff_r6" +) +ACTIVE_R6_CHECKPOINT_MODULE_NAME = ( + f"{ACTIVE_R6_PACKAGE}.review_a5_static_v2_checkpoint_store_r6" +) +ACTIVE_R6_RUNTIME_PATH = ( + RUNTIME_ROOT + / "a5_static_v2_full_fit_production_20260723_r10_postcache_r3" + / "review_a5_static_v2_full_fit_runtime_r6.py" +) +ACTIVE_R6_HANDOFF_PATH = ACTIVE_R6_RUNTIME_PATH.with_name( + "review_a5_static_v2_selected_best_handoff_r6.py" +) +ACTIVE_R6_CHECKPOINT_PATH = ACTIVE_R6_RUNTIME_PATH.with_name( + "review_a5_static_v2_checkpoint_store_r6.py" +) +ACTIVE_R6_CHECKPOINT_SHA256 = ( + "7eb01216ec8ab525ccca23ea5141c55e14139075e1005279b43ae9bbef25ce01" +) +ACTIVE_R6_CHECKPOINT_SIZE_BYTES = 51_289 +BASE_R2_CHECKPOINT_MODULE_NAME = ( + "review.multimodal.runtime.a5_static_v2_ops_20260721_r2." + "review_a5_static_v2_checkpoint_store_r2" +) +BASE_R2_CHECKPOINT_PATH = ( + RUNTIME_ROOT + / "a5_static_v2_ops_20260721_r2" + / "review_a5_static_v2_checkpoint_store_r2.py" +) +BASE_R2_CHECKPOINT_SHA256 = ( + "f2e558c52bf166d6e7f42ecdd92995f2b70c8a174eab8d6814875399fb69732e" +) +BASE_R2_CHECKPOINT_SIZE_BYTES = 52_873 +R2_CORE_SHA256 = ( + "8e57c17fd43f3894f94f980cf70a0d6d7f183cf04c26780c3fe30c1932bb7abb" +) +R2_CORE_SIZE_BYTES = 40_020 +R2_CLI_SHA256 = ( + "c46a7d4644899a5e7551e2dd5eb30666e01e0f36e2f65a2cd821b8c5565258dc" +) +R2_CLI_SIZE_BYTES = 2_601 +R2_INIT_SHA256 = ( + "c82bc8866c89726ab63c3bbfea52329fd51caf720b927babbcd3215e0be1c2dc" +) +R2_INIT_SIZE_BYTES = 65 +R2_SBATCH_SHA256 = ( + "78197215ed27816b4397c77e8c32d52a142c95e58085606aa85addce3b37105c" +) +R2_SBATCH_SIZE_BYTES = 4_877 + +R2_PACKAGE_DIRECTORY = ( + RUNTIME_ROOT / "a5_static_v2_postfit_direct_publication_20260724_r2" +) +R2_CORE_PATH = ( + R2_PACKAGE_DIRECTORY / "review_a5_static_v2_postfit_direct_publication_r2.py" +) +R2_CLI_PATH = ( + R2_PACKAGE_DIRECTORY / "run_review_a5_static_v2_postfit_direct_publication_r2.py" +) +R2_INIT_PATH = R2_PACKAGE_DIRECTORY / "__init__.py" +R2_SBATCH_PATH = ( + WRITING_ROOT + / "review/multimodal/slurm/" + "review_a5_static_v2_postfit_direct_publication_20260724_r2.sbatch" +) +R2_MODULE_NAME = ( + "review.multimodal.runtime." + "a5_static_v2_postfit_direct_publication_20260724_r2." + "review_a5_static_v2_postfit_direct_publication_r2" +) +PRODUCTION_SOURCE_BINDINGS = MappingProxyType( + { + "runtime_r6": ( + ACTIVE_R6_RUNTIME_MODULE_NAME, + ACTIVE_R6_RUNTIME_PATH, + ACTIVE_R6_RUNTIME_SHA256, + ACTIVE_R6_RUNTIME_SIZE_BYTES, + True, + ), + "handoff_r6": ( + ACTIVE_R6_HANDOFF_MODULE_NAME, + ACTIVE_R6_HANDOFF_PATH, + ACTIVE_R6_HANDOFF_SHA256, + ACTIVE_R6_HANDOFF_SIZE_BYTES, + True, + ), + "checkpoint_r6": ( + ACTIVE_R6_CHECKPOINT_MODULE_NAME, + ACTIVE_R6_CHECKPOINT_PATH, + ACTIVE_R6_CHECKPOINT_SHA256, + ACTIVE_R6_CHECKPOINT_SIZE_BYTES, + True, + ), + "checkpoint_base_r2": ( + BASE_R2_CHECKPOINT_MODULE_NAME, + BASE_R2_CHECKPOINT_PATH, + BASE_R2_CHECKPOINT_SHA256, + BASE_R2_CHECKPOINT_SIZE_BYTES, + False, + ), + "direct_r2": ( + R2_MODULE_NAME, + R2_CORE_PATH, + R2_CORE_SHA256, + R2_CORE_SIZE_BYTES, + True, + ), + } +) +PRODUCTION_MODULE_NAMES = tuple( + binding[0] for binding in PRODUCTION_SOURCE_BINDINGS.values() +) +PROJECT_RUNTIME_MODULE_PREFIX = "review.multimodal.runtime." +LOCAL_R6_PACKAGE_NAME = ( + "review.multimodal.runtime." + "a5_static_v2_postfit_direct_publication_" + "20260725_r6_terminal_certification" +) +PRODUCTION_ROSTER_SCHEMA = ( + "bertose_a5_static_v2_terminal_production_module_roster_20260725_r1" +) +PRODUCTION_ROSTER_STATUS = ( + "EXACT_CLEAN_PROCESS_PROJECT_RUNTIME_SOURCE_ROSTER" +) +PRODUCTION_ROSTER_PATH = Path(__file__).absolute().with_name( + "review_a5_static_v2_production_module_roster_r6.json" +) +PRODUCTION_ROSTER_SHA256 = ( + "195d41bba2282fdfde77a88f8b0a70eb64b0207d1a9efd42ddaeb873f8ccaeed" +) +PRODUCTION_ROSTER_SIZE_BYTES = 17_548 + +OWNER_AMENDMENT_PATH = ( + WRITING_ROOT + / "review/multimodal/" + "review_a5_static_v2_direct_development_publication_owner_" + "amendment_20260724_r1.json" +) +OWNER_AMENDMENT_FILE_SHA256 = ( + "876a3746653254a812d5607d1115abfa112fcefb0772b3828efcb26865dfaf7d" +) +OWNER_AMENDMENT_RECEIPT_SHA256 = ( + "672d247a416280617634b8f51c7c69716fd7a6fe010db4109fe634b25c531b93" +) + +R2_INPUT_DIRECTORY = ( + WRITING_ROOT + / "review/multimodal/inputs/" + "review_a5_static_v2_postfit_direct_inputs_20260724_r1" +) +SEQUENCE_DIRECTORY = ( + REMOTE_ROOT / "data/review_sequences_a5_non_iar_80_20_parser_v3_failclosed_20260720_r3" +) +R2_INPUT_BINDINGS = MappingProxyType( + { + "authority_path": ( + R2_INPUT_DIRECTORY / "review_a5_static_graph_v2_authority_r7.tsv.gz", + "59cf794d52341847b08aaa7f4212d1203dec4df89609157d924fda50d54f7602", + 14_602_716, + ), + "fingerprint_path": ( + R2_INPUT_DIRECTORY + / "review_a5_static_graph_v2_fingerprint_ledger_r7.tsv.gz", + "999ce7e9d0c70c79ddb0762d271567ae508b04fa34cc92112ce3be7392b3ada9", + 7_260_424, + ), + "vocabulary_path": ( + R2_INPUT_DIRECTORY + / "review_a5_static_graph_v2_feature_vocabulary_r7.json", + "8ffc04fa6e1522dcab1375ccc9a451def4eec0d53bb840067e653fa9994841bf", + 6_944, + ), + "template_registry_path": ( + R2_INPUT_DIRECTORY / "review_a5_static_glycam_template_registry_r7.json", + "ffbbe2126eb6131ab8b64ab5809b79b29e5534785cbe6fcfe1bba04b93e06050", + 868_036, + ), + "sequence_index_path": ( + SEQUENCE_DIRECTORY / "review_sequence_parent_index.tsv.gz", + "c61e766dbffc4a1d88c7c7fb94deb683943c0861403350e79ab09c70b317fa52", + 17_392_883, + ), + "sequence_residue_ids_path": ( + SEQUENCE_DIRECTORY / "review_residue_ids.npy", + "074b585b74ac1f2d726991b47d3b75516b86ef27f0e07dc3aec0af726a553741", + 143_978_624, + ), + "sequence_attention_mask_path": ( + SEQUENCE_DIRECTORY / "review_attention_mask.npy", + "6c42b020d59b42405da279b8265d7a2041893c57808821cb7943e3503450e549", + 71_989_376, + ), + } +) +R2_OUTPUT_DIRECTORY = ( + OUTPUT_ROOT / "review_a5_static_v2_postfit_direct_publication_20260724_r2" +) +R2_SHARD_DIRECTORY = ( + OUTPUT_ROOT / "review_a5_static_v2_postfit_direct_shards_20260724_r2" +) +R2_DEVICE_TYPE = "cuda" +R2_SHARD_SIZE = 128 +R2_EXPECTED_SHARD_COUNT = 222 + +EXPECTED_COUNTS = MappingProxyType( + { + "pretraining_train": { + "parent_count": 22_980, + "state_count": 34_408, + "residue_count": 205_801, + }, + "pretraining_development": { + "parent_count": 5_390, + "state_count": 7_964, + "residue_count": 51_237, + }, + "all": { + "parent_count": 28_370, + "state_count": 42_372, + "residue_count": 257_038, + "token_count": 1_028_152, + }, + } +) +EXPECTED_AUTHORITY_ROLE_COUNTS = MappingProxyType( + { + "excluded_exact_or_verified_graph_identity": 3_179, + "excluded_later_role_nonfit_identity": 35, + "outside_sequence_authority": 423, + "pretraining_development": 7_964, + "pretraining_train": 34_408, + "static_ineligible": 5_430, + "static_ineligible_incomplete_alpha_beta_pair": 622, + "static_transform_only_exact_development_overlap": 3, + "static_transform_only_exact_excluded_overlap": 2_638, + } +) + +R2_PUBLICATION_FILENAMES = MappingProxyType( + { + "token_publication": "review_a5_static_tokens_v2_r4.pkl", + "state_publication": "review_a5_static_v2_state_authority_r4.tsv", + "null_publication": "review_a5_static_v2_train_only_null_r4.json", + "traceability_publication": ( + "review_a5_static_v2_postfit_traceability_r4.md" + ), + } +) +R2_RECEIPT_FILENAME = "review_a5_static_v2_postfit_publication_receipt_r4.json" + +PRODUCTION_DOCUMENT_BINDINGS = MappingProxyType( + { + "execution_bundle": ( + OUTPUT_ROOT + / "review_a5_static_v2_postcache_full_fit_release_documents_" + "20260724_r19_device_boundary_vendor/" + "review_a5_static_v2_full_fit_direct_bundle_r19.json", + "fb7ef6d0427e42a2a6d94fbe0f2aa41e205d840180b4e4f81eebd3f0d0c0395d", + ), + "owner_authority": ( + OUTPUT_ROOT + / "review_a5_static_v2_postcache_full_fit_release_documents_" + "20260724_r19_device_boundary_vendor/" + "review_a5_static_v2_full_fit_direct_authority_r19.json", + "14a3b3ac5167bd558a6db53e4940aff3a19fd54b24a4d43d026c4d958d4a93cc", + ), + "submission_receipt": ( + OUTPUT_ROOT + / "review_a5_static_v2_postcache_full_fit_release_documents_" + "20260724_r19_device_boundary_vendor/review_submission_ledger/" + "review_a5_static_v2_submission_receipt_" + "af805f5d2cb8c32e74423071ea4c3e3613413d3a324928cdf820ad226f59130c.json", + "878d3eb5b6bbc4903b57d164d5641a47b9b5ec7effec46eb6dae0ef1852ec817", + ), + } +) + +CAPTURE_FILENAMES = MappingProxyType( + { + "successor_sacct_capture": ( + "review_a5_static_v2_job_11762534_sacct_r6.txt" + ), + "successor_scontrol_capture": ( + "review_a5_static_v2_job_11762534_scontrol_r6.txt" + ), + "executed_parent_sacct_capture": ( + "review_a5_static_v2_job_11759687_sacct_r6.txt" + ), + "cancelled_unused_11762305_sacct_capture": ( + "review_a5_static_v2_job_11762305_sacct_r6.txt" + ), + "cancelled_unused_11762446_sacct_capture": ( + "review_a5_static_v2_job_11762446_sacct_r6.txt" + ), + } +) + +SACCT_FORMAT = ( + "JobIDRaw,JobName,State,ExitCode,Elapsed,Partition,Account,QOS," + "ReqMem,AllocTRES,NodeList,Constraints" +) +SUCCESSOR_SACCT_ARGV = ( + "sacct", "-n", "-X", "-P", "-j", SUCCESSOR_JOB_ID, f"--format={SACCT_FORMAT}" +) +EXECUTED_PARENT_SACCT_ARGV = ( + "sacct", "-n", "-X", "-P", "-j", EXECUTED_PARENT_JOB_ID, + f"--format={SACCT_FORMAT}" +) +CANCELLED_UNUSED_SACCT_ARGVS = MappingProxyType( + { + job_id: ( + "sacct", + "-n", + "-X", + "-P", + "-j", + job_id, + f"--format={SACCT_FORMAT}", + ) + for job_id in CANCELLED_UNUSED_JOB_IDS + } +) +SUCCESSOR_SCONTROL_ARGV = ( + "scontrol", "show", "job", "-dd", "-o", SUCCESSOR_JOB_ID +) + +_R2_RESULT_KEYS = frozenset( + { + "schema", + "status", + "owner_amendment_file_sha256", + "owner_amendment_receipt_sha256", + "historical_held_provenance_receipt_sha256", + "source_closure_sha256", + "encoded_counts", + "selected_checkpoint_semantic_sha256", + "model_state_unchanged_during_encoding", + "development_used_for_support_or_null_fit", + "publication_receipt_sha256", + "native_ablation_data_binding_authorized", + "nova_submission_authorized", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } +) +_PUBLICATION_BINDING_KEYS = frozenset( + { + "absolute_path", + "size_bytes", + "file_sha256", + "mode_octal", + "nlink", + "exclusive_no_overwrite", + "sealed_readback_passed", + "idempotent_identical_reuse_supported", + } +) +_EMBEDDED_FILE_BINDING_KEYS = frozenset( + {"absolute_path", "file_sha256", "size_bytes"} +) + + +class TerminalCertificationR6Error(RuntimeError): + """The frozen terminal/publication surface changed.""" + + +@dataclass(frozen=True) +class ImmutableRead: + raw: bytes + file_sha256: str + size_bytes: int + mode: int + nlink: int + + +def canonical_bytes(value: Any) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def sha256_json(value: Any) -> str: + return hashlib.sha256(canonical_bytes(value)).hexdigest() + + +def sha256_json_without_trailing_newline(value: Any) -> str: + raw = json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ).encode("ascii") + return hashlib.sha256(raw).hexdigest() + + +def _sha(value: Any, label: str, *, allow_zero: bool = False) -> str: + if ( + not isinstance(value, str) + or SHA_RE.fullmatch(value) is None + or (not allow_zero and value == ZERO_SHA256) + ): + raise TerminalCertificationR6Error(f"{label} is not SHA-256") + return value + + +def _absolute_normalized(path: Path, label: str) -> Path: + supplied = Path(path) + absolute = supplied.absolute() + if ( + supplied != absolute + or os.path.normpath(os.fspath(absolute)) != os.fspath(absolute) + or not hasattr(os, "O_NOFOLLOW") + or not hasattr(os, "O_DIRECTORY") + ): + raise TerminalCertificationR6Error(f"{label} path is unsafe") + return absolute + + +def _open_directory_nofollow(path: Path, label: str) -> int: + absolute = _absolute_normalized(path, label) + flags = ( + os.O_RDONLY + | os.O_DIRECTORY + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0) + ) + descriptor = os.open(os.sep, flags) + try: + for component in absolute.parts[1:]: + child = os.open(component, flags, dir_fd=descriptor) + os.close(descriptor) + descriptor = child + return descriptor + except OSError as error: + os.close(descriptor) + raise TerminalCertificationR6Error( + f"{label} has a missing or linked component" + ) from error + + +def read_immutable( + path: Path, + *, + label: str, + expected_sha256: str | None = None, + expected_size_bytes: int | None = None, + maximum: int = 4 * 1024 * 1024 * 1024, + require_review_name: bool = True, + require_readonly: bool = True, + allow_empty: bool = False, +) -> ImmutableRead: + """Read one regular file through a component-wise no-follow chain.""" + + absolute = _absolute_normalized(path, label) + if ( + (require_review_name and not absolute.name.startswith("review_")) + or type(maximum) is not int + or maximum < 0 + or (expected_size_bytes is not None and type(expected_size_bytes) is not int) + ): + raise TerminalCertificationR6Error(f"{label} read contract is unsafe") + parent = _open_directory_nofollow(absolute.parent, f"{label} parent") + descriptor: int | None = None + try: + descriptor = os.open( + absolute.name, + os.O_RDONLY | os.O_NOFOLLOW | getattr(os, "O_CLOEXEC", 0), + dir_fd=parent, + ) + before = os.fstat(descriptor) + if ( + not stat.S_ISREG(before.st_mode) + or before.st_nlink != 1 + or (require_readonly and before.st_mode & 0o222) + or before.st_size > maximum + or (before.st_size == 0 and not allow_empty) + ): + raise TerminalCertificationR6Error( + f"{label} is not one bounded regular file" + ) + chunks: list[bytes] = [] + remaining = before.st_size + while remaining: + chunk = os.read(descriptor, min(1 << 20, remaining)) + if not chunk: + raise TerminalCertificationR6Error( + f"{label} truncated while read" + ) + chunks.append(chunk) + remaining -= len(chunk) + after = os.fstat(descriptor) + before_tuple = ( + before.st_dev, + before.st_ino, + before.st_size, + before.st_mtime_ns, + before.st_ctime_ns, + before.st_mode, + before.st_nlink, + ) + after_tuple = ( + after.st_dev, + after.st_ino, + after.st_size, + after.st_mtime_ns, + after.st_ctime_ns, + after.st_mode, + after.st_nlink, + ) + if before_tuple != after_tuple: + raise TerminalCertificationR6Error(f"{label} changed while read") + except OSError as error: + raise TerminalCertificationR6Error( + f"{label} has a missing or linked final component" + ) from error + finally: + if descriptor is not None: + os.close(descriptor) + os.close(parent) + raw = b"".join(chunks) + digest = hashlib.sha256(raw).hexdigest() + if ( + len(raw) != before.st_size + or ( + expected_sha256 is not None + and digest != _sha(expected_sha256, f"{label} expected file") + ) + or ( + expected_size_bytes is not None + and len(raw) != expected_size_bytes + ) + ): + raise TerminalCertificationR6Error(f"{label} readback changed") + return ImmutableRead( + raw=raw, + file_sha256=digest, + size_bytes=len(raw), + mode=before.st_mode, + nlink=before.st_nlink, + ) + + +def _reject_nonfinite_json(token: str) -> None: + raise ValueError(f"non-finite JSON constant {token}") + + +def _canonical_from_read(observed: ImmutableRead, label: str) -> dict[str, Any]: + try: + value = json.loads( + observed.raw.decode("ascii"), + parse_constant=_reject_nonfinite_json, + ) + except (UnicodeDecodeError, json.JSONDecodeError, ValueError) as error: + raise TerminalCertificationR6Error( + f"{label} is not canonical JSON" + ) from error + if type(value) is not dict or canonical_bytes(value) != observed.raw: + raise TerminalCertificationR6Error(f"{label} canonical bytes changed") + return value + + +def _exact_json_from_read( + observed: ImmutableRead, label: str +) -> dict[str, Any]: + """Decode an exact hash-pinned JSON object without changing its layout.""" + + try: + value = json.loads( + observed.raw.decode("ascii"), + parse_constant=_reject_nonfinite_json, + ) + except (UnicodeDecodeError, json.JSONDecodeError, ValueError) as error: + raise TerminalCertificationR6Error( + f"{label} is not finite ASCII JSON" + ) from error + if type(value) is not dict: + raise TerminalCertificationR6Error(f"{label} is not one JSON object") + return value + + +def read_canonical( + path: Path, + *, + label: str, + expected_sha256: str | None = None, + expected_size_bytes: int | None = None, + maximum: int = 64 * 1024 * 1024, + require_readonly: bool = True, +) -> tuple[dict[str, Any], ImmutableRead]: + observed = read_immutable( + path, + label=label, + expected_sha256=expected_sha256, + expected_size_bytes=expected_size_bytes, + maximum=maximum, + require_readonly=require_readonly, + ) + return _canonical_from_read(observed, label), observed + + +def read_exact_json( + path: Path, + *, + label: str, + expected_sha256: str, + expected_size_bytes: int, +) -> tuple[dict[str, Any], ImmutableRead]: + observed = read_immutable( + path, + label=label, + expected_sha256=expected_sha256, + expected_size_bytes=expected_size_bytes, + maximum=expected_size_bytes, + require_readonly=True, + ) + return _exact_json_from_read(observed, label), observed + + +def _self_hash(value: Mapping[str, Any], label: str) -> str: + unsigned = copy.deepcopy(dict(value)) + observed = _sha(unsigned.pop("receipt_sha256", None), f"{label} receipt") + if sha256_json(unsigned) != observed: + raise TerminalCertificationR6Error(f"{label} self-hash changed") + return observed + + +def _self_hash_without_trailing_newline( + value: Mapping[str, Any], label: str +) -> str: + unsigned = copy.deepcopy(dict(value)) + observed = _sha(unsigned.pop("receipt_sha256", None), f"{label} receipt") + if sha256_json_without_trailing_newline(unsigned) != observed: + raise TerminalCertificationR6Error(f"{label} self-hash changed") + return observed + + +def _file_binding(path: Path, observed: ImmutableRead) -> dict[str, Any]: + return { + "absolute_path": os.fspath(Path(path)), + "file_sha256": observed.file_sha256, + "size_bytes": observed.size_bytes, + } + + +def _reopen_file_binding( + value: Any, + *, + label: str, + maximum: int = 4 * 1024 * 1024 * 1024, + require_readonly: bool = True, + allow_empty: bool = False, +) -> ImmutableRead: + if ( + not isinstance(value, Mapping) + or set(value) != _EMBEDDED_FILE_BINDING_KEYS + or type(value.get("absolute_path")) is not str + or type(value.get("size_bytes")) is not int + or value["size_bytes"] < 0 + ): + raise TerminalCertificationR6Error(f"{label} binding changed") + return read_immutable( + Path(value["absolute_path"]), + label=label, + expected_sha256=str(value.get("file_sha256")), + expected_size_bytes=value["size_bytes"], + maximum=maximum, + require_readonly=require_readonly, + allow_empty=allow_empty, + ) + + +def _publish_bytes_exclusive(path: Path, payload: bytes, label: str) -> ImmutableRead: + absolute = _absolute_normalized(path, label) + if not absolute.name.startswith("review_"): + raise TerminalCertificationR6Error(f"{label} is not review-prefixed") + parent = _open_directory_nofollow(absolute.parent, f"{label} parent") + descriptor: int | None = None + try: + descriptor = os.open( + absolute.name, + os.O_WRONLY + | os.O_CREAT + | os.O_EXCL + | os.O_NOFOLLOW + | getattr(os, "O_CLOEXEC", 0), + 0o600, + dir_fd=parent, + ) + offset = 0 + while offset < len(payload): + written = os.write(descriptor, payload[offset:]) + if written <= 0: + raise OSError("short write") + offset += written + os.fsync(descriptor) + os.fchmod(descriptor, 0o400) + os.fsync(descriptor) + except OSError as error: + raise TerminalCertificationR6Error( + f"{label} exclusive publication failed" + ) from error + finally: + if descriptor is not None: + os.close(descriptor) + os.close(parent) + return read_immutable( + absolute, + label=label, + expected_sha256=hashlib.sha256(payload).hexdigest(), + expected_size_bytes=len(payload), + maximum=max(len(payload), 1), + allow_empty=not payload, + ) + + +def _publish_canonical_exclusive( + path: Path, value: Mapping[str, Any], label: str +) -> ImmutableRead: + return _publish_bytes_exclusive(path, canonical_bytes(dict(value)), label) + + +_R4_PRIVATE: ModuleType | None = None +_PRODUCTION_DEPENDENCY_CACHE: dict[str, Any] | None = None + + +def _load_r4_private() -> ModuleType: + """Fresh-load pinned R4 bytes, retargeting only executed-job identity.""" + + global _R4_PRIVATE + source = read_immutable( + R4_PREDECESSOR_PATH, + label="R4 predecessor source", + expected_sha256=R4_PREDECESSOR_SHA256, + expected_size_bytes=R4_PREDECESSOR_SIZE_BYTES, + maximum=R4_PREDECESSOR_SIZE_BYTES, + require_readonly=False, + ) + module = ModuleType("_a5_static_v2_terminal_r4_for_r6") + module.__file__ = os.fspath(R4_PREDECESSOR_PATH) + module.__package__ = "" + exec( + compile( + source.raw, + os.fspath(R4_PREDECESSOR_PATH), + "exec", + dont_inherit=True, + ), + module.__dict__, + ) + module.EXPECTED_JOB_ID = SUCCESSOR_JOB_ID + module.PARENT_JOB_ID = EXECUTED_PARENT_JOB_ID + module.BINDING_STATUS = BINDING_STATUS + module.BINDING_SCHEMA = BINDING_SCHEMA + module.TERMINAL_EVIDENCE_SCHEMA = TERMINAL_EVIDENCE_SCHEMA + module.TERMINAL_EVIDENCE_STATUS = TERMINAL_EVIDENCE_STATUS + for function_name in ( + "_dependencies", + "_validate_r6_result_and_handoff", + "_reopen_production_documents", + "_replay_terminal_checkpoint", + "_replay_cuda_attempt_chain", + "_replay_scientific_ledger", + ): + live = getattr(module, function_name, None) + expected_code = _top_level_code_object( + source=source.raw, + path=R4_PREDECESSOR_PATH, + function_name=function_name, + ) + if ( + not inspect.isfunction(live) + or _semantic_code_identity(live.__code__) + != _semantic_code_identity(expected_code) + or live.__globals__ is not module.__dict__ + ): + raise TerminalCertificationR6Error( + f"private R4 {function_name} callable changed" + ) + _R4_PRIVATE = module + return module + + +def _read_production_source_closure() -> dict[str, ImmutableRead]: + observed: dict[str, ImmutableRead] = {} + for ( + label, + (_module_name, path, digest, size, require_readonly), + ) in PRODUCTION_SOURCE_BINDINGS.items(): + observed[label] = read_immutable( + path, + label=f"{label} production source", + expected_sha256=digest, + expected_size_bytes=size, + maximum=size, + require_readonly=require_readonly, + ) + return observed + + +def _read_project_runtime_roster() -> dict[str, Any]: + roster_read = read_immutable( + PRODUCTION_ROSTER_PATH, + label="production module roster", + expected_sha256=PRODUCTION_ROSTER_SHA256, + expected_size_bytes=PRODUCTION_ROSTER_SIZE_BYTES, + maximum=PRODUCTION_ROSTER_SIZE_BYTES, + require_readonly=True, + ) + try: + value = json.loads(roster_read.raw) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise TerminalCertificationR6Error( + "production module roster is not JSON" + ) from error + expected_raw = ( + json.dumps( + value, + sort_keys=True, + indent=2, + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + if ( + not isinstance(value, dict) + or roster_read.raw != expected_raw + or set(value) + != { + "dynamic_optional_modules", + "file_modules", + "namespace_modules", + "official_or_submitted_artifacts_modified", + "schema", + "status", + } + or value.get("schema") != PRODUCTION_ROSTER_SCHEMA + or value.get("status") != PRODUCTION_ROSTER_STATUS + or value.get("official_or_submitted_artifacts_modified") is not False + ): + raise TerminalCertificationR6Error( + "production module roster contract changed" + ) + file_values = value.get("file_modules") + namespace_values = value.get("namespace_modules") + optional_values = value.get("dynamic_optional_modules") + if ( + not isinstance(file_values, dict) + or len(file_values) != 49 + or not isinstance(namespace_values, dict) + or len(namespace_values) != 2 + or not isinstance(optional_values, list) + or len(optional_values) != 1 + or len(set(optional_values)) != len(optional_values) + ): + raise TerminalCertificationR6Error( + "production module roster cardinality changed" + ) + file_modules: dict[str, tuple[Path, str, int]] = {} + source_reads: dict[str, ImmutableRead] = {} + for module_name, record in file_values.items(): + if ( + not isinstance(module_name, str) + or not module_name.startswith(PROJECT_RUNTIME_MODULE_PREFIX) + or module_name.startswith(f"{LOCAL_R6_PACKAGE_NAME}.") + or not isinstance(record, dict) + or set(record) != {"path", "sha256", "size_bytes"} + ): + raise TerminalCertificationR6Error( + "production file-module roster entry changed" + ) + relative_value = record.get("path") + digest = _sha(record.get("sha256"), f"{module_name} source") + size = record.get("size_bytes") + if ( + not isinstance(relative_value, str) + or type(size) is not int + or size <= 0 + ): + raise TerminalCertificationR6Error( + "production file-module roster value changed" + ) + relative = Path(relative_value) + absolute = (WRITING_ROOT / relative).absolute() + try: + absolute.relative_to(RUNTIME_ROOT) + except ValueError as error: + raise TerminalCertificationR6Error( + "production file-module path escaped runtime root" + ) from error + if ( + relative.is_absolute() + or relative.as_posix() != relative_value + or any(part in {"", ".", ".."} for part in relative.parts) + ): + raise TerminalCertificationR6Error( + "production file-module path changed" + ) + file_modules[module_name] = (absolute, digest, size) + source_reads[module_name] = read_immutable( + absolute, + label=f"{module_name} roster source", + expected_sha256=digest, + expected_size_bytes=size, + maximum=size, + require_review_name=False, + require_readonly=False, + ) + optional_modules = frozenset(optional_values) + if not optional_modules.issubset(file_modules): + raise TerminalCertificationR6Error( + "dynamic production module roster changed" + ) + namespace_modules: dict[str, tuple[Path, ...]] = {} + for module_name, locations in namespace_values.items(): + if ( + not isinstance(module_name, str) + or not module_name.startswith(PROJECT_RUNTIME_MODULE_PREFIX) + or module_name.startswith(f"{LOCAL_R6_PACKAGE_NAME}.") + or not isinstance(locations, list) + or len(locations) != 1 + ): + raise TerminalCertificationR6Error( + "production namespace roster entry changed" + ) + observed_locations: list[Path] = [] + for location_value in locations: + if not isinstance(location_value, str): + raise TerminalCertificationR6Error( + "production namespace path changed" + ) + relative = Path(location_value) + absolute = (WRITING_ROOT / relative).absolute() + try: + absolute.relative_to(RUNTIME_ROOT) + except ValueError as error: + raise TerminalCertificationR6Error( + "production namespace escaped runtime root" + ) from error + if ( + relative.is_absolute() + or relative.as_posix() != location_value + or any(part in {"", ".", ".."} for part in relative.parts) + ): + raise TerminalCertificationR6Error( + "production namespace path changed" + ) + descriptor = _open_directory_nofollow( + absolute, f"{module_name} namespace" + ) + os.close(descriptor) + observed_locations.append(absolute) + namespace_modules[module_name] = tuple(observed_locations) + return { + "file_modules": file_modules, + "namespace_modules": namespace_modules, + "optional_modules": optional_modules, + "source_reads": source_reads, + "roster_read": roster_read, + } + + +def _require_clean_project_runtime() -> None: + preloaded = sorted( + name + for name in sys.modules + if name.startswith(PROJECT_RUNTIME_MODULE_PREFIX) + and name != LOCAL_R6_PACKAGE_NAME + and not name.startswith(f"{LOCAL_R6_PACKAGE_NAME}.") + ) + if preloaded: + raise TerminalCertificationR6Error( + "project runtime modules were preloaded before clean binding: " + + ",".join(preloaded) + ) + + +def _loaded_project_runtime_modules() -> dict[str, ModuleType]: + return { + name: module + for name, module in sys.modules.items() + if name.startswith(PROJECT_RUNTIME_MODULE_PREFIX) + and name != LOCAL_R6_PACKAGE_NAME + and not name.startswith(f"{LOCAL_R6_PACKAGE_NAME}.") + and isinstance(module, ModuleType) + } + + +def _validate_project_runtime_roster( + roster: Mapping[str, Any], prior: Mapping[str, Any] | None +) -> dict[str, Any]: + file_modules = roster["file_modules"] + namespace_modules = roster["namespace_modules"] + optional_modules = roster["optional_modules"] + loaded = _loaded_project_runtime_modules() + required_names = ( + set(file_modules) - set(optional_modules) + ) | set(namespace_modules) + allowed_names = set(file_modules) | set(namespace_modules) + if not required_names.issubset(loaded) or not set(loaded).issubset( + allowed_names + ): + missing = sorted(required_names - set(loaded)) + extra = sorted(set(loaded) - allowed_names) + raise TerminalCertificationR6Error( + "loaded project runtime roster changed; missing=" + + ",".join(missing) + + ";extra=" + + ",".join(extra) + ) + for module_name, (path, _digest, _size) in file_modules.items(): + module = loaded.get(module_name) + if module is None: + continue + _require_production_module( + module, + module_name=module_name, + path=path, + label=module_name, + ) + for module_name, expected_locations in namespace_modules.items(): + module = loaded.get(module_name) + observed_locations = tuple( + Path(location).absolute() + for location in getattr(module, "__path__", ()) + ) + if ( + not isinstance(module, ModuleType) + or module.__name__ != module_name + or getattr(module, "__file__", None) is not None + or sys.modules.get(module_name) is not module + or observed_locations != expected_locations + ): + raise TerminalCertificationR6Error( + f"{module_name} namespace module identity changed" + ) + function_snapshots = { + name: _module_function_snapshot(module) + for name, module in loaded.items() + } + module_global_snapshots = { + name: _module_global_snapshot(module) + for name, module in loaded.items() + } + if prior is not None: + prior_modules = prior["modules"] + removed = set(prior_modules) - set(loaded) + added = set(loaded) - set(prior_modules) + if removed or not added.issubset(optional_modules): + raise TerminalCertificationR6Error( + "project runtime module activation changed" + ) + for name, module in prior_modules.items(): + if loaded[name] is not module: + raise TerminalCertificationR6Error( + f"{name} runtime module object changed" + ) + if not _same_identity_mapping( + function_snapshots[name], + prior["function_snapshots"][name], + ): + raise TerminalCertificationR6Error( + f"{name} runtime callable roster changed" + ) + if not _same_identity_mapping( + module_global_snapshots[name], + prior["module_global_snapshots"][name], + ): + raise TerminalCertificationR6Error( + f"{name} runtime module-global roster changed" + ) + return { + "modules": loaded, + "function_snapshots": function_snapshots, + "module_global_snapshots": module_global_snapshots, + } + + +def _require_production_module( + module: Any, *, module_name: str, path: Path, label: str +) -> ModuleType: + if ( + not isinstance(module, ModuleType) + or module.__name__ != module_name + or Path(str(module.__file__)).absolute() != path + or sys.modules.get(module_name) is not module + ): + raise TerminalCertificationR6Error( + f"{label} production module identity changed" + ) + return module + + +def _require_exact_source_callable( + *, + owner_module: ModuleType, + source_module: ModuleType, + source_read: ImmutableRead, + source_path: Path, + attribute_name: str, +) -> Any: + live = getattr(owner_module, attribute_name, None) + source_live = getattr(source_module, attribute_name, None) + expected_code = _top_level_code_object( + source=source_read.raw, + path=source_path, + function_name=attribute_name, + ) + if ( + not inspect.isfunction(live) + or source_live is not live + or live.__module__ != source_module.__name__ + or live.__globals__ is not source_module.__dict__ + or _semantic_code_identity(live.__code__) + != _semantic_code_identity(expected_code) + or Path(live.__code__.co_filename).absolute() != source_path + ): + raise TerminalCertificationR6Error( + f"{owner_module.__name__}.{attribute_name} callable changed" + ) + return live + + +def _module_function_snapshot(module: ModuleType) -> dict[str, Any]: + return { + name: value + for name, value in module.__dict__.items() + if inspect.isfunction(value) + } + + +def _module_global_snapshot(module: ModuleType) -> dict[str, ModuleType]: + return { + name: value + for name, value in module.__dict__.items() + if isinstance(value, ModuleType) + } + + +def _same_identity_mapping( + current: Mapping[str, Any], expected: Mapping[str, Any] +) -> bool: + return ( + set(current) == set(expected) + and all(current[name] is expected[name] for name in expected) + ) + + +def _validate_production_module_closure( + *, + modules: Mapping[str, ModuleType], + source_reads: Mapping[str, ImmutableRead], + prior: Mapping[str, Any] | None, +) -> dict[str, Any]: + for label, ( + module_name, + path, + _digest, + _size, + _require_readonly, + ) in PRODUCTION_SOURCE_BINDINGS.items(): + _require_production_module( + modules.get(label), + module_name=module_name, + path=path, + label=label, + ) + runtime_r6 = modules["runtime_r6"] + handoff_r6 = modules["handoff_r6"] + checkpoint_r6 = modules["checkpoint_r6"] + checkpoint_base_r2 = modules["checkpoint_base_r2"] + direct_r2 = modules["direct_r2"] + if ( + getattr(runtime_r6, "checkpoint_store_r2", None) is not checkpoint_r6 + or getattr(checkpoint_r6, "_r2", None) is not checkpoint_base_r2 + ): + raise TerminalCertificationR6Error( + "runtime/checkpoint module-global closure changed" + ) + selected_callables = { + "runtime_result_validator": _require_exact_source_callable( + owner_module=runtime_r6, + source_module=runtime_r6, + source_read=source_reads["runtime_r6"], + source_path=ACTIVE_R6_RUNTIME_PATH, + attribute_name="_validate_full_fit_result_structure", + ), + "handoff_validator": _require_exact_source_callable( + owner_module=handoff_r6, + source_module=handoff_r6, + source_read=source_reads["handoff_r6"], + source_path=ACTIVE_R6_HANDOFF_PATH, + attribute_name="_validate_selected_best_handoff_structure", + ), + "checkpoint_validator": _require_exact_source_callable( + owner_module=checkpoint_r6, + source_module=checkpoint_base_r2, + source_read=source_reads["checkpoint_base_r2"], + source_path=BASE_R2_CHECKPOINT_PATH, + attribute_name="validate_checkpoint", + ), + "checkpoint_loader": _require_exact_source_callable( + owner_module=checkpoint_r6, + source_module=checkpoint_base_r2, + source_read=source_reads["checkpoint_base_r2"], + source_path=BASE_R2_CHECKPOINT_PATH, + attribute_name="_torch_load", + ), + "checkpoint_semantic": _require_exact_source_callable( + owner_module=checkpoint_r6, + source_module=checkpoint_base_r2, + source_read=source_reads["checkpoint_base_r2"], + source_path=BASE_R2_CHECKPOINT_PATH, + attribute_name="semantic_tree_sha256", + ), + "direct_postfit": _require_exact_source_callable( + owner_module=direct_r2, + source_module=direct_r2, + source_read=source_reads["direct_r2"], + source_path=R2_CORE_PATH, + attribute_name="run_direct_postfit", + ), + } + if ( + getattr(runtime_r6, "semantic_tree_sha256", None) + is not selected_callables["checkpoint_semantic"] + ): + raise TerminalCertificationR6Error( + "runtime checkpoint semantic callable changed" + ) + function_snapshots = { + label: _module_function_snapshot(module) + for label, module in modules.items() + } + module_global_snapshots = { + label: _module_global_snapshot(module) + for label, module in modules.items() + } + if prior is not None: + if ( + not _same_identity_mapping(modules, prior["modules"]) + or not _same_identity_mapping( + selected_callables, prior["selected_callables"] + ) + or set(function_snapshots) != set(prior["function_snapshots"]) + or set(module_global_snapshots) + != set(prior["module_global_snapshots"]) + ): + raise TerminalCertificationR6Error( + "production dependency object closure changed" + ) + for label in function_snapshots: + if not _same_identity_mapping( + function_snapshots[label], + prior["function_snapshots"][label], + ): + raise TerminalCertificationR6Error( + f"{label} production callable roster changed" + ) + for label in module_global_snapshots: + if not _same_identity_mapping( + module_global_snapshots[label], + prior["module_global_snapshots"][label], + ): + raise TerminalCertificationR6Error( + f"{label} production module-global roster changed" + ) + return dict(prior) + return { + "modules": dict(modules), + "selected_callables": selected_callables, + "function_snapshots": function_snapshots, + "module_global_snapshots": module_global_snapshots, + } + + +def _production_dependencies() -> tuple[ModuleType, Any, Any, Any]: + global _PRODUCTION_DEPENDENCY_CACHE + + if _PRODUCTION_DEPENDENCY_CACHE is None: + _require_clean_project_runtime() + read_immutable( + R5_PREDECESSOR_PATH, + label="R5 predecessor source", + expected_sha256=R5_PREDECESSOR_SHA256, + expected_size_bytes=R5_PREDECESSOR_SIZE_BYTES, + maximum=R5_PREDECESSOR_SIZE_BYTES, + require_readonly=False, + ) + project_roster = _read_project_runtime_roster() + source_reads = _read_production_source_closure() + r4 = _load_r4_private() + try: + runtime_r6, handoff_r6, direct_r2 = r4._dependencies() + except Exception as error: + raise TerminalCertificationR6Error( + "pinned R4/R6/R2 dependencies failed to load" + ) from error + checkpoint_r6 = getattr(runtime_r6, "checkpoint_store_r2", None) + checkpoint_base_r2 = getattr(checkpoint_r6, "_r2", None) + modules = { + "runtime_r6": runtime_r6, + "handoff_r6": handoff_r6, + "checkpoint_r6": checkpoint_r6, + "checkpoint_base_r2": checkpoint_base_r2, + "direct_r2": direct_r2, + } + project_closure = _validate_project_runtime_roster( + project_roster, + ( + None + if _PRODUCTION_DEPENDENCY_CACHE is None + else _PRODUCTION_DEPENDENCY_CACHE["project_runtime_roster"] + ), + ) + closure = _validate_production_module_closure( + modules=modules, + source_reads=source_reads, + prior=_PRODUCTION_DEPENDENCY_CACHE, + ) + if ( + r4.EXPECTED_R6_RUNTIME_SHA256 != ACTIVE_R6_RUNTIME_SHA256 + or r4.EXPECTED_R6_HANDOFF_SHA256 != ACTIVE_R6_HANDOFF_SHA256 + or r4.EXPECTED_R2_SOURCE_SHA256 != R2_CORE_SHA256 + or Path(direct_r2.__file__).absolute() != R2_CORE_PATH + ): + raise TerminalCertificationR6Error( + "R4 production dependency closure changed" + ) + closure["project_runtime_roster"] = project_closure + _PRODUCTION_DEPENDENCY_CACHE = closure + return r4, runtime_r6, handoff_r6, direct_r2 + + +def _require_exact_path(observed: Path, expected: Path, label: str) -> Path: + value = _absolute_normalized(Path(observed), label) + if value != expected: + raise TerminalCertificationR6Error(f"{label} path changed") + return value + + +def _validate_continuation_lineage( + *, + continuation_path: Path, + memory_amendment_path: Path, + memory_applied_path: Path, +) -> dict[str, Any]: + _require_exact_path(continuation_path, CONTINUATION_PATH, "continuation") + _require_exact_path( + memory_amendment_path, MEMORY_AMENDMENT_PATH, "memory amendment" + ) + _require_exact_path(memory_applied_path, MEMORY_APPLIED_PATH, "memory applied") + continuation, continuation_read = read_canonical( + CONTINUATION_PATH, + label="successor continuation", + expected_sha256=CONTINUATION_FILE_SHA256, + expected_size_bytes=2_833, + ) + amendment, amendment_read = read_exact_json( + MEMORY_AMENDMENT_PATH, + label="successor memory amendment", + expected_sha256=MEMORY_AMENDMENT_FILE_SHA256, + expected_size_bytes=1_575, + ) + applied, applied_read = read_exact_json( + MEMORY_APPLIED_PATH, + label="successor memory applied", + expected_sha256=MEMORY_APPLIED_FILE_SHA256, + expected_size_bytes=1_391, + ) + readback = applied.get("scheduler_readback") + if ( + _self_hash(continuation, "successor continuation") + != CONTINUATION_RECEIPT_SHA256 + or continuation.get("schema") + != "bertose_a5_static_v2_epoch_boundary_continuation_20260725_r1" + or continuation.get("status") + != "OWNER_AUTHORIZED_CANCELLED_JOB_EPOCH_BOUNDARY_SUCCESSOR_ONLY" + or continuation.get("successor_job_id") != SUCCESSOR_JOB_ID + or continuation.get("parent_job_id") != EXECUTED_PARENT_JOB_ID + or continuation.get("parent_dependent_job_id") != PARENT_DEPENDENT_JOB_ID + or continuation.get("scheduler_job_name") != JOB_NAME + or continuation.get("generic_gpu_request") != "gpu:1" + or continuation.get("constraint_tokens") != ["nova18", "v100"] + or continuation.get("checkpoint_policy") + != "one_startup_publication_then_completed_epochs_only" + or continuation.get("maximum_replay_scope") + != "current_incomplete_epoch_only" + or continuation.get("resume_device_class_sha256") + != RESUME_DEVICE_CLASS_SHA256 + or continuation.get("checkpoint_contract_sha256") + != CHECKPOINT_CONTRACT_SHA256 + or continuation.get("parent_submission_payload_sha256") + != SUBMISSION_PAYLOAD_SHA256 + or continuation.get("second_runnable_copy_authorized") is not False + or continuation.get("ablation_or_downstream_opened") is not False + or _self_hash_without_trailing_newline( + amendment, "successor memory amendment" + ) + != MEMORY_AMENDMENT_RECEIPT_SHA256 + or amendment.get("schema") + != "bertose_a5_static_v2_pending_job_memory_rightsizing_20260725_r3" + or amendment.get("status") + != "OWNER_AUTHORIZED_PENDING_JOB_SCHEDULER_MEMORY_RIGHTSIZING_ONLY" + or amendment.get("job_id") != SUCCESSOR_JOB_ID + or amendment.get("continuation_receipt_file_sha256") + != CONTINUATION_FILE_SHA256 + or amendment.get("continuation_receipt_sha256") + != CONTINUATION_RECEIPT_SHA256 + or amendment.get("prior_min_memory_bytes") != 137_438_953_472 + or amendment.get("amended_min_memory_bytes") != 68_719_476_736 + or amendment.get("checkpoint_or_scientific_state_changed") is not False + or amendment.get("second_runnable_copy_created") is not False + or amendment.get("sbatch_source_modified") is not False + or _self_hash_without_trailing_newline( + applied, "successor memory applied" + ) + != MEMORY_APPLIED_RECEIPT_SHA256 + or applied.get("schema") + != ( + "bertose_a5_static_v2_pending_job_memory_rightsizing_applied_" + "20260725_r3" + ) + or applied.get("status") + != "PASS_SCHEDULER_MEMORY_RIGHTSIZING_APPLIED_WITHOUT_RESUBMISSION" + or applied.get("job_id") != SUCCESSOR_JOB_ID + or applied.get("amendment_file_sha256") + != MEMORY_AMENDMENT_FILE_SHA256 + or applied.get("amendment_receipt_sha256") + != MEMORY_AMENDMENT_RECEIPT_SHA256 + or applied.get("prior_min_memory_bytes") != 137_438_953_472 + or applied.get("amended_min_memory_bytes") != 68_719_476_736 + or applied.get("checkpoint_or_scientific_state_changed") is not False + or applied.get("one_runnable_copy_only") is not True + or not isinstance(readback, Mapping) + or readback.get("job_id", SUCCESSOR_JOB_ID) != SUCCESSOR_JOB_ID + or readback.get("requested_memory") != "64G" + or readback.get("requested_gres") != "gpu:1" + or readback.get("partition") != "scavenger" + or readback.get("account") != "ratul-scavenger" + or readback.get("qos") != "scavenger" + ): + raise TerminalCertificationR6Error( + "successor continuation/memory lineage changed" + ) + return { + "continuation": continuation, + "continuation_read": continuation_read, + "memory_amendment": amendment, + "memory_amendment_read": amendment_read, + "memory_applied": applied, + "memory_applied_read": applied_read, + } + + +def _top_level_code_object( + *, source: bytes, path: Path, function_name: str +) -> CodeType: + module_code = compile( + source, + os.fspath(path), + "exec", + dont_inherit=True, + ) + matches = [ + value + for value in module_code.co_consts + if isinstance(value, CodeType) and value.co_name == function_name + ] + if len(matches) != 1: + raise TerminalCertificationR6Error( + f"pinned {function_name} code object is ambiguous" + ) + return matches[0] + + +def _semantic_constant_identity(value: Any) -> Any: + """Normalize constants while excluding interpreter debug metadata.""" + + if isinstance(value, CodeType): + return ("code", _semantic_code_identity(value)) + if isinstance(value, tuple): + return ( + "tuple", + tuple(_semantic_constant_identity(item) for item in value), + ) + if isinstance(value, frozenset): + normalized = [ + _semantic_constant_identity(item) for item in value + ] + return ("frozenset", tuple(sorted(normalized, key=repr))) + value_type = type(value) + return ( + "constant", + value_type.__module__, + value_type.__qualname__, + value, + ) + + +def _semantic_code_identity(code: CodeType) -> tuple[Any, ...]: + """Return executable code identity without line-table-only differences.""" + + return ( + code.co_name, + getattr(code, "co_qualname", code.co_name), + code.co_filename, + code.co_firstlineno, + code.co_argcount, + getattr(code, "co_posonlyargcount", 0), + code.co_kwonlyargcount, + code.co_nlocals, + code.co_stacksize, + code.co_flags, + code.co_code, + tuple( + _semantic_constant_identity(value) for value in code.co_consts + ), + code.co_names, + code.co_varnames, + code.co_freevars, + code.co_cellvars, + getattr(code, "co_exceptiontable", b""), + ) + + +def _validate_r2_frozen_surface( +) -> tuple[Any, Any, dict[str, ImmutableRead]]: + """Rehash every fixed R2 source/input before the hard-coded call.""" + + _r4, _runtime_r6, _handoff_r6, direct_r2 = _production_dependencies() + observed: dict[str, ImmutableRead] = {} + fixed_sources = ( + ( + "r2_sbatch", + R2_SBATCH_PATH, + R2_SBATCH_SHA256, + R2_SBATCH_SIZE_BYTES, + True, + ), + ( + "r2_core", + R2_CORE_PATH, + R2_CORE_SHA256, + R2_CORE_SIZE_BYTES, + True, + ), + ( + "r2_cli", + R2_CLI_PATH, + R2_CLI_SHA256, + R2_CLI_SIZE_BYTES, + True, + ), + ( + "r2_init", + R2_INIT_PATH, + R2_INIT_SHA256, + R2_INIT_SIZE_BYTES, + True, + ), + ( + "owner_amendment", + OWNER_AMENDMENT_PATH, + OWNER_AMENDMENT_FILE_SHA256, + 1_949, + False, + ), + ) + for label, path, digest, size, require_readonly in fixed_sources: + observed[label] = read_immutable( + path, + label=label.replace("_", " "), + expected_sha256=digest, + expected_size_bytes=size, + maximum=max(size, 1), + require_review_name=path.name.startswith("review_"), + require_readonly=require_readonly, + ) + amendment = _canonical_from_read( + observed["owner_amendment"], "owner amendment" + ) + if ( + _self_hash(amendment, "owner amendment") + != OWNER_AMENDMENT_RECEIPT_SHA256 + or amendment.get("exact_active_counts") != dict(EXPECTED_COUNTS) + ): + raise TerminalCertificationR6Error( + "owner amendment hash/count surface changed" + ) + live_run_direct_postfit = getattr(direct_r2, "run_direct_postfit", None) + expected_run_direct_postfit_code = _top_level_code_object( + source=observed["r2_core"].raw, + path=R2_CORE_PATH, + function_name="run_direct_postfit", + ) + expected_parameters = ( + "amendment_path", + "expected_amendment_file_sha256", + "handoff_path", + "expected_handoff_file_sha256", + "authority_path", + "fingerprint_path", + "vocabulary_path", + "template_registry_path", + "sequence_index_path", + "sequence_residue_ids_path", + "sequence_attention_mask_path", + "output_directory", + "shard_directory", + "device_type", + "shard_size", + ) + if ( + direct_r2.__name__ != R2_MODULE_NAME + or importlib.import_module(R2_MODULE_NAME) is not direct_r2 + or not inspect.isfunction(live_run_direct_postfit) + or live_run_direct_postfit.__module__ != R2_MODULE_NAME + or _semantic_code_identity(live_run_direct_postfit.__code__) + != _semantic_code_identity(expected_run_direct_postfit_code) + or Path(live_run_direct_postfit.__code__.co_filename).absolute() + != R2_CORE_PATH + or tuple(inspect.signature(live_run_direct_postfit).parameters) + != expected_parameters + or dict(direct_r2.EXPECTED_COUNTS) != dict(EXPECTED_COUNTS) + or Path(direct_r2.__file__).absolute() != R2_CORE_PATH + or R2_OUTPUT_DIRECTORY == R2_SHARD_DIRECTORY + or R2_OUTPUT_DIRECTORY in R2_SHARD_DIRECTORY.parents + or R2_SHARD_DIRECTORY in R2_OUTPUT_DIRECTORY.parents + ): + raise TerminalCertificationR6Error( + "frozen R2 callable/module/count/output surface changed" + ) + for label, (path, digest, size) in R2_INPUT_BINDINGS.items(): + observed[label] = read_immutable( + path, + label=f"R2 {label}", + expected_sha256=digest, + expected_size_bytes=size, + maximum=size, + require_review_name=True, + require_readonly=True, + ) + return direct_r2, live_run_direct_postfit, observed + + +def _r2_invocation( + *, selected_handoff_file_sha256: str +) -> dict[str, Any]: + _sha(selected_handoff_file_sha256, "selected handoff file") + result: dict[str, Any] = { + "amendment_path": OWNER_AMENDMENT_PATH, + "expected_amendment_file_sha256": OWNER_AMENDMENT_FILE_SHA256, + "handoff_path": SELECTED_HANDOFF_PATH, + "expected_handoff_file_sha256": selected_handoff_file_sha256, + "output_directory": R2_OUTPUT_DIRECTORY, + "shard_directory": R2_SHARD_DIRECTORY, + "device_type": R2_DEVICE_TYPE, + "shard_size": R2_SHARD_SIZE, + } + for name, (path, _digest, _size) in R2_INPUT_BINDINGS.items(): + result[name] = path + return result + + +def _require_r2_environment() -> None: + expected = { + "PYTHONDONTWRITEBYTECODE": "1", + "PYTHONNOUSERSITE": "1", + "PYTHONHASHSEED": "0", + "PYTHONUNBUFFERED": "1", + "CUDA_DEVICE_ORDER": "PCI_BUS_ID", + "CUBLAS_WORKSPACE_CONFIG": ":4096:8", + "NVIDIA_TF32_OVERRIDE": "0", + } + if ( + any(os.environ.get(key) != value for key, value in expected.items()) + or not os.environ.get("CUDA_VISIBLE_DEVICES", "").strip() + or os.environ.get("OMP_NUM_THREADS") != os.environ.get("SLURM_CPUS_PER_TASK") + or os.environ.get("MKL_NUM_THREADS") != os.environ.get("SLURM_CPUS_PER_TASK") + or os.environ.get("SLURM_CPUS_PER_TASK") != "4" + ): + raise TerminalCertificationR6Error( + "frozen R2 CUDA/environment surface changed" + ) + + +def _pipe_rows(raw: bytes, label: str) -> list[list[str]]: + try: + text = raw.decode("ascii") + except UnicodeDecodeError as error: + raise TerminalCertificationR6Error( + f"{label} is not ASCII" + ) from error + rows = [ + [field.strip() for field in line.split("|")] + for line in text.splitlines() + if line.strip() + ] + if any(len(row) != 12 for row in rows): + raise TerminalCertificationR6Error(f"{label} row is malformed") + return rows + + +def _parse_tres(value: str, label: str) -> dict[str, str]: + result: dict[str, str] = {} + if not value: + return result + for token in value.split(","): + if token.count("=") != 1: + raise TerminalCertificationR6Error(f"{label} TRES is malformed") + key, item = token.split("=", 1) + if not key or not item or key in result: + raise TerminalCertificationR6Error(f"{label} TRES is ambiguous") + result[key] = item + return result + + +def _require_exact_one_v100_tres(value: str, label: str) -> dict[str, str]: + parsed = _parse_tres(value, label) + gpu = {key: item for key, item in parsed.items() if key.startswith("gres/gpu")} + if ( + gpu != {"gres/gpu": "1", "gres/gpu:v100": "1"} + or parsed.get("node") != "1" + or parsed.get("mem") != "64G" + ): + raise TerminalCertificationR6Error( + f"{label} is not exactly one allocated V100" + ) + return parsed + + +def _constraint_tokens(value: str) -> list[str]: + if value in {"", "(null)", "None", "none", "N/A"}: + return [] + return sorted( + token for token in re.split(r"[&,+]", value) if token + ) + + +def _scontrol_fields(raw: bytes) -> dict[str, str]: + try: + text = raw.decode("ascii").strip() + except UnicodeDecodeError as error: + raise TerminalCertificationR6Error( + "successor scontrol is not ASCII" + ) from error + fields: dict[str, str] = {} + for token in text.split(): + if "=" not in token: + continue + key, value = token.split("=", 1) + if key in fields: + raise TerminalCertificationR6Error( + f"successor scontrol repeats {key}" + ) + fields[key] = value + return fields + + +def _validate_scheduler_raw( + *, + successor_sacct_raw: bytes, + successor_scontrol_raw: bytes, + executed_parent_sacct_raw: bytes, + cancelled_unused_sacct_raw_by_job_id: Mapping[str, bytes], +) -> dict[str, Any]: + successor_rows = _pipe_rows(successor_sacct_raw, "successor sacct") + parent_rows = _pipe_rows(executed_parent_sacct_raw, "executed parent sacct") + if ( + not isinstance(cancelled_unused_sacct_raw_by_job_id, Mapping) + or set(cancelled_unused_sacct_raw_by_job_id) + != set(CANCELLED_UNUSED_JOB_IDS) + ): + raise TerminalCertificationR6Error( + "cancelled-unused scheduler roster changed" + ) + cancelled_rows_by_job_id: dict[str, list[str]] = {} + for job_id in CANCELLED_UNUSED_JOB_IDS: + rows = _pipe_rows( + cancelled_unused_sacct_raw_by_job_id[job_id], + f"cancelled unused {job_id} sacct", + ) + if len(rows) != 1: + raise TerminalCertificationR6Error( + f"cancelled-unused job {job_id} does not have one row" + ) + cancelled_rows_by_job_id[job_id] = rows[0] + if len(successor_rows) != 1 or len(parent_rows) != 1: + raise TerminalCertificationR6Error( + "scheduler history does not have one row per job" + ) + successor = successor_rows[0] + parent = parent_rows[0] + successor_tres = _require_exact_one_v100_tres( + successor[9], "successor AllocTRES" + ) + parent_tres = _parse_tres(parent[9], "executed parent AllocTRES") + if ( + successor[:4] + != [SUCCESSOR_JOB_ID, JOB_NAME, "COMPLETED", "0:0"] + or successor[5:9] + != ["scavenger", "ratul-scavenger", "scavenger", "64G"] + or successor[4] in {"", "00:00:00"} + or successor[10] in {"", "None assigned", "None"} + or _constraint_tokens(successor[11]) != ["nova18", "v100"] + or parent[0] != EXECUTED_PARENT_JOB_ID + or parent[1] != JOB_NAME + or not parent[2].startswith("CANCELLED") + or parent[4] in {"", "00:00:00"} + or parent[10] in {"", "None assigned", "None"} + or parent_tres.get("gres/gpu") != "1" + ): + raise TerminalCertificationR6Error( + "executed/cancelled scheduler lineage changed" + ) + for job_id, cancelled in cancelled_rows_by_job_id.items(): + if ( + cancelled[0] != job_id + or cancelled[1] != JOB_NAME + or not cancelled[2].startswith("CANCELLED") + or cancelled[3] != "0:0" + or cancelled[4] != "00:00:00" + or cancelled[5:9] + != ["scavenger", "ratul-scavenger", "scavenger", "64G"] + or cancelled[9] != "" + or cancelled[10] not in {"None assigned", "None", ""} + or _constraint_tokens(cancelled[11]) != ["nova18", "v100"] + ): + raise TerminalCertificationR6Error( + f"cancelled-unused job {job_id} was not a zero-runtime copy" + ) + scontrol = _scontrol_fields(successor_scontrol_raw) + required = { + "JobId": SUCCESSOR_JOB_ID, + "JobName": JOB_NAME, + "JobState": "COMPLETED", + "ExitCode": "0:0", + "Partition": "scavenger", + "Account": "ratul-scavenger", + "QOS": "scavenger", + "MinMemoryNode": "64G", + "TresPerNode": "gres/gpu:1", + "Features": "v100&nova18", + "WorkDir": os.fspath(WRITING_ROOT), + } + if any(scontrol.get(key) != value for key, value in required.items()): + raise TerminalCertificationR6Error( + "successor scontrol route changed" + ) + request_tres = _parse_tres(scontrol.get("ReqTRES", ""), "scontrol ReqTRES") + allocated_tres = _require_exact_one_v100_tres( + scontrol.get("AllocTRES", ""), "scontrol AllocTRES" + ) + if ( + {key: item for key, item in request_tres.items() if key.startswith("gres/gpu")} + != {"gres/gpu": "1"} + or request_tres.get("node") != "1" + or request_tres.get("mem") != "64G" + or scontrol.get("StdErr") != os.fspath(SUCCESSOR_STDERR_PATH) + or scontrol.get("StdOut") != os.fspath(SUCCESSOR_STDOUT_PATH) + or scontrol.get("Command") + != str( + RUNTIME_ROOT + / "a5_static_v2_epoch_boundary_resume_20260725_r1/" + "run_review_a5_static_v2_epoch_boundary_resume_r1_scavenger_v100.sbatch" + ) + ): + raise TerminalCertificationR6Error( + "successor request/allocation/log binding changed" + ) + return { + "job_id": SUCCESSOR_JOB_ID, + "job_name": JOB_NAME, + "state": "COMPLETED", + "exit_code": "0:0", + "elapsed": successor[4], + "partition": "scavenger", + "account": "ratul-scavenger", + "qos": "scavenger", + "requested_memory": "64G", + "requested_gres": "gpu:1", + "constraint_tokens": ["nova18", "v100"], + "allocated_node": successor[10], + "allocated_gpu_count": 1, + "allocated_gpu_type": "v100", + "allocated_tres": successor_tres, + "scontrol_allocated_tres": allocated_tres, + "stderr_absolute_path": scontrol["StdErr"], + "stdout_absolute_path": scontrol["StdOut"], + "executed_attempt_job_ids": [EXECUTED_PARENT_JOB_ID, SUCCESSOR_JOB_ID], + "cancelled_unused_job_ids": list(CANCELLED_UNUSED_JOB_IDS), + "cancelled_unused_elapsed_by_job_id": { + job_id: "00:00:00" for job_id in CANCELLED_UNUSED_JOB_IDS + }, + "cancelled_unused_had_allocation": False, + } + + +def _checkpoint_object( + *, + checkpoint_root: Path, + category: str, + runtime_r6: Any, +) -> tuple[dict[str, Any], dict[str, Any]]: + if category not in {"latest", "best"}: + raise TerminalCertificationR6Error("checkpoint category changed") + directory = checkpoint_root / category + head_read = read_immutable( + directory / "head.json", + label=f"{category} checkpoint head", + maximum=1024 * 1024, + require_review_name=False, + ) + head = _canonical_from_read(head_read, f"{category} checkpoint head") + receipt_name = head.get("receipt_filename") + payload_name = head.get("payload_filename") + if ( + type(receipt_name) is not str + or type(payload_name) is not str + or Path(receipt_name).name != receipt_name + or Path(payload_name).name != payload_name + ): + raise TerminalCertificationR6Error( + f"{category} checkpoint object names changed" + ) + receipt_read = read_immutable( + directory / receipt_name, + label=f"{category} checkpoint receipt", + maximum=4 * 1024 * 1024, + require_review_name=False, + ) + payload_read = read_immutable( + directory / payload_name, + label=f"{category} checkpoint payload", + maximum=4 * 1024 * 1024 * 1024, + require_review_name=False, + ) + receipt = _canonical_from_read( + receipt_read, f"{category} checkpoint receipt" + ) + try: + checkpoint = runtime_r6.checkpoint_store_r2._torch_load(payload_read.raw) + runtime_r6.checkpoint_store_r2.validate_checkpoint(checkpoint) + semantic = runtime_r6.checkpoint_store_r2.semantic_tree_sha256(checkpoint) + except Exception as error: + raise TerminalCertificationR6Error( + f"{category} checkpoint payload failed exact R6 validation" + ) from error + state = checkpoint.get("training_state") + if ( + not isinstance(state, Mapping) + or head.get("payload_sha256") != payload_read.file_sha256 + or head.get("receipt_sha256") != receipt_read.file_sha256 + or receipt.get("payload_sha256") != payload_read.file_sha256 + or receipt.get("payload_size_bytes") != payload_read.size_bytes + or receipt.get("contract_sha256") != CHECKPOINT_CONTRACT_SHA256 + or receipt.get("checkpoint_semantic_sha256") != semantic + ): + raise TerminalCertificationR6Error( + f"{category} checkpoint byte/semantic binding changed" + ) + evidence: dict[str, Any] = { + "head_file_sha256": head_read.file_sha256, + "head_size_bytes": head_read.size_bytes, + "receipt_file_sha256": receipt_read.file_sha256, + "receipt_size_bytes": receipt_read.size_bytes, + "payload_file_sha256": payload_read.file_sha256, + "payload_size_bytes": payload_read.size_bytes, + "checkpoint_semantic_sha256": semantic, + "epoch_index": state.get("epoch_index"), + "phase": state.get("phase"), + "contract_sha256": CHECKPOINT_CONTRACT_SHA256, + } + if category == "latest": + evidence.update( + { + "checkpoint_ordinal": head.get("ordinal"), + "group_cursor": state.get("group_cursor"), + "micro_pack_cursor": state.get("micro_pack_cursor"), + "epoch_group_plan_sha256": state.get( + "epoch_group_plan_sha256" + ), + "epoch_successful_group_steps": state.get( + "epoch_successful_group_steps" + ), + "planned_group_count": state.get("planned_group_count"), + "ordered_group_binding_sha256": list( + state.get("ordered_group_binding_sha256", ()) + ), + "terminal_status": state.get("terminal_status"), + } + ) + else: + evidence.update( + { + "category": head.get("category"), + "source_latest_receipt_sha256": receipt.get( + "source_latest_receipt_sha256" + ), + "best_epoch_index": state.get("best_epoch_index"), + "scientific_ledger_count": state.get( + "scientific_ledger_count" + ), + } + ) + return evidence, checkpoint + + +def _validate_best_checkpoint( + *, + selected: Mapping[str, Any], + best_evidence: Mapping[str, Any], + best_checkpoint: Mapping[str, Any], +) -> None: + state = best_checkpoint.get("training_state") + if ( + not isinstance(state, Mapping) + or best_evidence.get("category") != "best" + or best_evidence.get("checkpoint_semantic_sha256") + != selected.get("selected_best_checkpoint_semantic_sha256") + or best_evidence.get("checkpoint_semantic_sha256") + != selected.get("best_checkpoint_readback_semantic_sha256") + or best_evidence.get("checkpoint_semantic_sha256") + != selected.get("independent_checkpoint_best_semantic_sha256") + or best_evidence.get("best_epoch_index") + != selected.get("selected_best_epoch_index") + or state.get("epoch_index") + != selected.get("selected_best_epoch_index") + 1 + or state.get("scientific_ledger_count") + != selected.get("selected_best_epoch_index") + 1 + or state.get("last_epoch_improved") is not True + or best_checkpoint.get("binding", {}).get( + "resume_device_class_sha256" + ) + != RESUME_DEVICE_CLASS_SHA256 + ): + raise TerminalCertificationR6Error( + "selected best checkpoint replay changed" + ) + + +def _production_document_evidence() -> dict[str, dict[str, Any]]: + result: dict[str, dict[str, Any]] = {} + for label, (path, digest) in PRODUCTION_DOCUMENT_BINDINGS.items(): + observed = read_immutable( + path, + label=f"production {label}", + expected_sha256=digest, + maximum=64 * 1024 * 1024, + ) + result[label] = _file_binding(path, observed) + return result + + +def _validate_production_documents( + value: Any, +) -> dict[str, dict[str, Any]]: + if ( + not isinstance(value, Mapping) + or set(value) != set(PRODUCTION_DOCUMENT_BINDINGS) + ): + raise TerminalCertificationR6Error( + "terminal production-document roster changed" + ) + expected = _production_document_evidence() + for label, binding in value.items(): + observed = _reopen_file_binding( + binding, + label=f"terminal production {label}", + maximum=64 * 1024 * 1024, + ) + path, digest = PRODUCTION_DOCUMENT_BINDINGS[label] + if ( + Path(binding["absolute_path"]) != path + or observed.file_sha256 != digest + or dict(binding) != expected[label] + ): + raise TerminalCertificationR6Error( + f"terminal production {label} changed" + ) + return expected + + +def _validate_terminal_checkpoint_shapes( + *, + latest: Mapping[str, Any], + best: Mapping[str, Any], +) -> None: + latest_keys = { + "head_file_sha256", + "head_size_bytes", + "receipt_file_sha256", + "receipt_size_bytes", + "payload_file_sha256", + "payload_size_bytes", + "checkpoint_semantic_sha256", + "checkpoint_ordinal", + "epoch_index", + "phase", + "group_cursor", + "micro_pack_cursor", + "epoch_group_plan_sha256", + "epoch_successful_group_steps", + "planned_group_count", + "ordered_group_binding_sha256", + "terminal_status", + "contract_sha256", + } + best_keys = { + "head_file_sha256", + "head_size_bytes", + "receipt_file_sha256", + "receipt_size_bytes", + "payload_file_sha256", + "payload_size_bytes", + "checkpoint_semantic_sha256", + "epoch_index", + "phase", + "contract_sha256", + "category", + "source_latest_receipt_sha256", + "best_epoch_index", + "scientific_ledger_count", + } + if ( + set(latest) != latest_keys + or set(best) != best_keys + or latest.get("contract_sha256") != CHECKPOINT_CONTRACT_SHA256 + or best.get("contract_sha256") != CHECKPOINT_CONTRACT_SHA256 + or latest.get("phase") != "epoch_group_boundary" + or latest.get("group_cursor") != 0 + or latest.get("micro_pack_cursor") != 0 + or latest.get("epoch_group_plan_sha256") != ZERO_SHA256 + or latest.get("epoch_successful_group_steps") != 0 + or latest.get("planned_group_count") != 0 + or latest.get("ordered_group_binding_sha256") != [] + or latest.get("terminal_status") + not in {"EARLY_STOPPED_WITH_CANDIDATE", "MAX_EPOCHS_WITH_CANDIDATE"} + or type(latest.get("checkpoint_ordinal")) is not int + or latest["checkpoint_ordinal"] <= 28_363 + or type(latest.get("epoch_index")) is not int + or latest["epoch_index"] < 13 + or best.get("category") != "best" + or type(best.get("best_epoch_index")) is not int + or best.get("scientific_ledger_count") != best["best_epoch_index"] + 1 + ): + raise TerminalCertificationR6Error( + "terminal latest/best checkpoint evidence changed" + ) + for label, checkpoint in (("latest", latest), ("best", best)): + for field in ( + "head_file_sha256", + "receipt_file_sha256", + "payload_file_sha256", + "checkpoint_semantic_sha256", + ): + _sha(checkpoint.get(field), f"{label} checkpoint {field}") + for field in ( + "head_size_bytes", + "receipt_size_bytes", + "payload_size_bytes", + ): + if type(checkpoint.get(field)) is not int or checkpoint[field] < 1: + raise TerminalCertificationR6Error( + f"{label} checkpoint {field} changed" + ) + + +def _validate_scheduler_evidence(value: Any) -> dict[str, Any]: + if not isinstance(value, Mapping): + raise TerminalCertificationR6Error("terminal scheduler is absent") + capture_keys = set(CAPTURE_FILENAMES) + expected_keys = { + "summary", + "commands", + "stderr_capture", + *capture_keys, + } + if set(value) != expected_keys: + raise TerminalCertificationR6Error( + "terminal scheduler evidence keys changed" + ) + commands = value.get("commands") + if commands != { + "successor_sacct": list(SUCCESSOR_SACCT_ARGV), + "successor_scontrol": list(SUCCESSOR_SCONTROL_ARGV), + "executed_parent_sacct": list(EXECUTED_PARENT_SACCT_ARGV), + "cancelled_unused_sacct_by_job_id": { + job_id: list(CANCELLED_UNUSED_SACCT_ARGVS[job_id]) + for job_id in CANCELLED_UNUSED_JOB_IDS + }, + }: + raise TerminalCertificationR6Error( + "terminal scheduler command surface changed" + ) + raws: dict[str, bytes] = {} + for label in capture_keys: + expected_path = R6_OUTPUT_DIRECTORY / CAPTURE_FILENAMES[label] + binding = value[label] + if ( + not isinstance(binding, Mapping) + or Path(str(binding.get("absolute_path", ""))) != expected_path + ): + raise TerminalCertificationR6Error( + f"terminal {label} path changed" + ) + raws[label] = _reopen_file_binding( + binding, label=label, maximum=16 * 1024 * 1024 + ).raw + summary = _validate_scheduler_raw( + successor_sacct_raw=raws["successor_sacct_capture"], + successor_scontrol_raw=raws["successor_scontrol_capture"], + executed_parent_sacct_raw=raws["executed_parent_sacct_capture"], + cancelled_unused_sacct_raw_by_job_id={ + job_id: raws[f"cancelled_unused_{job_id}_sacct_capture"] + for job_id in CANCELLED_UNUSED_JOB_IDS + }, + ) + if value.get("summary") != summary: + raise TerminalCertificationR6Error( + "terminal scheduler summary differs from raw captures" + ) + stderr = value.get("stderr_capture") + if ( + not isinstance(stderr, Mapping) + or Path(str(stderr.get("absolute_path", ""))) + != Path(summary["stderr_absolute_path"]) + ): + raise TerminalCertificationR6Error( + "terminal stderr does not match scontrol" + ) + stderr_read = _reopen_file_binding( + stderr, + label="terminal successor stderr", + maximum=64 * 1024 * 1024, + require_readonly=False, + allow_empty=True, + ) + if stderr_read.size_bytes != 0 or stderr_read.file_sha256 != EMPTY_SHA256: + raise TerminalCertificationR6Error( + "terminal successor stderr is not empty" + ) + return summary + + +_TERMINAL_EVIDENCE_KEYS = frozenset( + { + "schema", + "status", + "job_lineage", + "continuation", + "memory_amendment", + "memory_applied", + "scheduler", + "production_documents", + "terminal_checkpoint", + "selected_best_checkpoint", + "checkpoint_cadence", + "official_submitted_artifacts_modified", + "ablation_or_downstream_opened", + "authorization", + "receipt_sha256", + } +) + + +def _validate_terminal_evidence_value( + value: Mapping[str, Any], + *, + terminal_evidence_path: Path, + continuation_path: Path, + memory_amendment_path: Path, + memory_applied_path: Path, + full_fit_result_path: Path, + selected_handoff_path: Path, +) -> dict[str, Any]: + if ( + set(value) != _TERMINAL_EVIDENCE_KEYS + or value.get("schema") != TERMINAL_EVIDENCE_SCHEMA + or value.get("status") != TERMINAL_EVIDENCE_STATUS + or value.get("job_lineage") + != [ + { + "job_id": EXECUTED_PARENT_JOB_ID, + "role": "executed_parent_attempt", + }, + { + "job_id": CANCELLED_UNUSED_JOB_IDS[0], + "role": "cancelled_before_start_unused_successor", + }, + { + "job_id": CANCELLED_UNUSED_JOB_IDS[1], + "role": "cancelled_before_start_unused_successor", + }, + { + "job_id": SUCCESSOR_JOB_ID, + "role": "only_executed_successor", + }, + ] + or value.get("checkpoint_cadence") + != "startup_then_completed_epoch_and_terminal_only" + or value.get("official_submitted_artifacts_modified") is not False + or value.get("ablation_or_downstream_opened") is not False + or value.get("authorization") + != { + "native_ablation_data_binding_authorized": False, + "nova_submission_authorized": False, + "postfit_publication_authorized": False, + } + ): + raise TerminalCertificationR6Error( + "terminal evidence policy/status changed" + ) + receipt = _self_hash(value, "terminal evidence") + lineage = _validate_continuation_lineage( + continuation_path=continuation_path, + memory_amendment_path=memory_amendment_path, + memory_applied_path=memory_applied_path, + ) + expected_lineage_bindings = { + "continuation": _file_binding( + CONTINUATION_PATH, lineage["continuation_read"] + ), + "memory_amendment": _file_binding( + MEMORY_AMENDMENT_PATH, lineage["memory_amendment_read"] + ), + "memory_applied": _file_binding( + MEMORY_APPLIED_PATH, lineage["memory_applied_read"] + ), + } + if any( + value.get(label) != binding + for label, binding in expected_lineage_bindings.items() + ): + raise TerminalCertificationR6Error( + "terminal continuation/memory file binding changed" + ) + _validate_scheduler_evidence(value.get("scheduler")) + _validate_production_documents(value.get("production_documents")) + latest = value.get("terminal_checkpoint") + best = value.get("selected_best_checkpoint") + if not isinstance(latest, Mapping) or not isinstance(best, Mapping): + raise TerminalCertificationR6Error( + "terminal latest/best evidence is absent" + ) + _validate_terminal_checkpoint_shapes(latest=latest, best=best) + + r4, runtime_r6, _handoff_r6, _direct_r2 = _production_dependencies() + try: + result, result_file_sha, selected, selected_file_sha = ( + r4._validate_r6_result_and_handoff( + full_fit_result_path=full_fit_result_path, + selected_handoff_path=selected_handoff_path, + ) + ) + if ( + Path(full_fit_result_path) != FULL_FIT_RESULT_PATH + or Path(selected_handoff_path) != SELECTED_HANDOFF_PATH + or selected.get("scheduler_job_id") != SUCCESSOR_JOB_ID + or result.get("resume_device_class_sha256") + != RESUME_DEVICE_CLASS_SHA256 + or selected.get("resume_device_class_sha256") + != RESUME_DEVICE_CLASS_SHA256 + ): + raise TerminalCertificationR6Error( + "R6 result/handoff successor identity changed" + ) + production_context = r4._reopen_production_documents(value) + terminal_checkpoint = r4._replay_terminal_checkpoint( + result=result, + selected=selected, + terminal_evidence=value, + ) + r4._replay_cuda_attempt_chain( + result=result, + selected=selected, + checkpoint=terminal_checkpoint, + production_context=production_context, + ) + r4._replay_scientific_ledger( + result=result, + selected=selected, + checkpoint=terminal_checkpoint, + ) + best_reopened, best_checkpoint = _checkpoint_object( + checkpoint_root=Path( + str(selected["checkpoint_root_absolute_path"]) + ), + category="best", + runtime_r6=runtime_r6, + ) + _validate_best_checkpoint( + selected=selected, + best_evidence=best_reopened, + best_checkpoint=best_checkpoint, + ) + if dict(best) != best_reopened: + raise TerminalCertificationR6Error( + "selected best evidence differs from live best checkpoint" + ) + except TerminalCertificationR6Error: + raise + except Exception as error: + raise TerminalCertificationR6Error( + "exact R6 terminal replay failed" + ) from error + return { + "value": dict(value), + "receipt_sha256": receipt, + "result": result, + "result_file_sha256": result_file_sha, + "selected": selected, + "selected_file_sha256": selected_file_sha, + } + + +def validate_terminal_evidence( + *, + terminal_evidence_path: Path, + continuation_path: Path = CONTINUATION_PATH, + memory_amendment_path: Path = MEMORY_AMENDMENT_PATH, + memory_applied_path: Path = MEMORY_APPLIED_PATH, + full_fit_result_path: Path = FULL_FIT_RESULT_PATH, + selected_handoff_path: Path = SELECTED_HANDOFF_PATH, +) -> dict[str, Any]: + _require_exact_path( + terminal_evidence_path, TERMINAL_EVIDENCE_PATH, "terminal evidence" + ) + value, _read = read_canonical( + terminal_evidence_path, + label="R6 terminal evidence", + maximum=64 * 1024 * 1024, + ) + return _validate_terminal_evidence_value( + value, + terminal_evidence_path=terminal_evidence_path, + continuation_path=continuation_path, + memory_amendment_path=memory_amendment_path, + memory_applied_path=memory_applied_path, + full_fit_result_path=full_fit_result_path, + selected_handoff_path=selected_handoff_path, + ) + + +def _run_fixed_capture(argv: Sequence[str], label: str) -> bytes: + completed = subprocess.run( + list(argv), + check=False, + capture_output=True, + timeout=30, + ) + if completed.returncode != 0 or completed.stderr: + raise TerminalCertificationR6Error(f"{label} command failed") + return bytes(completed.stdout) + + +def _ensure_r6_output_directory() -> None: + parent = _open_directory_nofollow( + R6_OUTPUT_DIRECTORY.parent, "R6 output parent" + ) + try: + try: + os.mkdir(R6_OUTPUT_DIRECTORY.name, mode=0o750, dir_fd=parent) + except FileExistsError: + pass + finally: + os.close(parent) + descriptor = _open_directory_nofollow( + R6_OUTPUT_DIRECTORY, "R6 output directory" + ) + os.close(descriptor) + + +def build_terminal_evidence() -> dict[str, Any]: + """Capture exact terminal truth; pending/failed jobs publish nothing.""" + + if os.path.lexists(TERMINAL_EVIDENCE_PATH): + raise TerminalCertificationR6Error( + "R6 terminal evidence already exists" + ) + successor_sacct = _run_fixed_capture( + SUCCESSOR_SACCT_ARGV, "successor sacct" + ) + successor_scontrol = _run_fixed_capture( + SUCCESSOR_SCONTROL_ARGV, "successor scontrol" + ) + executed_parent_sacct = _run_fixed_capture( + EXECUTED_PARENT_SACCT_ARGV, "executed parent sacct" + ) + cancelled_unused_sacct_by_job_id = { + job_id: _run_fixed_capture( + CANCELLED_UNUSED_SACCT_ARGVS[job_id], + f"cancelled unused {job_id} sacct", + ) + for job_id in CANCELLED_UNUSED_JOB_IDS + } + summary = _validate_scheduler_raw( + successor_sacct_raw=successor_sacct, + successor_scontrol_raw=successor_scontrol, + executed_parent_sacct_raw=executed_parent_sacct, + cancelled_unused_sacct_raw_by_job_id=( + cancelled_unused_sacct_by_job_id + ), + ) + stderr_path = Path(summary["stderr_absolute_path"]) + stderr_read = read_immutable( + stderr_path, + label="successor stderr", + expected_sha256=EMPTY_SHA256, + expected_size_bytes=0, + maximum=64 * 1024 * 1024, + require_review_name=True, + require_readonly=False, + allow_empty=True, + ) + lineage = _validate_continuation_lineage( + continuation_path=CONTINUATION_PATH, + memory_amendment_path=MEMORY_AMENDMENT_PATH, + memory_applied_path=MEMORY_APPLIED_PATH, + ) + r4, runtime_r6, _handoff_r6, _direct_r2 = _production_dependencies() + try: + result, _result_file_sha, selected, _selected_file_sha = ( + r4._validate_r6_result_and_handoff( + full_fit_result_path=FULL_FIT_RESULT_PATH, + selected_handoff_path=SELECTED_HANDOFF_PATH, + ) + ) + except Exception as error: + raise TerminalCertificationR6Error( + "terminal R6 result/handoff is not complete" + ) from error + if selected.get("scheduler_job_id") != SUCCESSOR_JOB_ID: + raise TerminalCertificationR6Error( + "terminal handoff does not belong to successor" + ) + checkpoint_root = Path(str(selected["checkpoint_root_absolute_path"])) + latest_evidence, latest_checkpoint = _checkpoint_object( + checkpoint_root=checkpoint_root, + category="latest", + runtime_r6=runtime_r6, + ) + best_evidence, best_checkpoint = _checkpoint_object( + checkpoint_root=checkpoint_root, + category="best", + runtime_r6=runtime_r6, + ) + _validate_terminal_checkpoint_shapes( + latest=latest_evidence, best=best_evidence + ) + _validate_best_checkpoint( + selected=selected, + best_evidence=best_evidence, + best_checkpoint=best_checkpoint, + ) + if ( + result.get("terminal_epoch_index") != latest_evidence["epoch_index"] + or result.get("terminal_status") != latest_evidence["terminal_status"] + or runtime_r6.checkpoint_store_r2.semantic_tree_sha256(latest_checkpoint) + != latest_evidence["checkpoint_semantic_sha256"] + ): + raise TerminalCertificationR6Error( + "terminal result/latest checkpoint changed" + ) + production_documents = _production_document_evidence() + raw_captures = { + "successor_sacct_capture": successor_sacct, + "successor_scontrol_capture": successor_scontrol, + "executed_parent_sacct_capture": executed_parent_sacct, + **{ + f"cancelled_unused_{job_id}_sacct_capture": raw + for job_id, raw in cancelled_unused_sacct_by_job_id.items() + }, + } + scheduler: dict[str, Any] = { + "summary": summary, + "commands": { + "successor_sacct": list(SUCCESSOR_SACCT_ARGV), + "successor_scontrol": list(SUCCESSOR_SCONTROL_ARGV), + "executed_parent_sacct": list(EXECUTED_PARENT_SACCT_ARGV), + "cancelled_unused_sacct_by_job_id": { + job_id: list(CANCELLED_UNUSED_SACCT_ARGVS[job_id]) + for job_id in CANCELLED_UNUSED_JOB_IDS + }, + }, + "stderr_capture": _file_binding(stderr_path, stderr_read), + } + for label, raw in raw_captures.items(): + path = R6_OUTPUT_DIRECTORY / CAPTURE_FILENAMES[label] + scheduler[label] = { + "absolute_path": os.fspath(path), + "file_sha256": hashlib.sha256(raw).hexdigest(), + "size_bytes": len(raw), + } + value: dict[str, Any] = { + "schema": TERMINAL_EVIDENCE_SCHEMA, + "status": TERMINAL_EVIDENCE_STATUS, + "job_lineage": [ + { + "job_id": EXECUTED_PARENT_JOB_ID, + "role": "executed_parent_attempt", + }, + { + "job_id": CANCELLED_UNUSED_JOB_IDS[0], + "role": "cancelled_before_start_unused_successor", + }, + { + "job_id": CANCELLED_UNUSED_JOB_IDS[1], + "role": "cancelled_before_start_unused_successor", + }, + { + "job_id": SUCCESSOR_JOB_ID, + "role": "only_executed_successor", + }, + ], + "continuation": _file_binding( + CONTINUATION_PATH, lineage["continuation_read"] + ), + "memory_amendment": _file_binding( + MEMORY_AMENDMENT_PATH, lineage["memory_amendment_read"] + ), + "memory_applied": _file_binding( + MEMORY_APPLIED_PATH, lineage["memory_applied_read"] + ), + "scheduler": scheduler, + "production_documents": production_documents, + "terminal_checkpoint": latest_evidence, + "selected_best_checkpoint": best_evidence, + "checkpoint_cadence": ( + "startup_then_completed_epoch_and_terminal_only" + ), + "official_submitted_artifacts_modified": False, + "ablation_or_downstream_opened": False, + "authorization": { + "native_ablation_data_binding_authorized": False, + "nova_submission_authorized": False, + "postfit_publication_authorized": False, + }, + } + value["receipt_sha256"] = sha256_json(value) + + # No path is created until every scheduler/checkpoint/scientific precondition + # above has passed in memory. + _ensure_r6_output_directory() + for label, raw in raw_captures.items(): + _publish_bytes_exclusive( + R6_OUTPUT_DIRECTORY / CAPTURE_FILENAMES[label], + raw, + label, + ) + _publish_canonical_exclusive( + TERMINAL_EVIDENCE_PATH, value, "R6 terminal evidence" + ) + validated = validate_terminal_evidence( + terminal_evidence_path=TERMINAL_EVIDENCE_PATH + ) + if validated["receipt_sha256"] != value["receipt_sha256"]: + raise TerminalCertificationR6Error( + "R6 terminal evidence final readback changed" + ) + return value + + +def _publication_member( + *, + publication: Mapping[str, Any], + label: str, +) -> ImmutableRead: + binding = publication.get(label) + expected_name = R2_PUBLICATION_FILENAMES[label] + expected_path = R2_OUTPUT_DIRECTORY / expected_name + if ( + not isinstance(binding, Mapping) + or set(binding) != _PUBLICATION_BINDING_KEYS + or Path(str(binding.get("absolute_path", ""))) != expected_path + or type(binding.get("size_bytes")) is not int + or binding["size_bytes"] < 1 + or binding.get("mode_octal") != "0400" + or binding.get("nlink") != 1 + or binding.get("exclusive_no_overwrite") is not True + or binding.get("sealed_readback_passed") is not True + or binding.get("idempotent_identical_reuse_supported") is not True + ): + raise TerminalCertificationR6Error( + f"R2 {label} binding changed" + ) + observed = read_immutable( + expected_path, + label=f"R2 {label}", + expected_sha256=str(binding.get("file_sha256")), + expected_size_bytes=binding["size_bytes"], + maximum=4 * 1024 * 1024 * 1024, + ) + if stat.S_IMODE(observed.mode) != 0o400 or observed.nlink != 1: + raise TerminalCertificationR6Error( + f"R2 {label} sealing changed" + ) + return observed + + +def _validate_r2_output_namespace() -> None: + descriptor = _open_directory_nofollow( + R2_OUTPUT_DIRECTORY, "R2 publication directory" + ) + try: + names = sorted(os.listdir(descriptor)) + finally: + os.close(descriptor) + expected = sorted( + [*R2_PUBLICATION_FILENAMES.values(), R2_RECEIPT_FILENAME] + ) + if names != expected: + raise TerminalCertificationR6Error( + "R2 publication namespace has missing/foreign members" + ) + + +def _validate_r2_shards( + *, + export: Mapping[str, Any], + selected_checkpoint_semantic_sha256: str, +) -> dict[str, Any]: + descriptor = _open_directory_nofollow( + R2_SHARD_DIRECTORY, "R2 shard directory" + ) + try: + names = sorted(os.listdir(descriptor)) + finally: + os.close(descriptor) + expected_names = [ + f"review_a5_static_v2_encoded_state_shard_{index:04d}_r4.json" + for index in range(R2_EXPECTED_SHARD_COUNT) + ] + if names != expected_names: + raise TerminalCertificationR6Error( + "R2 shard membership is not exact 0000..0221" + ) + scientific_fields = ( + "selected_checkpoint_semantic_sha256", + "selected_model_state_sha256", + "export_model_state_sha256", + "support_replay_receipt_sha256", + "selected_support_identity_sha256", + "rvq_identity_sha256", + "device_execution_identity_sha256", + "source_authority_file_sha256", + "selected_checkpoint_inference_authority_binding_sha256", + "r6_top_level_python_bundle_sha256", + "complete_development_adapter_source_sha256", + "complete_development_adapter_receipt_sha256", + ) + file_hashes: list[str] = [] + receipt_hashes: list[str] = [] + row_count = 0 + parent_receipt_count = 0 + for index, name in enumerate(names): + shard, observed = read_canonical( + R2_SHARD_DIRECTORY / name, + label=f"R2 shard {index}", + maximum=512 * 1024 * 1024, + ) + rows = shard.get("rows") + descriptors = shard.get("descriptors") + parent_receipts = shard.get("parent_inference_receipts") + if ( + shard.get("schema") + != "bertose_a5_static_v2_encoded_state_shard_20260722_r4" + or shard.get("status") != "PASS_REAL_MODEL_ENCODED_IMMUTABLE_SHARD" + or shard.get("shard_index") != index + or shard.get("selected_checkpoint_semantic_sha256") + != selected_checkpoint_semantic_sha256 + or shard.get("caller_supplied_code_path_used") is not False + or shard.get("official_submitted_artifacts_modified") is not False + or not isinstance(rows, list) + or not isinstance(descriptors, list) + or not isinstance(parent_receipts, list) + or shard.get("row_count") != len(rows) + or shard.get("rows_sha256") != sha256_json(rows) + or any( + shard.get(field) != export.get(field) + for field in scientific_fields + ) + ): + raise TerminalCertificationR6Error( + f"R2 shard {index} scientific/row binding changed" + ) + receipt_hashes.append(_self_hash(shard, f"R2 shard {index}")) + file_hashes.append(observed.file_sha256) + row_count += len(rows) + parent_receipt_count += len(parent_receipts) + if ( + row_count != EXPECTED_COUNTS["all"]["state_count"] + or parent_receipt_count != EXPECTED_COUNTS["all"]["parent_count"] + ): + raise TerminalCertificationR6Error( + "R2 shard aggregate state/parent counts changed" + ) + value = { + "schema": "bertose_a5_static_v2_r6_shard_reopen_audit_20260725", + "shard_count": R2_EXPECTED_SHARD_COUNT, + "row_count": row_count, + "parent_inference_receipt_count": parent_receipt_count, + "ordered_file_sha256": file_hashes, + "ordered_receipt_sha256": receipt_hashes, + } + value["receipt_sha256"] = sha256_json(value) + return value + + +def _validate_r2_values( + *, + result: Mapping[str, Any], + publication: Mapping[str, Any], + selected: Mapping[str, Any], + selected_handoff_file_sha256: str, + direct_r2: Any, +) -> tuple[str, str]: + result_receipt = _self_hash(result, "persisted R2 result") + publication_receipt = _self_hash(publication, "R2 publication") + export = publication.get("export_receipt") + null_receipt = publication.get("null_receipt_sha256") + join = publication.get("join_receipt") + historical = publication.get("historical_held_provenance") + if ( + set(result) != _R2_RESULT_KEYS + or result.get("schema") + != "bertose_a5_static_v2_direct_development_postfit_20260724_r2" + or result.get("status") + != "PASS_DIRECT_FULL_DEVELOPMENT_STATIC_PACKAGE_PUBLISHED" + or result.get("owner_amendment_file_sha256") + != OWNER_AMENDMENT_FILE_SHA256 + or result.get("owner_amendment_receipt_sha256") + != OWNER_AMENDMENT_RECEIPT_SHA256 + or result.get("encoded_counts") != dict(EXPECTED_COUNTS) + or result.get("model_state_unchanged_during_encoding") is not True + or result.get("development_used_for_support_or_null_fit") is not False + or result.get("native_ablation_data_binding_authorized") is not False + or result.get("nova_submission_authorized") is not False + or result.get("official_submitted_artifacts_modified") is not False + or result.get("authorization") + != direct_r2.closed_launch_authorization() + or set(publication) != direct_r2._publication_receipt_keys() + or publication.get("schema") + != "bertose_a5_static_v2_direct_development_publication_20260724_r2" + or publication.get("status") + != "PASS_DIRECT_FULL_DEVELOPMENT_STATIC_PUBLICATION_READBACK" + or publication.get("production_mode") is not True + or publication.get("owner_amendment_file_sha256") + != OWNER_AMENDMENT_FILE_SHA256 + or publication.get("owner_amendment_receipt_sha256") + != OWNER_AMENDMENT_RECEIPT_SHA256 + or publication.get("selected_handoff_file_sha256") + != selected_handoff_file_sha256 + or publication.get("selected_handoff_receipt_sha256") + != selected.get("receipt_sha256") + or publication.get("development_used_for_support_or_null_fit") is not False + or publication.get( + "development_used_for_checkpoint_selection_after_amendment" + ) + is not False + or publication.get( + "model_or_rvq_updated_during_direct_development_encoding" + ) + is not False + or publication.get("native_ablation_data_binding_authorized") is not False + or publication.get("nova_submission_authorized") is not False + or publication.get("official_submitted_artifacts_modified") is not False + or publication.get("authorization") + != direct_r2.closed_launch_authorization() + or not isinstance(export, Mapping) + or export.get("exact_counts") != dict(EXPECTED_COUNTS) + or export.get("selected_checkpoint_semantic_sha256") + != selected.get("selected_best_checkpoint_semantic_sha256") + or export.get("development_used_for_support_or_null_fit") is not False + or export.get("legacy_selection_capacity_role_split_used") is not False + or export.get("caller_supplied_code_path_used") is not False + or publication.get("export_receipt_sha256") + != export.get("receipt_sha256") + or result.get("source_closure_sha256") + != export.get("source_closure_sha256") + or result.get("selected_checkpoint_semantic_sha256") + != selected.get("selected_best_checkpoint_semantic_sha256") + or result.get("publication_receipt_sha256") != publication_receipt + or publication.get("preserved_authority_role_counts") + != dict(EXPECTED_AUTHORITY_ROLE_COUNTS) + or not isinstance(historical, Mapping) + or historical.get("counts") + != {"parent_count": 1_036, "state_count": 1_532, "residue_count": 9_740} + or historical.get("used_as_postfit_publication_gate") is not False + or not isinstance(join, Mapping) + or join.get("sequence_row_count") != 28_370 + or join.get("static_parent_count") != 28_370 + or join.get("token_state_count") != 42_372 + or join.get("token_parent_count") != 28_370 + or publication.get("join_receipt_sha256") != join.get("receipt_sha256") + or publication.get("null_receipt_sha256") != null_receipt + ): + raise TerminalCertificationR6Error( + "R2 result/publication exact counts, amendment, or policy changed" + ) + _self_hash(export, "R2 export receipt") + _self_hash(join, "R2 join receipt") + _self_hash(historical, "R2 historical provenance") + return result_receipt, publication_receipt + + +def _validate_r2_result_and_publication( + *, + result_path: Path, + selected: Mapping[str, Any], + selected_handoff_file_sha256: str, +) -> dict[str, Any]: + _require_exact_path( + result_path, PERSISTED_R2_RESULT_PATH, "persisted R2 result" + ) + direct_r2, _validated_callable, _surface = ( + _validate_r2_frozen_surface() + ) + result, result_read = read_canonical( + PERSISTED_R2_RESULT_PATH, + label="persisted R2 result", + maximum=16 * 1024 * 1024, + ) + publication_path = R2_OUTPUT_DIRECTORY / R2_RECEIPT_FILENAME + publication, publication_read = read_canonical( + publication_path, + label="R2 publication receipt", + maximum=64 * 1024 * 1024, + ) + result_receipt, publication_receipt = _validate_r2_values( + result=result, + publication=publication, + selected=selected, + selected_handoff_file_sha256=selected_handoff_file_sha256, + direct_r2=direct_r2, + ) + _validate_r2_output_namespace() + members = { + label: _publication_member(publication=publication, label=label) + for label in R2_PUBLICATION_FILENAMES + } + null_value = _canonical_from_read( + members["null_publication"], "R2 null publication" + ) + if ( + _self_hash(null_value, "R2 null publication") + != publication.get("null_receipt_sha256") + or null_value.get("schema") + != "bertose_a5_static_v2_published_train_only_null_20260722_r4" + or null_value.get("status") + != "FROZEN_PREPARATION_ONLY_TRAIN_ONLY_STATIC_NULL" + or null_value.get("train_state_count") != 34_408 + or null_value.get("development_state_count_read_during_fit") != 0 + or null_value.get("fit_used_training_only") is not True + or null_value.get("selected_checkpoint_semantic_sha256") + != selected.get("selected_best_checkpoint_semantic_sha256") + ): + raise TerminalCertificationR6Error( + "R2 train-only null publication changed" + ) + shard_audit = _validate_r2_shards( + export=publication["export_receipt"], + selected_checkpoint_semantic_sha256=selected[ + "selected_best_checkpoint_semantic_sha256" + ], + ) + return { + "result": result, + "result_read": result_read, + "result_receipt_sha256": result_receipt, + "publication": publication, + "publication_read": publication_read, + "publication_receipt_sha256": publication_receipt, + "members": members, + "shard_audit": shard_audit, + } + + +def _r2_invocation_contract( + *, selected_handoff_file_sha256: str +) -> dict[str, Any]: + value: dict[str, Any] = { + "schema": "bertose_a5_static_v2_r2_invocation_contract_20260725_r6", + "sbatch": { + "absolute_path": os.fspath(R2_SBATCH_PATH), + "file_sha256": R2_SBATCH_SHA256, + "size_bytes": R2_SBATCH_SIZE_BYTES, + }, + "r2_core": { + "absolute_path": os.fspath(R2_CORE_PATH), + "file_sha256": R2_CORE_SHA256, + "size_bytes": R2_CORE_SIZE_BYTES, + }, + "owner_amendment": { + "absolute_path": os.fspath(OWNER_AMENDMENT_PATH), + "file_sha256": OWNER_AMENDMENT_FILE_SHA256, + "receipt_sha256": OWNER_AMENDMENT_RECEIPT_SHA256, + }, + "selected_handoff": { + "absolute_path": os.fspath(SELECTED_HANDOFF_PATH), + "file_sha256": selected_handoff_file_sha256, + }, + "inputs": { + label: { + "absolute_path": os.fspath(path), + "file_sha256": digest, + "size_bytes": size, + } + for label, (path, digest, size) in R2_INPUT_BINDINGS.items() + }, + "output_directory": os.fspath(R2_OUTPUT_DIRECTORY), + "shard_directory": os.fspath(R2_SHARD_DIRECTORY), + "device_type": R2_DEVICE_TYPE, + "shard_size": R2_SHARD_SIZE, + "arbitrary_callback_accepted": False, + "arbitrary_result_accepted": False, + } + value["receipt_sha256"] = sha256_json(value) + return value + + +_BOUND_FILE_KEYS = frozenset( + {"absolute_path", "file_sha256", "size_bytes", "receipt_sha256"} +) +_BOUND_FILES = frozenset( + { + "terminal_evidence", + "continuation", + "memory_amendment", + "memory_applied", + "full_fit_result", + "selected_handoff", + "direct_publication", + "persisted_r2_result", + "token_publication", + "state_publication", + "null_publication", + "traceability_publication", + } +) +_BINDING_KEYS = frozenset( + { + "schema", + "status", + "successor_job_id", + "cancelled_unused_job_ids", + "executed_attempt_job_ids", + "bound_files", + "terminal_evidence_receipt_sha256", + "full_fit_result_receipt_sha256", + "selected_handoff_receipt_sha256", + "selected_checkpoint_semantic_sha256", + "r5_predecessor_source_sha256", + "r4_predecessor_source_sha256", + "active_r6_runtime_source_sha256", + "active_r6_handoff_source_sha256", + "r2_direct_source_sha256", + "r2_invocation_contract", + "r2_invocation_contract_sha256", + "r2_result_receipt_sha256", + "r2_publication_receipt_sha256", + "r2_shard_audit", + "r2_shard_audit_sha256", + "publication_members_reopened", + "terminal_latest_and_selected_best_reopened", + "terminal_continuation_required_for_native_eight_release", + "native_ablation_data_binding_authorized", + "nova_submission_authorized", + "official_submitted_artifacts_modified", + "authorization", + "receipt_sha256", + } +) + + +def _bound_file( + *, + path: Path, + observed: ImmutableRead, + receipt_sha256: str | None, +) -> dict[str, Any]: + if receipt_sha256 is not None: + _sha(receipt_sha256, f"{path.name} receipt") + return { + "absolute_path": os.fspath(path), + "file_sha256": observed.file_sha256, + "size_bytes": observed.size_bytes, + "receipt_sha256": receipt_sha256, + } + + +def _build_bound_files( + *, + terminal_read: ImmutableRead, + terminal_receipt_sha256: str, + lineage: Mapping[str, Any], + result: Mapping[str, Any], + result_read: ImmutableRead, + selected: Mapping[str, Any], + selected_read: ImmutableRead, + r2: Mapping[str, Any], +) -> dict[str, dict[str, Any]]: + members = r2["members"] + publication = r2["publication"] + null_value = _canonical_from_read( + members["null_publication"], "R2 bound null" + ) + return { + "terminal_evidence": _bound_file( + path=TERMINAL_EVIDENCE_PATH, + observed=terminal_read, + receipt_sha256=terminal_receipt_sha256, + ), + "continuation": _bound_file( + path=CONTINUATION_PATH, + observed=lineage["continuation_read"], + receipt_sha256=CONTINUATION_RECEIPT_SHA256, + ), + "memory_amendment": _bound_file( + path=MEMORY_AMENDMENT_PATH, + observed=lineage["memory_amendment_read"], + receipt_sha256=MEMORY_AMENDMENT_RECEIPT_SHA256, + ), + "memory_applied": _bound_file( + path=MEMORY_APPLIED_PATH, + observed=lineage["memory_applied_read"], + receipt_sha256=MEMORY_APPLIED_RECEIPT_SHA256, + ), + "full_fit_result": _bound_file( + path=FULL_FIT_RESULT_PATH, + observed=result_read, + receipt_sha256=str(result["receipt_sha256"]), + ), + "selected_handoff": _bound_file( + path=SELECTED_HANDOFF_PATH, + observed=selected_read, + receipt_sha256=str(selected["receipt_sha256"]), + ), + "direct_publication": _bound_file( + path=R2_OUTPUT_DIRECTORY / R2_RECEIPT_FILENAME, + observed=r2["publication_read"], + receipt_sha256=r2["publication_receipt_sha256"], + ), + "persisted_r2_result": _bound_file( + path=PERSISTED_R2_RESULT_PATH, + observed=r2["result_read"], + receipt_sha256=r2["result_receipt_sha256"], + ), + "token_publication": _bound_file( + path=R2_OUTPUT_DIRECTORY + / R2_PUBLICATION_FILENAMES["token_publication"], + observed=members["token_publication"], + receipt_sha256=None, + ), + "state_publication": _bound_file( + path=R2_OUTPUT_DIRECTORY + / R2_PUBLICATION_FILENAMES["state_publication"], + observed=members["state_publication"], + receipt_sha256=None, + ), + "null_publication": _bound_file( + path=R2_OUTPUT_DIRECTORY + / R2_PUBLICATION_FILENAMES["null_publication"], + observed=members["null_publication"], + receipt_sha256=_self_hash(null_value, "R2 bound null"), + ), + "traceability_publication": _bound_file( + path=R2_OUTPUT_DIRECTORY + / R2_PUBLICATION_FILENAMES["traceability_publication"], + observed=members["traceability_publication"], + receipt_sha256=None, + ), + } + + +def _reopen_bound_file( + name: str, binding: Mapping[str, Any] +) -> ImmutableRead: + expected_paths = { + "terminal_evidence": TERMINAL_EVIDENCE_PATH, + "continuation": CONTINUATION_PATH, + "memory_amendment": MEMORY_AMENDMENT_PATH, + "memory_applied": MEMORY_APPLIED_PATH, + "full_fit_result": FULL_FIT_RESULT_PATH, + "selected_handoff": SELECTED_HANDOFF_PATH, + "direct_publication": R2_OUTPUT_DIRECTORY / R2_RECEIPT_FILENAME, + "persisted_r2_result": PERSISTED_R2_RESULT_PATH, + "token_publication": ( + R2_OUTPUT_DIRECTORY / R2_PUBLICATION_FILENAMES["token_publication"] + ), + "state_publication": ( + R2_OUTPUT_DIRECTORY / R2_PUBLICATION_FILENAMES["state_publication"] + ), + "null_publication": ( + R2_OUTPUT_DIRECTORY / R2_PUBLICATION_FILENAMES["null_publication"] + ), + "traceability_publication": ( + R2_OUTPUT_DIRECTORY + / R2_PUBLICATION_FILENAMES["traceability_publication"] + ), + } + if ( + name not in expected_paths + or set(binding) != _BOUND_FILE_KEYS + or Path(str(binding.get("absolute_path", ""))) != expected_paths[name] + or type(binding.get("size_bytes")) is not int + or binding["size_bytes"] < 1 + or ( + binding.get("receipt_sha256") is not None + and SHA_RE.fullmatch(str(binding.get("receipt_sha256"))) is None + ) + ): + raise TerminalCertificationR6Error(f"R6 bound file {name} changed") + return read_immutable( + expected_paths[name], + label=f"R6 bound {name}", + expected_sha256=str(binding.get("file_sha256")), + expected_size_bytes=binding["size_bytes"], + maximum=4 * 1024 * 1024 * 1024, + require_readonly=True, + ) + + +def _validate_binding_value( + *, + binding: Mapping[str, Any], + terminal: Mapping[str, Any], + terminal_read: ImmutableRead, + lineage: Mapping[str, Any], + result: Mapping[str, Any], + result_read: ImmutableRead, + selected: Mapping[str, Any], + selected_read: ImmutableRead, + r2: Mapping[str, Any], + direct_r2: Any, +) -> dict[str, Any]: + value = dict(binding) + receipt = _self_hash(value, "R6 terminal certification binding") + invocation = _r2_invocation_contract( + selected_handoff_file_sha256=selected_read.file_sha256 + ) + expected_bound = _build_bound_files( + terminal_read=terminal_read, + terminal_receipt_sha256=terminal["receipt_sha256"], + lineage=lineage, + result=result, + result_read=result_read, + selected=selected, + selected_read=selected_read, + r2=r2, + ) + if ( + set(value) != _BINDING_KEYS + or value.get("schema") != BINDING_SCHEMA + or value.get("status") != BINDING_STATUS + or value.get("successor_job_id") != SUCCESSOR_JOB_ID + or value.get("cancelled_unused_job_ids") + != list(CANCELLED_UNUSED_JOB_IDS) + or value.get("executed_attempt_job_ids") + != [EXECUTED_PARENT_JOB_ID, SUCCESSOR_JOB_ID] + or value.get("bound_files") != expected_bound + or value.get("terminal_evidence_receipt_sha256") + != terminal["receipt_sha256"] + or value.get("full_fit_result_receipt_sha256") + != result["receipt_sha256"] + or value.get("selected_handoff_receipt_sha256") + != selected["receipt_sha256"] + or value.get("selected_checkpoint_semantic_sha256") + != selected["selected_best_checkpoint_semantic_sha256"] + or value.get("r5_predecessor_source_sha256") + != R5_PREDECESSOR_SHA256 + or value.get("r4_predecessor_source_sha256") + != R4_PREDECESSOR_SHA256 + or value.get("active_r6_runtime_source_sha256") + != ACTIVE_R6_RUNTIME_SHA256 + or value.get("active_r6_handoff_source_sha256") + != ACTIVE_R6_HANDOFF_SHA256 + or value.get("r2_direct_source_sha256") != R2_CORE_SHA256 + or value.get("r2_invocation_contract") != invocation + or value.get("r2_invocation_contract_sha256") + != invocation["receipt_sha256"] + or value.get("r2_result_receipt_sha256") + != r2["result_receipt_sha256"] + or value.get("r2_publication_receipt_sha256") + != r2["publication_receipt_sha256"] + or value.get("r2_shard_audit") != r2["shard_audit"] + or value.get("r2_shard_audit_sha256") + != r2["shard_audit"]["receipt_sha256"] + or value.get("publication_members_reopened") + != [ + "token_publication", + "state_publication", + "null_publication", + "traceability_publication", + ] + or value.get("terminal_latest_and_selected_best_reopened") is not True + or value.get( + "terminal_continuation_required_for_native_eight_release" + ) + is not True + or value.get("native_ablation_data_binding_authorized") is not False + or value.get("nova_submission_authorized") is not False + or value.get("official_submitted_artifacts_modified") is not False + or value.get("authorization") + != direct_r2.closed_launch_authorization() + ): + raise TerminalCertificationR6Error( + "R6 terminal certification binding changed" + ) + bound = value.get("bound_files") + if not isinstance(bound, Mapping) or set(bound) != _BOUND_FILES: + raise TerminalCertificationR6Error("R6 bound-file roster changed") + for name, item in bound.items(): + observed = _reopen_bound_file(name, item) + if observed.file_sha256 != expected_bound[name]["file_sha256"]: + raise TerminalCertificationR6Error( + f"R6 bound-file {name} readback changed" + ) + if receipt != value["receipt_sha256"]: + raise TerminalCertificationR6Error("R6 binding self-hash changed") + return value + + +def validate_terminal_publication_binding( + *, + binding_path: Path, + expected_binding_file_sha256: str, +) -> dict[str, Any]: + """Read-only deep validation of the completed R6 outer binding.""" + + _require_exact_path(binding_path, BINDING_OUTPUT_PATH, "R6 binding") + binding, binding_read = read_canonical( + BINDING_OUTPUT_PATH, + label="R6 terminal certification binding", + expected_sha256=expected_binding_file_sha256, + maximum=512 * 1024 * 1024, + ) + terminal_artifacts = validate_terminal_evidence( + terminal_evidence_path=TERMINAL_EVIDENCE_PATH + ) + terminal, terminal_read = read_canonical( + TERMINAL_EVIDENCE_PATH, + label="R6 bound terminal evidence", + maximum=64 * 1024 * 1024, + ) + lineage = _validate_continuation_lineage( + continuation_path=CONTINUATION_PATH, + memory_amendment_path=MEMORY_AMENDMENT_PATH, + memory_applied_path=MEMORY_APPLIED_PATH, + ) + result, result_read = read_canonical( + FULL_FIT_RESULT_PATH, + label="R6 bound full-fit result", + maximum=64 * 1024 * 1024, + ) + selected, selected_read = read_canonical( + SELECTED_HANDOFF_PATH, + label="R6 bound selected handoff", + maximum=64 * 1024 * 1024, + ) + if ( + result != terminal_artifacts["result"] + or selected != terminal_artifacts["selected"] + ): + raise TerminalCertificationR6Error( + "R6 terminal result/handoff readback changed" + ) + direct_r2, _validated_callable, _surface = ( + _validate_r2_frozen_surface() + ) + r2 = _validate_r2_result_and_publication( + result_path=PERSISTED_R2_RESULT_PATH, + selected=selected, + selected_handoff_file_sha256=selected_read.file_sha256, + ) + validated = _validate_binding_value( + binding=binding, + terminal=terminal, + terminal_read=terminal_read, + lineage=lineage, + result=result, + result_read=result_read, + selected=selected, + selected_read=selected_read, + r2=r2, + direct_r2=direct_r2, + ) + if binding_read.file_sha256 != expected_binding_file_sha256: + raise TerminalCertificationR6Error( + "R6 binding file hash changed during validation" + ) + return validated + + +def validate_release_binding( + binding_path: Path, + expected_sha256: str, + expected_size_bytes: int, +) -> dict[str, Any]: + """Exact callback-free three-argument adapter for native-eight release.""" + + _require_exact_path(binding_path, BINDING_OUTPUT_PATH, "R6 release binding") + observed = read_immutable( + BINDING_OUTPUT_PATH, + label="R6 native-eight release binding", + expected_sha256=expected_sha256, + expected_size_bytes=expected_size_bytes, + maximum=512 * 1024 * 1024, + ) + validated = validate_terminal_publication_binding( + binding_path=BINDING_OUTPUT_PATH, + expected_binding_file_sha256=expected_sha256, + ) + if canonical_bytes(validated) != observed.raw: + raise TerminalCertificationR6Error( + "R6 release adapter did not return exact binding bytes" + ) + return validated + + +def run_certified_direct_postfit() -> dict[str, Any]: + """Hard-call frozen R2 only after exact successor terminal validation.""" + + if ( + os.path.lexists(PERSISTED_R2_RESULT_PATH) + or os.path.lexists(BINDING_OUTPUT_PATH) + ): + raise TerminalCertificationR6Error( + "R6 result/binding output already exists" + ) + terminal_artifacts = validate_terminal_evidence( + terminal_evidence_path=TERMINAL_EVIDENCE_PATH + ) + terminal, terminal_read = read_canonical( + TERMINAL_EVIDENCE_PATH, + label="R6 postfit terminal evidence", + maximum=64 * 1024 * 1024, + ) + lineage = _validate_continuation_lineage( + continuation_path=CONTINUATION_PATH, + memory_amendment_path=MEMORY_AMENDMENT_PATH, + memory_applied_path=MEMORY_APPLIED_PATH, + ) + result, result_read = read_canonical( + FULL_FIT_RESULT_PATH, + label="R6 postfit full-fit result", + maximum=64 * 1024 * 1024, + ) + selected, selected_read = read_canonical( + SELECTED_HANDOFF_PATH, + label="R6 postfit selected handoff", + maximum=64 * 1024 * 1024, + ) + if ( + result != terminal_artifacts["result"] + or selected != terminal_artifacts["selected"] + ): + raise TerminalCertificationR6Error( + "R6 postfit terminal inputs changed" + ) + _require_r2_environment() + direct_r2, validated_run_direct_postfit, _surface = ( + _validate_r2_frozen_surface() + ) + invocation = _r2_invocation( + selected_handoff_file_sha256=selected_read.file_sha256 + ) + try: + if direct_r2.run_direct_postfit is not validated_run_direct_postfit: + raise TerminalCertificationR6Error( + "frozen R2 callable changed after validation" + ) + produced = dict(validated_run_direct_postfit(**invocation)) + except Exception as error: + raise TerminalCertificationR6Error( + "frozen R2 direct postfit hard-call failed" + ) from error + publication, _publication_read = read_canonical( + R2_OUTPUT_DIRECTORY / R2_RECEIPT_FILENAME, + label="new R2 publication receipt", + maximum=64 * 1024 * 1024, + ) + _validate_r2_values( + result=produced, + publication=publication, + selected=selected, + selected_handoff_file_sha256=selected_read.file_sha256, + direct_r2=direct_r2, + ) + _publish_canonical_exclusive( + PERSISTED_R2_RESULT_PATH, + produced, + "R6 persisted R2 result", + ) + r2 = _validate_r2_result_and_publication( + result_path=PERSISTED_R2_RESULT_PATH, + selected=selected, + selected_handoff_file_sha256=selected_read.file_sha256, + ) + bound_files = _build_bound_files( + terminal_read=terminal_read, + terminal_receipt_sha256=terminal["receipt_sha256"], + lineage=lineage, + result=result, + result_read=result_read, + selected=selected, + selected_read=selected_read, + r2=r2, + ) + invocation_contract = _r2_invocation_contract( + selected_handoff_file_sha256=selected_read.file_sha256 + ) + value: dict[str, Any] = { + "schema": BINDING_SCHEMA, + "status": BINDING_STATUS, + "successor_job_id": SUCCESSOR_JOB_ID, + "cancelled_unused_job_ids": list(CANCELLED_UNUSED_JOB_IDS), + "executed_attempt_job_ids": [ + EXECUTED_PARENT_JOB_ID, + SUCCESSOR_JOB_ID, + ], + "bound_files": bound_files, + "terminal_evidence_receipt_sha256": terminal["receipt_sha256"], + "full_fit_result_receipt_sha256": result["receipt_sha256"], + "selected_handoff_receipt_sha256": selected["receipt_sha256"], + "selected_checkpoint_semantic_sha256": selected[ + "selected_best_checkpoint_semantic_sha256" + ], + "r5_predecessor_source_sha256": R5_PREDECESSOR_SHA256, + "r4_predecessor_source_sha256": R4_PREDECESSOR_SHA256, + "active_r6_runtime_source_sha256": ACTIVE_R6_RUNTIME_SHA256, + "active_r6_handoff_source_sha256": ACTIVE_R6_HANDOFF_SHA256, + "r2_direct_source_sha256": R2_CORE_SHA256, + "r2_invocation_contract": invocation_contract, + "r2_invocation_contract_sha256": invocation_contract[ + "receipt_sha256" + ], + "r2_result_receipt_sha256": r2["result_receipt_sha256"], + "r2_publication_receipt_sha256": r2[ + "publication_receipt_sha256" + ], + "r2_shard_audit": r2["shard_audit"], + "r2_shard_audit_sha256": r2["shard_audit"]["receipt_sha256"], + "publication_members_reopened": [ + "token_publication", + "state_publication", + "null_publication", + "traceability_publication", + ], + "terminal_latest_and_selected_best_reopened": True, + "terminal_continuation_required_for_native_eight_release": True, + "native_ablation_data_binding_authorized": False, + "nova_submission_authorized": False, + "official_submitted_artifacts_modified": False, + "authorization": direct_r2.closed_launch_authorization(), + } + value["receipt_sha256"] = sha256_json(value) + binding_read = _publish_canonical_exclusive( + BINDING_OUTPUT_PATH, + value, + "R6 terminal certification binding", + ) + validated = validate_release_binding( + BINDING_OUTPUT_PATH, + binding_read.file_sha256, + binding_read.size_bytes, + ) + if validated != value: + raise TerminalCertificationR6Error( + "R6 outer binding final readback changed" + ) + return value + + +__all__ = [ + "BINDING_SCHEMA", + "BINDING_STATUS", + "TerminalCertificationR6Error", + "build_terminal_evidence", + "run_certified_direct_postfit", + "validate_release_binding", + "validate_terminal_evidence", + "validate_terminal_publication_binding", +] diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/a5_wa345_continuation_manifest_20260819_r1.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/a5_wa345_continuation_manifest_20260819_r1.json new file mode 100644 index 0000000000000000000000000000000000000000..b2cc17e46300c5abca810ea53bdddad57fad25c4 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/a5_wa345_continuation_manifest_20260819_r1.json @@ -0,0 +1 @@ +{"architecture_disclosure":{"constraint_requested":null,"cross_architecture_resume_permitted":false,"measured_hours_per_epoch":{"a100_80gb":1.0572,"h200_nvl":0.4798},"pinned":true,"pinned_by":"nodelist nova25-gpu-[2-4] plus CONTINUATION_ARCHITECTURE_PIN=h200","reason":"the first ~26 epochs of every arm ran on H200; resuming one cell on A100 would split a single trajectory across two architectures, which is the defect that makes wa2_seed44 non-reproducible. This is consistency WITHIN a cell, not pinning ACROSS the family.","route_architectures":["h200"]},"arm_label_by_policy":{"WA3_FINAL_MS_MD_HEAVY":"wa3","WA4_FINAL_AUXILIARY_HEAVY":"wa4","WA5_FINAL_STRUCTURE_MINIMAL":"wa5"},"arms":{"wa3":{"array_task_id":0,"cell_directory_name":"review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42","coefficients":{"md":2.0,"ms":2.0,"sequence":0.5,"static":0.25,"topology":0.25},"loss_policy":"WA3_FINAL_MS_MD_HEAVY","pretraining_seed":42,"shares_percent":{"md":40,"ms":40,"sequence":10,"static":5,"topology":5}},"wa4":{"array_task_id":1,"cell_directory_name":"review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa4_seed42","coefficients":{"md":1.5,"ms":1.5,"sequence":0.25,"static":1.5,"topology":0.25},"loss_policy":"WA4_FINAL_AUXILIARY_HEAVY","pretraining_seed":42,"shares_percent":{"md":30,"ms":30,"sequence":5,"static":30,"topology":5}},"wa5":{"array_task_id":2,"cell_directory_name":"review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa5_seed42","coefficients":{"md":1.5,"ms":1.75,"sequence":0.75,"static":0.25,"topology":0.75},"loss_policy":"WA5_FINAL_STRUCTURE_MINIMAL","pretraining_seed":42,"shares_percent":{"md":30,"ms":35,"sequence":15,"static":5,"topology":15}}},"boundaries":{"coefficient_search":false,"downstream_guided_selection":false,"heldout_access":false,"hpo":false,"official_submitted_artifacts_modified":false,"schedule_modified":false,"test_access":false},"cell_id":"A1111","claim_repair":{"automatic":false,"claim_basename":"review_md20x6_wa2_run_claim.json","claim_domain":"bertose_review_md_temporal_20x6_a1111_wa2_claim_20260811_r1","dry_run_is_the_default":true,"invoked_from_sbatch":false,"mutable_field":"first_array_job_id","refusals":["running inside a Slurm allocation","cell is not one of the three this package owns","a final receipt exists","claim missing, unsafe, non-canonical, or claim_sha256 does not verify","no checkpoint role verifies","target array is not the operator's own, or any task is not PENDING","the array named by the current claim is still alive","any field other than first_array_job_id and claim_sha256 would change","the pinned WA345 manifest is absent or has changed"],"required_flag":"--apply","stranding_field":"first_array_job_id","tool":"repair_a5_wa345_claim_20260819_r1.py"},"coefficient_shares_percent":{"WA3_FINAL_MS_MD_HEAVY":{"md":40,"ms":40,"sequence":10,"static":5,"topology":5},"WA4_FINAL_AUXILIARY_HEAVY":{"md":30,"ms":30,"sequence":5,"static":30,"topology":5},"WA5_FINAL_STRUCTURE_MINIMAL":{"md":30,"ms":35,"sequence":15,"static":5,"topology":15}},"coefficients_by_policy":{"WA3_FINAL_MS_MD_HEAVY":{"md":2.0,"ms":2.0,"sequence":0.5,"static":0.25,"topology":0.25},"WA4_FINAL_AUXILIARY_HEAVY":{"md":1.5,"ms":1.5,"sequence":0.25,"static":1.5,"topology":0.25},"WA5_FINAL_STRUCTURE_MINIMAL":{"md":1.5,"ms":1.75,"sequence":0.75,"static":0.25,"topology":0.75}},"coefficients_unchanged_from_pretraining":true,"continued_from":{"architecture":"h200","array_job_id":"12038727","array_tasks":[0,1,2],"measured_minutes_per_epoch_including_startup":29.6,"node":"nova25-gpu-2","projected_timeout_utc":"2026-08-18T03:29:48","requeued_by_slurm_on_timeout":false,"started_utc":"2026-08-17T14:29:48","termination":"TIMEOUT","time_limit":"13:00:00","timeout_is_not_preemption":true,"upstream_seed":42},"downstream_seed":241271852,"early_stopping_precedent":{"all_five_stopped_at_best_plus_patience":true,"best_epoch_span":[23,32],"cells":{"wa1_seed42":{"best_epoch":29,"completed_epochs":44},"wa1_seed44":{"best_epoch":32,"completed_epochs":47},"wa2_seed42":{"best_epoch":27,"completed_epochs":42},"wa2_seed43":{"best_epoch":23,"completed_epochs":38},"wa2_seed44":{"best_epoch":31,"completed_epochs":46}},"why_continuation_is_required":"best epochs span 23-32, so a run truncated at ~26 epochs would very likely stop before its own best, and could not be reported as an early-stopped arm"},"expected_resume":{"authoritative_source":"/review_checkpoints/review_md20x6_checkpoint_index.json roles.latest.epoch","estimate_is_not_a_gate":true,"method":"13.0 h of wall time at 29.6 min per epoch including startup = 26.35, so 26 committed epochs","per_arm_expected_resume_epoch":{"wa3":26,"wa4":26,"wa5":26},"plausible_range":[25,27]},"kind":"continuation","launch_script_integrity":{"bytes":23262,"normalization":"sha256 of the sbatch with the values of the CONTINUATION_MANIFEST_SHA256= and SBATCH_INTEGRITY_SHA256= lines removed","path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/submit_a5_wa345_continuation_20260819_r1.sbatch","sha256_normalized":"eb6811f37c17b7902b4b4a8a82e8abe25507cf4d8f4983d863eed8870df62b4c"},"loss_denominator":5,"manifest_identity_sha256":"e5ef025a26ba86705a79b9d7f5ef25a8b53e5f01685abb2db46be3e09e5c0d54","output_root":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production","output_root_is_the_pretraining_root":true,"package_files":{"claim_repair_tool":{"bytes":26786,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/repair_a5_wa345_claim_20260819_r1.py","sha256":"a8ee0900ff5281871e134ba738538dfc658957bfaadd08df7ac9985ac484ee8b"},"self_check":{"bytes":43483,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/selfcheck_a5_wa345_continuation_20260819_r1.py","sha256":"e76a0503cbd9e25e0bc1e97b1e86942395fc4a9eef5a29f762c3c97968c95871"}},"pretraining_manifest":{"fields_describing_the_20260817_submission_only":["launch_script_integrity","route.time_limit","submission_plan.array_spec","submission_plan.maximum_array_submissions"],"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/a5_wa345_manifest_20260817_r1.json","reason_not_rebuilt":"manifest_sha256 is one of the nine fields of each cell's run claim, and claim_cell compares the whole document; rebuilding the manifest strands every cell exactly as a new array id does","reused_byte_for_byte":true,"sha256":"eeebc9c7e2cfc701f3ad47e62696ae2247c8caec93d8b034d5f573b701eab2a1","this_continuation_actual_array_rule":"any non-empty subset of {0,1,2}","this_continuation_actual_time_limit":"2-12:00:00"},"project_root":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc","resume_policy":{"create_or_resume_runner":true,"creates_new_root":false,"maximum_restart_count":2,"requeue":true,"requeue_restarts_the_walltime_clock":true,"restart_guard_matches_runner":true,"sbatch_refuses_to_create_a_missing_cell":true},"route":{"architecture_pin":"h200","architecture_pinned_by":"nodelist","constraint":null,"cpus_per_task":4,"excluded_node_list":"nova18-gpu-[1-5],nova18-singularity,nova20-frost-1,nova20-matrix,nova21-gpu-10,nova26-gpu-1","gres":"gpu:1","memory":"64G","minimum_gpu_memory_mib":80000,"requested_node_list":"nova25-gpu-[2-4]","requeue":true,"submission_routes":{"scavenger":{"account":"ratul-scavenger","array_tasks":[0,1,2],"partition":"scavenger","qos":"scavenger"}},"time_limit":"2-12:00:00"},"schedule":{"changed_by_this_package":false,"maximum_epochs":100,"owned_by":"run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py lines 70-71, and enforced against the WA345 manifest at line 180","patience":15,"selection_rule":"strict_lower_earliest_tie","success_stop_reason":"patience_exhausted"},"schema":"bertose_a5_wa345_continuation_manifest_20260819_r1","semantic_array_id":"md20x6-a1111-wa345-20260817-r1","source_bindings":{"core":{"bytes":48643,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/review_md_temporal_20x6_core_r3.py","sha256":"3e96d8092239c2c21f217ad5bae4ee7e07dbe0f7630b213bad468d6b08d3b1c1","verified_against":"local mirror"},"pretraining_manifest":{"bytes":9199,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/a5_wa345_manifest_20260817_r1.json","sha256":"eeebc9c7e2cfc701f3ad47e62696ae2247c8caec93d8b034d5f573b701eab2a1","verified_against":"local mirror"},"pretraining_sbatch":{"bytes":19132,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/submit_a5_wa345_20260817_r1.sbatch","sha256":"a090f111df7cc0db09e61ea0a8067882b7cd9bf21d91c53da4115549560b08e7","verified_against":"local mirror"},"r3_runner":{"bytes":50267,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/run_review_md_temporal_20x6_training_r3.py","sha256":"1e446e7e89a39ef01132b9f2a4deb817161f7b376a0fa04c2b11529004f53e8a","verified_against":"local mirror"},"wa2_runner":{"bytes":39694,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py","sha256":"dd74253863f39150af4ddc7e8d48c0a366e1f327c30aa50e0748078330b97b85","verified_against":"local mirror"},"wa345_shim":{"bytes":53542,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/run_a5_wa345_shim_20260817_r1.py","sha256":"5159414381025cf3e2d5e742422c84c292481168af42801c773df4ba12797fb4","verified_against":"local mirror"}},"status":"PREPARED_NOT_SUBMITTED","submission_plan":{"array_spec_default":"0-2","array_spec_rule":"any non-empty subset of tasks 0, 1, 2","claim_repair_must_precede_submission":true,"earliest_submission_reason":"aug-maint ends","earliest_submission_utc":"2026-08-19T17:00:00","hold_then_release":true,"hold_then_release_reason":"the repair tool refuses any array whose tasks are not PENDING, so the array's job id must exist before the repair -- and a task that starts before the repair aborts with code 92 and is NOT requeued, because a non-zero exit is not a preemption. --hold makes the ordering safe: submit held, repair all three claims, then release.","launch_authorized":false,"permitted_sbatch_options":["--array","--hold","--parsable","--test-only"],"release_command":"/usr/bin/scontrol release ","sbatch_test_only_required":true,"submit_before_repair":true,"sync_authorized":false},"upstream_seed":42,"walltime_basis":{"a100_hours_per_epoch":1.0572,"chosen":"2-12:00:00","chosen_hours":60.0,"epochs_reachable_in_chosen_walltime":{"a100_80gb":56,"h200_nvl":125},"epochs_remaining_to_target":29,"h200_hours_per_epoch":0.4798,"hours_required_from_resume_to_target":{"a100_80gb":30.66,"h200_nvl":13.91},"margin_over_target":{"a100_80gb":1.96,"h200_nvl":4.31},"precedent":"executed WA2 submission used 2-12:00:00 on this same route","resume_epoch_assumed":26,"schedule_binds_not_the_clock_on":["h200_nvl"],"target_best_epoch":40,"target_completed_epochs":55,"worst_case_from_scratch_hours":{"a100_80gb":58.15,"h200_nvl":26.39}}} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/submit_a5_wa345_continuation_20260819_r1.sbatch b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/submit_a5_wa345_continuation_20260819_r1.sbatch new file mode 100644 index 0000000000000000000000000000000000000000..5f3edd1143ad88f298651767e51687bb36185439 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/submit_a5_wa345_continuation_20260819_r1.sbatch @@ -0,0 +1,453 @@ +#!/bin/bash +#SBATCH --job-name=a5-wa345-cont-r1 +#SBATCH --partition=scavenger +#SBATCH --account=ratul-scavenger +#SBATCH --qos=scavenger +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=4 +#SBATCH --gres=gpu:1 +#SBATCH --mem=64G +#SBATCH --time=2-12:00:00 +#SBATCH --nodelist=nova25-gpu-[2-4] +#SBATCH --exclude=nova18-gpu-[1-5],nova18-singularity,nova20-frost-1,nova20-matrix,nova21-gpu-10,nova26-gpu-1 +#SBATCH --requeue +#SBATCH --open-mode=append +#SBATCH --export=NONE +#SBATCH --chdir=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc +#SBATCH --output=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_continuation_r1_%A_%a.out +#SBATCH --error=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_continuation_r1_%A_%a.err +# +# WA3/WA4/WA5 CONTINUATION. Three cells, upstream seed 42, same arms, same +# coefficients, SAME OUTPUT ROOT. This job RESUMES the cells that array +# 12038727 started on 2026-08-17 and left at TIMEOUT; it does not restart them. +# +# Coefficient order is (sequence, topology, MS, static, MD). +# +# task 0 -> WA3_FINAL_MS_MD_HEAVY 0.50 0.25 2.00 0.25 2.00 arm wa3 +# task 1 -> WA4_FINAL_AUXILIARY_HEAVY 0.25 0.25 1.50 1.50 1.50 arm wa4 +# task 2 -> WA5_FINAL_STRUCTURE_MINIMAL 0.75 0.75 1.75 0.25 1.50 arm wa5 +# +# NOTHING ABOUT THE SCIENCE CHANGES HERE. The coefficients, PATIENCE = 15 and +# MAX_EPOCHS = 100 all live in the pinned runner and the pinned WA345 +# manifest, and BOTH are reused byte-for-byte. This file changes exactly +# three operational things relative to the 2026-08-17 launch: the walltime +# (13:00:00 -> 2-12:00:00), the array-shape rule (any non-empty subset of +# {0,1,2}, so a finished arm can be dropped), and the addition of the +# continuation preflight below. +# +# WHY THE MANIFEST IS NOT REBUILT. It would be the natural place to record the +# new walltime, and it is exactly the wrong place. `manifest_sha256` is one +# of the nine fields inside each cell's review_md20x6_wa2_run_claim.json, and +# the pinned runner's claim_cell compares the WHOLE claim document with `==`. +# A rebuilt manifest therefore strands all three cells for the same reason a +# new array id does. The pretraining manifest is reused unchanged +# (sha256 eeebc9c7...), and everything specific to this continuation is +# recorded in a SEPARATE document, the continuation manifest, which nothing +# in the pinned chain reads. +# +# The consequence, stated rather than hidden: the pretraining manifest's +# `route.time_limit` still reads "13:00:00" and its `launch_script_integrity` +# still describes the 2026-08-17 sbatch. Both describe THAT submission. The +# continuation manifest declares the divergence explicitly, and the local +# self-check asserts the declaration is present and correct. A silent +# disagreement would be a defect; a declared one is a record. +# +# THIS JOB REQUIRES A REPAIRED CLAIM, AND WILL NOT REPAIR ONE. +# Each cell's claim is stamped first_array_job_id = 12038727. claim_cell +# compares the whole document, so this array's own id will not match and the +# runner would abort with "WA2 output belongs to another job" -- deep inside, +# after loading torch and the adapter. The CONTINUATION PREFLIGHT below +# catches it first and aborts with code 92, naming both ids. +# The repair is a deliberate, reviewed, operator-run mutation of a claim of +# ownership over a production cell. It is done by +# repair_a5_wa345_claim_20260819_r1.py, BEFORE submission, with --apply, by a +# human. This script never calls it, and the self-check asserts that this +# file contains neither its name nor an --apply flag. +# +# ARCHITECTURE IS PINNED FOR THIS CONTINUATION, and that is a change of policy +# from the pretraining launch. --nodelist=nova25-gpu-[2-4] is retained and +# CONTINUATION_ARCHITECTURE_PIN below is enforced: every attempt of every arm +# runs on H200 NVL, the architecture the first ~26 epochs ran on. Resuming +# an in-flight trajectory on A100 would split one cell across two +# architectures, which is the defect that makes wa2_seed44 non-reproducible. +# The owner declined pinning ACROSS the family; that is a different question +# from consistency WITHIN a cell, which this enforces. +# There is still NO --constraint: the pin is by node list, and a job that +# arrives carrying a constraint is refused (code 78) exactly as before. +# +# REQUEUE STAYS ON and the restart guard stays at <= 2, matching the pinned +# runner's own `int(restart_text) <= 2`. Requeue restarts the walltime +# clock, so preemption costs at most the epoch in progress. +# +# A TIMEOUT IS NOT A PREEMPTION. Slurm does not requeue a job that hits its +# time limit, which is why 12038727 simply stopped and why this package +# exists. The walltime below is sized so that TIMEOUT cannot be the thing +# that ends an arm: see the continuation manifest's walltime_basis and +# README section 4. +# +# ARRAY SHAPE IS A SUBSET RULE, NOT A FIXED TRIPLE. If an arm reached +# patience_exhausted before the timeout it has a final receipt and needs no +# continuation; it is dropped from the --array spec. Any non-empty subset of +# {0,1,2} is admitted. A task whose cell already carries a final receipt +# still aborts with code 81, so submitting the full 0-2 by mistake is safe. + +set -Eeuo pipefail +umask 077 + +# -------------------------------------------------------------------------- +# Every abort path emits one labelled line on stderr. +# +# `set -E` (errtrace) is what makes this hold inside $( ) command +# substitutions: an ERR trap is NOT inherited by subshells without it. The +# trap is the backstop; die() is the labelled path for expected failures. +# -------------------------------------------------------------------------- + +wa345_context() { + printf 'task=%s job=%s array_job=%s node=%s restart=%s' \ + "${SLURM_ARRAY_TASK_ID-unset}" "${SLURM_JOB_ID-unset}" \ + "${SLURM_ARRAY_JOB_ID-unset}" "${SLURMD_NODENAME-unset}" \ + "${SLURM_RESTART_COUNT-0}" +} + +die() { + local code="$1"; shift + printf 'WA345_ABORT code=%s reason=%s %s\n' "${code}" "$*" "$(wa345_context)" >&2 + exit "${code}" +} + +on_err() { + local code="$1" line="$2" cmd="$3" + printf 'WA345_ABORT code=%s reason=unlabelled_failure line=%s command=%s %s\n' \ + "${code}" "${line}" "${cmd}" "$(wa345_context)" >&2 + exit "${code}" +} +trap 'on_err "$?" "${LINENO}" "${BASH_COMMAND}"' ERR + +need() { + # Present-and-non-empty check for a required Slurm variable. Deliberately + # replaces ${VAR:?}, whose expansion failure exits before the ERR trap runs. + local name="$1" + local value="${!name-}" + [ -n "${value}" ] || die 71 "required_variable_unset:${name}" + printf '%s' "${value}" +} + +PROJECT_ROOT=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc +PRETRAINING_ROOT=${PROJECT_ROOT}/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation +CONTINUATION_ROOT=${PROJECT_ROOT}/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation +OUTPUT_ROOT=${PROJECT_ROOT}/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production +SEMANTIC_ARRAY_ID=md20x6-a1111-wa345-20260817-r1 +PYTHON=/work/ratul1/supantha/miniconda3/bin/python3.10 +SHIM=${PRETRAINING_ROOT}/run_a5_wa345_shim_20260817_r1.py +MANIFEST=${PRETRAINING_ROOT}/a5_wa345_manifest_20260817_r1.json +CONTINUATION_MANIFEST=${CONTINUATION_ROOT}/a5_wa345_continuation_manifest_20260819_r1.json +PINNED_RUNNER=${PROJECT_ROOT}/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py + +# The array this continuation resumes. Recorded, not trusted: it is what the +# claim files are expected to carry BEFORE the repair, and it is what this job +# must not be running as. +CONTINUED_FROM_ARRAY_JOB_ID=12038727 + +# H200 NVL. Enforced below against the node the allocation landed on, so a +# relaxed --nodelist alone cannot silently split a trajectory: relaxing the pin +# means changing BOTH the #SBATCH --nodelist above and this literal. +CONTINUATION_ARCHITECTURE_PIN=h200 + +SHIM_SHA256=5159414381025cf3e2d5e742422c84c292481168af42801c773df4ba12797fb4 +MANIFEST_SHA256=eeebc9c7e2cfc701f3ad47e62696ae2247c8caec93d8b034d5f573b701eab2a1 +PINNED_RUNNER_SHA256=dd74253863f39150af4ddc7e8d48c0a366e1f327c30aa50e0748078330b97b85 +CONTINUATION_MANIFEST_SHA256=30b64143eb15688fa1e1c8aeaf3b84eb08a2a65730fa1c996c9ef6f12679d80f + +# This script's OWN integrity reference. Same cycle-breaking scheme as the +# pretraining sbatch, with one more line blanked because there is one more +# self-referential value: the continuation manifest carries this digest, so +# this digest cannot cover the line that carries the manifest's digest. +# MANIFEST_SHA256= is NOT blanked -- the WA345 manifest is frozen for the life +# of these cells, so its digest is an external constant here and stays covered. +# Recompute with: +# +# sed -e 's/^CONTINUATION_MANIFEST_SHA256=.*$/CONTINUATION_MANIFEST_SHA256=/' \ +# -e 's/^SBATCH_INTEGRITY_SHA256=.*$/SBATCH_INTEGRITY_SHA256=/' \ +# submit_a5_wa345_continuation_20260819_r1.sbatch | sha256sum +SBATCH_INTEGRITY_SHA256=eb6811f37c17b7902b4b4a8a82e8abe25507cf4d8f4983d863eed8870df62b4c + +# -------------------------------------------------------------------------- +# Self-integrity, FIRST. If this file is not the file that was reviewed then +# nothing else it asserts is worth reading -- including which cell it is about +# to resume. Needs only $0, so it runs before the restart guard and before any +# /work path is touched, which is also what makes it reproducible off-cluster. +# -------------------------------------------------------------------------- + +digest_of() { + local path="$1" out="" + out=$(sha256sum "${path}" 2>/dev/null) || die 72 "sha256sum_failed:${path}" + [ -n "${out}" ] || die 72 "sha256sum_empty:${path}" + printf '%s' "${out%% *}" +} + +normalized_digest_of_self() { + local out="" + out=$(sed -e 's/^CONTINUATION_MANIFEST_SHA256=.*$/CONTINUATION_MANIFEST_SHA256=/' \ + -e 's/^SBATCH_INTEGRITY_SHA256=.*$/SBATCH_INTEGRITY_SHA256=/' \ + "$0" 2>/dev/null | sha256sum 2>/dev/null) \ + || die 72 "sbatch_self_digest_failed" + [ -n "${out}" ] || die 72 "sbatch_self_digest_empty" + printf '%s' "${out%% *}" +} + +ACTUAL=$(normalized_digest_of_self) +[ "${ACTUAL}" = "${SBATCH_INTEGRITY_SHA256}" ] || die 88 "sbatch_self_hash_mismatch:${ACTUAL}" + +# -------------------------------------------------------------------------- +# Restart guard. Matches the pinned runner's `int(restart_text) <= 2`. +# Defaulted with :-0 because SLURM_RESTART_COUNT is absent on a first attempt. +# +# Runs before any file is opened: a cell that has exhausted its restart budget +# aborts with a diagnosable code=66 instead of dying later on some unrelated +# check, and the guard stays reproducible off the cluster. +# -------------------------------------------------------------------------- + +RESTART_COUNT="${SLURM_RESTART_COUNT:-0}" +case "${RESTART_COUNT}" in + 0|1|2) ;; + *) die 66 "restart_count_above_runner_ceiling:${RESTART_COUNT}" ;; +esac + +# -------------------------------------------------------------------------- +# Array shape. A CONTINUATION may legitimately be a subset: an arm that +# reached patience_exhausted before the timeout carries a final receipt and is +# dropped. So the rule is membership, not a fixed triple. +# -------------------------------------------------------------------------- + +TASK_ID=$(need SLURM_ARRAY_TASK_ID) +ARRAY_MIN=$(need SLURM_ARRAY_TASK_MIN) +ARRAY_MAX=$(need SLURM_ARRAY_TASK_MAX) +ARRAY_COUNT=$(need SLURM_ARRAY_TASK_COUNT) + +case "${ARRAY_MIN}" in 0|1|2) ;; *) die 75 "array_min_outside_0_2:${ARRAY_MIN}" ;; esac +case "${ARRAY_MAX}" in 0|1|2) ;; *) die 75 "array_max_outside_0_2:${ARRAY_MAX}" ;; esac +case "${ARRAY_COUNT}" in 1|2|3) ;; *) die 75 "array_count_outside_1_3:${ARRAY_COUNT}" ;; esac +[ "${ARRAY_MIN}" -le "${ARRAY_MAX}" ] || die 75 "array_min_above_max:${ARRAY_MIN}:${ARRAY_MAX}" + +case "${TASK_ID}" in + 0) ARM=wa3 ; SEED=42 ; POLICY=WA3_FINAL_MS_MD_HEAVY ;; + 1) ARM=wa4 ; SEED=42 ; POLICY=WA4_FINAL_AUXILIARY_HEAVY ;; + 2) ARM=wa5 ; SEED=42 ; POLICY=WA5_FINAL_STRUCTURE_MINIMAL ;; + *) die 64 "array_task_out_of_range:${TASK_ID}" ;; +esac + +ARRAY_JOB_ID=$(need SLURM_ARRAY_JOB_ID) +case "${ARRAY_JOB_ID}" in + ''|*[!0-9]*) die 75 "array_job_id_not_numeric:${ARRAY_JOB_ID}" ;; +esac +[ "${ARRAY_JOB_ID}" != "${CONTINUED_FROM_ARRAY_JOB_ID}" ] \ + || die 75 "array_job_id_equals_continued_from:${ARRAY_JOB_ID}" + +# -------------------------------------------------------------------------- +# Source identity. The shim and the WA345 manifest are the 2026-08-17 files, +# reused byte-for-byte; the continuation manifest is this package's own. +# -------------------------------------------------------------------------- + +for path in "${SHIM}" "${MANIFEST}" "${CONTINUATION_MANIFEST}" "${PINNED_RUNNER}"; do + [ -f "${path}" ] || die 73 "source_missing:${path}" + [ ! -L "${path}" ] || die 73 "source_is_symlink:${path}" +done + +ACTUAL=$(digest_of "${SHIM}") +[ "${ACTUAL}" = "${SHIM_SHA256}" ] || die 74 "shim_hash_mismatch:${ACTUAL}" +ACTUAL=$(digest_of "${MANIFEST}") +[ "${ACTUAL}" = "${MANIFEST_SHA256}" ] || die 74 "manifest_hash_mismatch:${ACTUAL}" +ACTUAL=$(digest_of "${CONTINUATION_MANIFEST}") +[ "${ACTUAL}" = "${CONTINUATION_MANIFEST_SHA256}" ] \ + || die 74 "continuation_manifest_hash_mismatch:${ACTUAL}" +ACTUAL=$(digest_of "${PINNED_RUNNER}") +[ "${ACTUAL}" = "${PINNED_RUNNER_SHA256}" ] || die 74 "pinned_runner_hash_mismatch:${ACTUAL}" + +# -------------------------------------------------------------------------- +# Placement and route. Every failure path is labelled. +# -------------------------------------------------------------------------- + +NTASKS=$(need SLURM_NTASKS) +[ "${NTASKS}" = "1" ] || die 76 "ntasks_is_not_1:${NTASKS}" +NNODES=$(need SLURM_NNODES) +[ "${NNODES}" = "1" ] || die 76 "nnodes_is_not_1:${NNODES}" +CPUS=$(need SLURM_CPUS_PER_TASK) +[ "${CPUS}" = "4" ] || die 76 "cpus_per_task_is_not_4:${CPUS}" +GPUS=$(need SLURM_GPUS_ON_NODE) +[ "${GPUS}" = "1" ] || die 76 "gpus_on_node_is_not_1:${GPUS}" + +PARTITION=$(need SLURM_JOB_PARTITION) +ACCOUNT=$(need SLURM_JOB_ACCOUNT) +QOS=$(need SLURM_JOB_QOS) +ROUTE="${PARTITION}:${ACCOUNT}:${QOS}" +[ "${ROUTE}" = "scavenger:ratul-scavenger:scavenger" ] || die 77 "route_not_authorized:${ROUTE}" + +# The pin is by node list. Refuse a job that arrived with a feature +# constraint, exactly as the pretraining launch did. +[ -z "${SLURM_JOB_CONSTRAINTS:-}" ] || die 78 "constraint_requested:${SLURM_JOB_CONSTRAINTS}" + +NODE=$(need SLURMD_NODENAME) +case "${NODE}" in + nova21-gpu-8|nova21-gpu-12) ARCH_EXPECTED=a100 ;; + nova22-gpu-1|nova22-gpu-2|nova22-gpu-3|nova22-gpu-4|nova22-gpu-5) ARCH_EXPECTED=a100 ;; + nova25-gpu-2|nova25-gpu-3|nova25-gpu-4) ARCH_EXPECTED=h200 ;; + *) die 65 "node_outside_route:${NODE}" ;; +esac + +# Architecture consistency WITHIN a cell. The node table above still knows the +# whole route, so relaxing the pin is a one-literal change here plus the +# --nodelist directive -- but until both change, an A100 allocation aborts. +[ "${ARCH_EXPECTED}" = "${CONTINUATION_ARCHITECTURE_PIN}" ] \ + || die 93 "architecture_pin_violated:pin=${CONTINUATION_ARCHITECTURE_PIN}:got=${ARCH_EXPECTED}:node=${NODE}" + +VISIBLE=$(need CUDA_VISIBLE_DEVICES) +case "${VISIBLE}" in + *,*) die 79 "multiple_visible_devices:${VISIBLE}" ;; +esac + +# -------------------------------------------------------------------------- +# Cell naming, BOUND to the shim rather than asserted alongside it. +# +# Identical to the pretraining launch, and that identity is the point: a +# continuation that computed a different cell root would create a NEW root and +# silently restart from epoch 0. OUTPUT_ROOT and SEMANTIC_ARRAY_ID above are +# the 2026-08-17 values, the shim emits the authoritative binding from the +# manifest it has just verified, and any drift aborts with code 89. +# -------------------------------------------------------------------------- + +CELL_BINDING=$("${PYTHON}" -I -B -W error "${SHIM}" \ + --manifest "${MANIFEST}" \ + --manifest-sha256 "${MANIFEST_SHA256}" \ + --emit-cell-binding \ + --array-task-id "${TASK_ID}") || die 89 "cell_binding_emit_failed" + +binding_field() { + local key="$1" out="" + out=$(printf '%s' "${CELL_BINDING}" | "${PYTHON}" -I -B -c \ + 'import json,sys; print(json.load(sys.stdin)[sys.argv[1]])' "${key}" 2>/dev/null) \ + || die 89 "cell_binding_field_unreadable:${key}" + printf '%s' "${out}" +} + +BOUND_OUTPUT_ROOT=$(binding_field output_root) +BOUND_SEMANTIC_ARRAY_ID=$(binding_field semantic_array_id) +BOUND_ARM=$(binding_field arm_label) +BOUND_POLICY=$(binding_field loss_policy) +BOUND_SEED=$(binding_field pretraining_seed) +BOUND_CELL_ROOT=$(binding_field cell_root) + +[ "${BOUND_OUTPUT_ROOT}" = "${OUTPUT_ROOT}" ] \ + || die 89 "output_root_drifted_from_shim:${BOUND_OUTPUT_ROOT}" +[ "${BOUND_SEMANTIC_ARRAY_ID}" = "${SEMANTIC_ARRAY_ID}" ] \ + || die 89 "semantic_array_id_drifted_from_shim:${BOUND_SEMANTIC_ARRAY_ID}" +[ "${BOUND_ARM}" = "${ARM}" ] || die 89 "arm_drifted_from_shim:${BOUND_ARM}" +[ "${BOUND_POLICY}" = "${POLICY}" ] || die 89 "policy_drifted_from_shim:${BOUND_POLICY}" +[ "${BOUND_SEED}" = "${SEED}" ] || die 89 "seed_drifted_from_shim:${BOUND_SEED}" + +CELL_ROOT=${OUTPUT_ROOT}/review_md20x6_${SEMANTIC_ARRAY_ID}_A1111_${ARM}_seed${SEED} +[ "${BOUND_CELL_ROOT}" = "${CELL_ROOT}" ] \ + || die 89 "cell_root_drifted_from_shim:${BOUND_CELL_ROOT}" + +CLAIM=${CELL_ROOT}/review_md20x6_wa2_run_claim.json +RECEIPT=${CELL_ROOT}/review_md20x6_wa2_final_receipt.json +CHECKPOINT_INDEX=${CELL_ROOT}/review_checkpoints/review_md20x6_checkpoint_index.json + +# -------------------------------------------------------------------------- +# CONTINUATION PREFLIGHT. This is the block that distinguishes this file from +# the pretraining sbatch, and every one of its checks would otherwise surface +# as a late, obscure failure inside the runner. +# +# 1. The cell root must ALREADY EXIST. A continuation that finds no cell would +# create one and train from epoch 0 under a continuation walltime -- a +# silent restart wearing a resume's name. Refused. +# 2. Resumable state must exist: the checkpoint index file. Payload +# verification is the shim's tolerant read path (it rewinds to the newest +# index-recorded role whose payload verifies); this checks only that there +# is an index to read. +# 3. The cell must not already be finished. +# 4. The claim must already name THIS array. If it still names 12038727 the +# repair has not been run, and claim_cell would abort after torch is loaded. +# -------------------------------------------------------------------------- + +[ -e "${CELL_ROOT}" ] || die 90 "continuation_requires_existing_cell:${CELL_ROOT}" +[ -d "${CELL_ROOT}" ] || die 80 "cell_root_is_not_a_directory:${CELL_ROOT}" +[ ! -L "${CELL_ROOT}" ] || die 80 "cell_root_is_a_symlink:${CELL_ROOT}" +[ -f "${CLAIM}" ] || die 80 "cell_root_exists_without_claim:${CELL_ROOT}" +[ ! -L "${CLAIM}" ] || die 80 "claim_is_a_symlink:${CLAIM}" + +[ ! -e "${RECEIPT}" ] || die 81 "cell_already_complete:${RECEIPT}" +[ ! -L "${RECEIPT}" ] || die 81 "receipt_is_a_symlink:${RECEIPT}" + +[ -f "${CHECKPOINT_INDEX}" ] || die 91 "no_resumable_checkpoint_index:${CHECKPOINT_INDEX}" +[ ! -L "${CHECKPOINT_INDEX}" ] || die 91 "checkpoint_index_is_a_symlink:${CHECKPOINT_INDEX}" + +CLAIMED_ARRAY=$("${PYTHON}" -I -B -c \ + 'import json,sys; print(json.load(open(sys.argv[1], encoding="ascii"))["first_array_job_id"])' \ + "${CLAIM}" 2>/dev/null) || die 92 "claim_unreadable:${CLAIM}" +[ -n "${CLAIMED_ARRAY}" ] || die 92 "claim_first_array_job_id_empty:${CLAIM}" +[ "${CLAIMED_ARRAY}" = "${ARRAY_JOB_ID}" ] \ + || die 92 "claim_points_at_other_array:claim=${CLAIMED_ARRAY}:this=${ARRAY_JOB_ID}:run_repair_tool_first" + +RESUME_EPOCH=$("${PYTHON}" -I -B -c \ + 'import json,sys; print(json.load(open(sys.argv[1], encoding="ascii"))["roles"]["latest"]["epoch"])' \ + "${CHECKPOINT_INDEX}" 2>/dev/null) || RESUME_EPOCH=unreadable + +# Refuse to write into the completed WA1/WA2 family's tree. +case "${CELL_ROOT}" in + *review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1*) + die 82 "cell_root_inside_completed_wa1_wa2_tree:${CELL_ROOT}" ;; +esac +case "${ARM}" in + wa1|wa2) die 83 "arm_label_collides_with_completed_family:${ARM}" ;; +esac + +# -------------------------------------------------------------------------- +# Environment. Identical to the executed WA1/WA2 launcher and to the +# pretraining launch. +# -------------------------------------------------------------------------- + +export PYTHONNOUSERSITE=1 PYTHONHASHSEED=0 PYTHONDONTWRITEBYTECODE=1 +export PYTHONUNBUFFERED=1 CUDA_DEVICE_ORDER=PCI_BUS_ID +export CUBLAS_WORKSPACE_CONFIG=:4096:8 OMP_NUM_THREADS=4 MKL_NUM_THREADS=4 + +"${PYTHON}" -I -B -W error "${SHIM}" \ + --manifest "${MANIFEST}" \ + --manifest-sha256 "${MANIFEST_SHA256}" \ + --self-check \ + || die 84 "shim_self_check_failed" + +GPU_MEMORY_MIB=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits 2>/dev/null | head -n 1 | tr -d ' ') \ + || die 85 "nvidia_smi_memory_query_failed" +[ -n "${GPU_MEMORY_MIB}" ] || die 85 "nvidia_smi_memory_query_empty" +case "${GPU_MEMORY_MIB}" in + ''|*[!0-9]*) die 85 "nvidia_smi_memory_not_numeric:${GPU_MEMORY_MIB}" ;; +esac +[ "${GPU_MEMORY_MIB}" -ge 80000 ] || die 86 "gpu_memory_below_minimum:${GPU_MEMORY_MIB}" + +# -------------------------------------------------------------------------- +# Disclosure. One labelled line per attempt; --open-mode=append means a +# requeued attempt adds its own line rather than overwriting the previous one. +# The continuation line additionally records what this job is resuming FROM, so +# the log alone answers "did it resume or restart?". +# -------------------------------------------------------------------------- + +SCRIPT_DIGEST=$(digest_of "$0") +GPU_IDENTITY=$(nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv,noheader 2>/dev/null | head -n 1) \ + || die 87 "nvidia_smi_identity_query_failed" +[ -n "${GPU_IDENTITY}" ] || die 87 "nvidia_smi_identity_query_empty" + +printf 'wa345_attempt_architecture arch=%s node=%s gpu=%s restart=%s task=%s arm=%s policy=%s seed=%s\n' \ + "${ARCH_EXPECTED}" "${NODE}" "${GPU_IDENTITY}" "${RESTART_COUNT}" \ + "${TASK_ID}" "${ARM}" "${POLICY}" "${SEED}" >&2 +printf 'wa345_continuation_resume continued_from_array=%s this_array=%s claim_first_array_job_id=%s resume_from_epoch=%s cell_root=%s\n' \ + "${CONTINUED_FROM_ARRAY_JOB_ID}" "${ARRAY_JOB_ID}" "${CLAIMED_ARRAY}" \ + "${RESUME_EPOCH}" "${CELL_ROOT}" >&2 +printf 'wa345_attempt_identity slurm_script_sha256=%s slurm_script_normalized_sha256=%s shim_sha256=%s manifest_sha256=%s continuation_manifest_sha256=%s cell_root=%s\n' \ + "${SCRIPT_DIGEST}" "${SBATCH_INTEGRITY_SHA256}" "${SHIM_SHA256}" "${MANIFEST_SHA256}" \ + "${CONTINUATION_MANIFEST_SHA256}" "${CELL_ROOT}" + +exec "${PYTHON}" -I -B -W error "${SHIM}" \ + --manifest "${MANIFEST}" \ + --manifest-sha256 "${MANIFEST_SHA256}" \ + --array-task-id "${TASK_ID}" diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/a5_wa345_manifest_20260817_r1.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/a5_wa345_manifest_20260817_r1.json new file mode 100644 index 0000000000000000000000000000000000000000..9fbc704ca067dc0c0d89d648ce33dc853c453e48 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/a5_wa345_manifest_20260817_r1.json @@ -0,0 +1 @@ +{"architecture_disclosure":{"constraint_requested":null,"measured_hours_per_epoch":{"a100_80gb":1.0572,"h200_nvl":0.4798},"pinned":false,"route_architectures":["a100","h200"]},"arm_label_by_policy":{"WA3_FINAL_MS_MD_HEAVY":"wa3","WA4_FINAL_AUXILIARY_HEAVY":"wa4","WA5_FINAL_STRUCTURE_MINIMAL":"wa5"},"attribution_claim":"fixed_sequence_heavy_loss_sensitivity_on_final_md_inclusive_a1111","base_cell_id":"A111","base_launch":{"bytes":4245,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_end_to_end_20260802_r3_native_intersection/review_md_temporal_20x6_a1111_recovery_20260806_r1/review_md_temporal_20x6_a1111_launch_config_20260806_r1.json","sha256":"2a89d6b54668d4db8f1b9fe857f744d31116eb6d28b2695b31461161c1aea2b9"},"boundaries":{"coefficient_search":false,"downstream_guided_selection":false,"heldout_access":false,"hpo":false,"official_submitted_artifacts_modified":false,"test_access":false},"cell_id":"A1111","checkpoint_resume_tolerance":{"commit_is_atomic_across_files":false,"index_written_last":true,"latest_filename_is_fixed":true,"milestone_epochs":[25,50,75,100],"r3_runner_sha256":"1e446e7e89a39ef01132b9f2a4deb817161f7b376a0fa04c2b11529004f53e8a","rewind_to_newest_self_consistent_role":true,"shim_overrides_load_latest_only":true,"tear_event":"wa345_checkpoint_tear_recovered"},"coefficient_shares_percent":{"WA3_FINAL_MS_MD_HEAVY":{"md":40,"ms":40,"sequence":10,"static":5,"topology":5},"WA4_FINAL_AUXILIARY_HEAVY":{"md":30,"ms":30,"sequence":5,"static":30,"topology":5},"WA5_FINAL_STRUCTURE_MINIMAL":{"md":30,"ms":35,"sequence":15,"static":5,"topology":15}},"coefficients_by_policy":{"WA3_FINAL_MS_MD_HEAVY":{"md":2.0,"ms":2.0,"sequence":0.5,"static":0.25,"topology":0.25},"WA4_FINAL_AUXILIARY_HEAVY":{"md":1.5,"ms":1.5,"sequence":0.25,"static":1.5,"topology":0.25},"WA5_FINAL_STRUCTURE_MINIMAL":{"md":1.5,"ms":1.75,"sequence":0.75,"static":0.25,"topology":0.75}},"downstream_seed":241271852,"effective_ratios":{"WA3_FINAL_MS_MD_HEAVY":{"md":17.858069850628222,"ms":6.609901899144736,"sequence":1.0,"static":0.7244238139404651,"topology":1.1865212821860218},"WA4_FINAL_AUXILIARY_HEAVY":{"md":26.787104775942332,"ms":9.914852848717103,"sequence":1.0,"static":8.69308576728558,"topology":2.3730425643720436},"WA5_FINAL_STRUCTURE_MINIMAL":{"md":8.929034925314113,"ms":3.8557761078344295,"sequence":1.0,"static":0.48294920929364343,"topology":2.373042564372044}},"evaluation_populations":["all_parent_primary","md_present_secondary"],"launch_script_integrity":{"bytes":19132,"normalization":"sha256 of the sbatch with the values of the MANIFEST_SHA256= and SBATCH_INTEGRITY_SHA256= lines removed","path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/submit_a5_wa345_20260817_r1.sbatch","sha256_normalized":"d9e8416790949305feb296273a0dc186e7cf7822a4f01c1bbee3ac0587e81474"},"loss_denominator":5,"loss_policies":["WA3_FINAL_MS_MD_HEAVY","WA4_FINAL_AUXILIARY_HEAVY","WA5_FINAL_STRUCTURE_MINIMAL"],"manifest_identity_sha256":"d5edae408669f7d804f5edf135d5137b9c4b38e623df01abe421ff5e03df8953","maximum_epochs":100,"normalized_coefficient_shares_by_policy":{"WA3_FINAL_MS_MD_HEAVY":{"md":0.4,"ms":0.4,"sequence":0.1,"static":0.05,"topology":0.05},"WA4_FINAL_AUXILIARY_HEAVY":{"md":0.3,"ms":0.3,"sequence":0.05,"static":0.3,"topology":0.05},"WA5_FINAL_STRUCTURE_MINIMAL":{"md":0.3,"ms":0.35,"sequence":0.15,"static":0.05,"topology":0.15}},"null_scales":{"md":1.11266,"ms":3.00609,"sequence":4.96749,"static":3.42858,"topology":2.0933},"output_root":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production","patience":15,"project_root":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc","reserved_arm_labels":["wa1","wa2"],"restart_exhaustion_recovery":{"automated_claim_rewrite":false,"cells_preempted_once":2,"cells_preempted_twice":0,"claim_basename":"review_md20x6_wa2_run_claim.json","claim_domain":"bertose_review_md_temporal_20x6_a1111_wa2_claim_20260811_r1","executed_cells_observed":6,"maximum_restart_count":2,"stranding_field":"first_array_job_id"},"resume_policy":{"create_or_resume_runner":true,"cross_architecture_resume_permitted":true,"maximum_restart_count":2,"requeue":true,"restart_guard_matches_runner":true},"route":{"constraint":null,"cpus_per_task":4,"excluded_node_list":"nova18-gpu-[1-5],nova18-singularity,nova20-frost-1,nova20-matrix,nova21-gpu-10,nova26-gpu-1","gres":"gpu:1","memory":"64G","minimum_gpu_memory_mib":80000,"requested_node_list":"nova25-gpu-[2-4]","requeue":true,"submission_routes":{"scavenger":{"account":"ratul-scavenger","array_tasks":[0,1,2],"partition":"scavenger","qos":"scavenger"}},"time_limit":"13:00:00"},"schema":"bertose_a5_wa345_pretraining_manifest_20260817_r1","seed42_adapter_anchor":{"native_adapter_contract_sha256":"ad9d49ba49f69d17e8f462930179af4832f741edf6447b880944eef0988423bd","observed_in":["review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa1_seed42","review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa2_seed42"],"pretraining_seed":42},"selection_rule":"strict_lower_earliest_tie","semantic_array_id":"md20x6-a1111-wa345-20260817-r1","source_bindings":{"core":{"bytes":48643,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/review_md_temporal_20x6_core_r3.py","sha256":"3e96d8092239c2c21f217ad5bae4ee7e07dbe0f7630b213bad468d6b08d3b1c1"},"executed_wa_sbatch":{"bytes":4828,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/node_widening_20260815_r1_preparation/submit_md20x6_a1111_wa2_node_widening_20260815_r2.sbatch","sha256":"d5f772fa8fc876d328eee4e56517965544601492ee52ca8cca1734add849796f"},"owner_decision":{"bytes":184265,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/review_a5_reviewer_minimum_paired3_statistical_amendment_20260815_r2_wa3.md","sha256":"2c7fdb2f522b52fd0692fac9fce8ef5b0a202d1b418b1b9f3570ad7ea9944b83"},"r3_runner":{"bytes":50267,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/run_review_md_temporal_20x6_training_r3.py","sha256":"1e446e7e89a39ef01132b9f2a4deb817161f7b376a0fa04c2b11529004f53e8a"},"r4_runner":{"bytes":5454,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260805_r4_dev_memory/run_review_md_temporal_20x6_training_r4.py","sha256":"a6a180ae103eaaf68458b298cd4180920a0e88c1724a6ba9a94ef94559e75c5f"},"r5_planner":{"bytes":16021,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_balanced_planner_r5.py","sha256":"1b9b05c812603db7b216aa989214a3c3715f80032b3a8b82577ae2b9e48f048d"},"wa2_runner":{"bytes":39694,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py","sha256":"dd74253863f39150af4ddc7e8d48c0a366e1f327c30aa50e0748078330b97b85"},"wa345_shim":{"bytes":53542,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/run_a5_wa345_shim_20260817_r1.py","sha256":"5159414381025cf3e2d5e742422c84c292481168af42801c773df4ba12797fb4"}},"status":"PREPARED_NOT_SUBMITTED","submission_plan":{"array_spec":"0-2","duplicate_and_output_absence_preflight_required":true,"full_array_submission_allowed":true,"launch_authorized":false,"maximum_array_submissions":1,"permitted_sbatch_options":["--array","--parsable","--test-only"],"sbatch_test_only_required":true,"sync_authorized":false},"task_to_arm_seed":{"0":{"loss_policy":"WA3_FINAL_MS_MD_HEAVY","pretraining_seed":42},"1":{"loss_policy":"WA4_FINAL_AUXILIARY_HEAVY","pretraining_seed":42},"2":{"loss_policy":"WA5_FINAL_STRUCTURE_MINIMAL","pretraining_seed":42}},"upstream_seed":42,"walltime_basis":{"a100_hours_per_epoch":1.0572,"best_epochs":[23,27,29,31,32],"completed_epochs":[38,42,44,46,47],"excluded_wa1_seed43_recovery_cell":{"best_epoch":34,"completed_epochs":49,"identified_by":"coefficient_vector_all_ones","loss_policy_recorded":false},"h200_hours_per_epoch":0.4798,"sized_from_architecture":"a100_80gb","verified_cells":5},"withdrawn":{"wa0_submitted_configuration":true,"wa_r_reproduction_arm":true}} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/run_a5_wa345_shim_20260817_r1.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/run_a5_wa345_shim_20260817_r1.py new file mode 100644 index 0000000000000000000000000000000000000000..934326c4d8f76657c0b975030723cfee812d23a3 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/run_a5_wa345_shim_20260817_r1.py @@ -0,0 +1,1194 @@ +#!/usr/bin/env python3 +"""WA3/WA4/WA5 loss-weighting arms: in-process shim over the SHA-pinned WA2 runner. + +The executed WA1/WA2 runner is imported unmodified under a SHA-256 pin and +retargeted by attribute assignment. Nothing in the pinned file is edited, +copied or re-implemented: the training loop, the seed parameterization, the +adapter contract, the checkpoint store and the receipt schemas are exactly the +ones that produced the six completed WA1/WA2 cells. + +Four attributes are replaced: + + SUBMISSION_ROUTES five array tasks -> three array tasks + TASK_TO_ARM_SEED {0: WA3/42, 1: WA4/42, 2: WA5/42} + COEFFICIENTS_BY_POLICY the three new weight vectors + load_manifest the two-policy manifest contract -> three-policy + WA2Launch subclassed solely to repair the arm-label defect + +THE ARM-LABEL DEFECT. Line 729 of the pinned runner reads + + arm_label = "wa1" if loss_policy == WA1_POLICY else "wa2" + +and line 730-732 spends it, and nothing else, on the cell directory name: + + cell_root = config.output_root / ( + f"review_md20x6_{config.semantic_array_id}_{CELL_ID}_{arm_label}_seed{seed}" + ) + +For any policy that is not WA1 the expression yields "wa2". All three new arms +would therefore be written to one directory named "..._wa2_seed42", silently +mislabelled and mutually colliding. The two string literals live inside a +function body, so no attribute assignment can reach them. + +`config.output_root` occurs exactly once in the pinned source (verified at load +time), so the single consumer of the mislabelled name is a single `/` operator. +The repair replaces `output_root` with an object whose only public behaviour is +`__truediv__`: it requires the name it is handed to be character-for-character +the mislabelled name predicted for the active task, and returns the correctly +labelled path. If the pinned runner ever hands it anything else the run aborts +fail-closed. The object deliberately implements nothing else -- no +`__fspath__`, no attribute delegation -- so any second consumer of +`output_root` raises rather than silently receiving an unrepaired root. + +RESUME. Resume is enabled and must work. `--requeue` is set explicitly in the +sbatch, and the restart guard admits SLURM_RESTART_COUNT <= 2, which is the +pinned runner's own rule at line 618 (`int(restart_text) <= 2`). The claim +path at lines 596-604 is create-or-resume, not create-once: + + try: root.mkdir(parents=True, exist_ok=False) + except FileExistsError: require(root.is_dir() and not root.is_symlink() + and claim.is_file(), ...) + +Two of the six executed WA cells were preempted, once each, and completed only +because this worked (11994675_0 and 12020657_4; attempt records _r0.json and +_r1.json exist on disk for both). No cell has been preempted twice. Any claim +that this runner dies on FileExistsError is false and is not repeated here. + +THE TORN-CHECKPOINT DEFECT, AND WHY THE REPAIR IS TOLERANCE RATHER THAN +ATOMICITY. `r3.CheckpointStore.commit` (r3 runner lines 472-499) replaces the +payload files BEFORE it replaces the index, and each replacement is separately +atomic but the pair is not: + + 472 def commit(self, checkpoint, *, improved, epoch, dev_loss) -> str: + 473 payload = torch_bytes(checkpoint) + 474 digest = hashlib.sha256(payload).hexdigest() + 475 latest_name = "review_md20x6_checkpoint_latest.pt" + 476 atomic_bytes(self.root / latest_name, payload) # <- payload first + 477 previous = self._index() + ... + 483 atomic_bytes(self.root / best_name, payload) # <- if improved + 488 atomic_bytes(self.root / name, payload) # <- if milestone + 498 atomic_bytes(self.index_path, ...) # <- index LAST + +`atomic_bytes` is write-to-tempfile + fsync + os.replace + fsync(dir), so each +individual file is all-or-nothing. The pair is not: a preemption anywhere in +lines 476-498 leaves an index describing generation G while +`review_md20x6_checkpoint_latest.pt` already holds generation G+1. + +On resume `load_latest` (lines 463-470) reads `roles["latest"]`, reads that +file, and requires the digest to match the index entry. In the torn state it +cannot: the runner dies with "latest checkpoint hash changed" on EVERY +subsequent attempt, burning the restart budget on a guaranteed failure. This +is not hypothetical breakage of a rare path -- it is the only resume path. + +Two renames cannot be made atomic on NFS, so no repair is attempted there. +What matters instead is that `latest_name` is a FIXED filename, so the torn +write DESTROYS the previous `latest` payload. Recovery therefore cannot rewind +to an older `latest`; it must rewind to a different ROLE: + + * `best` survives iff the torn commit did not improve (line 483 skipped). + * milestones are written under epoch-unique names (line 487) and are never + overwritten, so any milestone the index already records still + matches its file. + +`TolerantCheckpointStore.load_latest` below therefore verifies `latest` first +and, only if it fails, falls back to the newest index-recorded role whose file +digest still verifies. Every fallback checkpoint is a complete resume state +(selection, development_history, adapter_cursor, model_state, optimizer_state, +rng_state) and carries `run_identity_sha256`, which the pinned runner re-checks +at line 757, so a rewind is identity-bound and re-runs the intervening epochs +under the same seeded plan rather than skipping them. The rewind is recorded +on stdout as a labelled `wa345_checkpoint_tear_recovered` event. + +If NO index-recorded role verifies, the shim refuses rather than guessing; the +README documents the reviewed manual recovery for that residual case. + +THE WA1 SEED-43 CELL IS KEYED ON ITS COEFFICIENT VECTOR, NOT ON A POLICY NAME. +That cell predates the policy-label convention: its final receipt carries no +`run_identity.loss_policy` at all, and its directory +(`..._md20x6-a1111-recovery-20260806-r1_A1111_seed43`) carries no arm infix. +It is nonetheless WA1 by definition, because its +`run_identity.coefficients == {sequence: 1, topology: 1, ms: 1, static: 1, +md: 1}`. Anything in this package that has to identify that cell keys on the +coefficient vector. It is fully identified, not unverifiable, and the sentence +"all six cells carry a loss policy" is false -- five do. + +WA5 IS NOT A ONE-VARIABLE MOVE. Coefficient mass is conserved at 5.0, so +demoting static from a 20% share to a 5% share hands the freed 15% to MD. Two +coefficients change: static:sequence divides by 4 and MD:sequence multiplies by +1.75. Every description of WA5 is a static-down/MD-up trade IN SHARE SPACE and +never "a structure effect". + +ARCHITECTURE. Not pinned, and disclosed rather than controlled. The pinned +runner already writes the per-attempt GPU identity into the attempt record +(lines 674-679: device.name, device.compute_capability, total_memory_bytes, +cuda_visible_devices), keyed by SLURM_RESTART_COUNT in the filename, so a +resume that crosses architectures is recorded as two attempt records with +different device names. 12020657_4 did exactly that: _r0.json carries +"NVIDIA H200 NVL" [9, 0] and _r1.json carries "NVIDIA A100 80GB PCIe" [8, 0]. +No new machinery is added; a cross-architecture resume is permitted. +""" + +from __future__ import annotations + +import argparse +import hashlib +import importlib.util +import json +import math +import os +from pathlib import Path +import re +import stat +import sys +from types import MappingProxyType +from typing import Any, Mapping, Optional, Sequence + + +# -------------------------------------------------------------------------- +# Frozen declarations. Kept as plain literals so the local self-check can read +# them with ast.literal_eval without importing torch or this module. +# -------------------------------------------------------------------------- + +SCHEMA = "bertose_a5_wa345_pretraining_shim_20260817_r1" +MANIFEST_SCHEMA = "bertose_a5_wa345_pretraining_manifest_20260817_r1" +MANIFEST_DOMAIN = "bertose-a5-wa345-pretraining-manifest-20260817-r1" +SELF_CHECK_SCHEMA = "bertose_a5_wa345_pretraining_self_check_20260817_r1" +CELL_BINDING_SCHEMA = "bertose_a5_wa345_pretraining_cell_binding_20260817_r1" + +# Local copy of the pinned runner's SHA_RE, so --emit-cell-binding can validate +# a digest argument without importing torch. +SHA256_RE = re.compile(r"[0-9a-f]{64}") + +CELL_ID = "A1111" +BASE_CELL_ID = "A111" +LOSS_DENOMINATOR = 5 +UPSTREAM_SEED = 42 +DOWNSTREAM_SEED = 241271852 +SEMANTIC_ARRAY_ID = "md20x6-a1111-wa345-20260817-r1" + +WA3_POLICY = "WA3_FINAL_MS_MD_HEAVY" +WA4_POLICY = "WA4_FINAL_AUXILIARY_HEAVY" +WA5_POLICY = "WA5_FINAL_STRUCTURE_MINIMAL" + +# Shares are round percentages by owner decision. coefficient = share/100 * 5. +COEFFICIENT_SHARES_PERCENT_LITERAL = { + "WA3_FINAL_MS_MD_HEAVY": {"sequence": 10, "topology": 5, "ms": 40, "static": 5, "md": 40}, + "WA4_FINAL_AUXILIARY_HEAVY": {"sequence": 5, "topology": 5, "ms": 30, "static": 30, "md": 30}, + "WA5_FINAL_STRUCTURE_MINIMAL": {"sequence": 15, "topology": 15, "ms": 35, "static": 5, "md": 30}, +} + +# Every coefficient is a DYADIC RATIONAL -- an integer over a power of two -- +# hence exactly representable in binary64, hence math.fsum(...) == 5.0 by exact +# equality with no rounding and no hand adjustment. +# +# Dyadic rational is the property that covers the WHOLE five-arm family and it +# is the word to use. "Multiple of 0.25" is true of WA3/WA4/WA5 but FALSE of +# WA2, whose 0.625 is a multiple of 0.125, not of 0.25. WA2 is not run by this +# package, but the family-level claim is made in the amendment and the README, +# so the narrower word must not be used there. verify_coefficient_algebra +# checks dyadicity directly rather than checking for quarters. +COEFFICIENTS_BY_POLICY_LITERAL = { + "WA3_FINAL_MS_MD_HEAVY": { + "sequence": 0.50, "topology": 0.25, "ms": 2.00, "static": 0.25, "md": 2.00, + }, + "WA4_FINAL_AUXILIARY_HEAVY": { + "sequence": 0.25, "topology": 0.25, "ms": 1.50, "static": 1.50, "md": 1.50, + }, + "WA5_FINAL_STRUCTURE_MINIMAL": { + "sequence": 0.75, "topology": 0.75, "ms": 1.75, "static": 0.25, "md": 1.50, + }, +} + +# The arm-label repair table. These are the labels the pinned runner cannot +# produce; "wa1" and "wa2" are reserved by the completed six-cell family. +ARM_LABEL_BY_POLICY_LITERAL = { + "WA3_FINAL_MS_MD_HEAVY": "wa3", + "WA4_FINAL_AUXILIARY_HEAVY": "wa4", + "WA5_FINAL_STRUCTURE_MINIMAL": "wa5", +} +RESERVED_ARM_LABELS_LITERAL = ["wa1", "wa2"] + +TASK_TO_ARM_SEED_LITERAL = { + 0: ["WA3_FINAL_MS_MD_HEAVY", 42], + 1: ["WA4_FINAL_AUXILIARY_HEAVY", 42], + 2: ["WA5_FINAL_STRUCTURE_MINIMAL", 42], +} +ARRAY_TASKS_LITERAL = [0, 1, 2] + +MAXIMUM_RESTART_COUNT = 2 + +# Null scales s_o, for reporting effective ratios only. Never applied here. +NULL_SCALES_LITERAL = { + "sequence": 4.96749, + "topology": 2.09330, + "ms": 3.00609, + "static": 3.42858, + "md": 1.11266, +} + +OBJECTIVE_ORDER = ["sequence", "topology", "ms", "static", "md"] + +# -------------------------------------------------------------------------- +# The SHA pin on the executed WA1/WA2 runner. +# -------------------------------------------------------------------------- + +PINNED_RUNNER_RELATIVE = ( + "writing/review/multimodal/runtime/" + "md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/" + "run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py" +) +PINNED_RUNNER_SHA256 = "dd74253863f39150af4ddc7e8d48c0a366e1f327c30aa50e0748078330b97b85" +PINNED_RUNNER_BYTES = 39694 +PINNED_RUNNER_MODULE_NAME = "_a5_wa345_pinned_wa1_wa2_runner" + +# Exact source fragments the repair depends on. If the pin is ever moved and +# these stop matching, the shim refuses to run rather than repairing a defect +# that is no longer there (or missing one that has moved). +PINNED_ARM_LABEL_TRAP = ( + ' arm_label = "wa1" if loss_policy == WA1_POLICY else "wa2"\n' +) +PINNED_CELL_ROOT_EXPRESSION = " cell_root = config.output_root / (\n" +PINNED_RESTART_GUARD = ( + ' require(restart_text.isdigit() and int(restart_text) <= 2, ' + '"WA2 restart count is unsafe")\n' +) +# The create-or-resume block, quoted in full. A bare "except FileExistsError:" +# would NOT be unique -- claim_cell has one too -- so the mkdir line is included +# to pin the resume path specifically. +PINNED_CREATE_OR_RESUME = ( + " try:\n" + " root.mkdir(parents=True, exist_ok=False)\n" + " except FileExistsError:\n" +) +PINNED_FILE_EXISTS_HANDLER_COUNT = 2 # claim_cell + create_or_resume_cell +PINNED_ATTEMPT_DEVICE_BLOCK = ' "device": {\n' + +# -------------------------------------------------------------------------- +# The r3 runner, which owns CheckpointStore. The WA2 runner reaches it as +# `r3 = r4.r3`, so it is a distinct file from the pinned WA1/WA2 runner and +# needs its own pin. The checkpoint-tear tolerance below is written against +# these exact lines; if any of them moves, the tolerance is withdrawn rather +# than applied to code it was not read against. +# -------------------------------------------------------------------------- + +PINNED_R3_RUNNER_RELATIVE = ( + "writing/review/multimodal/runtime/" + "md_temporal_20x6_end_to_end_20260802_r3_native_intersection/" + "run_review_md_temporal_20x6_training_r3.py" +) +PINNED_R3_RUNNER_SHA256 = "1e446e7e89a39ef01132b9f2a4deb817161f7b376a0fa04c2b11529004f53e8a" +PINNED_R3_RUNNER_BYTES = 50267 + +# commit() writes the payload first (line 476) and the index last (line 498). +PINNED_COMMIT_PAYLOAD_FIRST = " atomic_bytes(self.root / latest_name, payload)\n" +PINNED_COMMIT_INDEX_LAST = ( + " atomic_bytes(self.index_path, mdcore.canonical_bytes(value))\n" +) +# The digest check that fails, permanently, once the pair is torn (line 469). +PINNED_LOAD_LATEST_DIGEST_CHECK = ( + ' require(hashlib.sha256(payload).hexdigest() == entry["sha256"], ' + '"latest checkpoint hash changed")\n' +) +# The fixed filename is why the pre-tear `latest` payload cannot be recovered. +PINNED_LATEST_FIXED_NAME = ( + ' latest_name = "review_md20x6_checkpoint_latest.pt"\n' +) +# Milestones get epoch-unique names, which is why they survive a tear. +PINNED_MILESTONE_UNIQUE_NAME = ( + ' name = f"review_md20x6_checkpoint_milestone_{epoch:03d}.pt"\n' +) +PINNED_CHECKPOINT_FRAGMENTS = { + "commit_writes_payload_first": PINNED_COMMIT_PAYLOAD_FIRST, + "commit_writes_index_last": PINNED_COMMIT_INDEX_LAST, + "load_latest_digest_check": PINNED_LOAD_LATEST_DIGEST_CHECK, + "latest_has_a_fixed_name": PINNED_LATEST_FIXED_NAME, + "milestone_has_an_epoch_unique_name": PINNED_MILESTONE_UNIQUE_NAME, +} + +CHECKPOINT_TEAR_EVENT = "wa345_checkpoint_tear_recovered" + +PROJECT_ROOT = Path(__file__).absolute().parents[5] +HERE = Path(__file__).absolute().parent +DEFAULT_MANIFEST = HERE / "a5_wa345_manifest_20260817_r1.json" + +COEFFICIENT_SHARES_PERCENT = MappingProxyType( + {policy: MappingProxyType(dict(shares)) + for policy, shares in COEFFICIENT_SHARES_PERCENT_LITERAL.items()} +) +COEFFICIENTS_BY_POLICY = MappingProxyType( + {policy: MappingProxyType(dict(vector)) + for policy, vector in COEFFICIENTS_BY_POLICY_LITERAL.items()} +) +ARM_LABEL_BY_POLICY = MappingProxyType(dict(ARM_LABEL_BY_POLICY_LITERAL)) +TASK_TO_ARM_SEED = MappingProxyType( + {task: (policy, seed) for task, (policy, seed) in TASK_TO_ARM_SEED_LITERAL.items()} +) +LOSS_POLICIES = [WA3_POLICY, WA4_POLICY, WA5_POLICY] +SUBMISSION_ROUTES = MappingProxyType( + { + "scavenger": { + "partition": "scavenger", + "account": "ratul-scavenger", + "qos": "scavenger", + "array_tasks": list(ARRAY_TASKS_LITERAL), + } + } +) + + +class WA345Error(RuntimeError): + """Raised before the pinned runner is available to supply MDTrainingError.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise WA345Error(message) + + +def _sha256_file(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for block in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + +def canonical_bytes(value: object) -> bytes: + """Byte-for-byte the mdcore canonical form (core_r3.py lines 95-105).""" + + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def canonical_sha256(value: object, *, domain: str) -> str: + """Byte-for-byte the mdcore domain-separated digest (core_r3.py lines 108-109).""" + + return hashlib.sha256(domain.encode("ascii") + b"\0" + canonical_bytes(value)).hexdigest() + + +def is_dyadic_rational(value: float, *, max_exponent: int = 32) -> bool: + """True iff `value` is an integer over a power of two, exactly, in binary64. + + This is the property that makes math.fsum exact, and it is the property + that covers the whole five-arm family: WA2's 0.625 = 5/8 is dyadic but is + NOT a multiple of 0.25. Checked by scaling through powers of two rather + than by hard-coding a denominator. + """ + + if not math.isfinite(value): + return False + scaled = float(value) + for _ in range(max_exponent + 1): + if scaled == float(int(scaled)): + return True + scaled *= 2.0 + return False + + +def verify_coefficient_algebra() -> None: + """The arithmetic the owner decision asserts, checked rather than asserted.""" + + for policy in LOSS_POLICIES: + vector = COEFFICIENTS_BY_POLICY[policy] + shares = COEFFICIENT_SHARES_PERCENT[policy] + _require(list(vector) == OBJECTIVE_ORDER, f"{policy}: objective inventory changed") + _require(list(shares) == OBJECTIVE_ORDER, f"{policy}: share inventory changed") + for objective in OBJECTIVE_ORDER: + coefficient = vector[objective] + _require(coefficient > 0.0, f"{policy}.{objective}: coefficient is not positive") + _require( + is_dyadic_rational(coefficient), + f"{policy}.{objective}: coefficient is not a dyadic rational", + ) + share = shares[objective] + _require(type(share) is int, f"{policy}.{objective}: share is not a round percent") + _require( + coefficient == share / 100 * LOSS_DENOMINATOR, + f"{policy}.{objective}: coefficient does not equal share/100 x 5", + ) + _require( + math.fsum(vector.values()) == 5.0, + f"{policy}: coefficient mass is not exactly 5.0", + ) + _require(sum(shares.values()) == 100, f"{policy}: shares do not sum to 100") + labels = [ARM_LABEL_BY_POLICY[policy] for policy in LOSS_POLICIES] + _require(len(set(labels)) == 3, "arm labels are not distinct") + _require( + not set(labels) & set(RESERVED_ARM_LABELS_LITERAL), + "an arm label collides with the completed wa1/wa2 family", + ) + seeds = {seed for _policy, seed in TASK_TO_ARM_SEED.values()} + _require(seeds == {UPSTREAM_SEED}, "array does not run one upstream seed") + _require( + sorted(TASK_TO_ARM_SEED) == list(ARRAY_TASKS_LITERAL), + "array task inventory is not exactly three tasks", + ) + _require( + [policy for policy, _seed in TASK_TO_ARM_SEED.values()] == LOSS_POLICIES, + "array task order does not match the declared policy order", + ) + + +def effective_ratios(policy: str) -> dict[str, float]: + """ratio_o = (w_o / s_o) / (w_seq / s_seq). Reporting only.""" + + vector = COEFFICIENTS_BY_POLICY[policy] + base = vector["sequence"] / NULL_SCALES_LITERAL["sequence"] + return { + objective: (vector[objective] / NULL_SCALES_LITERAL[objective]) / base + for objective in OBJECTIVE_ORDER + } + + +# -------------------------------------------------------------------------- +# Load the pinned runner. +# -------------------------------------------------------------------------- + +def load_pinned_runner() -> Any: + path = PROJECT_ROOT / PINNED_RUNNER_RELATIVE + _require(path.is_file() and not path.is_symlink(), f"pinned runner is absent or unsafe: {path}") + status = path.stat() + _require(stat.S_ISREG(status.st_mode), f"pinned runner is not a regular file: {path}") + _require( + status.st_size == PINNED_RUNNER_BYTES, + f"pinned runner size changed: {status.st_size} != {PINNED_RUNNER_BYTES}", + ) + _require(_sha256_file(path) == PINNED_RUNNER_SHA256, "pinned runner hash changed") + source = path.read_text(encoding="utf-8") + _require(source.count(PINNED_ARM_LABEL_TRAP) == 1, "pinned arm-label defect is not where the repair expects it") + _require(source.count(PINNED_CELL_ROOT_EXPRESSION) == 1, "pinned cell_root expression changed") + _require(source.count("config.output_root") == 1, "pinned runner gained a second output_root consumer") + _require(source.count(PINNED_RESTART_GUARD) == 1, "pinned restart guard changed; the sbatch guard no longer matches") + _require(source.count(PINNED_CREATE_OR_RESUME) == 1, "pinned create-or-resume path changed") + _require( + source.count(" except FileExistsError:\n") == PINNED_FILE_EXISTS_HANDLER_COUNT, + "pinned FileExistsError handling changed", + ) + _require(source.count(PINNED_ATTEMPT_DEVICE_BLOCK) == 1, "pinned attempt record no longer captures the device") + specification = importlib.util.spec_from_file_location(PINNED_RUNNER_MODULE_NAME, path) + _require(specification is not None and specification.loader is not None, "cannot load the pinned runner") + module = importlib.util.module_from_spec(specification) + sys.modules[specification.name] = module + specification.loader.exec_module(module) + _require(module.CELL_ID == CELL_ID and module.BASE_CELL_ID == BASE_CELL_ID, "pinned cell identity changed") + _require(module.LOSS_DENOMINATOR == LOSS_DENOMINATOR, "pinned loss denominator changed") + _require(UPSTREAM_SEED in module.SEED_ORDER, "upstream seed 42 left the pinned seed order") + _require(list(module.mdcore.OBJECTIVES) == OBJECTIVE_ORDER, "pinned objective order changed") + _require( + module.canonical_bytes({"a": 1}) == canonical_bytes({"a": 1}) + and module.mdcore.canonical_sha256({"a": 1}, domain="d") == canonical_sha256({"a": 1}, domain="d"), + "the local canonical-JSON reimplementation diverged from mdcore", + ) + verify_pinned_checkpoint_store(module) + return module + + +def verify_pinned_checkpoint_store(wa2: Any) -> None: + """Pin the r3 file whose commit sequence the tear tolerance was read against. + + DO NOT resolve this file through ``wa2.r3.__file__``. In this codebase that + attribute LIES: the module bound as ``r3`` is genuinely the r3 module -- it + carries ``CheckpointStore``, which r4 does not, and ``wa2.r3 is wa2.r4.r3`` + -- but its ``__file__`` reports the *r4* path (5,454 bytes) rather than the + r3 path (50,267 bytes). Locating the file that way hashes r4 and aborts + with ``r3 runner size changed: 5454 != 50267``, which is exactly how job + 12038678 failed on 2026-08-17. Resolve by the pinned absolute path instead, + and verify module IDENTITY separately from file CONTENT. + """ + + # Identity: this must be the module that actually owns the commit path. + _require( + hasattr(wa2.r3, "CheckpointStore"), + "wa2.r3 does not own CheckpointStore; the module binding moved", + ) + _require(wa2.r3 is wa2.r4.r3, "wa2.r3 is no longer r4's r3") + + # Content: resolve by path, never by __file__. + r3_path = (PROJECT_ROOT / PINNED_R3_RUNNER_RELATIVE).absolute() + _require( + r3_path.is_file() and not r3_path.is_symlink(), + f"r3 runner is absent or unsafe: {r3_path}", + ) + _require( + r3_path.stat().st_size == PINNED_R3_RUNNER_BYTES, + f"r3 runner size changed: {r3_path.stat().st_size} != {PINNED_R3_RUNNER_BYTES}", + ) + _require(_sha256_file(r3_path) == PINNED_R3_RUNNER_SHA256, "r3 runner hash changed") + source = r3_path.read_text(encoding="utf-8") + for name, fragment in PINNED_CHECKPOINT_FRAGMENTS.items(): + _require( + source.count(fragment) == 1, + f"r3 checkpoint fragment moved, tear tolerance withdrawn: {name}", + ) + # The tolerance's premise: the payload write precedes the index write. + _require( + source.index(PINNED_COMMIT_PAYLOAD_FIRST) < source.index(PINNED_COMMIT_INDEX_LAST), + "r3 commit no longer writes the payload before the index", + ) + _require(wa2.r3.MILESTONES == (25, 50, 75, 100), "r3 milestone schedule changed") + + +# -------------------------------------------------------------------------- +# The arm-label repair. +# -------------------------------------------------------------------------- + +class ArmLabelRepairingRoot: + """Single-use output-root stand-in that repairs the pinned arm-label defect. + + Implements `__truediv__` and nothing else. Any other use of + `config.output_root` raises AttributeError, which is the intended + fail-closed behaviour: the repair is valid only while `config.output_root` + has exactly one consumer, and that invariant is re-checked at load time. + """ + + __slots__ = ("_root", "_mislabelled", "_repaired", "_uses") + + def __init__(self, root: Path, *, mislabelled: str, repaired: str) -> None: + self._root = Path(root) + self._mislabelled = mislabelled + self._repaired = repaired + self._uses = 0 + + def __truediv__(self, other: object) -> Path: + name = other if type(other) is str else os.fspath(other) # type: ignore[arg-type] + if name != self._mislabelled: + raise WA345Error( + "arm-label repair was handed an unexpected cell name: " + f"expected {self._mislabelled!r}, received {name!r}" + ) + self._uses += 1 + if self._uses != 1: + raise WA345Error("arm-label repair was consumed more than once") + return self._root / self._repaired + + @property + def repaired_path(self) -> Path: + return self._root / self._repaired + + def __repr__(self) -> str: + return ( + f"ArmLabelRepairingRoot(root={os.fspath(self._root)!r}, " + f"mislabelled={self._mislabelled!r}, repaired={self._repaired!r})" + ) + + +def cell_directory_name(policy: str, seed: int) -> str: + return f"review_md20x6_{SEMANTIC_ARRAY_ID}_{CELL_ID}_{ARM_LABEL_BY_POLICY[policy]}_seed{seed}" + + +def mislabelled_cell_directory_name(wa2: Any, policy: str, seed: int) -> str: + """Reproduce, exactly, the name the pinned line 729 will build for this task.""" + + arm_label = "wa1" if policy == wa2.WA1_POLICY else "wa2" + return f"review_md20x6_{SEMANTIC_ARRAY_ID}_{CELL_ID}_{arm_label}_seed{seed}" + + +# -------------------------------------------------------------------------- +# The torn-checkpoint tolerance. +# -------------------------------------------------------------------------- + +def build_tolerant_checkpoint_store(wa2: Any) -> Any: + """Subclass r3.CheckpointStore so a torn commit is survivable. + + `commit` is NOT touched. Two renames cannot be made atomic on NFS, and + forking the executed store to try would abandon the SHA pin that makes this + package's results comparable to the six executed cells. Only the READ side + changes, and only after the pinned read has already failed. + """ + + r3 = wa2.r3 + base_store = r3.CheckpointStore + require = wa2.require + + class TolerantCheckpointStore(base_store): # type: ignore[valid-type, misc] + """r3.CheckpointStore that rewinds to the newest self-consistent role.""" + + def _tear_candidates(self, index: Mapping[str, Any]) -> list[tuple[int, str, dict]]: + """Index-recorded roles whose file still matches the index, newest first. + + `latest` is deliberately included: if it verifies there was no tear + and the caller keeps the pinned behaviour. + """ + + roles = index["roles"] + candidates: list[tuple[str, Any]] = [] + for role in ("latest", "best"): + entry = roles.get(role) + if entry is not None: + candidates.append((role, entry)) + for epoch_key, entry in sorted((roles.get("milestones") or {}).items()): + if entry is not None: + candidates.append((f"milestone_{epoch_key}", entry)) + + verified: list[tuple[int, str, dict]] = [] + for role, entry in candidates: + path = self.root / str(entry["filename"]) + if not path.is_file() or path.is_symlink(): + continue + payload = path.read_bytes() + if hashlib.sha256(payload).hexdigest() != str(entry["sha256"]): + continue + verified.append((int(entry["epoch"]), role, dict(entry))) + verified.sort(key=lambda item: item[0], reverse=True) + return verified + + def load_latest(self, device: Any) -> dict[str, Any]: + index = self._index() + require(index is not None, "latest checkpoint index absent") + + try: + return base_store.load_latest(self, device) + except (r3.MDTrainingError, OSError): + pass + + # The pinned read failed. Either the index and the payload were + # torn apart by a preemption inside commit(), or `latest` is gone. + # Rewind to the newest role that is still self-consistent. + for epoch, role, entry in self._tear_candidates(index): + payload = (self.root / str(entry["filename"])).read_bytes() + checkpoint = r3.torch_loads(payload, device) + if checkpoint.get("schema") != r3.CHECKPOINT_SCHEMA: + continue + if checkpoint.get("run_identity_sha256") != self.run_sha256: + continue + selection = checkpoint.get("selection") or {} + if int(selection.get("completed_epochs", -1)) != epoch: + continue + print( + json.dumps( + { + "event": CHECKPOINT_TEAR_EVENT, + "cell_id": self.cell_id, + "recovered_from_role": role, + "recovered_epoch": epoch, + "index_generation": index.get("generation"), + "index_latest_epoch": (index["roles"].get("latest") or {}).get("epoch"), + "checkpoint_sha256": str(entry["sha256"]), + "note": ( + "commit() writes the payload before the index and the pair is " + "not atomic; the index-recorded `latest` payload did not verify, " + "so training rewound to the newest self-consistent role and " + "re-runs the intervening epochs" + ), + }, + sort_keys=True, + ), + flush=True, + ) + return checkpoint + + require( + False, + "WA345 checkpoint index and payloads disagree and no index-recorded role " + "verifies; the cell needs the reviewed manual recovery in README section 3", + ) + raise AssertionError("unreachable") # pragma: no cover + + return TolerantCheckpointStore + + +# -------------------------------------------------------------------------- +# The three-policy manifest contract. +# -------------------------------------------------------------------------- + +MANIFEST_FIELDS = frozenset( + { + "schema", "status", "semantic_array_id", "cell_id", "base_cell_id", + "loss_policies", "task_to_arm_seed", "upstream_seed", "downstream_seed", + "coefficients_by_policy", "coefficient_shares_percent", "loss_denominator", + "normalized_coefficient_shares_by_policy", "null_scales", "effective_ratios", + "maximum_epochs", "patience", "selection_rule", "attribution_claim", + "evaluation_populations", "project_root", "output_root", "arm_label_by_policy", + "reserved_arm_labels", "base_launch", "source_bindings", "seed42_adapter_anchor", + "route", "resume_policy", "architecture_disclosure", "withdrawn", + "submission_plan", "boundaries", "manifest_identity_sha256", + "launch_script_integrity", "checkpoint_resume_tolerance", + "restart_exhaustion_recovery", "walltime_basis", + } +) + +# -------------------------------------------------------------------------- +# The launch script is the ROOT of the integrity chain: the sbatch pins the +# manifest, the manifest pins the shim, the shim pins the runners. Nothing +# downstream can pin the sbatch back without a cycle -- which is exactly why +# the sbatch had no integrity reference at all. +# +# The cycle is broken by digesting the sbatch with the VALUES of its two +# self-referential pin lines removed. That digest is stable under a manifest +# rebuild, so the manifest can carry it; every other byte of the sbatch is +# covered. The two excluded values are covered by other means: a tampered +# MANIFEST_SHA256 makes the sbatch reject the real manifest (die 74), and a +# tampered SBATCH_INTEGRITY_SHA256 disagrees with the manifest. +# -------------------------------------------------------------------------- + +SBATCH_INTEGRITY_NORMALIZATION = ( + "sha256 of the sbatch with the values of the MANIFEST_SHA256= and " + "SBATCH_INTEGRITY_SHA256= lines removed" +) +SBATCH_SELF_PIN_LINES = ("MANIFEST_SHA256=", "SBATCH_INTEGRITY_SHA256=") + + +def normalized_sbatch_bytes(text: str) -> bytes: + """The sbatch text with its two self-referential pin values blanked.""" + + lines = [] + for line in text.split("\n"): + for prefix in SBATCH_SELF_PIN_LINES: + if line.startswith(prefix): + line = prefix + break + lines.append(line) + return "\n".join(lines).encode("utf-8") + + +def sbatch_integrity_sha256(text: str) -> str: + return hashlib.sha256(normalized_sbatch_bytes(text)).hexdigest() + + +def build_load_manifest(wa2: Any): + """Return a load_manifest bound to the three-policy contract.""" + + require = wa2.require + verify_binding = wa2.verify_binding + mdcore = wa2.mdcore + + def load_manifest(path: Path, expected_sha256: str) -> dict[str, Any]: + require(path.is_file() and not path.is_symlink(), "WA345 manifest is absent or unsafe") + payload = path.read_bytes() + require( + hashlib.sha256(payload).hexdigest() == expected_sha256, + "WA345 manifest file hash changed", + ) + value = json.loads(payload.decode("ascii")) + require( + type(value) is dict and mdcore.canonical_bytes(value) == payload, + "WA345 manifest is not canonical JSON", + ) + require(set(value) == set(MANIFEST_FIELDS), "WA345 manifest fields changed") + unsigned = dict(value) + identity = unsigned.pop("manifest_identity_sha256") + require( + identity == mdcore.canonical_sha256(unsigned, domain=MANIFEST_DOMAIN), + "WA345 manifest identity changed", + ) + require(value["schema"] == MANIFEST_SCHEMA, "WA345 manifest schema changed") + require(value["status"] == "PREPARED_NOT_SUBMITTED", "WA345 manifest is not preparation-only") + require(value["semantic_array_id"] == SEMANTIC_ARRAY_ID, "WA345 semantic array ID changed") + require( + value["cell_id"] == CELL_ID and value["base_cell_id"] == BASE_CELL_ID, + "WA345 cell changed", + ) + require(value["loss_policies"] == LOSS_POLICIES, "WA345 policies changed") + require(value["upstream_seed"] == UPSTREAM_SEED, "WA345 upstream seed changed") + require(value["downstream_seed"] == DOWNSTREAM_SEED, "WA345 paired downstream seed changed") + require( + value["task_to_arm_seed"] + == { + str(task): {"loss_policy": policy, "pretraining_seed": seed} + for task, (policy, seed) in TASK_TO_ARM_SEED.items() + }, + "WA345 task map changed", + ) + require( + value["coefficients_by_policy"] + == {policy: dict(vector) for policy, vector in COEFFICIENTS_BY_POLICY.items()}, + "WA345 coefficients changed", + ) + require( + value["coefficient_shares_percent"] + == {policy: dict(shares) for policy, shares in COEFFICIENT_SHARES_PERCENT.items()}, + "WA345 percentage shares changed", + ) + require(value["loss_denominator"] == LOSS_DENOMINATOR, "WA345 denominator changed") + require( + value["normalized_coefficient_shares_by_policy"] + == { + policy: {name: coefficient / LOSS_DENOMINATOR for name, coefficient in vector.items()} + for policy, vector in COEFFICIENTS_BY_POLICY.items() + }, + "WA345 normalized shares changed", + ) + require( + all(math.fsum(vector.values()) == 5.0 for vector in COEFFICIENTS_BY_POLICY.values()), + "WA345 coefficient mass is not exactly 5.0", + ) + require(value["null_scales"] == dict(NULL_SCALES_LITERAL), "WA345 null scales changed") + require( + value["effective_ratios"] == {policy: effective_ratios(policy) for policy in LOSS_POLICIES}, + "WA345 effective ratios changed", + ) + require( + value["arm_label_by_policy"] == dict(ARM_LABEL_BY_POLICY), + "WA345 arm-label repair table changed", + ) + require( + value["reserved_arm_labels"] == list(RESERVED_ARM_LABELS_LITERAL), + "WA345 reserved arm labels changed", + ) + require( + value["maximum_epochs"] == wa2.MAX_EPOCHS and value["patience"] == wa2.PATIENCE, + "WA345 schedule changed", + ) + require(value["selection_rule"] == "strict_lower_earliest_tie", "WA345 selection changed") + require(value["attribution_claim"] == wa2.ATTRIBUTION_CLAIM, "WA345 attribution changed") + require( + value["evaluation_populations"] == list(wa2.EVALUATION_POPULATIONS), + "WA345 populations changed", + ) + require(Path(value["project_root"]) == wa2.REMOTE_PROJECT_ROOT, "WA345 project root changed") + require( + value["boundaries"] + == { + "coefficient_search": False, + "downstream_guided_selection": False, + "heldout_access": False, + "hpo": False, + "official_submitted_artifacts_modified": False, + "test_access": False, + }, + "WA345 scientific boundaries changed", + ) + require( + value["resume_policy"] + == { + "create_or_resume_runner": True, + "cross_architecture_resume_permitted": True, + "maximum_restart_count": MAXIMUM_RESTART_COUNT, + "requeue": True, + "restart_guard_matches_runner": True, + }, + "WA345 resume policy changed", + ) + require( + value["architecture_disclosure"] + == { + "constraint_requested": None, + "measured_hours_per_epoch": {"a100_80gb": 1.0572, "h200_nvl": 0.4798}, + "pinned": False, + "route_architectures": ["a100", "h200"], + }, + "WA345 architecture disclosure changed", + ) + require( + value["checkpoint_resume_tolerance"] + == { + "commit_is_atomic_across_files": False, + "index_written_last": True, + "latest_filename_is_fixed": True, + "milestone_epochs": [25, 50, 75, 100], + "r3_runner_sha256": PINNED_R3_RUNNER_SHA256, + "rewind_to_newest_self_consistent_role": True, + "shim_overrides_load_latest_only": True, + "tear_event": CHECKPOINT_TEAR_EVENT, + }, + "WA345 checkpoint tolerance changed", + ) + require( + value["restart_exhaustion_recovery"] + == { + "automated_claim_rewrite": False, + "cells_preempted_once": 2, + "cells_preempted_twice": 0, + "claim_basename": "review_md20x6_wa2_run_claim.json", + "claim_domain": "bertose_review_md_temporal_20x6_a1111_wa2_claim_20260811_r1", + "executed_cells_observed": 6, + "maximum_restart_count": MAXIMUM_RESTART_COUNT, + "stranding_field": "first_array_job_id", + }, + "WA345 restart-exhaustion recovery record changed", + ) + basis = value["walltime_basis"] + require( + basis + == { + "a100_hours_per_epoch": 1.0572, + "best_epochs": [23, 27, 29, 31, 32], + "completed_epochs": [38, 42, 44, 46, 47], + "excluded_wa1_seed43_recovery_cell": { + "best_epoch": 34, + "completed_epochs": 49, + "identified_by": "coefficient_vector_all_ones", + "loss_policy_recorded": False, + }, + "h200_hours_per_epoch": 0.4798, + "sized_from_architecture": "a100_80gb", + "verified_cells": 5, + }, + "WA345 walltime basis changed", + ) + require( + basis["a100_hours_per_epoch"] + == value["architecture_disclosure"]["measured_hours_per_epoch"]["a100_80gb"] + and basis["h200_hours_per_epoch"] + == value["architecture_disclosure"]["measured_hours_per_epoch"]["h200_nvl"], + "WA345 walltime basis disagrees with the architecture disclosure", + ) + integrity = value["launch_script_integrity"] + require( + set(integrity) == {"bytes", "normalization", "path", "sha256_normalized"} + and integrity["normalization"] == SBATCH_INTEGRITY_NORMALIZATION + and SHA256_RE.fullmatch(str(integrity["sha256_normalized"])) is not None, + "WA345 launch-script integrity record changed", + ) + require( + value["withdrawn"] == {"wa0_submitted_configuration": True, "wa_r_reproduction_arm": True}, + "WA345 withdrawal record changed", + ) + require( + value["submission_plan"] + == { + "duplicate_and_output_absence_preflight_required": True, + "full_array_submission_allowed": True, + "launch_authorized": False, + "maximum_array_submissions": 1, + "permitted_sbatch_options": ["--array", "--parsable", "--test-only"], + "array_spec": "0-2", + "sbatch_test_only_required": True, + "sync_authorized": False, + }, + "WA345 release plan changed", + ) + require( + value["route"] + == { + "constraint": None, + "cpus_per_task": 4, + "excluded_node_list": ( + "nova18-gpu-[1-5],nova18-singularity,nova20-frost-1," + "nova20-matrix,nova21-gpu-10,nova26-gpu-1" + ), + "gres": "gpu:1", + "memory": "64G", + "minimum_gpu_memory_mib": 80000, + "requested_node_list": "nova25-gpu-[2-4]", + "requeue": True, + "submission_routes": { + "scavenger": { + "account": "ratul-scavenger", + "array_tasks": list(ARRAY_TASKS_LITERAL), + "partition": "scavenger", + "qos": "scavenger", + } + }, + "time_limit": "13:00:00", + }, + "WA345 route changed", + ) + source_bindings = value["source_bindings"] + require( + set(source_bindings) + == { + "owner_decision", "core", "r3_runner", "r4_runner", "r5_planner", + "wa2_runner", "wa345_shim", "executed_wa_sbatch", + }, + "WA345 sources changed", + ) + require( + source_bindings["wa2_runner"]["sha256"] == PINNED_RUNNER_SHA256 + and source_bindings["wa2_runner"]["bytes"] == PINNED_RUNNER_BYTES, + "WA345 manifest disagrees with the shim's runner pin", + ) + for binding in source_bindings.values(): + verify_binding(binding) + verify_binding(value["base_launch"]) + anchor = value["seed42_adapter_anchor"] + require( + set(anchor) == {"native_adapter_contract_sha256", "observed_in", "pretraining_seed"} + and anchor["pretraining_seed"] == UPSTREAM_SEED, + "WA345 seed-42 adapter anchor changed", + ) + return value + + return load_manifest + + +# -------------------------------------------------------------------------- +# Installation. +# -------------------------------------------------------------------------- + +def install(wa2: Any, *, task_id: Optional[int]) -> None: + """Retarget the pinned runner by attribute assignment. Nothing is forked.""" + + verify_coefficient_algebra() + + wa2.SUBMISSION_ROUTES = SUBMISSION_ROUTES + wa2.TASK_TO_ARM_SEED = TASK_TO_ARM_SEED + wa2.COEFFICIENTS_BY_POLICY = COEFFICIENTS_BY_POLICY + wa2.load_manifest = build_load_manifest(wa2) + + # The torn-checkpoint tolerance. The runner constructs its store as + # `r3.CheckpointStore(...)` at line 745, i.e. by attribute lookup at call + # time, so replacing the attribute on the r3 module is enough and nothing + # in either executed file is edited. + wa2.r3.CheckpointStore = build_tolerant_checkpoint_store(wa2) + + if task_id is None: + return + + require = wa2.require + require(task_id in TASK_TO_ARM_SEED, "WA345 array task must be 0, 1 or 2") + policy, seed = TASK_TO_ARM_SEED[task_id] + mislabelled = mislabelled_cell_directory_name(wa2, policy, seed) + repaired = cell_directory_name(policy, seed) + require(mislabelled != repaired, "WA345 arm-label repair is a no-op; the defect moved") + require( + repaired.endswith(f"_{ARM_LABEL_BY_POLICY[policy]}_seed{seed}"), + "WA345 repaired cell name does not carry the true arm label", + ) + + base_launch_class = wa2.WA2Launch + + class WA345Launch(base_launch_class): # type: ignore[valid-type, misc] + def __init__(self, manifest_path: Path, manifest_sha256: str) -> None: + super().__init__(manifest_path, manifest_sha256) + require( + self.manifest["semantic_array_id"] == SEMANTIC_ARRAY_ID, + "WA345 semantic array ID differs from the shim", + ) + self.output_root = ArmLabelRepairingRoot( + Path(self.manifest["output_root"]), + mislabelled=mislabelled, + repaired=repaired, + ) + + wa2.WA2Launch = WA345Launch + + +# -------------------------------------------------------------------------- +# Entry points. +# -------------------------------------------------------------------------- + +def self_check(wa2: Any, manifest_path: Path, manifest_sha256: str) -> Mapping[str, Any]: + value = wa2.load_manifest(manifest_path.absolute(), manifest_sha256) + wa2.require( + value["source_bindings"]["wa345_shim"]["sha256"] == _sha256_file(Path(__file__).absolute()), + "WA345 shim self-binding changed", + ) + example = {objective: 1.0 for objective in OBJECTIVE_ORDER} + for policy in LOSS_POLICIES: + vector = COEFFICIENTS_BY_POLICY[policy] + weighted = math.fsum(example[name] * vector[name] for name in OBJECTIVE_ORDER) / LOSS_DENOMINATOR + wa2.require(weighted == 1.0, f"{policy}: normalized-unit invariant changed") + for task_id, (policy, seed) in TASK_TO_ARM_SEED.items(): + mislabelled = mislabelled_cell_directory_name(wa2, policy, seed) + repaired = cell_directory_name(policy, seed) + wa2.require(mislabelled != repaired, f"task {task_id}: arm-label repair is a no-op") + repaired_names = [cell_directory_name(policy, seed) for policy, seed in TASK_TO_ARM_SEED.values()] + wa2.require(len(set(repaired_names)) == 3, "WA345 repaired cell names collide") + return MappingProxyType( + { + "schema": SELF_CHECK_SCHEMA, + "status": "PASS", + "manifest_identity_sha256": value["manifest_identity_sha256"], + "pinned_runner_sha256": PINNED_RUNNER_SHA256, + "shim_sha256": _sha256_file(Path(__file__).absolute()), + "upstream_seed": UPSTREAM_SEED, + "downstream_seed": DOWNSTREAM_SEED, + "task_to_arm_seed": { + str(task): {"loss_policy": policy, "pretraining_seed": seed} + for task, (policy, seed) in TASK_TO_ARM_SEED.items() + }, + "coefficients_by_policy": { + policy: dict(vector) for policy, vector in COEFFICIENTS_BY_POLICY.items() + }, + "repaired_cell_directory_names": repaired_names, + "seed42_adapter_anchor": value["seed42_adapter_anchor"], + } + ) + + +def emit_cell_binding(manifest_path: Path, manifest_sha256: str, task_id: int) -> Mapping[str, Any]: + """Authoritative cell naming for one array task, without torch. + + This is what the sbatch checks its own OUTPUT_ROOT / SEMANTIC_ARRAY_ID / + per-task arm literals against. Those literals used to be free-standing + strings that merely happened to agree with the shim; a drift between them + would have written three correctly-named cells into the wrong tree, or + three wrongly-named cells into the right one, with nothing to catch it. + Deliberately does NOT import the pinned runner, so the sbatch can run this + as a cheap preflight before the heavyweight self-check. + """ + + verify_coefficient_algebra() + _require(manifest_path.is_file() and not manifest_path.is_symlink(), + f"WA345 manifest is absent or unsafe: {manifest_path}") + payload = manifest_path.read_bytes() + _require(hashlib.sha256(payload).hexdigest() == manifest_sha256, + "WA345 manifest file hash changed") + value = json.loads(payload.decode("ascii")) + _require(type(value) is dict and canonical_bytes(value) == payload, + "WA345 manifest is not canonical JSON") + unsigned = dict(value) + identity = unsigned.pop("manifest_identity_sha256") + _require(identity == canonical_sha256(unsigned, domain=MANIFEST_DOMAIN), + "WA345 manifest identity changed") + _require(value["semantic_array_id"] == SEMANTIC_ARRAY_ID, + "WA345 manifest semantic array ID differs from the shim") + _require(task_id in TASK_TO_ARM_SEED, "WA345 array task must be 0, 1 or 2") + + policy, seed = TASK_TO_ARM_SEED[task_id] + name = cell_directory_name(policy, seed) + output_root = str(value["output_root"]) + return MappingProxyType( + { + "schema": CELL_BINDING_SCHEMA, + "array_task_id": task_id, + "arm_label": ARM_LABEL_BY_POLICY[policy], + "cell_directory_name": name, + "cell_root": f"{output_root}/{name}", + "loss_policy": policy, + "output_root": output_root, + "pretraining_seed": seed, + "semantic_array_id": SEMANTIC_ARRAY_ID, + } + ) + + +def main(argv: Optional[Sequence[str]] = None) -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--manifest", type=Path, default=DEFAULT_MANIFEST) + parser.add_argument("--manifest-sha256", required=True) + parser.add_argument("--array-task-id", type=int) + parser.add_argument("--self-check", action="store_true") + parser.add_argument("--emit-cell-binding", action="store_true") + arguments = parser.parse_args(argv) + + if arguments.emit_cell_binding: + _require(SHA256_RE.fullmatch(arguments.manifest_sha256) is not None, + "WA345 manifest hash is invalid") + _require(arguments.array_task_id is not None, "WA345 array task is required") + binding = emit_cell_binding( + arguments.manifest.absolute(), + arguments.manifest_sha256, + int(arguments.array_task_id), + ) + print(json.dumps(dict(binding), sort_keys=True), flush=True) + return 0 + + wa2 = load_pinned_runner() + _require( + wa2.SHA_RE.fullmatch(arguments.manifest_sha256) is not None, + "WA345 manifest hash is invalid", + ) + if arguments.self_check: + install(wa2, task_id=None) + result = self_check(wa2, arguments.manifest, arguments.manifest_sha256) + else: + _require(arguments.array_task_id is not None, "WA345 array task is required") + install(wa2, task_id=int(arguments.array_task_id)) + result = wa2.run(arguments) + print(json.dumps(dict(result), sort_keys=True), flush=True) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/submit_a5_wa345_20260817_r1.sbatch b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/submit_a5_wa345_20260817_r1.sbatch new file mode 100644 index 0000000000000000000000000000000000000000..b479c24e05dee91e2724b667600ca94e3cec8561 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/submit_a5_wa345_20260817_r1.sbatch @@ -0,0 +1,388 @@ +#!/bin/bash +#SBATCH --job-name=a5-wa345-r1 +#SBATCH --partition=scavenger +#SBATCH --account=ratul-scavenger +#SBATCH --qos=scavenger +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=4 +#SBATCH --gres=gpu:1 +#SBATCH --mem=64G +#SBATCH --time=13:00:00 +#SBATCH --nodelist=nova25-gpu-[2-4] +#SBATCH --exclude=nova18-gpu-[1-5],nova18-singularity,nova20-frost-1,nova20-matrix,nova21-gpu-10,nova26-gpu-1 +#SBATCH --requeue +#SBATCH --open-mode=append +#SBATCH --export=NONE +#SBATCH --chdir=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc +#SBATCH --output=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_r1_%A_%a.out +#SBATCH --error=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_r1_%A_%a.err +# +# WA3/WA4/WA5 loss-weighting arms, three-task array, upstream seed 42. +# +# Coefficient order is (sequence, topology, MS, static, MD). +# +# task 0 -> WA3_FINAL_MS_MD_HEAVY 0.50 0.25 2.00 0.25 2.00 arm wa3 +# task 1 -> WA4_FINAL_AUXILIARY_HEAVY 0.25 0.25 1.50 1.50 1.50 arm wa4 +# task 2 -> WA5_FINAL_STRUCTURE_MINIMAL 0.75 0.75 1.75 0.25 1.50 arm wa5 +# +# THESE LITERALS ARE NOT FREE-STANDING. The case statement below, OUTPUT_ROOT +# and SEMANTIC_ARRAY_ID used to be strings that merely happened to agree with +# the shim; a drift would have written correctly-named cells into the wrong +# tree, or wrongly-named cells into the right one, with nothing to catch it. +# They are now bound: the shim emits the authoritative cell binding for this +# task (`--emit-cell-binding`) and this script aborts with code 89 if any of +# its own literals disagrees. The local self-check enforces the same +# agreement statically. This is the single invariant the package exists to +# protect. +# +# EVERY COEFFICIENT IS A DYADIC RATIONAL -- an integer over a power of two -- +# which is what makes math.fsum(...) == 5.0 exact. Do not write "multiple of +# 0.25": that is true of these three arms but FALSE of WA2, whose 0.625 is a +# multiple of 0.125, so it is not the property that covers the family. +# +# WA5 IS NOT A ONE-VARIABLE MOVE. Coefficient mass is conserved at 5.0, so +# demoting static from a 20% share to a 5% share hands the freed 15% to MD. +# Two coefficients change: static:sequence divides by 4 and MD:sequence +# multiplies by 1.75. WA1-vs-WA5 is a static-down/MD-up trade IN SHARE +# SPACE, never "a structure effect". +# +# RESUME IS ENABLED AND MUST WORK. +# --requeue is set explicitly above. It is set because it is required, not +# because omitting it would disable requeue: the cluster default is +# JobRequeue=1 and scavenger is PreemptMode=REQUEUE, so an omitted --requeue +# leaves requeue on regardless. What omitting it does lose is the explicit +# record of intent. +# The restart guard below admits SLURM_RESTART_COUNT <= 2, which is exactly +# the pinned runner's own rule (`int(restart_text) <= 2`). A guard that +# aborted on any restart would have killed 11994675_0 and 12020657_4, the two +# executed WA cells that completed ONLY because resume worked. +# The runner's claim path is create-or-resume (mkdir exist_ok=False, then +# FileExistsError -> require dir + claim file), so an existing cell root with +# a matching claim is a resume, not a collision. +# The restart guard runs FIRST, before any file is touched, so an exhausted +# cell aborts with a diagnosable code=66 rather than dying later on an +# unrelated check. It is also what makes the guard's behaviour reproducible +# off-cluster: see README section 3. +# +# A THIRD PREEMPTION STRANDS THE CELL, and that is not repaired here. Exceeding +# the ceiling locks the cell: the claim file's first_array_job_id names the +# dead array, and the pinned runner's claim_cell requires the whole claim +# document to be equal, so a fresh submission aborts with "WA2 output belongs +# to another job". README section 3 documents the reviewed manual recovery. +# It is deliberately NOT automated. Basis for the exposure: two of the six +# executed cells were preempted once each; none has been preempted twice. +# +# A PREEMPTION INSIDE CheckpointStore.commit LEAVES A TORN CHECKPOINT. commit +# replaces every payload file before it replaces the index, and the pair is +# not atomic. Two renames cannot be made atomic on NFS, so the shim makes +# the READ side tolerant instead: it rewinds to the newest index-recorded +# role whose payload still verifies. See the shim's docstring. +# +# ARCHITECTURE IS NOT PINNED. No --constraint is requested. The route spans +# A100 80GB (nova21-gpu-[8,12], nova22-gpu-[1-5]) and H200 NVL +# (nova25-gpu-[2-4]). A resume may legitimately land on a different +# architecture than the attempt it resumes -- 12020657_4 went H200 -> A100 -- +# and that is disclosed, not refused. Each attempt's GPU identity is written +# to the per-restart attempt record by the runner and to this log by the +# labelled wa345_attempt_architecture line below. + +set -Eeuo pipefail +umask 077 + +# -------------------------------------------------------------------------- +# Every abort path emits one labelled line on stderr. +# +# `set -E` (errtrace) is what makes this hold inside $( ) command +# substitutions, which is where the previous package's guard went silent: an +# ERR trap is NOT inherited by subshells without it. The trap is the backstop; +# die() is the labelled path for checks that are expected to fail. +# -------------------------------------------------------------------------- + +wa345_context() { + printf 'task=%s job=%s array_job=%s node=%s restart=%s' \ + "${SLURM_ARRAY_TASK_ID-unset}" "${SLURM_JOB_ID-unset}" \ + "${SLURM_ARRAY_JOB_ID-unset}" "${SLURMD_NODENAME-unset}" \ + "${SLURM_RESTART_COUNT-0}" +} + +die() { + local code="$1"; shift + printf 'WA345_ABORT code=%s reason=%s %s\n' "${code}" "$*" "$(wa345_context)" >&2 + exit "${code}" +} + +on_err() { + local code="$1" line="$2" cmd="$3" + printf 'WA345_ABORT code=%s reason=unlabelled_failure line=%s command=%s %s\n' \ + "${code}" "${line}" "${cmd}" "$(wa345_context)" >&2 + exit "${code}" +} +trap 'on_err "$?" "${LINENO}" "${BASH_COMMAND}"' ERR + +need() { + # Present-and-non-empty check for a required Slurm variable. Deliberately + # replaces ${VAR:?}, whose expansion failure exits before the ERR trap runs. + local name="$1" + local value="${!name-}" + [ -n "${value}" ] || die 71 "required_variable_unset:${name}" + printf '%s' "${value}" +} + +PROJECT_ROOT=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc +PREPARATION_ROOT=${PROJECT_ROOT}/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation +OUTPUT_ROOT=${PROJECT_ROOT}/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production +SEMANTIC_ARRAY_ID=md20x6-a1111-wa345-20260817-r1 +PYTHON=/work/ratul1/supantha/miniconda3/bin/python3.10 +SHIM=${PREPARATION_ROOT}/run_a5_wa345_shim_20260817_r1.py +MANIFEST=${PREPARATION_ROOT}/a5_wa345_manifest_20260817_r1.json +PINNED_RUNNER=${PROJECT_ROOT}/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py + +SHIM_SHA256=5159414381025cf3e2d5e742422c84c292481168af42801c773df4ba12797fb4 +MANIFEST_SHA256=eeebc9c7e2cfc701f3ad47e62696ae2247c8caec93d8b034d5f573b701eab2a1 +PINNED_RUNNER_SHA256=dd74253863f39150af4ddc7e8d48c0a366e1f327c30aa50e0748078330b97b85 + +# This script's OWN integrity reference. It is the root of the pin chain -- +# the sbatch pins the manifest, the manifest pins the shim, the shim pins the +# runners -- so nothing downstream can pin it back without a cycle. The cycle +# is broken by digesting this file with the VALUES of the MANIFEST_SHA256= and +# SBATCH_INTEGRITY_SHA256= lines removed; that digest is stable under a +# manifest rebuild, so the manifest can carry it, and every other byte here is +# covered. Recompute it with: +# +# sed -e 's/^MANIFEST_SHA256=.*$/MANIFEST_SHA256=/' \ +# -e 's/^SBATCH_INTEGRITY_SHA256=.*$/SBATCH_INTEGRITY_SHA256=/' \ +# submit_a5_wa345_20260817_r1.sbatch | sha256sum +SBATCH_INTEGRITY_SHA256=d9e8416790949305feb296273a0dc186e7cf7822a4f01c1bbee3ac0587e81474 + +# -------------------------------------------------------------------------- +# Self-integrity, FIRST. If this file is not the file that was reviewed then +# nothing else it asserts is worth reading -- including which cell it is about +# to write to. It needs only $0, so it runs before the restart guard and +# before any /work path is touched, which is also what makes it reproducible +# off-cluster. +# -------------------------------------------------------------------------- + +digest_of() { + local path="$1" out="" + out=$(sha256sum "${path}" 2>/dev/null) || die 72 "sha256sum_failed:${path}" + [ -n "${out}" ] || die 72 "sha256sum_empty:${path}" + printf '%s' "${out%% *}" +} + +normalized_digest_of_self() { + local out="" + out=$(sed -e 's/^MANIFEST_SHA256=.*$/MANIFEST_SHA256=/' \ + -e 's/^SBATCH_INTEGRITY_SHA256=.*$/SBATCH_INTEGRITY_SHA256=/' \ + "$0" 2>/dev/null | sha256sum 2>/dev/null) \ + || die 72 "sbatch_self_digest_failed" + [ -n "${out}" ] || die 72 "sbatch_self_digest_empty" + printf '%s' "${out%% *}" +} + +ACTUAL=$(normalized_digest_of_self) +[ "${ACTUAL}" = "${SBATCH_INTEGRITY_SHA256}" ] || die 88 "sbatch_self_hash_mismatch:${ACTUAL}" + +# -------------------------------------------------------------------------- +# Restart guard. Matches the pinned runner's `int(restart_text) <= 2`. +# Defaulted with :-0 because SLURM_RESTART_COUNT is absent on a first attempt. +# +# This runs FIRST, before any file is opened, for two reasons. A cell that has +# exhausted its restart budget aborts with a diagnosable code=66 instead of +# dying later on some unrelated check. And the guard becomes reproducible off +# the cluster, where the /work paths do not exist: with the Slurm variables +# set, restart=3 reaches code=66 without touching the filesystem. +# -------------------------------------------------------------------------- + +RESTART_COUNT="${SLURM_RESTART_COUNT:-0}" +case "${RESTART_COUNT}" in + 0|1|2) ;; + *) die 66 "restart_count_above_runner_ceiling:${RESTART_COUNT}" ;; +esac + +# -------------------------------------------------------------------------- +# Array shape: exactly three tasks, 0 through 2, submitted as one array. +# -------------------------------------------------------------------------- + +TASK_ID=$(need SLURM_ARRAY_TASK_ID) +ARRAY_MIN=$(need SLURM_ARRAY_TASK_MIN) +ARRAY_MAX=$(need SLURM_ARRAY_TASK_MAX) +ARRAY_COUNT=$(need SLURM_ARRAY_TASK_COUNT) +ARRAY_SHAPE="${ARRAY_MIN}:${ARRAY_MAX}:${ARRAY_COUNT}" +[ "${ARRAY_SHAPE}" = "0:2:3" ] || die 75 "array_shape_is_not_0:2:3:got=${ARRAY_SHAPE}" + +case "${TASK_ID}" in + 0) ARM=wa3 ; SEED=42 ; POLICY=WA3_FINAL_MS_MD_HEAVY ;; + 1) ARM=wa4 ; SEED=42 ; POLICY=WA4_FINAL_AUXILIARY_HEAVY ;; + 2) ARM=wa5 ; SEED=42 ; POLICY=WA5_FINAL_STRUCTURE_MINIMAL ;; + *) die 64 "array_task_out_of_range:${TASK_ID}" ;; +esac + +# -------------------------------------------------------------------------- +# Source identity. +# -------------------------------------------------------------------------- + +for path in "${SHIM}" "${MANIFEST}" "${PINNED_RUNNER}"; do + [ -f "${path}" ] || die 73 "source_missing:${path}" + [ ! -L "${path}" ] || die 73 "source_is_symlink:${path}" +done + +ACTUAL=$(digest_of "${SHIM}") +[ "${ACTUAL}" = "${SHIM_SHA256}" ] || die 74 "shim_hash_mismatch:${ACTUAL}" +ACTUAL=$(digest_of "${MANIFEST}") +[ "${ACTUAL}" = "${MANIFEST_SHA256}" ] || die 74 "manifest_hash_mismatch:${ACTUAL}" +ACTUAL=$(digest_of "${PINNED_RUNNER}") +[ "${ACTUAL}" = "${PINNED_RUNNER_SHA256}" ] || die 74 "pinned_runner_hash_mismatch:${ACTUAL}" + +# -------------------------------------------------------------------------- +# Placement and route. Every failure path is labelled. +# -------------------------------------------------------------------------- + +NTASKS=$(need SLURM_NTASKS) +[ "${NTASKS}" = "1" ] || die 76 "ntasks_is_not_1:${NTASKS}" +NNODES=$(need SLURM_NNODES) +[ "${NNODES}" = "1" ] || die 76 "nnodes_is_not_1:${NNODES}" +CPUS=$(need SLURM_CPUS_PER_TASK) +[ "${CPUS}" = "4" ] || die 76 "cpus_per_task_is_not_4:${CPUS}" +GPUS=$(need SLURM_GPUS_ON_NODE) +[ "${GPUS}" = "1" ] || die 76 "gpus_on_node_is_not_1:${GPUS}" + +PARTITION=$(need SLURM_JOB_PARTITION) +ACCOUNT=$(need SLURM_JOB_ACCOUNT) +QOS=$(need SLURM_JOB_QOS) +ROUTE="${PARTITION}:${ACCOUNT}:${QOS}" +[ "${ROUTE}" = "scavenger:ratul-scavenger:scavenger" ] || die 77 "route_not_authorized:${ROUTE}" + +# Architecture must stay unpinned: refuse a job that arrived with a constraint. +[ -z "${SLURM_JOB_CONSTRAINTS:-}" ] || die 78 "constraint_requested:${SLURM_JOB_CONSTRAINTS}" + +NODE=$(need SLURMD_NODENAME) +case "${NODE}" in + nova21-gpu-8|nova21-gpu-12) ARCH_EXPECTED=a100 ;; + nova22-gpu-1|nova22-gpu-2|nova22-gpu-3|nova22-gpu-4|nova22-gpu-5) ARCH_EXPECTED=a100 ;; + nova25-gpu-2|nova25-gpu-3|nova25-gpu-4) ARCH_EXPECTED=h200 ;; + *) die 65 "node_outside_route:${NODE}" ;; +esac + +VISIBLE=$(need CUDA_VISIBLE_DEVICES) +case "${VISIBLE}" in + *,*) die 79 "multiple_visible_devices:${VISIBLE}" ;; +esac + +# -------------------------------------------------------------------------- +# Cell naming, BOUND to the shim rather than asserted alongside it. +# +# CELL_ROOT carries the TRUE arm label -- the shim repairs the pinned runner's +# arm_label defect, so the directory the runner creates is this one. What this +# block adds is that the name is no longer this script's independent opinion: +# the shim emits the authoritative binding for this task from the manifest it +# has just verified, and every literal above is checked against it. A drift in +# OUTPUT_ROOT, SEMANTIC_ARRAY_ID or the task-to-arm case statement aborts here +# with code 89 instead of silently writing to the wrong place. +# +# --emit-cell-binding deliberately does not import torch or the pinned runner, +# so this is a cheap preflight that runs before the heavyweight self-check. +# +# The claim / receipt basenames keep the pinned runner's literal "wa2" infix; +# they are per-cell files inside a per-arm directory and are not rewritten, +# because doing so would require forking the runner. +# -------------------------------------------------------------------------- + +CELL_BINDING=$("${PYTHON}" -I -B -W error "${SHIM}" \ + --manifest "${MANIFEST}" \ + --manifest-sha256 "${MANIFEST_SHA256}" \ + --emit-cell-binding \ + --array-task-id "${TASK_ID}") || die 89 "cell_binding_emit_failed" + +binding_field() { + local key="$1" out="" + out=$(printf '%s' "${CELL_BINDING}" | "${PYTHON}" -I -B -c \ + 'import json,sys; print(json.load(sys.stdin)[sys.argv[1]])' "${key}" 2>/dev/null) \ + || die 89 "cell_binding_field_unreadable:${key}" + printf '%s' "${out}" +} + +BOUND_OUTPUT_ROOT=$(binding_field output_root) +BOUND_SEMANTIC_ARRAY_ID=$(binding_field semantic_array_id) +BOUND_ARM=$(binding_field arm_label) +BOUND_POLICY=$(binding_field loss_policy) +BOUND_SEED=$(binding_field pretraining_seed) +BOUND_CELL_ROOT=$(binding_field cell_root) + +[ "${BOUND_OUTPUT_ROOT}" = "${OUTPUT_ROOT}" ] \ + || die 89 "output_root_drifted_from_shim:${BOUND_OUTPUT_ROOT}" +[ "${BOUND_SEMANTIC_ARRAY_ID}" = "${SEMANTIC_ARRAY_ID}" ] \ + || die 89 "semantic_array_id_drifted_from_shim:${BOUND_SEMANTIC_ARRAY_ID}" +[ "${BOUND_ARM}" = "${ARM}" ] || die 89 "arm_drifted_from_shim:${BOUND_ARM}" +[ "${BOUND_POLICY}" = "${POLICY}" ] || die 89 "policy_drifted_from_shim:${BOUND_POLICY}" +[ "${BOUND_SEED}" = "${SEED}" ] || die 89 "seed_drifted_from_shim:${BOUND_SEED}" + +CELL_ROOT=${OUTPUT_ROOT}/review_md20x6_${SEMANTIC_ARRAY_ID}_A1111_${ARM}_seed${SEED} +[ "${BOUND_CELL_ROOT}" = "${CELL_ROOT}" ] \ + || die 89 "cell_root_drifted_from_shim:${BOUND_CELL_ROOT}" + +CLAIM=${CELL_ROOT}/review_md20x6_wa2_run_claim.json +RECEIPT=${CELL_ROOT}/review_md20x6_wa2_final_receipt.json + +if [ -e "${CELL_ROOT}" ] || [ -L "${CELL_ROOT}" ]; then + [ -d "${CELL_ROOT}" ] || die 80 "cell_root_is_not_a_directory:${CELL_ROOT}" + [ ! -L "${CELL_ROOT}" ] || die 80 "cell_root_is_a_symlink:${CELL_ROOT}" + [ -f "${CLAIM}" ] || die 80 "cell_root_exists_without_claim:${CELL_ROOT}" + [ ! -L "${CLAIM}" ] || die 80 "claim_is_a_symlink:${CLAIM}" +fi +[ ! -e "${RECEIPT}" ] || die 81 "cell_already_complete:${RECEIPT}" +[ ! -L "${RECEIPT}" ] || die 81 "receipt_is_a_symlink:${RECEIPT}" + +# Refuse to write into the completed WA1/WA2 family's tree. +case "${CELL_ROOT}" in + *review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1*) + die 82 "cell_root_inside_completed_wa1_wa2_tree:${CELL_ROOT}" ;; +esac +case "${ARM}" in + wa1|wa2) die 83 "arm_label_collides_with_completed_family:${ARM}" ;; +esac + +# -------------------------------------------------------------------------- +# Environment. Identical to the executed WA1/WA2 launcher. +# -------------------------------------------------------------------------- + +export PYTHONNOUSERSITE=1 PYTHONHASHSEED=0 PYTHONDONTWRITEBYTECODE=1 +export PYTHONUNBUFFERED=1 CUDA_DEVICE_ORDER=PCI_BUS_ID +export CUBLAS_WORKSPACE_CONFIG=:4096:8 OMP_NUM_THREADS=4 MKL_NUM_THREADS=4 + +"${PYTHON}" -I -B -W error "${SHIM}" \ + --manifest "${MANIFEST}" \ + --manifest-sha256 "${MANIFEST_SHA256}" \ + --self-check \ + || die 84 "shim_self_check_failed" + +GPU_MEMORY_MIB=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits 2>/dev/null | head -n 1 | tr -d ' ') \ + || die 85 "nvidia_smi_memory_query_failed" +[ -n "${GPU_MEMORY_MIB}" ] || die 85 "nvidia_smi_memory_query_empty" +case "${GPU_MEMORY_MIB}" in + ''|*[!0-9]*) die 85 "nvidia_smi_memory_not_numeric:${GPU_MEMORY_MIB}" ;; +esac +[ "${GPU_MEMORY_MIB}" -ge 80000 ] || die 86 "gpu_memory_below_minimum:${GPU_MEMORY_MIB}" + +# -------------------------------------------------------------------------- +# Disclosure. One labelled line per attempt; --open-mode=append means a +# resumed attempt adds its own line rather than overwriting the previous one, +# so a cross-architecture resume is visible in this log as two lines with +# different arch= values and different restart= values. +# -------------------------------------------------------------------------- + +SCRIPT_DIGEST=$(digest_of "$0") +GPU_IDENTITY=$(nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv,noheader 2>/dev/null | head -n 1) \ + || die 87 "nvidia_smi_identity_query_failed" +[ -n "${GPU_IDENTITY}" ] || die 87 "nvidia_smi_identity_query_empty" + +printf 'wa345_attempt_architecture arch=%s node=%s gpu=%s restart=%s task=%s arm=%s policy=%s seed=%s\n' \ + "${ARCH_EXPECTED}" "${NODE}" "${GPU_IDENTITY}" "${RESTART_COUNT}" \ + "${TASK_ID}" "${ARM}" "${POLICY}" "${SEED}" >&2 +printf 'wa345_attempt_identity slurm_script_sha256=%s slurm_script_normalized_sha256=%s shim_sha256=%s manifest_sha256=%s cell_root=%s\n' \ + "${SCRIPT_DIGEST}" "${SBATCH_INTEGRITY_SHA256}" "${SHIM_SHA256}" "${MANIFEST_SHA256}" "${CELL_ROOT}" + +exec "${PYTHON}" -I -B -W error "${SHIM}" \ + --manifest "${MANIFEST}" \ + --manifest-sha256 "${MANIFEST_SHA256}" \ + --array-task-id "${TASK_ID}" diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/review_md_temporal_20x6_a1111_wa2_manifest_20260811_r1.json b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/review_md_temporal_20x6_a1111_wa2_manifest_20260811_r1.json new file mode 100644 index 0000000000000000000000000000000000000000..168a50a166be381291ac5f0596a185441343bae9 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/review_md_temporal_20x6_a1111_wa2_manifest_20260811_r1.json @@ -0,0 +1 @@ +{"attribution_claim":"fixed_sequence_heavy_loss_sensitivity_on_final_md_inclusive_a1111","base_cell_id":"A111","base_launch":{"bytes":4245,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_end_to_end_20260802_r3_native_intersection/review_md_temporal_20x6_a1111_recovery_20260806_r1/review_md_temporal_20x6_a1111_launch_config_20260806_r1.json","sha256":"2a89d6b54668d4db8f1b9fe857f744d31116eb6d28b2695b31461161c1aea2b9"},"boundaries":{"coefficient_search":false,"downstream_guided_selection":false,"heldout_access":false,"hpo":false,"official_submitted_artifacts_modified":false,"test_access":false},"cell_id":"A1111","coefficients_by_policy":{"WA1_FINAL_MD_EQUAL_NORMALIZED":{"md":1,"ms":1,"sequence":1,"static":1,"topology":1},"WA2_FINAL_MD_SEQUENCE_HEAVY":{"md":0.625,"ms":0.625,"sequence":2.5,"static":0.625,"topology":0.625}},"evaluation_populations":["all_parent_primary","md_present_secondary"],"loss_denominator":5,"loss_policies":["WA1_FINAL_MD_EQUAL_NORMALIZED","WA2_FINAL_MD_SEQUENCE_HEAVY"],"manifest_identity_sha256":"381f0afea481a8b722e48aa468b87741f40350442f6911d803aea573a3fb0460","maximum_epochs":100,"normalized_coefficient_shares_by_policy":{"WA1_FINAL_MD_EQUAL_NORMALIZED":{"md":0.2,"ms":0.2,"sequence":0.2,"static":0.2,"topology":0.2},"WA2_FINAL_MD_SEQUENCE_HEAVY":{"md":0.125,"ms":0.125,"sequence":0.5,"static":0.125,"topology":0.125}},"output_root":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production","patience":15,"project_root":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc","route":{"cpus_per_task":4,"excluded_node_list":"nova18-gpu-[1-5],nova18-singularity,nova20-frost-1,nova20-matrix,nova21-gpu-10,nova26-gpu-1","gres":"gpu:1","memory":"144G","minimum_gpu_memory_mib":80000,"requested_node_list":"nova21-gpu-[8,12],nova22-gpu-[2-3,5],nova25-gpu-4","requeue":true,"submission_routes":{"scavenger":{"account":"ratul-scavenger","array_tasks":[0,1,2,3,4],"partition":"scavenger","qos":"scavenger"}},"time_limit":"5-00:00:00"},"schema":"bertose_review_md_temporal_20x6_a1111_wa2_manifest_20260811_r1","seed_order":[42,43,44],"selection_rule":"strict_lower_earliest_tie","semantic_array_id":"md20x6-a1111-wa2-finalmd-20260811-r1","source_bindings":{"core":{"bytes":48643,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/review_md_temporal_20x6_core_r3.py","sha256":"3e96d8092239c2c21f217ad5bae4ee7e07dbe0f7630b213bad468d6b08d3b1c1"},"owner_decision":{"bytes":3847,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/review_md_temporal_20x6_a1111_wa2_owner_decision_20260811_r1.md","sha256":"de95aa54f368c67f76d9d79152a0dcd45218a68efe319a0edc48805829145c6a"},"r3_runner":{"bytes":50267,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/run_review_md_temporal_20x6_training_r3.py","sha256":"1e446e7e89a39ef01132b9f2a4deb817161f7b376a0fa04c2b11529004f53e8a"},"r4_runner":{"bytes":5454,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260805_r4_dev_memory/run_review_md_temporal_20x6_training_r4.py","sha256":"a6a180ae103eaaf68458b298cd4180920a0e88c1724a6ba9a94ef94559e75c5f"},"r5_planner":{"bytes":16021,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_balanced_planner_r5.py","sha256":"1b9b05c812603db7b216aa989214a3c3715f80032b3a8b82577ae2b9e48f048d"},"wa2_runner":{"bytes":39694,"path":"/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r1_preparation/run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py","sha256":"dd74253863f39150af4ddc7e8d48c0a366e1f327c30aa50e0748078330b97b85"}},"status":"PREPARED_NOT_SUBMITTED","submission_plan":{"duplicate_and_output_absence_preflight_required":true,"full_array_submission_allowed":false,"launch_authorized":false,"maximum_array_submissions":2,"pilot":{"array_spec":"0","loss_policy":"WA2_FINAL_MD_SEQUENCE_HEAVY","pretraining_seed":43},"remaining":{"array_spec":"1-4","matched_pairs":{"42":["WA1_FINAL_MD_EQUAL_NORMALIZED","WA2_FINAL_MD_SEQUENCE_HEAVY"],"44":["WA1_FINAL_MD_EQUAL_NORMALIZED","WA2_FINAL_MD_SEQUENCE_HEAVY"]}},"sbatch_test_only_required":true,"sync_authorized":false},"task_to_arm_seed":{"0":{"loss_policy":"WA2_FINAL_MD_SEQUENCE_HEAVY","pretraining_seed":43},"1":{"loss_policy":"WA1_FINAL_MD_EQUAL_NORMALIZED","pretraining_seed":42},"2":{"loss_policy":"WA2_FINAL_MD_SEQUENCE_HEAVY","pretraining_seed":42},"3":{"loss_policy":"WA1_FINAL_MD_EQUAL_NORMALIZED","pretraining_seed":44},"4":{"loss_policy":"WA2_FINAL_MD_SEQUENCE_HEAVY","pretraining_seed":44}},"terminal_primary_anchor":{"cell_id":"A1111","final_receipt":{"bytes":45412,"file_sha256":"09826d0e89687f7109f0f0f5509373595c7de9e3225c150711faa11dc96c1eac","receipt_sha256":"5334d9c8f5e0d7f40086d9df4178eba19a14d9e736b6b6a7e25bb72d771d64d9"},"pretraining_seed":43,"run_identity_sha256":"77e64c6133738c578bf4462246da604a4731f38d6d54b037cf07f3b767702240","selected_checkpoint":{"bytes":1662531780,"sha256":"2df57cd5f4dc33c102e904d99841047e7a8877e1c5a404bdea2044933c6daec7"},"selection":{"best_epoch":34,"best_loss":0.3117205284776156,"completed_epochs":49,"epochs_without_improvement":15,"stop_reason":"patience_exhausted"},"slurm":{"display_job_id":"11988624_7","exit_code":"0:0","restarts":0,"state":"COMPLETED"}}} diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py new file mode 100644 index 0000000000000000000000000000000000000000..6c934a6972aecad111ac011ace964a38d6ed98d8 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py @@ -0,0 +1,926 @@ +#!/usr/bin/env python3 +"""Train the matched final-MD A1111 WA1/WA2 sensitivity fits.""" + +from __future__ import annotations + +import argparse +from contextlib import suppress +import copy +import hashlib +import json +import math +import os +from pathlib import Path +import random +import signal +import stat +import sys +from types import MappingProxyType +from typing import Any, Mapping, Optional, Sequence + +import numpy as np +import torch + + +PROJECT_ROOT = Path(__file__).absolute().parents[5] +WRITING_ROOT = PROJECT_ROOT / "writing" +if os.fspath(WRITING_ROOT) not in sys.path: + sys.path.insert(0, os.fspath(WRITING_ROOT)) + +from review.multimodal.runtime.md_temporal_20x6_end_to_end_20260805_r4_dev_memory import ( # noqa: E402 + run_review_md_temporal_20x6_training_r4 as r4, +) + + +r3 = r4.r3 +mdcore = r3.mdcore + +SCHEMA = "bertose_review_md_temporal_20x6_a1111_wa2_training_20260811_r1" +MANIFEST_SCHEMA = "bertose_review_md_temporal_20x6_a1111_wa2_manifest_20260811_r1" +CLAIM_SCHEMA = "bertose_review_md_temporal_20x6_a1111_wa2_claim_20260811_r1" +FINAL_SCHEMA = "bertose_review_md_temporal_20x6_a1111_wa2_final_20260811_r1" +ADAPTER_SCHEMA = "bertose_review_md_temporal_20x6_a1111_wa2_seed_adapter_20260811_r1" +MD_SEEDED_BATCH_SCHEMA = "bertose_review_md_temporal_20x6_a1111_seeded_md_batch_20260811_r1" +MD_SEEDED_WINDOW_SCHEMA = "bertose_review_md_temporal_20x6_a1111_seeded_md_window_20260811_r1" +MANIFEST_DOMAIN = "bertose-review-md20x6-a1111-wa2-manifest-20260811-r1" +CELL_ID = "A1111" +BASE_CELL_ID = "A111" +WA1_POLICY = "WA1_FINAL_MD_EQUAL_NORMALIZED" +WA2_POLICY = "WA2_FINAL_MD_SEQUENCE_HEAVY" +SEED_ORDER = (42, 43, 44) +TASK_TO_ARM_SEED = MappingProxyType( + { + 0: (WA2_POLICY, 43), + 1: (WA1_POLICY, 42), + 2: (WA2_POLICY, 42), + 3: (WA1_POLICY, 44), + 4: (WA2_POLICY, 44), + } +) +WA1_COEFFICIENTS = MappingProxyType( + {"sequence": 1.0, "topology": 1.0, "ms": 1.0, "static": 1.0, "md": 1.0} +) +WA2_COEFFICIENTS = MappingProxyType( + {"sequence": 2.5, "topology": 0.625, "ms": 0.625, "static": 0.625, "md": 0.625} +) +COEFFICIENTS_BY_POLICY = MappingProxyType( + {WA1_POLICY: WA1_COEFFICIENTS, WA2_POLICY: WA2_COEFFICIENTS} +) +LOSS_DENOMINATOR = 5 +MAX_EPOCHS = 100 +PATIENCE = 15 +ATTRIBUTION_CLAIM = "fixed_sequence_heavy_loss_sensitivity_on_final_md_inclusive_a1111" +EVALUATION_POPULATIONS = ("all_parent_primary", "md_present_secondary") +SUBMISSION_ROUTES = MappingProxyType( + { + "scavenger": { + "partition": "scavenger", + "account": "ratul-scavenger", + "qos": "scavenger", + "array_tasks": [0, 1, 2, 3, 4], + } + } +) +REMOTE_PROJECT_ROOT = Path( + "/work/ratul1/supantha/" + "bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc" +) +HERE = Path(__file__).absolute().parent +DEFAULT_MANIFEST = HERE / "review_md_temporal_20x6_a1111_wa2_manifest_20260811_r1.json" +SHA_RE = r3.SHA_RE +LEGACY_MD_WINDOWS = mdcore._deterministic_windows + + +def require(condition: bool, message: str) -> None: + if not condition: + raise r3.MDTrainingError(message) + + +def canonical_bytes(value: object) -> bytes: + return mdcore.canonical_bytes(value) + + +def sha256_file(path: Path) -> str: + return r3.sha256_file(path) + + +def mapped_path(value: str) -> Path: + path = Path(value) + if PROJECT_ROOT == REMOTE_PROJECT_ROOT: + return path + try: + return PROJECT_ROOT / path.relative_to(REMOTE_PROJECT_ROOT) + except ValueError: + return path + + +def verify_binding(binding: Mapping[str, Any]) -> Path: + require(set(binding) == {"path", "bytes", "sha256"}, "source binding fields changed") + path = mapped_path(str(binding["path"])) + require(path.is_file() and not path.is_symlink(), f"bound source is absent or unsafe: {path}") + status = path.stat() + require(stat.S_ISREG(status.st_mode), f"bound source is not regular: {path}") + require(status.st_size == binding["bytes"], f"bound source size changed: {path}") + require(sha256_file(path) == binding["sha256"], f"bound source hash changed: {path}") + return path + + +def load_manifest(path: Path, expected_sha256: str) -> dict[str, Any]: + require(path.is_file() and not path.is_symlink(), "WA2 manifest is absent or unsafe") + payload = path.read_bytes() + require(hashlib.sha256(payload).hexdigest() == expected_sha256, "WA2 manifest file hash changed") + value = json.loads(payload.decode("ascii")) + require(type(value) is dict and canonical_bytes(value) == payload, "WA2 manifest is not canonical JSON") + required = { + "schema", "status", "semantic_array_id", "cell_id", "base_cell_id", + "loss_policies", "task_to_arm_seed", "seed_order", "coefficients_by_policy", + "loss_denominator", "normalized_coefficient_shares_by_policy", "maximum_epochs", + "patience", "selection_rule", "attribution_claim", + "evaluation_populations", "project_root", "output_root", + "base_launch", "source_bindings", "terminal_primary_anchor", "route", + "submission_plan", "boundaries", "manifest_identity_sha256", + } + require(set(value) == required, "WA2 manifest fields changed") + unsigned = dict(value) + identity = unsigned.pop("manifest_identity_sha256") + require( + identity == mdcore.canonical_sha256(unsigned, domain=MANIFEST_DOMAIN), + "WA2 manifest identity changed", + ) + require(value["schema"] == MANIFEST_SCHEMA, "WA2 manifest schema changed") + require(value["status"] == "PREPARED_NOT_SUBMITTED", "WA2 manifest is not preparation-only") + require(value["cell_id"] == CELL_ID and value["base_cell_id"] == BASE_CELL_ID, "WA2 cell changed") + require(value["loss_policies"] == [WA1_POLICY, WA2_POLICY], "WA2 policies changed") + require(value["seed_order"] == list(SEED_ORDER), "WA2 seed order changed") + require( + value["task_to_arm_seed"] + == { + str(task): {"loss_policy": policy, "pretraining_seed": seed} + for task, (policy, seed) in TASK_TO_ARM_SEED.items() + }, + "WA2 task map changed", + ) + expected_coefficients = { + policy: dict(coefficients) for policy, coefficients in COEFFICIENTS_BY_POLICY.items() + } + require(value["coefficients_by_policy"] == expected_coefficients, "WA2 coefficients changed") + require(value["loss_denominator"] == LOSS_DENOMINATOR, "WA2 denominator changed") + expected_shares = { + policy: {name: coefficient / LOSS_DENOMINATOR for name, coefficient in coefficients.items()} + for policy, coefficients in COEFFICIENTS_BY_POLICY.items() + } + require( + value["normalized_coefficient_shares_by_policy"] == expected_shares, + "WA2 normalized shares changed", + ) + require( + all(math.fsum(coefficients.values()) == 5.0 for coefficients in COEFFICIENTS_BY_POLICY.values()), + "WA2 coefficient mass changed", + ) + require(value["maximum_epochs"] == MAX_EPOCHS and value["patience"] == PATIENCE, "WA2 schedule changed") + require(value["selection_rule"] == "strict_lower_earliest_tie", "WA2 selection changed") + require(value["attribution_claim"] == ATTRIBUTION_CLAIM, "WA2 attribution changed") + require(value["evaluation_populations"] == list(EVALUATION_POPULATIONS), "WA2 populations changed") + require(Path(value["project_root"]) == REMOTE_PROJECT_ROOT, "WA2 project root changed") + require(value["boundaries"] == { + "coefficient_search": False, + "downstream_guided_selection": False, + "heldout_access": False, + "hpo": False, + "official_submitted_artifacts_modified": False, + "test_access": False, + }, "WA2 scientific boundaries changed") + require( + value["submission_plan"] + == { + "duplicate_and_output_absence_preflight_required": True, + "full_array_submission_allowed": False, + "launch_authorized": False, + "maximum_array_submissions": 2, + "pilot": { + "array_spec": "0", + "loss_policy": WA2_POLICY, + "pretraining_seed": 43, + }, + "remaining": { + "array_spec": "1-4", + "matched_pairs": { + "42": [WA1_POLICY, WA2_POLICY], + "44": [WA1_POLICY, WA2_POLICY], + }, + }, + "sbatch_test_only_required": True, + "sync_authorized": False, + }, + "WA2 pilot/matched release plan changed", + ) + require( + value["route"] + == { + "cpus_per_task": 4, + "excluded_node_list": ( + "nova18-gpu-[1-5],nova18-singularity,nova20-frost-1," + "nova20-matrix,nova21-gpu-10,nova26-gpu-1" + ), + "gres": "gpu:1", + "memory": "144G", + "minimum_gpu_memory_mib": 80000, + "requested_node_list": "nova21-gpu-[8,12],nova22-gpu-[2-3,5],nova25-gpu-4", + "requeue": True, + "submission_routes": { + "scavenger": { + "account": "ratul-scavenger", + "array_tasks": [0, 1, 2, 3, 4], + "partition": "scavenger", + "qos": "scavenger", + } + }, + "time_limit": "5-00:00:00", + }, + "WA2 route changed", + ) + source_bindings = value["source_bindings"] + require( + set(source_bindings) + == {"owner_decision", "core", "r3_runner", "r4_runner", "r5_planner", "wa2_runner"}, + "WA2 sources changed", + ) + for binding in source_bindings.values(): + verify_binding(binding) + verify_binding(value["base_launch"]) + return value + + +class WA2Launch: + def __init__(self, manifest_path: Path, manifest_sha256: str) -> None: + self.manifest = MappingProxyType(load_manifest(manifest_path, manifest_sha256)) + base = self.manifest["base_launch"] + base_config = r3.LaunchConfig(mapped_path(base["path"]), base["sha256"]) + self.value = MappingProxyType( + { + "submission_routes": dict(SUBMISSION_ROUTES), + "attribution_claim": ATTRIBUTION_CLAIM, + "evaluation_populations": list(EVALUATION_POPULATIONS), + } + ) + self.path = manifest_path.absolute() + self.sha256 = manifest_sha256 + self.semantic_array_id = str(self.manifest["semantic_array_id"]) + self.project_root = Path(self.manifest["project_root"]) + self.output_root = Path(self.manifest["output_root"]) + require(self.project_root == PROJECT_ROOT, "WA2 project root differs from runtime") + self.md_binding = base_config.md_binding + self.md_null_path = base_config.md_null_path + self.md_null_sha256 = base_config.md_null_sha256 + self.md_null_scale = base_config.md_null_scale + self.minimum_gpu_memory_mib = int(self.manifest["route"]["minimum_gpu_memory_mib"]) + + +class MatchedWeightExecutor(r3.MDExecutor): + def __init__(self, *, objective_coefficients: Mapping[str, float], **kwargs: Any) -> None: + super().__init__(**kwargs) + require(self.cell_id == CELL_ID, "WA2 executor escaped A1111") + require(set(self.coefficients) == set(objective_coefficients), "WA2 objective inventory changed") + require( + any(dict(objective_coefficients) == dict(value) for value in COEFFICIENTS_BY_POLICY.values()), + "WA2 objective coefficients are not frozen", + ) + self.coefficients = dict(objective_coefficients) + + def execute_step(self, **kwargs: Any) -> dict[str, Any]: + true_scales = self.null_scales + self.null_scales = { + objective: true_scales[objective] / self.coefficients[objective] + for objective in mdcore.OBJECTIVES + } + try: + result = super().execute_step(**kwargs) + finally: + self.null_scales = true_scales + result["objective_coefficients"] = dict(self.coefficients) + return result + + +def fixed_development( + *, + native: Any, + adapter: Any, + executor: MatchedWeightExecutor, + base_cell_id: str, + package: Any, + reviewed_md_parent_ids: Sequence[str], + device: torch.device, +) -> dict[str, Any]: + result = r4.fixed_development( + native=native, + adapter=adapter, + executor=executor, + base_cell_id=base_cell_id, + package=package, + reviewed_md_parent_ids=reviewed_md_parent_ids, + device=device, + ) + weighted = { + objective: float(result["normalized_losses"][objective]) * executor.coefficients[objective] + for objective in mdcore.OBJECTIVES + } + result["weighted_normalized_losses"] = weighted + result["total_normalized_loss"] = math.fsum(weighted.values()) / LOSS_DENOMINATOR + return result + + +def configure_seed(seed: int) -> None: + require(seed in SEED_ORDER, "WA2 seed is not frozen") + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + if torch.cuda.is_available(): + torch.cuda.manual_seed_all(seed) + os.environ.setdefault("CUBLAS_WORKSPACE_CONFIG", ":4096:8") + torch.use_deterministic_algorithms(True) + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + + +def deterministic_md_windows_for_seed( + *, + parent_id: str, + child_row: int, + split: str, + epoch: int, + pretraining_seed: int, +) -> np.ndarray: + """Extend the frozen MD mask stream without changing seed 43 or development.""" + + require(pretraining_seed in SEED_ORDER, "MD window seed is not frozen") + if split == "development" or pretraining_seed == 43: + return LEGACY_MD_WINDOWS( + parent_id=parent_id, + child_row=child_row, + split=split, + epoch=epoch, + ) + require(split == "train" and type(epoch) is int and epoch >= 0, "MD train window request changed") + payload = ( + f"{MD_SEEDED_WINDOW_SCHEMA}\0{pretraining_seed}\0{split}\0{epoch}\0" + f"{parent_id}\0{child_row}" + ).encode("ascii") + seed = int.from_bytes(hashlib.sha256(payload).digest()[:8], "big") + return np.sort( + np.random.default_rng(seed).choice( + mdcore.MD_WINDOW_COUNT, + size=mdcore.MD_MASKED_WINDOWS, + replace=False, + ) + ) + + +class SeedParameterizedMDPackage(mdcore.MDTemporal20x6Package): + def __init__(self, binding: Any, *, pretraining_seed: int) -> None: + require(pretraining_seed in SEED_ORDER, "MD package seed is not frozen") + super().__init__(binding) + self.pretraining_seed = pretraining_seed + + def collate(self, parent_ids: Sequence[str], *, split: str, epoch: int, device: torch.device): + require(mdcore._deterministic_windows is LEGACY_MD_WINDOWS, "MD window selector is already patched") + + def selected_windows(*, parent_id: str, child_row: int, split: str, epoch: int) -> np.ndarray: + return deterministic_md_windows_for_seed( + parent_id=parent_id, + child_row=child_row, + split=split, + epoch=epoch, + pretraining_seed=self.pretraining_seed, + ) + + mdcore._deterministic_windows = selected_windows + try: + tensors, base_identity = super().collate( + parent_ids, + split=split, + epoch=epoch, + device=device, + ) + finally: + mdcore._deterministic_windows = LEGACY_MD_WINDOWS + if split == "development" or self.pretraining_seed == 43: + return tensors, base_identity + identity = mdcore.canonical_sha256( + { + "base_batch_identity_sha256": base_identity, + "pretraining_seed": self.pretraining_seed, + "split": split, + "epoch": epoch, + }, + domain=MD_SEEDED_BATCH_SCHEMA, + ) + return tensors, identity + + +def retarget_real_planner_seed(*, planner: Any, r5_module: Any, seed: int) -> Any: + """Retarget the actual loaded R5 and predecessor verifier, then return a restore hook.""" + + require(seed in SEED_ORDER, "planner seed is not frozen") + require(r5_module._planner is planner, "R5 planner module identity changed") + predecessor = planner._r4 + require( + planner.COMMON_SEED == predecessor.COMMON_SEED == r5_module.COMMON_SEED == 43, + "R5 planner predecessor seed boundary changed", + ) + planner.COMMON_SEED = seed + predecessor.COMMON_SEED = seed + r5_module.COMMON_SEED = seed + + def restore() -> None: + planner.COMMON_SEED = 43 + predecessor.COMMON_SEED = 43 + r5_module.COMMON_SEED = 43 + + return restore + + +def make_seed_parameterized_adapter( + *, + native: Any, + r8: Any, + static_bundle: Any, + seed: int, +) -> tuple[Any, Any]: + """Retarget every frozen native training RNG stream to one declared seed.""" + + require(seed in SEED_ORDER, "WA2 adapter seed is not frozen") + adapter_module = r8._adapter_r3 + predecessor_module = adapter_module._r2 + planner = predecessor_module._planner + r5_module = predecessor_module.R5_EXECUTOR_MODULE + require( + adapter_module.COMMON_SEED + == predecessor_module.COMMON_SEED + == native.COMMON_SEED + == planner.COMMON_SEED + == planner._r4.COMMON_SEED + == r5_module.COMMON_SEED + == 43, + "WA2 predecessor seed boundary changed", + ) + base = native._make_static_adapter_class(r8, static_bundle) + + class SeedParameterizedAdapter(base): + def __init__(self) -> None: + self.pretraining_seed = seed + super().__init__() + + def contract_payload(self) -> dict[str, Any]: + payload = dict(super().contract_payload()) + predecessor_seed = payload.pop("common_seed") + require(predecessor_seed == 43, "WA2 predecessor adapter seed changed") + processing = dict(payload["processing_contract"]) + processing.update( + { + "sequence": "frozen R4 train stream parameterized by the declared upstream seed; fixed development seed 0", + "ms": "frozen MS-V3 train selection and mask streams parameterized by the declared upstream seed; fixed development seed 0", + "static": "frozen final static token stream parameterized by the declared upstream seed; fixed development seed 0", + } + ) + payload.update( + { + "schema": ADAPTER_SCHEMA, + "status": "WA2_SEED_PARAMETERIZED_SUCCESSOR", + "predecessor_common_seed": predecessor_seed, + "common_seed": self.pretraining_seed, + "successor_source_sha256": sha256_file(Path(__file__).absolute()), + "processing_contract": processing, + "seed_parameterization": { + "model_rng_seed": self.pretraining_seed, + "r5_epoch_plan_seed": self.pretraining_seed, + "sequence_train_mask_seed": self.pretraining_seed, + "ms_train_selection_and_mask_seed": self.pretraining_seed, + "static_train_mask_seed": self.pretraining_seed, + "fixed_development_seed": 0, + }, + "matched_weight_policies": [WA1_POLICY, WA2_POLICY], + } + ) + return payload + + @property + def contract_sha256(self) -> str: + return mdcore.canonical_sha256(self.contract_payload(), domain=ADAPTER_SCHEMA) + + adapter = SeedParameterizedAdapter() + original_predecessor_seed = predecessor_module.COMMON_SEED + original_native_seed = native.COMMON_SEED + restore_planner_seed = None + try: + restore_planner_seed = retarget_real_planner_seed( + planner=planner, + r5_module=r5_module, + seed=seed, + ) + predecessor_module.COMMON_SEED = seed + native.COMMON_SEED = seed + train_masker = adapter._train_masker + require( + train_masker.split == "train" and train_masker.seed == 43 and train_masker.epoch == 0, + "WA2 predecessor sequence train masker changed", + ) + require(getattr(train_masker, "_inner", None) is not None, "WA2 sequence masker boundary changed") + train_masker._inner.seed = seed + require(train_masker.seed == seed, "WA2 sequence train seed parameterization failed") + require(adapter._development_masker.seed == 0, "WA2 fixed development seed changed") + adapter._ms_epoch = -1 + adapter._ms_epoch_plan = () + adapter._ms_epoch_by_parent = MappingProxyType({}) + adapter._contract_sha256_cached = adapter.contract_sha256 + except BaseException: + predecessor_module.COMMON_SEED = original_predecessor_seed + native.COMMON_SEED = original_native_seed + if restore_planner_seed is not None: + restore_planner_seed() + with suppress(Exception): + adapter.close() + raise + + def restore() -> None: + predecessor_module.COMMON_SEED = original_predecessor_seed + native.COMMON_SEED = original_native_seed + assert restore_planner_seed is not None + restore_planner_seed() + + return adapter, restore + + +def claim_cell( + root: Path, + *, + config: WA2Launch, + task_id: int, + seed: int, + loss_policy: str, +) -> None: + path = root / "review_md20x6_wa2_run_claim.json" + job_id = os.environ.get("SLURM_ARRAY_JOB_ID", os.environ.get("SLURM_JOB_ID", "local")) + value = { + "schema": CLAIM_SCHEMA, + "semantic_array_id": config.semantic_array_id, + "cell_id": CELL_ID, + "array_task_id": task_id, + "pretraining_seed": seed, + "first_array_job_id": job_id, + "loss_policy": loss_policy, + "manifest_sha256": config.sha256, + } + value["claim_sha256"] = mdcore.canonical_sha256(value, domain=CLAIM_SCHEMA) + payload = canonical_bytes(value) + try: + with path.open("xb") as handle: + os.fchmod(handle.fileno(), 0o600) + handle.write(payload) + handle.flush() + os.fsync(handle.fileno()) + except FileExistsError: + require(path.is_file() and not path.is_symlink(), "WA2 claim is unsafe") + require(json.loads(path.read_text(encoding="ascii")) == value, "WA2 output belongs to another job") + + +def create_or_resume_cell( + root: Path, + *, + config: WA2Launch, + task_id: int, + seed: int, + loss_policy: str, +) -> None: + claim = root / "review_md20x6_wa2_run_claim.json" + try: + root.mkdir(parents=True, exist_ok=False) + except FileExistsError: + require(root.is_dir() and not root.is_symlink() and claim.is_file(), "WA2 output root is occupied") + claim_cell( + root, + config=config, + task_id=task_id, + seed=seed, + loss_policy=loss_policy, + ) + + +def run(arguments: argparse.Namespace) -> Mapping[str, Any]: + config = WA2Launch(arguments.manifest.absolute(), arguments.manifest_sha256) + require(arguments.array_task_id in TASK_TO_ARM_SEED, "WA2 array task must be 0..4") + task_id = int(arguments.array_task_id) + loss_policy, seed = TASK_TO_ARM_SEED[task_id] + objective_coefficients = COEFFICIENTS_BY_POLICY[loss_policy] + require(os.environ.get("SLURM_ARRAY_TASK_ID") == str(task_id), "Slurm task differs from WA2 task") + array_job_id = os.environ.get("SLURM_ARRAY_JOB_ID", "") + require(array_job_id.isdigit(), "WA2 Slurm array job ID is absent or unsafe") + restart_text = os.environ.get("SLURM_RESTART_COUNT", "0") + require(restart_text.isdigit() and int(restart_text) <= 2, "WA2 restart count is unsafe") + actual_slurm_route = r3.validate_submission_route(config.value["submission_routes"], task_id) + configure_seed(seed) + r3.STOP_REQUESTED = False + require(torch.cuda.is_available(), "WA2 training requires CUDA") + device = torch.device("cuda:0") + device_properties = torch.cuda.get_device_properties(device) + require( + int(device_properties.total_memory) >= config.minimum_gpu_memory_mib * 1024 * 1024, + "WA2 GPU memory is below the frozen minimum", + ) + package = SeedParameterizedMDPackage(config.md_binding, pretraining_seed=seed) + with r3.native_authority(config, static_active=True) as (native, r8, static_bundle, _runner): + require(static_bundle is not None, "WA2 static bundle is absent") + adapter, restore_adapter_seed = make_seed_parameterized_adapter( + native=native, + r8=r8, + static_bundle=static_bundle, + seed=seed, + ) + try: + native_train_ids = tuple(row.parent_id for row in adapter.train_rows) + native_dev_ids = tuple(row.parent_id for row in adapter.development_rows) + reviewed_train = package.native_intersection_parent_ids_for_role("pretraining_train", native_train_ids) + reviewed_dev = package.native_intersection_parent_ids_for_role("pretraining_development", native_dev_ids) + require( + {row.parent_id for row in adapter.train_rows if row.parent_id in package.parent_row_by_id} + == set(reviewed_train), + "WA2 native and MD train rosters differ", + ) + require( + {row.parent_id for row in adapter.development_rows if row.parent_id in package.parent_row_by_id} + == set(reviewed_dev), + "WA2 native and MD development rosters differ", + ) + r5 = r8._core._r6._r5 + base_config = r8.NativeEightConfig(cell_id=BASE_CELL_ID, seq_vocab_size=int(r5.SEQUENCE_VOCAB_SIZE)) + model_class = mdcore.make_md_enabled_composite_class(r5) + model = model_class(base_config, md_cell_id=CELL_ID, md_temporal_size=128) + r8._install_model_bridge(model, adapter) + model.to(device) + executor = MatchedWeightExecutor( + model=model, + r5=r5, + md_cell_id=CELL_ID, + static_null_scale=float(static_bundle.null_scale), + md_null_scale=config.md_null_scale, + objective_coefficients=objective_coefficients, + ) + initial_model_sha = r5._model_state_sha256(model) + params = mdcore.parameter_summary(model) + attempt_identity = { + "slurm_job_id": os.environ.get("SLURM_JOB_ID", "local"), + "slurm_array_job_id": os.environ.get("SLURM_ARRAY_JOB_ID"), + "slurm_array_task_id": os.environ.get("SLURM_ARRAY_TASK_ID"), + "slurm_restart_count": int(os.environ.get("SLURM_RESTART_COUNT", "0")), + "device": { + "name": str(device_properties.name), + "compute_capability": [device_properties.major, device_properties.minor], + "total_memory_bytes": int(device_properties.total_memory), + "cuda_visible_devices": os.environ.get("CUDA_VISIBLE_DEVICES"), + }, + "actual_slurm_route": actual_slurm_route, + } + attempt_identity["attempt_sha256"] = mdcore.canonical_sha256( + attempt_identity, domain="bertose-review-md20x6-a1111-wa2-attempt-r1" + ) + run_identity = { + "schema": SCHEMA, + "semantic_array_id": config.semantic_array_id, + "md_cell_id": CELL_ID, + "base_control_cell_id": BASE_CELL_ID, + "loss_policy": loss_policy, + "coefficients": dict(objective_coefficients), + "loss_denominator": LOSS_DENOMINATOR, + "pretraining_seed": seed, + "maximum_epochs": MAX_EPOCHS, + "patience": PATIENCE, + "selection_rule": "strict_lower_earliest_tie", + "attribution_claim": ATTRIBUTION_CLAIM, + "evaluation_populations": list(EVALUATION_POPULATIONS), + "manifest_sha256": config.sha256, + "owner_decision_sha256": config.manifest["source_bindings"]["owner_decision"]["sha256"], + "base_launch_config_sha256": config.manifest["base_launch"]["sha256"], + "core_source_sha256": sha256_file(Path(mdcore.__file__)), + "runner_source_sha256": sha256_file(Path(__file__).absolute()), + "native_launch_sha256": r3.NATIVE_LAUNCH_SHA256, + "native_adapter_contract_sha256": adapter.contract_sha256, + "native_adapter_contract": adapter.contract_payload(), + "static_binding_sha256": static_bundle.binding_sha256, + "md_package_summary_sha256": config.md_binding.summary_sha256, + "md_null_receipt_sha256": config.md_null_sha256, + "md_training_window_policy": { + "schema": MD_SEEDED_WINDOW_SCHEMA, + "pretraining_seed": seed, + "seed43_legacy_exact": True, + "fixed_development_seed": 0, + }, + "md_native_intersection_rosters": { + role: {"count": mdcore.NATIVE_INTERSECTION_COUNT[role], "sha256": mdcore.NATIVE_INTERSECTION_ROSTER_SHA256[role]} + for role in mdcore.NATIVE_INTERSECTION_COUNT + }, + "optimizer_contract_sha256": executor.optimizer_contract_sha256, + "initial_model_state_sha256": initial_model_sha, + "parameter_summary": params, + "precision": "fp32_no_amp", + "completed_epoch_resume": True, + "heldout_access": False, + "hpo": False, + } + run_sha = mdcore.canonical_sha256(run_identity, domain=SCHEMA) + arm_label = "wa1" if loss_policy == WA1_POLICY else "wa2" + cell_root = config.output_root / ( + f"review_md20x6_{config.semantic_array_id}_{CELL_ID}_{arm_label}_seed{seed}" + ) + create_or_resume_cell( + cell_root, + config=config, + task_id=task_id, + seed=seed, + loss_policy=loss_policy, + ) + attempt_path = cell_root / ( + f"review_md20x6_wa2_attempt_{attempt_identity['slurm_job_id']}_" + f"r{attempt_identity['slurm_restart_count']}.json" + ) + r3.atomic_bytes(attempt_path, canonical_bytes(attempt_identity)) + store = r3.CheckpointStore(cell_root / "review_checkpoints", cell_id=CELL_ID, run_sha256=run_sha) + selection: dict[str, Any] = { + "completed_epochs": 0, + "best_epoch": None, + "best_loss": None, + "epochs_without_improvement": 0, + "stop_reason": None, + } + history: list[dict[str, Any]] = [] + if store.exists(): + checkpoint = store.load_latest(device) + require(checkpoint["schema"] == r3.CHECKPOINT_SCHEMA, "WA2 checkpoint schema changed") + require(checkpoint["run_identity_sha256"] == run_sha, "WA2 checkpoint identity changed") + model.load_state_dict(checkpoint["model_state"], strict=True) + executor.optimizer.load_state_dict(checkpoint["optimizer_state"]) + selection = copy.deepcopy(checkpoint["selection"]) + history = copy.deepcopy(checkpoint["development_history"]) + previous = adapter.build_epoch_plan(int(selection["completed_epochs"]) - 1) + adapter.restore_resume_cursor(checkpoint["adapter_cursor"], plan=previous, cell_id=BASE_CELL_ID) + r3.restore_rng(checkpoint["rng_state"]) + signal.signal(signal.SIGTERM, r3.stop_handler) + if hasattr(signal, "SIGUSR1"): + signal.signal(signal.SIGUSR1, r3.stop_handler) + while selection["stop_reason"] is None: + epoch = int(selection["completed_epochs"]) + plan = adapter.build_epoch_plan(epoch) + step_chain = [] + for step_index in range(plan.optimizer_step_count): + materialized = adapter.materialize_training_step( + plan=plan, step_index=step_index, cell_id=BASE_CELL_ID, device=device + ) + micros, native_identity = native._verify_materialized_step( + r8, + value=materialized, + adapter=adapter, + plan=plan, + step_index=step_index, + cell_id=BASE_CELL_ID, + ) + enriched, md_identities = r3.enrich_micros( + r8=r8, + micros=micros, + package=package, + split="train", + epoch=epoch, + device=device, + ) + diagnostic = executor.execute_step( + plan=plan, step_index=step_index, micros=enriched, package=package + ) + step_identity = mdcore.canonical_sha256( + {"native": native_identity, "md_micros": list(md_identities), "diagnostic": diagnostic}, + domain="bertose-review-md20x6-a1111-wa2-training-step-r1", + ) + step_chain.append(step_identity) + if step_index % 25 == 0: + print(json.dumps({"event": "training_heartbeat", "cell": CELL_ID, "loss_policy": loss_policy, "seed": seed, "epoch": epoch, **diagnostic}, sort_keys=True), flush=True) + if r3.STOP_REQUESTED: + raise r3.MDTrainingError( + "termination requested; latest completed matched-weight epoch remains authoritative" + ) + development = fixed_development( + native=native, + adapter=adapter, + executor=executor, + base_cell_id=BASE_CELL_ID, + package=package, + reviewed_md_parent_ids=reviewed_dev, + device=device, + ) + next_selection, improved = r3.selection_next(selection, development["total_normalized_loss"]) + history.append( + { + "epoch": next_selection["completed_epochs"], + "development": development, + "improved": improved, + "step_identity_chain_sha256": mdcore.canonical_sha256( + step_chain, domain="bertose-review-md20x6-a1111-wa2-epoch-chain-r1" + ), + } + ) + cursor = adapter.resume_cursor( + plan=plan, next_optimizer_step=plan.optimizer_step_count, cell_id=BASE_CELL_ID + ) + checkpoint = { + "schema": r3.CHECKPOINT_SCHEMA, + "run_identity_sha256": run_sha, + "md_cell_id": CELL_ID, + "base_cell_id": BASE_CELL_ID, + "selection": next_selection, + "development_history": history, + "adapter_cursor": cursor, + "model_state": copy.deepcopy(model.state_dict()), + "optimizer_state": copy.deepcopy(executor.optimizer.state_dict()), + "rng_state": r3.rng_state(), + } + checkpoint_sha = store.commit( + checkpoint, + improved=improved, + epoch=next_selection["completed_epochs"], + dev_loss=development["total_normalized_loss"], + ) + selection = next_selection + print(json.dumps({"event": "completed_epoch", "cell": CELL_ID, "loss_policy": loss_policy, "seed": seed, "selection": selection, "development": development, "checkpoint_sha256": checkpoint_sha}, sort_keys=True), flush=True) + final = { + "schema": FINAL_SCHEMA, + "status": "PASS_TRAINING_COMPLETE", + "run_identity": run_identity, + "run_identity_sha256": run_sha, + "terminal_attempt_identity": attempt_identity, + "selection": selection, + "development_history": history, + } + final["receipt_sha256"] = mdcore.canonical_sha256(final, domain=FINAL_SCHEMA) + r3.atomic_bytes(cell_root / "review_md20x6_wa2_final_receipt.json", canonical_bytes(final)) + return MappingProxyType(final) + finally: + close = getattr(adapter, "close", None) + try: + if callable(close): + close() + finally: + restore_adapter_seed() + + +def self_check(manifest_path: Path, manifest_sha256: str) -> Mapping[str, Any]: + value = load_manifest(manifest_path.absolute(), manifest_sha256) + require(value["source_bindings"]["wa2_runner"]["sha256"] == sha256_file(Path(__file__).absolute()), "WA2 runner self-binding changed") + require( + TASK_TO_ARM_SEED + == { + 0: (WA2_POLICY, 43), + 1: (WA1_POLICY, 42), + 2: (WA2_POLICY, 42), + 3: (WA1_POLICY, 44), + 4: (WA2_POLICY, 44), + }, + "matched WA1/WA2 task mapping changed", + ) + example = {objective: 1.0 for objective in mdcore.OBJECTIVES} + for coefficients in COEFFICIENTS_BY_POLICY.values(): + weighted = math.fsum( + example[name] * coefficients[name] for name in mdcore.OBJECTIVES + ) / LOSS_DENOMINATOR + require(weighted == 1.0, "matched normalized-unit invariant changed") + return MappingProxyType( + { + "schema": "bertose_review_md_temporal_20x6_a1111_wa2_self_check_20260811_r1", + "status": "PASS", + "manifest_identity_sha256": value["manifest_identity_sha256"], + "seed_order": list(SEED_ORDER), + "task_to_arm_seed": { + str(task): {"loss_policy": policy, "pretraining_seed": seed} + for task, (policy, seed) in TASK_TO_ARM_SEED.items() + }, + "coefficients_by_policy": { + policy: dict(coefficients) + for policy, coefficients in COEFFICIENTS_BY_POLICY.items() + }, + } + ) + + +def main(argv: Optional[Sequence[str]] = None) -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--manifest", type=Path, default=DEFAULT_MANIFEST) + parser.add_argument("--manifest-sha256", required=True) + parser.add_argument("--array-task-id", type=int) + parser.add_argument("--self-check", action="store_true") + arguments = parser.parse_args(argv) + require(SHA_RE.fullmatch(arguments.manifest_sha256) is not None, "WA2 manifest hash is invalid") + if arguments.self_check: + result = self_check(arguments.manifest, arguments.manifest_sha256) + else: + require(arguments.array_task_id is not None, "WA2 array task is required") + result = run(arguments) + print(json.dumps(dict(result), sort_keys=True), flush=True) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/submit_review_md_temporal_20x6_a1111_wa2_20260811_r1.sbatch b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/submit_review_md_temporal_20x6_a1111_wa2_20260811_r1.sbatch new file mode 100644 index 0000000000000000000000000000000000000000..bd1cbb57c519d185b8467a556bae2aaf45586501 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/submit_review_md_temporal_20x6_a1111_wa2_20260811_r1.sbatch @@ -0,0 +1,114 @@ +#!/bin/bash +#SBATCH --job-name=review-md20x6-a1111-wa2-r2 +#SBATCH --partition=scavenger +#SBATCH --account=ratul-scavenger +#SBATCH --qos=scavenger +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=4 +#SBATCH --gres=gpu:1 +#SBATCH --mem=144G +#SBATCH --time=5-00:00:00 +#SBATCH --nodelist=nova21-gpu-[8,12],nova22-gpu-[2-3,5],nova25-gpu-4 +#SBATCH --exclude=nova18-gpu-[1-5],nova18-singularity,nova20-frost-1,nova20-matrix,nova21-gpu-10,nova26-gpu-1 +#SBATCH --requeue +#SBATCH --open-mode=append +#SBATCH --export=NONE +#SBATCH --chdir=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc +#SBATCH --output=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md20x6_a1111_wa2_r2_%A_%a.out +#SBATCH --error=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md20x6_a1111_wa2_r2_%A_%a.err + +set -euo pipefail +umask 077 + +PROJECT_ROOT=/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc +PREPARATION_ROOT=${PROJECT_ROOT}/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation +OUTPUT_ROOT=${PROJECT_ROOT}/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production +PYTHON=/work/ratul1/supantha/miniconda3/bin/python3.10 +RUNNER=${PREPARATION_ROOT}/run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py +MANIFEST=${PREPARATION_ROOT}/review_md_temporal_20x6_a1111_wa2_manifest_20260811_r1.json +TEST=${PREPARATION_ROOT}/test_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py + +RUNNER_SHA256=dd74253863f39150af4ddc7e8d48c0a366e1f327c30aa50e0748078330b97b85 +MANIFEST_SHA256=600144a7f5b893958d629083a3a9266eec980765218408d2d51db72b73c1e506 +TEST_SHA256=0e0bcd11d6e19d0e94d8f229e7adf1c255d3eb4c891b43965d8cf991ec748f9d + +for path in "${RUNNER}" "${MANIFEST}" "${TEST}"; do + test -f "${path}" + test ! -L "${path}" +done +test "$(sha256sum "${RUNNER}" | awk '{print $1}')" = "${RUNNER_SHA256}" +test "$(sha256sum "${MANIFEST}" | awk '{print $1}')" = "${MANIFEST_SHA256}" +test "$(sha256sum "${TEST}" | awk '{print $1}')" = "${TEST_SHA256}" + +case "${SLURM_ARRAY_TASK_ID:?}" in + 0) + test "${SLURM_ARRAY_TASK_MIN:?}:${SLURM_ARRAY_TASK_MAX:?}:${SLURM_ARRAY_TASK_COUNT:?}" = 0:0:1 + ARM=wa2 + SEED=43 + ;; + 1) + test "${SLURM_ARRAY_TASK_MIN:?}:${SLURM_ARRAY_TASK_MAX:?}:${SLURM_ARRAY_TASK_COUNT:?}" = 1:4:4 + ARM=wa1 + SEED=42 + ;; + 2) + test "${SLURM_ARRAY_TASK_MIN:?}:${SLURM_ARRAY_TASK_MAX:?}:${SLURM_ARRAY_TASK_COUNT:?}" = 1:4:4 + ARM=wa2 + SEED=42 + ;; + 3) + test "${SLURM_ARRAY_TASK_MIN:?}:${SLURM_ARRAY_TASK_MAX:?}:${SLURM_ARRAY_TASK_COUNT:?}" = 1:4:4 + ARM=wa1 + SEED=44 + ;; + 4) + test "${SLURM_ARRAY_TASK_MIN:?}:${SLURM_ARRAY_TASK_MAX:?}:${SLURM_ARRAY_TASK_COUNT:?}" = 1:4:4 + ARM=wa2 + SEED=44 + ;; + *) exit 64 ;; +esac +case "${SLURM_RESTART_COUNT:-0}" in + 0|1|2) ;; + *) exit 66 ;; +esac +test "${SLURM_NTASKS:?}" = 1 +test "${SLURM_NNODES:?}" = 1 +test "${SLURM_CPUS_PER_TASK:?}" = 4 +test "${SLURM_GPUS_ON_NODE:?}" = 1 +test "${SLURM_JOB_PARTITION:?}:${SLURM_JOB_ACCOUNT:?}:${SLURM_JOB_QOS:?}" = scavenger:ratul-scavenger:scavenger +case "${SLURMD_NODENAME:?}" in + nova21-gpu-8|nova21-gpu-12|nova22-gpu-2|nova22-gpu-3|nova22-gpu-5|nova25-gpu-4) ;; + *) exit 65 ;; +esac +[[ "${CUDA_VISIBLE_DEVICES:?}" != *,* ]] + +CELL_ROOT=${OUTPUT_ROOT}/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_${ARM}_seed${SEED} +if test -e "${CELL_ROOT}" || test -L "${CELL_ROOT}"; then + test -d "${CELL_ROOT}" + test ! -L "${CELL_ROOT}" + test -f "${CELL_ROOT}/review_md20x6_wa2_run_claim.json" + test ! -L "${CELL_ROOT}/review_md20x6_wa2_run_claim.json" +fi +test ! -e "${CELL_ROOT}/review_md20x6_wa2_final_receipt.json" +test ! -L "${CELL_ROOT}/review_md20x6_wa2_final_receipt.json" + +export PYTHONNOUSERSITE=1 PYTHONHASHSEED=0 PYTHONDONTWRITEBYTECODE=1 +export PYTHONUNBUFFERED=1 CUDA_DEVICE_ORDER=PCI_BUS_ID +export CUBLAS_WORKSPACE_CONFIG=:4096:8 OMP_NUM_THREADS=4 MKL_NUM_THREADS=4 + +"${PYTHON}" -I -B -W error "${TEST}" +"${PYTHON}" -I -B -W error "${RUNNER}" \ + --manifest "${MANIFEST}" \ + --manifest-sha256 "${MANIFEST_SHA256}" \ + --self-check +GPU_MEMORY_MIB=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits | head -n 1 | tr -d ' ') +test "${GPU_MEMORY_MIB}" -ge 80000 +printf 'slurm_script_sha256=%s\n' "$(sha256sum "$0" | awk '{print $1}')" +nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv,noheader + +exec "${PYTHON}" -I -B -W error "${RUNNER}" \ + --manifest "${MANIFEST}" \ + --manifest-sha256 "${MANIFEST_SHA256}" \ + --array-task-id "${SLURM_ARRAY_TASK_ID}" diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/__init__.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..cfbe076d3f71ed3837944bc9ee45297451c10a47 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/__init__.py @@ -0,0 +1,2 @@ +"""Reviewed MD temporal 20 x 6 end-to-end runtime.""" + diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/review_md_temporal_20x6_core_r3.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/review_md_temporal_20x6_core_r3.py new file mode 100644 index 0000000000000000000000000000000000000000..ace10633ce10df4ed1ec2f010fa42061d9d6b893 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/review_md_temporal_20x6_core_r3.py @@ -0,0 +1,999 @@ +"""MD temporal package, encoder, and native-composite successor. + +The implementation reuses the exact native-eight sequence, topology, MS, and +static modules. It adds one ordered temporal branch and expands only the new +MD-on experiment family's fusion input from three to four fixed 768-wide slots. +""" + +from __future__ import annotations + +import csv +from dataclasses import dataclass +import gzip +import hashlib +import json +from pathlib import Path +from types import MappingProxyType, ModuleType +from typing import Any, Mapping, Optional, Sequence + +import numpy as np +import torch +from torch import nn + + +SCHEMA = "bertose_review_md_temporal_20x6_core_20260802_r3" +PACKAGE_SCHEMA = "review_md_parent_temporal_20x6_v2" +CORRECTED_OVERLAY_SCHEMA = "review_md_temporal_20x9_v2_charge_corrected_overlay" +MD_CELL_ORDER = ( + "A0001", + "A1001", + "A0101", + "A0011", + "A1101", + "A1011", + "A0111", + "A1111", +) +BASE_CELL_BY_MD_CELL = { + "A0001": "A000", + "A1001": "A100", + "A0101": "A010", + "A0011": "A001", + "A1101": "A110", + "A1011": "A101", + "A0111": "A011", + "A1111": "A111", +} +OBJECTIVES = ("sequence", "topology", "ms", "static", "md") +LOSS_DENOMINATOR = 5 +MD_WINDOW_COUNT = 20 +MD_FEATURE_COUNT = 6 +MD_MASKED_WINDOWS = 3 +ROLE_CONTRIBUTOR_FIELD = MappingProxyType( + { + "pretraining_train": "md_pretraining_train_contributor", + "pretraining_development": "md_pretraining_development_contributor", + } +) +DECLARED_ROLE_COUNT = MappingProxyType( + {"pretraining_train": 22914, "pretraining_development": 5074} +) +DECLARED_ROLE_ROSTER_SHA256 = MappingProxyType( + { + "pretraining_train": "052898ac01e3939d1a9c7229085c9702ce71e96c3da347cb741b18b8e6d06730", + "pretraining_development": "d68ff3b8c24b4a7cc5e3751fb9d30b3c932235d838856be9023340a81f337e42", + } +) +NATIVE_INTERSECTION_COUNT = MappingProxyType( + {"pretraining_train": 22872, "pretraining_development": 5066} +) +NATIVE_INTERSECTION_ROSTER_SHA256 = MappingProxyType( + { + "pretraining_train": "6efa5bd7ff81f9b49aab026d44d613765041dc5ea10e116059c9477650f7403a", + "pretraining_development": "b94e6907dc441597ee7ea098894de9ffd7cfe71a61b9ae3a0489f5e1b73e79d8", + } +) + + +class MDTemporal20x6Error(RuntimeError): + """Raised when an MD package, tensor, model, or identity drifts.""" + + +def require(condition: bool, message: str) -> None: + if not condition: + raise MDTemporal20x6Error(message) + + +def sha256_file(path: Path) -> str: + digest = hashlib.sha256() + with Path(path).open("rb") as handle: + for block in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + +def canonical_bytes(value: object) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def canonical_sha256(value: object, *, domain: str) -> str: + return hashlib.sha256(domain.encode("ascii") + b"\0" + canonical_bytes(value)).hexdigest() + + +def corrected_overlay_binding(summary: Mapping[str, Any]) -> Mapping[str, Any]: + expected = { + "schema": CORRECTED_OVERLAY_SCHEMA, + "status": "PASS", + "state_count": 47063, + "affected_state_count": 9943, + "unaffected_state_count": 37120, + "unaffected_state_tensor_values_verified_unchanged": True, + "tensor_shape": [47063, 20, 9], + } + overlay = summary.get("corrected_overlay") + require(isinstance(overlay, dict), "MD summary lacks corrected-overlay provenance") + require(set(overlay) == set(expected) | {"summary_path", "summary_sha256"}, + "MD corrected-overlay fields changed") + for field, value in expected.items(): + require(overlay.get(field) == value, f"MD corrected-overlay {field} changed") + require( + isinstance(overlay.get("summary_path"), str) and overlay["summary_path"], + "MD corrected-overlay summary path is invalid", + ) + require( + isinstance(overlay.get("summary_sha256"), str) + and len(overlay["summary_sha256"]) == 64, + "MD corrected-overlay summary hash is invalid", + ) + return MappingProxyType(overlay) + + +def coefficients_for_md_cell(cell_id: str) -> Mapping[str, int]: + require(cell_id in BASE_CELL_BY_MD_CELL, f"unknown MD-on cell {cell_id!r}") + topology, ms, static = (int(value) for value in BASE_CELL_BY_MD_CELL[cell_id][1:]) + return MappingProxyType( + {"sequence": 1, "topology": topology, "ms": ms, "static": static, "md": 1} + ) + + +def _deterministic_windows( + *, + parent_id: str, + child_row: int, + split: str, + epoch: int, +) -> np.ndarray: + require(split in {"train", "development"}, "unknown MD split") + effective_epoch = epoch if split == "train" else 0 + payload = f"{SCHEMA}\0{split}\0{effective_epoch}\0{parent_id}\0{child_row}".encode("ascii") + seed = int.from_bytes(hashlib.sha256(payload).digest()[:8], "big") + return np.sort( + np.random.default_rng(seed).choice( + MD_WINDOW_COUNT, + size=MD_MASKED_WINDOWS, + replace=False, + ) + ) + + +@dataclass(frozen=True, slots=True) +class MDPackageBinding: + model_path: Path + model_sha256: str + index_path: Path + index_sha256: str + ledger_path: Path + ledger_sha256: str + objective_path: Path + objective_sha256: str + summary_path: Path + summary_sha256: str + + +class MDTemporal20x6Package: + """Audited state tensors plus exact parent-to-child lookup.""" + + def __init__(self, binding: MDPackageBinding) -> None: + self.binding = binding + for label, path, expected in ( + ("model", binding.model_path, binding.model_sha256), + ("parent index", binding.index_path, binding.index_sha256), + ("master ledger", binding.ledger_path, binding.ledger_sha256), + ("objective table", binding.objective_path, binding.objective_sha256), + ("summary", binding.summary_path, binding.summary_sha256), + ): + require(path.is_file() and not path.is_symlink(), f"MD {label} is absent or unsafe") + require(sha256_file(path) == expected, f"MD {label} hash changed") + summary_payload = binding.summary_path.read_bytes() + try: + summary = json.loads(summary_payload.decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise MDTemporal20x6Error("MD summary is invalid JSON") from error + require(summary.get("schema") == PACKAGE_SCHEMA, "MD summary schema changed") + require(summary.get("status") == "PASS", "MD summary is not PASS") + require(summary.get("state_tensor_shape") == [47063, 20, 6], "MD tensor shape changed") + require(summary.get("md_parent_count") == 30088, "MD parent count changed") + corrected_overlay_binding(summary) + output_hashes = summary.get("output_sha256", {}) + require( + output_hashes.get(binding.model_path.name) == binding.model_sha256, + "MD summary no longer binds the model", + ) + require( + output_hashes.get(binding.index_path.name) == binding.index_sha256, + "MD summary no longer binds the parent index", + ) + require( + output_hashes.get(binding.ledger_path.name) == binding.ledger_sha256, + "MD summary no longer binds the master ledger", + ) + require( + output_hashes.get(binding.objective_path.name) == binding.objective_sha256, + "MD summary no longer binds the objective table", + ) + with np.load(binding.model_path, allow_pickle=False) as source: + expected_keys = { + "state_parent_row_index", + "parent_child_state_row_index", + "parent_child_present_mask", + "campaign_index", + "qc_dominant_conformer_occupancy", + "child_slot_names", + "window_start_ps", + "window_end_ps", + "state_features_z", + "state_feature_mask", + "feature_mean", + "feature_sd", + "feature_names", + "source_feature_indices", + } + require(set(source.files) == expected_keys, "MD model keys changed") + self.state_features = np.asarray(source["state_features_z"], dtype=np.float32) + self.state_feature_mask = np.asarray(source["state_feature_mask"], dtype=np.uint8) + self.parent_child_rows = np.asarray( + source["parent_child_state_row_index"], dtype=np.int32 + ) + self.parent_child_mask = np.asarray( + source["parent_child_present_mask"], dtype=np.uint8 + ) + self.feature_names = tuple(str(value) for value in source["feature_names"].tolist()) + self.child_slot_names = tuple(str(value) for value in source["child_slot_names"].tolist()) + require(self.state_features.shape == (47063, 20, 6), "MD state tensor shape changed") + require(self.state_feature_mask.shape == self.state_features.shape, "MD masks are misaligned") + require(self.parent_child_rows.shape == (30088, 2), "MD child rows changed") + require(self.parent_child_mask.shape == (30088, 2), "MD child mask changed") + require(np.isfinite(self.state_features).all(), "MD standardized values are nonfinite") + require(np.isin(self.state_feature_mask, (0, 1)).all(), "MD feature mask is nonbinary") + require(np.isin(self.parent_child_mask, (0, 1)).all(), "MD child mask is nonbinary") + require( + np.all(self.state_features[self.state_feature_mask == 0] == 0), + "MD masked values are nonzero", + ) + self.parent_row_by_id = self._load_parent_index(binding.index_path) + require(len(self.parent_row_by_id) == 30088, "MD parent index population changed") + self.summary = MappingProxyType(summary) + + @staticmethod + def _load_parent_index(path: Path) -> Mapping[str, int]: + result: dict[str, int] = {} + with gzip.open(path, "rt", encoding="utf-8", newline="") as handle: + reader = csv.DictReader(handle, delimiter="\t") + require(reader.fieldnames is not None, "MD parent index has no header") + for expected_row, row in enumerate(reader): + require(int(row["md_parent_row_index"]) == expected_row, "MD parent rows reordered") + parent_id = row["parent_glycorpus_id"] + require(parent_id and parent_id not in result, "MD parent ID is blank or duplicated") + result[parent_id] = expected_row + return MappingProxyType(result) + + def available_parent_ids(self, parent_ids: Sequence[str]) -> tuple[str, ...]: + return tuple(parent_id for parent_id in parent_ids if parent_id in self.parent_row_by_id) + + def declared_parent_ids_for_role(self, role: str) -> tuple[str, ...]: + require(role in ROLE_CONTRIBUTOR_FIELD, "unknown reviewed parent role") + contributor_field = ROLE_CONTRIBUTOR_FIELD[role] + result: list[str] = [] + with gzip.open(self.binding.ledger_path, "rt", encoding="utf-8", newline="") as handle: + reader = csv.DictReader(handle, delimiter="\t") + require(reader.fieldnames is not None, "MD master ledger has no header") + require( + { + "parent_glycorpus_id", + "data_role", + "in_a5_parent_partition", + "has_md_completed", + "has_md_a5_objective", + contributor_field, + }.issubset(reader.fieldnames), + "MD role-specific contributor fields changed", + ) + for row in reader: + if ( + row["in_a5_parent_partition"] == "1" + and row["data_role"] == role + and row[contributor_field] == "1" + and row["has_md_completed"] == "1" + and row["has_md_a5_objective"] == "1" + ): + result.append(row["parent_glycorpus_id"]) + require(len(result) == len(set(result)), "MD role ledger duplicates a parent") + result.sort() + require( + len(result) == DECLARED_ROLE_COUNT[role], + f"MD {role} contributor count changed", + ) + require( + canonical_sha256( + result, + domain=f"bertose-review-md20x6-role-roster-r2:{role}", + ) + == DECLARED_ROLE_ROSTER_SHA256[role], + f"MD {role} contributor roster changed", + ) + require(set(result).issubset(self.parent_row_by_id), "MD role ledger has absent tensor parent") + return tuple(result) + + def native_intersection_parent_ids_for_role( + self, + role: str, + native_parent_ids: Sequence[str], + ) -> tuple[str, ...]: + require(role in ROLE_CONTRIBUTOR_FIELD, "unknown native intersection role") + require( + len(native_parent_ids) == len(set(native_parent_ids)), + "native adapter roster duplicates a parent", + ) + declared = set(self.declared_parent_ids_for_role(role)) + result = tuple(sorted(declared.intersection(native_parent_ids))) + require( + len(result) == NATIVE_INTERSECTION_COUNT[role], + f"MD/native {role} intersection count changed", + ) + require( + canonical_sha256( + result, + domain=f"bertose-review-md20x6-native-intersection-r3:{role}", + ) + == NATIVE_INTERSECTION_ROSTER_SHA256[role], + f"MD/native {role} intersection roster changed", + ) + return result + + def collate( + self, + parent_ids: Sequence[str], + *, + split: str, + epoch: int, + device: torch.device, + ) -> tuple[Mapping[str, torch.Tensor], str]: + require(parent_ids and len(set(parent_ids)) == len(parent_ids), "MD batch parents are empty or repeated") + batch_size = len(parent_ids) + values = np.zeros((batch_size, 2, 20, 6), dtype=np.float32) + labels = np.zeros_like(values) + feature_mask = np.zeros_like(values, dtype=np.uint8) + child_mask = np.zeros((batch_size, 2), dtype=np.uint8) + input_mask = np.zeros((batch_size, 2, 20), dtype=np.uint8) + state_rows = np.full((batch_size, 2), -1, dtype=np.int32) + mask_surface: list[dict[str, object]] = [] + for local_parent, parent_id in enumerate(parent_ids): + parent_row = self.parent_row_by_id.get(parent_id) + if parent_row is None: + continue + for child_slot in range(2): + if not self.parent_child_mask[parent_row, child_slot]: + continue + child_row = int(self.parent_child_rows[parent_row, child_slot]) + require(0 <= child_row < self.state_features.shape[0], "MD child row outside tensor") + selected = _deterministic_windows( + parent_id=parent_id, + child_row=child_row, + split=split, + epoch=epoch, + ) + original = self.state_features[child_row] + values[local_parent, child_slot] = original + labels[local_parent, child_slot] = original + feature_mask[local_parent, child_slot] = self.state_feature_mask[child_row] + child_mask[local_parent, child_slot] = 1 + input_mask[local_parent, child_slot, selected] = 1 + values[local_parent, child_slot, selected] = 0.0 + state_rows[local_parent, child_slot] = child_row + mask_surface.append( + { + "parent_id": parent_id, + "child_slot": child_slot, + "state_row": child_row, + "selected_windows": selected.tolist(), + } + ) + parent_available = child_mask.any(axis=1) + tensors = { + "md_values": torch.as_tensor(values, device=device), + "md_feature_mask": torch.as_tensor(feature_mask, dtype=torch.bool, device=device), + "md_child_present_mask": torch.as_tensor(child_mask, dtype=torch.bool, device=device), + "md_state_row_ids": torch.as_tensor(state_rows, dtype=torch.long, device=device), + "md_window_input_mask": torch.as_tensor(input_mask, dtype=torch.bool, device=device), + "md_labels": torch.as_tensor(labels, device=device), + "md_parent_available": torch.as_tensor(parent_available, dtype=torch.bool, device=device), + } + identity = canonical_sha256( + { + "model_sha256": self.binding.model_sha256, + "index_sha256": self.binding.index_sha256, + "split": split, + "effective_epoch": epoch if split == "train" else 0, + "parent_ids": list(parent_ids), + "mask_surface": mask_surface, + }, + domain="bertose-review-md20x6-batch-r3", + ) + return MappingProxyType(tensors), identity + + def null_mse_scale(self, train_parent_ids: Sequence[str]) -> tuple[float, int]: + parents = self.available_parent_ids(train_parent_ids) + require(parents, "no training parents have MD") + parent_losses: list[float] = [] + for parent_id in parents: + parent_row = self.parent_row_by_id[parent_id] + child_losses: list[float] = [] + for child_slot in range(2): + if not self.parent_child_mask[parent_row, child_slot]: + continue + child_row = int(self.parent_child_rows[parent_row, child_slot]) + selected = self.state_feature_mask[child_row].astype(bool) + child_losses.append(float(np.mean(np.square(self.state_features[child_row][selected])))) + require(child_losses, "MD parent has no present child") + parent_losses.append(float(np.mean(child_losses))) + return float(np.mean(np.asarray(parent_losses, dtype=np.float64))), len(parent_losses) + + +class MDTemporalEncoder(nn.Module): + """One small bidirectional GRU over ordered one-nanosecond windows.""" + + def __init__( + self, + *, + output_size: int, + temporal_size: int = 128, + feature_count: int = 6, + dropout: float = 0.1, + layer_norm_eps: float = 1e-12, + ) -> None: + super().__init__() + require(temporal_size > 0 and temporal_size % 2 == 0, "MD temporal width must be positive and even") + self.output_size = output_size + self.temporal_size = temporal_size + self.feature_count = feature_count + self.input_projection = nn.Linear(feature_count * 2, temporal_size) + self.time_embedding = nn.Embedding(MD_WINDOW_COUNT, temporal_size) + self.mask_embedding = nn.Parameter(torch.empty(temporal_size)) + nn.init.zeros_(self.mask_embedding) + self.input_norm = nn.LayerNorm(temporal_size, eps=layer_norm_eps) + self.gru = nn.GRU( + temporal_size, + temporal_size // 2, + num_layers=1, + batch_first=True, + bidirectional=True, + ) + self.output_norm = nn.LayerNorm(temporal_size, eps=layer_norm_eps) + self.dropout = nn.Dropout(dropout) + self.projection = nn.Linear(temporal_size, output_size) + self.reconstruction_head = nn.Linear(temporal_size, feature_count) + self.register_buffer("time_ids", torch.arange(MD_WINDOW_COUNT).view(1, -1)) + + def forward( + self, + *, + values: torch.Tensor, + feature_mask: torch.Tensor, + child_present_mask: torch.Tensor, + window_input_mask: torch.Tensor, + labels: Optional[torch.Tensor], + parent_available: torch.Tensor, + ) -> tuple[torch.Tensor, Optional[torch.Tensor], Optional[torch.Tensor]]: + require(values.ndim == 4 and values.shape[1:] == (2, 20, self.feature_count), "MD values must be [parent,2,20,6]") + require(feature_mask.dtype == torch.bool and feature_mask.shape == values.shape, "MD feature mask changed") + require(child_present_mask.dtype == torch.bool and child_present_mask.shape == values.shape[:2], "MD child mask changed") + require(window_input_mask.dtype == torch.bool and window_input_mask.shape == values.shape[:3], "MD window mask changed") + require(parent_available.dtype == torch.bool and parent_available.shape == (values.shape[0],), "MD availability changed") + require(torch.equal(child_present_mask.any(dim=1), parent_available), "MD child and parent availability disagree") + require(torch.isfinite(values).all().item(), "MD values are nonfinite") + require(not (feature_mask & ~child_present_mask[:, :, None, None]).any().item(), "absent MD child has feature mask") + require(not (window_input_mask & ~child_present_mask[:, :, None]).any().item(), "absent MD child has input mask") + if labels is None: + require(not window_input_mask.any().item(), "MD input mask requires labels") + else: + require(labels.shape == values.shape and torch.isfinite(labels).all().item(), "MD labels changed") + selected_counts = window_input_mask.sum(dim=-1) + require( + torch.equal( + selected_counts[child_present_mask], + torch.full_like(selected_counts[child_present_mask], MD_MASKED_WINDOWS), + ), + "present MD child must mask exactly three windows", + ) + require(not values[window_input_mask].ne(0).any().item(), "masked MD input window is nonzero") + active = child_present_mask.nonzero(as_tuple=False) + parent_pool = values.new_zeros((values.shape[0], self.output_size)) + if active.shape[0] == 0: + empty = values.new_empty((0,)) if labels is not None else None + empty_indices = torch.empty((0,), dtype=torch.long, device=values.device) if labels is not None else None + return parent_pool, empty, empty_indices + active_parent = active[:, 0] + active_child = active[:, 1] + active_values = values[active_parent, active_child] + active_features = feature_mask[active_parent, active_child] + active_windows = window_input_mask[active_parent, active_child] + encoder_input = torch.cat((active_values, active_features.to(active_values.dtype)), dim=-1) + hidden = self.input_projection(encoder_input) + self.time_embedding(self.time_ids[:, : active_values.shape[1]]) + hidden = hidden + active_windows.unsqueeze(-1).to(hidden.dtype) * self.mask_embedding.view(1, 1, -1) + hidden = self.input_norm(hidden) + hidden, _ = self.gru(hidden) + hidden = self.dropout(self.output_norm(hidden)) + child_pool = self.projection(hidden.mean(dim=1)) + parent_pool.index_add_(0, active_parent, child_pool) + child_counts = torch.bincount(active_parent, minlength=values.shape[0]).clamp_min(1) + parent_pool = parent_pool / child_counts.unsqueeze(-1).to(parent_pool.dtype) + if labels is None: + return parent_pool, None, None + predictions = self.reconstruction_head(hidden) + active_labels = labels[active_parent, active_child] + selected = active_windows.unsqueeze(-1) & active_features + scalar_counts = selected.sum(dim=(1, 2)) + require(scalar_counts.gt(0).all().item(), "masked MD child has no valid target") + child_losses = ((predictions - active_labels).square() * selected).sum(dim=(1, 2)) / scalar_counts + parent_sums = child_losses.new_zeros(values.shape[0]).index_add(0, active_parent, child_losses) + observed = torch.bincount(active_parent, minlength=values.shape[0]).gt(0) + parent_losses = parent_sums[observed] / child_counts[observed].to(parent_sums.dtype) + parent_indices = observed.nonzero(as_tuple=False).squeeze(-1) + return parent_pool, parent_losses, parent_indices + + +@dataclass(slots=True) +class MDEnabledNativeOutput: + cell_id: str + sequence_logits: torch.Tensor + sequence_replica_parent_indices: torch.Tensor + shared_parent_hidden: torch.Tensor + topology_token_pair_predictions: Optional[torch.Tensor] + ms_logits: Optional[torch.Tensor] + static_local_logits: Optional[torch.Tensor] + md_parent_pool: torch.Tensor + parent_losses: Mapping[str, Optional[torch.Tensor]] + loss_parent_indices: Mapping[str, Optional[torch.Tensor]] + + +def _state_acquisition_md_fusion( + composite: ModuleType, + *, + base_parent_hidden: torch.Tensor, + static_state_hidden: torch.Tensor, + static_state_pool: torch.Tensor, + static_state_parent_indices: torch.Tensor, + replica_parent_indices: torch.Tensor, + replica_ms_pool: torch.Tensor, + replica_ms_present: torch.Tensor, + md_parent_pool: torch.Tensor, + md_parent_present: torch.Tensor, + fusion: nn.Module, +) -> torch.Tensor: + require(base_parent_hidden.ndim == 3 and base_parent_hidden.shape[0] > 0, "base hidden changed") + batch_size, _, hidden_size = base_parent_hidden.shape + require(md_parent_pool.shape == (batch_size, hidden_size), "MD parent pool shape changed") + require(md_parent_present.shape == (batch_size,), "MD parent presence shape changed") + counts = torch.bincount(static_state_parent_indices.long(), minlength=batch_size) + replica_counts = counts.index_select(0, replica_parent_indices.long()) + effective_counts = replica_counts.clamp_min(1) + replica_axis = torch.arange(replica_parent_indices.numel(), device=replica_parent_indices.device) + combination_replica = torch.repeat_interleave(replica_axis, effective_counts) + total = int(effective_counts.sum().item()) + group_starts = torch.cumsum(effective_counts, dim=0) - effective_counts + within_group = torch.arange(total, device=replica_parent_indices.device) - torch.repeat_interleave(group_starts, effective_counts) + state_starts = torch.cumsum(counts, dim=0) - counts + repeated_state_starts = torch.repeat_interleave( + state_starts.index_select(0, replica_parent_indices.long()), + effective_counts, + ) + combination_has_state = torch.repeat_interleave(replica_counts.gt(0), effective_counts) + combination_state = repeated_state_starts + within_group + combination_parent = replica_parent_indices.index_select(0, combination_replica.long()) + combination_base = base_parent_hidden.index_select(0, combination_parent.long()) + combination_static_pool = base_parent_hidden.new_zeros((total, hidden_size)) + if static_state_hidden.shape[0] > 0 and combination_has_state.any(): + safe_state = combination_state.clamp_max(static_state_hidden.shape[0] - 1) + selected_state_hidden = static_state_hidden.index_select(0, safe_state.long()) + selected_state_pool = static_state_pool.index_select(0, safe_state.long()) + combination_base = torch.where( + combination_has_state.view(-1, 1, 1), selected_state_hidden, combination_base + ) + combination_static_pool = torch.where( + combination_has_state.view(-1, 1), selected_state_pool, combination_static_pool + ) + combination_ms_pool = replica_ms_pool.index_select(0, combination_replica.long()) + combination_ms_present = replica_ms_present.index_select(0, combination_replica.long()) + combination_md_pool = md_parent_pool.index_select(0, combination_parent.long()) + combination_md_present = md_parent_present.index_select(0, combination_parent.long()) + carrier = combination_has_state | combination_ms_present | combination_md_present + residual = combination_base.new_zeros((total, hidden_size)) + if carrier.any(): + carriers = carrier.nonzero(as_tuple=False).squeeze(-1) + fusion_input = torch.cat( + ( + combination_base.index_select(0, carriers)[:, 0], + combination_ms_pool.index_select(0, carriers), + combination_static_pool.index_select(0, carriers), + combination_md_pool.index_select(0, carriers), + ), + dim=-1, + ) + active_residual = fusion(fusion_input) + require(active_residual.shape == (carriers.numel(), hidden_size), "MD fusion residual changed") + residual = residual.index_copy(0, carriers, active_residual) + combination_shared = combination_base + residual.unsqueeze(1) + view_hidden, observed = composite._group_mean_tensor( + combination_shared, + combination_replica, + group_count=replica_parent_indices.numel(), + ) + require(observed.all().item(), "state/acquisition view is incomplete") + return view_hidden + + +def make_md_enabled_composite_class(executor_module: ModuleType) -> type[nn.Module]: + """Bind the MD successor to the exact classes loaded by the native authority.""" + + composite = executor_module._composite + base_class = executor_module.NativeEightCompositeR5 + + class MDEnabledNativeComposite(base_class): + def __init__( + self, + base_config: Any, + *, + md_cell_id: str, + md_temporal_size: int = 128, + ) -> None: + require(md_cell_id in BASE_CELL_BY_MD_CELL, "unknown MD-on model cell") + require(base_config.cell_id == BASE_CELL_BY_MD_CELL[md_cell_id], "MD/base cell mismatch") + super().__init__(base_config) + self.md_cell_id = md_cell_id + self.md_encoder = MDTemporalEncoder( + output_size=base_config.seq_hidden_size, + temporal_size=md_temporal_size, + feature_count=MD_FEATURE_COUNT, + dropout=base_config.hidden_dropout_prob, + layer_norm_eps=base_config.layer_norm_eps, + ) + self.fusion = nn.Sequential( + nn.Linear(base_config.seq_hidden_size * 4, base_config.fusion_hidden_size), + nn.LayerNorm(base_config.fusion_hidden_size, eps=base_config.layer_norm_eps), + nn.GELU(), + nn.Dropout(base_config.hidden_dropout_prob), + nn.Linear(base_config.fusion_hidden_size, base_config.fusion_hidden_size), + ) + self.fusion.apply(self._initialize) + self.md_encoder.apply(self._initialize) + nn.init.normal_(self.md_encoder.mask_embedding, mean=0.0, std=base_config.initializer_range) + for name, parameter in self.md_encoder.gru.named_parameters(): + if "weight" in name: + nn.init.normal_(parameter, mean=0.0, std=base_config.initializer_range) + else: + nn.init.zeros_(parameter) + self._parameter_shape_identity = tuple( + (name, tuple(parameter.shape)) for name, parameter in self.named_parameters() + ) + self._disabled_parameter_names = frozenset( + name for name, parameter in self.named_parameters() if not parameter.requires_grad + ) + + def verify_live_contract(self) -> None: + require(type(self) is MDEnabledNativeComposite, "MD composite cannot be subclassed") + require(self.config.cell_id == BASE_CELL_BY_MD_CELL[self.md_cell_id], "MD cell changed") + require( + tuple((name, tuple(parameter.shape)) for name, parameter in self.named_parameters()) + == self._parameter_shape_identity, + "MD model architecture changed after construction", + ) + for name, parameter in self.named_parameters(): + if name in self._disabled_parameter_names: + require(not parameter.requires_grad, f"disabled parameter re-enabled: {name}") + + def forward( + self, + *, + seq_token_ids: torch.Tensor, + seq_attention_mask: torch.Tensor, + seq_residue_ids: torch.Tensor, + seq_branch_depths: torch.Tensor, + seq_linkage_types: torch.Tensor, + seq_labels: Optional[torch.Tensor] = None, + topology_labels: Optional[torch.Tensor] = None, + topology_available: Optional[torch.Tensor] = None, + ms_token_ids: Optional[torch.Tensor] = None, + ms_attention_mask: Optional[torch.Tensor] = None, + ms_input_mask: Optional[torch.Tensor] = None, + ms_labels: Optional[torch.Tensor] = None, + ms_acquisition_parent_indices: Optional[torch.Tensor] = None, + ms_parent_available: Optional[torch.Tensor] = None, + ms_mode: Optional[str] = None, + static_token_ids: Optional[torch.Tensor] = None, + static_attention_mask: Optional[torch.Tensor] = None, + static_residue_ids: Optional[torch.Tensor] = None, + static_slot_ids: Optional[torch.Tensor] = None, + static_state_mask: Optional[torch.Tensor] = None, + static_state_ids: Optional[torch.Tensor] = None, + static_input_mask: Optional[torch.Tensor] = None, + static_labels: Optional[torch.Tensor] = None, + static_parent_available: Optional[torch.Tensor] = None, + md_values: Optional[torch.Tensor] = None, + md_feature_mask: Optional[torch.Tensor] = None, + md_child_present_mask: Optional[torch.Tensor] = None, + md_state_row_ids: Optional[torch.Tensor] = None, + md_window_input_mask: Optional[torch.Tensor] = None, + md_labels: Optional[torch.Tensor] = None, + md_parent_available: Optional[torch.Tensor] = None, + ) -> MDEnabledNativeOutput: + self.verify_live_contract() + sequence_attention = composite.validate_sequence_surface( + self.config, + token_ids=seq_token_ids, + attention_mask=seq_attention_mask, + residue_ids=seq_residue_ids, + branch_depths=seq_branch_depths, + linkage_types=seq_linkage_types, + labels=seq_labels, + ) + batch_size = seq_token_ids.shape[0] + sequence_hidden = composite._run_layers( + self.sequence_embeddings(seq_token_ids, seq_branch_depths, seq_linkage_types), + sequence_attention, + self.sequence_layers, + ) + topology_predictions = topology_loss = topology_loss_indices = None + topology_bundle = self._bundle_presence( + {"labels": topology_labels, "availability": topology_available}, + "topology target", + ) + if not self.enabled["topology"]: + require(not topology_bundle, "disabled topology branch received payload") + else: + projected = self.topology_projection(sequence_hidden) + pair_hidden = torch.abs(projected.unsqueeze(2) - projected.unsqueeze(1)) + topology_predictions = self.topology_head(pair_hidden).squeeze(-1) + if topology_bundle: + topology_loss, topology_loss_indices = composite.topology_parent_losses_inverse_bpe( + topology_predictions, + sequence_residue_ids=seq_residue_ids, + sequence_attention=sequence_attention, + topology_labels=topology_labels, + topology_available=topology_available, + ) + empty_indices = torch.empty((0,), dtype=torch.long, device=seq_token_ids.device) + cross_state_hidden = sequence_hidden.new_empty((0, *sequence_hidden.shape[1:])) + projected_state_pool = sequence_hidden.new_empty((0, sequence_hidden.shape[-1])) + active_parents = active_states = empty_indices + static_logits = static_loss = static_loss_indices = None + static_core = { + "token_ids": static_token_ids, + "attention": static_attention_mask, + "residues": static_residue_ids, + "slots": static_slot_ids, + "states": static_state_mask, + "state_ids": static_state_ids, + "input_mask": static_input_mask, + "availability": static_parent_available, + } + static_bundle = self._bundle_presence(static_core, "static") + if not self.enabled["static"]: + require(not static_bundle and static_labels is None, "disabled static branch received payload") + else: + require(static_bundle, "enabled static branch requires complete payload") + static_attention = composite.validate_static_surface( + batch_size=batch_size, + token_ids=static_token_ids, + attention_mask=static_attention_mask, + residue_ids=static_residue_ids, + slot_ids=static_slot_ids, + state_mask=static_state_mask, + state_ids=static_state_ids, + input_mask=static_input_mask, + labels=static_labels, + parent_available=static_parent_available, + sequence_residue_ids=seq_residue_ids, + sequence_attention=sequence_attention, + ) + active_coordinates = static_state_mask.nonzero(as_tuple=False) + active_parents, active_states = active_coordinates[:, 0], active_coordinates[:, 1] + if active_coordinates.shape[0] > 0: + active_token_ids = static_token_ids[active_parents, active_states] + active_attention = static_attention[active_parents, active_states] + active_residue_ids = static_residue_ids[active_parents, active_states] + active_slot_ids = static_slot_ids[active_parents, active_states] + active_input_mask = static_input_mask[active_parents, active_states] + static_hidden = composite._run_layers( + self.static_embeddings(active_token_ids, active_slot_ids, active_input_mask), + active_attention, + self.static_layers, + ) + static_logits = self.static_head(static_hidden, active_slot_ids, active_attention) + cross_state_hidden = self.static_cross_attention( + sequence_hidden.index_select(0, active_parents), + static_hidden, + seq_residue_ids.index_select(0, active_parents), + active_residue_ids, + sequence_attention.index_select(0, active_parents), + active_attention, + ) + valid_weights = active_attention.to(static_hidden.dtype).unsqueeze(-1) + state_pool = (static_hidden * valid_weights).sum(dim=1) / valid_weights.sum(dim=1) + projected_state_pool = self.static_projection(state_pool) + if static_labels is not None: + static_loss, static_loss_indices = composite.static_parent_losses( + static_logits, + global_labels=static_labels[active_parents, active_states], + slot_ids=active_slot_ids, + attention_mask=active_attention, + active_parent_indices=active_parents, + active_state_indices=active_states, + batch_size=batch_size, + ) + else: + static_logits = sequence_hidden.new_empty((0, static_token_ids.shape[-1], 1024)) + if static_labels is not None: + static_loss, static_loss_indices = sequence_hidden.new_empty((0,)), empty_indices + ms_logits = ms_loss = ms_loss_indices = None + acquisition_pool = sequence_hidden.new_empty((0, sequence_hidden.shape[-1])) + ms_core = { + "token_ids": ms_token_ids, + "attention": ms_attention_mask, + "input_mask": ms_input_mask, + "parent_indices": ms_acquisition_parent_indices, + "availability": ms_parent_available, + "mode": ms_mode, + } + ms_bundle = self._bundle_presence(ms_core, "MS acquisition") + if not self.enabled["ms"]: + require(not ms_bundle and ms_labels is None, "disabled MS branch received payload") + else: + require(ms_bundle, "enabled MS branch requires complete payload") + ms_attention = composite.validate_ms_surface( + batch_size=batch_size, + token_ids=ms_token_ids, + attention_mask=ms_attention_mask, + input_mask=ms_input_mask, + labels=ms_labels, + acquisition_parent_indices=ms_acquisition_parent_indices, + parent_available=ms_parent_available, + mode=ms_mode, + ) + if ms_token_ids.shape[0] > 0: + ms_hidden = composite._run_layers( + self.ms_embeddings(ms_token_ids, ms_input_mask), + ms_attention, + self.ms_layers, + ) + ms_logits = self.ms_head(ms_hidden) + acquisition_pool = self.ms_projection(composite._first_token_pool(ms_hidden, ms_attention)) + if ms_labels is not None: + ms_loss, ms_loss_indices = composite.ms_parent_losses( + ms_logits, + labels=ms_labels, + attention_mask=ms_attention, + acquisition_parent_indices=ms_acquisition_parent_indices, + batch_size=batch_size, + ) + else: + ms_logits = sequence_hidden.new_empty((0, ms_token_ids.shape[1], 242)) + if ms_labels is not None: + ms_loss, ms_loss_indices = sequence_hidden.new_empty((0,)), empty_indices + md_core = { + "values": md_values, + "feature_mask": md_feature_mask, + "children": md_child_present_mask, + "state_rows": md_state_row_ids, + "input_mask": md_window_input_mask, + "availability": md_parent_available, + } + require(self._bundle_presence(md_core, "MD temporal"), "MD-on cell requires complete MD payload") + require(md_state_row_ids.shape == md_child_present_mask.shape, "MD state rows changed") + require( + torch.equal(md_state_row_ids.ge(0), md_child_present_mask), + "MD state-row sentinels disagree with child presence", + ) + md_parent_pool, md_loss, md_loss_indices = self.md_encoder( + values=md_values, + feature_mask=md_feature_mask, + child_present_mask=md_child_present_mask, + window_input_mask=md_window_input_mask, + labels=md_labels, + parent_available=md_parent_available, + ) + if self.enabled["ms"]: + missing_parents = (~ms_parent_available).nonzero(as_tuple=False).squeeze(-1) + replica_parent_indices = torch.cat((ms_acquisition_parent_indices.long(), missing_parents.long())) + replica_ms_pool = torch.cat( + ( + acquisition_pool, + sequence_hidden.new_zeros((missing_parents.numel(), sequence_hidden.shape[-1])), + ) + ) + replica_ms_present = torch.cat( + ( + torch.ones(ms_acquisition_parent_indices.numel(), dtype=torch.bool, device=seq_token_ids.device), + torch.zeros(missing_parents.numel(), dtype=torch.bool, device=seq_token_ids.device), + ) + ) + else: + replica_parent_indices = torch.arange(batch_size, device=seq_token_ids.device) + replica_ms_pool = sequence_hidden.new_zeros((batch_size, sequence_hidden.shape[-1])) + replica_ms_present = torch.zeros(batch_size, dtype=torch.bool, device=seq_token_ids.device) + require(torch.unique(replica_parent_indices).numel() == batch_size, "fusion omitted a sequence parent") + shared_replica_hidden = _state_acquisition_md_fusion( + composite, + base_parent_hidden=sequence_hidden, + static_state_hidden=cross_state_hidden, + static_state_pool=projected_state_pool, + static_state_parent_indices=active_parents, + replica_parent_indices=replica_parent_indices, + replica_ms_pool=replica_ms_pool, + replica_ms_present=replica_ms_present, + md_parent_pool=md_parent_pool, + md_parent_present=md_parent_available, + fusion=self.fusion, + ) + sequence_logits = self.sequence_head(shared_replica_hidden) + shared_parent_hidden, observed_sequence = composite._group_mean_tensor( + shared_replica_hidden, + replica_parent_indices, + group_count=batch_size, + ) + require(observed_sequence.all().item(), "shared parent representation is incomplete") + sequence_loss = sequence_loss_indices = None + if seq_labels is not None: + sequence_loss, sequence_loss_indices = composite._r4._token_parent_losses( + sequence_logits, + seq_labels, + replica_parent_indices, + batch_size=batch_size, + ) + require( + torch.equal(sequence_loss_indices, torch.arange(batch_size, device=seq_token_ids.device)), + "sequence parent loss axis changed", + ) + parent_losses = MappingProxyType( + { + "sequence": sequence_loss, + "topology": topology_loss, + "ms": ms_loss, + "static": static_loss, + "md": md_loss, + } + ) + loss_parent_indices = MappingProxyType( + { + "sequence": sequence_loss_indices, + "topology": topology_loss_indices, + "ms": ms_loss_indices, + "static": static_loss_indices, + "md": md_loss_indices, + } + ) + return MDEnabledNativeOutput( + cell_id=self.md_cell_id, + sequence_logits=sequence_logits, + sequence_replica_parent_indices=replica_parent_indices, + shared_parent_hidden=shared_parent_hidden, + topology_token_pair_predictions=topology_predictions, + ms_logits=ms_logits, + static_local_logits=static_logits, + md_parent_pool=md_parent_pool, + parent_losses=parent_losses, + loss_parent_indices=loss_parent_indices, + ) + + MDEnabledNativeComposite.__name__ = "MDEnabledNativeCompositeR3" + MDEnabledNativeComposite.__qualname__ = "MDEnabledNativeCompositeR3" + return MDEnabledNativeComposite + + +def parameter_summary(model: nn.Module) -> dict[str, int]: + md_parameters = sum(parameter.numel() for parameter in model.md_encoder.parameters()) + fusion_parameters = sum(parameter.numel() for parameter in model.fusion.parameters()) + return { + "total_parameters": sum(parameter.numel() for parameter in model.parameters()), + "trainable_parameters": sum(parameter.numel() for parameter in model.parameters() if parameter.requires_grad), + "md_branch_parameters": md_parameters, + "four_slot_fusion_parameters": fusion_parameters, + } diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/run_review_md_temporal_20x6_training_r3.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/run_review_md_temporal_20x6_training_r3.py new file mode 100644 index 0000000000000000000000000000000000000000..d7e25a1a52e54fcb4865c16e3dae91d6dc69b399 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/run_review_md_temporal_20x6_training_r3.py @@ -0,0 +1,1119 @@ +#!/usr/bin/env python3 +"""Train the eight reviewed MD-on native-ablation counterparts.""" + +from __future__ import annotations + +import argparse +from contextlib import contextmanager +import copy +from dataclasses import asdict +import hashlib +import importlib.util +import io +import json +import math +import os +from pathlib import Path +import random +import re +import signal +import sys +import tempfile +from types import MappingProxyType, ModuleType +from typing import Any, Iterator, Mapping, Optional, Sequence + +import numpy as np +import torch + + +PROJECT_ROOT = Path(__file__).absolute().parents[5] +WRITING_ROOT = PROJECT_ROOT / "writing" +if os.fspath(WRITING_ROOT) not in sys.path: + sys.path.insert(0, os.fspath(WRITING_ROOT)) + +from review.multimodal.runtime.md_temporal_20x6_end_to_end_20260802_r3_native_intersection import ( # noqa: E402 + review_md_temporal_20x6_core_r3 as mdcore, +) + + +SCHEMA = "bertose_review_md_temporal_20x6_training_20260802_r3" +LAUNCH_SCHEMA = "bertose_review_md_temporal_20x6_launch_20260802_r3" +CHECKPOINT_SCHEMA = "bertose_review_md_temporal_20x6_checkpoint_20260802_r3" +INDEX_SCHEMA = "bertose_review_md_temporal_20x6_checkpoint_index_20260802_r3" +FINAL_SCHEMA = "bertose_review_md_temporal_20x6_final_receipt_20260802_r3" +SMOKE_SCHEMA = "bertose_review_md_temporal_20x6_smoke_receipt_20260802_r3" +COMMON_SEED = 43 +MAX_EPOCHS = 100 +PATIENCE = 15 +MILESTONES = (25, 50, 75, 100) +ATTRIBUTION_CLAIM = "whole_md_enabled_successor_utility_not_md_measurements_alone" +EVALUATION_POPULATIONS = ("all_parent_primary", "md_present_secondary") +SUBMISSION_ROUTES = { + "normal_ratul": { + "partition": "nova", + "account": "ratul", + "qos": "normal", + "array_tasks": [0, 4, 5, 6], + }, + "scavenger": { + "partition": "scavenger", + "account": "ratul-scavenger", + "qos": "scavenger", + "array_tasks": [1, 2, 3, 7], + }, +} +SHA_RE = re.compile(r"[0-9a-f]{64}\Z") +STOP_REQUESTED = False + +NATIVE_WRAPPER_RELATIVE = ( + "writing/review/multimodal/runtime/" + "a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/" + "run_review_a5_native_eight_training_r22.py" +) +NATIVE_RUNTIME_RELATIVE = ( + "writing/review/multimodal/runtime/" + "a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/" + "review_a5_native_eight_finalization_runtime_r22.py" +) +NATIVE_SBATCH_RELATIVE = ( + "writing/review/multimodal/outputs/" + "review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/" + "run_review_a5_native_eight_r22.sbatch" +) +NATIVE_BINDING_RELATIVE = ( + "writing/review/multimodal/outputs/" + "review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/" + "review_a5_native_eight_final_binding_r22.json" +) +NATIVE_LAUNCH_RELATIVE = ( + "writing/review/multimodal/outputs/" + "review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/" + "review_a5_native_eight_launch_config_r22.json" +) +NATIVE_GATE_SHA256 = "ee97bf4e68ddfbf280b7e0f01ce3409c4d4692feafbc9382613bbc5698913fa7" +NATIVE_GATE_BYTES = 28699 +NATIVE_WRAPPER_SHA256 = "cb9a583091912c59f515f46074b04c90dfbe0ebf0fc28d241db980851b180335" +NATIVE_WRAPPER_BYTES = 24070 +NATIVE_RUNTIME_SHA256 = "62f5355ef06cdc56f85214ac251bfa0ed4b19b41a19ab6acac51d644678f0a62" +NATIVE_RUNTIME_BYTES = 12841 +NATIVE_SBATCH_SHA256 = "826f3e8167fdd459cff7677b5b69d0f3caf9dababaaa71d9eded6070aa5d93a7" +NATIVE_SBATCH_BYTES = 3603 +NATIVE_BINDING_SHA256 = "d8feaf25a7266a919c42d3a4fd1ad2d105ab088ae79c024edc665dfa29cf758a" +NATIVE_BINDING_BYTES = 3104 +NATIVE_LAUNCH_SHA256 = "30082379d47318f5d9e17fafad4aa018e7e9f0f0bf1aac559178d46784fe4b9f" +NATIVE_TRAIN_MANIFEST_SHA256 = "13b7ebc78b22baa1a38d2ae40da202dcc1e20e56f44220b4d4d5003ca5f3b8f2" +NATIVE_TRAIN_PARENT_COUNT = 221827 +PROVENANCE_FIELDS = ( + "sequence_rows", + "roles", + "seq_token_categories", + "topology_rows", + "topology_residue_counts", + "topology_target_counts", +) + + +class MDTrainingError(RuntimeError): + """Raised when a launch, native authority, batch, or resume boundary drifts.""" + + +def require(condition: bool, message: str) -> None: + if not condition: + raise MDTrainingError(message) + + +def validate_submission_route(routes: Mapping[str, Any], task_id: int) -> dict[str, Optional[str]]: + actual = { + "partition": os.environ.get("SLURM_JOB_PARTITION"), + "account": os.environ.get("SLURM_JOB_ACCOUNT"), + "qos": os.environ.get("SLURM_JOB_QOS"), + } + matching = [route for route in routes.values() if all(actual[key] == route[key] for key in actual)] + require(len(matching) == 1, "Slurm route is not authorized") + require(task_id in matching[0]["array_tasks"], "array task is assigned to the other Slurm route") + return actual + + +def sha256_file(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for block in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + +def atomic_bytes(path: Path, payload: bytes) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + require(path.parent.is_dir() and not path.parent.is_symlink(), "output parent is unsafe") + descriptor, temporary = tempfile.mkstemp(prefix=f".{path.name}.", dir=path.parent) + try: + with os.fdopen(descriptor, "wb") as handle: + handle.write(payload) + handle.flush() + os.fsync(handle.fileno()) + os.replace(temporary, path) + directory = os.open(path.parent, os.O_RDONLY | os.O_DIRECTORY) + try: + os.fsync(directory) + finally: + os.close(directory) + finally: + try: + os.unlink(temporary) + except FileNotFoundError: + pass + + +def torch_bytes(value: Mapping[str, Any]) -> bytes: + buffer = io.BytesIO() + torch.save(dict(value), buffer) + return buffer.getvalue() + + +def torch_loads(payload: bytes, device: torch.device) -> dict[str, Any]: + value = torch.load(io.BytesIO(payload), map_location=device, weights_only=False) + require(type(value) is dict, "checkpoint root changed") + return value + + +def configure_reproducibility() -> None: + os.environ.setdefault("CUBLAS_WORKSPACE_CONFIG", ":4096:8") + random.seed(COMMON_SEED) + np.random.seed(COMMON_SEED) + torch.manual_seed(COMMON_SEED) + if torch.cuda.is_available(): + torch.cuda.manual_seed_all(COMMON_SEED) + torch.use_deterministic_algorithms(True) + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + + +def rng_state() -> dict[str, Any]: + return { + "python": random.getstate(), + "numpy": np.random.get_state(), + "torch_cpu": torch.get_rng_state(), + "torch_cuda": torch.cuda.get_rng_state(0) if torch.cuda.is_available() else None, + } + + +def restore_rng(value: Mapping[str, Any]) -> None: + random.setstate(value["python"]) + np.random.set_state(value["numpy"]) + torch.set_rng_state(value["torch_cpu"].cpu()) + if value["torch_cuda"] is not None: + require(torch.cuda.is_available(), "checkpoint has CUDA RNG without CUDA") + torch.cuda.set_rng_state(value["torch_cuda"].cpu(), 0) + + +def stop_handler(_signum: int, _frame: Any) -> None: + global STOP_REQUESTED + STOP_REQUESTED = True + + +class LaunchConfig: + def __init__(self, path: Path, expected_sha256: str) -> None: + require(path.is_file() and not path.is_symlink(), "launch config is absent or unsafe") + payload = path.read_bytes() + require(hashlib.sha256(payload).hexdigest() == expected_sha256, "launch config hash changed") + value = json.loads(payload.decode("ascii")) + require(mdcore.canonical_bytes(value) == payload, "launch config is not canonical JSON") + required = { + "schema", + "semantic_array_id", + "cell_order", + "bit_order", + "common_seed", + "maximum_epochs", + "patience", + "loss_coefficients", + "loss_denominator", + "selection_rule", + "attribution_claim", + "evaluation_populations", + "submission_routes", + "project_root", + "output_root", + "native_authority", + "md_package", + "md_null_receipt", + "launch_authorized", + "official_submitted_artifacts_modified", + } + require(type(value) is dict and set(value) == required, "launch config fields changed") + require(value["schema"] == LAUNCH_SCHEMA, "launch schema changed") + require(value["cell_order"] == list(mdcore.MD_CELL_ORDER), "MD cell order changed") + require(value["bit_order"] == ["topology", "ms", "static_3d", "md"], "bit order changed") + require(value["common_seed"] == COMMON_SEED, "seed changed") + require(value["maximum_epochs"] == MAX_EPOCHS and value["patience"] == PATIENCE, "schedule changed") + require( + value["loss_coefficients"] == [1, "topology_bit", "ms_bit", "static_bit", 1] + and value["loss_denominator"] == mdcore.LOSS_DENOMINATOR, + "five-objective shell changed", + ) + require(value["selection_rule"] == "strict_lower_earliest_tie", "selection changed") + require(value["attribution_claim"] == ATTRIBUTION_CLAIM, "attribution claim changed") + require( + value["evaluation_populations"] == list(EVALUATION_POPULATIONS), + "evaluation populations changed", + ) + require(value["submission_routes"] == SUBMISSION_ROUTES, "submission routes changed") + require(value["launch_authorized"] is True, "launch is not authorized") + require(value["official_submitted_artifacts_modified"] is False, "config claims official mutation") + self.value = MappingProxyType(value) + self.path = path.absolute() + self.sha256 = expected_sha256 + self.semantic_array_id = str(value["semantic_array_id"]) + require(re.fullmatch(r"[A-Za-z0-9_.:-]+", self.semantic_array_id) is not None, "semantic ID is unsafe") + self.project_root = Path(value["project_root"]) + self.output_root = Path(value["output_root"]) + require(self.project_root == PROJECT_ROOT, "launch project root differs from runtime") + self.md_binding = self._load_md_binding(value["md_package"]) + null = value["md_null_receipt"] + self.md_null_path = Path(null["path"]) + self.md_null_sha256 = str(null["sha256"]) + require(sha256_file(self.md_null_path) == self.md_null_sha256, "MD null receipt hash changed") + null_value = json.loads(self.md_null_path.read_text(encoding="ascii")) + require( + null_value.get("schema") + == "bertose_review_md_temporal_20x6_train_only_null_20260802_r3", + "MD null schema changed", + ) + require(null_value.get("status") == "PASS", "MD null is not PASS") + null_scale = null_value.get("scale") + require( + type(null_scale) in {int, float} + and math.isfinite(float(null_scale)) + and float(null_scale) > 0, + "MD null scale is invalid", + ) + self.md_null_scale = float(null_scale) + require( + null_value.get("md_contributor_parent_count") + == mdcore.NATIVE_INTERSECTION_COUNT["pretraining_train"] + and null_value.get("development_parents_used") == 0, + "MD null contributor boundary changed", + ) + native_train = null_value.get("native_train_manifest", {}) + require( + type(native_train) is dict + and native_train.get("sha256") == NATIVE_TRAIN_MANIFEST_SHA256 + and native_train.get("parent_count") == NATIVE_TRAIN_PARENT_COUNT + and null_value.get("native_intersection_roster_sha256") + == mdcore.NATIVE_INTERSECTION_ROSTER_SHA256["pretraining_train"], + "MD null native-intersection binding changed", + ) + require( + null_value.get("core_source", {}).get("sha256") + == sha256_file(Path(mdcore.__file__)), + "MD null no longer binds the loaded core", + ) + require( + null_value.get("model", {}).get("sha256") == self.md_binding.model_sha256 + and null_value.get("parent_index", {}).get("sha256") + == self.md_binding.index_sha256 + and null_value.get("master_ledger", {}).get("sha256") + == self.md_binding.ledger_sha256 + and null_value.get("objective_table", {}).get("sha256") + == self.md_binding.objective_sha256 + and null_value.get("summary", {}).get("sha256") + == self.md_binding.summary_sha256, + "MD null package binding changed", + ) + native = value["native_authority"] + require(native == { + "wrapper_relative": NATIVE_WRAPPER_RELATIVE, + "wrapper_sha256": NATIVE_WRAPPER_SHA256, + "runtime_relative": NATIVE_RUNTIME_RELATIVE, + "runtime_sha256": NATIVE_RUNTIME_SHA256, + "sbatch_relative": NATIVE_SBATCH_RELATIVE, + "sbatch_sha256": NATIVE_SBATCH_SHA256, + "binding_relative": NATIVE_BINDING_RELATIVE, + "binding_sha256": NATIVE_BINDING_SHA256, + "launch_relative": NATIVE_LAUNCH_RELATIVE, + "launch_sha256": NATIVE_LAUNCH_SHA256, + }, "native authority binding changed") + + @staticmethod + def _load_md_binding(value: Mapping[str, Any]) -> mdcore.MDPackageBinding: + expected = {"model", "parent_index", "master_ledger", "objective_table", "summary"} + require(type(value) is dict and set(value) == expected, "MD package launch binding changed") + + def item(name: str) -> tuple[Path, str]: + raw = value[name] + require(type(raw) is dict and set(raw) == {"path", "sha256"}, f"MD {name} binding changed") + path, digest = Path(raw["path"]), str(raw["sha256"]) + require(SHA_RE.fullmatch(digest) is not None, f"MD {name} digest invalid") + return path, digest + + model, model_sha = item("model") + index, index_sha = item("parent_index") + ledger, ledger_sha = item("master_ledger") + objective, objective_sha = item("objective_table") + summary, summary_sha = item("summary") + return mdcore.MDPackageBinding( + model, + model_sha, + index, + index_sha, + ledger, + ledger_sha, + objective, + objective_sha, + summary, + summary_sha, + ) + + +@contextmanager +def native_authority(config: LaunchConfig, *, static_active: bool) -> Iterator[tuple[Any, Any, Any, Any]]: + wrapper_path = PROJECT_ROOT / NATIVE_WRAPPER_RELATIVE + sbatch_path = PROJECT_ROOT / NATIVE_SBATCH_RELATIVE + require( + wrapper_path.is_file() + and not wrapper_path.is_symlink() + and wrapper_path.stat().st_size == NATIVE_WRAPPER_BYTES + and sha256_file(wrapper_path) == NATIVE_WRAPPER_SHA256, + "native wrapper identity changed", + ) + require( + sbatch_path.is_file() + and not sbatch_path.is_symlink() + and sbatch_path.stat().st_size == NATIVE_SBATCH_BYTES + and sha256_file(sbatch_path) == NATIVE_SBATCH_SHA256, + "native sbatch identity changed", + ) + spec = importlib.util.spec_from_file_location("_review_md20x6_native_wrapper_r3", wrapper_path) + require(spec is not None and spec.loader is not None, "cannot load native authority wrapper") + wrapper = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = wrapper + spec.loader.exec_module(wrapper) + gate = wrapper._load_module( + wrapper.GATE_PATH, + expected_sha256=NATIVE_GATE_SHA256, + expected_bytes=NATIVE_GATE_BYTES, + name="_review_md20x6_native_gate", + ) + runtime_path = PROJECT_ROOT / NATIVE_RUNTIME_RELATIVE + runtime = wrapper._load_module( + runtime_path, + expected_sha256=NATIVE_RUNTIME_SHA256, + expected_bytes=NATIVE_RUNTIME_BYTES, + name="_review_md20x6_native_runtime", + ) + binding_path = PROJECT_ROOT / NATIVE_BINDING_RELATIVE + binding = wrapper._load_binding( + binding_path, + expected_sha256=NATIVE_BINDING_SHA256, + expected_bytes=NATIVE_BINDING_BYTES, + ) + identity = gate.StaticReleaseIdentity(**binding["static_release_identity"]) + observed, evidence = gate.validate_static_release(identity) + wrapper._validate_lineage_coherence( + binding, + observed=observed, + evidence=evidence, + selected_checkpoint_semantic_sha256=gate.SELECTED_BEST_CHECKPOINT_SEMANTIC_SHA256, + ) + runner, *_ = gate.load_truthful_bound_runtime(identity=identity) + runtime.install_r22_runtime( + runner, + wrapper_path=wrapper_path, + sbatch_path=sbatch_path, + ) + native = runner._core + launch_path = PROJECT_ROOT / NATIVE_LAUNCH_RELATIVE + native_config = native.LaunchConfig.load(launch_path) + runner._r2._EXTERNAL_LAUNCH_CONFIG_FILE_SHA256 = NATIVE_LAUNCH_SHA256 + with ( + wrapper.r21_historical_provenance_compatibility(runner), + wrapper.r21_static_null_probability_compatibility(runner), + ): + runner._r2._VALIDATED_EXTERNAL_RELEASE = runner._r2._validate_external_release_r2( + native_config, + launch_config_path=launch_path, + ) + r8 = native._load_r8() + static_bundle = native.StaticBundle.load(native_config) if static_active else None + yield native, r8, static_bundle, runner + + +class CheckpointStore: + def __init__(self, root: Path, *, cell_id: str, run_sha256: str) -> None: + self.root = root + self.root.mkdir(parents=True, exist_ok=True) + require(self.root.is_dir() and not self.root.is_symlink(), "checkpoint root is unsafe") + self.cell_id = cell_id + self.run_sha256 = run_sha256 + self.index_path = self.root / "review_md20x6_checkpoint_index.json" + + def exists(self) -> bool: + return self.index_path.is_file() + + def _index(self) -> Optional[dict[str, Any]]: + if not self.exists(): + return None + value = json.loads(self.index_path.read_text(encoding="ascii")) + unsigned = dict(value) + receipt = unsigned.pop("index_sha256", None) + require(receipt == mdcore.canonical_sha256(unsigned, domain=INDEX_SCHEMA), "checkpoint index digest changed") + require(value["cell_id"] == self.cell_id and value["run_identity_sha256"] == self.run_sha256, "checkpoint index identity changed") + return value + + def load_latest(self, device: torch.device) -> dict[str, Any]: + index = self._index() + require(index is not None, "latest checkpoint index absent") + entry = index["roles"]["latest"] + path = self.root / entry["filename"] + payload = path.read_bytes() + require(hashlib.sha256(payload).hexdigest() == entry["sha256"], "latest checkpoint hash changed") + return torch_loads(payload, device) + + def commit(self, checkpoint: Mapping[str, Any], *, improved: bool, epoch: int, dev_loss: float) -> str: + payload = torch_bytes(checkpoint) + digest = hashlib.sha256(payload).hexdigest() + latest_name = "review_md20x6_checkpoint_latest.pt" + atomic_bytes(self.root / latest_name, payload) + previous = self._index() + roles = copy.deepcopy(previous["roles"]) if previous is not None else {"latest": None, "best": None, "milestones": {}} + entry = {"filename": latest_name, "sha256": digest, "epoch": epoch, "development_loss": float(dev_loss)} + roles["latest"] = entry + if improved: + best_name = "review_md20x6_checkpoint_best.pt" + atomic_bytes(self.root / best_name, payload) + roles["best"] = {**entry, "filename": best_name} + require(roles["best"] is not None, "checkpoint has no best role") + if epoch in MILESTONES: + name = f"review_md20x6_checkpoint_milestone_{epoch:03d}.pt" + atomic_bytes(self.root / name, payload) + roles["milestones"][str(epoch)] = {**entry, "filename": name} + unsigned = { + "schema": INDEX_SCHEMA, + "generation": 1 if previous is None else previous["generation"] + 1, + "cell_id": self.cell_id, + "run_identity_sha256": self.run_sha256, + "roles": roles, + } + value = {**unsigned, "index_sha256": mdcore.canonical_sha256(unsigned, domain=INDEX_SCHEMA)} + atomic_bytes(self.index_path, mdcore.canonical_bytes(value)) + return digest + + +class MDExecutor: + def __init__( + self, + *, + model: torch.nn.Module, + r5: ModuleType, + md_cell_id: str, + static_null_scale: float, + md_null_scale: float, + ) -> None: + self.model = model + self.r5 = r5 + self.cell_id = md_cell_id + self.coefficients = dict(mdcore.coefficients_for_md_cell(md_cell_id)) + self.null_scales = { + "sequence": float(r5.SEQUENCE_NULL_SCALE), + "topology": float(r5.TOPOLOGY_NULL_SCALE), + "ms": float(r5.MS_NULL_SCALE), + "static": float(static_null_scale), + "md": float(md_null_scale), + } + adamw = r5.AdamWContract() + groups = [ + group + for group in model.optimizer_parameter_groups(weight_decay=adamw.weight_decay) + if group["params"] + ] + self.optimizer = torch.optim.AdamW( + groups, + lr=adamw.learning_rate, + betas=(adamw.beta1, adamw.beta2), + eps=adamw.epsilon, + ) + self.max_grad_norm = adamw.max_grad_norm + self.optimizer_contract_sha256 = mdcore.canonical_sha256( + { + "class": "torch.optim.AdamW", + "hyperparameters": asdict(adamw), + "active_parameter_names": [ + name for name, parameter in model.named_parameters() if parameter.requires_grad + ], + "group_weight_decays": [float(group["weight_decay"]) for group in self.optimizer.param_groups], + }, + domain="bertose-review-md20x6-adamw-r3", + ) + + def execute_step( + self, + *, + plan: Any, + step_index: int, + micros: Sequence[Any], + package: mdcore.MDTemporal20x6Package, + ) -> dict[str, Any]: + self.optimizer.zero_grad(set_to_none=True) + self.model.train() + step_bits = plan.step_availability_bits(step_index) + sums = {objective: 0.0 for objective in mdcore.OBJECTIVES} + counts = {objective: 0 for objective in mdcore.OBJECTIVES} + md_factor = ( + plan.optimizer_step_count + / mdcore.NATIVE_INTERSECTION_COUNT["pretraining_train"] + ) + for micro, (left, right) in zip(micros, plan.step_micro_slices(step_index)): + output = self.model(**dict(micro.model_inputs)) + require(type(output) is mdcore.MDEnabledNativeOutput, "MD composite output type changed") + bits = step_bits[left:right] + micro_total: Optional[torch.Tensor] = None + for objective in mdcore.OBJECTIVES: + losses = output.parent_losses[objective] + indices = output.loss_parent_indices[objective] + if not self.coefficients[objective]: + require(losses is None and indices is None, f"disabled {objective} emitted losses") + continue + require( + isinstance(losses, torch.Tensor) + and isinstance(indices, torch.Tensor) + and losses.ndim == indices.ndim == 1 + and losses.shape == indices.shape + and torch.isfinite(losses).all().item(), + f"enabled {objective} loss vector changed", + ) + observed = tuple(int(value) for value in indices.detach().cpu().tolist()) + if objective == "sequence": + expected = tuple(range(len(micro.parent_ids))) + elif objective == "md": + expected = tuple( + index + for index, parent_id in enumerate(micro.parent_ids) + if parent_id in package.parent_row_by_id + ) + else: + bit = {"topology": 0b100, "ms": 0b010, "static": 0b001}[objective] + expected = tuple(index for index, flags in enumerate(bits) if flags & bit) + require(observed == expected, f"{objective} parent identity differs from plan") + if not observed: + continue + global_factor = md_factor if objective == "md" else float(plan.global_factors[objective]) + contribution = ( + losses.sum() + * global_factor + / self.null_scales[objective] + / mdcore.LOSS_DENOMINATOR + ) + micro_total = contribution if micro_total is None else micro_total + contribution + detached = [float(value) for value in losses.detach().cpu().tolist()] + sums[objective] = math.fsum((sums[objective], *detached)) + counts[objective] += len(detached) + require(micro_total is not None, "microbatch produced no active loss") + micro_total.backward() + active = [parameter for parameter in self.model.parameters() if parameter.requires_grad] + grad_norm = float(torch.nn.utils.clip_grad_norm_(active, self.max_grad_norm, error_if_nonfinite=True)) + self.optimizer.step() + normalized = { + objective: ( + sums[objective] + * (md_factor if objective == "md" else float(plan.global_factors[objective])) + / self.null_scales[objective] + / mdcore.LOSS_DENOMINATOR + ) + if self.coefficients[objective] + else None + for objective in mdcore.OBJECTIVES + } + return { + "step_index": step_index, + "objective_parent_counts": counts, + "objective_parent_sums": sums, + "combined_normalized_loss": math.fsum(value for value in normalized.values() if value is not None), + "pre_clip_grad_norm": grad_norm, + "peak_cuda_memory_bytes": int(torch.cuda.max_memory_allocated(0)), + } + + +def enrich_micros( + *, + r8: ModuleType, + micros: Sequence[Any], + package: mdcore.MDTemporal20x6Package, + split: str, + epoch: int, + device: torch.device, +) -> tuple[tuple[Any, ...], tuple[str, ...]]: + enriched = [] + identities = [] + for micro in micros: + md_inputs, identity = package.collate( + micro.parent_ids, + split=split, + epoch=epoch, + device=device, + ) + values = dict(micro.model_inputs) + require(not (set(values) & set(md_inputs)), "MD keys collide with native batch") + values.update(md_inputs) + enriched.append( + r8.PlannedMicrobatch( + parent_indices=micro.parent_indices, + parent_ids=micro.parent_ids, + model_inputs=MappingProxyType(values), + ) + ) + identities.append(identity) + return tuple(enriched), tuple(identities) + + +def fixed_development( + *, + native: ModuleType, + adapter: Any, + executor: MDExecutor, + base_cell_id: str, + package: mdcore.MDTemporal20x6Package, + reviewed_md_parent_ids: Sequence[str], + device: torch.device, +) -> dict[str, Any]: + contract = adapter.fixed_development_contract(base_cell_id) + expected = {objective: tuple(contract.eligible_parent_ids[objective]) for objective in contract.eligible_parent_ids} + reviewed_md = set(reviewed_md_parent_ids) + expected["md"] = tuple( + row.parent_id for row in adapter.development_rows if row.parent_id in reviewed_md + ) + require( + len(expected["md"]) + == mdcore.NATIVE_INTERSECTION_COUNT["pretraining_development"], + "development MD roster changed", + ) + observed: dict[str, dict[str, float]] = {objective: {} for objective in mdcore.OBJECTIVES} + was_training = executor.model.training + executor.model.eval() + executor.model._review_a5_r8_provenance_mode = "development" + executor.model._review_a5_r8_development_batches = [] + try: + with torch.no_grad(): + for batch in adapter.materialize_fixed_development( + base_cell_id, + device=device, + parent_batch_size=32, + ): + md_inputs, _ = package.collate( + batch.parent_ids, + split="development", + epoch=0, + device=device, + ) + inputs = dict(batch.model_inputs) + inputs.update(md_inputs) + output = executor.model(**inputs) + for objective in mdcore.OBJECTIVES: + losses, indices = output.parent_losses[objective], output.loss_parent_indices[objective] + if not executor.coefficients[objective]: + require(losses is None and indices is None, f"disabled {objective} emitted dev loss") + continue + require(isinstance(losses, torch.Tensor) and isinstance(indices, torch.Tensor), f"{objective} dev loss absent") + for local_index, raw in zip(indices.detach().cpu().tolist(), losses.detach().cpu().tolist()): + parent_id = batch.parent_ids[int(local_index)] + require(parent_id not in observed[objective], f"{objective} dev parent repeated") + observed[objective][parent_id] = float(raw) + finally: + executor.model._review_a5_r8_provenance_mode = "train" + executor.model.train(was_training) + raw_means: dict[str, Optional[float]] = {} + normalized: dict[str, Optional[float]] = {} + counts: dict[str, int] = {} + total = 0.0 + for objective in mdcore.OBJECTIVES: + if executor.coefficients[objective]: + require(set(observed[objective]) == set(expected[objective]), f"{objective} development roster incomplete") + values = [observed[objective][parent_id] for parent_id in expected[objective]] + mean = math.fsum(values) / len(values) + value = mean / executor.null_scales[objective] + raw_means[objective], normalized[objective], counts[objective] = mean, value, len(values) + total += value / mdcore.LOSS_DENOMINATOR + else: + require(not observed[objective], f"disabled {objective} accumulated dev loss") + raw_means[objective], normalized[objective], counts[objective] = None, None, 0 + provenance_chain = executor.r5._recursive_state_sha256( + executor.model._review_a5_r8_development_batches + ) + return { + "raw_parent_means": raw_means, + "normalized_losses": normalized, + "parent_counts": counts, + "total_normalized_loss": total, + "native_surface_sha256": contract.surface_sha256, + "native_contract_sha256": contract.contract_sha256, + "r4_provenance_chain_sha256": provenance_chain, + } + + +def claim_cell(root: Path, *, config: LaunchConfig, cell_id: str, task_id: int) -> None: + path = root / "review_md20x6_run_claim.json" + job_id = os.environ.get("SLURM_ARRAY_JOB_ID", os.environ.get("SLURM_JOB_ID", "local")) + value = { + "schema": "bertose_review_md_temporal_20x6_claim_20260802_r3", + "semantic_array_id": config.semantic_array_id, + "cell_id": cell_id, + "array_task_id": task_id, + "first_array_job_id": job_id, + "common_seed": COMMON_SEED, + } + value["claim_sha256"] = mdcore.canonical_sha256(value, domain=value["schema"]) + payload = mdcore.canonical_bytes(value) + try: + with path.open("xb") as handle: + handle.write(payload) + handle.flush() + os.fsync(handle.fileno()) + except FileExistsError: + require(path.is_file() and not path.is_symlink(), "cell claim is unsafe") + existing = json.loads(path.read_text(encoding="ascii")) + require( + existing["semantic_array_id"] == config.semantic_array_id + and existing["cell_id"] == cell_id + and existing["array_task_id"] == task_id + and existing["first_array_job_id"] == job_id + and existing["common_seed"] == COMMON_SEED, + "cell output belongs to another experiment or Slurm array", + ) + + +def selection_next(selection: Mapping[str, Any], loss: float) -> tuple[dict[str, Any], bool]: + epoch = int(selection["completed_epochs"]) + 1 + improved = selection["best_loss"] is None or loss < float(selection["best_loss"]) + without = 0 if improved else int(selection["epochs_without_improvement"]) + 1 + return { + "completed_epochs": epoch, + "best_epoch": epoch if improved else selection["best_epoch"], + "best_loss": float(loss) if improved else selection["best_loss"], + "epochs_without_improvement": without, + "stop_reason": "patience_exhausted" if without >= PATIENCE else ("max_epochs_reached" if epoch >= MAX_EPOCHS else None), + }, improved + + +def run(arguments: argparse.Namespace) -> Mapping[str, Any]: + config = LaunchConfig(arguments.launch_config.absolute(), arguments.launch_config_sha256) + require(0 <= arguments.array_task_id < 8, "array task must be 0..7") + actual_slurm_route = validate_submission_route( + config.value["submission_routes"], arguments.array_task_id + ) + md_cell_id = mdcore.MD_CELL_ORDER[arguments.array_task_id] + base_cell_id = mdcore.BASE_CELL_BY_MD_CELL[md_cell_id] + static_active = bool(int(base_cell_id[3])) + configure_reproducibility() + require(torch.cuda.is_available(), "training requires CUDA") + device = torch.device("cuda:0") + package = mdcore.MDTemporal20x6Package(config.md_binding) + with native_authority(config, static_active=static_active) as (native, r8, static_bundle, _runner): + adapter = ( + native._make_static_adapter_class(r8, static_bundle)() + if static_active + else r8._adapter_r3.NativeEightDataAdapter() + ) + try: + native_train_ids = tuple(row.parent_id for row in adapter.train_rows) + native_dev_ids = tuple(row.parent_id for row in adapter.development_rows) + reviewed_train = package.native_intersection_parent_ids_for_role( + "pretraining_train", native_train_ids + ) + reviewed_dev = package.native_intersection_parent_ids_for_role( + "pretraining_development", native_dev_ids + ) + require( + {row.parent_id for row in adapter.train_rows if row.parent_id in package.parent_row_by_id} + == set(reviewed_train), + "native and reviewed MD train rosters differ", + ) + require( + {row.parent_id for row in adapter.development_rows if row.parent_id in package.parent_row_by_id} + == set(reviewed_dev), + "native and reviewed MD development rosters differ", + ) + r5 = r8._core._r6._r5 + base_config = r8.NativeEightConfig( + cell_id=base_cell_id, + seq_vocab_size=int(r5.SEQUENCE_VOCAB_SIZE), + ) + model_class = mdcore.make_md_enabled_composite_class(r5) + model = model_class(base_config, md_cell_id=md_cell_id, md_temporal_size=128) + r8._install_model_bridge(model, adapter) + model.to(device) + static_scale = float(static_bundle.null_scale) if static_bundle is not None else 1.0 + executor = MDExecutor( + model=model, + r5=r5, + md_cell_id=md_cell_id, + static_null_scale=static_scale, + md_null_scale=config.md_null_scale, + ) + initial_model_sha = r5._model_state_sha256(model) + params = mdcore.parameter_summary(model) + device_properties = torch.cuda.get_device_properties(device) + attempt_identity = { + "slurm_job_id": os.environ.get("SLURM_JOB_ID", "local"), + "slurm_array_job_id": os.environ.get("SLURM_ARRAY_JOB_ID"), + "slurm_array_task_id": os.environ.get("SLURM_ARRAY_TASK_ID"), + "slurm_restart_count": int(os.environ.get("SLURM_RESTART_COUNT", "0")), + "device": { + "name": str(device_properties.name), + "compute_capability": [device_properties.major, device_properties.minor], + "total_memory_bytes": int(device_properties.total_memory), + "cuda_visible_devices": os.environ.get("CUDA_VISIBLE_DEVICES"), + }, + "actual_slurm_route": actual_slurm_route, + } + attempt_identity["attempt_sha256"] = mdcore.canonical_sha256( + attempt_identity, domain="bertose-review-md20x6-attempt-r3" + ) + run_identity = { + "schema": SCHEMA, + "semantic_array_id": config.semantic_array_id, + "md_cell_id": md_cell_id, + "base_control_cell_id": base_cell_id, + "coefficients": executor.coefficients, + "loss_denominator": mdcore.LOSS_DENOMINATOR, + "common_seed": COMMON_SEED, + "maximum_epochs": MAX_EPOCHS, + "patience": PATIENCE, + "selection_rule": "strict_lower_earliest_tie", + "attribution_claim": config.value["attribution_claim"], + "evaluation_populations": config.value["evaluation_populations"], + "launch_config_sha256": config.sha256, + "core_source_sha256": sha256_file(Path(mdcore.__file__)), + "runner_source_sha256": sha256_file(Path(__file__).absolute()), + "native_launch_sha256": NATIVE_LAUNCH_SHA256, + "native_adapter_contract_sha256": adapter.contract_sha256, + "static_binding_sha256": static_bundle.binding_sha256 if static_bundle is not None else None, + "md_package_summary_sha256": config.md_binding.summary_sha256, + "md_null_receipt_sha256": config.md_null_sha256, + "md_native_intersection_rosters": { + role: { + "count": mdcore.NATIVE_INTERSECTION_COUNT[role], + "sha256": mdcore.NATIVE_INTERSECTION_ROSTER_SHA256[role], + } + for role in mdcore.NATIVE_INTERSECTION_COUNT + }, + "optimizer_contract_sha256": executor.optimizer_contract_sha256, + "initial_model_state_sha256": initial_model_sha, + "parameter_summary": params, + "precision": "fp32_no_amp", + "completed_epoch_resume": True, + } + run_sha = mdcore.canonical_sha256(run_identity, domain=SCHEMA) + plan = adapter.build_epoch_plan(0) + if arguments.smoke_steps: + diagnostics = [] + for step_index in range(min(arguments.smoke_steps, plan.optimizer_step_count)): + materialized = adapter.materialize_training_step( + plan=plan, + step_index=step_index, + cell_id=base_cell_id, + device=device, + ) + micros, native_identity = native._verify_materialized_step( + r8, + value=materialized, + adapter=adapter, + plan=plan, + step_index=step_index, + cell_id=base_cell_id, + ) + enriched, md_identities = enrich_micros( + r8=r8, + micros=micros, + package=package, + split="train", + epoch=0, + device=device, + ) + diagnostic = executor.execute_step( + plan=plan, + step_index=step_index, + micros=enriched, + package=package, + ) + diagnostic["native_step_identity_sha256"] = native_identity + diagnostic["md_batch_identity_chain_sha256"] = mdcore.canonical_sha256( + list(md_identities), domain="bertose-review-md20x6-micro-chain-r3" + ) + diagnostics.append(diagnostic) + print(json.dumps({"event": "smoke_step", "cell": md_cell_id, **diagnostic}, sort_keys=True), flush=True) + receipt = { + "schema": SMOKE_SCHEMA, + "status": "PASS_NONSCIENTIFIC_MD_INTEGRATION_SMOKE", + "run_identity": run_identity, + "run_identity_sha256": run_sha, + "attempt_identity": attempt_identity, + "completed_optimizer_steps": len(diagnostics), + "diagnostics": diagnostics, + } + receipt["receipt_sha256"] = mdcore.canonical_sha256(receipt, domain=SMOKE_SCHEMA) + atomic_bytes(arguments.smoke_receipt, mdcore.canonical_bytes(receipt)) + return MappingProxyType(receipt) + cell_root = config.output_root / f"review_md20x6_{config.semantic_array_id}_{md_cell_id}_seed43" + cell_root.mkdir(parents=True, exist_ok=True) + claim_cell(cell_root, config=config, cell_id=md_cell_id, task_id=arguments.array_task_id) + attempt_path = cell_root / ( + f"review_md20x6_attempt_{attempt_identity['slurm_job_id']}_" + f"r{attempt_identity['slurm_restart_count']}.json" + ) + atomic_bytes(attempt_path, mdcore.canonical_bytes(attempt_identity)) + store = CheckpointStore(cell_root / "review_checkpoints", cell_id=md_cell_id, run_sha256=run_sha) + selection: dict[str, Any] = { + "completed_epochs": 0, + "best_epoch": None, + "best_loss": None, + "epochs_without_improvement": 0, + "stop_reason": None, + } + history: list[dict[str, Any]] = [] + if store.exists(): + checkpoint = store.load_latest(device) + require(checkpoint["schema"] == CHECKPOINT_SCHEMA, "checkpoint schema changed") + require(checkpoint["run_identity_sha256"] == run_sha, "checkpoint run identity changed") + model.load_state_dict(checkpoint["model_state"], strict=True) + executor.optimizer.load_state_dict(checkpoint["optimizer_state"]) + selection = copy.deepcopy(checkpoint["selection"]) + history = copy.deepcopy(checkpoint["development_history"]) + previous = adapter.build_epoch_plan(int(selection["completed_epochs"]) - 1) + adapter.restore_resume_cursor( + checkpoint["adapter_cursor"], + plan=previous, + cell_id=base_cell_id, + ) + restore_rng(checkpoint["rng_state"]) + signal.signal(signal.SIGTERM, stop_handler) + if hasattr(signal, "SIGUSR1"): + signal.signal(signal.SIGUSR1, stop_handler) + while selection["stop_reason"] is None: + epoch = int(selection["completed_epochs"]) + plan = adapter.build_epoch_plan(epoch) + step_chain = [] + for step_index in range(plan.optimizer_step_count): + materialized = adapter.materialize_training_step( + plan=plan, + step_index=step_index, + cell_id=base_cell_id, + device=device, + ) + micros, native_identity = native._verify_materialized_step( + r8, + value=materialized, + adapter=adapter, + plan=plan, + step_index=step_index, + cell_id=base_cell_id, + ) + enriched, md_identities = enrich_micros( + r8=r8, + micros=micros, + package=package, + split="train", + epoch=epoch, + device=device, + ) + diagnostic = executor.execute_step( + plan=plan, + step_index=step_index, + micros=enriched, + package=package, + ) + step_identity = mdcore.canonical_sha256( + { + "native": native_identity, + "md_micros": list(md_identities), + "diagnostic": diagnostic, + }, + domain="bertose-review-md20x6-training-step-r3", + ) + step_chain.append(step_identity) + if step_index % 25 == 0: + print(json.dumps({"event": "training_heartbeat", "cell": md_cell_id, "epoch": epoch, **diagnostic}, sort_keys=True), flush=True) + if STOP_REQUESTED: + raise MDTrainingError("termination requested; latest completed epoch remains authoritative") + development = fixed_development( + native=native, + adapter=adapter, + executor=executor, + base_cell_id=base_cell_id, + package=package, + reviewed_md_parent_ids=reviewed_dev, + device=device, + ) + next_selection, improved = selection_next(selection, development["total_normalized_loss"]) + history.append( + { + "epoch": next_selection["completed_epochs"], + "development": development, + "improved": improved, + "step_identity_chain_sha256": mdcore.canonical_sha256( + step_chain, domain="bertose-review-md20x6-epoch-step-chain-r3" + ), + } + ) + cursor = adapter.resume_cursor( + plan=plan, + next_optimizer_step=plan.optimizer_step_count, + cell_id=base_cell_id, + ) + checkpoint = { + "schema": CHECKPOINT_SCHEMA, + "run_identity_sha256": run_sha, + "md_cell_id": md_cell_id, + "base_cell_id": base_cell_id, + "selection": next_selection, + "development_history": history, + "adapter_cursor": cursor, + "model_state": copy.deepcopy(model.state_dict()), + "optimizer_state": copy.deepcopy(executor.optimizer.state_dict()), + "rng_state": rng_state(), + } + checkpoint_sha = store.commit( + checkpoint, + improved=improved, + epoch=next_selection["completed_epochs"], + dev_loss=development["total_normalized_loss"], + ) + selection = next_selection + print(json.dumps({"event": "completed_epoch", "cell": md_cell_id, "selection": selection, "development": development, "checkpoint_sha256": checkpoint_sha}, sort_keys=True), flush=True) + final = { + "schema": FINAL_SCHEMA, + "status": "PASS_TRAINING_COMPLETE", + "run_identity": run_identity, + "run_identity_sha256": run_sha, + "terminal_attempt_identity": attempt_identity, + "selection": selection, + "development_history": history, + } + final["receipt_sha256"] = mdcore.canonical_sha256(final, domain=FINAL_SCHEMA) + atomic_bytes(cell_root / "review_md20x6_final_receipt.json", mdcore.canonical_bytes(final)) + return MappingProxyType(final) + finally: + close = getattr(adapter, "close", None) + if callable(close): + close() + + +def main(argv: Optional[Sequence[str]] = None) -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--launch-config", type=Path, required=True) + parser.add_argument("--launch-config-sha256", required=True) + parser.add_argument("--array-task-id", type=int, required=True) + parser.add_argument("--resume", choices=("auto",), default="auto") + parser.add_argument("--smoke-steps", type=int, default=0) + parser.add_argument("--smoke-receipt", type=Path) + arguments = parser.parse_args(argv) + require(SHA_RE.fullmatch(arguments.launch_config_sha256) is not None, "launch digest invalid") + require(arguments.smoke_steps >= 0, "smoke steps must be nonnegative") + if arguments.smoke_steps: + require(arguments.smoke_receipt is not None, "smoke receipt path required") + arguments.smoke_receipt = arguments.smoke_receipt.absolute() + result = run(arguments) + print(json.dumps({"status": result["status"], "receipt_sha256": result["receipt_sha256"]}, sort_keys=True), flush=True) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260805_r4_dev_memory/run_review_md_temporal_20x6_training_r4.py b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260805_r4_dev_memory/run_review_md_temporal_20x6_training_r4.py new file mode 100644 index 0000000000000000000000000000000000000000..10056e763a692ae2cb9a8688e83b983ccd432f61 --- /dev/null +++ b/releases/2026-10-02/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260805_r4_dev_memory/run_review_md_temporal_20x6_training_r4.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python3 +"""Run R3 MD training with bounded fixed-development output lifetime.""" + +from __future__ import annotations + +import os +from pathlib import Path +import sys +from typing import Any, Sequence + +import torch + + +PROJECT_ROOT = Path(__file__).absolute().parents[5] +WRITING_ROOT = PROJECT_ROOT / "writing" +if os.fspath(WRITING_ROOT) not in sys.path: + sys.path.insert(0, os.fspath(WRITING_ROOT)) + +from review.multimodal.runtime.md_temporal_20x6_end_to_end_20260802_r3_native_intersection import ( # noqa: E402 + run_review_md_temporal_20x6_training_r3 as r3, +) + + +BASE_RUNNER_SHA256 = "1e446e7e89a39ef01132b9f2a4deb817161f7b376a0fa04c2b11529004f53e8a" +BASE_RUNNER_PATH = Path(r3.__file__).absolute() +r3.require(r3.sha256_file(BASE_RUNNER_PATH) == BASE_RUNNER_SHA256, "R3 base runner changed") + + +def fixed_development( + *, + native: Any, + adapter: Any, + executor: Any, + base_cell_id: str, + package: Any, + reviewed_md_parent_ids: Sequence[str], + device: torch.device, +) -> dict[str, Any]: + contract = adapter.fixed_development_contract(base_cell_id) + expected = { + objective: tuple(contract.eligible_parent_ids[objective]) + for objective in contract.eligible_parent_ids + } + reviewed_md = set(reviewed_md_parent_ids) + expected["md"] = tuple( + row.parent_id for row in adapter.development_rows if row.parent_id in reviewed_md + ) + r3.require( + len(expected["md"]) + == r3.mdcore.NATIVE_INTERSECTION_COUNT["pretraining_development"], + "development MD roster changed", + ) + observed: dict[str, dict[str, float]] = { + objective: {} for objective in r3.mdcore.OBJECTIVES + } + was_training = executor.model.training + executor.model.eval() + executor.model._review_a5_r8_provenance_mode = "development" + executor.model._review_a5_r8_development_batches = [] + try: + with torch.no_grad(): + for batch in adapter.materialize_fixed_development( + base_cell_id, + device=device, + parent_batch_size=32, + ): + md_inputs, _ = package.collate( + batch.parent_ids, + split="development", + epoch=0, + device=device, + ) + inputs = dict(batch.model_inputs) + inputs.update(md_inputs) + output = executor.model(**inputs) + for objective in r3.mdcore.OBJECTIVES: + losses = output.parent_losses[objective] + indices = output.loss_parent_indices[objective] + if not executor.coefficients[objective]: + r3.require( + losses is None and indices is None, + f"disabled {objective} emitted dev loss", + ) + continue + r3.require( + isinstance(losses, torch.Tensor) + and isinstance(indices, torch.Tensor), + f"{objective} dev loss absent", + ) + for local_index, raw in zip( + indices.detach().cpu().tolist(), + losses.detach().cpu().tolist(), + ): + parent_id = batch.parent_ids[int(local_index)] + r3.require( + parent_id not in observed[objective], + f"{objective} dev parent repeated", + ) + observed[objective][parent_id] = float(raw) + del output + finally: + executor.model._review_a5_r8_provenance_mode = "train" + executor.model.train(was_training) + raw_means: dict[str, float | None] = {} + normalized: dict[str, float | None] = {} + counts: dict[str, int] = {} + total = 0.0 + for objective in r3.mdcore.OBJECTIVES: + if executor.coefficients[objective]: + r3.require( + set(observed[objective]) == set(expected[objective]), + f"{objective} development roster incomplete", + ) + values = [observed[objective][parent_id] for parent_id in expected[objective]] + mean = r3.math.fsum(values) / len(values) + value = mean / executor.null_scales[objective] + raw_means[objective], normalized[objective], counts[objective] = ( + mean, + value, + len(values), + ) + total += value / r3.mdcore.LOSS_DENOMINATOR + else: + r3.require( + not observed[objective], + f"disabled {objective} accumulated dev loss", + ) + raw_means[objective], normalized[objective], counts[objective] = None, None, 0 + provenance_chain = executor.r5._recursive_state_sha256( + executor.model._review_a5_r8_development_batches + ) + return { + "raw_parent_means": raw_means, + "normalized_losses": normalized, + "parent_counts": counts, + "total_normalized_loss": total, + "native_surface_sha256": contract.surface_sha256, + "native_contract_sha256": contract.contract_sha256, + "r4_provenance_chain_sha256": provenance_chain, + } + + +r3.fixed_development = fixed_development +r3.__file__ = __file__ + + +if __name__ == "__main__": + r3.main() diff --git a/releases/2026-10-02/bertose_workbench.py b/releases/2026-10-02/bertose_workbench.py new file mode 100644 index 0000000000000000000000000000000000000000..b2936bc2ee328adf9aed83ba3073c85c182fec56 --- /dev/null +++ b/releases/2026-10-02/bertose_workbench.py @@ -0,0 +1,184 @@ +"""Convenient BERTose embeddings and exploratory NumPy comparisons. + +Encoder reuses the released checkpoint loader, tokenizer and embedding function. +Cosine neighbors and PCA describe representation geometry; they are exploratory +outputs, not binding predictions or evidence of model quality. +""" +from pathlib import Path + +import numpy as np + + +ENCODER_REPO = "supanthadey1/bertose-glycan-encoder" +RELEASE_PREFIX = "releases/2026-09-28/variants" + + +def _variant(value): + value = str(value) + if value.startswith("WA"): + value = value[2:] + if value not in {"1", "2", "3", "4", "5"}: + raise ValueError("variant must be 1, 2, 3, 4 or 5 (WA1-WA5 are also accepted)") + return value + + +def _positive_integer(value, name): + if isinstance(value, (bool, np.bool_)) or not isinstance(value, (int, np.integer)) or value < 1: + raise ValueError(name + " must be a positive integer") + return int(value) + + +class Encoder: + """Load one strict, hash-verified BERTose sequence export. + + encode() always returns an N x 768 array, including for one WURCS string. + Use encode_with_diagnostics() to inspect unknown tokens and tree-channel + availability. The original tokenizer's 256-token limit remains unchanged. + """ + + def __init__(self, checkpoint, variant="3", device="cpu"): + import bertose + + self.variant = _variant(variant) + self.checkpoint = Path(checkpoint) + self._encoder, self.metadata = bertose.load_encoder(self.checkpoint, self.variant, device) + self.tokenizer = bertose.load_tokenizer() + self._embed = bertose.embed + + @classmethod + def from_pretrained(cls, variant="3", revision="main", device="cpu", local_checkpoint=None): + """Download a released sequence export, or use an explicit local file. + + local_checkpoint uses no Hub import or network access. Otherwise install + huggingface_hub and supply a branch, tag or commit as revision. A missing + public release fails normally; an older checkpoint is never substituted. + The existing strict checkpoint hash/identity checks still apply. + """ + variant = _variant(variant) + if local_checkpoint is not None: + return cls(local_checkpoint, variant=variant, device=device) + if not isinstance(revision, str) or not revision.strip(): + raise ValueError("revision must be a nonempty branch, tag or commit") + try: + from huggingface_hub import hf_hub_download + except ImportError as exc: + raise ImportError("Install huggingface_hub to download weights, or provide local_checkpoint") from exc + checkpoint = hf_hub_download( + repo_id=ENCODER_REPO, + filename=f"{RELEASE_PREFIX}/variant-{variant}/sequence_encoder.pt", + revision=revision, + ) + return cls(checkpoint, variant=variant, device=device) + + def encode(self, wurcs, batch_size=8, pooling="first"): + """Return N x 768 embeddings for one WURCS string or an iterable. + + first pools the START token; mean includes all attended tokens, including + START and END. Batch size controls inference memory use, not model math. + """ + vectors, _ = self.encode_with_diagnostics(wurcs, batch_size=batch_size, pooling=pooling) + return vectors + + def encode_with_diagnostics(self, wurcs, batch_size=8, pooling="first"): + """Return (N x 768 array, per-input tokenizer diagnostics) in input order.""" + batch_size = _positive_integer(batch_size, "batch_size") + if pooling not in ("first", "mean"): + raise ValueError("pooling must be first or mean") + if isinstance(wurcs, str): + rows = [wurcs] + else: + try: + rows = list(wurcs) + except TypeError as exc: + raise ValueError("Provide a WURCS string or an iterable of WURCS strings") from exc + if not rows or any(not isinstance(row, str) or not row.startswith("WURCS=2.0/") for row in rows): + raise ValueError("Provide at least one WURCS 2.0 string") + vectors, diagnostics = [], [] + for start in range(0, len(rows), batch_size): + batch = rows[start:start + batch_size] + matrix, records = self._embed(batch, self._encoder, self.tokenizer, pooling) + if matrix.shape != (len(batch), 768) or not np.isfinite(matrix).all() or len(records) != len(batch): + raise ValueError("Unexpected embedding shape, values or diagnostic count") + vectors.append(matrix) + diagnostics.extend(records) + return np.concatenate(vectors, axis=0), diagnostics + + +def _matrix(value, name, *, allow_single=True): + try: + array = np.asarray(value) + except (TypeError, ValueError) as exc: + raise ValueError(name + " must be a rectangular array of real numbers") from exc + if array.dtype.kind not in "iuf": + raise ValueError(name + " must contain real numbers") + if array.ndim == 1 and allow_single: + array = array[None, :] + if array.ndim != 2 or not array.shape[0] or not array.shape[1]: + raise ValueError(name + " must be a nonempty 2D matrix (or one vector where supported)") + array = array.astype(np.float64, copy=False) + if not np.isfinite(array).all(): + raise ValueError(name + " must contain only finite values") + return array + + +def _unit_rows(array): + # Scale before taking norms so finite large/small vectors remain usable. + scale = np.max(np.abs(array), axis=1, keepdims=True) + scaled = np.divide(array, scale, out=np.zeros_like(array), where=scale != 0) + norms = np.sqrt(np.sum(scaled * scaled, axis=1, keepdims=True)) + return np.divide(scaled, norms, out=np.zeros_like(scaled), where=norms != 0) + + +def cosine_similarity(query, reference): + """Return an N x M cosine matrix; a 1D input is treated as one row. + + Inputs must be finite real vectors with matching feature widths. Similarity + involving a zero-norm vector is defined as 0, including zero versus zero. + """ + query, reference = _matrix(query, "query"), _matrix(reference, "reference") + if query.shape[1] != reference.shape[1]: + raise ValueError("query and reference must have matching feature widths") + return np.clip(_unit_rows(query) @ _unit_rows(reference).T, -1.0, 1.0) + + +def nearest_neighbors(query, reference, k=5): + """Return (indices, scores), each N x k, sorted by descending cosine. + + k must be between 1 and the number of reference rows. Exact ties retain + reference-row order. Zero vectors follow cosine_similarity's zero policy. + Self-matches are included if query rows also occur in reference. + """ + k = _positive_integer(k, "k") + scores = cosine_similarity(query, reference) + if k > scores.shape[1]: + raise ValueError("k cannot exceed the number of reference rows") + indices = np.argsort(-scores, axis=1, kind="stable")[:, :k] + return indices, np.take_along_axis(scores, indices, axis=1) + + +def pca(vectors, n_components=2): + """Return centered N x n_components PCA coordinates for exploration. + + No fitted prediction head, labels or whitening are used. n_components must + be 1 through min(N, D). Constant directions can produce zero coordinates. + Component signs use a positive largest-magnitude loading for repeatability; + repeated singular values can still have nonunique component directions. + """ + vectors = _matrix(vectors, "vectors", allow_single=False) + n_components = _positive_integer(n_components, "n_components") + if n_components > min(vectors.shape): + raise ValueError("n_components cannot exceed min(number of rows, number of features)") + scale = np.max(np.abs(vectors)) + if scale == 0: + return np.zeros((vectors.shape[0], n_components), dtype=np.float64) + scaled = vectors / scale + centered = scaled - scaled.mean(axis=0, keepdims=True) + u, singular, loadings = np.linalg.svd(centered, full_matrices=False) + directions = loadings[:n_components] + anchors = np.argmax(np.abs(directions), axis=1) + signs = np.where(directions[np.arange(n_components), anchors] < 0, -1.0, 1.0) + with np.errstate(over="ignore", invalid="ignore"): + coordinates = (u[:, :n_components] * singular[:n_components] * signs) * scale + if not np.isfinite(coordinates).all(): + raise ValueError("PCA coordinates exceed the supported floating-point range") + return coordinates diff --git a/releases/2026-10-02/bertosebind_inference/README.md b/releases/2026-10-02/bertosebind_inference/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f48f8aa00814424be32691d4dae528d7f1d5b9c8 --- /dev/null +++ b/releases/2026-10-02/bertosebind_inference/README.md @@ -0,0 +1,65 @@ +# BERToseBind fitted-model inference + +This entrypoint loads one of the nine released fitted BERToseBind checkpoints and predicts from the released cached glycan and protein inputs. It uses the public `affinose/` model and collate function. It performs no training, refitting, calibration or metric computation. + +The fitted checkpoint supplies all 272 state entries, including the complete 209-entry glycan encoder. Loading is strict, on CPU in float32, with the checkpoint's recorded SHA256 checked first. No separate upstream checkpoint is needed and no keys are remapped. `config.json` records the exact nine identities, constructor and scientific input hashes. + +## Environment and invocation + +Run from the release `code/` directory. Use its existing `requirements-analysis.txt`, which includes PyTorch, NumPy, h5py and pandas. pandas is needed by the original dataset module that supplies `collate_fn`; the inference entrypoint does not import the training runner or require its optimizer. The portable wrapper passed all nine loads and 18 reference predictions with zero difference in Nova job 16683971; the executed environment used Python 3.10.16, PyTorch 2.9.1, NumPy 2.2.6 and h5py 3.16.0 on CPU. + +The data layout is `data/bertosebind/features/` for the eight glycan files (seven NPY arrays and one index) and an explicitly supplied protein HDF5 path. Weights are supplied separately as `CELL_ID/best_model.pt`. Paths may point anywhere; the expected input and model hashes remain fixed. + +```bash +python -m bertosebind_inference.predict \ + --checkpoint /absolute/path/to/mo_A_glycan_s42/best_model.pt \ + --cell-id mo_A_glycan_s42 \ + --pairs bertosebind_inference/examples/glycan_cold.csv \ + --features-dir ../data/bertosebind/features \ + --protein-h5 /absolute/path/to/affinose_v2_esmc_by_seqhash_r2.h5 \ + --batch-size 2 --threads 4 \ + --output /new/path/predictions.json +``` + +`--motif-features` and `--feature-index` support files stored separately from the feature directory. Output is a new JSON file containing sample IDs, scores, the fitted identity, scientific input hashes, processed input tensor hashes and runtime versions. Existing output files are not overwritten. A score is the trained model's regression output, not a calibrated binding probability or affinity constant. + +The input CSV requires unique nonempty `sample_id`, `protein_id` and `glycan_wurcs` columns. Optional `has_conc` and `log_conc` default to zero. Labels are not required; the original collate function receives a zero target placeholder that is never passed to the model. Protein IDs retain whitespace exactly. The CLI supports pairs represented in the pinned released feature/cache population; it does not generate new ESM-C embeddings or annotate new glycans. + +## Preserved input contract + +- Glycans use all 256 sealed token positions and their matching branch-depth, linkage and attention-mask rows. Unknown glycans or invalid tree channels fail explicitly. The vocabulary is 2,114 tokens; depth and linkage tables have 203 and 10 entries. +- The 165 motif columns are raw float32 counts. The training-bound array contains values 0–13. Values are not binarized, capped, normalized or reordered. The exact array hash binds the motif column order. +- Protein inputs are per-residue 960-dimensional ESM-C vectors. HDF5 keys decode `|` to `/`; raw IDs, including trailing spaces, remain unchanged. The cache includes BOS/EOS vectors: remove the first and last rows when the stored length is at least three, then truncate to 1,024 residues. Supplying a pretrimmed cache would apply trimming twice and is rejected by the fixed hash. +- The original `dataset_v8.collate_fn` pads proteins and constructs masks. The model remains in evaluation mode under `torch.inference_mode()`; its actual forward implementation is unchanged. + +The reader verifies the complete input files once per invocation, including the protein HDF5. Hashing that 2.33 GB file incurs I/O even for two examples. It loads only requested protein arrays into memory. Keep these checks on a compute node when using HPC storage; never run this workload on a Nova login node. + +## Real held-out examples and validation + +The three example CSVs contain two fixed real held-out protein/glycan pairs per regime, exactly those used by successful Nova smoke job 16662857. `examples/reference.json` preserves original CSV row indices, targets as provenance, feature rows, selection-input hashes, processed tensor hashes and all 18 reference CPU predictions. The examples are a mechanical loading check and are too small to evaluate model quality. + +The following command exercises the new portable code with all nine downloaded fits. It requires exact equality of the processed input tensor hashes and compares finite CPU predictions to the prior smoke with absolute tolerance `2e-6` and zero relative tolerance. The report records actual differences; a mismatch is a failure, not benchmark evidence. + +```bash +python -m bertosebind_inference.check_real_examples \ + --checkpoints-dir /absolute/path/to/weights/bertosebind \ + --features-dir ../data/bertosebind/features \ + --protein-h5 /absolute/path/to/affinose_v2_esmc_by_seqhash_r2.h5 \ + --threads 4 --report /new/path/bertosebind_portable_check.json +``` + +For an existing layout such as Nova, replace `--checkpoints-dir` with `--checkpoint-map paths.json`, where the JSON object maps each of the nine `cell_id` keys in `config.json` to its explicit checkpoint path. Use `--motif-features` for a separately stored motif array. This plan reuses the recorded real arrays and protein cache; it does not synthesize replacement features, export model weights or submit a job itself. + +The implementation can also be imported: + +```python +from bertosebind_inference import CachedInputs, load_model, predict_batch +from bertosebind_inference.loader import read_pairs + +model, identity = load_model(checkpoint_path, "mo_A_glycan_s42") +with CachedInputs(features_dir, protein_h5_path) as inputs: + batch, provenance = inputs.batch(read_pairs(pairs_csv)) + scores = predict_batch(model, batch) +``` + +The same per-batch preprocessing is used by the CLI and validation command. Large input lists should be split into small batches. CPU results are not a claim of CUDA AMP equality, historical benchmark reproduction or broader IAR functionality. Glycan generation, protein embedding generation, dataset terms and distribution of the separately supplied scientific inputs remain outside this loader. diff --git a/releases/2026-10-02/bertosebind_inference/__init__.py b/releases/2026-10-02/bertosebind_inference/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b3d47a5b2811b0cb0c5e864a3991fe767318c41b --- /dev/null +++ b/releases/2026-10-02/bertosebind_inference/__init__.py @@ -0,0 +1,5 @@ +"""CPU inference for the nine released fitted BERToseBind models.""" + +from .loader import CachedInputs, load_model, predict_batch + +__all__ = ["CachedInputs", "load_model", "predict_batch"] diff --git a/releases/2026-10-02/bertosebind_inference/check_real_examples.py b/releases/2026-10-02/bertosebind_inference/check_real_examples.py new file mode 100644 index 0000000000000000000000000000000000000000..bc560d58975d095f7562e94c6b2ef40fafa69028 --- /dev/null +++ b/releases/2026-10-02/bertosebind_inference/check_real_examples.py @@ -0,0 +1,95 @@ +"""Check all nine public fitted loaders against the saved tiny real CPU smoke.""" +from pathlib import Path +import argparse +import json +import platform +import traceback + +from .loader import (CachedInputs, CONFIG_PATH, config, file_sha, load_model, predict_batch, + read_pairs, require, tensor_record) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument("--checkpoints-dir", type=Path, + help="Directory containing CELL_ID/best_model.pt for all nine fits") + group.add_argument("--checkpoint-map", type=Path, + help="JSON object mapping each cell_id to an explicit checkpoint path") + parser.add_argument("--features-dir", type=Path, required=True) + parser.add_argument("--protein-h5", type=Path, required=True) + parser.add_argument("--motif-features", type=Path) + parser.add_argument("--feature-index", type=Path) + parser.add_argument("--threads", type=int, choices=range(1, 9), default=4) + parser.add_argument("--report", type=Path, required=True) + args = parser.parse_args() + require(not args.report.exists(), "Refusing to overwrite an existing report") + require(args.report.parent.is_dir(), "Report parent directory must exist") + cfg = config() + examples = Path(__file__).with_name("examples") + reference = json.loads((examples / "reference.json").read_text()) + checkpoints = (json.loads(args.checkpoint_map.read_text()) if args.checkpoint_map else + {cell: str(args.checkpoints_dir / cell / "best_model.pt") for cell in cfg["checkpoints"]}) + require(set(checkpoints) == set(cfg["checkpoints"]), "Checkpoint map must contain exactly the nine released cells") + report = {"schema": "bertosebind_portable_real_smoke_v1", "status": "RUNNING", + "scope": "Nine strict fitted-state loads and 18 CPU float32 predictions on six fixed real rows; no metrics.", + "reference_receipt_sha256": reference["source_smoke_sha256"], + "config_sha256": file_sha(CONFIG_PATH), + "reference_json_sha256": file_sha(examples / "reference.json"), + "reference_prediction_atol": 2e-6, "reference_prediction_rtol": 0.0, + "models": []} + error = None + try: + import numpy as np + import torch + import h5py + torch.set_num_threads(args.threads) + torch.set_num_interop_threads(1) + report["runtime"] = {"python": platform.python_version(), "torch": torch.__version__, + "numpy": np.__version__, "h5py": h5py.__version__, + "device": "cpu", "precision": "float32", "threads": args.threads} + with CachedInputs(args.features_dir, args.protein_h5, motif_features=args.motif_features, + feature_index=args.feature_index) as inputs: + report["input_assets"] = inputs.asset_records + batches = {} + report["batches"] = {} + for regime, item in reference["example_files"].items(): + path = examples / item["filename"] + require(file_sha(path) == item["sha256"], "Example CSV hash differs") + rows = read_pairs(path) + require(len(rows) == 2, "Expected two real examples per regime") + batch, provenance = inputs.batch(rows) + tensors = {k: tensor_record(v) for k, v in batch.items() if k != "target"} + require(tensors == reference["input_tensor_hashes"][regime], + "Real input tensor identities differ from the original smoke") + batches[regime] = batch + report["batches"][regime] = {"rows": provenance, "tensors": tensors} + for cell_id, identity in cfg["checkpoints"].items(): + model, loaded = load_model(checkpoints[cell_id], cell_id) + prediction = predict_batch(model, batches[identity["regime"]]) + expected = np.asarray(reference["models"][cell_id]["prediction"], dtype=np.float32) + actual = prediction.numpy() + delta = float(np.max(np.abs(actual - expected))) + item = {**loaded, "prediction": prediction.tolist(), + "prediction_tensor": tensor_record(prediction), + "reference_max_abs_difference": delta, + "reference_within_tolerance": bool(np.allclose(actual, expected, rtol=0, atol=2e-6))} + report["models"].append(item) + del model + require(item["reference_within_tolerance"], f"CPU reference comparison failed: {cell_id}") + require(len(report["models"]) == 9, "Not all nine models completed") + report["status"] = "PASS_STRICT_LOAD_AND_TINY_REAL_CPU_REFERENCE_CHECK" + except Exception as exc: + error = exc + report.update(status="FAILED_NO_COMPLETION_CLAIM", error_type=type(exc).__name__, + error=str(exc), traceback=traceback.format_exc()) + with args.report.open("x") as handle: + json.dump(report, handle, indent=2, allow_nan=False) + handle.write("\n") + if error is not None: + raise SystemExit(f"FAILED; details saved to {args.report}: {error}") + print(f"PASS: nine strict loads and 18 finite predictions; {args.report}") + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/bertosebind_inference/config.json b/releases/2026-10-02/bertosebind_inference/config.json new file mode 100644 index 0000000000000000000000000000000000000000..db5248deb6ec46c9a66381b39ca246d41f720529 --- /dev/null +++ b/releases/2026-10-02/bertosebind_inference/config.json @@ -0,0 +1,142 @@ +{ + "schema": "bertosebind_portable_config_v1", + "scope": "Nine exact fitted models; CPU float32 inference from the released sealed feature arrays and per-residue ESM-C cache. No training or refitting.", + "constructor": { + "glycan_dim": 768, + "protein_dim": 960, + "shared_dim": 512, + "num_cross_layers": 2, + "num_heads": 8, + "ffn_dim": 1024, + "swe_slices": 512, + "swe_ref_points": 64, + "head_hidden": 256, + "dropout": 0.1, + "separate_swe": false, + "pooling_mode": "mean", + "protein_attentive_pool": false, + "interaction_mode": "concat", + "use_cross_attention": true, + "glycan_size_channel": false, + "motif_additive_dim": 165, + "protein_mode": "real", + "protein_tower": true, + "protein_binding_channel": false + }, + "checkpoints": { + "mo_A_glycan_s42": { + "regime": "test_glycan_cold", + "seed": 42, + "sha256": "3303250c5aa34f7f20e605dafb138554302baa336598ec84645f196e7f906b52", + "filename": "best_model.pt", + "source_cell": "affinose_mo_20260908_mo_A_glycan_s42" + }, + "mo_C_doubly_s42": { + "regime": "test_doubly_cold", + "seed": 42, + "sha256": "e3872d4768fdcf5aa1d7be070cad8789a427332ba6741fdfa420d1c69f54b321", + "filename": "best_model.pt", + "source_cell": "affinose_mo_20260908_mo_C_doubly_s42" + }, + "mof_B_protein_s43": { + "regime": "test_protein_cold", + "seed": 43, + "sha256": "f143720e8ebd41ba247ddeac5a5b58971c9cc3c407361b8071cf7dd1c513b57d", + "filename": "best_model.pt", + "source_cell": "affinose_mof_20260909_mof_B_protein_s43" + }, + "mof_B_protein_s44": { + "regime": "test_protein_cold", + "seed": 44, + "sha256": "d43e1b62ce0b51b874d255544d63088f10735c85e57234eb9c420e8af3af88f1", + "filename": "best_model.pt", + "source_cell": "affinose_mof_20260909_mof_B_protein_s44" + }, + "mof_C_doubly_s43": { + "regime": "test_doubly_cold", + "seed": 43, + "sha256": "7b56d428df6c91ec02e3fa5aab4df73afba7127f020738548ae37b7048bb66a1", + "filename": "best_model.pt", + "source_cell": "affinose_mof_20260909_mof_C_doubly_s43" + }, + "mof_C_doubly_s44": { + "regime": "test_doubly_cold", + "seed": 44, + "sha256": "509a088a821250e6464c2f696aa1b53cc4f00443c73153c95a18afdfe53a621d", + "filename": "best_model.pt", + "source_cell": "affinose_mof_20260909_mof_C_doubly_s44" + }, + "mo_B_protein_s42": { + "regime": "test_protein_cold", + "seed": 42, + "sha256": "ebdc31defe4c7a6d105670626d2da50f7d29026e41c31f24bd5722079bb7a80d", + "filename": "best_model.pt", + "source_cell": "affinose_sa_20260908_mo_B_protein_s42" + }, + "moc_A_glycan_s43": { + "regime": "test_glycan_cold", + "seed": 43, + "sha256": "e2c0bebaaf53894bb928bc6b302c3eacfa5254d9c7301ff47854e98338b97ee3", + "filename": "best_model.pt", + "source_cell": "affinose_sa_20260908_moc_A_glycan_s43" + }, + "moc_A_glycan_s44": { + "regime": "test_glycan_cold", + "seed": 44, + "sha256": "c4adf409efbb985b1fceee6a398ac8be0c84946ea354791c95ae835ae59e67a4", + "filename": "best_model.pt", + "source_cell": "affinose_sa_20260908_moc_A_glycan_s44" + } + }, + "inputs": { + "token_ids": { + "filename": "review_token_ids.npy", + "sha256": "9dbdf73149ce8a3a1d4e1a5322f8a3de68e0f2e1a2e6a73733641e02a9b32ccd" + }, + "residue_ids": { + "filename": "review_residue_ids.npy", + "sha256": "ed6b472942d223ab1f17d1f6bfe7e9962e8b10e13e3d9c109a10a45c57d76fbf" + }, + "branch_depths": { + "filename": "review_branch_depths.npy", + "sha256": "afa8b69797891b529b212da41726c1d1269e06f26396370e2fcc0b77f25a5086" + }, + "linkage_types": { + "filename": "review_linkage_types.npy", + "sha256": "3440fc0db96dc3ecdfa315e390fe354c398ded75db8b9017569db7bf6c61610f" + }, + "attention_mask": { + "filename": "review_attention_mask.npy", + "sha256": "43cdb6ccd9c5e5ecc46aed5ed0c29801144526486e89ba3f611537cea13e8282" + }, + "tree_channels_valid": { + "filename": "review_tree_channels_valid.npy", + "sha256": "0c867a6e6fdf3a0b72d5fdb76023556d998ad286ef14f0f8f661d760b8f18a2c" + }, + "motif_features": { + "filename": "review_motif_features.npy", + "sha256": "d88c2d1342d27f572a27ec030579341a59d72bad89d552695d4db419ff3ceae2" + }, + "feature_index": { + "filename": "review_affinose_glycan_index.tsv.gz", + "sha256": "986c4282f79ba621afdd4ad8cfe58d29d79d819946e75d0eb2d9c2316d637a3d" + }, + "protein_h5": { + "filename": "affinose_v2_esmc_by_seqhash_r2.h5", + "sha256": "529ae25ecac7c03d0fc33f8f52f6cacec2db5103f27088d25e9adc06133fdef4" + } + }, + "source_evidence": { + "successful_real_input_smoke_sha256": "0054f7c7c02b3da1d533446e500f3b5b745892689eee698561f1830a6b1ffa58", + "smoke_manifest_sha256": "59abe9bc8840dc611948768ee735e77f3f6b4ae24fb84c2c050750c975e042ab", + "primary_checkpoint_pin_source": "bertosebind_new_runs/results/protein_probe.json", + "primary_checkpoint_pin_source_sha256": "4fd80f7396aa9803602fd62bd82ec3e98e1f937b46e1057cb26ffa56ea6c93f0", + "motif_contract_evidence_sha256": "30c55fbde593286bc6c8a812268fb11bb05e71871b343aa2f06c34ecfac5b16c" + }, + "limits": [ + "Raw motif values are retained: the pinned float32 array contains counts 0-13.", + "The default data reader accepts the pinned released scientific inputs; paths are portable, data semantics and byte identities are unchanged.", + "The protein HDF5 must contain original ESM-C BOS/EOS vectors; trimming occurs once in this loader.", + "CPU float32 example agreement is not benchmark reproduction, calibration or CUDA AMP equivalence." + ] +} diff --git a/releases/2026-10-02/bertosebind_inference/examples/doubly_cold.csv b/releases/2026-10-02/bertosebind_inference/examples/doubly_cold.csv new file mode 100644 index 0000000000000000000000000000000000000000..1007e46fb3aa011b831d6ab1435a57fe7402c077 --- /dev/null +++ b/releases/2026-10-02/bertosebind_inference/examples/doubly_cold.csv @@ -0,0 +1,3 @@ +sample_id,protein_id,glycan_wurcs,has_conc,log_conc +test_doubly_cold_1,5e12f5352b18bad814861826ba83fc7bee43e1fe3f5339dfe3334db6c0b4c97d,"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6-6/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f2-g1_h2-i1_i3-j1_j2-k1",0,0 +test_doubly_cold_2,5e12f5352b18bad814861826ba83fc7bee43e1fe3f5339dfe3334db6c0b4c97d,"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-3-4/a3-b1_a6-e1_b3-c1_c2-d1_e3-f1_f2-g1",0,0 diff --git a/releases/2026-10-02/bertosebind_inference/examples/glycan_cold.csv b/releases/2026-10-02/bertosebind_inference/examples/glycan_cold.csv new file mode 100644 index 0000000000000000000000000000000000000000..15021c079681d2041a7ba17c9a756a4c6d4db109 --- /dev/null +++ b/releases/2026-10-02/bertosebind_inference/examples/glycan_cold.csv @@ -0,0 +1,3 @@ +sample_id,protein_id,glycan_wurcs,has_conc,log_conc +test_glycan_cold_1,20ff6eff52d545b50f9ceebcc7713912e1c6874aae13b5f064d3b0818f441a07,"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6-6/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f2-g1_h2-i1_i3-j1_j2-k1",0,0 +test_glycan_cold_2,20ff6eff52d545b50f9ceebcc7713912e1c6874aae13b5f064d3b0818f441a07,"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-3-4/a3-b1_a6-e1_b3-c1_c2-d1_e3-f1_f2-g1",0,0 diff --git a/releases/2026-10-02/bertosebind_inference/examples/protein_cold.csv b/releases/2026-10-02/bertosebind_inference/examples/protein_cold.csv new file mode 100644 index 0000000000000000000000000000000000000000..3edde88243d606a77f125e80709ec73b0b52443f --- /dev/null +++ b/releases/2026-10-02/bertosebind_inference/examples/protein_cold.csv @@ -0,0 +1,3 @@ +sample_id,protein_id,glycan_wurcs,has_conc,log_conc +test_protein_cold_1,5e12f5352b18bad814861826ba83fc7bee43e1fe3f5339dfe3334db6c0b4c97d,"WURCS=2.0/2,2,1/[u2112h][a1221m-1a_1-5]/1-2/a2-b1",0,0 +test_protein_cold_2,5e12f5352b18bad814861826ba83fc7bee43e1fe3f5339dfe3334db6c0b4c97d,"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b2-c1_b3-d1_d3-e1_e2-f1",0,0 diff --git a/releases/2026-10-02/bertosebind_inference/examples/reference.json b/releases/2026-10-02/bertosebind_inference/examples/reference.json new file mode 100644 index 0000000000000000000000000000000000000000..08ca61f609f16a447103502967e17714451e12fd --- /dev/null +++ b/releases/2026-10-02/bertosebind_inference/examples/reference.json @@ -0,0 +1,487 @@ +{ + "schema": "bertosebind_real_example_reference_v1", + "source_smoke_sha256": "0054f7c7c02b3da1d533446e500f3b5b745892689eee698561f1830a6b1ffa58", + "source_job": "16662857", + "scope": "Two fixed real held-out rows per regime; reference CPU float32 predictions only, no metric claim.", + "example_files": { + "test_glycan_cold": { + "filename": "glycan_cold.csv", + "sha256": "c50e124eba39a8bb5f08e4d75e54b0f168ff74ee886d7f28e3156b3beba6ad96" + }, + "test_protein_cold": { + "filename": "protein_cold.csv", + "sha256": "6d70ea272cb716c7bf001675493496bfe7491add0185c010f83417a8ed607784" + }, + "test_doubly_cold": { + "filename": "doubly_cold.csv", + "sha256": "d748e004c483597c86cc214ecd43f5c902e3d3ced41d1e9223b555dfa3b9ed58" + } + }, + "fixtures": { + "test_glycan_cold": [ + { + "csv_row_0based": 521410, + "feature_row": 3482, + "record": { + "protein_id": "20ff6eff52d545b50f9ceebcc7713912e1c6874aae13b5f064d3b0818f441a07", + "glycan_wurcs": "WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6-6/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f2-g1_h2-i1_i3-j1_j2-k1", + "target_rank": "0.1923076923076923", + "exp_id": "gw_row_0000", + "source": "glycowork" + } + }, + { + "csv_row_0based": 521411, + "feature_row": 2438, + "record": { + "protein_id": "20ff6eff52d545b50f9ceebcc7713912e1c6874aae13b5f064d3b0818f441a07", + "glycan_wurcs": "WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-3-4/a3-b1_a6-e1_b3-c1_c2-d1_e3-f1_f2-g1", + "target_rank": "0.8846153846153846", + "exp_id": "gw_row_0000", + "source": "glycowork" + } + } + ], + "test_protein_cold": [ + { + "csv_row_0based": 520085, + "feature_row": 383, + "record": { + "protein_id": "5e12f5352b18bad814861826ba83fc7bee43e1fe3f5339dfe3334db6c0b4c97d", + "glycan_wurcs": "WURCS=2.0/2,2,1/[u2112h][a1221m-1a_1-5]/1-2/a2-b1", + "target_rank": "0.5411255411255411", + "exp_id": "gw_row_0002", + "source": "glycowork" + } + }, + { + "csv_row_0based": 520086, + "feature_row": 2313, + "record": { + "protein_id": "5e12f5352b18bad814861826ba83fc7bee43e1fe3f5339dfe3334db6c0b4c97d", + "glycan_wurcs": "WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b2-c1_b3-d1_d3-e1_e2-f1", + "target_rank": "0.6190476190476191", + "exp_id": "gw_row_0002", + "source": "glycowork" + } + } + ], + "test_doubly_cold": [ + { + "csv_row_0based": 410438, + "feature_row": 3482, + "record": { + "protein_id": "5e12f5352b18bad814861826ba83fc7bee43e1fe3f5339dfe3334db6c0b4c97d", + "glycan_wurcs": "WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6-6/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f2-g1_h2-i1_i3-j1_j2-k1", + "target_rank": "0.6538461538461539", + "exp_id": "gw_row_0002", + "source": "glycowork" + } + }, + { + "csv_row_0based": 410439, + "feature_row": 2438, + "record": { + "protein_id": "5e12f5352b18bad814861826ba83fc7bee43e1fe3f5339dfe3334db6c0b4c97d", + "glycan_wurcs": "WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-3-4/a3-b1_a6-e1_b3-c1_c2-d1_e3-f1_f2-g1", + "target_rank": "0.6153846153846154", + "exp_id": "gw_row_0002", + "source": "glycowork" + } + } + ] + }, + "models": { + "mo_A_glycan_s42": { + "regime": "test_glycan_cold", + "seed": 42, + "checkpoint_sha256": "3303250c5aa34f7f20e605dafb138554302baa336598ec84645f196e7f906b52", + "prediction": [ + 0.5873219966888428, + 0.45968011021614075 + ], + "prediction_tensor": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "0017409eaf9e47aad3b5b80fd7f19dd5a795249e4e207dc9d9c912c63bf87a8c" + } + }, + "mo_C_doubly_s42": { + "regime": "test_doubly_cold", + "seed": 42, + "checkpoint_sha256": "e3872d4768fdcf5aa1d7be070cad8789a427332ba6741fdfa420d1c69f54b321", + "prediction": [ + 0.741499662399292, + 0.47093114256858826 + ], + "prediction_tensor": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "f8511fd8befcb061cef02d12d6ae175369b363092e26a0acc062ef357bf66fe9" + } + }, + "mof_B_protein_s43": { + "regime": "test_protein_cold", + "seed": 43, + "checkpoint_sha256": "f143720e8ebd41ba247ddeac5a5b58971c9cc3c407361b8071cf7dd1c513b57d", + "prediction": [ + 0.5591476559638977, + 0.44217923283576965 + ], + "prediction_tensor": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "1f19f386e0f73440f96e125d5c904649c222b93300932b8610d10f9425441af5" + } + }, + "mof_B_protein_s44": { + "regime": "test_protein_cold", + "seed": 44, + "checkpoint_sha256": "d43e1b62ce0b51b874d255544d63088f10735c85e57234eb9c420e8af3af88f1", + "prediction": [ + 0.4905407726764679, + 0.32159534096717834 + ], + "prediction_tensor": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "8060efc719945dccf964e0ea905da8f4c4e3ca0b7018a7b4371e8ffc1d14b7c7" + } + }, + "mof_C_doubly_s43": { + "regime": "test_doubly_cold", + "seed": 43, + "checkpoint_sha256": "7b56d428df6c91ec02e3fa5aab4df73afba7127f020738548ae37b7048bb66a1", + "prediction": [ + 0.7000229358673096, + 0.4825187921524048 + ], + "prediction_tensor": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "addcc1b92f836a35ac5ad1504491367b01841797369858c80c97b7278be3cd7e" + } + }, + "mof_C_doubly_s44": { + "regime": "test_doubly_cold", + "seed": 44, + "checkpoint_sha256": "509a088a821250e6464c2f696aa1b53cc4f00443c73153c95a18afdfe53a621d", + "prediction": [ + 0.7071646451950073, + 0.5201219916343689 + ], + "prediction_tensor": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "74def51377b965d38589adf1345b0f28e48a8570fa7f3cfe0b82e47abeea252b" + } + }, + "mo_B_protein_s42": { + "regime": "test_protein_cold", + "seed": 42, + "checkpoint_sha256": "ebdc31defe4c7a6d105670626d2da50f7d29026e41c31f24bd5722079bb7a80d", + "prediction": [ + 0.4467400312423706, + 0.41338619589805603 + ], + "prediction_tensor": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "77387b5c5f2578320fc5d2e353f818447153d3f84adf8d88d7fd4ddda475dc99" + } + }, + "moc_A_glycan_s43": { + "regime": "test_glycan_cold", + "seed": 43, + "checkpoint_sha256": "e2c0bebaaf53894bb928bc6b302c3eacfa5254d9c7301ff47854e98338b97ee3", + "prediction": [ + 0.7180902361869812, + 0.49870437383651733 + ], + "prediction_tensor": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "5584c77cd95944f729e9098cb0b222caf37c8088d517d9ba76e1e83346c12652" + } + }, + "moc_A_glycan_s44": { + "regime": "test_glycan_cold", + "seed": 44, + "checkpoint_sha256": "c4adf409efbb985b1fceee6a398ac8be0c84946ea354791c95ae835ae59e67a4", + "prediction": [ + 0.6938773989677429, + 0.5553831458091736 + ], + "prediction_tensor": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "b54b95796d478093173470505a0e256e189fbe18576a29689f8eb8db11029129" + } + } + }, + "input_tensor_hashes": { + "test_glycan_cold": { + "token_ids": { + "shape": [ + 2, + 256 + ], + "dtype": "int64", + "sha256_c_order_bytes": "69673bdffe2e4133d4e6e05df90681c63ad2a51c6111690f09964d1a1c56adf7" + }, + "attention_mask": { + "shape": [ + 2, + 256 + ], + "dtype": "float32", + "sha256_c_order_bytes": "72839edbc9598b0738bf6e4da21564b1df69bf570f57de1769b31e244e032570" + }, + "branch_depths": { + "shape": [ + 2, + 256 + ], + "dtype": "int64", + "sha256_c_order_bytes": "569494ae56bce317204e3bcd507ad7b77bcf7a7aa191cff6cad00884dc4f1c67" + }, + "linkage_types": { + "shape": [ + 2, + 256 + ], + "dtype": "int64", + "sha256_c_order_bytes": "a696cb98e14473679ee57175d6bf407443192b0651414541a54b2648239eaf7e" + }, + "motif_features": { + "shape": [ + 2, + 165 + ], + "dtype": "float32", + "sha256_c_order_bytes": "129ec4be27a71c13c9e29cd5fff3486d9c0bb14238de95de300b4f8de0963a29" + }, + "protein_emb": { + "shape": [ + 2, + 366, + 960 + ], + "dtype": "float32", + "sha256_c_order_bytes": "d7c8ebc6150aa22a384e96653f37aeb8fd69565ae09cf348632b88b338abfd87" + }, + "protein_mask": { + "shape": [ + 2, + 366 + ], + "dtype": "float32", + "sha256_c_order_bytes": "d7e656b925e52badfd4a920eccf167ef26bdfff1c2f97ed858fffc59f7a68aa8" + }, + "has_conc": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "af5570f5a1810b7af78caf4bc70a660f0df51e42baf91d4de5b2328de0e83dfc" + }, + "log_conc": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "af5570f5a1810b7af78caf4bc70a660f0df51e42baf91d4de5b2328de0e83dfc" + } + }, + "test_protein_cold": { + "token_ids": { + "shape": [ + 2, + 256 + ], + "dtype": "int64", + "sha256_c_order_bytes": "a5e82e33b3270bd0c8e0aa3543f13217416bae2af7eeb5b087e5f73f0e1c0727" + }, + "attention_mask": { + "shape": [ + 2, + 256 + ], + "dtype": "float32", + "sha256_c_order_bytes": "8e4bc244acd401dfe2a08fa44ba71ee2cac6b3b6dff493608646cca347c05584" + }, + "branch_depths": { + "shape": [ + 2, + 256 + ], + "dtype": "int64", + "sha256_c_order_bytes": "7bd8f38cb3eb3b928985bb32aaf5d22b976a02a623ec1ce91132f07b3f2971b5" + }, + "linkage_types": { + "shape": [ + 2, + 256 + ], + "dtype": "int64", + "sha256_c_order_bytes": "63def9b8455797cb5f170eb4db45542fe3b03cd3d4fd5a61a4919b9a846ea6d4" + }, + "motif_features": { + "shape": [ + 2, + 165 + ], + "dtype": "float32", + "sha256_c_order_bytes": "ef654686e780bdb241f739a0ab223e331332cd646fd926ff6fd0ab54006304bc" + }, + "protein_emb": { + "shape": [ + 2, + 495, + 960 + ], + "dtype": "float32", + "sha256_c_order_bytes": "4f7717a19ea6ff7e123620b9c4f529e81dbb992ccb60b48e599208a783ade8df" + }, + "protein_mask": { + "shape": [ + 2, + 495 + ], + "dtype": "float32", + "sha256_c_order_bytes": "a234b2f972caa4b2be9a6d06b2ad74a52726a5a9107364536630b40537ddb34f" + }, + "has_conc": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "af5570f5a1810b7af78caf4bc70a660f0df51e42baf91d4de5b2328de0e83dfc" + }, + "log_conc": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "af5570f5a1810b7af78caf4bc70a660f0df51e42baf91d4de5b2328de0e83dfc" + } + }, + "test_doubly_cold": { + "token_ids": { + "shape": [ + 2, + 256 + ], + "dtype": "int64", + "sha256_c_order_bytes": "69673bdffe2e4133d4e6e05df90681c63ad2a51c6111690f09964d1a1c56adf7" + }, + "attention_mask": { + "shape": [ + 2, + 256 + ], + "dtype": "float32", + "sha256_c_order_bytes": "72839edbc9598b0738bf6e4da21564b1df69bf570f57de1769b31e244e032570" + }, + "branch_depths": { + "shape": [ + 2, + 256 + ], + "dtype": "int64", + "sha256_c_order_bytes": "569494ae56bce317204e3bcd507ad7b77bcf7a7aa191cff6cad00884dc4f1c67" + }, + "linkage_types": { + "shape": [ + 2, + 256 + ], + "dtype": "int64", + "sha256_c_order_bytes": "a696cb98e14473679ee57175d6bf407443192b0651414541a54b2648239eaf7e" + }, + "motif_features": { + "shape": [ + 2, + 165 + ], + "dtype": "float32", + "sha256_c_order_bytes": "129ec4be27a71c13c9e29cd5fff3486d9c0bb14238de95de300b4f8de0963a29" + }, + "protein_emb": { + "shape": [ + 2, + 495, + 960 + ], + "dtype": "float32", + "sha256_c_order_bytes": "4f7717a19ea6ff7e123620b9c4f529e81dbb992ccb60b48e599208a783ade8df" + }, + "protein_mask": { + "shape": [ + 2, + 495 + ], + "dtype": "float32", + "sha256_c_order_bytes": "a234b2f972caa4b2be9a6d06b2ad74a52726a5a9107364536630b40537ddb34f" + }, + "has_conc": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "af5570f5a1810b7af78caf4bc70a660f0df51e42baf91d4de5b2328de0e83dfc" + }, + "log_conc": { + "shape": [ + 2 + ], + "dtype": "float32", + "sha256_c_order_bytes": "af5570f5a1810b7af78caf4bc70a660f0df51e42baf91d4de5b2328de0e83dfc" + } + } + }, + "selection_inputs": { + "binding_test_glycan_cold": { + "filename": "review_affinose_A_glycan_binding.csv", + "sha256": "aa2c0104eb4ac96541081eaa2f0858a6b8575d2c83ce869822ee5107d12ddcb9" + }, + "roles_test_glycan_cold": { + "filename": "review_affinose_A_glycan_roles.tsv.gz", + "sha256": "0cbe9472948524d7d109968bbe3bfac16d76141f311c7c65bdabdf19d547a84b" + }, + "binding_test_protein_cold": { + "filename": "review_affinose_B_protein_binding.csv", + "sha256": "db08ac7409ae5f119a706f8acb7c486154f10f70f59571fa7306178032ec6990" + }, + "roles_test_protein_cold": { + "filename": "review_affinose_B_protein_roles.tsv.gz", + "sha256": "389cfe2552b0ddaf3da28e0136a6cff8198d437248c1a49627ecc44b0a9802cf" + }, + "binding_test_doubly_cold": { + "filename": "review_affinose_C_doubly_binding.csv", + "sha256": "e43e150423cb998a77037ad6d82c158a65431b59c46b168febf263ad36267df4" + }, + "roles_test_doubly_cold": { + "filename": "review_affinose_C_doubly_roles.tsv.gz", + "sha256": "5ee6c2d42ff93ea8484e273fb70cd47224745874a2949b1af4c429514cd69236" + } + } +} diff --git a/releases/2026-10-02/bertosebind_inference/loader.py b/releases/2026-10-02/bertosebind_inference/loader.py new file mode 100644 index 0000000000000000000000000000000000000000..d5b5cc4c21bf879107911b646d978f7d9aa0f991 --- /dev/null +++ b/releases/2026-10-02/bertosebind_inference/loader.py @@ -0,0 +1,226 @@ +"""Strict fitted-state loading and the original cached-input forward contract.""" +from pathlib import Path +import csv +import gzip +import hashlib +import json + + +CONFIG_PATH = Path(__file__).with_name("config.json") +FORWARD_KEYS = ( + "token_ids", "attention_mask", "branch_depths", "linkage_types", "protein_emb", + "protein_mask", "motif_features", "log_conc", "has_conc", +) + + +def config(): + return json.loads(CONFIG_PATH.read_text()) + + +def file_sha(path): + digest = hashlib.sha256() + with Path(path).open("rb") as handle: + for block in iter(lambda: handle.read(4 << 20), b""): + digest.update(block) + return digest.hexdigest() + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def verify_file(path, expected): + path = Path(path) + actual = file_sha(path) + require(actual == expected, f"SHA256 mismatch: {path}") + return {"path": str(path.resolve()), "bytes": path.stat().st_size, "sha256": actual} + + +def tensor_record(tensor): + array = tensor.detach().cpu().contiguous().numpy() + return {"shape": list(array.shape), "dtype": str(array.dtype), + "sha256_c_order_bytes": hashlib.sha256(array.tobytes()).hexdigest()} + + +def read_pairs(path): + """Keep raw protein IDs, including whitespace, exactly as supplied.""" + with Path(path).open(newline="") as handle: + reader = csv.DictReader(handle) + required = {"sample_id", "protein_id", "glycan_wurcs"} + require(required <= set(reader.fieldnames or []), + "Pairs CSV needs sample_id, protein_id and glycan_wurcs columns") + rows = list(reader) + require(bool(rows), "Pairs CSV is empty") + ids = [row["sample_id"] for row in rows] + require(all(ids) and len(set(ids)) == len(ids), "sample_id must be nonempty and unique") + require(all(row["protein_id"] and row["glycan_wurcs"].strip() for row in rows), + "Empty protein_id or glycan_wurcs") + return rows + + +def load_model(checkpoint, cell_id): + """Load one released fit on CPU; do not load or remap upstream weights.""" + cfg = config() + require(cell_id in cfg["checkpoints"], f"Unknown released cell: {cell_id}") + identity = cfg["checkpoints"][cell_id] + checkpoint_record = verify_file(checkpoint, identity["sha256"]) + import torch + from affinose.bertint_v8 import BertintV8 + from bertose_source.bert_training_v4.model.multimodal_glycan_bert_v3 import ( + MultimodalGlycanBERTConfig, ConvGlycanBERTEmbeddings, + ) + from bertose_source.bert_training_v4.model.glycan_bert import GlycanBERTLayer + + seq = MultimodalGlycanBERTConfig(seq_vocab_size=2114, seq_max_length=256).to_seq_config() + seq.max_branch_depth, seq.num_linkage_types = 203, 10 + embeddings = ConvGlycanBERTEmbeddings(seq) + layers = torch.nn.ModuleList([GlycanBERTLayer(seq) for _ in range(12)]) + embeddings.requires_grad_(False) + for layer in layers[:4]: + layer.requires_grad_(False) + model = BertintV8(embeddings, layers, **cfg["constructor"]).cpu().float() + require(len(model.state_dict()) == 272, "Unexpected constructed state inventory") + require(sum(p.numel() for p in model.parameters()) == 100209318, + "Unexpected constructed parameter count") + state = torch.load(checkpoint, map_location="cpu", weights_only=True) + if "model_state_dict" in state: + state = state["model_state_dict"] + require(len(state) == 272, "Expected all 272 fitted state entries") + model.load_state_dict(state, strict=True) + del state + require(torch.equal(model.seq_embeddings.position_ids, torch.arange(256).unsqueeze(0)), + "Unexpected persistent position IDs") + require(bool(torch.isfinite(model.motif_head.weight).all()) + and bool(torch.count_nonzero(model.motif_head.weight)), + "Fitted motif head is nonfinite or still zero-initialized") + model.eval().requires_grad_(False) + return model, {"cell_id": cell_id, "regime": identity["regime"], "seed": identity["seed"], + "checkpoint": checkpoint_record, "strict_load": True, "state_entries": 272, + "parameter_count": 100209318, "device": "cpu", "precision": "float32", + "upstream_checkpoint_loaded": False} + + +def glycan_sample(arrays, feature_row): + """Keep sealed 256-position channels and raw motif counts unchanged.""" + import numpy as np + import torch + sample = {} + for name, upper in (("token_ids", 2114), ("branch_depths", 203), ("linkage_types", 10)): + raw = np.array(arrays[name][feature_row], copy=True) + require(raw.shape == (256,) and np.issubdtype(raw.dtype, np.integer), + f"Expected 256 integer {name} values") + require(bool(((raw >= 0) & (raw < upper)).all()), f"Invalid {name}") + sample[name] = torch.tensor(raw, dtype=torch.long) + mask = np.array(arrays["attention_mask"][feature_row], copy=True) + require(mask.shape == (256,) and bool(((mask == 0) | (mask == 1)).all()) + and bool(mask.sum() > 0), "Invalid glycan attention mask") + sample["attention_mask"] = torch.tensor(mask, dtype=torch.long) + motif = np.array(arrays["motif_features"][feature_row], copy=True) + require(motif.shape == (165,) and bool(np.isfinite(motif).all()), + "Expected 165 finite raw motif values") + sample["motif_features"] = torch.tensor(motif, dtype=torch.float32) + return sample + + +class CachedInputs: + """Read the pinned released feature/cache files, loading only requested proteins.""" + + def __init__(self, features_dir, protein_h5, *, motif_features=None, feature_index=None): + import numpy as np + import h5py + cfg = config() + root = Path(features_dir) + paths = {name: root / item["filename"] for name, item in cfg["inputs"].items() + if name != "protein_h5"} + paths["protein_h5"] = Path(protein_h5) + if motif_features is not None: + paths["motif_features"] = Path(motif_features) + if feature_index is not None: + paths["feature_index"] = Path(feature_index) + # Byte seals bind feature order, vocabulary and the original protein cache. + self.asset_records = {name: verify_file(path, cfg["inputs"][name]["sha256"]) + for name, path in paths.items()} + names = ("token_ids", "residue_ids", "branch_depths", "linkage_types", + "attention_mask", "tree_channels_valid", "motif_features") + self.arrays = {name: np.load(paths[name], mmap_mode="r", allow_pickle=False) + for name in names} + n = self.arrays["token_ids"].shape[0] + require(all(a.shape[0] == n for a in self.arrays.values()), "Feature row counts differ") + require(self.arrays["token_ids"].shape == (n, 256), "Expected glycan width 256") + require(self.arrays["motif_features"].shape == (n, 165), "Expected motif width 165") + self.index = {} + with gzip.open(paths["feature_index"], "rt", newline="") as handle: + for row in csv.DictReader(handle, delimiter="\t"): + key = row["canonical_wurcs"].strip() + require(key not in self.index, "Duplicate glycan feature index entry") + self.index[key] = row + self.h5 = h5py.File(paths["protein_h5"], "r") + self.protein_keys = {} + try: + for key in self.h5.keys(): + decoded = key.replace("|", "/") + require(decoded not in self.protein_keys, "Ambiguous decoded protein key") + self.protein_keys[decoded] = key + except Exception: + self.h5.close() + raise + + def __enter__(self): + return self + + def __exit__(self, *exc): + self.h5.close() + + def batch(self, records): + import numpy as np + import torch + from affinose.dataset_v8 import collate_fn + require(bool(records), "Empty input batch") + samples, provenance, proteins = [], [], {} + for row in records: + wurcs = row["glycan_wurcs"].strip() + require(wurcs in self.index, "Glycan is absent from the sealed feature index") + index_row = self.index[wurcs] + j = int(index_row["feature_row"]) + require(index_row["tree_channels_valid"] == "True" + and bool(self.arrays["tree_channels_valid"][j]), "Invalid tree channels") + protein_id = row["protein_id"] + require(protein_id in self.protein_keys, f"Protein ID is absent from HDF5: {protein_id!r}") + if protein_id not in proteins: + raw = np.asarray(self.h5[self.protein_keys[protein_id]][:]) + emb = torch.from_numpy(raw).float() + if emb.dim() == 1: + emb = emb.unsqueeze(0) + require(emb.ndim == 2 and emb.shape[1] == 960, "Expected per-residue 960-D ESM-C") + original_shape = list(emb.shape) + if emb.shape[0] >= 3: + emb = emb[1:-1] + emb = emb[:1024].contiguous() + require(emb.shape[0] > 0 and bool(torch.isfinite(emb).all()), "Invalid protein input") + proteins[protein_id] = (emb, original_shape) + emb, original_shape = proteins[protein_id] + sample = glycan_sample(self.arrays, j) + concentration = [float(row.get(name, 0)) for name in ("has_conc", "log_conc")] + require(bool(np.isfinite(concentration).all()), "Nonfinite concentration metadata") + sample.update(protein_emb=emb, protein_length=emb.shape[0], + # collate_fn requires a target; it is never passed to the model. + target=torch.tensor(0.0, dtype=torch.float32), + has_conc=torch.tensor(concentration[0], dtype=torch.float32), + log_conc=torch.tensor(concentration[1], dtype=torch.float32)) + samples.append(sample) + provenance.append({"sample_id": row["sample_id"], "feature_row": j, + "protein_h5_key": self.protein_keys[protein_id], + "protein_before_bos_eos_shape": original_shape, + "protein_after_bos_eos_and_truncation": tensor_record(emb), + "motif_nonzero": int(torch.count_nonzero(sample["motif_features"]))}) + return collate_fn(samples), provenance + + +def predict_batch(model, batch): + import torch + with torch.inference_mode(): + prediction = model(**{name: batch[name] for name in FORWARD_KEYS}) + require(prediction.shape == (batch["token_ids"].shape[0],) + and bool(torch.isfinite(prediction).all()), "Invalid prediction shape or nonfinite score") + return prediction diff --git a/releases/2026-10-02/bertosebind_inference/local_checks.json b/releases/2026-10-02/bertosebind_inference/local_checks.json new file mode 100644 index 0000000000000000000000000000000000000000..5994b08434b76a708ee41cd961f80867e6048d5e --- /dev/null +++ b/releases/2026-10-02/bertosebind_inference/local_checks.json @@ -0,0 +1,61 @@ +{ + "schema": "bertosebind_portable_local_checks_v1", + "checked_utc": "2026-09-30T21:33:42.976459+00:00", + "status": "PASS_BOUNDED_LOCAL_CHECKS_REAL_FORWARD_PENDING", + "scope": "Syntax, CLI help, exact model/input identities, six real glycan/motif sample transformations and rejection of wrong checkpoint bytes. No fitted checkpoint or model was loaded, and no full forward or remote operation was executed.", + "runtime": { + "executable": "/opt/homebrew/opt/python@3.12/bin/python3.12", + "python": "3.12.4", + "torch": "2.9.1", + "numpy": "1.26.4", + "pandas": "2.3.3", + "h5py_available": false + }, + "checks": { + "all_python_ast_parse": true, + "predict_cli_help": true, + "real_check_cli_help": true, + "constructor_matches_successful_nova_smoke": true, + "nine_checkpoint_pins_match_successful_manifest": true, + "nine_scientific_input_pins_match_successful_manifest": true, + "real_example_csv_rows": 6, + "glycan_and_motif_tensor_hashes_match_prior_real_smoke": 15, + "raw_motif_count_2_preserved": true, + "wrong_checkpoint_rejected_before_deserialization": true, + "dataset_comment_correction_leaves_ast_identical": true, + "training_change_is_argument_help_only": true + }, + "new_files_sha256": { + "README.md": "7370cdf9152e66dedd0314d631f1d2c0571b9c7c3895d44f2729b16a704d24b1", + "__init__.py": "81f3da9b814892c3f12b2f7a535284b89f0be07b22bce50a374c8303d6db6c72", + "check_real_examples.py": "b7cfcdaf1c902664252f3d2022e290a803892a31618c1290c09c174131036541", + "config.json": "07282f0fec34ef2cf9f832c3662227ca89064b52e3fdbe9fd3ad11b5f4e01154", + "examples/doubly_cold.csv": "d748e004c483597c86cc214ecd43f5c902e3d3ced41d1e9223b555dfa3b9ed58", + "examples/glycan_cold.csv": "c50e124eba39a8bb5f08e4d75e54b0f168ff74ee886d7f28e3156b3beba6ad96", + "examples/protein_cold.csv": "6d70ea272cb716c7bf001675493496bfe7491add0185c010f83417a8ed607784", + "examples/reference.json": "3de9b7e6b9c6035c0e07504b1dadb2c1c430151b7c889c33825a437a5c70e659", + "loader.py": "0c074c3901ac55b737e10a2b316db3c00678e569d151fc3e2192b46bd1662ce6", + "predict.py": "fe3f559157a6bc3dd4b59803fb010054c8987f402b6790f488e6cce51bc95d4b" + }, + "changed_existing_files": { + "affinose/dataset_v8.py": { + "sha256": "27e7fe6820357551e9e09a135db4a9d2cff5c4382f5396912dced12c54aaa288", + "hardlink_count": 1 + }, + "affinose/training_v8.py": { + "sha256": "82d1d55ed231740fff88065cff7eb9bc45907d69f7c96beebf7eb5fa6e1ae52d", + "hardlink_count": 1 + } + }, + "hardlink_handling": "Original shared inode contents restored before atomic replacement of the two release files. Historical aliases and submit_comm remain at original bytes. Corrected release paths each have a private inode.", + "remaining_verification": "Run check_real_examples.py in the root-owned compute task with all nine exact checkpoints, eight glycan files and the protein HDF5. This portable implementation has not yet itself passed a full real forward.", + "dependencies": [ + "Existing requirements-analysis.txt environment, including h5py and pandas for original collate imports.", + "Eight sealed glycan files in data/bertosebind/features/ (or explicit equivalent paths).", + "Pinned per-residue ESM-C HDF5 and one of nine exact fitted checkpoints." + ], + "limits": [ + "Six real examples are a mechanistic smoke, not benchmark reproduction or a model-quality evaluation.", + "CPU float32 reference tolerance does not establish CUDA AMP equivalence." + ] +} diff --git a/releases/2026-10-02/bertosebind_inference/predict.py b/releases/2026-10-02/bertosebind_inference/predict.py new file mode 100644 index 0000000000000000000000000000000000000000..1494dc1221af09d881c09db6d3d3f9dabc84fefc --- /dev/null +++ b/releases/2026-10-02/bertosebind_inference/predict.py @@ -0,0 +1,62 @@ +"""Predict pairs with a released fitted BERToseBind checkpoint on CPU.""" +from pathlib import Path +import argparse +import json +import platform + +from .loader import (CachedInputs, CONFIG_PATH, config, file_sha, load_model, + predict_batch, read_pairs, tensor_record, require) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--checkpoint", type=Path, required=True) + parser.add_argument("--cell-id", choices=sorted(config()["checkpoints"]), required=True) + parser.add_argument("--pairs", type=Path, required=True, + help="CSV containing sample_id, protein_id, glycan_wurcs") + parser.add_argument("--features-dir", type=Path, required=True) + parser.add_argument("--protein-h5", type=Path, required=True) + parser.add_argument("--motif-features", type=Path, + help="Override the motif NPY location; its expected hash is unchanged") + parser.add_argument("--feature-index", type=Path) + parser.add_argument("--batch-size", type=int, default=2) + parser.add_argument("--threads", type=int, choices=range(1, 9), default=1) + parser.add_argument("--output", type=Path, required=True, help="New prediction JSON path") + args = parser.parse_args() + require(args.batch_size > 0, "batch-size must be positive") + require(not args.output.exists(), "Refusing to overwrite the output") + require(args.output.parent.is_dir(), "Output parent directory must exist") + records = read_pairs(args.pairs) + import torch + import numpy as np + import h5py + torch.set_num_threads(args.threads) + torch.set_num_interop_threads(1) + predictions, batches = [], [] + with CachedInputs(args.features_dir, args.protein_h5, motif_features=args.motif_features, + feature_index=args.feature_index) as inputs: + model, model_record = load_model(args.checkpoint, args.cell_id) + for start in range(0, len(records), args.batch_size): + rows = records[start:start + args.batch_size] + batch, provenance = inputs.batch(rows) + output = predict_batch(model, batch) + predictions.extend({"sample_id": row["sample_id"], "protein_id": row["protein_id"], + "glycan_wurcs": row["glycan_wurcs"], "prediction": value} + for row, value in zip(rows, output.tolist())) + batches.append({"rows": provenance, "prediction_tensor": tensor_record(output), + "input_tensors": {k: tensor_record(v) for k, v in batch.items() if k != "target"}}) + result = {"schema": "bertosebind_portable_prediction_v1", "status": "PASS", + "scope": "Fitted-model CPU float32 predictions; no training, calibration or benchmark metrics.", + "model": model_record, "input_assets": inputs.asset_records, + "pairs_sha256": file_sha(args.pairs), "config_sha256": file_sha(CONFIG_PATH), + "runtime": {"python": platform.python_version(), "torch": torch.__version__, + "numpy": np.__version__, "h5py": h5py.__version__, "threads": args.threads}, + "predictions": predictions, "batches": batches} + with args.output.open("x") as handle: + json.dump(result, handle, indent=2, allow_nan=False) + handle.write("\n") + print(f"Wrote {len(predictions)} predictions to {args.output}") + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/bertosebind_new_runs/README.md b/releases/2026-10-02/bertosebind_new_runs/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b2fec06ffaf249bc8373a9433d44ee7244cd0059 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/README.md @@ -0,0 +1,42 @@ +# BERToseBind: updated comparison and uncertainty records + +This supplement to the existing code package contains the reported-model protein replacement probe, all 18 original GIFFLAR score receipts, the executed component-bootstrap sources and records, the test-set structure analysis, and the current exact-WURCS exposure audit. Historical filenames retain the former Affinose name. + +The executed source and configuration files in `executed/` are unchanged. Their original paths and SHA-256 values are recorded in `package_manifest.json`. The original cluster scripts retain their data bindings. Full inference requires the recorded checkpoints, cached embeddings, feature arrays and external model dependencies. The 149 bootstrap input paths are enumerated in `provenance/bootstrap_exact_input_manifest.json`; prediction arrays and checkpoints are not bundled. No dropped encoder comparison is included as a reported result. + +## Portable checks and summaries + +From this directory: + +```bash +python check_package.py +python reproduce_summary.py +``` + +The first command verifies copied-file hashes and Python syntax. The second recomputes the protein-replacement summaries, original GIFFLAR three-seed means and sample SDs, seed-only Welch intervals and the BERToseBind pooled summaries from bundled scalar receipts. It does not train, infer, resample test data, or independently validate the biological conclusions. SciPy is required for the Welch calculation. + +The exact exposure join can be rerun with the three pinned external pretraining files and the existing WA3 receipt: + +```bash +python audit_pretraining_exposure.py \ + --partition /path/to/review_a5_non_iar_successor_parent_partition.tsv.gz \ + --sequence-index /path/to/review_sequence_parent_index.tsv.gz \ + --wa3-receipt ../provenance/WA3_final_receipt.json \ + --outdir /path/to/new/exposure-output +``` + +The sequence index directory must also contain `review_sequence_objective_eligible.npy` and `review_sequence_package_summary.json`. The script checks the expected primary hashes, uses the bundled current scored glycan sets, and writes its outputs only under `--outdir`. Its statistical and matching code is unchanged from the executed audit; `provenance/exposure_portability.patch` shows the path/argument changes. NumPy and pandas are required. The original compute-node exporter and local audit are preserved under `executed/local/`. + +## Reporting conventions + +- Use the original GIFFLAR producer scores for the primary comparison. The later per-row re-scores used by the uniform bootstrap are a separate series. In particular, protein-cold gifflarESM is **0.2074 ± 0.0029** in the original series and **0.2075 ± 0.0031** in the bootstrap series. The receipts retain six-decimal producer scores; aggregate before rounding. +- The final reporting metric is equal-assay macro Spearman. A constant prediction on an eligible assay contributes zero. GIFFLAR cannot score every row or assay; its eligibility correction does not make its scored rows identical to BERToseBind's. +- The component bootstrap samples glycan and protein components independently in every regime. Within a replicate, eligibility is recalculated using at least five expanded rows and two surviving target values. A method that cannot score a retained assay, or gives constant predictions, contributes zero. Primary intervals average the fixed three fitted models; the secondary analysis also resamples model seeds independently by method. Both use paired component weights across methods. +- This procedure amends the September 10 declaration, which specified only the held-out axes, fixed eligibility and fixed point estimates. `protocol/` preserves the original and the relevant later excerpts. The first bootstrap stopped at its source gate; the diagnostic measured re-score differences; revision 2 changed the GIFFLAR tolerance to 0.0005. The artifacts establish those events, but do not independently establish that the tolerance decision was written before the diagnostic. +- Pooled Spearman is secondary. Its smaller margins and test-set intervals must not be described as more favourable than the macro metric. The saved bootstrap JSON includes the pooled analysis for BERToseBind and primary LectinOracle. +- Test-set structure results describe panel concentration and within-panel correlation. The anatomy script's panel bootstrap and residue-count size analysis are descriptive; they do not replace the component intervals or the reported BPE-token size rule. A small mean doubly-cold protein-replacement effect does not establish zero protein contribution or a causal explanation. +- Current scored-set exact-WURCS exposure is **32/336**, **118/826** and **14/173** for glycan-, protein- and doubly-cold. These counts agree separately against 221,899 BPE-fit parents and 221,827 actual sequence-training parents. The latter excludes 72 overlength training parents. The old contamination receipt in the remote evidence describes older rosters; its 19.7% training comparison is not current. Exact identity checks do not assess related glycans or establish independence. + +The saved logs confirm all 12 new GIFFLAR runs completed 50 epochs, all 12 named error logs contain no `Dimension out of range` message, and all 12 scorer protein-sensitivity gates passed. Six final logs record resumes; bit-identical continuation is not established. Checkpoint states are restored, so the resume caveat must not be rewritten as a failure to restore optimizer state. + +These are source, arithmetic and saved-record checks. They do not substitute for full scientific validation, model replay, or a new test of generalization. diff --git a/releases/2026-10-02/bertosebind_new_runs/audit_pretraining_exposure.py b/releases/2026-10-02/bertosebind_new_runs/audit_pretraining_exposure.py new file mode 100644 index 0000000000000000000000000000000000000000..58e1f07178319710b595ddd4a3f80b763b263208 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/audit_pretraining_exposure.py @@ -0,0 +1,36 @@ +from pathlib import Path +import json,hashlib +import pandas as pd,numpy as np +import argparse +ap=argparse.ArgumentParser(description='Reproduce the exact current scored-set exposure join from pinned external pretraining inputs.') +ap.add_argument('--partition', type=Path, required=True) +ap.add_argument('--sequence-index', type=Path, required=True) +ap.add_argument('--wa3-receipt', type=Path, required=True) +ap.add_argument('--outdir', type=Path, required=True) +a=ap.parse_args() +O=a.outdir.resolve(); O.mkdir(parents=True,exist_ok=True) +(O/'current_glycan_sets').mkdir(exist_ok=True) +SCORING=Path(__file__).resolve().parent/'inputs/current_glycan_sets' +part=a.partition.resolve();seq=a.sequence_index.resolve();obj=seq.parent/'review_sequence_objective_eligible.npy' +expected={part:'86a8c6742156683d502c93fc71b31b9a93450037d647e5a90db437a015bb3bbc',seq:'2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0',obj:'62502d0d1b44a10989350a78f1e033d271fe8417715e10d42eb47c6720ceb3bf'} +def seal(p):return {'path':str(p),'sha256':hashlib.sha256(p.read_bytes()).hexdigest(),'bytes':p.stat().st_size} +for p,h in expected.items():assert seal(p)['sha256']==h +p=pd.read_csv(part,sep='\t',usecols=['parent_glycorpus_id','canonical_wurcs','pretraining_partition','learned_preprocessing_fit_contributor','model_pretraining_contributor']) +s=pd.read_csv(seq,sep='\t',usecols=['sequence_row','parent_glycorpus_id','canonical_wurcs','pretraining_partition','learned_preprocessing_fit_contributor','model_pretraining_contributor','full_untruncated_length','truncated_at_256']) +o=np.load(obj).astype(bool);assert len(o)==len(s)==len(p)==281208;assert np.array_equal(s.sequence_row.to_numpy(),np.arange(len(s))) +pp=p.set_index('parent_glycorpus_id').sort_index();ss=s.set_index('parent_glycorpus_id').sort_index();assert pp.index.equals(ss.index) +for k in ['canonical_wurcs','pretraining_partition','learned_preprocessing_fit_contributor','model_pretraining_contributor']:assert pp[k].equals(ss[k]) +fit=s.pretraining_partition.eq('pretraining_train').to_numpy();assert np.array_equal(fit,s.learned_preprocessing_fit_contributor.to_numpy()) and np.array_equal(fit,s.model_pretraining_contributor.to_numpy()) +assert int(fit.sum())==221899 and int((fit&o).sum())==221827 +assert np.array_equal(o[fit],(s.full_untruncated_length.to_numpy()<=256)[fit]) +fitset=set(s.loc[fit,'canonical_wurcs']);actualset=set(s.loc[fit&o,'canonical_wurcs']);assert len(fitset)==221899 and len(actualset)==221827 +manifest=json.loads((SCORING/'manifest.json').read_text());results={} +for reg,r in manifest['regimes'].items(): + csv=SCORING/r['export_name'];assert seal(csv)['sha256']==r['export_sha256'];g=pd.read_csv(csv);gset=set(g.canonical_wurcs);assert len(gset)==r['n_glycans'] and int(g.scored_rows.sum())==r['n_rows'] + g['in_bpe_fit_partition']=g.canonical_wurcs.isin(fitset);g['in_encoder_sequence_training']=g.canonical_wurcs.isin(actualset);out=O/'current_glycan_sets'/(reg+'_exposure_join.csv');g.to_csv(out,index=False) + x={'scored_glycans':len(gset),'scored_rows':r['n_rows'],'assays':r['n_assays'],'assays_with_more_than_one_protein':r['assays_with_more_than_one_protein'],'source_npz':{k:r[k] for k in ['source_path','source_sha256','source_bytes']},'source_set':seal(csv),'joined_output':seal(out)} + for key,col in [('bpe_fit_partition','in_bpe_fit_partition'),('encoder_sequence_training','in_encoder_sequence_training')]: + n=int(g[col].sum());rows=int(g.loc[g[col],'scored_rows'].sum());x[key]={'exact_wurcs_overlap':n,'glycan_denominator':len(gset),'glycan_percent':100*n/len(gset),'scored_rows_with_overlap':rows,'scored_row_denominator':r['n_rows'],'scored_row_percent':100*rows/r['n_rows']} + results[reg]=x +report={'schema':'bertosebind.current_scored_pretraining_exposure.v1','status':'PASS_EXACT_PRIMARY_ARTIFACT_SET_JOIN','match_rule':'exact canonical WURCS string equality only; no graph-alias or structural similarity search','scope':'Current scored test glycans from the reported-model seed42 probe files. Not the unfiltered roster. All seeds share the same evaluated data according to the verified probe records.','pretraining_populations':{'parent_index':281208,'bpe_fit_partition_parent_count':221899,'bpe_fit_partition_distinct_wurcs':len(fitset),'encoder_sequence_training_parent_count':221827,'encoder_sequence_training_distinct_wurcs':len(actualset),'train_parents_excluded_by_objective_mask':72,'train_mask_matches_full_untruncated_length_le_256':True,'mask_authority':'Hash-bound runtime objective-eligibility array; role=pretraining_train. The length rule is checked within train, not globally, because excluded roles have independent eligibility flags.'},'sources':{'partition':seal(part),'sequence_index':seal(seq),'objective_mask':seal(obj),'sequence_package_summary':seal(seq.parent/'review_sequence_package_summary.json'),'WA3_final_receipt':seal(a.wa3_receipt.resolve()),'current_sets_manifest':seal(SCORING/'manifest.json'),'packaged_scored_sets':str(SCORING)},'regimes':results,'limits':['Exact identity exposure only; does not establish independence, absence of related structures, or a causal effect of exposure.','BPE fitting and actual encoder sequence-training populations are distinct even when their test overlap counts agree.','Old fit_train297/1505 and19.73% are not recalculated or carried forward.','No comparison of current binding-training glycan exposure is claimed.','The raw roster339 vs scored336 glycan-cold denominators are distinct; this audit reports the scored-set denominator only.'],'compute_receipt':{'job_id':'16608669','state':'COMPLETED','exit_code':'0:0','elapsed_seconds':1,'node':'nova23-7','remote_work':'Read3 exact small saved NPZs, export WURCS row counts and one-protein-per-assay check; no model inference or training','local_work':'Read hash-bound primary partition/index/eligibility mask and compute exact set intersections'}} +fp=O/'current_pretraining_exposure_audit.json';fp.write_text(json.dumps(report,indent=2)+'\n');print(json.dumps({'output':str(fp),'sha256':seal(fp)['sha256'],'populations':report['pretraining_populations'],'regimes':{k:{z:v[z] for z in ['scored_glycans','scored_rows','bpe_fit_partition','encoder_sequence_training']} for k,v in results.items()}},indent=2)) diff --git a/releases/2026-10-02/bertosebind_new_runs/check_package.py b/releases/2026-10-02/bertosebind_new_runs/check_package.py new file mode 100644 index 0000000000000000000000000000000000000000..ff445c0ce79735fb90c471524265daf4f242f9c2 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/check_package.py @@ -0,0 +1,10 @@ +"""Verify this small package against its manifest. This does not validate model performance.""" +from pathlib import Path +import json,hashlib,ast +P=Path(__file__).resolve().parent +manifest=json.loads((P/'package_manifest.json').read_text()) +for row in manifest['files']: + p=P/row['path'] + if hashlib.sha256(p.read_bytes()).hexdigest()!=row['sha256']:raise SystemExit('HASH MISMATCH: '+row['path']) + if p.suffix=='.py':ast.parse(p.read_text(),filename=str(p)) +print(json.dumps({'status':'PASS','files_verified':len(manifest['files']),'scope':'copied-file identity and Python syntax only; no training, inference, bootstrap rerun or biological validation'})) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/local/audit_current_pretraining_exposure.py b/releases/2026-10-02/bertosebind_new_runs/executed/local/audit_current_pretraining_exposure.py new file mode 100644 index 0000000000000000000000000000000000000000..084a5ffcef2be7ad541576e95cf4b4ea0cbb11f8 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/local/audit_current_pretraining_exposure.py @@ -0,0 +1,27 @@ +from pathlib import Path +import json,hashlib +import pandas as pd,numpy as np +B=Path('/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training');O=B/'writing/review/submit_comm/_verification/bertosebind_new_runs_20260927' +part=B/'writing/review/multimodal/outputs/review_a5_non_iar_later_role_successor_20260720_r1/review_a5_non_iar_successor_parent_partition.tsv.gz';seq=B/'data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz';obj=seq.parent/'review_sequence_objective_eligible.npy' +expected={part:'86a8c6742156683d502c93fc71b31b9a93450037d647e5a90db437a015bb3bbc',seq:'2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0',obj:'62502d0d1b44a10989350a78f1e033d271fe8417715e10d42eb47c6720ceb3bf'} +def seal(p):return {'path':str(p),'sha256':hashlib.sha256(p.read_bytes()).hexdigest(),'bytes':p.stat().st_size} +for p,h in expected.items():assert seal(p)['sha256']==h +p=pd.read_csv(part,sep='\t',usecols=['parent_glycorpus_id','canonical_wurcs','pretraining_partition','learned_preprocessing_fit_contributor','model_pretraining_contributor']) +s=pd.read_csv(seq,sep='\t',usecols=['sequence_row','parent_glycorpus_id','canonical_wurcs','pretraining_partition','learned_preprocessing_fit_contributor','model_pretraining_contributor','full_untruncated_length','truncated_at_256']) +o=np.load(obj).astype(bool);assert len(o)==len(s)==len(p)==281208;assert np.array_equal(s.sequence_row.to_numpy(),np.arange(len(s))) +pp=p.set_index('parent_glycorpus_id').sort_index();ss=s.set_index('parent_glycorpus_id').sort_index();assert pp.index.equals(ss.index) +for k in ['canonical_wurcs','pretraining_partition','learned_preprocessing_fit_contributor','model_pretraining_contributor']:assert pp[k].equals(ss[k]) +fit=s.pretraining_partition.eq('pretraining_train').to_numpy();assert np.array_equal(fit,s.learned_preprocessing_fit_contributor.to_numpy()) and np.array_equal(fit,s.model_pretraining_contributor.to_numpy()) +assert int(fit.sum())==221899 and int((fit&o).sum())==221827 +assert np.array_equal(o[fit],(s.full_untruncated_length.to_numpy()<=256)[fit]) +fitset=set(s.loc[fit,'canonical_wurcs']);actualset=set(s.loc[fit&o,'canonical_wurcs']);assert len(fitset)==221899 and len(actualset)==221827 +manifest=json.loads((O/'current_glycan_sets/manifest.json').read_text());results={} +for reg,r in manifest['regimes'].items(): + csv=O/'current_glycan_sets'/r['export_name'];assert seal(csv)['sha256']==r['export_sha256'];g=pd.read_csv(csv);gset=set(g.canonical_wurcs);assert len(gset)==r['n_glycans'] and int(g.scored_rows.sum())==r['n_rows'] + g['in_bpe_fit_partition']=g.canonical_wurcs.isin(fitset);g['in_encoder_sequence_training']=g.canonical_wurcs.isin(actualset);out=O/'current_glycan_sets'/(reg+'_exposure_join.csv');g.to_csv(out,index=False) + x={'scored_glycans':len(gset),'scored_rows':r['n_rows'],'assays':r['n_assays'],'assays_with_more_than_one_protein':r['assays_with_more_than_one_protein'],'source_npz':{k:r[k] for k in ['source_path','source_sha256','source_bytes']},'source_set':seal(csv),'joined_output':seal(out)} + for key,col in [('bpe_fit_partition','in_bpe_fit_partition'),('encoder_sequence_training','in_encoder_sequence_training')]: + n=int(g[col].sum());rows=int(g.loc[g[col],'scored_rows'].sum());x[key]={'exact_wurcs_overlap':n,'glycan_denominator':len(gset),'glycan_percent':100*n/len(gset),'scored_rows_with_overlap':rows,'scored_row_denominator':r['n_rows'],'scored_row_percent':100*rows/r['n_rows']} + results[reg]=x +report={'schema':'bertosebind.current_scored_pretraining_exposure.v1','status':'PASS_EXACT_PRIMARY_ARTIFACT_SET_JOIN','match_rule':'exact canonical WURCS string equality only; no graph-alias or structural similarity search','scope':'Current scored test glycans from the reported-model seed42 probe files. Not the unfiltered roster. All seeds share the same evaluated data according to the verified probe records.','pretraining_populations':{'parent_index':281208,'bpe_fit_partition_parent_count':221899,'bpe_fit_partition_distinct_wurcs':len(fitset),'encoder_sequence_training_parent_count':221827,'encoder_sequence_training_distinct_wurcs':len(actualset),'train_parents_excluded_by_objective_mask':72,'train_mask_matches_full_untruncated_length_le_256':True,'mask_authority':'Hash-bound runtime objective-eligibility array; role=pretraining_train. The length rule is checked within train, not globally, because excluded roles have independent eligibility flags.'},'sources':{'partition':seal(part),'sequence_index':seal(seq),'objective_mask':seal(obj),'sequence_package_summary':seal(seq.parent/'review_sequence_package_summary.json'),'WA3_final_receipt':seal(B/'writing/review/submit_comm/06_code/provenance/WA3_final_receipt.json'),'current_sets_manifest':seal(O/'current_glycan_sets/manifest.json'),'current_sets_archive':seal(O/'current_glycan_sets_16608669.tar.gz')},'regimes':results,'limits':['Exact identity exposure only; does not establish independence, absence of related structures, or a causal effect of exposure.','BPE fitting and actual encoder sequence-training populations are distinct even when their test overlap counts agree.','Old fit_train297/1505 and19.73% are not recalculated or carried forward.','No comparison of current binding-training glycan exposure is claimed.','The raw roster339 vs scored336 glycan-cold denominators are distinct; this audit reports the scored-set denominator only.'],'compute_receipt':{'job_id':'16608669','state':'COMPLETED','exit_code':'0:0','elapsed_seconds':1,'node':'nova23-7','remote_work':'Read3 exact small saved NPZs, export WURCS row counts and one-protein-per-assay check; no model inference or training','local_work':'Read hash-bound primary partition/index/eligibility mask and compute exact set intersections'}} +fp=O/'current_pretraining_exposure_audit.json';fp.write_text(json.dumps(report,indent=2)+'\n');print(json.dumps({'output':str(fp),'sha256':seal(fp)['sha256'],'populations':report['pretraining_populations'],'regimes':{k:{z:v[z] for z in ['scored_glycans','scored_rows','bpe_fit_partition','encoder_sequence_training']} for k,v in results.items()}},indent=2)) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/local/collect_current_glycan_sets.py b/releases/2026-10-02/bertosebind_new_runs/executed/local/collect_current_glycan_sets.py new file mode 100644 index 0000000000000000000000000000000000000000..89b1c1df5c2d024b0eb38295d01ce00cfc1c9f36 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/local/collect_current_glycan_sets.py @@ -0,0 +1,24 @@ +"""Export glycan sets from three existing probe prediction files; compute-node only.""" +from pathlib import Path +import os,json,hashlib,csv,collections,tarfile +import numpy as np +assert os.environ.get('SLURM_JOB_ID'), 'Compute allocation required' +B=Path('/work/ratul1/supantha/Bertint');O=B/('diagnostics/codex_glycan_sets_20260927_'+os.environ['SLURM_JOB_ID']);O.mkdir(exist_ok=False) +cells={'glycan_cold':'affinose_mo_20260908_mo_A_glycan_s42','protein_cold':'affinose_sa_20260908_mo_B_protein_s42','doubly_cold':'affinose_mo_20260908_mo_C_doubly_s42'} +manifest={'job_id':os.environ['SLURM_JOB_ID'],'node':os.uname().nodename,'source':'current reported-model probe per-row predictions','regimes':{}} +for regime,cell in cells.items(): + p=B/'affinose_attribution_motif_preds'/(cell+'.npz') + with np.load(p,allow_pickle=True) as z: + gly=z['glycan'].astype(str);assay=z['assay'].astype(str);prot=z['protein'].astype(str) + cnt=collections.Counter(gly);ap=collections.defaultdict(set) + for aa,pp in zip(assay,prot):ap[aa].add(pp) + keys=list(z.files) + out=O/(regime+'_scored_glycans.csv') + with out.open('w',newline='') as f: + w=csv.writer(f);w.writerow(['canonical_wurcs','scored_rows']);w.writerows(sorted(cnt.items())) + manifest['regimes'][regime]={'cell':cell,'source_path':str(p),'source_bytes':p.stat().st_size,'source_sha256':hashlib.sha256(p.read_bytes()).hexdigest(),'npz_keys':keys,'n_rows':len(gly),'n_glycans':len(cnt),'n_assays':len(ap),'assays_with_more_than_one_protein':sum(len(x)>1 for x in ap.values()),'export_name':out.name,'export_sha256':hashlib.sha256(out.read_bytes()).hexdigest()} +(O/'manifest.json').write_text(json.dumps(manifest,indent=2)+'\n') +tarpath=O.with_suffix('.tar.gz') +with tarfile.open(tarpath,'w:gz') as t: + for p in sorted(O.iterdir()):t.add(p,arcname=p.name) +print(json.dumps({'archive':str(tarpath),'sha256':hashlib.sha256(tarpath.read_bytes()).hexdigest(),'manifest':manifest})) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/local/dc_anatomy.py b/releases/2026-10-02/bertosebind_new_runs/executed/local/dc_anatomy.py new file mode 100644 index 0000000000000000000000000000000000000000..c6ddc3d60a80cc838f8159adf45013d79fc724fc --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/local/dc_anatomy.py @@ -0,0 +1,333 @@ +#!/usr/bin/env python3 +"""BERToseBind doubly-cold anatomy — why the final model ranks low on doubly-cold, measured. 2026-09-27. + +Read-only analysis of existing artifacts; no model is run or trained. + Predictions: final motif model, 3 seeds per regime, from affinose_attribution_motif_preds/ (intact / + wrong-protein / mean-protein); each seed's macro is gated against the published test value. + LectinOracle ESM-C stock (primary comparator), doubly-cold per-row receipts (D3 rerun draw), gated likewise. + Glycan-size rule: residue count from the WURCS header (and token count if the feature index is present). +Metric: equal-assay macro Spearman over eligible assays (>=5 rows, >=2 distinct targets); constant -> 0. +Parts + D data-only, all three regimes: effective number of glycan panels (Kish), size shift train->test, + within-assay size dispersion, nearest-training-glycan similarity (residue composition), training support. + M model: per-seed gates, size reliance of predictions, protein dependence (wrong / mean protein). + C doubly-cold: per-panel decomposition of BERToseBind's gap to LectinOracle and to the size rule; panel- + cluster bootstrap (descriptive; B = 10,000, seed 20260927) of the differences and of the rank among the + three methods with per-row predictions; split by how informative size is within the assay. +The pre-declared two-way component bootstrap (AFFINOSE_BOOTSTRAP_PREDECLARATION_20260910.md) is NOT this; +the panel bootstrap here is a descriptive dependence check. +""" +import collections +import hashlib +import json +import os +import re +import time + +import numpy as np +import pandas as pd +from scipy.stats import ks_2samp, spearmanr + +B = "/work/ratul1/supantha/Bertint" +ATT = B + "/affinose_attribution_motif_preds/%s.npz" +FITS = {"A_glycan": ["affinose_mo_20260908_mo_A_glycan_s42", "affinose_sa_20260908_moc_A_glycan_s43", + "affinose_sa_20260908_moc_A_glycan_s44"], + "B_protein": ["affinose_sa_20260908_mo_B_protein_s42", "affinose_mof_20260909_mof_B_protein_s43", + "affinose_mof_20260909_mof_B_protein_s44"], + "C_doubly": ["affinose_mo_20260908_mo_C_doubly_s42", "affinose_mof_20260909_mof_C_doubly_s43", + "affinose_mof_20260909_mof_C_doubly_s44"]} +PUB = {"A_glycan": [0.3341, 0.3184, 0.3355], "B_protein": [0.2326, 0.2451, 0.2449], "C_doubly": [0.1773, 0.1840, 0.1743]} +LO = B + "/affinose_lectinoracle_matched_mtC_doublys%d_test_doubly_cold_perrow.npz" +LO_PUB = [0.1701, 0.1972, 0.1995] +V2 = B + "/v2_artifacts/review_affinose_%s_%s" +FEAT = B + "/data/review_affinose_glycan_features_20260824_r1" +OUT = os.environ.get("OUT", ".") +TOL = 6e-4 +NBOOT, SEED = 10000, 20260927 +WURCS_RE = re.compile(r"^WURCS=2\.0/\d+,(\d+),\d+/((?:\[[^\]]*\])+)/([0-9\-]+)/") + + +def log(m): + print(time.strftime("%H:%M:%S"), m, flush=True) + + +def residues(w): + m = WURCS_RE.match(w) + return int(m.group(1)) if m else np.nan + + +def composition(w): + m = WURCS_RE.match(w) + if not m: + return collections.Counter() + uniq = re.findall(r"\[([^\]]*)\]", m.group(2)) + c = collections.Counter() + for tok in m.group(3).split("-"): + if tok.isdigit() and 1 <= int(tok) <= len(uniq): + c[uniq[int(tok) - 1]] += 1 + return c + + +def rho(x, y): + r = spearmanr(x, y)[0] + return 0.0 if not np.isfinite(r) else float(r) + + +def eligible_groups(df): + out = {} + for a, g in df.groupby("assay", sort=False): + if len(g) >= 5 and g["target"].nunique() >= 2: + out[a] = g.index.to_numpy() + return out + + +def per_assay(df, groups, col): + v = df[col].to_numpy(dtype=float) + y = df["target"].to_numpy(dtype=float) + return {a: rho(v[ix], y[ix]) for a, ix in groups.items()} + + +def macro(d): + return float(np.mean(list(d.values()))) + + +def load_test(regime): + frames = [] + for k, name in enumerate(FITS[regime]): + z = np.load(ATT % name, allow_pickle=True) + f = pd.DataFrame({"assay": z["assay"].astype(str), "protein": z["protein"].astype(str), + "glycan": z["glycan"].astype(str), "target": z["target"].astype(float)}) + if k == 0: + base = f + elif not (f["assay"].equals(base["assay"]) and f["glycan"].equals(base["glycan"])): + raise SystemExit("row order differs between seeds for %s" % regime) + for col in ("intact", "reassigned", "meanprot"): + base["%s_s%d" % (col, k)] = z[col].astype(float) + return base + + +def training_rows(regime, test_glycans_valid): + b = pd.read_csv(V2 % (regime, "binding.csv"), usecols=["protein_id", "glycan_wurcs", "target_rank", "exp_id"]) + r = pd.read_csv(V2 % (regime, "roles.tsv.gz"), sep="\t") + for f in (b, r): + f["protein_id"] = f["protein_id"].astype(str).str.strip() + f["glycan_wurcs"] = f["glycan_wurcs"].astype(str).str.strip() + m = b.merge(r, on=["protein_id", "glycan_wurcs"], how="left", validate="many_to_one") + strata = m["evaluation_stratum"].value_counts().to_dict() + tr = m[m["evaluation_stratum"] == "fit_train"].dropna(subset=["target_rank"]) + if test_glycans_valid is not None: + tr = tr[tr["glycan_wurcs"].map(lambda w: test_glycans_valid.get(w, True))] + return tr, strata + + +def kish(w): + w = np.asarray(w, dtype=float) + return float(w.sum() ** 2 / (w ** 2).sum()) + + +def cos_nearest(test_glycans, train_glycans): + vocab = {} + comp = {} + for g in set(test_glycans) | set(train_glycans): + c = composition(g) + comp[g] = c + for k in c: + vocab.setdefault(k, len(vocab)) + + def mat(gs): + M = np.zeros((len(gs), max(1, len(vocab)))) + for i, g in enumerate(gs): + for k, v in comp[g].items(): + M[i, vocab[k]] = v + n = np.linalg.norm(M, axis=1, keepdims=True) + return M / np.where(n == 0, 1, n) + + tg, rg = sorted(set(test_glycans)), sorted(set(train_glycans)) + S = mat(tg) @ mat(rg).T + best = S.max(axis=1) + return {"distinct_test_glycans": len(tg), "distinct_train_glycans": len(rg), + "nearest_cosine_mean": round(float(best.mean()), 4), "nearest_cosine_median": round(float(np.median(best)), 4), + "share_exact_composition_in_training": round(float((best > 1 - 1e-9).mean()), 4), + "share_nearest_below_0.9": round(float((best < 0.9).mean()), 4)} + + +def main(): + t_start = time.time() + rep = {"schema": "bertosebind_doubly_cold_anatomy_v1", "gates": {}, "regimes": {}} + valid = None + idx = FEAT + "/review_affinose_glycan_index.tsv.gz" + ntok = None + if os.path.exists(idx): + fi = pd.read_csv(idx, sep="\t", usecols=["feature_row", "canonical_wurcs", "tree_channels_valid"]) + valid = dict(zip(fi["canonical_wurcs"].str.strip(), fi["tree_channels_valid"].astype(str) == "True")) + am = FEAT + "/review_attention_mask.npy" + if os.path.exists(am): + mask = np.load(am, mmap_mode="r") + ntok = {w.strip(): int(np.asarray(mask[int(r)]).sum()) for w, r in zip(fi["canonical_wurcs"], fi["feature_row"])} + tests = {} + for regime in FITS: + te = load_test(regime) + te["size"] = te["glycan"].map(residues) + if ntok is not None: + te["ntok"] = te["glycan"].map(lambda w: ntok.get(w, np.nan)) + groups = eligible_groups(te) + # --- gates + seeds = [macro(per_assay(te, groups, "intact_s%d" % k)) for k in range(3)] + ok = all(abs(a - b) <= TOL for a, b in zip(seeds, PUB[regime])) + rep["gates"][regime] = {"recomputed": [round(x, 4) for x in seeds], "published": PUB[regime], "pass": ok} + log("%s: %d rows, %d eligible assays; seed macros %s (published %s) %s" + % (regime, len(te), len(groups), [round(x, 4) for x in seeds], PUB[regime], "PASS" if ok else "FAIL")) + if not ok: + raise SystemExit("gate failed for %s" % regime) + tests[regime] = (te, groups) + # --- data-only + tr, strata = training_rows(regime, valid) + tr_size = tr["glycan_wurcs"].map(residues).dropna().to_numpy() + te_size = te["size"].dropna().to_numpy() + p95, p99, mx = np.percentile(tr_size, 95), np.percentile(tr_size, 99), tr_size.max() + n_a = {a: len(ix) for a, ix in groups.items()} + panel = {} + gl = te["glycan"].to_numpy() + for a, ix in groups.items(): + panel[a] = hashlib.sha1("|".join(sorted(set(gl[ix]))).encode()).hexdigest()[:12] + pc = collections.Counter(panel.values()) + gw = collections.defaultdict(float) + for a, ix in groups.items(): + for g in set(gl[ix]): + gw[g] += 1.0 / len(groups) + size_sd = [float(np.std(te["size"].to_numpy()[ix])) for ix in groups.values()] + size_rule = per_assay(te, groups, "size") + D = {"test_rows": int(len(te)), "size_unparsed_test_rows": int(te["size"].isna().sum()), + "eligible_assays": len(groups), "test_glycans": int(te["glycan"].nunique()), + "test_proteins": int(te["protein"].nunique()), + "train_rows": int(len(tr)), "train_glycans": int(tr["glycan_wurcs"].nunique()), + "train_proteins": int(tr["protein_id"].nunique()), "strata_rows": {k: int(v) for k, v in strata.items()}, + "distinct_panels": len(pc), "largest_panel_assays": int(max(pc.values())), + "largest_panel_share": round(max(pc.values()) / len(groups), 4), + "kish_effective_panels": round(kish(list(pc.values())), 1), + "kish_effective_glycans": round(kish(list(gw.values())), 1), + "median_rows_per_assay": float(np.median(list(n_a.values()))), + "size_train_mean": round(float(tr_size.mean()), 2), "size_test_mean": round(float(te_size.mean()), 2), + "size_train_share_gt12": round(float((tr_size > 12).mean()), 4), + "size_test_share_gt12": round(float((te_size > 12).mean()), 4), + "size_test_share_above_train_p95": round(float((te_size > p95).mean()), 4), + "size_test_share_above_train_p99": round(float((te_size > p99).mean()), 4), + "size_test_share_above_train_max": round(float((te_size > mx).mean()), 4), + "size_ks_D_train_vs_test": round(float(ks_2samp(tr_size, te_size).statistic), 4), + "within_assay_size_sd_mean": round(float(np.mean(size_sd)), 3), + "size_rule_macro_residue_count": round(macro(size_rule), 4)} + if "ntok" in te: + D["size_rule_macro_token_count"] = round(macro(per_assay(te, groups, "ntok")), 4) + D["similarity_to_training"] = cos_nearest(te["glycan"].tolist(), tr["glycan_wurcs"].tolist()) + # --- model + te["bb"] = te[["intact_s0", "intact_s1", "intact_s2"]].mean(axis=1) + pa_bb = {a: float(np.mean([rho(te["intact_s%d" % k].to_numpy()[ix], te["target"].to_numpy()[ix]) + for k in range(3)])) for a, ix in groups.items()} + M = {"bertosebind_macro_seed_mean": round(float(np.mean(seeds)), 4), + "wrong_protein_macro": round(float(np.mean([macro(per_assay(te, groups, "reassigned_s%d" % k)) + for k in range(3)])), 4), + "mean_protein_macro": round(float(np.mean([macro(per_assay(te, groups, "meanprot_s%d" % k)) + for k in range(3)])), 4), + "prediction_size_reliance": round(float(np.mean([np.mean([rho(te["intact_s%d" % k].to_numpy()[ix], + te["size"].to_numpy()[ix]) + for ix in groups.values()]) for k in range(3)])), 4), + "target_size_reliance": round(macro(size_rule), 4)} + M["protein_dependence_wrong_minus_intact"] = round(M["wrong_protein_macro"] - M["bertosebind_macro_seed_mean"], 4) + M["size_overuse_ratio"] = round(M["prediction_size_reliance"] / M["target_size_reliance"], 2) if M["target_size_reliance"] else None + wins = sum(pa_bb[a] > size_rule[a] for a in groups) + M["assays_bertosebind_beats_size_rule"] = "%d/%d" % (wins, len(groups)) + rep["regimes"][regime] = {"data": D, "model": M} + log("%s data: %s" % (regime, {k: v for k, v in D.items() if k not in ("strata_rows",)})) + log("%s model: %s" % (regime, M)) + tests[regime] = (te, groups, pa_bb, size_rule, panel) + + # --- doubly-cold head-to-head + te, groups, pa_bb, size_rule, panel = tests["C_doubly"] + lo_frames = [] + for s in (42, 43, 44): + z = np.load(LO % s, allow_pickle=True) + lo_frames.append(pd.DataFrame({"assay": z["exp_id"].astype(str), "glycan": z["glycan"].astype(str), + "target": z["target"].astype(float), "pred": z["prediction"].astype(float)})) + same_ids = set(lo_frames[0]["assay"]) == set(te["assay"]) + rep["lectinoracle_assay_ids_match"] = same_ids + if not same_ids: + raise SystemExit("LectinOracle assay ids differ from BERToseBind's; alignment would need panel signatures") + lo_seed, pa_lo_s = [], [] + for f in lo_frames: + g = eligible_groups(f) + d = per_assay(f, g, "pred") + lo_seed.append(macro(d)) + pa_lo_s.append(d) + ok = all(abs(a - b) <= TOL for a, b in zip(lo_seed, LO_PUB)) + rep["gates"]["lectinoracle_C"] = {"recomputed": [round(x, 4) for x in lo_seed], "published": LO_PUB, "pass": ok} + log("LectinOracle doubly-cold seed macros %s (published %s) %s" % ([round(x, 4) for x in lo_seed], LO_PUB, + "PASS" if ok else "FAIL")) + if not ok or set(pa_lo_s[0]) != set(groups): + raise SystemExit("LectinOracle gate or eligible-assay set failed") + pa_lo = {a: float(np.mean([d[a] for d in pa_lo_s])) for a in groups} + assays = sorted(groups) + A = len(assays) + bb = np.array([pa_bb[a] for a in assays]) + lo = np.array([pa_lo[a] for a in assays]) + sz = np.array([size_rule[a] for a in assays]) + pn = np.array([panel[a] for a in assays]) + C = {"macro_bertosebind": round(bb.mean(), 4), "macro_lectinoracle": round(lo.mean(), 4), + "macro_size_rule": round(sz.mean(), 4)} + for name, x in (("vs_lectinoracle", lo), ("vs_size_rule", sz)): + d = bb - x + contrib = collections.defaultdict(float) + cnt = collections.Counter() + for p, v in zip(pn, d): + contrib[p] += v / A + cnt[p] += 1 + top = sorted(contrib.items(), key=lambda kv: kv[1])[:5] + C[name] = {"gap": round(d.mean(), 4), + "largest_panel_contribution": round(contrib[max(cnt, key=cnt.get)], 4), + "five_most_negative_panels": [{"panel": p, "assays": cnt[p], "contribution": round(v, 4)} for p, v in top], + "gap_without_largest_panel": round(float(d[pn != max(cnt, key=cnt.get)].mean()), 4)} + rng = np.random.default_rng(SEED) + upan = sorted(set(pn)) + members = {p: np.flatnonzero(pn == p) for p in upan} + diffs = {"bb_minus_lo": [], "bb_minus_size": [], "lo_minus_size": []} + rank_counts = collections.Counter() + naive = {"bb_minus_lo": [], "bb_minus_size": []} + for _ in range(NBOOT): + pick = rng.choice(len(upan), size=len(upan), replace=True) + ix = np.concatenate([members[upan[i]] for i in pick]) + m_bb, m_lo, m_sz = bb[ix].mean(), lo[ix].mean(), sz[ix].mean() + diffs["bb_minus_lo"].append(m_bb - m_lo) + diffs["bb_minus_size"].append(m_bb - m_sz) + diffs["lo_minus_size"].append(m_lo - m_sz) + rank_counts[1 + int(m_lo > m_bb) + int(m_sz > m_bb)] += 1 + jx = rng.integers(0, A, A) + naive["bb_minus_lo"].append(bb[jx].mean() - lo[jx].mean()) + naive["bb_minus_size"].append(bb[jx].mean() - sz[jx].mean()) + C["panel_bootstrap"] = {k: {"ci95": [round(float(np.percentile(v, 2.5)), 4), round(float(np.percentile(v, 97.5)), 4)], + "p_positive": round(float(np.mean(np.array(v) > 0)), 4), + "sd": round(float(np.std(v)), 4)} for k, v in diffs.items()} + C["assay_bootstrap_ignoring_panels"] = {k: {"ci95": [round(float(np.percentile(v, 2.5)), 4), + round(float(np.percentile(v, 97.5)), 4)], + "sd": round(float(np.std(v)), 4)} for k, v in naive.items()} + C["design_effect_sd_ratio"] = {k: round(C["panel_bootstrap"][k]["sd"] / C["assay_bootstrap_ignoring_panels"][k]["sd"], 2) + for k in naive} + C["bertosebind_rank_among_3_distribution"] = {str(k): round(v / NBOOT, 4) for k, v in sorted(rank_counts.items())} + med = float(np.median(sz)) + hi, lo_ = sz >= med, sz < med + C["size_informative_split"] = { + "size_rule_median_rho": round(med, 4), + "size_informative_half": {"assays": int(hi.sum()), "bertosebind": round(bb[hi].mean(), 4), + "size_rule": round(sz[hi].mean(), 4), "lectinoracle": round(lo[hi].mean(), 4)}, + "size_uninformative_half": {"assays": int(lo_.sum()), "bertosebind": round(bb[lo_].mean(), 4), + "size_rule": round(sz[lo_].mean(), 4), "lectinoracle": round(lo[lo_].mean(), 4)}} + rep["doubly_cold_head_to_head"] = C + pd.DataFrame({"assay": assays, "panel": pn, "rows": [len(groups[a]) for a in assays], + "bertosebind": bb, "lectinoracle": lo, "size_rule": sz}).to_csv( + os.path.join(OUT, "doubly_cold_per_assay.csv"), index=False) + with open(os.path.join(OUT, "doubly_cold_anatomy.json"), "w") as fh: + json.dump(rep, fh, indent=2) + log("head-to-head: %s" % json.dumps(C)[:3000]) + log("DONE (%.0fs)" % (time.time() - t_start)) + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/aff_attribution_motif.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/aff_attribution_motif.py new file mode 100644 index 0000000000000000000000000000000000000000..cbdb64230a6e8c8f8cb57a4d44a0ab797659fe4d --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/aff_attribution_motif.py @@ -0,0 +1,292 @@ +#!/usr/bin/env python3 +"""Protein-dependence of the REPORTED BERToseBind model (motif-additive, 165-d). Inference only. + +WHY THIS FILE EXISTS. `aff_attribution.py` (job 12246385, 2026-09-08) measured wrong-protein cost +0.2001 macro on the PRE-motif P3 cells (intact 0.3029). The reported model is the motif cells +(intact 0.3293) and carries an additive GLYCAN-ONLY score term, so that result does not transfer. +A 22 Sep lineage audit marked it HOLD_DO_NOT_IMPORT_AS_FINAL_MODEL_RESULT. This re-measures it on +the model we actually report. + +⛔ THE TRAP THIS FILE AVOIDS. Every motif cell's receipt records test_stratum = val_* : training +was deliberately pointed at VALIDATION and the test set was opened once, later, by +score_arms_on_test_historical.py. aff_attribution.py reads ar["test_stratum"], so reusing it +unmodified would have probed VALIDATION. Here val_* is mapped to test_* exactly as that scorer did. + +Construction is copied from score_arms_on_test_historical.py -- the producer of the reference +numbers -- including its chdir into the code tree. Passes, derangement and the fixed data-only +eligibility rule are copied from aff_attribution.py. + +PRE-DECLARED in review/AFFINOSE_UPDATE_TRACKER.md §B1 BEFORE this ran: + gate intact must reproduce the test export to +-0.0005, per cell, or nothing is reported + verdict glycan-cold mean wrong-protein drop > 0.019 (2 x seed SD 0.0095) + AND mean wrong-protein drop >= mean mean-protein drop (seed means; per-seed secondary) + expected a SMALL doubly-cold drop is predicted by the mechanism, not a failure +""" +import argparse +import copy +import hashlib +import json +import os +import sys + +import numpy as np +import pandas as pd +import torch +from scipy.stats import spearmanr +from torch.utils.data import DataLoader + +B = "/work/ratul1/supantha/Bertint" +TREE = "model_motif_20260908" +TEST = {"val_glycan_cold": ("test_glycan_cold", 37295), + "val_protein_cold": ("test_protein_cold", 38539), + "val_doubly_cold": ("test_doubly_cold", 3691)} +MIN_ROWS = 5 +GATE_TOL = 0.0005 +THRESH = 0.019 +DERANGE_SEED = 20260908 # identical to job 12246385 + +CELLS = [ + "affinose_mo_20260908_mo_A_glycan_s42", + "affinose_sa_20260908_moc_A_glycan_s43", + "affinose_sa_20260908_moc_A_glycan_s44", + "affinose_sa_20260908_mo_B_protein_s42", + "affinose_mof_20260909_mof_B_protein_s43", + "affinose_mof_20260909_mof_B_protein_s44", + "affinose_mo_20260908_mo_C_doubly_s42", + "affinose_mof_20260909_mof_C_doubly_s43", + "affinose_mof_20260909_mof_C_doubly_s44", +] +# test_macro per cell from affinose_arms_on_test_20260909.json (sha 670cfcbc...) +REF = { + "affinose_mo_20260908_mo_A_glycan_s42": 0.334059, + "affinose_sa_20260908_moc_A_glycan_s43": 0.318372, + "affinose_sa_20260908_moc_A_glycan_s44": 0.335480, + "affinose_sa_20260908_mo_B_protein_s42": 0.232603, + "affinose_mof_20260909_mof_B_protein_s43": 0.245126, + "affinose_mof_20260909_mof_B_protein_s44": 0.244894, + "affinose_mo_20260908_mo_C_doubly_s42": 0.177321, + "affinose_mof_20260909_mof_C_doubly_s43": 0.183977, + "affinose_mof_20260909_mof_C_doubly_s44": 0.174302, +} + +ap = argparse.ArgumentParser() +ap.add_argument("--out", required=True) +ap.add_argument("--npz_dir", required=True) +ap.add_argument("--batch_size", type=int, default=64) +args = ap.parse_args() + +if not torch.cuda.is_available(): + raise SystemExit("refusing CPU: the reference numbers were produced under CUDA AMP") +from torch.cuda.amp import autocast # noqa: E402 + +sys.path.insert(0, os.path.join(B, TREE)) +os.chdir(os.path.join(B, TREE)) +import bertint_v8 as bv # noqa: E402 +import dataset_v8 as dv # noqa: E402 + +os.makedirs(args.npz_dir, exist_ok=True) + + +def sha(p): + h = hashlib.sha256() + with open(p, "rb") as fh: + for c in iter(lambda: fh.read(1 << 20), b""): + h.update(c) + return h.hexdigest() + + +def macro(pred, y, assay, keep): + """Equal-assay macro over a FIXED eligible set. A constant prediction earns rho = 0.""" + v = [] + for k in keep: + s = assay == k + r = 0.0 if len(np.unique(pred[s])) < 2 else spearmanr(pred[s], y[s])[0] + v.append(0.0 if not np.isfinite(r) else float(r)) + return float(np.mean(v)), len(v) + + +out = {"schema": "affinose_protein_dependence_motif_v1", + "predeclaration": "review/AFFINOSE_UPDATE_TRACKER.md §B1 (written before this job ran)", + "tree": TREE, "device": torch.cuda.get_device_name(0), + "derangement_seed": DERANGE_SEED, "gate_tolerance": GATE_TOL, "threshold": THRESH, + "cells": {}} + +for name in CELLS: + d = os.path.join(B, "checkpoints", name) + a = json.load(open(os.path.join(d, "receipt.json"))).get("args", {}) + if int(a.get("motif_additive_dim", 0)) != 165 or int(a.get("size_additive_k", 0)) \ + or int(a.get("motif_concat_dim", 0)): + raise SystemExit("FATAL %s: not the reported motif-only configuration" % name) + if a.get("val_stratum") not in TEST or a.get("test_stratum") != a.get("val_stratum"): + raise SystemExit("FATAL %s: unexpected strata %s / %s" + % (name, a.get("val_stratum"), a.get("test_stratum"))) + ts, nrows = TEST[a["val_stratum"]] + print("\n================ %s -> %s ================" % (name, ts), flush=True) + + cfg, emb, lay = bv.load_bertose_encoder(a["bertose_checkpoint"], + freeze_layers=int(a.get("freeze_layers", 4))) + kw = dict(seq_embeddings=emb, seq_layers=lay, glycan_dim=cfg.seq_hidden_size, + protein_dim=int(a.get("protein_dim", 960)), shared_dim=int(a.get("shared_dim", 512)), + num_cross_layers=int(a.get("num_cross_layers", 2)), + num_heads=int(a.get("num_heads", 8)), swe_slices=int(a.get("swe_slices", 512)), + dropout=float(a.get("dropout", 0.1)), pooling_mode=a["pooling_mode"], + interaction_mode=a["interaction_mode"], + glycan_size_channel=bool(a.get("glycan_size_channel", False)), + motif_additive_dim=165) + model = bv.BertintV8(**kw).cuda() + ckp = os.path.join(d, "best_model.pt") + sd = torch.load(ckp, map_location="cpu", weights_only=False) + sd = sd.get("model_state_dict", sd) + miss, unexp = model.load_state_dict(sd, strict=False) + if unexp or [k for k in miss if "position_ids" not in k]: + raise SystemExit("FATAL %s: unexpected=%d missing=%s" % (name, len(unexp), list(miss)[:4])) + if float(model.motif_head.weight.abs().sum()) == 0.0: + raise SystemExit("FATAL %s: motif head is still at its zero init -- wrong weights" % name) + model.eval() + + ds = dv.BertintV8Dataset(a["csv_path"], None, "test", a["protein_emb_path"], a["vocab_path"], + roles_path=a["roles_tsv"], stratum=ts, features_dir=a["features_dir"], + expected_rows=nrows, + max_protein_length=int(a.get("max_protein_length", 1024))) + rec = ds.records.reset_index(drop=True) + ds.records = rec + assay = rec["exp_id"].astype(str).to_numpy() + prot = rec["protein_id"].astype(str).to_numpy() + y_all = rec[ds.target_col].to_numpy(dtype=np.float64) + g = pd.DataFrame({"a": assay, "y": y_all}).groupby("a")["y"] + keep = sorted(g.size()[(g.size() >= MIN_ROWS) & (g.nunique() >= 2)].index) + + # ── deterministic derangement over DISTINCT proteins of this stratum ───────────────────── + uniq = sorted(set(prot.tolist())) + if len(uniq) < 2: + raise SystemExit("FATAL %s: %d distinct protein(s); no derangement possible" % (name, len(uniq))) + perm = list(np.random.default_rng(DERANGE_SEED).permutation(uniq)) + donor = dict(zip(perm, perm[1:] + perm[:1])) + ds_re = copy.copy(ds) + rr = rec.copy() + rr["protein_id"] = [donor[p] for p in prot] + ds_re.records = rr + if int((rr["protein_id"].astype(str).to_numpy() == prot).sum()): + raise SystemExit("FATAL %s: rows kept their own protein" % name) + + # ── tripwires: protein must actually change; glycan + motif must not ───────────────────── + probe = np.linspace(0, len(rec) - 1, num=min(200, len(rec)), dtype=int) + n_prot_same, n_motif_diff, n_tok_diff = 0, 0, 0 + for i in probe: + x0, x1 = ds[int(i)], ds_re[int(i)] + if x0["protein_emb"].shape == x1["protein_emb"].shape and \ + torch.equal(x0["protein_emb"], x1["protein_emb"]): + n_prot_same += 1 + n_motif_diff += int(not torch.equal(x0["motif_features"], x1["motif_features"])) + n_tok_diff += int(not torch.equal(x0["token_ids"], x1["token_ids"])) + if n_motif_diff or n_tok_diff: + raise SystemExit("FATAL %s: reassignment changed glycan inputs (motif %d, tokens %d)" + % (name, n_motif_diff, n_tok_diff)) + if n_prot_same == len(probe): + raise SystemExit("FATAL %s: reassignment did NOT change any sampled protein embedding" % name) + print("tripwires: %d/%d sampled rows got a different protein embedding; glycan+motif unchanged" + % (len(probe) - n_prot_same, len(probe)), flush=True) + + def loader(dd): + return DataLoader(dd, batch_size=args.batch_size, shuffle=False, + collate_fn=dv.collate_fn, num_workers=4) + + tot, cnt = None, 0.0 + with torch.no_grad(): + for b in loader(ds): + e = b["protein_emb"].float() + m = b["protein_mask"].float().unsqueeze(-1) + s = (e * m).sum(dim=(0, 1)) + tot = s if tot is None else tot + s + cnt += float(m.sum()) + gmean = (tot / max(cnt, 1.0)).cuda() + + def run(dd, mode): + preds, targs = [], [] + with torch.no_grad(): + for b in loader(dd): + pe = b["protein_emb"].cuda() + if mode == "meanprot": + pe = gmean.view(1, 1, -1).expand_as(pe).contiguous().to(pe.dtype) + fk = dict(token_ids=b["token_ids"].cuda(), attention_mask=b["attention_mask"].cuda(), + branch_depths=b["branch_depths"].cuda(), + linkage_types=b["linkage_types"].cuda(), + protein_emb=pe, protein_mask=b["protein_mask"].cuda(), + motif_features=b["motif_features"].cuda()) + with autocast(enabled=True): + preds.append(model(**fk).float().cpu().numpy().ravel()) + targs.append(b["target"].float().numpy().ravel()) + return np.concatenate(preds).astype(np.float64), np.concatenate(targs).astype(np.float64) + + got = {} + got["intact"], y = run(ds, "intact") + got["reassigned"] = run(ds_re, "intact")[0] + got["meanprot"] = run(ds, "meanprot")[0] + + cell = {"stratum": ts, "seed": int(a.get("seed", -1)), "n_rows": int(len(y)), + "n_assays_eligible": len(keep), "checkpoint_sha256": sha(ckp), + "reference_test_macro": REF[name], "passes": {}} + base = None + for k in ("intact", "reassigned", "meanprot"): + mac, n = macro(got[k], y, assay, keep) + row = {"macro_spearman": mac, "pooled_spearman": float(spearmanr(got[k], y)[0]), + "pred_sd": float(got[k].std())} + if k == "intact": + base = mac + row["abs_diff_vs_reference"] = abs(mac - REF[name]) + row["reproduces_reference"] = bool(abs(mac - REF[name]) <= GATE_TOL) + else: + row["delta_macro_vs_intact"] = mac - base + row["spearman_vs_intact_predictions"] = float(spearmanr(got[k], got["intact"])[0]) + cell["passes"][k] = row + print(" %-10s macro=%.4f pooled=%.4f%s" % ( + k, mac, row["pooled_spearman"], + " ref=%.4f diff=%.5f %s" % (REF[name], row["abs_diff_vs_reference"], + "OK" if row["reproduces_reference"] else "GATE FAIL") + if k == "intact" else " delta=%+.4f agree_with_intact=%.4f" + % (row["delta_macro_vs_intact"], row["spearman_vs_intact_predictions"])), flush=True) + + np.savez_compressed(os.path.join(args.npz_dir, name + ".npz"), target=y, assay=assay, + protein=prot, glycan=rec["glycan_wurcs"].astype(str).to_numpy(), **got) + out["cells"][name] = cell + del model + torch.cuda.empty_cache() + +# ── gate, then the pre-declared verdict ─────────────────────────────────────────────────────── +gate = all(c["passes"]["intact"]["reproduces_reference"] for c in out["cells"].values()) +out["gate_passed"] = gate +summ = {} +for ts in ("test_glycan_cold", "test_protein_cold", "test_doubly_cold"): + cs = [c for c in out["cells"].values() if c["stratum"] == ts] + wr = [-c["passes"]["reassigned"]["delta_macro_vs_intact"] for c in cs] + mp = [-c["passes"]["meanprot"]["delta_macro_vs_intact"] for c in cs] + summ[ts] = {"n_seeds": len(cs), + "intact_mean": float(np.mean([c["passes"]["intact"]["macro_spearman"] for c in cs])), + "wrong_protein_drop_mean": float(np.mean(wr)), + "wrong_protein_drop_sd": float(np.std(wr, ddof=1)) if len(wr) > 1 else None, + "mean_protein_drop_mean": float(np.mean(mp)), + "wrong_ge_mean_per_seed": int(sum(w >= m for w, m in zip(wr, mp))), + "agree_with_intact_mean": float(np.mean( + [c["passes"]["reassigned"]["spearman_vs_intact_predictions"] for c in cs]))} +out["summary"] = summ +gc = summ["test_glycan_cold"] +if not gate: + out["verdict"] = "NOT REPORTED -- intact pass failed the +-%.4f reproduction gate" % GATE_TOL +else: + ok_thr = gc["wrong_protein_drop_mean"] > THRESH + ok_spec = gc["wrong_protein_drop_mean"] >= gc["mean_protein_drop_mean"] + out["verdict_components"] = {"threshold_met": ok_thr, "specificity_met": ok_spec} + out["verdict"] = ("SUPPORTED: the reported model uses the protein partner" if ok_thr and ok_spec + else "NOT SUPPORTED under the pre-declared rule") +print("\n================ SUMMARY ================") +print("gate_passed:", gate) +for ts, s in summ.items(): + print(" %-18s intact=%.4f wrong-protein drop=%.4f (sd %s) mean-protein drop=%.4f " + "wrong>=mean on %d/%d seeds agree=%.3f" + % (ts, s["intact_mean"], s["wrong_protein_drop_mean"], + "%.4f" % s["wrong_protein_drop_sd"] if s["wrong_protein_drop_sd"] is not None else "-", + s["mean_protein_drop_mean"], s["wrong_ge_mean_per_seed"], s["n_seeds"], + s["agree_with_intact_mean"])) +print("VERDICT:", out["verdict"]) +json.dump(out, open(args.out, "w"), indent=1) +print("wrote", args.out) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/aff_attribution_motif.sbatch b/releases/2026-10-02/bertosebind_new_runs/executed/remote/aff_attribution_motif.sbatch new file mode 100644 index 0000000000000000000000000000000000000000..1c1a7089c73f70c8f0f9d9abb0aab2f2f1f18173 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/aff_attribution_motif.sbatch @@ -0,0 +1,34 @@ +#!/bin/bash +#SBATCH --job-name=aff_attr_motif +#SBATCH --partition=nova +#SBATCH --account=ratul +#SBATCH --qos=normal +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=4 +#SBATCH --mem=32G +#SBATCH --gres=gpu:1 +#SBATCH --time=03:00:00 +#SBATCH --output=/work/ratul1/supantha/Bertint/logs/aff_attr_motif_%j.out +#SBATCH --error=/work/ratul1/supantha/Bertint/logs/aff_attr_motif_%j.out +# +# Protein-dependence of the REPORTED BERToseBind (motif-additive) model on the TEST strata. +# Inference only: no training, no checkpoint modified, 9 cells (3 regimes x seeds 42/43/44). +# Pre-declared in writing/review/AFFINOSE_UPDATE_TRACKER.md §B1 before submission. +# Generic gpu:1 per project rules (inference has no training-drift pin); device is recorded. +set -euo pipefail +cd /work/ratul1/supantha/Bertint +PY=/work/ratul1/supantha/conda/blade/bin/python +OUT=/work/ratul1/supantha/Bertint/affinose_attribution_motif_20260925.json +NPZ=/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds +hostname; nvidia-smi --query-gpu=name --format=csv,noheader +# output-absence gate: never overwrite an earlier result +if [ -e "$OUT" ]; then echo "FATAL: $OUT already exists -- refusing to overwrite"; exit 1; fi +# CUDA guard: a GPU allocation with a dead CUDA runtime must fail, not fall back to CPU +if ! $PY -c "import torch,sys; sys.exit(0 if torch.cuda.is_available() else 1)"; then + echo "FATAL: CUDA unavailable on ${SLURMD_NODENAME} despite a GPU allocation." + echo "Resubmit with --exclude=${SLURMD_NODENAME}" + exit 1 +fi +$PY -u aff_attribution_motif.py --out "$OUT" --npz_dir "$NPZ" +echo "===== done =====" diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_A_glycan_gifflarESM.json b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_A_glycan_gifflarESM.json new file mode 100644 index 0000000000000000000000000000000000000000..abf9af6cf4e7c6b0e7936814a84d68cb91fabd61 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_A_glycan_gifflarESM.json @@ -0,0 +1,19 @@ +{ + "arm": "A_glycan", + "variant": "gifflarESM", + "stratum": "test_glycan_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs/LGI_gifflarESM/version_4", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs/LGI_gifflarESM/version_4/weights/epoch=24-step=86050.ckpt", + "gifflar_reported_test_spearman": 0.319292, + "pooled_over_gifflar_rows": 0.319292, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 37315, + "rows_scored": 36635, + "assays_eligible_data_only": 1767, + "assays_scored": 1687, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.248908, + "macro_eligibility_corrected": 0.237639, + "pooled_over_our_rows": 0.319292, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_A_glycan_sweetnetESM.json b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_A_glycan_sweetnetESM.json new file mode 100644 index 0000000000000000000000000000000000000000..09a11baf4b7b4d14ce66e18ab294e48daef6c957 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_A_glycan_sweetnetESM.json @@ -0,0 +1,19 @@ +{ + "arm": "A_glycan", + "variant": "sweetnetESM", + "stratum": "test_glycan_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs/LGI_sweetnetESM/version_0/weights/epoch=34-step=120470.ckpt", + "gifflar_reported_test_spearman": 0.310322, + "pooled_over_gifflar_rows": 0.310322, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 37315, + "rows_scored": 36635, + "assays_eligible_data_only": 1767, + "assays_scored": 1687, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.25528, + "macro_eligibility_corrected": 0.243723, + "pooled_over_our_rows": 0.310322, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_B_protein_gifflarESM.json b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_B_protein_gifflarESM.json new file mode 100644 index 0000000000000000000000000000000000000000..ed014793ca04f363c70e5b0eaa7b341d33522db3 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_B_protein_gifflarESM.json @@ -0,0 +1,19 @@ +{ + "arm": "B_protein", + "variant": "gifflarESM", + "stratum": "test_protein_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs/LGI_gifflarESM/version_2", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs/LGI_gifflarESM/version_2/weights/epoch=32-step=113652.ckpt", + "gifflar_reported_test_spearman": 0.255667, + "pooled_over_gifflar_rows": 0.255667, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 38556, + "rows_scored": 36957, + "assays_eligible_data_only": 246, + "assays_scored": 233, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.222149, + "macro_eligibility_corrected": 0.21041, + "pooled_over_our_rows": 0.255667, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_B_protein_sweetnetESM.json b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_B_protein_sweetnetESM.json new file mode 100644 index 0000000000000000000000000000000000000000..76afcd0081014124ead3decfb26bdd6db3b49165 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_B_protein_sweetnetESM.json @@ -0,0 +1,19 @@ +{ + "arm": "B_protein", + "variant": "sweetnetESM", + "stratum": "test_protein_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs/LGI_sweetnetESM/version_1", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs/LGI_sweetnetESM/version_1/weights/epoch=47-step=165312.ckpt", + "gifflar_reported_test_spearman": 0.193882, + "pooled_over_gifflar_rows": 0.193882, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 38556, + "rows_scored": 36957, + "assays_eligible_data_only": 246, + "assays_scored": 233, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.18519, + "macro_eligibility_corrected": 0.175404, + "pooled_over_our_rows": 0.193882, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_C_doubly_gifflarESM.json b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_C_doubly_gifflarESM.json new file mode 100644 index 0000000000000000000000000000000000000000..f339ecf857fd838e138e20b042775ac8f1fc1b98 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_C_doubly_gifflarESM.json @@ -0,0 +1,19 @@ +{ + "arm": "C_doubly", + "variant": "gifflarESM", + "stratum": "test_doubly_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs/LGI_gifflarESM/version_2", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs/LGI_gifflarESM/version_2/weights/epoch=49-step=286800.ckpt", + "gifflar_reported_test_spearman": 0.235427, + "pooled_over_gifflar_rows": 0.235427, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 3691, + "rows_scored": 3533, + "assays_eligible_data_only": 212, + "assays_scored": 201, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.125735, + "macro_eligibility_corrected": 0.119211, + "pooled_over_our_rows": 0.235427, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_C_doubly_sweetnetESM.json b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_C_doubly_sweetnetESM.json new file mode 100644 index 0000000000000000000000000000000000000000..62924b0dccde9c9747ae65ce9e072f845279d291 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_C_doubly_sweetnetESM.json @@ -0,0 +1,19 @@ +{ + "arm": "C_doubly", + "variant": "sweetnetESM", + "stratum": "test_doubly_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs/LGI_sweetnetESM/version_0/weights/epoch=17-step=103248.ckpt", + "gifflar_reported_test_spearman": 0.26308, + "pooled_over_gifflar_rows": 0.26308, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 3691, + "rows_scored": 3533, + "assays_eligible_data_only": 212, + "assays_scored": 201, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.237241, + "macro_eligibility_corrected": 0.224931, + "pooled_over_our_rows": 0.26308, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_glycan_cold_contamination.json b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_glycan_cold_contamination.json new file mode 100644 index 0000000000000000000000000000000000000000..5bcc4fa0d20dbdec487920f9223d4de3394798b9 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/affinose_glycan_cold_contamination.json @@ -0,0 +1,53 @@ +{ + "exact_match_only": true, + "note": "exact canonical-WURCS identity is a LOWER BOUND on contamination; near-identical glycans differing by one residue are NOT counted and remain an open question", + "pretraining_distinct_wurcs": 281208, + "pretraining_used_by_model": 221899, + "strata": { + "test_glycan_cold": { + "distinct_glycans": 339, + "rows": 24704, + "glycans_in_pretraining_USED": 32, + "glycans_in_pretraining_ANY": 220, + "pct_glycans_in_pretraining_USED": 9.44, + "pct_rows_whose_glycan_was_pretrained": 4.21 + }, + "test_doubly_cold": { + "distinct_glycans": 173, + "rows": 3691, + "glycans_in_pretraining_USED": 14, + "glycans_in_pretraining_ANY": 123, + "pct_glycans_in_pretraining_USED": 8.09, + "pct_rows_whose_glycan_was_pretrained": 0.46 + }, + "test_protein_cold": { + "distinct_glycans": 827, + "rows": 38395, + "glycans_in_pretraining_USED": 118, + "glycans_in_pretraining_ANY": 699, + "pct_glycans_in_pretraining_USED": 14.27, + "pct_rows_whose_glycan_was_pretrained": 0.41 + }, + "val_glycan_cold": { + "distinct_glycans": 333, + "rows": 24097, + "glycans_in_pretraining_USED": 28, + "glycans_in_pretraining_ANY": 196, + "pct_glycans_in_pretraining_USED": 8.41, + "pct_rows_whose_glycan_was_pretrained": 3.02 + }, + "fit_train": { + "distinct_glycans": 1505, + "rows": 231318, + "glycans_in_pretraining_USED": 297, + "glycans_in_pretraining_ANY": 1151, + "pct_glycans_in_pretraining_USED": 19.73, + "pct_rows_whose_glycan_was_pretrained": 3.79 + } + }, + "VERDICT": { + "glycan_cold_pct_pretrained": 9.44, + "assessment": "MINOR by exact match - still disclose, and note that near-identity was not tested", + "what_this_does_NOT_test": "near-duplicate glycans, shared substructures, and the BPE token overlap that lets an encoder generalise to an unseen glycan" + } +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_baselines_perrow.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_baselines_perrow.py new file mode 100644 index 0000000000000000000000000000000000000000..310299e01497d18524b7b3b857e29bcc40b65e1d --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_baselines_perrow.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python3 +"""#4 step 2 -- per-row predictions for the two baselines that never saved them. CPU only. + + size_ntok p40_per_assay_attribution.py: Spearman of the glycan's BPE token count (attention-mask + sum of its feature row) against the target. Zero parameters. Glycans whose tree + channels are invalid are dropped, as in p40. + motif_ridge p44_motif_baseline.py: ridge on the 165-motif indicator matrix, glycan-weighted, alpha + chosen on the VALIDATION macro from {0.1, 1, 10, 100, 1000}; glycans must be in the + motif matrix and have valid tree channels, as in p44. + +GATES (recorded values, +-0.0005): size 0.2449 / -0.0147 / 0.2242 (main table); +motif 0.2298 / 0.0741 / 0.2290 (ledger/motif_baseline_20260908.json). Both producers score with +data-only eligibility on their own filtered rows and rho = 0 for a constant prediction. +""" +import csv as _csv +import gzip +import json +import os +import sys + +import numpy as np +import pandas as pd +from scipy.stats import spearmanr + +B = "/work/ratul1/supantha/Bertint" +ART = B + "/v2_artifacts" +FEAT = B + "/data/review_affinose_glycan_features_20260824_r1" +MOTIF = ART + "/review_affinose_v2_glycan_motif_matrix_20260926.tsv.gz" +OUTD = B + "/b4_perrow" +MIN_ROWS, ALPHAS, TOL = 5, [0.1, 1.0, 10.0, 100.0, 1000.0], 5e-4 +REG = {"A_glycan": ("val_glycan_cold", "test_glycan_cold"), + "B_protein": ("val_protein_cold", "test_protein_cold"), + "C_doubly": ("val_doubly_cold", "test_doubly_cold")} +WANT = {"size_ntok": {"A_glycan": 0.2449, "B_protein": -0.0147, "C_doubly": 0.2242}, + "motif_ridge": {"A_glycan": 0.2298, "B_protein": 0.0741, "C_doubly": 0.2290}} +os.makedirs(OUTD, exist_ok=True) +RES = OUTD + "/baselines_receipt.json" +if os.path.exists(RES): + sys.exit("FATAL: %s exists -- refusing to overwrite" % RES) + +frow, fvalid = {}, {} +with gzip.open(FEAT + "/review_affinose_glycan_index.tsv.gz", "rt", newline="") as fh: + for r in _csv.DictReader(fh, delimiter="\t"): + w = r["canonical_wurcs"].strip() + frow[w] = int(r["feature_row"]); fvalid[w] = (r["tree_channels_valid"] == "True") +mask = np.load(FEAT + "/review_attention_mask.npy") +M = pd.read_csv(MOTIF, sep="\t", compression="gzip") +M = M.rename(columns={"Unnamed: 0": "glycan_wurcs"}).set_index("glycan_wurcs") +MOT = M.columns.tolist() + + +def elig(d): + g = d.groupby("exp_id")["target_rank"] + return set(g.size()[(g.size() >= MIN_ROWS) & (g.nunique() >= 2)].index) + + +def macro(pred, y, assay, keep): + v = [] + for a in keep: + m = assay == a + r = 0.0 if len(np.unique(pred[m])) < 2 else spearmanr(pred[m], y[m])[0] + v.append(0.0 if not np.isfinite(r) else r) + return float(np.mean(v)) if v else float("nan") + + +def fit(E, gi, y, alpha): # p44's weighted ridge, verbatim + G = E.shape[0] + n = np.bincount(gi, minlength=G).astype(float) + sy = np.bincount(gi, weights=y, minlength=G) + tot = n.sum(); wm = (n @ E) / tot + Ec = E - wm + sd = np.sqrt((n[:, None] * Ec ** 2).sum(0) / tot).clip(1e-8) + Ec /= sd + yb = sy.sum() / tot + A_ = (Ec * n[:, None]).T @ Ec + alpha * np.eye(E.shape[1]) + w = np.linalg.solve(A_, Ec.T @ (sy - yb * n)) + return lambda X: yb + ((X - wm) / sd) @ w + + +def dump(name, reg, te, pred): + p = "%s/baseline_%s_%s_perrow.npz" % (OUTD, name, reg) + if os.path.exists(p): + sys.exit("FATAL: %s exists" % p) + np.savez_compressed(p, exp_id=te["exp_id"].astype(str).to_numpy().astype(object), + protein_id=te["_p"].to_numpy().astype(object), + glycan=te["_g"].to_numpy().astype(object), + target=te["target_rank"].to_numpy(float), prediction=np.asarray(pred, float)) + return p + + +R = {"schema": "affinose_b4_baselines_perrow_v1", "results": {}} +ok_all = True +for reg, (vs, ts) in REG.items(): + df = pd.read_csv(ART + "/review_affinose_%s_binding.csv" % reg) + df["_p"] = df.protein_id.astype(str).str.strip(); df["_g"] = df.glycan_wurcs.astype(str).str.strip() + ro = pd.read_csv(ART + "/review_affinose_%s_roles.tsv.gz" % reg, sep="\t", compression="gzip", + usecols=["protein_id", "glycan_wurcs", "evaluation_stratum"]) + ro["_p"] = ro.protein_id.astype(str).str.strip(); ro["_g"] = ro.glycan_wurcs.astype(str).str.strip() + m = df.merge(ro[["_p", "_g", "evaluation_stratum"]], on=["_p", "_g"], how="left", + validate="many_to_one") + R["results"][reg] = {} + + # ── size rule: BPE token count (p40) ────────────────────────────────────────────────────── + te = m[(m.evaluation_stratum == ts) & m["_g"].map(lambda w: fvalid.get(w, False))].dropna( + subset=["target_rank"]).copy() + te["ntok"] = [int(mask[frow[w]].sum()) for w in te["_g"]] + keep = elig(te) + got = macro(te["ntok"].to_numpy(float), te.target_rank.to_numpy(float), + te.exp_id.astype(str).to_numpy(), keep) + ok = abs(got - WANT["size_ntok"][reg]) <= TOL + ok_all &= ok + R["results"][reg]["size_ntok"] = {"macro": got, "recorded": WANT["size_ntok"][reg], + "gate_pass": bool(ok), "rows": int(len(te)), "assays": len(keep), + "perrow": dump("size_ntok", reg, te, te["ntok"].to_numpy(float))} + + # ── motif ridge (p44) ───────────────────────────────────────────────────────────────────── + mm = m[m["_g"].map(lambda w: fvalid.get(w, False))] + mm = mm[mm["_g"].isin(M.index)].copy() + gl = sorted(mm["_g"].unique()); idx = {g: i for i, g in enumerate(gl)} + E = M.loc[gl, MOT].to_numpy(dtype=float) + mm["gi"] = mm["_g"].map(idx) + tr = mm[mm.evaluation_stratum == "fit_train"] + va = mm[mm.evaluation_stratum == vs] + tt = mm[mm.evaluation_stratum == ts].copy() + ev, et = elig(va), elig(tt) + best = None + for a in ALPHAS: + f = fit(E, tr.gi.to_numpy(), tr.target_rank.to_numpy(), a) + sv = macro(f(E)[va.gi.to_numpy()], va.target_rank.to_numpy(), va.exp_id.astype(str).to_numpy(), ev) + if best is None or sv > best[1]: + best = (a, sv, f) + pt = best[2](E)[tt.gi.to_numpy()] + got = macro(pt, tt.target_rank.to_numpy(), tt.exp_id.astype(str).to_numpy(), et) + ok = abs(got - WANT["motif_ridge"][reg]) <= TOL + ok_all &= ok + R["results"][reg]["motif_ridge"] = {"macro": got, "recorded": WANT["motif_ridge"][reg], + "gate_pass": bool(ok), "alpha": best[0], "val_macro": best[1], + "rows": int(len(tt)), "assays": len(et), + "perrow": dump("motif_ridge", reg, tt, pt)} + print(reg, json.dumps(R["results"][reg], indent=1, default=str), flush=True) + +R["all_gates_pass"] = bool(ok_all) +json.dump(R, open(RES, "w"), indent=1, default=str) +print("ALL GATES PASS:", ok_all) +if not ok_all: + sys.exit("GATE FAIL -- see %s" % RES) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_gif_repeat.sbatch b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_gif_repeat.sbatch new file mode 100644 index 0000000000000000000000000000000000000000..50f5aca7289809fcdb074e18ce1804ca5ccb8d26 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_gif_repeat.sbatch @@ -0,0 +1,37 @@ +#!/bin/bash +#SBATCH --job-name=aff_b4_grep +#SBATCH --partition=nova +#SBATCH --account=ratul +#SBATCH --qos=normal +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=8 +#SBATCH --mem=96G +#SBATCH --gres=gpu:1 +#SBATCH --time=01:00:00 +#SBATCH --output=/work/ratul1/supantha/Bertint/logs/aff_b4_grep_%j.out +#SBATCH --error=/work/ratul1/supantha/Bertint/logs/aff_b4_grep_%j.out +# #4 diagnostic: re-score the 3 protein-cold GIFFLAR runs that missed the 1e-5 gate TWICE MORE from the +# identical recorded checkpoint, on ONE GPU in ONE job, then compare per-row predictions. +set -uo pipefail +export HF_HOME=/work/ratul1/supantha/hf_cache +export PYTHONNOUSERSITE=1 +B=/work/ratul1/supantha/Bertint +PY=/work/ratul1/supantha/conda/gifflar/bin/python +cd $B && mkdir -p b4_perrow/repeat +hostname; nvidia-smi --query-gpu=name --format=csv,noheader +for RUN in "B_protein gifflarESM 42" "B_protein gifflarESM 44" "B_protein sweetnetESM 44"; do + read -r ARM VAR SEED <<< "$RUN" + SHORT=${VAR%ESM} + if [ "$SEED" = "42" ]; then LOGS=logs; RC=$B/affinose_gifflar_macro_${ARM}_${VAR}.json + else LOGS=logs_s${SEED}_${SHORT}; RC=$B/affinose_gifflar_macro_${ARM}_${VAR}_s${SEED}.json; fi + for K in 1 2; do + echo "=== $ARM $VAR s$SEED repeat $K ===" + $PY -u gifflar_score_perrow.py --arm "$ARM" --variant "$VAR" --logs_dir "$LOGS" --from_receipt "$RC" \ + --perrow "$B/b4_perrow/repeat/gifflar_${ARM}_${VAR}_s${SEED}_r${K}_perrow.npz" \ + --out "$B/b4_perrow/repeat/gifflar_${ARM}_${VAR}_s${SEED}_r${K}_receipt.json" > /dev/null \ + || { echo "FATAL: repeat failed"; exit 1; } + done +done +$PY -u b4_gif_repeat_compare.py +echo "===== done =====" diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_gif_repeat_compare.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_gif_repeat_compare.py new file mode 100644 index 0000000000000000000000000000000000000000..f531c9b69de12aca1cd3af6909bbbfc8c914eaaf --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_gif_repeat_compare.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +"""#4 diagnostic: is GIFFLAR inference bit-reproducible? CPU comparison of repeat scorings. + +The step-3 gate failed on 3 protein-cold GIFFLAR runs by 2e-5 .. 3e-4 (tolerance 1e-5). Each run was +re-scored TWICE MORE from the identical checkpoint (b4_perrow/repeat/). If the repeats differ from +each other and from the step-2 file, inference is nondeterministic and the recorded macro is one draw +from that noise; the size of the spread is what matters. +""" +import json +import os +import sys + +import numpy as np + +B = "/work/ratul1/supantha/Bertint" +RUNS = [("B_protein", "gifflarESM", 42), ("B_protein", "gifflarESM", 44), ("B_protein", "sweetnetESM", 44)] +OUT = B + "/diagnostics/affinose_b4_gif_repeat_20260927.json" +if os.path.exists(OUT): + sys.exit("FATAL: %s exists" % OUT) +R = {} +for arm, var, sd in RUNS: + tag = "%s_%s_s%d" % (arm, var, sd) + files = [B + "/b4_perrow/gifflar_%s_perrow.npz" % tag] + \ + [B + "/b4_perrow/repeat/gifflar_%s_r%d_perrow.npz" % (tag, k) for k in (1, 2)] + recs = [B + "/b4_perrow/gifflar_%s_receipt.json" % tag] + \ + [B + "/b4_perrow/repeat/gifflar_%s_r%d_receipt.json" % (tag, k) for k in (1, 2)] + Z = [np.load(f, allow_pickle=True) for f in files] + keys_same = all(np.array_equal(Z[0][k], z[k]) for z in Z[1:] for k in ("exp_id", "glycan", "target")) + P = [z["prediction"].astype(float) for z in Z] + maxdiff = max(float(np.abs(P[i] - P[j]).max()) for i in range(3) for j in range(i + 1, 3)) + bitident = all(np.array_equal(P[0], p) for p in P[1:]) + macros = [json.load(open(r))["macro_eligibility_corrected"] for r in recs] + R[tag] = {"row_keys_identical": bool(keys_same), "predictions_bit_identical": bool(bitident), + "max_abs_prediction_diff": maxdiff, "macros_step2_r1_r2": macros, + "macro_spread": float(max(macros) - min(macros))} + print(tag, json.dumps(R[tag]), flush=True) +json.dump(R, open(OUT, "w"), indent=1) +print("wrote", OUT) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_lo_perrow_ckpt.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_lo_perrow_ckpt.py new file mode 100644 index 0000000000000000000000000000000000000000..9e0e11b0e6f6655bc423e4a04c78bcd36ac89323 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_lo_perrow_ckpt.py @@ -0,0 +1,168 @@ +#!/usr/bin/env python3 +"""#4 step 2 -- per-row LectinOracle predictions from SAVED checkpoints. Inference only. + +WHY INFERENCE AND NOT A RETRAIN: LectinOracle drifts up to 0.027 macro at a fixed seed, so a retrain +would not reproduce the reported draw. The checkpoints the producers saved ARE the reported models. + +Data preparation and the test-scoring loop are copied from the producers: + --kind matched -> lectinoracle_matched.py (LectinOracle, pooled ESM-C 300M, flex=False) + --kind flex -> lectinoracle_retrain_v2.py (LectinOracle_flex, raw sequence, flex=True) + +GATE: the producer's own macro rule (which EXCLUDES constant-prediction assays) is recomputed from the +dumped rows and must reproduce the receipt's macro_spearman to +-0.0005, or the file is marked FAIL. +The dump is keyed (exp_id, glycan_wurcs) exactly like the producers' own per-row files. Never writes +over a producer file. +""" +import argparse +import collections +import hashlib +import json +import os +import sys + +import numpy as np +import pandas as pd +import torch +from scipy.stats import spearmanr + +B = "/work/ratul1/supantha/Bertint" +ART = os.path.join(B, "v2_artifacts") +OUTD = os.path.join(B, "b4_perrow") +MIN_ROWS, MIN_DISTINCT, TOL = 5, 2, 5e-4 +STRAT = {"A_glycan": "test_glycan_cold", "B_protein": "test_protein_cold", "C_doubly": "test_doubly_cold"} +VAL = {"A_glycan": "val_glycan_cold", "B_protein": "val_protein_cold", "C_doubly": "val_doubly_cold"} + +ap = argparse.ArgumentParser() +ap.add_argument("--kind", required=True, choices=["matched", "flex"]) +ap.add_argument("--arm", required=True, choices=list(STRAT)) +ap.add_argument("--seed", required=True, type=int) +A = ap.parse_args() + +if A.kind == "matched": + TAG = "mt%ss%d" % (A.arm, A.seed) + CKPT = os.path.join(B, "lectinoracle_matched_%s.pt" % TAG) + RECEIPT = os.path.join(B, "affinose_lectinoracle_matched_%s.json" % TAG) +else: + TAG = "pr%ss%d" % (A.arm, A.seed) + CKPT = os.path.join(B, "lectinoracle_retrained_v2_%s.pt" % TAG) + RECEIPT = os.path.join(B, "affinose_lectinoracle_retrain_v2_%s.json" % TAG) +STRATUM = STRAT[A.arm] +os.makedirs(OUTD, exist_ok=True) +NPZ = os.path.join(OUTD, "lo_%s_%s_%s_perrow.npz" % (A.kind, TAG, STRATUM)) +RES = os.path.join(OUTD, "lo_%s_%s_%s_receipt.json" % (A.kind, TAG, STRATUM)) +for p in (NPZ, RES): + if os.path.exists(p): + sys.exit("FATAL: %s exists -- refusing to overwrite" % p) +for p in (CKPT, RECEIPT): + if not os.path.exists(p): + sys.exit("FATAL: missing %s" % p) +rec = json.load(open(RECEIPT)) +want = rec.get("regimes", {}).get(STRATUM, {}).get("macro_spearman") +if want is None: + sys.exit("FATAL: receipt %s has no macro_spearman for %s" % (RECEIPT, STRATUM)) + + +def sha(p): + h = hashlib.sha256() + with open(p, "rb") as fh: + for c in iter(lambda: fh.read(1 << 20), b""): + h.update(c) + return h.hexdigest() + + +# ── data, exactly as the producers build it ─────────────────────────────────────────────────── +csv = pd.read_csv(os.path.join(ART, "review_affinose_%s_binding.csv" % A.arm)) +roles = pd.read_csv(os.path.join(ART, "review_affinose_%s_roles.tsv.gz" % A.arm), sep="\t", + compression="gzip") +prot = pd.read_csv(os.path.join(ART, "affinose_v2_proteins.tsv.gz"), sep="\t", compression="gzip") +seqd = dict(zip(prot["model_input_sha256"], prot["protein_seq"])) +csv = csv.merge(roles[["protein_id", "glycan_wurcs", "evaluation_stratum"]], + on=["protein_id", "glycan_wurcs"], how="left", validate="many_to_one") +w2i = json.load(open(os.path.join(B, "affinose_wurcs_to_iupac_usable.json"))) +csv["iupac"] = csv["glycan_wurcs"].map(w2i) +csv = csv[csv["iupac"].notna()] + +from glycowork.ml.models import prep_model # noqa: E402 +from glycowork.ml.inference import get_lectin_preds # noqa: E402 + +PROT_DIC = None +if A.kind == "matched": + import h5py + pool = {} + with h5py.File(os.path.join(B, "affinose_v2_esmc_by_seqhash_r2.h5"), "r") as f: + for k in f.keys(): + pool[k.replace("|", "/")] = f[k][()].astype("float32").mean(0) + if {int(v.shape[0]) for v in pool.values()} != {960}: + sys.exit("FATAL: pooled protein dim is not 960") + PROT_DIC = {str(s): pool[p] for p, s in seqd.items() if p in pool} + model = prep_model("LectinOracle", num_classes=1, trained=False) +else: + model = prep_model("LectinOracle_flex", num_classes=1, trained=False) + +sd = torch.load(CKPT, map_location="cpu") +model.load_state_dict(sd, strict=True) # strict: any missing/unexpected key raises +model.eval() +pre = prep_model("LectinOracle" if A.kind == "matched" else "LectinOracle_flex", + num_classes=1, trained=True).state_dict() +shared = [k for k in sd if k in pre and sd[k].shape == pre[k].shape] +same = sum(1 for k in shared + if float((sd[k].float().cpu() - pre[k].float().cpu()).abs().max()) < 1e-6) +if shared and same == len(shared): + sys.exit("FATAL: checkpoint is identical to the PRETRAINED model") + +# ── scoring loop, exactly as the producers score the test stratum ──────────────────────────── +te = csv[csv["evaluation_stratum"] == STRATUM] +P, T, G, K, fails = [], [], [], [], 0 +with torch.no_grad(): + for exp, d in te.groupby("exp_id"): + s = seqd.get(d["protein_id"].iloc[0]) + if not isinstance(s, str) or len(d) < MIN_ROWS: + continue + try: + if A.kind == "matched": + pr = get_lectin_preds(str(s), list(d["iupac"]), model, prot_dic=PROT_DIC, + flex=False, sort=False) + else: + pr = get_lectin_preds(str(s), list(d["iupac"]), model, flex=True, sort=False) + p = np.asarray(pr["pred"] if hasattr(pr, "columns") else pr, dtype=float) + if len(p) != len(d) or not np.isfinite(p).all(): + fails += 1 + continue + P.extend(p); T.extend(d["target_rank"].values); G.extend([str(exp)] * len(d)) + K.extend([str(g) for g in d["glycan_wurcs"]]) + except Exception: + fails += 1 +P, T, G = np.asarray(P, float), np.asarray(T, float), np.asarray(G) + + +def producer_macro(pred, targ, groups): + idx = collections.defaultdict(list) + for i, g in enumerate(groups): + idx[g].append(i) + vals = [] + for g, ii in idx.items(): + if len(ii) < MIN_ROWS: + continue + t_, p_ = targ[ii], pred[ii] + if len(np.unique(t_)) < MIN_DISTINCT or len(np.unique(p_)) < MIN_DISTINCT: + continue + r = spearmanr(p_, t_)[0] + if not np.isnan(r): + vals.append(float(r)) + return (float(np.mean(vals)) if vals else None), len(vals) + + +got, n = producer_macro(P, T, G) +ok = got is not None and abs(got - float(want)) <= TOL +np.savez_compressed(NPZ, exp_id=np.asarray(G, dtype=object), glycan=np.asarray(K, dtype=object), + target=T, prediction=P) +R = {"kind": A.kind, "arm": A.arm, "seed": A.seed, "stratum": STRATUM, "tag": TAG, + "checkpoint": CKPT, "checkpoint_sha256": sha(CKPT), "receipt": RECEIPT, + "receipt_macro": float(want), "recomputed_macro_producer_rule": got, + "abs_diff": None if got is None else abs(got - float(want)), "gate_pass": bool(ok), + "rows": int(len(P)), "assays_scored": n, "assays_failed": fails, + "perrow_npz": NPZ, "device": torch.cuda.get_device_name(0) if torch.cuda.is_available() else "cpu"} +json.dump(R, open(RES, "w"), indent=1) +print(json.dumps(R, indent=1)) +if not ok: + sys.exit("GATE FAIL: recomputed %s vs receipt %s" % (got, want)) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_step1_structure.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_step1_structure.py new file mode 100644 index 0000000000000000000000000000000000000000..e8d4e745d2044db3117b99f8aeb9d0a11ee742ba --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_step1_structure.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python3 +"""#4 step 1 -- test-set STRUCTURE, the effective-sample-size bound, and an input inventory. + +CPU only. Pre-declaration: writing/review/AFFINOSE_UPDATE_TRACKER.md §B4 (written 2026-09-25, before +any of this ran). This step produces NO comparison between methods; it describes how much +independent information each test regime contains, and locates every input step 2 needs. + +Per regime (glycan-cold, protein-cold, doubly-cold): + 1. rows / assays / glycans / proteins, and glycan- and protein-COMPONENT counts (the pre-declared + two-way resampling units), with the largest component's share + 2. PANELS: an assay's panel = the exact set of glycans it contains in the test stratum. + Kish bound for a glycan-only predictor under perfect within-panel dependence: + n_eff_max = A^2 / sum_p n_p^2 (A assays, n_p assays on panel p) + 3. per-assay Spearman for (a) BERToseBind (reported cells, seed-mean prediction per seed then + averaged rho) and (b) the zero-parameter size rule, and the within-panel ICC of per-assay rho + (one-way ANOVA estimator), giving a data-driven design effect and n_eff = A / DEFF + 4. size rule scored TWO ways and both reported: constant-prediction assays EXCLUDED (as p35) vs + scored rho = 0 on the data-only eligible set (as pre-declared for #4) +Inventory: LectinOracle checkpoints / per-row files, baseline producers, GIFFLAR best checkpoints. +""" +import glob +import gzip +import hashlib +import json +import os +import re + +import numpy as np +import pandas as pd +from scipy.stats import spearmanr + +B = "/work/ratul1/supantha/Bertint" +V2 = B + "/v2_artifacts" +PRED = B + "/affinose_attribution_motif_preds" +OUT = B + "/diagnostics/affinose_b4_step1_structure_20260926.json" +MIN_ROWS, MIN_DISTINCT = 5, 2 +CELLS = { + "glycan_cold": ["affinose_mo_20260908_mo_A_glycan_s42", "affinose_sa_20260908_moc_A_glycan_s43", + "affinose_sa_20260908_moc_A_glycan_s44"], + "protein_cold": ["affinose_sa_20260908_mo_B_protein_s42", "affinose_mof_20260909_mof_B_protein_s43", + "affinose_mof_20260909_mof_B_protein_s44"], + "doubly_cold": ["affinose_mo_20260908_mo_C_doubly_s42", "affinose_mof_20260909_mof_C_doubly_s43", + "affinose_mof_20260909_mof_C_doubly_s44"], +} +REPORTED = {"glycan_cold": {"btb": 0.3293, "size": 0.2449}, + "protein_cold": {"btb": 0.2409, "size": -0.0147}, + "doubly_cold": {"btb": 0.1785, "size": 0.2242}} + +if os.path.exists(OUT): + raise SystemExit("FATAL: %s exists -- refusing to overwrite" % OUT) +os.makedirs(os.path.dirname(OUT), exist_ok=True) + + +def sha(p): + h = hashlib.sha256() + with open(p, "rb") as fh: + for c in iter(lambda: fh.read(1 << 20), b""): + h.update(c) + return h.hexdigest() + + +def wurcs_nres(w): + m = re.match(r"WURCS=2\.0/(\d+),(\d+),(\d+)/", w) + return int(m.group(2)) if m else np.nan + + +def per_assay_rho(pred, y, assay, keep, exclude_constant): + out = {} + for a in keep: + s = assay == a + p, t = pred[s], y[s] + if len(np.unique(p)) < MIN_DISTINCT: + if exclude_constant: + continue + out[a] = 0.0 + continue + r = spearmanr(p, t)[0] + out[a] = 0.0 if not np.isfinite(r) else float(r) + return out + + +def icc_oneway(values, groups): + """ANOVA ICC(1) of per-assay rho within panels; unbalanced groups via n0.""" + df = pd.DataFrame({"v": values, "g": groups}) + k = df.g.nunique() + N = len(df) + if k < 2 or N <= k: + return None + gm = df.v.mean() + grp = df.groupby("g").v + ni = grp.size().to_numpy(float) + msb = (ni * (grp.mean().to_numpy() - gm) ** 2).sum() / (k - 1) + msw = ((df.v - grp.transform("mean")) ** 2).sum() / (N - k) + n0 = (N - (ni ** 2).sum() / N) / (k - 1) + icc = (msb - msw) / (msb + (n0 - 1) * msw) if (msb + (n0 - 1) * msw) > 0 else None + return None if icc is None else float(icc) + + +gc = pd.read_csv(V2 + "/review_affinose_v2_glycan_components_20260926.tsv.gz", sep="\t") +pc = pd.read_csv(V2 + "/review_affinose_v2_protein_components_20260926.tsv.gz", sep="\t") +g2c = dict(zip(gc.glycan_wurcs, gc.glycan_component_id)) +g2n = dict(zip(gc.glycan_wurcs, gc.n_residues)) +p2c = dict(zip(pc.protein_full_sha256, pc.protein_component_id)) +p2c.update(dict(zip(pc.model_input_sha256, pc.protein_component_id))) + +R = {"schema": "affinose_b4_step1_v1", "predeclaration": "AFFINOSE_UPDATE_TRACKER.md §B4", + "inputs": {"glycan_components_sha256": sha(V2 + "/review_affinose_v2_glycan_components_20260926.tsv.gz"), + "protein_components_sha256": sha(V2 + "/review_affinose_v2_protein_components_20260926.tsv.gz")}, + "regimes": {}} + +for reg, cells in CELLS.items(): + Z = [np.load(os.path.join(PRED, c + ".npz"), allow_pickle=True) for c in cells] + base = Z[0] + for z in Z[1:]: # all three seeds must score the identical rows in the identical order + for k in ("target", "assay", "protein", "glycan"): + if not np.array_equal(z[k], base[k]): + raise SystemExit("FATAL %s: seeds disagree on %s" % (reg, k)) + y = base["target"].astype(float) + assay = base["assay"].astype(str) + prot = base["protein"].astype(str) + gly = base["glycan"].astype(str) + n = len(y) + + gcomp = np.array([g2c.get(g, "UNMAPPED") for g in gly]) + pcomp = np.array([p2c.get(p, "UNMAPPED") for p in prot]) + tmp = pd.DataFrame({"a": assay, "y": y}) + gg = tmp.groupby("a")["y"] + keep = sorted(gg.size()[(gg.size() >= MIN_ROWS) & (gg.nunique() >= MIN_DISTINCT)].index) + + # one protein per assay (asserted -- the design relies on it) + ppa = pd.DataFrame({"a": assay, "p": prot}).groupby("a")["p"].nunique() + multi = int((ppa > 1).sum()) + + # panels over ELIGIBLE assays + pan = pd.DataFrame({"a": assay, "g": gly}).groupby("a")["g"].apply(lambda s: hashlib.sha1( + "\n".join(sorted(set(s))).encode()).hexdigest()[:12]) + pan = pan.loc[keep] + cnt = pan.value_counts() + A = len(keep) + kish = float(A ** 2 / (cnt.to_numpy(float) ** 2).sum()) + top = cnt.index[0] + top_size = int(len(set(gly[assay == pan.index[pan == top][0]]))) + + # per-assay rho: BERToseBind (each seed separately, then assay-wise mean) and size rule + btb_seed = [per_assay_rho(z["intact"].astype(float), y, assay, keep, False) for z in Z] + btb = {a: float(np.mean([s[a] for s in btb_seed])) for a in keep} + nres = np.array([g2n.get(g, np.nan) for g in gly], float) + nres_w = np.array([wurcs_nres(g) for g in gly], float) + size_zero = per_assay_rho(nres, y, assay, keep, False) + size_excl = per_assay_rho(nres, y, assay, keep, True) + + def neff(rho): + vals = np.array([rho[a] for a in keep]) + icc = icc_oneway(vals, pan.loc[keep].to_numpy()) + m_w = float((cnt.to_numpy(float) ** 2).sum() / cnt.sum()) + deff = None if icc is None else 1 + (m_w - 1) * max(icc, 0.0) + return {"icc_within_panel": icc, "cluster_size_weighted_mean": m_w, + "design_effect": deff, "n_eff": None if deff is None else float(A / deff)} + + R["regimes"][reg] = { + "rows": int(n), "assays_total": int(tmp.a.nunique()), "assays_eligible": A, + "glycans": int(len(set(gly))), "proteins": int(len(set(prot))), + "assays_with_more_than_one_protein": multi, + "glycan_components": int(len(set(gcomp))), "protein_components": int(len(set(pcomp))), + "unmapped_rows": {"glycan": int((gcomp == "UNMAPPED").sum()), + "protein": int((pcomp == "UNMAPPED").sum())}, + "largest_glycan_component_row_share": float(pd.Series(gcomp).value_counts(normalize=True).iloc[0]), + "largest_protein_component_row_share": float(pd.Series(pcomp).value_counts(normalize=True).iloc[0]), + "n_residues_ledger_vs_wurcs_header_mismatch_rows": int(np.nansum(nres != nres_w)), + "panels": {"distinct": int(len(cnt)), "largest_panel_assays": int(cnt.iloc[0]), + "largest_panel_share": float(cnt.iloc[0] / A), "largest_panel_glycans": top_size, + "assays_per_panel_top10": [int(x) for x in cnt.iloc[:10]], + "kish_n_eff_max_perfect_dependence": kish}, + "btb": {"macro_from_per_row": float(np.mean(list(btb.values()))), + "reported": REPORTED[reg]["btb"], **{"neff_" + k: v for k, v in neff(btb).items()}}, + "size_rule_residue_count": { + "macro_constant_scored_zero": float(np.mean(list(size_zero.values()))), + "macro_constant_excluded": float(np.mean(list(size_excl.values()))) if size_excl else None, + "assays_excluded_as_constant": int(A - len(size_excl)), + "reported_table_value": REPORTED[reg]["size"], + **{"neff_" + k: v for k, v in neff(size_zero).items()}}, + } + print("\n=== %s ===" % reg) + print(json.dumps(R["regimes"][reg], indent=1, default=str)) + +# ── inventory for step 2 (globs are fine inside a batch job) ────────────────────────────────── +def ls(pat): + return sorted({os.path.basename(p): os.path.getsize(p) for p in glob.glob(pat)}.items()) +R["inventory"] = { + "lectinoracle_checkpoints": ls(B + "/lectinoracle_*.pt"), + "lectinoracle_perrow": ls(B + "/*lectinoracle*perrow*.npz"), + "lectinoracle_receipts": ls(B + "/affinose_lectinoracle_*.json"), + "lectinoracle_producers": ls(B + "/lectinoracle_*.py"), + "baseline_producers": ls(B + "/p3[5-9]*.py") + ls(B + "/p4[0-4]*.py") + ls(B + "/*baseline*.py"), + "baseline_outputs": ls(B + "/*baseline*.json") + ls(B + "/diagnostics/*baseline*.json"), + "gifflar_seed42_receipts": ls(B + "/affinose_gifflar_macro_*ESM.json"), +} +json.dump(R, open(OUT, "w"), indent=1, default=str) +print("\n=== INVENTORY ===") +print(json.dumps(R["inventory"], indent=1)) +print("wrote", OUT) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_step3_bootstrap.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_step3_bootstrap.py new file mode 100644 index 0000000000000000000000000000000000000000..ce65706fc55974c7df7682dac0c631a8876d75ec --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_step3_bootstrap.py @@ -0,0 +1,368 @@ +#!/usr/bin/env python3 +"""#4 step 3 -- paired two-way cluster bootstrap over every method, all three regimes. CPU only. + +Pre-declared in writing/review/AFFINOSE_UPDATE_TRACKER.md §B4 (25 Sep) and its step-3 details +(pinned 26 Sep, before any bootstrap result). In brief: + * units: glycan components and protein components, drawn independently with replacement; a row's + weight = (#draws of its glycan component) x (#draws of its protein component). Each assay holds + one protein, so protein draws copy whole assays and glycan draws weight rows inside an assay. + * statistic: equal-assay macro Spearman under the #4 rule -- data-only eligibility on the FULL + stratum (>=5 expanded rows, >=2 distinct targets), an assay a method cannot score or scores with a + constant prediction counts rho = 0. Seeded methods: mean of the per-seed macros. + * primary interval: test-set only. Secondary: test + seed (seeds redrawn with replacement). + * B = 2,000, RNG seed 20260926. Outputs: point estimates (both rules, gated), delta vs BERToseBind, + rank distributions, pooled Spearman for BERToseBind + primary LectinOracle, Welch seed CIs. +Fails closed: if any producer-rule gate misses its recorded value, NO bootstrap is run. +""" +import collections +import json +import math +import os +import sys + +import numpy as np +import pandas as pd +from scipy import stats + +B = "/work/ratul1/supantha/Bertint" +PR = B + "/b4_perrow" +OUT = B + "/diagnostics/affinose_b4_step3_bootstrap_20260926.json" +NBOOT, RNG_SEED, MIN_ROWS, TOL = 2000, 20260926, 5, 5e-4 +REG = {"glycan_cold": ("A_glycan", "test_glycan_cold"), + "protein_cold": ("B_protein", "test_protein_cold"), + "doubly_cold": ("C_doubly", "test_doubly_cold")} +SEEDS = (42, 43, 44) +BTB_CELLS = {"A_glycan": ["affinose_mo_20260908_mo_A_glycan_s42", "affinose_sa_20260908_moc_A_glycan_s43", + "affinose_sa_20260908_moc_A_glycan_s44"], + "B_protein": ["affinose_sa_20260908_mo_B_protein_s42", "affinose_mof_20260909_mof_B_protein_s43", + "affinose_mof_20260909_mof_B_protein_s44"], + "C_doubly": ["affinose_mo_20260908_mo_C_doubly_s42", "affinose_mof_20260909_mof_C_doubly_s43", + "affinose_mof_20260909_mof_C_doubly_s44"]} +P36 = {"composition ridge": "composition_ridge", "char 3-5-gram ridge": "motif_kmer_ridge", + "nearest-neighbour glycan": "nearest_neighbour_glycan", "protein-family nearest": "protein_family_nearest"} +if os.path.exists(OUT): + sys.exit("FATAL: %s exists -- refusing to overwrite" % OUT) +os.makedirs(os.path.dirname(OUT), exist_ok=True) + +gc = pd.read_csv(B + "/v2_artifacts/review_affinose_v2_glycan_components_20260926.tsv.gz", sep="\t") +pc = pd.read_csv(B + "/v2_artifacts/review_affinose_v2_protein_components_20260926.tsv.gz", sep="\t") +G2C = dict(zip(gc.glycan_wurcs, gc.glycan_component_id)) +P2C = dict(zip(pc.protein_full_sha256, pc.protein_component_id)) +P2C.update(dict(zip(pc.model_input_sha256, pc.protein_component_id))) + + +def producer_macro(pred, y, a): + """Producers' own rule (LectinOracle scripts, p36): assays with <5 rows, constant target OR + constant prediction are EXCLUDED.""" + vals = [] + for g, ii in pd.Series(np.arange(len(a))).groupby(a): + ii = ii.to_numpy() + if len(ii) < MIN_ROWS or len(np.unique(y[ii])) < 2 or len(np.unique(pred[ii])) < 2: + continue + r = stats.spearmanr(pred[ii], y[ii])[0] + if np.isfinite(r): + vals.append(r) + return float(np.mean(vals)) if vals else None + + +# ── load every source into (exp_id, glycan, target, prediction) and gate it ────────────────── +GATES, SRC = [], {} + + +def gate(name, got, want, tol=TOL, note=""): + ok = want is not None and got is not None and abs(got - want) <= tol + GATES.append({"source": name, "recomputed": got, "recorded": want, "pass": bool(ok), "note": note}) + return ok + + +def load_npz(p, pk="prediction", gk="glycan"): + z = np.load(p, allow_pickle=True) + return pd.DataFrame({"exp_id": z["exp_id"].astype(str), "glycan": z[gk].astype(str), + "target": z["target"].astype(float), "pred": z[pk].astype(float)}) + + +for reg, (arm, strat) in REG.items(): + S = SRC[reg] = collections.OrderedDict() + # BERToseBind (#3 intact pass, already proven exact) + S["BERToseBind"] = [] + for c in BTB_CELLS[arm]: + z = np.load(B + "/affinose_attribution_motif_preds/%s.npz" % c, allow_pickle=True) + S["BERToseBind"].append(pd.DataFrame({"exp_id": z["assay"].astype(str), "glycan": z["glycan"].astype(str), + "target": z["target"].astype(float), "pred": z["intact"].astype(float), + "protein": z["protein"].astype(str)})) + full = S["BERToseBind"][0] + # LectinOracle primary + flex: step-2 inference, already gated there; re-gate from receipts + for label, kind, tagf in (("LectinOracle ESM-C (primary)", "matched", "mt%ss%d"), + ("LectinOracle _flex", "flex", "pr%ss%d")): + S[label] = [] + for sd in SEEDS: + tag = tagf % (arm, sd) + rc = json.load(open("%s/lo_%s_%s_%s_receipt.json" % (PR, kind, tag, strat))) + df = load_npz("%s/lo_%s_%s_%s_perrow.npz" % (PR, kind, tag, strat)) + gate("%s %s" % (label, tag), producer_macro(df.pred.to_numpy(), df.target.to_numpy(), + df.exp_id.to_numpy()), rc["receipt_macro"]) + S[label].append(df) + # LectinOracle ESM-1b + matched tuning: producers' own per-row files, gated against their receipts + for label, pre in (("LectinOracle ESM-1b", "affinose_lectinoracle_matched_esm1b"), + ("LectinOracle matched tuning", "affinose_lectinoracle_matched_spearsel")): + S[label] = [] + for sd in SEEDS: + tag = "mt%ss%d" % (arm, sd) + df = load_npz("%s/%s_%s_%s_perrow.npz" % (B, pre, tag, strat)) + want = json.load(open("%s/%s_%s.json" % (B, pre, tag)))["regimes"][strat]["macro_spearman"] + gate("%s %s" % (label, tag), producer_macro(df.pred.to_numpy(), df.target.to_numpy(), + df.exp_id.to_numpy()), want) + S[label].append(df) + # GIFFLAR: step-2 per-row; recorded value = the #4-rule (eligibility-corrected) macro + for var in ("gifflarESM", "sweetnetESM"): + label = "GIFFLAR " + var + S[label] = [] + for sd in SEEDS: + df = load_npz("%s/gifflar_%s_%s_s%d_perrow.npz" % (PR, arm, var, sd)) + new = json.load(open("%s/gifflar_%s_%s_s%d_receipt.json" % (PR, arm, var, sd))) + old = json.load(open(B + ("/affinose_gifflar_macro_%s_%s.json" % (arm, var) if sd == 42 else + "/affinose_gifflar_macro_%s_%s_s%d.json" % (arm, var, sd)))) + gate("%s s%d" % (label, sd), + new["macro_eligibility_corrected"] if new["pooled_reproduces_gifflar"] else None, + old["macro_eligibility_corrected"], tol=1e-5, + note="same checkpoint re-scored; pooled_reproduces_gifflar=%s" % new["pooled_reproduces_gifflar"]) + S[label].append(df) + # p36 baselines + z = np.load("%s/p36_reviewer_baselines_%s_perrow.npz" % (B, arm), allow_pickle=True) + rec36 = json.load(open("%s/p36_reviewer_baselines_%s.json" % (B, arm)))["baselines"] + for label, key in P36.items(): + if label == "protein-family nearest" and reg != "protein_cold": + continue # constant within every assay by construction -> undefined + df = pd.DataFrame({"exp_id": z["exp_id"].astype(str), "glycan": z["glycan_wurcs"].astype(str), + "target": z["target"].astype(float), "pred": z[key].astype(float)}) + gate("%s %s" % (label, arm), producer_macro(df.pred.to_numpy(), df.target.to_numpy(), df.exp_id.to_numpy()), + rec36[key]["macro"]) + S[label] = [df] + # step-2 regenerated baselines (already gated there) + for label, key in (("motif ridge (p44)", "motif_ridge"), ("glycan-size rule (BPE tokens)", "size_ntok")): + S[label] = [load_npz("%s/baseline_%s_%s_perrow.npz" % (PR, key, arm))] + +bad = [g for g in GATES if not g["pass"]] +R = {"schema": "affinose_b4_step3_v1", "nboot": NBOOT, "rng_seed": RNG_SEED, "gates": GATES, + "gates_passed": len(GATES) - len(bad), "gates_total": len(GATES)} +if bad: + R["status"] = "NOT RUN -- %d producer-rule gate(s) failed" % len(bad) + json.dump(R, open(OUT, "w"), indent=1) + print(json.dumps(bad, indent=1)) + sys.exit("GATE FAIL: %d source(s) do not reproduce their recorded value" % len(bad)) +print("all %d gates pass" % len(GATES), flush=True) + + +# ── fast weighted Spearman per assay (Spearman on rows expanded by integer weights) ──────────── +class Prepared: + """One prediction vector on one method's rows, pre-sorted once so every replicate is O(rows).""" + + def __init__(self, a_idx, gcomp_idx, pred, y): + self.a, self.g = a_idx, gcomp_idx + self.p_order, self.p_grp = self._ties(a_idx, pred) + self.y_order, self.y_grp = self._ties(a_idx, y) + + @staticmethod + def _ties(a, v): + o = np.lexsort((v, a)) # sort by assay, then value + av, vv = a[o], v[o] + new = np.ones(len(o), bool) + new[1:] = (av[1:] != av[:-1]) | (vv[1:] != vv[:-1]) + return o, np.cumsum(new) - 1 # tie-group id in sorted order + + @staticmethod + def _wranks(order, grp, a, w): + ws = w[order] + gw = np.bincount(grp, weights=ws) # weight of each tie group + ga = a[order][np.r_[0, np.flatnonzero(np.diff(grp)) + 1]] # assay of each group + csum = np.cumsum(gw) + # weight of all groups before this one WITHIN the same assay + start = np.r_[0, np.flatnonzero(np.diff(ga)) + 1] + base = np.repeat(np.r_[0.0, csum][start], np.diff(np.r_[start, len(gw)])) + before = csum - gw - base + r_group = before + (gw + 1.0) / 2.0 + r = np.empty(len(order)) + r[order] = r_group[grp] + return r + + def rho(self, w, n_assay): + rp = self._wranks(self.p_order, self.p_grp, self.a, w) + ry = self._wranks(self.y_order, self.y_grp, self.a, w) + sw = np.bincount(self.a, weights=w, minlength=n_assay) + sx = np.bincount(self.a, weights=w * rp, minlength=n_assay) + sy = np.bincount(self.a, weights=w * ry, minlength=n_assay) + sxx = np.bincount(self.a, weights=w * rp * rp, minlength=n_assay) + syy = np.bincount(self.a, weights=w * ry * ry, minlength=n_assay) + sxy = np.bincount(self.a, weights=w * rp * ry, minlength=n_assay) + with np.errstate(invalid="ignore", divide="ignore"): + cov = sxy - sx * sy / sw + vx, vy = sxx - sx * sx / sw, syy - sy * sy / sw + r = cov / np.sqrt(vx * vy) + # #4 rule, same as the eligibility correction: fewer than 5 of this method's own rows, + # a constant target or a constant prediction -> rho = 0 (never excused) + r[~np.isfinite(r) | (vx <= 1e-12) | (vy <= 1e-12) | (sw < MIN_ROWS)] = 0.0 + return r + + +def build(reg): + full = SRC[reg]["BERToseBind"][0] + assays = sorted(full.exp_id.unique()) + aix = {a: i for i, a in enumerate(assays)} + a2p = full.groupby("exp_id").protein.first() + if (full.groupby("exp_id").protein.nunique() > 1).any(): + sys.exit("FATAL: an assay holds more than one protein") + allg = set(full.glycan) + for dfs in SRC[reg].values(): + for df in dfs: + allg |= set(df.glycan) + missing = [g for g in allg if g not in G2C] + if missing: + sys.exit("FATAL: %d glycans have no component id" % len(missing)) + gcs = sorted({G2C[g] for g in allg}) + gix = {c: i for i, c in enumerate(gcs)} + pcs = sorted({P2C[p] for p in a2p.values}) + pix = {c: i for i, c in enumerate(pcs)} + assay_pc = np.array([pix[P2C[a2p[a]]] for a in assays]) + # data-only eligibility is evaluated per replicate on the FULL stratum rows + fa = full.exp_id.map(aix).to_numpy() + fg = np.array([gix[G2C[g]] for g in full.glycan]) + fy = full.target.to_numpy() + M = {} + for label, dfs in SRC[reg].items(): + M[label] = [] + for df in dfs: + if not set(df.exp_id).issubset(aix): + sys.exit("FATAL: %s has assays outside the stratum" % label) + M[label].append(Prepared(df.exp_id.map(aix).to_numpy(), + np.array([gix[G2C[g]] for g in df.glycan]), + df.pred.to_numpy(float), df.target.to_numpy(float))) + # pooled Spearman (E4): one global ranking over a method's rows, rows weighted by + # (protein-component draws of their assay) x (glycan-component draws) + POOL = {} + for label in ("BERToseBind", "LectinOracle ESM-C (primary)"): + POOL[label] = [] + for df in SRC[reg][label]: + ai = df.exp_id.map(aix).to_numpy() + gi = np.array([gix[G2C[g]] for g in df.glycan]) + POOL[label].append((Prepared(np.zeros(len(df), dtype=int), gi, df.pred.to_numpy(float), + df.target.to_numpy(float)), ai, gi)) + return {"n_assay": len(assays), "n_gc": len(gcs), "n_pc": len(pcs), "assay_pc": assay_pc, + "fa": fa, "fg": fg, "fy": fy, "M": M, "POOL": POOL} + + +def pooled(D, wg, wa): + out = {} + for label, items in D["POOL"].items(): + vals = [] + for prep, ai, gi in items: + w = wa[ai] * wg[gi] + vals.append(float(prep.rho(w, 1)[0])) + out[label] = float(np.mean(vals)) + return out + + +def eligible(D, wg, wa): + """Data-only eligibility of each assay under this replicate: >=5 expanded rows, >=2 targets.""" + w = wg[D["fg"]] + nrow = np.bincount(D["fa"], weights=w, minlength=D["n_assay"]) + # distinct targets among rows with w > 0: min != max + y = D["fy"] + big = np.full(D["n_assay"], -np.inf); small = np.full(D["n_assay"], np.inf) + m = w > 0 + np.maximum.at(big, D["fa"][m], y[m]); np.minimum.at(small, D["fa"][m], y[m]) + return (nrow >= MIN_ROWS) & (big > small) & (wa > 0) + + +def scores(D, wg, wa, seed_pick=None): + el = eligible(D, wg, wa) + cw = wa * el + out = {} + for label, preps in D["M"].items(): + idxs = range(len(preps)) if seed_pick is None else seed_pick[label] + vals = [] + for k in idxs: + p = preps[k] + r = p.rho(wg[p.g], D["n_assay"]) + vals.append(float((cw * r).sum() / cw.sum())) + out[label] = float(np.mean(vals)) + return out + + +rng = np.random.default_rng(RNG_SEED) +R["regimes"] = {} +for reg in REG: + D = build(reg) + ones_g, ones_a = np.ones(D["n_gc"]), np.ones(D["n_assay"]) + point = scores(D, ones_g, ones_a) + per_seed = {lab: [float((eligible(D, ones_g, ones_a) * p.rho(ones_g[p.g], D["n_assay"])).sum() + / eligible(D, ones_g, ones_a).sum()) for p in preps] + for lab, preps in D["M"].items()} + labels = list(D["M"]) + reps_t, reps_ts, reps_pool = [], [], [] + point_pool = pooled(D, ones_g, ones_a) + for b in range(NBOOT): + wg = np.bincount(rng.integers(0, D["n_gc"], D["n_gc"]), minlength=D["n_gc"]).astype(float) + wp = np.bincount(rng.integers(0, D["n_pc"], D["n_pc"]), minlength=D["n_pc"]).astype(float) + wa = wp[D["assay_pc"]] + reps_t.append(scores(D, wg, wa)) + reps_pool.append(pooled(D, wg, wa)) + pick = {lab: (rng.integers(0, len(p), len(p)) if len(p) > 1 else [0]) for lab, p in D["M"].items()} + reps_ts.append(scores(D, wg, wa, pick)) + if (b + 1) % 250 == 0: + print(" %s: %d/%d replicates" % (reg, b + 1, NBOOT), flush=True) + + def summarise(reps): + T = pd.DataFrame(reps)[labels] + ranks = T.rank(axis=1, ascending=False, method="min") + out = {} + for lab in labels: + d = T["BERToseBind"] - T[lab] + out[lab] = {"score_ci95": [float(T[lab].quantile(.025)), float(T[lab].quantile(.975))], + "rank_median": float(ranks[lab].median()), + "rank_ci95": [float(ranks[lab].quantile(.025)), float(ranks[lab].quantile(.975))], + "p_rank1": float((ranks[lab] == 1).mean())} + if lab != "BERToseBind": + out[lab].update({"delta_btb_minus": float(point["BERToseBind"] - point[lab]), + "delta_ci95": [float(d.quantile(.025)), float(d.quantile(.975))], + "p_btb_better": float((d > 0).mean())}) + return out + + # Welch seed CIs from the per-seed macros (regenerates the main table's CIs on Nova) + welch = {} + b = per_seed["BERToseBind"] + for lab, v in per_seed.items(): + if lab == "BERToseBind" or len(v) < 2: + continue + m1, m2 = np.mean(b), np.mean(v) + s1, s2 = np.std(b, ddof=1), np.std(v, ddof=1) + v1, v2 = s1 * s1 / len(b), s2 * s2 / len(v) + se = math.sqrt(v1 + v2) + df_ = (v1 + v2) ** 2 / (v1 * v1 / (len(b) - 1) + v2 * v2 / (len(v) - 1)) + tc = stats.t.ppf(.975, df_) + welch[lab] = {"delta": m1 - m2, "ci95": [m1 - m2 - tc * se, m1 - m2 + tc * se], + "p": float(2 * (1 - stats.t.cdf(abs((m1 - m2) / se), df_)))} + + R["regimes"][reg] = {"units": {"glycan_components": D["n_gc"], "protein_components": D["n_pc"], + "assays": D["n_assay"]}, + "point_#4_rule": point, "per_seed_#4_rule": per_seed, + "primary_test_only": summarise(reps_t), + "secondary_test_plus_seed": summarise(reps_ts), + "welch_seed_only": welch, + "pooled_E4": {"point": point_pool, + "ci95": {k: [float(pd.Series([r[k] for r in reps_pool]).quantile(.025)), + float(pd.Series([r[k] for r in reps_pool]).quantile(.975))] + for k in point_pool}, + "delta_btb_minus_lo": point_pool["BERToseBind"] - point_pool["LectinOracle ESM-C (primary)"], + "delta_ci95": [float(pd.Series([r["BERToseBind"] - r["LectinOracle ESM-C (primary)"] for r in reps_pool]).quantile(q)) for q in (.025, .975)], + "p_btb_better": float(np.mean([r["BERToseBind"] > r["LectinOracle ESM-C (primary)"] for r in reps_pool]))}} + print("\n=== %s ===" % reg, flush=True) + for lab in labels: + pr = R["regimes"][reg]["primary_test_only"][lab] + print(" %-32s %.4f rank %4.1f [%g,%g]%s" % ( + lab, point[lab], pr["rank_median"], pr["rank_ci95"][0], pr["rank_ci95"][1], + "" if lab == "BERToseBind" else " delta %+.4f [%+.4f, %+.4f] P(btb better)=%.3f" % ( + pr["delta_btb_minus"], pr["delta_ci95"][0], pr["delta_ci95"][1], pr["p_btb_better"])), flush=True) + +R["status"] = "COMPLETE" +json.dump(R, open(OUT, "w"), indent=1) +print("wrote", OUT) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_step3_bootstrap_r2.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_step3_bootstrap_r2.py new file mode 100644 index 0000000000000000000000000000000000000000..77ae2ce8ae1c6ae0f448acfe6fbd61bee85d00a6 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/b4_step3_bootstrap_r2.py @@ -0,0 +1,373 @@ +#!/usr/bin/env python3 +"""#4 step 3 -- paired two-way cluster bootstrap over every method, all three regimes. CPU only. + +Pre-declared in writing/review/AFFINOSE_UPDATE_TRACKER.md §B4 (25 Sep) and its step-3 details +(pinned 26 Sep, before any bootstrap result). In brief: + * units: glycan components and protein components, drawn independently with replacement; a row's + weight = (#draws of its glycan component) x (#draws of its protein component). Each assay holds + one protein, so protein draws copy whole assays and glycan draws weight rows inside an assay. + * statistic: equal-assay macro Spearman under the #4 rule -- data-only eligibility on the FULL + stratum (>=5 expanded rows, >=2 distinct targets), an assay a method cannot score or scores with a + constant prediction counts rho = 0. Seeded methods: mean of the per-seed macros. + * primary interval: test-set only. Secondary: test + seed (seeds redrawn with replacement). + * B = 2,000, RNG seed 20260926. Outputs: point estimates (both rules, gated), delta vs BERToseBind, + rank distributions, pooled Spearman for BERToseBind + primary LectinOracle, Welch seed CIs. +Fails closed: if any producer-rule gate misses its recorded value, NO bootstrap is run. +""" +import collections +import json +import math +import os +import sys + +import numpy as np +import pandas as pd +from scipy import stats + +B = "/work/ratul1/supantha/Bertint" +PR = B + "/b4_perrow" +# r2: the first run (…_20260926.json) stopped at its own gate and is KEPT as provenance. +OUT = B + "/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json" +NBOOT, RNG_SEED, MIN_ROWS, TOL = 2000, 20260926, 5, 5e-4 +REG = {"glycan_cold": ("A_glycan", "test_glycan_cold"), + "protein_cold": ("B_protein", "test_protein_cold"), + "doubly_cold": ("C_doubly", "test_doubly_cold")} +SEEDS = (42, 43, 44) +BTB_CELLS = {"A_glycan": ["affinose_mo_20260908_mo_A_glycan_s42", "affinose_sa_20260908_moc_A_glycan_s43", + "affinose_sa_20260908_moc_A_glycan_s44"], + "B_protein": ["affinose_sa_20260908_mo_B_protein_s42", "affinose_mof_20260909_mof_B_protein_s43", + "affinose_mof_20260909_mof_B_protein_s44"], + "C_doubly": ["affinose_mo_20260908_mo_C_doubly_s42", "affinose_mof_20260909_mof_C_doubly_s43", + "affinose_mof_20260909_mof_C_doubly_s44"]} +P36 = {"composition ridge": "composition_ridge", "char 3-5-gram ridge": "motif_kmer_ridge", + "nearest-neighbour glycan": "nearest_neighbour_glycan", "protein-family nearest": "protein_family_nearest"} +if os.path.exists(OUT): + sys.exit("FATAL: %s exists -- refusing to overwrite" % OUT) +os.makedirs(os.path.dirname(OUT), exist_ok=True) + +gc = pd.read_csv(B + "/v2_artifacts/review_affinose_v2_glycan_components_20260926.tsv.gz", sep="\t") +pc = pd.read_csv(B + "/v2_artifacts/review_affinose_v2_protein_components_20260926.tsv.gz", sep="\t") +G2C = dict(zip(gc.glycan_wurcs, gc.glycan_component_id)) +P2C = dict(zip(pc.protein_full_sha256, pc.protein_component_id)) +P2C.update(dict(zip(pc.model_input_sha256, pc.protein_component_id))) + + +def producer_macro(pred, y, a): + """Producers' own rule (LectinOracle scripts, p36): assays with <5 rows, constant target OR + constant prediction are EXCLUDED.""" + vals = [] + for g, ii in pd.Series(np.arange(len(a))).groupby(a): + ii = ii.to_numpy() + if len(ii) < MIN_ROWS or len(np.unique(y[ii])) < 2 or len(np.unique(pred[ii])) < 2: + continue + r = stats.spearmanr(pred[ii], y[ii])[0] + if np.isfinite(r): + vals.append(r) + return float(np.mean(vals)) if vals else None + + +# r2 (27 Sep): GIFFLAR's gate moved from 1e-5 to the project-wide +-0.0005 under the rule written BEFORE +# diagnostic job 16604967: re-scoring an identical checkpoint on one GPU gives non-bit-identical +# predictions (max per-row diff 1e-7..2e-6) and a macro spread of 3e-5..6e-5 per run +# (diagnostics/affinose_b4_gif_repeat_20260927.json). Every gate's deviation is still reported. +# ── load every source into (exp_id, glycan, target, prediction) and gate it ────────────────── +GATES, SRC = [], {} + + +def gate(name, got, want, tol=TOL, note=""): + ok = want is not None and got is not None and abs(got - want) <= tol + GATES.append({"source": name, "recomputed": got, "recorded": want, "pass": bool(ok), "note": note}) + return ok + + +def load_npz(p, pk="prediction", gk="glycan"): + z = np.load(p, allow_pickle=True) + return pd.DataFrame({"exp_id": z["exp_id"].astype(str), "glycan": z[gk].astype(str), + "target": z["target"].astype(float), "pred": z[pk].astype(float)}) + + +for reg, (arm, strat) in REG.items(): + S = SRC[reg] = collections.OrderedDict() + # BERToseBind (#3 intact pass, already proven exact) + S["BERToseBind"] = [] + for c in BTB_CELLS[arm]: + z = np.load(B + "/affinose_attribution_motif_preds/%s.npz" % c, allow_pickle=True) + S["BERToseBind"].append(pd.DataFrame({"exp_id": z["assay"].astype(str), "glycan": z["glycan"].astype(str), + "target": z["target"].astype(float), "pred": z["intact"].astype(float), + "protein": z["protein"].astype(str)})) + full = S["BERToseBind"][0] + # LectinOracle primary + flex: step-2 inference, already gated there; re-gate from receipts + for label, kind, tagf in (("LectinOracle ESM-C (primary)", "matched", "mt%ss%d"), + ("LectinOracle _flex", "flex", "pr%ss%d")): + S[label] = [] + for sd in SEEDS: + tag = tagf % (arm, sd) + rc = json.load(open("%s/lo_%s_%s_%s_receipt.json" % (PR, kind, tag, strat))) + df = load_npz("%s/lo_%s_%s_%s_perrow.npz" % (PR, kind, tag, strat)) + gate("%s %s" % (label, tag), producer_macro(df.pred.to_numpy(), df.target.to_numpy(), + df.exp_id.to_numpy()), rc["receipt_macro"]) + S[label].append(df) + # LectinOracle ESM-1b + matched tuning: producers' own per-row files, gated against their receipts + for label, pre in (("LectinOracle ESM-1b", "affinose_lectinoracle_matched_esm1b"), + ("LectinOracle matched tuning", "affinose_lectinoracle_matched_spearsel")): + S[label] = [] + for sd in SEEDS: + tag = "mt%ss%d" % (arm, sd) + df = load_npz("%s/%s_%s_%s_perrow.npz" % (B, pre, tag, strat)) + want = json.load(open("%s/%s_%s.json" % (B, pre, tag)))["regimes"][strat]["macro_spearman"] + gate("%s %s" % (label, tag), producer_macro(df.pred.to_numpy(), df.target.to_numpy(), + df.exp_id.to_numpy()), want) + S[label].append(df) + # GIFFLAR: step-2 per-row; recorded value = the #4-rule (eligibility-corrected) macro + for var in ("gifflarESM", "sweetnetESM"): + label = "GIFFLAR " + var + S[label] = [] + for sd in SEEDS: + df = load_npz("%s/gifflar_%s_%s_s%d_perrow.npz" % (PR, arm, var, sd)) + new = json.load(open("%s/gifflar_%s_%s_s%d_receipt.json" % (PR, arm, var, sd))) + old = json.load(open(B + ("/affinose_gifflar_macro_%s_%s.json" % (arm, var) if sd == 42 else + "/affinose_gifflar_macro_%s_%s_s%d.json" % (arm, var, sd)))) + gate("%s %s s%d" % (label, arm, sd), + new["macro_eligibility_corrected"] if new["pooled_reproduces_gifflar"] else None, + old["macro_eligibility_corrected"], tol=TOL, # r2: was 1e-5; see the r2 note above + note="same checkpoint re-scored; pooled_reproduces_gifflar=%s" % new["pooled_reproduces_gifflar"]) + S[label].append(df) + # p36 baselines + z = np.load("%s/p36_reviewer_baselines_%s_perrow.npz" % (B, arm), allow_pickle=True) + rec36 = json.load(open("%s/p36_reviewer_baselines_%s.json" % (B, arm)))["baselines"] + for label, key in P36.items(): + if label == "protein-family nearest" and reg != "protein_cold": + continue # constant within every assay by construction -> undefined + df = pd.DataFrame({"exp_id": z["exp_id"].astype(str), "glycan": z["glycan_wurcs"].astype(str), + "target": z["target"].astype(float), "pred": z[key].astype(float)}) + gate("%s %s" % (label, arm), producer_macro(df.pred.to_numpy(), df.target.to_numpy(), df.exp_id.to_numpy()), + rec36[key]["macro"]) + S[label] = [df] + # step-2 regenerated baselines (already gated there) + for label, key in (("motif ridge (p44)", "motif_ridge"), ("glycan-size rule (BPE tokens)", "size_ntok")): + S[label] = [load_npz("%s/baseline_%s_%s_perrow.npz" % (PR, key, arm))] + +bad = [g for g in GATES if not g["pass"]] +R = {"schema": "affinose_b4_step3_v1", "nboot": NBOOT, "rng_seed": RNG_SEED, "gates": GATES, + "gates_passed": len(GATES) - len(bad), "gates_total": len(GATES)} +if bad: + R["status"] = "NOT RUN -- %d producer-rule gate(s) failed" % len(bad) + json.dump(R, open(OUT, "w"), indent=1) + print(json.dumps(bad, indent=1)) + sys.exit("GATE FAIL: %d source(s) do not reproduce their recorded value" % len(bad)) +print("all %d gates pass" % len(GATES), flush=True) + + +# ── fast weighted Spearman per assay (Spearman on rows expanded by integer weights) ──────────── +class Prepared: + """One prediction vector on one method's rows, pre-sorted once so every replicate is O(rows).""" + + def __init__(self, a_idx, gcomp_idx, pred, y): + self.a, self.g = a_idx, gcomp_idx + self.p_order, self.p_grp = self._ties(a_idx, pred) + self.y_order, self.y_grp = self._ties(a_idx, y) + + @staticmethod + def _ties(a, v): + o = np.lexsort((v, a)) # sort by assay, then value + av, vv = a[o], v[o] + new = np.ones(len(o), bool) + new[1:] = (av[1:] != av[:-1]) | (vv[1:] != vv[:-1]) + return o, np.cumsum(new) - 1 # tie-group id in sorted order + + @staticmethod + def _wranks(order, grp, a, w): + ws = w[order] + gw = np.bincount(grp, weights=ws) # weight of each tie group + ga = a[order][np.r_[0, np.flatnonzero(np.diff(grp)) + 1]] # assay of each group + csum = np.cumsum(gw) + # weight of all groups before this one WITHIN the same assay + start = np.r_[0, np.flatnonzero(np.diff(ga)) + 1] + base = np.repeat(np.r_[0.0, csum][start], np.diff(np.r_[start, len(gw)])) + before = csum - gw - base + r_group = before + (gw + 1.0) / 2.0 + r = np.empty(len(order)) + r[order] = r_group[grp] + return r + + def rho(self, w, n_assay): + rp = self._wranks(self.p_order, self.p_grp, self.a, w) + ry = self._wranks(self.y_order, self.y_grp, self.a, w) + sw = np.bincount(self.a, weights=w, minlength=n_assay) + sx = np.bincount(self.a, weights=w * rp, minlength=n_assay) + sy = np.bincount(self.a, weights=w * ry, minlength=n_assay) + sxx = np.bincount(self.a, weights=w * rp * rp, minlength=n_assay) + syy = np.bincount(self.a, weights=w * ry * ry, minlength=n_assay) + sxy = np.bincount(self.a, weights=w * rp * ry, minlength=n_assay) + with np.errstate(invalid="ignore", divide="ignore"): + cov = sxy - sx * sy / sw + vx, vy = sxx - sx * sx / sw, syy - sy * sy / sw + r = cov / np.sqrt(vx * vy) + # #4 rule, same as the eligibility correction: fewer than 5 of this method's own rows, + # a constant target or a constant prediction -> rho = 0 (never excused) + r[~np.isfinite(r) | (vx <= 1e-12) | (vy <= 1e-12) | (sw < MIN_ROWS)] = 0.0 + return r + + +def build(reg): + full = SRC[reg]["BERToseBind"][0] + assays = sorted(full.exp_id.unique()) + aix = {a: i for i, a in enumerate(assays)} + a2p = full.groupby("exp_id").protein.first() + if (full.groupby("exp_id").protein.nunique() > 1).any(): + sys.exit("FATAL: an assay holds more than one protein") + allg = set(full.glycan) + for dfs in SRC[reg].values(): + for df in dfs: + allg |= set(df.glycan) + missing = [g for g in allg if g not in G2C] + if missing: + sys.exit("FATAL: %d glycans have no component id" % len(missing)) + gcs = sorted({G2C[g] for g in allg}) + gix = {c: i for i, c in enumerate(gcs)} + pcs = sorted({P2C[p] for p in a2p.values}) + pix = {c: i for i, c in enumerate(pcs)} + assay_pc = np.array([pix[P2C[a2p[a]]] for a in assays]) + # data-only eligibility is evaluated per replicate on the FULL stratum rows + fa = full.exp_id.map(aix).to_numpy() + fg = np.array([gix[G2C[g]] for g in full.glycan]) + fy = full.target.to_numpy() + M = {} + for label, dfs in SRC[reg].items(): + M[label] = [] + for df in dfs: + if not set(df.exp_id).issubset(aix): + sys.exit("FATAL: %s has assays outside the stratum" % label) + M[label].append(Prepared(df.exp_id.map(aix).to_numpy(), + np.array([gix[G2C[g]] for g in df.glycan]), + df.pred.to_numpy(float), df.target.to_numpy(float))) + # pooled Spearman (E4): one global ranking over a method's rows, rows weighted by + # (protein-component draws of their assay) x (glycan-component draws) + POOL = {} + for label in ("BERToseBind", "LectinOracle ESM-C (primary)"): + POOL[label] = [] + for df in SRC[reg][label]: + ai = df.exp_id.map(aix).to_numpy() + gi = np.array([gix[G2C[g]] for g in df.glycan]) + POOL[label].append((Prepared(np.zeros(len(df), dtype=int), gi, df.pred.to_numpy(float), + df.target.to_numpy(float)), ai, gi)) + return {"n_assay": len(assays), "n_gc": len(gcs), "n_pc": len(pcs), "assay_pc": assay_pc, + "fa": fa, "fg": fg, "fy": fy, "M": M, "POOL": POOL} + + +def pooled(D, wg, wa): + out = {} + for label, items in D["POOL"].items(): + vals = [] + for prep, ai, gi in items: + w = wa[ai] * wg[gi] + vals.append(float(prep.rho(w, 1)[0])) + out[label] = float(np.mean(vals)) + return out + + +def eligible(D, wg, wa): + """Data-only eligibility of each assay under this replicate: >=5 expanded rows, >=2 targets.""" + w = wg[D["fg"]] + nrow = np.bincount(D["fa"], weights=w, minlength=D["n_assay"]) + # distinct targets among rows with w > 0: min != max + y = D["fy"] + big = np.full(D["n_assay"], -np.inf); small = np.full(D["n_assay"], np.inf) + m = w > 0 + np.maximum.at(big, D["fa"][m], y[m]); np.minimum.at(small, D["fa"][m], y[m]) + return (nrow >= MIN_ROWS) & (big > small) & (wa > 0) + + +def scores(D, wg, wa, seed_pick=None): + el = eligible(D, wg, wa) + cw = wa * el + out = {} + for label, preps in D["M"].items(): + idxs = range(len(preps)) if seed_pick is None else seed_pick[label] + vals = [] + for k in idxs: + p = preps[k] + r = p.rho(wg[p.g], D["n_assay"]) + vals.append(float((cw * r).sum() / cw.sum())) + out[label] = float(np.mean(vals)) + return out + + +rng = np.random.default_rng(RNG_SEED) +R["regimes"] = {} +for reg in REG: + D = build(reg) + ones_g, ones_a = np.ones(D["n_gc"]), np.ones(D["n_assay"]) + point = scores(D, ones_g, ones_a) + per_seed = {lab: [float((eligible(D, ones_g, ones_a) * p.rho(ones_g[p.g], D["n_assay"])).sum() + / eligible(D, ones_g, ones_a).sum()) for p in preps] + for lab, preps in D["M"].items()} + labels = list(D["M"]) + reps_t, reps_ts, reps_pool = [], [], [] + point_pool = pooled(D, ones_g, ones_a) + for b in range(NBOOT): + wg = np.bincount(rng.integers(0, D["n_gc"], D["n_gc"]), minlength=D["n_gc"]).astype(float) + wp = np.bincount(rng.integers(0, D["n_pc"], D["n_pc"]), minlength=D["n_pc"]).astype(float) + wa = wp[D["assay_pc"]] + reps_t.append(scores(D, wg, wa)) + reps_pool.append(pooled(D, wg, wa)) + pick = {lab: (rng.integers(0, len(p), len(p)) if len(p) > 1 else [0]) for lab, p in D["M"].items()} + reps_ts.append(scores(D, wg, wa, pick)) + if (b + 1) % 250 == 0: + print(" %s: %d/%d replicates" % (reg, b + 1, NBOOT), flush=True) + + def summarise(reps): + T = pd.DataFrame(reps)[labels] + ranks = T.rank(axis=1, ascending=False, method="min") + out = {} + for lab in labels: + d = T["BERToseBind"] - T[lab] + out[lab] = {"score_ci95": [float(T[lab].quantile(.025)), float(T[lab].quantile(.975))], + "rank_median": float(ranks[lab].median()), + "rank_ci95": [float(ranks[lab].quantile(.025)), float(ranks[lab].quantile(.975))], + "p_rank1": float((ranks[lab] == 1).mean())} + if lab != "BERToseBind": + out[lab].update({"delta_btb_minus": float(point["BERToseBind"] - point[lab]), + "delta_ci95": [float(d.quantile(.025)), float(d.quantile(.975))], + "p_btb_better": float((d > 0).mean())}) + return out + + # Welch seed CIs from the per-seed macros (regenerates the main table's CIs on Nova) + welch = {} + b = per_seed["BERToseBind"] + for lab, v in per_seed.items(): + if lab == "BERToseBind" or len(v) < 2: + continue + m1, m2 = np.mean(b), np.mean(v) + s1, s2 = np.std(b, ddof=1), np.std(v, ddof=1) + v1, v2 = s1 * s1 / len(b), s2 * s2 / len(v) + se = math.sqrt(v1 + v2) + df_ = (v1 + v2) ** 2 / (v1 * v1 / (len(b) - 1) + v2 * v2 / (len(v) - 1)) + tc = stats.t.ppf(.975, df_) + welch[lab] = {"delta": m1 - m2, "ci95": [m1 - m2 - tc * se, m1 - m2 + tc * se], + "p": float(2 * (1 - stats.t.cdf(abs((m1 - m2) / se), df_)))} + + R["regimes"][reg] = {"units": {"glycan_components": D["n_gc"], "protein_components": D["n_pc"], + "assays": D["n_assay"]}, + "point_#4_rule": point, "per_seed_#4_rule": per_seed, + "primary_test_only": summarise(reps_t), + "secondary_test_plus_seed": summarise(reps_ts), + "welch_seed_only": welch, + "pooled_E4": {"point": point_pool, + "ci95": {k: [float(pd.Series([r[k] for r in reps_pool]).quantile(.025)), + float(pd.Series([r[k] for r in reps_pool]).quantile(.975))] + for k in point_pool}, + "delta_btb_minus_lo": point_pool["BERToseBind"] - point_pool["LectinOracle ESM-C (primary)"], + "delta_ci95": [float(pd.Series([r["BERToseBind"] - r["LectinOracle ESM-C (primary)"] for r in reps_pool]).quantile(q)) for q in (.025, .975)], + "p_btb_better": float(np.mean([r["BERToseBind"] > r["LectinOracle ESM-C (primary)"] for r in reps_pool]))}} + print("\n=== %s ===" % reg, flush=True) + for lab in labels: + pr = R["regimes"][reg]["primary_test_only"][lab] + print(" %-32s %.4f rank %4.1f [%g,%g]%s" % ( + lab, point[lab], pr["rank_median"], pr["rank_ci95"][0], pr["rank_ci95"][1], + "" if lab == "BERToseBind" else " delta %+.4f [%+.4f, %+.4f] P(btb better)=%.3f" % ( + pr["delta_btb_minus"], pr["delta_ci95"][0], pr["delta_ci95"][1], pr["p_btb_better"])), flush=True) + +R["status"] = "COMPLETE" +json.dump(R, open(OUT, "w"), indent=1) +print("wrote", OUT) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_gif_repeat_20260927.json b/releases/2026-10-02/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_gif_repeat_20260927.json new file mode 100644 index 0000000000000000000000000000000000000000..d3907b9424ade893bebedac652a6f13eecf87891 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_gif_repeat_20260927.json @@ -0,0 +1,35 @@ +{ + "B_protein_gifflarESM_s42": { + "row_keys_identical": true, + "predictions_bit_identical": false, + "max_abs_prediction_diff": 1.7881393432617188e-07, + "macros_step2_r1_r2": [ + 0.210711, + 0.21068, + 0.210736 + ], + "macro_spread": 5.6000000000000494e-05 + }, + "B_protein_gifflarESM_s44": { + "row_keys_identical": true, + "predictions_bit_identical": false, + "max_abs_prediction_diff": 1.1920928955078125e-07, + "macros_step2_r1_r2": [ + 0.207363, + 0.207415, + 0.20736 + ], + "macro_spread": 5.4999999999999494e-05 + }, + "B_protein_sweetnetESM_s44": { + "row_keys_identical": true, + "predictions_bit_identical": false, + "max_abs_prediction_diff": 1.8477439880371094e-06, + "macros_step2_r1_r2": [ + 0.17515, + 0.175183, + 0.17517 + ], + "macro_spread": 3.300000000000525e-05 + } +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step1_structure_20260926.json b/releases/2026-10-02/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step1_structure_20260926.json new file mode 100644 index 0000000000000000000000000000000000000000..9dbbd705180ffe846b99708126f35ecd5f58708a --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step1_structure_20260926.json @@ -0,0 +1,768 @@ +{ + "schema": "affinose_b4_step1_v1", + "predeclaration": "AFFINOSE_UPDATE_TRACKER.md \u00a7B4", + "inputs": { + "glycan_components_sha256": "2e7873e1ca45161e8dd8bada6a89e2634039870cf697eb21b7db34d1ee50610c", + "protein_components_sha256": "5426612f662e5cde66b4cdb4b5244a742d3a124bc5e18c6cf14caad6185d76b8" + }, + "regimes": { + "glycan_cold": { + "rows": 37295, + "assays_total": 1767, + "assays_eligible": 1767, + "glycans": 336, + "proteins": 1088, + "assays_with_more_than_one_protein": 0, + "glycan_components": 336, + "protein_components": 364, + "unmapped_rows": { + "glycan": 0, + "protein": 0 + }, + "largest_glycan_component_row_share": 0.027832149081646333, + "largest_protein_component_row_share": 0.15275506100013406, + "n_residues_ledger_vs_wurcs_header_mismatch_rows": 0, + "panels": { + "distinct": 149, + "largest_panel_assays": 429, + "largest_panel_share": 0.2427843803056027, + "largest_panel_glycans": 26, + "assays_per_panel_top10": [ + 429, + 355, + 98, + 70, + 68, + 56, + 52, + 48, + 43, + 42 + ], + "kish_n_eff_max_perfect_dependence": 8.910362403006754 + }, + "btb": { + "macro_from_per_row": 0.3293033324285421, + "reported": 0.3293, + "neff_icc_within_panel": 0.24420923455817234, + "neff_cluster_size_weighted_mean": 198.30843237125072, + "neff_design_effect": 49.18454124125605, + "neff_n_eff": 35.925922157790474 + }, + "size_rule_residue_count": { + "macro_constant_scored_zero": 0.24298455194066626, + "macro_constant_excluded": 0.24298455194066626, + "assays_excluded_as_constant": 0, + "reported_table_value": 0.2449, + "neff_icc_within_panel": 0.3109016198900054, + "neff_cluster_size_weighted_mean": 198.30843237125072, + "neff_design_effect": 62.34351124217943, + "neff_n_eff": 28.342965687895195 + } + }, + "protein_cold": { + "rows": 38539, + "assays_total": 246, + "assays_eligible": 246, + "glycans": 826, + "proteins": 235, + "assays_with_more_than_one_protein": 0, + "glycan_components": 825, + "protein_components": 216, + "unmapped_rows": { + "glycan": 0, + "protein": 0 + }, + "largest_glycan_component_row_share": 0.005734450816056462, + "largest_protein_component_row_share": 0.008951970730947872, + "n_residues_ledger_vs_wurcs_header_mismatch_rows": 0, + "panels": { + "distinct": 77, + "largest_panel_assays": 52, + "largest_panel_share": 0.21138211382113822, + "largest_panel_glycans": 231, + "assays_per_panel_top10": [ + 52, + 29, + 19, + 9, + 7, + 7, + 6, + 6, + 5, + 5 + ], + "kish_n_eff_max_perfect_dependence": 13.691402714932126 + }, + "btb": { + "macro_from_per_row": 0.24087415343191254, + "reported": 0.2409, + "neff_icc_within_panel": 0.5236325692340034, + "neff_cluster_size_weighted_mean": 17.96747967479675, + "neff_design_effect": 9.884724975539553, + "neff_n_eff": 24.8868836117084 + }, + "size_rule_residue_count": { + "macro_constant_scored_zero": -0.019387999193773556, + "macro_constant_excluded": -0.019387999193773556, + "assays_excluded_as_constant": 0, + "reported_table_value": -0.0147, + "neff_icc_within_panel": 0.3968258571282197, + "neff_cluster_size_weighted_mean": 17.96747967479675, + "neff_design_effect": 7.733134665256867, + "neff_n_eff": 31.811162051169163 + } + }, + "doubly_cold": { + "rows": 3691, + "assays_total": 212, + "assays_eligible": 212, + "glycans": 173, + "proteins": 212, + "assays_with_more_than_one_protein": 0, + "glycan_components": 173, + "protein_components": 199, + "unmapped_rows": { + "glycan": 0, + "protein": 0 + }, + "largest_glycan_component_row_share": 0.0531021403413709, + "largest_protein_component_row_share": 0.01625575724735844, + "n_residues_ledger_vs_wurcs_header_mismatch_rows": 0, + "panels": { + "distinct": 40, + "largest_panel_assays": 88, + "largest_panel_share": 0.41509433962264153, + "largest_panel_glycans": 26, + "assays_per_panel_top10": [ + 88, + 26, + 12, + 10, + 9, + 8, + 7, + 7, + 5, + 4 + ], + "kish_n_eff_max_perfect_dependence": 4.995998221431748 + }, + "btb": { + "macro_from_per_row": 0.17853311044049022, + "reported": 0.1785, + "neff_icc_within_panel": 0.16283693088250406, + "neff_cluster_size_weighted_mean": 42.43396226415094, + "neff_design_effect": 7.746979249395828, + "neff_n_eff": 27.36550507948417 + }, + "size_rule_residue_count": { + "macro_constant_scored_zero": 0.21783172796334524, + "macro_constant_excluded": 0.21783172796334524, + "assays_excluded_as_constant": 0, + "reported_table_value": 0.2242, + "neff_icc_within_panel": 0.10145109607567915, + "neff_cluster_size_weighted_mean": 42.43396226415094, + "neff_design_effect": 5.203520886456442, + "neff_n_eff": 40.74164486430464 + } + } + }, + "inventory": { + "lectinoracle_checkpoints": [ + [ + "lectinoracle_matched_esm1b_mtA_glycans42.pt", + 3991608 + ], + [ + "lectinoracle_matched_esm1b_mtA_glycans43.pt", + 3991608 + ], + [ + "lectinoracle_matched_esm1b_mtA_glycans44.pt", + 3991608 + ], + [ + "lectinoracle_matched_esm1b_mtB_proteins42.pt", + 3991645 + ], + [ + "lectinoracle_matched_esm1b_mtB_proteins43.pt", + 3991645 + ], + [ + "lectinoracle_matched_esm1b_mtB_proteins44.pt", + 3991645 + ], + [ + "lectinoracle_matched_esm1b_mtC_doublys42.pt", + 3991608 + ], + [ + "lectinoracle_matched_esm1b_mtC_doublys43.pt", + 3991608 + ], + [ + "lectinoracle_matched_esm1b_mtC_doublys44.pt", + 3991608 + ], + [ + "lectinoracle_matched_mtA_glycans42.pt", + 3479386 + ], + [ + "lectinoracle_matched_mtA_glycans43.pt", + 3479386 + ], + [ + "lectinoracle_matched_mtA_glycans44.pt", + 3479386 + ], + [ + "lectinoracle_matched_mtB_proteins42.pt", + 3479423 + ], + [ + "lectinoracle_matched_mtB_proteins43.pt", + 3479423 + ], + [ + "lectinoracle_matched_mtB_proteins44.pt", + 3479423 + ], + [ + "lectinoracle_matched_mtC_doublys42.pt", + 3479386 + ], + [ + "lectinoracle_matched_mtC_doublys43.pt", + 3479386 + ], + [ + "lectinoracle_matched_mtC_doublys44.pt", + 3479386 + ], + [ + "lectinoracle_matched_spearsel_mtA_glycans42.pt", + 3479783 + ], + [ + "lectinoracle_matched_spearsel_mtA_glycans43.pt", + 3479783 + ], + [ + "lectinoracle_matched_spearsel_mtA_glycans44.pt", + 3479783 + ], + [ + "lectinoracle_matched_spearsel_mtB_proteins42.pt", + 3479820 + ], + [ + "lectinoracle_matched_spearsel_mtB_proteins43.pt", + 3479820 + ], + [ + "lectinoracle_matched_spearsel_mtB_proteins44.pt", + 3479820 + ], + [ + "lectinoracle_matched_spearsel_mtC_doublys42.pt", + 3479783 + ], + [ + "lectinoracle_matched_spearsel_mtC_doublys43.pt", + 3479783 + ], + [ + "lectinoracle_matched_spearsel_mtC_doublys44.pt", + 3479783 + ], + [ + "lectinoracle_retrained_v2.pt", + 62361021 + ], + [ + "lectinoracle_retrained_v2_c5s42.pt", + 62361339 + ], + [ + "lectinoracle_retrained_v2_c5s43.pt", + 62361339 + ], + [ + "lectinoracle_retrained_v2_c5s44.pt", + 62361339 + ], + [ + "lectinoracle_retrained_v2_e4s42.pt", + 62361339 + ], + [ + "lectinoracle_retrained_v2_e4s43.pt", + 62361339 + ], + [ + "lectinoracle_retrained_v2_e4s44.pt", + 62361339 + ], + [ + "lectinoracle_retrained_v2_prA_glycans42.pt", + 62361763 + ], + [ + "lectinoracle_retrained_v2_prA_glycans43.pt", + 62361763 + ], + [ + "lectinoracle_retrained_v2_prA_glycans44.pt", + 62361763 + ], + [ + "lectinoracle_retrained_v2_prB_proteins42.pt", + 62361816 + ], + [ + "lectinoracle_retrained_v2_prB_proteins43.pt", + 62361816 + ], + [ + "lectinoracle_retrained_v2_prB_proteins44.pt", + 62361816 + ], + [ + "lectinoracle_retrained_v2_prC_doublys42.pt", + 62361763 + ], + [ + "lectinoracle_retrained_v2_prC_doublys43.pt", + 62361763 + ], + [ + "lectinoracle_retrained_v2_prC_doublys44.pt", + 62361763 + ], + [ + "lectinoracle_retrained_v2_s43.pt", + 62361233 + ], + [ + "lectinoracle_retrained_v2_s44.pt", + 62361233 + ], + [ + "lectinoracle_retrained_v2_v3s42.pt", + 62361339 + ], + [ + "lectinoracle_retrained_v2_v3s43.pt", + 62361339 + ], + [ + "lectinoracle_retrained_v2_v3s44.pt", + 62361339 + ], + [ + "lectinoracle_trained.pt", + 3479828 + ] + ], + "lectinoracle_perrow": [ + [ + "affinose_lectinoracle_matched_esm1b_mtA_glycans42_test_glycan_cold_perrow.npz", + 177831 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtA_glycans43_test_glycan_cold_perrow.npz", + 177194 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtA_glycans44_test_glycan_cold_perrow.npz", + 176685 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtB_proteins42_test_protein_cold_perrow.npz", + 254515 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtB_proteins43_test_protein_cold_perrow.npz", + 254378 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtB_proteins44_test_protein_cold_perrow.npz", + 254355 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtC_doublys42_test_doubly_cold_perrow.npz", + 25961 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtC_doublys43_test_doubly_cold_perrow.npz", + 25657 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtC_doublys44_test_doubly_cold_perrow.npz", + 25759 + ], + [ + "affinose_lectinoracle_matched_mtC_doublys42_test_doubly_cold_perrow.npz", + 25919 + ], + [ + "affinose_lectinoracle_matched_mtC_doublys43_test_doubly_cold_perrow.npz", + 25886 + ], + [ + "affinose_lectinoracle_matched_mtC_doublys44_test_doubly_cold_perrow.npz", + 25849 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtA_glycans42_test_glycan_cold_perrow.npz", + 177269 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtA_glycans43_test_glycan_cold_perrow.npz", + 176912 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtA_glycans44_test_glycan_cold_perrow.npz", + 177555 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtB_proteins42_test_protein_cold_perrow.npz", + 254499 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtB_proteins43_test_protein_cold_perrow.npz", + 254723 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtB_proteins44_test_protein_cold_perrow.npz", + 254705 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtC_doublys42_test_doubly_cold_perrow.npz", + 26000 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtC_doublys43_test_doubly_cold_perrow.npz", + 25758 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtC_doublys44_test_doubly_cold_perrow.npz", + 25676 + ] + ], + "lectinoracle_receipts": [ + [ + "affinose_lectinoracle_all_regimes.json", + 1130 + ], + [ + "affinose_lectinoracle_ckpt_identity.json", + 2959 + ], + [ + "affinose_lectinoracle_comparator.json", + 646 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtA_glycans42.json", + 999 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtA_glycans43.json", + 999 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtA_glycans44.json", + 998 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtB_proteins42.json", + 1032 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtB_proteins43.json", + 1032 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtB_proteins44.json", + 1032 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtC_doublys42.json", + 996 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtC_doublys43.json", + 994 + ], + [ + "affinose_lectinoracle_matched_esm1b_mtC_doublys44.json", + 996 + ], + [ + "affinose_lectinoracle_matched_mtA_glycans42.json", + 915 + ], + [ + "affinose_lectinoracle_matched_mtA_glycans43.json", + 915 + ], + [ + "affinose_lectinoracle_matched_mtA_glycans44.json", + 915 + ], + [ + "affinose_lectinoracle_matched_mtB_proteins42.json", + 948 + ], + [ + "affinose_lectinoracle_matched_mtB_proteins43.json", + 948 + ], + [ + "affinose_lectinoracle_matched_mtB_proteins44.json", + 948 + ], + [ + "affinose_lectinoracle_matched_mtC_doublys42.json", + 912 + ], + [ + "affinose_lectinoracle_matched_mtC_doublys43.json", + 912 + ], + [ + "affinose_lectinoracle_matched_mtC_doublys44.json", + 912 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtA_glycans42.json", + 1680 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtA_glycans43.json", + 1678 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtA_glycans44.json", + 1682 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtB_proteins42.json", + 1713 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtB_proteins43.json", + 1714 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtB_proteins44.json", + 1714 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtC_doublys42.json", + 1678 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtC_doublys43.json", + 1679 + ], + [ + "affinose_lectinoracle_matched_spearsel_mtC_doublys44.json", + 1673 + ], + [ + "affinose_lectinoracle_provenance.json", + 3229 + ], + [ + "affinose_lectinoracle_retrain.json", + 765 + ], + [ + "affinose_lectinoracle_retrain_v2.json", + 1580 + ], + [ + "affinose_lectinoracle_retrain_v2_c5s42.json", + 1022 + ], + [ + "affinose_lectinoracle_retrain_v2_c5s43.json", + 1022 + ], + [ + "affinose_lectinoracle_retrain_v2_c5s44.json", + 1112 + ], + [ + "affinose_lectinoracle_retrain_v2_e4s42.json", + 1022 + ], + [ + "affinose_lectinoracle_retrain_v2_e4s43.json", + 1022 + ], + [ + "affinose_lectinoracle_retrain_v2_e4s44.json", + 1021 + ], + [ + "affinose_lectinoracle_retrain_v2_prA_glycans42.json", + 831 + ], + [ + "affinose_lectinoracle_retrain_v2_prA_glycans43.json", + 830 + ], + [ + "affinose_lectinoracle_retrain_v2_prA_glycans44.json", + 831 + ], + [ + "affinose_lectinoracle_retrain_v2_prB_proteins42.json", + 864 + ], + [ + "affinose_lectinoracle_retrain_v2_prB_proteins43.json", + 864 + ], + [ + "affinose_lectinoracle_retrain_v2_prB_proteins44.json", + 864 + ], + [ + "affinose_lectinoracle_retrain_v2_prC_doublys42.json", + 828 + ], + [ + "affinose_lectinoracle_retrain_v2_prC_doublys43.json", + 828 + ], + [ + "affinose_lectinoracle_retrain_v2_prC_doublys44.json", + 828 + ], + [ + "affinose_lectinoracle_retrain_v2_s43.json", + 1019 + ], + [ + "affinose_lectinoracle_retrain_v2_s44.json", + 1017 + ], + [ + "affinose_lectinoracle_retrain_v2_v3s42.json", + 1022 + ], + [ + "affinose_lectinoracle_retrain_v2_v3s43.json", + 1022 + ], + [ + "affinose_lectinoracle_retrain_v2_v3s44.json", + 1023 + ] + ], + "lectinoracle_producers": [ + [ + "lectinoracle_all_regimes.py", + 5217 + ], + [ + "lectinoracle_esm1b.py", + 16228 + ], + [ + "lectinoracle_matched.py", + 14739 + ], + [ + "lectinoracle_matched_spearsel.py", + 19693 + ], + [ + "lectinoracle_retrain.py", + 6325 + ], + [ + "lectinoracle_retrain_v2.py", + 11559 + ], + [ + "lectinoracle_train.py", + 6456 + ] + ], + "baseline_producers": [ + [ + "p35_zero_parameter_baselines.py", + 9314 + ], + [ + "p36_reviewer_baselines.py", + 9970 + ], + [ + "baselines_boot.py", + 9444 + ], + [ + "p35_zero_parameter_baselines.py", + 9314 + ], + [ + "p36_reviewer_baselines.py", + 9970 + ] + ], + "baseline_outputs": [ + [ + "p36_reviewer_baselines_A_glycan.json", + 840 + ], + [ + "p36_reviewer_baselines_B_protein.json", + 842 + ], + [ + "p36_reviewer_baselines_C_doubly.json", + 836 + ], + [ + "baselines_bootstrap.json", + 4293 + ] + ], + "gifflar_seed42_receipts": [ + [ + "affinose_gifflar_macro_A_glycan_gifflarESM.json", + 903 + ], + [ + "affinose_gifflar_macro_A_glycan_sweetnetESM.json", + 906 + ], + [ + "affinose_gifflar_macro_B_protein_gifflarESM.json", + 905 + ], + [ + "affinose_gifflar_macro_B_protein_sweetnetESM.json", + 908 + ], + [ + "affinose_gifflar_macro_C_doubly_gifflarESM.json", + 900 + ], + [ + "affinose_gifflar_macro_C_doubly_sweetnetESM.json", + 900 + ] + ] + } +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step3_bootstrap_20260926.json b/releases/2026-10-02/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step3_bootstrap_20260926.json new file mode 100644 index 0000000000000000000000000000000000000000..e0ef6a53256d2dccb9725b83c9e7162173e4c1de --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step3_bootstrap_20260926.json @@ -0,0 +1,458 @@ +{ + "schema": "affinose_b4_step3_v1", + "nboot": 2000, + "rng_seed": 20260926, + "gates": [ + { + "source": "LectinOracle ESM-C (primary) mtA_glycans42", + "recomputed": 0.29461295940901033, + "recorded": 0.2946, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtA_glycans43", + "recomputed": 0.2998599927845876, + "recorded": 0.2999, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtA_glycans44", + "recomputed": 0.2874261831082949, + "recorded": 0.2874, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prA_glycans42", + "recomputed": 0.3109242356511057, + "recorded": 0.3109, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prA_glycans43", + "recomputed": 0.2859891382180945, + "recorded": 0.286, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prA_glycans44", + "recomputed": 0.27994371513069394, + "recorded": 0.2799, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtA_glycans42", + "recomputed": 0.3150591754340759, + "recorded": 0.3151, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtA_glycans43", + "recomputed": 0.29880716777597094, + "recorded": 0.2988, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtA_glycans44", + "recomputed": 0.30650514393864015, + "recorded": 0.3065, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtA_glycans42", + "recomputed": 0.2941697165690018, + "recorded": 0.2942, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtA_glycans43", + "recomputed": 0.3126936790919916, + "recorded": 0.3127, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtA_glycans44", + "recomputed": 0.3047421415200463, + "recorded": 0.3047, + "pass": true, + "note": "" + }, + { + "source": "GIFFLAR gifflarESM s42", + "recomputed": 0.237647, + "recorded": 0.237639, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM s43", + "recomputed": 0.252075, + "recorded": 0.252077, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM s44", + "recomputed": 0.275436, + "recorded": 0.275437, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM s42", + "recomputed": 0.243723, + "recorded": 0.243723, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM s43", + "recomputed": 0.292708, + "recorded": 0.292708, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM s44", + "recomputed": 0.261029, + "recorded": 0.261029, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "composition ridge A_glycan", + "recomputed": 0.26748645613198063, + "recorded": 0.2675, + "pass": true, + "note": "" + }, + { + "source": "char 3-5-gram ridge A_glycan", + "recomputed": 0.21347663480166548, + "recorded": 0.2135, + "pass": true, + "note": "" + }, + { + "source": "nearest-neighbour glycan A_glycan", + "recomputed": 0.15856447405803167, + "recorded": 0.1586, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtB_proteins42", + "recomputed": 0.21990459487526257, + "recorded": 0.2199, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtB_proteins43", + "recomputed": 0.2153987341851486, + "recorded": 0.2154, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtB_proteins44", + "recomputed": 0.21379382359524457, + "recorded": 0.2138, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prB_proteins42", + "recomputed": 0.1803915270395587, + "recorded": 0.1804, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prB_proteins43", + "recomputed": 0.18271729614940446, + "recorded": 0.1827, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prB_proteins44", + "recomputed": 0.18978275814579412, + "recorded": 0.1898, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtB_proteins42", + "recomputed": 0.2337321131085862, + "recorded": 0.2337, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtB_proteins43", + "recomputed": 0.22020818751550644, + "recorded": 0.2202, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtB_proteins44", + "recomputed": 0.2175754991912383, + "recorded": 0.2176, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtB_proteins42", + "recomputed": 0.2154870719127689, + "recorded": 0.2155, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtB_proteins43", + "recomputed": 0.21589875483600227, + "recorded": 0.2159, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtB_proteins44", + "recomputed": 0.2187970453216688, + "recorded": 0.2188, + "pass": true, + "note": "" + }, + { + "source": "GIFFLAR gifflarESM s42", + "recomputed": 0.210711, + "recorded": 0.21041, + "pass": false, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM s43", + "recomputed": 0.204525, + "recorded": 0.20452, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM s44", + "recomputed": 0.207363, + "recorded": 0.207397, + "pass": false, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM s42", + "recomputed": 0.175404, + "recorded": 0.175404, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM s43", + "recomputed": 0.178854, + "recorded": 0.178855, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM s44", + "recomputed": 0.17515, + "recorded": 0.175171, + "pass": false, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "composition ridge B_protein", + "recomputed": 0.12655514259910874, + "recorded": 0.1266, + "pass": true, + "note": "" + }, + { + "source": "char 3-5-gram ridge B_protein", + "recomputed": 0.160992079254801, + "recorded": 0.161, + "pass": true, + "note": "" + }, + { + "source": "nearest-neighbour glycan B_protein", + "recomputed": 0.18859122852967236, + "recorded": 0.1886, + "pass": true, + "note": "" + }, + { + "source": "protein-family nearest B_protein", + "recomputed": 0.1510829012726471, + "recorded": 0.1511, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtC_doublys42", + "recomputed": 0.1701223415454592, + "recorded": 0.1701, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtC_doublys43", + "recomputed": 0.19716032050198853, + "recorded": 0.1972, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtC_doublys44", + "recomputed": 0.19949404913719423, + "recorded": 0.1995, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prC_doublys42", + "recomputed": 0.17876515213936092, + "recorded": 0.1788, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prC_doublys43", + "recomputed": 0.19308595684499813, + "recorded": 0.1931, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prC_doublys44", + "recomputed": 0.12590420915620712, + "recorded": 0.1259, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtC_doublys42", + "recomputed": 0.2184879902331782, + "recorded": 0.2185, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtC_doublys43", + "recomputed": 0.18003134941992985, + "recorded": 0.18, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtC_doublys44", + "recomputed": 0.2204627061059322, + "recorded": 0.2205, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtC_doublys42", + "recomputed": 0.19473326628891705, + "recorded": 0.1947, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtC_doublys43", + "recomputed": 0.20377865532401557, + "recorded": 0.2038, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtC_doublys44", + "recomputed": 0.18458485873840258, + "recorded": 0.1846, + "pass": true, + "note": "" + }, + { + "source": "GIFFLAR gifflarESM s42", + "recomputed": 0.119211, + "recorded": 0.119211, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM s43", + "recomputed": 0.187401, + "recorded": 0.187401, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM s44", + "recomputed": 0.187003, + "recorded": 0.187003, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM s42", + "recomputed": 0.224931, + "recorded": 0.224931, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM s43", + "recomputed": 0.227939, + "recorded": 0.227939, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM s44", + "recomputed": 0.213571, + "recorded": 0.213571, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "composition ridge C_doubly", + "recomputed": 0.24210410559558812, + "recorded": 0.2421, + "pass": true, + "note": "" + }, + { + "source": "char 3-5-gram ridge C_doubly", + "recomputed": 0.2495819624028953, + "recorded": 0.2496, + "pass": true, + "note": "" + }, + { + "source": "nearest-neighbour glycan C_doubly", + "recomputed": 0.09632788784547304, + "recorded": 0.0963, + "pass": true, + "note": "" + } + ], + "gates_passed": 61, + "gates_total": 64, + "status": "NOT RUN -- 3 producer-rule gate(s) failed" +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json b/releases/2026-10-02/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json new file mode 100644 index 0000000000000000000000000000000000000000..0549dd59a3c2346d5b9462bdee2ea290ffcbc026 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json @@ -0,0 +1,2207 @@ +{ + "schema": "affinose_b4_step3_v1", + "nboot": 2000, + "rng_seed": 20260926, + "gates": [ + { + "source": "LectinOracle ESM-C (primary) mtA_glycans42", + "recomputed": 0.29461295940901033, + "recorded": 0.2946, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtA_glycans43", + "recomputed": 0.2998599927845876, + "recorded": 0.2999, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtA_glycans44", + "recomputed": 0.2874261831082949, + "recorded": 0.2874, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prA_glycans42", + "recomputed": 0.3109242356511057, + "recorded": 0.3109, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prA_glycans43", + "recomputed": 0.2859891382180945, + "recorded": 0.286, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prA_glycans44", + "recomputed": 0.27994371513069394, + "recorded": 0.2799, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtA_glycans42", + "recomputed": 0.3150591754340759, + "recorded": 0.3151, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtA_glycans43", + "recomputed": 0.29880716777597094, + "recorded": 0.2988, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtA_glycans44", + "recomputed": 0.30650514393864015, + "recorded": 0.3065, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtA_glycans42", + "recomputed": 0.2941697165690018, + "recorded": 0.2942, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtA_glycans43", + "recomputed": 0.3126936790919916, + "recorded": 0.3127, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtA_glycans44", + "recomputed": 0.3047421415200463, + "recorded": 0.3047, + "pass": true, + "note": "" + }, + { + "source": "GIFFLAR gifflarESM A_glycan s42", + "recomputed": 0.237647, + "recorded": 0.237639, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM A_glycan s43", + "recomputed": 0.252075, + "recorded": 0.252077, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM A_glycan s44", + "recomputed": 0.275436, + "recorded": 0.275437, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM A_glycan s42", + "recomputed": 0.243723, + "recorded": 0.243723, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM A_glycan s43", + "recomputed": 0.292708, + "recorded": 0.292708, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM A_glycan s44", + "recomputed": 0.261029, + "recorded": 0.261029, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "composition ridge A_glycan", + "recomputed": 0.26748645613198063, + "recorded": 0.2675, + "pass": true, + "note": "" + }, + { + "source": "char 3-5-gram ridge A_glycan", + "recomputed": 0.21347663480166548, + "recorded": 0.2135, + "pass": true, + "note": "" + }, + { + "source": "nearest-neighbour glycan A_glycan", + "recomputed": 0.15856447405803167, + "recorded": 0.1586, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtB_proteins42", + "recomputed": 0.21990459487526257, + "recorded": 0.2199, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtB_proteins43", + "recomputed": 0.2153987341851486, + "recorded": 0.2154, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtB_proteins44", + "recomputed": 0.21379382359524457, + "recorded": 0.2138, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prB_proteins42", + "recomputed": 0.1803915270395587, + "recorded": 0.1804, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prB_proteins43", + "recomputed": 0.18271729614940446, + "recorded": 0.1827, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prB_proteins44", + "recomputed": 0.18978275814579412, + "recorded": 0.1898, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtB_proteins42", + "recomputed": 0.2337321131085862, + "recorded": 0.2337, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtB_proteins43", + "recomputed": 0.22020818751550644, + "recorded": 0.2202, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtB_proteins44", + "recomputed": 0.2175754991912383, + "recorded": 0.2176, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtB_proteins42", + "recomputed": 0.2154870719127689, + "recorded": 0.2155, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtB_proteins43", + "recomputed": 0.21589875483600227, + "recorded": 0.2159, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtB_proteins44", + "recomputed": 0.2187970453216688, + "recorded": 0.2188, + "pass": true, + "note": "" + }, + { + "source": "GIFFLAR gifflarESM B_protein s42", + "recomputed": 0.210711, + "recorded": 0.21041, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM B_protein s43", + "recomputed": 0.204525, + "recorded": 0.20452, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM B_protein s44", + "recomputed": 0.207363, + "recorded": 0.207397, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM B_protein s42", + "recomputed": 0.175404, + "recorded": 0.175404, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM B_protein s43", + "recomputed": 0.178854, + "recorded": 0.178855, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM B_protein s44", + "recomputed": 0.17515, + "recorded": 0.175171, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "composition ridge B_protein", + "recomputed": 0.12655514259910874, + "recorded": 0.1266, + "pass": true, + "note": "" + }, + { + "source": "char 3-5-gram ridge B_protein", + "recomputed": 0.160992079254801, + "recorded": 0.161, + "pass": true, + "note": "" + }, + { + "source": "nearest-neighbour glycan B_protein", + "recomputed": 0.18859122852967236, + "recorded": 0.1886, + "pass": true, + "note": "" + }, + { + "source": "protein-family nearest B_protein", + "recomputed": 0.1510829012726471, + "recorded": 0.1511, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtC_doublys42", + "recomputed": 0.1701223415454592, + "recorded": 0.1701, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtC_doublys43", + "recomputed": 0.19716032050198853, + "recorded": 0.1972, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtC_doublys44", + "recomputed": 0.19949404913719423, + "recorded": 0.1995, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prC_doublys42", + "recomputed": 0.17876515213936092, + "recorded": 0.1788, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prC_doublys43", + "recomputed": 0.19308595684499813, + "recorded": 0.1931, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prC_doublys44", + "recomputed": 0.12590420915620712, + "recorded": 0.1259, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtC_doublys42", + "recomputed": 0.2184879902331782, + "recorded": 0.2185, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtC_doublys43", + "recomputed": 0.18003134941992985, + "recorded": 0.18, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtC_doublys44", + "recomputed": 0.2204627061059322, + "recorded": 0.2205, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtC_doublys42", + "recomputed": 0.19473326628891705, + "recorded": 0.1947, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtC_doublys43", + "recomputed": 0.20377865532401557, + "recorded": 0.2038, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtC_doublys44", + "recomputed": 0.18458485873840258, + "recorded": 0.1846, + "pass": true, + "note": "" + }, + { + "source": "GIFFLAR gifflarESM C_doubly s42", + "recomputed": 0.119211, + "recorded": 0.119211, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM C_doubly s43", + "recomputed": 0.187401, + "recorded": 0.187401, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM C_doubly s44", + "recomputed": 0.187003, + "recorded": 0.187003, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM C_doubly s42", + "recomputed": 0.224931, + "recorded": 0.224931, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM C_doubly s43", + "recomputed": 0.227939, + "recorded": 0.227939, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM C_doubly s44", + "recomputed": 0.213571, + "recorded": 0.213571, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "composition ridge C_doubly", + "recomputed": 0.24210410559558812, + "recorded": 0.2421, + "pass": true, + "note": "" + }, + { + "source": "char 3-5-gram ridge C_doubly", + "recomputed": 0.2495819624028953, + "recorded": 0.2496, + "pass": true, + "note": "" + }, + { + "source": "nearest-neighbour glycan C_doubly", + "recomputed": 0.09632788784547304, + "recorded": 0.0963, + "pass": true, + "note": "" + } + ], + "gates_passed": 64, + "gates_total": 64, + "regimes": { + "glycan_cold": { + "units": { + "glycan_components": 339, + "protein_components": 364, + "assays": 1767 + }, + "point_#4_rule": { + "BERToseBind": 0.3293033324285421, + "LectinOracle ESM-C (primary)": 0.2853154154013858, + "LectinOracle _flex": 0.28368419310221066, + "LectinOracle ESM-1b": 0.297762139305791, + "LectinOracle matched tuning": 0.29492614530569383, + "GIFFLAR gifflarESM": 0.25505273565629216, + "GIFFLAR sweetnetESM": 0.2658198702099431, + "composition ridge": 0.2674864561319807, + "char 3-5-gram ridge": 0.21347663480166548, + "nearest-neighbour glycan": 0.15856447405803165, + "motif ridge (p44)": 0.2230309186548315, + "glycan-size rule (BPE tokens)": 0.2449266100013241 + }, + "per_seed_#4_rule": { + "BERToseBind": [ + 0.33405850648525903, + 0.318371586837939, + 0.3354799039624282 + ], + "LectinOracle ESM-C (primary)": [ + 0.28594296852657203, + 0.2910355900540847, + 0.2789676876235007 + ], + "LectinOracle _flex": [ + 0.3017742298481303, + 0.27757293267913535, + 0.2717054167793662 + ], + "LectinOracle ESM-1b": [ + 0.3057874849289418, + 0.2900137480111999, + 0.29748518497723136 + ], + "LectinOracle matched tuning": [ + 0.28551276961847094, + 0.3034916013824366, + 0.295774064916174 + ], + "GIFFLAR gifflarESM": [ + 0.2376472549518116, + 0.2520752003987527, + 0.27543575161831213 + ], + "GIFFLAR sweetnetESM": [ + 0.24372274134791053, + 0.29270779270966824, + 0.2610290765722505 + ], + "composition ridge": [ + 0.2674864561319807 + ], + "char 3-5-gram ridge": [ + 0.21347663480166548 + ], + "nearest-neighbour glycan": [ + 0.15856447405803165 + ], + "motif ridge (p44)": [ + 0.2230309186548315 + ], + "glycan-size rule (BPE tokens)": [ + 0.2449266100013241 + ] + }, + "primary_test_only": { + "BERToseBind": { + "score_ci95": [ + 0.2554688030781091, + 0.3889963902571539 + ], + "rank_median": 1.0, + "rank_ci95": [ + 1.0, + 8.0 + ], + "p_rank1": 0.608 + }, + "LectinOracle ESM-C (primary)": { + "score_ci95": [ + 0.22623506775544625, + 0.35847811597714097 + ], + "rank_median": 5.0, + "rank_ci95": [ + 3.0, + 9.0 + ], + "p_rank1": 0.0015, + "delta_btb_minus": 0.04398791702715632, + "delta_ci95": [ + -0.03178395437687447, + 0.08903637793981824 + ], + "p_btb_better": 0.834 + }, + "LectinOracle _flex": { + "score_ci95": [ + 0.2237543329575964, + 0.354961396131035 + ], + "rank_median": 5.0, + "rank_ci95": [ + 2.0, + 10.0 + ], + "p_rank1": 0.0105, + "delta_btb_minus": 0.04561913932633144, + "delta_ci95": [ + -0.02643513264537863, + 0.08875646067570539 + ], + "p_btb_better": 0.863 + }, + "LectinOracle ESM-1b": { + "score_ci95": [ + 0.23572246300992017, + 0.3684531988306366 + ], + "rank_median": 3.0, + "rank_ci95": [ + 1.0, + 7.0 + ], + "p_rank1": 0.1135, + "delta_btb_minus": 0.03154119312275111, + "delta_ci95": [ + -0.04474364837693402, + 0.07889577185085227 + ], + "p_btb_better": 0.7325 + }, + "LectinOracle matched tuning": { + "score_ci95": [ + 0.2316612263454309, + 0.37011610040682796 + ], + "rank_median": 3.0, + "rank_ci95": [ + 1.0, + 8.0 + ], + "p_rank1": 0.117, + "delta_btb_minus": 0.03437718712284826, + "delta_ci95": [ + -0.042717821187179685, + 0.07915154676646698 + ], + "p_btb_better": 0.727 + }, + "GIFFLAR gifflarESM": { + "score_ci95": [ + 0.1987857297519285, + 0.3465440698090343 + ], + "rank_median": 7.0, + "rank_ci95": [ + 2.0, + 10.0 + ], + "p_rank1": 0.0135, + "delta_btb_minus": 0.07425059677224993, + "delta_ci95": [ + -0.01700157149057998, + 0.11520266898013086 + ], + "p_btb_better": 0.9205 + }, + "GIFFLAR sweetnetESM": { + "score_ci95": [ + 0.21379486274553441, + 0.3410578126235054 + ], + "rank_median": 7.0, + "rank_ci95": [ + 2.0, + 11.0 + ], + "p_rank1": 0.0095, + "delta_btb_minus": 0.06348346221859902, + "delta_ci95": [ + -0.025408699327114283, + 0.10800418302979356 + ], + "p_btb_better": 0.912 + }, + "composition ridge": { + "score_ci95": [ + 0.18922176785192266, + 0.3588153496773146 + ], + "rank_median": 7.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.092, + "delta_btb_minus": 0.06181687629656141, + "delta_ci95": [ + -0.04269882084854056, + 0.12711949645561946 + ], + "p_btb_better": 0.838 + }, + "char 3-5-gram ridge": { + "score_ci95": [ + 0.14034243373957977, + 0.3285541954265566 + ], + "rank_median": 10.0, + "rank_ci95": [ + 3.0, + 12.0 + ], + "p_rank1": 0.006, + "delta_btb_minus": 0.11582669762687661, + "delta_ci95": [ + -0.007952965697240341, + 0.1775451913956852 + ], + "p_btb_better": 0.967 + }, + "nearest-neighbour glycan": { + "score_ci95": [ + 0.0545735243642953, + 0.2553687960872403 + ], + "rank_median": 12.0, + "rank_ci95": [ + 10.0, + 12.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.17073885837051045, + "delta_ci95": [ + 0.06737660452222888, + 0.27108565365186427 + ], + "p_btb_better": 1.0 + }, + "motif ridge (p44)": { + "score_ci95": [ + 0.1551500648469665, + 0.308485567750794 + ], + "rank_median": 10.0, + "rank_ci95": [ + 6.0, + 12.0 + ], + "p_rank1": 0.0005, + "delta_btb_minus": 0.1062724137737106, + "delta_ci95": [ + 0.011693774963207719, + 0.16657081949941016 + ], + "p_btb_better": 0.9855 + }, + "glycan-size rule (BPE tokens)": { + "score_ci95": [ + 0.16625436287204828, + 0.34557862026746927 + ], + "rank_median": 9.0, + "rank_ci95": [ + 1.0, + 12.0 + ], + "p_rank1": 0.028, + "delta_btb_minus": 0.084376722427218, + "delta_ci95": [ + -0.02461685006138715, + 0.15459768177292643 + ], + "p_btb_better": 0.9205 + } + }, + "secondary_test_plus_seed": { + "BERToseBind": { + "score_ci95": [ + 0.25347868151198766, + 0.38880294680559396 + ], + "rank_median": 1.0, + "rank_ci95": [ + 1.0, + 8.0 + ], + "p_rank1": 0.5735 + }, + "LectinOracle ESM-C (primary)": { + "score_ci95": [ + 0.22461627290585706, + 0.35961154287997854 + ], + "rank_median": 5.0, + "rank_ci95": [ + 2.0, + 9.0 + ], + "p_rank1": 0.0045, + "delta_btb_minus": 0.04398791702715632, + "delta_ci95": [ + -0.03375695150317954, + 0.09207675159628773 + ], + "p_btb_better": 0.8245 + }, + "LectinOracle _flex": { + "score_ci95": [ + 0.22230135714522106, + 0.36176997455022886 + ], + "rank_median": 5.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.026, + "delta_btb_minus": 0.04561913932633144, + "delta_ci95": [ + -0.03182701201797303, + 0.09411096758869278 + ], + "p_btb_better": 0.8455 + }, + "LectinOracle ESM-1b": { + "score_ci95": [ + 0.23457407744378792, + 0.37248367163755863 + ], + "rank_median": 3.0, + "rank_ci95": [ + 1.0, + 8.0 + ], + "p_rank1": 0.1125, + "delta_btb_minus": 0.03154119312275111, + "delta_ci95": [ + -0.0458036347010033, + 0.08330637740352137 + ], + "p_btb_better": 0.72 + }, + "LectinOracle matched tuning": { + "score_ci95": [ + 0.2301891940522413, + 0.3701510269156564 + ], + "rank_median": 3.0, + "rank_ci95": [ + 1.0, + 8.0 + ], + "p_rank1": 0.1215, + "delta_btb_minus": 0.03437718712284826, + "delta_ci95": [ + -0.044120366124002754, + 0.08104780952117469 + ], + "p_btb_better": 0.713 + }, + "GIFFLAR gifflarESM": { + "score_ci95": [ + 0.19392815723053966, + 0.3532289545178834 + ], + "rank_median": 7.0, + "rank_ci95": [ + 2.0, + 11.0 + ], + "p_rank1": 0.02, + "delta_btb_minus": 0.07425059677224993, + "delta_ci95": [ + -0.021931255397935723, + 0.1213752523599596 + ], + "p_btb_better": 0.8985 + }, + "GIFFLAR sweetnetESM": { + "score_ci95": [ + 0.20700049743600124, + 0.3469943933201588 + ], + "rank_median": 7.0, + "rank_ci95": [ + 1.9750000000000014, + 11.0 + ], + "p_rank1": 0.025, + "delta_btb_minus": 0.06348346221859902, + "delta_ci95": [ + -0.030560824659069938, + 0.11664772319713455 + ], + "p_btb_better": 0.8945 + }, + "composition ridge": { + "score_ci95": [ + 0.18922176785192266, + 0.3588153496773146 + ], + "rank_median": 7.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.0845, + "delta_btb_minus": 0.06181687629656141, + "delta_ci95": [ + -0.04388294968767785, + 0.12952306579877298 + ], + "p_btb_better": 0.8385 + }, + "char 3-5-gram ridge": { + "score_ci95": [ + 0.14034243373957977, + 0.3285541954265566 + ], + "rank_median": 10.0, + "rank_ci95": [ + 3.0, + 12.0 + ], + "p_rank1": 0.0055, + "delta_btb_minus": 0.11582669762687661, + "delta_ci95": [ + -0.006114233373329367, + 0.17996678225107984 + ], + "p_btb_better": 0.967 + }, + "nearest-neighbour glycan": { + "score_ci95": [ + 0.0545735243642953, + 0.2553687960872403 + ], + "rank_median": 12.0, + "rank_ci95": [ + 10.0, + 12.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.17073885837051045, + "delta_ci95": [ + 0.06957370622304927, + 0.27173969770371004 + ], + "p_btb_better": 1.0 + }, + "motif ridge (p44)": { + "score_ci95": [ + 0.1551500648469665, + 0.308485567750794 + ], + "rank_median": 10.0, + "rank_ci95": [ + 7.0, + 12.0 + ], + "p_rank1": 0.0005, + "delta_btb_minus": 0.1062724137737106, + "delta_ci95": [ + 0.011516542067665017, + 0.16790726695327865 + ], + "p_btb_better": 0.9875 + }, + "glycan-size rule (BPE tokens)": { + "score_ci95": [ + 0.16625436287204828, + 0.34557862026746927 + ], + "rank_median": 8.0, + "rank_ci95": [ + 1.0, + 12.0 + ], + "p_rank1": 0.0265, + "delta_btb_minus": 0.084376722427218, + "delta_ci95": [ + -0.026263927559185087, + 0.15709512713171556 + ], + "p_btb_better": 0.9205 + } + }, + "welch_seed_only": { + "LectinOracle ESM-C (primary)": { + "delta": 0.04398791702715632, + "ci95": [ + 0.024598559208070185, + 0.06337727484624245 + ], + "p": 0.004398400077247011 + }, + "LectinOracle _flex": { + "delta": 0.04561913932633144, + "ci95": [ + 0.013022022915174014, + 0.07821625573748886 + ], + "p": 0.02005263462413165 + }, + "LectinOracle ESM-1b": { + "delta": 0.03154119312275111, + "ci95": [ + 0.011488991968660586, + 0.051593394276841634 + ], + "p": 0.012340735251811896 + }, + "LectinOracle matched tuning": { + "delta": 0.03437718712284826, + "ci95": [ + 0.013364274854223302, + 0.05539009939147323 + ], + "p": 0.010505513932187016 + }, + "GIFFLAR gifflarESM": { + "delta": 0.07425059677224993, + "ci95": [ + 0.034608253562014246, + 0.11389293998248562 + ], + "p": 0.009709116736489332 + }, + "GIFFLAR sweetnetESM": { + "delta": 0.06348346221859902, + "ci95": [ + 0.009682693505285361, + 0.11728423093191268 + ], + "p": 0.034370527808528895 + } + }, + "pooled_E4": { + "point": { + "BERToseBind": 0.352423627827634, + "LectinOracle ESM-C (primary)": 0.3408005508825944 + }, + "ci95": { + "BERToseBind": [ + 0.2809791531735357, + 0.4198719821256602 + ], + "LectinOracle ESM-C (primary)": [ + 0.26727027961583627, + 0.4054770689026824 + ] + }, + "delta_btb_minus_lo": 0.011623076945039557, + "delta_ci95": [ + -0.0429587028976285, + 0.06873342208019707 + ], + "p_btb_better": 0.682 + } + }, + "protein_cold": { + "units": { + "glycan_components": 826, + "protein_components": 216, + "assays": 246 + }, + "point_#4_rule": { + "BERToseBind": 0.24087415343191254, + "LectinOracle ESM-C (primary)": 0.21636571755188524, + "LectinOracle _flex": 0.1842971937782524, + "LectinOracle ESM-1b": 0.22383859993844366, + "LectinOracle matched tuning": 0.21672762402347998, + "GIFFLAR gifflarESM": 0.20753304313957813, + "GIFFLAR sweetnetESM": 0.17646909258858567, + "composition ridge": 0.12655514259910874, + "char 3-5-gram ridge": 0.16099207925480097, + "nearest-neighbour glycan": 0.1885912285296723, + "protein-family nearest": 0.1510829012726471, + "motif ridge (p44)": 0.07411945343032166, + "glycan-size rule (BPE tokens)": -0.014709395191754895 + }, + "per_seed_#4_rule": { + "BERToseBind": [ + 0.23260289913763402, + 0.24512556467979305, + 0.24489399647831056 + ], + "LectinOracle ESM-C (primary)": [ + 0.21990459487526254, + 0.2153987341851486, + 0.21379382359524454 + ], + "LectinOracle _flex": [ + 0.18039152703955869, + 0.18271729614940446, + 0.18978275814579412 + ], + "LectinOracle ESM-1b": [ + 0.2337321131085862, + 0.22020818751550642, + 0.2175754991912383 + ], + "LectinOracle matched tuning": [ + 0.21548707191276883, + 0.21589875483600227, + 0.2187970453216688 + ], + "GIFFLAR gifflarESM": [ + 0.21071117805914696, + 0.20452460419269286, + 0.20736334716689458 + ], + "GIFFLAR sweetnetESM": [ + 0.17540362192512995, + 0.17885413788754334, + 0.1751495179530837 + ], + "composition ridge": [ + 0.12655514259910874 + ], + "char 3-5-gram ridge": [ + 0.16099207925480097 + ], + "nearest-neighbour glycan": [ + 0.1885912285296723 + ], + "protein-family nearest": [ + 0.1510829012726471 + ], + "motif ridge (p44)": [ + 0.07411945343032166 + ], + "glycan-size rule (BPE tokens)": [ + -0.014709395191754895 + ] + }, + "primary_test_only": { + "BERToseBind": { + "score_ci95": [ + 0.19990186950566438, + 0.2809251377652073 + ], + "rank_median": 1.0, + "rank_ci95": [ + 1.0, + 3.0 + ], + "p_rank1": 0.892 + }, + "LectinOracle ESM-C (primary)": { + "score_ci95": [ + 0.1769518194175074, + 0.25537706527593684 + ], + "rank_median": 4.0, + "rank_ci95": [ + 2.0, + 6.0 + ], + "p_rank1": 0.0105, + "delta_btb_minus": 0.024508435880027296, + "delta_ci95": [ + -0.0033261547942619123, + 0.048983628199518764 + ], + "p_btb_better": 0.96 + }, + "LectinOracle _flex": { + "score_ci95": [ + 0.14370658545017348, + 0.22458058723529778 + ], + "rank_median": 7.0, + "rank_ci95": [ + 5.0, + 9.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.056576959653660136, + "delta_ci95": [ + 0.023026786546039353, + 0.08870620710109084 + ], + "p_btb_better": 0.9995 + }, + "LectinOracle ESM-1b": { + "score_ci95": [ + 0.18593877623029764, + 0.261610488858604 + ], + "rank_median": 2.0, + "rank_ci95": [ + 1.0, + 5.0 + ], + "p_rank1": 0.088, + "delta_btb_minus": 0.017035553493468886, + "delta_ci95": [ + -0.011095550438623382, + 0.04288506701379807 + ], + "p_btb_better": 0.904 + }, + "LectinOracle matched tuning": { + "score_ci95": [ + 0.17847029380890223, + 0.2540055177699127 + ], + "rank_median": 4.0, + "rank_ci95": [ + 2.0, + 5.0 + ], + "p_rank1": 0.006, + "delta_btb_minus": 0.024146529408432565, + "delta_ci95": [ + -0.0006049275359731744, + 0.04768812060615063 + ], + "p_btb_better": 0.9725 + }, + "GIFFLAR gifflarESM": { + "score_ci95": [ + 0.1690119926395548, + 0.2496268085807646 + ], + "rank_median": 5.0, + "rank_ci95": [ + 2.0, + 7.0 + ], + "p_rank1": 0.0025, + "delta_btb_minus": 0.033341110292334414, + "delta_ci95": [ + 0.008160737841985129, + 0.059409349015113334 + ], + "p_btb_better": 0.9945 + }, + "GIFFLAR sweetnetESM": { + "score_ci95": [ + 0.14284280581539216, + 0.21056522725098895 + ], + "rank_median": 8.0, + "rank_ci95": [ + 6.0, + 9.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.06440506084332687, + "delta_ci95": [ + 0.03360626578639135, + 0.09371721998689221 + ], + "p_btb_better": 1.0 + }, + "composition ridge": { + "score_ci95": [ + 0.08060570302272095, + 0.17253774701907162 + ], + "rank_median": 11.0, + "rank_ci95": [ + 10.0, + 12.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.1143190108328038, + "delta_ci95": [ + 0.0710542106393962, + 0.16060914157920583 + ], + "p_btb_better": 1.0 + }, + "char 3-5-gram ridge": { + "score_ci95": [ + 0.12095377224079984, + 0.2032899675702806 + ], + "rank_median": 9.0, + "rank_ci95": [ + 7.0, + 11.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.07988207417711157, + "delta_ci95": [ + 0.04192269182893507, + 0.11527601656070136 + ], + "p_btb_better": 1.0 + }, + "nearest-neighbour glycan": { + "score_ci95": [ + 0.14294992756613306, + 0.22833055643994993 + ], + "rank_median": 7.0, + "rank_ci95": [ + 3.0, + 9.0 + ], + "p_rank1": 0.001, + "delta_btb_minus": 0.052282924902240235, + "delta_ci95": [ + 0.01873960177852268, + 0.09084806127386198 + ], + "p_btb_better": 0.998 + }, + "protein-family nearest": { + "score_ci95": [ + 0.10662851372581617, + 0.19133591197239094 + ], + "rank_median": 10.0, + "rank_ci95": [ + 6.0, + 11.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.08979125215926545, + "delta_ci95": [ + 0.04879649199031761, + 0.1331543030983215 + ], + "p_btb_better": 1.0 + }, + "motif ridge (p44)": { + "score_ci95": [ + 0.028821993538636938, + 0.11605372140127032 + ], + "rank_median": 12.0, + "rank_ci95": [ + 11.0, + 12.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.16675470000159087, + "delta_ci95": [ + 0.11841299132174923, + 0.2179193631634287 + ], + "p_btb_better": 1.0 + }, + "glycan-size rule (BPE tokens)": { + "score_ci95": [ + -0.06018587225264553, + 0.028553507790947796 + ], + "rank_median": 13.0, + "rank_ci95": [ + 13.0, + 13.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.25558354862366744, + "delta_ci95": [ + 0.20033347452303485, + 0.3185854807420734 + ], + "p_btb_better": 1.0 + } + }, + "secondary_test_plus_seed": { + "BERToseBind": { + "score_ci95": [ + 0.19901618124854453, + 0.28126466592414734 + ], + "rank_median": 1.0, + "rank_ci95": [ + 1.0, + 4.0 + ], + "p_rank1": 0.8345 + }, + "LectinOracle ESM-C (primary)": { + "score_ci95": [ + 0.17781070310160602, + 0.2548269942294191 + ], + "rank_median": 4.0, + "rank_ci95": [ + 1.0, + 6.0 + ], + "p_rank1": 0.0255, + "delta_btb_minus": 0.024508435880027296, + "delta_ci95": [ + -0.008606789419618966, + 0.053187208992192245 + ], + "p_btb_better": 0.9335 + }, + "LectinOracle _flex": { + "score_ci95": [ + 0.1430008365664705, + 0.2246820562770138 + ], + "rank_median": 7.0, + "rank_ci95": [ + 5.0, + 9.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.056576959653660136, + "delta_ci95": [ + 0.01913565602863821, + 0.09370660679451114 + ], + "p_btb_better": 0.999 + }, + "LectinOracle ESM-1b": { + "score_ci95": [ + 0.18548899394664478, + 0.2644896712084594 + ], + "rank_median": 2.0, + "rank_ci95": [ + 1.0, + 5.0 + ], + "p_rank1": 0.1185, + "delta_btb_minus": 0.017035553493468886, + "delta_ci95": [ + -0.014902296745193477, + 0.04794088595457959 + ], + "p_btb_better": 0.8655 + }, + "LectinOracle matched tuning": { + "score_ci95": [ + 0.17830869690999498, + 0.25575174316481347 + ], + "rank_median": 4.0, + "rank_ci95": [ + 2.0, + 6.0 + ], + "p_rank1": 0.0135, + "delta_btb_minus": 0.024146529408432565, + "delta_ci95": [ + -0.0060759103490305244, + 0.053730163212137756 + ], + "p_btb_better": 0.95 + }, + "GIFFLAR gifflarESM": { + "score_ci95": [ + 0.16690761573544066, + 0.250029276729087 + ], + "rank_median": 5.0, + "rank_ci95": [ + 2.0, + 7.0 + ], + "p_rank1": 0.006, + "delta_btb_minus": 0.033341110292334414, + "delta_ci95": [ + 0.004694724614958774, + 0.06271076895621958 + ], + "p_btb_better": 0.985 + }, + "GIFFLAR sweetnetESM": { + "score_ci95": [ + 0.1398955238226955, + 0.21225918068827307 + ], + "rank_median": 8.0, + "rank_ci95": [ + 6.0, + 10.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.06440506084332687, + "delta_ci95": [ + 0.02972381461091908, + 0.09605456656898627 + ], + "p_btb_better": 0.9995 + }, + "composition ridge": { + "score_ci95": [ + 0.08060570302272095, + 0.17253774701907162 + ], + "rank_median": 11.0, + "rank_ci95": [ + 9.0, + 12.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.1143190108328038, + "delta_ci95": [ + 0.07149506194978549, + 0.16170770594652173 + ], + "p_btb_better": 1.0 + }, + "char 3-5-gram ridge": { + "score_ci95": [ + 0.12095377224079984, + 0.2032899675702806 + ], + "rank_median": 9.0, + "rank_ci95": [ + 6.0, + 11.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.07988207417711157, + "delta_ci95": [ + 0.04133776825893229, + 0.1161707395849824 + ], + "p_btb_better": 1.0 + }, + "nearest-neighbour glycan": { + "score_ci95": [ + 0.14294992756613306, + 0.22833055643994993 + ], + "rank_median": 7.0, + "rank_ci95": [ + 3.0, + 9.0 + ], + "p_rank1": 0.002, + "delta_btb_minus": 0.052282924902240235, + "delta_ci95": [ + 0.017277042003073537, + 0.09175658351136994 + ], + "p_btb_better": 0.998 + }, + "protein-family nearest": { + "score_ci95": [ + 0.10662851372581617, + 0.19133591197239094 + ], + "rank_median": 10.0, + "rank_ci95": [ + 6.0, + 11.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.08979125215926545, + "delta_ci95": [ + 0.04816453060967756, + 0.13544128055873392 + ], + "p_btb_better": 1.0 + }, + "motif ridge (p44)": { + "score_ci95": [ + 0.028821993538636938, + 0.11605372140127032 + ], + "rank_median": 12.0, + "rank_ci95": [ + 11.0, + 12.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.16675470000159087, + "delta_ci95": [ + 0.11524377211334574, + 0.21932309094447988 + ], + "p_btb_better": 1.0 + }, + "glycan-size rule (BPE tokens)": { + "score_ci95": [ + -0.06018587225264553, + 0.028553507790947796 + ], + "rank_median": 13.0, + "rank_ci95": [ + 13.0, + 13.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.25558354862366744, + "delta_ci95": [ + 0.19898688335018824, + 0.3188426201248919 + ], + "p_btb_better": 1.0 + } + }, + "welch_seed_only": { + "LectinOracle ESM-C (primary)": { + "delta": 0.024508435880027296, + "ci95": [ + 0.00935827186949135, + 0.039658599890563244 + ], + "p": 0.01533421157430026 + }, + "LectinOracle _flex": { + "delta": 0.056576959653660136, + "ci95": [ + 0.04191372249935968, + 0.07124019680796059 + ], + "p": 0.0006751343539153076 + }, + "LectinOracle ESM-1b": { + "delta": 0.017035553493468886, + "ci95": [ + -0.0012462617680410112, + 0.03531736875497878 + ], + "p": 0.060680843993287326 + }, + "LectinOracle matched tuning": { + "delta": 0.024146529408432565, + "ci95": [ + 0.007632226317791622, + 0.04066083249907351 + ], + "p": 0.022619072364313375 + }, + "GIFFLAR gifflarESM": { + "delta": 0.033341110292334414, + "ci95": [ + 0.018136314435873734, + 0.048545906148795094 + ], + "p": 0.007056963860288867 + }, + "GIFFLAR sweetnetESM": { + "delta": 0.06440506084332687, + "ci95": [ + 0.048189258396163726, + 0.08062086329049001 + ], + "p": 0.002280402507870871 + } + }, + "pooled_E4": { + "point": { + "BERToseBind": 0.26451514279675, + "LectinOracle ESM-C (primary)": 0.24260613049142152 + }, + "ci95": { + "BERToseBind": [ + 0.22685659704476233, + 0.30227237193882434 + ], + "LectinOracle ESM-C (primary)": [ + 0.20464146531693983, + 0.28174655591460923 + ] + }, + "delta_btb_minus_lo": 0.021909012305328462, + "delta_ci95": [ + 0.00983804391148444, + 0.03530998396725674 + ], + "p_btb_better": 0.9995 + } + }, + "doubly_cold": { + "units": { + "glycan_components": 173, + "protein_components": 199, + "assays": 212 + }, + "point_#4_rule": { + "BERToseBind": 0.17853311044049022, + "LectinOracle ESM-C (primary)": 0.18892557039488064, + "LectinOracle _flex": 0.16591843938018871, + "LectinOracle ESM-1b": 0.20632734858634674, + "LectinOracle matched tuning": 0.19436559345044505, + "GIFFLAR gifflarESM": 0.16453849607071838, + "GIFFLAR sweetnetESM": 0.22214733229047123, + "composition ridge": 0.24210410559558815, + "char 3-5-gram ridge": 0.24958196240289526, + "nearest-neighbour glycan": 0.09632788784547305, + "motif ridge (p44)": 0.22896473471498477, + "glycan-size rule (BPE tokens)": 0.2242042239447186 + }, + "per_seed_#4_rule": { + "BERToseBind": [ + 0.17732109020146009, + 0.1839765095395252, + 0.17430173158048537 + ], + "LectinOracle ESM-C (primary)": [ + 0.17012234154545913, + 0.1971603205019885, + 0.19949404913719423 + ], + "LectinOracle _flex": [ + 0.17876515213936095, + 0.19308595684499813, + 0.12590420915620712 + ], + "LectinOracle ESM-1b": [ + 0.2184879902331782, + 0.18003134941992985, + 0.22046270610593216 + ], + "LectinOracle matched tuning": [ + 0.19473326628891705, + 0.20377865532401557, + 0.18458485873840255 + ], + "GIFFLAR gifflarESM": [ + 0.11921097272627695, + 0.18740125661964038, + 0.1870032588662378 + ], + "GIFFLAR sweetnetESM": [ + 0.22493144339363638, + 0.22793936767579281, + 0.2135711858019845 + ], + "composition ridge": [ + 0.24210410559558815 + ], + "char 3-5-gram ridge": [ + 0.24958196240289526 + ], + "nearest-neighbour glycan": [ + 0.09632788784547305 + ], + "motif ridge (p44)": [ + 0.22896473471498477 + ], + "glycan-size rule (BPE tokens)": [ + 0.2242042239447186 + ] + }, + "primary_test_only": { + "BERToseBind": { + "score_ci95": [ + 0.08800632066585967, + 0.29818324441093086 + ], + "rank_median": 8.0, + "rank_ci95": [ + 1.0, + 12.0 + ], + "p_rank1": 0.03 + }, + "LectinOracle ESM-C (primary)": { + "score_ci95": [ + 0.08266460776080133, + 0.30550585726431234 + ], + "rank_median": 8.0, + "rank_ci95": [ + 1.0, + 11.0 + ], + "p_rank1": 0.034, + "delta_btb_minus": -0.01039245995439042, + "delta_ci95": [ + -0.11538313078589431, + 0.10570818896632488 + ], + "p_btb_better": 0.4535 + }, + "LectinOracle _flex": { + "score_ci95": [ + 0.07288417641226902, + 0.275937321371501 + ], + "rank_median": 10.0, + "rank_ci95": [ + 5.0, + 12.0 + ], + "p_rank1": 0.0015, + "delta_btb_minus": 0.012614671060301508, + "delta_ci95": [ + -0.07242815907623544, + 0.11582134063882747 + ], + "p_btb_better": 0.647 + }, + "LectinOracle ESM-1b": { + "score_ci95": [ + 0.10740550725208699, + 0.3200246031953035 + ], + "rank_median": 6.0, + "rank_ci95": [ + 2.0, + 9.0 + ], + "p_rank1": 0.0245, + "delta_btb_minus": -0.02779423814585652, + "delta_ci95": [ + -0.11816939713664168, + 0.07219018528869879 + ], + "p_btb_better": 0.308 + }, + "LectinOracle matched tuning": { + "score_ci95": [ + 0.09749794058496436, + 0.31276811835705887 + ], + "rank_median": 7.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.0285, + "delta_btb_minus": -0.015832483009954823, + "delta_ci95": [ + -0.1084512250087089, + 0.0793245507023225 + ], + "p_btb_better": 0.372 + }, + "GIFFLAR gifflarESM": { + "score_ci95": [ + 0.06664086666531871, + 0.2941583966576146 + ], + "rank_median": 9.0, + "rank_ci95": [ + 3.0, + 12.0 + ], + "p_rank1": 0.0045, + "delta_btb_minus": 0.01399461436977184, + "delta_ci95": [ + -0.10208068365397563, + 0.11935280964623651 + ], + "p_btb_better": 0.598 + }, + "GIFFLAR sweetnetESM": { + "score_ci95": [ + 0.12107448243175156, + 0.333818443516957 + ], + "rank_median": 5.0, + "rank_ci95": [ + 2.0, + 11.0 + ], + "p_rank1": 0.0225, + "delta_btb_minus": -0.04361422184998101, + "delta_ci95": [ + -0.13614677827137323, + 0.06719927914086063 + ], + "p_btb_better": 0.221 + }, + "composition ridge": { + "score_ci95": [ + 0.12284574923032972, + 0.39654256786641773 + ], + "rank_median": 2.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.2665, + "delta_btb_minus": -0.06357099515509793, + "delta_ci95": [ + -0.20471924626328933, + 0.06159341124136493 + ], + "p_btb_better": 0.142 + }, + "char 3-5-gram ridge": { + "score_ci95": [ + 0.13013627889296603, + 0.40208712510580363 + ], + "rank_median": 2.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.3125, + "delta_btb_minus": -0.07104885196240504, + "delta_ci95": [ + -0.2079801989913431, + 0.05868593852736077 + ], + "p_btb_better": 0.1345 + }, + "nearest-neighbour glycan": { + "score_ci95": [ + -0.08742707353186373, + 0.24688243161414627 + ], + "rank_median": 12.0, + "rank_ci95": [ + 3.0, + 12.0 + ], + "p_rank1": 0.0095, + "delta_btb_minus": 0.08220522259501717, + "delta_ci95": [ + -0.08155240346201399, + 0.2909551564206972 + ], + "p_btb_better": 0.852 + }, + "motif ridge (p44)": { + "score_ci95": [ + 0.10239506688401254, + 0.36522546882109536 + ], + "rank_median": 4.0, + "rank_ci95": [ + 1.0, + 11.0 + ], + "p_rank1": 0.1265, + "delta_btb_minus": -0.050431624274494546, + "delta_ci95": [ + -0.16134139416938548, + 0.06598445695441883 + ], + "p_btb_better": 0.211 + }, + "glycan-size rule (BPE tokens)": { + "score_ci95": [ + 0.09227469353444419, + 0.37172814525552617 + ], + "rank_median": 4.0, + "rank_ci95": [ + 1.0, + 12.0 + ], + "p_rank1": 0.1395, + "delta_btb_minus": -0.04567111350422837, + "delta_ci95": [ + -0.1838850472775437, + 0.09480669943239373 + ], + "p_btb_better": 0.2585 + } + }, + "secondary_test_plus_seed": { + "BERToseBind": { + "score_ci95": [ + 0.08345635222246622, + 0.29937441294278466 + ], + "rank_median": 8.0, + "rank_ci95": [ + 1.0, + 12.0 + ], + "p_rank1": 0.0305 + }, + "LectinOracle ESM-C (primary)": { + "score_ci95": [ + 0.07767034554469496, + 0.3088052101447096 + ], + "rank_median": 8.0, + "rank_ci95": [ + 1.0, + 11.0 + ], + "p_rank1": 0.036, + "delta_btb_minus": -0.01039245995439042, + "delta_ci95": [ + -0.11912997696777865, + 0.11020898829112488 + ], + "p_btb_better": 0.4515 + }, + "LectinOracle _flex": { + "score_ci95": [ + 0.0625083493409713, + 0.2864505189436178 + ], + "rank_median": 10.0, + "rank_ci95": [ + 4.0, + 12.0 + ], + "p_rank1": 0.0025, + "delta_btb_minus": 0.012614671060301508, + "delta_ci95": [ + -0.0850877500856685, + 0.12821539451113115 + ], + "p_btb_better": 0.618 + }, + "LectinOracle ESM-1b": { + "score_ci95": [ + 0.10456176771907934, + 0.3258515541626566 + ], + "rank_median": 6.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.031, + "delta_btb_minus": -0.02779423814585652, + "delta_ci95": [ + -0.1290219039807597, + 0.08482456097817342 + ], + "p_btb_better": 0.3255 + }, + "LectinOracle matched tuning": { + "score_ci95": [ + 0.09256155859865482, + 0.31443979219675516 + ], + "rank_median": 7.0, + "rank_ci95": [ + 1.0, + 11.0 + ], + "p_rank1": 0.031, + "delta_btb_minus": -0.015832483009954823, + "delta_ci95": [ + -0.1167933980106859, + 0.08584183256840364 + ], + "p_btb_better": 0.368 + }, + "GIFFLAR gifflarESM": { + "score_ci95": [ + 0.057383695081133515, + 0.2983003571299295 + ], + "rank_median": 9.0, + "rank_ci95": [ + 3.0, + 12.0 + ], + "p_rank1": 0.008, + "delta_btb_minus": 0.01399461436977184, + "delta_ci95": [ + -0.1128437340449113, + 0.1319335845109975 + ], + "p_btb_better": 0.589 + }, + "GIFFLAR sweetnetESM": { + "score_ci95": [ + 0.10820709435067695, + 0.3447887118839026 + ], + "rank_median": 5.0, + "rank_ci95": [ + 1.0, + 11.0 + ], + "p_rank1": 0.05, + "delta_btb_minus": -0.04361422184998101, + "delta_ci95": [ + -0.1514269305745274, + 0.07666796021358044 + ], + "p_btb_better": 0.243 + }, + "composition ridge": { + "score_ci95": [ + 0.12284574923032972, + 0.39654256786641773 + ], + "rank_median": 2.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.259, + "delta_btb_minus": -0.06357099515509793, + "delta_ci95": [ + -0.21127353357494535, + 0.06450243983590945 + ], + "p_btb_better": 0.148 + }, + "char 3-5-gram ridge": { + "score_ci95": [ + 0.13013627889296603, + 0.40208712510580363 + ], + "rank_median": 2.0, + "rank_ci95": [ + 1.0, + 9.024999999999864 + ], + "p_rank1": 0.2945, + "delta_btb_minus": -0.07104885196240504, + "delta_ci95": [ + -0.2087795451557328, + 0.06372114490308109 + ], + "p_btb_better": 0.1405 + }, + "nearest-neighbour glycan": { + "score_ci95": [ + -0.08742707353186373, + 0.24688243161414627 + ], + "rank_median": 12.0, + "rank_ci95": [ + 3.0, + 12.0 + ], + "p_rank1": 0.0085, + "delta_btb_minus": 0.08220522259501717, + "delta_ci95": [ + -0.08745065486792296, + 0.29558347005102525 + ], + "p_btb_better": 0.847 + }, + "motif ridge (p44)": { + "score_ci95": [ + 0.10239506688401254, + 0.36522546882109536 + ], + "rank_median": 4.0, + "rank_ci95": [ + 1.0, + 11.0 + ], + "p_rank1": 0.1165, + "delta_btb_minus": -0.050431624274494546, + "delta_ci95": [ + -0.16370509581439416, + 0.0678029002876689 + ], + "p_btb_better": 0.2165 + }, + "glycan-size rule (BPE tokens)": { + "score_ci95": [ + 0.09227469353444419, + 0.37172814525552617 + ], + "rank_median": 4.0, + "rank_ci95": [ + 1.0, + 12.0 + ], + "p_rank1": 0.1325, + "delta_btb_minus": -0.04567111350422837, + "delta_ci95": [ + -0.184213966932032, + 0.09606883431842134 + ], + "p_btb_better": 0.265 + } + }, + "welch_seed_only": { + "LectinOracle ESM-C (primary)": { + "delta": -0.01039245995439042, + "ci95": [ + -0.047085591818819425, + 0.026300671910038584 + ], + "p": 0.38709626485743254 + }, + "LectinOracle _flex": { + "delta": 0.012614671060301508, + "ci95": [ + -0.07301677354806982, + 0.09824611566867283 + ], + "p": 0.6010489361885247 + }, + "LectinOracle ESM-1b": { + "delta": -0.02779423814585652, + "ci95": [ + -0.08121496697625738, + 0.02562649068454434 + ], + "p": 0.16400871612185952 + }, + "LectinOracle matched tuning": { + "delta": -0.015832483009954823, + "ci95": [ + -0.03570850701705528, + 0.004043540997145635 + ], + "p": 0.08499443908882842 + }, + "GIFFLAR gifflarESM": { + "delta": 0.01399461436977184, + "ci95": [ + -0.08144720467032997, + 0.10943643340987365 + ], + "p": 0.6008104918014352 + }, + "GIFFLAR sweetnetESM": { + "delta": -0.04361422184998101, + "ci95": [ + -0.059095790158922676, + -0.028132653541039342 + ], + "p": 0.002109215799520392 + } + }, + "pooled_E4": { + "point": { + "BERToseBind": 0.20301446590351957, + "LectinOracle ESM-C (primary)": 0.20907991263250447 + }, + "ci95": { + "BERToseBind": [ + 0.08246077904615426, + 0.31816115831059805 + ], + "LectinOracle ESM-C (primary)": [ + 0.0882215136498559, + 0.31970213263648534 + ] + }, + "delta_btb_minus_lo": -0.006065446728984902, + "delta_ci95": [ + -0.10288120882127332, + 0.09931149204034828 + ], + "p_btb_better": 0.45 + } + } + }, + "status": "COMPLETE" +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f1a273c6ec251a58f2c0927c3c4dd5e611db12f4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml @@ -0,0 +1,33 @@ +# GIFFLAR LGI on OUR split, OUR protein encoder. Generated by make_gifflar_configs.py. +# arm: A_glycan +seed: 42 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + # gnngly is NOT listed: lgi_model.py:20-24 maps only gifflar / sweetnet / glylm. + - name: gifflar + feat_dim: 128 + hidden_dim: 1024 + num_layers: 8 + pooling: global_mean + - name: sweetnet + feat_dim: 128 + hidden_dim: 1024 + num_layers: 16 + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M (facebook/esm2_t33_650M_UR50D), layer 33, + # mean-pooled -- protein_encoding.py:43-50, EMBED_SIZES["ESM"]=1280. + # Each tool runs on the representation ITS codebase specifies; Affinose runs on ESM-C 300M + # because that is Affinose's. The encoder difference is DISCLOSED, not engineered away. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1d9ae1c709e8de62d11fda2429484cef1e34fa2f --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml @@ -0,0 +1,30 @@ +# GIFFLAR LGI, arm A_glycan, gifflar ONLY, seed 43. Seed-variance replicate (2026-09-25). +# +# Identical to ours_A_glycan.yaml except: ONE glycan encoder, seed 43, and its OWN logs_dir. +# ⛔ The own logs_dir is load-bearing: gifflar_launch.py resumes ANY incomplete version_* it finds +# under logs_dir, so sharing one would let this run hijack another's checkpoints. +# ✅ root_dir is SHARED on purpose: the processed dataset name is hash_dict(pre-transforms) only +# (gifflar/train.py:251), which is seed-independent, so the existing preprocessing is reused. +seed: 43 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + - name: gifflar + feat_dim: 128 + hidden_dim: 1024 + num_layers: 8 + pooling: global_mean + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M, layer 33, mean-pooled. Unchanged. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml new file mode 100644 index 0000000000000000000000000000000000000000..381f2503f6edcb628276e0aa5f10d9b9e4f7dab9 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml @@ -0,0 +1,29 @@ +# GIFFLAR LGI, arm A_glycan, sweetnet ONLY, seed 43. Seed-variance replicate (2026-09-25). +# +# Identical to ours_A_glycan.yaml except: ONE glycan encoder, seed 43, and its OWN logs_dir. +# ⛔ The own logs_dir is load-bearing: gifflar_launch.py resumes ANY incomplete version_* it finds +# under logs_dir, so sharing one would let this run hijack another's checkpoints. +# ✅ root_dir is SHARED on purpose: the processed dataset name is hash_dict(pre-transforms) only +# (gifflar/train.py:251), which is seed-independent, so the existing preprocessing is reused. +seed: 43 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + - name: sweetnet + feat_dim: 128 + hidden_dim: 1024 + num_layers: 16 + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M, layer 33, mean-pooled. Unchanged. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d65193432d6803e51d3a91a59ed8892811350628 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml @@ -0,0 +1,30 @@ +# GIFFLAR LGI, arm A_glycan, gifflar ONLY, seed 44. Seed-variance replicate (2026-09-25). +# +# Identical to ours_A_glycan.yaml except: ONE glycan encoder, seed 44, and its OWN logs_dir. +# ⛔ The own logs_dir is load-bearing: gifflar_launch.py resumes ANY incomplete version_* it finds +# under logs_dir, so sharing one would let this run hijack another's checkpoints. +# ✅ root_dir is SHARED on purpose: the processed dataset name is hash_dict(pre-transforms) only +# (gifflar/train.py:251), which is seed-independent, so the existing preprocessing is reused. +seed: 44 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + - name: gifflar + feat_dim: 128 + hidden_dim: 1024 + num_layers: 8 + pooling: global_mean + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M, layer 33, mean-pooled. Unchanged. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml new file mode 100644 index 0000000000000000000000000000000000000000..35493b4bbbab4b7aca77ac317c2c8de88fe1cd0c --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml @@ -0,0 +1,29 @@ +# GIFFLAR LGI, arm A_glycan, sweetnet ONLY, seed 44. Seed-variance replicate (2026-09-25). +# +# Identical to ours_A_glycan.yaml except: ONE glycan encoder, seed 44, and its OWN logs_dir. +# ⛔ The own logs_dir is load-bearing: gifflar_launch.py resumes ANY incomplete version_* it finds +# under logs_dir, so sharing one would let this run hijack another's checkpoints. +# ✅ root_dir is SHARED on purpose: the processed dataset name is hash_dict(pre-transforms) only +# (gifflar/train.py:251), which is seed-independent, so the existing preprocessing is reused. +seed: 44 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + - name: sweetnet + feat_dim: 128 + hidden_dim: 1024 + num_layers: 16 + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M, layer 33, mean-pooled. Unchanged. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1c818540554eb1a4194ae41f5cfc17b29cf6099f --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml @@ -0,0 +1,33 @@ +# GIFFLAR LGI on OUR split, OUR protein encoder. Generated by make_gifflar_configs.py. +# arm: B_protein +seed: 42 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + # gnngly is NOT listed: lgi_model.py:20-24 maps only gifflar / sweetnet / glylm. + - name: gifflar + feat_dim: 128 + hidden_dim: 1024 + num_layers: 8 + pooling: global_mean + - name: sweetnet + feat_dim: 128 + hidden_dim: 1024 + num_layers: 16 + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M (facebook/esm2_t33_650M_UR50D), layer 33, + # mean-pooled -- protein_encoding.py:43-50, EMBED_SIZES["ESM"]=1280. + # Each tool runs on the representation ITS codebase specifies; Affinose runs on ESM-C 300M + # because that is Affinose's. The encoder difference is DISCLOSED, not engineered away. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9d97d3c599eb7c663283b34393ed95b872333deb --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml @@ -0,0 +1,30 @@ +# GIFFLAR LGI, arm B_protein, gifflar ONLY, seed 43. Seed-variance replicate (2026-09-25). +# +# Identical to ours_B_protein.yaml except: ONE glycan encoder, seed 43, and its OWN logs_dir. +# ⛔ The own logs_dir is load-bearing: gifflar_launch.py resumes ANY incomplete version_* it finds +# under logs_dir, so sharing one would let this run hijack another's checkpoints. +# ✅ root_dir is SHARED on purpose: the processed dataset name is hash_dict(pre-transforms) only +# (gifflar/train.py:251), which is seed-independent, so the existing preprocessing is reused. +seed: 43 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + - name: gifflar + feat_dim: 128 + hidden_dim: 1024 + num_layers: 8 + pooling: global_mean + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M, layer 33, mean-pooled. Unchanged. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml new file mode 100644 index 0000000000000000000000000000000000000000..06ccaee8a26838e4f25c66d03d18af2f93f0c3d8 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml @@ -0,0 +1,29 @@ +# GIFFLAR LGI, arm B_protein, sweetnet ONLY, seed 43. Seed-variance replicate (2026-09-25). +# +# Identical to ours_B_protein.yaml except: ONE glycan encoder, seed 43, and its OWN logs_dir. +# ⛔ The own logs_dir is load-bearing: gifflar_launch.py resumes ANY incomplete version_* it finds +# under logs_dir, so sharing one would let this run hijack another's checkpoints. +# ✅ root_dir is SHARED on purpose: the processed dataset name is hash_dict(pre-transforms) only +# (gifflar/train.py:251), which is seed-independent, so the existing preprocessing is reused. +seed: 43 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + - name: sweetnet + feat_dim: 128 + hidden_dim: 1024 + num_layers: 16 + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M, layer 33, mean-pooled. Unchanged. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml new file mode 100644 index 0000000000000000000000000000000000000000..635f0acc02d99875cefdd591ba500e072c5ca5a4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml @@ -0,0 +1,30 @@ +# GIFFLAR LGI, arm B_protein, gifflar ONLY, seed 44. Seed-variance replicate (2026-09-25). +# +# Identical to ours_B_protein.yaml except: ONE glycan encoder, seed 44, and its OWN logs_dir. +# ⛔ The own logs_dir is load-bearing: gifflar_launch.py resumes ANY incomplete version_* it finds +# under logs_dir, so sharing one would let this run hijack another's checkpoints. +# ✅ root_dir is SHARED on purpose: the processed dataset name is hash_dict(pre-transforms) only +# (gifflar/train.py:251), which is seed-independent, so the existing preprocessing is reused. +seed: 44 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + - name: gifflar + feat_dim: 128 + hidden_dim: 1024 + num_layers: 8 + pooling: global_mean + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M, layer 33, mean-pooled. Unchanged. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8f0bbefeceff1f2594fca6e95ed6c9fb055853fb --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml @@ -0,0 +1,29 @@ +# GIFFLAR LGI, arm B_protein, sweetnet ONLY, seed 44. Seed-variance replicate (2026-09-25). +# +# Identical to ours_B_protein.yaml except: ONE glycan encoder, seed 44, and its OWN logs_dir. +# ⛔ The own logs_dir is load-bearing: gifflar_launch.py resumes ANY incomplete version_* it finds +# under logs_dir, so sharing one would let this run hijack another's checkpoints. +# ✅ root_dir is SHARED on purpose: the processed dataset name is hash_dict(pre-transforms) only +# (gifflar/train.py:251), which is seed-independent, so the existing preprocessing is reused. +seed: 44 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + - name: sweetnet + feat_dim: 128 + hidden_dim: 1024 + num_layers: 16 + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M, layer 33, mean-pooled. Unchanged. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml new file mode 100644 index 0000000000000000000000000000000000000000..73507af6e3a80db76d639463daa541e82e41ba3c --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml @@ -0,0 +1,33 @@ +# GIFFLAR LGI on OUR split, OUR protein encoder. Generated by make_gifflar_configs.py. +# arm: C_doubly +seed: 42 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + # gnngly is NOT listed: lgi_model.py:20-24 maps only gifflar / sweetnet / glylm. + - name: gifflar + feat_dim: 128 + hidden_dim: 1024 + num_layers: 8 + pooling: global_mean + - name: sweetnet + feat_dim: 128 + hidden_dim: 1024 + num_layers: 16 + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M (facebook/esm2_t33_650M_UR50D), layer 33, + # mean-pooled -- protein_encoding.py:43-50, EMBED_SIZES["ESM"]=1280. + # Each tool runs on the representation ITS codebase specifies; Affinose runs on ESM-C 300M + # because that is Affinose's. The encoder difference is DISCLOSED, not engineered away. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9f6379af723595327ed4409128fc1f0c15197db5 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml @@ -0,0 +1,30 @@ +# GIFFLAR LGI, arm C_doubly, gifflar ONLY, seed 43. Seed-variance replicate (2026-09-25). +# +# Identical to ours_C_doubly.yaml except: ONE glycan encoder, seed 43, and its OWN logs_dir. +# ⛔ The own logs_dir is load-bearing: gifflar_launch.py resumes ANY incomplete version_* it finds +# under logs_dir, so sharing one would let this run hijack another's checkpoints. +# ✅ root_dir is SHARED on purpose: the processed dataset name is hash_dict(pre-transforms) only +# (gifflar/train.py:251), which is seed-independent, so the existing preprocessing is reused. +seed: 43 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + - name: gifflar + feat_dim: 128 + hidden_dim: 1024 + num_layers: 8 + pooling: global_mean + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M, layer 33, mean-pooled. Unchanged. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml new file mode 100644 index 0000000000000000000000000000000000000000..78dd3eabecd941b3b50980db76f6b3d565800735 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml @@ -0,0 +1,29 @@ +# GIFFLAR LGI, arm C_doubly, sweetnet ONLY, seed 43. Seed-variance replicate (2026-09-25). +# +# Identical to ours_C_doubly.yaml except: ONE glycan encoder, seed 43, and its OWN logs_dir. +# ⛔ The own logs_dir is load-bearing: gifflar_launch.py resumes ANY incomplete version_* it finds +# under logs_dir, so sharing one would let this run hijack another's checkpoints. +# ✅ root_dir is SHARED on purpose: the processed dataset name is hash_dict(pre-transforms) only +# (gifflar/train.py:251), which is seed-independent, so the existing preprocessing is reused. +seed: 43 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + - name: sweetnet + feat_dim: 128 + hidden_dim: 1024 + num_layers: 16 + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M, layer 33, mean-pooled. Unchanged. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8ed6c0243494652dcd6798aaca3665c68b73f6e7 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml @@ -0,0 +1,30 @@ +# GIFFLAR LGI, arm C_doubly, gifflar ONLY, seed 44. Seed-variance replicate (2026-09-25). +# +# Identical to ours_C_doubly.yaml except: ONE glycan encoder, seed 44, and its OWN logs_dir. +# ⛔ The own logs_dir is load-bearing: gifflar_launch.py resumes ANY incomplete version_* it finds +# under logs_dir, so sharing one would let this run hijack another's checkpoints. +# ✅ root_dir is SHARED on purpose: the processed dataset name is hash_dict(pre-transforms) only +# (gifflar/train.py:251), which is seed-independent, so the existing preprocessing is reused. +seed: 44 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + - name: gifflar + feat_dim: 128 + hidden_dim: 1024 + num_layers: 8 + pooling: global_mean + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M, layer 33, mean-pooled. Unchanged. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ab3acdd6d05789d35ddd152b544897837780ca30 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml @@ -0,0 +1,29 @@ +# GIFFLAR LGI, arm C_doubly, sweetnet ONLY, seed 44. Seed-variance replicate (2026-09-25). +# +# Identical to ours_C_doubly.yaml except: ONE glycan encoder, seed 44, and its OWN logs_dir. +# ⛔ The own logs_dir is load-bearing: gifflar_launch.py resumes ANY incomplete version_* it finds +# under logs_dir, so sharing one would let this run hijack another's checkpoints. +# ✅ root_dir is SHARED on purpose: the processed dataset name is hash_dict(pre-transforms) only +# (gifflar/train.py:251), which is seed-independent, so the existing preprocessing is reused. +seed: 44 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + - name: sweetnet + feat_dim: 128 + hidden_dim: 1024 + num_layers: 16 + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M, layer 33, mean-pooled. Unchanged. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_sweetonly.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_sweetonly.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9cd6878bc302c6f3443100a227c1cbbb71778cf7 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_sweetonly.yaml @@ -0,0 +1,38 @@ +# GIFFLAR LGI, arm C_doubly, SWEETNET ONLY. +# +# WHY THIS FILE EXISTS. ours_C_doubly.yaml declares TWO glycan encoders. gifflarESM is already +# complete (3 versions, newest scored 0.2354 pooled / 0.1192 macro); sweetnetESM has never run. +# The launcher's only route to a missing variant is its "start fresh" path, which hands the whole +# config to main() and retrains EVERY declared variant -- that is what burned ~8h on arm B +# retraining a gifflarESM run we already had. +# +# Declaring only sweetnet makes main() train only sweetnet. Everything else is byte-identical to +# ours_C_doubly.yaml: same seed, same root_dir, same origin pickle, same lectin encoder, same +# hyperparameters. So the resulting run is directly comparable to arms A and B's sweetnetESM. +# +# ⛔ Do NOT point root_dir elsewhere -- the processed dataset under +# gifflar_lgi_C_doubly/interaction_benchmark_8b34af2a/ is already built and must be reused, or this +# costs hours of preprocessing on top. +seed: 42 +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/interaction_benchmark.pkl +add_valid: [] + +model: + glycan_encoder: + - name: sweetnet + feat_dim: 128 + hidden_dim: 1024 + num_layers: 16 + + lectin_encoder: + # GIFFLAR's OWN protein encoder: ESM-2 650M, layer 33, mean-pooled. Unchanged from the + # two-variant config so the comparison is unaffected. + - name: ESM + layer_num: 33 + + batch_size: 128 + epochs: 50 + learning_rate: 0.001 + optimizer: Adam diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/data/utils.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/data/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..8bb3f74cf994e1ece49529f5ce6a9537485a8064 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/data/utils.py @@ -0,0 +1,183 @@ +import copy +import pickle +from pathlib import Path +from typing import Optional + +import glyles +import networkx as nx +from glyles.glycans.factory.factory import MonomerFactory +from glyles.glycans.poly.merger import Merger +from rdkit import Chem +from torch_geometric.data import HeteroData +from rdkit.Chem import rdDepictor, BondType + + +def nx2mol(G: nx.Graph, sanitize=True) -> Chem.Mol: + """ + Convert a molecules from a networkx.Graph to RDKit. + + Args: + G: The graph representing a molecule + sanitize: A bool flag indicating to sanitize the resulting molecule (should be True for "production mode" and + False when debugging this function) + + Returns: + The converted, sanitized molecules in RDKit represented by the input graph + """ + # Create the molecule + mol = Chem.RWMol() + + # Extract the node attributes + atomic_nums = nx.get_node_attributes(G, 'atomic_num') + chiral_tags = nx.get_node_attributes(G, 'chiral_tag') + formal_charges = nx.get_node_attributes(G, 'formal_charge') + node_is_aromatics = nx.get_node_attributes(G, 'is_aromatic') + mono_ids = nx.get_node_attributes(G, 'mono_id') + + # Create all atoms based on their representing nodes + node_to_idx = {} + for node in G.nodes(): + a = Chem.Atom(atomic_nums[node]) + a.SetChiralTag(chiral_tags[node]) + a.SetFormalCharge(formal_charges[node]) + a.SetIsAromatic(node_is_aromatics[node]) + a.SetIntProp("mono_id", mono_ids[node]) + idx = mol.AddAtom(a) + node_to_idx[node] = idx + + # Extract the edge attributes + bond_types = nx.get_edge_attributes(G, 'bond_type') + mono_bond_ids = nx.get_edge_attributes(G, 'mono_id') + + # Connect the atoms based on the edges from the graph + for edge in G.edges(): + first, second = edge + ifirst = node_to_idx[first] + isecond = node_to_idx[second] + bond_type = bond_types[first, second] + mono_idx = mono_bond_ids[first, second] + idx = mol.AddBond(ifirst, isecond, bond_type) - 1 + mol.GetBondWithIdx(idx).SetIntProp("mono_id", mono_idx) + + # print(Chem.MolToSmiles(mol)) + if sanitize: + Chem.SanitizeMol(mol) + return mol + + +def clean_tree(tree: nx.Graph) -> Optional[nx.Graph]: + """ + Clean the tree from unnecessary node features and store only the IUPAC name. + + Args: + tree: The tree to clean + + Returns: + The cleaned tree + """ + for node in tree.nodes: + attributes = copy.deepcopy(tree.nodes[node]) + if "type" in attributes and isinstance(attributes["type"], glyles.glycans.mono.monomer.Monomer): + tree.nodes[node].clear() + tree.nodes[node].update({"iupac": "".join([x[0] for x in attributes["type"].recipe]), + "name": attributes["type"].name, "recipe": attributes["type"].recipe}) + else: + return None + return tree + + +def iupac2mol(iupac: str) -> Optional[HeteroData]: + """ + Convert a glycan stored given as IUPAC-condensed string into an RDKit molecule while keeping the information of + which atom and which bond belongs to which monosaccharide. + + Args: + iupac: The IUPAC-condensed string of the glycan to convert + + Returns: + A HeteroData object containing the IUPAC string, the SMILES representation, the RDKit molecule, and the + monosaccharide tree + """ + # convert the IUPAC string using GlyLES + glycan = glyles.Glycan(iupac) + # print(glycan.get_smiles()) + + # get it's underlying monosaccharide-tree + tree = glycan.parse_tree + + # re-merge the monosaccharide tree using networkx graphs to keep the assignment of atoms and bonds to monosacchs. + _, merged = Merger(MonomerFactory()).merge(tree, glycan.root_orientation, glycan.start, smiles_only=False) + mol = nx2mol(merged) + + if not mol.GetNumConformers(): + rdDepictor.Compute2DCoords(mol) + Chem.WedgeMolBonds(mol, mol.GetConformer()) + + smiles = Chem.MolToSmiles(mol) + if len(smiles) < 10 or not isinstance(tree, nx.Graph): + return None + + tree = clean_tree(tree) + + data = HeteroData() + data["IUPAC"] = iupac + data["smiles"] = smiles + data["mol_block"] = Chem.MolToMolBlock(mol) + data["tree"] = tree + return data + + +class GlycanStorage: + def __init__(self, path: Path | str | None = None): + """ + Initialize the wrapper around a dict. + + Args: + path: Path to the directory. If there's a glycan_storage.pkl, it will be used to fill this object, + otherwise, such file will be created. + """ + self.path = Path(path or "data") / "glycan_storage.pkl" + + # Fill the storage from the file + self.data = self._load() + + def close(self) -> None: + """ + Close the storage by storing the dictionary at the location provided at initialization. + """ + with open(self.path, "wb") as out: + pickle.dump(self.data, out) + + def query(self, iupac: str) -> Optional[HeteroData]: + """ + Query the storage for a IUPAC string. + + Args: + iupac: The IUPAC string of the query glycan + + Returns: + A HeteroData object corresponding to the IUPAC string or None, if the IUPAC string could not be processed. + """ + if iupac not in self.data: + try: + self.data[iupac] = iupac2mol(iupac) + except Exception as e: + self.data[iupac] = None + result = copy.deepcopy(self.data[iupac]) + # Convert mol_block back to mol object for downstream use + if result is not None and "mol_block" in result: + mol_block = result.pop("mol_block") + result["mol"] = Chem.MolFromMolBlock(mol_block) + return result + + def _load(self) -> dict[str, Optional[HeteroData]]: + """ + Load the internal dictionary from the file, if it exists, otherwise, return an empty dict. + + Returns: + The loaded (if possible) or an empty dictionary + """ + if self.path.exists(): + with open(self.path, "rb") as f: + return pickle.load(f) + return {} diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/train.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/train.py new file mode 100644 index 0000000000000000000000000000000000000000..6ee888eb088689d6b3eebed1136c2cd094ecaeaa --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/train.py @@ -0,0 +1,271 @@ +from pathlib import Path +from typing import Any +import time + +import torch +import yaml +from jsonargparse import ArgumentParser +import pytorch_lightning as pl +from pytorch_lightning import Trainer +from pytorch_lightning.callbacks import RichProgressBar, RichModelSummary, ModelCheckpoint +from pytorch_lightning.loggers import CSVLogger, Logger +from torch_geometric import seed_everything + +from gifflar.data.modules import DownstreamGDM, PretrainGDM +from gifflar.model.baselines.gnngly import GNNGLY +from gifflar.model.baselines.mlp import MLP +from gifflar.model.baselines.rgcn import RGCN +from gifflar.model.baselines.sweetnet import SweetNetLightning +from gifflar.benchmarks import get_dataset +from gifflar.model.downstream import DownstreamGGIN +from gifflar.model.glylm import GlycanLM +from gifflar.model.pretrain import PretrainGGIN +from gifflar.pretransforms import get_pretransforms +from gifflar.transforms import get_transforms +from gifflar.utils import get_sl_model, get_metrics, read_yaml_config, hash_dict, unfold_config + +torch.multiprocessing.set_sharing_strategy('file_system') + +MODELS = { + "gifflar": DownstreamGGIN, + "gnngly": GNNGLY, + "mlp": MLP, + "rgcn": RGCN, + "sweetnet": SweetNetLightning, + "glylm": GlycanLM, +} + + +class EpochProgressCallback(pl.Callback): + """Simple stdout logger for SLURM jobs where RichProgressBar is invisible.""" + def on_train_epoch_end(self, trainer, pl_module): + metrics = trainer.callback_metrics + val_loss = metrics.get("val/loss", None) + val_loss_str = f"{val_loss:.4f}" if val_loss is not None else "N/A" + print(f" Epoch {trainer.current_epoch}/{trainer.max_epochs} | val_loss={val_loss_str}", flush=True) + + def on_test_end(self, trainer, pl_module): + metrics = trainer.callback_metrics + parts = [] + for k, v in sorted(metrics.items()): + if "test" in k: + parts.append(f"{k}={v:.4f}") + if parts: + print(f" TEST RESULTS: {' | '.join(parts)}", flush=True) + + +def setup(count: int = 4, **kwargs: Any) -> tuple[dict, DownstreamGDM, Logger | None, dict | None]: + """ + Set up the training environment. + + Params: + count: The number of outputs needed. + kwargs: The configuration for the training. + + Returns: + data_config: The configuration for the data. + datamodule: The datamodule for the training. + logger: The logger for the training. + metrics: The metrics for the training + """ + seed_everything(kwargs["seed"]) + + # set up the data module + data_config = get_dataset(kwargs["dataset"], kwargs["root_dir"]) + datamodule = DownstreamGDM( + root=kwargs["root_dir"], filename=data_config["filepath"], hash_code=kwargs["hash"], + batch_size=kwargs["model"].get("batch_size", 1), transform=None, + pre_transform=get_pretransforms(data_config["name"], **(kwargs.get("pre-transforms", None) or {})), **data_config, + ) + data_config["num_classes"] = datamodule.train.dataset_args["num_classes"] + kwargs["dataset"]["filepath"] = str(data_config["filepath"]) + + if count == 2: + return data_config, datamodule, None, None + + # set up the logger + logger = CSVLogger(kwargs["logs_dir"], name=kwargs["model"]["name"] + (kwargs["model"].get("suffix", None) or "")) + logger.log_hyperparams(kwargs) + + if count == 3: + return data_config, datamodule, logger, None + + # set up the metrics + metrics = get_metrics(data_config["task"], data_config["num_classes"]) + + return data_config, datamodule, logger, metrics + + +def fit(**kwargs: Any) -> None: + """ + Fit a statistical learning model. + + Params: + kwargs: The configuration for the training. + """ + data_config, datamodule, logger, metrics = setup(**kwargs) + + # initialize the model and extract the data + model = get_sl_model(kwargs["model"]["name"], data_config["task"], data_config["num_classes"], **kwargs) + train_X, train_y, train_yoh = datamodule.train.to_statistical_learning() + + # fit the model + start = time.time() + model.fit(train_X, train_yoh if data_config["task"] == "multilabel" else train_y) + print("Training took", time.time() - start, "s") + + # evaluate the model on all splits + for X, y, yoh, name in [ + (train_X, train_y, train_yoh, "train"), + (*datamodule.val.to_statistical_learning(), "val"), + (*datamodule.test.to_statistical_learning(), "test"), + ]: + labels = torch.tensor( + yoh if data_config["task"] == "multilabel" else y, + dtype=torch.long if data_config["task"] not in {"regression", "spectrum"} else torch.float + ) + + preds = torch.tensor(model.predict_proba(X) if data_config["task"] in {"classification", "multilabel"} else + model.predict(X), dtype=torch.float) + + if data_config["task"] == "classification": + if data_config["num_classes"] > 1: + labels = labels[:, 0] + if kwargs["model"]["name"] == "xgb": + preds = preds[0] + else: + preds = preds[:, 1] + labels = labels.reshape(-1) + elif data_config["task"] == "multilabel" and len(preds.shape) == 3: + preds = preds[:, :, 1].T + elif data_config["num_classes"] == 1: + preds = preds.reshape(labels.shape) + elif data_config["task"] != "spectrum": + preds = preds.reshape(-1) + labels = labels.reshape(-1) + + metrics[name].update(preds, labels) + logger.log_metrics(metrics[name].compute()) + logger.save() + + +def train(**kwargs: Any) -> None: + """ + Train a deep learning model. + + Params: + kwargs: The configuration for the training. + """ + data_config, datamodule, logger, _ = setup(3, **kwargs) + model = MODELS[kwargs["model"]["name"]](output_dim=data_config["num_classes"], task=data_config["task"], + pre_transform_args=kwargs.get("pre-transforms", {}), **kwargs["model"]) + print("Using device", "CUDA" if torch.cuda.is_available() else "CPU") + trainer = Trainer( + callbacks=[ + RichModelSummary(), + RichProgressBar(), + EpochProgressCallback(), + ], + max_epochs=kwargs["model"]["epochs"], + logger=logger, + # limit_train_batches=3, + # limit_val_batches=3, + # accelerator="cpu", + ) + start = time.time() + trainer.fit(model, datamodule) + print("Training took", time.time() - start, "s") + + # Evaluate on test set + trainer.test(model, datamodule) + + +def pretrain(**kwargs: Any) -> None: + """ + Pretrain a deep learning model. + + Params: + kwargs: The configuration for the training. + """ + transforms, task_list = get_transforms(kwargs.get("transforms", [])) + datamodule = PretrainGDM( + file_path=kwargs["file_path"], hash_code=kwargs["hash"], batch_size=kwargs["model"].get("batch_size", 1), + transform=transforms, pre_transform=get_pretransforms(**(kwargs.get("pre-transforms", None) or {})), + ) + model = PretrainGGIN(tasks=task_list, pre_transform_args=kwargs["pre-transforms"], **kwargs["model"]) + + # set up the logger + logger = CSVLogger(kwargs["logs_dir"], + name=kwargs["model"]["name"] + (kwargs["model"].get("suffix", None) or "") + "_pretrain") + logger.log_hyperparams(kwargs) + + trainer = Trainer( + devices=[1], + callbacks=[ + ModelCheckpoint(save_top_k=-1), + RichModelSummary(), + RichProgressBar(), + ], + max_epochs=kwargs["model"]["epochs"], + logger=logger, + ) + trainer.fit(model, datamodule) + + +def embed(prep_args: dict[str, str], **kwargs: Any) -> None: + """ + Embed the data using a pretrained model. + + Params: + prep_args: The configuration for the pretraining. + model_name: The name of the model. + hparams_path: The path to the hyperparameters. + ckpt_path: The path to the checkpoint. + pkl_dir: The directory to save the embeddings. + kwargs: The configuration for the training. + """ + output_name = (Path(prep_args["save_dir"]) / + f"{kwargs['dataset']['name']}_{prep_args['name']}_{hash_dict(prep_args, 8)}") + if output_name.exists(): + return + else: + output_name.mkdir(parents=True) + + with open(prep_args["hparams_path"], "r") as file: + config = yaml.load(file, Loader=yaml.FullLoader) + model = PretrainGGIN(**config["model"], tasks=None, pre_transform_args=kwargs.get("pre-transforms", {}), save_dir=output_name) + if torch.cuda.is_available(): + model.load_state_dict(torch.load(prep_args["ckpt_path"])["state_dict"]) + else: + model.load_state_dict(torch.load(prep_args["ckpt_path"], map_location=torch.device("cpu"))["state_dict"]) + model.eval() + + data_config, data, _, _ = setup(2, **kwargs) + trainer = Trainer() + trainer.predict(model, data.predict_dataloader()) + + +def main(config: str | Path) -> None: + """Main routine starting (pre-)training and embedding data using a pretrained model.""" + custom_args = read_yaml_config(config) + custom_args["hash"] = hash_dict(custom_args.get("pre-transforms", {})) + if "root_dir" in custom_args: + for args in unfold_config(custom_args): + print(args) + if "prepare" in args: + embed(args["prepare"], **args) + else: + if args["model"]["name"] in ["rf", "svm", "xgb"]: + fit(**args) + else: + train(**args) + print("Finished training", args["model"]["name"], "on", args["dataset"]["name"]) + else: + pretrain(**custom_args) + print("Finished pretraining GIFFLAR on", custom_args["file_path"]) + + +if __name__ == '__main__': + parser = ArgumentParser() + parser.add_argument("config", type=str, help="Path to YAML config file") + main(parser.parse_args().config) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gif_seeds.sbatch b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gif_seeds.sbatch new file mode 100644 index 0000000000000000000000000000000000000000..e86f1d4e11fffc8b916ecddb7bfd15d319ec8597 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gif_seeds.sbatch @@ -0,0 +1,53 @@ +#!/bin/bash +#SBATCH --job-name=aff_gseed +#SBATCH --partition=nova +#SBATCH --account=ratul +#SBATCH --qos=normal +#SBATCH --requeue +#SBATCH --array=0-11 +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=8 +#SBATCH --mem=64G +#SBATCH --gres=gpu:1 +#SBATCH --constraint=a100 +#SBATCH --time=36:00:00 +#SBATCH --output=/work/ratul1/supantha/Bertint/logs/aff_gseed_%A_%a.out +#SBATCH --error=/work/ratul1/supantha/Bertint/logs/aff_gseed_%A_%a.err +# +# GIFFLAR LGI seeds 43 + 44 for all 3 arms x 2 glycan encoders (12 runs), so GIFFLAR carries a +# three-seed mean and a CI like every other learned model in the comparison (owner, 2026-09-25). +# Seed 42 already exists for all six arm/variant pairs and is NOT rerun. +# +# ⛔ One config per task, each declaring ONE encoder and its OWN logs_dir, so no task can resume +# or overwrite another's run (the launcher resumes any incomplete version_* under logs_dir). +# ⛔ --constraint=a100: seed 42 of every arm/variant trained on A100; a seed replicate on another +# architecture would add hardware drift to the very variance it is meant to measure. +# ⛔ --time=36:00: one variant takes ~11:46 and Requeue does NOT recover a walltime TIMEOUT. +# ⚠ NEVER judge liveness from this log -- RichProgressBar writes nothing to a non-TTY stream. +# Liveness = logs_s_/LGI_*/version_*/weights/last.ckpt mtime + metrics.csv rows. +set -uo pipefail +G=/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR +PY=/work/ratul1/supantha/conda/gifflar/bin/python +export HF_HOME=/work/ratul1/supantha/hf_cache +export PYTHONNOUSERSITE=1 +LIST=/work/ratul1/supantha/Bertint/gifflar_seed_configs.txt + +CFG=$(sed -n "$(( SLURM_ARRAY_TASK_ID + 1 ))p" "$LIST") +test -n "$CFG" && test -f "$CFG" || { echo "FATAL: no config for task $SLURM_ARRAY_TASK_ID"; exit 1; } +N=$(grep -cE "^ - name: (gifflar|sweetnet)$" "$CFG") +[ "$N" = "1" ] || { echo "FATAL: $CFG declares $N glycan encoders, need exactly 1"; exit 1; } +grep -q "^logs_dir: .*/logs_s4[34]_" "$CFG" || { echo "FATAL: $CFG lacks its own seed logs_dir"; exit 1; } +# the shared ESM-2 cache; if absent GIFFLAR silently builds an EMPTY one and feeds zero proteins +test -s "$G/data/ESM_33.pkl" || { echo "FATAL: ESM cache missing at $G/data/ESM_33.pkl"; exit 1; } + +hostname; nvidia-smi --query-gpu=name,memory.total --format=csv,noheader || true +if ! $PY -c "import torch,sys; sys.exit(0 if torch.cuda.is_available() else 1)"; then + echo "FATAL: CUDA unavailable on ${SLURMD_NODENAME} despite a GPU allocation." + echo "Resubmit with --exclude=${SLURMD_NODENAME}" + exit 1 +fi +echo "config: $CFG" +cd /work/ratul1/supantha/Bertint +$PY -u gifflar_launch.py "$CFG" || { echo "FATAL: GIFFLAR training failed for $CFG"; exit 1; } +echo "===== done: $CFG =====" diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_launch.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_launch.py new file mode 100644 index 0000000000000000000000000000000000000000..ea02e87a6ef2a4267ec307cf52c0ff9832786b4f --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_launch.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python3 +"""Launch GIFFLAR LGI without modifying a single line of GIFFLAR. + +TWO SEPARATE PROBLEMS, both in GIFFLAR's own packaging, both solved from outside the repo. + +⛔ PROBLEM 1 -- a namespace collision. GIFFLAR ships a DATA directory at `GIFFLAR/datasets/` +(.tsv and .csv, no `__init__.py`). Python treats such a directory as a namespace package, so the +moment GIFFLAR joins `sys.path` -- which it must, for `import gifflar` and `import experiments` -- +a plain `import datasets` resolves to that data folder. PYTHONPATH cannot fix this: its entries go +BEFORE site-packages, which keeps the shadowing in place. + +⛔ PROBLEM 2 -- a genuinely missing dependency. HuggingFace `datasets` is NOT installed in the +`gifflar` environment AND is NOT listed in GIFFLAR's own `requirements.txt` (torch, +torch_geometric, pytorch-lightning, torchmetrics, transformers). So the import fails outright, +not merely to the wrong module. + +WHY THAT BREAKS US EVEN THOUGH WE NEVER USE IT. The chain is unconditional: + + experiments/lgi_model.py:15 from gifflar.model.glylm import GlycanLM # registry entry + gifflar/model/glylm.py -> gifflar/train_lm.py + gifflar/train_lm.py:7 from datasets import load_dataset + +`glylm` is one of several selectable glycan encoders. We select `gifflar` and `sweetnet`, never +`glylm` -- but the registry is built at import time, so the import runs regardless. + +THE FIX, and why a stub rather than an install. `load_dataset` is called in exactly ONE place, +`train_lm.py:43`, to build a text corpus for glycan language-model PRETRAINING -- a code path +reachable only by selecting `glylm`. Installing real `datasets` would drag pyarrow/fsspec pins into +a shared environment for a dependency the authors never declared, risking their `transformers`. +Instead we register a stub module whose `load_dataset` RAISES. The import succeeds, the registry +builds, and if anything ever actually reaches that path the run dies loudly instead of silently +doing something else. + +⚠ The stub is only installed when the real library is absent. If `datasets` is ever installed +properly, it is used and the stub never appears. +""" +import os +import sys +import types + +G = ("/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/" + "bench/models/GIFFLAR") + +# --------------------------------------------------------------------------------------------- +# 1. Resolve `datasets` BEFORE GIFFLAR can shadow it: real library if present, loud stub if not. +# --------------------------------------------------------------------------------------------- +_STUBBED = False +try: + import datasets # noqa: F401 + if not getattr(datasets, "__file__", None) or "site-packages" not in datasets.__file__: + raise ImportError("resolved to %r, not an installed library" + % getattr(datasets, "__file__", None)) + from datasets import load_dataset # noqa: F401 + print("[launch] datasets: REAL -> %s" % datasets.__file__, flush=True) +except (ImportError, ModuleNotFoundError) as _e: + import importlib.machinery + + _stub = types.ModuleType("datasets") + _stub.__file__ = "" + _stub.__affinose_stub__ = True + # ⛔ The stub MUST carry a real ModuleSpec. `transformers` probes for optional dependencies with + # `importlib.util.find_spec("datasets")`, and find_spec raises + # ValueError: datasets.__spec__ is None + # for a module that is already in sys.modules without one. A bare ModuleType has no spec, so the + # first stub crashed transformers on import -- before GIFFLAR's own code ran at all. + _stub.__spec__ = importlib.machinery.ModuleSpec("datasets", loader=None) + _stub.__spec__.origin = "" + # ⚠ Deliberately NO importlib.metadata distribution. transformers follows a successful find_spec + # with `importlib.metadata.version("datasets")`, which raises PackageNotFoundError here, so + # transformers correctly concludes the library is UNAVAILABLE and takes its no-datasets path. + # GIFFLAR's `from datasets import load_dataset` still binds against the stub. Both are right. + + def _load_dataset(*a, **k): + raise RuntimeError( + "GIFFLAR reached datasets.load_dataset, which means the `glylm` glycan-encoder " + "path is live. That path is NOT part of this benchmark and HuggingFace `datasets` " + "is not installed (it is absent from GIFFLAR's own requirements.txt). Select " + "`gifflar` or `sweetnet` as the glycan encoder, or install `datasets` deliberately. " + "Refusing to continue rather than substitute anything.") + + _stub.load_dataset = _load_dataset + sys.modules["datasets"] = _stub + _STUBBED = True + print("[launch] datasets: ABSENT (%s) -> loud stub registered; glylm path is now fail-closed" + % _e, flush=True) + +# --------------------------------------------------------------------------------------------- +# 2. Now GIFFLAR may join the path. Nothing in the repo is modified. +# --------------------------------------------------------------------------------------------- +sys.path.insert(0, G) +os.chdir(G) + +from experiments.protein_encoding import ENCODER_MAP, EMBED_SIZES # noqa: E402 +from experiments.lgi_model import GLYCAN_ENCODERS # noqa: E402 + +print("[launch] lectin encoders:", sorted(ENCODER_MAP), flush=True) +print("[launch] glycan encoders:", sorted(GLYCAN_ENCODERS), flush=True) +assert "ESM" in ENCODER_MAP and EMBED_SIZES["ESM"] == 1280, "ESM-2 650M not registered at 1280" +for _n in ("gifflar", "sweetnet"): + assert _n in GLYCAN_ENCODERS, "glycan encoder %s missing" % _n + +cfg = sys.argv[1] +if not os.path.isfile(cfg): + raise SystemExit("FATAL: config not found: %s" % cfg) + +# --------------------------------------------------------------------------------------------- +# 3. GATE: the stub is only safe while nothing selects `glylm`. Prove it from the config itself, +# do not assume it. A config that asked for glylm must fail HERE, before any GPU time is spent. +# --------------------------------------------------------------------------------------------- +_raw = open(cfg).read() +_code = "\n".join(l for l in _raw.splitlines() if not l.lstrip().startswith("#")) +if _STUBBED and "glylm" in _code: + raise SystemExit("FATAL: %s selects the `glylm` glycan encoder, whose corpus loader needs the " + "real HuggingFace `datasets`. The stub cannot satisfy it. Install `datasets` " + "or choose a different glycan encoder." % cfg) +print("[launch] GATE PASS: GIFFLAR's own ESM-2 650M lectin encoder, both glycan encoders " + "registered, config does not select glylm", flush=True) +print("[launch] config: %s" % cfg, flush=True) + +# ── variant-aware resume ────────────────────────────────────────────────────────────────── +# On scavenger a preemption requeues this job. Without a resume, training restarts at epoch 0. +# GIFFLAR's own `main()` resumes when handed a DIRECTORY holding hparams.yaml, metrics.csv and +# weights/last.ckpt (train_lgi.py:145-155) -- but that branch trains exactly ONE run, while our +# config declares TWO glycan encoders. So the resume must pick the RIGHT variant, and must refuse +# to resume at all when doing so would skip a variant that has not run. +import csv as _csv # noqa: E402 +import glob # noqa: E402 +import yaml # noqa: E402 + +_target = cfg +try: + _c = yaml.safe_load(open(cfg)) + _logs = _c.get("logs_dir") or os.path.join(_c.get("root_dir", "."), "logs") + _ge = _c.get("model", {}).get("glycan_encoder") or [] + _n_declared = len(_ge) if isinstance(_ge, list) else 1 + _max_ep = int(_c.get("model", {}).get("epochs", 0)) + + _variants = sorted({os.path.basename(os.path.dirname(d)) + for d in glob.glob(os.path.join(_logs, "*", "version_*"))}) + + def _last_epoch(d): + m = os.path.join(d, "metrics.csv") + if not os.path.exists(m): + return -1 + try: + rows = list(_csv.reader(open(m))) + return int(rows[-1][0]) if len(rows) > 1 and rows[-1][0].isdigit() else -1 + except Exception: # noqa: BLE001 + return -1 + + _complete, _resumable = [], [] + for d in glob.glob(os.path.join(_logs, "*", "version_*")): + if not (os.path.exists(os.path.join(d, "hparams.yaml")) + and os.path.exists(os.path.join(d, "metrics.csv")) + and os.path.exists(os.path.join(d, "weights", "last.ckpt"))): + continue + (_complete if _last_epoch(d) >= _max_ep - 1 else _resumable).append(d) + + print("[launch] config declares %d glycan variant(s); %d variant dir(s) on disk; " + "%d complete, %d resumable" % (_n_declared, len(_variants), len(_complete), + len(_resumable)), flush=True) + + if _resumable: + _target = sorted(_resumable, key=lambda d: os.path.getmtime( + os.path.join(d, "weights", "last.ckpt")))[-1] + print("[launch] RESUMING incomplete variant: %s (epoch %d of %d)" + % (_target, _last_epoch(_target), _max_ep), flush=True) + print("[launch] ⚠ resume reads hparams.yaml from that directory, NOT %s" % cfg, flush=True) + elif _complete and len(_variants) < _n_declared: + # ⛔ Everything on disk is finished, but a declared variant has never run. Resuming a + # completed run would exit in seconds and report success with a model missing. + print("[launch] ⛔ %d of %d declared variants have no directory. NOT resuming -- starting " + "fresh so the missing variant actually runs." + % (_n_declared - len(_variants), _n_declared), flush=True) + elif _complete: + print("[launch] all declared variants already complete -- passing the config so main() " + "can re-enter and finish any test pass", flush=True) + else: + print("[launch] no resumable checkpoint under %s -- starting fresh" % _logs, flush=True) +except Exception as _e: # noqa: BLE001 + print("[launch] resume detection failed (%s) -- starting fresh from %s" % (_e, cfg), flush=True) + _target = cfg + +from experiments.train_lgi import main # noqa: E402 +main("classical", str(_target)) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e98332b7f1604f45930bb0f57641e2380970281d --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml @@ -0,0 +1,23 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: gifflar + num_layers: 8 + pooling: global_mean + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan +seed: 43 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..2023d4975c7d173d333b32f9bcd056db95016a67 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv @@ -0,0 +1,3544 @@ +epoch,step,test/MeanAbsoluteError,test/MeanSquaredError,test/PearsonCorrCoef,test/R2Score,test/SpearmanCorrCoef,test/loss,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +0,49,,,,,,,,,,,,0.08395883440971375,,,,,, +0,99,,,,,,,,,,,,0.08208288252353668,,,,,, +0,149,,,,,,,,,,,,0.07591351121664047,,,,,, +0,199,,,,,,,,,,,,0.07772542536258698,,,,,, +0,249,,,,,,,,,,,,0.07915575802326202,,,,,, +0,299,,,,,,,,,,,,0.08808340132236481,,,,,, +0,349,,,,,,,,,,,,0.08374879509210587,,,,,, +0,399,,,,,,,,,,,,0.08353452384471893,,,,,, +0,449,,,,,,,,,,,,0.0996883288025856,,,,,, +0,499,,,,,,,,,,,,0.08804504573345184,,,,,, +0,549,,,,,,,,,,,,0.08099837601184845,,,,,, +0,599,,,,,,,,,,,,0.08404889702796936,,,,,, +0,649,,,,,,,,,,,,0.08067433536052704,,,,,, +0,699,,,,,,,,,,,,0.08688704669475555,,,,,, +0,749,,,,,,,,,,,,0.0731314867734909,,,,,, +0,799,,,,,,,,,,,,0.08866162598133087,,,,,, +0,849,,,,,,,,,,,,0.08253778517246246,,,,,, +0,899,,,,,,,,,,,,0.0776275023818016,,,,,, +0,949,,,,,,,,,,,,0.08189564943313599,,,,,, +0,999,,,,,,,,,,,,0.09370851516723633,,,,,, +0,1049,,,,,,,,,,,,0.08488146960735321,,,,,, +0,1099,,,,,,,,,,,,0.09017208218574524,,,,,, +0,1149,,,,,,,,,,,,0.08423396944999695,,,,,, +0,1199,,,,,,,,,,,,0.09444604814052582,,,,,, +0,1249,,,,,,,,,,,,0.06229793652892113,,,,,, +0,1299,,,,,,,,,,,,0.08068179339170456,,,,,, +0,1349,,,,,,,,,,,,0.07953441143035889,,,,,, +0,1399,,,,,,,,,,,,0.07037526369094849,,,,,, +0,1449,,,,,,,,,,,,0.07589786499738693,,,,,, +0,1499,,,,,,,,,,,,0.09916751831769943,,,,,, +0,1549,,,,,,,,,,,,0.07694238424301147,,,,,, +0,1599,,,,,,,,,,,,0.08061209321022034,,,,,, +0,1649,,,,,,,,,,,,0.08245676755905151,,,,,, +0,1699,,,,,,,,,,,,0.07001414149999619,,,,,, +0,1749,,,,,,,,,,,,0.08083143830299377,,,,,, +0,1799,,,,,,,,,,,,0.06761728227138519,,,,,, +0,1849,,,,,,,,,,,,0.08269597589969635,,,,,, +0,1899,,,,,,,,,,,,0.07376769185066223,,,,,, +0,1949,,,,,,,,,,,,0.08337100595235825,,,,,, +0,1999,,,,,,,,,,,,0.08967724442481995,,,,,, +0,2049,,,,,,,,,,,,0.07556416839361191,,,,,, +0,2099,,,,,,,,,,,,0.08081238716840744,,,,,, +0,2149,,,,,,,,,,,,0.08126441389322281,,,,,, +0,2199,,,,,,,,,,,,0.06603234261274338,,,,,, +0,2249,,,,,,,,,,,,0.07632376253604889,,,,,, +0,2299,,,,,,,,,,,,0.08596064895391464,,,,,, +0,2349,,,,,,,,,,,,0.08607670664787292,,,,,, +0,2399,,,,,,,,,,,,0.08700428903102875,,,,,, +0,2449,,,,,,,,,,,,0.08944237232208252,,,,,, +0,2499,,,,,,,,,,,,0.07619930058717728,,,,,, +0,2549,,,,,,,,,,,,0.07841154932975769,,,,,, +0,2599,,,,,,,,,,,,0.07659661769866943,,,,,, +0,2649,,,,,,,,,,,,0.08030758798122406,,,,,, +0,2699,,,,,,,,,,,,0.08389373123645782,,,,,, +0,2749,,,,,,,,,,,,0.07732352614402771,,,,,, +0,2799,,,,,,,,,,,,0.08345066010951996,,,,,, +0,2849,,,,,,,,,,,,0.07539986073970795,,,,,, +0,2899,,,,,,,,,,,,0.07645240426063538,,,,,, +0,2949,,,,,,,,,,,,0.08735287189483643,,,,,, +0,2999,,,,,,,,,,,,0.0798308327794075,,,,,, +0,3049,,,,,,,,,,,,0.08340664207935333,,,,,, +0,3099,,,,,,,,,,,,0.07870921492576599,,,,,, +0,3149,,,,,,,,,,,,0.08607760816812515,,,,,, +0,3199,,,,,,,,,,,,0.08251264691352844,,,,,, +0,3249,,,,,,,,,,,,0.0801132470369339,,,,,, +0,3299,,,,,,,,,,,,0.07449743151664734,,,,,, +0,3349,,,,,,,,,,,,0.08709441870450974,,,,,, +0,3399,,,,,,,,,,,,0.07727363705635071,,,,,, +0,3441,,,,,,,,,,,,,0.2388407438993454,0.07972290366888046,0.2939871549606323,0.04064065217971802,0.2915792763233185,0.07972290366888046 +0,3441,,,,,,,0.24487727880477905,0.08238399028778076,0.14598782360553741,0.004011631011962891,0.14361393451690674,,,,,,, +1,3449,,,,,,,,,,,,0.07508363574743271,,,,,, +1,3499,,,,,,,,,,,,0.06750351190567017,,,,,, +1,3549,,,,,,,,,,,,0.08754786103963852,,,,,, +1,3599,,,,,,,,,,,,0.08071550726890564,,,,,, +1,3649,,,,,,,,,,,,0.08041127026081085,,,,,, +1,3699,,,,,,,,,,,,0.08138322830200195,,,,,, +1,3749,,,,,,,,,,,,0.08405759930610657,,,,,, +1,3799,,,,,,,,,,,,0.08235618472099304,,,,,, +1,3849,,,,,,,,,,,,0.08430458605289459,,,,,, +1,3899,,,,,,,,,,,,0.08245011419057846,,,,,, +1,3949,,,,,,,,,,,,0.07542206346988678,,,,,, +1,3999,,,,,,,,,,,,0.08553992956876755,,,,,, +1,4049,,,,,,,,,,,,0.06823570281267166,,,,,, +1,4099,,,,,,,,,,,,0.09167928993701935,,,,,, +1,4149,,,,,,,,,,,,0.08238153904676437,,,,,, +1,4199,,,,,,,,,,,,0.06953449547290802,,,,,, +1,4249,,,,,,,,,,,,0.07268697768449783,,,,,, +1,4299,,,,,,,,,,,,0.08157952129840851,,,,,, +1,4349,,,,,,,,,,,,0.08036915212869644,,,,,, +1,4399,,,,,,,,,,,,0.07177086919546127,,,,,, +1,4449,,,,,,,,,,,,0.07568561285734177,,,,,, +1,4499,,,,,,,,,,,,0.08505085855722427,,,,,, +1,4549,,,,,,,,,,,,0.07311689853668213,,,,,, +1,4599,,,,,,,,,,,,0.0723477452993393,,,,,, +1,4649,,,,,,,,,,,,0.0719163566827774,,,,,, +1,4699,,,,,,,,,,,,0.0759103074669838,,,,,, +1,4749,,,,,,,,,,,,0.07723379880189896,,,,,, +1,4799,,,,,,,,,,,,0.07423970848321915,,,,,, +1,4849,,,,,,,,,,,,0.07086531072854996,,,,,, +1,4899,,,,,,,,,,,,0.08081001043319702,,,,,, +1,4949,,,,,,,,,,,,0.07305873930454254,,,,,, +1,4999,,,,,,,,,,,,0.07246348261833191,,,,,, +1,5049,,,,,,,,,,,,0.0773586705327034,,,,,, +1,5099,,,,,,,,,,,,0.06872433423995972,,,,,, +1,5149,,,,,,,,,,,,0.08919689059257507,,,,,, +1,5199,,,,,,,,,,,,0.07936924695968628,,,,,, +1,5249,,,,,,,,,,,,0.07662263512611389,,,,,, +1,5299,,,,,,,,,,,,0.07496748864650726,,,,,, +1,5349,,,,,,,,,,,,0.08061016350984573,,,,,, +1,5399,,,,,,,,,,,,0.07300475984811783,,,,,, +1,5449,,,,,,,,,,,,0.07970664650201797,,,,,, +1,5499,,,,,,,,,,,,0.07159040868282318,,,,,, +1,5549,,,,,,,,,,,,0.0754845067858696,,,,,, +1,5599,,,,,,,,,,,,0.08266172558069229,,,,,, +1,5649,,,,,,,,,,,,0.0798620954155922,,,,,, +1,5699,,,,,,,,,,,,0.07471561431884766,,,,,, +1,5749,,,,,,,,,,,,0.09195448458194733,,,,,, +1,5799,,,,,,,,,,,,0.07450512796640396,,,,,, +1,5849,,,,,,,,,,,,0.07388058304786682,,,,,, +1,5899,,,,,,,,,,,,0.07578703761100769,,,,,, +1,5949,,,,,,,,,,,,0.08014469593763351,,,,,, +1,5999,,,,,,,,,,,,0.07479356229305267,,,,,, +1,6049,,,,,,,,,,,,0.07441776990890503,,,,,, +1,6099,,,,,,,,,,,,0.09192651510238647,,,,,, +1,6149,,,,,,,,,,,,0.08230600506067276,,,,,, +1,6199,,,,,,,,,,,,0.08456194400787354,,,,,, +1,6249,,,,,,,,,,,,0.07337962090969086,,,,,, +1,6299,,,,,,,,,,,,0.0830201581120491,,,,,, +1,6349,,,,,,,,,,,,0.07380839437246323,,,,,, +1,6399,,,,,,,,,,,,0.07857309281826019,,,,,, +1,6449,,,,,,,,,,,,0.0712130144238472,,,,,, +1,6499,,,,,,,,,,,,0.08430977165699005,,,,,, +1,6549,,,,,,,,,,,,0.07456354796886444,,,,,, +1,6599,,,,,,,,,,,,0.08065687865018845,,,,,, +1,6649,,,,,,,,,,,,0.07176551967859268,,,,,, +1,6699,,,,,,,,,,,,0.07310443371534348,,,,,, +1,6749,,,,,,,,,,,,0.07901414483785629,,,,,, +1,6799,,,,,,,,,,,,0.06921078264713287,,,,,, +1,6849,,,,,,,,,,,,0.08869294077157974,,,,,, +1,6883,,,,,,,,,,,,,0.23397472500801086,0.07611378282308578,0.2939614951610565,0.08407163619995117,0.2947613596916199,0.07611378282308578 +1,6883,,,,,,,0.24009296298027039,0.07855638116598129,0.22609634697437286,0.050270795822143555,0.2067795693874359,,,,,,, +2,6899,,,,,,,,,,,,0.08279508352279663,,,,,, +2,6949,,,,,,,,,,,,0.06961359083652496,,,,,, +2,6999,,,,,,,,,,,,0.07778890430927277,,,,,, +2,7049,,,,,,,,,,,,0.08347432315349579,,,,,, +2,7099,,,,,,,,,,,,0.06706108152866364,,,,,, +2,7149,,,,,,,,,,,,0.07731731235980988,,,,,, +2,7199,,,,,,,,,,,,0.0735028088092804,,,,,, +2,7249,,,,,,,,,,,,0.07146713137626648,,,,,, +2,7299,,,,,,,,,,,,0.08690277487039566,,,,,, +2,7349,,,,,,,,,,,,0.08519874513149261,,,,,, +2,7399,,,,,,,,,,,,0.08605644106864929,,,,,, +2,7449,,,,,,,,,,,,0.06998735666275024,,,,,, +2,7499,,,,,,,,,,,,0.088388592004776,,,,,, +2,7549,,,,,,,,,,,,0.08661683648824692,,,,,, +2,7599,,,,,,,,,,,,0.07978673279285431,,,,,, +2,7649,,,,,,,,,,,,0.08575616776943207,,,,,, +2,7699,,,,,,,,,,,,0.06888199597597122,,,,,, +2,7749,,,,,,,,,,,,0.07934969663619995,,,,,, +2,7799,,,,,,,,,,,,0.07726671546697617,,,,,, +2,7849,,,,,,,,,,,,0.08157256245613098,,,,,, +2,7899,,,,,,,,,,,,0.07726539671421051,,,,,, +2,7949,,,,,,,,,,,,0.08280637115240097,,,,,, +2,7999,,,,,,,,,,,,0.0884297788143158,,,,,, +2,8049,,,,,,,,,,,,0.07878095656633377,,,,,, +2,8099,,,,,,,,,,,,0.07426749169826508,,,,,, +2,8149,,,,,,,,,,,,0.07113862037658691,,,,,, +2,8199,,,,,,,,,,,,0.07326853275299072,,,,,, +2,8249,,,,,,,,,,,,0.07725978642702103,,,,,, +2,8299,,,,,,,,,,,,0.07583867013454437,,,,,, +2,8349,,,,,,,,,,,,0.084840327501297,,,,,, +2,8399,,,,,,,,,,,,0.08846582472324371,,,,,, +2,8449,,,,,,,,,,,,0.0723448246717453,,,,,, +2,8499,,,,,,,,,,,,0.0764806866645813,,,,,, +2,8549,,,,,,,,,,,,0.07033920288085938,,,,,, +2,8599,,,,,,,,,,,,0.0873551294207573,,,,,, +2,8649,,,,,,,,,,,,0.0696355551481247,,,,,, +2,8699,,,,,,,,,,,,0.08293214440345764,,,,,, +2,8749,,,,,,,,,,,,0.09185416996479034,,,,,, +2,8799,,,,,,,,,,,,0.06793828308582306,,,,,, +2,8849,,,,,,,,,,,,0.07594694197177887,,,,,, +2,8899,,,,,,,,,,,,0.07674945890903473,,,,,, +2,8949,,,,,,,,,,,,0.08331367373466492,,,,,, +2,8999,,,,,,,,,,,,0.08355138450860977,,,,,, +2,9049,,,,,,,,,,,,0.08093523979187012,,,,,, +2,9099,,,,,,,,,,,,0.07698637247085571,,,,,, +2,9149,,,,,,,,,,,,0.09631393849849701,,,,,, +2,9199,,,,,,,,,,,,0.07789286971092224,,,,,, +2,9249,,,,,,,,,,,,0.0698358416557312,,,,,, +2,9299,,,,,,,,,,,,0.07390471547842026,,,,,, +2,9349,,,,,,,,,,,,0.07991574704647064,,,,,, +2,9399,,,,,,,,,,,,0.09029438346624374,,,,,, +2,9449,,,,,,,,,,,,0.077797532081604,,,,,, +2,9499,,,,,,,,,,,,0.08927988260984421,,,,,, +2,9549,,,,,,,,,,,,0.07802890241146088,,,,,, +2,9599,,,,,,,,,,,,0.07806383818387985,,,,,, +2,9649,,,,,,,,,,,,0.08168470114469528,,,,,, +2,9699,,,,,,,,,,,,0.07602894306182861,,,,,, +2,9749,,,,,,,,,,,,0.08018766343593597,,,,,, +2,9799,,,,,,,,,,,,0.07838355004787445,,,,,, +2,9849,,,,,,,,,,,,0.07433661073446274,,,,,, +2,9899,,,,,,,,,,,,0.07536634057760239,,,,,, +2,9949,,,,,,,,,,,,0.08473989367485046,,,,,, +2,9999,,,,,,,,,,,,0.08500167727470398,,,,,, +2,10049,,,,,,,,,,,,0.07677844911813736,,,,,, +2,10099,,,,,,,,,,,,0.08667641878128052,,,,,, +2,10149,,,,,,,,,,,,0.08262238651514053,,,,,, +2,10199,,,,,,,,,,,,0.07684235274791718,,,,,, +2,10249,,,,,,,,,,,,0.07684307545423508,,,,,, +2,10299,,,,,,,,,,,,0.07708582282066345,,,,,, +2,10325,,,,,,,,,,,,,0.23480960726737976,0.07632556557655334,0.2879319190979004,0.08152318000793457,0.31825798749923706,0.07632556557655334 +2,10325,,,,,,,0.2445763349533081,0.09333327412605286,0.07260258495807648,-0.12836039066314697,0.15131133794784546,,,,,,, +3,10349,,,,,,,,,,,,0.07811237871646881,,,,,, +3,10399,,,,,,,,,,,,0.0836133360862732,,,,,, +3,10449,,,,,,,,,,,,0.08349817991256714,,,,,, +3,10499,,,,,,,,,,,,0.08157487958669662,,,,,, +3,10549,,,,,,,,,,,,0.07921162247657776,,,,,, +3,10599,,,,,,,,,,,,0.0769452303647995,,,,,, +3,10649,,,,,,,,,,,,0.08435626327991486,,,,,, +3,10699,,,,,,,,,,,,0.0686318650841713,,,,,, +3,10749,,,,,,,,,,,,0.06783582270145416,,,,,, +3,10799,,,,,,,,,,,,0.07636769860982895,,,,,, +3,10849,,,,,,,,,,,,0.08131133019924164,,,,,, +3,10899,,,,,,,,,,,,0.0808650404214859,,,,,, +3,10949,,,,,,,,,,,,0.05306541174650192,,,,,, +3,10999,,,,,,,,,,,,0.08116728067398071,,,,,, +3,11049,,,,,,,,,,,,0.0700703039765358,,,,,, +3,11099,,,,,,,,,,,,0.0753786712884903,,,,,, +3,11149,,,,,,,,,,,,0.07150677591562271,,,,,, +3,11199,,,,,,,,,,,,0.08183394372463226,,,,,, +3,11249,,,,,,,,,,,,0.07325617969036102,,,,,, +3,11299,,,,,,,,,,,,0.07880102097988129,,,,,, +3,11349,,,,,,,,,,,,0.07636422663927078,,,,,, +3,11399,,,,,,,,,,,,0.08241329342126846,,,,,, +3,11449,,,,,,,,,,,,0.08342081308364868,,,,,, +3,11499,,,,,,,,,,,,0.07611294090747833,,,,,, +3,11549,,,,,,,,,,,,0.07983393222093582,,,,,, +3,11599,,,,,,,,,,,,0.08384190499782562,,,,,, +3,11649,,,,,,,,,,,,0.07317927479743958,,,,,, +3,11699,,,,,,,,,,,,0.07441169023513794,,,,,, +3,11749,,,,,,,,,,,,0.07405517995357513,,,,,, +3,11799,,,,,,,,,,,,0.07622066885232925,,,,,, +3,11849,,,,,,,,,,,,0.0648033544421196,,,,,, +3,11899,,,,,,,,,,,,0.09032091498374939,,,,,, +3,11949,,,,,,,,,,,,0.08154718577861786,,,,,, +3,11999,,,,,,,,,,,,0.0759892612695694,,,,,, +3,12049,,,,,,,,,,,,0.07036284357309341,,,,,, +3,12099,,,,,,,,,,,,0.08117692172527313,,,,,, +3,12149,,,,,,,,,,,,0.0870702862739563,,,,,, +3,12199,,,,,,,,,,,,0.07734699547290802,,,,,, +3,12249,,,,,,,,,,,,0.08353725075721741,,,,,, +3,12299,,,,,,,,,,,,0.06548386812210083,,,,,, +3,12349,,,,,,,,,,,,0.07554881274700165,,,,,, +3,12399,,,,,,,,,,,,0.07581707835197449,,,,,, +3,12449,,,,,,,,,,,,0.08054940402507782,,,,,, +3,12499,,,,,,,,,,,,0.07864750921726227,,,,,, +3,12549,,,,,,,,,,,,0.08064619451761246,,,,,, +3,12599,,,,,,,,,,,,0.07521955668926239,,,,,, +3,12649,,,,,,,,,,,,0.08066842705011368,,,,,, +3,12699,,,,,,,,,,,,0.07311049848794937,,,,,, +3,12749,,,,,,,,,,,,0.08102842420339584,,,,,, +3,12799,,,,,,,,,,,,0.08242924511432648,,,,,, +3,12849,,,,,,,,,,,,0.08240042626857758,,,,,, +3,12899,,,,,,,,,,,,0.08773747086524963,,,,,, +3,12949,,,,,,,,,,,,0.07371389865875244,,,,,, +3,12999,,,,,,,,,,,,0.07605055719614029,,,,,, +3,13049,,,,,,,,,,,,0.07404271513223648,,,,,, +3,13099,,,,,,,,,,,,0.08176858723163605,,,,,, +3,13149,,,,,,,,,,,,0.08459590375423431,,,,,, +3,13199,,,,,,,,,,,,0.0691576823592186,,,,,, +3,13249,,,,,,,,,,,,0.09010946750640869,,,,,, +3,13299,,,,,,,,,,,,0.07922235131263733,,,,,, +3,13349,,,,,,,,,,,,0.08495877683162689,,,,,, +3,13399,,,,,,,,,,,,0.08053305745124817,,,,,, +3,13449,,,,,,,,,,,,0.07433386147022247,,,,,, +3,13499,,,,,,,,,,,,0.07098855078220367,,,,,, +3,13549,,,,,,,,,,,,0.09238829463720322,,,,,, +3,13599,,,,,,,,,,,,0.07674670219421387,,,,,, +3,13649,,,,,,,,,,,,0.07955752313137054,,,,,, +3,13699,,,,,,,,,,,,0.07995382696390152,,,,,, +3,13749,,,,,,,,,,,,0.07340525090694427,,,,,, +3,13767,,,,,,,,,,,,,0.2347070723772049,0.07610461115837097,0.31616684794425964,0.08418196439743042,0.3194904029369354,0.07610461115837097 +3,13767,,,,,,,0.2398555725812912,0.07829064875841141,0.23156329989433289,0.05349075794219971,0.21484267711639404,,,,,,, +4,13799,,,,,,,,,,,,0.07167579233646393,,,,,, +4,13849,,,,,,,,,,,,0.06593696027994156,,,,,, +4,13899,,,,,,,,,,,,0.07592381536960602,,,,,, +4,13949,,,,,,,,,,,,0.07924658805131912,,,,,, +4,13999,,,,,,,,,,,,0.06616336107254028,,,,,, +4,14049,,,,,,,,,,,,0.0733766183257103,,,,,, +4,14099,,,,,,,,,,,,0.07349716126918793,,,,,, +4,14149,,,,,,,,,,,,0.08962589502334595,,,,,, +4,14199,,,,,,,,,,,,0.0645517110824585,,,,,, +4,14249,,,,,,,,,,,,0.07698287814855576,,,,,, +4,14299,,,,,,,,,,,,0.0699082687497139,,,,,, +4,14349,,,,,,,,,,,,0.08215852826833725,,,,,, +4,14399,,,,,,,,,,,,0.07930867373943329,,,,,, +4,14449,,,,,,,,,,,,0.06501733511686325,,,,,, +4,14499,,,,,,,,,,,,0.08356726169586182,,,,,, +4,14549,,,,,,,,,,,,0.07319772988557816,,,,,, +4,14599,,,,,,,,,,,,0.07438991218805313,,,,,, +4,14649,,,,,,,,,,,,0.07594022154808044,,,,,, +4,14699,,,,,,,,,,,,0.06762948632240295,,,,,, +4,14749,,,,,,,,,,,,0.08638410270214081,,,,,, +4,14799,,,,,,,,,,,,0.07198455929756165,,,,,, +4,14849,,,,,,,,,,,,0.08714532852172852,,,,,, +4,14899,,,,,,,,,,,,0.07069051265716553,,,,,, +4,14949,,,,,,,,,,,,0.07200652360916138,,,,,, +4,14999,,,,,,,,,,,,0.07536071538925171,,,,,, +4,15049,,,,,,,,,,,,0.08950673043727875,,,,,, +4,15099,,,,,,,,,,,,0.07296966016292572,,,,,, +4,15149,,,,,,,,,,,,0.06621887534856796,,,,,, +4,15199,,,,,,,,,,,,0.07129324972629547,,,,,, +4,15249,,,,,,,,,,,,0.0735657811164856,,,,,, +4,15299,,,,,,,,,,,,0.07794332504272461,,,,,, +4,15349,,,,,,,,,,,,0.08199980854988098,,,,,, +4,15399,,,,,,,,,,,,0.06914430111646652,,,,,, +4,15449,,,,,,,,,,,,1.0825990438461304,,,,,, +4,15499,,,,,,,,,,,,0.08376912772655487,,,,,, +4,15549,,,,,,,,,,,,0.07731567323207855,,,,,, +4,15599,,,,,,,,,,,,0.09015074372291565,,,,,, +4,15649,,,,,,,,,,,,0.0769105851650238,,,,,, +4,15699,,,,,,,,,,,,0.08672080188989639,,,,,, +4,15749,,,,,,,,,,,,0.08858783543109894,,,,,, +4,15799,,,,,,,,,,,,0.08841954916715622,,,,,, +4,15849,,,,,,,,,,,,0.08034887909889221,,,,,, +4,15899,,,,,,,,,,,,0.08518801629543304,,,,,, +4,15949,,,,,,,,,,,,0.07931613177061081,,,,,, +4,15999,,,,,,,,,,,,0.09070289134979248,,,,,, +4,16049,,,,,,,,,,,,0.08671221882104874,,,,,, +4,16099,,,,,,,,,,,,0.0835869312286377,,,,,, +4,16149,,,,,,,,,,,,0.09139581769704819,,,,,, +4,16199,,,,,,,,,,,,0.08575859665870667,,,,,, +4,16249,,,,,,,,,,,,0.07922674715518951,,,,,, +4,16299,,,,,,,,,,,,0.09122458100318909,,,,,, +4,16349,,,,,,,,,,,,0.08310122787952423,,,,,, +4,16399,,,,,,,,,,,,0.08183248341083527,,,,,, +4,16449,,,,,,,,,,,,0.08208903670310974,,,,,, +4,16499,,,,,,,,,,,,0.07738403230905533,,,,,, +4,16549,,,,,,,,,,,,0.09872192144393921,,,,,, +4,16599,,,,,,,,,,,,0.08387862890958786,,,,,, +4,16649,,,,,,,,,,,,0.0766788199543953,,,,,, +4,16699,,,,,,,,,,,,0.07647180557250977,,,,,, +4,16749,,,,,,,,,,,,0.08991740643978119,,,,,, +4,16799,,,,,,,,,,,,0.09542082995176315,,,,,, +4,16849,,,,,,,,,,,,0.08551459014415741,,,,,, +4,16899,,,,,,,,,,,,0.09247283637523651,,,,,, +4,16949,,,,,,,,,,,,0.0810902863740921,,,,,, +4,16999,,,,,,,,,,,,0.08884160220623016,,,,,, +4,17049,,,,,,,,,,,,0.08351200073957443,,,,,, +4,17099,,,,,,,,,,,,0.07835158705711365,,,,,, +4,17149,,,,,,,,,,,,0.07874850928783417,,,,,, +4,17199,,,,,,,,,,,,0.08053113520145416,,,,,, +4,17209,,,,,,,,,,,,,0.25007373094558716,0.08353468030691147,nan,-0.005228996276855469,0.05755370482802391,0.08353468030691147 +4,17209,,,,,,,0.24814298748970032,0.641855001449585,0.012073620222508907,-6.759827613830566,0.12926363945007324,,,,,,, +5,17249,,,,,,,,,,,,0.08085671067237854,,,,,, +5,17299,,,,,,,,,,,,0.0804176777601242,,,,,, +5,17349,,,,,,,,,,,,0.07225082069635391,,,,,, +5,17399,,,,,,,,,,,,0.0871996134519577,,,,,, +5,17449,,,,,,,,,,,,0.08978276699781418,,,,,, +5,17499,,,,,,,,,,,,0.07834503054618835,,,,,, +5,17549,,,,,,,,,,,,0.081705242395401,,,,,, +5,17599,,,,,,,,,,,,0.08465172350406647,,,,,, +5,17649,,,,,,,,,,,,0.08397535979747772,,,,,, +5,17699,,,,,,,,,,,,0.08014911413192749,,,,,, +5,17749,,,,,,,,,,,,0.07442443817853928,,,,,, +5,17799,,,,,,,,,,,,0.09300444275140762,,,,,, +5,17849,,,,,,,,,,,,0.07239581644535065,,,,,, +5,17899,,,,,,,,,,,,0.07842293381690979,,,,,, +5,17949,,,,,,,,,,,,0.08035489916801453,,,,,, +5,17999,,,,,,,,,,,,0.07465913146734238,,,,,, +5,18049,,,,,,,,,,,,0.06823991239070892,,,,,, +5,18099,,,,,,,,,,,,0.08383142948150635,,,,,, +5,18149,,,,,,,,,,,,0.07907655835151672,,,,,, +5,18199,,,,,,,,,,,,0.08368335664272308,,,,,, +5,18249,,,,,,,,,,,,0.08702167123556137,,,,,, +5,18299,,,,,,,,,,,,0.07495377957820892,,,,,, +5,18349,,,,,,,,,,,,0.08690236508846283,,,,,, +5,18399,,,,,,,,,,,,0.08533259481191635,,,,,, +5,18449,,,,,,,,,,,,0.08741926401853561,,,,,, +5,18499,,,,,,,,,,,,0.09629633277654648,,,,,, +5,18549,,,,,,,,,,,,0.08272021263837814,,,,,, +5,18599,,,,,,,,,,,,0.076668381690979,,,,,, +5,18649,,,,,,,,,,,,0.07882317900657654,,,,,, +5,18699,,,,,,,,,,,,0.08295328915119171,,,,,, +5,18749,,,,,,,,,,,,0.0822843462228775,,,,,, +5,18799,,,,,,,,,,,,0.07624886929988861,,,,,, +5,18849,,,,,,,,,,,,0.07472050935029984,,,,,, +5,18899,,,,,,,,,,,,0.09303098171949387,,,,,, +5,18949,,,,,,,,,,,,0.07073803246021271,,,,,, +5,18999,,,,,,,,,,,,0.09318837523460388,,,,,, +5,19049,,,,,,,,,,,,0.07949039340019226,,,,,, +5,19099,,,,,,,,,,,,0.08533789962530136,,,,,, +5,19149,,,,,,,,,,,,0.09337732940912247,,,,,, +5,19199,,,,,,,,,,,,0.0955125167965889,,,,,, +5,19249,,,,,,,,,,,,0.0794956237077713,,,,,, +5,19299,,,,,,,,,,,,0.08064498007297516,,,,,, +5,19349,,,,,,,,,,,,0.0951378121972084,,,,,, +5,19399,,,,,,,,,,,,0.09046909213066101,,,,,, +5,19449,,,,,,,,,,,,0.08467079699039459,,,,,, +5,19499,,,,,,,,,,,,0.08265215158462524,,,,,, +5,19549,,,,,,,,,,,,0.0754934698343277,,,,,, +5,19599,,,,,,,,,,,,0.07910821586847305,,,,,, +5,19649,,,,,,,,,,,,0.09034611284732819,,,,,, +5,19699,,,,,,,,,,,,0.09417331963777542,,,,,, +5,19749,,,,,,,,,,,,0.08475650101900101,,,,,, +5,19799,,,,,,,,,,,,0.08263327926397324,,,,,, +5,19849,,,,,,,,,,,,0.0920063704252243,,,,,, +5,19899,,,,,,,,,,,,0.06798411905765533,,,,,, +5,19949,,,,,,,,,,,,0.08922532945871353,,,,,, +5,19999,,,,,,,,,,,,0.11625776439905167,,,,,, +5,20049,,,,,,,,,,,,0.0664447769522667,,,,,, +5,20099,,,,,,,,,,,,0.08341117203235626,,,,,, +5,20149,,,,,,,,,,,,0.09535878896713257,,,,,, +5,20199,,,,,,,,,,,,0.08832141757011414,,,,,, +5,20249,,,,,,,,,,,,0.07039588689804077,,,,,, +5,20299,,,,,,,,,,,,0.07577434182167053,,,,,, +5,20349,,,,,,,,,,,,0.08612016588449478,,,,,, +5,20399,,,,,,,,,,,,0.08342337608337402,,,,,, +5,20449,,,,,,,,,,,,0.08315712213516235,,,,,, +5,20499,,,,,,,,,,,,0.08085364103317261,,,,,, +5,20549,,,,,,,,,,,,0.08085885643959045,,,,,, +5,20599,,,,,,,,,,,,0.08721945434808731,,,,,, +5,20649,,,,,,,,,,,,0.09279117733240128,,,,,, +5,20651,,,,,,,,,,,,,0.24967311322689056,0.08314238488674164,nan,-0.0005081892013549805,0.03363887965679169,0.08314238488674164 +5,20651,,,,,,,0.24947209656238556,0.08343956619501114,0.000604244414716959,-0.008759140968322754,-0.0008464918937534094,,,,,,, +6,20699,,,,,,,,,,,,0.09011353552341461,,,,,, +6,20749,,,,,,,,,,,,0.09701043367385864,,,,,, +6,20799,,,,,,,,,,,,0.08750829845666885,,,,,, +6,20849,,,,,,,,,,,,0.07987041771411896,,,,,, +6,20899,,,,,,,,,,,,0.07829819619655609,,,,,, +6,20949,,,,,,,,,,,,0.07447069883346558,,,,,, +6,20999,,,,,,,,,,,,0.08616916090250015,,,,,, +6,21049,,,,,,,,,,,,0.07718111574649811,,,,,, +6,21099,,,,,,,,,,,,0.0931248664855957,,,,,, +6,21149,,,,,,,,,,,,0.08965151011943817,,,,,, +6,21199,,,,,,,,,,,,0.0693119615316391,,,,,, +6,21249,,,,,,,,,,,,0.09603899717330933,,,,,, +6,21299,,,,,,,,,,,,0.08515441417694092,,,,,, +6,21349,,,,,,,,,,,,0.07455359399318695,,,,,, +6,21399,,,,,,,,,,,,0.07117833197116852,,,,,, +6,21449,,,,,,,,,,,,0.07528874278068542,,,,,, +6,21499,,,,,,,,,,,,0.08586931228637695,,,,,, +6,21549,,,,,,,,,,,,0.10053709149360657,,,,,, +6,21599,,,,,,,,,,,,0.08545973151922226,,,,,, +6,21649,,,,,,,,,,,,0.0774058848619461,,,,,, +6,21699,,,,,,,,,,,,0.0905505046248436,,,,,, +6,21749,,,,,,,,,,,,0.08506698161363602,,,,,, +6,21799,,,,,,,,,,,,0.08567006886005402,,,,,, +6,21849,,,,,,,,,,,,0.08584396541118622,,,,,, +6,21899,,,,,,,,,,,,0.07529722899198532,,,,,, +6,21949,,,,,,,,,,,,0.07726919651031494,,,,,, +6,21999,,,,,,,,,,,,0.07675120234489441,,,,,, +6,22049,,,,,,,,,,,,0.08734335005283356,,,,,, +6,22099,,,,,,,,,,,,0.0863294005393982,,,,,, +6,22149,,,,,,,,,,,,0.09113532304763794,,,,,, +6,22199,,,,,,,,,,,,0.07376620173454285,,,,,, +6,22249,,,,,,,,,,,,0.08102574199438095,,,,,, +6,22299,,,,,,,,,,,,0.07378803193569183,,,,,, +6,22349,,,,,,,,,,,,0.07651185244321823,,,,,, +6,22399,,,,,,,,,,,,0.07306961715221405,,,,,, +6,22449,,,,,,,,,,,,0.089168481528759,,,,,, +6,22499,,,,,,,,,,,,0.08341879397630692,,,,,, +6,22549,,,,,,,,,,,,0.08880053460597992,,,,,, +6,22599,,,,,,,,,,,,0.08666790276765823,,,,,, +6,22649,,,,,,,,,,,,0.09927991032600403,,,,,, +6,22699,,,,,,,,,,,,0.0920487642288208,,,,,, +6,22749,,,,,,,,,,,,0.08869150280952454,,,,,, +6,22799,,,,,,,,,,,,0.08166082203388214,,,,,, +6,22849,,,,,,,,,,,,0.08188530057668686,,,,,, +6,22899,,,,,,,,,,,,0.07300002872943878,,,,,, +6,22949,,,,,,,,,,,,0.08873557299375534,,,,,, +6,22999,,,,,,,,,,,,0.07854241132736206,,,,,, +6,23049,,,,,,,,,,,,0.08520439267158508,,,,,, +6,23099,,,,,,,,,,,,0.0840880498290062,,,,,, +6,23149,,,,,,,,,,,,0.08556433767080307,,,,,, +6,23199,,,,,,,,,,,,0.08285342901945114,,,,,, +6,23249,,,,,,,,,,,,0.08328482508659363,,,,,, +6,23299,,,,,,,,,,,,0.07463090121746063,,,,,, +6,23349,,,,,,,,,,,,0.09824517369270325,,,,,, +6,23399,,,,,,,,,,,,0.09053511917591095,,,,,, +6,23449,,,,,,,,,,,,0.08090277016162872,,,,,, +6,23499,,,,,,,,,,,,0.08316037058830261,,,,,, +6,23549,,,,,,,,,,,,0.08366266638040543,,,,,, +6,23599,,,,,,,,,,,,0.0920351967215538,,,,,, +6,23649,,,,,,,,,,,,0.0731821358203888,,,,,, +6,23699,,,,,,,,,,,,0.08729086816310883,,,,,, +6,23749,,,,,,,,,,,,0.07559333741664886,,,,,, +6,23799,,,,,,,,,,,,0.0871453657746315,,,,,, +6,23849,,,,,,,,,,,,0.09136418253183365,,,,,, +6,23899,,,,,,,,,,,,0.08664190769195557,,,,,, +6,23949,,,,,,,,,,,,0.08936424553394318,,,,,, +6,23999,,,,,,,,,,,,0.07790114730596542,,,,,, +6,24049,,,,,,,,,,,,0.08801513910293579,,,,,, +6,24093,,,,,,,,,,,,,0.2503877580165863,0.08382313698530197,nan,-0.008700251579284668,-0.11469318717718124,0.08382313698530197 +6,24093,,,,,,,0.2493419498205185,0.08329391479492188,-0.001084766467101872,-0.007001399993896484,-0.0014110563788563013,,,,,,, +7,24099,,,,,,,,,,,,0.08032108843326569,,,,,, +7,24149,,,,,,,,,,,,0.07750064134597778,,,,,, +7,24199,,,,,,,,,,,,0.07141648977994919,,,,,, +7,24249,,,,,,,,,,,,0.07562137395143509,,,,,, +7,24299,,,,,,,,,,,,0.08380352705717087,,,,,, +7,24349,,,,,,,,,,,,0.06240382790565491,,,,,, +7,24399,,,,,,,,,,,,0.07413141429424286,,,,,, +7,24449,,,,,,,,,,,,0.07499217987060547,,,,,, +7,24499,,,,,,,,,,,,0.08267778158187866,,,,,, +7,24549,,,,,,,,,,,,0.09029370546340942,,,,,, +7,24599,,,,,,,,,,,,0.08306747674942017,,,,,, +7,24649,,,,,,,,,,,,0.0792216807603836,,,,,, +7,24699,,,,,,,,,,,,0.09462615102529526,,,,,, +7,24749,,,,,,,,,,,,0.07573828101158142,,,,,, +7,24799,,,,,,,,,,,,0.08021409064531326,,,,,, +7,24849,,,,,,,,,,,,0.09198563545942307,,,,,, +7,24899,,,,,,,,,,,,0.081759974360466,,,,,, +7,24949,,,,,,,,,,,,0.08130495995283127,,,,,, +7,24999,,,,,,,,,,,,0.0765201523900032,,,,,, +7,25049,,,,,,,,,,,,0.07679417729377747,,,,,, +7,25099,,,,,,,,,,,,0.09217273443937302,,,,,, +7,25149,,,,,,,,,,,,0.09080739319324493,,,,,, +7,25199,,,,,,,,,,,,0.08892995119094849,,,,,, +7,25249,,,,,,,,,,,,0.07442532479763031,,,,,, +7,25299,,,,,,,,,,,,0.07878559827804565,,,,,, +7,25349,,,,,,,,,,,,0.0816953107714653,,,,,, +7,25399,,,,,,,,,,,,0.09069695323705673,,,,,, +7,25449,,,,,,,,,,,,0.08542325347661972,,,,,, +7,25499,,,,,,,,,,,,0.08658894896507263,,,,,, +7,25549,,,,,,,,,,,,0.09217706322669983,,,,,, +7,25599,,,,,,,,,,,,0.08291978389024734,,,,,, +7,25649,,,,,,,,,,,,0.08774694800376892,,,,,, +7,25699,,,,,,,,,,,,0.08276639878749847,,,,,, +7,25749,,,,,,,,,,,,0.07691718637943268,,,,,, +7,25799,,,,,,,,,,,,0.09039360284805298,,,,,, +7,25849,,,,,,,,,,,,0.08720160275697708,,,,,, +7,25899,,,,,,,,,,,,0.08722957968711853,,,,,, +7,25949,,,,,,,,,,,,0.08105835318565369,,,,,, +7,25999,,,,,,,,,,,,0.07752479612827301,,,,,, +7,26049,,,,,,,,,,,,0.08475497364997864,,,,,, +7,26099,,,,,,,,,,,,0.09295693039894104,,,,,, +7,26149,,,,,,,,,,,,0.08020541071891785,,,,,, +7,26199,,,,,,,,,,,,0.08754350244998932,,,,,, +7,26249,,,,,,,,,,,,0.08685430884361267,,,,,, +7,26299,,,,,,,,,,,,0.07720808684825897,,,,,, +7,26349,,,,,,,,,,,,0.08737944066524506,,,,,, +7,26399,,,,,,,,,,,,0.08724251389503479,,,,,, +7,26449,,,,,,,,,,,,0.08872528374195099,,,,,, +7,26499,,,,,,,,,,,,0.08420412987470627,,,,,, +7,26549,,,,,,,,,,,,0.08992037922143936,,,,,, +7,26599,,,,,,,,,,,,0.08128666877746582,,,,,, +7,26649,,,,,,,,,,,,0.09052439779043198,,,,,, +7,26699,,,,,,,,,,,,0.06614965200424194,,,,,, +7,26749,,,,,,,,,,,,0.07573334127664566,,,,,, +7,26799,,,,,,,,,,,,0.07628980278968811,,,,,, +7,26849,,,,,,,,,,,,0.07965551316738129,,,,,, +7,26899,,,,,,,,,,,,0.08082222938537598,,,,,, +7,26949,,,,,,,,,,,,0.073904849588871,,,,,, +7,26999,,,,,,,,,,,,0.0765085220336914,,,,,, +7,27049,,,,,,,,,,,,0.09117428213357925,,,,,, +7,27099,,,,,,,,,,,,0.08170818537473679,,,,,, +7,27149,,,,,,,,,,,,0.07657517492771149,,,,,, +7,27199,,,,,,,,,,,,0.08618631958961487,,,,,, +7,27249,,,,,,,,,,,,0.08946762979030609,,,,,, +7,27299,,,,,,,,,,,,0.08779981732368469,,,,,, +7,27349,,,,,,,,,,,,0.07758354395627975,,,,,, +7,27399,,,,,,,,,,,,0.07194937765598297,,,,,, +7,27449,,,,,,,,,,,,0.07467580586671829,,,,,, +7,27499,,,,,,,,,,,,0.08212888240814209,,,,,, +7,27535,,,,,,,,,,,,,0.237112894654274,0.07625673711299896,0.33728471398353577,0.08235138654708862,0.34063610434532166,0.07625673711299896 +7,27535,,,,,,,0.2483847290277481,0.08276770263910294,0.04829636588692665,-0.0006281137466430664,0.04419387876987457,,,,,,, +8,27549,,,,,,,,,,,,0.0834096223115921,,,,,, +8,27599,,,,,,,,,,,,0.09556050598621368,,,,,, +8,27649,,,,,,,,,,,,0.08431918919086456,,,,,, +8,27699,,,,,,,,,,,,0.08233129978179932,,,,,, +8,27749,,,,,,,,,,,,0.0923815444111824,,,,,, +8,27799,,,,,,,,,,,,0.07957220822572708,,,,,, +8,27849,,,,,,,,,,,,0.0794893279671669,,,,,, +8,27899,,,,,,,,,,,,0.0742967277765274,,,,,, +8,27949,,,,,,,,,,,,0.08600979298353195,,,,,, +8,27999,,,,,,,,,,,,0.08059439063072205,,,,,, +8,28049,,,,,,,,,,,,0.08126872777938843,,,,,, +8,28099,,,,,,,,,,,,0.08029007911682129,,,,,, +8,28149,,,,,,,,,,,,0.0839625746011734,,,,,, +8,28199,,,,,,,,,,,,0.08897701650857925,,,,,, +8,28249,,,,,,,,,,,,0.08274362236261368,,,,,, +8,28299,,,,,,,,,,,,0.08341149240732193,,,,,, +8,28349,,,,,,,,,,,,0.0839659720659256,,,,,, +8,28399,,,,,,,,,,,,0.07994048297405243,,,,,, +8,28449,,,,,,,,,,,,0.08550292253494263,,,,,, +8,28499,,,,,,,,,,,,0.07706369459629059,,,,,, +8,28549,,,,,,,,,,,,0.06949333846569061,,,,,, +8,28599,,,,,,,,,,,,0.07522706687450409,,,,,, +8,28649,,,,,,,,,,,,0.08395063877105713,,,,,, +8,28699,,,,,,,,,,,,0.08345025777816772,,,,,, +8,28749,,,,,,,,,,,,0.089068703353405,,,,,, +8,28799,,,,,,,,,,,,0.07467485219240189,,,,,, +8,28849,,,,,,,,,,,,0.08289258182048798,,,,,, +8,28899,,,,,,,,,,,,0.07280432432889938,,,,,, +8,28949,,,,,,,,,,,,0.09295852482318878,,,,,, +8,28999,,,,,,,,,,,,0.07054725289344788,,,,,, +8,29049,,,,,,,,,,,,0.08188463747501373,,,,,, +8,29099,,,,,,,,,,,,0.07752902060747147,,,,,, +8,29149,,,,,,,,,,,,0.07199373841285706,,,,,, +8,29199,,,,,,,,,,,,0.08319937437772751,,,,,, +8,29249,,,,,,,,,,,,0.08000113070011139,,,,,, +8,29299,,,,,,,,,,,,0.07644835114479065,,,,,, +8,29349,,,,,,,,,,,,0.07989732176065445,,,,,, +8,29399,,,,,,,,,,,,0.0893111526966095,,,,,, +8,29449,,,,,,,,,,,,0.07908868044614792,,,,,, +8,29499,,,,,,,,,,,,0.09117685258388519,,,,,, +8,29549,,,,,,,,,,,,0.08675289899110794,,,,,, +8,29599,,,,,,,,,,,,0.08267505466938019,,,,,, +8,29649,,,,,,,,,,,,0.07746617496013641,,,,,, +8,29699,,,,,,,,,,,,0.0820426493883133,,,,,, +8,29749,,,,,,,,,,,,0.08283159136772156,,,,,, +8,29799,,,,,,,,,,,,0.09024029970169067,,,,,, +8,29849,,,,,,,,,,,,0.07857935130596161,,,,,, +8,29899,,,,,,,,,,,,0.07672400027513504,,,,,, +8,29949,,,,,,,,,,,,0.0777466744184494,,,,,, +8,29999,,,,,,,,,,,,0.07487042248249054,,,,,, +8,30049,,,,,,,,,,,,0.08112286031246185,,,,,, +8,30099,,,,,,,,,,,,0.07134877145290375,,,,,, +8,30149,,,,,,,,,,,,0.0758434608578682,,,,,, +8,30199,,,,,,,,,,,,0.08447487652301788,,,,,, +8,30249,,,,,,,,,,,,0.07909372448921204,,,,,, +8,30299,,,,,,,,,,,,0.08320887386798859,,,,,, +8,30349,,,,,,,,,,,,0.0732567310333252,,,,,, +8,30399,,,,,,,,,,,,0.08056656271219254,,,,,, +8,30449,,,,,,,,,,,,0.06323614716529846,,,,,, +8,30499,,,,,,,,,,,,0.08135686814785004,,,,,, +8,30549,,,,,,,,,,,,0.06997563689947128,,,,,, +8,30599,,,,,,,,,,,,0.07535567879676819,,,,,, +8,30649,,,,,,,,,,,,0.07298915088176727,,,,,, +8,30699,,,,,,,,,,,,0.08263758569955826,,,,,, +8,30749,,,,,,,,,,,,0.07519008964300156,,,,,, +8,30799,,,,,,,,,,,,0.0843227207660675,,,,,, +8,30849,,,,,,,,,,,,0.08054554462432861,,,,,, +8,30899,,,,,,,,,,,,0.08498337119817734,,,,,, +8,30949,,,,,,,,,,,,0.07922544330358505,,,,,, +8,30977,,,,,,,,,,,,,0.23797312378883362,0.07908811420202255,0.29731670022010803,0.048279523849487305,0.3014041483402252,0.07908811420202255 +8,30977,,,,,,,0.2432391196489334,0.08011592924594879,0.17931054532527924,0.03142428398132324,0.17185063660144806,,,,,,, +9,30999,,,,,,,,,,,,0.085116907954216,,,,,, +9,31049,,,,,,,,,,,,0.07091157138347626,,,,,, +9,31099,,,,,,,,,,,,0.08104456961154938,,,,,, +9,31149,,,,,,,,,,,,0.08160528540611267,,,,,, +9,31199,,,,,,,,,,,,0.08322294056415558,,,,,, +9,31249,,,,,,,,,,,,0.0672951191663742,,,,,, +9,31299,,,,,,,,,,,,0.0796889215707779,,,,,, +9,31349,,,,,,,,,,,,0.07614978402853012,,,,,, +9,31399,,,,,,,,,,,,0.07619091868400574,,,,,, +9,31449,,,,,,,,,,,,0.08032891154289246,,,,,, +9,31499,,,,,,,,,,,,0.07910533249378204,,,,,, +9,31549,,,,,,,,,,,,0.07308853417634964,,,,,, +9,31599,,,,,,,,,,,,0.07508336007595062,,,,,, +9,31649,,,,,,,,,,,,0.06823985278606415,,,,,, +9,31699,,,,,,,,,,,,0.08743263781070709,,,,,, +9,31749,,,,,,,,,,,,0.07315512746572495,,,,,, +9,31799,,,,,,,,,,,,0.07910923659801483,,,,,, +9,31849,,,,,,,,,,,,0.06672891974449158,,,,,, +9,31899,,,,,,,,,,,,0.07607994973659515,,,,,, +9,31949,,,,,,,,,,,,0.07669461518526077,,,,,, +9,31999,,,,,,,,,,,,0.08134901523590088,,,,,, +9,32049,,,,,,,,,,,,0.082559734582901,,,,,, +9,32099,,,,,,,,,,,,0.0783315896987915,,,,,, +9,32149,,,,,,,,,,,,0.07746577262878418,,,,,, +9,32199,,,,,,,,,,,,0.07909822463989258,,,,,, +9,32249,,,,,,,,,,,,0.07567314803600311,,,,,, +9,32299,,,,,,,,,,,,0.07353004813194275,,,,,, +9,32349,,,,,,,,,,,,0.07640612870454788,,,,,, +9,32399,,,,,,,,,,,,0.08363741636276245,,,,,, +9,32449,,,,,,,,,,,,0.0709298774600029,,,,,, +9,32499,,,,,,,,,,,,0.07438343018293381,,,,,, +9,32549,,,,,,,,,,,,0.07808256894350052,,,,,, +9,32599,,,,,,,,,,,,0.09162620455026627,,,,,, +9,32649,,,,,,,,,,,,0.08543246239423752,,,,,, +9,32699,,,,,,,,,,,,0.08111557364463806,,,,,, +9,32749,,,,,,,,,,,,0.09100620448589325,,,,,, +9,32799,,,,,,,,,,,,0.07624685764312744,,,,,, +9,32849,,,,,,,,,,,,0.08324995636940002,,,,,, +9,32899,,,,,,,,,,,,0.07817170023918152,,,,,, +9,32949,,,,,,,,,,,,0.08183678984642029,,,,,, +9,32999,,,,,,,,,,,,0.08336236327886581,,,,,, +9,33049,,,,,,,,,,,,0.0896168053150177,,,,,, +9,33099,,,,,,,,,,,,0.06749352067708969,,,,,, +9,33149,,,,,,,,,,,,0.0853087529540062,,,,,, +9,33199,,,,,,,,,,,,0.08378688246011734,,,,,, +9,33249,,,,,,,,,,,,0.06855298578739166,,,,,, +9,33299,,,,,,,,,,,,0.0775228813290596,,,,,, +9,33349,,,,,,,,,,,,0.08515544980764389,,,,,, +9,33399,,,,,,,,,,,,0.09246740490198135,,,,,, +9,33449,,,,,,,,,,,,0.08460233360528946,,,,,, +9,33499,,,,,,,,,,,,0.08297988772392273,,,,,, +9,33549,,,,,,,,,,,,0.07312615215778351,,,,,, +9,33599,,,,,,,,,,,,0.07301374524831772,,,,,, +9,33649,,,,,,,,,,,,0.07249576598405838,,,,,, +9,33699,,,,,,,,,,,,0.08394135534763336,,,,,, +9,33749,,,,,,,,,,,,0.07876887172460556,,,,,, +9,33799,,,,,,,,,,,,0.07247652113437653,,,,,, +9,33849,,,,,,,,,,,,0.08467546105384827,,,,,, +9,33899,,,,,,,,,,,,0.08039775490760803,,,,,, +9,33949,,,,,,,,,,,,0.08388568460941315,,,,,, +9,33999,,,,,,,,,,,,0.07719650119543076,,,,,, +9,34049,,,,,,,,,,,,0.07343532145023346,,,,,, +9,34099,,,,,,,,,,,,0.08425426483154297,,,,,, +9,34149,,,,,,,,,,,,0.08266108483076096,,,,,, +9,34199,,,,,,,,,,,,0.07583053410053253,,,,,, +9,34249,,,,,,,,,,,,0.08718276023864746,,,,,, +9,34299,,,,,,,,,,,,0.07297549396753311,,,,,, +9,34349,,,,,,,,,,,,0.08417476713657379,,,,,, +9,34399,,,,,,,,,,,,0.07256293296813965,,,,,, +9,34419,,,,,,,,,,,,,0.24245582520961761,0.08102017641067505,0.2899426817893982,0.025029659271240234,0.3020760118961334,0.08102017641067505 +9,34419,,,,,,,0.24259810149669647,0.07987959682941437,0.18823368847370148,0.03429025411605835,0.17774847149848938,,,,,,, +10,34449,,,,,,,,,,,,0.07287878543138504,,,,,, +10,34499,,,,,,,,,,,,0.08221709728240967,,,,,, +10,34549,,,,,,,,,,,,0.07405529171228409,,,,,, +10,34599,,,,,,,,,,,,0.08313939720392227,,,,,, +10,34649,,,,,,,,,,,,0.07776516675949097,,,,,, +10,34699,,,,,,,,,,,,0.08210195600986481,,,,,, +10,34749,,,,,,,,,,,,0.08500062674283981,,,,,, +10,34799,,,,,,,,,,,,0.08032167702913284,,,,,, +10,34849,,,,,,,,,,,,0.07157674431800842,,,,,, +10,34899,,,,,,,,,,,,0.065918929874897,,,,,, +10,34949,,,,,,,,,,,,0.07463930547237396,,,,,, +10,34999,,,,,,,,,,,,0.07429508864879608,,,,,, +10,35049,,,,,,,,,,,,0.08296104520559311,,,,,, +10,35099,,,,,,,,,,,,0.0731828361749649,,,,,, +10,35149,,,,,,,,,,,,0.09099555015563965,,,,,, +10,35199,,,,,,,,,,,,0.0830094963312149,,,,,, +10,35249,,,,,,,,,,,,0.07542137056589127,,,,,, +10,35299,,,,,,,,,,,,0.07986100763082504,,,,,, +10,35349,,,,,,,,,,,,0.08380389213562012,,,,,, +10,35399,,,,,,,,,,,,0.08471031486988068,,,,,, +10,35449,,,,,,,,,,,,0.07555626332759857,,,,,, +10,35499,,,,,,,,,,,,0.07628481835126877,,,,,, +10,35549,,,,,,,,,,,,0.09450384974479675,,,,,, +10,35599,,,,,,,,,,,,0.07048030942678452,,,,,, +10,35649,,,,,,,,,,,,0.0766071081161499,,,,,, +10,35699,,,,,,,,,,,,0.07418536394834518,,,,,, +10,35749,,,,,,,,,,,,0.09003473073244095,,,,,, +10,35799,,,,,,,,,,,,0.07621823251247406,,,,,, +10,35849,,,,,,,,,,,,0.07585061341524124,,,,,, +10,35899,,,,,,,,,,,,0.07827743887901306,,,,,, +10,35949,,,,,,,,,,,,0.0797882005572319,,,,,, +10,35999,,,,,,,,,,,,0.07464776188135147,,,,,, +10,36049,,,,,,,,,,,,0.07938751578330994,,,,,, +10,36099,,,,,,,,,,,,0.0789482593536377,,,,,, +10,36149,,,,,,,,,,,,0.07457146048545837,,,,,, +10,36199,,,,,,,,,,,,0.08601930737495422,,,,,, +10,36249,,,,,,,,,,,,0.08267270028591156,,,,,, +10,36299,,,,,,,,,,,,0.0744435265660286,,,,,, +10,36349,,,,,,,,,,,,0.08296873420476913,,,,,, +10,36399,,,,,,,,,,,,0.09669171273708344,,,,,, +10,36449,,,,,,,,,,,,0.07866707444190979,,,,,, +10,36499,,,,,,,,,,,,0.0761498212814331,,,,,, +10,36549,,,,,,,,,,,,0.08321893215179443,,,,,, +10,36599,,,,,,,,,,,,0.07881474494934082,,,,,, +10,36649,,,,,,,,,,,,0.07308647036552429,,,,,, +10,36699,,,,,,,,,,,,0.08468657732009888,,,,,, +10,36749,,,,,,,,,,,,0.06665614247322083,,,,,, +10,36799,,,,,,,,,,,,0.0961950272321701,,,,,, +10,36849,,,,,,,,,,,,0.06848214566707611,,,,,, +10,36899,,,,,,,,,,,,0.08140668272972107,,,,,, +10,36949,,,,,,,,,,,,0.0769512802362442,,,,,, +10,36999,,,,,,,,,,,,0.08375747501850128,,,,,, +10,37049,,,,,,,,,,,,0.07741165161132812,,,,,, +10,37099,,,,,,,,,,,,0.07936783134937286,,,,,, +10,37149,,,,,,,,,,,,0.0828305035829544,,,,,, +10,37199,,,,,,,,,,,,0.08801469206809998,,,,,, +10,37249,,,,,,,,,,,,0.07712915539741516,,,,,, +10,37299,,,,,,,,,,,,0.06191036105155945,,,,,, +10,37349,,,,,,,,,,,,0.07693896442651749,,,,,, +10,37399,,,,,,,,,,,,0.08150149881839752,,,,,, +10,37449,,,,,,,,,,,,0.07707370817661285,,,,,, +10,37499,,,,,,,,,,,,0.0807049572467804,,,,,, +10,37549,,,,,,,,,,,,0.08964735269546509,,,,,, +10,37599,,,,,,,,,,,,0.08248665928840637,,,,,, +10,37649,,,,,,,,,,,,0.0782693400979042,,,,,, +10,37699,,,,,,,,,,,,0.07529029995203018,,,,,, +10,37749,,,,,,,,,,,,0.07582288980484009,,,,,, +10,37799,,,,,,,,,,,,0.07448191195726395,,,,,, +10,37849,,,,,,,,,,,,0.08131986856460571,,,,,, +10,37861,,,,,,,,,,,,,0.2333013266324997,0.07466721534729004,0.32230114936828613,0.101479172706604,0.31647005677223206,0.07466721534729004 +10,37861,,,,,,,0.24035678803920746,0.07864050567150116,0.22271953523159027,0.049256980419158936,0.2109946459531784,,,,,,, +11,37899,,,,,,,,,,,,0.0819733738899231,,,,,, +11,37949,,,,,,,,,,,,0.07061322033405304,,,,,, +11,37999,,,,,,,,,,,,0.08074808120727539,,,,,, +11,38049,,,,,,,,,,,,0.07856014370918274,,,,,, +11,38099,,,,,,,,,,,,0.07569332420825958,,,,,, +11,38149,,,,,,,,,,,,0.07700140029191971,,,,,, +11,38199,,,,,,,,,,,,0.07603976130485535,,,,,, +11,38249,,,,,,,,,,,,0.07486403733491898,,,,,, +11,38299,,,,,,,,,,,,0.07120881974697113,,,,,, +11,38349,,,,,,,,,,,,0.09100358188152313,,,,,, +11,38399,,,,,,,,,,,,0.07860267162322998,,,,,, +11,38449,,,,,,,,,,,,0.08246975392103195,,,,,, +11,38499,,,,,,,,,,,,0.08060440421104431,,,,,, +11,38549,,,,,,,,,,,,0.08227238059043884,,,,,, +11,38599,,,,,,,,,,,,0.07822960615158081,,,,,, +11,38649,,,,,,,,,,,,0.08016437292098999,,,,,, +11,38699,,,,,,,,,,,,0.06960126757621765,,,,,, +11,38749,,,,,,,,,,,,0.08566420525312424,,,,,, +11,38799,,,,,,,,,,,,0.09130655229091644,,,,,, +11,38849,,,,,,,,,,,,0.07490168511867523,,,,,, +11,38899,,,,,,,,,,,,0.0674867033958435,,,,,, +11,38949,,,,,,,,,,,,0.0792834684252739,,,,,, +11,38999,,,,,,,,,,,,0.07309338450431824,,,,,, +11,39049,,,,,,,,,,,,0.06757967174053192,,,,,, +11,39099,,,,,,,,,,,,0.06660903990268707,,,,,, +11,39149,,,,,,,,,,,,0.06960775703191757,,,,,, +11,39199,,,,,,,,,,,,0.07556181401014328,,,,,, +11,39249,,,,,,,,,,,,0.08645045757293701,,,,,, +11,39299,,,,,,,,,,,,0.08116688579320908,,,,,, +11,39349,,,,,,,,,,,,0.06553523242473602,,,,,, +11,39399,,,,,,,,,,,,0.06971742957830429,,,,,, +11,39449,,,,,,,,,,,,0.08499652147293091,,,,,, +11,39499,,,,,,,,,,,,0.07998573780059814,,,,,, +11,39549,,,,,,,,,,,,0.08218111842870712,,,,,, +11,39599,,,,,,,,,,,,0.07026263326406479,,,,,, +11,39649,,,,,,,,,,,,0.06947395205497742,,,,,, +11,39699,,,,,,,,,,,,0.08010748028755188,,,,,, +11,39749,,,,,,,,,,,,0.091143898665905,,,,,, +11,39799,,,,,,,,,,,,0.07611136138439178,,,,,, +11,39849,,,,,,,,,,,,0.07933756709098816,,,,,, +11,39899,,,,,,,,,,,,0.08425173163414001,,,,,, +11,39949,,,,,,,,,,,,0.08792699873447418,,,,,, +11,39999,,,,,,,,,,,,0.07578802108764648,,,,,, +11,40049,,,,,,,,,,,,0.08569616079330444,,,,,, +11,40099,,,,,,,,,,,,0.07779280096292496,,,,,, +11,40149,,,,,,,,,,,,0.08752860873937607,,,,,, +11,40199,,,,,,,,,,,,0.06722794473171234,,,,,, +11,40249,,,,,,,,,,,,0.08038963377475739,,,,,, +11,40299,,,,,,,,,,,,0.08235783129930496,,,,,, +11,40349,,,,,,,,,,,,0.08314894139766693,,,,,, +11,40399,,,,,,,,,,,,0.08425913006067276,,,,,, +11,40449,,,,,,,,,,,,0.07631288468837738,,,,,, +11,40499,,,,,,,,,,,,0.08000461757183075,,,,,, +11,40549,,,,,,,,,,,,0.07936917245388031,,,,,, +11,40599,,,,,,,,,,,,0.07447658479213715,,,,,, +11,40649,,,,,,,,,,,,0.07425576448440552,,,,,, +11,40699,,,,,,,,,,,,0.08350837230682373,,,,,, +11,40749,,,,,,,,,,,,0.08289811760187149,,,,,, +11,40799,,,,,,,,,,,,0.08278287202119827,,,,,, +11,40849,,,,,,,,,,,,0.08826379477977753,,,,,, +11,40899,,,,,,,,,,,,0.06902452558279037,,,,,, +11,40949,,,,,,,,,,,,0.07343024760484695,,,,,, +11,40999,,,,,,,,,,,,0.08411766588687897,,,,,, +11,41049,,,,,,,,,,,,0.07576099038124084,,,,,, +11,41099,,,,,,,,,,,,0.0809275209903717,,,,,, +11,41149,,,,,,,,,,,,0.0843919888138771,,,,,, +11,41199,,,,,,,,,,,,0.07208921015262604,,,,,, +11,41249,,,,,,,,,,,,0.06281236559152603,,,,,, +11,41299,,,,,,,,,,,,0.061674363911151886,,,,,, +11,41303,,,,,,,,,,,,,0.2372727245092392,0.07856015861034393,0.31426185369491577,0.05463278293609619,0.3169366717338562,0.07856015861034393 +11,41303,,,,,,,0.239417165517807,0.0783616378903389,0.23119017481803894,0.05264347791671753,0.22095957398414612,,,,,,, +12,41349,,,,,,,,,,,,0.09428931772708893,,,,,, +12,41399,,,,,,,,,,,,0.07260338962078094,,,,,, +12,41449,,,,,,,,,,,,0.07192227989435196,,,,,, +12,41499,,,,,,,,,,,,0.07725168764591217,,,,,, +12,41549,,,,,,,,,,,,0.0803523138165474,,,,,, +12,41599,,,,,,,,,,,,0.07425262033939362,,,,,, +12,41649,,,,,,,,,,,,0.089798703789711,,,,,, +12,41699,,,,,,,,,,,,0.07769441604614258,,,,,, +12,41749,,,,,,,,,,,,0.07161031663417816,,,,,, +12,41799,,,,,,,,,,,,0.07342680543661118,,,,,, +12,41849,,,,,,,,,,,,0.07539130747318268,,,,,, +12,41899,,,,,,,,,,,,0.0774657279253006,,,,,, +12,41949,,,,,,,,,,,,0.07678649574518204,,,,,, +12,41999,,,,,,,,,,,,0.07907833158969879,,,,,, +12,42049,,,,,,,,,,,,0.0776960700750351,,,,,, +12,42099,,,,,,,,,,,,0.08574780076742172,,,,,, +12,42149,,,,,,,,,,,,0.08148984611034393,,,,,, +12,42199,,,,,,,,,,,,0.08010126650333405,,,,,, +12,42249,,,,,,,,,,,,0.08615066856145859,,,,,, +12,42299,,,,,,,,,,,,0.08107154071331024,,,,,, +12,42349,,,,,,,,,,,,0.08083543926477432,,,,,, +12,42399,,,,,,,,,,,,0.08082928508520126,,,,,, +12,42449,,,,,,,,,,,,0.07850323617458344,,,,,, +12,42499,,,,,,,,,,,,0.08272233605384827,,,,,, +12,42549,,,,,,,,,,,,0.08203670382499695,,,,,, +12,42599,,,,,,,,,,,,0.07387243211269379,,,,,, +12,42649,,,,,,,,,,,,0.08269281685352325,,,,,, +12,42699,,,,,,,,,,,,0.06892912089824677,,,,,, +12,42749,,,,,,,,,,,,0.07424633204936981,,,,,, +12,42799,,,,,,,,,,,,0.07015117257833481,,,,,, +12,42849,,,,,,,,,,,,0.0741935670375824,,,,,, +12,42899,,,,,,,,,,,,0.0739571675658226,,,,,, +12,42949,,,,,,,,,,,,0.07683965563774109,,,,,, +12,42999,,,,,,,,,,,,0.06752581894397736,,,,,, +12,43049,,,,,,,,,,,,0.08157175779342651,,,,,, +12,43099,,,,,,,,,,,,0.07853539288043976,,,,,, +12,43149,,,,,,,,,,,,0.07990981638431549,,,,,, +12,43199,,,,,,,,,,,,0.07410465180873871,,,,,, +12,43249,,,,,,,,,,,,0.07513853907585144,,,,,, +12,43299,,,,,,,,,,,,0.07304805517196655,,,,,, +12,43349,,,,,,,,,,,,0.06642068922519684,,,,,, +12,43399,,,,,,,,,,,,0.08460496366024017,,,,,, +12,43449,,,,,,,,,,,,0.08271612226963043,,,,,, +12,43499,,,,,,,,,,,,0.07957156747579575,,,,,, +12,43549,,,,,,,,,,,,0.08727920055389404,,,,,, +12,43599,,,,,,,,,,,,0.0782754123210907,,,,,, +12,43649,,,,,,,,,,,,0.07620573043823242,,,,,, +12,43699,,,,,,,,,,,,0.06731674075126648,,,,,, +12,43749,,,,,,,,,,,,0.07504324615001678,,,,,, +12,43799,,,,,,,,,,,,0.09282638132572174,,,,,, +12,43849,,,,,,,,,,,,0.0840931087732315,,,,,, +12,43899,,,,,,,,,,,,0.0753970742225647,,,,,, +12,43949,,,,,,,,,,,,0.08616899698972702,,,,,, +12,43999,,,,,,,,,,,,0.07996244728565216,,,,,, +12,44049,,,,,,,,,,,,0.08118046820163727,,,,,, +12,44099,,,,,,,,,,,,0.07536278665065765,,,,,, +12,44149,,,,,,,,,,,,0.07415670156478882,,,,,, +12,44199,,,,,,,,,,,,0.08503224700689316,,,,,, +12,44249,,,,,,,,,,,,0.07874591648578644,,,,,, +12,44299,,,,,,,,,,,,0.0787675529718399,,,,,, +12,44349,,,,,,,,,,,,0.08234546333551407,,,,,, +12,44399,,,,,,,,,,,,0.07805150002241135,,,,,, +12,44449,,,,,,,,,,,,0.08491934835910797,,,,,, +12,44499,,,,,,,,,,,,0.08896959573030472,,,,,, +12,44549,,,,,,,,,,,,0.07773788273334503,,,,,, +12,44599,,,,,,,,,,,,0.08178354799747467,,,,,, +12,44649,,,,,,,,,,,,0.08920980989933014,,,,,, +12,44699,,,,,,,,,,,,0.07392844557762146,,,,,, +12,44745,,,,,,,,,,,,,0.23502740263938904,0.07599245756864548,0.30916744470596313,0.08553159236907959,0.30806854367256165,0.07599245756864548 +12,44745,,,,,,,0.23772229254245758,0.07721220701932907,0.258219838142395,0.06653118133544922,0.2419525533914566,,,,,,, +13,44749,,,,,,,,,,,,0.08120238780975342,,,,,, +13,44799,,,,,,,,,,,,0.06504064798355103,,,,,, +13,44849,,,,,,,,,,,,0.08338490128517151,,,,,, +13,44899,,,,,,,,,,,,0.07588052749633789,,,,,, +13,44949,,,,,,,,,,,,0.08081918954849243,,,,,, +13,44999,,,,,,,,,,,,0.08421449363231659,,,,,, +13,45049,,,,,,,,,,,,0.083285853266716,,,,,, +13,45099,,,,,,,,,,,,0.08572360128164291,,,,,, +13,45149,,,,,,,,,,,,0.08000509440898895,,,,,, +13,45199,,,,,,,,,,,,0.06925398111343384,,,,,, +13,45249,,,,,,,,,,,,0.06594270467758179,,,,,, +13,45299,,,,,,,,,,,,0.08456520736217499,,,,,, +13,45349,,,,,,,,,,,,0.07462794333696365,,,,,, +13,45399,,,,,,,,,,,,0.07786042988300323,,,,,, +13,45449,,,,,,,,,,,,0.07177893817424774,,,,,, +13,45499,,,,,,,,,,,,0.07496526092290878,,,,,, +13,45549,,,,,,,,,,,,0.07396309077739716,,,,,, +13,45599,,,,,,,,,,,,0.07577093690633774,,,,,, +13,45649,,,,,,,,,,,,0.07109808921813965,,,,,, +13,45699,,,,,,,,,,,,0.08233801275491714,,,,,, +13,45749,,,,,,,,,,,,0.06776916980743408,,,,,, +13,45799,,,,,,,,,,,,0.0751497745513916,,,,,, +13,45849,,,,,,,,,,,,0.0805911123752594,,,,,, +13,45899,,,,,,,,,,,,0.07241350412368774,,,,,, +13,45949,,,,,,,,,,,,0.07082900404930115,,,,,, +13,45999,,,,,,,,,,,,0.07066177576780319,,,,,, +13,46049,,,,,,,,,,,,0.08731559664011002,,,,,, +13,46099,,,,,,,,,,,,0.07352937012910843,,,,,, +13,46149,,,,,,,,,,,,0.0760374516248703,,,,,, +13,46199,,,,,,,,,,,,0.07298387587070465,,,,,, +13,46249,,,,,,,,,,,,0.07995320856571198,,,,,, +13,46299,,,,,,,,,,,,0.07384584844112396,,,,,, +13,46349,,,,,,,,,,,,0.07702304422855377,,,,,, +13,46399,,,,,,,,,,,,0.08213315904140472,,,,,, +13,46449,,,,,,,,,,,,0.0720183402299881,,,,,, +13,46499,,,,,,,,,,,,0.0883428081870079,,,,,, +13,46549,,,,,,,,,,,,0.07194498181343079,,,,,, +13,46599,,,,,,,,,,,,0.08426623046398163,,,,,, +13,46649,,,,,,,,,,,,0.06837332248687744,,,,,, +13,46699,,,,,,,,,,,,0.0699860081076622,,,,,, +13,46749,,,,,,,,,,,,0.07816821336746216,,,,,, +13,46799,,,,,,,,,,,,0.08106885850429535,,,,,, +13,46849,,,,,,,,,,,,0.05786581337451935,,,,,, +13,46899,,,,,,,,,,,,0.0764002650976181,,,,,, +13,46949,,,,,,,,,,,,0.08970349282026291,,,,,, +13,46999,,,,,,,,,,,,0.07758729159832001,,,,,, +13,47049,,,,,,,,,,,,0.06127146631479263,,,,,, +13,47099,,,,,,,,,,,,0.0851796418428421,,,,,, +13,47149,,,,,,,,,,,,0.08037054538726807,,,,,, +13,47199,,,,,,,,,,,,0.0721806138753891,,,,,, +13,47249,,,,,,,,,,,,0.06728589534759521,,,,,, +13,47299,,,,,,,,,,,,0.08405199646949768,,,,,, +13,47349,,,,,,,,,,,,0.07263445854187012,,,,,, +13,47399,,,,,,,,,,,,0.07082422077655792,,,,,, +13,47449,,,,,,,,,,,,0.06817116588354111,,,,,, +13,47499,,,,,,,,,,,,0.08845742791891098,,,,,, +13,47549,,,,,,,,,,,,0.08771038800477982,,,,,, +13,47599,,,,,,,,,,,,0.08812898397445679,,,,,, +13,47649,,,,,,,,,,,,0.07728530466556549,,,,,, +13,47699,,,,,,,,,,,,0.08107016235589981,,,,,, +13,47749,,,,,,,,,,,,0.07877005636692047,,,,,, +13,47799,,,,,,,,,,,,0.08537793159484863,,,,,, +13,47849,,,,,,,,,,,,0.08980107307434082,,,,,, +13,47899,,,,,,,,,,,,0.07430151104927063,,,,,, +13,47949,,,,,,,,,,,,0.07777753472328186,,,,,, +13,47999,,,,,,,,,,,,0.06712262332439423,,,,,, +13,48049,,,,,,,,,,,,0.08083117008209229,,,,,, +13,48099,,,,,,,,,,,,0.08015403151512146,,,,,, +13,48149,,,,,,,,,,,,0.07298621535301208,,,,,, +13,48187,,,,,,,,,,,,,0.2378629744052887,0.07885177433490753,0.2998579740524292,0.05112355947494507,0.29462599754333496,0.07885177433490753 +13,48187,,,,,,,0.23759692907333374,0.07717794924974442,0.2590884566307068,0.066947340965271,0.24322664737701416,,,,,,, +14,48199,,,,,,,,,,,,0.07694478332996368,,,,,, +14,48249,,,,,,,,,,,,0.07139459252357483,,,,,, +14,48299,,,,,,,,,,,,0.06314961612224579,,,,,, +14,48349,,,,,,,,,,,,0.07425563037395477,,,,,, +14,48399,,,,,,,,,,,,0.06803752481937408,,,,,, +14,48449,,,,,,,,,,,,0.07921865582466125,,,,,, +14,48499,,,,,,,,,,,,0.08569838851690292,,,,,, +14,48549,,,,,,,,,,,,0.06567968428134918,,,,,, +14,48599,,,,,,,,,,,,0.0724625289440155,,,,,, +14,48649,,,,,,,,,,,,0.0738772302865982,,,,,, +14,48699,,,,,,,,,,,,0.07769577205181122,,,,,, +14,48749,,,,,,,,,,,,0.07705903798341751,,,,,, +14,48799,,,,,,,,,,,,0.06578744947910309,,,,,, +14,48849,,,,,,,,,,,,0.08038512617349625,,,,,, +14,48899,,,,,,,,,,,,0.08103827387094498,,,,,, +14,48949,,,,,,,,,,,,0.06771209836006165,,,,,, +14,48999,,,,,,,,,,,,0.08164387941360474,,,,,, +14,49049,,,,,,,,,,,,0.08030145615339279,,,,,, +14,49099,,,,,,,,,,,,0.07605408132076263,,,,,, +14,49149,,,,,,,,,,,,0.08017267286777496,,,,,, +14,49199,,,,,,,,,,,,0.08425397425889969,,,,,, +14,49249,,,,,,,,,,,,0.07841645181179047,,,,,, +14,49299,,,,,,,,,,,,0.08187195658683777,,,,,, +14,49349,,,,,,,,,,,,0.0689844861626625,,,,,, +14,49399,,,,,,,,,,,,0.08653391897678375,,,,,, +14,49449,,,,,,,,,,,,0.07813556492328644,,,,,, +14,49499,,,,,,,,,,,,0.0835866630077362,,,,,, +14,49549,,,,,,,,,,,,0.0806618481874466,,,,,, +14,49599,,,,,,,,,,,,0.08052138984203339,,,,,, +14,49649,,,,,,,,,,,,0.08708231151103973,,,,,, +14,49699,,,,,,,,,,,,0.08178041875362396,,,,,, +14,49749,,,,,,,,,,,,0.06974171102046967,,,,,, +14,49799,,,,,,,,,,,,0.07741338759660721,,,,,, +14,49849,,,,,,,,,,,,0.08693782985210419,,,,,, +14,49899,,,,,,,,,,,,0.07066665589809418,,,,,, +14,49949,,,,,,,,,,,,0.07734251022338867,,,,,, +14,49999,,,,,,,,,,,,0.07866265624761581,,,,,, +14,50049,,,,,,,,,,,,0.07566016912460327,,,,,, +14,50099,,,,,,,,,,,,0.07402338087558746,,,,,, +14,50149,,,,,,,,,,,,0.07397493720054626,,,,,, +14,50199,,,,,,,,,,,,0.07929755747318268,,,,,, +14,50249,,,,,,,,,,,,0.08213561773300171,,,,,, +14,50299,,,,,,,,,,,,0.09688541293144226,,,,,, +14,50349,,,,,,,,,,,,0.0777711272239685,,,,,, +14,50399,,,,,,,,,,,,0.07689757645130157,,,,,, +14,50449,,,,,,,,,,,,0.08335753530263901,,,,,, +14,50499,,,,,,,,,,,,0.0820460319519043,,,,,, +14,50549,,,,,,,,,,,,0.08264321833848953,,,,,, +14,50599,,,,,,,,,,,,0.08246473968029022,,,,,, +14,50649,,,,,,,,,,,,0.07751701772212982,,,,,, +14,50699,,,,,,,,,,,,0.06655453145503998,,,,,, +14,50749,,,,,,,,,,,,0.07894149422645569,,,,,, +14,50799,,,,,,,,,,,,0.07492534816265106,,,,,, +14,50849,,,,,,,,,,,,0.07551830261945724,,,,,, +14,50899,,,,,,,,,,,,0.07030284404754639,,,,,, +14,50949,,,,,,,,,,,,0.08157026767730713,,,,,, +14,50999,,,,,,,,,,,,0.07440711557865143,,,,,, +14,51049,,,,,,,,,,,,0.07158912718296051,,,,,, +14,51099,,,,,,,,,,,,0.07163339108228683,,,,,, +14,51149,,,,,,,,,,,,0.0675167664885521,,,,,, +14,51199,,,,,,,,,,,,0.0679454430937767,,,,,, +14,51249,,,,,,,,,,,,0.08018864691257477,,,,,, +14,51299,,,,,,,,,,,,0.07238331437110901,,,,,, +14,51349,,,,,,,,,,,,0.08133591711521149,,,,,, +14,51399,,,,,,,,,,,,0.057001177221536636,,,,,, +14,51449,,,,,,,,,,,,0.07588816434144974,,,,,, +14,51499,,,,,,,,,,,,0.07271149754524231,,,,,, +14,51549,,,,,,,,,,,,0.08009596168994904,,,,,, +14,51599,,,,,,,,,,,,0.06991228461265564,,,,,, +14,51629,,,,,,,,,,,,,0.23465906083583832,0.07830361276865005,0.32908010482788086,0.05771994590759277,0.32484298944473267,0.07830361276865005 +14,51629,,,,,,,0.23764124512672424,0.07727541774511337,0.25712817907333374,0.06576484441757202,0.24222463369369507,,,,,,, +15,51649,,,,,,,,,,,,0.08114748448133469,,,,,, +15,51699,,,,,,,,,,,,0.07415793091058731,,,,,, +15,51749,,,,,,,,,,,,0.07631699740886688,,,,,, +15,51799,,,,,,,,,,,,0.07004168629646301,,,,,, +15,51849,,,,,,,,,,,,0.08143037557601929,,,,,, +15,51899,,,,,,,,,,,,0.0805041491985321,,,,,, +15,51949,,,,,,,,,,,,0.07492274791002274,,,,,, +15,51999,,,,,,,,,,,,0.07013441622257233,,,,,, +15,52049,,,,,,,,,,,,0.06784237921237946,,,,,, +15,52099,,,,,,,,,,,,0.07206235826015472,,,,,, +15,52149,,,,,,,,,,,,0.07956114411354065,,,,,, +15,52199,,,,,,,,,,,,0.0736580565571785,,,,,, +15,52249,,,,,,,,,,,,0.08459889888763428,,,,,, +15,52299,,,,,,,,,,,,0.06427201628684998,,,,,, +15,52349,,,,,,,,,,,,0.07642138749361038,,,,,, +15,52399,,,,,,,,,,,,0.07062661647796631,,,,,, +15,52449,,,,,,,,,,,,0.08079013228416443,,,,,, +15,52499,,,,,,,,,,,,0.07547178119421005,,,,,, +15,52549,,,,,,,,,,,,0.07514536380767822,,,,,, +15,52599,,,,,,,,,,,,0.07829469442367554,,,,,, +15,52649,,,,,,,,,,,,0.09574391692876816,,,,,, +15,52699,,,,,,,,,,,,0.07323375344276428,,,,,, +15,52749,,,,,,,,,,,,0.07321976870298386,,,,,, +15,52799,,,,,,,,,,,,0.08056007325649261,,,,,, +15,52849,,,,,,,,,,,,0.06871224194765091,,,,,, +15,52899,,,,,,,,,,,,0.1020679846405983,,,,,, +15,52949,,,,,,,,,,,,0.07176882028579712,,,,,, +15,52999,,,,,,,,,,,,0.06634387373924255,,,,,, +15,53049,,,,,,,,,,,,0.07954095304012299,,,,,, +15,53099,,,,,,,,,,,,0.08027832210063934,,,,,, +15,53149,,,,,,,,,,,,0.08701345324516296,,,,,, +15,53199,,,,,,,,,,,,0.06800326704978943,,,,,, +15,53249,,,,,,,,,,,,0.08053722977638245,,,,,, +15,53299,,,,,,,,,,,,0.08781053870916367,,,,,, +15,53349,,,,,,,,,,,,0.08776602149009705,,,,,, +15,53399,,,,,,,,,,,,0.08056650310754776,,,,,, +15,53449,,,,,,,,,,,,0.08189404010772705,,,,,, +15,53499,,,,,,,,,,,,0.07683467119932175,,,,,, +15,53549,,,,,,,,,,,,0.06451262533664703,,,,,, +15,53599,,,,,,,,,,,,0.08628883957862854,,,,,, +15,53649,,,,,,,,,,,,0.08646771311759949,,,,,, +15,53699,,,,,,,,,,,,0.07354496419429779,,,,,, +15,53749,,,,,,,,,,,,0.08321261405944824,,,,,, +15,53799,,,,,,,,,,,,0.0827643871307373,,,,,, +15,53849,,,,,,,,,,,,0.0816812515258789,,,,,, +15,53899,,,,,,,,,,,,0.08799061924219131,,,,,, +15,53949,,,,,,,,,,,,0.07185161113739014,,,,,, +15,53999,,,,,,,,,,,,0.07678830623626709,,,,,, +15,54049,,,,,,,,,,,,0.06940917670726776,,,,,, +15,54099,,,,,,,,,,,,0.07793689519166946,,,,,, +15,54149,,,,,,,,,,,,0.07277876138687134,,,,,, +15,54199,,,,,,,,,,,,0.07312078773975372,,,,,, +15,54249,,,,,,,,,,,,0.07652591168880463,,,,,, +15,54299,,,,,,,,,,,,0.07618062198162079,,,,,, +15,54349,,,,,,,,,,,,0.06347113847732544,,,,,, +15,54399,,,,,,,,,,,,0.07129397988319397,,,,,, +15,54449,,,,,,,,,,,,0.07985353469848633,,,,,, +15,54499,,,,,,,,,,,,0.07682399451732635,,,,,, +15,54549,,,,,,,,,,,,0.07795621454715729,,,,,, +15,54599,,,,,,,,,,,,0.07623469829559326,,,,,, +15,54649,,,,,,,,,,,,0.08166507631540298,,,,,, +15,54699,,,,,,,,,,,,0.06309354305267334,,,,,, +15,54749,,,,,,,,,,,,0.06966493278741837,,,,,, +15,54799,,,,,,,,,,,,0.08021091669797897,,,,,, +15,54849,,,,,,,,,,,,0.07976523041725159,,,,,, +15,54899,,,,,,,,,,,,0.06071236729621887,,,,,, +15,54949,,,,,,,,,,,,0.07872824370861053,,,,,, +15,54999,,,,,,,,,,,,0.07815088331699371,,,,,, +15,55049,,,,,,,,,,,,0.08295737206935883,,,,,, +15,55071,,,,,,,,,,,,,0.23873844742774963,0.08052495867013931,0.30710873007774353,0.03098893165588379,0.29251033067703247,0.08052495867013931 +15,55071,,,,,,,0.23673368990421295,0.07672657072544098,0.2693692743778229,0.07239872217178345,0.2525362968444824,,,,,,, +16,55099,,,,,,,,,,,,0.08498941361904144,,,,,, +16,55149,,,,,,,,,,,,0.07735143601894379,,,,,, +16,55199,,,,,,,,,,,,0.07757158577442169,,,,,, +16,55249,,,,,,,,,,,,0.06685573607683182,,,,,, +16,55299,,,,,,,,,,,,0.07079476863145828,,,,,, +16,55349,,,,,,,,,,,,0.08784729242324829,,,,,, +16,55399,,,,,,,,,,,,0.07542400062084198,,,,,, +16,55449,,,,,,,,,,,,0.07350704073905945,,,,,, +16,55499,,,,,,,,,,,,0.08660843968391418,,,,,, +16,55549,,,,,,,,,,,,0.08863122016191483,,,,,, +16,55599,,,,,,,,,,,,0.08001087605953217,,,,,, +16,55649,,,,,,,,,,,,0.08004162460565567,,,,,, +16,55699,,,,,,,,,,,,0.07262712717056274,,,,,, +16,55749,,,,,,,,,,,,0.08392953127622604,,,,,, +16,55799,,,,,,,,,,,,0.08061109483242035,,,,,, +16,55849,,,,,,,,,,,,0.07437179982662201,,,,,, +16,55899,,,,,,,,,,,,0.0777948722243309,,,,,, +16,55949,,,,,,,,,,,,0.07621874660253525,,,,,, +16,55999,,,,,,,,,,,,0.07948678731918335,,,,,, +16,56049,,,,,,,,,,,,0.07965511083602905,,,,,, +16,56099,,,,,,,,,,,,0.07888032495975494,,,,,, +16,56149,,,,,,,,,,,,0.07411874830722809,,,,,, +16,56199,,,,,,,,,,,,0.07329687476158142,,,,,, +16,56249,,,,,,,,,,,,0.07684943079948425,,,,,, +16,56299,,,,,,,,,,,,0.07828420400619507,,,,,, +16,56349,,,,,,,,,,,,0.07253077626228333,,,,,, +16,56399,,,,,,,,,,,,0.075327567756176,,,,,, +16,56449,,,,,,,,,,,,0.0673600286245346,,,,,, +16,56499,,,,,,,,,,,,0.0634135976433754,,,,,, +16,56549,,,,,,,,,,,,0.07316942512989044,,,,,, +16,56599,,,,,,,,,,,,0.07990488409996033,,,,,, +16,56649,,,,,,,,,,,,0.08405221998691559,,,,,, +16,56699,,,,,,,,,,,,0.07692407071590424,,,,,, +16,56749,,,,,,,,,,,,0.07022830843925476,,,,,, +16,56799,,,,,,,,,,,,0.06746231764554977,,,,,, +16,56849,,,,,,,,,,,,0.07671432197093964,,,,,, +16,56899,,,,,,,,,,,,0.08879496157169342,,,,,, +16,56949,,,,,,,,,,,,0.08540225028991699,,,,,, +16,56999,,,,,,,,,,,,0.07722592353820801,,,,,, +16,57049,,,,,,,,,,,,0.07148022204637527,,,,,, +16,57099,,,,,,,,,,,,0.06660300493240356,,,,,, +16,57149,,,,,,,,,,,,0.07594123482704163,,,,,, +16,57199,,,,,,,,,,,,0.06819954514503479,,,,,, +16,57249,,,,,,,,,,,,0.07684236764907837,,,,,, +16,57299,,,,,,,,,,,,0.07058079540729523,,,,,, +16,57349,,,,,,,,,,,,0.07518597692251205,,,,,, +16,57399,,,,,,,,,,,,0.08032350242137909,,,,,, +16,57449,,,,,,,,,,,,0.07233312726020813,,,,,, +16,57499,,,,,,,,,,,,0.07687753438949585,,,,,, +16,57549,,,,,,,,,,,,0.07694539427757263,,,,,, +16,57599,,,,,,,,,,,,0.08304985612630844,,,,,, +16,57649,,,,,,,,,,,,0.06967013329267502,,,,,, +16,57699,,,,,,,,,,,,0.06682093441486359,,,,,, +16,57749,,,,,,,,,,,,0.08051508665084839,,,,,, +16,57799,,,,,,,,,,,,0.0783267617225647,,,,,, +16,57849,,,,,,,,,,,,0.08286158740520477,,,,,, +16,57899,,,,,,,,,,,,0.06942860037088394,,,,,, +16,57949,,,,,,,,,,,,0.07846041768789291,,,,,, +16,57999,,,,,,,,,,,,0.08213706314563751,,,,,, +16,58049,,,,,,,,,,,,0.06508882343769073,,,,,, +16,58099,,,,,,,,,,,,0.06944704055786133,,,,,, +16,58149,,,,,,,,,,,,0.07655476033687592,,,,,, +16,58199,,,,,,,,,,,,0.07980312407016754,,,,,, +16,58249,,,,,,,,,,,,0.07438406348228455,,,,,, +16,58299,,,,,,,,,,,,0.07307526469230652,,,,,, +16,58349,,,,,,,,,,,,0.07998554408550262,,,,,, +16,58399,,,,,,,,,,,,0.0705723762512207,,,,,, +16,58449,,,,,,,,,,,,0.07735589146614075,,,,,, +16,58499,,,,,,,,,,,,0.07909470796585083,,,,,, +16,58513,,,,,,,,,,,,,0.239381343126297,0.08068270236253738,0.3050374984741211,0.0290907621383667,0.29738283157348633,0.08068270236253738 +16,58513,,,,,,,0.23686987161636353,0.07685593515634537,0.2665943503379822,0.07083559036254883,0.25196003913879395,,,,,,, +17,58549,,,,,,,,,,,,0.07716400176286697,,,,,, +17,58599,,,,,,,,,,,,0.08909346163272858,,,,,, +17,58649,,,,,,,,,,,,0.07133252173662186,,,,,, +17,58699,,,,,,,,,,,,0.08044140040874481,,,,,, +17,58749,,,,,,,,,,,,0.07798712700605392,,,,,, +17,58799,,,,,,,,,,,,0.08334297686815262,,,,,, +17,58849,,,,,,,,,,,,0.08313879370689392,,,,,, +17,58899,,,,,,,,,,,,0.07741715013980865,,,,,, +17,58949,,,,,,,,,,,,0.0679963231086731,,,,,, +17,58999,,,,,,,,,,,,0.06516258418560028,,,,,, +17,59049,,,,,,,,,,,,0.08204498887062073,,,,,, +17,59099,,,,,,,,,,,,0.08405493199825287,,,,,, +17,59149,,,,,,,,,,,,0.07823821902275085,,,,,, +17,59199,,,,,,,,,,,,0.0746341422200203,,,,,, +17,59249,,,,,,,,,,,,0.08622393012046814,,,,,, +17,59299,,,,,,,,,,,,0.07891858369112015,,,,,, +17,59349,,,,,,,,,,,,0.06424076110124588,,,,,, +17,59399,,,,,,,,,,,,0.07072344422340393,,,,,, +17,59449,,,,,,,,,,,,0.07498592138290405,,,,,, +17,59499,,,,,,,,,,,,0.08208136260509491,,,,,, +17,59549,,,,,,,,,,,,0.07044729590415955,,,,,, +17,59599,,,,,,,,,,,,0.06726720184087753,,,,,, +17,59649,,,,,,,,,,,,0.07984991371631622,,,,,, +17,59699,,,,,,,,,,,,0.07068635523319244,,,,,, +17,59749,,,,,,,,,,,,0.07815677672624588,,,,,, +17,59799,,,,,,,,,,,,0.07109206914901733,,,,,, +17,59849,,,,,,,,,,,,0.07763472199440002,,,,,, +17,59899,,,,,,,,,,,,0.0868721604347229,,,,,, +17,59949,,,,,,,,,,,,0.0731029286980629,,,,,, +17,59999,,,,,,,,,,,,0.06753308326005936,,,,,, +17,60049,,,,,,,,,,,,0.07464955002069473,,,,,, +17,60099,,,,,,,,,,,,0.08704960346221924,,,,,, +17,60149,,,,,,,,,,,,0.07159607857465744,,,,,, +17,60199,,,,,,,,,,,,0.08661322295665741,,,,,, +17,60249,,,,,,,,,,,,0.08666065335273743,,,,,, +17,60299,,,,,,,,,,,,0.06970205903053284,,,,,, +17,60349,,,,,,,,,,,,0.07247993350028992,,,,,, +17,60399,,,,,,,,,,,,0.06821025907993317,,,,,, +17,60449,,,,,,,,,,,,0.06853067129850388,,,,,, +17,60499,,,,,,,,,,,,0.07330990582704544,,,,,, +17,60549,,,,,,,,,,,,0.07079209387302399,,,,,, +17,60599,,,,,,,,,,,,0.08187934011220932,,,,,, +17,60649,,,,,,,,,,,,0.06233275681734085,,,,,, +17,60699,,,,,,,,,,,,0.08026123046875,,,,,, +17,60749,,,,,,,,,,,,0.08360252529382706,,,,,, +17,60799,,,,,,,,,,,,0.08345095068216324,,,,,, +17,60849,,,,,,,,,,,,0.07345961779356003,,,,,, +17,60899,,,,,,,,,,,,0.07513034343719482,,,,,, +17,60949,,,,,,,,,,,,0.06821109354496002,,,,,, +17,60999,,,,,,,,,,,,0.07183201611042023,,,,,, +17,61049,,,,,,,,,,,,0.07174123823642731,,,,,, +17,61099,,,,,,,,,,,,0.08031466603279114,,,,,, +17,61149,,,,,,,,,,,,0.082284115254879,,,,,, +17,61199,,,,,,,,,,,,0.07118865847587585,,,,,, +17,61249,,,,,,,,,,,,0.09056441485881805,,,,,, +17,61299,,,,,,,,,,,,0.08295318484306335,,,,,, +17,61349,,,,,,,,,,,,0.09274591505527496,,,,,, +17,61399,,,,,,,,,,,,0.0850566104054451,,,,,, +17,61449,,,,,,,,,,,,0.07403795421123505,,,,,, +17,61499,,,,,,,,,,,,0.07329924404621124,,,,,, +17,61549,,,,,,,,,,,,0.08041085302829742,,,,,, +17,61599,,,,,,,,,,,,0.07560761272907257,,,,,, +17,61649,,,,,,,,,,,,0.06477662920951843,,,,,, +17,61699,,,,,,,,,,,,0.08155792951583862,,,,,, +17,61749,,,,,,,,,,,,0.07493653893470764,,,,,, +17,61799,,,,,,,,,,,,0.07604461908340454,,,,,, +17,61849,,,,,,,,,,,,0.06999550759792328,,,,,, +17,61899,,,,,,,,,,,,0.07781456410884857,,,,,, +17,61949,,,,,,,,,,,,0.07588176429271698,,,,,, +17,61955,,,,,,,,,,,,,0.2392866164445877,0.08051391690969467,0.30153700709342957,0.031121909618377686,0.29317620396614075,0.08051391690969467 +17,61955,,,,,,,0.23525026440620422,0.0759735181927681,0.28563082218170166,0.08151274919509888,0.2694987952709198,,,,,,, +18,61999,,,,,,,,,,,,0.09379594027996063,,,,,, +18,62049,,,,,,,,,,,,0.08042123913764954,,,,,, +18,62099,,,,,,,,,,,,0.07293254137039185,,,,,, +18,62149,,,,,,,,,,,,0.05792972445487976,,,,,, +18,62199,,,,,,,,,,,,0.08540496230125427,,,,,, +18,62249,,,,,,,,,,,,0.0745244175195694,,,,,, +18,62299,,,,,,,,,,,,0.0787520557641983,,,,,, +18,62349,,,,,,,,,,,,0.07821422815322876,,,,,, +18,62399,,,,,,,,,,,,0.07072435319423676,,,,,, +18,62449,,,,,,,,,,,,0.08735359460115433,,,,,, +18,62499,,,,,,,,,,,,0.07470165938138962,,,,,, +18,62549,,,,,,,,,,,,0.07140333950519562,,,,,, +18,62599,,,,,,,,,,,,0.08235548436641693,,,,,, +18,62649,,,,,,,,,,,,0.07036539912223816,,,,,, +18,62699,,,,,,,,,,,,0.07162101566791534,,,,,, +18,62749,,,,,,,,,,,,0.06588821113109589,,,,,, +18,62799,,,,,,,,,,,,0.0597289502620697,,,,,, +18,62849,,,,,,,,,,,,0.08252734690904617,,,,,, +18,62899,,,,,,,,,,,,0.06696260720491409,,,,,, +18,62949,,,,,,,,,,,,0.08160519599914551,,,,,, +18,62999,,,,,,,,,,,,0.06569766998291016,,,,,, +18,63049,,,,,,,,,,,,0.07963257282972336,,,,,, +18,63099,,,,,,,,,,,,0.07219628989696503,,,,,, +18,63149,,,,,,,,,,,,0.06727150082588196,,,,,, +18,63199,,,,,,,,,,,,0.0658520981669426,,,,,, +18,63249,,,,,,,,,,,,0.06757871061563492,,,,,, +18,63299,,,,,,,,,,,,0.07900168001651764,,,,,, +18,63349,,,,,,,,,,,,0.07850223779678345,,,,,, +18,63399,,,,,,,,,,,,0.07784266769886017,,,,,, +18,63449,,,,,,,,,,,,0.07613901793956757,,,,,, +18,63499,,,,,,,,,,,,0.06961037218570709,,,,,, +18,63549,,,,,,,,,,,,0.07580988109111786,,,,,, +18,63599,,,,,,,,,,,,0.07308322191238403,,,,,, +18,63649,,,,,,,,,,,,0.06670046597719193,,,,,, +18,63699,,,,,,,,,,,,0.09106748551130295,,,,,, +18,63749,,,,,,,,,,,,0.08544206619262695,,,,,, +18,63799,,,,,,,,,,,,0.07779937982559204,,,,,, +18,63849,,,,,,,,,,,,0.06369943171739578,,,,,, +18,63899,,,,,,,,,,,,0.09099362790584564,,,,,, +18,63949,,,,,,,,,,,,0.06945927441120148,,,,,, +18,63999,,,,,,,,,,,,0.07567855715751648,,,,,, +18,64049,,,,,,,,,,,,0.0761549100279808,,,,,, +18,64099,,,,,,,,,,,,0.06355227530002594,,,,,, +18,64149,,,,,,,,,,,,0.07023780047893524,,,,,, +18,64199,,,,,,,,,,,,0.07810094952583313,,,,,, +18,64249,,,,,,,,,,,,0.06636596471071243,,,,,, +18,64299,,,,,,,,,,,,0.06695374846458435,,,,,, +18,64349,,,,,,,,,,,,0.06273571401834488,,,,,, +18,64399,,,,,,,,,,,,0.07395334541797638,,,,,, +18,64449,,,,,,,,,,,,0.07158651202917099,,,,,, +18,64499,,,,,,,,,,,,0.07212190330028534,,,,,, +18,64549,,,,,,,,,,,,0.07762353867292404,,,,,, +18,64599,,,,,,,,,,,,0.07486304640769958,,,,,, +18,64649,,,,,,,,,,,,0.0770791620016098,,,,,, +18,64699,,,,,,,,,,,,0.07623247802257538,,,,,, +18,64749,,,,,,,,,,,,0.06876935064792633,,,,,, +18,64799,,,,,,,,,,,,0.07076896727085114,,,,,, +18,64849,,,,,,,,,,,,0.07567285001277924,,,,,, +18,64899,,,,,,,,,,,,0.07273899018764496,,,,,, +18,64949,,,,,,,,,,,,0.07962120324373245,,,,,, +18,64999,,,,,,,,,,,,0.07962789386510849,,,,,, +18,65049,,,,,,,,,,,,0.07183598726987839,,,,,, +18,65099,,,,,,,,,,,,0.08248297870159149,,,,,, +18,65149,,,,,,,,,,,,0.07067126780748367,,,,,, +18,65199,,,,,,,,,,,,0.0791037529706955,,,,,, +18,65249,,,,,,,,,,,,0.06997378915548325,,,,,, +18,65299,,,,,,,,,,,,0.07742749899625778,,,,,, +18,65349,,,,,,,,,,,,0.06438937783241272,,,,,, +18,65397,,,,,,,,,,,,,0.2346237748861313,0.07748830318450928,0.302746444940567,0.06753110885620117,0.293963223695755,0.07748830318450928 +18,65397,,,,,,,0.2344544529914856,0.07552165538072586,0.29498639702796936,0.08696645498275757,0.27706974744796753,,,,,,, +19,65399,,,,,,,,,,,,0.07950933277606964,,,,,, +19,65449,,,,,,,,,,,,0.06345745921134949,,,,,, +19,65499,,,,,,,,,,,,0.08565559983253479,,,,,, +19,65549,,,,,,,,,,,,0.09008897095918655,,,,,, +19,65599,,,,,,,,,,,,0.06945273280143738,,,,,, +19,65649,,,,,,,,,,,,0.07657905668020248,,,,,, +19,65699,,,,,,,,,,,,0.07403731346130371,,,,,, +19,65749,,,,,,,,,,,,0.07502144575119019,,,,,, +19,65799,,,,,,,,,,,,0.07946494221687317,,,,,, +19,65849,,,,,,,,,,,,0.08538037538528442,,,,,, +19,65899,,,,,,,,,,,,0.07796893268823624,,,,,, +19,65949,,,,,,,,,,,,0.08403950184583664,,,,,, +19,65999,,,,,,,,,,,,0.08884218335151672,,,,,, +19,66049,,,,,,,,,,,,0.0787438154220581,,,,,, +19,66099,,,,,,,,,,,,0.07727953046560287,,,,,, +19,66149,,,,,,,,,,,,0.07645283639431,,,,,, +19,66199,,,,,,,,,,,,0.08161311596632004,,,,,, +19,66249,,,,,,,,,,,,0.07253788411617279,,,,,, +19,66299,,,,,,,,,,,,0.08781168609857559,,,,,, +19,66349,,,,,,,,,,,,0.07782302796840668,,,,,, +19,66399,,,,,,,,,,,,0.08410685509443283,,,,,, +19,66449,,,,,,,,,,,,0.07026486098766327,,,,,, +19,66499,,,,,,,,,,,,0.07753592729568481,,,,,, +19,66549,,,,,,,,,,,,0.066830575466156,,,,,, +19,66599,,,,,,,,,,,,0.0699569433927536,,,,,, +19,66649,,,,,,,,,,,,0.08270513266324997,,,,,, +19,66699,,,,,,,,,,,,0.0777973085641861,,,,,, +19,66749,,,,,,,,,,,,0.07230120897293091,,,,,, +19,66799,,,,,,,,,,,,0.08202450722455978,,,,,, +19,66849,,,,,,,,,,,,0.08196006715297699,,,,,, +19,66899,,,,,,,,,,,,0.064767986536026,,,,,, +19,66949,,,,,,,,,,,,0.08097894489765167,,,,,, +19,66999,,,,,,,,,,,,0.0831371545791626,,,,,, +19,67049,,,,,,,,,,,,0.08998091518878937,,,,,, +19,67099,,,,,,,,,,,,0.08869251608848572,,,,,, +19,67149,,,,,,,,,,,,0.07209601998329163,,,,,, +19,67199,,,,,,,,,,,,0.080759696662426,,,,,, +19,67249,,,,,,,,,,,,0.07801002264022827,,,,,, +19,67299,,,,,,,,,,,,0.08639862388372421,,,,,, +19,67349,,,,,,,,,,,,0.07736151665449142,,,,,, +19,67399,,,,,,,,,,,,0.07283934950828552,,,,,, +19,67449,,,,,,,,,,,,0.08250641822814941,,,,,, +19,67499,,,,,,,,,,,,0.062238968908786774,,,,,, +19,67549,,,,,,,,,,,,0.074530228972435,,,,,, +19,67599,,,,,,,,,,,,0.08048957586288452,,,,,, +19,67649,,,,,,,,,,,,0.07556074857711792,,,,,, +19,67699,,,,,,,,,,,,0.07759694755077362,,,,,, +19,67749,,,,,,,,,,,,0.08404245972633362,,,,,, +19,67799,,,,,,,,,,,,0.08249622583389282,,,,,, +19,67849,,,,,,,,,,,,0.07594959437847137,,,,,, +19,67899,,,,,,,,,,,,0.06968872249126434,,,,,, +19,67949,,,,,,,,,,,,0.076008141040802,,,,,, +19,67999,,,,,,,,,,,,0.08029109984636307,,,,,, +19,68049,,,,,,,,,,,,0.07070997357368469,,,,,, +19,68099,,,,,,,,,,,,0.06826833635568619,,,,,, +19,68149,,,,,,,,,,,,0.07217685133218765,,,,,, +19,68199,,,,,,,,,,,,0.07636059075593948,,,,,, +19,68249,,,,,,,,,,,,0.07638131082057953,,,,,, +19,68299,,,,,,,,,,,,0.08123119175434113,,,,,, +19,68349,,,,,,,,,,,,0.07276570796966553,,,,,, +19,68399,,,,,,,,,,,,0.08092321455478668,,,,,, +19,68449,,,,,,,,,,,,0.0891924798488617,,,,,, +19,68499,,,,,,,,,,,,0.07457389682531357,,,,,, +19,68549,,,,,,,,,,,,0.07427503168582916,,,,,, +19,68599,,,,,,,,,,,,0.08496499061584473,,,,,, +19,68649,,,,,,,,,,,,0.08693062514066696,,,,,, +19,68699,,,,,,,,,,,,0.0741879791021347,,,,,, +19,68749,,,,,,,,,,,,0.08221006393432617,,,,,, +19,68799,,,,,,,,,,,,0.08309248089790344,,,,,, +19,68839,,,,,,,,,,,,,0.23611578345298767,0.077767513692379,0.30833563208580017,0.0641711950302124,0.29921045899391174,0.077767513692379 +19,68839,,,,,,,0.2349715530872345,0.07687094062566757,0.2701919972896576,0.07065284252166748,0.272065132856369,,,,,,, +20,68849,,,,,,,,,,,,0.08607500791549683,,,,,, +20,68899,,,,,,,,,,,,0.07098609209060669,,,,,, +20,68949,,,,,,,,,,,,0.07872775197029114,,,,,, +20,68999,,,,,,,,,,,,0.07631440460681915,,,,,, +20,69049,,,,,,,,,,,,0.08399458229541779,,,,,, +20,69099,,,,,,,,,,,,0.06957167387008667,,,,,, +20,69149,,,,,,,,,,,,0.07224623113870621,,,,,, +20,69199,,,,,,,,,,,,0.0810132771730423,,,,,, +20,69249,,,,,,,,,,,,0.0731300562620163,,,,,, +20,69299,,,,,,,,,,,,0.07379521429538727,,,,,, +20,69349,,,,,,,,,,,,0.07165655493736267,,,,,, +20,69399,,,,,,,,,,,,0.08389236032962799,,,,,, +20,69449,,,,,,,,,,,,0.07372532039880753,,,,,, +20,69499,,,,,,,,,,,,0.08689884096384048,,,,,, +20,69549,,,,,,,,,,,,0.08017950505018234,,,,,, +20,69599,,,,,,,,,,,,0.07396278530359268,,,,,, +20,69649,,,,,,,,,,,,0.06417438387870789,,,,,, +20,69699,,,,,,,,,,,,0.08112665265798569,,,,,, +20,69749,,,,,,,,,,,,0.06686155498027802,,,,,, +20,69799,,,,,,,,,,,,0.06579728424549103,,,,,, +20,69849,,,,,,,,,,,,0.07089243829250336,,,,,, +20,69899,,,,,,,,,,,,0.07142779976129532,,,,,, +20,69949,,,,,,,,,,,,0.0676237940788269,,,,,, +20,69999,,,,,,,,,,,,0.07474014163017273,,,,,, +20,70049,,,,,,,,,,,,0.06966215372085571,,,,,, +20,70099,,,,,,,,,,,,0.07584848999977112,,,,,, +20,70149,,,,,,,,,,,,0.07543401420116425,,,,,, +20,70199,,,,,,,,,,,,0.065335214138031,,,,,, +20,70249,,,,,,,,,,,,0.07733039557933807,,,,,, +20,70299,,,,,,,,,,,,0.07503609359264374,,,,,, +20,70349,,,,,,,,,,,,0.08306826651096344,,,,,, +20,70399,,,,,,,,,,,,0.08127442002296448,,,,,, +20,70449,,,,,,,,,,,,0.0661536306142807,,,,,, +20,70499,,,,,,,,,,,,0.07021749019622803,,,,,, +20,70549,,,,,,,,,,,,0.07403410971164703,,,,,, +20,70599,,,,,,,,,,,,0.06473185122013092,,,,,, +20,70649,,,,,,,,,,,,0.0738498866558075,,,,,, +20,70699,,,,,,,,,,,,0.07154476642608643,,,,,, +20,70749,,,,,,,,,,,,0.07904824614524841,,,,,, +20,70799,,,,,,,,,,,,0.0720033273100853,,,,,, +20,70849,,,,,,,,,,,,0.07611611485481262,,,,,, +20,70899,,,,,,,,,,,,0.07910361886024475,,,,,, +20,70949,,,,,,,,,,,,0.07367343455553055,,,,,, +20,70999,,,,,,,,,,,,0.07998447865247726,,,,,, +20,71049,,,,,,,,,,,,0.06912325322628021,,,,,, +20,71099,,,,,,,,,,,,0.0704394057393074,,,,,, +20,71149,,,,,,,,,,,,0.06672821938991547,,,,,, +20,71199,,,,,,,,,,,,0.0769028291106224,,,,,, +20,71249,,,,,,,,,,,,0.06890003383159637,,,,,, +20,71299,,,,,,,,,,,,0.06374765932559967,,,,,, +20,71349,,,,,,,,,,,,0.07769837975502014,,,,,, +20,71399,,,,,,,,,,,,0.07969067245721817,,,,,, +20,71449,,,,,,,,,,,,0.08223744481801987,,,,,, +20,71499,,,,,,,,,,,,0.08036766946315765,,,,,, +20,71549,,,,,,,,,,,,0.06784602999687195,,,,,, +20,71599,,,,,,,,,,,,0.06786570698022842,,,,,, +20,71649,,,,,,,,,,,,0.0693543553352356,,,,,, +20,71699,,,,,,,,,,,,0.06725990772247314,,,,,, +20,71749,,,,,,,,,,,,0.07314850389957428,,,,,, +20,71799,,,,,,,,,,,,0.07486148178577423,,,,,, +20,71849,,,,,,,,,,,,0.07738718390464783,,,,,, +20,71899,,,,,,,,,,,,0.06684193760156631,,,,,, +20,71949,,,,,,,,,,,,0.07293237745761871,,,,,, +20,71999,,,,,,,,,,,,0.07384432852268219,,,,,, +20,72049,,,,,,,,,,,,0.07992760837078094,,,,,, +20,72099,,,,,,,,,,,,0.07829299569129944,,,,,, +20,72149,,,,,,,,,,,,0.06838882714509964,,,,,, +20,72199,,,,,,,,,,,,0.07067307829856873,,,,,, +20,72249,,,,,,,,,,,,0.06653740257024765,,,,,, +20,72281,,,,,,,,,,,,,0.23386740684509277,0.0760817900300026,0.30785030126571655,0.08445662260055542,0.3013134300708771,0.0760817900300026 +20,72281,,,,,,,0.23443475365638733,0.07564153522253036,0.2926848232746124,0.08551651239395142,0.27642595767974854,,,,,,, +21,72299,,,,,,,,,,,,0.06835201382637024,,,,,, +21,72349,,,,,,,,,,,,0.08432290703058243,,,,,, +21,72399,,,,,,,,,,,,0.06788664311170578,,,,,, +21,72449,,,,,,,,,,,,0.06989645957946777,,,,,, +21,72499,,,,,,,,,,,,0.09007994085550308,,,,,, +21,72549,,,,,,,,,,,,0.06361069530248642,,,,,, +21,72599,,,,,,,,,,,,0.07117185741662979,,,,,, +21,72649,,,,,,,,,,,,0.06133098155260086,,,,,, +21,72699,,,,,,,,,,,,0.07470765709877014,,,,,, +21,72749,,,,,,,,,,,,0.07108458131551743,,,,,, +21,72799,,,,,,,,,,,,0.06555461883544922,,,,,, +21,72849,,,,,,,,,,,,0.08028307557106018,,,,,, +21,72899,,,,,,,,,,,,0.06906285136938095,,,,,, +21,72949,,,,,,,,,,,,0.08957867324352264,,,,,, +21,72999,,,,,,,,,,,,0.07475954294204712,,,,,, +21,73049,,,,,,,,,,,,0.06860511749982834,,,,,, +21,73099,,,,,,,,,,,,0.07165244221687317,,,,,, +21,73149,,,,,,,,,,,,0.08460985869169235,,,,,, +21,73199,,,,,,,,,,,,0.0677412897348404,,,,,, +21,73249,,,,,,,,,,,,0.06983418017625809,,,,,, +21,73299,,,,,,,,,,,,0.0725206732749939,,,,,, +21,73349,,,,,,,,,,,,0.07418562471866608,,,,,, +21,73399,,,,,,,,,,,,0.08157770335674286,,,,,, +21,73449,,,,,,,,,,,,0.0814230740070343,,,,,, +21,73499,,,,,,,,,,,,0.07791581749916077,,,,,, +21,73549,,,,,,,,,,,,0.0708855539560318,,,,,, +21,73599,,,,,,,,,,,,0.0596030130982399,,,,,, +21,73649,,,,,,,,,,,,0.0797199159860611,,,,,, +21,73699,,,,,,,,,,,,0.07930076122283936,,,,,, +21,73749,,,,,,,,,,,,0.06924751400947571,,,,,, +21,73799,,,,,,,,,,,,0.08047163486480713,,,,,, +21,73849,,,,,,,,,,,,0.07989458739757538,,,,,, +21,73899,,,,,,,,,,,,0.08093635737895966,,,,,, +21,73949,,,,,,,,,,,,0.07302100956439972,,,,,, +21,73999,,,,,,,,,,,,0.07994835078716278,,,,,, +21,74049,,,,,,,,,,,,0.06265775859355927,,,,,, +21,74099,,,,,,,,,,,,0.0653771460056305,,,,,, +21,74149,,,,,,,,,,,,0.0760968029499054,,,,,, +21,74199,,,,,,,,,,,,0.07763350009918213,,,,,, +21,74249,,,,,,,,,,,,0.0778605118393898,,,,,, +21,74299,,,,,,,,,,,,0.07088988274335861,,,,,, +21,74349,,,,,,,,,,,,0.06904961913824081,,,,,, +21,74399,,,,,,,,,,,,0.0704444870352745,,,,,, +21,74449,,,,,,,,,,,,0.075375497341156,,,,,, +21,74499,,,,,,,,,,,,0.07171455025672913,,,,,, +21,74549,,,,,,,,,,,,0.0764673501253128,,,,,, +21,74599,,,,,,,,,,,,0.07773218303918839,,,,,, +21,74649,,,,,,,,,,,,0.07871245592832565,,,,,, +21,74699,,,,,,,,,,,,0.07539099454879761,,,,,, +21,74749,,,,,,,,,,,,0.07342974841594696,,,,,, +21,74799,,,,,,,,,,,,0.08065104484558105,,,,,, +21,74849,,,,,,,,,,,,0.07305224239826202,,,,,, +21,74899,,,,,,,,,,,,0.0713416114449501,,,,,, +21,74949,,,,,,,,,,,,0.08149254322052002,,,,,, +21,74999,,,,,,,,,,,,0.08229833841323853,,,,,, +21,75049,,,,,,,,,,,,0.06962385773658752,,,,,, +21,75099,,,,,,,,,,,,0.07718273997306824,,,,,, +21,75149,,,,,,,,,,,,0.060656171292066574,,,,,, +21,75199,,,,,,,,,,,,0.07330906391143799,,,,,, +21,75249,,,,,,,,,,,,0.07283355295658112,,,,,, +21,75299,,,,,,,,,,,,0.07159383594989777,,,,,, +21,75349,,,,,,,,,,,,0.06745533645153046,,,,,, +21,75399,,,,,,,,,,,,0.08762232959270477,,,,,, +21,75449,,,,,,,,,,,,0.06538362801074982,,,,,, +21,75499,,,,,,,,,,,,0.08701483905315399,,,,,, +21,75549,,,,,,,,,,,,0.07733525335788727,,,,,, +21,75599,,,,,,,,,,,,0.07891190052032471,,,,,, +21,75649,,,,,,,,,,,,0.07294143736362457,,,,,, +21,75699,,,,,,,,,,,,0.0695624053478241,,,,,, +21,75723,,,,,,,,,,,,,0.24065959453582764,0.08182734996080399,0.29430320858955383,0.015316426753997803,0.28570061922073364,0.08182734996080399 +21,75723,,,,,,,0.2336660474538803,0.07515598088502884,0.30239033699035645,0.09138691425323486,0.2839046120643616,,,,,,, +22,75749,,,,,,,,,,,,0.07730819284915924,,,,,, +22,75799,,,,,,,,,,,,0.08086264133453369,,,,,, +22,75849,,,,,,,,,,,,0.07933546602725983,,,,,, +22,75899,,,,,,,,,,,,0.07850980758666992,,,,,, +22,75949,,,,,,,,,,,,0.07895992696285248,,,,,, +22,75999,,,,,,,,,,,,0.0892009511590004,,,,,, +22,76049,,,,,,,,,,,,0.07449260354042053,,,,,, +22,76099,,,,,,,,,,,,0.07276400178670883,,,,,, +22,76149,,,,,,,,,,,,0.08188726752996445,,,,,, +22,76199,,,,,,,,,,,,0.07594738900661469,,,,,, +22,76249,,,,,,,,,,,,0.08597159385681152,,,,,, +22,76299,,,,,,,,,,,,0.06600158661603928,,,,,, +22,76349,,,,,,,,,,,,0.07117711007595062,,,,,, +22,76399,,,,,,,,,,,,0.07857807725667953,,,,,, +22,76449,,,,,,,,,,,,0.07247136533260345,,,,,, +22,76499,,,,,,,,,,,,0.06183215230703354,,,,,, +22,76549,,,,,,,,,,,,0.07844424247741699,,,,,, +22,76599,,,,,,,,,,,,0.08369244635105133,,,,,, +22,76649,,,,,,,,,,,,0.08474327623844147,,,,,, +22,76699,,,,,,,,,,,,0.07056723535060883,,,,,, +22,76749,,,,,,,,,,,,0.06385516375303268,,,,,, +22,76799,,,,,,,,,,,,0.07634700834751129,,,,,, +22,76849,,,,,,,,,,,,0.07644622027873993,,,,,, +22,76899,,,,,,,,,,,,0.07224465906620026,,,,,, +22,76949,,,,,,,,,,,,0.07640348374843597,,,,,, +22,76999,,,,,,,,,,,,0.0751594677567482,,,,,, +22,77049,,,,,,,,,,,,0.06520523130893707,,,,,, +22,77099,,,,,,,,,,,,0.08448237180709839,,,,,, +22,77149,,,,,,,,,,,,0.06836429983377457,,,,,, +22,77199,,,,,,,,,,,,0.07980595529079437,,,,,, +22,77249,,,,,,,,,,,,0.07942073792219162,,,,,, +22,77299,,,,,,,,,,,,0.0791676938533783,,,,,, +22,77349,,,,,,,,,,,,0.06500202417373657,,,,,, +22,77399,,,,,,,,,,,,0.08174901455640793,,,,,, +22,77449,,,,,,,,,,,,0.07890357077121735,,,,,, +22,77499,,,,,,,,,,,,0.08501368761062622,,,,,, +22,77549,,,,,,,,,,,,0.06928744912147522,,,,,, +22,77599,,,,,,,,,,,,0.08672038465738297,,,,,, +22,77649,,,,,,,,,,,,0.08277004957199097,,,,,, +22,77699,,,,,,,,,,,,0.07090524584054947,,,,,, +22,77749,,,,,,,,,,,,0.07752013951539993,,,,,, +22,77799,,,,,,,,,,,,0.08124719560146332,,,,,, +22,77849,,,,,,,,,,,,0.06744161993265152,,,,,, +22,77899,,,,,,,,,,,,0.0683436244726181,,,,,, +22,77949,,,,,,,,,,,,0.06774312257766724,,,,,, +22,77999,,,,,,,,,,,,0.06997954845428467,,,,,, +22,78049,,,,,,,,,,,,0.07307547330856323,,,,,, +22,78099,,,,,,,,,,,,0.0788792222738266,,,,,, +22,78149,,,,,,,,,,,,0.0855211466550827,,,,,, +22,78199,,,,,,,,,,,,0.06344154477119446,,,,,, +22,78249,,,,,,,,,,,,0.07118213176727295,,,,,, +22,78299,,,,,,,,,,,,0.0653160959482193,,,,,, +22,78349,,,,,,,,,,,,0.07887537032365799,,,,,, +22,78399,,,,,,,,,,,,0.06734568625688553,,,,,, +22,78449,,,,,,,,,,,,0.0748879462480545,,,,,, +22,78499,,,,,,,,,,,,0.08017533272504807,,,,,, +22,78549,,,,,,,,,,,,0.09189661592245102,,,,,, +22,78599,,,,,,,,,,,,0.06927023828029633,,,,,, +22,78649,,,,,,,,,,,,0.07509342581033707,,,,,, +22,78699,,,,,,,,,,,,0.08544524759054184,,,,,, +22,78749,,,,,,,,,,,,0.07313594967126846,,,,,, +22,78799,,,,,,,,,,,,0.08000874519348145,,,,,, +22,78849,,,,,,,,,,,,0.074851393699646,,,,,, +22,78899,,,,,,,,,,,,0.06402591615915298,,,,,, +22,78949,,,,,,,,,,,,0.07755566388368607,,,,,, +22,78999,,,,,,,,,,,,0.07279805094003677,,,,,, +22,79049,,,,,,,,,,,,0.08464092016220093,,,,,, +22,79099,,,,,,,,,,,,0.0752352625131607,,,,,, +22,79149,,,,,,,,,,,,0.06917117536067963,,,,,, +22,79165,,,,,,,,,,,,,0.23917490243911743,0.08073761314153671,0.3069351017475128,0.02842998504638672,0.30013537406921387,0.08073761314153671 +22,79165,,,,,,,0.23334933817386627,0.07494252920150757,0.3066002130508423,0.09397929906845093,0.2876483201980591,,,,,,, +23,79199,,,,,,,,,,,,0.07063037157058716,,,,,, +23,79249,,,,,,,,,,,,0.08163890987634659,,,,,, +23,79299,,,,,,,,,,,,0.06436561048030853,,,,,, +23,79349,,,,,,,,,,,,0.05871432647109032,,,,,, +23,79399,,,,,,,,,,,,0.08264507353305817,,,,,, +23,79449,,,,,,,,,,,,0.07437902688980103,,,,,, +23,79499,,,,,,,,,,,,0.06601928174495697,,,,,, +23,79549,,,,,,,,,,,,0.08671558648347855,,,,,, +23,79599,,,,,,,,,,,,0.06332162022590637,,,,,, +23,79649,,,,,,,,,,,,0.07985273003578186,,,,,, +23,79699,,,,,,,,,,,,0.06530116498470306,,,,,, +23,79749,,,,,,,,,,,,0.07262882590293884,,,,,, +23,79799,,,,,,,,,,,,0.06754030287265778,,,,,, +23,79849,,,,,,,,,,,,0.06745052337646484,,,,,, +23,79899,,,,,,,,,,,,0.07955998927354813,,,,,, +23,79949,,,,,,,,,,,,0.07320399582386017,,,,,, +23,79999,,,,,,,,,,,,0.0756092369556427,,,,,, +23,80049,,,,,,,,,,,,0.06812575459480286,,,,,, +23,80099,,,,,,,,,,,,0.08304373919963837,,,,,, +23,80149,,,,,,,,,,,,0.07521641254425049,,,,,, +23,80199,,,,,,,,,,,,0.07582399249076843,,,,,, +23,80249,,,,,,,,,,,,0.07396635413169861,,,,,, +23,80299,,,,,,,,,,,,0.06967578083276749,,,,,, +23,80349,,,,,,,,,,,,0.07794059813022614,,,,,, +23,80399,,,,,,,,,,,,0.07283752411603928,,,,,, +23,80449,,,,,,,,,,,,0.06412288546562195,,,,,, +23,80499,,,,,,,,,,,,0.07376223802566528,,,,,, +23,80549,,,,,,,,,,,,0.0784434825181961,,,,,, +23,80599,,,,,,,,,,,,0.07476852834224701,,,,,, +23,80649,,,,,,,,,,,,0.06850722432136536,,,,,, +23,80699,,,,,,,,,,,,0.07188750058412552,,,,,, +23,80749,,,,,,,,,,,,0.07697776705026627,,,,,, +23,80799,,,,,,,,,,,,0.07522296905517578,,,,,, +23,80849,,,,,,,,,,,,0.07039591670036316,,,,,, +23,80899,,,,,,,,,,,,0.06711329519748688,,,,,, +23,80949,,,,,,,,,,,,0.07409880310297012,,,,,, +23,80999,,,,,,,,,,,,0.07341087609529495,,,,,, +23,81049,,,,,,,,,,,,0.08252975344657898,,,,,, +23,81099,,,,,,,,,,,,0.07167387753725052,,,,,, +23,81149,,,,,,,,,,,,0.07501140981912613,,,,,, +23,81199,,,,,,,,,,,,0.0787430927157402,,,,,, +23,81249,,,,,,,,,,,,0.07182653248310089,,,,,, +23,81299,,,,,,,,,,,,0.07133003324270248,,,,,, +23,81349,,,,,,,,,,,,0.07940860837697983,,,,,, +23,81399,,,,,,,,,,,,0.07240859419107437,,,,,, +23,81449,,,,,,,,,,,,0.07652440667152405,,,,,, +23,81499,,,,,,,,,,,,0.07465435564517975,,,,,, +23,81549,,,,,,,,,,,,0.06582089513540268,,,,,, +23,81599,,,,,,,,,,,,0.08515913039445877,,,,,, +23,81649,,,,,,,,,,,,0.0691542848944664,,,,,, +23,81699,,,,,,,,,,,,0.07784518599510193,,,,,, +23,81749,,,,,,,,,,,,0.08094610273838043,,,,,, +23,81799,,,,,,,,,,,,0.07574394345283508,,,,,, +23,81849,,,,,,,,,,,,0.08413181453943253,,,,,, +23,81899,,,,,,,,,,,,0.07418052852153778,,,,,, +23,81949,,,,,,,,,,,,0.07454468309879303,,,,,, +23,81999,,,,,,,,,,,,0.07886675000190735,,,,,, +23,82049,,,,,,,,,,,,0.08015880733728409,,,,,, +23,82099,,,,,,,,,,,,0.0722830593585968,,,,,, +23,82149,,,,,,,,,,,,0.08135396242141724,,,,,, +23,82199,,,,,,,,,,,,0.07165002822875977,,,,,, +23,82249,,,,,,,,,,,,0.08020564913749695,,,,,, +23,82299,,,,,,,,,,,,0.07602159678936005,,,,,, +23,82349,,,,,,,,,,,,0.07759340852499008,,,,,, +23,82399,,,,,,,,,,,,0.07637499272823334,,,,,, +23,82449,,,,,,,,,,,,0.08000170439481735,,,,,, +23,82499,,,,,,,,,,,,0.08135649561882019,,,,,, +23,82549,,,,,,,,,,,,0.067778080701828,,,,,, +23,82599,,,,,,,,,,,,0.08276816457509995,,,,,, +23,82607,,,,,,,,,,,,,0.23797748982906342,0.0804479569196701,0.296947717666626,0.03191560506820679,0.2924828827381134,0.0804479569196701 +23,82607,,,,,,,0.23222385346889496,0.07440955936908722,0.3169229030609131,0.10041379928588867,0.2976231873035431,,,,,,, +24,82649,,,,,,,,,,,,0.07797851413488388,,,,,, +24,82699,,,,,,,,,,,,0.07667136192321777,,,,,, +24,82749,,,,,,,,,,,,0.07708107680082321,,,,,, +24,82799,,,,,,,,,,,,0.06464128196239471,,,,,, +24,82849,,,,,,,,,,,,0.07102890312671661,,,,,, +24,82899,,,,,,,,,,,,0.07571618258953094,,,,,, +24,82949,,,,,,,,,,,,0.06572867929935455,,,,,, +24,82999,,,,,,,,,,,,0.07160872966051102,,,,,, +24,83049,,,,,,,,,,,,0.06210644543170929,,,,,, +24,83099,,,,,,,,,,,,0.07351940125226974,,,,,, +24,83149,,,,,,,,,,,,0.07813287526369095,,,,,, +24,83199,,,,,,,,,,,,0.07083345949649811,,,,,, +24,83249,,,,,,,,,,,,0.06812658905982971,,,,,, +24,83299,,,,,,,,,,,,0.07439252734184265,,,,,, +24,83349,,,,,,,,,,,,0.08076398819684982,,,,,, +24,83399,,,,,,,,,,,,0.07134009897708893,,,,,, +24,83449,,,,,,,,,,,,0.06528977304697037,,,,,, +24,83499,,,,,,,,,,,,0.07604634761810303,,,,,, +24,83549,,,,,,,,,,,,0.06653077900409698,,,,,, +24,83599,,,,,,,,,,,,0.07767799496650696,,,,,, +24,83649,,,,,,,,,,,,0.07330221682786942,,,,,, +24,83699,,,,,,,,,,,,0.061308130621910095,,,,,, +24,83749,,,,,,,,,,,,0.07622882723808289,,,,,, +24,83799,,,,,,,,,,,,0.0729316771030426,,,,,, +24,83849,,,,,,,,,,,,0.07342630624771118,,,,,, +24,83899,,,,,,,,,,,,0.06350930035114288,,,,,, +24,83949,,,,,,,,,,,,0.06940338015556335,,,,,, +24,83999,,,,,,,,,,,,0.07664210349321365,,,,,, +24,84049,,,,,,,,,,,,0.07576625794172287,,,,,, +24,84099,,,,,,,,,,,,0.07030920684337616,,,,,, +24,84149,,,,,,,,,,,,0.07759717106819153,,,,,, +24,84199,,,,,,,,,,,,0.0639064833521843,,,,,, +24,84249,,,,,,,,,,,,0.06997088342905045,,,,,, +24,84299,,,,,,,,,,,,0.07362952828407288,,,,,, +24,84349,,,,,,,,,,,,0.06487904489040375,,,,,, +24,84399,,,,,,,,,,,,0.0803731232881546,,,,,, +24,84449,,,,,,,,,,,,0.07842043042182922,,,,,, +24,84499,,,,,,,,,,,,0.06511850655078888,,,,,, +24,84549,,,,,,,,,,,,0.06296443194150925,,,,,, +24,84599,,,,,,,,,,,,0.07785756886005402,,,,,, +24,84649,,,,,,,,,,,,0.0756574273109436,,,,,, +24,84699,,,,,,,,,,,,0.07844531536102295,,,,,, +24,84749,,,,,,,,,,,,0.07247431576251984,,,,,, +24,84799,,,,,,,,,,,,0.06801491975784302,,,,,, +24,84849,,,,,,,,,,,,0.07364722341299057,,,,,, +24,84899,,,,,,,,,,,,0.0749565064907074,,,,,, +24,84949,,,,,,,,,,,,0.06937652081251144,,,,,, +24,84999,,,,,,,,,,,,0.07059651613235474,,,,,, +24,85049,,,,,,,,,,,,0.08625515550374985,,,,,, +24,85099,,,,,,,,,,,,0.07464797794818878,,,,,, +24,85149,,,,,,,,,,,,0.08337685465812683,,,,,, +24,85199,,,,,,,,,,,,0.07387644052505493,,,,,, +24,85249,,,,,,,,,,,,0.08326512575149536,,,,,, +24,85299,,,,,,,,,,,,0.0696972981095314,,,,,, +24,85349,,,,,,,,,,,,0.0694754421710968,,,,,, +24,85399,,,,,,,,,,,,0.08263345062732697,,,,,, +24,85449,,,,,,,,,,,,0.07204946875572205,,,,,, +24,85499,,,,,,,,,,,,0.0654488056898117,,,,,, +24,85549,,,,,,,,,,,,0.07946840673685074,,,,,, +24,85599,,,,,,,,,,,,0.06175081431865692,,,,,, +24,85649,,,,,,,,,,,,0.07092137634754181,,,,,, +24,85699,,,,,,,,,,,,0.07693564891815186,,,,,, +24,85749,,,,,,,,,,,,0.07688899338245392,,,,,, +24,85799,,,,,,,,,,,,0.0628863275051117,,,,,, +24,85849,,,,,,,,,,,,0.07815051078796387,,,,,, +24,85899,,,,,,,,,,,,0.07802821695804596,,,,,, +24,85949,,,,,,,,,,,,0.08628972619771957,,,,,, +24,85999,,,,,,,,,,,,0.08135665953159332,,,,,, +24,86049,,,,,,,,,,,,0.07964836061000824,,,,,, +24,86049,,,,,,,,,,,,,0.23822809755802155,0.08063625544309616,0.3014117181301117,0.02964961528778076,0.2953489422798157,0.08063625544309616 +24,86049,,,,,,,0.2316364198923111,0.07407346367835999,0.32324445247650146,0.10447847843170166,0.30342981219291687,,,,,,, +25,86099,,,,,,,,,,,,0.07812617719173431,,,,,, +25,86149,,,,,,,,,,,,0.07630743831396103,,,,,, +25,86199,,,,,,,,,,,,0.0809074267745018,,,,,, +25,86249,,,,,,,,,,,,0.07410991191864014,,,,,, +25,86299,,,,,,,,,,,,0.08005456626415253,,,,,, +25,86349,,,,,,,,,,,,0.07573869824409485,,,,,, +25,86399,,,,,,,,,,,,0.07957543432712555,,,,,, +25,86449,,,,,,,,,,,,0.07919809967279434,,,,,, +25,86499,,,,,,,,,,,,0.07543382048606873,,,,,, +25,86549,,,,,,,,,,,,0.07762842625379562,,,,,, +25,86599,,,,,,,,,,,,0.07440432906150818,,,,,, +25,86649,,,,,,,,,,,,0.07912616431713104,,,,,, +25,86699,,,,,,,,,,,,0.0794752836227417,,,,,, +25,86749,,,,,,,,,,,,0.07342150807380676,,,,,, +25,86799,,,,,,,,,,,,0.06201549991965294,,,,,, +25,86849,,,,,,,,,,,,0.07629859447479248,,,,,, +25,86899,,,,,,,,,,,,0.08748718351125717,,,,,, +25,86949,,,,,,,,,,,,0.0770917683839798,,,,,, +25,86999,,,,,,,,,,,,0.07075772434473038,,,,,, +25,87049,,,,,,,,,,,,0.08310550451278687,,,,,, +25,87099,,,,,,,,,,,,0.07178257405757904,,,,,, +25,87149,,,,,,,,,,,,0.07513967156410217,,,,,, +25,87199,,,,,,,,,,,,0.06781911849975586,,,,,, +25,87249,,,,,,,,,,,,0.08235286921262741,,,,,, +25,87299,,,,,,,,,,,,0.0749194547533989,,,,,, +25,87349,,,,,,,,,,,,0.06857497990131378,,,,,, +25,87399,,,,,,,,,,,,0.08048468828201294,,,,,, +25,87449,,,,,,,,,,,,0.08422785252332687,,,,,, +25,87499,,,,,,,,,,,,0.07395412027835846,,,,,, +25,87549,,,,,,,,,,,,0.07398229837417603,,,,,, +25,87599,,,,,,,,,,,,0.08057813346385956,,,,,, +25,87649,,,,,,,,,,,,0.07498608529567719,,,,,, +25,87699,,,,,,,,,,,,0.08293478190898895,,,,,, +25,87749,,,,,,,,,,,,0.07014159113168716,,,,,, +25,87799,,,,,,,,,,,,0.06946031749248505,,,,,, +25,87849,,,,,,,,,,,,0.07010208070278168,,,,,, +25,87899,,,,,,,,,,,,0.07038998603820801,,,,,, +25,87949,,,,,,,,,,,,0.06866029649972916,,,,,, +25,87999,,,,,,,,,,,,0.08546872437000275,,,,,, +25,88049,,,,,,,,,,,,0.06573796272277832,,,,,, +25,88099,,,,,,,,,,,,0.07155819982290268,,,,,, +25,88149,,,,,,,,,,,,0.0711168646812439,,,,,, +25,88199,,,,,,,,,,,,0.07814484089612961,,,,,, +25,88249,,,,,,,,,,,,0.08389634639024734,,,,,, +25,88299,,,,,,,,,,,,0.07240922749042511,,,,,, +25,88349,,,,,,,,,,,,0.07535599172115326,,,,,, +25,88399,,,,,,,,,,,,0.0673566609621048,,,,,, +25,88449,,,,,,,,,,,,0.06511083990335464,,,,,, +25,88499,,,,,,,,,,,,0.07260192930698395,,,,,, +25,88549,,,,,,,,,,,,0.077727772295475,,,,,, +25,88599,,,,,,,,,,,,0.07464048266410828,,,,,, +25,88649,,,,,,,,,,,,0.06897813826799393,,,,,, +25,88699,,,,,,,,,,,,0.07694196701049805,,,,,, +25,88749,,,,,,,,,,,,0.07652872800827026,,,,,, +25,88799,,,,,,,,,,,,0.06657284498214722,,,,,, +25,88849,,,,,,,,,,,,0.07665394246578217,,,,,, +25,88899,,,,,,,,,,,,0.0746983215212822,,,,,, +25,88949,,,,,,,,,,,,0.054373618215322495,,,,,, +25,88999,,,,,,,,,,,,0.06703312695026398,,,,,, +25,89049,,,,,,,,,,,,0.07113245129585266,,,,,, +25,89099,,,,,,,,,,,,0.06551598012447357,,,,,, +25,89149,,,,,,,,,,,,0.07735748589038849,,,,,, +25,89199,,,,,,,,,,,,0.07691220939159393,,,,,, +25,89249,,,,,,,,,,,,0.07214194536209106,,,,,, +25,89299,,,,,,,,,,,,0.07511299103498459,,,,,, +25,89349,,,,,,,,,,,,0.06782345473766327,,,,,, +25,89399,,,,,,,,,,,,0.07899478822946548,,,,,, +25,89449,,,,,,,,,,,,0.06938721239566803,,,,,, +25,89491,,,,,,,,,,,,,0.23754064738750458,0.07961481064558029,0.3011828064918518,0.04194140434265137,0.2918904721736908,0.07961481064558029 +25,89491,,,,,,,0.23165130615234375,0.07409536093473434,0.3228493928909302,0.10421508550643921,0.3031296730041504,,,,,,, +26,89499,,,,,,,,,,,,0.08214075863361359,,,,,, +26,89549,,,,,,,,,,,,0.07952338457107544,,,,,, +26,89599,,,,,,,,,,,,0.08154566586017609,,,,,, +26,89649,,,,,,,,,,,,0.07466897368431091,,,,,, +26,89699,,,,,,,,,,,,0.07852116227149963,,,,,, +26,89749,,,,,,,,,,,,0.0690363347530365,,,,,, +26,89799,,,,,,,,,,,,0.07291047275066376,,,,,, +26,89849,,,,,,,,,,,,0.07325464487075806,,,,,, +26,89899,,,,,,,,,,,,0.06334147602319717,,,,,, +26,89949,,,,,,,,,,,,0.07496003806591034,,,,,, +26,89999,,,,,,,,,,,,0.06679299473762512,,,,,, +26,90049,,,,,,,,,,,,0.06953954696655273,,,,,, +26,90099,,,,,,,,,,,,0.063844233751297,,,,,, +26,90149,,,,,,,,,,,,0.07781897485256195,,,,,, +26,90199,,,,,,,,,,,,0.062435831874608994,,,,,, +26,90249,,,,,,,,,,,,0.07490892708301544,,,,,, +26,90299,,,,,,,,,,,,0.07624819129705429,,,,,, +26,90349,,,,,,,,,,,,0.08447454869747162,,,,,, +26,90399,,,,,,,,,,,,0.0842551738023758,,,,,, +26,90449,,,,,,,,,,,,0.06943400949239731,,,,,, +26,90499,,,,,,,,,,,,0.06944116950035095,,,,,, +26,90549,,,,,,,,,,,,0.08842850476503372,,,,,, +26,90599,,,,,,,,,,,,0.08040447533130646,,,,,, +26,90649,,,,,,,,,,,,0.07119667530059814,,,,,, +26,90699,,,,,,,,,,,,0.07022134214639664,,,,,, +26,90749,,,,,,,,,,,,0.07317475974559784,,,,,, +26,90799,,,,,,,,,,,,0.08080845326185226,,,,,, +26,90849,,,,,,,,,,,,0.07274116575717926,,,,,, +26,90899,,,,,,,,,,,,0.07166406512260437,,,,,, +26,90949,,,,,,,,,,,,0.06864340603351593,,,,,, +26,90999,,,,,,,,,,,,0.07359999418258667,,,,,, +26,91049,,,,,,,,,,,,0.07256633043289185,,,,,, +26,91099,,,,,,,,,,,,0.07043641060590744,,,,,, +26,91149,,,,,,,,,,,,0.08131545782089233,,,,,, +26,91199,,,,,,,,,,,,0.07562026381492615,,,,,, +26,91249,,,,,,,,,,,,0.07104942947626114,,,,,, +26,91299,,,,,,,,,,,,0.06519642472267151,,,,,, +26,91349,,,,,,,,,,,,0.08074846863746643,,,,,, +26,91399,,,,,,,,,,,,0.08336442708969116,,,,,, +26,91449,,,,,,,,,,,,0.062077175825834274,,,,,, +26,91499,,,,,,,,,,,,0.07462763786315918,,,,,, +26,91549,,,,,,,,,,,,0.0813436210155487,,,,,, +26,91599,,,,,,,,,,,,0.08733318746089935,,,,,, +26,91649,,,,,,,,,,,,0.06910708546638489,,,,,, +26,91699,,,,,,,,,,,,0.08070613443851471,,,,,, +26,91749,,,,,,,,,,,,0.07435107976198196,,,,,, +26,91799,,,,,,,,,,,,0.0783822238445282,,,,,, +26,91849,,,,,,,,,,,,0.07345424592494965,,,,,, +26,91899,,,,,,,,,,,,0.06547972559928894,,,,,, +26,91949,,,,,,,,,,,,0.0850427970290184,,,,,, +26,91999,,,,,,,,,,,,0.06875245273113251,,,,,, +26,92049,,,,,,,,,,,,0.07345135509967804,,,,,, +26,92099,,,,,,,,,,,,0.08938317000865936,,,,,, +26,92149,,,,,,,,,,,,0.07709615677595139,,,,,, +26,92199,,,,,,,,,,,,0.08102431148290634,,,,,, +26,92249,,,,,,,,,,,,0.07671866565942764,,,,,, +26,92299,,,,,,,,,,,,0.07109280675649643,,,,,, +26,92349,,,,,,,,,,,,0.07408581674098969,,,,,, +26,92399,,,,,,,,,,,,0.07490836083889008,,,,,, +26,92449,,,,,,,,,,,,0.0690782368183136,,,,,, +26,92499,,,,,,,,,,,,0.06017209216952324,,,,,, +26,92549,,,,,,,,,,,,0.06734967231750488,,,,,, +26,92599,,,,,,,,,,,,0.07408975064754486,,,,,, +26,92649,,,,,,,,,,,,0.07239515334367752,,,,,, +26,92699,,,,,,,,,,,,0.07384506613016129,,,,,, +26,92749,,,,,,,,,,,,0.0634804293513298,,,,,, +26,92799,,,,,,,,,,,,0.07096055150032043,,,,,, +26,92849,,,,,,,,,,,,0.06511694192886353,,,,,, +26,92899,,,,,,,,,,,,0.0618324801325798,,,,,, +26,92933,,,,,,,,,,,,,0.2355692982673645,0.07860030978918076,0.31437668204307556,0.0541495680809021,0.3073183000087738,0.07860030978918076 +26,92933,,,,,,,0.23128066956996918,0.07389215379953384,0.3266199827194214,0.10666108131408691,0.3063351511955261,,,,,,, +27,92949,,,,,,,,,,,,0.06751774996519089,,,,,, +27,92999,,,,,,,,,,,,0.06434980034828186,,,,,, +27,93049,,,,,,,,,,,,0.07362531125545502,,,,,, +27,93099,,,,,,,,,,,,0.06807230412960052,,,,,, +27,93149,,,,,,,,,,,,0.09028606116771698,,,,,, +27,93199,,,,,,,,,,,,0.07546717673540115,,,,,, +27,93249,,,,,,,,,,,,0.09070964902639389,,,,,, +27,93299,,,,,,,,,,,,0.06658266484737396,,,,,, +27,93349,,,,,,,,,,,,0.07827617228031158,,,,,, +27,93399,,,,,,,,,,,,0.07845254242420197,,,,,, +27,93449,,,,,,,,,,,,0.08397802710533142,,,,,, +27,93499,,,,,,,,,,,,0.056669682264328,,,,,, +27,93549,,,,,,,,,,,,0.06786374747753143,,,,,, +27,93599,,,,,,,,,,,,0.0714249387383461,,,,,, +27,93649,,,,,,,,,,,,0.07489489018917084,,,,,, +27,93699,,,,,,,,,,,,0.08097585290670395,,,,,, +27,93749,,,,,,,,,,,,0.07161924988031387,,,,,, +27,93799,,,,,,,,,,,,0.06794407963752747,,,,,, +27,93849,,,,,,,,,,,,0.08337698876857758,,,,,, +27,93899,,,,,,,,,,,,0.07030629366636276,,,,,, +27,93949,,,,,,,,,,,,0.07581193745136261,,,,,, +27,93999,,,,,,,,,,,,0.06224273517727852,,,,,, +27,94049,,,,,,,,,,,,0.06410855054855347,,,,,, +27,94099,,,,,,,,,,,,0.06713930517435074,,,,,, +27,94149,,,,,,,,,,,,0.07091587036848068,,,,,, +27,94199,,,,,,,,,,,,0.08379492163658142,,,,,, +27,94249,,,,,,,,,,,,0.07527069002389908,,,,,, +27,94299,,,,,,,,,,,,0.07611307501792908,,,,,, +27,94349,,,,,,,,,,,,0.06048008054494858,,,,,, +27,94399,,,,,,,,,,,,0.07263235747814178,,,,,, +27,94449,,,,,,,,,,,,0.07320988923311234,,,,,, +27,94499,,,,,,,,,,,,0.08408934623003006,,,,,, +27,94549,,,,,,,,,,,,0.07132621109485626,,,,,, +27,94599,,,,,,,,,,,,0.07156392931938171,,,,,, +27,94649,,,,,,,,,,,,0.06832219660282135,,,,,, +27,94699,,,,,,,,,,,,0.06354938447475433,,,,,, +27,94749,,,,,,,,,,,,0.07718103379011154,,,,,, +27,94799,,,,,,,,,,,,0.07021841406822205,,,,,, +27,94849,,,,,,,,,,,,0.07608380913734436,,,,,, +27,94899,,,,,,,,,,,,0.06851323693990707,,,,,, +27,94949,,,,,,,,,,,,0.07269757986068726,,,,,, +27,94999,,,,,,,,,,,,0.08360683917999268,,,,,, +27,95049,,,,,,,,,,,,0.08249276876449585,,,,,, +27,95099,,,,,,,,,,,,0.08285461366176605,,,,,, +27,95149,,,,,,,,,,,,0.07432340085506439,,,,,, +27,95199,,,,,,,,,,,,0.07537922263145447,,,,,, +27,95249,,,,,,,,,,,,0.0762304738163948,,,,,, +27,95299,,,,,,,,,,,,0.07472824305295944,,,,,, +27,95349,,,,,,,,,,,,0.07443185150623322,,,,,, +27,95399,,,,,,,,,,,,0.08112756907939911,,,,,, +27,95449,,,,,,,,,,,,0.06617075949907303,,,,,, +27,95499,,,,,,,,,,,,0.07057158648967743,,,,,, +27,95549,,,,,,,,,,,,0.07163488864898682,,,,,, +27,95599,,,,,,,,,,,,0.06929098069667816,,,,,, +27,95649,,,,,,,,,,,,0.07653148472309113,,,,,, +27,95699,,,,,,,,,,,,0.07706966996192932,,,,,, +27,95749,,,,,,,,,,,,0.08665333688259125,,,,,, +27,95799,,,,,,,,,,,,0.07221584022045135,,,,,, +27,95849,,,,,,,,,,,,0.08423368632793427,,,,,, +27,95899,,,,,,,,,,,,0.06275060772895813,,,,,, +27,95949,,,,,,,,,,,,0.08953586220741272,,,,,, +27,95999,,,,,,,,,,,,0.07081907242536545,,,,,, +27,96049,,,,,,,,,,,,0.06650601327419281,,,,,, +27,96099,,,,,,,,,,,,0.06669081747531891,,,,,, +27,96149,,,,,,,,,,,,0.06821011006832123,,,,,, +27,96199,,,,,,,,,,,,0.06557627022266388,,,,,, +27,96249,,,,,,,,,,,,0.06265054643154144,,,,,, +27,96299,,,,,,,,,,,,0.07080549001693726,,,,,, +27,96349,,,,,,,,,,,,0.07613886892795563,,,,,, +27,96375,,,,,,,,,,,,,0.23662836849689484,0.0792553648352623,0.3126923739910126,0.04626685380935669,0.30572202801704407,0.0792553648352623 +27,96375,,,,,,,0.23112435638904572,0.07383453845977783,0.3277009427547455,0.10737448930740356,0.30800968408584595,,,,,,, +28,96399,,,,,,,,,,,,0.07293528318405151,,,,,, +28,96449,,,,,,,,,,,,0.07084846496582031,,,,,, +28,96499,,,,,,,,,,,,0.07215604186058044,,,,,, +28,96549,,,,,,,,,,,,0.0874767005443573,,,,,, +28,96599,,,,,,,,,,,,0.07757173478603363,,,,,, +28,96649,,,,,,,,,,,,0.07626278698444366,,,,,, +28,96699,,,,,,,,,,,,0.08557862043380737,,,,,, +28,96749,,,,,,,,,,,,0.08627238124608994,,,,,, +28,96799,,,,,,,,,,,,0.0779028981924057,,,,,, +28,96849,,,,,,,,,,,,0.0726705938577652,,,,,, +28,96899,,,,,,,,,,,,0.0799780860543251,,,,,, +28,96949,,,,,,,,,,,,0.07042156159877777,,,,,, +28,96999,,,,,,,,,,,,0.06655274331569672,,,,,, +28,97049,,,,,,,,,,,,0.06849054247140884,,,,,, +28,97099,,,,,,,,,,,,0.07660889625549316,,,,,, +28,97149,,,,,,,,,,,,0.07242345809936523,,,,,, +28,97199,,,,,,,,,,,,0.07130561769008636,,,,,, +28,97249,,,,,,,,,,,,0.07712377607822418,,,,,, +28,97299,,,,,,,,,,,,0.08080025017261505,,,,,, +28,97349,,,,,,,,,,,,0.05975910276174545,,,,,, +28,97399,,,,,,,,,,,,0.07549694180488586,,,,,, +28,97449,,,,,,,,,,,,0.07927293330430984,,,,,, +28,97499,,,,,,,,,,,,0.07062973082065582,,,,,, +28,97549,,,,,,,,,,,,0.06679384410381317,,,,,, +28,97599,,,,,,,,,,,,0.07001281529664993,,,,,, +28,97649,,,,,,,,,,,,0.07278591394424438,,,,,, +28,97699,,,,,,,,,,,,0.0664857029914856,,,,,, +28,97749,,,,,,,,,,,,0.06573820114135742,,,,,, +28,97799,,,,,,,,,,,,0.07369805872440338,,,,,, +28,97849,,,,,,,,,,,,0.07434388250112534,,,,,, +28,97899,,,,,,,,,,,,0.06713122874498367,,,,,, +28,97949,,,,,,,,,,,,0.07505662739276886,,,,,, +28,97999,,,,,,,,,,,,0.0876867026090622,,,,,, +28,98049,,,,,,,,,,,,0.08145938068628311,,,,,, +28,98099,,,,,,,,,,,,0.08239142596721649,,,,,, +28,98149,,,,,,,,,,,,0.07094057649374008,,,,,, +28,98199,,,,,,,,,,,,0.0758533775806427,,,,,, +28,98249,,,,,,,,,,,,0.07028421759605408,,,,,, +28,98299,,,,,,,,,,,,0.07656067609786987,,,,,, +28,98349,,,,,,,,,,,,0.06950949132442474,,,,,, +28,98399,,,,,,,,,,,,0.07736210525035858,,,,,, +28,98449,,,,,,,,,,,,0.07546304166316986,,,,,, +28,98499,,,,,,,,,,,,0.0728372186422348,,,,,, +28,98549,,,,,,,,,,,,0.0704067051410675,,,,,, +28,98599,,,,,,,,,,,,0.07360562682151794,,,,,, +28,98649,,,,,,,,,,,,0.08102622628211975,,,,,, +28,98699,,,,,,,,,,,,0.07885564863681793,,,,,, +28,98749,,,,,,,,,,,,0.08102495223283768,,,,,, +28,98799,,,,,,,,,,,,0.061695266515016556,,,,,, +28,98849,,,,,,,,,,,,0.07187613844871521,,,,,, +28,98899,,,,,,,,,,,,0.06950272619724274,,,,,, +28,98949,,,,,,,,,,,,0.06447774171829224,,,,,, +28,98999,,,,,,,,,,,,0.07317405939102173,,,,,, +28,99049,,,,,,,,,,,,0.0842759981751442,,,,,, +28,99099,,,,,,,,,,,,0.06975505501031876,,,,,, +28,99149,,,,,,,,,,,,0.08212970942258835,,,,,, +28,99199,,,,,,,,,,,,0.06985166668891907,,,,,, +28,99249,,,,,,,,,,,,0.06977447867393494,,,,,, +28,99299,,,,,,,,,,,,0.07105057686567307,,,,,, +28,99349,,,,,,,,,,,,0.0848722904920578,,,,,, +28,99399,,,,,,,,,,,,0.07123996317386627,,,,,, +28,99449,,,,,,,,,,,,0.07889367640018463,,,,,, +28,99499,,,,,,,,,,,,0.06482536345720291,,,,,, +28,99549,,,,,,,,,,,,0.07305886596441269,,,,,, +28,99599,,,,,,,,,,,,0.06923221796751022,,,,,, +28,99649,,,,,,,,,,,,0.0821119025349617,,,,,, +28,99699,,,,,,,,,,,,0.07791535556316376,,,,,, +28,99749,,,,,,,,,,,,0.07418747246265411,,,,,, +28,99799,,,,,,,,,,,,0.07850976288318634,,,,,, +28,99817,,,,,,,,,,,,,0.23239758610725403,0.07624326646327972,0.32533693313598633,0.08251345157623291,0.31908559799194336,0.07624326646327972 +28,99817,,,,,,,0.23129388689994812,0.07403270155191422,0.32409316301345825,0.10496371984481812,0.3067464530467987,,,,,,, +29,99849,,,,,,,,,,,,0.07177536189556122,,,,,, +29,99899,,,,,,,,,,,,0.0824199691414833,,,,,, +29,99949,,,,,,,,,,,,0.07994279265403748,,,,,, +29,99999,,,,,,,,,,,,0.07937923073768616,,,,,, +29,100049,,,,,,,,,,,,0.07364428043365479,,,,,, +29,100099,,,,,,,,,,,,0.07537750899791718,,,,,, +29,100149,,,,,,,,,,,,0.06436394155025482,,,,,, +29,100199,,,,,,,,,,,,0.07421913743019104,,,,,, +29,100249,,,,,,,,,,,,0.07246877253055573,,,,,, +29,100299,,,,,,,,,,,,0.07013262063264847,,,,,, +29,100349,,,,,,,,,,,,0.07151824980974197,,,,,, +29,100399,,,,,,,,,,,,0.07334533333778381,,,,,, +29,100449,,,,,,,,,,,,0.06301631033420563,,,,,, +29,100499,,,,,,,,,,,,0.07295945286750793,,,,,, +29,100549,,,,,,,,,,,,0.06676118820905685,,,,,, +29,100599,,,,,,,,,,,,0.0715440958738327,,,,,, +29,100649,,,,,,,,,,,,0.08612419664859772,,,,,, +29,100699,,,,,,,,,,,,0.0612386092543602,,,,,, +29,100749,,,,,,,,,,,,0.08496087789535522,,,,,, +29,100799,,,,,,,,,,,,0.08313268423080444,,,,,, +29,100849,,,,,,,,,,,,0.08033046126365662,,,,,, +29,100899,,,,,,,,,,,,0.07763850688934326,,,,,, +29,100949,,,,,,,,,,,,0.07289153337478638,,,,,, +29,100999,,,,,,,,,,,,0.0660816878080368,,,,,, +29,101049,,,,,,,,,,,,0.08470429480075836,,,,,, +29,101099,,,,,,,,,,,,0.06266023963689804,,,,,, +29,101149,,,,,,,,,,,,0.08023941516876221,,,,,, +29,101199,,,,,,,,,,,,0.07464408874511719,,,,,, +29,101249,,,,,,,,,,,,0.05878933519124985,,,,,, +29,101299,,,,,,,,,,,,0.078937828540802,,,,,, +29,101349,,,,,,,,,,,,0.08575316518545151,,,,,, +29,101399,,,,,,,,,,,,0.07227824628353119,,,,,, +29,101449,,,,,,,,,,,,0.07688899338245392,,,,,, +29,101499,,,,,,,,,,,,0.07025717198848724,,,,,, +29,101549,,,,,,,,,,,,0.07717952132225037,,,,,, +29,101599,,,,,,,,,,,,0.0739022046327591,,,,,, +29,101649,,,,,,,,,,,,0.07802058011293411,,,,,, +29,101699,,,,,,,,,,,,0.07061158865690231,,,,,, +29,101749,,,,,,,,,,,,0.05961979180574417,,,,,, +29,101799,,,,,,,,,,,,0.07900013029575348,,,,,, +29,101849,,,,,,,,,,,,0.07882855832576752,,,,,, +29,101899,,,,,,,,,,,,0.07252167165279388,,,,,, +29,101949,,,,,,,,,,,,0.06558938324451447,,,,,, +29,101999,,,,,,,,,,,,0.06814910471439362,,,,,, +29,102049,,,,,,,,,,,,0.07146497815847397,,,,,, +29,102099,,,,,,,,,,,,0.07081393897533417,,,,,, +29,102149,,,,,,,,,,,,0.07669846713542938,,,,,, +29,102199,,,,,,,,,,,,0.076903335750103,,,,,, +29,102249,,,,,,,,,,,,0.07061129808425903,,,,,, +29,102299,,,,,,,,,,,,0.06865132600069046,,,,,, +29,102349,,,,,,,,,,,,0.05870884656906128,,,,,, +29,102399,,,,,,,,,,,,0.08242785930633545,,,,,, +29,102449,,,,,,,,,,,,0.07034556567668915,,,,,, +29,102499,,,,,,,,,,,,0.07993559539318085,,,,,, +29,102549,,,,,,,,,,,,0.07083892822265625,,,,,, +29,102599,,,,,,,,,,,,0.07109344750642776,,,,,, +29,102649,,,,,,,,,,,,0.07379695773124695,,,,,, +29,102699,,,,,,,,,,,,0.07552262395620346,,,,,, +29,102749,,,,,,,,,,,,0.08673447370529175,,,,,, +29,102799,,,,,,,,,,,,0.05846291035413742,,,,,, +29,102849,,,,,,,,,,,,0.07295981049537659,,,,,, +29,102899,,,,,,,,,,,,0.0797325000166893,,,,,, +29,102949,,,,,,,,,,,,0.06692162156105042,,,,,, +29,102999,,,,,,,,,,,,0.0687134861946106,,,,,, +29,103049,,,,,,,,,,,,0.07917870581150055,,,,,, +29,103099,,,,,,,,,,,,0.06489897519350052,,,,,, +29,103149,,,,,,,,,,,,0.07304945588111877,,,,,, +29,103199,,,,,,,,,,,,0.07380137592554092,,,,,, +29,103249,,,,,,,,,,,,0.0792354941368103,,,,,, +29,103259,,,,,,,,,,,,,0.23451149463653564,0.07816778123378754,0.32086434960365295,0.05935448408126831,0.31584176421165466,0.07816778123378754 +29,103259,,,,,,,0.23046180605888367,0.07349872589111328,0.3338204026222229,0.1114271879196167,0.3140534460544586,,,,,,, +30,103299,,,,,,,,,,,,0.06931076943874359,,,,,, +30,103349,,,,,,,,,,,,0.07937430590391159,,,,,, +30,103399,,,,,,,,,,,,0.08903799951076508,,,,,, +30,103449,,,,,,,,,,,,0.0628940612077713,,,,,, +30,103499,,,,,,,,,,,,0.08594073355197906,,,,,, +30,103549,,,,,,,,,,,,0.07152505964040756,,,,,, +30,103599,,,,,,,,,,,,0.07125234603881836,,,,,, +30,103649,,,,,,,,,,,,0.06609463691711426,,,,,, +30,103699,,,,,,,,,,,,0.06478367745876312,,,,,, +30,103749,,,,,,,,,,,,0.08177347481250763,,,,,, +30,103799,,,,,,,,,,,,0.07338102161884308,,,,,, +30,103849,,,,,,,,,,,,0.06780074536800385,,,,,, +30,103899,,,,,,,,,,,,0.07085953652858734,,,,,, +30,103949,,,,,,,,,,,,0.07564906775951385,,,,,, +30,103999,,,,,,,,,,,,0.07213813811540604,,,,,, +30,104049,,,,,,,,,,,,0.06808644533157349,,,,,, +30,104099,,,,,,,,,,,,0.07384061813354492,,,,,, +30,104149,,,,,,,,,,,,0.06977280974388123,,,,,, +30,104199,,,,,,,,,,,,0.06850817799568176,,,,,, +30,104249,,,,,,,,,,,,0.064558245241642,,,,,, +30,104299,,,,,,,,,,,,0.07257769256830215,,,,,, +30,104349,,,,,,,,,,,,0.06968176364898682,,,,,, +30,104399,,,,,,,,,,,,0.07061485946178436,,,,,, +30,104449,,,,,,,,,,,,0.0802566409111023,,,,,, +30,104499,,,,,,,,,,,,0.07539448887109756,,,,,, +30,104549,,,,,,,,,,,,0.07537800073623657,,,,,, +30,104599,,,,,,,,,,,,0.07823636382818222,,,,,, +30,104649,,,,,,,,,,,,0.08149425685405731,,,,,, +30,104699,,,,,,,,,,,,0.07383009046316147,,,,,, +30,104749,,,,,,,,,,,,0.06800910085439682,,,,,, +30,104799,,,,,,,,,,,,0.06067020073533058,,,,,, +30,104849,,,,,,,,,,,,0.07424958050251007,,,,,, +30,104899,,,,,,,,,,,,0.08332091569900513,,,,,, +30,104949,,,,,,,,,,,,0.07036636024713516,,,,,, +30,104999,,,,,,,,,,,,0.07617084681987762,,,,,, +30,105049,,,,,,,,,,,,0.06583668291568756,,,,,, +30,105099,,,,,,,,,,,,0.07410027086734772,,,,,, +30,105149,,,,,,,,,,,,0.08025799691677094,,,,,, +30,105199,,,,,,,,,,,,0.07282872498035431,,,,,, +30,105249,,,,,,,,,,,,0.07651680707931519,,,,,, +30,105299,,,,,,,,,,,,0.0644771158695221,,,,,, +30,105349,,,,,,,,,,,,0.07262399047613144,,,,,, +30,105399,,,,,,,,,,,,0.06870788335800171,,,,,, +30,105449,,,,,,,,,,,,0.07173041999340057,,,,,, +30,105499,,,,,,,,,,,,0.0700969398021698,,,,,, +30,105549,,,,,,,,,,,,0.07429791241884232,,,,,, +30,105599,,,,,,,,,,,,0.07027626037597656,,,,,, +30,105649,,,,,,,,,,,,0.07401565462350845,,,,,, +30,105699,,,,,,,,,,,,0.07620477676391602,,,,,, +30,105749,,,,,,,,,,,,0.0675908774137497,,,,,, +30,105799,,,,,,,,,,,,0.06521151214838028,,,,,, +30,105849,,,,,,,,,,,,0.055389005690813065,,,,,, +30,105899,,,,,,,,,,,,0.07656871527433395,,,,,, +30,105949,,,,,,,,,,,,0.06643517315387726,,,,,, +30,105999,,,,,,,,,,,,0.07191559672355652,,,,,, +30,106049,,,,,,,,,,,,0.06861098855733871,,,,,, +30,106099,,,,,,,,,,,,0.08736786246299744,,,,,, +30,106149,,,,,,,,,,,,0.07988091558218002,,,,,, +30,106199,,,,,,,,,,,,0.07186466455459595,,,,,, +30,106249,,,,,,,,,,,,0.0645640417933464,,,,,, +30,106299,,,,,,,,,,,,0.06736047565937042,,,,,, +30,106349,,,,,,,,,,,,0.0744866132736206,,,,,, +30,106399,,,,,,,,,,,,0.07638439536094666,,,,,, +30,106449,,,,,,,,,,,,0.061538100242614746,,,,,, +30,106499,,,,,,,,,,,,0.07389970123767853,,,,,, +30,106549,,,,,,,,,,,,0.08080355077981949,,,,,, +30,106599,,,,,,,,,,,,0.05968174710869789,,,,,, +30,106649,,,,,,,,,,,,0.06803110241889954,,,,,, +30,106699,,,,,,,,,,,,0.07088202983140945,,,,,, +30,106701,,,,,,,,,,,,,0.23714640736579895,0.08053207397460938,0.3209189176559448,0.030903398990631104,0.3160327672958374,0.08053207397460938 +30,106701,,,,,,,0.23021940886974335,0.07337567955255508,0.3360411822795868,0.11290818452835083,0.316697895526886,,,,,,, +31,106749,,,,,,,,,,,,0.0839000940322876,,,,,, +31,106799,,,,,,,,,,,,0.07206586748361588,,,,,, +31,106849,,,,,,,,,,,,0.0721246600151062,,,,,, +31,106899,,,,,,,,,,,,0.07498104870319366,,,,,, +31,106949,,,,,,,,,,,,0.06445960700511932,,,,,, +31,106999,,,,,,,,,,,,0.06872919946908951,,,,,, +31,107049,,,,,,,,,,,,0.07224040478467941,,,,,, +31,107099,,,,,,,,,,,,0.07058864831924438,,,,,, +31,107149,,,,,,,,,,,,0.06760665029287338,,,,,, +31,107199,,,,,,,,,,,,0.08258436620235443,,,,,, +31,107249,,,,,,,,,,,,0.07831080257892609,,,,,, +31,107299,,,,,,,,,,,,0.06970257312059402,,,,,, +31,107349,,,,,,,,,,,,0.07857643067836761,,,,,, +31,107399,,,,,,,,,,,,0.060775093734264374,,,,,, +31,107449,,,,,,,,,,,,0.07340943813323975,,,,,, +31,107499,,,,,,,,,,,,0.07436581701040268,,,,,, +31,107549,,,,,,,,,,,,0.07130889594554901,,,,,, +31,107599,,,,,,,,,,,,0.07457717508077621,,,,,, +31,107649,,,,,,,,,,,,0.06944850832223892,,,,,, +31,107699,,,,,,,,,,,,0.07610082626342773,,,,,, +31,107749,,,,,,,,,,,,0.0626048594713211,,,,,, +31,107799,,,,,,,,,,,,0.07314524799585342,,,,,, +31,107849,,,,,,,,,,,,0.07743380963802338,,,,,, +31,107899,,,,,,,,,,,,0.08839882910251617,,,,,, +31,107949,,,,,,,,,,,,0.06860173493623734,,,,,, +31,107999,,,,,,,,,,,,0.07370510697364807,,,,,, +31,108049,,,,,,,,,,,,0.07146202027797699,,,,,, +31,108099,,,,,,,,,,,,0.07002556324005127,,,,,, +31,108149,,,,,,,,,,,,0.0748356506228447,,,,,, +31,108199,,,,,,,,,,,,0.07284145802259445,,,,,, +31,108249,,,,,,,,,,,,0.09095726162195206,,,,,, +31,108299,,,,,,,,,,,,0.08086329698562622,,,,,, +31,108349,,,,,,,,,,,,0.06560683250427246,,,,,, +31,108399,,,,,,,,,,,,0.07403285056352615,,,,,, +31,108449,,,,,,,,,,,,0.07807854562997818,,,,,, +31,108499,,,,,,,,,,,,0.07919298112392426,,,,,, +31,108549,,,,,,,,,,,,0.07524382323026657,,,,,, +31,108599,,,,,,,,,,,,0.0747440978884697,,,,,, +31,108649,,,,,,,,,,,,0.07261574268341064,,,,,, +31,108699,,,,,,,,,,,,0.07531588524580002,,,,,, +31,108749,,,,,,,,,,,,0.06896507740020752,,,,,, +31,108799,,,,,,,,,,,,0.07359325885772705,,,,,, +31,108849,,,,,,,,,,,,0.06795141845941544,,,,,, +31,108899,,,,,,,,,,,,0.07403838634490967,,,,,, +31,108949,,,,,,,,,,,,0.06996753811836243,,,,,, +31,108999,,,,,,,,,,,,0.06541126221418381,,,,,, +31,109049,,,,,,,,,,,,0.07637994736433029,,,,,, +31,109099,,,,,,,,,,,,0.06363403797149658,,,,,, +31,109149,,,,,,,,,,,,0.07824047654867172,,,,,, +31,109199,,,,,,,,,,,,0.07248209416866302,,,,,, +31,109249,,,,,,,,,,,,0.07761292159557343,,,,,, +31,109299,,,,,,,,,,,,0.08031348884105682,,,,,, +31,109349,,,,,,,,,,,,0.07731608301401138,,,,,, +31,109399,,,,,,,,,,,,0.09516790509223938,,,,,, +31,109449,,,,,,,,,,,,0.07427164912223816,,,,,, +31,109499,,,,,,,,,,,,0.08411796391010284,,,,,, +31,109549,,,,,,,,,,,,0.0807308480143547,,,,,, +31,109599,,,,,,,,,,,,0.08218195289373398,,,,,, +31,109649,,,,,,,,,,,,0.07518558949232101,,,,,, +31,109699,,,,,,,,,,,,0.07320168614387512,,,,,, +31,109749,,,,,,,,,,,,0.07297040522098541,,,,,, +31,109799,,,,,,,,,,,,0.07150919735431671,,,,,, +31,109849,,,,,,,,,,,,0.06115636229515076,,,,,, +31,109899,,,,,,,,,,,,0.0766216367483139,,,,,, +31,109949,,,,,,,,,,,,0.062203455716371536,,,,,, +31,109999,,,,,,,,,,,,0.07526832818984985,,,,,, +31,110049,,,,,,,,,,,,0.07489143311977386,,,,,, +31,110099,,,,,,,,,,,,0.07058799266815186,,,,,, +31,110143,,,,,,,,,,,,,0.23395191133022308,0.07807016372680664,0.3224197030067444,0.060529232025146484,0.31780996918678284,0.07807016372680664 +31,110143,,,,,,,0.2300112247467041,0.07331337779760361,0.3371695280075073,0.11367166042327881,0.3180980086326599,,,,,,, +32,110149,,,,,,,,,,,,0.08424310386180878,,,,,, +32,110199,,,,,,,,,,,,0.07944316416978836,,,,,, +32,110249,,,,,,,,,,,,0.07005457580089569,,,,,, +32,110299,,,,,,,,,,,,0.07218386232852936,,,,,, +32,110349,,,,,,,,,,,,0.06740963459014893,,,,,, +32,110399,,,,,,,,,,,,0.06948843598365784,,,,,, +32,110449,,,,,,,,,,,,0.06807328015565872,,,,,, +32,110499,,,,,,,,,,,,0.0757889375090599,,,,,, +32,110549,,,,,,,,,,,,0.07211652398109436,,,,,, +32,110599,,,,,,,,,,,,0.08596861362457275,,,,,, +32,110649,,,,,,,,,,,,0.08874350786209106,,,,,, +32,110699,,,,,,,,,,,,0.06466248631477356,,,,,, +32,110749,,,,,,,,,,,,0.06111010164022446,,,,,, +32,110799,,,,,,,,,,,,0.07076889276504517,,,,,, +32,110849,,,,,,,,,,,,0.06797357648611069,,,,,, +32,110899,,,,,,,,,,,,0.06323598325252533,,,,,, +32,110949,,,,,,,,,,,,0.06956793367862701,,,,,, +32,110999,,,,,,,,,,,,0.07613588124513626,,,,,, +32,111049,,,,,,,,,,,,0.06507128477096558,,,,,, +32,111099,,,,,,,,,,,,0.08761897683143616,,,,,, +32,111149,,,,,,,,,,,,0.07171588391065598,,,,,, +32,111199,,,,,,,,,,,,0.0760389044880867,,,,,, +32,111249,,,,,,,,,,,,0.08293484151363373,,,,,, +32,111299,,,,,,,,,,,,0.067527174949646,,,,,, +32,111349,,,,,,,,,,,,0.06594491004943848,,,,,, +32,111399,,,,,,,,,,,,0.07419069111347198,,,,,, +32,111449,,,,,,,,,,,,0.07821796089410782,,,,,, +32,111499,,,,,,,,,,,,0.08359049260616302,,,,,, +32,111549,,,,,,,,,,,,0.08271624147891998,,,,,, +32,111599,,,,,,,,,,,,0.06496302783489227,,,,,, +32,111649,,,,,,,,,,,,0.0908108726143837,,,,,, +32,111699,,,,,,,,,,,,0.08059927821159363,,,,,, +32,111749,,,,,,,,,,,,0.06752774119377136,,,,,, +32,111799,,,,,,,,,,,,0.07100370526313782,,,,,, +32,111849,,,,,,,,,,,,0.07165594398975372,,,,,, +32,111899,,,,,,,,,,,,0.0861346423625946,,,,,, +32,111949,,,,,,,,,,,,0.07068238407373428,,,,,, +32,111999,,,,,,,,,,,,0.07641559094190598,,,,,, +32,112049,,,,,,,,,,,,0.06952627003192902,,,,,, +32,112099,,,,,,,,,,,,0.06585448235273361,,,,,, +32,112149,,,,,,,,,,,,0.05794983729720116,,,,,, +32,112199,,,,,,,,,,,,0.06901420652866364,,,,,, +32,112249,,,,,,,,,,,,0.06095413491129875,,,,,, +32,112299,,,,,,,,,,,,0.07247902452945709,,,,,, +32,112349,,,,,,,,,,,,0.06662128120660782,,,,,, +32,112399,,,,,,,,,,,,0.07510757446289062,,,,,, +32,112449,,,,,,,,,,,,0.05210791155695915,,,,,, +32,112499,,,,,,,,,,,,0.07063312828540802,,,,,, +32,112549,,,,,,,,,,,,0.06911381334066391,,,,,, +32,112599,,,,,,,,,,,,0.07398656010627747,,,,,, +32,112649,,,,,,,,,,,,0.07959449291229248,,,,,, +32,112699,,,,,,,,,,,,0.07230254262685776,,,,,, +32,112749,,,,,,,,,,,,0.07561025023460388,,,,,, +32,112799,,,,,,,,,,,,0.07207155972719193,,,,,, +32,112849,,,,,,,,,,,,0.07180280983448029,,,,,, +32,112899,,,,,,,,,,,,0.06415089964866638,,,,,, +32,112949,,,,,,,,,,,,0.07231564074754715,,,,,, +32,112999,,,,,,,,,,,,0.06735020875930786,,,,,, +32,113049,,,,,,,,,,,,0.08217903971672058,,,,,, +32,113099,,,,,,,,,,,,0.06557964533567429,,,,,, +32,113149,,,,,,,,,,,,0.07162261009216309,,,,,, +32,113199,,,,,,,,,,,,0.07359077036380768,,,,,, +32,113249,,,,,,,,,,,,0.07061317563056946,,,,,, +32,113299,,,,,,,,,,,,0.06730110943317413,,,,,, +32,113349,,,,,,,,,,,,0.07124766707420349,,,,,, +32,113399,,,,,,,,,,,,0.06856215000152588,,,,,, +32,113449,,,,,,,,,,,,0.07714126259088516,,,,,, +32,113499,,,,,,,,,,,,0.06838279962539673,,,,,, +32,113549,,,,,,,,,,,,0.07665970921516418,,,,,, +32,113585,,,,,,,,,,,,,0.2341683804988861,0.07777033746242523,0.3178237974643707,0.06413722038269043,0.3129636347293854,0.07777033746242523 +32,113585,,,,,,,0.22986435890197754,0.07318233698606491,0.33949413895606995,0.11524999141693115,0.31963756680488586,,,,,,, +33,113599,,,,,,,,,,,,0.06789369881153107,,,,,, +33,113649,,,,,,,,,,,,0.07953928411006927,,,,,, +33,113699,,,,,,,,,,,,0.07313772290945053,,,,,, +33,113749,,,,,,,,,,,,0.08233439922332764,,,,,, +33,113799,,,,,,,,,,,,0.07441966980695724,,,,,, +33,113849,,,,,,,,,,,,0.06507944315671921,,,,,, +33,113899,,,,,,,,,,,,0.07625451683998108,,,,,, +33,113949,,,,,,,,,,,,0.074648916721344,,,,,, +33,113999,,,,,,,,,,,,0.06854444742202759,,,,,, +33,114049,,,,,,,,,,,,0.07087385654449463,,,,,, +33,114099,,,,,,,,,,,,0.05878223106265068,,,,,, +33,114149,,,,,,,,,,,,0.08600132912397385,,,,,, +33,114199,,,,,,,,,,,,0.07165433466434479,,,,,, +33,114249,,,,,,,,,,,,0.08549362421035767,,,,,, +33,114299,,,,,,,,,,,,0.06333361566066742,,,,,, +33,114349,,,,,,,,,,,,0.06588093936443329,,,,,, +33,114399,,,,,,,,,,,,0.07385578751564026,,,,,, +33,114449,,,,,,,,,,,,0.05895281210541725,,,,,, +33,114499,,,,,,,,,,,,0.08421321958303452,,,,,, +33,114549,,,,,,,,,,,,0.07245206832885742,,,,,, +33,114599,,,,,,,,,,,,0.0655190497636795,,,,,, +33,114649,,,,,,,,,,,,0.07661950588226318,,,,,, +33,114699,,,,,,,,,,,,0.06754416227340698,,,,,, +33,114749,,,,,,,,,,,,0.08248390257358551,,,,,, +33,114799,,,,,,,,,,,,0.07925008237361908,,,,,, +33,114849,,,,,,,,,,,,0.06892463564872742,,,,,, +33,114899,,,,,,,,,,,,0.07305365800857544,,,,,, +33,114949,,,,,,,,,,,,0.07571171224117279,,,,,, +33,114999,,,,,,,,,,,,0.08801598846912384,,,,,, +33,115049,,,,,,,,,,,,0.07050442695617676,,,,,, +33,115099,,,,,,,,,,,,0.07178781926631927,,,,,, +33,115149,,,,,,,,,,,,0.06926800310611725,,,,,, +33,115199,,,,,,,,,,,,0.07062351703643799,,,,,, +33,115249,,,,,,,,,,,,0.07392901182174683,,,,,, +33,115299,,,,,,,,,,,,0.07445620000362396,,,,,, +33,115349,,,,,,,,,,,,0.07913406193256378,,,,,, +33,115399,,,,,,,,,,,,0.06894296407699585,,,,,, +33,115449,,,,,,,,,,,,0.05842508375644684,,,,,, +33,115499,,,,,,,,,,,,0.08001500368118286,,,,,, +33,115549,,,,,,,,,,,,0.08838961273431778,,,,,, +33,115599,,,,,,,,,,,,0.06553468108177185,,,,,, +33,115649,,,,,,,,,,,,0.06693494319915771,,,,,, +33,115699,,,,,,,,,,,,0.07063516974449158,,,,,, +33,115749,,,,,,,,,,,,0.07355891168117523,,,,,, +33,115799,,,,,,,,,,,,0.07172595709562302,,,,,, +33,115849,,,,,,,,,,,,0.07326096296310425,,,,,, +33,115899,,,,,,,,,,,,0.0725184828042984,,,,,, +33,115949,,,,,,,,,,,,0.06916630268096924,,,,,, +33,115999,,,,,,,,,,,,0.08430932462215424,,,,,, +33,116049,,,,,,,,,,,,0.0681397020816803,,,,,, +33,116099,,,,,,,,,,,,0.0745294913649559,,,,,, +33,116149,,,,,,,,,,,,0.06693636626005173,,,,,, +33,116199,,,,,,,,,,,,0.08375944942235947,,,,,, +33,116249,,,,,,,,,,,,0.06556454300880432,,,,,, +33,116299,,,,,,,,,,,,0.06138364225625992,,,,,, +33,116349,,,,,,,,,,,,0.07261087000370026,,,,,, +33,116399,,,,,,,,,,,,0.06478075683116913,,,,,, +33,116449,,,,,,,,,,,,0.06650955975055695,,,,,, +33,116499,,,,,,,,,,,,0.06993718445301056,,,,,, +33,116549,,,,,,,,,,,,0.06657146662473679,,,,,, +33,116599,,,,,,,,,,,,0.07206957042217255,,,,,, +33,116649,,,,,,,,,,,,0.08676238358020782,,,,,, +33,116699,,,,,,,,,,,,0.06237712502479553,,,,,, +33,116749,,,,,,,,,,,,0.07626134157180786,,,,,, +33,116799,,,,,,,,,,,,0.07359682023525238,,,,,, +33,116849,,,,,,,,,,,,0.09462307393550873,,,,,, +33,116899,,,,,,,,,,,,0.08223722130060196,,,,,, +33,116949,,,,,,,,,,,,0.07785558700561523,,,,,, +33,116999,,,,,,,,,,,,0.0840570479631424,,,,,, +33,117027,,,,,,,,,,,,,0.23425842821598053,0.07820175588130951,0.32535338401794434,0.058945655822753906,0.31918686628341675,0.07820175588130951 +33,117027,,,,,,,0.2297595888376236,0.07313080132007599,0.3404146432876587,0.11587870121002197,0.3217783272266388,,,,,,, +34,117049,,,,,,,,,,,,0.07761813700199127,,,,,, +34,117099,,,,,,,,,,,,0.06816987693309784,,,,,, +34,117149,,,,,,,,,,,,0.06509216874837875,,,,,, +34,117199,,,,,,,,,,,,0.0717240571975708,,,,,, +34,117249,,,,,,,,,,,,0.0784369558095932,,,,,, +34,117299,,,,,,,,,,,,0.07830910384654999,,,,,, +34,117349,,,,,,,,,,,,0.0732412338256836,,,,,, +34,117399,,,,,,,,,,,,0.07172594219446182,,,,,, +34,117449,,,,,,,,,,,,0.07115159928798676,,,,,, +34,117499,,,,,,,,,,,,0.06685227155685425,,,,,, +34,117549,,,,,,,,,,,,0.07547856867313385,,,,,, +34,117599,,,,,,,,,,,,0.08492110669612885,,,,,, +34,117649,,,,,,,,,,,,0.0759466141462326,,,,,, +34,117699,,,,,,,,,,,,0.08588644862174988,,,,,, +34,117749,,,,,,,,,,,,0.08555096387863159,,,,,, +34,117799,,,,,,,,,,,,0.07652968168258667,,,,,, +34,117849,,,,,,,,,,,,0.06784024834632874,,,,,, +34,117899,,,,,,,,,,,,0.06715179979801178,,,,,, +34,117949,,,,,,,,,,,,0.06820151209831238,,,,,, +34,117999,,,,,,,,,,,,0.07416661083698273,,,,,, +34,118049,,,,,,,,,,,,0.07673493027687073,,,,,, +34,118099,,,,,,,,,,,,0.07285211980342865,,,,,, +34,118149,,,,,,,,,,,,0.06381451338529587,,,,,, +34,118199,,,,,,,,,,,,0.06511177867650986,,,,,, +34,118249,,,,,,,,,,,,0.0757741704583168,,,,,, +34,118299,,,,,,,,,,,,0.071101114153862,,,,,, +34,118349,,,,,,,,,,,,0.07851172983646393,,,,,, +34,118399,,,,,,,,,,,,0.0721665769815445,,,,,, +34,118449,,,,,,,,,,,,0.08025772124528885,,,,,, +34,118499,,,,,,,,,,,,0.07819192111492157,,,,,, +34,118549,,,,,,,,,,,,0.05986892059445381,,,,,, +34,118599,,,,,,,,,,,,0.07724244892597198,,,,,, +34,118649,,,,,,,,,,,,0.07680919766426086,,,,,, +34,118699,,,,,,,,,,,,0.06473550200462341,,,,,, +34,118749,,,,,,,,,,,,0.06960905343294144,,,,,, +34,118799,,,,,,,,,,,,0.06985432654619217,,,,,, +34,118849,,,,,,,,,,,,0.07634186744689941,,,,,, +34,118899,,,,,,,,,,,,0.08484287559986115,,,,,, +34,118949,,,,,,,,,,,,0.07246629148721695,,,,,, +34,118999,,,,,,,,,,,,0.06612436473369598,,,,,, +34,119049,,,,,,,,,,,,0.07821458578109741,,,,,, +34,119099,,,,,,,,,,,,0.06876198202371597,,,,,, +34,119149,,,,,,,,,,,,0.08163861930370331,,,,,, +34,119199,,,,,,,,,,,,0.07139284908771515,,,,,, +34,119249,,,,,,,,,,,,0.07015147805213928,,,,,, +34,119299,,,,,,,,,,,,0.08327291905879974,,,,,, +34,119349,,,,,,,,,,,,0.07574968039989471,,,,,, +34,119399,,,,,,,,,,,,0.06860151886940002,,,,,, +34,119449,,,,,,,,,,,,0.0707714855670929,,,,,, +34,119499,,,,,,,,,,,,0.07711473852396011,,,,,, +34,119549,,,,,,,,,,,,0.0674106627702713,,,,,, +34,119599,,,,,,,,,,,,0.07411116361618042,,,,,, +34,119649,,,,,,,,,,,,0.07494206726551056,,,,,, +34,119699,,,,,,,,,,,,0.07099106162786484,,,,,, +34,119749,,,,,,,,,,,,0.08597733080387115,,,,,, +34,119799,,,,,,,,,,,,0.07569071650505066,,,,,, +34,119849,,,,,,,,,,,,0.07163332402706146,,,,,, +34,119899,,,,,,,,,,,,0.07820358872413635,,,,,, +34,119949,,,,,,,,,,,,0.06200679391622543,,,,,, +34,119999,,,,,,,,,,,,0.0662265419960022,,,,,, +34,120049,,,,,,,,,,,,0.06756219267845154,,,,,, +34,120099,,,,,,,,,,,,0.06305745989084244,,,,,, +34,120149,,,,,,,,,,,,0.0758986547589302,,,,,, +34,120199,,,,,,,,,,,,0.07608793675899506,,,,,, +34,120249,,,,,,,,,,,,0.08165330439805984,,,,,, +34,120299,,,,,,,,,,,,0.07414372265338898,,,,,, +34,120349,,,,,,,,,,,,0.07784949243068695,,,,,, +34,120399,,,,,,,,,,,,0.07526418566703796,,,,,, +34,120449,,,,,,,,,,,,0.06690238416194916,,,,,, +34,120469,,,,,,,,,,,,,0.23202432692050934,0.07702816277742386,0.32986119389533997,0.07306826114654541,0.32518476247787476,0.07702816277742386 +34,120469,,,,,,,0.22950379550457,0.07299119979143143,0.34288284182548523,0.11756372451782227,0.3231280446052551,,,,,,, +35,120499,,,,,,,,,,,,0.07998347282409668,,,,,, +35,120549,,,,,,,,,,,,0.06032616272568703,,,,,, +35,120599,,,,,,,,,,,,0.09474903345108032,,,,,, +35,120649,,,,,,,,,,,,0.07040724903345108,,,,,, +35,120699,,,,,,,,,,,,0.08193197101354599,,,,,, +35,120749,,,,,,,,,,,,0.07055651396512985,,,,,, +35,120799,,,,,,,,,,,,0.07307359576225281,,,,,, +35,120849,,,,,,,,,,,,0.07531844079494476,,,,,, +35,120899,,,,,,,,,,,,0.070742666721344,,,,,, +35,120949,,,,,,,,,,,,0.08362147212028503,,,,,, +35,120999,,,,,,,,,,,,0.0776439905166626,,,,,, +35,121049,,,,,,,,,,,,0.0666256844997406,,,,,, +35,121099,,,,,,,,,,,,0.07830679416656494,,,,,, +35,121149,,,,,,,,,,,,0.07402019202709198,,,,,, +35,121199,,,,,,,,,,,,0.07435581088066101,,,,,, +35,121249,,,,,,,,,,,,0.06990165263414383,,,,,, +35,121299,,,,,,,,,,,,0.06127731874585152,,,,,, +35,121349,,,,,,,,,,,,0.06873686611652374,,,,,, +35,121399,,,,,,,,,,,,0.06769596040248871,,,,,, +35,121449,,,,,,,,,,,,0.0759945660829544,,,,,, +35,121499,,,,,,,,,,,,0.06150795519351959,,,,,, +35,121549,,,,,,,,,,,,0.0788041353225708,,,,,, +35,121599,,,,,,,,,,,,0.07452689111232758,,,,,, +35,121649,,,,,,,,,,,,0.08058564364910126,,,,,, +35,121699,,,,,,,,,,,,0.08008811622858047,,,,,, +35,121749,,,,,,,,,,,,0.07839818298816681,,,,,, +35,121799,,,,,,,,,,,,0.06742788851261139,,,,,, +35,121849,,,,,,,,,,,,0.07412385940551758,,,,,, +35,121899,,,,,,,,,,,,0.07273353636264801,,,,,, +35,121949,,,,,,,,,,,,0.08118773996829987,,,,,, +35,121999,,,,,,,,,,,,0.07175581902265549,,,,,, +35,122049,,,,,,,,,,,,0.05908415839076042,,,,,, +35,122099,,,,,,,,,,,,0.07401133328676224,,,,,, +35,122149,,,,,,,,,,,,0.0583348348736763,,,,,, +35,122199,,,,,,,,,,,,0.05954176187515259,,,,,, +35,122249,,,,,,,,,,,,0.07593108713626862,,,,,, +35,122299,,,,,,,,,,,,0.06806039810180664,,,,,, +35,122349,,,,,,,,,,,,0.08197681605815887,,,,,, +35,122399,,,,,,,,,,,,0.06439884752035141,,,,,, +35,122449,,,,,,,,,,,,0.07961735874414444,,,,,, +35,122499,,,,,,,,,,,,0.07411035895347595,,,,,, +35,122549,,,,,,,,,,,,0.08172544091939926,,,,,, +35,122599,,,,,,,,,,,,0.07256577908992767,,,,,, +35,122649,,,,,,,,,,,,0.07780814170837402,,,,,, +35,122699,,,,,,,,,,,,0.0769384354352951,,,,,, +35,122749,,,,,,,,,,,,0.07834263890981674,,,,,, +35,122799,,,,,,,,,,,,0.08030153810977936,,,,,, +35,122849,,,,,,,,,,,,0.07160545885562897,,,,,, +35,122899,,,,,,,,,,,,0.07327479124069214,,,,,, +35,122949,,,,,,,,,,,,0.06412264704704285,,,,,, +35,122999,,,,,,,,,,,,0.06917675584554672,,,,,, +35,123049,,,,,,,,,,,,0.07285606116056442,,,,,, +35,123099,,,,,,,,,,,,0.06638737767934799,,,,,, +35,123149,,,,,,,,,,,,0.06729636341333389,,,,,, +35,123199,,,,,,,,,,,,0.08818350732326508,,,,,, +35,123249,,,,,,,,,,,,0.0746999979019165,,,,,, +35,123299,,,,,,,,,,,,0.07702332735061646,,,,,, +35,123349,,,,,,,,,,,,0.06562399119138718,,,,,, +35,123399,,,,,,,,,,,,0.06897701323032379,,,,,, +35,123449,,,,,,,,,,,,0.07594729214906693,,,,,, +35,123499,,,,,,,,,,,,0.0769742876291275,,,,,, +35,123549,,,,,,,,,,,,0.07428130507469177,,,,,, +35,123599,,,,,,,,,,,,0.07473073154687881,,,,,, +35,123649,,,,,,,,,,,,0.0664452463388443,,,,,, +35,123699,,,,,,,,,,,,0.081816166639328,,,,,, +35,123749,,,,,,,,,,,,0.0646599531173706,,,,,, +35,123799,,,,,,,,,,,,0.06958673894405365,,,,,, +35,123849,,,,,,,,,,,,0.0846298336982727,,,,,, +35,123899,,,,,,,,,,,,0.07145383954048157,,,,,, +35,123911,,,,,,,,,,,,,0.2324516475200653,0.07690057903528214,0.3274267315864563,0.0746036171913147,0.3225129246711731,0.07690057903528214 +35,123911,,,,,,,0.22921369969844818,0.07287333160638809,0.344957172870636,0.11898136138916016,0.32523712515830994,,,,,,, +36,123949,,,,,,,,,,,,0.07384566962718964,,,,,, +36,123999,,,,,,,,,,,,0.06985336542129517,,,,,, +36,124049,,,,,,,,,,,,0.08625099062919617,,,,,, +36,124099,,,,,,,,,,,,0.07906961441040039,,,,,, +36,124149,,,,,,,,,,,,0.06799709796905518,,,,,, +36,124199,,,,,,,,,,,,0.06947384774684906,,,,,, +36,124249,,,,,,,,,,,,0.06766705214977264,,,,,, +36,124299,,,,,,,,,,,,0.07340895384550095,,,,,, +36,124349,,,,,,,,,,,,0.07136137783527374,,,,,, +36,124399,,,,,,,,,,,,0.06454727798700333,,,,,, +36,124449,,,,,,,,,,,,0.07696320116519928,,,,,, +36,124499,,,,,,,,,,,,0.07079747319221497,,,,,, +36,124549,,,,,,,,,,,,0.06407744437456131,,,,,, +36,124599,,,,,,,,,,,,0.07367365062236786,,,,,, +36,124649,,,,,,,,,,,,0.0738602876663208,,,,,, +36,124699,,,,,,,,,,,,0.07251095771789551,,,,,, +36,124749,,,,,,,,,,,,0.06893455982208252,,,,,, +36,124799,,,,,,,,,,,,0.07172329723834991,,,,,, +36,124849,,,,,,,,,,,,0.07485715299844742,,,,,, +36,124899,,,,,,,,,,,,0.07773362100124359,,,,,, +36,124949,,,,,,,,,,,,0.05714975297451019,,,,,, +36,124999,,,,,,,,,,,,0.06398256868124008,,,,,, +36,125049,,,,,,,,,,,,0.06751200556755066,,,,,, +36,125099,,,,,,,,,,,,0.06694502383470535,,,,,, +36,125149,,,,,,,,,,,,0.07553457468748093,,,,,, +36,125199,,,,,,,,,,,,0.07423876225948334,,,,,, +36,125249,,,,,,,,,,,,0.07105547189712524,,,,,, +36,125299,,,,,,,,,,,,0.07055363059043884,,,,,, +36,125349,,,,,,,,,,,,0.08514516055583954,,,,,, +36,125399,,,,,,,,,,,,0.06842385232448578,,,,,, +36,125449,,,,,,,,,,,,0.06584258377552032,,,,,, +36,125499,,,,,,,,,,,,0.07785988599061966,,,,,, +36,125549,,,,,,,,,,,,0.07147829234600067,,,,,, +36,125599,,,,,,,,,,,,0.0624910406768322,,,,,, +36,125649,,,,,,,,,,,,0.07523760199546814,,,,,, +36,125699,,,,,,,,,,,,0.07012763619422913,,,,,, +36,125749,,,,,,,,,,,,0.06510709971189499,,,,,, +36,125799,,,,,,,,,,,,0.08100825548171997,,,,,, +36,125849,,,,,,,,,,,,0.0681118369102478,,,,,, +36,125899,,,,,,,,,,,,0.07473431527614594,,,,,, +36,125949,,,,,,,,,,,,0.06553581357002258,,,,,, +36,125999,,,,,,,,,,,,0.06393325328826904,,,,,, +36,126049,,,,,,,,,,,,0.06925012171268463,,,,,, +36,126099,,,,,,,,,,,,0.07267235219478607,,,,,, +36,126149,,,,,,,,,,,,0.07324465364217758,,,,,, +36,126199,,,,,,,,,,,,0.07071332633495331,,,,,, +36,126249,,,,,,,,,,,,0.07507011294364929,,,,,, +36,126299,,,,,,,,,,,,0.07763263583183289,,,,,, +36,126349,,,,,,,,,,,,0.06491399556398392,,,,,, +36,126399,,,,,,,,,,,,0.07731685042381287,,,,,, +36,126449,,,,,,,,,,,,0.06697496771812439,,,,,, +36,126499,,,,,,,,,,,,0.05837734788656235,,,,,, +36,126549,,,,,,,,,,,,0.08490483462810516,,,,,, +36,126599,,,,,,,,,,,,0.0654715970158577,,,,,, +36,126649,,,,,,,,,,,,0.06736902892589569,,,,,, +36,126699,,,,,,,,,,,,0.07797238975763321,,,,,, +36,126749,,,,,,,,,,,,0.08358775079250336,,,,,, +36,126799,,,,,,,,,,,,0.07472503185272217,,,,,, +36,126849,,,,,,,,,,,,0.07546263188123703,,,,,, +36,126899,,,,,,,,,,,,0.07852115482091904,,,,,, +36,126949,,,,,,,,,,,,0.07626530528068542,,,,,, +36,126999,,,,,,,,,,,,0.0836409330368042,,,,,, +36,127049,,,,,,,,,,,,0.06971429288387299,,,,,, +36,127099,,,,,,,,,,,,0.069673553109169,,,,,, +36,127149,,,,,,,,,,,,0.07997595518827438,,,,,, +36,127199,,,,,,,,,,,,0.0668649896979332,,,,,, +36,127249,,,,,,,,,,,,0.06678368151187897,,,,,, +36,127299,,,,,,,,,,,,0.07892288267612457,,,,,, +36,127349,,,,,,,,,,,,0.08032190799713135,,,,,, +36,127353,,,,,,,,,,,,,0.23522616922855377,0.07898177951574326,0.32088208198547363,0.049559175968170166,0.3160284459590912,0.07898177951574326 +36,127353,,,,,,,0.2288827896118164,0.07268132269382477,0.3482990264892578,0.1213034987449646,0.32822927832603455,,,,,,, +37,127399,,,,,,,,,,,,0.07087433338165283,,,,,, +37,127449,,,,,,,,,,,,0.07544373720884323,,,,,, +37,127499,,,,,,,,,,,,0.06683490425348282,,,,,, +37,127549,,,,,,,,,,,,0.07377628237009048,,,,,, +37,127599,,,,,,,,,,,,0.07692355662584305,,,,,, +37,127649,,,,,,,,,,,,0.07463341951370239,,,,,, +37,127699,,,,,,,,,,,,0.05868040770292282,,,,,, +37,127749,,,,,,,,,,,,0.06666523218154907,,,,,, +37,127799,,,,,,,,,,,,0.0641719177365303,,,,,, +37,127849,,,,,,,,,,,,0.0726875439286232,,,,,, +37,127899,,,,,,,,,,,,0.0723671019077301,,,,,, +37,127949,,,,,,,,,,,,0.06265515089035034,,,,,, +37,127999,,,,,,,,,,,,0.06648021191358566,,,,,, +37,128049,,,,,,,,,,,,0.07396695017814636,,,,,, +37,128099,,,,,,,,,,,,0.07323671877384186,,,,,, +37,128149,,,,,,,,,,,,0.07848890125751495,,,,,, +37,128199,,,,,,,,,,,,0.06581476330757141,,,,,, +37,128249,,,,,,,,,,,,0.08703145384788513,,,,,, +37,128299,,,,,,,,,,,,0.07152771949768066,,,,,, +37,128349,,,,,,,,,,,,0.07846871018409729,,,,,, +37,128399,,,,,,,,,,,,0.0661386027932167,,,,,, +37,128449,,,,,,,,,,,,0.08016186952590942,,,,,, +37,128499,,,,,,,,,,,,0.0685509741306305,,,,,, +37,128549,,,,,,,,,,,,0.075037881731987,,,,,, +37,128599,,,,,,,,,,,,0.0643528401851654,,,,,, +37,128649,,,,,,,,,,,,0.08342528343200684,,,,,, +37,128699,,,,,,,,,,,,0.06423786282539368,,,,,, +37,128749,,,,,,,,,,,,0.06753121316432953,,,,,, +37,128799,,,,,,,,,,,,0.06064640358090401,,,,,, +37,128849,,,,,,,,,,,,0.0883786678314209,,,,,, +37,128899,,,,,,,,,,,,0.06415870040655136,,,,,, +37,128949,,,,,,,,,,,,0.0724644809961319,,,,,, +37,128999,,,,,,,,,,,,0.06703319400548935,,,,,, +37,129049,,,,,,,,,,,,0.07800155878067017,,,,,, +37,129099,,,,,,,,,,,,0.076486736536026,,,,,, +37,129149,,,,,,,,,,,,0.07960133254528046,,,,,, +37,129199,,,,,,,,,,,,0.08102022856473923,,,,,, +37,129249,,,,,,,,,,,,0.06700754165649414,,,,,, +37,129299,,,,,,,,,,,,0.07657989114522934,,,,,, +37,129349,,,,,,,,,,,,0.06728699803352356,,,,,, +37,129399,,,,,,,,,,,,0.07993005216121674,,,,,, +37,129449,,,,,,,,,,,,0.07586918026208878,,,,,, +37,129499,,,,,,,,,,,,0.07030874490737915,,,,,, +37,129549,,,,,,,,,,,,0.06744086742401123,,,,,, +37,129599,,,,,,,,,,,,0.07405358552932739,,,,,, +37,129649,,,,,,,,,,,,0.08272133767604828,,,,,, +37,129699,,,,,,,,,,,,0.07561574876308441,,,,,, +37,129749,,,,,,,,,,,,0.06221112981438637,,,,,, +37,129799,,,,,,,,,,,,0.07277143001556396,,,,,, +37,129849,,,,,,,,,,,,0.09120143949985504,,,,,, +37,129899,,,,,,,,,,,,0.07445001602172852,,,,,, +37,129949,,,,,,,,,,,,0.06270112842321396,,,,,, +37,129999,,,,,,,,,,,,0.07255218923091888,,,,,, +37,130049,,,,,,,,,,,,0.08007661998271942,,,,,, +37,130099,,,,,,,,,,,,0.07660144567489624,,,,,, +37,130149,,,,,,,,,,,,0.0866493210196495,,,,,, +37,130199,,,,,,,,,,,,0.06712568551301956,,,,,, +37,130249,,,,,,,,,,,,0.0713047981262207,,,,,, +37,130299,,,,,,,,,,,,0.08436490595340729,,,,,, +37,130349,,,,,,,,,,,,0.06812494993209839,,,,,, +37,130399,,,,,,,,,,,,0.06799167394638062,,,,,, +37,130449,,,,,,,,,,,,0.07124755531549454,,,,,, +37,130499,,,,,,,,,,,,0.0773380696773529,,,,,, +37,130549,,,,,,,,,,,,0.07580295205116272,,,,,, +37,130599,,,,,,,,,,,,0.0717960000038147,,,,,, +37,130649,,,,,,,,,,,,0.057857438921928406,,,,,, +37,130699,,,,,,,,,,,,0.07112520933151245,,,,,, +37,130749,,,,,,,,,,,,0.07057932019233704,,,,,, +37,130795,,,,,,,,,,,,,0.23255963623523712,0.07735811173915863,0.32910382747650146,0.06909781694412231,0.32357749342918396,0.07735811173915863 +37,130795,,,,,,,0.22893667221069336,0.07269846647977829,0.34800028800964355,0.12109887599945068,0.32739007472991943,,,,,,, +38,130799,,,,,,,,,,,,0.08196794986724854,,,,,, +38,130849,,,,,,,,,,,,0.06434869766235352,,,,,, +38,130899,,,,,,,,,,,,0.07453612983226776,,,,,, +38,130949,,,,,,,,,,,,0.07561293989419937,,,,,, +38,130999,,,,,,,,,,,,0.0609278567135334,,,,,, +38,131049,,,,,,,,,,,,0.07095256447792053,,,,,, +38,131099,,,,,,,,,,,,0.08520260453224182,,,,,, +38,131149,,,,,,,,,,,,0.06550358980894089,,,,,, +38,131199,,,,,,,,,,,,0.07278358936309814,,,,,, +38,131249,,,,,,,,,,,,0.06254453957080841,,,,,, +38,131299,,,,,,,,,,,,0.08712806552648544,,,,,, +38,131349,,,,,,,,,,,,0.07036832720041275,,,,,, +38,131399,,,,,,,,,,,,0.06596432626247406,,,,,, +38,131449,,,,,,,,,,,,0.08670198917388916,,,,,, +38,131499,,,,,,,,,,,,0.07136347144842148,,,,,, +38,131549,,,,,,,,,,,,0.07514570653438568,,,,,, +38,131599,,,,,,,,,,,,0.06900671869516373,,,,,, +38,131649,,,,,,,,,,,,0.07000111788511276,,,,,, +38,131699,,,,,,,,,,,,0.08756651729345322,,,,,, +38,131749,,,,,,,,,,,,0.08983857929706573,,,,,, +38,131799,,,,,,,,,,,,0.0734536200761795,,,,,, +38,131849,,,,,,,,,,,,0.0706246942281723,,,,,, +38,131899,,,,,,,,,,,,0.05963506922125816,,,,,, +38,131949,,,,,,,,,,,,0.0627821832895279,,,,,, +38,131999,,,,,,,,,,,,0.06288261711597443,,,,,, +38,132049,,,,,,,,,,,,0.06640820950269699,,,,,, +38,132099,,,,,,,,,,,,0.06078289821743965,,,,,, +38,132149,,,,,,,,,,,,0.08064702153205872,,,,,, +38,132199,,,,,,,,,,,,0.06543281674385071,,,,,, +38,132249,,,,,,,,,,,,0.063524030148983,,,,,, +38,132299,,,,,,,,,,,,0.07026265561580658,,,,,, +38,132349,,,,,,,,,,,,0.07206755131483078,,,,,, +38,132399,,,,,,,,,,,,0.08327027410268784,,,,,, +38,132449,,,,,,,,,,,,0.07145875692367554,,,,,, +38,132499,,,,,,,,,,,,0.05910997465252876,,,,,, +38,132549,,,,,,,,,,,,0.06811141967773438,,,,,, +38,132599,,,,,,,,,,,,0.07161835581064224,,,,,, +38,132649,,,,,,,,,,,,0.0817851722240448,,,,,, +38,132699,,,,,,,,,,,,0.08411690592765808,,,,,, +38,132749,,,,,,,,,,,,0.0770728588104248,,,,,, +38,132799,,,,,,,,,,,,0.07363486289978027,,,,,, +38,132849,,,,,,,,,,,,0.08000705391168594,,,,,, +38,132899,,,,,,,,,,,,0.07081648707389832,,,,,, +38,132949,,,,,,,,,,,,0.0673670545220375,,,,,, +38,132999,,,,,,,,,,,,0.07010889798402786,,,,,, +38,133049,,,,,,,,,,,,0.07342370599508286,,,,,, +38,133099,,,,,,,,,,,,0.07114474475383759,,,,,, +38,133149,,,,,,,,,,,,0.07167542725801468,,,,,, +38,133199,,,,,,,,,,,,0.06623397767543793,,,,,, +38,133249,,,,,,,,,,,,0.07802316546440125,,,,,, +38,133299,,,,,,,,,,,,0.06851989030838013,,,,,, +38,133349,,,,,,,,,,,,0.07739485800266266,,,,,, +38,133399,,,,,,,,,,,,0.06331054866313934,,,,,, +38,133449,,,,,,,,,,,,0.07949253916740417,,,,,, +38,133499,,,,,,,,,,,,0.07937289029359818,,,,,, +38,133549,,,,,,,,,,,,0.07910916209220886,,,,,, +38,133599,,,,,,,,,,,,0.07864126563072205,,,,,, +38,133649,,,,,,,,,,,,0.07705140858888626,,,,,, +38,133699,,,,,,,,,,,,0.06752660870552063,,,,,, +38,133749,,,,,,,,,,,,0.06775826215744019,,,,,, +38,133799,,,,,,,,,,,,0.0745716542005539,,,,,, +38,133849,,,,,,,,,,,,0.06926944851875305,,,,,, +38,133899,,,,,,,,,,,,0.0723477303981781,,,,,, +38,133949,,,,,,,,,,,,0.07210521399974823,,,,,, +38,133999,,,,,,,,,,,,0.07370951771736145,,,,,, +38,134049,,,,,,,,,,,,0.08241145312786102,,,,,, +38,134099,,,,,,,,,,,,0.06506310403347015,,,,,, +38,134149,,,,,,,,,,,,0.07617425173521042,,,,,, +38,134199,,,,,,,,,,,,0.08066123723983765,,,,,, +38,134237,,,,,,,,,,,,,0.2336522936820984,0.07840870320796967,0.3229216933250427,0.05645531415939331,0.32187673449516296,0.07840870320796967 +38,134237,,,,,,,0.22868004441261292,0.07256817072629929,0.3502538502216339,0.12267261743545532,0.32995831966400146,,,,,,, +39,134249,,,,,,,,,,,,0.06112537905573845,,,,,, +39,134299,,,,,,,,,,,,0.07172231376171112,,,,,, +39,134349,,,,,,,,,,,,0.06767889857292175,,,,,, +39,134399,,,,,,,,,,,,0.0733431875705719,,,,,, +39,134449,,,,,,,,,,,,0.0643463209271431,,,,,, +39,134499,,,,,,,,,,,,0.06895933300256729,,,,,, +39,134549,,,,,,,,,,,,0.07713372260332108,,,,,, +39,134599,,,,,,,,,,,,0.06723596155643463,,,,,, +39,134649,,,,,,,,,,,,0.07400193065404892,,,,,, +39,134699,,,,,,,,,,,,0.0902601033449173,,,,,, +39,134749,,,,,,,,,,,,0.07219383865594864,,,,,, +39,134799,,,,,,,,,,,,0.06825555115938187,,,,,, +39,134849,,,,,,,,,,,,0.06996279954910278,,,,,, +39,134899,,,,,,,,,,,,0.07167975604534149,,,,,, +39,134949,,,,,,,,,,,,0.07245828956365585,,,,,, +39,134999,,,,,,,,,,,,0.0675453245639801,,,,,, +39,135049,,,,,,,,,,,,0.06303104758262634,,,,,, +39,135099,,,,,,,,,,,,0.07665735483169556,,,,,, +39,135149,,,,,,,,,,,,0.06253321468830109,,,,,, +39,135199,,,,,,,,,,,,0.0736413523554802,,,,,, +39,135249,,,,,,,,,,,,0.06876087188720703,,,,,, +39,135299,,,,,,,,,,,,0.06242138147354126,,,,,, +39,135349,,,,,,,,,,,,0.0683017298579216,,,,,, +39,135399,,,,,,,,,,,,0.0707206130027771,,,,,, +39,135449,,,,,,,,,,,,0.06583747267723083,,,,,, +39,135499,,,,,,,,,,,,0.06968633830547333,,,,,, +39,135549,,,,,,,,,,,,0.08221924304962158,,,,,, +39,135599,,,,,,,,,,,,0.0684124231338501,,,,,, +39,135649,,,,,,,,,,,,0.06390227377414703,,,,,, +39,135699,,,,,,,,,,,,0.0719829797744751,,,,,, +39,135749,,,,,,,,,,,,0.06983280926942825,,,,,, +39,135799,,,,,,,,,,,,0.06908790022134781,,,,,, +39,135849,,,,,,,,,,,,0.06406670808792114,,,,,, +39,135899,,,,,,,,,,,,0.06536777317523956,,,,,, +39,135949,,,,,,,,,,,,0.07054653763771057,,,,,, +39,135999,,,,,,,,,,,,0.06668153405189514,,,,,, +39,136049,,,,,,,,,,,,0.07040735334157944,,,,,, +39,136099,,,,,,,,,,,,0.06842834502458572,,,,,, +39,136149,,,,,,,,,,,,0.07021255046129227,,,,,, +39,136199,,,,,,,,,,,,0.07168027758598328,,,,,, +39,136249,,,,,,,,,,,,0.08762280642986298,,,,,, +39,136299,,,,,,,,,,,,0.08693192899227142,,,,,, +39,136349,,,,,,,,,,,,0.0679037868976593,,,,,, +39,136399,,,,,,,,,,,,0.07544447481632233,,,,,, +39,136449,,,,,,,,,,,,0.06453904509544373,,,,,, +39,136499,,,,,,,,,,,,0.06576772779226303,,,,,, +39,136549,,,,,,,,,,,,0.06880969554185867,,,,,, +39,136599,,,,,,,,,,,,0.07883839309215546,,,,,, +39,136649,,,,,,,,,,,,0.0808599591255188,,,,,, +39,136699,,,,,,,,,,,,0.0721646323800087,,,,,, +39,136749,,,,,,,,,,,,0.06432358920574188,,,,,, +39,136799,,,,,,,,,,,,0.07611782848834991,,,,,, +39,136849,,,,,,,,,,,,0.07264992594718933,,,,,, +39,136899,,,,,,,,,,,,0.06177026033401489,,,,,, +39,136949,,,,,,,,,,,,0.07632278650999069,,,,,, +39,136999,,,,,,,,,,,,0.07269901037216187,,,,,, +39,137049,,,,,,,,,,,,0.07457146048545837,,,,,, +39,137099,,,,,,,,,,,,0.07711010426282883,,,,,, +39,137149,,,,,,,,,,,,0.06921875476837158,,,,,, +39,137199,,,,,,,,,,,,0.0651082694530487,,,,,, +39,137249,,,,,,,,,,,,0.060981400310993195,,,,,, +39,137299,,,,,,,,,,,,0.08307979255914688,,,,,, +39,137349,,,,,,,,,,,,0.07193731516599655,,,,,, +39,137399,,,,,,,,,,,,0.06808997690677643,,,,,, +39,137449,,,,,,,,,,,,0.0763334259390831,,,,,, +39,137499,,,,,,,,,,,,0.070292629301548,,,,,, +39,137549,,,,,,,,,,,,0.07943785190582275,,,,,, +39,137599,,,,,,,,,,,,0.07725688815116882,,,,,, +39,137649,,,,,,,,,,,,0.07150489836931229,,,,,, +39,137679,,,,,,,,,,,,,0.2322351187467575,0.07707475870847702,0.330130398273468,0.07250756025314331,0.3255901336669922,0.07707475870847702 +39,137679,,,,,,,0.22867676615715027,0.0726039782166481,0.3496457040309906,0.12223464250564575,0.32970112562179565,,,,,,, +40,137699,,,,,,,,,,,,0.07177290320396423,,,,,, +40,137749,,,,,,,,,,,,0.0742875337600708,,,,,, +40,137799,,,,,,,,,,,,0.07242566347122192,,,,,, +40,137849,,,,,,,,,,,,0.06224403530359268,,,,,, +40,137899,,,,,,,,,,,,0.07412915676832199,,,,,, +40,137949,,,,,,,,,,,,0.07128701359033585,,,,,, +40,137999,,,,,,,,,,,,0.08129436522722244,,,,,, +40,138049,,,,,,,,,,,,0.066305972635746,,,,,, +40,138099,,,,,,,,,,,,0.0661691278219223,,,,,, +40,138149,,,,,,,,,,,,0.06472203880548477,,,,,, +40,138199,,,,,,,,,,,,0.0828663632273674,,,,,, +40,138249,,,,,,,,,,,,0.06709926575422287,,,,,, +40,138299,,,,,,,,,,,,0.08185705542564392,,,,,, +40,138349,,,,,,,,,,,,0.07292326539754868,,,,,, +40,138399,,,,,,,,,,,,0.07602434605360031,,,,,, +40,138449,,,,,,,,,,,,0.0689249038696289,,,,,, +40,138499,,,,,,,,,,,,0.07443258166313171,,,,,, +40,138549,,,,,,,,,,,,0.06955109536647797,,,,,, +40,138599,,,,,,,,,,,,0.072870634496212,,,,,, +40,138649,,,,,,,,,,,,0.08019543439149857,,,,,, +40,138699,,,,,,,,,,,,0.05981555953621864,,,,,, +40,138749,,,,,,,,,,,,0.07215934991836548,,,,,, +40,138799,,,,,,,,,,,,0.058402664959430695,,,,,, +40,138849,,,,,,,,,,,,0.06507524102926254,,,,,, +40,138899,,,,,,,,,,,,0.08007920533418655,,,,,, +40,138949,,,,,,,,,,,,0.06405964493751526,,,,,, +40,138999,,,,,,,,,,,,0.0888676643371582,,,,,, +40,139049,,,,,,,,,,,,0.07594068348407745,,,,,, +40,139099,,,,,,,,,,,,0.0714372843503952,,,,,, +40,139149,,,,,,,,,,,,0.08468879759311676,,,,,, +40,139199,,,,,,,,,,,,0.05621339753270149,,,,,, +40,139249,,,,,,,,,,,,0.08085784316062927,,,,,, +40,139299,,,,,,,,,,,,0.07032832503318787,,,,,, +40,139349,,,,,,,,,,,,0.0640520453453064,,,,,, +40,139399,,,,,,,,,,,,0.07559826970100403,,,,,, +40,139449,,,,,,,,,,,,0.0772174820303917,,,,,, +40,139499,,,,,,,,,,,,0.06802833080291748,,,,,, +40,139549,,,,,,,,,,,,0.06846468150615692,,,,,, +40,139599,,,,,,,,,,,,0.07537759095430374,,,,,, +40,139649,,,,,,,,,,,,0.05993363633751869,,,,,, +40,139699,,,,,,,,,,,,0.06908690184354782,,,,,, +40,139749,,,,,,,,,,,,0.07782618701457977,,,,,, +40,139799,,,,,,,,,,,,0.06742985546588898,,,,,, +40,139849,,,,,,,,,,,,0.07333610206842422,,,,,, +40,139899,,,,,,,,,,,,0.07781614363193512,,,,,, +40,139949,,,,,,,,,,,,0.07934480160474777,,,,,, +40,139999,,,,,,,,,,,,0.07927194982767105,,,,,, +40,140049,,,,,,,,,,,,0.07501417398452759,,,,,, +40,140099,,,,,,,,,,,,0.07605743408203125,,,,,, +40,140149,,,,,,,,,,,,0.07830719649791718,,,,,, +40,140199,,,,,,,,,,,,0.0799340009689331,,,,,, +40,140249,,,,,,,,,,,,0.08125507831573486,,,,,, +40,140299,,,,,,,,,,,,0.08230384439229965,,,,,, +40,140349,,,,,,,,,,,,0.0677422508597374,,,,,, +40,140399,,,,,,,,,,,,0.06872184574604034,,,,,, +40,140449,,,,,,,,,,,,0.08006197214126587,,,,,, +40,140499,,,,,,,,,,,,0.06968042999505997,,,,,, +40,140549,,,,,,,,,,,,0.06759659945964813,,,,,, +40,140599,,,,,,,,,,,,0.08611221611499786,,,,,, +40,140649,,,,,,,,,,,,0.07144615054130554,,,,,, +40,140699,,,,,,,,,,,,0.06867086887359619,,,,,, +40,140749,,,,,,,,,,,,0.0631750077009201,,,,,, +40,140799,,,,,,,,,,,,0.0747978538274765,,,,,, +40,140849,,,,,,,,,,,,0.07874411344528198,,,,,, +40,140899,,,,,,,,,,,,0.07030192017555237,,,,,, +40,140949,,,,,,,,,,,,0.0727732703089714,,,,,, +40,140999,,,,,,,,,,,,0.07752719521522522,,,,,, +40,141049,,,,,,,,,,,,0.06553150713443756,,,,,, +40,141099,,,,,,,,,,,,0.06997354328632355,,,,,, +40,141121,,,,,,,,,,,,,0.23201927542686462,0.07681868225336075,0.32903146743774414,0.075589120388031,0.3240143954753876,0.07681868225336075 +40,141121,,,,,,,0.22863805294036865,0.07455221563577652,0.3208509683609009,0.09868919849395752,0.33154773712158203,,,,,,, +41,141149,,,,,,,,,,,,0.06574608385562897,,,,,, +41,141199,,,,,,,,,,,,0.06744110584259033,,,,,, +41,141249,,,,,,,,,,,,0.07603280246257782,,,,,, +41,141299,,,,,,,,,,,,0.06756451725959778,,,,,, +41,141349,,,,,,,,,,,,0.07313963025808334,,,,,, +41,141399,,,,,,,,,,,,0.07036934792995453,,,,,, +41,141449,,,,,,,,,,,,0.07341891527175903,,,,,, +41,141499,,,,,,,,,,,,0.07502366602420807,,,,,, +41,141549,,,,,,,,,,,,0.06425359845161438,,,,,, +41,141599,,,,,,,,,,,,0.08030980825424194,,,,,, +41,141649,,,,,,,,,,,,0.07767237722873688,,,,,, +41,141699,,,,,,,,,,,,0.06942420452833176,,,,,, +41,141749,,,,,,,,,,,,0.06606104969978333,,,,,, +41,141799,,,,,,,,,,,,0.06928904354572296,,,,,, +41,141849,,,,,,,,,,,,0.0777352824807167,,,,,, +41,141899,,,,,,,,,,,,0.08017994463443756,,,,,, +41,141949,,,,,,,,,,,,0.07417814433574677,,,,,, +41,141999,,,,,,,,,,,,0.07325813174247742,,,,,, +41,142049,,,,,,,,,,,,0.07572774589061737,,,,,, +41,142099,,,,,,,,,,,,0.0738394558429718,,,,,, +41,142149,,,,,,,,,,,,0.061667002737522125,,,,,, +41,142199,,,,,,,,,,,,0.07272407412528992,,,,,, +41,142249,,,,,,,,,,,,0.06963933259248734,,,,,, +41,142299,,,,,,,,,,,,0.0675160139799118,,,,,, +41,142349,,,,,,,,,,,,0.078171506524086,,,,,, +41,142399,,,,,,,,,,,,0.06822408735752106,,,,,, +41,142449,,,,,,,,,,,,0.0750003308057785,,,,,, +41,142499,,,,,,,,,,,,0.07367479801177979,,,,,, +41,142549,,,,,,,,,,,,0.07610952854156494,,,,,, +41,142599,,,,,,,,,,,,0.07345525920391083,,,,,, +41,142649,,,,,,,,,,,,0.07867635041475296,,,,,, +41,142699,,,,,,,,,,,,0.07541802525520325,,,,,, +41,142749,,,,,,,,,,,,0.08094316720962524,,,,,, +41,142799,,,,,,,,,,,,0.076627716422081,,,,,, +41,142849,,,,,,,,,,,,0.08915545046329498,,,,,, +41,142899,,,,,,,,,,,,0.07016512751579285,,,,,, +41,142949,,,,,,,,,,,,0.07112777233123779,,,,,, +41,142999,,,,,,,,,,,,0.07234512269496918,,,,,, +41,143049,,,,,,,,,,,,0.06229470670223236,,,,,, +41,143099,,,,,,,,,,,,0.06694746017456055,,,,,, +41,143149,,,,,,,,,,,,0.07044639438390732,,,,,, +41,143199,,,,,,,,,,,,0.06733624637126923,,,,,, +41,143249,,,,,,,,,,,,0.07051215320825577,,,,,, +41,143299,,,,,,,,,,,,0.061971068382263184,,,,,, +41,143349,,,,,,,,,,,,0.07216484844684601,,,,,, +41,143399,,,,,,,,,,,,0.07838639616966248,,,,,, +41,143449,,,,,,,,,,,,0.07216653227806091,,,,,, +41,143499,,,,,,,,,,,,0.07000306248664856,,,,,, +41,143549,,,,,,,,,,,,0.07591801136732101,,,,,, +41,143599,,,,,,,,,,,,0.08660079538822174,,,,,, +41,143649,,,,,,,,,,,,0.07236313074827194,,,,,, +41,143699,,,,,,,,,,,,0.079022616147995,,,,,, +41,143749,,,,,,,,,,,,0.05361572653055191,,,,,, +41,143799,,,,,,,,,,,,0.0780549943447113,,,,,, +41,143849,,,,,,,,,,,,0.06926093995571136,,,,,, +41,143899,,,,,,,,,,,,0.07273972034454346,,,,,, +41,143949,,,,,,,,,,,,0.06708179414272308,,,,,, +41,143999,,,,,,,,,,,,0.06729299575090408,,,,,, +41,144049,,,,,,,,,,,,0.07191258668899536,,,,,, +41,144099,,,,,,,,,,,,0.07717809081077576,,,,,, +41,144149,,,,,,,,,,,,0.07903999090194702,,,,,, +41,144199,,,,,,,,,,,,0.0803355872631073,,,,,, +41,144249,,,,,,,,,,,,0.07204802334308624,,,,,, +41,144299,,,,,,,,,,,,0.06704691052436829,,,,,, +41,144349,,,,,,,,,,,,0.07151907682418823,,,,,, +41,144399,,,,,,,,,,,,0.07145766913890839,,,,,, +41,144449,,,,,,,,,,,,0.07292132079601288,,,,,, +41,144499,,,,,,,,,,,,0.08800102025270462,,,,,, +41,144549,,,,,,,,,,,,0.08605849742889404,,,,,, +41,144563,,,,,,,,,,,,,0.2332107424736023,0.07762940973043442,0.3269563615322113,0.06583309173583984,0.32257455587387085,0.07762940973043442 +41,144563,,,,,,,0.22843483090400696,0.07244780659675598,0.3523279130458832,0.12413972616195679,0.3321046531200409,,,,,,, +42,144599,,,,,,,,,,,,0.06404321640729904,,,,,, +42,144649,,,,,,,,,,,,0.06837505847215652,,,,,, +42,144699,,,,,,,,,,,,0.06984472274780273,,,,,, +42,144749,,,,,,,,,,,,0.06856384128332138,,,,,, +42,144799,,,,,,,,,,,,0.07769186794757843,,,,,, +42,144849,,,,,,,,,,,,0.0739939957857132,,,,,, +42,144899,,,,,,,,,,,,0.07165227830410004,,,,,, +42,144949,,,,,,,,,,,,0.07516131550073624,,,,,, +42,144999,,,,,,,,,,,,0.0800926461815834,,,,,, +42,145049,,,,,,,,,,,,0.061704255640506744,,,,,, +42,145099,,,,,,,,,,,,0.06191161274909973,,,,,, +42,145149,,,,,,,,,,,,0.07436475157737732,,,,,, +42,145199,,,,,,,,,,,,0.06711225211620331,,,,,, +42,145249,,,,,,,,,,,,0.06279218941926956,,,,,, +42,145299,,,,,,,,,,,,0.06918851286172867,,,,,, +42,145349,,,,,,,,,,,,0.0757971778512001,,,,,, +42,145399,,,,,,,,,,,,0.06967476010322571,,,,,, +42,145449,,,,,,,,,,,,0.07109567523002625,,,,,, +42,145499,,,,,,,,,,,,0.06685146689414978,,,,,, +42,145549,,,,,,,,,,,,0.06710631400346756,,,,,, +42,145599,,,,,,,,,,,,0.07811672240495682,,,,,, +42,145649,,,,,,,,,,,,0.07072541117668152,,,,,, +42,145699,,,,,,,,,,,,0.06289394944906235,,,,,, +42,145749,,,,,,,,,,,,0.0763874351978302,,,,,, +42,145799,,,,,,,,,,,,0.06677461415529251,,,,,, +42,145849,,,,,,,,,,,,0.08406642079353333,,,,,, +42,145899,,,,,,,,,,,,0.06704079359769821,,,,,, +42,145949,,,,,,,,,,,,0.07184837013483047,,,,,, +42,145999,,,,,,,,,,,,0.05599846690893173,,,,,, +42,146049,,,,,,,,,,,,0.08800165355205536,,,,,, +42,146099,,,,,,,,,,,,0.06542853266000748,,,,,, +42,146149,,,,,,,,,,,,0.06648193299770355,,,,,, +42,146199,,,,,,,,,,,,0.08057855069637299,,,,,, +42,146249,,,,,,,,,,,,0.0626939982175827,,,,,, +42,146299,,,,,,,,,,,,0.08411955833435059,,,,,, +42,146349,,,,,,,,,,,,0.07425549626350403,,,,,, +42,146399,,,,,,,,,,,,0.07139226794242859,,,,,, +42,146449,,,,,,,,,,,,0.0699155330657959,,,,,, +42,146499,,,,,,,,,,,,0.07317934930324554,,,,,, +42,146549,,,,,,,,,,,,0.08028920739889145,,,,,, +42,146599,,,,,,,,,,,,0.07340576499700546,,,,,, +42,146649,,,,,,,,,,,,0.07565774023532867,,,,,, +42,146699,,,,,,,,,,,,0.06331568956375122,,,,,, +42,146749,,,,,,,,,,,,0.07791721075773239,,,,,, +42,146799,,,,,,,,,,,,0.07724650949239731,,,,,, +42,146849,,,,,,,,,,,,0.07415790855884552,,,,,, +42,146899,,,,,,,,,,,,0.07815395295619965,,,,,, +42,146949,,,,,,,,,,,,0.06670555472373962,,,,,, +42,146999,,,,,,,,,,,,0.08068382740020752,,,,,, +42,147049,,,,,,,,,,,,0.07624704390764236,,,,,, +42,147099,,,,,,,,,,,,0.07891745865345001,,,,,, +42,147149,,,,,,,,,,,,0.07834464311599731,,,,,, +42,147199,,,,,,,,,,,,0.07696528732776642,,,,,, +42,147249,,,,,,,,,,,,0.0796096995472908,,,,,, +42,147299,,,,,,,,,,,,0.07240284979343414,,,,,, +42,147349,,,,,,,,,,,,0.0702744796872139,,,,,, +42,147399,,,,,,,,,,,,0.06746982038021088,,,,,, +42,147449,,,,,,,,,,,,0.07491351664066315,,,,,, +42,147499,,,,,,,,,,,,0.0676632896065712,,,,,, +42,147549,,,,,,,,,,,,0.07307375222444534,,,,,, +42,147599,,,,,,,,,,,,0.06482624262571335,,,,,, +42,147649,,,,,,,,,,,,0.05578161031007767,,,,,, +42,147699,,,,,,,,,,,,0.07797528803348541,,,,,, +42,147749,,,,,,,,,,,,0.07431650906801224,,,,,, +42,147799,,,,,,,,,,,,0.06446044147014618,,,,,, +42,147849,,,,,,,,,,,,0.07582072913646698,,,,,, +42,147899,,,,,,,,,,,,0.07518841326236725,,,,,, +42,147949,,,,,,,,,,,,0.07163283973932266,,,,,, +42,147999,,,,,,,,,,,,0.07555073499679565,,,,,, +42,148005,,,,,,,,,,,,,0.23303182423114777,0.0773693099617958,0.3234991729259491,0.06896299123764038,0.3200490176677704,0.0773693099617958 +42,148005,,,,,,,0.22839730978012085,0.07243146002292633,0.3526074290275574,0.12432873249053955,0.33190882205963135,,,,,,, +43,148049,,,,,,,,,,,,0.07491160184144974,,,,,, +43,148099,,,,,,,,,,,,0.06250520050525665,,,,,, +43,148149,,,,,,,,,,,,0.07892847061157227,,,,,, +43,148199,,,,,,,,,,,,0.08645298331975937,,,,,, +43,148249,,,,,,,,,,,,0.06807426363229752,,,,,, +43,148299,,,,,,,,,,,,0.06552189588546753,,,,,, +43,148349,,,,,,,,,,,,0.06251665204763412,,,,,, +43,148399,,,,,,,,,,,,0.07773935794830322,,,,,, +43,148449,,,,,,,,,,,,0.07617074996232986,,,,,, +43,148499,,,,,,,,,,,,0.0702756866812706,,,,,, +43,148549,,,,,,,,,,,,0.060549501329660416,,,,,, +43,148599,,,,,,,,,,,,0.0689467340707779,,,,,, +43,148649,,,,,,,,,,,,0.07253952324390411,,,,,, +43,148699,,,,,,,,,,,,0.08311022818088531,,,,,, +43,148749,,,,,,,,,,,,0.07252667844295502,,,,,, +43,148799,,,,,,,,,,,,0.07595442235469818,,,,,, +43,148849,,,,,,,,,,,,0.07570188492536545,,,,,, +43,148899,,,,,,,,,,,,0.0672244280576706,,,,,, +43,148949,,,,,,,,,,,,0.08040159195661545,,,,,, +43,148999,,,,,,,,,,,,0.07449764758348465,,,,,, +43,149049,,,,,,,,,,,,0.07522311806678772,,,,,, +43,149099,,,,,,,,,,,,0.07224030792713165,,,,,, +43,149149,,,,,,,,,,,,0.05983617529273033,,,,,, +43,149199,,,,,,,,,,,,0.06727340072393417,,,,,, +43,149249,,,,,,,,,,,,0.07364388555288315,,,,,, +43,149299,,,,,,,,,,,,0.06938505172729492,,,,,, +43,149349,,,,,,,,,,,,0.07780922949314117,,,,,, +43,149399,,,,,,,,,,,,0.05814815312623978,,,,,, +43,149449,,,,,,,,,,,,0.07505425810813904,,,,,, +43,149499,,,,,,,,,,,,0.0639699175953865,,,,,, +43,149549,,,,,,,,,,,,0.06820077449083328,,,,,, +43,149599,,,,,,,,,,,,0.07390793412923813,,,,,, +43,149649,,,,,,,,,,,,0.06731849908828735,,,,,, +43,149699,,,,,,,,,,,,0.07772839069366455,,,,,, +43,149749,,,,,,,,,,,,0.07624416053295135,,,,,, +43,149799,,,,,,,,,,,,0.06900005042552948,,,,,, +43,149849,,,,,,,,,,,,0.07660838961601257,,,,,, +43,149899,,,,,,,,,,,,0.0684744194149971,,,,,, +43,149949,,,,,,,,,,,,0.06770602613687515,,,,,, +43,149999,,,,,,,,,,,,0.06852987408638,,,,,, +43,150049,,,,,,,,,,,,0.07888353615999222,,,,,, +43,150099,,,,,,,,,,,,0.0760454311966896,,,,,, +43,150149,,,,,,,,,,,,0.06303970515727997,,,,,, +43,150199,,,,,,,,,,,,0.07125870883464813,,,,,, +43,150249,,,,,,,,,,,,0.082570381462574,,,,,, +43,150299,,,,,,,,,,,,0.056857239454984665,,,,,, +43,150349,,,,,,,,,,,,0.07089152932167053,,,,,, +43,150399,,,,,,,,,,,,0.062231920659542084,,,,,, +43,150449,,,,,,,,,,,,0.07520841062068939,,,,,, +43,150499,,,,,,,,,,,,0.07690446078777313,,,,,, +43,150549,,,,,,,,,,,,0.07999458909034729,,,,,, +43,150599,,,,,,,,,,,,0.06750205159187317,,,,,, +43,150649,,,,,,,,,,,,0.05919594317674637,,,,,, +43,150699,,,,,,,,,,,,0.17866645753383636,,,,,, +43,150749,,,,,,,,,,,,0.07274911552667618,,,,,, +43,150799,,,,,,,,,,,,0.06315615028142929,,,,,, +43,150849,,,,,,,,,,,,0.10347776114940643,,,,,, +43,150899,,,,,,,,,,,,0.07309815287590027,,,,,, +43,150949,,,,,,,,,,,,0.07772412896156311,,,,,, +43,150999,,,,,,,,,,,,0.08368709683418274,,,,,, +43,151049,,,,,,,,,,,,0.07786551117897034,,,,,, +43,151099,,,,,,,,,,,,0.06706221401691437,,,,,, +43,151149,,,,,,,,,,,,0.07162067294120789,,,,,, +43,151199,,,,,,,,,,,,0.07237225770950317,,,,,, +43,151249,,,,,,,,,,,,0.06253200024366379,,,,,, +43,151299,,,,,,,,,,,,0.07704287767410278,,,,,, +43,151349,,,,,,,,,,,,0.07748059183359146,,,,,, +43,151399,,,,,,,,,,,,0.07389622926712036,,,,,, +43,151447,,,,,,,,,,,,,0.23642820119857788,0.08036785572767258,0.3219408690929413,0.032879531383514404,0.31744053959846497,0.08036785572767258 +43,151447,,,,,,,0.22833530604839325,0.07242422550916672,0.35273438692092896,0.12442505359649658,0.33352258801460266,,,,,,, +44,151449,,,,,,,,,,,,0.06342823803424835,,,,,, +44,151499,,,,,,,,,,,,0.0821969211101532,,,,,, +44,151549,,,,,,,,,,,,0.0607089027762413,,,,,, +44,151599,,,,,,,,,,,,0.06765992939472198,,,,,, +44,151649,,,,,,,,,,,,0.06862486898899078,,,,,, +44,151699,,,,,,,,,,,,0.08206246793270111,,,,,, +44,151749,,,,,,,,,,,,0.07525227218866348,,,,,, +44,151799,,,,,,,,,,,,0.07281684875488281,,,,,, +44,151849,,,,,,,,,,,,0.0673447921872139,,,,,, +44,151899,,,,,,,,,,,,0.07549841701984406,,,,,, +44,151949,,,,,,,,,,,,0.06632156670093536,,,,,, +44,151999,,,,,,,,,,,,0.07376466691493988,,,,,, +44,152049,,,,,,,,,,,,0.07721313834190369,,,,,, +44,152099,,,,,,,,,,,,0.06336050480604172,,,,,, +44,152149,,,,,,,,,,,,0.07063097506761551,,,,,, +44,152199,,,,,,,,,,,,0.07583527266979218,,,,,, +44,152249,,,,,,,,,,,,0.08142467588186264,,,,,, +44,152299,,,,,,,,,,,,0.071671262383461,,,,,, +44,152349,,,,,,,,,,,,0.06186001002788544,,,,,, +44,152399,,,,,,,,,,,,0.0680297315120697,,,,,, +44,152449,,,,,,,,,,,,0.07061141729354858,,,,,, +44,152499,,,,,,,,,,,,0.0709112361073494,,,,,, +44,152549,,,,,,,,,,,,0.06885938346385956,,,,,, +44,152599,,,,,,,,,,,,0.07650528103113174,,,,,, +44,152649,,,,,,,,,,,,0.08590240776538849,,,,,, +44,152699,,,,,,,,,,,,0.07562296092510223,,,,,, +44,152749,,,,,,,,,,,,0.07607214897871017,,,,,, +44,152799,,,,,,,,,,,,0.07756460458040237,,,,,, +44,152849,,,,,,,,,,,,0.06939277052879333,,,,,, +44,152899,,,,,,,,,,,,0.07063491642475128,,,,,, +44,152949,,,,,,,,,,,,0.07504473626613617,,,,,, +44,152999,,,,,,,,,,,,0.07512916624546051,,,,,, +44,153049,,,,,,,,,,,,0.0815172791481018,,,,,, +44,153099,,,,,,,,,,,,0.07554894685745239,,,,,, +44,153149,,,,,,,,,,,,0.06081848219037056,,,,,, +44,153199,,,,,,,,,,,,0.07454630732536316,,,,,, +44,153249,,,,,,,,,,,,0.06653173267841339,,,,,, +44,153299,,,,,,,,,,,,0.06323881447315216,,,,,, +44,153349,,,,,,,,,,,,0.0643470361828804,,,,,, +44,153399,,,,,,,,,,,,0.0673602893948555,,,,,, +44,153449,,,,,,,,,,,,0.07518947124481201,,,,,, +44,153499,,,,,,,,,,,,0.07891258597373962,,,,,, +44,153549,,,,,,,,,,,,0.07301270961761475,,,,,, +44,153599,,,,,,,,,,,,0.07531355321407318,,,,,, +44,153649,,,,,,,,,,,,0.0803024172782898,,,,,, +44,153699,,,,,,,,,,,,0.07136410474777222,,,,,, +44,153749,,,,,,,,,,,,0.06239037960767746,,,,,, +44,153799,,,,,,,,,,,,0.06974859535694122,,,,,, +44,153849,,,,,,,,,,,,0.07177771627902985,,,,,, +44,153899,,,,,,,,,,,,0.06796614825725555,,,,,, +44,153949,,,,,,,,,,,,0.07067930698394775,,,,,, +44,153999,,,,,,,,,,,,0.07665161788463593,,,,,, +44,154049,,,,,,,,,,,,0.06741602718830109,,,,,, +44,154099,,,,,,,,,,,,0.0860738530755043,,,,,, +44,154149,,,,,,,,,,,,0.07400302588939667,,,,,, +44,154199,,,,,,,,,,,,0.0790967121720314,,,,,, +44,154249,,,,,,,,,,,,0.06455548107624054,,,,,, +44,154299,,,,,,,,,,,,0.06472045928239822,,,,,, +44,154349,,,,,,,,,,,,0.06982143223285675,,,,,, +44,154399,,,,,,,,,,,,0.06983339786529541,,,,,, +44,154449,,,,,,,,,,,,0.0800817608833313,,,,,, +44,154499,,,,,,,,,,,,0.07466378808021545,,,,,, +44,154549,,,,,,,,,,,,0.06570803374052048,,,,,, +44,154599,,,,,,,,,,,,0.07755044102668762,,,,,, +44,154649,,,,,,,,,,,,0.07430658489465714,,,,,, +44,154699,,,,,,,,,,,,0.06862953305244446,,,,,, +44,154749,,,,,,,,,,,,0.07960682362318039,,,,,, +44,154799,,,,,,,,,,,,0.07364042103290558,,,,,, +44,154849,,,,,,,,,,,,0.06274212151765823,,,,,, +44,154889,,,,,,,,,,,,,0.234834685921669,0.07901151478290558,0.3269178569316864,0.04920130968093872,0.322797030210495,0.07901151478290558 +44,154889,,,,,,,0.2283627986907959,0.07246138900518417,0.3521067798137665,0.12396764755249023,0.332295686006546,,,,,,, +45,154899,,,,,,,,,,,,0.07443293929100037,,,,,, +45,154949,,,,,,,,,,,,0.09393928945064545,,,,,, +45,154999,,,,,,,,,,,,0.07292962074279785,,,,,, +45,155049,,,,,,,,,,,,0.06635774672031403,,,,,, +45,155099,,,,,,,,,,,,0.07265696674585342,,,,,, +45,155149,,,,,,,,,,,,0.06853136420249939,,,,,, +45,155199,,,,,,,,,,,,0.0685676634311676,,,,,, +45,155249,,,,,,,,,,,,0.07923521101474762,,,,,, +45,155299,,,,,,,,,,,,0.06433211266994476,,,,,, +45,155349,,,,,,,,,,,,0.08136023581027985,,,,,, +45,155399,,,,,,,,,,,,0.06672219932079315,,,,,, +45,155449,,,,,,,,,,,,0.07327302545309067,,,,,, +45,155499,,,,,,,,,,,,0.06735903769731522,,,,,, +45,155549,,,,,,,,,,,,0.07455693185329437,,,,,, +45,155599,,,,,,,,,,,,0.0734046995639801,,,,,, +45,155649,,,,,,,,,,,,0.08349624276161194,,,,,, +45,155699,,,,,,,,,,,,0.08307614922523499,,,,,, +45,155749,,,,,,,,,,,,0.06635825335979462,,,,,, +45,155799,,,,,,,,,,,,0.06581573933362961,,,,,, +45,155849,,,,,,,,,,,,0.08077064156532288,,,,,, +45,155899,,,,,,,,,,,,0.07291936874389648,,,,,, +45,155949,,,,,,,,,,,,0.0773865133523941,,,,,, +45,155999,,,,,,,,,,,,0.06890147924423218,,,,,, +45,156049,,,,,,,,,,,,0.07168763875961304,,,,,, +45,156099,,,,,,,,,,,,0.05897429957985878,,,,,, +45,156149,,,,,,,,,,,,0.07442827522754669,,,,,, +45,156199,,,,,,,,,,,,0.06917538493871689,,,,,, +45,156249,,,,,,,,,,,,0.07483430206775665,,,,,, +45,156299,,,,,,,,,,,,0.08110908418893814,,,,,, +45,156349,,,,,,,,,,,,0.07930735498666763,,,,,, +45,156399,,,,,,,,,,,,0.05992264300584793,,,,,, +45,156449,,,,,,,,,,,,0.06896325200796127,,,,,, +45,156499,,,,,,,,,,,,0.06159524992108345,,,,,, +45,156549,,,,,,,,,,,,0.06651125848293304,,,,,, +45,156599,,,,,,,,,,,,0.07483173906803131,,,,,, +45,156649,,,,,,,,,,,,0.07006959617137909,,,,,, +45,156699,,,,,,,,,,,,0.07268369197845459,,,,,, +45,156749,,,,,,,,,,,,0.07582297921180725,,,,,, +45,156799,,,,,,,,,,,,0.07126680016517639,,,,,, +45,156849,,,,,,,,,,,,0.0676840990781784,,,,,, +45,156899,,,,,,,,,,,,0.07872775942087173,,,,,, +45,156949,,,,,,,,,,,,0.07583658397197723,,,,,, +45,156999,,,,,,,,,,,,0.06510089337825775,,,,,, +45,157049,,,,,,,,,,,,0.07336124032735825,,,,,, +45,157099,,,,,,,,,,,,0.06645118445158005,,,,,, +45,157149,,,,,,,,,,,,0.0738578587770462,,,,,, +45,157199,,,,,,,,,,,,0.08167114108800888,,,,,, +45,157249,,,,,,,,,,,,0.0845021978020668,,,,,, +45,157299,,,,,,,,,,,,0.07283947616815567,,,,,, +45,157349,,,,,,,,,,,,0.06057778000831604,,,,,, +45,157399,,,,,,,,,,,,0.06873975694179535,,,,,, +45,157449,,,,,,,,,,,,0.07120829820632935,,,,,, +45,157499,,,,,,,,,,,,0.07760652899742126,,,,,, +45,157549,,,,,,,,,,,,0.07525774836540222,,,,,, +45,157599,,,,,,,,,,,,0.06519060581922531,,,,,, +45,157649,,,,,,,,,,,,0.07255496084690094,,,,,, +45,157699,,,,,,,,,,,,0.07428328692913055,,,,,, +45,157749,,,,,,,,,,,,0.07437306642532349,,,,,, +45,157799,,,,,,,,,,,,0.07686091959476471,,,,,, +45,157849,,,,,,,,,,,,0.07896232604980469,,,,,, +45,157899,,,,,,,,,,,,0.07869251817464828,,,,,, +45,157949,,,,,,,,,,,,0.06326879560947418,,,,,, +45,157999,,,,,,,,,,,,0.08198779821395874,,,,,, +45,158049,,,,,,,,,,,,0.07784257084131241,,,,,, +45,158099,,,,,,,,,,,,0.07346221804618835,,,,,, +45,158149,,,,,,,,,,,,0.07233546674251556,,,,,, +45,158199,,,,,,,,,,,,0.07088713347911835,,,,,, +45,158249,,,,,,,,,,,,0.0808994323015213,,,,,, +45,158299,,,,,,,,,,,,0.07925933599472046,,,,,, +45,158331,,,,,,,,,,,,,0.2342962920665741,0.07878127694129944,0.32749250531196594,0.05197185277938843,0.32280412316322327,0.07878127694129944 +45,158331,,,,,,,0.22815921902656555,0.07235775142908096,0.35386618971824646,0.12522977590560913,0.3337828516960144,,,,,,, +46,158349,,,,,,,,,,,,0.06344285607337952,,,,,, +46,158399,,,,,,,,,,,,0.07048699259757996,,,,,, +46,158449,,,,,,,,,,,,0.06694523245096207,,,,,, +46,158499,,,,,,,,,,,,0.07105528563261032,,,,,, +46,158549,,,,,,,,,,,,0.06601007282733917,,,,,, +46,158599,,,,,,,,,,,,0.07034432888031006,,,,,, +46,158649,,,,,,,,,,,,0.07524032145738602,,,,,, +46,158699,,,,,,,,,,,,0.06230763718485832,,,,,, +46,158749,,,,,,,,,,,,0.0617610365152359,,,,,, +46,158799,,,,,,,,,,,,0.06981354206800461,,,,,, +46,158849,,,,,,,,,,,,0.07943010330200195,,,,,, +46,158899,,,,,,,,,,,,0.06871863454580307,,,,,, +46,158949,,,,,,,,,,,,0.07711263000965118,,,,,, +46,158999,,,,,,,,,,,,0.07260540127754211,,,,,, +46,159049,,,,,,,,,,,,0.060007013380527496,,,,,, +46,159099,,,,,,,,,,,,0.08558820188045502,,,,,, +46,159149,,,,,,,,,,,,0.06989548355340958,,,,,, +46,159199,,,,,,,,,,,,0.0769953578710556,,,,,, +46,159249,,,,,,,,,,,,0.07264688611030579,,,,,, +46,159299,,,,,,,,,,,,0.07267889380455017,,,,,, +46,159349,,,,,,,,,,,,0.06615633517503738,,,,,, +46,159399,,,,,,,,,,,,0.05695147067308426,,,,,, +46,159449,,,,,,,,,,,,0.0793309211730957,,,,,, +46,159499,,,,,,,,,,,,0.07153385877609253,,,,,, +46,159549,,,,,,,,,,,,0.07986636459827423,,,,,, +46,159599,,,,,,,,,,,,0.07766614109277725,,,,,, +46,159649,,,,,,,,,,,,0.07363481819629669,,,,,, +46,159699,,,,,,,,,,,,0.0720597580075264,,,,,, +46,159749,,,,,,,,,,,,0.06987805664539337,,,,,, +46,159799,,,,,,,,,,,,0.0680292397737503,,,,,, +46,159849,,,,,,,,,,,,0.08442863076925278,,,,,, +46,159899,,,,,,,,,,,,0.07006332278251648,,,,,, +46,159949,,,,,,,,,,,,0.07760392129421234,,,,,, +46,159999,,,,,,,,,,,,0.07724727690219879,,,,,, +46,160049,,,,,,,,,,,,0.07087288796901703,,,,,, +46,160099,,,,,,,,,,,,0.07771666347980499,,,,,, +46,160149,,,,,,,,,,,,0.06292586028575897,,,,,, +46,160199,,,,,,,,,,,,0.06652779877185822,,,,,, +46,160249,,,,,,,,,,,,0.07412852346897125,,,,,, +46,160299,,,,,,,,,,,,0.08442118763923645,,,,,, +46,160349,,,,,,,,,,,,0.07421781122684479,,,,,, +46,160399,,,,,,,,,,,,0.07364209741353989,,,,,, +46,160449,,,,,,,,,,,,0.06467181444168091,,,,,, +46,160499,,,,,,,,,,,,0.0760444700717926,,,,,, +46,160549,,,,,,,,,,,,0.06862860918045044,,,,,, +46,160599,,,,,,,,,,,,0.07979019731283188,,,,,, +46,160649,,,,,,,,,,,,0.07595494389533997,,,,,, +46,160699,,,,,,,,,,,,0.07490043342113495,,,,,, +46,160749,,,,,,,,,,,,0.06598169356584549,,,,,, +46,160799,,,,,,,,,,,,0.0740286335349083,,,,,, +46,160849,,,,,,,,,,,,0.06340411305427551,,,,,, +46,160899,,,,,,,,,,,,0.06394803524017334,,,,,, +46,160949,,,,,,,,,,,,0.06746186316013336,,,,,, +46,160999,,,,,,,,,,,,0.05775809660553932,,,,,, +46,161049,,,,,,,,,,,,0.06901970505714417,,,,,, +46,161099,,,,,,,,,,,,0.0655069351196289,,,,,, +46,161149,,,,,,,,,,,,0.07787464559078217,,,,,, +46,161199,,,,,,,,,,,,0.0725107192993164,,,,,, +46,161249,,,,,,,,,,,,0.07043269276618958,,,,,, +46,161299,,,,,,,,,,,,0.06296660006046295,,,,,, +46,161349,,,,,,,,,,,,0.07083773612976074,,,,,, +46,161399,,,,,,,,,,,,0.0726771354675293,,,,,, +46,161449,,,,,,,,,,,,0.07461035251617432,,,,,, +46,161499,,,,,,,,,,,,0.08215557783842087,,,,,, +46,161549,,,,,,,,,,,,0.07246829569339752,,,,,, +46,161599,,,,,,,,,,,,0.0777323991060257,,,,,, +46,161649,,,,,,,,,,,,0.0819602906703949,,,,,, +46,161699,,,,,,,,,,,,0.06080595776438713,,,,,, +46,161749,,,,,,,,,,,,0.06708601117134094,,,,,, +46,161773,,,,,,,,,,,,,0.23399358987808228,0.07848718017339706,0.32502061128616333,0.05551093816757202,0.3204704821109772,0.07848718017339706 +46,161773,,,,,,,0.22818878293037415,0.07233258336782455,0.3542974889278412,0.12552887201309204,0.334346741437912,,,,,,, +47,161799,,,,,,,,,,,,0.07858934998512268,,,,,, +47,161849,,,,,,,,,,,,0.08199295401573181,,,,,, +47,161899,,,,,,,,,,,,0.07743664085865021,,,,,, +47,161949,,,,,,,,,,,,0.06357643008232117,,,,,, +47,161999,,,,,,,,,,,,0.07549405843019485,,,,,, +47,162049,,,,,,,,,,,,0.07270686328411102,,,,,, +47,162099,,,,,,,,,,,,0.07863274216651917,,,,,, +47,162149,,,,,,,,,,,,0.06578271090984344,,,,,, +47,162199,,,,,,,,,,,,0.07090680301189423,,,,,, +47,162249,,,,,,,,,,,,0.05648251622915268,,,,,, +47,162299,,,,,,,,,,,,0.06301725655794144,,,,,, +47,162349,,,,,,,,,,,,0.06782296299934387,,,,,, +47,162399,,,,,,,,,,,,0.07989287376403809,,,,,, +47,162449,,,,,,,,,,,,0.06485885381698608,,,,,, +47,162499,,,,,,,,,,,,0.07107749581336975,,,,,, +47,162549,,,,,,,,,,,,0.07802572101354599,,,,,, +47,162599,,,,,,,,,,,,0.06753335893154144,,,,,, +47,162649,,,,,,,,,,,,0.07148358225822449,,,,,, +47,162699,,,,,,,,,,,,0.06592775881290436,,,,,, +47,162749,,,,,,,,,,,,0.07476911693811417,,,,,, +47,162799,,,,,,,,,,,,0.06934712827205658,,,,,, +47,162849,,,,,,,,,,,,0.07384222745895386,,,,,, +47,162899,,,,,,,,,,,,0.07834531366825104,,,,,, +47,162949,,,,,,,,,,,,0.06657436490058899,,,,,, +47,162999,,,,,,,,,,,,0.07165991514921188,,,,,, +47,163049,,,,,,,,,,,,0.07465997338294983,,,,,, +47,163099,,,,,,,,,,,,0.08432929217815399,,,,,, +47,163149,,,,,,,,,,,,0.0770982950925827,,,,,, +47,163199,,,,,,,,,,,,0.0617021806538105,,,,,, +47,163249,,,,,,,,,,,,0.06768402457237244,,,,,, +47,163299,,,,,,,,,,,,0.07107847929000854,,,,,, +47,163349,,,,,,,,,,,,0.05992783606052399,,,,,, +47,163399,,,,,,,,,,,,0.08386866748332977,,,,,, +47,163449,,,,,,,,,,,,0.0779745951294899,,,,,, +47,163499,,,,,,,,,,,,0.07209471613168716,,,,,, +47,163549,,,,,,,,,,,,0.06776289641857147,,,,,, +47,163599,,,,,,,,,,,,0.08089755475521088,,,,,, +47,163649,,,,,,,,,,,,0.06620092689990997,,,,,, +47,163699,,,,,,,,,,,,0.07177669554948807,,,,,, +47,163749,,,,,,,,,,,,0.08471675217151642,,,,,, +47,163799,,,,,,,,,,,,0.06988268345594406,,,,,, +47,163849,,,,,,,,,,,,0.07108233869075775,,,,,, +47,163899,,,,,,,,,,,,0.07314319163560867,,,,,, +47,163949,,,,,,,,,,,,0.06200437992811203,,,,,, +47,163999,,,,,,,,,,,,0.0579470656812191,,,,,, +47,164049,,,,,,,,,,,,0.0691206231713295,,,,,, +47,164099,,,,,,,,,,,,0.07318337261676788,,,,,, +47,164149,,,,,,,,,,,,0.07035354524850845,,,,,, +47,164199,,,,,,,,,,,,0.06870033591985703,,,,,, +47,164249,,,,,,,,,,,,0.06724122166633606,,,,,, +47,164299,,,,,,,,,,,,0.08286361396312714,,,,,, +47,164349,,,,,,,,,,,,0.07076326757669449,,,,,, +47,164399,,,,,,,,,,,,0.07053741812705994,,,,,, +47,164449,,,,,,,,,,,,0.07456675171852112,,,,,, +47,164499,,,,,,,,,,,,0.0703529417514801,,,,,, +47,164549,,,,,,,,,,,,0.07699765264987946,,,,,, +47,164599,,,,,,,,,,,,0.0698111355304718,,,,,, +47,164649,,,,,,,,,,,,0.06562758982181549,,,,,, +47,164699,,,,,,,,,,,,0.07796232402324677,,,,,, +47,164749,,,,,,,,,,,,0.06709803640842438,,,,,, +47,164799,,,,,,,,,,,,0.06481405347585678,,,,,, +47,164849,,,,,,,,,,,,0.08242156356573105,,,,,, +47,164899,,,,,,,,,,,,0.07626126706600189,,,,,, +47,164949,,,,,,,,,,,,0.0747593492269516,,,,,, +47,164999,,,,,,,,,,,,0.07305509597063065,,,,,, +47,165049,,,,,,,,,,,,0.06686733663082123,,,,,, +47,165099,,,,,,,,,,,,0.0597362145781517,,,,,, +47,165149,,,,,,,,,,,,0.0695725530385971,,,,,, +47,165199,,,,,,,,,,,,0.06892232596874237,,,,,, +47,165215,,,,,,,,,,,,,0.23402506113052368,0.07826277613639832,0.3201453685760498,0.05821138620376587,0.3160545229911804,0.07826277613639832 +47,165215,,,,,,,0.22809568047523499,0.0722765177488327,0.35525453090667725,0.12620383501052856,0.3356914818286896,,,,,,, +48,165249,,,,,,,,,,,,0.07376588135957718,,,,,, +48,165299,,,,,,,,,,,,0.06553354859352112,,,,,, +48,165349,,,,,,,,,,,,0.07646331191062927,,,,,, +48,165399,,,,,,,,,,,,0.07283637672662735,,,,,, +48,165449,,,,,,,,,,,,0.07125920057296753,,,,,, +48,165499,,,,,,,,,,,,0.06469917297363281,,,,,, +48,165549,,,,,,,,,,,,0.07925287634134293,,,,,, +48,165599,,,,,,,,,,,,0.08276086300611496,,,,,, +48,165649,,,,,,,,,,,,0.07939530909061432,,,,,, +48,165699,,,,,,,,,,,,0.06477974355220795,,,,,, +48,165749,,,,,,,,,,,,0.07089899480342865,,,,,, +48,165799,,,,,,,,,,,,0.06834685802459717,,,,,, +48,165849,,,,,,,,,,,,0.0662156492471695,,,,,, +48,165899,,,,,,,,,,,,0.07141995429992676,,,,,, +48,165949,,,,,,,,,,,,0.07259008288383484,,,,,, +48,165999,,,,,,,,,,,,0.07162702828645706,,,,,, +48,166049,,,,,,,,,,,,0.07722680270671844,,,,,, +48,166099,,,,,,,,,,,,0.07100413739681244,,,,,, +48,166149,,,,,,,,,,,,0.06258178502321243,,,,,, +48,166199,,,,,,,,,,,,0.07459433376789093,,,,,, +48,166249,,,,,,,,,,,,0.08045731484889984,,,,,, +48,166299,,,,,,,,,,,,0.07442142069339752,,,,,, +48,166349,,,,,,,,,,,,0.07271726429462433,,,,,, +48,166399,,,,,,,,,,,,0.06699159741401672,,,,,, +48,166449,,,,,,,,,,,,0.06417004764080048,,,,,, +48,166499,,,,,,,,,,,,0.07202471047639847,,,,,, +48,166549,,,,,,,,,,,,0.07440102845430374,,,,,, +48,166599,,,,,,,,,,,,0.07056329399347305,,,,,, +48,166649,,,,,,,,,,,,0.07469146698713303,,,,,, +48,166699,,,,,,,,,,,,0.07951584458351135,,,,,, +48,166749,,,,,,,,,,,,0.08855529129505157,,,,,, +48,166799,,,,,,,,,,,,0.05925358831882477,,,,,, +48,166849,,,,,,,,,,,,0.07856398820877075,,,,,, +48,166899,,,,,,,,,,,,0.07685063034296036,,,,,, +48,166949,,,,,,,,,,,,0.07308745384216309,,,,,, +48,166999,,,,,,,,,,,,0.06989675760269165,,,,,, +48,167049,,,,,,,,,,,,0.0668119564652443,,,,,, +48,167099,,,,,,,,,,,,0.07452091574668884,,,,,, +48,167149,,,,,,,,,,,,0.07419821619987488,,,,,, +48,167199,,,,,,,,,,,,0.07198072969913483,,,,,, +48,167249,,,,,,,,,,,,0.06199980899691582,,,,,, +48,167299,,,,,,,,,,,,0.0789179727435112,,,,,, +48,167349,,,,,,,,,,,,0.07093015313148499,,,,,, +48,167399,,,,,,,,,,,,0.07975848019123077,,,,,, +48,167449,,,,,,,,,,,,0.06530718505382538,,,,,, +48,167499,,,,,,,,,,,,0.07624796777963638,,,,,, +48,167549,,,,,,,,,,,,0.07242413610219955,,,,,, +48,167599,,,,,,,,,,,,0.06314417719841003,,,,,, +48,167649,,,,,,,,,,,,0.07018701732158661,,,,,, +48,167699,,,,,,,,,,,,0.07042527198791504,,,,,, +48,167749,,,,,,,,,,,,0.06902863085269928,,,,,, +48,167799,,,,,,,,,,,,0.06901855021715164,,,,,, +48,167849,,,,,,,,,,,,0.07536689192056656,,,,,, +48,167899,,,,,,,,,,,,0.0678408294916153,,,,,, +48,167949,,,,,,,,,,,,0.07201097905635834,,,,,, +48,167999,,,,,,,,,,,,0.07110561430454254,,,,,, +48,168049,,,,,,,,,,,,0.07675231993198395,,,,,, +48,168099,,,,,,,,,,,,0.06940115988254547,,,,,, +48,168149,,,,,,,,,,,,0.06962445378303528,,,,,, +48,168199,,,,,,,,,,,,0.0824718326330185,,,,,, +48,168249,,,,,,,,,,,,0.07133612781763077,,,,,, +48,168299,,,,,,,,,,,,0.08227741718292236,,,,,, +48,168349,,,,,,,,,,,,0.07014474272727966,,,,,, +48,168399,,,,,,,,,,,,0.0722307488322258,,,,,, +48,168449,,,,,,,,,,,,0.07416751980781555,,,,,, +48,168499,,,,,,,,,,,,0.06462816894054413,,,,,, +48,168549,,,,,,,,,,,,0.06014470383524895,,,,,, +48,168599,,,,,,,,,,,,0.061555951833724976,,,,,, +48,168649,,,,,,,,,,,,0.07518546283245087,,,,,, +48,168657,,,,,,,,,,,,,0.23417513072490692,0.0786975622177124,0.32539665699005127,0.05297929048538208,0.32085084915161133,0.0786975622177124 +48,168657,,,,,,,0.2281058430671692,0.07291017472743988,0.34501710534095764,0.11854410171508789,0.3353082835674286,,,,,,, +49,168699,,,,,,,,,,,,0.07237110286951065,,,,,, +49,168749,,,,,,,,,,,,0.07731004804372787,,,,,, +49,168799,,,,,,,,,,,,0.0646536573767662,,,,,, +49,168849,,,,,,,,,,,,0.06736262142658234,,,,,, +49,168899,,,,,,,,,,,,0.06620098650455475,,,,,, +49,168949,,,,,,,,,,,,0.07285799086093903,,,,,, +49,168999,,,,,,,,,,,,0.06729701161384583,,,,,, +49,169049,,,,,,,,,,,,0.06924504041671753,,,,,, +49,169099,,,,,,,,,,,,0.07076893001794815,,,,,, +49,169149,,,,,,,,,,,,0.07963411509990692,,,,,, +49,169199,,,,,,,,,,,,0.07938776165246964,,,,,, +49,169249,,,,,,,,,,,,0.07971455156803131,,,,,, +49,169299,,,,,,,,,,,,0.07783468812704086,,,,,, +49,169349,,,,,,,,,,,,0.07032506912946701,,,,,, +49,169399,,,,,,,,,,,,0.077702596783638,,,,,, +49,169449,,,,,,,,,,,,0.06040442734956741,,,,,, +49,169499,,,,,,,,,,,,0.06957397609949112,,,,,, +49,169549,,,,,,,,,,,,0.0642561987042427,,,,,, +49,169599,,,,,,,,,,,,0.07426050305366516,,,,,, +49,169649,,,,,,,,,,,,0.07377804070711136,,,,,, +49,169699,,,,,,,,,,,,0.06922401487827301,,,,,, +49,169749,,,,,,,,,,,,0.07040891796350479,,,,,, +49,169799,,,,,,,,,,,,0.06989583373069763,,,,,, +49,169849,,,,,,,,,,,,0.08160340785980225,,,,,, +49,169899,,,,,,,,,,,,0.06898205727338791,,,,,, +49,169949,,,,,,,,,,,,0.07381608337163925,,,,,, +49,169999,,,,,,,,,,,,0.07143606245517731,,,,,, +49,170049,,,,,,,,,,,,0.07404625415802002,,,,,, +49,170099,,,,,,,,,,,,0.07235629856586456,,,,,, +49,170149,,,,,,,,,,,,0.07412108778953552,,,,,, +49,170199,,,,,,,,,,,,0.07510669529438019,,,,,, +49,170249,,,,,,,,,,,,0.06829889863729477,,,,,, +49,170299,,,,,,,,,,,,0.07169406116008759,,,,,, +49,170349,,,,,,,,,,,,0.07846298068761826,,,,,, +49,170399,,,,,,,,,,,,0.055696114897727966,,,,,, +49,170449,,,,,,,,,,,,0.07084012031555176,,,,,, +49,170499,,,,,,,,,,,,0.0799822062253952,,,,,, +49,170549,,,,,,,,,,,,0.06350570917129517,,,,,, +49,170599,,,,,,,,,,,,0.06868627667427063,,,,,, +49,170649,,,,,,,,,,,,0.07639379799365997,,,,,, +49,170699,,,,,,,,,,,,0.06603240966796875,,,,,, +49,170749,,,,,,,,,,,,0.06665624678134918,,,,,, +49,170799,,,,,,,,,,,,0.06703543663024902,,,,,, +49,170849,,,,,,,,,,,,0.07258129864931107,,,,,, +49,170899,,,,,,,,,,,,0.06562405824661255,,,,,, +49,170949,,,,,,,,,,,,0.06536153703927994,,,,,, +49,170999,,,,,,,,,,,,0.07546210289001465,,,,,, +49,171049,,,,,,,,,,,,0.07717876881361008,,,,,, +49,171099,,,,,,,,,,,,0.0668082982301712,,,,,, +49,171149,,,,,,,,,,,,0.08198806643486023,,,,,, +49,171199,,,,,,,,,,,,0.06769196689128876,,,,,, +49,171249,,,,,,,,,,,,0.06882935762405396,,,,,, +49,171299,,,,,,,,,,,,0.06564737856388092,,,,,, +49,171349,,,,,,,,,,,,0.07093283534049988,,,,,, +49,171399,,,,,,,,,,,,0.06292856484651566,,,,,, +49,171449,,,,,,,,,,,,0.07022062689065933,,,,,, +49,171499,,,,,,,,,,,,0.07272070646286011,,,,,, +49,171549,,,,,,,,,,,,0.07110489904880524,,,,,, +49,171599,,,,,,,,,,,,0.08407534658908844,,,,,, +49,171649,,,,,,,,,,,,0.07813642919063568,,,,,, +49,171699,,,,,,,,,,,,0.07636438310146332,,,,,, +49,171749,,,,,,,,,,,,0.07656539231538773,,,,,, +49,171799,,,,,,,,,,,,0.06153220683336258,,,,,, +49,171849,,,,,,,,,,,,0.05652691423892975,,,,,, +49,171899,,,,,,,,,,,,0.08024748414754868,,,,,, +49,171949,,,,,,,,,,,,0.06507791578769684,,,,,, +49,171999,,,,,,,,,,,,0.0704994648694992,,,,,, +49,172049,,,,,,,,,,,,0.07392673194408417,,,,,, +49,172099,,,,,,,,,,,,0.06477475166320801,,,,,, +49,172099,,,,,,,,,,,,,0.23429352045059204,0.07876280695199966,0.32501479983329773,0.052194178104400635,0.3207657039165497,0.07876280695199966 +49,172099,,,,,,,0.22794193029403687,0.07221081852912903,0.3563704788684845,0.12701141834259033,0.3358582556247711,,,,,,, +50,172100,0.23191417753696442,0.07438244670629501,0.3267481327056885,0.1055254340171814,0.3208155333995819,0.07438244670629501,,,,,,,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0ff56647da09fe9286b871208fb0f85a4a86ff90 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml @@ -0,0 +1,22 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: sweetnet + num_layers: 16 + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan +seed: 43 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..756323d303816bbda0bf69b1b7ef3ed5ec2a0cf1 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv @@ -0,0 +1,3544 @@ +epoch,step,test/MeanAbsoluteError,test/MeanSquaredError,test/PearsonCorrCoef,test/R2Score,test/SpearmanCorrCoef,test/loss,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +0,49,,,,,,,,,,,,0.09830054640769958,,,,,, +0,99,,,,,,,,,,,,0.09166660159826279,,,,,, +0,149,,,,,,,,,,,,0.07774095982313156,,,,,, +0,199,,,,,,,,,,,,0.08108402043581009,,,,,, +0,249,,,,,,,,,,,,0.0708654522895813,,,,,, +0,299,,,,,,,,,,,,0.09357866644859314,,,,,, +0,349,,,,,,,,,,,,0.09080024063587189,,,,,, +0,399,,,,,,,,,,,,0.08300533145666122,,,,,, +0,449,,,,,,,,,,,,0.09477215260267258,,,,,, +0,499,,,,,,,,,,,,0.07716301083564758,,,,,, +0,549,,,,,,,,,,,,0.09758365154266357,,,,,, +0,599,,,,,,,,,,,,0.09591001272201538,,,,,, +0,649,,,,,,,,,,,,0.0868111401796341,,,,,, +0,699,,,,,,,,,,,,0.08381149172782898,,,,,, +0,749,,,,,,,,,,,,0.07183761149644852,,,,,, +0,799,,,,,,,,,,,,0.08485965430736542,,,,,, +0,849,,,,,,,,,,,,0.08389867842197418,,,,,, +0,899,,,,,,,,,,,,0.06967292726039886,,,,,, +0,949,,,,,,,,,,,,0.07932772487401962,,,,,, +0,999,,,,,,,,,,,,0.07289881259202957,,,,,, +0,1049,,,,,,,,,,,,0.08894050121307373,,,,,, +0,1099,,,,,,,,,,,,0.09076061844825745,,,,,, +0,1149,,,,,,,,,,,,0.09085971117019653,,,,,, +0,1199,,,,,,,,,,,,0.09511557221412659,,,,,, +0,1249,,,,,,,,,,,,0.09997278451919556,,,,,, +0,1299,,,,,,,,,,,,0.08234672993421555,,,,,, +0,1349,,,,,,,,,,,,0.07916191965341568,,,,,, +0,1399,,,,,,,,,,,,0.08844462782144547,,,,,, +0,1449,,,,,,,,,,,,0.08679032325744629,,,,,, +0,1499,,,,,,,,,,,,0.08204943686723709,,,,,, +0,1549,,,,,,,,,,,,0.07762927561998367,,,,,, +0,1599,,,,,,,,,,,,0.08976928889751434,,,,,, +0,1649,,,,,,,,,,,,0.0815509557723999,,,,,, +0,1699,,,,,,,,,,,,0.08005791902542114,,,,,, +0,1749,,,,,,,,,,,,0.07806472480297089,,,,,, +0,1799,,,,,,,,,,,,0.08479300886392593,,,,,, +0,1849,,,,,,,,,,,,0.0725914016366005,,,,,, +0,1899,,,,,,,,,,,,0.08278299868106842,,,,,, +0,1949,,,,,,,,,,,,0.07867718487977982,,,,,, +0,1999,,,,,,,,,,,,0.09137111902236938,,,,,, +0,2049,,,,,,,,,,,,0.0818159356713295,,,,,, +0,2099,,,,,,,,,,,,0.08524027466773987,,,,,, +0,2149,,,,,,,,,,,,0.0872391015291214,,,,,, +0,2199,,,,,,,,,,,,0.08098933100700378,,,,,, +0,2249,,,,,,,,,,,,0.08204309642314911,,,,,, +0,2299,,,,,,,,,,,,0.07773085683584213,,,,,, +0,2349,,,,,,,,,,,,0.08952157944440842,,,,,, +0,2399,,,,,,,,,,,,0.0797140821814537,,,,,, +0,2449,,,,,,,,,,,,0.08324292302131653,,,,,, +0,2499,,,,,,,,,,,,0.0893092006444931,,,,,, +0,2549,,,,,,,,,,,,0.08713393658399582,,,,,, +0,2599,,,,,,,,,,,,0.08218245208263397,,,,,, +0,2649,,,,,,,,,,,,0.08583313226699829,,,,,, +0,2699,,,,,,,,,,,,0.0890861228108406,,,,,, +0,2749,,,,,,,,,,,,0.08880671113729477,,,,,, +0,2799,,,,,,,,,,,,0.0851946771144867,,,,,, +0,2849,,,,,,,,,,,,0.08125770092010498,,,,,, +0,2899,,,,,,,,,,,,0.08266954123973846,,,,,, +0,2949,,,,,,,,,,,,0.08728711307048798,,,,,, +0,2999,,,,,,,,,,,,0.0853768140077591,,,,,, +0,3049,,,,,,,,,,,,0.08998401463031769,,,,,, +0,3099,,,,,,,,,,,,0.08217811584472656,,,,,, +0,3149,,,,,,,,,,,,0.08156245201826096,,,,,, +0,3199,,,,,,,,,,,,0.07552476227283478,,,,,, +0,3249,,,,,,,,,,,,0.07606157660484314,,,,,, +0,3299,,,,,,,,,,,,0.08582650870084763,,,,,, +0,3349,,,,,,,,,,,,0.08469806611537933,,,,,, +0,3399,,,,,,,,,,,,0.0897684246301651,,,,,, +0,3441,,,,,,,,,,,,,0.24749623239040375,0.08240196853876114,0.12165476381778717,0.008401632308959961,0.14417725801467896,0.08240196853876114 +0,3441,,,,,,,0.24971944093704224,0.08471664786338806,0.05265888199210167,-0.0241929292678833,0.052693091332912445,,,,,,, +1,3449,,,,,,,,,,,,0.08269613981246948,,,,,, +1,3499,,,,,,,,,,,,0.08474969863891602,,,,,, +1,3549,,,,,,,,,,,,0.07219313085079193,,,,,, +1,3599,,,,,,,,,,,,0.09153290838003159,,,,,, +1,3649,,,,,,,,,,,,0.08296965062618256,,,,,, +1,3699,,,,,,,,,,,,0.08139549940824509,,,,,, +1,3749,,,,,,,,,,,,0.08393757045269012,,,,,, +1,3799,,,,,,,,,,,,0.07613781094551086,,,,,, +1,3849,,,,,,,,,,,,0.0811682939529419,,,,,, +1,3899,,,,,,,,,,,,0.07884728163480759,,,,,, +1,3949,,,,,,,,,,,,0.07820290327072144,,,,,, +1,3999,,,,,,,,,,,,0.07552296668291092,,,,,, +1,4049,,,,,,,,,,,,0.07847714424133301,,,,,, +1,4099,,,,,,,,,,,,0.08488217741250992,,,,,, +1,4149,,,,,,,,,,,,0.0767979696393013,,,,,, +1,4199,,,,,,,,,,,,0.09447912871837616,,,,,, +1,4249,,,,,,,,,,,,0.08584404736757278,,,,,, +1,4299,,,,,,,,,,,,0.08251991122961044,,,,,, +1,4349,,,,,,,,,,,,0.09336411952972412,,,,,, +1,4399,,,,,,,,,,,,0.07996633648872375,,,,,, +1,4449,,,,,,,,,,,,0.07327160239219666,,,,,, +1,4499,,,,,,,,,,,,0.07208313047885895,,,,,, +1,4549,,,,,,,,,,,,0.08661895245313644,,,,,, +1,4599,,,,,,,,,,,,0.07202474772930145,,,,,, +1,4649,,,,,,,,,,,,0.08992068469524384,,,,,, +1,4699,,,,,,,,,,,,0.08170262724161148,,,,,, +1,4749,,,,,,,,,,,,0.08658745884895325,,,,,, +1,4799,,,,,,,,,,,,0.07281386852264404,,,,,, +1,4849,,,,,,,,,,,,0.08478465676307678,,,,,, +1,4899,,,,,,,,,,,,0.07599698752164841,,,,,, +1,4949,,,,,,,,,,,,0.08504627645015717,,,,,, +1,4999,,,,,,,,,,,,0.07604013383388519,,,,,, +1,5049,,,,,,,,,,,,0.08153809607028961,,,,,, +1,5099,,,,,,,,,,,,0.084121935069561,,,,,, +1,5149,,,,,,,,,,,,0.07630643993616104,,,,,, +1,5199,,,,,,,,,,,,0.07661353051662445,,,,,, +1,5249,,,,,,,,,,,,0.07781471312046051,,,,,, +1,5299,,,,,,,,,,,,0.07759441435337067,,,,,, +1,5349,,,,,,,,,,,,0.08437280356884003,,,,,, +1,5399,,,,,,,,,,,,0.0825052484869957,,,,,, +1,5449,,,,,,,,,,,,0.08420154452323914,,,,,, +1,5499,,,,,,,,,,,,0.0715775191783905,,,,,, +1,5549,,,,,,,,,,,,0.06932099163532257,,,,,, +1,5599,,,,,,,,,,,,0.0862855613231659,,,,,, +1,5649,,,,,,,,,,,,0.09270282089710236,,,,,, +1,5699,,,,,,,,,,,,0.07582177221775055,,,,,, +1,5749,,,,,,,,,,,,0.08876818418502808,,,,,, +1,5799,,,,,,,,,,,,0.08213828504085541,,,,,, +1,5849,,,,,,,,,,,,0.08399714529514313,,,,,, +1,5899,,,,,,,,,,,,0.07342115789651871,,,,,, +1,5949,,,,,,,,,,,,0.0822795182466507,,,,,, +1,5999,,,,,,,,,,,,0.07330803573131561,,,,,, +1,6049,,,,,,,,,,,,0.08416718244552612,,,,,, +1,6099,,,,,,,,,,,,0.0712326392531395,,,,,, +1,6149,,,,,,,,,,,,0.07241866737604141,,,,,, +1,6199,,,,,,,,,,,,0.07337170839309692,,,,,, +1,6249,,,,,,,,,,,,0.07721153646707535,,,,,, +1,6299,,,,,,,,,,,,0.085447296500206,,,,,, +1,6349,,,,,,,,,,,,0.07943594455718994,,,,,, +1,6399,,,,,,,,,,,,0.07309494912624359,,,,,, +1,6449,,,,,,,,,,,,0.07262725383043289,,,,,, +1,6499,,,,,,,,,,,,0.0830184668302536,,,,,, +1,6549,,,,,,,,,,,,0.0899459719657898,,,,,, +1,6599,,,,,,,,,,,,0.08693017065525055,,,,,, +1,6649,,,,,,,,,,,,0.0836329236626625,,,,,, +1,6699,,,,,,,,,,,,0.07995906472206116,,,,,, +1,6749,,,,,,,,,,,,0.08172401785850525,,,,,, +1,6799,,,,,,,,,,,,0.08172856271266937,,,,,, +1,6849,,,,,,,,,,,,0.07102750241756439,,,,,, +1,6883,,,,,,,,,,,,,0.24353839457035065,0.08076173067092896,0.19167564809322357,0.028139710426330566,0.18057185411453247,0.08076173067092896 +1,6883,,,,,,,0.24542242288589478,0.08122443407773972,0.13739120960235596,0.01802140474319458,0.12450449168682098,,,,,,, +2,6899,,,,,,,,,,,,0.08506134152412415,,,,,, +2,6949,,,,,,,,,,,,0.08091344684362411,,,,,, +2,6999,,,,,,,,,,,,0.09283801168203354,,,,,, +2,7049,,,,,,,,,,,,0.08069111406803131,,,,,, +2,7099,,,,,,,,,,,,0.08127935230731964,,,,,, +2,7149,,,,,,,,,,,,0.08254837989807129,,,,,, +2,7199,,,,,,,,,,,,0.08131670951843262,,,,,, +2,7249,,,,,,,,,,,,0.07462543994188309,,,,,, +2,7299,,,,,,,,,,,,0.07323385030031204,,,,,, +2,7349,,,,,,,,,,,,0.09233996272087097,,,,,, +2,7399,,,,,,,,,,,,0.07715433090925217,,,,,, +2,7449,,,,,,,,,,,,0.07914863526821136,,,,,, +2,7499,,,,,,,,,,,,0.07700254023075104,,,,,, +2,7549,,,,,,,,,,,,0.08606190979480743,,,,,, +2,7599,,,,,,,,,,,,0.07646863907575607,,,,,, +2,7649,,,,,,,,,,,,0.07467110455036163,,,,,, +2,7699,,,,,,,,,,,,0.07704019546508789,,,,,, +2,7749,,,,,,,,,,,,0.07423816621303558,,,,,, +2,7799,,,,,,,,,,,,0.0917060524225235,,,,,, +2,7849,,,,,,,,,,,,0.07596683502197266,,,,,, +2,7899,,,,,,,,,,,,0.08087635785341263,,,,,, +2,7949,,,,,,,,,,,,0.07589546591043472,,,,,, +2,7999,,,,,,,,,,,,0.09534277021884918,,,,,, +2,8049,,,,,,,,,,,,0.07777643948793411,,,,,, +2,8099,,,,,,,,,,,,0.07641454041004181,,,,,, +2,8149,,,,,,,,,,,,0.08408062160015106,,,,,, +2,8199,,,,,,,,,,,,0.08747054636478424,,,,,, +2,8249,,,,,,,,,,,,0.08004213869571686,,,,,, +2,8299,,,,,,,,,,,,0.07571552693843842,,,,,, +2,8349,,,,,,,,,,,,0.07531185448169708,,,,,, +2,8399,,,,,,,,,,,,0.07884328067302704,,,,,, +2,8449,,,,,,,,,,,,0.07383126765489578,,,,,, +2,8499,,,,,,,,,,,,0.09496308863162994,,,,,, +2,8549,,,,,,,,,,,,0.06897428631782532,,,,,, +2,8599,,,,,,,,,,,,0.08492133021354675,,,,,, +2,8649,,,,,,,,,,,,0.08484631776809692,,,,,, +2,8699,,,,,,,,,,,,0.08336478471755981,,,,,, +2,8749,,,,,,,,,,,,0.0796733945608139,,,,,, +2,8799,,,,,,,,,,,,0.0821203887462616,,,,,, +2,8849,,,,,,,,,,,,0.08447805047035217,,,,,, +2,8899,,,,,,,,,,,,0.08825330436229706,,,,,, +2,8949,,,,,,,,,,,,0.07728351652622223,,,,,, +2,8999,,,,,,,,,,,,0.07248562574386597,,,,,, +2,9049,,,,,,,,,,,,0.08829888701438904,,,,,, +2,9099,,,,,,,,,,,,0.07991351932287216,,,,,, +2,9149,,,,,,,,,,,,0.07764692604541779,,,,,, +2,9199,,,,,,,,,,,,0.09983447194099426,,,,,, +2,9249,,,,,,,,,,,,0.07336914539337158,,,,,, +2,9299,,,,,,,,,,,,0.0864136815071106,,,,,, +2,9349,,,,,,,,,,,,0.07339790463447571,,,,,, +2,9399,,,,,,,,,,,,0.08154191821813583,,,,,, +2,9449,,,,,,,,,,,,0.07492323219776154,,,,,, +2,9499,,,,,,,,,,,,0.07213450968265533,,,,,, +2,9549,,,,,,,,,,,,0.08302003145217896,,,,,, +2,9599,,,,,,,,,,,,0.07060900330543518,,,,,, +2,9649,,,,,,,,,,,,0.07512618601322174,,,,,, +2,9699,,,,,,,,,,,,0.08476357907056808,,,,,, +2,9749,,,,,,,,,,,,0.08298685401678085,,,,,, +2,9799,,,,,,,,,,,,0.07876908779144287,,,,,, +2,9849,,,,,,,,,,,,0.08682611584663391,,,,,, +2,9899,,,,,,,,,,,,0.08239294588565826,,,,,, +2,9949,,,,,,,,,,,,0.06521959602832794,,,,,, +2,9999,,,,,,,,,,,,0.08952850103378296,,,,,, +2,10049,,,,,,,,,,,,0.07610077410936356,,,,,, +2,10099,,,,,,,,,,,,0.07432664930820465,,,,,, +2,10149,,,,,,,,,,,,0.076944500207901,,,,,, +2,10199,,,,,,,,,,,,0.07809770852327347,,,,,, +2,10249,,,,,,,,,,,,0.08404870331287384,,,,,, +2,10299,,,,,,,,,,,,0.09174919873476028,,,,,, +2,10325,,,,,,,,,,,,,0.24546748399734497,0.08082625269889832,0.2343294769525528,0.027363300323486328,0.2515369653701782,0.08082625269889832 +2,10325,,,,,,,0.24413171410560608,0.08047442883253098,0.16526325047016144,0.027091801166534424,0.14720314741134644,,,,,,, +3,10349,,,,,,,,,,,,0.08958480507135391,,,,,, +3,10399,,,,,,,,,,,,0.07992001622915268,,,,,, +3,10449,,,,,,,,,,,,0.07388865947723389,,,,,, +3,10499,,,,,,,,,,,,0.07444867491722107,,,,,, +3,10549,,,,,,,,,,,,0.08577652275562286,,,,,, +3,10599,,,,,,,,,,,,0.08170640468597412,,,,,, +3,10649,,,,,,,,,,,,0.09580975770950317,,,,,, +3,10699,,,,,,,,,,,,0.08319427073001862,,,,,, +3,10749,,,,,,,,,,,,0.08064953982830048,,,,,, +3,10799,,,,,,,,,,,,0.07405833899974823,,,,,, +3,10849,,,,,,,,,,,,0.08955118060112,,,,,, +3,10899,,,,,,,,,,,,0.06794558465480804,,,,,, +3,10949,,,,,,,,,,,,0.07460975646972656,,,,,, +3,10999,,,,,,,,,,,,0.08697154372930527,,,,,, +3,11049,,,,,,,,,,,,0.07701079547405243,,,,,, +3,11099,,,,,,,,,,,,0.07089542597532272,,,,,, +3,11149,,,,,,,,,,,,0.07822970300912857,,,,,, +3,11199,,,,,,,,,,,,0.07773766666650772,,,,,, +3,11249,,,,,,,,,,,,0.08249235153198242,,,,,, +3,11299,,,,,,,,,,,,0.08184032142162323,,,,,, +3,11349,,,,,,,,,,,,0.08104237914085388,,,,,, +3,11399,,,,,,,,,,,,0.07029710710048676,,,,,, +3,11449,,,,,,,,,,,,0.08168715238571167,,,,,, +3,11499,,,,,,,,,,,,0.07913710922002792,,,,,, +3,11549,,,,,,,,,,,,0.061953701078891754,,,,,, +3,11599,,,,,,,,,,,,0.09058032929897308,,,,,, +3,11649,,,,,,,,,,,,0.08107000589370728,,,,,, +3,11699,,,,,,,,,,,,0.08350227773189545,,,,,, +3,11749,,,,,,,,,,,,0.07171289622783661,,,,,, +3,11799,,,,,,,,,,,,0.0727737694978714,,,,,, +3,11849,,,,,,,,,,,,0.07145152986049652,,,,,, +3,11899,,,,,,,,,,,,0.09566047042608261,,,,,, +3,11949,,,,,,,,,,,,0.0719950795173645,,,,,, +3,11999,,,,,,,,,,,,0.08894503116607666,,,,,, +3,12049,,,,,,,,,,,,0.08178382366895676,,,,,, +3,12099,,,,,,,,,,,,0.08896444737911224,,,,,, +3,12149,,,,,,,,,,,,0.07910989969968796,,,,,, +3,12199,,,,,,,,,,,,0.07902048528194427,,,,,, +3,12249,,,,,,,,,,,,0.07247593253850937,,,,,, +3,12299,,,,,,,,,,,,0.07249502092599869,,,,,, +3,12349,,,,,,,,,,,,0.0753495842218399,,,,,, +3,12399,,,,,,,,,,,,0.08317037671804428,,,,,, +3,12449,,,,,,,,,,,,0.07977811247110367,,,,,, +3,12499,,,,,,,,,,,,0.08049234002828598,,,,,, +3,12549,,,,,,,,,,,,0.07508496940135956,,,,,, +3,12599,,,,,,,,,,,,0.08841293305158615,,,,,, +3,12649,,,,,,,,,,,,0.08300477266311646,,,,,, +3,12699,,,,,,,,,,,,0.0760924443602562,,,,,, +3,12749,,,,,,,,,,,,0.07674121856689453,,,,,, +3,12799,,,,,,,,,,,,0.07891884446144104,,,,,, +3,12849,,,,,,,,,,,,0.08551172912120819,,,,,, +3,12899,,,,,,,,,,,,0.07988747209310532,,,,,, +3,12949,,,,,,,,,,,,0.0813138484954834,,,,,, +3,12999,,,,,,,,,,,,0.07611358165740967,,,,,, +3,13049,,,,,,,,,,,,0.07095520198345184,,,,,, +3,13099,,,,,,,,,,,,0.08057434111833572,,,,,, +3,13149,,,,,,,,,,,,0.07438358664512634,,,,,, +3,13199,,,,,,,,,,,,0.08440433442592621,,,,,, +3,13249,,,,,,,,,,,,0.0931892916560173,,,,,, +3,13299,,,,,,,,,,,,0.13821762800216675,,,,,, +3,13349,,,,,,,,,,,,0.0849311500787735,,,,,, +3,13399,,,,,,,,,,,,0.07835749536752701,,,,,, +3,13449,,,,,,,,,,,,0.08635172992944717,,,,,, +3,13499,,,,,,,,,,,,0.0900416448712349,,,,,, +3,13549,,,,,,,,,,,,0.08905148506164551,,,,,, +3,13599,,,,,,,,,,,,0.0689702183008194,,,,,, +3,13649,,,,,,,,,,,,0.08355159312486649,,,,,, +3,13699,,,,,,,,,,,,0.08038806915283203,,,,,, +3,13749,,,,,,,,,,,,0.08116522431373596,,,,,, +3,13767,,,,,,,,,,,,,2.815725803375244,5479.6416015625,0.0029145879670977592,-65939.2109375,-0.0460536889731884,5479.6416015625 +3,13767,,,,,,,0.25193434953689575,2.628967523574829,0.006517287343740463,-30.783443450927734,0.1371845006942749,,,,,,, +4,13799,,,,,,,,,,,,0.09362787753343582,,,,,, +4,13849,,,,,,,,,,,,0.0759190022945404,,,,,, +4,13899,,,,,,,,,,,,0.07904917001724243,,,,,, +4,13949,,,,,,,,,,,,0.09185999631881714,,,,,, +4,13999,,,,,,,,,,,,0.0834818035364151,,,,,, +4,14049,,,,,,,,,,,,0.07885578274726868,,,,,, +4,14099,,,,,,,,,,,,0.06837883591651917,,,,,, +4,14149,,,,,,,,,,,,0.09211117774248123,,,,,, +4,14199,,,,,,,,,,,,0.08030571043491364,,,,,, +4,14249,,,,,,,,,,,,0.08854314684867859,,,,,, +4,14299,,,,,,,,,,,,0.08197639882564545,,,,,, +4,14349,,,,,,,,,,,,0.08169214427471161,,,,,, +4,14399,,,,,,,,,,,,0.07505185157060623,,,,,, +4,14449,,,,,,,,,,,,0.08395593613386154,,,,,, +4,14499,,,,,,,,,,,,0.08375300467014313,,,,,, +4,14549,,,,,,,,,,,,0.07853835821151733,,,,,, +4,14599,,,,,,,,,,,,0.08199566602706909,,,,,, +4,14649,,,,,,,,,,,,0.0736352950334549,,,,,, +4,14699,,,,,,,,,,,,0.08408840000629425,,,,,, +4,14749,,,,,,,,,,,,0.22563457489013672,,,,,, +4,14799,,,,,,,,,,,,0.09418624639511108,,,,,, +4,14849,,,,,,,,,,,,0.08870254456996918,,,,,, +4,14899,,,,,,,,,,,,0.0751040056347847,,,,,, +4,14949,,,,,,,,,,,,0.0847608894109726,,,,,, +4,14999,,,,,,,,,,,,0.07809068262577057,,,,,, +4,15049,,,,,,,,,,,,0.07915465533733368,,,,,, +4,15099,,,,,,,,,,,,0.06937652826309204,,,,,, +4,15149,,,,,,,,,,,,0.08001729100942612,,,,,, +4,15199,,,,,,,,,,,,0.0903577134013176,,,,,, +4,15249,,,,,,,,,,,,0.06886252760887146,,,,,, +4,15299,,,,,,,,,,,,0.0773714929819107,,,,,, +4,15349,,,,,,,,,,,,0.0825619176030159,,,,,, +4,15399,,,,,,,,,,,,0.08276429772377014,,,,,, +4,15449,,,,,,,,,,,,0.07736563682556152,,,,,, +4,15499,,,,,,,,,,,,0.08398522436618805,,,,,, +4,15549,,,,,,,,,,,,0.084567591547966,,,,,, +4,15599,,,,,,,,,,,,0.08660632371902466,,,,,, +4,15649,,,,,,,,,,,,0.07012893259525299,,,,,, +4,15699,,,,,,,,,,,,0.0848349928855896,,,,,, +4,15749,,,,,,,,,,,,0.08627718687057495,,,,,, +4,15799,,,,,,,,,,,,0.08654015511274338,,,,,, +4,15849,,,,,,,,,,,,0.08153655380010605,,,,,, +4,15899,,,,,,,,,,,,0.09005145728588104,,,,,, +4,15949,,,,,,,,,,,,0.07894210517406464,,,,,, +4,15999,,,,,,,,,,,,0.0767114907503128,,,,,, +4,16049,,,,,,,,,,,,0.09426340460777283,,,,,, +4,16099,,,,,,,,,,,,0.08951611816883087,,,,,, +4,16149,,,,,,,,,,,,0.07934224605560303,,,,,, +4,16199,,,,,,,,,,,,0.08337105810642242,,,,,, +4,16249,,,,,,,,,,,,0.09381411224603653,,,,,, +4,16299,,,,,,,,,,,,0.08164440095424652,,,,,, +4,16349,,,,,,,,,,,,0.08823168277740479,,,,,, +4,16399,,,,,,,,,,,,0.08413627743721008,,,,,, +4,16449,,,,,,,,,,,,0.07030173391103745,,,,,, +4,16499,,,,,,,,,,,,0.08194059133529663,,,,,, +4,16549,,,,,,,,,,,,0.07033967971801758,,,,,, +4,16599,,,,,,,,,,,,0.09334424138069153,,,,,, +4,16649,,,,,,,,,,,,0.09112857282161713,,,,,, +4,16699,,,,,,,,,,,,0.07792853564023972,,,,,, +4,16749,,,,,,,,,,,,0.0793963074684143,,,,,, +4,16799,,,,,,,,,,,,0.07717372477054596,,,,,, +4,16849,,,,,,,,,,,,0.07207749038934708,,,,,, +4,16899,,,,,,,,,,,,0.07278656214475632,,,,,, +4,16949,,,,,,,,,,,,0.08365453034639359,,,,,, +4,16999,,,,,,,,,,,,0.08686423301696777,,,,,, +4,17049,,,,,,,,,,,,0.08875605463981628,,,,,, +4,17099,,,,,,,,,,,,0.09208934009075165,,,,,, +4,17149,,,,,,,,,,,,0.08559653908014297,,,,,, +4,17199,,,,,,,,,,,,0.10064330697059631,,,,,, +4,17209,,,,,,,,,,,,,0.25002434849739075,0.08345457166433334,nan,-0.004264950752258301,-0.023731617256999016,0.08345457166433334 +4,17209,,,,,,,0.2500832974910736,0.08462682366371155,0.0025171975139528513,-0.02310943603515625,0.0008174960385076702,,,,,,, +5,17249,,,,,,,,,,,,0.07808208465576172,,,,,, +5,17299,,,,,,,,,,,,0.09003539383411407,,,,,, +5,17349,,,,,,,,,,,,0.08213953673839569,,,,,, +5,17399,,,,,,,,,,,,0.08064684271812439,,,,,, +5,17449,,,,,,,,,,,,0.08484073728322983,,,,,, +5,17499,,,,,,,,,,,,0.08229917287826538,,,,,, +5,17549,,,,,,,,,,,,0.07025574147701263,,,,,, +5,17599,,,,,,,,,,,,0.07073299586772919,,,,,, +5,17649,,,,,,,,,,,,0.08090361207723618,,,,,, +5,17699,,,,,,,,,,,,0.08269176632165909,,,,,, +5,17749,,,,,,,,,,,,0.07765503972768784,,,,,, +5,17799,,,,,,,,,,,,0.086001917719841,,,,,, +5,17849,,,,,,,,,,,,0.08066394925117493,,,,,, +5,17899,,,,,,,,,,,,0.08080224692821503,,,,,, +5,17949,,,,,,,,,,,,0.08661486953496933,,,,,, +5,17999,,,,,,,,,,,,0.08346718549728394,,,,,, +5,18049,,,,,,,,,,,,0.08326970040798187,,,,,, +5,18099,,,,,,,,,,,,0.08818748593330383,,,,,, +5,18149,,,,,,,,,,,,0.09475129842758179,,,,,, +5,18199,,,,,,,,,,,,0.07967276126146317,,,,,, +5,18249,,,,,,,,,,,,0.10029909014701843,,,,,, +5,18299,,,,,,,,,,,,0.09188015758991241,,,,,, +5,18349,,,,,,,,,,,,0.10433197766542435,,,,,, +5,18399,,,,,,,,,,,,0.08302287012338638,,,,,, +5,18449,,,,,,,,,,,,0.07880298793315887,,,,,, +5,18499,,,,,,,,,,,,0.0833853930234909,,,,,, +5,18549,,,,,,,,,,,,0.07412418723106384,,,,,, +5,18599,,,,,,,,,,,,0.09600359201431274,,,,,, +5,18649,,,,,,,,,,,,0.08277199417352676,,,,,, +5,18699,,,,,,,,,,,,0.08803164958953857,,,,,, +5,18749,,,,,,,,,,,,0.0856919214129448,,,,,, +5,18799,,,,,,,,,,,,0.08428052067756653,,,,,, +5,18849,,,,,,,,,,,,0.07477670907974243,,,,,, +5,18899,,,,,,,,,,,,0.09630124270915985,,,,,, +5,18949,,,,,,,,,,,,0.0947510376572609,,,,,, +5,18999,,,,,,,,,,,,0.09446867555379868,,,,,, +5,19049,,,,,,,,,,,,0.08052007853984833,,,,,, +5,19099,,,,,,,,,,,,0.09085412323474884,,,,,, +5,19149,,,,,,,,,,,,0.07411029934883118,,,,,, +5,19199,,,,,,,,,,,,0.08861847221851349,,,,,, +5,19249,,,,,,,,,,,,0.08232097327709198,,,,,, +5,19299,,,,,,,,,,,,0.08289428055286407,,,,,, +5,19349,,,,,,,,,,,,0.08073827624320984,,,,,, +5,19399,,,,,,,,,,,,0.07816606760025024,,,,,, +5,19449,,,,,,,,,,,,0.10704169422388077,,,,,, +5,19499,,,,,,,,,,,,0.08957265317440033,,,,,, +5,19549,,,,,,,,,,,,0.09110239148139954,,,,,, +5,19599,,,,,,,,,,,,0.07922594994306564,,,,,, +5,19649,,,,,,,,,,,,0.08109038323163986,,,,,, +5,19699,,,,,,,,,,,,0.08004318177700043,,,,,, +5,19749,,,,,,,,,,,,0.0903923362493515,,,,,, +5,19799,,,,,,,,,,,,0.06937507539987564,,,,,, +5,19849,,,,,,,,,,,,0.09038844704627991,,,,,, +5,19899,,,,,,,,,,,,0.0826624184846878,,,,,, +5,19949,,,,,,,,,,,,0.07938822358846664,,,,,, +5,19999,,,,,,,,,,,,0.0907544419169426,,,,,, +5,20049,,,,,,,,,,,,0.08590362966060638,,,,,, +5,20099,,,,,,,,,,,,0.09323140978813171,,,,,, +5,20149,,,,,,,,,,,,0.08695217221975327,,,,,, +5,20199,,,,,,,,,,,,0.08068358153104782,,,,,, +5,20249,,,,,,,,,,,,0.08242382854223251,,,,,, +5,20299,,,,,,,,,,,,0.08077219128608704,,,,,, +5,20349,,,,,,,,,,,,0.09035906195640564,,,,,, +5,20399,,,,,,,,,,,,0.07437589764595032,,,,,, +5,20449,,,,,,,,,,,,0.08702050149440765,,,,,, +5,20499,,,,,,,,,,,,0.07630258798599243,,,,,, +5,20549,,,,,,,,,,,,0.09414465725421906,,,,,, +5,20599,,,,,,,,,,,,0.07664573192596436,,,,,, +5,20649,,,,,,,,,,,,0.08003345131874084,,,,,, +5,20651,,,,,,,,,,,,,0.24978625774383545,0.08319243788719177,nan,-0.0011105537414550781,0.041515350341796875,0.08319243788719177 +5,20651,,,,,,,0.24944710731506348,0.08341442793607712,-1.222087212227052e-05,-0.008446335792541504,-0.0002755357709247619,,,,,,, +6,20699,,,,,,,,,,,,0.08664321899414062,,,,,, +6,20749,,,,,,,,,,,,0.07061354070901871,,,,,, +6,20799,,,,,,,,,,,,0.07589021325111389,,,,,, +6,20849,,,,,,,,,,,,0.07766641676425934,,,,,, +6,20899,,,,,,,,,,,,0.0800454393029213,,,,,, +6,20949,,,,,,,,,,,,0.07650147378444672,,,,,, +6,20999,,,,,,,,,,,,0.07737334072589874,,,,,, +6,21049,,,,,,,,,,,,0.07170625776052475,,,,,, +6,21099,,,,,,,,,,,,0.06802952289581299,,,,,, +6,21149,,,,,,,,,,,,0.08438728004693985,,,,,, +6,21199,,,,,,,,,,,,0.08792945742607117,,,,,, +6,21249,,,,,,,,,,,,0.0926637202501297,,,,,, +6,21299,,,,,,,,,,,,0.09832461178302765,,,,,, +6,21349,,,,,,,,,,,,0.08773647248744965,,,,,, +6,21399,,,,,,,,,,,,0.07301720976829529,,,,,, +6,21449,,,,,,,,,,,,0.07692419737577438,,,,,, +6,21499,,,,,,,,,,,,0.08303951472043991,,,,,, +6,21549,,,,,,,,,,,,0.08419115841388702,,,,,, +6,21599,,,,,,,,,,,,0.08280076086521149,,,,,, +6,21649,,,,,,,,,,,,0.09436392039060593,,,,,, +6,21699,,,,,,,,,,,,0.08090858161449432,,,,,, +6,21749,,,,,,,,,,,,0.08479809761047363,,,,,, +6,21799,,,,,,,,,,,,0.0777946412563324,,,,,, +6,21849,,,,,,,,,,,,0.07460732012987137,,,,,, +6,21899,,,,,,,,,,,,0.0791984349489212,,,,,, +6,21949,,,,,,,,,,,,0.09387335181236267,,,,,, +6,21999,,,,,,,,,,,,0.08081063628196716,,,,,, +6,22049,,,,,,,,,,,,0.08824106305837631,,,,,, +6,22099,,,,,,,,,,,,0.0779251828789711,,,,,, +6,22149,,,,,,,,,,,,0.09062550961971283,,,,,, +6,22199,,,,,,,,,,,,0.08385500311851501,,,,,, +6,22249,,,,,,,,,,,,0.09045059978961945,,,,,, +6,22299,,,,,,,,,,,,0.08171888440847397,,,,,, +6,22349,,,,,,,,,,,,0.07772786915302277,,,,,, +6,22399,,,,,,,,,,,,0.07824257761240005,,,,,, +6,22449,,,,,,,,,,,,0.08864589035511017,,,,,, +6,22499,,,,,,,,,,,,0.09255549311637878,,,,,, +6,22549,,,,,,,,,,,,0.07755957543849945,,,,,, +6,22599,,,,,,,,,,,,0.08310838043689728,,,,,, +6,22649,,,,,,,,,,,,0.08542941510677338,,,,,, +6,22699,,,,,,,,,,,,0.08271525800228119,,,,,, +6,22749,,,,,,,,,,,,0.07850686460733414,,,,,, +6,22799,,,,,,,,,,,,0.07564140111207962,,,,,, +6,22849,,,,,,,,,,,,0.08943089842796326,,,,,, +6,22899,,,,,,,,,,,,0.08530858159065247,,,,,, +6,22949,,,,,,,,,,,,0.08321069180965424,,,,,, +6,22999,,,,,,,,,,,,0.0799117311835289,,,,,, +6,23049,,,,,,,,,,,,0.08257269859313965,,,,,, +6,23099,,,,,,,,,,,,0.08028598129749298,,,,,, +6,23149,,,,,,,,,,,,0.08216965198516846,,,,,, +6,23199,,,,,,,,,,,,0.07459507882595062,,,,,, +6,23249,,,,,,,,,,,,0.07841312885284424,,,,,, +6,23299,,,,,,,,,,,,0.08820304274559021,,,,,, +6,23349,,,,,,,,,,,,0.0874825268983841,,,,,, +6,23399,,,,,,,,,,,,0.07221462577581406,,,,,, +6,23449,,,,,,,,,,,,0.08313027024269104,,,,,, +6,23499,,,,,,,,,,,,0.08944226801395416,,,,,, +6,23549,,,,,,,,,,,,0.0863090455532074,,,,,, +6,23599,,,,,,,,,,,,0.08164913207292557,,,,,, +6,23649,,,,,,,,,,,,0.08882705867290497,,,,,, +6,23699,,,,,,,,,,,,0.09394542127847672,,,,,, +6,23749,,,,,,,,,,,,0.07986855506896973,,,,,, +6,23799,,,,,,,,,,,,0.0854441374540329,,,,,, +6,23849,,,,,,,,,,,,0.0899306982755661,,,,,, +6,23899,,,,,,,,,,,,0.08089283108711243,,,,,, +6,23949,,,,,,,,,,,,0.08762635290622711,,,,,, +6,23999,,,,,,,,,,,,0.09061048924922943,,,,,, +6,24049,,,,,,,,,,,,0.07079467922449112,,,,,, +6,24093,,,,,,,,,,,,,0.2496623396873474,0.08311380445957184,nan,-0.00016438961029052734,0.047162383794784546,0.08311380445957184 +6,24093,,,,,,,0.24905264377593994,0.08299034833908081,nan,-0.0033260583877563477,0.00010123405081685632,,,,,,, +7,24099,,,,,,,,,,,,0.09237997233867645,,,,,, +7,24149,,,,,,,,,,,,0.08728770911693573,,,,,, +7,24199,,,,,,,,,,,,0.07685314118862152,,,,,, +7,24249,,,,,,,,,,,,0.08716897666454315,,,,,, +7,24299,,,,,,,,,,,,0.08188009262084961,,,,,, +7,24349,,,,,,,,,,,,0.0840006023645401,,,,,, +7,24399,,,,,,,,,,,,0.08575513958930969,,,,,, +7,24449,,,,,,,,,,,,0.08338296413421631,,,,,, +7,24499,,,,,,,,,,,,0.08528049290180206,,,,,, +7,24549,,,,,,,,,,,,0.07151515781879425,,,,,, +7,24599,,,,,,,,,,,,0.0786818265914917,,,,,, +7,24649,,,,,,,,,,,,0.0879710465669632,,,,,, +7,24699,,,,,,,,,,,,0.08296786993741989,,,,,, +7,24749,,,,,,,,,,,,0.09469606727361679,,,,,, +7,24799,,,,,,,,,,,,0.08579767495393753,,,,,, +7,24849,,,,,,,,,,,,0.08404070138931274,,,,,, +7,24899,,,,,,,,,,,,0.08202381432056427,,,,,, +7,24949,,,,,,,,,,,,0.06896261870861053,,,,,, +7,24999,,,,,,,,,,,,0.08708910644054413,,,,,, +7,25049,,,,,,,,,,,,0.07492049783468246,,,,,, +7,25099,,,,,,,,,,,,0.08559629321098328,,,,,, +7,25149,,,,,,,,,,,,0.07983289659023285,,,,,, +7,25199,,,,,,,,,,,,0.07994826138019562,,,,,, +7,25249,,,,,,,,,,,,0.07523828744888306,,,,,, +7,25299,,,,,,,,,,,,0.06914694607257843,,,,,, +7,25349,,,,,,,,,,,,0.09011396765708923,,,,,, +7,25399,,,,,,,,,,,,0.07562455534934998,,,,,, +7,25449,,,,,,,,,,,,0.06707759201526642,,,,,, +7,25499,,,,,,,,,,,,0.09583722054958344,,,,,, +7,25549,,,,,,,,,,,,0.07876195013523102,,,,,, +7,25599,,,,,,,,,,,,0.08835182338953018,,,,,, +7,25649,,,,,,,,,,,,0.07914726436138153,,,,,, +7,25699,,,,,,,,,,,,0.08565058559179306,,,,,, +7,25749,,,,,,,,,,,,0.08469821512699127,,,,,, +7,25799,,,,,,,,,,,,0.07580268383026123,,,,,, +7,25849,,,,,,,,,,,,0.07651958614587784,,,,,, +7,25899,,,,,,,,,,,,0.10785777866840363,,,,,, +7,25949,,,,,,,,,,,,0.07920026779174805,,,,,, +7,25999,,,,,,,,,,,,0.07370030879974365,,,,,, +7,26049,,,,,,,,,,,,0.0943240374326706,,,,,, +7,26099,,,,,,,,,,,,0.09522605687379837,,,,,, +7,26149,,,,,,,,,,,,0.08410139381885529,,,,,, +7,26199,,,,,,,,,,,,0.07662197202444077,,,,,, +7,26249,,,,,,,,,,,,0.0883614718914032,,,,,, +7,26299,,,,,,,,,,,,0.08654208481311798,,,,,, +7,26349,,,,,,,,,,,,0.08623077720403671,,,,,, +7,26399,,,,,,,,,,,,0.0840376764535904,,,,,, +7,26449,,,,,,,,,,,,0.07434359192848206,,,,,, +7,26499,,,,,,,,,,,,0.07197374850511551,,,,,, +7,26549,,,,,,,,,,,,0.07814259827136993,,,,,, +7,26599,,,,,,,,,,,,0.08332787454128265,,,,,, +7,26649,,,,,,,,,,,,0.08092498779296875,,,,,, +7,26699,,,,,,,,,,,,0.07664398849010468,,,,,, +7,26749,,,,,,,,,,,,0.09444697201251984,,,,,, +7,26799,,,,,,,,,,,,0.08287063241004944,,,,,, +7,26849,,,,,,,,,,,,0.08200853317975998,,,,,, +7,26899,,,,,,,,,,,,0.0802643895149231,,,,,, +7,26949,,,,,,,,,,,,0.08502013981342316,,,,,, +7,26999,,,,,,,,,,,,0.06866056472063065,,,,,, +7,27049,,,,,,,,,,,,0.08946292847394943,,,,,, +7,27099,,,,,,,,,,,,0.06558741629123688,,,,,, +7,27149,,,,,,,,,,,,0.08630897104740143,,,,,, +7,27199,,,,,,,,,,,,0.09540843963623047,,,,,, +7,27249,,,,,,,,,,,,0.07529588043689728,,,,,, +7,27299,,,,,,,,,,,,0.08015663921833038,,,,,, +7,27349,,,,,,,,,,,,0.07217008620500565,,,,,, +7,27399,,,,,,,,,,,,0.08862538635730743,,,,,, +7,27449,,,,,,,,,,,,0.09310539066791534,,,,,, +7,27499,,,,,,,,,,,,0.08832927793264389,,,,,, +7,27535,,,,,,,,,,,,,0.25122758746147156,0.08505398780107498,-0.002457998925819993,-0.023511886596679688,-0.012995314784348011,0.08505398780107498 +7,27535,,,,,,,0.24895545840263367,0.08293049037456512,nan,-0.0025949478149414062,-0.0003933081461582333,,,,,,, +8,27549,,,,,,,,,,,,0.08350495994091034,,,,,, +8,27599,,,,,,,,,,,,0.08160360157489777,,,,,, +8,27649,,,,,,,,,,,,0.0920582115650177,,,,,, +8,27699,,,,,,,,,,,,0.09469886124134064,,,,,, +8,27749,,,,,,,,,,,,0.07870668172836304,,,,,, +8,27799,,,,,,,,,,,,0.08046755194664001,,,,,, +8,27849,,,,,,,,,,,,0.09107404947280884,,,,,, +8,27899,,,,,,,,,,,,0.08673109114170074,,,,,, +8,27949,,,,,,,,,,,,0.08096852898597717,,,,,, +8,27999,,,,,,,,,,,,0.08527714759111404,,,,,, +8,28049,,,,,,,,,,,,0.080837681889534,,,,,, +8,28099,,,,,,,,,,,,0.08770433068275452,,,,,, +8,28149,,,,,,,,,,,,0.08816303312778473,,,,,, +8,28199,,,,,,,,,,,,0.09510931372642517,,,,,, +8,28249,,,,,,,,,,,,0.09379304945468903,,,,,, +8,28299,,,,,,,,,,,,0.08034233003854752,,,,,, +8,28349,,,,,,,,,,,,0.07447522133588791,,,,,, +8,28399,,,,,,,,,,,,0.07812906801700592,,,,,, +8,28449,,,,,,,,,,,,0.08969147503376007,,,,,, +8,28499,,,,,,,,,,,,0.07984506338834763,,,,,, +8,28549,,,,,,,,,,,,0.0741129070520401,,,,,, +8,28599,,,,,,,,,,,,0.08618283271789551,,,,,, +8,28649,,,,,,,,,,,,0.0790366679430008,,,,,, +8,28699,,,,,,,,,,,,0.08809217065572739,,,,,, +8,28749,,,,,,,,,,,,0.08047562092542648,,,,,, +8,28799,,,,,,,,,,,,0.0913284569978714,,,,,, +8,28849,,,,,,,,,,,,0.08358094096183777,,,,,, +8,28899,,,,,,,,,,,,0.0773889422416687,,,,,, +8,28949,,,,,,,,,,,,0.09814305603504181,,,,,, +8,28999,,,,,,,,,,,,0.07664274424314499,,,,,, +8,29049,,,,,,,,,,,,0.08752711117267609,,,,,, +8,29099,,,,,,,,,,,,0.08219947665929794,,,,,, +8,29149,,,,,,,,,,,,0.09182438999414444,,,,,, +8,29199,,,,,,,,,,,,0.08661794662475586,,,,,, +8,29249,,,,,,,,,,,,0.09045007824897766,,,,,, +8,29299,,,,,,,,,,,,0.08048267662525177,,,,,, +8,29349,,,,,,,,,,,,0.08394744992256165,,,,,, +8,29399,,,,,,,,,,,,0.08450984954833984,,,,,, +8,29449,,,,,,,,,,,,0.07857391238212585,,,,,, +8,29499,,,,,,,,,,,,0.06987880170345306,,,,,, +8,29549,,,,,,,,,,,,0.08721086382865906,,,,,, +8,29599,,,,,,,,,,,,0.08522187918424606,,,,,, +8,29649,,,,,,,,,,,,0.08147177845239639,,,,,, +8,29699,,,,,,,,,,,,0.08404228091239929,,,,,, +8,29749,,,,,,,,,,,,0.07136881351470947,,,,,, +8,29799,,,,,,,,,,,,0.08261863142251968,,,,,, +8,29849,,,,,,,,,,,,0.07440251857042313,,,,,, +8,29899,,,,,,,,,,,,0.08856648206710815,,,,,, +8,29949,,,,,,,,,,,,0.08197436481714249,,,,,, +8,29999,,,,,,,,,,,,0.0853877142071724,,,,,, +8,30049,,,,,,,,,,,,0.08875981718301773,,,,,, +8,30099,,,,,,,,,,,,0.08569958806037903,,,,,, +8,30149,,,,,,,,,,,,0.08360645920038223,,,,,, +8,30199,,,,,,,,,,,,0.07941186428070068,,,,,, +8,30249,,,,,,,,,,,,0.07921428233385086,,,,,, +8,30299,,,,,,,,,,,,0.0838380753993988,,,,,, +8,30349,,,,,,,,,,,,0.06020991504192352,,,,,, +8,30399,,,,,,,,,,,,0.08439455926418304,,,,,, +8,30449,,,,,,,,,,,,0.08004569262266159,,,,,, +8,30499,,,,,,,,,,,,0.08057008683681488,,,,,, +8,30549,,,,,,,,,,,,0.0704132467508316,,,,,, +8,30599,,,,,,,,,,,,0.08227799832820892,,,,,, +8,30649,,,,,,,,,,,,0.08166981488466263,,,,,, +8,30699,,,,,,,,,,,,0.08202862739562988,,,,,, +8,30749,,,,,,,,,,,,0.07661794126033783,,,,,, +8,30799,,,,,,,,,,,,0.08617505431175232,,,,,, +8,30849,,,,,,,,,,,,0.09981252253055573,,,,,, +8,30899,,,,,,,,,,,,0.07904603332281113,,,,,, +8,30949,,,,,,,,,,,,0.09719933569431305,,,,,, +8,30977,,,,,,,,,,,,,0.25033482909202576,0.08378974348306656,nan,-0.008298397064208984,0.025195345282554626,0.08378974348306656 +8,30977,,,,,,,0.2488175630569458,0.08279106020927429,nan,-0.0009180307388305664,-4.122536483919248e-05,,,,,,, +9,30999,,,,,,,,,,,,0.09032586216926575,,,,,, +9,31049,,,,,,,,,,,,0.07403784245252609,,,,,, +9,31099,,,,,,,,,,,,0.07884399592876434,,,,,, +9,31149,,,,,,,,,,,,0.08011606335639954,,,,,, +9,31199,,,,,,,,,,,,0.08154881745576859,,,,,, +9,31249,,,,,,,,,,,,0.09208565205335617,,,,,, +9,31299,,,,,,,,,,,,0.0823880285024643,,,,,, +9,31349,,,,,,,,,,,,0.07667353749275208,,,,,, +9,31399,,,,,,,,,,,,0.07559062540531158,,,,,, +9,31449,,,,,,,,,,,,0.07644877582788467,,,,,, +9,31499,,,,,,,,,,,,0.07910971343517303,,,,,, +9,31549,,,,,,,,,,,,0.075985848903656,,,,,, +9,31599,,,,,,,,,,,,0.08485158532857895,,,,,, +9,31649,,,,,,,,,,,,0.08410730957984924,,,,,, +9,31699,,,,,,,,,,,,0.08737631142139435,,,,,, +9,31749,,,,,,,,,,,,0.08787918090820312,,,,,, +9,31799,,,,,,,,,,,,0.07937217503786087,,,,,, +9,31849,,,,,,,,,,,,0.08260270208120346,,,,,, +9,31899,,,,,,,,,,,,0.0882764607667923,,,,,, +9,31949,,,,,,,,,,,,0.08392461389303207,,,,,, +9,31999,,,,,,,,,,,,0.08013562858104706,,,,,, +9,32049,,,,,,,,,,,,0.09011609852313995,,,,,, +9,32099,,,,,,,,,,,,0.08037925511598587,,,,,, +9,32149,,,,,,,,,,,,0.10278791189193726,,,,,, +9,32199,,,,,,,,,,,,0.08114564418792725,,,,,, +9,32249,,,,,,,,,,,,0.08548641204833984,,,,,, +9,32299,,,,,,,,,,,,0.0855710357427597,,,,,, +9,32349,,,,,,,,,,,,0.08069886267185211,,,,,, +9,32399,,,,,,,,,,,,0.07994344085454941,,,,,, +9,32449,,,,,,,,,,,,0.07154253870248795,,,,,, +9,32499,,,,,,,,,,,,0.0840376690030098,,,,,, +9,32549,,,,,,,,,,,,0.08748240023851395,,,,,, +9,32599,,,,,,,,,,,,0.0768270343542099,,,,,, +9,32649,,,,,,,,,,,,0.08215446770191193,,,,,, +9,32699,,,,,,,,,,,,0.08876633644104004,,,,,, +9,32749,,,,,,,,,,,,0.07473830878734589,,,,,, +9,32799,,,,,,,,,,,,0.0734468549489975,,,,,, +9,32849,,,,,,,,,,,,0.08822444081306458,,,,,, +9,32899,,,,,,,,,,,,0.08450424671173096,,,,,, +9,32949,,,,,,,,,,,,0.08614897727966309,,,,,, +9,32999,,,,,,,,,,,,0.0740470439195633,,,,,, +9,33049,,,,,,,,,,,,0.08424687385559082,,,,,, +9,33099,,,,,,,,,,,,0.0887024998664856,,,,,, +9,33149,,,,,,,,,,,,0.0889737457036972,,,,,, +9,33199,,,,,,,,,,,,0.07659991085529327,,,,,, +9,33249,,,,,,,,,,,,0.07847019284963608,,,,,, +9,33299,,,,,,,,,,,,0.08096572756767273,,,,,, +9,33349,,,,,,,,,,,,0.07738819718360901,,,,,, +9,33399,,,,,,,,,,,,0.09261685609817505,,,,,, +9,33449,,,,,,,,,,,,0.08893115818500519,,,,,, +9,33499,,,,,,,,,,,,0.08789224922657013,,,,,, +9,33549,,,,,,,,,,,,0.07629285752773285,,,,,, +9,33599,,,,,,,,,,,,0.09160596132278442,,,,,, +9,33649,,,,,,,,,,,,0.08531567454338074,,,,,, +9,33699,,,,,,,,,,,,0.07086298614740372,,,,,, +9,33749,,,,,,,,,,,,0.08646246790885925,,,,,, +9,33799,,,,,,,,,,,,0.08443383872509003,,,,,, +9,33849,,,,,,,,,,,,0.08484414964914322,,,,,, +9,33899,,,,,,,,,,,,0.07822968810796738,,,,,, +9,33949,,,,,,,,,,,,0.08954047411680222,,,,,, +9,33999,,,,,,,,,,,,0.08348237723112106,,,,,, +9,34049,,,,,,,,,,,,0.07695391774177551,,,,,, +9,34099,,,,,,,,,,,,0.06878343969583511,,,,,, +9,34149,,,,,,,,,,,,0.08273261785507202,,,,,, +9,34199,,,,,,,,,,,,0.07761015743017197,,,,,, +9,34249,,,,,,,,,,,,0.07882122695446014,,,,,, +9,34299,,,,,,,,,,,,0.0890049934387207,,,,,, +9,34349,,,,,,,,,,,,0.0873255729675293,,,,,, +9,34399,,,,,,,,,,,,0.07801276445388794,,,,,, +9,34419,,,,,,,,,,,,,0.2501528859138489,0.08360329270362854,nan,-0.0060547590255737305,-0.050486430525779724,0.08360329270362854 +9,34419,,,,,,,0.24883733689785004,0.08281287550926208,nan,-0.001165151596069336,-0.0004934467142447829,,,,,,, +10,34449,,,,,,,,,,,,0.0745619609951973,,,,,, +10,34499,,,,,,,,,,,,0.09729449450969696,,,,,, +10,34549,,,,,,,,,,,,0.07471132278442383,,,,,, +10,34599,,,,,,,,,,,,0.07212863862514496,,,,,, +10,34649,,,,,,,,,,,,0.07178697735071182,,,,,, +10,34699,,,,,,,,,,,,0.09568183124065399,,,,,, +10,34749,,,,,,,,,,,,0.08892379701137543,,,,,, +10,34799,,,,,,,,,,,,0.08025013655424118,,,,,, +10,34849,,,,,,,,,,,,0.09244924783706665,,,,,, +10,34899,,,,,,,,,,,,0.07773797959089279,,,,,, +10,34949,,,,,,,,,,,,0.08377057313919067,,,,,, +10,34999,,,,,,,,,,,,0.0852760374546051,,,,,, +10,35049,,,,,,,,,,,,0.08603264391422272,,,,,, +10,35099,,,,,,,,,,,,0.09597230702638626,,,,,, +10,35149,,,,,,,,,,,,0.07034780830144882,,,,,, +10,35199,,,,,,,,,,,,0.08773044496774673,,,,,, +10,35249,,,,,,,,,,,,0.08175677061080933,,,,,, +10,35299,,,,,,,,,,,,0.07841727137565613,,,,,, +10,35349,,,,,,,,,,,,0.08101562410593033,,,,,, +10,35399,,,,,,,,,,,,0.07428045570850372,,,,,, +10,35449,,,,,,,,,,,,0.08508948981761932,,,,,, +10,35499,,,,,,,,,,,,0.08221550285816193,,,,,, +10,35549,,,,,,,,,,,,0.07928144931793213,,,,,, +10,35599,,,,,,,,,,,,0.08933223783969879,,,,,, +10,35649,,,,,,,,,,,,0.0832585021853447,,,,,, +10,35699,,,,,,,,,,,,0.08625250309705734,,,,,, +10,35749,,,,,,,,,,,,0.07713285088539124,,,,,, +10,35799,,,,,,,,,,,,0.08631476759910583,,,,,, +10,35849,,,,,,,,,,,,0.0852852314710617,,,,,, +10,35899,,,,,,,,,,,,0.07825280725955963,,,,,, +10,35949,,,,,,,,,,,,0.076827272772789,,,,,, +10,35999,,,,,,,,,,,,0.08544591814279556,,,,,, +10,36049,,,,,,,,,,,,0.08054956793785095,,,,,, +10,36099,,,,,,,,,,,,0.06200914829969406,,,,,, +10,36149,,,,,,,,,,,,0.08578616380691528,,,,,, +10,36199,,,,,,,,,,,,0.08635298907756805,,,,,, +10,36249,,,,,,,,,,,,0.08756610006093979,,,,,, +10,36299,,,,,,,,,,,,0.06713730096817017,,,,,, +10,36349,,,,,,,,,,,,0.07165845483541489,,,,,, +10,36399,,,,,,,,,,,,0.07655583322048187,,,,,, +10,36449,,,,,,,,,,,,0.08507741987705231,,,,,, +10,36499,,,,,,,,,,,,0.08168897032737732,,,,,, +10,36549,,,,,,,,,,,,0.09614482522010803,,,,,, +10,36599,,,,,,,,,,,,0.07956384122371674,,,,,, +10,36649,,,,,,,,,,,,0.08451002091169357,,,,,, +10,36699,,,,,,,,,,,,0.0748201310634613,,,,,, +10,36749,,,,,,,,,,,,0.08417514711618423,,,,,, +10,36799,,,,,,,,,,,,0.0738459974527359,,,,,, +10,36849,,,,,,,,,,,,0.08726049959659576,,,,,, +10,36899,,,,,,,,,,,,0.07910655438899994,,,,,, +10,36949,,,,,,,,,,,,0.08012739568948746,,,,,, +10,36999,,,,,,,,,,,,0.09313545376062393,,,,,, +10,37049,,,,,,,,,,,,0.07263416051864624,,,,,, +10,37099,,,,,,,,,,,,0.08710677176713943,,,,,, +10,37149,,,,,,,,,,,,0.08441653102636337,,,,,, +10,37199,,,,,,,,,,,,0.07603298872709274,,,,,, +10,37249,,,,,,,,,,,,0.08631923794746399,,,,,, +10,37299,,,,,,,,,,,,0.085499107837677,,,,,, +10,37349,,,,,,,,,,,,0.09043686091899872,,,,,, +10,37399,,,,,,,,,,,,0.0741986483335495,,,,,, +10,37449,,,,,,,,,,,,0.09132837504148483,,,,,, +10,37499,,,,,,,,,,,,0.0898565798997879,,,,,, +10,37549,,,,,,,,,,,,0.08493298292160034,,,,,, +10,37599,,,,,,,,,,,,0.08025401830673218,,,,,, +10,37649,,,,,,,,,,,,0.07692606747150421,,,,,, +10,37699,,,,,,,,,,,,0.0812259390950203,,,,,, +10,37749,,,,,,,,,,,,0.09237340837717056,,,,,, +10,37799,,,,,,,,,,,,0.07583166658878326,,,,,, +10,37849,,,,,,,,,,,,0.09071707725524902,,,,,, +10,37861,,,,,,,,,,,,,0.24992109835147858,0.08339114487171173,nan,-0.0035017728805541992,0.089907705783844,0.08339114487171173 +10,37861,,,,,,,0.2487829625606537,0.08278263360261917,nan,-0.0008095502853393555,-0.00022111446014605463,,,,,,, +11,37899,,,,,,,,,,,,0.08156023919582367,,,,,, +11,37949,,,,,,,,,,,,0.08978864550590515,,,,,, +11,37999,,,,,,,,,,,,0.07301226258277893,,,,,, +11,38049,,,,,,,,,,,,0.08341255784034729,,,,,, +11,38099,,,,,,,,,,,,0.0969308614730835,,,,,, +11,38149,,,,,,,,,,,,0.08151278644800186,,,,,, +11,38199,,,,,,,,,,,,0.08739300072193146,,,,,, +11,38249,,,,,,,,,,,,0.0881781131029129,,,,,, +11,38299,,,,,,,,,,,,0.08146089315414429,,,,,, +11,38349,,,,,,,,,,,,0.0895003005862236,,,,,, +11,38399,,,,,,,,,,,,0.08220133185386658,,,,,, +11,38449,,,,,,,,,,,,0.07869380712509155,,,,,, +11,38499,,,,,,,,,,,,0.07827542722225189,,,,,, +11,38549,,,,,,,,,,,,0.08265311270952225,,,,,, +11,38599,,,,,,,,,,,,0.08240077644586563,,,,,, +11,38649,,,,,,,,,,,,0.0684061273932457,,,,,, +11,38699,,,,,,,,,,,,0.08230473846197128,,,,,, +11,38749,,,,,,,,,,,,0.0834907740354538,,,,,, +11,38799,,,,,,,,,,,,0.07635574042797089,,,,,, +11,38849,,,,,,,,,,,,0.08379682153463364,,,,,, +11,38899,,,,,,,,,,,,0.08748139441013336,,,,,, +11,38949,,,,,,,,,,,,0.09033768624067307,,,,,, +11,38999,,,,,,,,,,,,0.0857030376791954,,,,,, +11,39049,,,,,,,,,,,,0.07943259179592133,,,,,, +11,39099,,,,,,,,,,,,0.08366948366165161,,,,,, +11,39149,,,,,,,,,,,,0.07787296175956726,,,,,, +11,39199,,,,,,,,,,,,0.07735703885555267,,,,,, +11,39249,,,,,,,,,,,,0.08538687229156494,,,,,, +11,39299,,,,,,,,,,,,0.08885090053081512,,,,,, +11,39349,,,,,,,,,,,,0.07865351438522339,,,,,, +11,39399,,,,,,,,,,,,0.07560859620571136,,,,,, +11,39449,,,,,,,,,,,,0.0828147679567337,,,,,, +11,39499,,,,,,,,,,,,0.07469320297241211,,,,,, +11,39549,,,,,,,,,,,,0.07695761322975159,,,,,, +11,39599,,,,,,,,,,,,0.09028927981853485,,,,,, +11,39649,,,,,,,,,,,,0.08398392796516418,,,,,, +11,39699,,,,,,,,,,,,0.0807700976729393,,,,,, +11,39749,,,,,,,,,,,,0.08656999468803406,,,,,, +11,39799,,,,,,,,,,,,0.0854710191488266,,,,,, +11,39849,,,,,,,,,,,,0.08452801406383514,,,,,, +11,39899,,,,,,,,,,,,0.08279184252023697,,,,,, +11,39949,,,,,,,,,,,,0.07391759753227234,,,,,, +11,39999,,,,,,,,,,,,0.08931861817836761,,,,,, +11,40049,,,,,,,,,,,,0.08638335019350052,,,,,, +11,40099,,,,,,,,,,,,0.07293654978275299,,,,,, +11,40149,,,,,,,,,,,,0.08148544281721115,,,,,, +11,40199,,,,,,,,,,,,0.08337754011154175,,,,,, +11,40249,,,,,,,,,,,,0.07989898324012756,,,,,, +11,40299,,,,,,,,,,,,0.08970865607261658,,,,,, +11,40349,,,,,,,,,,,,0.08366328477859497,,,,,, +11,40399,,,,,,,,,,,,0.08461758494377136,,,,,, +11,40449,,,,,,,,,,,,0.08986125141382217,,,,,, +11,40499,,,,,,,,,,,,0.08159126341342926,,,,,, +11,40549,,,,,,,,,,,,0.07788482308387756,,,,,, +11,40599,,,,,,,,,,,,0.0837959349155426,,,,,, +11,40649,,,,,,,,,,,,0.08000753819942474,,,,,, +11,40699,,,,,,,,,,,,0.0906897634267807,,,,,, +11,40749,,,,,,,,,,,,0.08926880359649658,,,,,, +11,40799,,,,,,,,,,,,0.08372966945171356,,,,,, +11,40849,,,,,,,,,,,,0.08732786774635315,,,,,, +11,40899,,,,,,,,,,,,0.081427201628685,,,,,, +11,40949,,,,,,,,,,,,0.08293934166431427,,,,,, +11,40999,,,,,,,,,,,,0.08441182225942612,,,,,, +11,41049,,,,,,,,,,,,0.08842313289642334,,,,,, +11,41099,,,,,,,,,,,,0.08152350038290024,,,,,, +11,41149,,,,,,,,,,,,0.08545474708080292,,,,,, +11,41199,,,,,,,,,,,,0.08263026177883148,,,,,, +11,41249,,,,,,,,,,,,0.08618561923503876,,,,,, +11,41299,,,,,,,,,,,,0.08951576799154282,,,,,, +11,41303,,,,,,,,,,,,,0.25009334087371826,0.08355702459812164,nan,-0.005497932434082031,-0.06909658759832382,0.08355702459812164 +11,41303,,,,,,,0.248884916305542,0.08303108811378479,0.006208009086549282,-0.003820061683654785,0.004521830473095179,,,,,,, +12,41349,,,,,,,,,,,,0.08750268816947937,,,,,, +12,41399,,,,,,,,,,,,0.08737295120954514,,,,,, +12,41449,,,,,,,,,,,,0.08278197050094604,,,,,, +12,41499,,,,,,,,,,,,0.08037389814853668,,,,,, +12,41549,,,,,,,,,,,,0.06985358893871307,,,,,, +12,41599,,,,,,,,,,,,0.08485878258943558,,,,,, +12,41649,,,,,,,,,,,,0.07733874022960663,,,,,, +12,41699,,,,,,,,,,,,0.07367203384637833,,,,,, +12,41749,,,,,,,,,,,,0.08615760505199432,,,,,, +12,41799,,,,,,,,,,,,0.09517790377140045,,,,,, +12,41849,,,,,,,,,,,,0.09177524596452713,,,,,, +12,41899,,,,,,,,,,,,0.09845665097236633,,,,,, +12,41949,,,,,,,,,,,,0.08058013021945953,,,,,, +12,41999,,,,,,,,,,,,0.08280915021896362,,,,,, +12,42049,,,,,,,,,,,,0.08254805952310562,,,,,, +12,42099,,,,,,,,,,,,0.0931556299328804,,,,,, +12,42149,,,,,,,,,,,,0.07949969917535782,,,,,, +12,42199,,,,,,,,,,,,0.07837432622909546,,,,,, +12,42249,,,,,,,,,,,,0.08967237919569016,,,,,, +12,42299,,,,,,,,,,,,0.08400829881429672,,,,,, +12,42349,,,,,,,,,,,,0.08608628809452057,,,,,, +12,42399,,,,,,,,,,,,0.08171063661575317,,,,,, +12,42449,,,,,,,,,,,,0.08421674370765686,,,,,, +12,42499,,,,,,,,,,,,0.07637421786785126,,,,,, +12,42549,,,,,,,,,,,,0.07534445822238922,,,,,, +12,42599,,,,,,,,,,,,0.08950461447238922,,,,,, +12,42649,,,,,,,,,,,,0.08654709160327911,,,,,, +12,42699,,,,,,,,,,,,0.07392719388008118,,,,,, +12,42749,,,,,,,,,,,,0.08329281955957413,,,,,, +12,42799,,,,,,,,,,,,0.06766793131828308,,,,,, +12,42849,,,,,,,,,,,,0.07948043942451477,,,,,, +12,42899,,,,,,,,,,,,0.07538014650344849,,,,,, +12,42949,,,,,,,,,,,,0.0842137336730957,,,,,, +12,42999,,,,,,,,,,,,0.09494731575250626,,,,,, +12,43049,,,,,,,,,,,,0.08459073305130005,,,,,, +12,43099,,,,,,,,,,,,0.08445830643177032,,,,,, +12,43149,,,,,,,,,,,,0.07521866261959076,,,,,, +12,43199,,,,,,,,,,,,0.07407662272453308,,,,,, +12,43249,,,,,,,,,,,,0.08529400825500488,,,,,, +12,43299,,,,,,,,,,,,0.07672487199306488,,,,,, +12,43349,,,,,,,,,,,,0.08076462149620056,,,,,, +12,43399,,,,,,,,,,,,0.07597258687019348,,,,,, +12,43449,,,,,,,,,,,,0.07101791352033615,,,,,, +12,43499,,,,,,,,,,,,0.07798583060503006,,,,,, +12,43549,,,,,,,,,,,,0.08742153644561768,,,,,, +12,43599,,,,,,,,,,,,0.08487511426210403,,,,,, +12,43649,,,,,,,,,,,,0.07744051516056061,,,,,, +12,43699,,,,,,,,,,,,0.07836055755615234,,,,,, +12,43749,,,,,,,,,,,,0.07468391954898834,,,,,, +12,43799,,,,,,,,,,,,0.08754827082157135,,,,,, +12,43849,,,,,,,,,,,,0.08092662692070007,,,,,, +12,43899,,,,,,,,,,,,0.09407500922679901,,,,,, +12,43949,,,,,,,,,,,,0.0787682831287384,,,,,, +12,43999,,,,,,,,,,,,0.08716131001710892,,,,,, +12,44049,,,,,,,,,,,,0.08779726922512054,,,,,, +12,44099,,,,,,,,,,,,0.09428149461746216,,,,,, +12,44149,,,,,,,,,,,,0.08930712193250656,,,,,, +12,44199,,,,,,,,,,,,0.09124509990215302,,,,,, +12,44249,,,,,,,,,,,,0.08727723360061646,,,,,, +12,44299,,,,,,,,,,,,0.08639393746852875,,,,,, +12,44349,,,,,,,,,,,,0.077088363468647,,,,,, +12,44399,,,,,,,,,,,,0.09176754951477051,,,,,, +12,44449,,,,,,,,,,,,0.07729338109493256,,,,,, +12,44499,,,,,,,,,,,,0.07614341378211975,,,,,, +12,44549,,,,,,,,,,,,0.09104993939399719,,,,,, +12,44599,,,,,,,,,,,,0.08787956833839417,,,,,, +12,44649,,,,,,,,,,,,0.08746937662363052,,,,,, +12,44699,,,,,,,,,,,,0.08413182199001312,,,,,, +12,44745,,,,,,,,,,,,,0.25009685754776,0.08369080722332001,nan,-0.007107734680175781,-0.07957098633050919,0.08369080722332001 +12,44745,,,,,,,0.24872945249080658,0.08276718854904175,nan,-0.000616908073425293,0.010970075614750385,,,,,,, +13,44749,,,,,,,,,,,,0.0825171172618866,,,,,, +13,44799,,,,,,,,,,,,0.08730937540531158,,,,,, +13,44849,,,,,,,,,,,,0.08333779871463776,,,,,, +13,44899,,,,,,,,,,,,0.08412156999111176,,,,,, +13,44949,,,,,,,,,,,,0.07734964042901993,,,,,, +13,44999,,,,,,,,,,,,0.07680796086788177,,,,,, +13,45049,,,,,,,,,,,,0.08279626071453094,,,,,, +13,45099,,,,,,,,,,,,0.06916932016611099,,,,,, +13,45149,,,,,,,,,,,,0.0780409500002861,,,,,, +13,45199,,,,,,,,,,,,0.07833565771579742,,,,,, +13,45249,,,,,,,,,,,,0.08035057783126831,,,,,, +13,45299,,,,,,,,,,,,0.08788944035768509,,,,,, +13,45349,,,,,,,,,,,,0.09908546507358551,,,,,, +13,45399,,,,,,,,,,,,0.07984284311532974,,,,,, +13,45449,,,,,,,,,,,,0.06998345255851746,,,,,, +13,45499,,,,,,,,,,,,0.08122208714485168,,,,,, +13,45549,,,,,,,,,,,,0.08098188787698746,,,,,, +13,45599,,,,,,,,,,,,0.08485324680805206,,,,,, +13,45649,,,,,,,,,,,,0.08253112435340881,,,,,, +13,45699,,,,,,,,,,,,0.08172811567783356,,,,,, +13,45749,,,,,,,,,,,,0.07697281241416931,,,,,, +13,45799,,,,,,,,,,,,0.07871334254741669,,,,,, +13,45849,,,,,,,,,,,,0.07567457854747772,,,,,, +13,45899,,,,,,,,,,,,0.07420237362384796,,,,,, +13,45949,,,,,,,,,,,,0.0764235109090805,,,,,, +13,45999,,,,,,,,,,,,0.06717446446418762,,,,,, +13,46049,,,,,,,,,,,,0.08536766469478607,,,,,, +13,46099,,,,,,,,,,,,0.0738920345902443,,,,,, +13,46149,,,,,,,,,,,,0.0830962210893631,,,,,, +13,46199,,,,,,,,,,,,0.08523394912481308,,,,,, +13,46249,,,,,,,,,,,,0.09930796921253204,,,,,, +13,46299,,,,,,,,,,,,0.07983018457889557,,,,,, +13,46349,,,,,,,,,,,,0.09057705104351044,,,,,, +13,46399,,,,,,,,,,,,0.0789627879858017,,,,,, +13,46449,,,,,,,,,,,,0.0753544420003891,,,,,, +13,46499,,,,,,,,,,,,0.08476840704679489,,,,,, +13,46549,,,,,,,,,,,,0.07367512583732605,,,,,, +13,46599,,,,,,,,,,,,0.08962821960449219,,,,,, +13,46649,,,,,,,,,,,,0.07854005694389343,,,,,, +13,46699,,,,,,,,,,,,0.08793725818395615,,,,,, +13,46749,,,,,,,,,,,,0.07401816546916962,,,,,, +13,46799,,,,,,,,,,,,0.0833137109875679,,,,,, +13,46849,,,,,,,,,,,,0.09238551557064056,,,,,, +13,46899,,,,,,,,,,,,0.07738599181175232,,,,,, +13,46949,,,,,,,,,,,,0.09607870876789093,,,,,, +13,46999,,,,,,,,,,,,0.08856969326734543,,,,,, +13,47049,,,,,,,,,,,,0.09513913094997406,,,,,, +13,47099,,,,,,,,,,,,0.0842476412653923,,,,,, +13,47149,,,,,,,,,,,,0.07528309524059296,,,,,, +13,47199,,,,,,,,,,,,0.08525604754686356,,,,,, +13,47249,,,,,,,,,,,,0.08560226857662201,,,,,, +13,47299,,,,,,,,,,,,0.07879984378814697,,,,,, +13,47349,,,,,,,,,,,,0.07941071689128876,,,,,, +13,47399,,,,,,,,,,,,0.08124241232872009,,,,,, +13,47449,,,,,,,,,,,,0.08000156283378601,,,,,, +13,47499,,,,,,,,,,,,0.0697072446346283,,,,,, +13,47549,,,,,,,,,,,,0.08063365519046783,,,,,, +13,47599,,,,,,,,,,,,0.08370883762836456,,,,,, +13,47649,,,,,,,,,,,,0.0842653289437294,,,,,, +13,47699,,,,,,,,,,,,0.07990264147520065,,,,,, +13,47749,,,,,,,,,,,,0.08618277311325073,,,,,, +13,47799,,,,,,,,,,,,0.0756966769695282,,,,,, +13,47849,,,,,,,,,,,,0.07926685363054276,,,,,, +13,47899,,,,,,,,,,,,0.0841846615076065,,,,,, +13,47949,,,,,,,,,,,,0.0893109142780304,,,,,, +13,47999,,,,,,,,,,,,0.07384373247623444,,,,,, +13,48049,,,,,,,,,,,,0.10341908782720566,,,,,, +13,48099,,,,,,,,,,,,0.08075537532567978,,,,,, +13,48149,,,,,,,,,,,,0.06772108376026154,,,,,, +13,48187,,,,,,,,,,,,,0.2468915730714798,0.08177706599235535,0.12662239372730255,0.01592153310775757,0.18040449917316437,0.08177706599235535 +13,48187,,,,,,,0.24870707094669342,0.08273771405220032,nan,-0.0002739429473876953,0.00736466608941555,,,,,,, +14,48199,,,,,,,,,,,,0.08742502331733704,,,,,, +14,48249,,,,,,,,,,,,0.08847880363464355,,,,,, +14,48299,,,,,,,,,,,,0.08677171170711517,,,,,, +14,48349,,,,,,,,,,,,0.08155831694602966,,,,,, +14,48399,,,,,,,,,,,,0.08456532657146454,,,,,, +14,48449,,,,,,,,,,,,0.09405818581581116,,,,,, +14,48499,,,,,,,,,,,,0.08091017603874207,,,,,, +14,48549,,,,,,,,,,,,0.0825144425034523,,,,,, +14,48599,,,,,,,,,,,,0.07661546766757965,,,,,, +14,48649,,,,,,,,,,,,0.08751490712165833,,,,,, +14,48699,,,,,,,,,,,,0.08117332309484482,,,,,, +14,48749,,,,,,,,,,,,0.08882438391447067,,,,,, +14,48799,,,,,,,,,,,,0.08340474963188171,,,,,, +14,48849,,,,,,,,,,,,0.0840318351984024,,,,,, +14,48899,,,,,,,,,,,,0.07009252905845642,,,,,, +14,48949,,,,,,,,,,,,0.08091375231742859,,,,,, +14,48999,,,,,,,,,,,,0.07828649133443832,,,,,, +14,49049,,,,,,,,,,,,0.07771678268909454,,,,,, +14,49099,,,,,,,,,,,,0.0850038155913353,,,,,, +14,49149,,,,,,,,,,,,0.08786634355783463,,,,,, +14,49199,,,,,,,,,,,,0.07407734543085098,,,,,, +14,49249,,,,,,,,,,,,0.09049175679683685,,,,,, +14,49299,,,,,,,,,,,,0.07510700821876526,,,,,, +14,49349,,,,,,,,,,,,0.07745666801929474,,,,,, +14,49399,,,,,,,,,,,,0.06937505304813385,,,,,, +14,49449,,,,,,,,,,,,0.07221799343824387,,,,,, +14,49499,,,,,,,,,,,,0.08831324428319931,,,,,, +14,49549,,,,,,,,,,,,0.09038339555263519,,,,,, +14,49599,,,,,,,,,,,,0.09310303628444672,,,,,, +14,49649,,,,,,,,,,,,0.08762095123529434,,,,,, +14,49699,,,,,,,,,,,,0.08489633351564407,,,,,, +14,49749,,,,,,,,,,,,0.07984061539173126,,,,,, +14,49799,,,,,,,,,,,,0.08505924046039581,,,,,, +14,49849,,,,,,,,,,,,0.08606236428022385,,,,,, +14,49899,,,,,,,,,,,,0.08932268619537354,,,,,, +14,49949,,,,,,,,,,,,0.08719494938850403,,,,,, +14,49999,,,,,,,,,,,,0.08454106748104095,,,,,, +14,50049,,,,,,,,,,,,0.07595103979110718,,,,,, +14,50099,,,,,,,,,,,,0.08693218976259232,,,,,, +14,50149,,,,,,,,,,,,0.07789534330368042,,,,,, +14,50199,,,,,,,,,,,,0.07086065411567688,,,,,, +14,50249,,,,,,,,,,,,0.08522231876850128,,,,,, +14,50299,,,,,,,,,,,,0.07782123982906342,,,,,, +14,50349,,,,,,,,,,,,0.07815410941839218,,,,,, +14,50399,,,,,,,,,,,,0.07996395230293274,,,,,, +14,50449,,,,,,,,,,,,0.08076970279216766,,,,,, +14,50499,,,,,,,,,,,,0.08389117568731308,,,,,, +14,50549,,,,,,,,,,,,0.07936985045671463,,,,,, +14,50599,,,,,,,,,,,,0.08749677240848541,,,,,, +14,50649,,,,,,,,,,,,0.07172217965126038,,,,,, +14,50699,,,,,,,,,,,,0.09240785241127014,,,,,, +14,50749,,,,,,,,,,,,0.07224825024604797,,,,,, +14,50799,,,,,,,,,,,,0.0839489996433258,,,,,, +14,50849,,,,,,,,,,,,0.07728008180856705,,,,,, +14,50899,,,,,,,,,,,,0.07770595699548721,,,,,, +14,50949,,,,,,,,,,,,0.07207724452018738,,,,,, +14,50999,,,,,,,,,,,,0.07865844666957855,,,,,, +14,51049,,,,,,,,,,,,0.0856555625796318,,,,,, +14,51099,,,,,,,,,,,,0.08951839804649353,,,,,, +14,51149,,,,,,,,,,,,0.07167927175760269,,,,,, +14,51199,,,,,,,,,,,,0.07811503857374191,,,,,, +14,51249,,,,,,,,,,,,0.0765964537858963,,,,,, +14,51299,,,,,,,,,,,,0.07704414427280426,,,,,, +14,51349,,,,,,,,,,,,0.08642664551734924,,,,,, +14,51399,,,,,,,,,,,,0.07622452080249786,,,,,, +14,51449,,,,,,,,,,,,0.07736052572727203,,,,,, +14,51499,,,,,,,,,,,,0.08005677163600922,,,,,, +14,51549,,,,,,,,,,,,0.07557664811611176,,,,,, +14,51599,,,,,,,,,,,,0.07564518600702286,,,,,, +14,51629,,,,,,,,,,,,,0.2436099499464035,0.08019749075174332,0.1913258582353592,0.034929633140563965,0.22648073732852936,0.08019749075174332 +14,51629,,,,,,,0.24444030225276947,0.08059106022119522,0.16048161685466766,0.02569061517715454,0.14449259638786316,,,,,,, +15,51649,,,,,,,,,,,,0.0742485523223877,,,,,, +15,51699,,,,,,,,,,,,0.08892061561346054,,,,,, +15,51749,,,,,,,,,,,,0.06833155453205109,,,,,, +15,51799,,,,,,,,,,,,0.08047588169574738,,,,,, +15,51849,,,,,,,,,,,,0.07016196846961975,,,,,, +15,51899,,,,,,,,,,,,0.07930888235569,,,,,, +15,51949,,,,,,,,,,,,0.07840074598789215,,,,,, +15,51999,,,,,,,,,,,,0.08436180651187897,,,,,, +15,52049,,,,,,,,,,,,0.08982888609170914,,,,,, +15,52099,,,,,,,,,,,,0.08914400637149811,,,,,, +15,52149,,,,,,,,,,,,0.08133719861507416,,,,,, +15,52199,,,,,,,,,,,,0.06528215110301971,,,,,, +15,52249,,,,,,,,,,,,0.06711295247077942,,,,,, +15,52299,,,,,,,,,,,,0.08326414227485657,,,,,, +15,52349,,,,,,,,,,,,0.07832751423120499,,,,,, +15,52399,,,,,,,,,,,,0.07769286632537842,,,,,, +15,52449,,,,,,,,,,,,0.07750137895345688,,,,,, +15,52499,,,,,,,,,,,,0.08143064379692078,,,,,, +15,52549,,,,,,,,,,,,0.07452783733606339,,,,,, +15,52599,,,,,,,,,,,,0.07732967287302017,,,,,, +15,52649,,,,,,,,,,,,0.07991509139537811,,,,,, +15,52699,,,,,,,,,,,,0.08186288923025131,,,,,, +15,52749,,,,,,,,,,,,0.07501119375228882,,,,,, +15,52799,,,,,,,,,,,,0.08786976337432861,,,,,, +15,52849,,,,,,,,,,,,0.0734807699918747,,,,,, +15,52899,,,,,,,,,,,,0.07333947718143463,,,,,, +15,52949,,,,,,,,,,,,0.07677243649959564,,,,,, +15,52999,,,,,,,,,,,,0.07869574427604675,,,,,, +15,53049,,,,,,,,,,,,0.07777735590934753,,,,,, +15,53099,,,,,,,,,,,,0.07916142046451569,,,,,, +15,53149,,,,,,,,,,,,0.07417882978916168,,,,,, +15,53199,,,,,,,,,,,,0.07942403852939606,,,,,, +15,53249,,,,,,,,,,,,0.07197437435388565,,,,,, +15,53299,,,,,,,,,,,,0.0731951966881752,,,,,, +15,53349,,,,,,,,,,,,0.08102858066558838,,,,,, +15,53399,,,,,,,,,,,,0.08014996349811554,,,,,, +15,53449,,,,,,,,,,,,0.07814005762338638,,,,,, +15,53499,,,,,,,,,,,,0.08365852385759354,,,,,, +15,53549,,,,,,,,,,,,0.0673566609621048,,,,,, +15,53599,,,,,,,,,,,,0.08115204423666,,,,,, +15,53649,,,,,,,,,,,,0.08483753353357315,,,,,, +15,53699,,,,,,,,,,,,0.08276166021823883,,,,,, +15,53749,,,,,,,,,,,,0.08610270917415619,,,,,, +15,53799,,,,,,,,,,,,0.07325945049524307,,,,,, +15,53849,,,,,,,,,,,,0.07345518469810486,,,,,, +15,53899,,,,,,,,,,,,0.07474841922521591,,,,,, +15,53949,,,,,,,,,,,,0.07897864282131195,,,,,, +15,53999,,,,,,,,,,,,0.06508111208677292,,,,,, +15,54049,,,,,,,,,,,,0.08714470267295837,,,,,, +15,54099,,,,,,,,,,,,0.07421784102916718,,,,,, +15,54149,,,,,,,,,,,,0.09234845638275146,,,,,, +15,54199,,,,,,,,,,,,0.07595968246459961,,,,,, +15,54249,,,,,,,,,,,,0.08352693170309067,,,,,, +15,54299,,,,,,,,,,,,0.08620055019855499,,,,,, +15,54349,,,,,,,,,,,,0.08165643364191055,,,,,, +15,54399,,,,,,,,,,,,0.08535332977771759,,,,,, +15,54449,,,,,,,,,,,,0.07595957815647125,,,,,, +15,54499,,,,,,,,,,,,0.07205170392990112,,,,,, +15,54549,,,,,,,,,,,,0.0783795565366745,,,,,, +15,54599,,,,,,,,,,,,0.09319033473730087,,,,,, +15,54649,,,,,,,,,,,,0.07939590513706207,,,,,, +15,54699,,,,,,,,,,,,0.07046009600162506,,,,,, +15,54749,,,,,,,,,,,,0.08086343854665756,,,,,, +15,54799,,,,,,,,,,,,0.06376700848340988,,,,,, +15,54849,,,,,,,,,,,,0.07187145948410034,,,,,, +15,54899,,,,,,,,,,,,0.0762932151556015,,,,,, +15,54949,,,,,,,,,,,,0.07757049798965454,,,,,, +15,54999,,,,,,,,,,,,0.0701766163110733,,,,,, +15,55049,,,,,,,,,,,,0.08323756605386734,,,,,, +15,55071,,,,,,,,,,,,,0.23744863271713257,0.07736647129058838,0.2866133749485016,0.06899720430374146,0.2888186573982239,0.07736647129058838 +15,55071,,,,,,,0.24262313544750214,0.07965712994337082,0.1923985332250595,0.03696918487548828,0.17243728041648865,,,,,,, +16,55099,,,,,,,,,,,,0.0970761775970459,,,,,, +16,55149,,,,,,,,,,,,0.07928885519504547,,,,,, +16,55199,,,,,,,,,,,,0.07381270825862885,,,,,, +16,55249,,,,,,,,,,,,0.06834150105714798,,,,,, +16,55299,,,,,,,,,,,,0.07217191904783249,,,,,, +16,55349,,,,,,,,,,,,0.09005029499530792,,,,,, +16,55399,,,,,,,,,,,,0.08093205094337463,,,,,, +16,55449,,,,,,,,,,,,0.06986819207668304,,,,,, +16,55499,,,,,,,,,,,,0.08116592466831207,,,,,, +16,55549,,,,,,,,,,,,0.08657228946685791,,,,,, +16,55599,,,,,,,,,,,,0.07726404815912247,,,,,, +16,55649,,,,,,,,,,,,0.08014851808547974,,,,,, +16,55699,,,,,,,,,,,,0.07798780500888824,,,,,, +16,55749,,,,,,,,,,,,0.08831673860549927,,,,,, +16,55799,,,,,,,,,,,,0.08017223328351974,,,,,, +16,55849,,,,,,,,,,,,0.07719428837299347,,,,,, +16,55899,,,,,,,,,,,,0.07549922913312912,,,,,, +16,55949,,,,,,,,,,,,0.08918430656194687,,,,,, +16,55999,,,,,,,,,,,,0.06734085083007812,,,,,, +16,56049,,,,,,,,,,,,0.08128608018159866,,,,,, +16,56099,,,,,,,,,,,,0.07460839301347733,,,,,, +16,56149,,,,,,,,,,,,0.06987092643976212,,,,,, +16,56199,,,,,,,,,,,,0.07620279490947723,,,,,, +16,56249,,,,,,,,,,,,0.07953762263059616,,,,,, +16,56299,,,,,,,,,,,,0.0729878768324852,,,,,, +16,56349,,,,,,,,,,,,0.07408373802900314,,,,,, +16,56399,,,,,,,,,,,,0.07024048268795013,,,,,, +16,56449,,,,,,,,,,,,0.08575490862131119,,,,,, +16,56499,,,,,,,,,,,,0.06680004298686981,,,,,, +16,56549,,,,,,,,,,,,0.08223547041416168,,,,,, +16,56599,,,,,,,,,,,,0.08439558744430542,,,,,, +16,56649,,,,,,,,,,,,0.0836629793047905,,,,,, +16,56699,,,,,,,,,,,,0.07200931757688522,,,,,, +16,56749,,,,,,,,,,,,0.07080888748168945,,,,,, +16,56799,,,,,,,,,,,,0.08521311730146408,,,,,, +16,56849,,,,,,,,,,,,0.06564242392778397,,,,,, +16,56899,,,,,,,,,,,,0.08268491923809052,,,,,, +16,56949,,,,,,,,,,,,0.08540713787078857,,,,,, +16,56999,,,,,,,,,,,,0.09365817159414291,,,,,, +16,57049,,,,,,,,,,,,0.09261026978492737,,,,,, +16,57099,,,,,,,,,,,,0.08397470414638519,,,,,, +16,57149,,,,,,,,,,,,0.07800322771072388,,,,,, +16,57199,,,,,,,,,,,,0.078985795378685,,,,,, +16,57249,,,,,,,,,,,,0.08917344361543655,,,,,, +16,57299,,,,,,,,,,,,0.06793050467967987,,,,,, +16,57349,,,,,,,,,,,,0.06823589652776718,,,,,, +16,57399,,,,,,,,,,,,0.08339008688926697,,,,,, +16,57449,,,,,,,,,,,,0.07623469829559326,,,,,, +16,57499,,,,,,,,,,,,0.07792752981185913,,,,,, +16,57549,,,,,,,,,,,,0.08211380243301392,,,,,, +16,57599,,,,,,,,,,,,0.0734672099351883,,,,,, +16,57649,,,,,,,,,,,,0.09336952865123749,,,,,, +16,57699,,,,,,,,,,,,0.0710645318031311,,,,,, +16,57749,,,,,,,,,,,,0.06303749978542328,,,,,, +16,57799,,,,,,,,,,,,0.07846437394618988,,,,,, +16,57849,,,,,,,,,,,,0.07300273329019547,,,,,, +16,57899,,,,,,,,,,,,0.07552963495254517,,,,,, +16,57949,,,,,,,,,,,,0.08170802891254425,,,,,, +16,57999,,,,,,,,,,,,0.07251787185668945,,,,,, +16,58049,,,,,,,,,,,,0.07181407511234283,,,,,, +16,58099,,,,,,,,,,,,0.07921753078699112,,,,,, +16,58149,,,,,,,,,,,,0.0883873999118805,,,,,, +16,58199,,,,,,,,,,,,0.08002714067697525,,,,,, +16,58249,,,,,,,,,,,,0.06940816342830658,,,,,, +16,58299,,,,,,,,,,,,0.06915926933288574,,,,,, +16,58349,,,,,,,,,,,,0.08463935554027557,,,,,, +16,58399,,,,,,,,,,,,0.074761763215065,,,,,, +16,58449,,,,,,,,,,,,0.08119647204875946,,,,,, +16,58499,,,,,,,,,,,,0.0904419794678688,,,,,, +16,58513,,,,,,,,,,,,,0.2363823503255844,0.07776425778865814,0.2881949245929718,0.06421035528182983,0.2881072163581848,0.07776425778865814 +16,58513,,,,,,,0.24171645939350128,0.07916530221700668,0.20725733041763306,0.04291754961013794,0.18319527804851532,,,,,,, +17,58549,,,,,,,,,,,,0.08656015247106552,,,,,, +17,58599,,,,,,,,,,,,0.06745830178260803,,,,,, +17,58649,,,,,,,,,,,,0.07780975103378296,,,,,, +17,58699,,,,,,,,,,,,0.0863162949681282,,,,,, +17,58749,,,,,,,,,,,,0.07448345422744751,,,,,, +17,58799,,,,,,,,,,,,0.08658862113952637,,,,,, +17,58849,,,,,,,,,,,,0.07354192435741425,,,,,, +17,58899,,,,,,,,,,,,0.07163839042186737,,,,,, +17,58949,,,,,,,,,,,,0.08231288939714432,,,,,, +17,58999,,,,,,,,,,,,0.07385866343975067,,,,,, +17,59049,,,,,,,,,,,,0.07302391529083252,,,,,, +17,59099,,,,,,,,,,,,0.08712534606456757,,,,,, +17,59149,,,,,,,,,,,,0.08682611584663391,,,,,, +17,59199,,,,,,,,,,,,0.08066416531801224,,,,,, +17,59249,,,,,,,,,,,,0.08425723761320114,,,,,, +17,59299,,,,,,,,,,,,0.07571255415678024,,,,,, +17,59349,,,,,,,,,,,,0.08210216462612152,,,,,, +17,59399,,,,,,,,,,,,0.09649485349655151,,,,,, +17,59449,,,,,,,,,,,,0.08056143671274185,,,,,, +17,59499,,,,,,,,,,,,0.07145309448242188,,,,,, +17,59549,,,,,,,,,,,,0.08409974724054337,,,,,, +17,59599,,,,,,,,,,,,0.07623331993818283,,,,,, +17,59649,,,,,,,,,,,,0.06659114360809326,,,,,, +17,59699,,,,,,,,,,,,0.07260122895240784,,,,,, +17,59749,,,,,,,,,,,,0.07428814470767975,,,,,, +17,59799,,,,,,,,,,,,0.07826092839241028,,,,,, +17,59849,,,,,,,,,,,,0.08662990480661392,,,,,, +17,59899,,,,,,,,,,,,0.07396110892295837,,,,,, +17,59949,,,,,,,,,,,,0.07516954839229584,,,,,, +17,59999,,,,,,,,,,,,0.07219099998474121,,,,,, +17,60049,,,,,,,,,,,,0.07295620441436768,,,,,, +17,60099,,,,,,,,,,,,0.07316603511571884,,,,,, +17,60149,,,,,,,,,,,,0.08743312209844589,,,,,, +17,60199,,,,,,,,,,,,0.08490053564310074,,,,,, +17,60249,,,,,,,,,,,,0.10188581049442291,,,,,, +17,60299,,,,,,,,,,,,0.08008221536874771,,,,,, +17,60349,,,,,,,,,,,,0.07539157569408417,,,,,, +17,60399,,,,,,,,,,,,0.06787025928497314,,,,,, +17,60449,,,,,,,,,,,,0.09068246185779572,,,,,, +17,60499,,,,,,,,,,,,0.07579948008060455,,,,,, +17,60549,,,,,,,,,,,,0.09023873507976532,,,,,, +17,60599,,,,,,,,,,,,0.07955347001552582,,,,,, +17,60649,,,,,,,,,,,,0.07982771098613739,,,,,, +17,60699,,,,,,,,,,,,0.07372300326824188,,,,,, +17,60749,,,,,,,,,,,,0.08969929814338684,,,,,, +17,60799,,,,,,,,,,,,0.08157866448163986,,,,,, +17,60849,,,,,,,,,,,,0.06822879612445831,,,,,, +17,60899,,,,,,,,,,,,0.07029345631599426,,,,,, +17,60949,,,,,,,,,,,,0.07872886210680008,,,,,, +17,60999,,,,,,,,,,,,0.07742834091186523,,,,,, +17,61049,,,,,,,,,,,,0.08388950675725937,,,,,, +17,61099,,,,,,,,,,,,0.06842952966690063,,,,,, +17,61149,,,,,,,,,,,,0.07552766054868698,,,,,, +17,61199,,,,,,,,,,,,0.06946796178817749,,,,,, +17,61249,,,,,,,,,,,,0.07856620848178864,,,,,, +17,61299,,,,,,,,,,,,0.08938772976398468,,,,,, +17,61349,,,,,,,,,,,,0.07951759546995163,,,,,, +17,61399,,,,,,,,,,,,0.06902063637971878,,,,,, +17,61449,,,,,,,,,,,,0.07591802626848221,,,,,, +17,61499,,,,,,,,,,,,0.08294001966714859,,,,,, +17,61549,,,,,,,,,,,,0.07141067087650299,,,,,, +17,61599,,,,,,,,,,,,0.08259642124176025,,,,,, +17,61649,,,,,,,,,,,,0.08607732504606247,,,,,, +17,61699,,,,,,,,,,,,0.07365178316831589,,,,,, +17,61749,,,,,,,,,,,,0.0673796758055687,,,,,, +17,61799,,,,,,,,,,,,0.09298740327358246,,,,,, +17,61849,,,,,,,,,,,,0.07619902491569519,,,,,, +17,61899,,,,,,,,,,,,0.08765454590320587,,,,,, +17,61949,,,,,,,,,,,,0.08092700690031052,,,,,, +17,61955,,,,,,,,,,,,,0.23674097657203674,0.07703699916601181,0.2848244309425354,0.07296198606491089,0.2803892195224762,0.07703699916601181 +17,61955,,,,,,,0.24081222712993622,0.07871326059103012,0.22005395591259003,0.048381149768829346,0.19417019188404083,,,,,,, +18,61999,,,,,,,,,,,,0.08328995108604431,,,,,, +18,62049,,,,,,,,,,,,0.0814782902598381,,,,,, +18,62099,,,,,,,,,,,,0.0792265236377716,,,,,, +18,62149,,,,,,,,,,,,0.08471992611885071,,,,,, +18,62199,,,,,,,,,,,,0.07610352337360382,,,,,, +18,62249,,,,,,,,,,,,0.07433097064495087,,,,,, +18,62299,,,,,,,,,,,,0.08071444928646088,,,,,, +18,62349,,,,,,,,,,,,0.086793914437294,,,,,, +18,62399,,,,,,,,,,,,0.07676488161087036,,,,,, +18,62449,,,,,,,,,,,,0.08157207071781158,,,,,, +18,62499,,,,,,,,,,,,0.08705882728099823,,,,,, +18,62549,,,,,,,,,,,,0.07615282386541367,,,,,, +18,62599,,,,,,,,,,,,0.08562818169593811,,,,,, +18,62649,,,,,,,,,,,,0.07737992703914642,,,,,, +18,62699,,,,,,,,,,,,0.06544472277164459,,,,,, +18,62749,,,,,,,,,,,,0.08216474950313568,,,,,, +18,62799,,,,,,,,,,,,0.06921251863241196,,,,,, +18,62849,,,,,,,,,,,,0.09232601523399353,,,,,, +18,62899,,,,,,,,,,,,0.07940863072872162,,,,,, +18,62949,,,,,,,,,,,,0.07380397617816925,,,,,, +18,62999,,,,,,,,,,,,0.07369586825370789,,,,,, +18,63049,,,,,,,,,,,,0.08041355013847351,,,,,, +18,63099,,,,,,,,,,,,0.07469987869262695,,,,,, +18,63149,,,,,,,,,,,,0.07558886706829071,,,,,, +18,63199,,,,,,,,,,,,0.08188004046678543,,,,,, +18,63249,,,,,,,,,,,,0.08239665627479553,,,,,, +18,63299,,,,,,,,,,,,0.08201111853122711,,,,,, +18,63349,,,,,,,,,,,,0.0913504958152771,,,,,, +18,63399,,,,,,,,,,,,0.06773487478494644,,,,,, +18,63449,,,,,,,,,,,,0.0917493999004364,,,,,, +18,63499,,,,,,,,,,,,0.07597140967845917,,,,,, +18,63549,,,,,,,,,,,,0.08314988017082214,,,,,, +18,63599,,,,,,,,,,,,0.07269388437271118,,,,,, +18,63649,,,,,,,,,,,,0.08869495242834091,,,,,, +18,63699,,,,,,,,,,,,0.07687839865684509,,,,,, +18,63749,,,,,,,,,,,,0.07365782558917999,,,,,, +18,63799,,,,,,,,,,,,0.07716069370508194,,,,,, +18,63849,,,,,,,,,,,,0.08049210906028748,,,,,, +18,63899,,,,,,,,,,,,0.07301656901836395,,,,,, +18,63949,,,,,,,,,,,,0.08625553548336029,,,,,, +18,63999,,,,,,,,,,,,0.07515223324298859,,,,,, +18,64049,,,,,,,,,,,,0.07969887554645538,,,,,, +18,64099,,,,,,,,,,,,0.07486940920352936,,,,,, +18,64149,,,,,,,,,,,,0.0707021951675415,,,,,, +18,64199,,,,,,,,,,,,0.08036553859710693,,,,,, +18,64249,,,,,,,,,,,,0.07538440823554993,,,,,, +18,64299,,,,,,,,,,,,0.0826186090707779,,,,,, +18,64349,,,,,,,,,,,,0.07267651706933975,,,,,, +18,64399,,,,,,,,,,,,0.08248832821846008,,,,,, +18,64449,,,,,,,,,,,,0.08363466709852219,,,,,, +18,64499,,,,,,,,,,,,0.07964545488357544,,,,,, +18,64549,,,,,,,,,,,,0.10291396826505661,,,,,, +18,64599,,,,,,,,,,,,0.07491251081228256,,,,,, +18,64649,,,,,,,,,,,,0.08290977030992508,,,,,, +18,64699,,,,,,,,,,,,0.09205301105976105,,,,,, +18,64749,,,,,,,,,,,,0.07430155575275421,,,,,, +18,64799,,,,,,,,,,,,0.07453346252441406,,,,,, +18,64849,,,,,,,,,,,,0.07301902770996094,,,,,, +18,64899,,,,,,,,,,,,0.06580353528261185,,,,,, +18,64949,,,,,,,,,,,,0.08005619049072266,,,,,, +18,64999,,,,,,,,,,,,0.06869088113307953,,,,,, +18,65049,,,,,,,,,,,,0.07484768331050873,,,,,, +18,65099,,,,,,,,,,,,0.0713614672422409,,,,,, +18,65149,,,,,,,,,,,,0.08010700345039368,,,,,, +18,65199,,,,,,,,,,,,0.060203202068805695,,,,,, +18,65249,,,,,,,,,,,,0.07915379106998444,,,,,, +18,65299,,,,,,,,,,,,0.07429096102714539,,,,,, +18,65349,,,,,,,,,,,,0.07615511119365692,,,,,, +18,65397,,,,,,,,,,,,,0.2353561520576477,0.07738956063985825,0.31524255871772766,0.06871932744979858,0.3035137355327606,0.07738956063985825 +18,65397,,,,,,,0.2398340106010437,0.07819764316082001,0.23377038538455963,0.05461233854293823,0.2071659117937088,,,,,,, +19,65399,,,,,,,,,,,,0.07112599909305573,,,,,, +19,65449,,,,,,,,,,,,0.07753823697566986,,,,,, +19,65499,,,,,,,,,,,,0.07376618683338165,,,,,, +19,65549,,,,,,,,,,,,0.08190649747848511,,,,,, +19,65599,,,,,,,,,,,,0.0951383113861084,,,,,, +19,65649,,,,,,,,,,,,0.06562767922878265,,,,,, +19,65699,,,,,,,,,,,,0.06814825534820557,,,,,, +19,65749,,,,,,,,,,,,0.08300525695085526,,,,,, +19,65799,,,,,,,,,,,,0.09148918092250824,,,,,, +19,65849,,,,,,,,,,,,0.06718773394823074,,,,,, +19,65899,,,,,,,,,,,,0.07146695256233215,,,,,, +19,65949,,,,,,,,,,,,0.07372809946537018,,,,,, +19,65999,,,,,,,,,,,,0.07756975293159485,,,,,, +19,66049,,,,,,,,,,,,0.09283607453107834,,,,,, +19,66099,,,,,,,,,,,,0.08045946061611176,,,,,, +19,66149,,,,,,,,,,,,0.08996851742267609,,,,,, +19,66199,,,,,,,,,,,,0.07494843006134033,,,,,, +19,66249,,,,,,,,,,,,0.07877667248249054,,,,,, +19,66299,,,,,,,,,,,,0.07685734331607819,,,,,, +19,66349,,,,,,,,,,,,0.07670488953590393,,,,,, +19,66399,,,,,,,,,,,,0.0780939981341362,,,,,, +19,66449,,,,,,,,,,,,0.08185015618801117,,,,,, +19,66499,,,,,,,,,,,,0.08307688683271408,,,,,, +19,66549,,,,,,,,,,,,0.0660405084490776,,,,,, +19,66599,,,,,,,,,,,,0.07345367968082428,,,,,, +19,66649,,,,,,,,,,,,0.06950507313013077,,,,,, +19,66699,,,,,,,,,,,,0.08334320783615112,,,,,, +19,66749,,,,,,,,,,,,0.06955764442682266,,,,,, +19,66799,,,,,,,,,,,,0.0818319097161293,,,,,, +19,66849,,,,,,,,,,,,0.07213330268859863,,,,,, +19,66899,,,,,,,,,,,,0.07274651527404785,,,,,, +19,66949,,,,,,,,,,,,0.07564492523670197,,,,,, +19,66999,,,,,,,,,,,,0.08385592699050903,,,,,, +19,67049,,,,,,,,,,,,0.08672034740447998,,,,,, +19,67099,,,,,,,,,,,,0.06539583206176758,,,,,, +19,67149,,,,,,,,,,,,0.08202673494815826,,,,,, +19,67199,,,,,,,,,,,,0.08710455894470215,,,,,, +19,67249,,,,,,,,,,,,0.08409550040960312,,,,,, +19,67299,,,,,,,,,,,,0.07520618289709091,,,,,, +19,67349,,,,,,,,,,,,0.07317663729190826,,,,,, +19,67399,,,,,,,,,,,,0.07963784784078598,,,,,, +19,67449,,,,,,,,,,,,0.07050827890634537,,,,,, +19,67499,,,,,,,,,,,,0.07576332241296768,,,,,, +19,67549,,,,,,,,,,,,0.07567227631807327,,,,,, +19,67599,,,,,,,,,,,,0.08954170346260071,,,,,, +19,67649,,,,,,,,,,,,0.07190287113189697,,,,,, +19,67699,,,,,,,,,,,,0.07773544639348984,,,,,, +19,67749,,,,,,,,,,,,0.08183559775352478,,,,,, +19,67799,,,,,,,,,,,,0.07529956102371216,,,,,, +19,67849,,,,,,,,,,,,0.08869761973619461,,,,,, +19,67899,,,,,,,,,,,,0.07796187698841095,,,,,, +19,67949,,,,,,,,,,,,0.08782722800970078,,,,,, +19,67999,,,,,,,,,,,,0.07501531392335892,,,,,, +19,68049,,,,,,,,,,,,0.07798895239830017,,,,,, +19,68099,,,,,,,,,,,,0.07448804378509521,,,,,, +19,68149,,,,,,,,,,,,0.07857060432434082,,,,,, +19,68199,,,,,,,,,,,,0.08270153403282166,,,,,, +19,68249,,,,,,,,,,,,0.07144865393638611,,,,,, +19,68299,,,,,,,,,,,,0.07343120872974396,,,,,, +19,68349,,,,,,,,,,,,0.07685591280460358,,,,,, +19,68399,,,,,,,,,,,,0.08260862529277802,,,,,, +19,68449,,,,,,,,,,,,0.08056056499481201,,,,,, +19,68499,,,,,,,,,,,,0.08161541819572449,,,,,, +19,68549,,,,,,,,,,,,0.07490891218185425,,,,,, +19,68599,,,,,,,,,,,,0.07482431083917618,,,,,, +19,68649,,,,,,,,,,,,0.07782815396785736,,,,,, +19,68699,,,,,,,,,,,,0.07018207013607025,,,,,, +19,68749,,,,,,,,,,,,0.08999723941087723,,,,,, +19,68799,,,,,,,,,,,,0.0743301510810852,,,,,, +19,68839,,,,,,,,,,,,,0.23599901795387268,0.07713747024536133,0.2830342650413513,0.07175290584564209,0.26599815487861633,0.07713747024536133 +19,68839,,,,,,,0.2391946166753769,0.07785295695066452,0.24252331256866455,0.05878448486328125,0.21775096654891968,,,,,,, +20,68849,,,,,,,,,,,,0.0816611796617508,,,,,, +20,68899,,,,,,,,,,,,0.07634852826595306,,,,,, +20,68949,,,,,,,,,,,,0.07851041108369827,,,,,, +20,68999,,,,,,,,,,,,0.07094387710094452,,,,,, +20,69049,,,,,,,,,,,,0.07685311138629913,,,,,, +20,69099,,,,,,,,,,,,0.08068528771400452,,,,,, +20,69149,,,,,,,,,,,,0.0757126659154892,,,,,, +20,69199,,,,,,,,,,,,0.07136790454387665,,,,,, +20,69249,,,,,,,,,,,,0.08267484605312347,,,,,, +20,69299,,,,,,,,,,,,0.09182655811309814,,,,,, +20,69349,,,,,,,,,,,,0.07870417833328247,,,,,, +20,69399,,,,,,,,,,,,0.08170716464519501,,,,,, +20,69449,,,,,,,,,,,,0.08295638859272003,,,,,, +20,69499,,,,,,,,,,,,0.0867689847946167,,,,,, +20,69549,,,,,,,,,,,,0.08196921646595001,,,,,, +20,69599,,,,,,,,,,,,0.07635083794593811,,,,,, +20,69649,,,,,,,,,,,,0.08856277912855148,,,,,, +20,69699,,,,,,,,,,,,0.07184910029172897,,,,,, +20,69749,,,,,,,,,,,,0.08479296416044235,,,,,, +20,69799,,,,,,,,,,,,0.06165763735771179,,,,,, +20,69849,,,,,,,,,,,,0.07604973018169403,,,,,, +20,69899,,,,,,,,,,,,0.08422328531742096,,,,,, +20,69949,,,,,,,,,,,,0.07296514511108398,,,,,, +20,69999,,,,,,,,,,,,0.08258441090583801,,,,,, +20,70049,,,,,,,,,,,,0.07920032739639282,,,,,, +20,70099,,,,,,,,,,,,0.06973404437303543,,,,,, +20,70149,,,,,,,,,,,,0.08181995153427124,,,,,, +20,70199,,,,,,,,,,,,0.07190662622451782,,,,,, +20,70249,,,,,,,,,,,,0.0814163014292717,,,,,, +20,70299,,,,,,,,,,,,0.07982371002435684,,,,,, +20,70349,,,,,,,,,,,,0.07254048436880112,,,,,, +20,70399,,,,,,,,,,,,0.07456585764884949,,,,,, +20,70449,,,,,,,,,,,,0.08206970989704132,,,,,, +20,70499,,,,,,,,,,,,0.06769052892923355,,,,,, +20,70549,,,,,,,,,,,,0.07522308826446533,,,,,, +20,70599,,,,,,,,,,,,0.06933082640171051,,,,,, +20,70649,,,,,,,,,,,,0.07323455810546875,,,,,, +20,70699,,,,,,,,,,,,0.07238365709781647,,,,,, +20,70749,,,,,,,,,,,,0.07570313662290573,,,,,, +20,70799,,,,,,,,,,,,0.06857890635728836,,,,,, +20,70849,,,,,,,,,,,,0.08227625489234924,,,,,, +20,70899,,,,,,,,,,,,0.07598784565925598,,,,,, +20,70949,,,,,,,,,,,,0.06939898431301117,,,,,, +20,70999,,,,,,,,,,,,0.0771745964884758,,,,,, +20,71049,,,,,,,,,,,,0.07905511558055878,,,,,, +20,71099,,,,,,,,,,,,0.07413850724697113,,,,,, +20,71149,,,,,,,,,,,,0.07668863236904144,,,,,, +20,71199,,,,,,,,,,,,0.06873434782028198,,,,,, +20,71249,,,,,,,,,,,,0.09055745601654053,,,,,, +20,71299,,,,,,,,,,,,0.07741032540798187,,,,,, +20,71349,,,,,,,,,,,,0.08321906626224518,,,,,, +20,71399,,,,,,,,,,,,0.08592314273118973,,,,,, +20,71449,,,,,,,,,,,,0.07412448525428772,,,,,, +20,71499,,,,,,,,,,,,0.09345261752605438,,,,,, +20,71549,,,,,,,,,,,,0.07166363298892975,,,,,, +20,71599,,,,,,,,,,,,0.06397274136543274,,,,,, +20,71649,,,,,,,,,,,,0.07926318049430847,,,,,, +20,71699,,,,,,,,,,,,0.0806780755519867,,,,,, +20,71749,,,,,,,,,,,,0.06777432560920715,,,,,, +20,71799,,,,,,,,,,,,0.06769050657749176,,,,,, +20,71849,,,,,,,,,,,,0.06819520145654678,,,,,, +20,71899,,,,,,,,,,,,0.08258610218763351,,,,,, +20,71949,,,,,,,,,,,,0.08559389412403107,,,,,, +20,71999,,,,,,,,,,,,0.07602712512016296,,,,,, +20,72049,,,,,,,,,,,,0.0755491554737091,,,,,, +20,72099,,,,,,,,,,,,0.07508435845375061,,,,,, +20,72149,,,,,,,,,,,,0.07511122524738312,,,,,, +20,72199,,,,,,,,,,,,0.07072034478187561,,,,,, +20,72249,,,,,,,,,,,,0.08608444035053253,,,,,, +20,72281,,,,,,,,,,,,,0.23331856727600098,0.07603366672992706,0.3197905421257019,0.08503574132919312,0.30882126092910767,0.07603366672992706 +20,72281,,,,,,,0.2384468913078308,0.07744285464286804,0.25255072116851807,0.06374114751815796,0.2288673222064972,,,,,,, +21,72299,,,,,,,,,,,,0.08114805817604065,,,,,, +21,72349,,,,,,,,,,,,0.08337846398353577,,,,,, +21,72399,,,,,,,,,,,,0.07958763092756271,,,,,, +21,72449,,,,,,,,,,,,0.07661646604537964,,,,,, +21,72499,,,,,,,,,,,,0.0719485729932785,,,,,, +21,72549,,,,,,,,,,,,0.07711176574230194,,,,,, +21,72599,,,,,,,,,,,,0.09303539991378784,,,,,, +21,72649,,,,,,,,,,,,0.07807420939207077,,,,,, +21,72699,,,,,,,,,,,,0.07847873866558075,,,,,, +21,72749,,,,,,,,,,,,0.06894557178020477,,,,,, +21,72799,,,,,,,,,,,,0.07078269869089127,,,,,, +21,72849,,,,,,,,,,,,0.07262586057186127,,,,,, +21,72899,,,,,,,,,,,,0.07085821032524109,,,,,, +21,72949,,,,,,,,,,,,0.06993147730827332,,,,,, +21,72999,,,,,,,,,,,,0.08019313216209412,,,,,, +21,73049,,,,,,,,,,,,0.08037523925304413,,,,,, +21,73099,,,,,,,,,,,,0.07582859694957733,,,,,, +21,73149,,,,,,,,,,,,0.07602029293775558,,,,,, +21,73199,,,,,,,,,,,,0.07981410622596741,,,,,, +21,73249,,,,,,,,,,,,0.08029468357563019,,,,,, +21,73299,,,,,,,,,,,,0.06650948524475098,,,,,, +21,73349,,,,,,,,,,,,0.0847606360912323,,,,,, +21,73399,,,,,,,,,,,,0.08335527777671814,,,,,, +21,73449,,,,,,,,,,,,0.08001907914876938,,,,,, +21,73499,,,,,,,,,,,,0.07245779782533646,,,,,, +21,73549,,,,,,,,,,,,0.07711214572191238,,,,,, +21,73599,,,,,,,,,,,,0.07868523895740509,,,,,, +21,73649,,,,,,,,,,,,0.07528212666511536,,,,,, +21,73699,,,,,,,,,,,,0.06940194219350815,,,,,, +21,73749,,,,,,,,,,,,0.06977848708629608,,,,,, +21,73799,,,,,,,,,,,,0.07961636781692505,,,,,, +21,73849,,,,,,,,,,,,0.0769762471318245,,,,,, +21,73899,,,,,,,,,,,,0.07901139557361603,,,,,, +21,73949,,,,,,,,,,,,0.08070887625217438,,,,,, +21,73999,,,,,,,,,,,,0.07187287509441376,,,,,, +21,74049,,,,,,,,,,,,0.0811433345079422,,,,,, +21,74099,,,,,,,,,,,,0.08378077298402786,,,,,, +21,74149,,,,,,,,,,,,0.08359117805957794,,,,,, +21,74199,,,,,,,,,,,,0.07858078926801682,,,,,, +21,74249,,,,,,,,,,,,0.07846545428037643,,,,,, +21,74299,,,,,,,,,,,,0.07391967624425888,,,,,, +21,74349,,,,,,,,,,,,0.07708312571048737,,,,,, +21,74399,,,,,,,,,,,,0.06406861543655396,,,,,, +21,74449,,,,,,,,,,,,0.08083775639533997,,,,,, +21,74499,,,,,,,,,,,,0.08085240423679352,,,,,, +21,74549,,,,,,,,,,,,0.07679000496864319,,,,,, +21,74599,,,,,,,,,,,,0.07730957865715027,,,,,, +21,74649,,,,,,,,,,,,0.07981155812740326,,,,,, +21,74699,,,,,,,,,,,,0.07502321898937225,,,,,, +21,74749,,,,,,,,,,,,0.07453758269548416,,,,,, +21,74799,,,,,,,,,,,,0.07515642046928406,,,,,, +21,74849,,,,,,,,,,,,0.0797336995601654,,,,,, +21,74899,,,,,,,,,,,,0.08361378312110901,,,,,, +21,74949,,,,,,,,,,,,0.0742746889591217,,,,,, +21,74999,,,,,,,,,,,,0.06053324043750763,,,,,, +21,75049,,,,,,,,,,,,0.08628146350383759,,,,,, +21,75099,,,,,,,,,,,,0.07720515131950378,,,,,, +21,75149,,,,,,,,,,,,0.06953328102827072,,,,,, +21,75199,,,,,,,,,,,,0.07915720343589783,,,,,, +21,75249,,,,,,,,,,,,0.076300248503685,,,,,, +21,75299,,,,,,,,,,,,0.06653282046318054,,,,,, +21,75349,,,,,,,,,,,,0.07287214696407318,,,,,, +21,75399,,,,,,,,,,,,0.08138564974069595,,,,,, +21,75449,,,,,,,,,,,,0.06416536122560501,,,,,, +21,75499,,,,,,,,,,,,0.08245109021663666,,,,,, +21,75549,,,,,,,,,,,,0.06967274099588394,,,,,, +21,75599,,,,,,,,,,,,0.0838790237903595,,,,,, +21,75649,,,,,,,,,,,,0.06797851622104645,,,,,, +21,75699,,,,,,,,,,,,0.07869531214237213,,,,,, +21,75723,,,,,,,,,,,,,0.23340150713920593,0.07743296027183533,0.3331455588340759,0.06819707155227661,0.3274621069431305,0.07743296027183533 +21,75723,,,,,,,0.23765717446804047,0.07703559100627899,0.26209500432014465,0.06867480278015137,0.23946872353553772,,,,,,, +22,75749,,,,,,,,,,,,0.06432013213634491,,,,,, +22,75799,,,,,,,,,,,,0.06867468357086182,,,,,, +22,75849,,,,,,,,,,,,0.07434432953596115,,,,,, +22,75899,,,,,,,,,,,,0.08323048800230026,,,,,, +22,75949,,,,,,,,,,,,0.06357785314321518,,,,,, +22,75999,,,,,,,,,,,,0.07890161871910095,,,,,, +22,76049,,,,,,,,,,,,0.08549328148365021,,,,,, +22,76099,,,,,,,,,,,,0.07695674151182175,,,,,, +22,76149,,,,,,,,,,,,0.0961100235581398,,,,,, +22,76199,,,,,,,,,,,,0.082766592502594,,,,,, +22,76249,,,,,,,,,,,,0.07171445339918137,,,,,, +22,76299,,,,,,,,,,,,0.07750659435987473,,,,,, +22,76349,,,,,,,,,,,,0.08639641106128693,,,,,, +22,76399,,,,,,,,,,,,0.07185269147157669,,,,,, +22,76449,,,,,,,,,,,,0.08966802060604095,,,,,, +22,76499,,,,,,,,,,,,0.06685854494571686,,,,,, +22,76549,,,,,,,,,,,,0.07824009656906128,,,,,, +22,76599,,,,,,,,,,,,0.09507999569177628,,,,,, +22,76649,,,,,,,,,,,,0.07707993686199188,,,,,, +22,76699,,,,,,,,,,,,0.07988246530294418,,,,,, +22,76749,,,,,,,,,,,,0.0731416568160057,,,,,, +22,76799,,,,,,,,,,,,0.06986583769321442,,,,,, +22,76849,,,,,,,,,,,,0.07379613816738129,,,,,, +22,76899,,,,,,,,,,,,0.06768488883972168,,,,,, +22,76949,,,,,,,,,,,,0.07969807833433151,,,,,, +22,76999,,,,,,,,,,,,0.08525843918323517,,,,,, +22,77049,,,,,,,,,,,,0.06651465594768524,,,,,, +22,77099,,,,,,,,,,,,0.06234725937247276,,,,,, +22,77149,,,,,,,,,,,,0.08088526129722595,,,,,, +22,77199,,,,,,,,,,,,0.07739619165658951,,,,,, +22,77249,,,,,,,,,,,,0.07164303958415985,,,,,, +22,77299,,,,,,,,,,,,0.08122602850198746,,,,,, +22,77349,,,,,,,,,,,,0.07828840613365173,,,,,, +22,77399,,,,,,,,,,,,0.08835218846797943,,,,,, +22,77449,,,,,,,,,,,,0.07580287754535675,,,,,, +22,77499,,,,,,,,,,,,0.05799416825175285,,,,,, +22,77549,,,,,,,,,,,,0.07431883364915848,,,,,, +22,77599,,,,,,,,,,,,0.07831494510173798,,,,,, +22,77649,,,,,,,,,,,,0.08858713507652283,,,,,, +22,77699,,,,,,,,,,,,0.07979142665863037,,,,,, +22,77749,,,,,,,,,,,,0.07763281464576721,,,,,, +22,77799,,,,,,,,,,,,0.08077489584684372,,,,,, +22,77849,,,,,,,,,,,,0.07411585748195648,,,,,, +22,77899,,,,,,,,,,,,0.07074905931949615,,,,,, +22,77949,,,,,,,,,,,,0.06683805584907532,,,,,, +22,77999,,,,,,,,,,,,0.08156420290470123,,,,,, +22,78049,,,,,,,,,,,,0.07461165636777878,,,,,, +22,78099,,,,,,,,,,,,0.07337388396263123,,,,,, +22,78149,,,,,,,,,,,,0.07313843071460724,,,,,, +22,78199,,,,,,,,,,,,0.06765531003475189,,,,,, +22,78249,,,,,,,,,,,,0.0798293873667717,,,,,, +22,78299,,,,,,,,,,,,0.07492928206920624,,,,,, +22,78349,,,,,,,,,,,,0.07666762173175812,,,,,, +22,78399,,,,,,,,,,,,0.08848461508750916,,,,,, +22,78449,,,,,,,,,,,,0.07181884348392487,,,,,, +22,78499,,,,,,,,,,,,0.07355909049510956,,,,,, +22,78549,,,,,,,,,,,,0.07579600811004639,,,,,, +22,78599,,,,,,,,,,,,0.06867141276597977,,,,,, +22,78649,,,,,,,,,,,,0.07486911118030548,,,,,, +22,78699,,,,,,,,,,,,0.06231202185153961,,,,,, +22,78749,,,,,,,,,,,,0.07197975367307663,,,,,, +22,78799,,,,,,,,,,,,0.07271824777126312,,,,,, +22,78849,,,,,,,,,,,,0.08272380381822586,,,,,, +22,78899,,,,,,,,,,,,0.07499073445796967,,,,,, +22,78949,,,,,,,,,,,,0.08861672878265381,,,,,, +22,78999,,,,,,,,,,,,0.06528814136981964,,,,,, +22,79049,,,,,,,,,,,,0.08617761731147766,,,,,, +22,79099,,,,,,,,,,,,0.08357638120651245,,,,,, +22,79149,,,,,,,,,,,,0.07456144690513611,,,,,, +22,79165,,,,,,,,,,,,,0.2338307797908783,0.07793878018856049,0.31153982877731323,0.062110185623168945,0.29518377780914307,0.07793878018856049 +22,79165,,,,,,,0.23705840110778809,0.07673965394496918,0.2688297629356384,0.07224500179290771,0.24675887823104858,,,,,,, +23,79199,,,,,,,,,,,,0.07527171820402145,,,,,, +23,79249,,,,,,,,,,,,0.08804330229759216,,,,,, +23,79299,,,,,,,,,,,,0.07013354450464249,,,,,, +23,79349,,,,,,,,,,,,0.07264792919158936,,,,,, +23,79399,,,,,,,,,,,,0.08304283767938614,,,,,, +23,79449,,,,,,,,,,,,0.08334967494010925,,,,,, +23,79499,,,,,,,,,,,,0.08460842818021774,,,,,, +23,79549,,,,,,,,,,,,0.08539075404405594,,,,,, +23,79599,,,,,,,,,,,,0.08500635623931885,,,,,, +23,79649,,,,,,,,,,,,0.0777597650885582,,,,,, +23,79699,,,,,,,,,,,,0.07149796187877655,,,,,, +23,79749,,,,,,,,,,,,0.0809350237250328,,,,,, +23,79799,,,,,,,,,,,,0.08648587763309479,,,,,, +23,79849,,,,,,,,,,,,0.0762326642870903,,,,,, +23,79899,,,,,,,,,,,,0.07383056730031967,,,,,, +23,79949,,,,,,,,,,,,0.07436062395572662,,,,,, +23,79999,,,,,,,,,,,,0.07258601486682892,,,,,, +23,80049,,,,,,,,,,,,0.07682684063911438,,,,,, +23,80099,,,,,,,,,,,,0.0772591307759285,,,,,, +23,80149,,,,,,,,,,,,0.0817733034491539,,,,,, +23,80199,,,,,,,,,,,,0.0787418931722641,,,,,, +23,80249,,,,,,,,,,,,0.07223397493362427,,,,,, +23,80299,,,,,,,,,,,,0.06889045238494873,,,,,, +23,80349,,,,,,,,,,,,0.07384892553091049,,,,,, +23,80399,,,,,,,,,,,,0.07397739589214325,,,,,, +23,80449,,,,,,,,,,,,0.08331367373466492,,,,,, +23,80499,,,,,,,,,,,,0.079883873462677,,,,,, +23,80549,,,,,,,,,,,,0.07754041254520416,,,,,, +23,80599,,,,,,,,,,,,0.08030476421117783,,,,,, +23,80649,,,,,,,,,,,,0.06916064769029617,,,,,, +23,80699,,,,,,,,,,,,0.07435936480760574,,,,,, +23,80749,,,,,,,,,,,,0.08278703689575195,,,,,, +23,80799,,,,,,,,,,,,0.07428251951932907,,,,,, +23,80849,,,,,,,,,,,,0.07717962563037872,,,,,, +23,80899,,,,,,,,,,,,0.07757025957107544,,,,,, +23,80949,,,,,,,,,,,,0.07665856182575226,,,,,, +23,80999,,,,,,,,,,,,0.0810258612036705,,,,,, +23,81049,,,,,,,,,,,,0.07383819669485092,,,,,, +23,81099,,,,,,,,,,,,0.07807715982198715,,,,,, +23,81149,,,,,,,,,,,,0.06801799684762955,,,,,, +23,81199,,,,,,,,,,,,0.07645642757415771,,,,,, +23,81249,,,,,,,,,,,,0.0775044858455658,,,,,, +23,81299,,,,,,,,,,,,0.07527957856655121,,,,,, +23,81349,,,,,,,,,,,,0.09101296961307526,,,,,, +23,81399,,,,,,,,,,,,0.09087202697992325,,,,,, +23,81449,,,,,,,,,,,,0.077104851603508,,,,,, +23,81499,,,,,,,,,,,,0.08526423573493958,,,,,, +23,81549,,,,,,,,,,,,0.07271968573331833,,,,,, +23,81599,,,,,,,,,,,,0.08131466805934906,,,,,, +23,81649,,,,,,,,,,,,0.08631829172372818,,,,,, +23,81699,,,,,,,,,,,,0.0803626999258995,,,,,, +23,81749,,,,,,,,,,,,0.06767915189266205,,,,,, +23,81799,,,,,,,,,,,,0.08281422406435013,,,,,, +23,81849,,,,,,,,,,,,0.07824836671352386,,,,,, +23,81899,,,,,,,,,,,,0.07597213983535767,,,,,, +23,81949,,,,,,,,,,,,0.07239583879709244,,,,,, +23,81999,,,,,,,,,,,,0.07739131897687912,,,,,, +23,82049,,,,,,,,,,,,0.08631548285484314,,,,,, +23,82099,,,,,,,,,,,,0.07538365572690964,,,,,, +23,82149,,,,,,,,,,,,0.07896432280540466,,,,,, +23,82199,,,,,,,,,,,,0.08207321166992188,,,,,, +23,82249,,,,,,,,,,,,0.07531288266181946,,,,,, +23,82299,,,,,,,,,,,,0.07485757023096085,,,,,, +23,82349,,,,,,,,,,,,0.07636306434869766,,,,,, +23,82399,,,,,,,,,,,,0.07749685645103455,,,,,, +23,82449,,,,,,,,,,,,0.07239407300949097,,,,,, +23,82499,,,,,,,,,,,,0.08197982609272003,,,,,, +23,82549,,,,,,,,,,,,0.0863465815782547,,,,,, +23,82599,,,,,,,,,,,,0.08793659508228302,,,,,, +23,82607,,,,,,,,,,,,,0.23218899965286255,0.0765569657087326,0.34739184379577637,0.07873857021331787,0.3422885835170746,0.0765569657087326 +23,82607,,,,,,,0.23631501197814941,0.07637852430343628,0.2768420875072479,0.07661569118499756,0.2554788291454315,,,,,,, +24,82649,,,,,,,,,,,,0.08348853886127472,,,,,, +24,82699,,,,,,,,,,,,0.07036904245615005,,,,,, +24,82749,,,,,,,,,,,,0.07303495705127716,,,,,, +24,82799,,,,,,,,,,,,0.0778099000453949,,,,,, +24,82849,,,,,,,,,,,,0.07355658710002899,,,,,, +24,82899,,,,,,,,,,,,0.07895990461111069,,,,,, +24,82949,,,,,,,,,,,,0.08974245190620422,,,,,, +24,82999,,,,,,,,,,,,0.07456323504447937,,,,,, +24,83049,,,,,,,,,,,,0.07209469377994537,,,,,, +24,83099,,,,,,,,,,,,0.0695544183254242,,,,,, +24,83149,,,,,,,,,,,,0.07416128367185593,,,,,, +24,83199,,,,,,,,,,,,0.09120786935091019,,,,,, +24,83249,,,,,,,,,,,,0.08113441616296768,,,,,, +24,83299,,,,,,,,,,,,0.073238305747509,,,,,, +24,83349,,,,,,,,,,,,0.07971946895122528,,,,,, +24,83399,,,,,,,,,,,,0.08218519389629364,,,,,, +24,83449,,,,,,,,,,,,0.06833118200302124,,,,,, +24,83499,,,,,,,,,,,,0.059279292821884155,,,,,, +24,83549,,,,,,,,,,,,0.07579778134822845,,,,,, +24,83599,,,,,,,,,,,,0.08171519637107849,,,,,, +24,83649,,,,,,,,,,,,0.08478660136461258,,,,,, +24,83699,,,,,,,,,,,,0.08343511819839478,,,,,, +24,83749,,,,,,,,,,,,0.08363258838653564,,,,,, +24,83799,,,,,,,,,,,,0.0881662517786026,,,,,, +24,83849,,,,,,,,,,,,0.08158170431852341,,,,,, +24,83899,,,,,,,,,,,,0.09414677321910858,,,,,, +24,83949,,,,,,,,,,,,0.06740421056747437,,,,,, +24,83999,,,,,,,,,,,,0.07684141397476196,,,,,, +24,84049,,,,,,,,,,,,0.08301649987697601,,,,,, +24,84099,,,,,,,,,,,,0.07556279003620148,,,,,, +24,84149,,,,,,,,,,,,0.0772974044084549,,,,,, +24,84199,,,,,,,,,,,,0.07844124734401703,,,,,, +24,84249,,,,,,,,,,,,0.06544777750968933,,,,,, +24,84299,,,,,,,,,,,,0.07909214496612549,,,,,, +24,84349,,,,,,,,,,,,0.06830725818872452,,,,,, +24,84399,,,,,,,,,,,,0.07405334711074829,,,,,, +24,84449,,,,,,,,,,,,0.07398514449596405,,,,,, +24,84499,,,,,,,,,,,,0.06618522107601166,,,,,, +24,84549,,,,,,,,,,,,0.06470531225204468,,,,,, +24,84599,,,,,,,,,,,,0.07677518576383591,,,,,, +24,84649,,,,,,,,,,,,0.0758109986782074,,,,,, +24,84699,,,,,,,,,,,,0.07289350032806396,,,,,, +24,84749,,,,,,,,,,,,0.07423555850982666,,,,,, +24,84799,,,,,,,,,,,,0.0779816210269928,,,,,, +24,84849,,,,,,,,,,,,0.07684782147407532,,,,,, +24,84899,,,,,,,,,,,,0.08090956509113312,,,,,, +24,84949,,,,,,,,,,,,0.09126445651054382,,,,,, +24,84999,,,,,,,,,,,,0.08287981152534485,,,,,, +24,85049,,,,,,,,,,,,0.07613740116357803,,,,,, +24,85099,,,,,,,,,,,,0.06062743067741394,,,,,, +24,85149,,,,,,,,,,,,0.08741310238838196,,,,,, +24,85199,,,,,,,,,,,,0.06641636788845062,,,,,, +24,85249,,,,,,,,,,,,0.07961583137512207,,,,,, +24,85299,,,,,,,,,,,,0.0719062089920044,,,,,, +24,85349,,,,,,,,,,,,0.07463770359754562,,,,,, +24,85399,,,,,,,,,,,,0.07886025309562683,,,,,, +24,85449,,,,,,,,,,,,0.07672750949859619,,,,,, +24,85499,,,,,,,,,,,,0.0698714628815651,,,,,, +24,85549,,,,,,,,,,,,0.07504115998744965,,,,,, +24,85599,,,,,,,,,,,,0.06508806347846985,,,,,, +24,85649,,,,,,,,,,,,0.07824848592281342,,,,,, +24,85699,,,,,,,,,,,,0.07520470023155212,,,,,, +24,85749,,,,,,,,,,,,0.0830976814031601,,,,,, +24,85799,,,,,,,,,,,,0.08025574684143066,,,,,, +24,85849,,,,,,,,,,,,0.07545166462659836,,,,,, +24,85899,,,,,,,,,,,,0.07229449599981308,,,,,, +24,85949,,,,,,,,,,,,0.0680941641330719,,,,,, +24,85999,,,,,,,,,,,,0.07873184233903885,,,,,, +24,86049,,,,,,,,,,,,0.08413537591695786,,,,,, +24,86049,,,,,,,,,,,,,0.2324116975069046,0.07556383311748505,0.3231976628303528,0.09068953990936279,0.3143708109855652,0.07556383311748505 +24,86049,,,,,,,0.23592841625213623,0.07615624368190765,0.28164228796958923,0.07930135726928711,0.2602706849575043,,,,,,, +25,86099,,,,,,,,,,,,0.08232387155294418,,,,,, +25,86149,,,,,,,,,,,,0.07450199127197266,,,,,, +25,86199,,,,,,,,,,,,0.07703553140163422,,,,,, +25,86249,,,,,,,,,,,,0.06806337833404541,,,,,, +25,86299,,,,,,,,,,,,0.06764675676822662,,,,,, +25,86349,,,,,,,,,,,,0.07311945408582687,,,,,, +25,86399,,,,,,,,,,,,0.08576220273971558,,,,,, +25,86449,,,,,,,,,,,,0.06857314705848694,,,,,, +25,86499,,,,,,,,,,,,0.08508004248142242,,,,,, +25,86549,,,,,,,,,,,,0.0781044065952301,,,,,, +25,86599,,,,,,,,,,,,0.08272281289100647,,,,,, +25,86649,,,,,,,,,,,,0.0751245990395546,,,,,, +25,86699,,,,,,,,,,,,0.08030779659748077,,,,,, +25,86749,,,,,,,,,,,,0.07192977517843246,,,,,, +25,86799,,,,,,,,,,,,0.08151187747716904,,,,,, +25,86849,,,,,,,,,,,,0.08072347193956375,,,,,, +25,86899,,,,,,,,,,,,0.08150888979434967,,,,,, +25,86949,,,,,,,,,,,,0.0670313760638237,,,,,, +25,86999,,,,,,,,,,,,0.08107641339302063,,,,,, +25,87049,,,,,,,,,,,,0.08350469172000885,,,,,, +25,87099,,,,,,,,,,,,0.08511921763420105,,,,,, +25,87149,,,,,,,,,,,,0.07654711604118347,,,,,, +25,87199,,,,,,,,,,,,0.07523664087057114,,,,,, +25,87249,,,,,,,,,,,,0.08111359179019928,,,,,, +25,87299,,,,,,,,,,,,0.06921321898698807,,,,,, +25,87349,,,,,,,,,,,,0.0721207708120346,,,,,, +25,87399,,,,,,,,,,,,0.07010145485401154,,,,,, +25,87449,,,,,,,,,,,,0.07469425350427628,,,,,, +25,87499,,,,,,,,,,,,0.07485134154558182,,,,,, +25,87549,,,,,,,,,,,,0.07303391396999359,,,,,, +25,87599,,,,,,,,,,,,0.06933664530515671,,,,,, +25,87649,,,,,,,,,,,,0.07420257478952408,,,,,, +25,87699,,,,,,,,,,,,0.07856573164463043,,,,,, +25,87749,,,,,,,,,,,,0.08325069397687912,,,,,, +25,87799,,,,,,,,,,,,0.0748322606086731,,,,,, +25,87849,,,,,,,,,,,,0.07865895330905914,,,,,, +25,87899,,,,,,,,,,,,0.07775770872831345,,,,,, +25,87949,,,,,,,,,,,,0.07086113095283508,,,,,, +25,87999,,,,,,,,,,,,0.07632432878017426,,,,,, +25,88049,,,,,,,,,,,,0.06928259879350662,,,,,, +25,88099,,,,,,,,,,,,0.07452656328678131,,,,,, +25,88149,,,,,,,,,,,,0.07262223213911057,,,,,, +25,88199,,,,,,,,,,,,0.06513919681310654,,,,,, +25,88249,,,,,,,,,,,,0.07381096482276917,,,,,, +25,88299,,,,,,,,,,,,0.0813201516866684,,,,,, +25,88349,,,,,,,,,,,,0.07566466927528381,,,,,, +25,88399,,,,,,,,,,,,0.0755707323551178,,,,,, +25,88449,,,,,,,,,,,,0.06968952715396881,,,,,, +25,88499,,,,,,,,,,,,0.07327821850776672,,,,,, +25,88549,,,,,,,,,,,,0.0756264328956604,,,,,, +25,88599,,,,,,,,,,,,0.06597469002008438,,,,,, +25,88649,,,,,,,,,,,,0.065166175365448,,,,,, +25,88699,,,,,,,,,,,,0.06383679807186127,,,,,, +25,88749,,,,,,,,,,,,0.07421638071537018,,,,,, +25,88799,,,,,,,,,,,,0.07753419876098633,,,,,, +25,88849,,,,,,,,,,,,0.07543481886386871,,,,,, +25,88899,,,,,,,,,,,,0.07184575498104095,,,,,, +25,88949,,,,,,,,,,,,0.08366739749908447,,,,,, +25,88999,,,,,,,,,,,,0.06993411481380463,,,,,, +25,89049,,,,,,,,,,,,0.08845896273851395,,,,,, +25,89099,,,,,,,,,,,,0.08144054561853409,,,,,, +25,89149,,,,,,,,,,,,0.08578123152256012,,,,,, +25,89199,,,,,,,,,,,,0.07919562608003616,,,,,, +25,89249,,,,,,,,,,,,0.0762455016374588,,,,,, +25,89299,,,,,,,,,,,,0.08674337714910507,,,,,, +25,89349,,,,,,,,,,,,0.06525091826915741,,,,,, +25,89399,,,,,,,,,,,,0.08213065564632416,,,,,, +25,89449,,,,,,,,,,,,0.07818780839443207,,,,,, +25,89491,,,,,,,,,,,,,0.2312604784965515,0.07535327970981598,0.33272698521614075,0.09322333335876465,0.3214854598045349,0.07535327970981598 +25,89491,,,,,,,0.23531778156757355,0.07582350075244904,0.2886851131916046,0.08331626653671265,0.26796796917915344,,,,,,, +26,89499,,,,,,,,,,,,0.07158596068620682,,,,,, +26,89549,,,,,,,,,,,,0.07314164936542511,,,,,, +26,89599,,,,,,,,,,,,0.06733551621437073,,,,,, +26,89649,,,,,,,,,,,,0.0773293599486351,,,,,, +26,89699,,,,,,,,,,,,0.07603346556425095,,,,,, +26,89749,,,,,,,,,,,,0.08938615024089813,,,,,, +26,89799,,,,,,,,,,,,0.08255719393491745,,,,,, +26,89849,,,,,,,,,,,,0.07647069543600082,,,,,, +26,89899,,,,,,,,,,,,0.08283408731222153,,,,,, +26,89949,,,,,,,,,,,,0.08256520330905914,,,,,, +26,89999,,,,,,,,,,,,0.06985725462436676,,,,,, +26,90049,,,,,,,,,,,,0.0754217654466629,,,,,, +26,90099,,,,,,,,,,,,0.07105313986539841,,,,,, +26,90149,,,,,,,,,,,,0.07694177329540253,,,,,, +26,90199,,,,,,,,,,,,0.07310109585523605,,,,,, +26,90249,,,,,,,,,,,,0.07469732314348221,,,,,, +26,90299,,,,,,,,,,,,0.08276273310184479,,,,,, +26,90349,,,,,,,,,,,,0.07556092739105225,,,,,, +26,90399,,,,,,,,,,,,0.07847261428833008,,,,,, +26,90449,,,,,,,,,,,,0.06476804614067078,,,,,, +26,90499,,,,,,,,,,,,0.0684875100851059,,,,,, +26,90549,,,,,,,,,,,,0.07758453488349915,,,,,, +26,90599,,,,,,,,,,,,0.07436513155698776,,,,,, +26,90649,,,,,,,,,,,,0.084623783826828,,,,,, +26,90699,,,,,,,,,,,,0.0787547379732132,,,,,, +26,90749,,,,,,,,,,,,0.08295992761850357,,,,,, +26,90799,,,,,,,,,,,,0.06779827177524567,,,,,, +26,90849,,,,,,,,,,,,0.070529505610466,,,,,, +26,90899,,,,,,,,,,,,0.08554310351610184,,,,,, +26,90949,,,,,,,,,,,,0.06976625323295593,,,,,, +26,90999,,,,,,,,,,,,0.07182362675666809,,,,,, +26,91049,,,,,,,,,,,,0.07052098214626312,,,,,, +26,91099,,,,,,,,,,,,0.06750287115573883,,,,,, +26,91149,,,,,,,,,,,,0.08223995566368103,,,,,, +26,91199,,,,,,,,,,,,0.08353891223669052,,,,,, +26,91249,,,,,,,,,,,,0.06847019493579865,,,,,, +26,91299,,,,,,,,,,,,0.08936642110347748,,,,,, +26,91349,,,,,,,,,,,,0.08045168220996857,,,,,, +26,91399,,,,,,,,,,,,0.07702334970235825,,,,,, +26,91449,,,,,,,,,,,,0.08048282563686371,,,,,, +26,91499,,,,,,,,,,,,0.08160679042339325,,,,,, +26,91549,,,,,,,,,,,,0.07662519812583923,,,,,, +26,91599,,,,,,,,,,,,0.08073706924915314,,,,,, +26,91649,,,,,,,,,,,,0.0748172402381897,,,,,, +26,91699,,,,,,,,,,,,0.08253446221351624,,,,,, +26,91749,,,,,,,,,,,,0.090146005153656,,,,,, +26,91799,,,,,,,,,,,,0.07856466621160507,,,,,, +26,91849,,,,,,,,,,,,0.07275831699371338,,,,,, +26,91899,,,,,,,,,,,,0.06113196164369583,,,,,, +26,91949,,,,,,,,,,,,0.06727731972932816,,,,,, +26,91999,,,,,,,,,,,,0.06922977417707443,,,,,, +26,92049,,,,,,,,,,,,0.0638970285654068,,,,,, +26,92099,,,,,,,,,,,,0.07482850551605225,,,,,, +26,92149,,,,,,,,,,,,0.08043526113033295,,,,,, +26,92199,,,,,,,,,,,,0.08470742404460907,,,,,, +26,92249,,,,,,,,,,,,0.07642005383968353,,,,,, +26,92299,,,,,,,,,,,,0.07041043043136597,,,,,, +26,92349,,,,,,,,,,,,0.07196296006441116,,,,,, +26,92399,,,,,,,,,,,,0.07148933410644531,,,,,, +26,92449,,,,,,,,,,,,0.07144611328840256,,,,,, +26,92499,,,,,,,,,,,,0.07350942492485046,,,,,, +26,92549,,,,,,,,,,,,0.07741043716669083,,,,,, +26,92599,,,,,,,,,,,,0.08233785629272461,,,,,, +26,92649,,,,,,,,,,,,0.06980717182159424,,,,,, +26,92699,,,,,,,,,,,,0.06307488679885864,,,,,, +26,92749,,,,,,,,,,,,0.07276124507188797,,,,,, +26,92799,,,,,,,,,,,,0.06611413508653641,,,,,, +26,92849,,,,,,,,,,,,0.0748392716050148,,,,,, +26,92899,,,,,,,,,,,,0.06865757703781128,,,,,, +26,92933,,,,,,,,,,,,,0.2319350391626358,0.07550685852766037,0.3337099850177765,0.09137517213821411,0.32299697399139404,0.07550685852766037 +26,92933,,,,,,,0.23488786816596985,0.07563799619674683,0.2925448417663574,0.08556795120239258,0.2715405225753784,,,,,,, +27,92949,,,,,,,,,,,,0.08746922016143799,,,,,, +27,92999,,,,,,,,,,,,0.07003220915794373,,,,,, +27,93049,,,,,,,,,,,,0.07845146954059601,,,,,, +27,93099,,,,,,,,,,,,0.08460259437561035,,,,,, +27,93149,,,,,,,,,,,,0.08335356414318085,,,,,, +27,93199,,,,,,,,,,,,0.07827246189117432,,,,,, +27,93249,,,,,,,,,,,,0.08466880023479462,,,,,, +27,93299,,,,,,,,,,,,0.06685104221105576,,,,,, +27,93349,,,,,,,,,,,,0.07978825271129608,,,,,, +27,93399,,,,,,,,,,,,0.07521955668926239,,,,,, +27,93449,,,,,,,,,,,,0.07281101495027542,,,,,, +27,93499,,,,,,,,,,,,0.07648821175098419,,,,,, +27,93549,,,,,,,,,,,,0.08161284029483795,,,,,, +27,93599,,,,,,,,,,,,0.07543182373046875,,,,,, +27,93649,,,,,,,,,,,,0.07558973878622055,,,,,, +27,93699,,,,,,,,,,,,0.08336556702852249,,,,,, +27,93749,,,,,,,,,,,,0.07431899011135101,,,,,, +27,93799,,,,,,,,,,,,0.07215197384357452,,,,,, +27,93849,,,,,,,,,,,,0.08953522145748138,,,,,, +27,93899,,,,,,,,,,,,0.06950829923152924,,,,,, +27,93949,,,,,,,,,,,,0.0783449113368988,,,,,, +27,93999,,,,,,,,,,,,0.07402142137289047,,,,,, +27,94049,,,,,,,,,,,,0.07735654711723328,,,,,, +27,94099,,,,,,,,,,,,0.08090608566999435,,,,,, +27,94149,,,,,,,,,,,,0.07144101709127426,,,,,, +27,94199,,,,,,,,,,,,0.08000483363866806,,,,,, +27,94249,,,,,,,,,,,,0.06126441806554794,,,,,, +27,94299,,,,,,,,,,,,0.060799043625593185,,,,,, +27,94349,,,,,,,,,,,,0.0782260000705719,,,,,, +27,94399,,,,,,,,,,,,0.06718273460865021,,,,,, +27,94449,,,,,,,,,,,,0.08342331647872925,,,,,, +27,94499,,,,,,,,,,,,0.08265767991542816,,,,,, +27,94549,,,,,,,,,,,,0.08679280430078506,,,,,, +27,94599,,,,,,,,,,,,0.06633618474006653,,,,,, +27,94649,,,,,,,,,,,,0.08129063248634338,,,,,, +27,94699,,,,,,,,,,,,0.06567427515983582,,,,,, +27,94749,,,,,,,,,,,,0.06823410838842392,,,,,, +27,94799,,,,,,,,,,,,0.05850681662559509,,,,,, +27,94849,,,,,,,,,,,,0.07809002697467804,,,,,, +27,94899,,,,,,,,,,,,0.07345210015773773,,,,,, +27,94949,,,,,,,,,,,,0.07749457657337189,,,,,, +27,94999,,,,,,,,,,,,0.08254916965961456,,,,,, +27,95049,,,,,,,,,,,,0.07088606059551239,,,,,, +27,95099,,,,,,,,,,,,0.08263254165649414,,,,,, +27,95149,,,,,,,,,,,,0.0669768750667572,,,,,, +27,95199,,,,,,,,,,,,0.0788584053516388,,,,,, +27,95249,,,,,,,,,,,,0.07650000602006912,,,,,, +27,95299,,,,,,,,,,,,0.0777372419834137,,,,,, +27,95349,,,,,,,,,,,,0.068700410425663,,,,,, +27,95399,,,,,,,,,,,,0.08020099997520447,,,,,, +27,95449,,,,,,,,,,,,0.06588876247406006,,,,,, +27,95499,,,,,,,,,,,,0.08327117562294006,,,,,, +27,95549,,,,,,,,,,,,0.06775783002376556,,,,,, +27,95599,,,,,,,,,,,,0.08043724298477173,,,,,, +27,95649,,,,,,,,,,,,0.07719799131155014,,,,,, +27,95699,,,,,,,,,,,,0.0839526578783989,,,,,, +27,95749,,,,,,,,,,,,0.07167546451091766,,,,,, +27,95799,,,,,,,,,,,,0.08127237856388092,,,,,, +27,95849,,,,,,,,,,,,0.06298977136611938,,,,,, +27,95899,,,,,,,,,,,,0.06711108237504959,,,,,, +27,95949,,,,,,,,,,,,0.07563424110412598,,,,,, +27,95999,,,,,,,,,,,,0.08134775608778,,,,,, +27,96049,,,,,,,,,,,,0.07675734162330627,,,,,, +27,96099,,,,,,,,,,,,0.0716206356883049,,,,,, +27,96149,,,,,,,,,,,,0.07141174376010895,,,,,, +27,96199,,,,,,,,,,,,0.08136361092329025,,,,,, +27,96249,,,,,,,,,,,,0.07778702676296234,,,,,, +27,96299,,,,,,,,,,,,0.07371850311756134,,,,,, +27,96349,,,,,,,,,,,,0.08731094002723694,,,,,, +27,96375,,,,,,,,,,,,,0.22932316362857819,0.07481446117162704,0.35489144921302795,0.09970724582672119,0.34888529777526855,0.07481446117162704 +27,96375,,,,,,,0.23436185717582703,0.07537250965833664,0.29798001050949097,0.08876681327819824,0.2766161561012268,,,,,,, +28,96399,,,,,,,,,,,,0.07810250669717789,,,,,, +28,96449,,,,,,,,,,,,0.07451863586902618,,,,,, +28,96499,,,,,,,,,,,,0.07209804654121399,,,,,, +28,96549,,,,,,,,,,,,0.07889626920223236,,,,,, +28,96599,,,,,,,,,,,,0.08853895217180252,,,,,, +28,96649,,,,,,,,,,,,0.07947258651256561,,,,,, +28,96699,,,,,,,,,,,,0.07772180438041687,,,,,, +28,96749,,,,,,,,,,,,0.06161210685968399,,,,,, +28,96799,,,,,,,,,,,,0.08388961106538773,,,,,, +28,96849,,,,,,,,,,,,0.07098785042762756,,,,,, +28,96899,,,,,,,,,,,,0.07148440182209015,,,,,, +28,96949,,,,,,,,,,,,0.07394245266914368,,,,,, +28,96999,,,,,,,,,,,,0.0783359706401825,,,,,, +28,97049,,,,,,,,,,,,0.07004036754369736,,,,,, +28,97099,,,,,,,,,,,,0.0812896266579628,,,,,, +28,97149,,,,,,,,,,,,0.08951020240783691,,,,,, +28,97199,,,,,,,,,,,,0.07657675445079803,,,,,, +28,97249,,,,,,,,,,,,0.07439203560352325,,,,,, +28,97299,,,,,,,,,,,,0.0765918493270874,,,,,, +28,97349,,,,,,,,,,,,0.07118679583072662,,,,,, +28,97399,,,,,,,,,,,,0.07495012134313583,,,,,, +28,97449,,,,,,,,,,,,0.07441198825836182,,,,,, +28,97499,,,,,,,,,,,,0.08425353467464447,,,,,, +28,97549,,,,,,,,,,,,0.06750562787055969,,,,,, +28,97599,,,,,,,,,,,,0.08330163359642029,,,,,, +28,97649,,,,,,,,,,,,0.07358502596616745,,,,,, +28,97699,,,,,,,,,,,,0.08527227491140366,,,,,, +28,97749,,,,,,,,,,,,0.06529214233160019,,,,,, +28,97799,,,,,,,,,,,,0.07604892551898956,,,,,, +28,97849,,,,,,,,,,,,0.07677021622657776,,,,,, +28,97899,,,,,,,,,,,,0.08363814651966095,,,,,, +28,97949,,,,,,,,,,,,0.07060058414936066,,,,,, +28,97999,,,,,,,,,,,,0.07430706173181534,,,,,, +28,98049,,,,,,,,,,,,0.06647218763828278,,,,,, +28,98099,,,,,,,,,,,,0.07804045081138611,,,,,, +28,98149,,,,,,,,,,,,0.0725085437297821,,,,,, +28,98199,,,,,,,,,,,,0.08310340344905853,,,,,, +28,98249,,,,,,,,,,,,0.06937620043754578,,,,,, +28,98299,,,,,,,,,,,,0.06936192512512207,,,,,, +28,98349,,,,,,,,,,,,0.07283341884613037,,,,,, +28,98399,,,,,,,,,,,,0.06668989360332489,,,,,, +28,98449,,,,,,,,,,,,0.06282560527324677,,,,,, +28,98499,,,,,,,,,,,,0.06722718477249146,,,,,, +28,98549,,,,,,,,,,,,0.0880981981754303,,,,,, +28,98599,,,,,,,,,,,,0.07829223573207855,,,,,, +28,98649,,,,,,,,,,,,0.06978868693113327,,,,,, +28,98699,,,,,,,,,,,,0.08138343691825867,,,,,, +28,98749,,,,,,,,,,,,0.07363362610340118,,,,,, +28,98799,,,,,,,,,,,,0.07475699484348297,,,,,, +28,98849,,,,,,,,,,,,0.09023679047822952,,,,,, +28,98899,,,,,,,,,,,,0.08881497383117676,,,,,, +28,98949,,,,,,,,,,,,0.0890624150633812,,,,,, +28,98999,,,,,,,,,,,,0.06505700945854187,,,,,, +28,99049,,,,,,,,,,,,0.07209253311157227,,,,,, +28,99099,,,,,,,,,,,,0.061947911977767944,,,,,, +28,99149,,,,,,,,,,,,0.06382732838392258,,,,,, +28,99199,,,,,,,,,,,,0.07475189864635468,,,,,, +28,99249,,,,,,,,,,,,0.06269131600856781,,,,,, +28,99299,,,,,,,,,,,,0.0760592594742775,,,,,, +28,99349,,,,,,,,,,,,0.069085031747818,,,,,, +28,99399,,,,,,,,,,,,0.06994421035051346,,,,,, +28,99449,,,,,,,,,,,,0.07342679053544998,,,,,, +28,99499,,,,,,,,,,,,0.06610963493585587,,,,,, +28,99549,,,,,,,,,,,,0.08411255478858948,,,,,, +28,99599,,,,,,,,,,,,0.06886349618434906,,,,,, +28,99649,,,,,,,,,,,,0.0790756568312645,,,,,, +28,99699,,,,,,,,,,,,0.08776393532752991,,,,,, +28,99749,,,,,,,,,,,,0.07633167505264282,,,,,, +28,99799,,,,,,,,,,,,0.07906986773014069,,,,,, +28,99817,,,,,,,,,,,,,0.23202160000801086,0.07671798765659332,0.3396261930465698,0.0768008828163147,0.33486801385879517,0.07671798765659332 +28,99817,,,,,,,0.23402230441570282,0.07517160475254059,0.3020290434360504,0.09120404720306396,0.2811645567417145,,,,,,, +29,99849,,,,,,,,,,,,0.07623507082462311,,,,,, +29,99899,,,,,,,,,,,,0.07162978500127792,,,,,, +29,99949,,,,,,,,,,,,0.08840414881706238,,,,,, +29,99999,,,,,,,,,,,,0.07444797456264496,,,,,, +29,100049,,,,,,,,,,,,0.0813198983669281,,,,,, +29,100099,,,,,,,,,,,,0.0750303566455841,,,,,, +29,100149,,,,,,,,,,,,0.07995754480361938,,,,,, +29,100199,,,,,,,,,,,,0.06980125606060028,,,,,, +29,100249,,,,,,,,,,,,0.09242972731590271,,,,,, +29,100299,,,,,,,,,,,,0.07765711098909378,,,,,, +29,100349,,,,,,,,,,,,0.0749005600810051,,,,,, +29,100399,,,,,,,,,,,,0.0751340463757515,,,,,, +29,100449,,,,,,,,,,,,0.06368158757686615,,,,,, +29,100499,,,,,,,,,,,,0.08011835813522339,,,,,, +29,100549,,,,,,,,,,,,0.06415751576423645,,,,,, +29,100599,,,,,,,,,,,,0.07679960131645203,,,,,, +29,100649,,,,,,,,,,,,0.0880945548415184,,,,,, +29,100699,,,,,,,,,,,,0.06418436765670776,,,,,, +29,100749,,,,,,,,,,,,0.06927859783172607,,,,,, +29,100799,,,,,,,,,,,,0.06261653453111649,,,,,, +29,100849,,,,,,,,,,,,0.07649412751197815,,,,,, +29,100899,,,,,,,,,,,,0.07805585861206055,,,,,, +29,100949,,,,,,,,,,,,0.07677872478961945,,,,,, +29,100999,,,,,,,,,,,,0.06664168834686279,,,,,, +29,101049,,,,,,,,,,,,0.07193849980831146,,,,,, +29,101099,,,,,,,,,,,,0.07570717483758926,,,,,, +29,101149,,,,,,,,,,,,0.072213314473629,,,,,, +29,101199,,,,,,,,,,,,0.0596800372004509,,,,,, +29,101249,,,,,,,,,,,,0.07854840904474258,,,,,, +29,101299,,,,,,,,,,,,0.07904328405857086,,,,,, +29,101349,,,,,,,,,,,,0.062141090631484985,,,,,, +29,101399,,,,,,,,,,,,0.07308094203472137,,,,,, +29,101449,,,,,,,,,,,,0.0773882195353508,,,,,, +29,101499,,,,,,,,,,,,0.07227371633052826,,,,,, +29,101549,,,,,,,,,,,,0.07443083077669144,,,,,, +29,101599,,,,,,,,,,,,0.07778500020503998,,,,,, +29,101649,,,,,,,,,,,,0.07044316828250885,,,,,, +29,101699,,,,,,,,,,,,0.07789279520511627,,,,,, +29,101749,,,,,,,,,,,,0.06904436647891998,,,,,, +29,101799,,,,,,,,,,,,0.0832328200340271,,,,,, +29,101849,,,,,,,,,,,,0.07658343762159348,,,,,, +29,101899,,,,,,,,,,,,0.08828690648078918,,,,,, +29,101949,,,,,,,,,,,,0.07937514781951904,,,,,, +29,101999,,,,,,,,,,,,0.07376203685998917,,,,,, +29,102049,,,,,,,,,,,,0.07697141170501709,,,,,, +29,102099,,,,,,,,,,,,0.06815411150455475,,,,,, +29,102149,,,,,,,,,,,,0.08353400230407715,,,,,, +29,102199,,,,,,,,,,,,0.07284215092658997,,,,,, +29,102249,,,,,,,,,,,,0.07841528952121735,,,,,, +29,102299,,,,,,,,,,,,0.07141384482383728,,,,,, +29,102349,,,,,,,,,,,,0.077476866543293,,,,,, +29,102399,,,,,,,,,,,,0.07038277387619019,,,,,, +29,102449,,,,,,,,,,,,0.06972257047891617,,,,,, +29,102499,,,,,,,,,,,,0.07454164326190948,,,,,, +29,102549,,,,,,,,,,,,0.06847728043794632,,,,,, +29,102599,,,,,,,,,,,,0.07560468465089798,,,,,, +29,102649,,,,,,,,,,,,0.0803462415933609,,,,,, +29,102699,,,,,,,,,,,,0.07647952437400818,,,,,, +29,102749,,,,,,,,,,,,0.08532678335905075,,,,,, +29,102799,,,,,,,,,,,,0.07594670355319977,,,,,, +29,102849,,,,,,,,,,,,0.07890136539936066,,,,,, +29,102899,,,,,,,,,,,,0.08016600459814072,,,,,, +29,102949,,,,,,,,,,,,0.07633401453495026,,,,,, +29,102999,,,,,,,,,,,,0.07800894230604172,,,,,, +29,103049,,,,,,,,,,,,0.08434493839740753,,,,,, +29,103099,,,,,,,,,,,,0.0777646005153656,,,,,, +29,103149,,,,,,,,,,,,0.07974572479724884,,,,,, +29,103199,,,,,,,,,,,,0.0681430846452713,,,,,, +29,103249,,,,,,,,,,,,0.06734942644834518,,,,,, +29,103259,,,,,,,,,,,,,0.2298981100320816,0.0754857212305069,0.3511427938938141,0.0916295051574707,0.3451247215270996,0.0754857212305069 +29,103259,,,,,,,0.2335851490497589,0.07493233680725098,0.3067765533924103,0.09409445524215698,0.28600651025772095,,,,,,, +30,103299,,,,,,,,,,,,0.08115924894809723,,,,,, +30,103349,,,,,,,,,,,,0.07492029666900635,,,,,, +30,103399,,,,,,,,,,,,0.07675573229789734,,,,,, +30,103449,,,,,,,,,,,,0.07039624452590942,,,,,, +30,103499,,,,,,,,,,,,0.09066843241453171,,,,,, +30,103549,,,,,,,,,,,,0.07875250279903412,,,,,, +30,103599,,,,,,,,,,,,0.08204136043787003,,,,,, +30,103649,,,,,,,,,,,,0.08601803332567215,,,,,, +30,103699,,,,,,,,,,,,0.07935282588005066,,,,,, +30,103749,,,,,,,,,,,,0.0754605382680893,,,,,, +30,103799,,,,,,,,,,,,0.070514976978302,,,,,, +30,103849,,,,,,,,,,,,0.06311376392841339,,,,,, +30,103899,,,,,,,,,,,,0.07372263073921204,,,,,, +30,103949,,,,,,,,,,,,0.08129650354385376,,,,,, +30,103999,,,,,,,,,,,,0.08023478090763092,,,,,, +30,104049,,,,,,,,,,,,0.07355169951915741,,,,,, +30,104099,,,,,,,,,,,,0.07308533787727356,,,,,, +30,104149,,,,,,,,,,,,0.0712624192237854,,,,,, +30,104199,,,,,,,,,,,,0.08241666108369827,,,,,, +30,104249,,,,,,,,,,,,0.0784929171204567,,,,,, +30,104299,,,,,,,,,,,,0.06413055211305618,,,,,, +30,104349,,,,,,,,,,,,0.07409249246120453,,,,,, +30,104399,,,,,,,,,,,,0.08072840422391891,,,,,, +30,104449,,,,,,,,,,,,0.07930706441402435,,,,,, +30,104499,,,,,,,,,,,,0.08846965432167053,,,,,, +30,104549,,,,,,,,,,,,0.07300269603729248,,,,,, +30,104599,,,,,,,,,,,,0.08464183658361435,,,,,, +30,104649,,,,,,,,,,,,0.07233048230409622,,,,,, +30,104699,,,,,,,,,,,,0.06747539341449738,,,,,, +30,104749,,,,,,,,,,,,0.07897337526082993,,,,,, +30,104799,,,,,,,,,,,,0.0844801664352417,,,,,, +30,104849,,,,,,,,,,,,0.0673980563879013,,,,,, +30,104899,,,,,,,,,,,,0.07601186633110046,,,,,, +30,104949,,,,,,,,,,,,0.08239848166704178,,,,,, +30,104999,,,,,,,,,,,,0.06920505315065384,,,,,, +30,105049,,,,,,,,,,,,0.0787304937839508,,,,,, +30,105099,,,,,,,,,,,,0.06604744493961334,,,,,, +30,105149,,,,,,,,,,,,0.07164653390645981,,,,,, +30,105199,,,,,,,,,,,,0.0770227313041687,,,,,, +30,105249,,,,,,,,,,,,0.07645098119974136,,,,,, +30,105299,,,,,,,,,,,,0.06856377422809601,,,,,, +30,105349,,,,,,,,,,,,0.06267857551574707,,,,,, +30,105399,,,,,,,,,,,,0.06475332379341125,,,,,, +30,105449,,,,,,,,,,,,0.08239119499921799,,,,,, +30,105499,,,,,,,,,,,,0.07454913854598999,,,,,, +30,105549,,,,,,,,,,,,0.08624105900526047,,,,,, +30,105599,,,,,,,,,,,,0.07540813088417053,,,,,, +30,105649,,,,,,,,,,,,0.07438523322343826,,,,,, +30,105699,,,,,,,,,,,,0.07820244133472443,,,,,, +30,105749,,,,,,,,,,,,0.08057630062103271,,,,,, +30,105799,,,,,,,,,,,,0.06738493591547012,,,,,, +30,105849,,,,,,,,,,,,0.07234689593315125,,,,,, +30,105899,,,,,,,,,,,,0.07541912794113159,,,,,, +30,105949,,,,,,,,,,,,0.07487945258617401,,,,,, +30,105999,,,,,,,,,,,,0.08099476993083954,,,,,, +30,106049,,,,,,,,,,,,0.07149719446897507,,,,,, +30,106099,,,,,,,,,,,,0.06986260414123535,,,,,, +30,106149,,,,,,,,,,,,0.06634169071912766,,,,,, +30,106199,,,,,,,,,,,,0.07287926971912384,,,,,, +30,106249,,,,,,,,,,,,0.07562687247991562,,,,,, +30,106299,,,,,,,,,,,,0.07652460038661957,,,,,, +30,106349,,,,,,,,,,,,0.06950272619724274,,,,,, +30,106399,,,,,,,,,,,,0.07074810564517975,,,,,, +30,106449,,,,,,,,,,,,0.08112765103578568,,,,,, +30,106499,,,,,,,,,,,,0.06894858181476593,,,,,, +30,106549,,,,,,,,,,,,0.08207646012306213,,,,,, +30,106599,,,,,,,,,,,,0.0794624537229538,,,,,, +30,106649,,,,,,,,,,,,0.06854201853275299,,,,,, +30,106699,,,,,,,,,,,,0.07829199731349945,,,,,, +30,106701,,,,,,,,,,,,,0.22834593057632446,0.07364089787006378,0.35284996032714844,0.11382949352264404,0.3411037027835846,0.07364089787006378 +30,106701,,,,,,,0.23336076736450195,0.0748765766620636,0.3078899383544922,0.0947679877281189,0.28776732087135315,,,,,,, +31,106749,,,,,,,,,,,,0.06761223077774048,,,,,, +31,106799,,,,,,,,,,,,0.06972924619913101,,,,,, +31,106849,,,,,,,,,,,,0.07252922654151917,,,,,, +31,106899,,,,,,,,,,,,0.07017713785171509,,,,,, +31,106949,,,,,,,,,,,,0.06738853454589844,,,,,, +31,106999,,,,,,,,,,,,0.06945253163576126,,,,,, +31,107049,,,,,,,,,,,,0.07325030863285065,,,,,, +31,107099,,,,,,,,,,,,0.0773295909166336,,,,,, +31,107149,,,,,,,,,,,,0.07134854048490524,,,,,, +31,107199,,,,,,,,,,,,0.07078756392002106,,,,,, +31,107249,,,,,,,,,,,,0.06393363326787949,,,,,, +31,107299,,,,,,,,,,,,0.06580547243356705,,,,,, +31,107349,,,,,,,,,,,,0.07258389890193939,,,,,, +31,107399,,,,,,,,,,,,0.0678284764289856,,,,,, +31,107449,,,,,,,,,,,,0.08143990486860275,,,,,, +31,107499,,,,,,,,,,,,0.06192968785762787,,,,,, +31,107549,,,,,,,,,,,,0.07797174155712128,,,,,, +31,107599,,,,,,,,,,,,0.06763232499361038,,,,,, +31,107649,,,,,,,,,,,,0.07387378811836243,,,,,, +31,107699,,,,,,,,,,,,0.07616882771253586,,,,,, +31,107749,,,,,,,,,,,,0.07582166790962219,,,,,, +31,107799,,,,,,,,,,,,0.0789625495672226,,,,,, +31,107849,,,,,,,,,,,,0.0723586156964302,,,,,, +31,107899,,,,,,,,,,,,0.07765428721904755,,,,,, +31,107949,,,,,,,,,,,,0.07869172841310501,,,,,, +31,107999,,,,,,,,,,,,0.07310082018375397,,,,,, +31,108049,,,,,,,,,,,,0.07789185643196106,,,,,, +31,108099,,,,,,,,,,,,0.07089196145534515,,,,,, +31,108149,,,,,,,,,,,,0.08338595181703568,,,,,, +31,108199,,,,,,,,,,,,0.07797794044017792,,,,,, +31,108249,,,,,,,,,,,,0.08268523216247559,,,,,, +31,108299,,,,,,,,,,,,0.07929079979658127,,,,,, +31,108349,,,,,,,,,,,,0.07857994735240936,,,,,, +31,108399,,,,,,,,,,,,0.07917040586471558,,,,,, +31,108449,,,,,,,,,,,,0.0679817795753479,,,,,, +31,108499,,,,,,,,,,,,0.07902930676937103,,,,,, +31,108549,,,,,,,,,,,,0.07423135638237,,,,,, +31,108599,,,,,,,,,,,,0.0694170892238617,,,,,, +31,108649,,,,,,,,,,,,0.06797383725643158,,,,,, +31,108699,,,,,,,,,,,,0.06804114580154419,,,,,, +31,108749,,,,,,,,,,,,0.07955215871334076,,,,,, +31,108799,,,,,,,,,,,,0.07291600108146667,,,,,, +31,108849,,,,,,,,,,,,0.06754596531391144,,,,,, +31,108899,,,,,,,,,,,,0.08542557060718536,,,,,, +31,108949,,,,,,,,,,,,0.08023977279663086,,,,,, +31,108999,,,,,,,,,,,,0.0795324370265007,,,,,, +31,109049,,,,,,,,,,,,0.06374324858188629,,,,,, +31,109099,,,,,,,,,,,,0.06365467607975006,,,,,, +31,109149,,,,,,,,,,,,0.06984605640172958,,,,,, +31,109199,,,,,,,,,,,,0.07834839820861816,,,,,, +31,109249,,,,,,,,,,,,0.07255015522241592,,,,,, +31,109299,,,,,,,,,,,,0.07923628389835358,,,,,, +31,109349,,,,,,,,,,,,0.08013804256916046,,,,,, +31,109399,,,,,,,,,,,,0.06501142680644989,,,,,, +31,109449,,,,,,,,,,,,0.06455834954977036,,,,,, +31,109499,,,,,,,,,,,,0.06360382586717606,,,,,, +31,109549,,,,,,,,,,,,0.06426584720611572,,,,,, +31,109599,,,,,,,,,,,,0.07165400683879852,,,,,, +31,109649,,,,,,,,,,,,0.07661093771457672,,,,,, +31,109699,,,,,,,,,,,,0.08075021207332611,,,,,, +31,109749,,,,,,,,,,,,0.07186425477266312,,,,,, +31,109799,,,,,,,,,,,,0.07596871256828308,,,,,, +31,109849,,,,,,,,,,,,0.07771622389554977,,,,,, +31,109899,,,,,,,,,,,,0.06078895181417465,,,,,, +31,109949,,,,,,,,,,,,0.0792161151766777,,,,,, +31,109999,,,,,,,,,,,,0.06095883995294571,,,,,, +31,110049,,,,,,,,,,,,0.07056125998497009,,,,,, +31,110099,,,,,,,,,,,,0.06963081657886505,,,,,, +31,110143,,,,,,,,,,,,,0.22839051485061646,0.07321963459253311,0.36784985661506653,0.11889886856079102,0.36206430196762085,0.07321963459253311 +31,110143,,,,,,,0.23286360502243042,0.07454260438680649,0.314358115196228,0.09881311655044556,0.29404759407043457,,,,,,, +32,110149,,,,,,,,,,,,0.08687455207109451,,,,,, +32,110199,,,,,,,,,,,,0.06826135516166687,,,,,, +32,110249,,,,,,,,,,,,0.07438281178474426,,,,,, +32,110299,,,,,,,,,,,,0.07174503803253174,,,,,, +32,110349,,,,,,,,,,,,0.07777674496173859,,,,,, +32,110399,,,,,,,,,,,,0.07678933441638947,,,,,, +32,110449,,,,,,,,,,,,0.07625918835401535,,,,,, +32,110499,,,,,,,,,,,,0.08110268414020538,,,,,, +32,110549,,,,,,,,,,,,0.07025033235549927,,,,,, +32,110599,,,,,,,,,,,,0.07328450679779053,,,,,, +32,110649,,,,,,,,,,,,0.0758851170539856,,,,,, +32,110699,,,,,,,,,,,,0.07813969254493713,,,,,, +32,110749,,,,,,,,,,,,0.08367772400379181,,,,,, +32,110799,,,,,,,,,,,,0.07852398604154587,,,,,, +32,110849,,,,,,,,,,,,0.07824084162712097,,,,,, +32,110899,,,,,,,,,,,,0.06996940076351166,,,,,, +32,110949,,,,,,,,,,,,0.07310117781162262,,,,,, +32,110999,,,,,,,,,,,,0.07237043976783752,,,,,, +32,111049,,,,,,,,,,,,0.06657342612743378,,,,,, +32,111099,,,,,,,,,,,,0.07802428305149078,,,,,, +32,111149,,,,,,,,,,,,0.07505113631486893,,,,,, +32,111199,,,,,,,,,,,,0.07393859326839447,,,,,, +32,111249,,,,,,,,,,,,0.08037416636943817,,,,,, +32,111299,,,,,,,,,,,,0.07257845997810364,,,,,, +32,111349,,,,,,,,,,,,0.07949142158031464,,,,,, +32,111399,,,,,,,,,,,,0.07115823030471802,,,,,, +32,111449,,,,,,,,,,,,0.07066456973552704,,,,,, +32,111499,,,,,,,,,,,,0.06765973567962646,,,,,, +32,111549,,,,,,,,,,,,0.07165446132421494,,,,,, +32,111599,,,,,,,,,,,,0.08310295641422272,,,,,, +32,111649,,,,,,,,,,,,0.06518350541591644,,,,,, +32,111699,,,,,,,,,,,,0.07781817018985748,,,,,, +32,111749,,,,,,,,,,,,0.080318383872509,,,,,, +32,111799,,,,,,,,,,,,0.07123564183712006,,,,,, +32,111849,,,,,,,,,,,,0.0779983326792717,,,,,, +32,111899,,,,,,,,,,,,0.0731460377573967,,,,,, +32,111949,,,,,,,,,,,,0.08086730539798737,,,,,, +32,111999,,,,,,,,,,,,0.08641235530376434,,,,,, +32,112049,,,,,,,,,,,,0.07698347419500351,,,,,, +32,112099,,,,,,,,,,,,0.07300791144371033,,,,,, +32,112149,,,,,,,,,,,,0.07260473072528839,,,,,, +32,112199,,,,,,,,,,,,0.06413822621107101,,,,,, +32,112249,,,,,,,,,,,,0.06887544691562653,,,,,, +32,112299,,,,,,,,,,,,0.07629650831222534,,,,,, +32,112349,,,,,,,,,,,,0.07523047924041748,,,,,, +32,112399,,,,,,,,,,,,0.08102857321500778,,,,,, +32,112449,,,,,,,,,,,,0.0777691900730133,,,,,, +32,112499,,,,,,,,,,,,0.07359302043914795,,,,,, +32,112549,,,,,,,,,,,,0.084000363945961,,,,,, +32,112599,,,,,,,,,,,,0.05723779648542404,,,,,, +32,112649,,,,,,,,,,,,0.07802523672580719,,,,,, +32,112699,,,,,,,,,,,,0.07998685538768768,,,,,, +32,112749,,,,,,,,,,,,0.07026234269142151,,,,,, +32,112799,,,,,,,,,,,,0.08049339056015015,,,,,, +32,112849,,,,,,,,,,,,0.07112286984920502,,,,,, +32,112899,,,,,,,,,,,,0.07304111123085022,,,,,, +32,112949,,,,,,,,,,,,0.0793197900056839,,,,,, +32,112999,,,,,,,,,,,,0.0862283855676651,,,,,, +32,113049,,,,,,,,,,,,0.08655073493719101,,,,,, +32,113099,,,,,,,,,,,,0.07487506419420242,,,,,, +32,113149,,,,,,,,,,,,0.08698393404483795,,,,,, +32,113199,,,,,,,,,,,,0.07688520103693008,,,,,, +32,113249,,,,,,,,,,,,0.08061017096042633,,,,,, +32,113299,,,,,,,,,,,,0.059049833565950394,,,,,, +32,113349,,,,,,,,,,,,0.07444177567958832,,,,,, +32,113399,,,,,,,,,,,,0.06783141195774078,,,,,, +32,113449,,,,,,,,,,,,0.06165724992752075,,,,,, +32,113499,,,,,,,,,,,,0.07536588609218597,,,,,, +32,113549,,,,,,,,,,,,0.07469332218170166,,,,,, +32,113585,,,,,,,,,,,,,0.2295888215303421,0.07481043040752411,0.35915490984916687,0.09975582361221313,0.3518238961696625,0.07481043040752411 +32,113585,,,,,,,0.23245736956596375,0.07437625527381897,0.3175453245639801,0.10081803798675537,0.2977052330970764,,,,,,, +33,113599,,,,,,,,,,,,0.07786717265844345,,,,,, +33,113649,,,,,,,,,,,,0.07496659457683563,,,,,, +33,113699,,,,,,,,,,,,0.08238831162452698,,,,,, +33,113749,,,,,,,,,,,,0.07665964215993881,,,,,, +33,113799,,,,,,,,,,,,0.07780737429857254,,,,,, +33,113849,,,,,,,,,,,,0.07717236876487732,,,,,, +33,113899,,,,,,,,,,,,0.07205325365066528,,,,,, +33,113949,,,,,,,,,,,,0.07493366301059723,,,,,, +33,113999,,,,,,,,,,,,0.07156495749950409,,,,,, +33,114049,,,,,,,,,,,,0.06319405138492584,,,,,, +33,114099,,,,,,,,,,,,0.07244278490543365,,,,,, +33,114149,,,,,,,,,,,,0.08408526331186295,,,,,, +33,114199,,,,,,,,,,,,0.073068767786026,,,,,, +33,114249,,,,,,,,,,,,0.0827375203371048,,,,,, +33,114299,,,,,,,,,,,,0.0661197379231453,,,,,, +33,114349,,,,,,,,,,,,0.07652254402637482,,,,,, +33,114399,,,,,,,,,,,,0.07277825474739075,,,,,, +33,114449,,,,,,,,,,,,0.0813494473695755,,,,,, +33,114499,,,,,,,,,,,,0.0819951593875885,,,,,, +33,114549,,,,,,,,,,,,0.07588787376880646,,,,,, +33,114599,,,,,,,,,,,,0.06859375536441803,,,,,, +33,114649,,,,,,,,,,,,0.08361197263002396,,,,,, +33,114699,,,,,,,,,,,,0.06314954161643982,,,,,, +33,114749,,,,,,,,,,,,0.07826477289199829,,,,,, +33,114799,,,,,,,,,,,,0.07131162285804749,,,,,, +33,114849,,,,,,,,,,,,0.06889060139656067,,,,,, +33,114899,,,,,,,,,,,,0.08122582733631134,,,,,, +33,114949,,,,,,,,,,,,0.06345148384571075,,,,,, +33,114999,,,,,,,,,,,,0.06598307192325592,,,,,, +33,115049,,,,,,,,,,,,0.078951895236969,,,,,, +33,115099,,,,,,,,,,,,0.06427523493766785,,,,,, +33,115149,,,,,,,,,,,,0.0714537501335144,,,,,, +33,115199,,,,,,,,,,,,0.0724930465221405,,,,,, +33,115249,,,,,,,,,,,,0.074029341340065,,,,,, +33,115299,,,,,,,,,,,,0.0574415922164917,,,,,, +33,115349,,,,,,,,,,,,0.07177260518074036,,,,,, +33,115399,,,,,,,,,,,,0.06521764397621155,,,,,, +33,115449,,,,,,,,,,,,0.08779896050691605,,,,,, +33,115499,,,,,,,,,,,,0.08424251526594162,,,,,, +33,115549,,,,,,,,,,,,0.07561638951301575,,,,,, +33,115599,,,,,,,,,,,,0.07517419010400772,,,,,, +33,115649,,,,,,,,,,,,0.07408008724451065,,,,,, +33,115699,,,,,,,,,,,,0.07760312408208847,,,,,, +33,115749,,,,,,,,,,,,0.07932890951633453,,,,,, +33,115799,,,,,,,,,,,,0.07606099545955658,,,,,, +33,115849,,,,,,,,,,,,0.07779069244861603,,,,,, +33,115899,,,,,,,,,,,,0.08322317898273468,,,,,, +33,115949,,,,,,,,,,,,0.07986028492450714,,,,,, +33,115999,,,,,,,,,,,,0.06651517003774643,,,,,, +33,116049,,,,,,,,,,,,0.07361434400081635,,,,,, +33,116099,,,,,,,,,,,,0.07694979757070541,,,,,, +33,116149,,,,,,,,,,,,0.0808236375451088,,,,,, +33,116199,,,,,,,,,,,,0.07391224801540375,,,,,, +33,116249,,,,,,,,,,,,0.07669297605752945,,,,,, +33,116299,,,,,,,,,,,,0.07241944968700409,,,,,, +33,116349,,,,,,,,,,,,0.05945644527673721,,,,,, +33,116399,,,,,,,,,,,,0.08137797564268112,,,,,, +33,116449,,,,,,,,,,,,0.0797317773103714,,,,,, +33,116499,,,,,,,,,,,,0.06543365120887756,,,,,, +33,116549,,,,,,,,,,,,0.06871242076158524,,,,,, +33,116599,,,,,,,,,,,,0.07419385015964508,,,,,, +33,116649,,,,,,,,,,,,0.07321178168058395,,,,,, +33,116699,,,,,,,,,,,,0.08712716400623322,,,,,, +33,116749,,,,,,,,,,,,0.0835636779665947,,,,,, +33,116799,,,,,,,,,,,,0.07284625619649887,,,,,, +33,116849,,,,,,,,,,,,0.06924299895763397,,,,,, +33,116899,,,,,,,,,,,,0.0804564580321312,,,,,, +33,116949,,,,,,,,,,,,0.07527141273021698,,,,,, +33,116999,,,,,,,,,,,,0.06555400788784027,,,,,, +33,117027,,,,,,,,,,,,,0.2318471223115921,0.07654782384634018,0.34324347972869873,0.07884848117828369,0.33990103006362915,0.07654782384634018 +33,117027,,,,,,,0.23201526701450348,0.07417018711566925,0.321442574262619,0.10330355167388916,0.3020901679992676,,,,,,, +34,117049,,,,,,,,,,,,0.07060974091291428,,,,,, +34,117099,,,,,,,,,,,,0.07353100180625916,,,,,, +34,117149,,,,,,,,,,,,0.08569613844156265,,,,,, +34,117199,,,,,,,,,,,,0.07025828957557678,,,,,, +34,117249,,,,,,,,,,,,0.07477251440286636,,,,,, +34,117299,,,,,,,,,,,,0.0808064192533493,,,,,, +34,117349,,,,,,,,,,,,0.07685890793800354,,,,,, +34,117399,,,,,,,,,,,,0.07113853096961975,,,,,, +34,117449,,,,,,,,,,,,0.06825442612171173,,,,,, +34,117499,,,,,,,,,,,,0.07286517322063446,,,,,, +34,117549,,,,,,,,,,,,0.07342244684696198,,,,,, +34,117599,,,,,,,,,,,,0.06364940106868744,,,,,, +34,117649,,,,,,,,,,,,0.07282043993473053,,,,,, +34,117699,,,,,,,,,,,,0.06451712548732758,,,,,, +34,117749,,,,,,,,,,,,0.07537100464105606,,,,,, +34,117799,,,,,,,,,,,,0.07426594197750092,,,,,, +34,117849,,,,,,,,,,,,0.07100654393434525,,,,,, +34,117899,,,,,,,,,,,,0.06336770951747894,,,,,, +34,117949,,,,,,,,,,,,0.06761330366134644,,,,,, +34,117999,,,,,,,,,,,,0.08534526824951172,,,,,, +34,118049,,,,,,,,,,,,0.07820773124694824,,,,,, +34,118099,,,,,,,,,,,,0.06981736421585083,,,,,, +34,118149,,,,,,,,,,,,0.06964176893234253,,,,,, +34,118199,,,,,,,,,,,,0.08163013309240341,,,,,, +34,118249,,,,,,,,,,,,0.08174128830432892,,,,,, +34,118299,,,,,,,,,,,,0.0701034665107727,,,,,, +34,118349,,,,,,,,,,,,0.07839208096265793,,,,,, +34,118399,,,,,,,,,,,,0.07310232520103455,,,,,, +34,118449,,,,,,,,,,,,0.06919725239276886,,,,,, +34,118499,,,,,,,,,,,,0.07043831795454025,,,,,, +34,118549,,,,,,,,,,,,0.07136110961437225,,,,,, +34,118599,,,,,,,,,,,,0.07338967174291611,,,,,, +34,118649,,,,,,,,,,,,0.08591343462467194,,,,,, +34,118699,,,,,,,,,,,,0.06936900317668915,,,,,, +34,118749,,,,,,,,,,,,0.07402755320072174,,,,,, +34,118799,,,,,,,,,,,,0.06550487875938416,,,,,, +34,118849,,,,,,,,,,,,0.07083436101675034,,,,,, +34,118899,,,,,,,,,,,,0.08019276708364487,,,,,, +34,118949,,,,,,,,,,,,0.08187846839427948,,,,,, +34,118999,,,,,,,,,,,,0.07201412320137024,,,,,, +34,119049,,,,,,,,,,,,0.07646959275007248,,,,,, +34,119099,,,,,,,,,,,,0.06999640166759491,,,,,, +34,119149,,,,,,,,,,,,0.08024749159812927,,,,,, +34,119199,,,,,,,,,,,,0.07212717831134796,,,,,, +34,119249,,,,,,,,,,,,0.06760942935943604,,,,,, +34,119299,,,,,,,,,,,,0.07983924448490143,,,,,, +34,119349,,,,,,,,,,,,0.08331097662448883,,,,,, +34,119399,,,,,,,,,,,,0.0705607682466507,,,,,, +34,119449,,,,,,,,,,,,0.06463293731212616,,,,,, +34,119499,,,,,,,,,,,,0.08309460431337357,,,,,, +34,119549,,,,,,,,,,,,0.07067710161209106,,,,,, +34,119599,,,,,,,,,,,,0.06792411208152771,,,,,, +34,119649,,,,,,,,,,,,0.07291610538959503,,,,,, +34,119699,,,,,,,,,,,,0.05481991171836853,,,,,, +34,119749,,,,,,,,,,,,0.08059082925319672,,,,,, +34,119799,,,,,,,,,,,,0.07051141560077667,,,,,, +34,119849,,,,,,,,,,,,0.064156174659729,,,,,, +34,119899,,,,,,,,,,,,0.07880926132202148,,,,,, +34,119949,,,,,,,,,,,,0.069587342441082,,,,,, +34,119999,,,,,,,,,,,,0.06817325949668884,,,,,, +34,120049,,,,,,,,,,,,0.0701022744178772,,,,,, +34,120099,,,,,,,,,,,,0.07455817610025406,,,,,, +34,120149,,,,,,,,,,,,0.06353899836540222,,,,,, +34,120199,,,,,,,,,,,,0.08299660682678223,,,,,, +34,120249,,,,,,,,,,,,0.08569067716598511,,,,,, +34,120299,,,,,,,,,,,,0.07839043438434601,,,,,, +34,120349,,,,,,,,,,,,0.07395192980766296,,,,,, +34,120399,,,,,,,,,,,,0.06861583888530731,,,,,, +34,120449,,,,,,,,,,,,0.07602918148040771,,,,,, +34,120469,,,,,,,,,,,,,0.22769062221050262,0.07374175637960434,0.35954374074935913,0.11261582374572754,0.3529176115989685,0.07374175637960434 +34,120469,,,,,,,0.231747105717659,0.07402774691581726,0.32412591576576233,0.105022132396698,0.3051014542579651,,,,,,, +35,120499,,,,,,,,,,,,0.07983064651489258,,,,,, +35,120549,,,,,,,,,,,,0.0656193345785141,,,,,, +35,120599,,,,,,,,,,,,0.07939319312572479,,,,,, +35,120649,,,,,,,,,,,,0.08170518279075623,,,,,, +35,120699,,,,,,,,,,,,0.06167122721672058,,,,,, +35,120749,,,,,,,,,,,,0.06754317134618759,,,,,, +35,120799,,,,,,,,,,,,0.0659295916557312,,,,,, +35,120849,,,,,,,,,,,,0.06059565767645836,,,,,, +35,120899,,,,,,,,,,,,0.078790582716465,,,,,, +35,120949,,,,,,,,,,,,0.07053717225790024,,,,,, +35,120999,,,,,,,,,,,,0.08145128190517426,,,,,, +35,121049,,,,,,,,,,,,0.08118269592523575,,,,,, +35,121099,,,,,,,,,,,,0.06996467709541321,,,,,, +35,121149,,,,,,,,,,,,0.07638503611087799,,,,,, +35,121199,,,,,,,,,,,,0.07444494962692261,,,,,, +35,121249,,,,,,,,,,,,0.07717026770114899,,,,,, +35,121299,,,,,,,,,,,,0.07924295216798782,,,,,, +35,121349,,,,,,,,,,,,0.07245764136314392,,,,,, +35,121399,,,,,,,,,,,,0.06982064992189407,,,,,, +35,121449,,,,,,,,,,,,0.0749409943819046,,,,,, +35,121499,,,,,,,,,,,,0.07233740389347076,,,,,, +35,121549,,,,,,,,,,,,0.07187198102474213,,,,,, +35,121599,,,,,,,,,,,,0.07986993342638016,,,,,, +35,121649,,,,,,,,,,,,0.05904485657811165,,,,,, +35,121699,,,,,,,,,,,,0.06789825111627579,,,,,, +35,121749,,,,,,,,,,,,0.06804466247558594,,,,,, +35,121799,,,,,,,,,,,,0.07526667416095734,,,,,, +35,121849,,,,,,,,,,,,0.07782477140426636,,,,,, +35,121899,,,,,,,,,,,,0.0762675404548645,,,,,, +35,121949,,,,,,,,,,,,0.08346323668956757,,,,,, +35,121999,,,,,,,,,,,,0.06623252481222153,,,,,, +35,122049,,,,,,,,,,,,0.07560145854949951,,,,,, +35,122099,,,,,,,,,,,,0.07389787584543228,,,,,, +35,122149,,,,,,,,,,,,0.06502968072891235,,,,,, +35,122199,,,,,,,,,,,,0.07336629927158356,,,,,, +35,122249,,,,,,,,,,,,0.07143367826938629,,,,,, +35,122299,,,,,,,,,,,,0.08313389867544174,,,,,, +35,122349,,,,,,,,,,,,0.07808680832386017,,,,,, +35,122399,,,,,,,,,,,,0.0845678448677063,,,,,, +35,122449,,,,,,,,,,,,0.0783807635307312,,,,,, +35,122499,,,,,,,,,,,,0.08461592346429825,,,,,, +35,122549,,,,,,,,,,,,0.07584145665168762,,,,,, +35,122599,,,,,,,,,,,,0.0679192990064621,,,,,, +35,122649,,,,,,,,,,,,0.07902052253484726,,,,,, +35,122699,,,,,,,,,,,,0.08010552823543549,,,,,, +35,122749,,,,,,,,,,,,0.06322769820690155,,,,,, +35,122799,,,,,,,,,,,,0.06348693370819092,,,,,, +35,122849,,,,,,,,,,,,0.06983113288879395,,,,,, +35,122899,,,,,,,,,,,,0.07317806035280228,,,,,, +35,122949,,,,,,,,,,,,0.07111425697803497,,,,,, +35,122999,,,,,,,,,,,,0.07903176546096802,,,,,, +35,123049,,,,,,,,,,,,0.0682191252708435,,,,,, +35,123099,,,,,,,,,,,,0.07432814687490463,,,,,, +35,123149,,,,,,,,,,,,0.09119400382041931,,,,,, +35,123199,,,,,,,,,,,,0.07149850577116013,,,,,, +35,123249,,,,,,,,,,,,0.06777714192867279,,,,,, +35,123299,,,,,,,,,,,,0.08355134725570679,,,,,, +35,123349,,,,,,,,,,,,0.07270385324954987,,,,,, +35,123399,,,,,,,,,,,,0.05983778461813927,,,,,, +35,123449,,,,,,,,,,,,0.07676368951797485,,,,,, +35,123499,,,,,,,,,,,,0.06778217107057571,,,,,, +35,123549,,,,,,,,,,,,0.0805143192410469,,,,,, +35,123599,,,,,,,,,,,,0.06971211731433868,,,,,, +35,123649,,,,,,,,,,,,0.0771404430270195,,,,,, +35,123699,,,,,,,,,,,,0.07950459420681,,,,,, +35,123749,,,,,,,,,,,,0.07380373775959015,,,,,, +35,123799,,,,,,,,,,,,0.07295936346054077,,,,,, +35,123849,,,,,,,,,,,,0.0849056988954544,,,,,, +35,123899,,,,,,,,,,,,0.07833598554134369,,,,,, +35,123911,,,,,,,,,,,,,0.2271396815776825,0.07244864106178284,0.36187729239463806,0.12817668914794922,0.3555361330509186,0.07244864106178284 +35,123911,,,,,,,0.2312096804380417,0.07374217361211777,0.3293950855731964,0.10846984386444092,0.31016597151756287,,,,,,, +36,123949,,,,,,,,,,,,0.07411123067140579,,,,,, +36,123999,,,,,,,,,,,,0.08592595160007477,,,,,, +36,124049,,,,,,,,,,,,0.07482454180717468,,,,,, +36,124099,,,,,,,,,,,,0.07117316126823425,,,,,, +36,124149,,,,,,,,,,,,0.06662404537200928,,,,,, +36,124199,,,,,,,,,,,,0.07829967886209488,,,,,, +36,124249,,,,,,,,,,,,0.062453337013721466,,,,,, +36,124299,,,,,,,,,,,,0.0801275372505188,,,,,, +36,124349,,,,,,,,,,,,0.07294729351997375,,,,,, +36,124399,,,,,,,,,,,,0.06462133675813675,,,,,, +36,124449,,,,,,,,,,,,0.0753849595785141,,,,,, +36,124499,,,,,,,,,,,,0.06678301095962524,,,,,, +36,124549,,,,,,,,,,,,0.07699957489967346,,,,,, +36,124599,,,,,,,,,,,,0.07359051704406738,,,,,, +36,124649,,,,,,,,,,,,0.07907074689865112,,,,,, +36,124699,,,,,,,,,,,,0.06638498604297638,,,,,, +36,124749,,,,,,,,,,,,0.06469587981700897,,,,,, +36,124799,,,,,,,,,,,,0.0686681866645813,,,,,, +36,124849,,,,,,,,,,,,0.07840912789106369,,,,,, +36,124899,,,,,,,,,,,,0.08364102244377136,,,,,, +36,124949,,,,,,,,,,,,0.06873317807912827,,,,,, +36,124999,,,,,,,,,,,,0.08065052330493927,,,,,, +36,125049,,,,,,,,,,,,0.08114761114120483,,,,,, +36,125099,,,,,,,,,,,,0.07124092429876328,,,,,, +36,125149,,,,,,,,,,,,0.07231759279966354,,,,,, +36,125199,,,,,,,,,,,,0.06449873745441437,,,,,, +36,125249,,,,,,,,,,,,0.07023686915636063,,,,,, +36,125299,,,,,,,,,,,,0.0762689858675003,,,,,, +36,125349,,,,,,,,,,,,0.0751858800649643,,,,,, +36,125399,,,,,,,,,,,,0.0726197212934494,,,,,, +36,125449,,,,,,,,,,,,0.0757489949464798,,,,,, +36,125499,,,,,,,,,,,,0.07033120095729828,,,,,, +36,125549,,,,,,,,,,,,0.07009254395961761,,,,,, +36,125599,,,,,,,,,,,,0.07830162346363068,,,,,, +36,125649,,,,,,,,,,,,0.07172960042953491,,,,,, +36,125699,,,,,,,,,,,,0.08363322168588638,,,,,, +36,125749,,,,,,,,,,,,0.07285099476575851,,,,,, +36,125799,,,,,,,,,,,,0.06444260478019714,,,,,, +36,125849,,,,,,,,,,,,0.06479141861200333,,,,,, +36,125899,,,,,,,,,,,,0.07497238367795944,,,,,, +36,125949,,,,,,,,,,,,0.08192122727632523,,,,,, +36,125999,,,,,,,,,,,,0.0744355320930481,,,,,, +36,126049,,,,,,,,,,,,0.08801301568746567,,,,,, +36,126099,,,,,,,,,,,,0.07755330204963684,,,,,, +36,126149,,,,,,,,,,,,0.06531541794538498,,,,,, +36,126199,,,,,,,,,,,,0.07016408443450928,,,,,, +36,126249,,,,,,,,,,,,0.0742594376206398,,,,,, +36,126299,,,,,,,,,,,,0.08757255971431732,,,,,, +36,126349,,,,,,,,,,,,0.09630196541547775,,,,,, +36,126399,,,,,,,,,,,,0.06943424046039581,,,,,, +36,126449,,,,,,,,,,,,0.07760462164878845,,,,,, +36,126499,,,,,,,,,,,,0.07382191717624664,,,,,, +36,126549,,,,,,,,,,,,0.07592110335826874,,,,,, +36,126599,,,,,,,,,,,,0.07513926923274994,,,,,, +36,126649,,,,,,,,,,,,0.0779045820236206,,,,,, +36,126699,,,,,,,,,,,,0.07223639637231827,,,,,, +36,126749,,,,,,,,,,,,0.07969410717487335,,,,,, +36,126799,,,,,,,,,,,,0.07129309326410294,,,,,, +36,126849,,,,,,,,,,,,0.07022185623645782,,,,,, +36,126899,,,,,,,,,,,,0.0741785541176796,,,,,, +36,126949,,,,,,,,,,,,0.07422711700201035,,,,,, +36,126999,,,,,,,,,,,,0.07399509847164154,,,,,, +36,127049,,,,,,,,,,,,0.07912461459636688,,,,,, +36,127099,,,,,,,,,,,,0.07512278854846954,,,,,, +36,127149,,,,,,,,,,,,0.07011419534683228,,,,,, +36,127199,,,,,,,,,,,,0.07722682505846024,,,,,, +36,127249,,,,,,,,,,,,0.07687550038099289,,,,,, +36,127299,,,,,,,,,,,,0.08110217750072479,,,,,, +36,127349,,,,,,,,,,,,0.07191348075866699,,,,,, +36,127353,,,,,,,,,,,,,0.22866259515285492,0.07491079717874527,0.36790457367897034,0.09854793548583984,0.3644808232784271,0.07491079717874527 +36,127353,,,,,,,0.23074862360954285,0.07354378700256348,0.3330176770687103,0.11087936162948608,0.3135199546813965,,,,,,, +37,127399,,,,,,,,,,,,0.05931052938103676,,,,,, +37,127449,,,,,,,,,,,,0.08291065692901611,,,,,, +37,127499,,,,,,,,,,,,0.06286221742630005,,,,,, +37,127549,,,,,,,,,,,,0.0862029418349266,,,,,, +37,127599,,,,,,,,,,,,0.06286085397005081,,,,,, +37,127649,,,,,,,,,,,,0.0722213089466095,,,,,, +37,127699,,,,,,,,,,,,0.0820656418800354,,,,,, +37,127749,,,,,,,,,,,,0.07559645175933838,,,,,, +37,127799,,,,,,,,,,,,0.06594401597976685,,,,,, +37,127849,,,,,,,,,,,,0.08755078166723251,,,,,, +37,127899,,,,,,,,,,,,0.06882712244987488,,,,,, +37,127949,,,,,,,,,,,,0.06404297053813934,,,,,, +37,127999,,,,,,,,,,,,0.06709381937980652,,,,,, +37,128049,,,,,,,,,,,,0.0861085057258606,,,,,, +37,128099,,,,,,,,,,,,0.08055424690246582,,,,,, +37,128149,,,,,,,,,,,,0.06874033808708191,,,,,, +37,128199,,,,,,,,,,,,0.07463377714157104,,,,,, +37,128249,,,,,,,,,,,,0.07126392424106598,,,,,, +37,128299,,,,,,,,,,,,0.07878930866718292,,,,,, +37,128349,,,,,,,,,,,,0.07799913734197617,,,,,, +37,128399,,,,,,,,,,,,0.07496928423643112,,,,,, +37,128449,,,,,,,,,,,,0.08134159445762634,,,,,, +37,128499,,,,,,,,,,,,0.07538198679685593,,,,,, +37,128549,,,,,,,,,,,,0.07794137299060822,,,,,, +37,128599,,,,,,,,,,,,0.0746755450963974,,,,,, +37,128649,,,,,,,,,,,,0.06552788615226746,,,,,, +37,128699,,,,,,,,,,,,0.0796491801738739,,,,,, +37,128749,,,,,,,,,,,,0.0733611136674881,,,,,, +37,128799,,,,,,,,,,,,0.08009008318185806,,,,,, +37,128849,,,,,,,,,,,,0.06540621072053909,,,,,, +37,128899,,,,,,,,,,,,0.07647811621427536,,,,,, +37,128949,,,,,,,,,,,,0.059294842183589935,,,,,, +37,128999,,,,,,,,,,,,0.06387080997228622,,,,,, +37,129049,,,,,,,,,,,,0.06967486441135406,,,,,, +37,129099,,,,,,,,,,,,0.0710783451795578,,,,,, +37,129149,,,,,,,,,,,,0.07341979444026947,,,,,, +37,129199,,,,,,,,,,,,0.07758276164531708,,,,,, +37,129249,,,,,,,,,,,,0.07375204563140869,,,,,, +37,129299,,,,,,,,,,,,0.06881916522979736,,,,,, +37,129349,,,,,,,,,,,,0.0752275139093399,,,,,, +37,129399,,,,,,,,,,,,0.07980094850063324,,,,,, +37,129449,,,,,,,,,,,,0.06526334583759308,,,,,, +37,129499,,,,,,,,,,,,0.07095837593078613,,,,,, +37,129549,,,,,,,,,,,,0.08222158253192902,,,,,, +37,129599,,,,,,,,,,,,0.06519966572523117,,,,,, +37,129649,,,,,,,,,,,,0.0648781880736351,,,,,, +37,129699,,,,,,,,,,,,0.06802424788475037,,,,,, +37,129749,,,,,,,,,,,,0.06884151697158813,,,,,, +37,129799,,,,,,,,,,,,0.06817076355218887,,,,,, +37,129849,,,,,,,,,,,,0.06924601644277573,,,,,, +37,129899,,,,,,,,,,,,0.07792297005653381,,,,,, +37,129949,,,,,,,,,,,,0.07565885037183762,,,,,, +37,129999,,,,,,,,,,,,0.0891091600060463,,,,,, +37,130049,,,,,,,,,,,,0.07325147092342377,,,,,, +37,130099,,,,,,,,,,,,0.08258439600467682,,,,,, +37,130149,,,,,,,,,,,,0.07265304028987885,,,,,, +37,130199,,,,,,,,,,,,0.06856251507997513,,,,,, +37,130249,,,,,,,,,,,,0.07777620106935501,,,,,, +37,130299,,,,,,,,,,,,0.06251539289951324,,,,,, +37,130349,,,,,,,,,,,,0.06943786144256592,,,,,, +37,130399,,,,,,,,,,,,0.07899557054042816,,,,,, +37,130449,,,,,,,,,,,,0.07824890315532684,,,,,, +37,130499,,,,,,,,,,,,0.07441011071205139,,,,,, +37,130549,,,,,,,,,,,,0.07648774236440659,,,,,, +37,130599,,,,,,,,,,,,0.06843633204698563,,,,,, +37,130649,,,,,,,,,,,,0.06738289445638657,,,,,, +37,130699,,,,,,,,,,,,0.07982049882411957,,,,,, +37,130749,,,,,,,,,,,,0.07820931822061539,,,,,, +37,130795,,,,,,,,,,,,,0.2285725176334381,0.07398000359535217,0.3537472188472748,0.10974889993667603,0.34656310081481934,0.07398000359535217 +37,130795,,,,,,,0.23035278916358948,0.07334807515144348,0.336548775434494,0.11324870586395264,0.3173963725566864,,,,,,, +38,130799,,,,,,,,,,,,0.06297468394041061,,,,,, +38,130849,,,,,,,,,,,,0.07284979522228241,,,,,, +38,130899,,,,,,,,,,,,0.07029548287391663,,,,,, +38,130949,,,,,,,,,,,,0.06627503037452698,,,,,, +38,130999,,,,,,,,,,,,0.06926406919956207,,,,,, +38,131049,,,,,,,,,,,,0.08204635977745056,,,,,, +38,131099,,,,,,,,,,,,0.0719681829214096,,,,,, +38,131149,,,,,,,,,,,,0.07507360726594925,,,,,, +38,131199,,,,,,,,,,,,0.06607156991958618,,,,,, +38,131249,,,,,,,,,,,,0.0885186642408371,,,,,, +38,131299,,,,,,,,,,,,0.08365839719772339,,,,,, +38,131349,,,,,,,,,,,,0.0740695595741272,,,,,, +38,131399,,,,,,,,,,,,0.06974530220031738,,,,,, +38,131449,,,,,,,,,,,,0.06228483468294144,,,,,, +38,131499,,,,,,,,,,,,0.06712286174297333,,,,,, +38,131549,,,,,,,,,,,,0.06444370746612549,,,,,, +38,131599,,,,,,,,,,,,0.08061622083187103,,,,,, +38,131649,,,,,,,,,,,,0.0756307914853096,,,,,, +38,131699,,,,,,,,,,,,0.07628340274095535,,,,,, +38,131749,,,,,,,,,,,,0.0733121857047081,,,,,, +38,131799,,,,,,,,,,,,0.07040688395500183,,,,,, +38,131849,,,,,,,,,,,,0.06405691802501678,,,,,, +38,131899,,,,,,,,,,,,0.07479065656661987,,,,,, +38,131949,,,,,,,,,,,,0.08213837444782257,,,,,, +38,131999,,,,,,,,,,,,0.08604992926120758,,,,,, +38,132049,,,,,,,,,,,,0.08061718195676804,,,,,, +38,132099,,,,,,,,,,,,0.07116888463497162,,,,,, +38,132149,,,,,,,,,,,,0.05924518406391144,,,,,, +38,132199,,,,,,,,,,,,0.07809106260538101,,,,,, +38,132249,,,,,,,,,,,,0.08438411355018616,,,,,, +38,132299,,,,,,,,,,,,0.061386819928884506,,,,,, +38,132349,,,,,,,,,,,,0.07421892136335373,,,,,, +38,132399,,,,,,,,,,,,0.06717296689748764,,,,,, +38,132449,,,,,,,,,,,,0.06334192305803299,,,,,, +38,132499,,,,,,,,,,,,0.08169981837272644,,,,,, +38,132549,,,,,,,,,,,,0.0689583569765091,,,,,, +38,132599,,,,,,,,,,,,0.07445907592773438,,,,,, +38,132649,,,,,,,,,,,,0.06880311667919159,,,,,, +38,132699,,,,,,,,,,,,0.07102357596158981,,,,,, +38,132749,,,,,,,,,,,,0.07205422222614288,,,,,, +38,132799,,,,,,,,,,,,0.06595409661531448,,,,,, +38,132849,,,,,,,,,,,,0.06454020738601685,,,,,, +38,132899,,,,,,,,,,,,0.06916801631450653,,,,,, +38,132949,,,,,,,,,,,,0.07604888081550598,,,,,, +38,132999,,,,,,,,,,,,0.07661398500204086,,,,,, +38,133049,,,,,,,,,,,,0.07902754843235016,,,,,, +38,133099,,,,,,,,,,,,0.07278262823820114,,,,,, +38,133149,,,,,,,,,,,,0.07424867153167725,,,,,, +38,133199,,,,,,,,,,,,0.09367261826992035,,,,,, +38,133249,,,,,,,,,,,,0.0770287960767746,,,,,, +38,133299,,,,,,,,,,,,0.0695110559463501,,,,,, +38,133349,,,,,,,,,,,,0.06614963710308075,,,,,, +38,133399,,,,,,,,,,,,0.06825042515993118,,,,,, +38,133449,,,,,,,,,,,,0.08320926874876022,,,,,, +38,133499,,,,,,,,,,,,0.07096550613641739,,,,,, +38,133549,,,,,,,,,,,,0.08449297398328781,,,,,, +38,133599,,,,,,,,,,,,0.07091224938631058,,,,,, +38,133649,,,,,,,,,,,,0.08112303912639618,,,,,, +38,133699,,,,,,,,,,,,0.08122903108596802,,,,,, +38,133749,,,,,,,,,,,,0.08344080299139023,,,,,, +38,133799,,,,,,,,,,,,0.06952410936355591,,,,,, +38,133849,,,,,,,,,,,,0.06680503487586975,,,,,, +38,133899,,,,,,,,,,,,0.07360406219959259,,,,,, +38,133949,,,,,,,,,,,,0.07288406044244766,,,,,, +38,133999,,,,,,,,,,,,0.09289184957742691,,,,,, +38,134049,,,,,,,,,,,,0.07651122659444809,,,,,, +38,134099,,,,,,,,,,,,0.0696234405040741,,,,,, +38,134149,,,,,,,,,,,,0.0692543089389801,,,,,, +38,134199,,,,,,,,,,,,0.07191157341003418,,,,,, +38,134237,,,,,,,,,,,,,0.2271689921617508,0.07222381234169006,0.3701920807361603,0.13088220357894897,0.3618986904621124,0.07222381234169006 +38,134237,,,,,,,0.23003706336021423,0.07312033325433731,0.340612530708313,0.11600184440612793,0.3219928443431854,,,,,,, +39,134249,,,,,,,,,,,,0.07480175793170929,,,,,, +39,134299,,,,,,,,,,,,0.07727649807929993,,,,,, +39,134349,,,,,,,,,,,,0.07033485174179077,,,,,, +39,134399,,,,,,,,,,,,0.07519900798797607,,,,,, +39,134449,,,,,,,,,,,,0.08205893635749817,,,,,, +39,134499,,,,,,,,,,,,0.06912324577569962,,,,,, +39,134549,,,,,,,,,,,,0.06382820010185242,,,,,, +39,134599,,,,,,,,,,,,0.08581258356571198,,,,,, +39,134649,,,,,,,,,,,,0.07152801752090454,,,,,, +39,134699,,,,,,,,,,,,0.07192352414131165,,,,,, +39,134749,,,,,,,,,,,,0.07326195389032364,,,,,, +39,134799,,,,,,,,,,,,0.06833309680223465,,,,,, +39,134849,,,,,,,,,,,,0.06586198508739471,,,,,, +39,134899,,,,,,,,,,,,0.06845740228891373,,,,,, +39,134949,,,,,,,,,,,,0.06337723135948181,,,,,, +39,134999,,,,,,,,,,,,0.07368731498718262,,,,,, +39,135049,,,,,,,,,,,,0.07311190664768219,,,,,, +39,135099,,,,,,,,,,,,0.08285049349069595,,,,,, +39,135149,,,,,,,,,,,,0.07823237031698227,,,,,, +39,135199,,,,,,,,,,,,0.06250802427530289,,,,,, +39,135249,,,,,,,,,,,,0.06242148578166962,,,,,, +39,135299,,,,,,,,,,,,0.06984764337539673,,,,,, +39,135349,,,,,,,,,,,,0.06712112575769424,,,,,, +39,135399,,,,,,,,,,,,0.07449233531951904,,,,,, +39,135449,,,,,,,,,,,,0.07507956027984619,,,,,, +39,135499,,,,,,,,,,,,0.06777596473693848,,,,,, +39,135549,,,,,,,,,,,,0.06790049374103546,,,,,, +39,135599,,,,,,,,,,,,0.07695060968399048,,,,,, +39,135649,,,,,,,,,,,,0.06438883394002914,,,,,, +39,135699,,,,,,,,,,,,0.0685608983039856,,,,,, +39,135749,,,,,,,,,,,,0.07673399895429611,,,,,, +39,135799,,,,,,,,,,,,0.07503721863031387,,,,,, +39,135849,,,,,,,,,,,,0.06263361871242523,,,,,, +39,135899,,,,,,,,,,,,0.07278282940387726,,,,,, +39,135949,,,,,,,,,,,,0.0702243447303772,,,,,, +39,135999,,,,,,,,,,,,0.07662443071603775,,,,,, +39,136049,,,,,,,,,,,,0.08039209246635437,,,,,, +39,136099,,,,,,,,,,,,0.07766082137823105,,,,,, +39,136149,,,,,,,,,,,,0.08291514962911606,,,,,, +39,136199,,,,,,,,,,,,0.07427631318569183,,,,,, +39,136249,,,,,,,,,,,,0.0746115893125534,,,,,, +39,136299,,,,,,,,,,,,0.07181944698095322,,,,,, +39,136349,,,,,,,,,,,,0.06302987039089203,,,,,, +39,136399,,,,,,,,,,,,0.06399503350257874,,,,,, +39,136449,,,,,,,,,,,,0.06730598956346512,,,,,, +39,136499,,,,,,,,,,,,0.07525966316461563,,,,,, +39,136549,,,,,,,,,,,,0.07107260823249817,,,,,, +39,136599,,,,,,,,,,,,0.08125144243240356,,,,,, +39,136649,,,,,,,,,,,,0.06923320144414902,,,,,, +39,136699,,,,,,,,,,,,0.0760764479637146,,,,,, +39,136749,,,,,,,,,,,,0.06799160689115524,,,,,, +39,136799,,,,,,,,,,,,0.06984131038188934,,,,,, +39,136849,,,,,,,,,,,,0.06753727793693542,,,,,, +39,136899,,,,,,,,,,,,0.07826889306306839,,,,,, +39,136949,,,,,,,,,,,,0.07330457866191864,,,,,, +39,136999,,,,,,,,,,,,0.07171639800071716,,,,,, +39,137049,,,,,,,,,,,,0.0703439936041832,,,,,, +39,137099,,,,,,,,,,,,0.0665585994720459,,,,,, +39,137149,,,,,,,,,,,,0.07556892186403275,,,,,, +39,137199,,,,,,,,,,,,0.06978572905063629,,,,,, +39,137249,,,,,,,,,,,,0.07963401079177856,,,,,, +39,137299,,,,,,,,,,,,0.07037723064422607,,,,,, +39,137349,,,,,,,,,,,,0.07656629383563995,,,,,, +39,137399,,,,,,,,,,,,0.07246498018503189,,,,,, +39,137449,,,,,,,,,,,,0.06932307779788971,,,,,, +39,137499,,,,,,,,,,,,0.0675630122423172,,,,,, +39,137549,,,,,,,,,,,,0.08496029675006866,,,,,, +39,137599,,,,,,,,,,,,0.07573489844799042,,,,,, +39,137649,,,,,,,,,,,,0.07546229660511017,,,,,, +39,137679,,,,,,,,,,,,,0.2286883443593979,0.07314600795507431,0.3634456992149353,0.1197848916053772,0.35874104499816895,0.07314600795507431 +39,137679,,,,,,,0.22996094822883606,0.07313457131385803,0.3403717577457428,0.11583220958709717,0.3218952417373657,,,,,,, +40,137699,,,,,,,,,,,,0.07250244915485382,,,,,, +40,137749,,,,,,,,,,,,0.06861229240894318,,,,,, +40,137799,,,,,,,,,,,,0.07919198274612427,,,,,, +40,137849,,,,,,,,,,,,0.07623850554227829,,,,,, +40,137899,,,,,,,,,,,,0.06424305588006973,,,,,, +40,137949,,,,,,,,,,,,0.06311154365539551,,,,,, +40,137999,,,,,,,,,,,,0.08139415085315704,,,,,, +40,138049,,,,,,,,,,,,0.0641186535358429,,,,,, +40,138099,,,,,,,,,,,,0.07525980472564697,,,,,, +40,138149,,,,,,,,,,,,0.0792841911315918,,,,,, +40,138199,,,,,,,,,,,,0.07066486775875092,,,,,, +40,138249,,,,,,,,,,,,0.07048710435628891,,,,,, +40,138299,,,,,,,,,,,,0.0787653923034668,,,,,, +40,138349,,,,,,,,,,,,0.06253716349601746,,,,,, +40,138399,,,,,,,,,,,,0.07786479592323303,,,,,, +40,138449,,,,,,,,,,,,0.06624147295951843,,,,,, +40,138499,,,,,,,,,,,,0.06735323369503021,,,,,, +40,138549,,,,,,,,,,,,0.0801919549703598,,,,,, +40,138599,,,,,,,,,,,,0.0655989795923233,,,,,, +40,138649,,,,,,,,,,,,0.06722879409790039,,,,,, +40,138699,,,,,,,,,,,,0.057704292237758636,,,,,, +40,138749,,,,,,,,,,,,0.07053292542695999,,,,,, +40,138799,,,,,,,,,,,,0.06425093114376068,,,,,, +40,138849,,,,,,,,,,,,0.0746164470911026,,,,,, +40,138899,,,,,,,,,,,,0.061652034521102905,,,,,, +40,138949,,,,,,,,,,,,0.07567662000656128,,,,,, +40,138999,,,,,,,,,,,,0.08056159317493439,,,,,, +40,139049,,,,,,,,,,,,0.06528733670711517,,,,,, +40,139099,,,,,,,,,,,,0.07387573271989822,,,,,, +40,139149,,,,,,,,,,,,0.07427987456321716,,,,,, +40,139199,,,,,,,,,,,,0.06604187935590744,,,,,, +40,139249,,,,,,,,,,,,0.08433324098587036,,,,,, +40,139299,,,,,,,,,,,,0.059044789522886276,,,,,, +40,139349,,,,,,,,,,,,0.07196047902107239,,,,,, +40,139399,,,,,,,,,,,,0.06466258317232132,,,,,, +40,139449,,,,,,,,,,,,0.05412609875202179,,,,,, +40,139499,,,,,,,,,,,,0.06312442570924759,,,,,, +40,139549,,,,,,,,,,,,0.07772250473499298,,,,,, +40,139599,,,,,,,,,,,,0.07611127197742462,,,,,, +40,139649,,,,,,,,,,,,0.08029577136039734,,,,,, +40,139699,,,,,,,,,,,,0.08230537176132202,,,,,, +40,139749,,,,,,,,,,,,0.07467782497406006,,,,,, +40,139799,,,,,,,,,,,,0.08566681295633316,,,,,, +40,139849,,,,,,,,,,,,0.07821571826934814,,,,,, +40,139899,,,,,,,,,,,,0.0719025582075119,,,,,, +40,139949,,,,,,,,,,,,0.08162898570299149,,,,,, +40,139999,,,,,,,,,,,,0.08189366012811661,,,,,, +40,140049,,,,,,,,,,,,0.07437735795974731,,,,,, +40,140099,,,,,,,,,,,,0.07226306200027466,,,,,, +40,140149,,,,,,,,,,,,0.07569926977157593,,,,,, +40,140199,,,,,,,,,,,,0.07923595607280731,,,,,, +40,140249,,,,,,,,,,,,0.06698121130466461,,,,,, +40,140299,,,,,,,,,,,,0.06734701991081238,,,,,, +40,140349,,,,,,,,,,,,0.06467248499393463,,,,,, +40,140399,,,,,,,,,,,,0.07174193859100342,,,,,, +40,140449,,,,,,,,,,,,0.0684787780046463,,,,,, +40,140499,,,,,,,,,,,,0.06710922718048096,,,,,, +40,140549,,,,,,,,,,,,0.08572987467050552,,,,,, +40,140599,,,,,,,,,,,,0.06659229099750519,,,,,, +40,140649,,,,,,,,,,,,0.08028149604797363,,,,,, +40,140699,,,,,,,,,,,,0.08058282732963562,,,,,, +40,140749,,,,,,,,,,,,0.07560290396213531,,,,,, +40,140799,,,,,,,,,,,,0.06551395356655121,,,,,, +40,140849,,,,,,,,,,,,0.0792379155755043,,,,,, +40,140899,,,,,,,,,,,,0.0780060738325119,,,,,, +40,140949,,,,,,,,,,,,0.07108616828918457,,,,,, +40,140999,,,,,,,,,,,,0.0695490688085556,,,,,, +40,141049,,,,,,,,,,,,0.06778330355882645,,,,,, +40,141099,,,,,,,,,,,,0.07023851573467255,,,,,, +40,141121,,,,,,,,,,,,,0.2288496047258377,0.07427766174077988,0.3387052118778229,0.10616689920425415,0.3377552330493927,0.07427766174077988 +40,141121,,,,,,,0.2296534925699234,0.07294157892465591,0.3437763452529907,0.11816728115081787,0.3254612982273102,,,,,,, +41,141149,,,,,,,,,,,,0.06043015792965889,,,,,, +41,141199,,,,,,,,,,,,0.07571858167648315,,,,,, +41,141249,,,,,,,,,,,,0.06372344493865967,,,,,, +41,141299,,,,,,,,,,,,0.07154802978038788,,,,,, +41,141349,,,,,,,,,,,,0.07050242274999619,,,,,, +41,141399,,,,,,,,,,,,0.06755977123975754,,,,,, +41,141449,,,,,,,,,,,,0.07720014452934265,,,,,, +41,141499,,,,,,,,,,,,0.07094880193471909,,,,,, +41,141549,,,,,,,,,,,,0.0818013995885849,,,,,, +41,141599,,,,,,,,,,,,0.06763298809528351,,,,,, +41,141649,,,,,,,,,,,,0.07776498794555664,,,,,, +41,141699,,,,,,,,,,,,0.07769908010959625,,,,,, +41,141749,,,,,,,,,,,,0.0744677409529686,,,,,, +41,141799,,,,,,,,,,,,0.07406546175479889,,,,,, +41,141849,,,,,,,,,,,,0.08222442865371704,,,,,, +41,141899,,,,,,,,,,,,0.08229053765535355,,,,,, +41,141949,,,,,,,,,,,,0.07171878963708878,,,,,, +41,141999,,,,,,,,,,,,0.07697946578264236,,,,,, +41,142049,,,,,,,,,,,,0.08109064400196075,,,,,, +41,142099,,,,,,,,,,,,0.07095794379711151,,,,,, +41,142149,,,,,,,,,,,,0.07678002119064331,,,,,, +41,142199,,,,,,,,,,,,0.08625718206167221,,,,,, +41,142249,,,,,,,,,,,,0.08269442617893219,,,,,, +41,142299,,,,,,,,,,,,0.07441311329603195,,,,,, +41,142349,,,,,,,,,,,,0.07820294052362442,,,,,, +41,142399,,,,,,,,,,,,0.05589307099580765,,,,,, +41,142449,,,,,,,,,,,,0.06680305302143097,,,,,, +41,142499,,,,,,,,,,,,0.06953553110361099,,,,,, +41,142549,,,,,,,,,,,,0.07559584081172943,,,,,, +41,142599,,,,,,,,,,,,0.08079232275485992,,,,,, +41,142649,,,,,,,,,,,,0.08238700032234192,,,,,, +41,142699,,,,,,,,,,,,0.07627320289611816,,,,,, +41,142749,,,,,,,,,,,,0.07829049229621887,,,,,, +41,142799,,,,,,,,,,,,0.08066815137863159,,,,,, +41,142849,,,,,,,,,,,,0.07800396531820297,,,,,, +41,142899,,,,,,,,,,,,0.07486964017152786,,,,,, +41,142949,,,,,,,,,,,,0.06547407060861588,,,,,, +41,142999,,,,,,,,,,,,0.07820919156074524,,,,,, +41,143049,,,,,,,,,,,,0.07062380015850067,,,,,, +41,143099,,,,,,,,,,,,0.07098576426506042,,,,,, +41,143149,,,,,,,,,,,,0.07600542902946472,,,,,, +41,143199,,,,,,,,,,,,0.06747184693813324,,,,,, +41,143249,,,,,,,,,,,,0.06014905869960785,,,,,, +41,143299,,,,,,,,,,,,0.0683431550860405,,,,,, +41,143349,,,,,,,,,,,,0.07199755311012268,,,,,, +41,143399,,,,,,,,,,,,0.08600801229476929,,,,,, +41,143449,,,,,,,,,,,,0.0721353217959404,,,,,, +41,143499,,,,,,,,,,,,0.08745332062244415,,,,,, +41,143549,,,,,,,,,,,,0.0818878710269928,,,,,, +41,143599,,,,,,,,,,,,0.0767504870891571,,,,,, +41,143649,,,,,,,,,,,,0.07361161708831787,,,,,, +41,143699,,,,,,,,,,,,0.07329818606376648,,,,,, +41,143749,,,,,,,,,,,,0.07134270668029785,,,,,, +41,143799,,,,,,,,,,,,0.06965231895446777,,,,,, +41,143849,,,,,,,,,,,,0.06364235281944275,,,,,, +41,143899,,,,,,,,,,,,0.06920432299375534,,,,,, +41,143949,,,,,,,,,,,,0.07534842193126678,,,,,, +41,143999,,,,,,,,,,,,0.07085682451725006,,,,,, +41,144049,,,,,,,,,,,,0.06418684124946594,,,,,, +41,144099,,,,,,,,,,,,0.07326871901750565,,,,,, +41,144149,,,,,,,,,,,,0.06410155445337296,,,,,, +41,144199,,,,,,,,,,,,0.07320883870124817,,,,,, +41,144249,,,,,,,,,,,,0.06682207435369492,,,,,, +41,144299,,,,,,,,,,,,0.08879376947879791,,,,,, +41,144349,,,,,,,,,,,,0.0763530433177948,,,,,, +41,144399,,,,,,,,,,,,0.07721630483865738,,,,,, +41,144449,,,,,,,,,,,,0.06710891425609589,,,,,, +41,144499,,,,,,,,,,,,0.07116958498954773,,,,,, +41,144549,,,,,,,,,,,,0.08025319874286652,,,,,, +41,144563,,,,,,,,,,,,,0.22865554690361023,0.07508407533168793,0.3525290787220001,0.09646278619766235,0.35757458209991455,0.07508407533168793 +41,144563,,,,,,,0.23024319112300873,0.07347944378852844,0.33439546823501587,0.1116713285446167,0.31983259320259094,,,,,,, +42,144599,,,,,,,,,,,,0.0648302286863327,,,,,, +42,144649,,,,,,,,,,,,0.06789422035217285,,,,,, +42,144699,,,,,,,,,,,,0.08085796236991882,,,,,, +42,144749,,,,,,,,,,,,0.07138095051050186,,,,,, +42,144799,,,,,,,,,,,,0.0809575691819191,,,,,, +42,144849,,,,,,,,,,,,0.06879829615354538,,,,,, +42,144899,,,,,,,,,,,,0.07667195796966553,,,,,, +42,144949,,,,,,,,,,,,0.0744297057390213,,,,,, +42,144999,,,,,,,,,,,,0.06863072514533997,,,,,, +42,145049,,,,,,,,,,,,0.07204745709896088,,,,,, +42,145099,,,,,,,,,,,,0.06828806549310684,,,,,, +42,145149,,,,,,,,,,,,0.07900264859199524,,,,,, +42,145199,,,,,,,,,,,,0.07871843874454498,,,,,, +42,145249,,,,,,,,,,,,0.06652387976646423,,,,,, +42,145299,,,,,,,,,,,,0.0699886679649353,,,,,, +42,145349,,,,,,,,,,,,0.06222032755613327,,,,,, +42,145399,,,,,,,,,,,,0.0719929039478302,,,,,, +42,145449,,,,,,,,,,,,0.06646433472633362,,,,,, +42,145499,,,,,,,,,,,,0.09082193672657013,,,,,, +42,145549,,,,,,,,,,,,0.06986922025680542,,,,,, +42,145599,,,,,,,,,,,,0.06899618357419968,,,,,, +42,145649,,,,,,,,,,,,0.07417872548103333,,,,,, +42,145699,,,,,,,,,,,,0.07322832942008972,,,,,, +42,145749,,,,,,,,,,,,0.07900041341781616,,,,,, +42,145799,,,,,,,,,,,,0.07194960117340088,,,,,, +42,145849,,,,,,,,,,,,0.08573929965496063,,,,,, +42,145899,,,,,,,,,,,,0.07581401616334915,,,,,, +42,145949,,,,,,,,,,,,0.06916408240795135,,,,,, +42,145999,,,,,,,,,,,,0.08016904443502426,,,,,, +42,146049,,,,,,,,,,,,0.06437475234270096,,,,,, +42,146099,,,,,,,,,,,,0.0646328330039978,,,,,, +42,146149,,,,,,,,,,,,0.06884711980819702,,,,,, +42,146199,,,,,,,,,,,,0.0643484964966774,,,,,, +42,146249,,,,,,,,,,,,0.0653890073299408,,,,,, +42,146299,,,,,,,,,,,,0.08436694741249084,,,,,, +42,146349,,,,,,,,,,,,0.07401902973651886,,,,,, +42,146399,,,,,,,,,,,,0.0786563903093338,,,,,, +42,146449,,,,,,,,,,,,0.0743197351694107,,,,,, +42,146499,,,,,,,,,,,,0.07644570618867874,,,,,, +42,146549,,,,,,,,,,,,0.07288454473018646,,,,,, +42,146599,,,,,,,,,,,,0.06827274709939957,,,,,, +42,146649,,,,,,,,,,,,0.07506605982780457,,,,,, +42,146699,,,,,,,,,,,,0.07835449278354645,,,,,, +42,146749,,,,,,,,,,,,0.07048345357179642,,,,,, +42,146799,,,,,,,,,,,,0.07655242085456848,,,,,, +42,146849,,,,,,,,,,,,0.07031098008155823,,,,,, +42,146899,,,,,,,,,,,,0.06885427236557007,,,,,, +42,146949,,,,,,,,,,,,0.07870414853096008,,,,,, +42,146999,,,,,,,,,,,,0.0813731998205185,,,,,, +42,147049,,,,,,,,,,,,0.07362961024045944,,,,,, +42,147099,,,,,,,,,,,,0.08733491599559784,,,,,, +42,147149,,,,,,,,,,,,0.07753477990627289,,,,,, +42,147199,,,,,,,,,,,,0.08208310604095459,,,,,, +42,147249,,,,,,,,,,,,0.07395204901695251,,,,,, +42,147299,,,,,,,,,,,,0.0671776607632637,,,,,, +42,147349,,,,,,,,,,,,0.07377183437347412,,,,,, +42,147399,,,,,,,,,,,,0.0845305472612381,,,,,, +42,147449,,,,,,,,,,,,0.06242941692471504,,,,,, +42,147499,,,,,,,,,,,,0.07043640315532684,,,,,, +42,147549,,,,,,,,,,,,0.07858969271183014,,,,,, +42,147599,,,,,,,,,,,,0.07310663163661957,,,,,, +42,147649,,,,,,,,,,,,0.06304357945919037,,,,,, +42,147699,,,,,,,,,,,,0.08178865909576416,,,,,, +42,147749,,,,,,,,,,,,0.07624813914299011,,,,,, +42,147799,,,,,,,,,,,,0.059606730937957764,,,,,, +42,147849,,,,,,,,,,,,0.07248446345329285,,,,,, +42,147899,,,,,,,,,,,,0.0690859854221344,,,,,, +42,147949,,,,,,,,,,,,0.07317901402711868,,,,,, +42,147999,,,,,,,,,,,,0.06771007925271988,,,,,, +42,148005,,,,,,,,,,,,,0.23139674961566925,0.07836850732564926,0.34901243448257446,0.05693906545639038,0.3587239980697632,0.07836850732564926 +42,148005,,,,,,,0.22894378006458282,0.07262561470270157,0.3492870628833771,0.1219826340675354,0.3306824862957001,,,,,,, +43,148049,,,,,,,,,,,,0.07966427505016327,,,,,, +43,148099,,,,,,,,,,,,0.0741758793592453,,,,,, +43,148149,,,,,,,,,,,,0.07832050323486328,,,,,, +43,148199,,,,,,,,,,,,0.07287615537643433,,,,,, +43,148249,,,,,,,,,,,,0.07547897100448608,,,,,, +43,148299,,,,,,,,,,,,0.07169412076473236,,,,,, +43,148349,,,,,,,,,,,,0.06553951650857925,,,,,, +43,148399,,,,,,,,,,,,0.07968366146087646,,,,,, +43,148449,,,,,,,,,,,,0.07463482022285461,,,,,, +43,148499,,,,,,,,,,,,0.07763500511646271,,,,,, +43,148549,,,,,,,,,,,,0.06984865665435791,,,,,, +43,148599,,,,,,,,,,,,0.06246859207749367,,,,,, +43,148649,,,,,,,,,,,,0.07479600608348846,,,,,, +43,148699,,,,,,,,,,,,0.06047982722520828,,,,,, +43,148749,,,,,,,,,,,,0.06588621437549591,,,,,, +43,148799,,,,,,,,,,,,0.07115654647350311,,,,,, +43,148849,,,,,,,,,,,,0.06853950768709183,,,,,, +43,148899,,,,,,,,,,,,0.06964556127786636,,,,,, +43,148949,,,,,,,,,,,,0.07713678479194641,,,,,, +43,148999,,,,,,,,,,,,0.0719980001449585,,,,,, +43,149049,,,,,,,,,,,,0.07376747578382492,,,,,, +43,149099,,,,,,,,,,,,0.0770195722579956,,,,,, +43,149149,,,,,,,,,,,,0.06900494545698166,,,,,, +43,149199,,,,,,,,,,,,0.06646633893251419,,,,,, +43,149249,,,,,,,,,,,,0.0727701485157013,,,,,, +43,149299,,,,,,,,,,,,0.07522689551115036,,,,,, +43,149349,,,,,,,,,,,,0.07099664211273193,,,,,, +43,149399,,,,,,,,,,,,0.07410779595375061,,,,,, +43,149449,,,,,,,,,,,,0.07694560289382935,,,,,, +43,149499,,,,,,,,,,,,0.08639803528785706,,,,,, +43,149549,,,,,,,,,,,,0.06835438311100006,,,,,, +43,149599,,,,,,,,,,,,0.06404869258403778,,,,,, +43,149649,,,,,,,,,,,,0.07207506895065308,,,,,, +43,149699,,,,,,,,,,,,0.0692959576845169,,,,,, +43,149749,,,,,,,,,,,,0.0834290087223053,,,,,, +43,149799,,,,,,,,,,,,0.07224659621715546,,,,,, +43,149849,,,,,,,,,,,,0.0741732120513916,,,,,, +43,149899,,,,,,,,,,,,0.08189978450536728,,,,,, +43,149949,,,,,,,,,,,,0.07914911210536957,,,,,, +43,149999,,,,,,,,,,,,0.07146921753883362,,,,,, +43,150049,,,,,,,,,,,,0.08207380771636963,,,,,, +43,150099,,,,,,,,,,,,0.0672551691532135,,,,,, +43,150149,,,,,,,,,,,,0.07017284631729126,,,,,, +43,150199,,,,,,,,,,,,0.07017350196838379,,,,,, +43,150249,,,,,,,,,,,,0.08199476450681686,,,,,, +43,150299,,,,,,,,,,,,0.07274351269006729,,,,,, +43,150349,,,,,,,,,,,,0.0850733146071434,,,,,, +43,150399,,,,,,,,,,,,0.06035356968641281,,,,,, +43,150449,,,,,,,,,,,,0.06420155614614487,,,,,, +43,150499,,,,,,,,,,,,0.06886908411979675,,,,,, +43,150549,,,,,,,,,,,,0.06900697201490402,,,,,, +43,150599,,,,,,,,,,,,0.07259064167737961,,,,,, +43,150649,,,,,,,,,,,,0.07902200520038605,,,,,, +43,150699,,,,,,,,,,,,0.07301706820726395,,,,,, +43,150749,,,,,,,,,,,,0.0753074586391449,,,,,, +43,150799,,,,,,,,,,,,0.07899439334869385,,,,,, +43,150849,,,,,,,,,,,,0.062154319137334824,,,,,, +43,150899,,,,,,,,,,,,0.08622822165489197,,,,,, +43,150949,,,,,,,,,,,,0.08859177678823471,,,,,, +43,150999,,,,,,,,,,,,0.07219246029853821,,,,,, +43,151049,,,,,,,,,,,,0.08285172283649445,,,,,, +43,151099,,,,,,,,,,,,0.07125720381736755,,,,,, +43,151149,,,,,,,,,,,,0.08141373097896576,,,,,, +43,151199,,,,,,,,,,,,0.06876103579998016,,,,,, +43,151249,,,,,,,,,,,,0.07529295980930328,,,,,, +43,151299,,,,,,,,,,,,0.07730977237224579,,,,,, +43,151349,,,,,,,,,,,,0.06945503503084183,,,,,, +43,151399,,,,,,,,,,,,0.06507659703493118,,,,,, +43,151447,,,,,,,,,,,,,0.2320733368396759,0.07897547632455826,0.3661450743675232,0.04963499307632446,0.3676866590976715,0.07897547632455826 +43,151447,,,,,,,0.22866520285606384,0.072484090924263,0.3517299294471741,0.12368792295455933,0.33375880122184753,,,,,,, +44,151449,,,,,,,,,,,,0.0709211602807045,,,,,, +44,151499,,,,,,,,,,,,0.07574306428432465,,,,,, +44,151549,,,,,,,,,,,,0.06831516325473785,,,,,, +44,151599,,,,,,,,,,,,0.07797589898109436,,,,,, +44,151649,,,,,,,,,,,,0.0698813870549202,,,,,, +44,151699,,,,,,,,,,,,0.07265184074640274,,,,,, +44,151749,,,,,,,,,,,,0.06899507343769073,,,,,, +44,151799,,,,,,,,,,,,0.08796960860490799,,,,,, +44,151849,,,,,,,,,,,,0.06485342979431152,,,,,, +44,151899,,,,,,,,,,,,0.05728229135274887,,,,,, +44,151949,,,,,,,,,,,,0.07555641233921051,,,,,, +44,151999,,,,,,,,,,,,0.07586412131786346,,,,,, +44,152049,,,,,,,,,,,,0.06620877981185913,,,,,, +44,152099,,,,,,,,,,,,0.07722918689250946,,,,,, +44,152149,,,,,,,,,,,,0.08009624481201172,,,,,, +44,152199,,,,,,,,,,,,0.07840009033679962,,,,,, +44,152249,,,,,,,,,,,,0.081382617354393,,,,,, +44,152299,,,,,,,,,,,,0.0640629231929779,,,,,, +44,152349,,,,,,,,,,,,0.0701623260974884,,,,,, +44,152399,,,,,,,,,,,,0.06919102370738983,,,,,, +44,152449,,,,,,,,,,,,0.08620357513427734,,,,,, +44,152499,,,,,,,,,,,,0.07200850546360016,,,,,, +44,152549,,,,,,,,,,,,0.07333090901374817,,,,,, +44,152599,,,,,,,,,,,,0.06451340019702911,,,,,, +44,152649,,,,,,,,,,,,0.08959741145372391,,,,,, +44,152699,,,,,,,,,,,,0.07014471292495728,,,,,, +44,152749,,,,,,,,,,,,0.07834580540657043,,,,,, +44,152799,,,,,,,,,,,,0.078921839594841,,,,,, +44,152849,,,,,,,,,,,,0.072564497590065,,,,,, +44,152899,,,,,,,,,,,,0.07273094356060028,,,,,, +44,152949,,,,,,,,,,,,0.07115234434604645,,,,,, +44,152999,,,,,,,,,,,,0.08458167314529419,,,,,, +44,153049,,,,,,,,,,,,0.0728573277592659,,,,,, +44,153099,,,,,,,,,,,,0.06689366698265076,,,,,, +44,153149,,,,,,,,,,,,0.07483960688114166,,,,,, +44,153199,,,,,,,,,,,,0.06879794597625732,,,,,, +44,153249,,,,,,,,,,,,0.06737545132637024,,,,,, +44,153299,,,,,,,,,,,,0.06921930611133575,,,,,, +44,153349,,,,,,,,,,,,0.0730314701795578,,,,,, +44,153399,,,,,,,,,,,,0.07451607286930084,,,,,, +44,153449,,,,,,,,,,,,0.08031740039587021,,,,,, +44,153499,,,,,,,,,,,,0.07812222838401794,,,,,, +44,153549,,,,,,,,,,,,0.07616758346557617,,,,,, +44,153599,,,,,,,,,,,,0.06471817195415497,,,,,, +44,153649,,,,,,,,,,,,0.06168743222951889,,,,,, +44,153699,,,,,,,,,,,,0.07006799429655075,,,,,, +44,153749,,,,,,,,,,,,0.061446309089660645,,,,,, +44,153799,,,,,,,,,,,,0.0666206106543541,,,,,, +44,153849,,,,,,,,,,,,0.07830044627189636,,,,,, +44,153899,,,,,,,,,,,,0.07470966875553131,,,,,, +44,153949,,,,,,,,,,,,0.07077920436859131,,,,,, +44,153999,,,,,,,,,,,,0.07702980190515518,,,,,, +44,154049,,,,,,,,,,,,0.06734249740839005,,,,,, +44,154099,,,,,,,,,,,,0.08376196026802063,,,,,, +44,154149,,,,,,,,,,,,0.0633026659488678,,,,,, +44,154199,,,,,,,,,,,,0.07612080872058868,,,,,, +44,154249,,,,,,,,,,,,0.06537935137748718,,,,,, +44,154299,,,,,,,,,,,,0.07771992683410645,,,,,, +44,154349,,,,,,,,,,,,0.06983466446399689,,,,,, +44,154399,,,,,,,,,,,,0.06257488578557968,,,,,, +44,154449,,,,,,,,,,,,0.06852452456951141,,,,,, +44,154499,,,,,,,,,,,,0.06375408172607422,,,,,, +44,154549,,,,,,,,,,,,0.07158557325601578,,,,,, +44,154599,,,,,,,,,,,,0.06153738498687744,,,,,, +44,154649,,,,,,,,,,,,0.06879519671201706,,,,,, +44,154699,,,,,,,,,,,,0.07889416813850403,,,,,, +44,154749,,,,,,,,,,,,0.05962304770946503,,,,,, +44,154799,,,,,,,,,,,,0.06667624413967133,,,,,, +44,154849,,,,,,,,,,,,0.07300592958927155,,,,,, +44,154889,,,,,,,,,,,,,0.2277422547340393,0.07438930869102478,0.35258805751800537,0.10482341051101685,0.35997194051742554,0.07438930869102478 +44,154889,,,,,,,0.22837334871292114,0.07228655368089676,0.3551008105278015,0.1260787844657898,0.33641374111175537,,,,,,, +45,154899,,,,,,,,,,,,0.08040035516023636,,,,,, +45,154949,,,,,,,,,,,,0.07637730240821838,,,,,, +45,154999,,,,,,,,,,,,0.06741379201412201,,,,,, +45,155049,,,,,,,,,,,,0.07246473431587219,,,,,, +45,155099,,,,,,,,,,,,0.0594308115541935,,,,,, +45,155149,,,,,,,,,,,,0.06663896143436432,,,,,, +45,155199,,,,,,,,,,,,0.06862375140190125,,,,,, +45,155249,,,,,,,,,,,,0.07004319131374359,,,,,, +45,155299,,,,,,,,,,,,0.06496061384677887,,,,,, +45,155349,,,,,,,,,,,,0.061446815729141235,,,,,, +45,155399,,,,,,,,,,,,0.06619083136320114,,,,,, +45,155449,,,,,,,,,,,,0.06658528745174408,,,,,, +45,155499,,,,,,,,,,,,0.058791935443878174,,,,,, +45,155549,,,,,,,,,,,,0.0669175535440445,,,,,, +45,155599,,,,,,,,,,,,0.07822968065738678,,,,,, +45,155649,,,,,,,,,,,,0.06827065348625183,,,,,, +45,155699,,,,,,,,,,,,0.07983269542455673,,,,,, +45,155749,,,,,,,,,,,,0.0704665333032608,,,,,, +45,155799,,,,,,,,,,,,0.06313806772232056,,,,,, +45,155849,,,,,,,,,,,,0.07210692018270493,,,,,, +45,155899,,,,,,,,,,,,0.07641277462244034,,,,,, +45,155949,,,,,,,,,,,,0.07019320130348206,,,,,, +45,155999,,,,,,,,,,,,0.06433720141649246,,,,,, +45,156049,,,,,,,,,,,,0.08022847771644592,,,,,, +45,156099,,,,,,,,,,,,0.06568963825702667,,,,,, +45,156149,,,,,,,,,,,,0.0772038996219635,,,,,, +45,156199,,,,,,,,,,,,0.0683688148856163,,,,,, +45,156249,,,,,,,,,,,,0.073116235435009,,,,,, +45,156299,,,,,,,,,,,,0.06586895883083344,,,,,, +45,156349,,,,,,,,,,,,0.07156090438365936,,,,,, +45,156399,,,,,,,,,,,,0.07882367819547653,,,,,, +45,156449,,,,,,,,,,,,0.06808942556381226,,,,,, +45,156499,,,,,,,,,,,,0.0755137950181961,,,,,, +45,156549,,,,,,,,,,,,0.06268247961997986,,,,,, +45,156599,,,,,,,,,,,,0.07046584039926529,,,,,, +45,156649,,,,,,,,,,,,0.07147686183452606,,,,,, +45,156699,,,,,,,,,,,,0.06974808871746063,,,,,, +45,156749,,,,,,,,,,,,0.06870168447494507,,,,,, +45,156799,,,,,,,,,,,,0.0657656341791153,,,,,, +45,156849,,,,,,,,,,,,0.07880338281393051,,,,,, +45,156899,,,,,,,,,,,,0.0711187794804573,,,,,, +45,156949,,,,,,,,,,,,0.08346910774707794,,,,,, +45,156999,,,,,,,,,,,,0.07910501956939697,,,,,, +45,157049,,,,,,,,,,,,0.07966357469558716,,,,,, +45,157099,,,,,,,,,,,,0.075572170317173,,,,,, +45,157149,,,,,,,,,,,,0.08379305899143219,,,,,, +45,157199,,,,,,,,,,,,0.07786168903112411,,,,,, +45,157249,,,,,,,,,,,,0.07109019160270691,,,,,, +45,157299,,,,,,,,,,,,0.07592450082302094,,,,,, +45,157349,,,,,,,,,,,,0.07208146154880524,,,,,, +45,157399,,,,,,,,,,,,0.07186365127563477,,,,,, +45,157449,,,,,,,,,,,,0.0723448321223259,,,,,, +45,157499,,,,,,,,,,,,0.06812139600515366,,,,,, +45,157549,,,,,,,,,,,,0.07958795130252838,,,,,, +45,157599,,,,,,,,,,,,0.07285013794898987,,,,,, +45,157649,,,,,,,,,,,,0.07348427176475525,,,,,, +45,157699,,,,,,,,,,,,0.06661348044872284,,,,,, +45,157749,,,,,,,,,,,,0.07147993892431259,,,,,, +45,157799,,,,,,,,,,,,0.08205652981996536,,,,,, +45,157849,,,,,,,,,,,,0.06320598721504211,,,,,, +45,157899,,,,,,,,,,,,0.06212182343006134,,,,,, +45,157949,,,,,,,,,,,,0.06836815178394318,,,,,, +45,157999,,,,,,,,,,,,0.06441091746091843,,,,,, +45,158049,,,,,,,,,,,,0.0706278532743454,,,,,, +45,158099,,,,,,,,,,,,0.06472130864858627,,,,,, +45,158149,,,,,,,,,,,,0.07372733950614929,,,,,, +45,158199,,,,,,,,,,,,0.0632847398519516,,,,,, +45,158249,,,,,,,,,,,,0.07335159182548523,,,,,, +45,158299,,,,,,,,,,,,0.06376171112060547,,,,,, +45,158331,,,,,,,,,,,,,0.22755153477191925,0.07686339318752289,0.3279765248298645,0.07505106925964355,0.3649863302707672,0.07686339318752289 +45,158331,,,,,,,0.22700433433055878,0.07166759669780731,0.3654830753803253,0.13356244564056396,0.34674519300460815,,,,,,, +46,158349,,,,,,,,,,,,0.06912171840667725,,,,,, +46,158399,,,,,,,,,,,,0.07472491264343262,,,,,, +46,158449,,,,,,,,,,,,0.06559478491544724,,,,,, +46,158499,,,,,,,,,,,,0.0768679603934288,,,,,, +46,158549,,,,,,,,,,,,0.07324410229921341,,,,,, +46,158599,,,,,,,,,,,,0.06465131789445877,,,,,, +46,158649,,,,,,,,,,,,0.06993371993303299,,,,,, +46,158699,,,,,,,,,,,,0.053694695234298706,,,,,, +46,158749,,,,,,,,,,,,0.08160385489463806,,,,,, +46,158799,,,,,,,,,,,,0.0749637633562088,,,,,, +46,158849,,,,,,,,,,,,0.07982151210308075,,,,,, +46,158899,,,,,,,,,,,,0.056069809943437576,,,,,, +46,158949,,,,,,,,,,,,0.06999370455741882,,,,,, +46,158999,,,,,,,,,,,,0.07635486125946045,,,,,, +46,159049,,,,,,,,,,,,0.07419592142105103,,,,,, +46,159099,,,,,,,,,,,,0.0780695378780365,,,,,, +46,159149,,,,,,,,,,,,0.06816825270652771,,,,,, +46,159199,,,,,,,,,,,,0.06919132173061371,,,,,, +46,159249,,,,,,,,,,,,0.05784927308559418,,,,,, +46,159299,,,,,,,,,,,,0.0698099285364151,,,,,, +46,159349,,,,,,,,,,,,0.07208041846752167,,,,,, +46,159399,,,,,,,,,,,,0.07022260874509811,,,,,, +46,159449,,,,,,,,,,,,0.06360991299152374,,,,,, +46,159499,,,,,,,,,,,,0.062177930027246475,,,,,, +46,159549,,,,,,,,,,,,0.07400497794151306,,,,,, +46,159599,,,,,,,,,,,,0.07475902140140533,,,,,, +46,159649,,,,,,,,,,,,0.0771188884973526,,,,,, +46,159699,,,,,,,,,,,,0.06707632541656494,,,,,, +46,159749,,,,,,,,,,,,0.0889388918876648,,,,,, +46,159799,,,,,,,,,,,,0.07054860144853592,,,,,, +46,159849,,,,,,,,,,,,0.059501759707927704,,,,,, +46,159899,,,,,,,,,,,,0.06270907074213028,,,,,, +46,159949,,,,,,,,,,,,0.06663341075181961,,,,,, +46,159999,,,,,,,,,,,,0.07367339730262756,,,,,, +46,160049,,,,,,,,,,,,0.07023831456899643,,,,,, +46,160099,,,,,,,,,,,,0.06321097910404205,,,,,, +46,160149,,,,,,,,,,,,0.06338237226009369,,,,,, +46,160199,,,,,,,,,,,,0.06852518767118454,,,,,, +46,160249,,,,,,,,,,,,0.07953210175037384,,,,,, +46,160299,,,,,,,,,,,,0.06750638782978058,,,,,, +46,160349,,,,,,,,,,,,0.06756521761417389,,,,,, +46,160399,,,,,,,,,,,,0.0756300687789917,,,,,, +46,160449,,,,,,,,,,,,0.06602627038955688,,,,,, +46,160499,,,,,,,,,,,,0.0742906779050827,,,,,, +46,160549,,,,,,,,,,,,0.07807624340057373,,,,,, +46,160599,,,,,,,,,,,,0.07137149572372437,,,,,, +46,160649,,,,,,,,,,,,0.06339766085147858,,,,,, +46,160699,,,,,,,,,,,,0.06898385286331177,,,,,, +46,160749,,,,,,,,,,,,0.0686003565788269,,,,,, +46,160799,,,,,,,,,,,,0.0719580426812172,,,,,, +46,160849,,,,,,,,,,,,0.06950993090867996,,,,,, +46,160899,,,,,,,,,,,,0.0664656013250351,,,,,, +46,160949,,,,,,,,,,,,0.0667659118771553,,,,,, +46,160999,,,,,,,,,,,,0.06591466069221497,,,,,, +46,161049,,,,,,,,,,,,0.05358333885669708,,,,,, +46,161099,,,,,,,,,,,,0.07756876945495605,,,,,, +46,161149,,,,,,,,,,,,0.06412734091281891,,,,,, +46,161199,,,,,,,,,,,,0.0790894404053688,,,,,, +46,161249,,,,,,,,,,,,0.08076222240924835,,,,,, +46,161299,,,,,,,,,,,,0.07979314029216766,,,,,, +46,161349,,,,,,,,,,,,0.06698831915855408,,,,,, +46,161399,,,,,,,,,,,,0.06832186877727509,,,,,, +46,161449,,,,,,,,,,,,0.0707513689994812,,,,,, +46,161499,,,,,,,,,,,,0.07616542279720306,,,,,, +46,161549,,,,,,,,,,,,0.07054148614406586,,,,,, +46,161599,,,,,,,,,,,,0.06284153461456299,,,,,, +46,161649,,,,,,,,,,,,0.07674790918827057,,,,,, +46,161699,,,,,,,,,,,,0.06296394765377045,,,,,, +46,161749,,,,,,,,,,,,0.07395896315574646,,,,,, +46,161773,,,,,,,,,,,,,0.22951743006706238,0.096218042075634,0.24673661589622498,-0.15785646438598633,0.3625947833061218,0.096218042075634 +46,161773,,,,,,,0.22649788856506348,0.07132675498723984,0.37106412649154663,0.1376855969429016,0.35196518898010254,,,,,,, +47,161799,,,,,,,,,,,,0.06882300972938538,,,,,, +47,161849,,,,,,,,,,,,0.0732683539390564,,,,,, +47,161899,,,,,,,,,,,,0.07440175861120224,,,,,, +47,161949,,,,,,,,,,,,0.06856689602136612,,,,,, +47,161999,,,,,,,,,,,,0.06486500799655914,,,,,, +47,162049,,,,,,,,,,,,0.06489388644695282,,,,,, +47,162099,,,,,,,,,,,,0.07305073738098145,,,,,, +47,162149,,,,,,,,,,,,0.06707372516393661,,,,,, +47,162199,,,,,,,,,,,,0.07836569845676422,,,,,, +47,162249,,,,,,,,,,,,0.07916222512722015,,,,,, +47,162299,,,,,,,,,,,,0.06040310114622116,,,,,, +47,162349,,,,,,,,,,,,0.061515193432569504,,,,,, +47,162399,,,,,,,,,,,,0.07566703855991364,,,,,, +47,162449,,,,,,,,,,,,0.06819161027669907,,,,,, +47,162499,,,,,,,,,,,,0.06929775327444077,,,,,, +47,162549,,,,,,,,,,,,0.07675427198410034,,,,,, +47,162599,,,,,,,,,,,,0.06696870177984238,,,,,, +47,162649,,,,,,,,,,,,0.06736117601394653,,,,,, +47,162699,,,,,,,,,,,,0.059813156723976135,,,,,, +47,162749,,,,,,,,,,,,0.07182241976261139,,,,,, +47,162799,,,,,,,,,,,,0.0652354285120964,,,,,, +47,162849,,,,,,,,,,,,0.07548605650663376,,,,,, +47,162899,,,,,,,,,,,,0.07434898614883423,,,,,, +47,162949,,,,,,,,,,,,0.08055916428565979,,,,,, +47,162999,,,,,,,,,,,,0.07314208149909973,,,,,, +47,163049,,,,,,,,,,,,0.07747090607881546,,,,,, +47,163099,,,,,,,,,,,,0.07144507765769958,,,,,, +47,163149,,,,,,,,,,,,0.0726737305521965,,,,,, +47,163199,,,,,,,,,,,,0.06974548101425171,,,,,, +47,163249,,,,,,,,,,,,0.06314726173877716,,,,,, +47,163299,,,,,,,,,,,,0.06659945845603943,,,,,, +47,163349,,,,,,,,,,,,0.07486260682344437,,,,,, +47,163399,,,,,,,,,,,,0.07988367974758148,,,,,, +47,163449,,,,,,,,,,,,0.07186594605445862,,,,,, +47,163499,,,,,,,,,,,,0.08939732611179352,,,,,, +47,163549,,,,,,,,,,,,0.06354089826345444,,,,,, +47,163599,,,,,,,,,,,,0.07142087817192078,,,,,, +47,163649,,,,,,,,,,,,0.07652730494737625,,,,,, +47,163699,,,,,,,,,,,,0.059237729758024216,,,,,, +47,163749,,,,,,,,,,,,0.07464782148599625,,,,,, +47,163799,,,,,,,,,,,,0.06361028552055359,,,,,, +47,163849,,,,,,,,,,,,0.07176459580659866,,,,,, +47,163899,,,,,,,,,,,,0.0774928405880928,,,,,, +47,163949,,,,,,,,,,,,0.07142089307308197,,,,,, +47,163999,,,,,,,,,,,,0.07226118445396423,,,,,, +47,164049,,,,,,,,,,,,0.0735541582107544,,,,,, +47,164099,,,,,,,,,,,,0.0708843395113945,,,,,, +47,164149,,,,,,,,,,,,0.06703665852546692,,,,,, +47,164199,,,,,,,,,,,,0.06965973228216171,,,,,, +47,164249,,,,,,,,,,,,0.0688219666481018,,,,,, +47,164299,,,,,,,,,,,,0.06458857655525208,,,,,, +47,164349,,,,,,,,,,,,0.06724141538143158,,,,,, +47,164399,,,,,,,,,,,,0.06860856711864471,,,,,, +47,164449,,,,,,,,,,,,0.07281863689422607,,,,,, +47,164499,,,,,,,,,,,,0.07001037150621414,,,,,, +47,164549,,,,,,,,,,,,0.06996439397335052,,,,,, +47,164599,,,,,,,,,,,,0.06712842732667923,,,,,, +47,164649,,,,,,,,,,,,0.0782262533903122,,,,,, +47,164699,,,,,,,,,,,,0.07880108058452606,,,,,, +47,164749,,,,,,,,,,,,0.06755116581916809,,,,,, +47,164799,,,,,,,,,,,,0.07783257961273193,,,,,, +47,164849,,,,,,,,,,,,0.07277359068393707,,,,,, +47,164899,,,,,,,,,,,,0.07069884240627289,,,,,, +47,164949,,,,,,,,,,,,0.06722887605428696,,,,,, +47,164999,,,,,,,,,,,,0.07269686460494995,,,,,, +47,165049,,,,,,,,,,,,0.06969142705202103,,,,,, +47,165099,,,,,,,,,,,,0.06591014564037323,,,,,, +47,165149,,,,,,,,,,,,0.07288477569818497,,,,,, +47,165199,,,,,,,,,,,,0.06932549178600311,,,,,, +47,165215,,,,,,,,,,,,,0.2314881980419159,0.09092248231172562,0.28271207213401794,-0.09413135051727295,0.36759087443351746,0.09092248231172562 +47,165215,,,,,,,0.22616997361183167,0.0712214857339859,0.37277740240097046,0.138960599899292,0.35411661863327026,,,,,,, +48,165249,,,,,,,,,,,,0.07013413310050964,,,,,, +48,165299,,,,,,,,,,,,0.0695006251335144,,,,,, +48,165349,,,,,,,,,,,,0.07340028882026672,,,,,, +48,165399,,,,,,,,,,,,0.06716766953468323,,,,,, +48,165449,,,,,,,,,,,,0.061738237738609314,,,,,, +48,165499,,,,,,,,,,,,0.0755777359008789,,,,,, +48,165549,,,,,,,,,,,,0.0751478299498558,,,,,, +48,165599,,,,,,,,,,,,0.07169143110513687,,,,,, +48,165649,,,,,,,,,,,,0.07172665745019913,,,,,, +48,165699,,,,,,,,,,,,0.06351920962333679,,,,,, +48,165749,,,,,,,,,,,,0.07350535690784454,,,,,, +48,165799,,,,,,,,,,,,0.0681467205286026,,,,,, +48,165849,,,,,,,,,,,,0.07441209256649017,,,,,, +48,165899,,,,,,,,,,,,0.07316552102565765,,,,,, +48,165949,,,,,,,,,,,,0.07425135374069214,,,,,, +48,165999,,,,,,,,,,,,0.06575115025043488,,,,,, +48,166049,,,,,,,,,,,,0.07466667145490646,,,,,, +48,166099,,,,,,,,,,,,0.058700501918792725,,,,,, +48,166149,,,,,,,,,,,,0.07832902669906616,,,,,, +48,166199,,,,,,,,,,,,0.06560428440570831,,,,,, +48,166249,,,,,,,,,,,,0.0794866532087326,,,,,, +48,166299,,,,,,,,,,,,0.07470519840717316,,,,,, +48,166349,,,,,,,,,,,,0.07088074833154678,,,,,, +48,166399,,,,,,,,,,,,0.07618175446987152,,,,,, +48,166449,,,,,,,,,,,,0.06759239733219147,,,,,, +48,166499,,,,,,,,,,,,0.07657858729362488,,,,,, +48,166549,,,,,,,,,,,,0.06458644568920135,,,,,, +48,166599,,,,,,,,,,,,0.07246559113264084,,,,,, +48,166649,,,,,,,,,,,,0.07748058438301086,,,,,, +48,166699,,,,,,,,,,,,0.06781089305877686,,,,,, +48,166749,,,,,,,,,,,,0.08465702831745148,,,,,, +48,166799,,,,,,,,,,,,0.07005608081817627,,,,,, +48,166849,,,,,,,,,,,,0.07468591630458832,,,,,, +48,166899,,,,,,,,,,,,0.0741991177201271,,,,,, +48,166949,,,,,,,,,,,,0.08224460482597351,,,,,, +48,166999,,,,,,,,,,,,0.06265448033809662,,,,,, +48,167049,,,,,,,,,,,,0.06304478645324707,,,,,, +48,167099,,,,,,,,,,,,0.06324459612369537,,,,,, +48,167149,,,,,,,,,,,,0.07193954288959503,,,,,, +48,167199,,,,,,,,,,,,0.06349040567874908,,,,,, +48,167249,,,,,,,,,,,,0.07408365607261658,,,,,, +48,167299,,,,,,,,,,,,0.08193898946046829,,,,,, +48,167349,,,,,,,,,,,,0.06893602013587952,,,,,, +48,167399,,,,,,,,,,,,0.06797224283218384,,,,,, +48,167449,,,,,,,,,,,,0.07028096169233322,,,,,, +48,167499,,,,,,,,,,,,0.07160705327987671,,,,,, +48,167549,,,,,,,,,,,,0.07574593275785446,,,,,, +48,167599,,,,,,,,,,,,0.07136869430541992,,,,,, +48,167649,,,,,,,,,,,,0.0840001329779625,,,,,, +48,167699,,,,,,,,,,,,0.06718192249536514,,,,,, +48,167749,,,,,,,,,,,,0.06839506328105927,,,,,, +48,167799,,,,,,,,,,,,0.07034757733345032,,,,,, +48,167849,,,,,,,,,,,,0.06393830478191376,,,,,, +48,167899,,,,,,,,,,,,0.06633371114730835,,,,,, +48,167949,,,,,,,,,,,,0.07167097926139832,,,,,, +48,167999,,,,,,,,,,,,0.06986512243747711,,,,,, +48,168049,,,,,,,,,,,,0.06595920026302338,,,,,, +48,168099,,,,,,,,,,,,0.06250161677598953,,,,,, +48,168149,,,,,,,,,,,,0.07137787342071533,,,,,, +48,168199,,,,,,,,,,,,0.07819555699825287,,,,,, +48,168249,,,,,,,,,,,,0.07736425846815109,,,,,, +48,168299,,,,,,,,,,,,0.07046273350715637,,,,,, +48,168349,,,,,,,,,,,,0.05890090763568878,,,,,, +48,168399,,,,,,,,,,,,0.07269260287284851,,,,,, +48,168449,,,,,,,,,,,,0.06833893060684204,,,,,, +48,168499,,,,,,,,,,,,0.06481938064098358,,,,,, +48,168549,,,,,,,,,,,,0.06312844157218933,,,,,, +48,168599,,,,,,,,,,,,0.07185371220111847,,,,,, +48,168649,,,,,,,,,,,,0.07741567492485046,,,,,, +48,168657,,,,,,,,,,,,,0.2268536239862442,0.07471787929534912,0.3614013195037842,0.10086947679519653,0.37134456634521484,0.07471787929534912 +48,168657,,,,,,,0.22599294781684875,0.07110878080129623,0.37460270524024963,0.14032137393951416,0.3556455373764038,,,,,,, +49,168699,,,,,,,,,,,,0.06112327426671982,,,,,, +49,168749,,,,,,,,,,,,0.0676560252904892,,,,,, +49,168799,,,,,,,,,,,,0.06503058969974518,,,,,, +49,168849,,,,,,,,,,,,0.06493338942527771,,,,,, +49,168899,,,,,,,,,,,,0.07990764081478119,,,,,, +49,168949,,,,,,,,,,,,0.06788995862007141,,,,,, +49,168999,,,,,,,,,,,,0.08211641758680344,,,,,, +49,169049,,,,,,,,,,,,0.06446260213851929,,,,,, +49,169099,,,,,,,,,,,,0.0643077939748764,,,,,, +49,169149,,,,,,,,,,,,0.07724910974502563,,,,,, +49,169199,,,,,,,,,,,,0.07440831512212753,,,,,, +49,169249,,,,,,,,,,,,0.07309721410274506,,,,,, +49,169299,,,,,,,,,,,,0.058788567781448364,,,,,, +49,169349,,,,,,,,,,,,0.07458855211734772,,,,,, +49,169399,,,,,,,,,,,,0.07275357097387314,,,,,, +49,169449,,,,,,,,,,,,0.07423854619264603,,,,,, +49,169499,,,,,,,,,,,,0.0674542561173439,,,,,, +49,169549,,,,,,,,,,,,0.06587109714746475,,,,,, +49,169599,,,,,,,,,,,,0.060980573296546936,,,,,, +49,169649,,,,,,,,,,,,0.0711793303489685,,,,,, +49,169699,,,,,,,,,,,,0.08169735223054886,,,,,, +49,169749,,,,,,,,,,,,0.07792634516954422,,,,,, +49,169799,,,,,,,,,,,,0.0718887597322464,,,,,, +49,169849,,,,,,,,,,,,0.06477482616901398,,,,,, +49,169899,,,,,,,,,,,,0.058030273765325546,,,,,, +49,169949,,,,,,,,,,,,0.0626024454832077,,,,,, +49,169999,,,,,,,,,,,,0.06753097474575043,,,,,, +49,170049,,,,,,,,,,,,0.06506428867578506,,,,,, +49,170099,,,,,,,,,,,,0.07415881752967834,,,,,, +49,170149,,,,,,,,,,,,0.07079659402370453,,,,,, +49,170199,,,,,,,,,,,,0.06837151944637299,,,,,, +49,170249,,,,,,,,,,,,0.0670422613620758,,,,,, +49,170299,,,,,,,,,,,,0.07796131074428558,,,,,, +49,170349,,,,,,,,,,,,0.0676216185092926,,,,,, +49,170399,,,,,,,,,,,,0.06963352859020233,,,,,, +49,170449,,,,,,,,,,,,0.057914383709430695,,,,,, +49,170499,,,,,,,,,,,,0.06883777678012848,,,,,, +49,170549,,,,,,,,,,,,0.07943959534168243,,,,,, +49,170599,,,,,,,,,,,,0.07811833173036575,,,,,, +49,170649,,,,,,,,,,,,0.05759283900260925,,,,,, +49,170699,,,,,,,,,,,,0.0625782459974289,,,,,, +49,170749,,,,,,,,,,,,0.06746643036603928,,,,,, +49,170799,,,,,,,,,,,,0.07248187065124512,,,,,, +49,170849,,,,,,,,,,,,0.080454982817173,,,,,, +49,170899,,,,,,,,,,,,0.07416567206382751,,,,,, +49,170949,,,,,,,,,,,,0.06471791118383408,,,,,, +49,170999,,,,,,,,,,,,0.06852871179580688,,,,,, +49,171049,,,,,,,,,,,,0.07301973551511765,,,,,, +49,171099,,,,,,,,,,,,0.07164826989173889,,,,,, +49,171149,,,,,,,,,,,,0.06067676097154617,,,,,, +49,171199,,,,,,,,,,,,0.06468965858221054,,,,,, +49,171249,,,,,,,,,,,,0.08054958283901215,,,,,, +49,171299,,,,,,,,,,,,0.06241333484649658,,,,,, +49,171349,,,,,,,,,,,,0.06960102915763855,,,,,, +49,171399,,,,,,,,,,,,0.08364413678646088,,,,,, +49,171449,,,,,,,,,,,,0.06967204809188843,,,,,, +49,171499,,,,,,,,,,,,0.08028565347194672,,,,,, +49,171549,,,,,,,,,,,,0.06661812216043472,,,,,, +49,171599,,,,,,,,,,,,0.06878379732370377,,,,,, +49,171649,,,,,,,,,,,,0.06535772979259491,,,,,, +49,171699,,,,,,,,,,,,0.0742039680480957,,,,,, +49,171749,,,,,,,,,,,,0.0656052902340889,,,,,, +49,171799,,,,,,,,,,,,0.07850269973278046,,,,,, +49,171849,,,,,,,,,,,,0.08066209405660629,,,,,, +49,171899,,,,,,,,,,,,0.07386908680200577,,,,,, +49,171949,,,,,,,,,,,,0.06661957502365112,,,,,, +49,171999,,,,,,,,,,,,0.07328429073095322,,,,,, +49,172049,,,,,,,,,,,,0.07194948941469193,,,,,, +49,172099,,,,,,,,,,,,0.0631173625588417,,,,,, +49,172099,,,,,,,,,,,,,0.2313835620880127,0.10095377266407013,0.24726514518260956,-0.2148447036743164,0.3712429702281952,0.10095377266407013 +49,172099,,,,,,,0.22559717297554016,0.0709168016910553,0.3776834011077881,0.14264380931854248,0.3579154312610626,,,,,,, +50,172100,0.2280169576406479,0.0730397179722786,0.35300204157829285,0.12167227268218994,0.3359033763408661,0.0730397179722786,,,,,,,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..805a31869dbff301702ca6b57ab0938f15aeb205 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml @@ -0,0 +1,23 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: gifflar + num_layers: 8 + pooling: global_mean + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan +seed: 44 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..863b381ef578dca42f6f6ce5b6fa88c110087be9 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv @@ -0,0 +1,3544 @@ +epoch,step,test/MeanAbsoluteError,test/MeanSquaredError,test/PearsonCorrCoef,test/R2Score,test/SpearmanCorrCoef,test/loss,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +0,49,,,,,,,,,,,,0.07612787187099457,,,,,, +0,99,,,,,,,,,,,,0.075188048183918,,,,,, +0,149,,,,,,,,,,,,0.09749927371740341,,,,,, +0,199,,,,,,,,,,,,0.094166100025177,,,,,, +0,249,,,,,,,,,,,,0.08456632494926453,,,,,, +0,299,,,,,,,,,,,,0.09069017320871353,,,,,, +0,349,,,,,,,,,,,,0.08201198279857635,,,,,, +0,399,,,,,,,,,,,,0.07263018190860748,,,,,, +0,449,,,,,,,,,,,,0.08367268741130829,,,,,, +0,499,,,,,,,,,,,,0.08540697395801544,,,,,, +0,549,,,,,,,,,,,,0.07979196310043335,,,,,, +0,599,,,,,,,,,,,,0.08028393983840942,,,,,, +0,649,,,,,,,,,,,,0.09093059599399567,,,,,, +0,699,,,,,,,,,,,,0.08026997745037079,,,,,, +0,749,,,,,,,,,,,,0.0803905576467514,,,,,, +0,799,,,,,,,,,,,,0.07840896397829056,,,,,, +0,849,,,,,,,,,,,,0.07420353591442108,,,,,, +0,899,,,,,,,,,,,,0.09211854636669159,,,,,, +0,949,,,,,,,,,,,,0.08973360806703568,,,,,, +0,999,,,,,,,,,,,,0.07605834305286407,,,,,, +0,1049,,,,,,,,,,,,0.0860273689031601,,,,,, +0,1099,,,,,,,,,,,,0.07114587724208832,,,,,, +0,1149,,,,,,,,,,,,0.0882575586438179,,,,,, +0,1199,,,,,,,,,,,,0.0758202075958252,,,,,, +0,1249,,,,,,,,,,,,0.09577921032905579,,,,,, +0,1299,,,,,,,,,,,,0.08847986161708832,,,,,, +0,1349,,,,,,,,,,,,0.08400078117847443,,,,,, +0,1399,,,,,,,,,,,,0.08151039481163025,,,,,, +0,1449,,,,,,,,,,,,0.0813547670841217,,,,,, +0,1499,,,,,,,,,,,,0.08053025603294373,,,,,, +0,1549,,,,,,,,,,,,0.06582866609096527,,,,,, +0,1599,,,,,,,,,,,,0.08456732332706451,,,,,, +0,1649,,,,,,,,,,,,0.0862049013376236,,,,,, +0,1699,,,,,,,,,,,,0.07762369513511658,,,,,, +0,1749,,,,,,,,,,,,0.06925588846206665,,,,,, +0,1799,,,,,,,,,,,,0.08103438466787338,,,,,, +0,1849,,,,,,,,,,,,0.08194499462842941,,,,,, +0,1899,,,,,,,,,,,,0.06900402903556824,,,,,, +0,1949,,,,,,,,,,,,0.0791856199502945,,,,,, +0,1999,,,,,,,,,,,,0.09555235505104065,,,,,, +0,2049,,,,,,,,,,,,0.08394523710012436,,,,,, +0,2099,,,,,,,,,,,,0.092498779296875,,,,,, +0,2149,,,,,,,,,,,,0.07145239412784576,,,,,, +0,2199,,,,,,,,,,,,0.085565946996212,,,,,, +0,2249,,,,,,,,,,,,0.08161995559930801,,,,,, +0,2299,,,,,,,,,,,,0.08818057179450989,,,,,, +0,2349,,,,,,,,,,,,0.08604501932859421,,,,,, +0,2399,,,,,,,,,,,,0.09081070125102997,,,,,, +0,2449,,,,,,,,,,,,0.06446574628353119,,,,,, +0,2499,,,,,,,,,,,,0.07426054775714874,,,,,, +0,2549,,,,,,,,,,,,0.08689454197883606,,,,,, +0,2599,,,,,,,,,,,,0.07498086988925934,,,,,, +0,2649,,,,,,,,,,,,0.08909058570861816,,,,,, +0,2699,,,,,,,,,,,,0.08418726921081543,,,,,, +0,2749,,,,,,,,,,,,0.08206692337989807,,,,,, +0,2799,,,,,,,,,,,,0.08628383278846741,,,,,, +0,2849,,,,,,,,,,,,0.0840689167380333,,,,,, +0,2899,,,,,,,,,,,,0.0707264393568039,,,,,, +0,2949,,,,,,,,,,,,0.08975927531719208,,,,,, +0,2999,,,,,,,,,,,,0.0742853507399559,,,,,, +0,3049,,,,,,,,,,,,0.08749261498451233,,,,,, +0,3099,,,,,,,,,,,,0.07371340692043304,,,,,, +0,3149,,,,,,,,,,,,0.07522537559270859,,,,,, +0,3199,,,,,,,,,,,,0.07672688364982605,,,,,, +0,3249,,,,,,,,,,,,0.07162359356880188,,,,,, +0,3299,,,,,,,,,,,,0.08125406503677368,,,,,, +0,3349,,,,,,,,,,,,0.0754256322979927,,,,,, +0,3399,,,,,,,,,,,,0.09306666254997253,,,,,, +0,3441,,,,,,,,,,,,,0.23351117968559265,0.07492998987436295,0.33001723885536194,0.09831702709197998,0.33053621649742126,0.07492998987436295 +0,3441,,,,,,,0.2444179505109787,0.08180088549852371,0.15500472486019135,0.01106560230255127,0.14995521306991577,,,,,,, +1,3449,,,,,,,,,,,,0.08306772261857986,,,,,, +1,3499,,,,,,,,,,,,0.07818222045898438,,,,,, +1,3549,,,,,,,,,,,,0.06516329199075699,,,,,, +1,3599,,,,,,,,,,,,0.06329238414764404,,,,,, +1,3649,,,,,,,,,,,,0.08299051225185394,,,,,, +1,3699,,,,,,,,,,,,0.07575292885303497,,,,,, +1,3749,,,,,,,,,,,,0.0843064934015274,,,,,, +1,3799,,,,,,,,,,,,0.0907808169722557,,,,,, +1,3849,,,,,,,,,,,,0.0777348205447197,,,,,, +1,3899,,,,,,,,,,,,0.07441750168800354,,,,,, +1,3949,,,,,,,,,,,,0.08117801696062088,,,,,, +1,3999,,,,,,,,,,,,0.08479076623916626,,,,,, +1,4049,,,,,,,,,,,,0.08058805018663406,,,,,, +1,4099,,,,,,,,,,,,0.08343223482370377,,,,,, +1,4149,,,,,,,,,,,,0.0786505788564682,,,,,, +1,4199,,,,,,,,,,,,0.08922968804836273,,,,,, +1,4249,,,,,,,,,,,,0.07911977171897888,,,,,, +1,4299,,,,,,,,,,,,0.08400095254182816,,,,,, +1,4349,,,,,,,,,,,,0.0665937140583992,,,,,, +1,4399,,,,,,,,,,,,0.07998710870742798,,,,,, +1,4449,,,,,,,,,,,,0.07752731442451477,,,,,, +1,4499,,,,,,,,,,,,0.08097914606332779,,,,,, +1,4549,,,,,,,,,,,,0.07862907648086548,,,,,, +1,4599,,,,,,,,,,,,0.07490214705467224,,,,,, +1,4649,,,,,,,,,,,,0.08502752333879471,,,,,, +1,4699,,,,,,,,,,,,0.08365195989608765,,,,,, +1,4749,,,,,,,,,,,,0.07454460114240646,,,,,, +1,4799,,,,,,,,,,,,0.07832814007997513,,,,,, +1,4849,,,,,,,,,,,,0.08173555135726929,,,,,, +1,4899,,,,,,,,,,,,0.0740569531917572,,,,,, +1,4949,,,,,,,,,,,,0.07186819612979889,,,,,, +1,4999,,,,,,,,,,,,0.08185485005378723,,,,,, +1,5049,,,,,,,,,,,,0.08188046514987946,,,,,, +1,5099,,,,,,,,,,,,0.08191035687923431,,,,,, +1,5149,,,,,,,,,,,,0.0797647088766098,,,,,, +1,5199,,,,,,,,,,,,0.07578125596046448,,,,,, +1,5249,,,,,,,,,,,,0.07204221189022064,,,,,, +1,5299,,,,,,,,,,,,0.08220526576042175,,,,,, +1,5349,,,,,,,,,,,,0.0753002017736435,,,,,, +1,5399,,,,,,,,,,,,0.07328812777996063,,,,,, +1,5449,,,,,,,,,,,,0.08063444495201111,,,,,, +1,5499,,,,,,,,,,,,0.06826355308294296,,,,,, +1,5549,,,,,,,,,,,,0.08026885986328125,,,,,, +1,5599,,,,,,,,,,,,0.08143410086631775,,,,,, +1,5649,,,,,,,,,,,,0.08321546763181686,,,,,, +1,5699,,,,,,,,,,,,0.0792284905910492,,,,,, +1,5749,,,,,,,,,,,,0.0671125128865242,,,,,, +1,5799,,,,,,,,,,,,0.08263000100851059,,,,,, +1,5849,,,,,,,,,,,,0.0766516849398613,,,,,, +1,5899,,,,,,,,,,,,0.07729983329772949,,,,,, +1,5949,,,,,,,,,,,,0.0712440013885498,,,,,, +1,5999,,,,,,,,,,,,0.07542356848716736,,,,,, +1,6049,,,,,,,,,,,,0.08054889738559723,,,,,, +1,6099,,,,,,,,,,,,0.07864534854888916,,,,,, +1,6149,,,,,,,,,,,,0.07110925018787384,,,,,, +1,6199,,,,,,,,,,,,0.08443412184715271,,,,,, +1,6249,,,,,,,,,,,,0.08222287148237228,,,,,, +1,6299,,,,,,,,,,,,0.08046887069940567,,,,,, +1,6349,,,,,,,,,,,,0.07927680015563965,,,,,, +1,6399,,,,,,,,,,,,0.08169394731521606,,,,,, +1,6449,,,,,,,,,,,,0.07553185522556305,,,,,, +1,6499,,,,,,,,,,,,0.07926364243030548,,,,,, +1,6549,,,,,,,,,,,,0.0656670331954956,,,,,, +1,6599,,,,,,,,,,,,0.07600905746221542,,,,,, +1,6649,,,,,,,,,,,,0.08315344899892807,,,,,, +1,6699,,,,,,,,,,,,0.07970371097326279,,,,,, +1,6749,,,,,,,,,,,,0.07454629242420197,,,,,, +1,6799,,,,,,,,,,,,0.07808271050453186,,,,,, +1,6849,,,,,,,,,,,,0.07082077115774155,,,,,, +1,6883,,,,,,,,,,,,,0.22981886565685272,0.07479064911603928,0.33104461431503296,0.09999382495880127,0.32560786604881287,0.07479064911603928 +1,6883,,,,,,,0.23914794623851776,0.07797789573669434,0.24012555181980133,0.05726742744445801,0.22237220406532288,,,,,,, +2,6899,,,,,,,,,,,,0.08512794971466064,,,,,, +2,6949,,,,,,,,,,,,0.07308463007211685,,,,,, +2,6999,,,,,,,,,,,,0.07834452390670776,,,,,, +2,7049,,,,,,,,,,,,0.0799267441034317,,,,,, +2,7099,,,,,,,,,,,,0.09173795580863953,,,,,, +2,7149,,,,,,,,,,,,0.08812583982944489,,,,,, +2,7199,,,,,,,,,,,,0.06450426578521729,,,,,, +2,7249,,,,,,,,,,,,0.07357235252857208,,,,,, +2,7299,,,,,,,,,,,,0.0747368112206459,,,,,, +2,7349,,,,,,,,,,,,0.08056418597698212,,,,,, +2,7399,,,,,,,,,,,,0.07559902966022491,,,,,, +2,7449,,,,,,,,,,,,0.08095047622919083,,,,,, +2,7499,,,,,,,,,,,,0.07644309103488922,,,,,, +2,7549,,,,,,,,,,,,0.07665419578552246,,,,,, +2,7599,,,,,,,,,,,,0.08067955076694489,,,,,, +2,7649,,,,,,,,,,,,0.08167068660259247,,,,,, +2,7699,,,,,,,,,,,,0.06712669134140015,,,,,, +2,7749,,,,,,,,,,,,0.06878577917814255,,,,,, +2,7799,,,,,,,,,,,,0.09062264859676361,,,,,, +2,7849,,,,,,,,,,,,0.07863745838403702,,,,,, +2,7899,,,,,,,,,,,,0.05960742011666298,,,,,, +2,7949,,,,,,,,,,,,0.08575929701328278,,,,,, +2,7999,,,,,,,,,,,,0.07611008733510971,,,,,, +2,8049,,,,,,,,,,,,0.06632301211357117,,,,,, +2,8099,,,,,,,,,,,,0.08329510688781738,,,,,, +2,8149,,,,,,,,,,,,0.08852565288543701,,,,,, +2,8199,,,,,,,,,,,,0.08036400377750397,,,,,, +2,8249,,,,,,,,,,,,0.0785345807671547,,,,,, +2,8299,,,,,,,,,,,,0.08307740092277527,,,,,, +2,8349,,,,,,,,,,,,0.062030062079429626,,,,,, +2,8399,,,,,,,,,,,,0.07074402272701263,,,,,, +2,8449,,,,,,,,,,,,0.08117949962615967,,,,,, +2,8499,,,,,,,,,,,,0.065999835729599,,,,,, +2,8549,,,,,,,,,,,,0.07428257167339325,,,,,, +2,8599,,,,,,,,,,,,0.07966271042823792,,,,,, +2,8649,,,,,,,,,,,,0.07765605300664902,,,,,, +2,8699,,,,,,,,,,,,0.08272002637386322,,,,,, +2,8749,,,,,,,,,,,,0.07000987976789474,,,,,, +2,8799,,,,,,,,,,,,0.07829347252845764,,,,,, +2,8849,,,,,,,,,,,,0.07064372301101685,,,,,, +2,8899,,,,,,,,,,,,0.09312620759010315,,,,,, +2,8949,,,,,,,,,,,,0.07218486070632935,,,,,, +2,8999,,,,,,,,,,,,0.06811201572418213,,,,,, +2,9049,,,,,,,,,,,,0.08069810271263123,,,,,, +2,9099,,,,,,,,,,,,0.08079993724822998,,,,,, +2,9149,,,,,,,,,,,,0.07259172201156616,,,,,, +2,9199,,,,,,,,,,,,0.07770434021949768,,,,,, +2,9249,,,,,,,,,,,,0.07315368950366974,,,,,, +2,9299,,,,,,,,,,,,0.07407115399837494,,,,,, +2,9349,,,,,,,,,,,,0.0701020359992981,,,,,, +2,9399,,,,,,,,,,,,0.07496819645166397,,,,,, +2,9449,,,,,,,,,,,,0.08335334062576294,,,,,, +2,9499,,,,,,,,,,,,0.07574965059757233,,,,,, +2,9549,,,,,,,,,,,,0.08398318290710449,,,,,, +2,9599,,,,,,,,,,,,0.08053812384605408,,,,,, +2,9649,,,,,,,,,,,,0.08459842205047607,,,,,, +2,9699,,,,,,,,,,,,0.0657619833946228,,,,,, +2,9749,,,,,,,,,,,,0.08497031033039093,,,,,, +2,9799,,,,,,,,,,,,0.0825098305940628,,,,,, +2,9849,,,,,,,,,,,,0.082129567861557,,,,,, +2,9899,,,,,,,,,,,,0.07417678833007812,,,,,, +2,9949,,,,,,,,,,,,0.08060811460018158,,,,,, +2,9999,,,,,,,,,,,,0.09077706933021545,,,,,, +2,10049,,,,,,,,,,,,0.07539426535367966,,,,,, +2,10099,,,,,,,,,,,,0.06497982144355774,,,,,, +2,10149,,,,,,,,,,,,0.08178149908781052,,,,,, +2,10199,,,,,,,,,,,,0.07214479148387909,,,,,, +2,10249,,,,,,,,,,,,0.08057616651058197,,,,,, +2,10299,,,,,,,,,,,,0.07489411532878876,,,,,, +2,10325,,,,,,,,,,,,,0.2334776222705841,0.07543164491653442,0.3255649507045746,0.09228026866912842,0.3207530975341797,0.07543164491653442 +2,10325,,,,,,,0.23695270717144012,0.07682491838932037,0.2672109007835388,0.07120883464813232,0.25141221284866333,,,,,,, +3,10349,,,,,,,,,,,,0.08423912525177002,,,,,, +3,10399,,,,,,,,,,,,0.07075613737106323,,,,,, +3,10449,,,,,,,,,,,,0.07579465210437775,,,,,, +3,10499,,,,,,,,,,,,0.08673490583896637,,,,,, +3,10549,,,,,,,,,,,,0.08334745466709137,,,,,, +3,10599,,,,,,,,,,,,0.07014594972133636,,,,,, +3,10649,,,,,,,,,,,,0.07483746111392975,,,,,, +3,10699,,,,,,,,,,,,0.08365198224782944,,,,,, +3,10749,,,,,,,,,,,,0.07723566889762878,,,,,, +3,10799,,,,,,,,,,,,0.07284049689769745,,,,,, +3,10849,,,,,,,,,,,,0.08580798655748367,,,,,, +3,10899,,,,,,,,,,,,0.06865759938955307,,,,,, +3,10949,,,,,,,,,,,,0.07417824864387512,,,,,, +3,10999,,,,,,,,,,,,0.08934303373098373,,,,,, +3,11049,,,,,,,,,,,,0.07376762479543686,,,,,, +3,11099,,,,,,,,,,,,0.06562799215316772,,,,,, +3,11149,,,,,,,,,,,,0.06864435225725174,,,,,, +3,11199,,,,,,,,,,,,0.07147368788719177,,,,,, +3,11249,,,,,,,,,,,,0.07109152525663376,,,,,, +3,11299,,,,,,,,,,,,0.07401227205991745,,,,,, +3,11349,,,,,,,,,,,,0.07811108231544495,,,,,, +3,11399,,,,,,,,,,,,0.07922955602407455,,,,,, +3,11449,,,,,,,,,,,,0.06118299812078476,,,,,, +3,11499,,,,,,,,,,,,0.06696955859661102,,,,,, +3,11549,,,,,,,,,,,,0.0810159295797348,,,,,, +3,11599,,,,,,,,,,,,0.07894660532474518,,,,,, +3,11649,,,,,,,,,,,,0.08578762412071228,,,,,, +3,11699,,,,,,,,,,,,0.07122653722763062,,,,,, +3,11749,,,,,,,,,,,,0.07301796972751617,,,,,, +3,11799,,,,,,,,,,,,0.08377282321453094,,,,,, +3,11849,,,,,,,,,,,,0.07551147043704987,,,,,, +3,11899,,,,,,,,,,,,0.0714293122291565,,,,,, +3,11949,,,,,,,,,,,,0.07563534379005432,,,,,, +3,11999,,,,,,,,,,,,0.07630789279937744,,,,,, +3,12049,,,,,,,,,,,,0.06876516342163086,,,,,, +3,12099,,,,,,,,,,,,0.06965865194797516,,,,,, +3,12149,,,,,,,,,,,,0.06541018933057785,,,,,, +3,12199,,,,,,,,,,,,0.06382598727941513,,,,,, +3,12249,,,,,,,,,,,,0.08224323391914368,,,,,, +3,12299,,,,,,,,,,,,0.08013328909873962,,,,,, +3,12349,,,,,,,,,,,,0.0727238804101944,,,,,, +3,12399,,,,,,,,,,,,0.08186067640781403,,,,,, +3,12449,,,,,,,,,,,,0.0716882199048996,,,,,, +3,12499,,,,,,,,,,,,0.07186241447925568,,,,,, +3,12549,,,,,,,,,,,,0.0701533630490303,,,,,, +3,12599,,,,,,,,,,,,0.08080554008483887,,,,,, +3,12649,,,,,,,,,,,,0.06495440006256104,,,,,, +3,12699,,,,,,,,,,,,0.0708741694688797,,,,,, +3,12749,,,,,,,,,,,,0.0734463632106781,,,,,, +3,12799,,,,,,,,,,,,0.08150491118431091,,,,,, +3,12849,,,,,,,,,,,,0.07582533359527588,,,,,, +3,12899,,,,,,,,,,,,0.08396085351705551,,,,,, +3,12949,,,,,,,,,,,,0.0918915644288063,,,,,, +3,12999,,,,,,,,,,,,0.07900980859994888,,,,,, +3,13049,,,,,,,,,,,,0.08261575549840927,,,,,, +3,13099,,,,,,,,,,,,0.0834675282239914,,,,,, +3,13149,,,,,,,,,,,,0.07784976065158844,,,,,, +3,13199,,,,,,,,,,,,0.07793906331062317,,,,,, +3,13249,,,,,,,,,,,,0.07330984622240067,,,,,, +3,13299,,,,,,,,,,,,0.07498064637184143,,,,,, +3,13349,,,,,,,,,,,,0.06844402104616165,,,,,, +3,13399,,,,,,,,,,,,0.0809120461344719,,,,,, +3,13449,,,,,,,,,,,,0.08103196322917938,,,,,, +3,13499,,,,,,,,,,,,0.08144311606884003,,,,,, +3,13549,,,,,,,,,,,,0.0666702464222908,,,,,, +3,13599,,,,,,,,,,,,0.07424639165401459,,,,,, +3,13649,,,,,,,,,,,,0.18776628375053406,,,,,, +3,13699,,,,,,,,,,,,0.07828184962272644,,,,,, +3,13749,,,,,,,,,,,,0.07609009742736816,,,,,, +3,13767,,,,,,,,,,,,,0.24945977330207825,0.0829976350069046,nan,0.0012335777282714844,0.11940088868141174,0.0829976350069046 +3,13767,,,,,,,0.23656289279460907,0.09851028025150299,0.13820548355579376,-0.19096946716308594,0.26189571619033813,,,,,,, +4,13799,,,,,,,,,,,,0.07755647599697113,,,,,, +4,13849,,,,,,,,,,,,0.09003739804029465,,,,,, +4,13899,,,,,,,,,,,,0.08476947993040085,,,,,, +4,13949,,,,,,,,,,,,0.07902336120605469,,,,,, +4,13999,,,,,,,,,,,,0.07041087746620178,,,,,, +4,14049,,,,,,,,,,,,0.07453009486198425,,,,,, +4,14099,,,,,,,,,,,,0.08004099130630493,,,,,, +4,14149,,,,,,,,,,,,0.07586461305618286,,,,,, +4,14199,,,,,,,,,,,,0.07767285406589508,,,,,, +4,14249,,,,,,,,,,,,0.09710991382598877,,,,,, +4,14299,,,,,,,,,,,,0.0723063051700592,,,,,, +4,14349,,,,,,,,,,,,0.07747967541217804,,,,,, +4,14399,,,,,,,,,,,,0.07687701284885406,,,,,, +4,14449,,,,,,,,,,,,0.08986835926771164,,,,,, +4,14499,,,,,,,,,,,,0.07908584922552109,,,,,, +4,14549,,,,,,,,,,,,0.06811816990375519,,,,,, +4,14599,,,,,,,,,,,,0.08010110259056091,,,,,, +4,14649,,,,,,,,,,,,0.07882615923881531,,,,,, +4,14699,,,,,,,,,,,,0.09724624454975128,,,,,, +4,14749,,,,,,,,,,,,0.07099967449903488,,,,,, +4,14799,,,,,,,,,,,,0.08211229741573334,,,,,, +4,14849,,,,,,,,,,,,0.079454705119133,,,,,, +4,14899,,,,,,,,,,,,0.07988697290420532,,,,,, +4,14949,,,,,,,,,,,,0.07338877022266388,,,,,, +4,14999,,,,,,,,,,,,0.08368243277072906,,,,,, +4,15049,,,,,,,,,,,,0.07767581939697266,,,,,, +4,15099,,,,,,,,,,,,0.06772811710834503,,,,,, +4,15149,,,,,,,,,,,,0.06807306408882141,,,,,, +4,15199,,,,,,,,,,,,0.07623350620269775,,,,,, +4,15249,,,,,,,,,,,,0.06287854164838791,,,,,, +4,15299,,,,,,,,,,,,0.0810740664601326,,,,,, +4,15349,,,,,,,,,,,,0.08119838684797287,,,,,, +4,15399,,,,,,,,,,,,0.08893123269081116,,,,,, +4,15449,,,,,,,,,,,,0.08356603980064392,,,,,, +4,15499,,,,,,,,,,,,0.08207572251558304,,,,,, +4,15549,,,,,,,,,,,,0.08130387961864471,,,,,, +4,15599,,,,,,,,,,,,0.08545743674039841,,,,,, +4,15649,,,,,,,,,,,,0.07279930263757706,,,,,, +4,15699,,,,,,,,,,,,0.0750543624162674,,,,,, +4,15749,,,,,,,,,,,,0.077652707695961,,,,,, +4,15799,,,,,,,,,,,,0.07902827858924866,,,,,, +4,15849,,,,,,,,,,,,0.07430414855480194,,,,,, +4,15899,,,,,,,,,,,,0.08685646206140518,,,,,, +4,15949,,,,,,,,,,,,0.08446570485830307,,,,,, +4,15999,,,,,,,,,,,,0.07344621419906616,,,,,, +4,16049,,,,,,,,,,,,0.08610504865646362,,,,,, +4,16099,,,,,,,,,,,,0.08088791370391846,,,,,, +4,16149,,,,,,,,,,,,0.09323816001415253,,,,,, +4,16199,,,,,,,,,,,,0.06577655673027039,,,,,, +4,16249,,,,,,,,,,,,0.07717631757259369,,,,,, +4,16299,,,,,,,,,,,,0.07566247135400772,,,,,, +4,16349,,,,,,,,,,,,0.07733625173568726,,,,,, +4,16399,,,,,,,,,,,,0.07139024138450623,,,,,, +4,16449,,,,,,,,,,,,0.08033131062984467,,,,,, +4,16499,,,,,,,,,,,,0.0791357159614563,,,,,, +4,16549,,,,,,,,,,,,0.06630381941795349,,,,,, +4,16599,,,,,,,,,,,,0.08310793340206146,,,,,, +4,16649,,,,,,,,,,,,0.07435686141252518,,,,,, +4,16699,,,,,,,,,,,,0.09030039608478546,,,,,, +4,16749,,,,,,,,,,,,0.07877476513385773,,,,,, +4,16799,,,,,,,,,,,,0.07851015031337738,,,,,, +4,16849,,,,,,,,,,,,0.08095133304595947,,,,,, +4,16899,,,,,,,,,,,,0.07267308980226517,,,,,, +4,16949,,,,,,,,,,,,0.0867033451795578,,,,,, +4,16999,,,,,,,,,,,,0.07712514698505402,,,,,, +4,17049,,,,,,,,,,,,0.07769255340099335,,,,,, +4,17099,,,,,,,,,,,,0.07578086853027344,,,,,, +4,17149,,,,,,,,,,,,0.08365087956190109,,,,,, +4,17199,,,,,,,,,,,,0.06646926701068878,,,,,, +4,17209,,,,,,,,,,,,,0.23567524552345276,0.0763423964381218,0.3082793653011322,0.08132058382034302,0.30117401480674744,0.0763423964381218 +4,17209,,,,,,,0.24133993685245514,0.0791156217455864,0.2097581923007965,0.04351663589477539,0.19005709886550903,,,,,,, +5,17249,,,,,,,,,,,,0.08467911928892136,,,,,, +5,17299,,,,,,,,,,,,0.07282891869544983,,,,,, +5,17349,,,,,,,,,,,,0.07545465230941772,,,,,, +5,17399,,,,,,,,,,,,0.08065788447856903,,,,,, +5,17449,,,,,,,,,,,,0.07188541442155838,,,,,, +5,17499,,,,,,,,,,,,0.07713054120540619,,,,,, +5,17549,,,,,,,,,,,,0.06771429628133774,,,,,, +5,17599,,,,,,,,,,,,0.0823536366224289,,,,,, +5,17649,,,,,,,,,,,,0.07464411854743958,,,,,, +5,17699,,,,,,,,,,,,0.07079067081212997,,,,,, +5,17749,,,,,,,,,,,,0.08342474699020386,,,,,, +5,17799,,,,,,,,,,,,0.07049866020679474,,,,,, +5,17849,,,,,,,,,,,,0.06522534787654877,,,,,, +5,17899,,,,,,,,,,,,0.08073151111602783,,,,,, +5,17949,,,,,,,,,,,,0.08202216029167175,,,,,, +5,17999,,,,,,,,,,,,0.07862421870231628,,,,,, +5,18049,,,,,,,,,,,,0.08000251650810242,,,,,, +5,18099,,,,,,,,,,,,0.06953835487365723,,,,,, +5,18149,,,,,,,,,,,,0.07195883989334106,,,,,, +5,18199,,,,,,,,,,,,0.07130959630012512,,,,,, +5,18249,,,,,,,,,,,,0.07369310408830643,,,,,, +5,18299,,,,,,,,,,,,0.07856054604053497,,,,,, +5,18349,,,,,,,,,,,,0.08460453152656555,,,,,, +5,18399,,,,,,,,,,,,0.0808611810207367,,,,,, +5,18449,,,,,,,,,,,,0.08933189511299133,,,,,, +5,18499,,,,,,,,,,,,0.07378724217414856,,,,,, +5,18549,,,,,,,,,,,,0.07625198364257812,,,,,, +5,18599,,,,,,,,,,,,0.0787254050374031,,,,,, +5,18649,,,,,,,,,,,,0.06648842990398407,,,,,, +5,18699,,,,,,,,,,,,0.06311605870723724,,,,,, +5,18749,,,,,,,,,,,,0.08450212329626083,,,,,, +5,18799,,,,,,,,,,,,0.07702817022800446,,,,,, +5,18849,,,,,,,,,,,,0.08466309309005737,,,,,, +5,18899,,,,,,,,,,,,0.07624416798353195,,,,,, +5,18949,,,,,,,,,,,,0.07468399405479431,,,,,, +5,18999,,,,,,,,,,,,0.08110132068395615,,,,,, +5,19049,,,,,,,,,,,,0.07827785611152649,,,,,, +5,19099,,,,,,,,,,,,0.08087751269340515,,,,,, +5,19149,,,,,,,,,,,,0.07894302904605865,,,,,, +5,19199,,,,,,,,,,,,0.07283157855272293,,,,,, +5,19249,,,,,,,,,,,,0.07762723416090012,,,,,, +5,19299,,,,,,,,,,,,0.0852317214012146,,,,,, +5,19349,,,,,,,,,,,,0.07489274442195892,,,,,, +5,19399,,,,,,,,,,,,0.07734251022338867,,,,,, +5,19449,,,,,,,,,,,,0.09300302714109421,,,,,, +5,19499,,,,,,,,,,,,0.054645538330078125,,,,,, +5,19549,,,,,,,,,,,,0.07602344453334808,,,,,, +5,19599,,,,,,,,,,,,0.09290100634098053,,,,,, +5,19649,,,,,,,,,,,,0.07485929131507874,,,,,, +5,19699,,,,,,,,,,,,0.07788336277008057,,,,,, +5,19749,,,,,,,,,,,,0.07439237833023071,,,,,, +5,19799,,,,,,,,,,,,0.08509758859872818,,,,,, +5,19849,,,,,,,,,,,,0.07509656250476837,,,,,, +5,19899,,,,,,,,,,,,0.06555607169866562,,,,,, +5,19949,,,,,,,,,,,,0.07887651026248932,,,,,, +5,19999,,,,,,,,,,,,0.07515731453895569,,,,,, +5,20049,,,,,,,,,,,,0.0695251002907753,,,,,, +5,20099,,,,,,,,,,,,0.08296403288841248,,,,,, +5,20149,,,,,,,,,,,,0.0807323083281517,,,,,, +5,20199,,,,,,,,,,,,0.07245102524757385,,,,,, +5,20249,,,,,,,,,,,,0.07917768508195877,,,,,, +5,20299,,,,,,,,,,,,0.07503212988376617,,,,,, +5,20349,,,,,,,,,,,,0.07740174978971481,,,,,, +5,20399,,,,,,,,,,,,0.06841758638620377,,,,,, +5,20449,,,,,,,,,,,,0.0737430676817894,,,,,, +5,20499,,,,,,,,,,,,0.07917027175426483,,,,,, +5,20549,,,,,,,,,,,,0.07182139158248901,,,,,, +5,20599,,,,,,,,,,,,0.0673861876130104,,,,,, +5,20649,,,,,,,,,,,,0.07943855226039886,,,,,, +5,20651,,,,,,,,,,,,,0.2900093197822571,0.12325123697519302,0.3127268850803375,-0.48316502571105957,0.30985772609710693,0.12325123697519302 +5,20651,,,,,,,0.23900368809700012,0.07826656848192215,0.23523426055908203,0.05378735065460205,0.22435450553894043,,,,,,, +6,20699,,,,,,,,,,,,0.0733334869146347,,,,,, +6,20749,,,,,,,,,,,,0.08453874289989471,,,,,, +6,20799,,,,,,,,,,,,0.07326417416334152,,,,,, +6,20849,,,,,,,,,,,,0.07457597553730011,,,,,, +6,20899,,,,,,,,,,,,0.068280428647995,,,,,, +6,20949,,,,,,,,,,,,0.07608151435852051,,,,,, +6,20999,,,,,,,,,,,,0.07096940279006958,,,,,, +6,21049,,,,,,,,,,,,0.08398495614528656,,,,,, +6,21099,,,,,,,,,,,,0.07581840455532074,,,,,, +6,21149,,,,,,,,,,,,0.0859404057264328,,,,,, +6,21199,,,,,,,,,,,,0.07033002376556396,,,,,, +6,21249,,,,,,,,,,,,0.09285666048526764,,,,,, +6,21299,,,,,,,,,,,,0.0766763761639595,,,,,, +6,21349,,,,,,,,,,,,0.05990874022245407,,,,,, +6,21399,,,,,,,,,,,,0.08645075559616089,,,,,, +6,21449,,,,,,,,,,,,0.07856783270835876,,,,,, +6,21499,,,,,,,,,,,,0.07024833559989929,,,,,, +6,21549,,,,,,,,,,,,0.07278281450271606,,,,,, +6,21599,,,,,,,,,,,,0.07290340214967728,,,,,, +6,21649,,,,,,,,,,,,0.08308617025613785,,,,,, +6,21699,,,,,,,,,,,,0.07924765348434448,,,,,, +6,21749,,,,,,,,,,,,0.0696096420288086,,,,,, +6,21799,,,,,,,,,,,,0.07240317761898041,,,,,, +6,21849,,,,,,,,,,,,0.08188621699810028,,,,,, +6,21899,,,,,,,,,,,,0.0883604884147644,,,,,, +6,21949,,,,,,,,,,,,0.0708828866481781,,,,,, +6,21999,,,,,,,,,,,,0.06502168625593185,,,,,, +6,22049,,,,,,,,,,,,0.08359822630882263,,,,,, +6,22099,,,,,,,,,,,,0.0747283548116684,,,,,, +6,22149,,,,,,,,,,,,0.06790177524089813,,,,,, +6,22199,,,,,,,,,,,,0.07695001363754272,,,,,, +6,22249,,,,,,,,,,,,0.08625328540802002,,,,,, +6,22299,,,,,,,,,,,,0.07079808413982391,,,,,, +6,22349,,,,,,,,,,,,0.06588689237833023,,,,,, +6,22399,,,,,,,,,,,,0.080732062458992,,,,,, +6,22449,,,,,,,,,,,,0.0888558179140091,,,,,, +6,22499,,,,,,,,,,,,0.08051060140132904,,,,,, +6,22549,,,,,,,,,,,,0.07965333759784698,,,,,, +6,22599,,,,,,,,,,,,0.07666279375553131,,,,,, +6,22649,,,,,,,,,,,,0.08621566742658615,,,,,, +6,22699,,,,,,,,,,,,0.07275032997131348,,,,,, +6,22749,,,,,,,,,,,,0.06931177526712418,,,,,, +6,22799,,,,,,,,,,,,0.0772211104631424,,,,,, +6,22849,,,,,,,,,,,,0.06843429803848267,,,,,, +6,22899,,,,,,,,,,,,0.09070171415805817,,,,,, +6,22949,,,,,,,,,,,,0.06759244203567505,,,,,, +6,22999,,,,,,,,,,,,0.07636848092079163,,,,,, +6,23049,,,,,,,,,,,,0.06738927960395813,,,,,, +6,23099,,,,,,,,,,,,0.07187703251838684,,,,,, +6,23149,,,,,,,,,,,,0.07525306940078735,,,,,, +6,23199,,,,,,,,,,,,0.07109065353870392,,,,,, +6,23249,,,,,,,,,,,,0.07253941893577576,,,,,, +6,23299,,,,,,,,,,,,0.0798812061548233,,,,,, +6,23349,,,,,,,,,,,,0.07354854047298431,,,,,, +6,23399,,,,,,,,,,,,0.05910332500934601,,,,,, +6,23449,,,,,,,,,,,,0.07231418788433075,,,,,, +6,23499,,,,,,,,,,,,0.06933754682540894,,,,,, +6,23549,,,,,,,,,,,,0.08516065776348114,,,,,, +6,23599,,,,,,,,,,,,0.07993781566619873,,,,,, +6,23649,,,,,,,,,,,,0.08475776016712189,,,,,, +6,23699,,,,,,,,,,,,0.08791004121303558,,,,,, +6,23749,,,,,,,,,,,,0.08455206453800201,,,,,, +6,23799,,,,,,,,,,,,0.0868961289525032,,,,,, +6,23849,,,,,,,,,,,,0.07698027044534683,,,,,, +6,23899,,,,,,,,,,,,0.06738337129354477,,,,,, +6,23949,,,,,,,,,,,,0.0792931318283081,,,,,, +6,23999,,,,,,,,,,,,0.07071998715400696,,,,,, +6,24049,,,,,,,,,,,,0.07922358810901642,,,,,, +6,24093,,,,,,,,,,,,,0.23885028064250946,0.0813191682100296,0.3211398720741272,0.02143174409866333,0.31905221939086914,0.0813191682100296 +6,24093,,,,,,,0.23666070401668549,0.07674938440322876,0.26935458183288574,0.07211226224899292,0.2546504735946655,,,,,,, +7,24099,,,,,,,,,,,,0.07548562437295914,,,,,, +7,24149,,,,,,,,,,,,0.08529394865036011,,,,,, +7,24199,,,,,,,,,,,,0.08398561179637909,,,,,, +7,24249,,,,,,,,,,,,0.07977580279111862,,,,,, +7,24299,,,,,,,,,,,,0.07294217497110367,,,,,, +7,24349,,,,,,,,,,,,0.07209385931491852,,,,,, +7,24399,,,,,,,,,,,,0.08068309724330902,,,,,, +7,24449,,,,,,,,,,,,0.0763181820511818,,,,,, +7,24499,,,,,,,,,,,,0.073532834649086,,,,,, +7,24549,,,,,,,,,,,,0.07519163191318512,,,,,, +7,24599,,,,,,,,,,,,0.0684872716665268,,,,,, +7,24649,,,,,,,,,,,,0.08818620443344116,,,,,, +7,24699,,,,,,,,,,,,0.0771641805768013,,,,,, +7,24749,,,,,,,,,,,,0.08378639817237854,,,,,, +7,24799,,,,,,,,,,,,0.08186893165111542,,,,,, +7,24849,,,,,,,,,,,,0.08584846556186676,,,,,, +7,24899,,,,,,,,,,,,0.06919960677623749,,,,,, +7,24949,,,,,,,,,,,,0.08342933654785156,,,,,, +7,24999,,,,,,,,,,,,0.07617469131946564,,,,,, +7,25049,,,,,,,,,,,,0.08058059215545654,,,,,, +7,25099,,,,,,,,,,,,0.0806448757648468,,,,,, +7,25149,,,,,,,,,,,,0.07132792472839355,,,,,, +7,25199,,,,,,,,,,,,0.07662078738212585,,,,,, +7,25249,,,,,,,,,,,,0.08960725367069244,,,,,, +7,25299,,,,,,,,,,,,0.08317401260137558,,,,,, +7,25349,,,,,,,,,,,,0.07904237508773804,,,,,, +7,25399,,,,,,,,,,,,0.08565301448106766,,,,,, +7,25449,,,,,,,,,,,,0.07742352783679962,,,,,, +7,25499,,,,,,,,,,,,0.07884950935840607,,,,,, +7,25549,,,,,,,,,,,,0.07226815819740295,,,,,, +7,25599,,,,,,,,,,,,0.08585658669471741,,,,,, +7,25649,,,,,,,,,,,,0.07570680975914001,,,,,, +7,25699,,,,,,,,,,,,0.07860980927944183,,,,,, +7,25749,,,,,,,,,,,,0.07616546005010605,,,,,, +7,25799,,,,,,,,,,,,0.07163940370082855,,,,,, +7,25849,,,,,,,,,,,,0.07288198173046112,,,,,, +7,25899,,,,,,,,,,,,0.08183030784130096,,,,,, +7,25949,,,,,,,,,,,,0.07674869149923325,,,,,, +7,25999,,,,,,,,,,,,0.0793284922838211,,,,,, +7,26049,,,,,,,,,,,,0.08182485401630402,,,,,, +7,26099,,,,,,,,,,,,0.07833442091941833,,,,,, +7,26149,,,,,,,,,,,,0.08893653750419617,,,,,, +7,26199,,,,,,,,,,,,0.07785852253437042,,,,,, +7,26249,,,,,,,,,,,,0.08464748412370682,,,,,, +7,26299,,,,,,,,,,,,0.07775842398405075,,,,,, +7,26349,,,,,,,,,,,,0.07803104817867279,,,,,, +7,26399,,,,,,,,,,,,0.08451502025127411,,,,,, +7,26449,,,,,,,,,,,,0.0646570473909378,,,,,, +7,26499,,,,,,,,,,,,0.08035662770271301,,,,,, +7,26549,,,,,,,,,,,,0.09589415788650513,,,,,, +7,26599,,,,,,,,,,,,0.08926951140165329,,,,,, +7,26649,,,,,,,,,,,,0.08192557096481323,,,,,, +7,26699,,,,,,,,,,,,0.07140772044658661,,,,,, +7,26749,,,,,,,,,,,,0.06780385971069336,,,,,, +7,26799,,,,,,,,,,,,0.07886528968811035,,,,,, +7,26849,,,,,,,,,,,,0.07941092550754547,,,,,, +7,26899,,,,,,,,,,,,0.07691329717636108,,,,,, +7,26949,,,,,,,,,,,,0.0899413526058197,,,,,, +7,26999,,,,,,,,,,,,0.08050411194562912,,,,,, +7,27049,,,,,,,,,,,,0.08148863911628723,,,,,, +7,27099,,,,,,,,,,,,0.07097144424915314,,,,,, +7,27149,,,,,,,,,,,,0.0808841735124588,,,,,, +7,27199,,,,,,,,,,,,0.07866625487804413,,,,,, +7,27249,,,,,,,,,,,,0.07526092976331711,,,,,, +7,27299,,,,,,,,,,,,0.08035651594400406,,,,,, +7,27349,,,,,,,,,,,,0.06849086284637451,,,,,, +7,27399,,,,,,,,,,,,0.06747613847255707,,,,,, +7,27449,,,,,,,,,,,,0.07746050506830215,,,,,, +7,27499,,,,,,,,,,,,0.0814991295337677,,,,,, +7,27535,,,,,,,,,,,,,0.24756506085395813,0.08867591619491577,0.305841326713562,-0.06709694862365723,0.3051215410232544,0.08867591619491577 +7,27535,,,,,,,0.23943005502223969,0.08046586811542511,0.19944411516189575,0.02720123529434204,0.21927841007709503,,,,,,, +8,27549,,,,,,,,,,,,0.0815269947052002,,,,,, +8,27599,,,,,,,,,,,,0.06760844588279724,,,,,, +8,27649,,,,,,,,,,,,0.06580975651741028,,,,,, +8,27699,,,,,,,,,,,,0.0747305154800415,,,,,, +8,27749,,,,,,,,,,,,0.07383263111114502,,,,,, +8,27799,,,,,,,,,,,,0.06523734331130981,,,,,, +8,27849,,,,,,,,,,,,0.08324325084686279,,,,,, +8,27899,,,,,,,,,,,,0.08342254161834717,,,,,, +8,27949,,,,,,,,,,,,0.08017441630363464,,,,,, +8,27999,,,,,,,,,,,,0.06564442813396454,,,,,, +8,28049,,,,,,,,,,,,0.07602962851524353,,,,,, +8,28099,,,,,,,,,,,,0.08139991015195847,,,,,, +8,28149,,,,,,,,,,,,0.07374754548072815,,,,,, +8,28199,,,,,,,,,,,,0.0718776136636734,,,,,, +8,28249,,,,,,,,,,,,0.07483821362257004,,,,,, +8,28299,,,,,,,,,,,,0.08182235062122345,,,,,, +8,28349,,,,,,,,,,,,0.0743773877620697,,,,,, +8,28399,,,,,,,,,,,,0.0714430958032608,,,,,, +8,28449,,,,,,,,,,,,0.08321043848991394,,,,,, +8,28499,,,,,,,,,,,,0.07581481337547302,,,,,, +8,28549,,,,,,,,,,,,0.06695730984210968,,,,,, +8,28599,,,,,,,,,,,,0.07056955993175507,,,,,, +8,28649,,,,,,,,,,,,0.0761796087026596,,,,,, +8,28699,,,,,,,,,,,,0.0787755697965622,,,,,, +8,28749,,,,,,,,,,,,0.08172109723091125,,,,,, +8,28799,,,,,,,,,,,,0.08028208464384079,,,,,, +8,28849,,,,,,,,,,,,0.0684070736169815,,,,,, +8,28899,,,,,,,,,,,,0.06934396922588348,,,,,, +8,28949,,,,,,,,,,,,0.07269428670406342,,,,,, +8,28999,,,,,,,,,,,,0.08260419964790344,,,,,, +8,29049,,,,,,,,,,,,0.08137550950050354,,,,,, +8,29099,,,,,,,,,,,,0.09115317463874817,,,,,, +8,29149,,,,,,,,,,,,0.08647313714027405,,,,,, +8,29199,,,,,,,,,,,,0.08394688367843628,,,,,, +8,29249,,,,,,,,,,,,0.08293810486793518,,,,,, +8,29299,,,,,,,,,,,,0.07839197665452957,,,,,, +8,29349,,,,,,,,,,,,0.07583242654800415,,,,,, +8,29399,,,,,,,,,,,,0.07309111207723618,,,,,, +8,29449,,,,,,,,,,,,0.06861786544322968,,,,,, +8,29499,,,,,,,,,,,,0.07665875554084778,,,,,, +8,29549,,,,,,,,,,,,0.06242411211133003,,,,,, +8,29599,,,,,,,,,,,,0.08387869596481323,,,,,, +8,29649,,,,,,,,,,,,0.08912824094295502,,,,,, +8,29699,,,,,,,,,,,,0.07539695501327515,,,,,, +8,29749,,,,,,,,,,,,0.07134588062763214,,,,,, +8,29799,,,,,,,,,,,,0.07045485079288483,,,,,, +8,29849,,,,,,,,,,,,0.07181014865636826,,,,,, +8,29899,,,,,,,,,,,,0.07976211607456207,,,,,, +8,29949,,,,,,,,,,,,0.09061311185359955,,,,,, +8,29999,,,,,,,,,,,,0.08052577078342438,,,,,, +8,30049,,,,,,,,,,,,0.08842934668064117,,,,,, +8,30099,,,,,,,,,,,,0.07085549831390381,,,,,, +8,30149,,,,,,,,,,,,0.07242313027381897,,,,,, +8,30199,,,,,,,,,,,,0.07193504273891449,,,,,, +8,30249,,,,,,,,,,,,0.07864616811275482,,,,,, +8,30299,,,,,,,,,,,,0.08303820341825485,,,,,, +8,30349,,,,,,,,,,,,0.07949225604534149,,,,,, +8,30399,,,,,,,,,,,,0.07001388818025589,,,,,, +8,30449,,,,,,,,,,,,0.08147850632667542,,,,,, +8,30499,,,,,,,,,,,,0.07796908915042877,,,,,, +8,30549,,,,,,,,,,,,0.06460246443748474,,,,,, +8,30599,,,,,,,,,,,,0.06971564888954163,,,,,, +8,30649,,,,,,,,,,,,0.06843101233243942,,,,,, +8,30699,,,,,,,,,,,,0.08477984368801117,,,,,, +8,30749,,,,,,,,,,,,0.08225618302822113,,,,,, +8,30799,,,,,,,,,,,,0.09318020939826965,,,,,, +8,30849,,,,,,,,,,,,0.08887447416782379,,,,,, +8,30899,,,,,,,,,,,,0.07052213698625565,,,,,, +8,30949,,,,,,,,,,,,0.06643447279930115,,,,,, +8,30977,,,,,,,,,,,,,0.23989301919937134,0.0809505507349968,0.2957334518432617,0.025867581367492676,0.2981732487678528,0.0809505507349968 +8,30977,,,,,,,0.23574334383010864,0.07635868340730667,0.2778654396533966,0.07684957981109619,0.262835830450058,,,,,,, +9,30999,,,,,,,,,,,,0.08443883061408997,,,,,, +9,31049,,,,,,,,,,,,0.08260118961334229,,,,,, +9,31099,,,,,,,,,,,,0.08182461559772491,,,,,, +9,31149,,,,,,,,,,,,0.07637645304203033,,,,,, +9,31199,,,,,,,,,,,,0.07271838188171387,,,,,, +9,31249,,,,,,,,,,,,0.07141406834125519,,,,,, +9,31299,,,,,,,,,,,,0.059258826076984406,,,,,, +9,31349,,,,,,,,,,,,0.07491445541381836,,,,,, +9,31399,,,,,,,,,,,,0.07518473267555237,,,,,, +9,31449,,,,,,,,,,,,0.07933352887630463,,,,,, +9,31499,,,,,,,,,,,,0.07904919981956482,,,,,, +9,31549,,,,,,,,,,,,0.07570487260818481,,,,,, +9,31599,,,,,,,,,,,,0.08723115921020508,,,,,, +9,31649,,,,,,,,,,,,0.06498147547245026,,,,,, +9,31699,,,,,,,,,,,,0.06861311197280884,,,,,, +9,31749,,,,,,,,,,,,0.08513122797012329,,,,,, +9,31799,,,,,,,,,,,,0.07558491826057434,,,,,, +9,31849,,,,,,,,,,,,0.07249711453914642,,,,,, +9,31899,,,,,,,,,,,,0.06864337623119354,,,,,, +9,31949,,,,,,,,,,,,0.08158048987388611,,,,,, +9,31999,,,,,,,,,,,,0.07790103554725647,,,,,, +9,32049,,,,,,,,,,,,0.07658697664737701,,,,,, +9,32099,,,,,,,,,,,,0.07782305032014847,,,,,, +9,32149,,,,,,,,,,,,0.0752391666173935,,,,,, +9,32199,,,,,,,,,,,,0.07729151099920273,,,,,, +9,32249,,,,,,,,,,,,0.067823626101017,,,,,, +9,32299,,,,,,,,,,,,0.08252206444740295,,,,,, +9,32349,,,,,,,,,,,,0.08078482002019882,,,,,, +9,32399,,,,,,,,,,,,0.06657382100820541,,,,,, +9,32449,,,,,,,,,,,,0.07286985218524933,,,,,, +9,32499,,,,,,,,,,,,0.07591643929481506,,,,,, +9,32549,,,,,,,,,,,,0.07660806179046631,,,,,, +9,32599,,,,,,,,,,,,0.0724654495716095,,,,,, +9,32649,,,,,,,,,,,,0.0896269679069519,,,,,, +9,32699,,,,,,,,,,,,0.07750631123781204,,,,,, +9,32749,,,,,,,,,,,,0.07554973661899567,,,,,, +9,32799,,,,,,,,,,,,0.07248255610466003,,,,,, +9,32849,,,,,,,,,,,,0.07877703756093979,,,,,, +9,32899,,,,,,,,,,,,0.069794662296772,,,,,, +9,32949,,,,,,,,,,,,0.07279416918754578,,,,,, +9,32999,,,,,,,,,,,,0.0610085166990757,,,,,, +9,33049,,,,,,,,,,,,0.06420014798641205,,,,,, +9,33099,,,,,,,,,,,,0.08258302509784698,,,,,, +9,33149,,,,,,,,,,,,0.06669890880584717,,,,,, +9,33199,,,,,,,,,,,,0.06764467060565948,,,,,, +9,33249,,,,,,,,,,,,0.07157847285270691,,,,,, +9,33299,,,,,,,,,,,,0.07221478223800659,,,,,, +9,33349,,,,,,,,,,,,0.07153929769992828,,,,,, +9,33399,,,,,,,,,,,,0.07222151011228561,,,,,, +9,33449,,,,,,,,,,,,0.08307870477437973,,,,,, +9,33499,,,,,,,,,,,,0.08175913989543915,,,,,, +9,33549,,,,,,,,,,,,0.08884823322296143,,,,,, +9,33599,,,,,,,,,,,,0.07883623987436295,,,,,, +9,33649,,,,,,,,,,,,0.060859836637973785,,,,,, +9,33699,,,,,,,,,,,,0.06696479022502899,,,,,, +9,33749,,,,,,,,,,,,0.061344075947999954,,,,,, +9,33799,,,,,,,,,,,,0.0810389518737793,,,,,, +9,33849,,,,,,,,,,,,0.08188614249229431,,,,,, +9,33899,,,,,,,,,,,,0.07558011263608932,,,,,, +9,33949,,,,,,,,,,,,0.07152283936738968,,,,,, +9,33999,,,,,,,,,,,,0.06793643534183502,,,,,, +9,34049,,,,,,,,,,,,0.07984238862991333,,,,,, +9,34099,,,,,,,,,,,,0.07071676850318909,,,,,, +9,34149,,,,,,,,,,,,0.07241212576627731,,,,,, +9,34199,,,,,,,,,,,,0.08055248856544495,,,,,, +9,34249,,,,,,,,,,,,0.07586383819580078,,,,,, +9,34299,,,,,,,,,,,,0.07632486522197723,,,,,, +9,34349,,,,,,,,,,,,0.07218235731124878,,,,,, +9,34399,,,,,,,,,,,,0.08112513273954391,,,,,, +9,34419,,,,,,,,,,,,,0.23805849254131317,0.08068375289440155,0.32725444436073303,0.029078125953674316,0.3330031633377075,0.08068375289440155 +9,34419,,,,,,,0.23442140221595764,0.07558857649564743,0.2938924729824066,0.08616065979003906,0.2782883644104004,,,,,,, +10,34449,,,,,,,,,,,,0.07478577643632889,,,,,, +10,34499,,,,,,,,,,,,0.08038608729839325,,,,,, +10,34549,,,,,,,,,,,,0.06531794369220734,,,,,, +10,34599,,,,,,,,,,,,0.06902970373630524,,,,,, +10,34649,,,,,,,,,,,,0.07953545451164246,,,,,, +10,34699,,,,,,,,,,,,0.07042761147022247,,,,,, +10,34749,,,,,,,,,,,,0.09422139823436737,,,,,, +10,34799,,,,,,,,,,,,0.07768017053604126,,,,,, +10,34849,,,,,,,,,,,,0.08440779149532318,,,,,, +10,34899,,,,,,,,,,,,0.08092504739761353,,,,,, +10,34949,,,,,,,,,,,,0.07568188011646271,,,,,, +10,34999,,,,,,,,,,,,0.07710226625204086,,,,,, +10,35049,,,,,,,,,,,,0.07187239825725555,,,,,, +10,35099,,,,,,,,,,,,0.07651925086975098,,,,,, +10,35149,,,,,,,,,,,,0.07474836707115173,,,,,, +10,35199,,,,,,,,,,,,0.07742829620838165,,,,,, +10,35249,,,,,,,,,,,,0.06632749736309052,,,,,, +10,35299,,,,,,,,,,,,0.0685097724199295,,,,,, +10,35349,,,,,,,,,,,,0.07719404995441437,,,,,, +10,35399,,,,,,,,,,,,0.07638290524482727,,,,,, +10,35449,,,,,,,,,,,,0.08130316436290741,,,,,, +10,35499,,,,,,,,,,,,0.06996959447860718,,,,,, +10,35549,,,,,,,,,,,,0.07770593464374542,,,,,, +10,35599,,,,,,,,,,,,0.07143937051296234,,,,,, +10,35649,,,,,,,,,,,,0.08155618607997894,,,,,, +10,35699,,,,,,,,,,,,0.07312414795160294,,,,,, +10,35749,,,,,,,,,,,,0.07679376006126404,,,,,, +10,35799,,,,,,,,,,,,0.06902585923671722,,,,,, +10,35849,,,,,,,,,,,,0.08214544504880905,,,,,, +10,35899,,,,,,,,,,,,0.07472370564937592,,,,,, +10,35949,,,,,,,,,,,,0.07675158977508545,,,,,, +10,35999,,,,,,,,,,,,0.06853373348712921,,,,,, +10,36049,,,,,,,,,,,,0.06663453578948975,,,,,, +10,36099,,,,,,,,,,,,0.06825023144483566,,,,,, +10,36149,,,,,,,,,,,,0.07720588147640228,,,,,, +10,36199,,,,,,,,,,,,0.07958731055259705,,,,,, +10,36249,,,,,,,,,,,,0.07563647627830505,,,,,, +10,36299,,,,,,,,,,,,0.06880566477775574,,,,,, +10,36349,,,,,,,,,,,,0.07705860584974289,,,,,, +10,36399,,,,,,,,,,,,0.06699846684932709,,,,,, +10,36449,,,,,,,,,,,,0.06219162791967392,,,,,, +10,36499,,,,,,,,,,,,0.0680888295173645,,,,,, +10,36549,,,,,,,,,,,,0.07270651310682297,,,,,, +10,36599,,,,,,,,,,,,0.07599268853664398,,,,,, +10,36649,,,,,,,,,,,,0.0702487975358963,,,,,, +10,36699,,,,,,,,,,,,0.06906504929065704,,,,,, +10,36749,,,,,,,,,,,,0.08368124812841415,,,,,, +10,36799,,,,,,,,,,,,0.07373978197574615,,,,,, +10,36849,,,,,,,,,,,,0.06975512206554413,,,,,, +10,36899,,,,,,,,,,,,0.07475288212299347,,,,,, +10,36949,,,,,,,,,,,,0.06899969279766083,,,,,, +10,36999,,,,,,,,,,,,0.07909060269594193,,,,,, +10,37049,,,,,,,,,,,,0.0738181471824646,,,,,, +10,37099,,,,,,,,,,,,0.08638352155685425,,,,,, +10,37149,,,,,,,,,,,,0.07655350863933563,,,,,, +10,37199,,,,,,,,,,,,0.06447549164295197,,,,,, +10,37249,,,,,,,,,,,,0.071396104991436,,,,,, +10,37299,,,,,,,,,,,,0.08125848323106766,,,,,, +10,37349,,,,,,,,,,,,0.07156290113925934,,,,,, +10,37399,,,,,,,,,,,,0.06956183910369873,,,,,, +10,37449,,,,,,,,,,,,0.08010754734277725,,,,,, +10,37499,,,,,,,,,,,,0.07852187007665634,,,,,, +10,37549,,,,,,,,,,,,0.07529661059379578,,,,,, +10,37599,,,,,,,,,,,,0.06877451390028,,,,,, +10,37649,,,,,,,,,,,,0.07051316648721695,,,,,, +10,37699,,,,,,,,,,,,0.07167007029056549,,,,,, +10,37749,,,,,,,,,,,,0.07812241464853287,,,,,, +10,37799,,,,,,,,,,,,0.07490740716457367,,,,,, +10,37849,,,,,,,,,,,,0.06587544083595276,,,,,, +10,37861,,,,,,,,,,,,,0.22839610278606415,0.07261721789836884,0.3555280566215515,0.12614816427230835,0.35031893849372864,0.07261721789836884 +10,37861,,,,,,,0.23371505737304688,0.0752624049782753,0.30060917139053345,0.09010148048400879,0.2845476269721985,,,,,,, +11,37899,,,,,,,,,,,,0.0766063928604126,,,,,, +11,37949,,,,,,,,,,,,0.07701937854290009,,,,,, +11,37999,,,,,,,,,,,,0.0786837488412857,,,,,, +11,38049,,,,,,,,,,,,0.07944376766681671,,,,,, +11,38099,,,,,,,,,,,,0.0817858949303627,,,,,, +11,38149,,,,,,,,,,,,0.08274668455123901,,,,,, +11,38199,,,,,,,,,,,,0.06776262819766998,,,,,, +11,38249,,,,,,,,,,,,0.07334084808826447,,,,,, +11,38299,,,,,,,,,,,,0.07029223442077637,,,,,, +11,38349,,,,,,,,,,,,0.09864025563001633,,,,,, +11,38399,,,,,,,,,,,,0.08451905846595764,,,,,, +11,38449,,,,,,,,,,,,0.0757569819688797,,,,,, +11,38499,,,,,,,,,,,,0.0770861953496933,,,,,, +11,38549,,,,,,,,,,,,0.06911532580852509,,,,,, +11,38599,,,,,,,,,,,,0.0753866583108902,,,,,, +11,38649,,,,,,,,,,,,0.08698554337024689,,,,,, +11,38699,,,,,,,,,,,,0.08311457931995392,,,,,, +11,38749,,,,,,,,,,,,0.07734662294387817,,,,,, +11,38799,,,,,,,,,,,,0.07413393259048462,,,,,, +11,38849,,,,,,,,,,,,0.08446083217859268,,,,,, +11,38899,,,,,,,,,,,,0.08231338858604431,,,,,, +11,38949,,,,,,,,,,,,0.0810745358467102,,,,,, +11,38999,,,,,,,,,,,,0.06648265570402145,,,,,, +11,39049,,,,,,,,,,,,0.06751010566949844,,,,,, +11,39099,,,,,,,,,,,,0.0811736211180687,,,,,, +11,39149,,,,,,,,,,,,0.07564008980989456,,,,,, +11,39199,,,,,,,,,,,,0.07186833769083023,,,,,, +11,39249,,,,,,,,,,,,0.07404860854148865,,,,,, +11,39299,,,,,,,,,,,,0.07516257464885712,,,,,, +11,39349,,,,,,,,,,,,0.06871524453163147,,,,,, +11,39399,,,,,,,,,,,,0.06414777785539627,,,,,, +11,39449,,,,,,,,,,,,0.0881352350115776,,,,,, +11,39499,,,,,,,,,,,,0.07112859189510345,,,,,, +11,39549,,,,,,,,,,,,0.07939028739929199,,,,,, +11,39599,,,,,,,,,,,,0.08155566453933716,,,,,, +11,39649,,,,,,,,,,,,0.0775056779384613,,,,,, +11,39699,,,,,,,,,,,,0.07473474740982056,,,,,, +11,39749,,,,,,,,,,,,0.07114075124263763,,,,,, +11,39799,,,,,,,,,,,,0.061988137662410736,,,,,, +11,39849,,,,,,,,,,,,0.08398232609033585,,,,,, +11,39899,,,,,,,,,,,,0.08042752742767334,,,,,, +11,39949,,,,,,,,,,,,0.07442852854728699,,,,,, +11,39999,,,,,,,,,,,,0.07844039052724838,,,,,, +11,40049,,,,,,,,,,,,0.0678354799747467,,,,,, +11,40099,,,,,,,,,,,,0.07321910560131073,,,,,, +11,40149,,,,,,,,,,,,0.08254074305295944,,,,,, +11,40199,,,,,,,,,,,,0.08423111587762833,,,,,, +11,40249,,,,,,,,,,,,0.06517294049263,,,,,, +11,40299,,,,,,,,,,,,0.08063070476055145,,,,,, +11,40349,,,,,,,,,,,,0.0771617516875267,,,,,, +11,40399,,,,,,,,,,,,0.06540083885192871,,,,,, +11,40449,,,,,,,,,,,,0.0785154402256012,,,,,, +11,40499,,,,,,,,,,,,0.06094218045473099,,,,,, +11,40549,,,,,,,,,,,,0.0787111446261406,,,,,, +11,40599,,,,,,,,,,,,0.06571641564369202,,,,,, +11,40649,,,,,,,,,,,,0.06792083382606506,,,,,, +11,40699,,,,,,,,,,,,0.06951428949832916,,,,,, +11,40749,,,,,,,,,,,,0.06566154956817627,,,,,, +11,40799,,,,,,,,,,,,0.060577988624572754,,,,,, +11,40849,,,,,,,,,,,,0.07159733772277832,,,,,, +11,40899,,,,,,,,,,,,0.07267024368047714,,,,,, +11,40949,,,,,,,,,,,,0.06538130342960358,,,,,, +11,40999,,,,,,,,,,,,0.07726014405488968,,,,,, +11,41049,,,,,,,,,,,,0.0812390148639679,,,,,, +11,41099,,,,,,,,,,,,0.07657939940690994,,,,,, +11,41149,,,,,,,,,,,,0.06182248890399933,,,,,, +11,41199,,,,,,,,,,,,0.07855938374996185,,,,,, +11,41249,,,,,,,,,,,,0.06178441271185875,,,,,, +11,41299,,,,,,,,,,,,0.06906607002019882,,,,,, +11,41303,,,,,,,,,,,,,0.22896823287010193,0.07383959740400314,0.3434543311595917,0.11143839359283447,0.3447555899620056,0.07383959740400314 +11,41303,,,,,,,0.23266687989234924,0.07470273971557617,0.31155553460121155,0.09687978029251099,0.29589715600013733,,,,,,, +12,41349,,,,,,,,,,,,0.07651093602180481,,,,,, +12,41399,,,,,,,,,,,,0.0773395448923111,,,,,, +12,41449,,,,,,,,,,,,0.07084811478853226,,,,,, +12,41499,,,,,,,,,,,,0.0725407600402832,,,,,, +12,41549,,,,,,,,,,,,0.07686085999011993,,,,,, +12,41599,,,,,,,,,,,,0.08620834350585938,,,,,, +12,41649,,,,,,,,,,,,0.06995328515768051,,,,,, +12,41699,,,,,,,,,,,,0.08671388775110245,,,,,, +12,41749,,,,,,,,,,,,0.08100269734859467,,,,,, +12,41799,,,,,,,,,,,,0.08245081454515457,,,,,, +12,41849,,,,,,,,,,,,0.07985618710517883,,,,,, +12,41899,,,,,,,,,,,,0.08304303139448166,,,,,, +12,41949,,,,,,,,,,,,0.0871666669845581,,,,,, +12,41999,,,,,,,,,,,,0.08248300850391388,,,,,, +12,42049,,,,,,,,,,,,0.07475942373275757,,,,,, +12,42099,,,,,,,,,,,,0.07075820118188858,,,,,, +12,42149,,,,,,,,,,,,0.06589427590370178,,,,,, +12,42199,,,,,,,,,,,,0.0740012526512146,,,,,, +12,42249,,,,,,,,,,,,0.07762739062309265,,,,,, +12,42299,,,,,,,,,,,,0.07563991844654083,,,,,, +12,42349,,,,,,,,,,,,0.05986670404672623,,,,,, +12,42399,,,,,,,,,,,,0.08424317836761475,,,,,, +12,42449,,,,,,,,,,,,0.0690901055932045,,,,,, +12,42499,,,,,,,,,,,,0.06720952689647675,,,,,, +12,42549,,,,,,,,,,,,0.06793566793203354,,,,,, +12,42599,,,,,,,,,,,,0.08018168061971664,,,,,, +12,42649,,,,,,,,,,,,0.072818323969841,,,,,, +12,42699,,,,,,,,,,,,0.07797664403915405,,,,,, +12,42749,,,,,,,,,,,,0.07329811900854111,,,,,, +12,42799,,,,,,,,,,,,0.06945943087339401,,,,,, +12,42849,,,,,,,,,,,,0.0760946273803711,,,,,, +12,42899,,,,,,,,,,,,0.07181011140346527,,,,,, +12,42949,,,,,,,,,,,,0.09185568988323212,,,,,, +12,42999,,,,,,,,,,,,0.07065199315547943,,,,,, +12,43049,,,,,,,,,,,,0.06361741572618484,,,,,, +12,43099,,,,,,,,,,,,0.06493617594242096,,,,,, +12,43149,,,,,,,,,,,,0.07496830821037292,,,,,, +12,43199,,,,,,,,,,,,0.08498793095350266,,,,,, +12,43249,,,,,,,,,,,,0.07988716661930084,,,,,, +12,43299,,,,,,,,,,,,0.0712553933262825,,,,,, +12,43349,,,,,,,,,,,,0.07642938196659088,,,,,, +12,43399,,,,,,,,,,,,0.056878574192523956,,,,,, +12,43449,,,,,,,,,,,,0.07661820948123932,,,,,, +12,43499,,,,,,,,,,,,0.07364801317453384,,,,,, +12,43549,,,,,,,,,,,,0.06147032976150513,,,,,, +12,43599,,,,,,,,,,,,0.0712842047214508,,,,,, +12,43649,,,,,,,,,,,,0.07490718364715576,,,,,, +12,43699,,,,,,,,,,,,0.06290919333696365,,,,,, +12,43749,,,,,,,,,,,,0.07587673515081406,,,,,, +12,43799,,,,,,,,,,,,0.0656624287366867,,,,,, +12,43849,,,,,,,,,,,,0.06322257220745087,,,,,, +12,43899,,,,,,,,,,,,0.07305897027254105,,,,,, +12,43949,,,,,,,,,,,,0.06074581667780876,,,,,, +12,43999,,,,,,,,,,,,0.061827514320611954,,,,,, +12,44049,,,,,,,,,,,,0.07337136566638947,,,,,, +12,44099,,,,,,,,,,,,0.07485331594944,,,,,, +12,44149,,,,,,,,,,,,0.0764712542295456,,,,,, +12,44199,,,,,,,,,,,,0.07728949189186096,,,,,, +12,44249,,,,,,,,,,,,0.07252408564090729,,,,,, +12,44299,,,,,,,,,,,,0.0904114842414856,,,,,, +12,44349,,,,,,,,,,,,0.0837799608707428,,,,,, +12,44399,,,,,,,,,,,,0.0716405063867569,,,,,, +12,44449,,,,,,,,,,,,0.0718478411436081,,,,,, +12,44499,,,,,,,,,,,,0.08011633902788162,,,,,, +12,44549,,,,,,,,,,,,0.06965970247983932,,,,,, +12,44599,,,,,,,,,,,,0.07306385040283203,,,,,, +12,44649,,,,,,,,,,,,0.0729810893535614,,,,,, +12,44699,,,,,,,,,,,,0.06890551000833511,,,,,, +12,44745,,,,,,,,,,,,,0.2339087277650833,0.07873191684484482,0.3598884046077728,0.052565813064575195,0.3660350441932678,0.07873191684484482 +12,44745,,,,,,,0.23184773325920105,0.0746898204088211,0.31271907687187195,0.09702420234680176,0.3032113015651703,,,,,,, +13,44749,,,,,,,,,,,,0.08256778120994568,,,,,, +13,44799,,,,,,,,,,,,0.07930638641119003,,,,,, +13,44849,,,,,,,,,,,,0.07262702286243439,,,,,, +13,44899,,,,,,,,,,,,0.0825088620185852,,,,,, +13,44949,,,,,,,,,,,,0.06907723844051361,,,,,, +13,44999,,,,,,,,,,,,0.06310240924358368,,,,,, +13,45049,,,,,,,,,,,,0.0744217038154602,,,,,, +13,45099,,,,,,,,,,,,0.08196830749511719,,,,,, +13,45149,,,,,,,,,,,,0.08569717407226562,,,,,, +13,45199,,,,,,,,,,,,0.06902028620243073,,,,,, +13,45249,,,,,,,,,,,,0.06842494010925293,,,,,, +13,45299,,,,,,,,,,,,0.076909139752388,,,,,, +13,45349,,,,,,,,,,,,0.06854730099439621,,,,,, +13,45399,,,,,,,,,,,,0.07294288277626038,,,,,, +13,45449,,,,,,,,,,,,0.08289925754070282,,,,,, +13,45499,,,,,,,,,,,,0.07108119130134583,,,,,, +13,45549,,,,,,,,,,,,0.07456602901220322,,,,,, +13,45599,,,,,,,,,,,,0.07115982472896576,,,,,, +13,45649,,,,,,,,,,,,0.08097546547651291,,,,,, +13,45699,,,,,,,,,,,,0.06244263797998428,,,,,, +13,45749,,,,,,,,,,,,0.06865954399108887,,,,,, +13,45799,,,,,,,,,,,,0.07906311750411987,,,,,, +13,45849,,,,,,,,,,,,0.07486564666032791,,,,,, +13,45899,,,,,,,,,,,,0.07662373036146164,,,,,, +13,45949,,,,,,,,,,,,0.07505495101213455,,,,,, +13,45999,,,,,,,,,,,,0.08225613832473755,,,,,, +13,46049,,,,,,,,,,,,0.06974329799413681,,,,,, +13,46099,,,,,,,,,,,,0.07260306179523468,,,,,, +13,46149,,,,,,,,,,,,0.06303651630878448,,,,,, +13,46199,,,,,,,,,,,,0.06749308109283447,,,,,, +13,46249,,,,,,,,,,,,0.07259451597929001,,,,,, +13,46299,,,,,,,,,,,,0.07099997252225876,,,,,, +13,46349,,,,,,,,,,,,0.08211852610111237,,,,,, +13,46399,,,,,,,,,,,,0.07489164173603058,,,,,, +13,46449,,,,,,,,,,,,0.07874670624732971,,,,,, +13,46499,,,,,,,,,,,,0.0746489018201828,,,,,, +13,46549,,,,,,,,,,,,0.0745672732591629,,,,,, +13,46599,,,,,,,,,,,,0.07721853256225586,,,,,, +13,46649,,,,,,,,,,,,0.07080543041229248,,,,,, +13,46699,,,,,,,,,,,,0.07280513644218445,,,,,, +13,46749,,,,,,,,,,,,0.07237306982278824,,,,,, +13,46799,,,,,,,,,,,,0.08057567477226257,,,,,, +13,46849,,,,,,,,,,,,0.07880755513906479,,,,,, +13,46899,,,,,,,,,,,,0.06977660953998566,,,,,, +13,46949,,,,,,,,,,,,0.07524009048938751,,,,,, +13,46999,,,,,,,,,,,,0.06733465194702148,,,,,, +13,47049,,,,,,,,,,,,0.07863561064004898,,,,,, +13,47099,,,,,,,,,,,,0.07886461913585663,,,,,, +13,47149,,,,,,,,,,,,0.06674142181873322,,,,,, +13,47199,,,,,,,,,,,,0.07689005136489868,,,,,, +13,47249,,,,,,,,,,,,0.07230059802532196,,,,,, +13,47299,,,,,,,,,,,,0.07442623376846313,,,,,, +13,47349,,,,,,,,,,,,0.08454607427120209,,,,,, +13,47399,,,,,,,,,,,,0.08106212317943573,,,,,, +13,47449,,,,,,,,,,,,0.07512938976287842,,,,,, +13,47499,,,,,,,,,,,,0.07958177477121353,,,,,, +13,47549,,,,,,,,,,,,0.07763998955488205,,,,,, +13,47599,,,,,,,,,,,,0.0866398885846138,,,,,, +13,47649,,,,,,,,,,,,0.05853710323572159,,,,,, +13,47699,,,,,,,,,,,,0.07139746844768524,,,,,, +13,47749,,,,,,,,,,,,0.08097833395004272,,,,,, +13,47799,,,,,,,,,,,,0.07767732441425323,,,,,, +13,47849,,,,,,,,,,,,0.06964612007141113,,,,,, +13,47899,,,,,,,,,,,,0.08380287140607834,,,,,, +13,47949,,,,,,,,,,,,0.0819280743598938,,,,,, +13,47999,,,,,,,,,,,,0.07049859315156937,,,,,, +13,48049,,,,,,,,,,,,0.06537032872438431,,,,,, +13,48099,,,,,,,,,,,,0.06909739226102829,,,,,, +13,48149,,,,,,,,,,,,0.06764574348926544,,,,,, +13,48187,,,,,,,,,,,,,0.2294466495513916,0.07372041046619415,0.3559962809085846,0.11287271976470947,0.36002928018569946,0.07372041046619415 +13,48187,,,,,,,0.23163309693336487,0.07412171363830566,0.3226374685764313,0.1038975715637207,0.3054373562335968,,,,,,, +14,48199,,,,,,,,,,,,0.0714176595211029,,,,,, +14,48249,,,,,,,,,,,,0.08011119812726974,,,,,, +14,48299,,,,,,,,,,,,0.08718930184841156,,,,,, +14,48349,,,,,,,,,,,,0.07104283571243286,,,,,, +14,48399,,,,,,,,,,,,0.07675814628601074,,,,,, +14,48449,,,,,,,,,,,,0.07861402630805969,,,,,, +14,48499,,,,,,,,,,,,0.0734860971570015,,,,,, +14,48549,,,,,,,,,,,,0.06581234931945801,,,,,, +14,48599,,,,,,,,,,,,0.07915361225605011,,,,,, +14,48649,,,,,,,,,,,,0.07700276374816895,,,,,, +14,48699,,,,,,,,,,,,0.08557963371276855,,,,,, +14,48749,,,,,,,,,,,,0.07322783768177032,,,,,, +14,48799,,,,,,,,,,,,0.08060643821954727,,,,,, +14,48849,,,,,,,,,,,,0.08425620198249817,,,,,, +14,48899,,,,,,,,,,,,0.07078482210636139,,,,,, +14,48949,,,,,,,,,,,,0.05969191715121269,,,,,, +14,48999,,,,,,,,,,,,0.06661379337310791,,,,,, +14,49049,,,,,,,,,,,,0.07140151411294937,,,,,, +14,49099,,,,,,,,,,,,0.07378939539194107,,,,,, +14,49149,,,,,,,,,,,,0.08620370924472809,,,,,, +14,49199,,,,,,,,,,,,0.07815194129943848,,,,,, +14,49249,,,,,,,,,,,,0.07265140116214752,,,,,, +14,49299,,,,,,,,,,,,0.06946820765733719,,,,,, +14,49349,,,,,,,,,,,,0.0715203806757927,,,,,, +14,49399,,,,,,,,,,,,0.07481972128152847,,,,,, +14,49449,,,,,,,,,,,,0.0764976367354393,,,,,, +14,49499,,,,,,,,,,,,0.06895898282527924,,,,,, +14,49549,,,,,,,,,,,,0.07103060930967331,,,,,, +14,49599,,,,,,,,,,,,0.07239747047424316,,,,,, +14,49649,,,,,,,,,,,,0.06561701744794846,,,,,, +14,49699,,,,,,,,,,,,0.07004526257514954,,,,,, +14,49749,,,,,,,,,,,,0.07331988215446472,,,,,, +14,49799,,,,,,,,,,,,0.08277013897895813,,,,,, +14,49849,,,,,,,,,,,,0.07163266837596893,,,,,, +14,49899,,,,,,,,,,,,0.07554250210523605,,,,,, +14,49949,,,,,,,,,,,,0.06916145980358124,,,,,, +14,49999,,,,,,,,,,,,0.07891511172056198,,,,,, +14,50049,,,,,,,,,,,,0.07141368091106415,,,,,, +14,50099,,,,,,,,,,,,0.07686949521303177,,,,,, +14,50149,,,,,,,,,,,,0.07614116370677948,,,,,, +14,50199,,,,,,,,,,,,0.07779131084680557,,,,,, +14,50249,,,,,,,,,,,,0.07596146315336227,,,,,, +14,50299,,,,,,,,,,,,0.06816716492176056,,,,,, +14,50349,,,,,,,,,,,,0.07798652350902557,,,,,, +14,50399,,,,,,,,,,,,0.07280033826828003,,,,,, +14,50449,,,,,,,,,,,,0.07734405994415283,,,,,, +14,50499,,,,,,,,,,,,0.0665363073348999,,,,,, +14,50549,,,,,,,,,,,,0.07607108354568481,,,,,, +14,50599,,,,,,,,,,,,0.06493107974529266,,,,,, +14,50649,,,,,,,,,,,,0.08568564802408218,,,,,, +14,50699,,,,,,,,,,,,0.0829034373164177,,,,,, +14,50749,,,,,,,,,,,,0.08128531277179718,,,,,, +14,50799,,,,,,,,,,,,0.0771263986825943,,,,,, +14,50849,,,,,,,,,,,,0.07376725971698761,,,,,, +14,50899,,,,,,,,,,,,0.08007149398326874,,,,,, +14,50949,,,,,,,,,,,,0.06461329758167267,,,,,, +14,50999,,,,,,,,,,,,0.07281661033630371,,,,,, +14,51049,,,,,,,,,,,,0.07715299725532532,,,,,, +14,51099,,,,,,,,,,,,0.0827861875295639,,,,,, +14,51149,,,,,,,,,,,,0.08276195824146271,,,,,, +14,51199,,,,,,,,,,,,0.06793801486492157,,,,,, +14,51249,,,,,,,,,,,,0.07815921306610107,,,,,, +14,51299,,,,,,,,,,,,0.07498878240585327,,,,,, +14,51349,,,,,,,,,,,,0.0730540007352829,,,,,, +14,51399,,,,,,,,,,,,0.08924289047718048,,,,,, +14,51449,,,,,,,,,,,,0.07176418602466583,,,,,, +14,51499,,,,,,,,,,,,0.0731101781129837,,,,,, +14,51549,,,,,,,,,,,,0.07402349263429642,,,,,, +14,51599,,,,,,,,,,,,0.08715485781431198,,,,,, +14,51629,,,,,,,,,,,,,0.22990503907203674,0.07600942999124527,0.371938556432724,0.0853273868560791,0.37233152985572815,0.07600942999124527 +14,51629,,,,,,,0.23077896237373352,0.07368558645248413,0.33063116669654846,0.10916930437088013,0.3134565055370331,,,,,,, +15,51649,,,,,,,,,,,,0.06330191344022751,,,,,, +15,51699,,,,,,,,,,,,0.07240758836269379,,,,,, +15,51749,,,,,,,,,,,,0.07091114670038223,,,,,, +15,51799,,,,,,,,,,,,0.08073172718286514,,,,,, +15,51849,,,,,,,,,,,,0.0695796087384224,,,,,, +15,51899,,,,,,,,,,,,0.06923900544643402,,,,,, +15,51949,,,,,,,,,,,,0.07144097238779068,,,,,, +15,51999,,,,,,,,,,,,0.07881459593772888,,,,,, +15,52049,,,,,,,,,,,,0.07346972823143005,,,,,, +15,52099,,,,,,,,,,,,0.0751439705491066,,,,,, +15,52149,,,,,,,,,,,,0.07347425818443298,,,,,, +15,52199,,,,,,,,,,,,0.07427467405796051,,,,,, +15,52249,,,,,,,,,,,,0.06760631501674652,,,,,, +15,52299,,,,,,,,,,,,0.07480776309967041,,,,,, +15,52349,,,,,,,,,,,,0.08673012256622314,,,,,, +15,52399,,,,,,,,,,,,0.08504268527030945,,,,,, +15,52449,,,,,,,,,,,,0.08127980679273605,,,,,, +15,52499,,,,,,,,,,,,0.07210256904363632,,,,,, +15,52549,,,,,,,,,,,,0.07250887155532837,,,,,, +15,52599,,,,,,,,,,,,0.06583987176418304,,,,,, +15,52649,,,,,,,,,,,,0.07849051058292389,,,,,, +15,52699,,,,,,,,,,,,0.061815619468688965,,,,,, +15,52749,,,,,,,,,,,,0.06441102921962738,,,,,, +15,52799,,,,,,,,,,,,0.07212753593921661,,,,,, +15,52849,,,,,,,,,,,,0.08215974271297455,,,,,, +15,52899,,,,,,,,,,,,0.05861973762512207,,,,,, +15,52949,,,,,,,,,,,,0.07359056174755096,,,,,, +15,52999,,,,,,,,,,,,0.0710136741399765,,,,,, +15,53049,,,,,,,,,,,,0.07563666254281998,,,,,, +15,53099,,,,,,,,,,,,0.06682124733924866,,,,,, +15,53149,,,,,,,,,,,,0.07161810994148254,,,,,, +15,53199,,,,,,,,,,,,0.08299832046031952,,,,,, +15,53249,,,,,,,,,,,,0.07554391026496887,,,,,, +15,53299,,,,,,,,,,,,0.06347973644733429,,,,,, +15,53349,,,,,,,,,,,,0.07493771612644196,,,,,, +15,53399,,,,,,,,,,,,0.07606823742389679,,,,,, +15,53449,,,,,,,,,,,,0.0650349110364914,,,,,, +15,53499,,,,,,,,,,,,0.07385687530040741,,,,,, +15,53549,,,,,,,,,,,,0.07244312018156052,,,,,, +15,53599,,,,,,,,,,,,0.07086367905139923,,,,,, +15,53649,,,,,,,,,,,,0.06674689054489136,,,,,, +15,53699,,,,,,,,,,,,0.0751144140958786,,,,,, +15,53749,,,,,,,,,,,,0.07505857199430466,,,,,, +15,53799,,,,,,,,,,,,0.06905229389667511,,,,,, +15,53849,,,,,,,,,,,,0.058741725981235504,,,,,, +15,53899,,,,,,,,,,,,0.06577429175376892,,,,,, +15,53949,,,,,,,,,,,,0.08959690481424332,,,,,, +15,53999,,,,,,,,,,,,0.06805874407291412,,,,,, +15,54049,,,,,,,,,,,,0.07840056717395782,,,,,, +15,54099,,,,,,,,,,,,0.06271705031394958,,,,,, +15,54149,,,,,,,,,,,,0.07935704290866852,,,,,, +15,54199,,,,,,,,,,,,0.08315169811248779,,,,,, +15,54249,,,,,,,,,,,,0.06916840374469757,,,,,, +15,54299,,,,,,,,,,,,0.06946627795696259,,,,,, +15,54349,,,,,,,,,,,,0.0750776007771492,,,,,, +15,54399,,,,,,,,,,,,0.08222772926092148,,,,,, +15,54449,,,,,,,,,,,,0.06806731969118118,,,,,, +15,54499,,,,,,,,,,,,0.09180431067943573,,,,,, +15,54549,,,,,,,,,,,,0.08023256808519363,,,,,, +15,54599,,,,,,,,,,,,0.0731205940246582,,,,,, +15,54649,,,,,,,,,,,,0.06558212637901306,,,,,, +15,54699,,,,,,,,,,,,0.06793281435966492,,,,,, +15,54749,,,,,,,,,,,,0.06664115190505981,,,,,, +15,54799,,,,,,,,,,,,0.07265882939100266,,,,,, +15,54849,,,,,,,,,,,,0.06487704813480377,,,,,, +15,54899,,,,,,,,,,,,0.08145597577095032,,,,,, +15,54949,,,,,,,,,,,,0.07087048143148422,,,,,, +15,54999,,,,,,,,,,,,0.08122032880783081,,,,,, +15,55049,,,,,,,,,,,,0.07442499697208405,,,,,, +15,55071,,,,,,,,,,,,,0.2364162802696228,0.07621890306472778,0.3398604989051819,0.08280670642852783,0.337543785572052,0.07621890306472778 +15,55071,,,,,,,0.23048679530620575,0.07360938936471939,0.3321285545825958,0.11008644104003906,0.31555864214897156,,,,,,, +16,55099,,,,,,,,,,,,0.06375587731599808,,,,,, +16,55149,,,,,,,,,,,,0.07516211271286011,,,,,, +16,55199,,,,,,,,,,,,0.0789431780576706,,,,,, +16,55249,,,,,,,,,,,,0.0655234307050705,,,,,, +16,55299,,,,,,,,,,,,0.08055721968412399,,,,,, +16,55349,,,,,,,,,,,,0.07134901732206345,,,,,, +16,55399,,,,,,,,,,,,0.0819292888045311,,,,,, +16,55449,,,,,,,,,,,,0.0849151760339737,,,,,, +16,55499,,,,,,,,,,,,0.06768685579299927,,,,,, +16,55549,,,,,,,,,,,,0.06934003531932831,,,,,, +16,55599,,,,,,,,,,,,0.07438957691192627,,,,,, +16,55649,,,,,,,,,,,,0.06458288431167603,,,,,, +16,55699,,,,,,,,,,,,0.0771864801645279,,,,,, +16,55749,,,,,,,,,,,,0.07439827173948288,,,,,, +16,55799,,,,,,,,,,,,0.07877014577388763,,,,,, +16,55849,,,,,,,,,,,,0.07239249348640442,,,,,, +16,55899,,,,,,,,,,,,0.07504250854253769,,,,,, +16,55949,,,,,,,,,,,,0.07557807862758636,,,,,, +16,55999,,,,,,,,,,,,0.08579055219888687,,,,,, +16,56049,,,,,,,,,,,,0.077855184674263,,,,,, +16,56099,,,,,,,,,,,,0.07692723721265793,,,,,, +16,56149,,,,,,,,,,,,0.0861220508813858,,,,,, +16,56199,,,,,,,,,,,,0.06180870160460472,,,,,, +16,56249,,,,,,,,,,,,0.0743812844157219,,,,,, +16,56299,,,,,,,,,,,,0.07666836678981781,,,,,, +16,56349,,,,,,,,,,,,0.07985630631446838,,,,,, +16,56399,,,,,,,,,,,,0.07263794541358948,,,,,, +16,56449,,,,,,,,,,,,0.0645652562379837,,,,,, +16,56499,,,,,,,,,,,,0.06711754202842712,,,,,, +16,56549,,,,,,,,,,,,0.07099630683660507,,,,,, +16,56599,,,,,,,,,,,,0.07787498086690903,,,,,, +16,56649,,,,,,,,,,,,0.059757426381111145,,,,,, +16,56699,,,,,,,,,,,,0.06654664874076843,,,,,, +16,56749,,,,,,,,,,,,0.07830330729484558,,,,,, +16,56799,,,,,,,,,,,,0.0804378092288971,,,,,, +16,56849,,,,,,,,,,,,0.07677967846393585,,,,,, +16,56899,,,,,,,,,,,,0.0745776817202568,,,,,, +16,56949,,,,,,,,,,,,0.07043221592903137,,,,,, +16,56999,,,,,,,,,,,,0.08301015198230743,,,,,, +16,57049,,,,,,,,,,,,0.09273425489664078,,,,,, +16,57099,,,,,,,,,,,,0.07590930908918381,,,,,, +16,57149,,,,,,,,,,,,0.06770545244216919,,,,,, +16,57199,,,,,,,,,,,,0.08421728760004044,,,,,, +16,57249,,,,,,,,,,,,0.08504204452037811,,,,,, +16,57299,,,,,,,,,,,,0.08782435208559036,,,,,, +16,57349,,,,,,,,,,,,0.07727089524269104,,,,,, +16,57399,,,,,,,,,,,,0.08566144108772278,,,,,, +16,57449,,,,,,,,,,,,0.07662200927734375,,,,,, +16,57499,,,,,,,,,,,,0.06879009306430817,,,,,, +16,57549,,,,,,,,,,,,0.08413946628570557,,,,,, +16,57599,,,,,,,,,,,,0.08114700019359589,,,,,, +16,57649,,,,,,,,,,,,0.07184330374002457,,,,,, +16,57699,,,,,,,,,,,,0.07502090930938721,,,,,, +16,57749,,,,,,,,,,,,0.07520443201065063,,,,,, +16,57799,,,,,,,,,,,,0.07692529261112213,,,,,, +16,57849,,,,,,,,,,,,0.06515102088451385,,,,,, +16,57899,,,,,,,,,,,,0.08843685686588287,,,,,, +16,57949,,,,,,,,,,,,0.07055077701807022,,,,,, +16,57999,,,,,,,,,,,,0.06110866740345955,,,,,, +16,58049,,,,,,,,,,,,0.07582929730415344,,,,,, +16,58099,,,,,,,,,,,,0.07895715534687042,,,,,, +16,58149,,,,,,,,,,,,0.06234518811106682,,,,,, +16,58199,,,,,,,,,,,,0.0852830559015274,,,,,, +16,58249,,,,,,,,,,,,0.06549791246652603,,,,,, +16,58299,,,,,,,,,,,,0.0853622555732727,,,,,, +16,58349,,,,,,,,,,,,0.07064631581306458,,,,,, +16,58399,,,,,,,,,,,,0.06662775576114655,,,,,, +16,58449,,,,,,,,,,,,0.0677848756313324,,,,,, +16,58499,,,,,,,,,,,,0.06965585798025131,,,,,, +16,58513,,,,,,,,,,,,,0.23547139763832092,0.07954506576061249,0.3291878402233124,0.04278069734573364,0.33258235454559326,0.07954506576061249 +16,58513,,,,,,,0.23324191570281982,0.11659999936819077,0.1300584077835083,-0.4096336364746094,0.2922787070274353,,,,,,, +17,58549,,,,,,,,,,,,0.07982578873634338,,,,,, +17,58599,,,,,,,,,,,,0.07134935259819031,,,,,, +17,58649,,,,,,,,,,,,0.06707635521888733,,,,,, +17,58699,,,,,,,,,,,,0.07329460978507996,,,,,, +17,58749,,,,,,,,,,,,0.07217752188444138,,,,,, +17,58799,,,,,,,,,,,,0.06781370937824249,,,,,, +17,58849,,,,,,,,,,,,0.075608991086483,,,,,, +17,58899,,,,,,,,,,,,0.06553392857313156,,,,,, +17,58949,,,,,,,,,,,,0.0766485333442688,,,,,, +17,58999,,,,,,,,,,,,0.06563474982976913,,,,,, +17,59049,,,,,,,,,,,,0.06840385496616364,,,,,, +17,59099,,,,,,,,,,,,0.06200676038861275,,,,,, +17,59149,,,,,,,,,,,,0.07300607115030289,,,,,, +17,59199,,,,,,,,,,,,0.07439229637384415,,,,,, +17,59249,,,,,,,,,,,,0.07690179347991943,,,,,, +17,59299,,,,,,,,,,,,0.07447237521409988,,,,,, +17,59349,,,,,,,,,,,,0.06684233248233795,,,,,, +17,59399,,,,,,,,,,,,0.07753250747919083,,,,,, +17,59449,,,,,,,,,,,,0.08240111172199249,,,,,, +17,59499,,,,,,,,,,,,0.0735873132944107,,,,,, +17,59549,,,,,,,,,,,,0.07264719903469086,,,,,, +17,59599,,,,,,,,,,,,0.07241611182689667,,,,,, +17,59649,,,,,,,,,,,,0.07065548002719879,,,,,, +17,59699,,,,,,,,,,,,0.07768920063972473,,,,,, +17,59749,,,,,,,,,,,,0.07283151894807816,,,,,, +17,59799,,,,,,,,,,,,0.0778878703713417,,,,,, +17,59849,,,,,,,,,,,,0.06937332451343536,,,,,, +17,59899,,,,,,,,,,,,0.07742500305175781,,,,,, +17,59949,,,,,,,,,,,,0.07969246804714203,,,,,, +17,59999,,,,,,,,,,,,0.08303995430469513,,,,,, +17,60049,,,,,,,,,,,,0.07927882671356201,,,,,, +17,60099,,,,,,,,,,,,0.0781465545296669,,,,,, +17,60149,,,,,,,,,,,,0.06398139894008636,,,,,, +17,60199,,,,,,,,,,,,0.07339799404144287,,,,,, +17,60249,,,,,,,,,,,,0.066587433218956,,,,,, +17,60299,,,,,,,,,,,,0.07485674321651459,,,,,, +17,60349,,,,,,,,,,,,0.08276507258415222,,,,,, +17,60399,,,,,,,,,,,,0.08367870002985,,,,,, +17,60449,,,,,,,,,,,,0.07833936810493469,,,,,, +17,60499,,,,,,,,,,,,0.07081639766693115,,,,,, +17,60549,,,,,,,,,,,,0.06722905486822128,,,,,, +17,60599,,,,,,,,,,,,0.06723790615797043,,,,,, +17,60649,,,,,,,,,,,,0.075090691447258,,,,,, +17,60699,,,,,,,,,,,,0.06779645383358002,,,,,, +17,60749,,,,,,,,,,,,0.07540161907672882,,,,,, +17,60799,,,,,,,,,,,,0.07369589805603027,,,,,, +17,60849,,,,,,,,,,,,0.0779818445444107,,,,,, +17,60899,,,,,,,,,,,,0.07630573213100433,,,,,, +17,60949,,,,,,,,,,,,0.07545875012874603,,,,,, +17,60999,,,,,,,,,,,,0.08011941611766815,,,,,, +17,61049,,,,,,,,,,,,0.081130750477314,,,,,, +17,61099,,,,,,,,,,,,0.07133382558822632,,,,,, +17,61149,,,,,,,,,,,,0.06258615851402283,,,,,, +17,61199,,,,,,,,,,,,0.08269184082746506,,,,,, +17,61249,,,,,,,,,,,,0.08505234867334366,,,,,, +17,61299,,,,,,,,,,,,0.0637235939502716,,,,,, +17,61349,,,,,,,,,,,,0.07661857455968857,,,,,, +17,61399,,,,,,,,,,,,0.07126622647047043,,,,,, +17,61449,,,,,,,,,,,,0.07757214456796646,,,,,, +17,61499,,,,,,,,,,,,0.08361812680959702,,,,,, +17,61549,,,,,,,,,,,,0.07703617215156555,,,,,, +17,61599,,,,,,,,,,,,0.06577027589082718,,,,,, +17,61649,,,,,,,,,,,,0.07477925717830658,,,,,, +17,61699,,,,,,,,,,,,0.08599385619163513,,,,,, +17,61749,,,,,,,,,,,,0.08346781879663467,,,,,, +17,61799,,,,,,,,,,,,0.07011404633522034,,,,,, +17,61849,,,,,,,,,,,,0.06301324814558029,,,,,, +17,61899,,,,,,,,,,,,0.06864908337593079,,,,,, +17,61949,,,,,,,,,,,,0.07793740928173065,,,,,, +17,61955,,,,,,,,,,,,,0.23066386580467224,0.07607528567314148,0.35654205083847046,0.08453488349914551,0.3573838770389557,0.07607528567314148 +17,61955,,,,,,,0.23031477630138397,0.07337381690740585,0.33610910177230835,0.11293232440948486,0.31789836287498474,,,,,,, +18,61999,,,,,,,,,,,,0.07434682548046112,,,,,, +18,62049,,,,,,,,,,,,0.0736561268568039,,,,,, +18,62099,,,,,,,,,,,,0.06362482905387878,,,,,, +18,62149,,,,,,,,,,,,0.06868817657232285,,,,,, +18,62199,,,,,,,,,,,,0.06702884286642075,,,,,, +18,62249,,,,,,,,,,,,0.0770682841539383,,,,,, +18,62299,,,,,,,,,,,,0.07935808598995209,,,,,, +18,62349,,,,,,,,,,,,0.0825038030743599,,,,,, +18,62399,,,,,,,,,,,,0.08093533664941788,,,,,, +18,62449,,,,,,,,,,,,0.08207916468381882,,,,,, +18,62499,,,,,,,,,,,,0.07673525810241699,,,,,, +18,62549,,,,,,,,,,,,0.06649722158908844,,,,,, +18,62599,,,,,,,,,,,,0.0679423063993454,,,,,, +18,62649,,,,,,,,,,,,0.07442740350961685,,,,,, +18,62699,,,,,,,,,,,,0.07380780577659607,,,,,, +18,62749,,,,,,,,,,,,0.06958255171775818,,,,,, +18,62799,,,,,,,,,,,,0.07193049788475037,,,,,, +18,62849,,,,,,,,,,,,0.06755006313323975,,,,,, +18,62899,,,,,,,,,,,,0.0772257149219513,,,,,, +18,62949,,,,,,,,,,,,0.07338178902864456,,,,,, +18,62999,,,,,,,,,,,,0.07245467603206635,,,,,, +18,63049,,,,,,,,,,,,0.06780540198087692,,,,,, +18,63099,,,,,,,,,,,,0.05909691005945206,,,,,, +18,63149,,,,,,,,,,,,0.06837576627731323,,,,,, +18,63199,,,,,,,,,,,,0.07941137999296188,,,,,, +18,63249,,,,,,,,,,,,0.08005556464195251,,,,,, +18,63299,,,,,,,,,,,,0.0577642060816288,,,,,, +18,63349,,,,,,,,,,,,0.07420402765274048,,,,,, +18,63399,,,,,,,,,,,,0.07487383484840393,,,,,, +18,63449,,,,,,,,,,,,0.07810056209564209,,,,,, +18,63499,,,,,,,,,,,,0.0784640908241272,,,,,, +18,63549,,,,,,,,,,,,0.08478912711143494,,,,,, +18,63599,,,,,,,,,,,,0.07985866814851761,,,,,, +18,63649,,,,,,,,,,,,0.06898766756057739,,,,,, +18,63699,,,,,,,,,,,,0.07441678643226624,,,,,, +18,63749,,,,,,,,,,,,0.06510699540376663,,,,,, +18,63799,,,,,,,,,,,,0.07199830561876297,,,,,, +18,63849,,,,,,,,,,,,0.06137918680906296,,,,,, +18,63899,,,,,,,,,,,,0.08200789988040924,,,,,, +18,63949,,,,,,,,,,,,0.06804275512695312,,,,,, +18,63999,,,,,,,,,,,,0.06981677561998367,,,,,, +18,64049,,,,,,,,,,,,0.07391044497489929,,,,,, +18,64099,,,,,,,,,,,,0.08255533128976822,,,,,, +18,64149,,,,,,,,,,,,0.07118599861860275,,,,,, +18,64199,,,,,,,,,,,,0.0709412544965744,,,,,, +18,64249,,,,,,,,,,,,0.0712040439248085,,,,,, +18,64299,,,,,,,,,,,,0.0788116455078125,,,,,, +18,64349,,,,,,,,,,,,0.06471765041351318,,,,,, +18,64399,,,,,,,,,,,,0.07036558538675308,,,,,, +18,64449,,,,,,,,,,,,0.06274508684873581,,,,,, +18,64499,,,,,,,,,,,,0.07228618860244751,,,,,, +18,64549,,,,,,,,,,,,0.08323589712381363,,,,,, +18,64599,,,,,,,,,,,,0.06667350232601166,,,,,, +18,64649,,,,,,,,,,,,0.08107180893421173,,,,,, +18,64699,,,,,,,,,,,,0.06493724137544632,,,,,, +18,64749,,,,,,,,,,,,0.07846817374229431,,,,,, +18,64799,,,,,,,,,,,,0.0682099312543869,,,,,, +18,64849,,,,,,,,,,,,0.06770648807287216,,,,,, +18,64899,,,,,,,,,,,,0.07489541172981262,,,,,, +18,64949,,,,,,,,,,,,0.06412184238433838,,,,,, +18,64999,,,,,,,,,,,,0.07367649674415588,,,,,, +18,65049,,,,,,,,,,,,0.06800390779972076,,,,,, +18,65099,,,,,,,,,,,,0.07178068161010742,,,,,, +18,65149,,,,,,,,,,,,0.06969699263572693,,,,,, +18,65199,,,,,,,,,,,,0.07758809626102448,,,,,, +18,65249,,,,,,,,,,,,0.06084669381380081,,,,,, +18,65299,,,,,,,,,,,,0.07134014368057251,,,,,, +18,65349,,,,,,,,,,,,0.06474369764328003,,,,,, +18,65397,,,,,,,,,,,,,0.23016998171806335,0.07436318695545197,0.34922486543655396,0.10513776540756226,0.3580838739871979,0.07436318695545197 +18,65397,,,,,,,0.22888046503067017,0.07274159789085388,0.34735843539237976,0.12057042121887207,0.329244464635849,,,,,,, +19,65399,,,,,,,,,,,,0.06295226514339447,,,,,, +19,65449,,,,,,,,,,,,0.07811165601015091,,,,,, +19,65499,,,,,,,,,,,,0.06911490857601166,,,,,, +19,65549,,,,,,,,,,,,0.08396297693252563,,,,,, +19,65599,,,,,,,,,,,,0.06928806751966476,,,,,, +19,65649,,,,,,,,,,,,0.07377336919307709,,,,,, +19,65699,,,,,,,,,,,,0.06980852782726288,,,,,, +19,65749,,,,,,,,,,,,0.07245810329914093,,,,,, +19,65799,,,,,,,,,,,,0.06928016990423203,,,,,, +19,65849,,,,,,,,,,,,0.06092148274183273,,,,,, +19,65899,,,,,,,,,,,,0.06233193725347519,,,,,, +19,65949,,,,,,,,,,,,0.0728357583284378,,,,,, +19,65999,,,,,,,,,,,,0.07413916289806366,,,,,, +19,66049,,,,,,,,,,,,0.0703059583902359,,,,,, +19,66099,,,,,,,,,,,,0.06342688202857971,,,,,, +19,66149,,,,,,,,,,,,0.06728072464466095,,,,,, +19,66199,,,,,,,,,,,,0.07655021548271179,,,,,, +19,66249,,,,,,,,,,,,0.07024618983268738,,,,,, +19,66299,,,,,,,,,,,,0.07759518921375275,,,,,, +19,66349,,,,,,,,,,,,0.0805729404091835,,,,,, +19,66399,,,,,,,,,,,,0.06444351375102997,,,,,, +19,66449,,,,,,,,,,,,0.06769566237926483,,,,,, +19,66499,,,,,,,,,,,,0.07168912887573242,,,,,, +19,66549,,,,,,,,,,,,0.08477179706096649,,,,,, +19,66599,,,,,,,,,,,,0.07914217561483383,,,,,, +19,66649,,,,,,,,,,,,0.07267376780509949,,,,,, +19,66699,,,,,,,,,,,,0.06928125768899918,,,,,, +19,66749,,,,,,,,,,,,0.07933966815471649,,,,,, +19,66799,,,,,,,,,,,,0.07772305607795715,,,,,, +19,66849,,,,,,,,,,,,0.07008640468120575,,,,,, +19,66899,,,,,,,,,,,,0.07712126523256302,,,,,, +19,66949,,,,,,,,,,,,0.07064098119735718,,,,,, +19,66999,,,,,,,,,,,,0.06597473472356796,,,,,, +19,67049,,,,,,,,,,,,0.06734427064657211,,,,,, +19,67099,,,,,,,,,,,,0.06874798238277435,,,,,, +19,67149,,,,,,,,,,,,0.06341146677732468,,,,,, +19,67199,,,,,,,,,,,,0.07206963747739792,,,,,, +19,67249,,,,,,,,,,,,0.07897128909826279,,,,,, +19,67299,,,,,,,,,,,,0.08452445268630981,,,,,, +19,67349,,,,,,,,,,,,0.07640063762664795,,,,,, +19,67399,,,,,,,,,,,,0.07353071868419647,,,,,, +19,67449,,,,,,,,,,,,0.08321650326251984,,,,,, +19,67499,,,,,,,,,,,,0.06155097112059593,,,,,, +19,67549,,,,,,,,,,,,0.07500238716602325,,,,,, +19,67599,,,,,,,,,,,,0.08339055627584457,,,,,, +19,67649,,,,,,,,,,,,0.06935609877109528,,,,,, +19,67699,,,,,,,,,,,,0.06538279354572296,,,,,, +19,67749,,,,,,,,,,,,0.07373224198818207,,,,,, +19,67799,,,,,,,,,,,,0.07270786166191101,,,,,, +19,67849,,,,,,,,,,,,0.07522869855165482,,,,,, +19,67899,,,,,,,,,,,,0.06690050661563873,,,,,, +19,67949,,,,,,,,,,,,0.08595388382673264,,,,,, +19,67999,,,,,,,,,,,,0.07845747470855713,,,,,, +19,68049,,,,,,,,,,,,0.06837359815835953,,,,,, +19,68099,,,,,,,,,,,,0.06833922863006592,,,,,, +19,68149,,,,,,,,,,,,0.06691621243953705,,,,,, +19,68199,,,,,,,,,,,,0.07187232375144958,,,,,, +19,68249,,,,,,,,,,,,0.07980494201183319,,,,,, +19,68299,,,,,,,,,,,,0.06969407200813293,,,,,, +19,68349,,,,,,,,,,,,0.08163535594940186,,,,,, +19,68399,,,,,,,,,,,,0.07695887982845306,,,,,, +19,68449,,,,,,,,,,,,0.0693659782409668,,,,,, +19,68499,,,,,,,,,,,,0.07377421855926514,,,,,, +19,68549,,,,,,,,,,,,0.06325183063745499,,,,,, +19,68599,,,,,,,,,,,,0.07382635772228241,,,,,, +19,68649,,,,,,,,,,,,0.07462087273597717,,,,,, +19,68699,,,,,,,,,,,,0.06951162219047546,,,,,, +19,68749,,,,,,,,,,,,0.06521433591842651,,,,,, +19,68799,,,,,,,,,,,,0.07140997052192688,,,,,, +19,68839,,,,,,,,,,,,,0.22989697754383087,0.07568851113319397,0.36798959970474243,0.08918923139572144,0.37212350964546204,0.07568851113319397 +19,68839,,,,,,,0.22780051827430725,0.07214850187301636,0.35747653245925903,0.12775468826293945,0.3376576006412506,,,,,,, +20,68849,,,,,,,,,,,,0.0759001076221466,,,,,, +20,68899,,,,,,,,,,,,0.08405618369579315,,,,,, +20,68949,,,,,,,,,,,,0.07391799986362457,,,,,, +20,68999,,,,,,,,,,,,0.06950614601373672,,,,,, +20,69049,,,,,,,,,,,,0.07290416955947876,,,,,, +20,69099,,,,,,,,,,,,0.08307792246341705,,,,,, +20,69149,,,,,,,,,,,,0.06504711508750916,,,,,, +20,69199,,,,,,,,,,,,0.07378886640071869,,,,,, +20,69249,,,,,,,,,,,,0.0649769976735115,,,,,, +20,69299,,,,,,,,,,,,0.07075931131839752,,,,,, +20,69349,,,,,,,,,,,,0.09125618636608124,,,,,, +20,69399,,,,,,,,,,,,0.06810732185840607,,,,,, +20,69449,,,,,,,,,,,,0.07262008637189865,,,,,, +20,69499,,,,,,,,,,,,0.0679684579372406,,,,,, +20,69549,,,,,,,,,,,,0.0849667638540268,,,,,, +20,69599,,,,,,,,,,,,0.0851171538233757,,,,,, +20,69649,,,,,,,,,,,,0.06067175418138504,,,,,, +20,69699,,,,,,,,,,,,0.07724106311798096,,,,,, +20,69749,,,,,,,,,,,,0.06361690908670425,,,,,, +20,69799,,,,,,,,,,,,0.06697451323270798,,,,,, +20,69849,,,,,,,,,,,,0.07116976380348206,,,,,, +20,69899,,,,,,,,,,,,0.0900440439581871,,,,,, +20,69949,,,,,,,,,,,,0.08275473862886429,,,,,, +20,69999,,,,,,,,,,,,0.0745021402835846,,,,,, +20,70049,,,,,,,,,,,,0.07347460091114044,,,,,, +20,70099,,,,,,,,,,,,0.07641264796257019,,,,,, +20,70149,,,,,,,,,,,,0.08137421309947968,,,,,, +20,70199,,,,,,,,,,,,0.07803787291049957,,,,,, +20,70249,,,,,,,,,,,,0.06516438722610474,,,,,, +20,70299,,,,,,,,,,,,0.07093879580497742,,,,,, +20,70349,,,,,,,,,,,,0.07228472828865051,,,,,, +20,70399,,,,,,,,,,,,0.07206659018993378,,,,,, +20,70449,,,,,,,,,,,,0.06579501181840897,,,,,, +20,70499,,,,,,,,,,,,0.08661748468875885,,,,,, +20,70549,,,,,,,,,,,,0.07656420767307281,,,,,, +20,70599,,,,,,,,,,,,0.06874164193868637,,,,,, +20,70649,,,,,,,,,,,,0.06814294308423996,,,,,, +20,70699,,,,,,,,,,,,0.06096142157912254,,,,,, +20,70749,,,,,,,,,,,,0.07369670271873474,,,,,, +20,70799,,,,,,,,,,,,0.06899510324001312,,,,,, +20,70849,,,,,,,,,,,,0.07161891460418701,,,,,, +20,70899,,,,,,,,,,,,0.07058404386043549,,,,,, +20,70949,,,,,,,,,,,,0.06742056459188461,,,,,, +20,70999,,,,,,,,,,,,0.08036598563194275,,,,,, +20,71049,,,,,,,,,,,,0.06282877177000046,,,,,, +20,71099,,,,,,,,,,,,0.06661688536405563,,,,,, +20,71149,,,,,,,,,,,,0.07252813875675201,,,,,, +20,71199,,,,,,,,,,,,0.07925496995449066,,,,,, +20,71249,,,,,,,,,,,,0.06797144562005997,,,,,, +20,71299,,,,,,,,,,,,0.07500582188367844,,,,,, +20,71349,,,,,,,,,,,,0.07349234819412231,,,,,, +20,71399,,,,,,,,,,,,0.06558403372764587,,,,,, +20,71449,,,,,,,,,,,,0.08612386137247086,,,,,, +20,71499,,,,,,,,,,,,0.07724764943122864,,,,,, +20,71549,,,,,,,,,,,,0.0730874240398407,,,,,, +20,71599,,,,,,,,,,,,0.072309210896492,,,,,, +20,71649,,,,,,,,,,,,0.068245068192482,,,,,, +20,71699,,,,,,,,,,,,0.06574209034442902,,,,,, +20,71749,,,,,,,,,,,,0.06645180284976959,,,,,, +20,71799,,,,,,,,,,,,0.0755632296204567,,,,,, +20,71849,,,,,,,,,,,,0.06992001831531525,,,,,, +20,71899,,,,,,,,,,,,0.07203604280948639,,,,,, +20,71949,,,,,,,,,,,,0.07153485715389252,,,,,, +20,71999,,,,,,,,,,,,0.05722406506538391,,,,,, +20,72049,,,,,,,,,,,,0.07691865414381027,,,,,, +20,72099,,,,,,,,,,,,0.05640987306833267,,,,,, +20,72149,,,,,,,,,,,,0.06734751164913177,,,,,, +20,72199,,,,,,,,,,,,0.08006954938173294,,,,,, +20,72249,,,,,,,,,,,,0.0845358818769455,,,,,, +20,72281,,,,,,,,,,,,,0.23233461380004883,0.07757303863763809,0.36450672149658203,0.06651139259338379,0.3671199679374695,0.07757303863763809 +20,72281,,,,,,,0.2279336303472519,0.07230275124311447,0.35495394468307495,0.12589317560195923,0.3376108705997467,,,,,,, +21,72299,,,,,,,,,,,,0.07654622197151184,,,,,, +21,72349,,,,,,,,,,,,0.06803184747695923,,,,,, +21,72399,,,,,,,,,,,,0.06874088943004608,,,,,, +21,72449,,,,,,,,,,,,0.06904588639736176,,,,,, +21,72499,,,,,,,,,,,,0.06569960713386536,,,,,, +21,72549,,,,,,,,,,,,0.07422272861003876,,,,,, +21,72599,,,,,,,,,,,,0.07204309850931168,,,,,, +21,72649,,,,,,,,,,,,0.05788341164588928,,,,,, +21,72699,,,,,,,,,,,,0.07870073616504669,,,,,, +21,72749,,,,,,,,,,,,0.07865658402442932,,,,,, +21,72799,,,,,,,,,,,,0.07453550398349762,,,,,, +21,72849,,,,,,,,,,,,0.07433430850505829,,,,,, +21,72899,,,,,,,,,,,,0.08773800730705261,,,,,, +21,72949,,,,,,,,,,,,0.07788735628128052,,,,,, +21,72999,,,,,,,,,,,,0.07815167307853699,,,,,, +21,73049,,,,,,,,,,,,0.0789906233549118,,,,,, +21,73099,,,,,,,,,,,,0.07243893295526505,,,,,, +21,73149,,,,,,,,,,,,0.07480183243751526,,,,,, +21,73199,,,,,,,,,,,,0.06991706788539886,,,,,, +21,73249,,,,,,,,,,,,0.0743633583188057,,,,,, +21,73299,,,,,,,,,,,,0.07841712236404419,,,,,, +21,73349,,,,,,,,,,,,0.07353752851486206,,,,,, +21,73399,,,,,,,,,,,,0.07866786420345306,,,,,, +21,73449,,,,,,,,,,,,0.07631784677505493,,,,,, +21,73499,,,,,,,,,,,,0.07377755641937256,,,,,, +21,73549,,,,,,,,,,,,0.07328476011753082,,,,,, +21,73599,,,,,,,,,,,,0.06558236479759216,,,,,, +21,73649,,,,,,,,,,,,0.07883685827255249,,,,,, +21,73699,,,,,,,,,,,,0.06763678044080734,,,,,, +21,73749,,,,,,,,,,,,0.07602094113826752,,,,,, +21,73799,,,,,,,,,,,,0.07097017765045166,,,,,, +21,73849,,,,,,,,,,,,0.08481580018997192,,,,,, +21,73899,,,,,,,,,,,,0.06461165845394135,,,,,, +21,73949,,,,,,,,,,,,0.07049692422151566,,,,,, +21,73999,,,,,,,,,,,,0.07719474285840988,,,,,, +21,74049,,,,,,,,,,,,0.06916388869285583,,,,,, +21,74099,,,,,,,,,,,,0.06187828630208969,,,,,, +21,74149,,,,,,,,,,,,0.06197195500135422,,,,,, +21,74199,,,,,,,,,,,,0.08221296221017838,,,,,, +21,74249,,,,,,,,,,,,0.06585570424795151,,,,,, +21,74299,,,,,,,,,,,,0.07660675048828125,,,,,, +21,74349,,,,,,,,,,,,0.07759684324264526,,,,,, +21,74399,,,,,,,,,,,,0.06529857218265533,,,,,, +21,74449,,,,,,,,,,,,0.06057179719209671,,,,,, +21,74499,,,,,,,,,,,,0.06890669465065002,,,,,, +21,74549,,,,,,,,,,,,0.07467207312583923,,,,,, +21,74599,,,,,,,,,,,,0.07160308957099915,,,,,, +21,74649,,,,,,,,,,,,0.06466465443372726,,,,,, +21,74699,,,,,,,,,,,,0.06422139704227448,,,,,, +21,74749,,,,,,,,,,,,0.05786416679620743,,,,,, +21,74799,,,,,,,,,,,,0.0707492083311081,,,,,, +21,74849,,,,,,,,,,,,0.07220735400915146,,,,,, +21,74899,,,,,,,,,,,,0.0728042870759964,,,,,, +21,74949,,,,,,,,,,,,0.07417811453342438,,,,,, +21,74999,,,,,,,,,,,,0.07709921896457672,,,,,, +21,75049,,,,,,,,,,,,0.08114376664161682,,,,,, +21,75099,,,,,,,,,,,,0.07252149283885956,,,,,, +21,75149,,,,,,,,,,,,0.06805881857872009,,,,,, +21,75199,,,,,,,,,,,,0.06518256664276123,,,,,, +21,75249,,,,,,,,,,,,0.07341515272855759,,,,,, +21,75299,,,,,,,,,,,,0.08065728098154068,,,,,, +21,75349,,,,,,,,,,,,0.07997141778469086,,,,,, +21,75399,,,,,,,,,,,,0.07641585171222687,,,,,, +21,75449,,,,,,,,,,,,0.07808956503868103,,,,,, +21,75499,,,,,,,,,,,,0.06400945037603378,,,,,, +21,75549,,,,,,,,,,,,0.0672902762889862,,,,,, +21,75599,,,,,,,,,,,,0.06716553866863251,,,,,, +21,75649,,,,,,,,,,,,0.07576214522123337,,,,,, +21,75699,,,,,,,,,,,,0.07396799325942993,,,,,, +21,75723,,,,,,,,,,,,,0.23597869277000427,0.08078106492757797,0.3642766773700714,0.027907073497772217,0.3654572069644928,0.08078106492757797 +21,75723,,,,,,,0.22672908008098602,0.0716453567147255,0.3658932149410248,0.1338357925415039,0.3461562991142273,,,,,,, +22,75749,,,,,,,,,,,,0.06891091167926788,,,,,, +22,75799,,,,,,,,,,,,0.07659386098384857,,,,,, +22,75849,,,,,,,,,,,,0.08535532653331757,,,,,, +22,75899,,,,,,,,,,,,0.06778430193662643,,,,,, +22,75949,,,,,,,,,,,,0.07039335370063782,,,,,, +22,75999,,,,,,,,,,,,0.07858695089817047,,,,,, +22,76049,,,,,,,,,,,,0.0839415043592453,,,,,, +22,76099,,,,,,,,,,,,0.07978170365095139,,,,,, +22,76149,,,,,,,,,,,,0.07149803638458252,,,,,, +22,76199,,,,,,,,,,,,0.06495550274848938,,,,,, +22,76249,,,,,,,,,,,,0.07693956792354584,,,,,, +22,76299,,,,,,,,,,,,0.08789819478988647,,,,,, +22,76349,,,,,,,,,,,,0.05990005284547806,,,,,, +22,76399,,,,,,,,,,,,0.07159243524074554,,,,,, +22,76449,,,,,,,,,,,,0.07385449856519699,,,,,, +22,76499,,,,,,,,,,,,0.06424935907125473,,,,,, +22,76549,,,,,,,,,,,,0.08205609023571014,,,,,, +22,76599,,,,,,,,,,,,0.07217781990766525,,,,,, +22,76649,,,,,,,,,,,,0.0674348771572113,,,,,, +22,76699,,,,,,,,,,,,0.07310236245393753,,,,,, +22,76749,,,,,,,,,,,,0.07042482495307922,,,,,, +22,76799,,,,,,,,,,,,0.0672328770160675,,,,,, +22,76849,,,,,,,,,,,,0.0778573676943779,,,,,, +22,76899,,,,,,,,,,,,0.06559891998767853,,,,,, +22,76949,,,,,,,,,,,,0.06238823011517525,,,,,, +22,76999,,,,,,,,,,,,0.08409994095563889,,,,,, +22,77049,,,,,,,,,,,,0.07123859971761703,,,,,, +22,77099,,,,,,,,,,,,0.0746033638715744,,,,,, +22,77149,,,,,,,,,,,,0.07964015007019043,,,,,, +22,77199,,,,,,,,,,,,0.07948803901672363,,,,,, +22,77249,,,,,,,,,,,,0.07903444021940231,,,,,, +22,77299,,,,,,,,,,,,0.07367351651191711,,,,,, +22,77349,,,,,,,,,,,,0.07203562557697296,,,,,, +22,77399,,,,,,,,,,,,0.05997921898961067,,,,,, +22,77449,,,,,,,,,,,,0.07079207897186279,,,,,, +22,77499,,,,,,,,,,,,0.07507310807704926,,,,,, +22,77549,,,,,,,,,,,,0.06997095048427582,,,,,, +22,77599,,,,,,,,,,,,0.07737331092357635,,,,,, +22,77649,,,,,,,,,,,,0.08114853501319885,,,,,, +22,77699,,,,,,,,,,,,0.06974975764751434,,,,,, +22,77749,,,,,,,,,,,,0.07193763554096222,,,,,, +22,77799,,,,,,,,,,,,0.07382301986217499,,,,,, +22,77849,,,,,,,,,,,,0.07314510643482208,,,,,, +22,77899,,,,,,,,,,,,0.08036172389984131,,,,,, +22,77949,,,,,,,,,,,,0.05311048403382301,,,,,, +22,77999,,,,,,,,,,,,0.07608760893344879,,,,,, +22,78049,,,,,,,,,,,,0.0721065104007721,,,,,, +22,78099,,,,,,,,,,,,0.07017308473587036,,,,,, +22,78149,,,,,,,,,,,,0.07747375965118408,,,,,, +22,78199,,,,,,,,,,,,0.06833912432193756,,,,,, +22,78249,,,,,,,,,,,,0.06956742703914642,,,,,, +22,78299,,,,,,,,,,,,0.08113980293273926,,,,,, +22,78349,,,,,,,,,,,,0.07352311909198761,,,,,, +22,78399,,,,,,,,,,,,0.07334569096565247,,,,,, +22,78449,,,,,,,,,,,,0.06686200201511383,,,,,, +22,78499,,,,,,,,,,,,0.07459409534931183,,,,,, +22,78549,,,,,,,,,,,,0.07092718780040741,,,,,, +22,78599,,,,,,,,,,,,0.06627074629068375,,,,,, +22,78649,,,,,,,,,,,,0.06874246895313263,,,,,, +22,78699,,,,,,,,,,,,0.07255977392196655,,,,,, +22,78749,,,,,,,,,,,,0.06054346263408661,,,,,, +22,78799,,,,,,,,,,,,0.07556480169296265,,,,,, +22,78849,,,,,,,,,,,,0.0678708478808403,,,,,, +22,78899,,,,,,,,,,,,0.07375723123550415,,,,,, +22,78949,,,,,,,,,,,,0.07799553871154785,,,,,, +22,78999,,,,,,,,,,,,0.0817815363407135,,,,,, +22,79049,,,,,,,,,,,,0.06769345700740814,,,,,, +22,79099,,,,,,,,,,,,0.06811508536338806,,,,,, +22,79149,,,,,,,,,,,,0.07277059555053711,,,,,, +22,79165,,,,,,,,,,,,,0.22772902250289917,0.07512540370225906,0.3808400630950928,0.0959654450416565,0.37790563702583313,0.07512540370225906 +22,79165,,,,,,,0.22612185776233673,0.0712948888540268,0.37163102626800537,0.1380710005760193,0.3511573076248169,,,,,,, +23,79199,,,,,,,,,,,,0.06166818365454674,,,,,, +23,79249,,,,,,,,,,,,0.07284033298492432,,,,,, +23,79299,,,,,,,,,,,,0.073652483522892,,,,,, +23,79349,,,,,,,,,,,,0.06505127251148224,,,,,, +23,79399,,,,,,,,,,,,0.06958705931901932,,,,,, +23,79449,,,,,,,,,,,,0.06485120207071304,,,,,, +23,79499,,,,,,,,,,,,0.07076667249202728,,,,,, +23,79549,,,,,,,,,,,,0.07407909631729126,,,,,, +23,79599,,,,,,,,,,,,0.07535006105899811,,,,,, +23,79649,,,,,,,,,,,,0.07208923995494843,,,,,, +23,79699,,,,,,,,,,,,0.0680554211139679,,,,,, +23,79749,,,,,,,,,,,,0.07896234095096588,,,,,, +23,79799,,,,,,,,,,,,0.058477677404880524,,,,,, +23,79849,,,,,,,,,,,,0.06489028036594391,,,,,, +23,79899,,,,,,,,,,,,0.06462648510932922,,,,,, +23,79949,,,,,,,,,,,,0.06304778158664703,,,,,, +23,79999,,,,,,,,,,,,0.06220265105366707,,,,,, +23,80049,,,,,,,,,,,,0.07532797008752823,,,,,, +23,80099,,,,,,,,,,,,0.06745366752147675,,,,,, +23,80149,,,,,,,,,,,,0.06539900600910187,,,,,, +23,80199,,,,,,,,,,,,0.06850506365299225,,,,,, +23,80249,,,,,,,,,,,,0.06836836040019989,,,,,, +23,80299,,,,,,,,,,,,0.07513923943042755,,,,,, +23,80349,,,,,,,,,,,,0.07601393759250641,,,,,, +23,80399,,,,,,,,,,,,0.07353197038173676,,,,,, +23,80449,,,,,,,,,,,,0.05830754339694977,,,,,, +23,80499,,,,,,,,,,,,0.06388337165117264,,,,,, +23,80549,,,,,,,,,,,,0.06984618306159973,,,,,, +23,80599,,,,,,,,,,,,0.06583309173583984,,,,,, +23,80649,,,,,,,,,,,,0.07016059756278992,,,,,, +23,80699,,,,,,,,,,,,0.06450466811656952,,,,,, +23,80749,,,,,,,,,,,,0.07433965802192688,,,,,, +23,80799,,,,,,,,,,,,0.06115707755088806,,,,,, +23,80849,,,,,,,,,,,,0.07424618303775787,,,,,, +23,80899,,,,,,,,,,,,0.0661509558558464,,,,,, +23,80949,,,,,,,,,,,,0.07062910497188568,,,,,, +23,80999,,,,,,,,,,,,0.0677669495344162,,,,,, +23,81049,,,,,,,,,,,,0.07005654275417328,,,,,, +23,81099,,,,,,,,,,,,0.07151765376329422,,,,,, +23,81149,,,,,,,,,,,,0.0748898983001709,,,,,, +23,81199,,,,,,,,,,,,0.06098628789186478,,,,,, +23,81249,,,,,,,,,,,,0.07254811376333237,,,,,, +23,81299,,,,,,,,,,,,0.0689842700958252,,,,,, +23,81349,,,,,,,,,,,,0.06733739376068115,,,,,, +23,81399,,,,,,,,,,,,0.07686860859394073,,,,,, +23,81449,,,,,,,,,,,,0.059513404965400696,,,,,, +23,81499,,,,,,,,,,,,0.07301183044910431,,,,,, +23,81549,,,,,,,,,,,,0.08020970225334167,,,,,, +23,81599,,,,,,,,,,,,0.07968205213546753,,,,,, +23,81649,,,,,,,,,,,,0.060556285083293915,,,,,, +23,81699,,,,,,,,,,,,0.07817120850086212,,,,,, +23,81749,,,,,,,,,,,,0.05925748869776726,,,,,, +23,81799,,,,,,,,,,,,0.08196990936994553,,,,,, +23,81849,,,,,,,,,,,,0.06285421550273895,,,,,, +23,81899,,,,,,,,,,,,0.08148045837879181,,,,,, +23,81949,,,,,,,,,,,,0.06636132299900055,,,,,, +23,81999,,,,,,,,,,,,0.08350194990634918,,,,,, +23,82049,,,,,,,,,,,,0.06770531833171844,,,,,, +23,82099,,,,,,,,,,,,0.0704236850142479,,,,,, +23,82149,,,,,,,,,,,,0.07204091548919678,,,,,, +23,82199,,,,,,,,,,,,0.07416614890098572,,,,,, +23,82249,,,,,,,,,,,,0.07079881429672241,,,,,, +23,82299,,,,,,,,,,,,0.07198965549468994,,,,,, +23,82349,,,,,,,,,,,,0.06399103999137878,,,,,, +23,82399,,,,,,,,,,,,0.0683036744594574,,,,,, +23,82449,,,,,,,,,,,,0.07769012451171875,,,,,, +23,82499,,,,,,,,,,,,0.06552480906248093,,,,,, +23,82549,,,,,,,,,,,,0.06611265242099762,,,,,, +23,82599,,,,,,,,,,,,0.06515072286128998,,,,,, +23,82607,,,,,,,,,,,,,0.22891755402088165,0.07486660778522491,0.38399940729141235,0.09907972812652588,0.3833903968334198,0.07486660778522491 +23,82607,,,,,,,0.22446885704994202,0.07048365473747253,0.38457348942756653,0.14788252115249634,0.36367812752723694,,,,,,, +24,82649,,,,,,,,,,,,0.07699213922023773,,,,,, +24,82699,,,,,,,,,,,,0.07907529175281525,,,,,, +24,82749,,,,,,,,,,,,0.080490842461586,,,,,, +24,82799,,,,,,,,,,,,0.07013818621635437,,,,,, +24,82849,,,,,,,,,,,,0.07256142795085907,,,,,, +24,82899,,,,,,,,,,,,0.07671891152858734,,,,,, +24,82949,,,,,,,,,,,,0.07231134176254272,,,,,, +24,82999,,,,,,,,,,,,0.06854279339313507,,,,,, +24,83049,,,,,,,,,,,,0.06598401069641113,,,,,, +24,83099,,,,,,,,,,,,0.07980716228485107,,,,,, +24,83149,,,,,,,,,,,,0.0786360651254654,,,,,, +24,83199,,,,,,,,,,,,0.08286049962043762,,,,,, +24,83249,,,,,,,,,,,,0.06552568078041077,,,,,, +24,83299,,,,,,,,,,,,0.07288163900375366,,,,,, +24,83349,,,,,,,,,,,,0.0661453902721405,,,,,, +24,83399,,,,,,,,,,,,0.05730117857456207,,,,,, +24,83449,,,,,,,,,,,,0.07220133394002914,,,,,, +24,83499,,,,,,,,,,,,0.06547344475984573,,,,,, +24,83549,,,,,,,,,,,,0.08059386909008026,,,,,, +24,83599,,,,,,,,,,,,0.08213026821613312,,,,,, +24,83649,,,,,,,,,,,,0.0700099766254425,,,,,, +24,83699,,,,,,,,,,,,0.0786551982164383,,,,,, +24,83749,,,,,,,,,,,,0.07428635656833649,,,,,, +24,83799,,,,,,,,,,,,0.06250085681676865,,,,,, +24,83849,,,,,,,,,,,,0.07587119936943054,,,,,, +24,83899,,,,,,,,,,,,0.07076125591993332,,,,,, +24,83949,,,,,,,,,,,,0.05479612946510315,,,,,, +24,83999,,,,,,,,,,,,0.07015148550271988,,,,,, +24,84049,,,,,,,,,,,,0.07361000776290894,,,,,, +24,84099,,,,,,,,,,,,0.06536050140857697,,,,,, +24,84149,,,,,,,,,,,,0.0775429755449295,,,,,, +24,84199,,,,,,,,,,,,0.07281502336263657,,,,,, +24,84249,,,,,,,,,,,,0.07682037353515625,,,,,, +24,84299,,,,,,,,,,,,0.06034848839044571,,,,,, +24,84349,,,,,,,,,,,,0.06576016545295715,,,,,, +24,84399,,,,,,,,,,,,0.08155173063278198,,,,,, +24,84449,,,,,,,,,,,,0.06588040292263031,,,,,, +24,84499,,,,,,,,,,,,0.06010428071022034,,,,,, +24,84549,,,,,,,,,,,,0.07469266653060913,,,,,, +24,84599,,,,,,,,,,,,0.07216376811265945,,,,,, +24,84649,,,,,,,,,,,,0.07818376272916794,,,,,, +24,84699,,,,,,,,,,,,0.0711030513048172,,,,,, +24,84749,,,,,,,,,,,,0.07597540318965912,,,,,, +24,84799,,,,,,,,,,,,0.07909686863422394,,,,,, +24,84849,,,,,,,,,,,,0.06343404203653336,,,,,, +24,84899,,,,,,,,,,,,0.08291259407997131,,,,,, +24,84949,,,,,,,,,,,,0.056678738445043564,,,,,, +24,84999,,,,,,,,,,,,0.07815371453762054,,,,,, +24,85049,,,,,,,,,,,,0.0760747641324997,,,,,, +24,85099,,,,,,,,,,,,0.07665643841028214,,,,,, +24,85149,,,,,,,,,,,,0.07023917138576508,,,,,, +24,85199,,,,,,,,,,,,0.06767313182353973,,,,,, +24,85249,,,,,,,,,,,,0.07171653211116791,,,,,, +24,85299,,,,,,,,,,,,0.06667772680521011,,,,,, +24,85349,,,,,,,,,,,,0.07249273359775543,,,,,, +24,85399,,,,,,,,,,,,0.0721864402294159,,,,,, +24,85449,,,,,,,,,,,,0.06990081071853638,,,,,, +24,85499,,,,,,,,,,,,0.06780089437961578,,,,,, +24,85549,,,,,,,,,,,,0.07155204564332962,,,,,, +24,85599,,,,,,,,,,,,0.07248874008655548,,,,,, +24,85649,,,,,,,,,,,,0.06488741934299469,,,,,, +24,85699,,,,,,,,,,,,0.06357434391975403,,,,,, +24,85749,,,,,,,,,,,,0.060557231307029724,,,,,, +24,85799,,,,,,,,,,,,0.06792178750038147,,,,,, +24,85849,,,,,,,,,,,,0.07141577452421188,,,,,, +24,85899,,,,,,,,,,,,0.06903214752674103,,,,,, +24,85949,,,,,,,,,,,,0.07495385408401489,,,,,, +24,85999,,,,,,,,,,,,0.06986688077449799,,,,,, +24,86049,,,,,,,,,,,,0.07214713096618652,,,,,, +24,86049,,,,,,,,,,,,,0.22858169674873352,0.07557998597621918,0.37708601355552673,0.09049516916275024,0.3765419125556946,0.07557998597621918 +24,86049,,,,,,,0.22382745146751404,0.07012584805488586,0.39014458656311035,0.15220755338668823,0.36894628405570984,,,,,,, +25,86099,,,,,,,,,,,,0.07271768152713776,,,,,, +25,86149,,,,,,,,,,,,0.06242784857749939,,,,,, +25,86199,,,,,,,,,,,,0.08526872098445892,,,,,, +25,86249,,,,,,,,,,,,0.05796993896365166,,,,,, +25,86299,,,,,,,,,,,,0.07239798456430435,,,,,, +25,86349,,,,,,,,,,,,0.06585562229156494,,,,,, +25,86399,,,,,,,,,,,,0.06428733468055725,,,,,, +25,86449,,,,,,,,,,,,0.0709722638130188,,,,,, +25,86499,,,,,,,,,,,,0.06876570731401443,,,,,, +25,86549,,,,,,,,,,,,0.0738326907157898,,,,,, +25,86599,,,,,,,,,,,,0.06642776727676392,,,,,, +25,86649,,,,,,,,,,,,0.07315968722105026,,,,,, +25,86699,,,,,,,,,,,,0.0879850909113884,,,,,, +25,86749,,,,,,,,,,,,0.06904099136590958,,,,,, +25,86799,,,,,,,,,,,,0.06664633750915527,,,,,, +25,86849,,,,,,,,,,,,0.06320473551750183,,,,,, +25,86899,,,,,,,,,,,,0.07754002511501312,,,,,, +25,86949,,,,,,,,,,,,0.07001805305480957,,,,,, +25,86999,,,,,,,,,,,,0.06794479489326477,,,,,, +25,87049,,,,,,,,,,,,0.06277410686016083,,,,,, +25,87099,,,,,,,,,,,,0.07259868830442429,,,,,, +25,87149,,,,,,,,,,,,0.06854648143053055,,,,,, +25,87199,,,,,,,,,,,,0.0745701938867569,,,,,, +25,87249,,,,,,,,,,,,0.06315232813358307,,,,,, +25,87299,,,,,,,,,,,,0.06719844788312912,,,,,, +25,87349,,,,,,,,,,,,0.07444710284471512,,,,,, +25,87399,,,,,,,,,,,,0.08569206297397614,,,,,, +25,87449,,,,,,,,,,,,0.06209150329232216,,,,,, +25,87499,,,,,,,,,,,,0.06769908964633942,,,,,, +25,87549,,,,,,,,,,,,0.08311872184276581,,,,,, +25,87599,,,,,,,,,,,,0.06710277497768402,,,,,, +25,87649,,,,,,,,,,,,0.06054183095693588,,,,,, +25,87699,,,,,,,,,,,,0.07582350820302963,,,,,, +25,87749,,,,,,,,,,,,0.06930816918611526,,,,,, +25,87799,,,,,,,,,,,,0.06754620373249054,,,,,, +25,87849,,,,,,,,,,,,0.0638982430100441,,,,,, +25,87899,,,,,,,,,,,,0.07313922792673111,,,,,, +25,87949,,,,,,,,,,,,0.06703831255435944,,,,,, +25,87999,,,,,,,,,,,,0.07489784061908722,,,,,, +25,88049,,,,,,,,,,,,0.06691619753837585,,,,,, +25,88099,,,,,,,,,,,,0.06759017705917358,,,,,, +25,88149,,,,,,,,,,,,0.060883454978466034,,,,,, +25,88199,,,,,,,,,,,,0.0626385435461998,,,,,, +25,88249,,,,,,,,,,,,0.07507991790771484,,,,,, +25,88299,,,,,,,,,,,,0.08262073993682861,,,,,, +25,88349,,,,,,,,,,,,0.07447972893714905,,,,,, +25,88399,,,,,,,,,,,,0.0737103670835495,,,,,, +25,88449,,,,,,,,,,,,0.07393757998943329,,,,,, +25,88499,,,,,,,,,,,,0.07597777247428894,,,,,, +25,88549,,,,,,,,,,,,0.07265180349349976,,,,,, +25,88599,,,,,,,,,,,,0.08012876659631729,,,,,, +25,88649,,,,,,,,,,,,0.07706604152917862,,,,,, +25,88699,,,,,,,,,,,,0.0786217451095581,,,,,, +25,88749,,,,,,,,,,,,0.07843808829784393,,,,,, +25,88799,,,,,,,,,,,,0.07236908376216888,,,,,, +25,88849,,,,,,,,,,,,0.07536382973194122,,,,,, +25,88899,,,,,,,,,,,,0.08293434977531433,,,,,, +25,88949,,,,,,,,,,,,0.07161341607570648,,,,,, +25,88999,,,,,,,,,,,,0.07229352742433548,,,,,, +25,89049,,,,,,,,,,,,0.07066567242145538,,,,,, +25,89099,,,,,,,,,,,,0.06814064830541611,,,,,, +25,89149,,,,,,,,,,,,0.0648769661784172,,,,,, +25,89199,,,,,,,,,,,,0.06040332466363907,,,,,, +25,89249,,,,,,,,,,,,0.06648262590169907,,,,,, +25,89299,,,,,,,,,,,,0.07271700352430344,,,,,, +25,89349,,,,,,,,,,,,0.06726205348968506,,,,,, +25,89399,,,,,,,,,,,,0.07045084238052368,,,,,, +25,89449,,,,,,,,,,,,0.0760023295879364,,,,,, +25,89491,,,,,,,,,,,,,0.22702264785766602,0.07384782284498215,0.38019299507141113,0.11133944988250732,0.37624314427375793,0.07384782284498215 +25,89491,,,,,,,0.2234565168619156,0.06995126605033875,0.392841637134552,0.15431559085845947,0.37149935960769653,,,,,,, +26,89499,,,,,,,,,,,,0.07762997597455978,,,,,, +26,89549,,,,,,,,,,,,0.06712521612644196,,,,,, +26,89599,,,,,,,,,,,,0.06859453022480011,,,,,, +26,89649,,,,,,,,,,,,0.06564946472644806,,,,,, +26,89699,,,,,,,,,,,,0.06595930457115173,,,,,, +26,89749,,,,,,,,,,,,0.063237264752388,,,,,, +26,89799,,,,,,,,,,,,0.07498246431350708,,,,,, +26,89849,,,,,,,,,,,,0.06263512372970581,,,,,, +26,89899,,,,,,,,,,,,0.0689622312784195,,,,,, +26,89949,,,,,,,,,,,,0.07358261197805405,,,,,, +26,89999,,,,,,,,,,,,0.0706876665353775,,,,,, +26,90049,,,,,,,,,,,,0.07613933086395264,,,,,, +26,90099,,,,,,,,,,,,0.07198144495487213,,,,,, +26,90149,,,,,,,,,,,,0.07678909599781036,,,,,, +26,90199,,,,,,,,,,,,0.06943796575069427,,,,,, +26,90249,,,,,,,,,,,,0.07398895919322968,,,,,, +26,90299,,,,,,,,,,,,0.08214603364467621,,,,,, +26,90349,,,,,,,,,,,,0.06668032705783844,,,,,, +26,90399,,,,,,,,,,,,0.06836867332458496,,,,,, +26,90449,,,,,,,,,,,,0.0712866485118866,,,,,, +26,90499,,,,,,,,,,,,0.07490450143814087,,,,,, +26,90549,,,,,,,,,,,,0.07280270755290985,,,,,, +26,90599,,,,,,,,,,,,0.0641646534204483,,,,,, +26,90649,,,,,,,,,,,,0.07653941214084625,,,,,, +26,90699,,,,,,,,,,,,0.059282198548316956,,,,,, +26,90749,,,,,,,,,,,,0.06641069799661636,,,,,, +26,90799,,,,,,,,,,,,0.07013630867004395,,,,,, +26,90849,,,,,,,,,,,,0.06648799031972885,,,,,, +26,90899,,,,,,,,,,,,0.06686766445636749,,,,,, +26,90949,,,,,,,,,,,,0.06710247695446014,,,,,, +26,90999,,,,,,,,,,,,0.07950809597969055,,,,,, +26,91049,,,,,,,,,,,,0.06958147883415222,,,,,, +26,91099,,,,,,,,,,,,0.0731058269739151,,,,,, +26,91149,,,,,,,,,,,,0.05829530209302902,,,,,, +26,91199,,,,,,,,,,,,0.06228528171777725,,,,,, +26,91249,,,,,,,,,,,,0.07922450453042984,,,,,, +26,91299,,,,,,,,,,,,0.07917262613773346,,,,,, +26,91349,,,,,,,,,,,,0.0681801438331604,,,,,, +26,91399,,,,,,,,,,,,0.06966863572597504,,,,,, +26,91449,,,,,,,,,,,,0.07443215698003769,,,,,, +26,91499,,,,,,,,,,,,0.06244145333766937,,,,,, +26,91549,,,,,,,,,,,,0.06423825025558472,,,,,, +26,91599,,,,,,,,,,,,0.0698515921831131,,,,,, +26,91649,,,,,,,,,,,,0.07090035080909729,,,,,, +26,91699,,,,,,,,,,,,0.05971606820821762,,,,,, +26,91749,,,,,,,,,,,,0.0641840249300003,,,,,, +26,91799,,,,,,,,,,,,0.07507006078958511,,,,,, +26,91849,,,,,,,,,,,,0.08223527669906616,,,,,, +26,91899,,,,,,,,,,,,0.07560842484235764,,,,,, +26,91949,,,,,,,,,,,,0.07454150915145874,,,,,, +26,91999,,,,,,,,,,,,0.06262023001909256,,,,,, +26,92049,,,,,,,,,,,,0.06830240041017532,,,,,, +26,92099,,,,,,,,,,,,0.07175834476947784,,,,,, +26,92149,,,,,,,,,,,,0.06854373216629028,,,,,, +26,92199,,,,,,,,,,,,0.06709322333335876,,,,,, +26,92249,,,,,,,,,,,,0.06302621960639954,,,,,, +26,92299,,,,,,,,,,,,0.0665779858827591,,,,,, +26,92349,,,,,,,,,,,,0.06788253784179688,,,,,, +26,92399,,,,,,,,,,,,0.07410962879657745,,,,,, +26,92449,,,,,,,,,,,,0.07323872298002243,,,,,, +26,92499,,,,,,,,,,,,0.07006891071796417,,,,,, +26,92549,,,,,,,,,,,,0.08055806905031204,,,,,, +26,92599,,,,,,,,,,,,0.06806185096502304,,,,,, +26,92649,,,,,,,,,,,,0.08758443593978882,,,,,, +26,92699,,,,,,,,,,,,0.06600261479616165,,,,,, +26,92749,,,,,,,,,,,,0.07057416439056396,,,,,, +26,92799,,,,,,,,,,,,0.07306189835071564,,,,,, +26,92849,,,,,,,,,,,,0.07389163970947266,,,,,, +26,92899,,,,,,,,,,,,0.07443676888942719,,,,,, +26,92933,,,,,,,,,,,,,0.2260875105857849,0.07384265214204788,0.3785148859024048,0.11140173673629761,0.3788910210132599,0.07384265214204788 +26,92933,,,,,,,0.22321009635925293,0.0698576346039772,0.3942914605140686,0.155448317527771,0.3733152151107788,,,,,,, +27,92949,,,,,,,,,,,,0.06459537148475647,,,,,, +27,92999,,,,,,,,,,,,0.07342372089624405,,,,,, +27,93049,,,,,,,,,,,,0.058753542602062225,,,,,, +27,93099,,,,,,,,,,,,0.0696713775396347,,,,,, +27,93149,,,,,,,,,,,,0.06306357681751251,,,,,, +27,93199,,,,,,,,,,,,0.06386736780405045,,,,,, +27,93249,,,,,,,,,,,,0.06545905768871307,,,,,, +27,93299,,,,,,,,,,,,0.07214996218681335,,,,,, +27,93349,,,,,,,,,,,,0.07157599925994873,,,,,, +27,93399,,,,,,,,,,,,0.0742635577917099,,,,,, +27,93449,,,,,,,,,,,,0.069440558552742,,,,,, +27,93499,,,,,,,,,,,,0.07595928758382797,,,,,, +27,93549,,,,,,,,,,,,0.07263705134391785,,,,,, +27,93599,,,,,,,,,,,,0.07054664194583893,,,,,, +27,93649,,,,,,,,,,,,0.0733492523431778,,,,,, +27,93699,,,,,,,,,,,,0.07673914730548859,,,,,, +27,93749,,,,,,,,,,,,0.055061813443899155,,,,,, +27,93799,,,,,,,,,,,,0.07412062585353851,,,,,, +27,93849,,,,,,,,,,,,0.06848026812076569,,,,,, +27,93899,,,,,,,,,,,,0.0736498013138771,,,,,, +27,93949,,,,,,,,,,,,0.05677544325590134,,,,,, +27,93999,,,,,,,,,,,,0.07806894183158875,,,,,, +27,94049,,,,,,,,,,,,0.0700559988617897,,,,,, +27,94099,,,,,,,,,,,,0.06701613962650299,,,,,, +27,94149,,,,,,,,,,,,0.06438346207141876,,,,,, +27,94199,,,,,,,,,,,,0.06990349292755127,,,,,, +27,94249,,,,,,,,,,,,0.0722980946302414,,,,,, +27,94299,,,,,,,,,,,,0.0714026615023613,,,,,, +27,94349,,,,,,,,,,,,0.07187693566083908,,,,,, +27,94399,,,,,,,,,,,,0.08469438552856445,,,,,, +27,94449,,,,,,,,,,,,0.07550093531608582,,,,,, +27,94499,,,,,,,,,,,,0.06817001104354858,,,,,, +27,94549,,,,,,,,,,,,0.06878790259361267,,,,,, +27,94599,,,,,,,,,,,,0.06988270580768585,,,,,, +27,94649,,,,,,,,,,,,0.07692046463489532,,,,,, +27,94699,,,,,,,,,,,,0.0686003565788269,,,,,, +27,94749,,,,,,,,,,,,0.07873906940221786,,,,,, +27,94799,,,,,,,,,,,,0.06442677974700928,,,,,, +27,94849,,,,,,,,,,,,0.06879881024360657,,,,,, +27,94899,,,,,,,,,,,,0.08088479936122894,,,,,, +27,94949,,,,,,,,,,,,0.06851370632648468,,,,,, +27,94999,,,,,,,,,,,,0.07648886740207672,,,,,, +27,95049,,,,,,,,,,,,0.07198669761419296,,,,,, +27,95099,,,,,,,,,,,,0.07302339375019073,,,,,, +27,95149,,,,,,,,,,,,0.0741630494594574,,,,,, +27,95199,,,,,,,,,,,,0.07801268249750137,,,,,, +27,95249,,,,,,,,,,,,0.07372787594795227,,,,,, +27,95299,,,,,,,,,,,,0.07252075523138046,,,,,, +27,95349,,,,,,,,,,,,0.060172781348228455,,,,,, +27,95399,,,,,,,,,,,,0.07158512622117996,,,,,, +27,95449,,,,,,,,,,,,0.062245287001132965,,,,,, +27,95499,,,,,,,,,,,,0.07227028906345367,,,,,, +27,95549,,,,,,,,,,,,0.07138319313526154,,,,,, +27,95599,,,,,,,,,,,,0.05878707766532898,,,,,, +27,95649,,,,,,,,,,,,0.0684431940317154,,,,,, +27,95699,,,,,,,,,,,,0.05278882756829262,,,,,, +27,95749,,,,,,,,,,,,0.07315865159034729,,,,,, +27,95799,,,,,,,,,,,,0.07672195136547089,,,,,, +27,95849,,,,,,,,,,,,0.07357247173786163,,,,,, +27,95899,,,,,,,,,,,,0.06183759123086929,,,,,, +27,95949,,,,,,,,,,,,0.07999128103256226,,,,,, +27,95999,,,,,,,,,,,,0.07114612311124802,,,,,, +27,96049,,,,,,,,,,,,0.06874721497297287,,,,,, +27,96099,,,,,,,,,,,,0.06815637648105621,,,,,, +27,96149,,,,,,,,,,,,0.07341919839382172,,,,,, +27,96199,,,,,,,,,,,,0.06071702763438225,,,,,, +27,96249,,,,,,,,,,,,0.06184588000178337,,,,,, +27,96299,,,,,,,,,,,,0.07915910333395004,,,,,, +27,96349,,,,,,,,,,,,0.07428421825170517,,,,,, +27,96375,,,,,,,,,,,,,0.22571973502635956,0.07324881106615067,0.3900020122528076,0.11854773759841919,0.39031484723091125,0.07324881106615067 +27,96375,,,,,,,0.22315968573093414,0.06986334174871445,0.3942106068134308,0.1553816795349121,0.3742842674255371,,,,,,, +28,96399,,,,,,,,,,,,0.06794244050979614,,,,,, +28,96449,,,,,,,,,,,,0.06778503954410553,,,,,, +28,96499,,,,,,,,,,,,0.07382319867610931,,,,,, +28,96549,,,,,,,,,,,,0.07479677349328995,,,,,, +28,96599,,,,,,,,,,,,0.06484707444906235,,,,,, +28,96649,,,,,,,,,,,,0.07181219756603241,,,,,, +28,96699,,,,,,,,,,,,0.06264981627464294,,,,,, +28,96749,,,,,,,,,,,,0.06882234662771225,,,,,, +28,96799,,,,,,,,,,,,0.07048001885414124,,,,,, +28,96849,,,,,,,,,,,,0.07127663493156433,,,,,, +28,96899,,,,,,,,,,,,0.07167212665081024,,,,,, +28,96949,,,,,,,,,,,,0.0588369145989418,,,,,, +28,96999,,,,,,,,,,,,0.07280148565769196,,,,,, +28,97049,,,,,,,,,,,,0.05812198296189308,,,,,, +28,97099,,,,,,,,,,,,0.07087615132331848,,,,,, +28,97149,,,,,,,,,,,,0.07946021109819412,,,,,, +28,97199,,,,,,,,,,,,0.07330376654863358,,,,,, +28,97249,,,,,,,,,,,,0.07011640071868896,,,,,, +28,97299,,,,,,,,,,,,0.06393398344516754,,,,,, +28,97349,,,,,,,,,,,,0.06307600438594818,,,,,, +28,97399,,,,,,,,,,,,0.06269272416830063,,,,,, +28,97449,,,,,,,,,,,,0.06231209263205528,,,,,, +28,97499,,,,,,,,,,,,0.06428544968366623,,,,,, +28,97549,,,,,,,,,,,,0.07677339017391205,,,,,, +28,97599,,,,,,,,,,,,0.06957515329122543,,,,,, +28,97649,,,,,,,,,,,,0.08242741227149963,,,,,, +28,97699,,,,,,,,,,,,0.069611094892025,,,,,, +28,97749,,,,,,,,,,,,0.0772712230682373,,,,,, +28,97799,,,,,,,,,,,,0.06160254776477814,,,,,, +28,97849,,,,,,,,,,,,0.0816025659441948,,,,,, +28,97899,,,,,,,,,,,,0.07667708396911621,,,,,, +28,97949,,,,,,,,,,,,0.06558819115161896,,,,,, +28,97999,,,,,,,,,,,,0.07958891242742538,,,,,, +28,98049,,,,,,,,,,,,0.07034404575824738,,,,,, +28,98099,,,,,,,,,,,,0.06074628233909607,,,,,, +28,98149,,,,,,,,,,,,0.05928868427872658,,,,,, +28,98199,,,,,,,,,,,,0.05939377844333649,,,,,, +28,98249,,,,,,,,,,,,0.06851893663406372,,,,,, +28,98299,,,,,,,,,,,,0.058476828038692474,,,,,, +28,98349,,,,,,,,,,,,0.06928668916225433,,,,,, +28,98399,,,,,,,,,,,,0.07586891949176788,,,,,, +28,98449,,,,,,,,,,,,0.07106741517782211,,,,,, +28,98499,,,,,,,,,,,,0.06205860525369644,,,,,, +28,98549,,,,,,,,,,,,0.06915812194347382,,,,,, +28,98599,,,,,,,,,,,,0.06472314149141312,,,,,, +28,98649,,,,,,,,,,,,0.07749798893928528,,,,,, +28,98699,,,,,,,,,,,,0.07551024109125137,,,,,, +28,98749,,,,,,,,,,,,0.06312192231416702,,,,,, +28,98799,,,,,,,,,,,,0.07229384779930115,,,,,, +28,98849,,,,,,,,,,,,0.062310200184583664,,,,,, +28,98899,,,,,,,,,,,,0.08040881156921387,,,,,, +28,98949,,,,,,,,,,,,0.0688077062368393,,,,,, +28,98999,,,,,,,,,,,,0.07550552487373352,,,,,, +28,99049,,,,,,,,,,,,0.06907174736261368,,,,,, +28,99099,,,,,,,,,,,,0.07731907814741135,,,,,, +28,99149,,,,,,,,,,,,0.0622825026512146,,,,,, +28,99199,,,,,,,,,,,,0.06547485291957855,,,,,, +28,99249,,,,,,,,,,,,0.0639849603176117,,,,,, +28,99299,,,,,,,,,,,,0.07400019466876984,,,,,, +28,99349,,,,,,,,,,,,0.0642906129360199,,,,,, +28,99399,,,,,,,,,,,,0.05839899182319641,,,,,, +28,99449,,,,,,,,,,,,0.06104585528373718,,,,,, +28,99499,,,,,,,,,,,,0.06896380335092545,,,,,, +28,99549,,,,,,,,,,,,0.05838865041732788,,,,,, +28,99599,,,,,,,,,,,,0.07487715780735016,,,,,, +28,99649,,,,,,,,,,,,0.07198770344257355,,,,,, +28,99699,,,,,,,,,,,,0.060267046093940735,,,,,, +28,99749,,,,,,,,,,,,0.08492916822433472,,,,,, +28,99799,,,,,,,,,,,,0.0768793523311615,,,,,, +28,99817,,,,,,,,,,,,,0.22675856947898865,0.07455401122570038,0.37970080971717834,0.10284143686294556,0.37903425097465515,0.07455401122570038 +28,99817,,,,,,,0.22240184247493744,0.0694311186671257,0.40076255798339844,0.16060936450958252,0.37926772236824036,,,,,,, +29,99849,,,,,,,,,,,,0.06899413466453552,,,,,, +29,99899,,,,,,,,,,,,0.06863691657781601,,,,,, +29,99949,,,,,,,,,,,,0.07405193150043488,,,,,, +29,99999,,,,,,,,,,,,0.06037025898694992,,,,,, +29,100049,,,,,,,,,,,,0.06807899475097656,,,,,, +29,100099,,,,,,,,,,,,0.0744677186012268,,,,,, +29,100149,,,,,,,,,,,,0.07025031745433807,,,,,, +29,100199,,,,,,,,,,,,0.07633161544799805,,,,,, +29,100249,,,,,,,,,,,,0.06297869235277176,,,,,, +29,100299,,,,,,,,,,,,0.06723837554454803,,,,,, +29,100349,,,,,,,,,,,,0.06473143398761749,,,,,, +29,100399,,,,,,,,,,,,0.06072739511728287,,,,,, +29,100449,,,,,,,,,,,,0.062098465859889984,,,,,, +29,100499,,,,,,,,,,,,0.06902341544628143,,,,,, +29,100549,,,,,,,,,,,,0.07211382687091827,,,,,, +29,100599,,,,,,,,,,,,0.0685538500547409,,,,,, +29,100649,,,,,,,,,,,,0.08133368194103241,,,,,, +29,100699,,,,,,,,,,,,0.06865163147449493,,,,,, +29,100749,,,,,,,,,,,,0.07079773396253586,,,,,, +29,100799,,,,,,,,,,,,0.07264306396245956,,,,,, +29,100849,,,,,,,,,,,,0.07386759668588638,,,,,, +29,100899,,,,,,,,,,,,0.07178690284490585,,,,,, +29,100949,,,,,,,,,,,,0.08317410200834274,,,,,, +29,100999,,,,,,,,,,,,0.07808515429496765,,,,,, +29,101049,,,,,,,,,,,,0.06561080366373062,,,,,, +29,101099,,,,,,,,,,,,0.06748390197753906,,,,,, +29,101149,,,,,,,,,,,,0.0713929682970047,,,,,, +29,101199,,,,,,,,,,,,0.07540932297706604,,,,,, +29,101249,,,,,,,,,,,,0.07726895809173584,,,,,, +29,101299,,,,,,,,,,,,0.06189243495464325,,,,,, +29,101349,,,,,,,,,,,,0.0734032690525055,,,,,, +29,101399,,,,,,,,,,,,0.06914438307285309,,,,,, +29,101449,,,,,,,,,,,,0.06745655834674835,,,,,, +29,101499,,,,,,,,,,,,0.08035353571176529,,,,,, +29,101549,,,,,,,,,,,,0.07947634905576706,,,,,, +29,101599,,,,,,,,,,,,0.05955292284488678,,,,,, +29,101649,,,,,,,,,,,,0.07146235555410385,,,,,, +29,101699,,,,,,,,,,,,0.08578582108020782,,,,,, +29,101749,,,,,,,,,,,,0.07076038420200348,,,,,, +29,101799,,,,,,,,,,,,0.07883037626743317,,,,,, +29,101849,,,,,,,,,,,,0.0682961493730545,,,,,, +29,101899,,,,,,,,,,,,0.06150868162512779,,,,,, +29,101949,,,,,,,,,,,,0.069473996758461,,,,,, +29,101999,,,,,,,,,,,,0.08136139065027237,,,,,, +29,102049,,,,,,,,,,,,0.07307319343090057,,,,,, +29,102099,,,,,,,,,,,,0.061645567417144775,,,,,, +29,102149,,,,,,,,,,,,0.06768752634525299,,,,,, +29,102199,,,,,,,,,,,,0.07215343415737152,,,,,, +29,102249,,,,,,,,,,,,0.07416079938411713,,,,,, +29,102299,,,,,,,,,,,,0.0707152858376503,,,,,, +29,102349,,,,,,,,,,,,0.08597613871097565,,,,,, +29,102399,,,,,,,,,,,,0.06631530821323395,,,,,, +29,102449,,,,,,,,,,,,0.06971877813339233,,,,,, +29,102499,,,,,,,,,,,,0.06129775941371918,,,,,, +29,102549,,,,,,,,,,,,0.06177432835102081,,,,,, +29,102599,,,,,,,,,,,,0.07138427346944809,,,,,, +29,102649,,,,,,,,,,,,0.06979352235794067,,,,,, +29,102699,,,,,,,,,,,,0.06417710334062576,,,,,, +29,102749,,,,,,,,,,,,0.07292400300502777,,,,,, +29,102799,,,,,,,,,,,,0.06278051435947418,,,,,, +29,102849,,,,,,,,,,,,0.07042505592107773,,,,,, +29,102899,,,,,,,,,,,,0.07392824441194534,,,,,, +29,102949,,,,,,,,,,,,0.06493176519870758,,,,,, +29,102999,,,,,,,,,,,,0.06177235394716263,,,,,, +29,103049,,,,,,,,,,,,0.07447843253612518,,,,,, +29,103099,,,,,,,,,,,,0.07723894715309143,,,,,, +29,103149,,,,,,,,,,,,0.06640664488077164,,,,,, +29,103199,,,,,,,,,,,,0.06343061476945877,,,,,, +29,103249,,,,,,,,,,,,0.06944888830184937,,,,,, +29,103259,,,,,,,,,,,,,0.227812260389328,0.07559438794851303,0.3865971565246582,0.09032183885574341,0.38627129793167114,0.07559438794851303 +29,103259,,,,,,,0.22163161635398865,0.06905500590801239,0.40639376640319824,0.16514748334884644,0.38437792658805847,,,,,,, +30,103299,,,,,,,,,,,,0.07091078162193298,,,,,, +30,103349,,,,,,,,,,,,0.07476877421140671,,,,,, +30,103399,,,,,,,,,,,,0.07961080968379974,,,,,, +30,103449,,,,,,,,,,,,0.06694696843624115,,,,,, +30,103499,,,,,,,,,,,,0.067888543009758,,,,,, +30,103549,,,,,,,,,,,,0.06576904654502869,,,,,, +30,103599,,,,,,,,,,,,0.07245263457298279,,,,,, +30,103649,,,,,,,,,,,,0.06181367114186287,,,,,, +30,103699,,,,,,,,,,,,0.06454925984144211,,,,,, +30,103749,,,,,,,,,,,,0.061460793018341064,,,,,, +30,103799,,,,,,,,,,,,0.07540430128574371,,,,,, +30,103849,,,,,,,,,,,,0.07701101899147034,,,,,, +30,103899,,,,,,,,,,,,0.058475229889154434,,,,,, +30,103949,,,,,,,,,,,,0.07889100909233093,,,,,, +30,103999,,,,,,,,,,,,0.07926036417484283,,,,,, +30,104049,,,,,,,,,,,,0.06750894337892532,,,,,, +30,104099,,,,,,,,,,,,0.07134002447128296,,,,,, +30,104149,,,,,,,,,,,,0.07619316875934601,,,,,, +30,104199,,,,,,,,,,,,0.06337721645832062,,,,,, +30,104249,,,,,,,,,,,,0.06147746741771698,,,,,, +30,104299,,,,,,,,,,,,0.06739541888237,,,,,, +30,104349,,,,,,,,,,,,0.07466346025466919,,,,,, +30,104399,,,,,,,,,,,,0.07345642149448395,,,,,, +30,104449,,,,,,,,,,,,0.0707118809223175,,,,,, +30,104499,,,,,,,,,,,,0.07520326972007751,,,,,, +30,104549,,,,,,,,,,,,0.06540372967720032,,,,,, +30,104599,,,,,,,,,,,,0.06398242712020874,,,,,, +30,104649,,,,,,,,,,,,0.07018481940031052,,,,,, +30,104699,,,,,,,,,,,,0.06737276911735535,,,,,, +30,104749,,,,,,,,,,,,0.07105529308319092,,,,,, +30,104799,,,,,,,,,,,,0.0740400105714798,,,,,, +30,104849,,,,,,,,,,,,0.07376985251903534,,,,,, +30,104899,,,,,,,,,,,,0.0679314061999321,,,,,, +30,104949,,,,,,,,,,,,0.06861989200115204,,,,,, +30,104999,,,,,,,,,,,,0.0716322511434555,,,,,, +30,105049,,,,,,,,,,,,0.07385510951280594,,,,,, +30,105099,,,,,,,,,,,,0.06436136364936829,,,,,, +30,105149,,,,,,,,,,,,0.06412900984287262,,,,,, +30,105199,,,,,,,,,,,,0.06983280181884766,,,,,, +30,105249,,,,,,,,,,,,0.061352405697107315,,,,,, +30,105299,,,,,,,,,,,,0.08102360367774963,,,,,, +30,105349,,,,,,,,,,,,0.06591899693012238,,,,,, +30,105399,,,,,,,,,,,,0.08009454607963562,,,,,, +30,105449,,,,,,,,,,,,0.07923142611980438,,,,,, +30,105499,,,,,,,,,,,,0.06460204720497131,,,,,, +30,105549,,,,,,,,,,,,0.07006488740444183,,,,,, +30,105599,,,,,,,,,,,,0.08154734969139099,,,,,, +30,105649,,,,,,,,,,,,0.06997117400169373,,,,,, +30,105699,,,,,,,,,,,,0.057528235018253326,,,,,, +30,105749,,,,,,,,,,,,0.06742346286773682,,,,,, +30,105799,,,,,,,,,,,,0.08389878273010254,,,,,, +30,105849,,,,,,,,,,,,0.06960898637771606,,,,,, +30,105899,,,,,,,,,,,,0.06841890513896942,,,,,, +30,105949,,,,,,,,,,,,0.06103814020752907,,,,,, +30,105999,,,,,,,,,,,,0.08281023055315018,,,,,, +30,106049,,,,,,,,,,,,0.06229408085346222,,,,,, +30,106099,,,,,,,,,,,,0.06297141313552856,,,,,, +30,106149,,,,,,,,,,,,0.05898534506559372,,,,,, +30,106199,,,,,,,,,,,,0.06265072524547577,,,,,, +30,106249,,,,,,,,,,,,0.06228336691856384,,,,,, +30,106299,,,,,,,,,,,,0.06316384673118591,,,,,, +30,106349,,,,,,,,,,,,0.07378371059894562,,,,,, +30,106399,,,,,,,,,,,,0.07454976439476013,,,,,, +30,106449,,,,,,,,,,,,0.07421652972698212,,,,,, +30,106499,,,,,,,,,,,,0.07829657196998596,,,,,, +30,106549,,,,,,,,,,,,0.0725826770067215,,,,,, +30,106599,,,,,,,,,,,,0.06979773193597794,,,,,, +30,106649,,,,,,,,,,,,0.07156229019165039,,,,,, +30,106699,,,,,,,,,,,,0.0614447146654129,,,,,, +30,106701,,,,,,,,,,,,,0.22520564496517181,0.07292016595602036,0.38942742347717285,0.12250262498855591,0.3871020972728729,0.07292016595602036 +30,106701,,,,,,,0.22141878306865692,0.0689883828163147,0.40738895535469055,0.16595906019210815,0.38577672839164734,,,,,,, +31,106749,,,,,,,,,,,,0.0735902488231659,,,,,, +31,106799,,,,,,,,,,,,0.0634491965174675,,,,,, +31,106849,,,,,,,,,,,,0.05390191450715065,,,,,, +31,106899,,,,,,,,,,,,0.06725835055112839,,,,,, +31,106949,,,,,,,,,,,,0.0572420097887516,,,,,, +31,106999,,,,,,,,,,,,0.06508251279592514,,,,,, +31,107049,,,,,,,,,,,,0.0712176263332367,,,,,, +31,107099,,,,,,,,,,,,0.06912777572870255,,,,,, +31,107149,,,,,,,,,,,,0.06670665740966797,,,,,, +31,107199,,,,,,,,,,,,0.06236308813095093,,,,,, +31,107249,,,,,,,,,,,,0.06962870806455612,,,,,, +31,107299,,,,,,,,,,,,0.07672958821058273,,,,,, +31,107349,,,,,,,,,,,,0.06873679161071777,,,,,, +31,107399,,,,,,,,,,,,0.06223994120955467,,,,,, +31,107449,,,,,,,,,,,,0.06850976496934891,,,,,, +31,107499,,,,,,,,,,,,0.07074445486068726,,,,,, +31,107549,,,,,,,,,,,,0.06146093085408211,,,,,, +31,107599,,,,,,,,,,,,0.07725519686937332,,,,,, +31,107649,,,,,,,,,,,,0.0684618353843689,,,,,, +31,107699,,,,,,,,,,,,0.059239935129880905,,,,,, +31,107749,,,,,,,,,,,,0.06953505426645279,,,,,, +31,107799,,,,,,,,,,,,0.06204845756292343,,,,,, +31,107849,,,,,,,,,,,,0.07118136435747147,,,,,, +31,107899,,,,,,,,,,,,0.07139797508716583,,,,,, +31,107949,,,,,,,,,,,,0.06427019834518433,,,,,, +31,107999,,,,,,,,,,,,0.06880942732095718,,,,,, +31,108049,,,,,,,,,,,,0.06618049740791321,,,,,, +31,108099,,,,,,,,,,,,0.0570862740278244,,,,,, +31,108149,,,,,,,,,,,,0.06388354301452637,,,,,, +31,108199,,,,,,,,,,,,0.0724872499704361,,,,,, +31,108249,,,,,,,,,,,,0.06302770972251892,,,,,, +31,108299,,,,,,,,,,,,0.06698846817016602,,,,,, +31,108349,,,,,,,,,,,,0.0558457188308239,,,,,, +31,108399,,,,,,,,,,,,0.06835481524467468,,,,,, +31,108449,,,,,,,,,,,,0.07018933445215225,,,,,, +31,108499,,,,,,,,,,,,0.06271779537200928,,,,,, +31,108549,,,,,,,,,,,,0.06409334391355515,,,,,, +31,108599,,,,,,,,,,,,0.06701598316431046,,,,,, +31,108649,,,,,,,,,,,,0.07561521232128143,,,,,, +31,108699,,,,,,,,,,,,0.06359095871448517,,,,,, +31,108749,,,,,,,,,,,,0.05483546108007431,,,,,, +31,108799,,,,,,,,,,,,0.06940566003322601,,,,,, +31,108849,,,,,,,,,,,,0.06529848277568817,,,,,, +31,108899,,,,,,,,,,,,0.06596117466688156,,,,,, +31,108949,,,,,,,,,,,,0.07169315963983536,,,,,, +31,108999,,,,,,,,,,,,0.06831271946430206,,,,,, +31,109049,,,,,,,,,,,,0.08418895304203033,,,,,, +31,109099,,,,,,,,,,,,0.07541117072105408,,,,,, +31,109149,,,,,,,,,,,,0.06622783839702606,,,,,, +31,109199,,,,,,,,,,,,0.07023176550865173,,,,,, +31,109249,,,,,,,,,,,,0.07962896674871445,,,,,, +31,109299,,,,,,,,,,,,0.06861475855112076,,,,,, +31,109349,,,,,,,,,,,,0.06367893517017365,,,,,, +31,109399,,,,,,,,,,,,0.06071149557828903,,,,,, +31,109449,,,,,,,,,,,,0.0780048742890358,,,,,, +31,109499,,,,,,,,,,,,0.0590374730527401,,,,,, +31,109549,,,,,,,,,,,,0.060015175491571426,,,,,, +31,109599,,,,,,,,,,,,0.0721336081624031,,,,,, +31,109649,,,,,,,,,,,,0.07056748867034912,,,,,, +31,109699,,,,,,,,,,,,0.06679939478635788,,,,,, +31,109749,,,,,,,,,,,,0.07010363042354584,,,,,, +31,109799,,,,,,,,,,,,0.07319123297929764,,,,,, +31,109849,,,,,,,,,,,,0.060075968503952026,,,,,, +31,109899,,,,,,,,,,,,0.056777529418468475,,,,,, +31,109949,,,,,,,,,,,,0.06686694920063019,,,,,, +31,109999,,,,,,,,,,,,0.06560049951076508,,,,,, +31,110049,,,,,,,,,,,,0.0681828111410141,,,,,, +31,110099,,,,,,,,,,,,0.07332664728164673,,,,,, +31,110143,,,,,,,,,,,,,0.22721025347709656,0.0747731626033783,0.38551756739616394,0.10020428895950317,0.38343244791030884,0.0747731626033783 +31,110143,,,,,,,0.22107794880867004,0.06876751035451889,0.41064387559890747,0.16862499713897705,0.38807594776153564,,,,,,, +32,110149,,,,,,,,,,,,0.07191114127635956,,,,,, +32,110199,,,,,,,,,,,,0.06192554906010628,,,,,, +32,110249,,,,,,,,,,,,0.0693642720580101,,,,,, +32,110299,,,,,,,,,,,,0.07367779314517975,,,,,, +32,110349,,,,,,,,,,,,0.08025577664375305,,,,,, +32,110399,,,,,,,,,,,,0.06944949179887772,,,,,, +32,110449,,,,,,,,,,,,0.06806603074073792,,,,,, +32,110499,,,,,,,,,,,,0.07976265251636505,,,,,, +32,110549,,,,,,,,,,,,0.06908833980560303,,,,,, +32,110599,,,,,,,,,,,,0.0725608766078949,,,,,, +32,110649,,,,,,,,,,,,0.07620920985937119,,,,,, +32,110699,,,,,,,,,,,,0.07798351347446442,,,,,, +32,110749,,,,,,,,,,,,0.07109294086694717,,,,,, +32,110799,,,,,,,,,,,,0.07434231042861938,,,,,, +32,110849,,,,,,,,,,,,0.0662689059972763,,,,,, +32,110899,,,,,,,,,,,,0.06903451681137085,,,,,, +32,110949,,,,,,,,,,,,0.07724177837371826,,,,,, +32,110999,,,,,,,,,,,,0.07560636103153229,,,,,, +32,111049,,,,,,,,,,,,0.06506939232349396,,,,,, +32,111099,,,,,,,,,,,,0.0620543509721756,,,,,, +32,111149,,,,,,,,,,,,0.07017326354980469,,,,,, +32,111199,,,,,,,,,,,,0.07998239994049072,,,,,, +32,111249,,,,,,,,,,,,0.07072237879037857,,,,,, +32,111299,,,,,,,,,,,,0.0711168497800827,,,,,, +32,111349,,,,,,,,,,,,0.06465526670217514,,,,,, +32,111399,,,,,,,,,,,,0.059438034892082214,,,,,, +32,111449,,,,,,,,,,,,0.06935015320777893,,,,,, +32,111499,,,,,,,,,,,,0.07544255256652832,,,,,, +32,111549,,,,,,,,,,,,0.07031847536563873,,,,,, +32,111599,,,,,,,,,,,,0.06588234752416611,,,,,, +32,111649,,,,,,,,,,,,0.0701151117682457,,,,,, +32,111699,,,,,,,,,,,,0.06905318051576614,,,,,, +32,111749,,,,,,,,,,,,0.06611400842666626,,,,,, +32,111799,,,,,,,,,,,,0.060970522463321686,,,,,, +32,111849,,,,,,,,,,,,0.06172103434801102,,,,,, +32,111899,,,,,,,,,,,,0.0812579020857811,,,,,, +32,111949,,,,,,,,,,,,0.07385202497243881,,,,,, +32,111999,,,,,,,,,,,,0.0722784698009491,,,,,, +32,112049,,,,,,,,,,,,0.06661252677440643,,,,,, +32,112099,,,,,,,,,,,,0.06564036011695862,,,,,, +32,112149,,,,,,,,,,,,0.07596887648105621,,,,,, +32,112199,,,,,,,,,,,,0.07696012407541275,,,,,, +32,112249,,,,,,,,,,,,0.06584446132183075,,,,,, +32,112299,,,,,,,,,,,,0.06772171705961227,,,,,, +32,112349,,,,,,,,,,,,0.0698605477809906,,,,,, +32,112399,,,,,,,,,,,,0.08203096687793732,,,,,, +32,112449,,,,,,,,,,,,0.06302224099636078,,,,,, +32,112499,,,,,,,,,,,,0.07004592567682266,,,,,, +32,112549,,,,,,,,,,,,0.07105933129787445,,,,,, +32,112599,,,,,,,,,,,,0.06533105671405792,,,,,, +32,112649,,,,,,,,,,,,0.06049162894487381,,,,,, +32,112699,,,,,,,,,,,,0.07763516902923584,,,,,, +32,112749,,,,,,,,,,,,0.07308796048164368,,,,,, +32,112799,,,,,,,,,,,,0.08100514113903046,,,,,, +32,112849,,,,,,,,,,,,0.06955357640981674,,,,,, +32,112899,,,,,,,,,,,,0.06425077468156815,,,,,, +32,112949,,,,,,,,,,,,0.08164706826210022,,,,,, +32,112999,,,,,,,,,,,,0.07284849882125854,,,,,, +32,113049,,,,,,,,,,,,0.07236388325691223,,,,,, +32,113099,,,,,,,,,,,,0.06248265504837036,,,,,, +32,113149,,,,,,,,,,,,0.06222216784954071,,,,,, +32,113199,,,,,,,,,,,,0.0719759538769722,,,,,, +32,113249,,,,,,,,,,,,0.0613514669239521,,,,,, +32,113299,,,,,,,,,,,,0.07128763943910599,,,,,, +32,113349,,,,,,,,,,,,0.06999499350786209,,,,,, +32,113399,,,,,,,,,,,,0.0553445890545845,,,,,, +32,113449,,,,,,,,,,,,0.07016311585903168,,,,,, +32,113499,,,,,,,,,,,,0.08884633332490921,,,,,, +32,113549,,,,,,,,,,,,0.06343331933021545,,,,,, +32,113585,,,,,,,,,,,,,0.22659243643283844,0.07460806518793106,0.392798513174057,0.10219091176986694,0.39001646637916565,0.07460806518793106 +32,113585,,,,,,,0.22091899812221527,0.06867972761392593,0.4119340777397156,0.16968804597854614,0.3894362449645996,,,,,,, +33,113599,,,,,,,,,,,,0.056228235363960266,,,,,, +33,113649,,,,,,,,,,,,0.06584468483924866,,,,,, +33,113699,,,,,,,,,,,,0.06792694330215454,,,,,, +33,113749,,,,,,,,,,,,0.07608628273010254,,,,,, +33,113799,,,,,,,,,,,,0.06703703105449677,,,,,, +33,113849,,,,,,,,,,,,0.06717011332511902,,,,,, +33,113899,,,,,,,,,,,,0.06299464404582977,,,,,, +33,113949,,,,,,,,,,,,0.06074275076389313,,,,,, +33,113999,,,,,,,,,,,,0.07378216087818146,,,,,, +33,114049,,,,,,,,,,,,0.0667470246553421,,,,,, +33,114099,,,,,,,,,,,,0.07872096449136734,,,,,, +33,114149,,,,,,,,,,,,0.06367150694131851,,,,,, +33,114199,,,,,,,,,,,,0.05989488586783409,,,,,, +33,114249,,,,,,,,,,,,0.07075300067663193,,,,,, +33,114299,,,,,,,,,,,,0.06474129110574722,,,,,, +33,114349,,,,,,,,,,,,0.07522876560688019,,,,,, +33,114399,,,,,,,,,,,,0.0786537230014801,,,,,, +33,114449,,,,,,,,,,,,0.058068953454494476,,,,,, +33,114499,,,,,,,,,,,,0.06436194479465485,,,,,, +33,114549,,,,,,,,,,,,0.08051388710737228,,,,,, +33,114599,,,,,,,,,,,,0.06484153121709824,,,,,, +33,114649,,,,,,,,,,,,0.05747276917099953,,,,,, +33,114699,,,,,,,,,,,,0.07910886406898499,,,,,, +33,114749,,,,,,,,,,,,0.07768043875694275,,,,,, +33,114799,,,,,,,,,,,,0.06841963529586792,,,,,, +33,114849,,,,,,,,,,,,0.06344474852085114,,,,,, +33,114899,,,,,,,,,,,,0.06777001172304153,,,,,, +33,114949,,,,,,,,,,,,0.06345048546791077,,,,,, +33,114999,,,,,,,,,,,,0.08730336278676987,,,,,, +33,115049,,,,,,,,,,,,0.06839628517627716,,,,,, +33,115099,,,,,,,,,,,,0.06489783525466919,,,,,, +33,115149,,,,,,,,,,,,0.07734454423189163,,,,,, +33,115199,,,,,,,,,,,,0.07633811235427856,,,,,, +33,115249,,,,,,,,,,,,0.06911885738372803,,,,,, +33,115299,,,,,,,,,,,,0.06871461868286133,,,,,, +33,115349,,,,,,,,,,,,0.08571876585483551,,,,,, +33,115399,,,,,,,,,,,,0.07051359117031097,,,,,, +33,115449,,,,,,,,,,,,0.07115451246500015,,,,,, +33,115499,,,,,,,,,,,,0.07576154172420502,,,,,, +33,115549,,,,,,,,,,,,0.07310020923614502,,,,,, +33,115599,,,,,,,,,,,,0.0651078075170517,,,,,, +33,115649,,,,,,,,,,,,0.06676611304283142,,,,,, +33,115699,,,,,,,,,,,,0.05903232842683792,,,,,, +33,115749,,,,,,,,,,,,0.06901747733354568,,,,,, +33,115799,,,,,,,,,,,,0.07276490330696106,,,,,, +33,115849,,,,,,,,,,,,0.07643371820449829,,,,,, +33,115899,,,,,,,,,,,,0.07184862345457077,,,,,, +33,115949,,,,,,,,,,,,0.05918706953525543,,,,,, +33,115999,,,,,,,,,,,,0.05896498262882233,,,,,, +33,116049,,,,,,,,,,,,0.08679036796092987,,,,,, +33,116099,,,,,,,,,,,,0.07520972937345505,,,,,, +33,116149,,,,,,,,,,,,0.06853141635656357,,,,,, +33,116199,,,,,,,,,,,,0.06464772671461105,,,,,, +33,116249,,,,,,,,,,,,0.05716058984398842,,,,,, +33,116299,,,,,,,,,,,,0.07352583855390549,,,,,, +33,116349,,,,,,,,,,,,0.07201234996318817,,,,,, +33,116399,,,,,,,,,,,,0.05293668434023857,,,,,, +33,116449,,,,,,,,,,,,0.07567897439002991,,,,,, +33,116499,,,,,,,,,,,,0.07442165911197662,,,,,, +33,116549,,,,,,,,,,,,0.057098764926195145,,,,,, +33,116599,,,,,,,,,,,,0.07072266191244125,,,,,, +33,116649,,,,,,,,,,,,0.06489007920026779,,,,,, +33,116699,,,,,,,,,,,,0.07767968624830246,,,,,, +33,116749,,,,,,,,,,,,0.08113496005535126,,,,,, +33,116799,,,,,,,,,,,,0.0644792690873146,,,,,, +33,116849,,,,,,,,,,,,0.06356097757816315,,,,,, +33,116899,,,,,,,,,,,,0.07333455979824066,,,,,, +33,116949,,,,,,,,,,,,0.061620745807886124,,,,,, +33,116999,,,,,,,,,,,,0.06124649569392204,,,,,, +33,117027,,,,,,,,,,,,,0.22741727530956268,0.07601697742938995,0.38808929920196533,0.0852365493774414,0.3863731622695923,0.07601697742938995 +33,117027,,,,,,,0.22073647379875183,0.06860913336277008,0.4129708707332611,0.1705418825149536,0.3906027376651764,,,,,,, +34,117049,,,,,,,,,,,,0.0557977557182312,,,,,, +34,117099,,,,,,,,,,,,0.06039826199412346,,,,,, +34,117149,,,,,,,,,,,,0.05829867720603943,,,,,, +34,117199,,,,,,,,,,,,0.07130615413188934,,,,,, +34,117249,,,,,,,,,,,,0.06606917083263397,,,,,, +34,117299,,,,,,,,,,,,0.07426571846008301,,,,,, +34,117349,,,,,,,,,,,,0.06127120554447174,,,,,, +34,117399,,,,,,,,,,,,0.07437826693058014,,,,,, +34,117449,,,,,,,,,,,,0.07218712568283081,,,,,, +34,117499,,,,,,,,,,,,0.06487740576267242,,,,,, +34,117549,,,,,,,,,,,,0.078956738114357,,,,,, +34,117599,,,,,,,,,,,,0.06996729969978333,,,,,, +34,117649,,,,,,,,,,,,0.06431703269481659,,,,,, +34,117699,,,,,,,,,,,,0.0644206553697586,,,,,, +34,117749,,,,,,,,,,,,0.06642566621303558,,,,,, +34,117799,,,,,,,,,,,,0.0695457011461258,,,,,, +34,117849,,,,,,,,,,,,0.06645455956459045,,,,,, +34,117899,,,,,,,,,,,,0.06183549016714096,,,,,, +34,117949,,,,,,,,,,,,0.07428248226642609,,,,,, +34,117999,,,,,,,,,,,,0.0684506967663765,,,,,, +34,118049,,,,,,,,,,,,0.06579463928937912,,,,,, +34,118099,,,,,,,,,,,,0.08002462238073349,,,,,, +34,118149,,,,,,,,,,,,0.07811136543750763,,,,,, +34,118199,,,,,,,,,,,,0.06286176294088364,,,,,, +34,118249,,,,,,,,,,,,0.06960146129131317,,,,,, +34,118299,,,,,,,,,,,,0.0649840235710144,,,,,, +34,118349,,,,,,,,,,,,0.0733528733253479,,,,,, +34,118399,,,,,,,,,,,,0.07408582419157028,,,,,, +34,118449,,,,,,,,,,,,0.06895096600055695,,,,,, +34,118499,,,,,,,,,,,,0.07315225899219513,,,,,, +34,118549,,,,,,,,,,,,0.06706490367650986,,,,,, +34,118599,,,,,,,,,,,,0.0662972703576088,,,,,, +34,118649,,,,,,,,,,,,0.058562926948070526,,,,,, +34,118699,,,,,,,,,,,,0.08204860240221024,,,,,, +34,118749,,,,,,,,,,,,0.07392247021198273,,,,,, +34,118799,,,,,,,,,,,,0.08470063656568527,,,,,, +34,118849,,,,,,,,,,,,0.06766032427549362,,,,,, +34,118899,,,,,,,,,,,,0.06525774300098419,,,,,, +34,118949,,,,,,,,,,,,0.06502825021743774,,,,,, +34,118999,,,,,,,,,,,,0.07282650470733643,,,,,, +34,119049,,,,,,,,,,,,0.06986154615879059,,,,,, +34,119099,,,,,,,,,,,,0.06813912093639374,,,,,, +34,119149,,,,,,,,,,,,0.07385366410017014,,,,,, +34,119199,,,,,,,,,,,,0.06395240128040314,,,,,, +34,119249,,,,,,,,,,,,0.06281730532646179,,,,,, +34,119299,,,,,,,,,,,,0.07154513895511627,,,,,, +34,119349,,,,,,,,,,,,0.06569159030914307,,,,,, +34,119399,,,,,,,,,,,,0.0619034580886364,,,,,, +34,119449,,,,,,,,,,,,0.06752251088619232,,,,,, +34,119499,,,,,,,,,,,,0.06346986442804337,,,,,, +34,119549,,,,,,,,,,,,0.06765767186880112,,,,,, +34,119599,,,,,,,,,,,,0.07573080062866211,,,,,, +34,119649,,,,,,,,,,,,0.06990167498588562,,,,,, +34,119699,,,,,,,,,,,,0.06035090237855911,,,,,, +34,119749,,,,,,,,,,,,0.0685565173625946,,,,,, +34,119799,,,,,,,,,,,,0.06855152547359467,,,,,, +34,119849,,,,,,,,,,,,0.07671424001455307,,,,,, +34,119899,,,,,,,,,,,,0.06275337189435959,,,,,, +34,119949,,,,,,,,,,,,0.061751462519168854,,,,,, +34,119999,,,,,,,,,,,,0.08201341331005096,,,,,, +34,120049,,,,,,,,,,,,0.062066733837127686,,,,,, +34,120099,,,,,,,,,,,,0.07031922042369843,,,,,, +34,120149,,,,,,,,,,,,0.07072924077510834,,,,,, +34,120199,,,,,,,,,,,,0.059470560401678085,,,,,, +34,120249,,,,,,,,,,,,0.0714489296078682,,,,,, +34,120299,,,,,,,,,,,,0.0709003359079361,,,,,, +34,120349,,,,,,,,,,,,0.06520561128854752,,,,,, +34,120399,,,,,,,,,,,,0.06328149139881134,,,,,, +34,120449,,,,,,,,,,,,0.07218967378139496,,,,,, +34,120469,,,,,,,,,,,,,0.2280137538909912,0.07705038785934448,0.39625346660614014,0.07280087471008301,0.39453965425491333,0.07705038785934448 +34,120469,,,,,,,0.22051990032196045,0.06849478930234909,0.4146392345428467,0.17192262411117554,0.39196276664733887,,,,,,, +35,120499,,,,,,,,,,,,0.05979127064347267,,,,,, +35,120549,,,,,,,,,,,,0.066349096596241,,,,,, +35,120599,,,,,,,,,,,,0.06160513684153557,,,,,, +35,120649,,,,,,,,,,,,0.06938506662845612,,,,,, +35,120699,,,,,,,,,,,,0.08377732336521149,,,,,, +35,120749,,,,,,,,,,,,0.06732639670372009,,,,,, +35,120799,,,,,,,,,,,,0.07593530416488647,,,,,, +35,120849,,,,,,,,,,,,0.05879628658294678,,,,,, +35,120899,,,,,,,,,,,,0.07418820261955261,,,,,, +35,120949,,,,,,,,,,,,0.06370264291763306,,,,,, +35,120999,,,,,,,,,,,,0.05321355536580086,,,,,, +35,121049,,,,,,,,,,,,0.07088497281074524,,,,,, +35,121099,,,,,,,,,,,,0.06650352478027344,,,,,, +35,121149,,,,,,,,,,,,0.06600718945264816,,,,,, +35,121199,,,,,,,,,,,,0.06221182644367218,,,,,, +35,121249,,,,,,,,,,,,0.08321350067853928,,,,,, +35,121299,,,,,,,,,,,,0.06734583526849747,,,,,, +35,121349,,,,,,,,,,,,0.07017096877098083,,,,,, +35,121399,,,,,,,,,,,,0.07201094925403595,,,,,, +35,121449,,,,,,,,,,,,0.06226220354437828,,,,,, +35,121499,,,,,,,,,,,,0.06988155841827393,,,,,, +35,121549,,,,,,,,,,,,0.05800925940275192,,,,,, +35,121599,,,,,,,,,,,,0.07504238188266754,,,,,, +35,121649,,,,,,,,,,,,0.07453617453575134,,,,,, +35,121699,,,,,,,,,,,,0.07270824164152145,,,,,, +35,121749,,,,,,,,,,,,0.07251954078674316,,,,,, +35,121799,,,,,,,,,,,,0.07141773402690887,,,,,, +35,121849,,,,,,,,,,,,0.06235595792531967,,,,,, +35,121899,,,,,,,,,,,,0.07134053856134415,,,,,, +35,121949,,,,,,,,,,,,0.06992970407009125,,,,,, +35,121999,,,,,,,,,,,,0.0633576363325119,,,,,, +35,122049,,,,,,,,,,,,0.07106278836727142,,,,,, +35,122099,,,,,,,,,,,,0.05939604341983795,,,,,, +35,122149,,,,,,,,,,,,0.07528495788574219,,,,,, +35,122199,,,,,,,,,,,,0.07194657623767853,,,,,, +35,122249,,,,,,,,,,,,0.06669627130031586,,,,,, +35,122299,,,,,,,,,,,,0.08073145151138306,,,,,, +35,122349,,,,,,,,,,,,0.05836541950702667,,,,,, +35,122399,,,,,,,,,,,,0.06822068989276886,,,,,, +35,122449,,,,,,,,,,,,0.07048223167657852,,,,,, +35,122499,,,,,,,,,,,,0.07754283398389816,,,,,, +35,122549,,,,,,,,,,,,0.059681955724954605,,,,,, +35,122599,,,,,,,,,,,,0.06490037590265274,,,,,, +35,122649,,,,,,,,,,,,0.05369332432746887,,,,,, +35,122699,,,,,,,,,,,,0.056090135127305984,,,,,, +35,122749,,,,,,,,,,,,0.07318300008773804,,,,,, +35,122799,,,,,,,,,,,,0.07026661932468414,,,,,, +35,122849,,,,,,,,,,,,0.0703161209821701,,,,,, +35,122899,,,,,,,,,,,,0.06682278215885162,,,,,, +35,122949,,,,,,,,,,,,0.06505884975194931,,,,,, +35,122999,,,,,,,,,,,,0.08362977206707001,,,,,, +35,123049,,,,,,,,,,,,0.07045625150203705,,,,,, +35,123099,,,,,,,,,,,,0.07214862108230591,,,,,, +35,123149,,,,,,,,,,,,0.07497737556695938,,,,,, +35,123199,,,,,,,,,,,,0.056464023888111115,,,,,, +35,123249,,,,,,,,,,,,0.08745064586400986,,,,,, +35,123299,,,,,,,,,,,,0.06757424026727676,,,,,, +35,123349,,,,,,,,,,,,0.06196115165948868,,,,,, +35,123399,,,,,,,,,,,,0.07475355267524719,,,,,, +35,123449,,,,,,,,,,,,0.07404958456754684,,,,,, +35,123499,,,,,,,,,,,,0.07511080056428909,,,,,, +35,123549,,,,,,,,,,,,0.06513610482215881,,,,,, +35,123599,,,,,,,,,,,,0.06910640001296997,,,,,, +35,123649,,,,,,,,,,,,0.0735272690653801,,,,,, +35,123699,,,,,,,,,,,,0.08089892566204071,,,,,, +35,123749,,,,,,,,,,,,0.06774979084730148,,,,,, +35,123799,,,,,,,,,,,,0.08091980963945389,,,,,, +35,123849,,,,,,,,,,,,0.06668996810913086,,,,,, +35,123899,,,,,,,,,,,,0.07214376330375671,,,,,, +35,123911,,,,,,,,,,,,,0.2264886498451233,0.07443004846572876,0.3842448890209198,0.10433316230773926,0.38130033016204834,0.07443004846572876 +35,123911,,,,,,,0.21999722719192505,0.06822391599416733,0.4185676872730255,0.17518693208694458,0.3955886662006378,,,,,,, +36,123949,,,,,,,,,,,,0.06993596255779266,,,,,, +36,123999,,,,,,,,,,,,0.07051101326942444,,,,,, +36,124049,,,,,,,,,,,,0.06531979143619537,,,,,, +36,124099,,,,,,,,,,,,0.057110495865345,,,,,, +36,124149,,,,,,,,,,,,0.06489779055118561,,,,,, +36,124199,,,,,,,,,,,,0.057496920228004456,,,,,, +36,124249,,,,,,,,,,,,0.06808748096227646,,,,,, +36,124299,,,,,,,,,,,,0.06485152989625931,,,,,, +36,124349,,,,,,,,,,,,0.06818915158510208,,,,,, +36,124399,,,,,,,,,,,,0.08096617460250854,,,,,, +36,124449,,,,,,,,,,,,0.06616178154945374,,,,,, +36,124499,,,,,,,,,,,,0.0666966438293457,,,,,, +36,124549,,,,,,,,,,,,0.068105049431324,,,,,, +36,124599,,,,,,,,,,,,0.0658164769411087,,,,,, +36,124649,,,,,,,,,,,,0.08117803931236267,,,,,, +36,124699,,,,,,,,,,,,0.06489112228155136,,,,,, +36,124749,,,,,,,,,,,,0.06348969042301178,,,,,, +36,124799,,,,,,,,,,,,0.06660180538892746,,,,,, +36,124849,,,,,,,,,,,,0.06333166360855103,,,,,, +36,124899,,,,,,,,,,,,0.07044325768947601,,,,,, +36,124949,,,,,,,,,,,,0.07730159163475037,,,,,, +36,124999,,,,,,,,,,,,0.05798564478754997,,,,,, +36,125049,,,,,,,,,,,,0.05654357373714447,,,,,, +36,125099,,,,,,,,,,,,0.07324041426181793,,,,,, +36,125149,,,,,,,,,,,,0.07774524390697479,,,,,, +36,125199,,,,,,,,,,,,0.08322863280773163,,,,,, +36,125249,,,,,,,,,,,,0.06202727556228638,,,,,, +36,125299,,,,,,,,,,,,0.0737815573811531,,,,,, +36,125349,,,,,,,,,,,,0.07032907009124756,,,,,, +36,125399,,,,,,,,,,,,0.06437450647354126,,,,,, +36,125449,,,,,,,,,,,,0.07140280306339264,,,,,, +36,125499,,,,,,,,,,,,0.07010170072317123,,,,,, +36,125549,,,,,,,,,,,,0.06712591648101807,,,,,, +36,125599,,,,,,,,,,,,0.06977453082799911,,,,,, +36,125649,,,,,,,,,,,,0.06966720521450043,,,,,, +36,125699,,,,,,,,,,,,0.05436597764492035,,,,,, +36,125749,,,,,,,,,,,,0.07175782322883606,,,,,, +36,125799,,,,,,,,,,,,0.06793861091136932,,,,,, +36,125849,,,,,,,,,,,,0.07575899362564087,,,,,, +36,125899,,,,,,,,,,,,0.06766629219055176,,,,,, +36,125949,,,,,,,,,,,,0.07356331497430801,,,,,, +36,125999,,,,,,,,,,,,0.06807993352413177,,,,,, +36,126049,,,,,,,,,,,,0.07008561491966248,,,,,, +36,126099,,,,,,,,,,,,0.06652327626943588,,,,,, +36,126149,,,,,,,,,,,,0.06829845905303955,,,,,, +36,126199,,,,,,,,,,,,0.07158292829990387,,,,,, +36,126249,,,,,,,,,,,,0.06843295693397522,,,,,, +36,126299,,,,,,,,,,,,0.0630364865064621,,,,,, +36,126349,,,,,,,,,,,,0.052778154611587524,,,,,, +36,126399,,,,,,,,,,,,0.06653543561697006,,,,,, +36,126449,,,,,,,,,,,,0.06264486908912659,,,,,, +36,126499,,,,,,,,,,,,0.062355656176805496,,,,,, +36,126549,,,,,,,,,,,,0.07115866988897324,,,,,, +36,126599,,,,,,,,,,,,0.058568283915519714,,,,,, +36,126649,,,,,,,,,,,,0.05919209122657776,,,,,, +36,126699,,,,,,,,,,,,0.0680045336484909,,,,,, +36,126749,,,,,,,,,,,,0.07544583827257156,,,,,, +36,126799,,,,,,,,,,,,0.05973554402589798,,,,,, +36,126849,,,,,,,,,,,,0.06217483431100845,,,,,, +36,126899,,,,,,,,,,,,0.061067868024110794,,,,,, +36,126949,,,,,,,,,,,,0.06902205944061279,,,,,, +36,126999,,,,,,,,,,,,0.0644141361117363,,,,,, +36,127049,,,,,,,,,,,,0.0706377774477005,,,,,, +36,127099,,,,,,,,,,,,0.0731518417596817,,,,,, +36,127149,,,,,,,,,,,,0.06631525605916977,,,,,, +36,127199,,,,,,,,,,,,0.06859041750431061,,,,,, +36,127249,,,,,,,,,,,,0.0471038818359375,,,,,, +36,127299,,,,,,,,,,,,0.06943195313215256,,,,,, +36,127349,,,,,,,,,,,,0.07595814764499664,,,,,, +36,127353,,,,,,,,,,,,,0.22708463668823242,0.07580103725194931,0.3914893567562103,0.08783513307571411,0.3884626626968384,0.07580103725194931 +36,127353,,,,,,,0.21979542076587677,0.06812458485364914,0.419997900724411,0.17640602588653564,0.3968484699726105,,,,,,, +37,127399,,,,,,,,,,,,0.06472406536340714,,,,,, +37,127449,,,,,,,,,,,,0.07998853921890259,,,,,, +37,127499,,,,,,,,,,,,0.06771862506866455,,,,,, +37,127549,,,,,,,,,,,,0.06359706819057465,,,,,, +37,127599,,,,,,,,,,,,0.06650717556476593,,,,,, +37,127649,,,,,,,,,,,,0.06966179609298706,,,,,, +37,127699,,,,,,,,,,,,0.06946346908807755,,,,,, +37,127749,,,,,,,,,,,,0.06373029947280884,,,,,, +37,127799,,,,,,,,,,,,0.06224450469017029,,,,,, +37,127849,,,,,,,,,,,,0.05096079409122467,,,,,, +37,127899,,,,,,,,,,,,0.06814723461866379,,,,,, +37,127949,,,,,,,,,,,,0.07741699367761612,,,,,, +37,127999,,,,,,,,,,,,0.05804964154958725,,,,,, +37,128049,,,,,,,,,,,,0.06404367834329605,,,,,, +37,128099,,,,,,,,,,,,0.061782848089933395,,,,,, +37,128149,,,,,,,,,,,,0.06554606556892395,,,,,, +37,128199,,,,,,,,,,,,0.06893022358417511,,,,,, +37,128249,,,,,,,,,,,,0.07085870206356049,,,,,, +37,128299,,,,,,,,,,,,0.07508610934019089,,,,,, +37,128349,,,,,,,,,,,,0.06095235049724579,,,,,, +37,128399,,,,,,,,,,,,0.0675390213727951,,,,,, +37,128449,,,,,,,,,,,,0.06844110786914825,,,,,, +37,128499,,,,,,,,,,,,0.06909114122390747,,,,,, +37,128549,,,,,,,,,,,,0.06959302723407745,,,,,, +37,128599,,,,,,,,,,,,0.06821592152118683,,,,,, +37,128649,,,,,,,,,,,,0.05847712606191635,,,,,, +37,128699,,,,,,,,,,,,0.07207731902599335,,,,,, +37,128749,,,,,,,,,,,,0.07292487472295761,,,,,, +37,128799,,,,,,,,,,,,0.066447913646698,,,,,, +37,128849,,,,,,,,,,,,0.07664565742015839,,,,,, +37,128899,,,,,,,,,,,,0.057519350200891495,,,,,, +37,128949,,,,,,,,,,,,0.06970760226249695,,,,,, +37,128999,,,,,,,,,,,,0.06998714059591293,,,,,, +37,129049,,,,,,,,,,,,0.07827621698379517,,,,,, +37,129099,,,,,,,,,,,,0.0765320286154747,,,,,, +37,129149,,,,,,,,,,,,0.06607508659362793,,,,,, +37,129199,,,,,,,,,,,,0.05930331349372864,,,,,, +37,129249,,,,,,,,,,,,0.06534775346517563,,,,,, +37,129299,,,,,,,,,,,,0.0777779072523117,,,,,, +37,129349,,,,,,,,,,,,0.06551285088062286,,,,,, +37,129399,,,,,,,,,,,,0.06167103350162506,,,,,, +37,129449,,,,,,,,,,,,0.06423644721508026,,,,,, +37,129499,,,,,,,,,,,,0.06315302848815918,,,,,, +37,129549,,,,,,,,,,,,0.06741383671760559,,,,,, +37,129599,,,,,,,,,,,,0.07054741680622101,,,,,, +37,129649,,,,,,,,,,,,0.05972163379192352,,,,,, +37,129699,,,,,,,,,,,,0.0762307345867157,,,,,, +37,129749,,,,,,,,,,,,0.0654451996088028,,,,,, +37,129799,,,,,,,,,,,,0.07523061335086823,,,,,, +37,129849,,,,,,,,,,,,0.059472374618053436,,,,,, +37,129899,,,,,,,,,,,,0.06929273903369904,,,,,, +37,129949,,,,,,,,,,,,0.07460082322359085,,,,,, +37,129999,,,,,,,,,,,,0.07533291727304459,,,,,, +37,130049,,,,,,,,,,,,0.06721426546573639,,,,,, +37,130099,,,,,,,,,,,,0.058604344725608826,,,,,, +37,130149,,,,,,,,,,,,0.06920530647039413,,,,,, +37,130199,,,,,,,,,,,,0.05760174244642258,,,,,, +37,130249,,,,,,,,,,,,0.06663735955953598,,,,,, +37,130299,,,,,,,,,,,,0.07799229025840759,,,,,, +37,130349,,,,,,,,,,,,0.06429855525493622,,,,,, +37,130399,,,,,,,,,,,,0.06642217934131622,,,,,, +37,130449,,,,,,,,,,,,0.06434805691242218,,,,,, +37,130499,,,,,,,,,,,,0.06379491090774536,,,,,, +37,130549,,,,,,,,,,,,0.06311388313770294,,,,,, +37,130599,,,,,,,,,,,,0.055829282850027084,,,,,, +37,130649,,,,,,,,,,,,0.07322996854782104,,,,,, +37,130699,,,,,,,,,,,,0.0762038454413414,,,,,, +37,130749,,,,,,,,,,,,0.06455028802156448,,,,,, +37,130795,,,,,,,,,,,,,0.2263033390045166,0.07442866265773773,0.3916240334510803,0.10434979200363159,0.3889782428741455,0.07442866265773773 +37,130795,,,,,,,0.21954716742038727,0.06807669997215271,0.42070233821868896,0.17697876691818237,0.3988777697086334,,,,,,, +38,130799,,,,,,,,,,,,0.07247304171323776,,,,,, +38,130849,,,,,,,,,,,,0.06495043635368347,,,,,, +38,130899,,,,,,,,,,,,0.05755186080932617,,,,,, +38,130949,,,,,,,,,,,,0.057189181447029114,,,,,, +38,130999,,,,,,,,,,,,0.0783141702413559,,,,,, +38,131049,,,,,,,,,,,,0.06696894019842148,,,,,, +38,131099,,,,,,,,,,,,0.05834298953413963,,,,,, +38,131149,,,,,,,,,,,,0.0696437656879425,,,,,, +38,131199,,,,,,,,,,,,0.06420888006687164,,,,,, +38,131249,,,,,,,,,,,,0.06313687562942505,,,,,, +38,131299,,,,,,,,,,,,0.05740094184875488,,,,,, +38,131349,,,,,,,,,,,,0.0660000741481781,,,,,, +38,131399,,,,,,,,,,,,0.06473596394062042,,,,,, +38,131449,,,,,,,,,,,,0.07110960781574249,,,,,, +38,131499,,,,,,,,,,,,0.07797661423683167,,,,,, +38,131549,,,,,,,,,,,,0.06806572526693344,,,,,, +38,131599,,,,,,,,,,,,0.0554039403796196,,,,,, +38,131649,,,,,,,,,,,,0.07114791870117188,,,,,, +38,131699,,,,,,,,,,,,0.07884465157985687,,,,,, +38,131749,,,,,,,,,,,,0.05679702013731003,,,,,, +38,131799,,,,,,,,,,,,0.06759370863437653,,,,,, +38,131849,,,,,,,,,,,,0.059911444783210754,,,,,, +38,131899,,,,,,,,,,,,0.0698387622833252,,,,,, +38,131949,,,,,,,,,,,,0.06293629854917526,,,,,, +38,131999,,,,,,,,,,,,0.07144119590520859,,,,,, +38,132049,,,,,,,,,,,,0.06130162626504898,,,,,, +38,132099,,,,,,,,,,,,0.07054238021373749,,,,,, +38,132149,,,,,,,,,,,,0.07117002457380295,,,,,, +38,132199,,,,,,,,,,,,0.07209374010562897,,,,,, +38,132249,,,,,,,,,,,,0.06586509943008423,,,,,, +38,132299,,,,,,,,,,,,0.060184918344020844,,,,,, +38,132349,,,,,,,,,,,,0.06815704703330994,,,,,, +38,132399,,,,,,,,,,,,0.08566483110189438,,,,,, +38,132449,,,,,,,,,,,,0.0770455002784729,,,,,, +38,132499,,,,,,,,,,,,0.0708312839269638,,,,,, +38,132549,,,,,,,,,,,,0.07706375420093536,,,,,, +38,132599,,,,,,,,,,,,0.06440533697605133,,,,,, +38,132649,,,,,,,,,,,,0.08270883560180664,,,,,, +38,132699,,,,,,,,,,,,0.07101269066333771,,,,,, +38,132749,,,,,,,,,,,,0.06713004410266876,,,,,, +38,132799,,,,,,,,,,,,0.0657399371266365,,,,,, +38,132849,,,,,,,,,,,,0.07389182597398758,,,,,, +38,132899,,,,,,,,,,,,0.07671421766281128,,,,,, +38,132949,,,,,,,,,,,,0.061575669795274734,,,,,, +38,132999,,,,,,,,,,,,0.06986573338508606,,,,,, +38,133049,,,,,,,,,,,,0.06804053485393524,,,,,, +38,133099,,,,,,,,,,,,0.06345340609550476,,,,,, +38,133149,,,,,,,,,,,,0.07677165418863297,,,,,, +38,133199,,,,,,,,,,,,0.06515663862228394,,,,,, +38,133249,,,,,,,,,,,,0.06017543375492096,,,,,, +38,133299,,,,,,,,,,,,0.06820380687713623,,,,,, +38,133349,,,,,,,,,,,,0.06927000731229782,,,,,, +38,133399,,,,,,,,,,,,0.06468255072832108,,,,,, +38,133449,,,,,,,,,,,,0.06911028921604156,,,,,, +38,133499,,,,,,,,,,,,0.07289715111255646,,,,,, +38,133549,,,,,,,,,,,,0.07452639937400818,,,,,, +38,133599,,,,,,,,,,,,0.06273429095745087,,,,,, +38,133649,,,,,,,,,,,,0.06489838659763336,,,,,, +38,133699,,,,,,,,,,,,0.07144105434417725,,,,,, +38,133749,,,,,,,,,,,,0.05903787910938263,,,,,, +38,133799,,,,,,,,,,,,0.0753554180264473,,,,,, +38,133849,,,,,,,,,,,,0.06835781037807465,,,,,, +38,133899,,,,,,,,,,,,0.07103019207715988,,,,,, +38,133949,,,,,,,,,,,,0.0667954534292221,,,,,, +38,133999,,,,,,,,,,,,0.07441303133964539,,,,,, +38,134049,,,,,,,,,,,,0.07495209574699402,,,,,, +38,134099,,,,,,,,,,,,0.07449835538864136,,,,,, +38,134149,,,,,,,,,,,,0.05374797433614731,,,,,, +38,134199,,,,,,,,,,,,0.08738705515861511,,,,,, +38,134237,,,,,,,,,,,,,0.22650663554668427,0.07476121932268143,0.39129310846328735,0.10034793615341187,0.3885270655155182,0.07476121932268143 +38,134237,,,,,,,0.2196221798658371,0.06804472208023071,0.42114776372909546,0.17736464738845825,0.3982062339782715,,,,,,, +39,134249,,,,,,,,,,,,0.07855402678251266,,,,,, +39,134299,,,,,,,,,,,,0.062323249876499176,,,,,, +39,134349,,,,,,,,,,,,0.06858234852552414,,,,,, +39,134399,,,,,,,,,,,,0.06455260515213013,,,,,, +39,134449,,,,,,,,,,,,0.07199958711862564,,,,,, +39,134499,,,,,,,,,,,,0.06619851291179657,,,,,, +39,134549,,,,,,,,,,,,0.07630060613155365,,,,,, +39,134599,,,,,,,,,,,,0.07213842868804932,,,,,, +39,134649,,,,,,,,,,,,0.05898699164390564,,,,,, +39,134699,,,,,,,,,,,,0.07540752738714218,,,,,, +39,134749,,,,,,,,,,,,0.06512467563152313,,,,,, +39,134799,,,,,,,,,,,,0.061036743223667145,,,,,, +39,134849,,,,,,,,,,,,0.06691794842481613,,,,,, +39,134899,,,,,,,,,,,,0.06117740273475647,,,,,, +39,134949,,,,,,,,,,,,0.0694139152765274,,,,,, +39,134999,,,,,,,,,,,,0.07288723438978195,,,,,, +39,135049,,,,,,,,,,,,0.06785029172897339,,,,,, +39,135099,,,,,,,,,,,,0.06444329768419266,,,,,, +39,135149,,,,,,,,,,,,0.06297450512647629,,,,,, +39,135199,,,,,,,,,,,,0.06529548019170761,,,,,, +39,135249,,,,,,,,,,,,0.07707786560058594,,,,,, +39,135299,,,,,,,,,,,,0.06296990066766739,,,,,, +39,135349,,,,,,,,,,,,0.0615977942943573,,,,,, +39,135399,,,,,,,,,,,,0.0792335495352745,,,,,, +39,135449,,,,,,,,,,,,0.06800302863121033,,,,,, +39,135499,,,,,,,,,,,,0.06728555262088776,,,,,, +39,135549,,,,,,,,,,,,0.056081563234329224,,,,,, +39,135599,,,,,,,,,,,,0.06759727001190186,,,,,, +39,135649,,,,,,,,,,,,0.05901170149445534,,,,,, +39,135699,,,,,,,,,,,,0.05273989960551262,,,,,, +39,135749,,,,,,,,,,,,0.0704212635755539,,,,,, +39,135799,,,,,,,,,,,,0.08014903962612152,,,,,, +39,135849,,,,,,,,,,,,0.06089980900287628,,,,,, +39,135899,,,,,,,,,,,,0.06962759792804718,,,,,, +39,135949,,,,,,,,,,,,0.0740748792886734,,,,,, +39,135999,,,,,,,,,,,,0.07551255822181702,,,,,, +39,136049,,,,,,,,,,,,0.06711176037788391,,,,,, +39,136099,,,,,,,,,,,,0.06419561803340912,,,,,, +39,136149,,,,,,,,,,,,0.06702134758234024,,,,,, +39,136199,,,,,,,,,,,,0.056697357445955276,,,,,, +39,136249,,,,,,,,,,,,0.07810236513614655,,,,,, +39,136299,,,,,,,,,,,,0.0752502828836441,,,,,, +39,136349,,,,,,,,,,,,0.06320580095052719,,,,,, +39,136399,,,,,,,,,,,,0.07175096869468689,,,,,, +39,136449,,,,,,,,,,,,0.0723562240600586,,,,,, +39,136499,,,,,,,,,,,,0.0633169561624527,,,,,, +39,136549,,,,,,,,,,,,0.059725839644670486,,,,,, +39,136599,,,,,,,,,,,,0.0593276172876358,,,,,, +39,136649,,,,,,,,,,,,0.06969437003135681,,,,,, +39,136699,,,,,,,,,,,,0.06131616234779358,,,,,, +39,136749,,,,,,,,,,,,0.06691096723079681,,,,,, +39,136799,,,,,,,,,,,,0.0749942809343338,,,,,, +39,136849,,,,,,,,,,,,0.06357920169830322,,,,,, +39,136899,,,,,,,,,,,,0.07783855497837067,,,,,, +39,136949,,,,,,,,,,,,0.08315974473953247,,,,,, +39,136999,,,,,,,,,,,,0.06199123337864876,,,,,, +39,137049,,,,,,,,,,,,0.0809519961476326,,,,,, +39,137099,,,,,,,,,,,,0.06716640293598175,,,,,, +39,137149,,,,,,,,,,,,0.05733061581850052,,,,,, +39,137199,,,,,,,,,,,,0.06678605079650879,,,,,, +39,137249,,,,,,,,,,,,0.06643886864185333,,,,,, +39,137299,,,,,,,,,,,,0.0656362920999527,,,,,, +39,137349,,,,,,,,,,,,0.07527735829353333,,,,,, +39,137399,,,,,,,,,,,,0.07677438855171204,,,,,, +39,137449,,,,,,,,,,,,0.06786258518695831,,,,,, +39,137499,,,,,,,,,,,,0.06330333650112152,,,,,, +39,137549,,,,,,,,,,,,0.06324940919876099,,,,,, +39,137599,,,,,,,,,,,,0.08150286227464676,,,,,, +39,137649,,,,,,,,,,,,0.05935066193342209,,,,,, +39,137679,,,,,,,,,,,,,0.22687774896621704,0.07534848898649216,0.3893287777900696,0.09328097105026245,0.3863261044025421,0.07534848898649216 +39,137679,,,,,,,0.21948488056659698,0.06800024956464767,0.4217865467071533,0.17790597677230835,0.3993179500102997,,,,,,, +40,137699,,,,,,,,,,,,0.06584875285625458,,,,,, +40,137749,,,,,,,,,,,,0.06946146488189697,,,,,, +40,137799,,,,,,,,,,,,0.06352069973945618,,,,,, +40,137849,,,,,,,,,,,,0.069033682346344,,,,,, +40,137899,,,,,,,,,,,,0.07272356003522873,,,,,, +40,137949,,,,,,,,,,,,0.07366761565208435,,,,,, +40,137999,,,,,,,,,,,,0.054532796144485474,,,,,, +40,138049,,,,,,,,,,,,0.07004700601100922,,,,,, +40,138099,,,,,,,,,,,,0.08057980239391327,,,,,, +40,138149,,,,,,,,,,,,0.07584887742996216,,,,,, +40,138199,,,,,,,,,,,,0.0746288001537323,,,,,, +40,138249,,,,,,,,,,,,0.07956056296825409,,,,,, +40,138299,,,,,,,,,,,,0.07438399642705917,,,,,, +40,138349,,,,,,,,,,,,0.0697077289223671,,,,,, +40,138399,,,,,,,,,,,,0.07104797661304474,,,,,, +40,138449,,,,,,,,,,,,0.0656207725405693,,,,,, +40,138499,,,,,,,,,,,,0.06360557675361633,,,,,, +40,138549,,,,,,,,,,,,0.07232807576656342,,,,,, +40,138599,,,,,,,,,,,,0.07004541903734207,,,,,, +40,138649,,,,,,,,,,,,0.07317052781581879,,,,,, +40,138699,,,,,,,,,,,,0.06827398389577866,,,,,, +40,138749,,,,,,,,,,,,0.061242952942848206,,,,,, +40,138799,,,,,,,,,,,,0.06920008361339569,,,,,, +40,138849,,,,,,,,,,,,0.0638045147061348,,,,,, +40,138899,,,,,,,,,,,,0.06172484531998634,,,,,, +40,138949,,,,,,,,,,,,0.06692986935377121,,,,,, +40,138999,,,,,,,,,,,,0.06792481243610382,,,,,, +40,139049,,,,,,,,,,,,0.061891842633485794,,,,,, +40,139099,,,,,,,,,,,,0.07767181098461151,,,,,, +40,139149,,,,,,,,,,,,0.0586809478700161,,,,,, +40,139199,,,,,,,,,,,,0.07512004673480988,,,,,, +40,139249,,,,,,,,,,,,0.08824457973241806,,,,,, +40,139299,,,,,,,,,,,,0.060085803270339966,,,,,, +40,139349,,,,,,,,,,,,0.07156237959861755,,,,,, +40,139399,,,,,,,,,,,,0.08417554199695587,,,,,, +40,139449,,,,,,,,,,,,0.054576098918914795,,,,,, +40,139499,,,,,,,,,,,,0.05628218129277229,,,,,, +40,139549,,,,,,,,,,,,0.06820040941238403,,,,,, +40,139599,,,,,,,,,,,,0.08209358155727386,,,,,, +40,139649,,,,,,,,,,,,0.06935220956802368,,,,,, +40,139699,,,,,,,,,,,,0.07902857661247253,,,,,, +40,139749,,,,,,,,,,,,0.07593414187431335,,,,,, +40,139799,,,,,,,,,,,,0.06654196977615356,,,,,, +40,139849,,,,,,,,,,,,0.06145187094807625,,,,,, +40,139899,,,,,,,,,,,,0.07302247732877731,,,,,, +40,139949,,,,,,,,,,,,0.07079757750034332,,,,,, +40,139999,,,,,,,,,,,,0.07215289771556854,,,,,, +40,140049,,,,,,,,,,,,0.060446642339229584,,,,,, +40,140099,,,,,,,,,,,,0.057560183107852936,,,,,, +40,140149,,,,,,,,,,,,0.06765876710414886,,,,,, +40,140199,,,,,,,,,,,,0.07487413287162781,,,,,, +40,140249,,,,,,,,,,,,0.060719121247529984,,,,,, +40,140299,,,,,,,,,,,,0.0542432963848114,,,,,, +40,140349,,,,,,,,,,,,0.06576365232467651,,,,,, +40,140399,,,,,,,,,,,,0.07741601765155792,,,,,, +40,140449,,,,,,,,,,,,0.07177914679050446,,,,,, +40,140499,,,,,,,,,,,,0.07380727678537369,,,,,, +40,140549,,,,,,,,,,,,0.07550571858882904,,,,,, +40,140599,,,,,,,,,,,,0.07864007353782654,,,,,, +40,140649,,,,,,,,,,,,0.06780270487070084,,,,,, +40,140699,,,,,,,,,,,,0.06049239635467529,,,,,, +40,140749,,,,,,,,,,,,0.07490069419145584,,,,,, +40,140799,,,,,,,,,,,,0.07636319100856781,,,,,, +40,140849,,,,,,,,,,,,0.06914041191339493,,,,,, +40,140899,,,,,,,,,,,,0.06432293355464935,,,,,, +40,140949,,,,,,,,,,,,0.07253329455852509,,,,,, +40,140999,,,,,,,,,,,,0.06351928412914276,,,,,, +40,141049,,,,,,,,,,,,0.061958830803632736,,,,,, +40,141099,,,,,,,,,,,,0.06919707357883453,,,,,, +40,141121,,,,,,,,,,,,,0.22748048603534698,0.07561631500720978,0.3912081718444824,0.09005802869796753,0.38792702555656433,0.07561631500720978 +40,141121,,,,,,,0.21939332783222198,0.067961186170578,0.4223446249961853,0.1783720850944519,0.3993602395057678,,,,,,, +41,141149,,,,,,,,,,,,0.06430121511220932,,,,,, +41,141199,,,,,,,,,,,,0.06149677932262421,,,,,, +41,141249,,,,,,,,,,,,0.06926070153713226,,,,,, +41,141299,,,,,,,,,,,,0.06974253058433533,,,,,, +41,141349,,,,,,,,,,,,0.06692658364772797,,,,,, +41,141399,,,,,,,,,,,,0.07376831769943237,,,,,, +41,141449,,,,,,,,,,,,0.06712527573108673,,,,,, +41,141499,,,,,,,,,,,,0.060254331678152084,,,,,, +41,141549,,,,,,,,,,,,0.06689989566802979,,,,,, +41,141599,,,,,,,,,,,,0.05257416144013405,,,,,, +41,141649,,,,,,,,,,,,0.06804899126291275,,,,,, +41,141699,,,,,,,,,,,,0.07320092618465424,,,,,, +41,141749,,,,,,,,,,,,0.06680989265441895,,,,,, +41,141799,,,,,,,,,,,,0.06834149360656738,,,,,, +41,141849,,,,,,,,,,,,0.06648661941289902,,,,,, +41,141899,,,,,,,,,,,,0.06907931715250015,,,,,, +41,141949,,,,,,,,,,,,0.06653997302055359,,,,,, +41,141999,,,,,,,,,,,,0.06261667609214783,,,,,, +41,142049,,,,,,,,,,,,0.057959772646427155,,,,,, +41,142099,,,,,,,,,,,,0.07182595133781433,,,,,, +41,142149,,,,,,,,,,,,0.06732787191867828,,,,,, +41,142199,,,,,,,,,,,,0.06987834721803665,,,,,, +41,142249,,,,,,,,,,,,0.07736937701702118,,,,,, +41,142299,,,,,,,,,,,,0.0729420930147171,,,,,, +41,142349,,,,,,,,,,,,0.06046909838914871,,,,,, +41,142399,,,,,,,,,,,,0.06422717869281769,,,,,, +41,142449,,,,,,,,,,,,0.05489766597747803,,,,,, +41,142499,,,,,,,,,,,,0.07561889290809631,,,,,, +41,142549,,,,,,,,,,,,0.06875382363796234,,,,,, +41,142599,,,,,,,,,,,,0.06922518461942673,,,,,, +41,142649,,,,,,,,,,,,0.07007113099098206,,,,,, +41,142699,,,,,,,,,,,,0.06480413675308228,,,,,, +41,142749,,,,,,,,,,,,0.07037073373794556,,,,,, +41,142799,,,,,,,,,,,,0.07363180071115494,,,,,, +41,142849,,,,,,,,,,,,0.062483832240104675,,,,,, +41,142899,,,,,,,,,,,,0.07088887691497803,,,,,, +41,142949,,,,,,,,,,,,0.07902190089225769,,,,,, +41,142999,,,,,,,,,,,,0.07079239934682846,,,,,, +41,143049,,,,,,,,,,,,0.06728073954582214,,,,,, +41,143099,,,,,,,,,,,,0.0642322301864624,,,,,, +41,143149,,,,,,,,,,,,0.06748059391975403,,,,,, +41,143199,,,,,,,,,,,,0.06415006518363953,,,,,, +41,143249,,,,,,,,,,,,0.05209556221961975,,,,,, +41,143299,,,,,,,,,,,,0.06411732733249664,,,,,, +41,143349,,,,,,,,,,,,0.07221592217683792,,,,,, +41,143399,,,,,,,,,,,,0.0695975124835968,,,,,, +41,143449,,,,,,,,,,,,0.05962098017334938,,,,,, +41,143499,,,,,,,,,,,,0.060617294162511826,,,,,, +41,143549,,,,,,,,,,,,0.06570401042699814,,,,,, +41,143599,,,,,,,,,,,,0.06902360916137695,,,,,, +41,143649,,,,,,,,,,,,0.0750250369310379,,,,,, +41,143699,,,,,,,,,,,,0.05582479387521744,,,,,, +41,143749,,,,,,,,,,,,0.0705726146697998,,,,,, +41,143799,,,,,,,,,,,,0.06622664630413055,,,,,, +41,143849,,,,,,,,,,,,0.06331014633178711,,,,,, +41,143899,,,,,,,,,,,,0.07297995686531067,,,,,, +41,143949,,,,,,,,,,,,0.06560806930065155,,,,,, +41,143999,,,,,,,,,,,,0.05794495344161987,,,,,, +41,144049,,,,,,,,,,,,0.0725206807255745,,,,,, +41,144099,,,,,,,,,,,,0.06745556741952896,,,,,, +41,144149,,,,,,,,,,,,0.0514698289334774,,,,,, +41,144199,,,,,,,,,,,,0.07375484704971313,,,,,, +41,144249,,,,,,,,,,,,0.05355353280901909,,,,,, +41,144299,,,,,,,,,,,,0.06758987903594971,,,,,, +41,144349,,,,,,,,,,,,0.07559063285589218,,,,,, +41,144399,,,,,,,,,,,,0.07985683530569077,,,,,, +41,144449,,,,,,,,,,,,0.06616924703121185,,,,,, +41,144499,,,,,,,,,,,,0.06910035014152527,,,,,, +41,144549,,,,,,,,,,,,0.07722486555576324,,,,,, +41,144563,,,,,,,,,,,,,0.2267988622188568,0.07528895884752274,0.391521692276001,0.0939972996711731,0.38871413469314575,0.07528895884752274 +41,144563,,,,,,,0.2191368192434311,0.06780952960252762,0.42450910806655884,0.18020468950271606,0.40163150429725647,,,,,,, +42,144599,,,,,,,,,,,,0.06251442432403564,,,,,, +42,144649,,,,,,,,,,,,0.06866694986820221,,,,,, +42,144699,,,,,,,,,,,,0.0659153163433075,,,,,, +42,144749,,,,,,,,,,,,0.05598172917962074,,,,,, +42,144799,,,,,,,,,,,,0.06136344373226166,,,,,, +42,144849,,,,,,,,,,,,0.06092296540737152,,,,,, +42,144899,,,,,,,,,,,,0.07920905947685242,,,,,, +42,144949,,,,,,,,,,,,0.06622805446386337,,,,,, +42,144999,,,,,,,,,,,,0.07269318401813507,,,,,, +42,145049,,,,,,,,,,,,0.07903152704238892,,,,,, +42,145099,,,,,,,,,,,,0.0688086599111557,,,,,, +42,145149,,,,,,,,,,,,0.07049258053302765,,,,,, +42,145199,,,,,,,,,,,,0.06652811169624329,,,,,, +42,145249,,,,,,,,,,,,0.06296621263027191,,,,,, +42,145299,,,,,,,,,,,,0.06640736758708954,,,,,, +42,145349,,,,,,,,,,,,0.05888470634818077,,,,,, +42,145399,,,,,,,,,,,,0.061313241720199585,,,,,, +42,145449,,,,,,,,,,,,0.07907411456108093,,,,,, +42,145499,,,,,,,,,,,,0.07814884930849075,,,,,, +42,145549,,,,,,,,,,,,0.0662001520395279,,,,,, +42,145599,,,,,,,,,,,,0.05758135765790939,,,,,, +42,145649,,,,,,,,,,,,0.07158689200878143,,,,,, +42,145699,,,,,,,,,,,,0.06715986132621765,,,,,, +42,145749,,,,,,,,,,,,0.06832098960876465,,,,,, +42,145799,,,,,,,,,,,,0.06942763924598694,,,,,, +42,145849,,,,,,,,,,,,0.05807281658053398,,,,,, +42,145899,,,,,,,,,,,,0.0786641538143158,,,,,, +42,145949,,,,,,,,,,,,0.07420900464057922,,,,,, +42,145999,,,,,,,,,,,,0.06643621623516083,,,,,, +42,146049,,,,,,,,,,,,0.06269784271717072,,,,,, +42,146099,,,,,,,,,,,,0.05885351821780205,,,,,, +42,146149,,,,,,,,,,,,0.06162625551223755,,,,,, +42,146199,,,,,,,,,,,,0.08050961047410965,,,,,, +42,146249,,,,,,,,,,,,0.0698184221982956,,,,,, +42,146299,,,,,,,,,,,,0.06972469389438629,,,,,, +42,146349,,,,,,,,,,,,0.061045825481414795,,,,,, +42,146399,,,,,,,,,,,,0.05055869743227959,,,,,, +42,146449,,,,,,,,,,,,0.07445047795772552,,,,,, +42,146499,,,,,,,,,,,,0.05785644054412842,,,,,, +42,146549,,,,,,,,,,,,0.062079720199108124,,,,,, +42,146599,,,,,,,,,,,,0.07391883432865143,,,,,, +42,146649,,,,,,,,,,,,0.0630311667919159,,,,,, +42,146699,,,,,,,,,,,,0.06599657982587814,,,,,, +42,146749,,,,,,,,,,,,0.07639339566230774,,,,,, +42,146799,,,,,,,,,,,,0.06507138907909393,,,,,, +42,146849,,,,,,,,,,,,0.05361795797944069,,,,,, +42,146899,,,,,,,,,,,,0.07374413311481476,,,,,, +42,146949,,,,,,,,,,,,0.06327167898416519,,,,,, +42,146999,,,,,,,,,,,,0.0733037143945694,,,,,, +42,147049,,,,,,,,,,,,0.07169164717197418,,,,,, +42,147099,,,,,,,,,,,,0.06643585860729218,,,,,, +42,147149,,,,,,,,,,,,0.07039521634578705,,,,,, +42,147199,,,,,,,,,,,,0.07365986704826355,,,,,, +42,147249,,,,,,,,,,,,0.058424487709999084,,,,,, +42,147299,,,,,,,,,,,,0.06611289083957672,,,,,, +42,147349,,,,,,,,,,,,0.0741429477930069,,,,,, +42,147399,,,,,,,,,,,,0.07380752265453339,,,,,, +42,147449,,,,,,,,,,,,0.0621408186852932,,,,,, +42,147499,,,,,,,,,,,,0.05882444977760315,,,,,, +42,147549,,,,,,,,,,,,0.07675570249557495,,,,,, +42,147599,,,,,,,,,,,,0.07057595252990723,,,,,, +42,147649,,,,,,,,,,,,0.06535422056913376,,,,,, +42,147699,,,,,,,,,,,,0.07192932069301605,,,,,, +42,147749,,,,,,,,,,,,0.06782454997301102,,,,,, +42,147799,,,,,,,,,,,,0.07054570317268372,,,,,, +42,147849,,,,,,,,,,,,0.06910485029220581,,,,,, +42,147899,,,,,,,,,,,,0.0773085206747055,,,,,, +42,147949,,,,,,,,,,,,0.07444149255752563,,,,,, +42,147999,,,,,,,,,,,,0.07416564971208572,,,,,, +42,148005,,,,,,,,,,,,,0.22786587476730347,0.07614796608686447,0.39312341809272766,0.08366024494171143,0.3901134133338928,0.07614796608686447 +42,148005,,,,,,,0.21894647181034088,0.06771887838840485,0.42579764127731323,0.18128728866577148,0.4027310907840729,,,,,,, +43,148049,,,,,,,,,,,,0.06326265633106232,,,,,, +43,148099,,,,,,,,,,,,0.07486173510551453,,,,,, +43,148149,,,,,,,,,,,,0.057953692972660065,,,,,, +43,148199,,,,,,,,,,,,0.07003263384103775,,,,,, +43,148249,,,,,,,,,,,,0.07621721178293228,,,,,, +43,148299,,,,,,,,,,,,0.06919752061367035,,,,,, +43,148349,,,,,,,,,,,,0.06482812762260437,,,,,, +43,148399,,,,,,,,,,,,0.06537710875272751,,,,,, +43,148449,,,,,,,,,,,,0.07375434786081314,,,,,, +43,148499,,,,,,,,,,,,0.059555914252996445,,,,,, +43,148549,,,,,,,,,,,,0.07056726515293121,,,,,, +43,148599,,,,,,,,,,,,0.07084396481513977,,,,,, +43,148649,,,,,,,,,,,,0.06955760717391968,,,,,, +43,148699,,,,,,,,,,,,0.07171447575092316,,,,,, +43,148749,,,,,,,,,,,,0.05863848328590393,,,,,, +43,148799,,,,,,,,,,,,0.06790078431367874,,,,,, +43,148849,,,,,,,,,,,,0.05752197653055191,,,,,, +43,148899,,,,,,,,,,,,0.06841365993022919,,,,,, +43,148949,,,,,,,,,,,,0.060942891985177994,,,,,, +43,148999,,,,,,,,,,,,0.08022242784500122,,,,,, +43,149049,,,,,,,,,,,,0.06325060874223709,,,,,, +43,149099,,,,,,,,,,,,0.07488662004470825,,,,,, +43,149149,,,,,,,,,,,,0.06438569724559784,,,,,, +43,149199,,,,,,,,,,,,0.06736207753419876,,,,,, +43,149249,,,,,,,,,,,,0.07658124715089798,,,,,, +43,149299,,,,,,,,,,,,0.08499817550182343,,,,,, +43,149349,,,,,,,,,,,,0.07389827072620392,,,,,, +43,149399,,,,,,,,,,,,0.07035981118679047,,,,,, +43,149449,,,,,,,,,,,,0.07136568427085876,,,,,, +43,149499,,,,,,,,,,,,0.0719001367688179,,,,,, +43,149549,,,,,,,,,,,,0.07869134843349457,,,,,, +43,149599,,,,,,,,,,,,0.07844549417495728,,,,,, +43,149649,,,,,,,,,,,,0.07170820981264114,,,,,, +43,149699,,,,,,,,,,,,0.06758726388216019,,,,,, +43,149749,,,,,,,,,,,,0.06358116120100021,,,,,, +43,149799,,,,,,,,,,,,0.060926735401153564,,,,,, +43,149849,,,,,,,,,,,,0.05697120726108551,,,,,, +43,149899,,,,,,,,,,,,0.07165506482124329,,,,,, +43,149949,,,,,,,,,,,,0.05764919891953468,,,,,, +43,149999,,,,,,,,,,,,0.06521163135766983,,,,,, +43,150049,,,,,,,,,,,,0.06189683824777603,,,,,, +43,150099,,,,,,,,,,,,0.06823358684778214,,,,,, +43,150149,,,,,,,,,,,,0.0721740871667862,,,,,, +43,150199,,,,,,,,,,,,0.06918931752443314,,,,,, +43,150249,,,,,,,,,,,,0.06301163136959076,,,,,, +43,150299,,,,,,,,,,,,0.06416617333889008,,,,,, +43,150349,,,,,,,,,,,,0.0651712641119957,,,,,, +43,150399,,,,,,,,,,,,0.07728435844182968,,,,,, +43,150449,,,,,,,,,,,,0.06636617332696915,,,,,, +43,150499,,,,,,,,,,,,0.07286270707845688,,,,,, +43,150549,,,,,,,,,,,,0.07597410678863525,,,,,, +43,150599,,,,,,,,,,,,0.06673574447631836,,,,,, +43,150649,,,,,,,,,,,,0.057892099022865295,,,,,, +43,150699,,,,,,,,,,,,0.07977776974439621,,,,,, +43,150749,,,,,,,,,,,,0.06308922171592712,,,,,, +43,150799,,,,,,,,,,,,0.062107671052217484,,,,,, +43,150849,,,,,,,,,,,,0.0757189616560936,,,,,, +43,150899,,,,,,,,,,,,0.06597159802913666,,,,,, +43,150949,,,,,,,,,,,,0.07617780566215515,,,,,, +43,150999,,,,,,,,,,,,0.05720202252268791,,,,,, +43,151049,,,,,,,,,,,,0.06716153025627136,,,,,, +43,151099,,,,,,,,,,,,0.061526648700237274,,,,,, +43,151149,,,,,,,,,,,,0.06941115111112595,,,,,, +43,151199,,,,,,,,,,,,0.06613823771476746,,,,,, +43,151249,,,,,,,,,,,,0.06341280043125153,,,,,, +43,151299,,,,,,,,,,,,0.06117292493581772,,,,,, +43,151349,,,,,,,,,,,,0.06723234057426453,,,,,, +43,151399,,,,,,,,,,,,0.06525368988513947,,,,,, +43,151447,,,,,,,,,,,,,0.22570878267288208,0.07398759573698044,0.3920385241508484,0.10965746641159058,0.38880109786987305,0.07398759573698044 +43,151447,,,,,,,0.21890337765216827,0.0676804780960083,0.4263429343700409,0.18176299333572388,0.4030771255493164,,,,,,, +44,151449,,,,,,,,,,,,0.07610341906547546,,,,,, +44,151499,,,,,,,,,,,,0.06184498593211174,,,,,, +44,151549,,,,,,,,,,,,0.06508272886276245,,,,,, +44,151599,,,,,,,,,,,,0.05918540805578232,,,,,, +44,151649,,,,,,,,,,,,0.052098598331213,,,,,, +44,151699,,,,,,,,,,,,0.06420330703258514,,,,,, +44,151749,,,,,,,,,,,,0.06930454075336456,,,,,, +44,151799,,,,,,,,,,,,0.075362429022789,,,,,, +44,151849,,,,,,,,,,,,0.06584610790014267,,,,,, +44,151899,,,,,,,,,,,,0.0730021670460701,,,,,, +44,151949,,,,,,,,,,,,0.060430172830820084,,,,,, +44,151999,,,,,,,,,,,,0.06685283035039902,,,,,, +44,152049,,,,,,,,,,,,0.0655665323138237,,,,,, +44,152099,,,,,,,,,,,,0.06187352165579796,,,,,, +44,152149,,,,,,,,,,,,0.07528296113014221,,,,,, +44,152199,,,,,,,,,,,,0.0650523379445076,,,,,, +44,152249,,,,,,,,,,,,0.057205334305763245,,,,,, +44,152299,,,,,,,,,,,,0.07866927981376648,,,,,, +44,152349,,,,,,,,,,,,0.07682804763317108,,,,,, +44,152399,,,,,,,,,,,,0.06831514835357666,,,,,, +44,152449,,,,,,,,,,,,0.07330871373414993,,,,,, +44,152499,,,,,,,,,,,,0.06897476315498352,,,,,, +44,152549,,,,,,,,,,,,0.05923696607351303,,,,,, +44,152599,,,,,,,,,,,,0.06008600443601608,,,,,, +44,152649,,,,,,,,,,,,0.05867127329111099,,,,,, +44,152699,,,,,,,,,,,,0.0683702602982521,,,,,, +44,152749,,,,,,,,,,,,0.0604870542883873,,,,,, +44,152799,,,,,,,,,,,,0.06380264461040497,,,,,, +44,152849,,,,,,,,,,,,0.07435677200555801,,,,,, +44,152899,,,,,,,,,,,,0.07938109338283539,,,,,, +44,152949,,,,,,,,,,,,0.06110643967986107,,,,,, +44,152999,,,,,,,,,,,,0.06773215532302856,,,,,, +44,153049,,,,,,,,,,,,0.0686093121767044,,,,,, +44,153099,,,,,,,,,,,,0.05732585862278938,,,,,, +44,153149,,,,,,,,,,,,0.06820211559534073,,,,,, +44,153199,,,,,,,,,,,,0.06597330421209335,,,,,, +44,153249,,,,,,,,,,,,0.07495376467704773,,,,,, +44,153299,,,,,,,,,,,,0.0701192319393158,,,,,, +44,153349,,,,,,,,,,,,0.08295933157205582,,,,,, +44,153399,,,,,,,,,,,,0.06320613622665405,,,,,, +44,153449,,,,,,,,,,,,0.05800272524356842,,,,,, +44,153499,,,,,,,,,,,,0.05832815170288086,,,,,, +44,153549,,,,,,,,,,,,0.07123911380767822,,,,,, +44,153599,,,,,,,,,,,,0.06703204661607742,,,,,, +44,153649,,,,,,,,,,,,0.05740867555141449,,,,,, +44,153699,,,,,,,,,,,,0.067725770175457,,,,,, +44,153749,,,,,,,,,,,,0.0715850293636322,,,,,, +44,153799,,,,,,,,,,,,0.06103772670030594,,,,,, +44,153849,,,,,,,,,,,,0.059942856431007385,,,,,, +44,153899,,,,,,,,,,,,0.07133760303258896,,,,,, +44,153949,,,,,,,,,,,,0.05704769864678383,,,,,, +44,153999,,,,,,,,,,,,0.07824838161468506,,,,,, +44,154049,,,,,,,,,,,,0.0671185702085495,,,,,, +44,154099,,,,,,,,,,,,0.07506369799375534,,,,,, +44,154149,,,,,,,,,,,,0.07480035722255707,,,,,, +44,154199,,,,,,,,,,,,0.07506141811609268,,,,,, +44,154249,,,,,,,,,,,,0.07083491235971451,,,,,, +44,154299,,,,,,,,,,,,0.05574718490242958,,,,,, +44,154349,,,,,,,,,,,,0.07199956476688385,,,,,, +44,154399,,,,,,,,,,,,0.06945031881332397,,,,,, +44,154449,,,,,,,,,,,,0.07691921293735504,,,,,, +44,154499,,,,,,,,,,,,0.0693189725279808,,,,,, +44,154549,,,,,,,,,,,,0.06258838623762131,,,,,, +44,154599,,,,,,,,,,,,0.07407783716917038,,,,,, +44,154649,,,,,,,,,,,,0.057813361287117004,,,,,, +44,154699,,,,,,,,,,,,0.07592830061912537,,,,,, +44,154749,,,,,,,,,,,,0.08524726331233978,,,,,, +44,154799,,,,,,,,,,,,0.06667827069759369,,,,,, +44,154849,,,,,,,,,,,,0.06800408661365509,,,,,, +44,154889,,,,,,,,,,,,,0.22552017867565155,0.07419797778129578,0.3931116759777069,0.10712575912475586,0.3899800479412079,0.07419797778129578 +44,154889,,,,,,,0.21884654462337494,0.06769499182701111,0.42613986134529114,0.18158698081970215,0.4035525619983673,,,,,,, +45,154899,,,,,,,,,,,,0.05926941707730293,,,,,, +45,154949,,,,,,,,,,,,0.06326571106910706,,,,,, +45,154999,,,,,,,,,,,,0.06902974098920822,,,,,, +45,155049,,,,,,,,,,,,0.0660594180226326,,,,,, +45,155099,,,,,,,,,,,,0.07788655906915665,,,,,, +45,155149,,,,,,,,,,,,0.06631267070770264,,,,,, +45,155199,,,,,,,,,,,,0.06572633236646652,,,,,, +45,155249,,,,,,,,,,,,0.06951826810836792,,,,,, +45,155299,,,,,,,,,,,,0.06168770045042038,,,,,, +45,155349,,,,,,,,,,,,0.0704469084739685,,,,,, +45,155399,,,,,,,,,,,,0.06785859912633896,,,,,, +45,155449,,,,,,,,,,,,0.06546670943498611,,,,,, +45,155499,,,,,,,,,,,,0.07454035431146622,,,,,, +45,155549,,,,,,,,,,,,0.07719883322715759,,,,,, +45,155599,,,,,,,,,,,,0.06178409606218338,,,,,, +45,155649,,,,,,,,,,,,0.07272271811962128,,,,,, +45,155699,,,,,,,,,,,,0.06451065093278885,,,,,, +45,155749,,,,,,,,,,,,0.07104620337486267,,,,,, +45,155799,,,,,,,,,,,,0.061462465673685074,,,,,, +45,155849,,,,,,,,,,,,0.08169113099575043,,,,,, +45,155899,,,,,,,,,,,,0.054242730140686035,,,,,, +45,155949,,,,,,,,,,,,0.0760442465543747,,,,,, +45,155999,,,,,,,,,,,,0.06119760125875473,,,,,, +45,156049,,,,,,,,,,,,0.06845743954181671,,,,,, +45,156099,,,,,,,,,,,,0.05546097084879875,,,,,, +45,156149,,,,,,,,,,,,0.07102984189987183,,,,,, +45,156199,,,,,,,,,,,,0.07116489112377167,,,,,, +45,156249,,,,,,,,,,,,0.06763336062431335,,,,,, +45,156299,,,,,,,,,,,,0.06612984836101532,,,,,, +45,156349,,,,,,,,,,,,0.06213165819644928,,,,,, +45,156399,,,,,,,,,,,,0.06145406886935234,,,,,, +45,156449,,,,,,,,,,,,0.0539633184671402,,,,,, +45,156499,,,,,,,,,,,,0.0630587488412857,,,,,, +45,156549,,,,,,,,,,,,0.06114039942622185,,,,,, +45,156599,,,,,,,,,,,,0.0756167471408844,,,,,, +45,156649,,,,,,,,,,,,0.06127770245075226,,,,,, +45,156699,,,,,,,,,,,,0.06886252015829086,,,,,, +45,156749,,,,,,,,,,,,0.07117471098899841,,,,,, +45,156799,,,,,,,,,,,,0.05754820629954338,,,,,, +45,156849,,,,,,,,,,,,0.07605409622192383,,,,,, +45,156899,,,,,,,,,,,,0.06930911540985107,,,,,, +45,156949,,,,,,,,,,,,0.07012562453746796,,,,,, +45,156999,,,,,,,,,,,,0.07213420420885086,,,,,, +45,157049,,,,,,,,,,,,0.07165895402431488,,,,,, +45,157099,,,,,,,,,,,,0.058733291923999786,,,,,, +45,157149,,,,,,,,,,,,0.05964994430541992,,,,,, +45,157199,,,,,,,,,,,,0.06825845688581467,,,,,, +45,157249,,,,,,,,,,,,0.06714518368244171,,,,,, +45,157299,,,,,,,,,,,,0.05833139643073082,,,,,, +45,157349,,,,,,,,,,,,0.0746067464351654,,,,,, +45,157399,,,,,,,,,,,,0.07788664847612381,,,,,, +45,157449,,,,,,,,,,,,0.062369827181100845,,,,,, +45,157499,,,,,,,,,,,,0.07100750505924225,,,,,, +45,157549,,,,,,,,,,,,0.06336645036935806,,,,,, +45,157599,,,,,,,,,,,,0.07257317006587982,,,,,, +45,157649,,,,,,,,,,,,0.056928157806396484,,,,,, +45,157699,,,,,,,,,,,,0.08401300013065338,,,,,, +45,157749,,,,,,,,,,,,0.07208411395549774,,,,,, +45,157799,,,,,,,,,,,,0.06723198294639587,,,,,, +45,157849,,,,,,,,,,,,0.07997841387987137,,,,,, +45,157899,,,,,,,,,,,,0.0636780634522438,,,,,, +45,157949,,,,,,,,,,,,0.06696884334087372,,,,,, +45,157999,,,,,,,,,,,,0.08527620136737823,,,,,, +45,158049,,,,,,,,,,,,0.06879670917987823,,,,,, +45,158099,,,,,,,,,,,,0.07221347093582153,,,,,, +45,158149,,,,,,,,,,,,0.07523784041404724,,,,,, +45,158199,,,,,,,,,,,,0.07026562839746475,,,,,, +45,158249,,,,,,,,,,,,0.06022157147526741,,,,,, +45,158299,,,,,,,,,,,,0.05978737771511078,,,,,, +45,158331,,,,,,,,,,,,,0.22590170800685883,0.07446837425231934,0.39212971925735474,0.10387194156646729,0.38937464356422424,0.07446837425231934 +45,158331,,,,,,,0.2187391072511673,0.06761252135038376,0.42730414867401123,0.1825997233390808,0.40476447343826294,,,,,,, +46,158349,,,,,,,,,,,,0.06580868363380432,,,,,, +46,158399,,,,,,,,,,,,0.06083918362855911,,,,,, +46,158449,,,,,,,,,,,,0.07083018869161606,,,,,, +46,158499,,,,,,,,,,,,0.06195726618170738,,,,,, +46,158549,,,,,,,,,,,,0.06621097028255463,,,,,, +46,158599,,,,,,,,,,,,0.06652902066707611,,,,,, +46,158649,,,,,,,,,,,,0.07648766785860062,,,,,, +46,158699,,,,,,,,,,,,0.06616103649139404,,,,,, +46,158749,,,,,,,,,,,,0.07046960294246674,,,,,, +46,158799,,,,,,,,,,,,0.078680120408535,,,,,, +46,158849,,,,,,,,,,,,0.055054135620594025,,,,,, +46,158899,,,,,,,,,,,,0.06293471902608871,,,,,, +46,158949,,,,,,,,,,,,0.06922608613967896,,,,,, +46,158999,,,,,,,,,,,,0.0720367431640625,,,,,, +46,159049,,,,,,,,,,,,0.05376998335123062,,,,,, +46,159099,,,,,,,,,,,,0.06328238546848297,,,,,, +46,159149,,,,,,,,,,,,0.07113504409790039,,,,,, +46,159199,,,,,,,,,,,,0.06855800747871399,,,,,, +46,159249,,,,,,,,,,,,0.05927928537130356,,,,,, +46,159299,,,,,,,,,,,,0.06694057583808899,,,,,, +46,159349,,,,,,,,,,,,0.056574683636426926,,,,,, +46,159399,,,,,,,,,,,,0.06894180923700333,,,,,, +46,159449,,,,,,,,,,,,0.08454011380672455,,,,,, +46,159499,,,,,,,,,,,,0.0785260945558548,,,,,, +46,159549,,,,,,,,,,,,0.06700413674116135,,,,,, +46,159599,,,,,,,,,,,,0.055517200380563736,,,,,, +46,159649,,,,,,,,,,,,0.07243990898132324,,,,,, +46,159699,,,,,,,,,,,,0.0659312903881073,,,,,, +46,159749,,,,,,,,,,,,0.07293374091386795,,,,,, +46,159799,,,,,,,,,,,,0.06703829765319824,,,,,, +46,159849,,,,,,,,,,,,0.06926432996988297,,,,,, +46,159899,,,,,,,,,,,,0.061245374381542206,,,,,, +46,159949,,,,,,,,,,,,0.07993865013122559,,,,,, +46,159999,,,,,,,,,,,,0.06892963498830795,,,,,, +46,160049,,,,,,,,,,,,0.06998474895954132,,,,,, +46,160099,,,,,,,,,,,,0.07348057627677917,,,,,, +46,160149,,,,,,,,,,,,0.06587016582489014,,,,,, +46,160199,,,,,,,,,,,,0.06710083782672882,,,,,, +46,160249,,,,,,,,,,,,0.06506320089101791,,,,,, +46,160299,,,,,,,,,,,,0.07337735593318939,,,,,, +46,160349,,,,,,,,,,,,0.06464885175228119,,,,,, +46,160399,,,,,,,,,,,,0.06298024952411652,,,,,, +46,160449,,,,,,,,,,,,0.053662098944187164,,,,,, +46,160499,,,,,,,,,,,,0.054058633744716644,,,,,, +46,160549,,,,,,,,,,,,0.07122582197189331,,,,,, +46,160599,,,,,,,,,,,,0.057160936295986176,,,,,, +46,160649,,,,,,,,,,,,0.0642366111278534,,,,,, +46,160699,,,,,,,,,,,,0.06667496263980865,,,,,, +46,160749,,,,,,,,,,,,0.07204345613718033,,,,,, +46,160799,,,,,,,,,,,,0.06072577089071274,,,,,, +46,160849,,,,,,,,,,,,0.06643979251384735,,,,,, +46,160899,,,,,,,,,,,,0.06702236086130142,,,,,, +46,160949,,,,,,,,,,,,0.06693543493747711,,,,,, +46,160999,,,,,,,,,,,,0.058409109711647034,,,,,, +46,161049,,,,,,,,,,,,0.07321446388959885,,,,,, +46,161099,,,,,,,,,,,,0.06158669292926788,,,,,, +46,161149,,,,,,,,,,,,0.057103365659713745,,,,,, +46,161199,,,,,,,,,,,,0.07609149813652039,,,,,, +46,161249,,,,,,,,,,,,0.06656379997730255,,,,,, +46,161299,,,,,,,,,,,,0.0841476246714592,,,,,, +46,161349,,,,,,,,,,,,0.06347211450338364,,,,,, +46,161399,,,,,,,,,,,,0.07062777876853943,,,,,, +46,161449,,,,,,,,,,,,0.06566382199525833,,,,,, +46,161499,,,,,,,,,,,,0.06891228258609772,,,,,, +46,161549,,,,,,,,,,,,0.07155231386423111,,,,,, +46,161599,,,,,,,,,,,,0.05521741881966591,,,,,, +46,161649,,,,,,,,,,,,0.05528697371482849,,,,,, +46,161699,,,,,,,,,,,,0.08035113662481308,,,,,, +46,161749,,,,,,,,,,,,0.06550835072994232,,,,,, +46,161773,,,,,,,,,,,,,0.22556281089782715,0.07446601986885071,0.39627739787101746,0.1039002537727356,0.39343497157096863,0.07446601986885071 +46,161773,,,,,,,0.21865764260292053,0.06757587194442749,0.4278232455253601,0.18302828073501587,0.4048517942428589,,,,,,, +47,161799,,,,,,,,,,,,0.07194456458091736,,,,,, +47,161849,,,,,,,,,,,,0.07361298054456711,,,,,, +47,161899,,,,,,,,,,,,0.06827317178249359,,,,,, +47,161949,,,,,,,,,,,,0.06814725697040558,,,,,, +47,161999,,,,,,,,,,,,0.059443727135658264,,,,,, +47,162049,,,,,,,,,,,,0.07513107359409332,,,,,, +47,162099,,,,,,,,,,,,0.0730922520160675,,,,,, +47,162149,,,,,,,,,,,,0.06356485933065414,,,,,, +47,162199,,,,,,,,,,,,0.0575023777782917,,,,,, +47,162249,,,,,,,,,,,,0.06816648691892624,,,,,, +47,162299,,,,,,,,,,,,0.06236908584833145,,,,,, +47,162349,,,,,,,,,,,,0.06613296270370483,,,,,, +47,162399,,,,,,,,,,,,0.057402513921260834,,,,,, +47,162449,,,,,,,,,,,,0.07569657266139984,,,,,, +47,162499,,,,,,,,,,,,0.06989553570747375,,,,,, +47,162549,,,,,,,,,,,,0.07384788990020752,,,,,, +47,162599,,,,,,,,,,,,0.06682232022285461,,,,,, +47,162649,,,,,,,,,,,,0.07926513254642487,,,,,, +47,162699,,,,,,,,,,,,0.07407863438129425,,,,,, +47,162749,,,,,,,,,,,,0.059101711958646774,,,,,, +47,162799,,,,,,,,,,,,0.06585593521595001,,,,,, +47,162849,,,,,,,,,,,,0.060018423944711685,,,,,, +47,162899,,,,,,,,,,,,0.07047659158706665,,,,,, +47,162949,,,,,,,,,,,,0.05947528034448624,,,,,, +47,162999,,,,,,,,,,,,0.06575240194797516,,,,,, +47,163049,,,,,,,,,,,,0.07382442057132721,,,,,, +47,163099,,,,,,,,,,,,0.07296264916658401,,,,,, +47,163149,,,,,,,,,,,,0.07382239401340485,,,,,, +47,163199,,,,,,,,,,,,0.058567531406879425,,,,,, +47,163249,,,,,,,,,,,,0.06891997903585434,,,,,, +47,163299,,,,,,,,,,,,0.06477223336696625,,,,,, +47,163349,,,,,,,,,,,,0.06794962286949158,,,,,, +47,163399,,,,,,,,,,,,0.07538890093564987,,,,,, +47,163449,,,,,,,,,,,,0.04636619612574577,,,,,, +47,163499,,,,,,,,,,,,0.07780279964208603,,,,,, +47,163549,,,,,,,,,,,,0.07120297849178314,,,,,, +47,163599,,,,,,,,,,,,0.06761541962623596,,,,,, +47,163649,,,,,,,,,,,,0.07749773561954498,,,,,, +47,163699,,,,,,,,,,,,0.07254193723201752,,,,,, +47,163749,,,,,,,,,,,,0.07363764941692352,,,,,, +47,163799,,,,,,,,,,,,0.05806262791156769,,,,,, +47,163849,,,,,,,,,,,,0.07049225270748138,,,,,, +47,163899,,,,,,,,,,,,0.05972111225128174,,,,,, +47,163949,,,,,,,,,,,,0.07804939150810242,,,,,, +47,163999,,,,,,,,,,,,0.06265516579151154,,,,,, +47,164049,,,,,,,,,,,,0.06128869578242302,,,,,, +47,164099,,,,,,,,,,,,0.06674619019031525,,,,,, +47,164149,,,,,,,,,,,,0.06020759046077728,,,,,, +47,164199,,,,,,,,,,,,0.0750625729560852,,,,,, +47,164249,,,,,,,,,,,,0.06835838407278061,,,,,, +47,164299,,,,,,,,,,,,0.05568435415625572,,,,,, +47,164349,,,,,,,,,,,,0.0566755011677742,,,,,, +47,164399,,,,,,,,,,,,0.07506375014781952,,,,,, +47,164449,,,,,,,,,,,,0.06150314584374428,,,,,, +47,164499,,,,,,,,,,,,0.07253816723823547,,,,,, +47,164549,,,,,,,,,,,,0.07758811116218567,,,,,, +47,164599,,,,,,,,,,,,0.07347927242517471,,,,,, +47,164649,,,,,,,,,,,,0.05335090309381485,,,,,, +47,164699,,,,,,,,,,,,0.06220008060336113,,,,,, +47,164749,,,,,,,,,,,,0.06925219297409058,,,,,, +47,164799,,,,,,,,,,,,0.05860757827758789,,,,,, +47,164849,,,,,,,,,,,,0.07376192510128021,,,,,, +47,164899,,,,,,,,,,,,0.0670783668756485,,,,,, +47,164949,,,,,,,,,,,,0.06997641921043396,,,,,, +47,164999,,,,,,,,,,,,0.07489555329084396,,,,,, +47,165049,,,,,,,,,,,,0.06257864087820053,,,,,, +47,165099,,,,,,,,,,,,0.059482641518116,,,,,, +47,165149,,,,,,,,,,,,0.055992886424064636,,,,,, +47,165199,,,,,,,,,,,,0.060747116804122925,,,,,, +47,165215,,,,,,,,,,,,,0.22591371834278107,0.07454332709312439,0.39545419812202454,0.10297000408172607,0.39241012930870056,0.07454332709312439 +47,165215,,,,,,,0.21869882941246033,0.06762616336345673,0.42711400985717773,0.18242192268371582,0.40478283166885376,,,,,,, +48,165249,,,,,,,,,,,,0.06497792899608612,,,,,, +48,165299,,,,,,,,,,,,0.06920430064201355,,,,,, +48,165349,,,,,,,,,,,,0.057026054710149765,,,,,, +48,165399,,,,,,,,,,,,0.07367904484272003,,,,,, +48,165449,,,,,,,,,,,,0.06986907869577408,,,,,, +48,165499,,,,,,,,,,,,0.06188005208969116,,,,,, +48,165549,,,,,,,,,,,,0.06805496662855148,,,,,, +48,165599,,,,,,,,,,,,0.07391077280044556,,,,,, +48,165649,,,,,,,,,,,,0.06970546394586563,,,,,, +48,165699,,,,,,,,,,,,0.06384864449501038,,,,,, +48,165749,,,,,,,,,,,,0.05664036422967911,,,,,, +48,165799,,,,,,,,,,,,0.06096934154629707,,,,,, +48,165849,,,,,,,,,,,,0.05942678451538086,,,,,, +48,165899,,,,,,,,,,,,0.07354167103767395,,,,,, +48,165949,,,,,,,,,,,,0.06667560338973999,,,,,, +48,165999,,,,,,,,,,,,0.07236543297767639,,,,,, +48,166049,,,,,,,,,,,,0.06124165281653404,,,,,, +48,166099,,,,,,,,,,,,0.07794783264398575,,,,,, +48,166149,,,,,,,,,,,,0.07514718174934387,,,,,, +48,166199,,,,,,,,,,,,0.07315939664840698,,,,,, +48,166249,,,,,,,,,,,,0.060331229120492935,,,,,, +48,166299,,,,,,,,,,,,0.06746641546487808,,,,,, +48,166349,,,,,,,,,,,,0.07298131287097931,,,,,, +48,166399,,,,,,,,,,,,0.07040270417928696,,,,,, +48,166449,,,,,,,,,,,,0.06057208776473999,,,,,, +48,166499,,,,,,,,,,,,0.06684377789497375,,,,,, +48,166549,,,,,,,,,,,,0.07042782008647919,,,,,, +48,166599,,,,,,,,,,,,0.07399621605873108,,,,,, +48,166649,,,,,,,,,,,,0.07168620079755783,,,,,, +48,166699,,,,,,,,,,,,0.06851877272129059,,,,,, +48,166749,,,,,,,,,,,,0.08115407824516296,,,,,, +48,166799,,,,,,,,,,,,0.06576845049858093,,,,,, +48,166849,,,,,,,,,,,,0.06820119917392731,,,,,, +48,166899,,,,,,,,,,,,0.062178052961826324,,,,,, +48,166949,,,,,,,,,,,,0.05665087699890137,,,,,, +48,166999,,,,,,,,,,,,0.06276167929172516,,,,,, +48,167049,,,,,,,,,,,,0.06982995569705963,,,,,, +48,167099,,,,,,,,,,,,0.06742902100086212,,,,,, +48,167149,,,,,,,,,,,,0.07614830136299133,,,,,, +48,167199,,,,,,,,,,,,0.06078812852501869,,,,,, +48,167249,,,,,,,,,,,,0.06565897911787033,,,,,, +48,167299,,,,,,,,,,,,0.060198523104190826,,,,,, +48,167349,,,,,,,,,,,,0.07010549306869507,,,,,, +48,167399,,,,,,,,,,,,0.07476264983415604,,,,,, +48,167449,,,,,,,,,,,,0.07077041268348694,,,,,, +48,167499,,,,,,,,,,,,0.0690639466047287,,,,,, +48,167549,,,,,,,,,,,,0.061084963381290436,,,,,, +48,167599,,,,,,,,,,,,0.0677749365568161,,,,,, +48,167649,,,,,,,,,,,,0.07520672678947449,,,,,, +48,167699,,,,,,,,,,,,0.06906010955572128,,,,,, +48,167749,,,,,,,,,,,,0.058919697999954224,,,,,, +48,167799,,,,,,,,,,,,0.06124332174658775,,,,,, +48,167849,,,,,,,,,,,,0.06994783878326416,,,,,, +48,167899,,,,,,,,,,,,0.07072404026985168,,,,,, +48,167949,,,,,,,,,,,,0.07382889091968536,,,,,, +48,167999,,,,,,,,,,,,0.0571594312787056,,,,,, +48,168049,,,,,,,,,,,,0.060664769262075424,,,,,, +48,168099,,,,,,,,,,,,0.05991749465465546,,,,,, +48,168149,,,,,,,,,,,,0.07461710274219513,,,,,, +48,168199,,,,,,,,,,,,0.06607189029455185,,,,,, +48,168249,,,,,,,,,,,,0.07187187671661377,,,,,, +48,168299,,,,,,,,,,,,0.07294011116027832,,,,,, +48,168349,,,,,,,,,,,,0.06851823627948761,,,,,, +48,168399,,,,,,,,,,,,0.07371129840612411,,,,,, +48,168449,,,,,,,,,,,,0.06407617032527924,,,,,, +48,168499,,,,,,,,,,,,0.06295758485794067,,,,,, +48,168549,,,,,,,,,,,,0.0783577412366867,,,,,, +48,168599,,,,,,,,,,,,0.0614381805062294,,,,,, +48,168649,,,,,,,,,,,,0.0637831836938858,,,,,, +48,168657,,,,,,,,,,,,,0.22666026651859283,0.07518842816352844,0.394314706325531,0.09520703554153442,0.39134207367897034,0.07518842816352844 +48,168657,,,,,,,0.2184695303440094,0.06749798357486725,0.4289211332798004,0.18397736549377441,0.4060070812702179,,,,,,, +49,168699,,,,,,,,,,,,0.07600831985473633,,,,,, +49,168749,,,,,,,,,,,,0.06698043644428253,,,,,, +49,168799,,,,,,,,,,,,0.06786467134952545,,,,,, +49,168849,,,,,,,,,,,,0.06847141683101654,,,,,, +49,168899,,,,,,,,,,,,0.05603288114070892,,,,,, +49,168949,,,,,,,,,,,,0.07043661177158356,,,,,, +49,168999,,,,,,,,,,,,0.07240637391805649,,,,,, +49,169049,,,,,,,,,,,,0.061502858996391296,,,,,, +49,169099,,,,,,,,,,,,0.05384059250354767,,,,,, +49,169149,,,,,,,,,,,,0.06133371219038963,,,,,, +49,169199,,,,,,,,,,,,0.07558295130729675,,,,,, +49,169249,,,,,,,,,,,,0.06335991621017456,,,,,, +49,169299,,,,,,,,,,,,0.07607325911521912,,,,,, +49,169349,,,,,,,,,,,,0.06522554159164429,,,,,, +49,169399,,,,,,,,,,,,0.0693955048918724,,,,,, +49,169449,,,,,,,,,,,,0.06105504557490349,,,,,, +49,169499,,,,,,,,,,,,0.07665818929672241,,,,,, +49,169549,,,,,,,,,,,,0.07385414838790894,,,,,, +49,169599,,,,,,,,,,,,0.06463151425123215,,,,,, +49,169649,,,,,,,,,,,,0.06189967691898346,,,,,, +49,169699,,,,,,,,,,,,0.06440494954586029,,,,,, +49,169749,,,,,,,,,,,,0.05924268439412117,,,,,, +49,169799,,,,,,,,,,,,0.06073074787855148,,,,,, +49,169849,,,,,,,,,,,,0.07233422994613647,,,,,, +49,169899,,,,,,,,,,,,0.0704229325056076,,,,,, +49,169949,,,,,,,,,,,,0.06405994296073914,,,,,, +49,169999,,,,,,,,,,,,0.06889085471630096,,,,,, +49,170049,,,,,,,,,,,,0.07241538166999817,,,,,, +49,170099,,,,,,,,,,,,0.07327708601951599,,,,,, +49,170149,,,,,,,,,,,,0.06307294964790344,,,,,, +49,170199,,,,,,,,,,,,0.06870105862617493,,,,,, +49,170249,,,,,,,,,,,,0.06066707521677017,,,,,, +49,170299,,,,,,,,,,,,0.06707119196653366,,,,,, +49,170349,,,,,,,,,,,,0.05981297045946121,,,,,, +49,170399,,,,,,,,,,,,0.07523620128631592,,,,,, +49,170449,,,,,,,,,,,,0.07383211702108383,,,,,, +49,170499,,,,,,,,,,,,0.07347586005926132,,,,,, +49,170549,,,,,,,,,,,,0.0548873133957386,,,,,, +49,170599,,,,,,,,,,,,0.06545946002006531,,,,,, +49,170649,,,,,,,,,,,,0.07316172122955322,,,,,, +49,170699,,,,,,,,,,,,0.06950084120035172,,,,,, +49,170749,,,,,,,,,,,,0.06079498305916786,,,,,, +49,170799,,,,,,,,,,,,0.07323086261749268,,,,,, +49,170849,,,,,,,,,,,,0.06989971548318863,,,,,, +49,170899,,,,,,,,,,,,0.07737220823764801,,,,,, +49,170949,,,,,,,,,,,,0.08403566479682922,,,,,, +49,170999,,,,,,,,,,,,0.07587738335132599,,,,,, +49,171049,,,,,,,,,,,,0.06446590274572372,,,,,, +49,171099,,,,,,,,,,,,0.06733240187168121,,,,,, +49,171149,,,,,,,,,,,,0.07000607997179031,,,,,, +49,171199,,,,,,,,,,,,0.07103917002677917,,,,,, +49,171249,,,,,,,,,,,,0.07045616209506989,,,,,, +49,171299,,,,,,,,,,,,0.060537371784448624,,,,,, +49,171349,,,,,,,,,,,,0.07343657314777374,,,,,, +49,171399,,,,,,,,,,,,0.06194237992167473,,,,,, +49,171449,,,,,,,,,,,,0.07195405662059784,,,,,, +49,171499,,,,,,,,,,,,0.08388156443834305,,,,,, +49,171549,,,,,,,,,,,,0.07476718723773956,,,,,, +49,171599,,,,,,,,,,,,0.07092790305614471,,,,,, +49,171649,,,,,,,,,,,,0.06169964373111725,,,,,, +49,171699,,,,,,,,,,,,0.06987935304641724,,,,,, +49,171749,,,,,,,,,,,,0.06275437027215958,,,,,, +49,171799,,,,,,,,,,,,0.06483235955238342,,,,,, +49,171849,,,,,,,,,,,,0.06286706030368805,,,,,, +49,171899,,,,,,,,,,,,0.0639042854309082,,,,,, +49,171949,,,,,,,,,,,,0.06392644345760345,,,,,, +49,171999,,,,,,,,,,,,0.07725564390420914,,,,,, +49,172049,,,,,,,,,,,,0.05747826397418976,,,,,, +49,172099,,,,,,,,,,,,0.06977823376655579,,,,,, +49,172099,,,,,,,,,,,,,0.22659693658351898,0.07527610659599304,0.39469781517982483,0.09415191411972046,0.39109542965888977,0.07527610659599304 +49,172099,,,,,,,0.2185904085636139,0.0675191730260849,0.4286247491836548,0.1837204098701477,0.4057532846927643,,,,,,, +50,172100,0.22761252522468567,0.07245638966560364,0.35964441299438477,0.12868690490722656,0.3501887321472168,0.07245638966560364,,,,,,,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..666dae51bbb1e1b2b32511dff81bd8f0d97e9aff --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml @@ -0,0 +1,22 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: sweetnet + num_layers: 16 + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan +seed: 44 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..26b94edf99a94c52468b54f2be21136187fd2e55 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv @@ -0,0 +1,3544 @@ +epoch,step,test/MeanAbsoluteError,test/MeanSquaredError,test/PearsonCorrCoef,test/R2Score,test/SpearmanCorrCoef,test/loss,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +0,49,,,,,,,,,,,,0.09742800891399384,,,,,, +0,99,,,,,,,,,,,,0.10069280117750168,,,,,, +0,149,,,,,,,,,,,,0.09997907280921936,,,,,, +0,199,,,,,,,,,,,,0.08177491277456284,,,,,, +0,249,,,,,,,,,,,,0.09516751766204834,,,,,, +0,299,,,,,,,,,,,,0.08757278323173523,,,,,, +0,349,,,,,,,,,,,,0.09959907084703445,,,,,, +0,399,,,,,,,,,,,,0.09493175148963928,,,,,, +0,449,,,,,,,,,,,,0.072211354970932,,,,,, +0,499,,,,,,,,,,,,0.08468799293041229,,,,,, +0,549,,,,,,,,,,,,0.07812532037496567,,,,,, +0,599,,,,,,,,,,,,0.09510166198015213,,,,,, +0,649,,,,,,,,,,,,0.08878211677074432,,,,,, +0,699,,,,,,,,,,,,0.08241577446460724,,,,,, +0,749,,,,,,,,,,,,0.09146475791931152,,,,,, +0,799,,,,,,,,,,,,0.09217553585767746,,,,,, +0,849,,,,,,,,,,,,0.0890561044216156,,,,,, +0,899,,,,,,,,,,,,0.09346282482147217,,,,,, +0,949,,,,,,,,,,,,0.08327062427997589,,,,,, +0,999,,,,,,,,,,,,0.08923318982124329,,,,,, +0,1049,,,,,,,,,,,,0.09220544993877411,,,,,, +0,1099,,,,,,,,,,,,0.0791657567024231,,,,,, +0,1149,,,,,,,,,,,,0.08057752251625061,,,,,, +0,1199,,,,,,,,,,,,0.08688496798276901,,,,,, +0,1249,,,,,,,,,,,,0.08232899010181427,,,,,, +0,1299,,,,,,,,,,,,0.08524394035339355,,,,,, +0,1349,,,,,,,,,,,,0.09086813032627106,,,,,, +0,1399,,,,,,,,,,,,0.08316050469875336,,,,,, +0,1449,,,,,,,,,,,,0.08983786404132843,,,,,, +0,1499,,,,,,,,,,,,0.08426633477210999,,,,,, +0,1549,,,,,,,,,,,,0.08851567655801773,,,,,, +0,1599,,,,,,,,,,,,0.0791238397359848,,,,,, +0,1649,,,,,,,,,,,,0.09178434312343597,,,,,, +0,1699,,,,,,,,,,,,0.09489509463310242,,,,,, +0,1749,,,,,,,,,,,,0.07198341190814972,,,,,, +0,1799,,,,,,,,,,,,0.07896655797958374,,,,,, +0,1849,,,,,,,,,,,,0.08676332235336304,,,,,, +0,1899,,,,,,,,,,,,0.08336548507213593,,,,,, +0,1949,,,,,,,,,,,,0.07501517981290817,,,,,, +0,1999,,,,,,,,,,,,0.07047974318265915,,,,,, +0,2049,,,,,,,,,,,,0.09175753593444824,,,,,, +0,2099,,,,,,,,,,,,0.08614633977413177,,,,,, +0,2149,,,,,,,,,,,,0.08577051758766174,,,,,, +0,2199,,,,,,,,,,,,0.0858275294303894,,,,,, +0,2249,,,,,,,,,,,,0.0721186026930809,,,,,, +0,2299,,,,,,,,,,,,0.08794872462749481,,,,,, +0,2349,,,,,,,,,,,,0.09010833501815796,,,,,, +0,2399,,,,,,,,,,,,0.06834615767002106,,,,,, +0,2449,,,,,,,,,,,,0.08012925833463669,,,,,, +0,2499,,,,,,,,,,,,0.07959728688001633,,,,,, +0,2549,,,,,,,,,,,,0.06766760349273682,,,,,, +0,2599,,,,,,,,,,,,0.08512454479932785,,,,,, +0,2649,,,,,,,,,,,,0.09302660822868347,,,,,, +0,2699,,,,,,,,,,,,0.08528211712837219,,,,,, +0,2749,,,,,,,,,,,,0.19402587413787842,,,,,, +0,2799,,,,,,,,,,,,0.1024184376001358,,,,,, +0,2849,,,,,,,,,,,,0.08461757004261017,,,,,, +0,2899,,,,,,,,,,,,0.08100751787424088,,,,,, +0,2949,,,,,,,,,,,,0.09579691290855408,,,,,, +0,2999,,,,,,,,,,,,0.07974272221326828,,,,,, +0,3049,,,,,,,,,,,,0.09035200625658035,,,,,, +0,3099,,,,,,,,,,,,0.07916420698165894,,,,,, +0,3149,,,,,,,,,,,,0.0928637757897377,,,,,, +0,3199,,,,,,,,,,,,0.07470914721488953,,,,,, +0,3249,,,,,,,,,,,,0.08472326397895813,,,,,, +0,3299,,,,,,,,,,,,0.09162700176239014,,,,,, +0,3349,,,,,,,,,,,,0.08241278678178787,,,,,, +0,3399,,,,,,,,,,,,0.07784746587276459,,,,,, +0,3441,,,,,,,,,,,,,0.2509925365447998,0.08471692353487015,nan,-0.019455790519714355,0.035905349999666214,0.08471692353487015 +0,3441,,,,,,,0.25104615092277527,0.08738832175731659,0.04597335308790207,-0.05649232864379883,0.05642620101571083,,,,,,, +1,3449,,,,,,,,,,,,0.06804752349853516,,,,,, +1,3499,,,,,,,,,,,,0.08296491205692291,,,,,, +1,3549,,,,,,,,,,,,0.07538803666830063,,,,,, +1,3599,,,,,,,,,,,,0.07226602733135223,,,,,, +1,3649,,,,,,,,,,,,0.0891413539648056,,,,,, +1,3699,,,,,,,,,,,,0.08716275542974472,,,,,, +1,3749,,,,,,,,,,,,0.08011119812726974,,,,,, +1,3799,,,,,,,,,,,,0.09705890715122223,,,,,, +1,3849,,,,,,,,,,,,0.08693769574165344,,,,,, +1,3899,,,,,,,,,,,,0.08014889061450958,,,,,, +1,3949,,,,,,,,,,,,0.08280105888843536,,,,,, +1,3999,,,,,,,,,,,,0.08897554874420166,,,,,, +1,4049,,,,,,,,,,,,0.08597864210605621,,,,,, +1,4099,,,,,,,,,,,,0.08045023679733276,,,,,, +1,4149,,,,,,,,,,,,0.08490598946809769,,,,,, +1,4199,,,,,,,,,,,,0.08660689741373062,,,,,, +1,4249,,,,,,,,,,,,0.09969956427812576,,,,,, +1,4299,,,,,,,,,,,,0.0836838036775589,,,,,, +1,4349,,,,,,,,,,,,0.07537635415792465,,,,,, +1,4399,,,,,,,,,,,,0.07458683848381042,,,,,, +1,4449,,,,,,,,,,,,0.09062500298023224,,,,,, +1,4499,,,,,,,,,,,,0.07739385962486267,,,,,, +1,4549,,,,,,,,,,,,0.09243407100439072,,,,,, +1,4599,,,,,,,,,,,,0.07244892418384552,,,,,, +1,4649,,,,,,,,,,,,0.08693613111972809,,,,,, +1,4699,,,,,,,,,,,,0.0700821653008461,,,,,, +1,4749,,,,,,,,,,,,0.0811421275138855,,,,,, +1,4799,,,,,,,,,,,,0.07070508599281311,,,,,, +1,4849,,,,,,,,,,,,0.07351383566856384,,,,,, +1,4899,,,,,,,,,,,,0.0835108533501625,,,,,, +1,4949,,,,,,,,,,,,0.08245845139026642,,,,,, +1,4999,,,,,,,,,,,,0.08658082783222198,,,,,, +1,5049,,,,,,,,,,,,0.08538947999477386,,,,,, +1,5099,,,,,,,,,,,,0.07493125647306442,,,,,, +1,5149,,,,,,,,,,,,0.07926096022129059,,,,,, +1,5199,,,,,,,,,,,,0.08489076793193817,,,,,, +1,5249,,,,,,,,,,,,0.08341588079929352,,,,,, +1,5299,,,,,,,,,,,,0.08573968708515167,,,,,, +1,5349,,,,,,,,,,,,0.08528344333171844,,,,,, +1,5399,,,,,,,,,,,,0.07317608594894409,,,,,, +1,5449,,,,,,,,,,,,0.07910124957561493,,,,,, +1,5499,,,,,,,,,,,,0.09165146946907043,,,,,, +1,5549,,,,,,,,,,,,0.08136782050132751,,,,,, +1,5599,,,,,,,,,,,,0.0865827202796936,,,,,, +1,5649,,,,,,,,,,,,0.0818830132484436,,,,,, +1,5699,,,,,,,,,,,,0.09211357682943344,,,,,, +1,5749,,,,,,,,,,,,0.08970993757247925,,,,,, +1,5799,,,,,,,,,,,,0.08432506769895554,,,,,, +1,5849,,,,,,,,,,,,0.07937248051166534,,,,,, +1,5899,,,,,,,,,,,,0.08094403892755508,,,,,, +1,5949,,,,,,,,,,,,0.08112114667892456,,,,,, +1,5999,,,,,,,,,,,,0.08564768731594086,,,,,, +1,6049,,,,,,,,,,,,0.07239371538162231,,,,,, +1,6099,,,,,,,,,,,,0.07919709384441376,,,,,, +1,6149,,,,,,,,,,,,0.08651664853096008,,,,,, +1,6199,,,,,,,,,,,,0.09135442972183228,,,,,, +1,6249,,,,,,,,,,,,0.08995343744754791,,,,,, +1,6299,,,,,,,,,,,,0.08932102471590042,,,,,, +1,6349,,,,,,,,,,,,0.08096086978912354,,,,,, +1,6399,,,,,,,,,,,,0.07590176165103912,,,,,, +1,6449,,,,,,,,,,,,0.079082190990448,,,,,, +1,6499,,,,,,,,,,,,0.08114876598119736,,,,,, +1,6549,,,,,,,,,,,,0.09513980895280838,,,,,, +1,6599,,,,,,,,,,,,0.09088152647018433,,,,,, +1,6649,,,,,,,,,,,,0.08505745232105255,,,,,, +1,6699,,,,,,,,,,,,0.08276387304067612,,,,,, +1,6749,,,,,,,,,,,,0.08362889289855957,,,,,, +1,6799,,,,,,,,,,,,0.08468250930309296,,,,,, +1,6849,,,,,,,,,,,,0.09158822894096375,,,,,, +1,6883,,,,,,,,,,,,,0.2500186264514923,0.08345652371644974,nan,-0.0042885541915893555,0.017132176086306572,0.08345652371644974 +1,6883,,,,,,,0.2490471750497818,0.0830753967165947,0.0048471856862306595,-0.004364132881164551,0.0029698177240788937,,,,,,, +2,6899,,,,,,,,,,,,0.09189164638519287,,,,,, +2,6949,,,,,,,,,,,,0.08978696167469025,,,,,, +2,6999,,,,,,,,,,,,0.07488403469324112,,,,,, +2,7049,,,,,,,,,,,,0.09564532339572906,,,,,, +2,7099,,,,,,,,,,,,0.08596622198820114,,,,,, +2,7149,,,,,,,,,,,,0.07792887091636658,,,,,, +2,7199,,,,,,,,,,,,0.08535666763782501,,,,,, +2,7249,,,,,,,,,,,,0.08322253823280334,,,,,, +2,7299,,,,,,,,,,,,0.07781079411506653,,,,,, +2,7349,,,,,,,,,,,,0.07503372430801392,,,,,, +2,7399,,,,,,,,,,,,0.09070655703544617,,,,,, +2,7449,,,,,,,,,,,,0.0728348046541214,,,,,, +2,7499,,,,,,,,,,,,0.07875882834196091,,,,,, +2,7549,,,,,,,,,,,,0.08973988890647888,,,,,, +2,7599,,,,,,,,,,,,0.08062677085399628,,,,,, +2,7649,,,,,,,,,,,,0.08321333676576614,,,,,, +2,7699,,,,,,,,,,,,0.08695409446954727,,,,,, +2,7749,,,,,,,,,,,,0.07113736867904663,,,,,, +2,7799,,,,,,,,,,,,0.0716671496629715,,,,,, +2,7849,,,,,,,,,,,,0.0865127295255661,,,,,, +2,7899,,,,,,,,,,,,0.08372718095779419,,,,,, +2,7949,,,,,,,,,,,,0.08719662576913834,,,,,, +2,7999,,,,,,,,,,,,0.08385026454925537,,,,,, +2,8049,,,,,,,,,,,,0.09478878974914551,,,,,, +2,8099,,,,,,,,,,,,0.08064760267734528,,,,,, +2,8149,,,,,,,,,,,,0.07806122303009033,,,,,, +2,8199,,,,,,,,,,,,0.08778255432844162,,,,,, +2,8249,,,,,,,,,,,,0.08832110464572906,,,,,, +2,8299,,,,,,,,,,,,0.07803600281476974,,,,,, +2,8349,,,,,,,,,,,,0.0866641104221344,,,,,, +2,8399,,,,,,,,,,,,0.08483613282442093,,,,,, +2,8449,,,,,,,,,,,,0.08068475127220154,,,,,, +2,8499,,,,,,,,,,,,0.10483210533857346,,,,,, +2,8549,,,,,,,,,,,,0.08190556615591049,,,,,, +2,8599,,,,,,,,,,,,0.09234562516212463,,,,,, +2,8649,,,,,,,,,,,,0.08162358403205872,,,,,, +2,8699,,,,,,,,,,,,0.07396674156188965,,,,,, +2,8749,,,,,,,,,,,,0.0924791693687439,,,,,, +2,8799,,,,,,,,,,,,0.07498173415660858,,,,,, +2,8849,,,,,,,,,,,,0.08096187561750412,,,,,, +2,8899,,,,,,,,,,,,0.09155914187431335,,,,,, +2,8949,,,,,,,,,,,,0.08047504723072052,,,,,, +2,8999,,,,,,,,,,,,0.09748280048370361,,,,,, +2,9049,,,,,,,,,,,,0.08634220063686371,,,,,, +2,9099,,,,,,,,,,,,0.07189741730690002,,,,,, +2,9149,,,,,,,,,,,,0.07980748265981674,,,,,, +2,9199,,,,,,,,,,,,0.081767737865448,,,,,, +2,9249,,,,,,,,,,,,0.07691667973995209,,,,,, +2,9299,,,,,,,,,,,,0.07987390458583832,,,,,, +2,9349,,,,,,,,,,,,0.07445370405912399,,,,,, +2,9399,,,,,,,,,,,,0.08258619904518127,,,,,, +2,9449,,,,,,,,,,,,0.08151912689208984,,,,,, +2,9499,,,,,,,,,,,,0.07173870503902435,,,,,, +2,9549,,,,,,,,,,,,0.08844052255153656,,,,,, +2,9599,,,,,,,,,,,,0.06838800013065338,,,,,, +2,9649,,,,,,,,,,,,0.08820302784442902,,,,,, +2,9699,,,,,,,,,,,,0.08647899329662323,,,,,, +2,9749,,,,,,,,,,,,0.07521244138479233,,,,,, +2,9799,,,,,,,,,,,,0.08723531663417816,,,,,, +2,9849,,,,,,,,,,,,0.08348701894283295,,,,,, +2,9899,,,,,,,,,,,,0.08698497712612152,,,,,, +2,9949,,,,,,,,,,,,0.08495467156171799,,,,,, +2,9999,,,,,,,,,,,,0.08389202505350113,,,,,, +2,10049,,,,,,,,,,,,0.08425945043563843,,,,,, +2,10099,,,,,,,,,,,,0.09457863867282867,,,,,, +2,10149,,,,,,,,,,,,0.07243537902832031,,,,,, +2,10199,,,,,,,,,,,,0.07779771834611893,,,,,, +2,10249,,,,,,,,,,,,0.08158592879772186,,,,,, +2,10299,,,,,,,,,,,,0.08474303781986237,,,,,, +2,10325,,,,,,,,,,,,,0.24603037536144257,0.08191859722137451,0.2071218192577362,0.014218389987945557,0.20372895896434784,0.08191859722137451 +2,10325,,,,,,,0.24847620725631714,0.08280746638774872,0.04205724969506264,-0.001107931137084961,0.04229430481791496,,,,,,, +3,10349,,,,,,,,,,,,0.08303811401128769,,,,,, +3,10399,,,,,,,,,,,,0.07932599633932114,,,,,, +3,10449,,,,,,,,,,,,0.08311876654624939,,,,,, +3,10499,,,,,,,,,,,,0.08637535572052002,,,,,, +3,10549,,,,,,,,,,,,0.11571486294269562,,,,,, +3,10599,,,,,,,,,,,,0.09006628394126892,,,,,, +3,10649,,,,,,,,,,,,0.08105382323265076,,,,,, +3,10699,,,,,,,,,,,,0.08694811165332794,,,,,, +3,10749,,,,,,,,,,,,0.08775228261947632,,,,,, +3,10799,,,,,,,,,,,,0.07396373897790909,,,,,, +3,10849,,,,,,,,,,,,0.06457160413265228,,,,,, +3,10899,,,,,,,,,,,,0.08533380180597305,,,,,, +3,10949,,,,,,,,,,,,0.08126611262559891,,,,,, +3,10999,,,,,,,,,,,,0.07648071646690369,,,,,, +3,11049,,,,,,,,,,,,0.08400370180606842,,,,,, +3,11099,,,,,,,,,,,,0.08404435962438583,,,,,, +3,11149,,,,,,,,,,,,0.07557368278503418,,,,,, +3,11199,,,,,,,,,,,,0.0714845210313797,,,,,, +3,11249,,,,,,,,,,,,0.0832151547074318,,,,,, +3,11299,,,,,,,,,,,,0.0860835462808609,,,,,, +3,11349,,,,,,,,,,,,0.07759351283311844,,,,,, +3,11399,,,,,,,,,,,,0.08691291511058807,,,,,, +3,11449,,,,,,,,,,,,0.10008957982063293,,,,,, +3,11499,,,,,,,,,,,,0.08337344229221344,,,,,, +3,11549,,,,,,,,,,,,0.08993566036224365,,,,,, +3,11599,,,,,,,,,,,,0.08443648368120193,,,,,, +3,11649,,,,,,,,,,,,0.08732809126377106,,,,,, +3,11699,,,,,,,,,,,,0.07133603096008301,,,,,, +3,11749,,,,,,,,,,,,0.08221110701560974,,,,,, +3,11799,,,,,,,,,,,,0.08024139702320099,,,,,, +3,11849,,,,,,,,,,,,0.08199597895145416,,,,,, +3,11899,,,,,,,,,,,,0.07918046414852142,,,,,, +3,11949,,,,,,,,,,,,0.07970505952835083,,,,,, +3,11999,,,,,,,,,,,,0.07481445372104645,,,,,, +3,12049,,,,,,,,,,,,0.09336212277412415,,,,,, +3,12099,,,,,,,,,,,,0.06900416314601898,,,,,, +3,12149,,,,,,,,,,,,0.08513416349887848,,,,,, +3,12199,,,,,,,,,,,,0.09346720576286316,,,,,, +3,12249,,,,,,,,,,,,0.07631173729896545,,,,,, +3,12299,,,,,,,,,,,,0.08745457231998444,,,,,, +3,12349,,,,,,,,,,,,0.08228357881307602,,,,,, +3,12399,,,,,,,,,,,,0.07884334027767181,,,,,, +3,12449,,,,,,,,,,,,0.08237795531749725,,,,,, +3,12499,,,,,,,,,,,,0.08302468061447144,,,,,, +3,12549,,,,,,,,,,,,0.08706675469875336,,,,,, +3,12599,,,,,,,,,,,,0.07890379428863525,,,,,, +3,12649,,,,,,,,,,,,0.07291950285434723,,,,,, +3,12699,,,,,,,,,,,,0.08612556755542755,,,,,, +3,12749,,,,,,,,,,,,0.0679023414850235,,,,,, +3,12799,,,,,,,,,,,,0.08118833601474762,,,,,, +3,12849,,,,,,,,,,,,0.06640376150608063,,,,,, +3,12899,,,,,,,,,,,,0.08605095744132996,,,,,, +3,12949,,,,,,,,,,,,0.08716373145580292,,,,,, +3,12999,,,,,,,,,,,,0.07309140264987946,,,,,, +3,13049,,,,,,,,,,,,0.07581306248903275,,,,,, +3,13099,,,,,,,,,,,,0.0877300500869751,,,,,, +3,13149,,,,,,,,,,,,0.08843807131052017,,,,,, +3,13199,,,,,,,,,,,,0.08443601429462433,,,,,, +3,13249,,,,,,,,,,,,0.07955397665500641,,,,,, +3,13299,,,,,,,,,,,,0.07494047284126282,,,,,, +3,13349,,,,,,,,,,,,0.07744155824184418,,,,,, +3,13399,,,,,,,,,,,,0.09804055839776993,,,,,, +3,13449,,,,,,,,,,,,0.08690889179706573,,,,,, +3,13499,,,,,,,,,,,,0.07629422843456268,,,,,, +3,13549,,,,,,,,,,,,0.08135983347892761,,,,,, +3,13599,,,,,,,,,,,,0.08417725563049316,,,,,, +3,13649,,,,,,,,,,,,0.08050122857093811,,,,,, +3,13699,,,,,,,,,,,,0.08317715674638748,,,,,, +3,13749,,,,,,,,,,,,0.07874897867441177,,,,,, +3,13767,,,,,,,,,,,,,0.24399878084659576,0.0802842229604721,0.19477441906929016,0.033885955810546875,0.2100536823272705,0.0802842229604721 +3,13767,,,,,,,0.24585439264774323,0.08141327649354935,0.12780563533306122,0.01575016975402832,0.11719400435686111,,,,,,, +4,13799,,,,,,,,,,,,0.07675811648368835,,,,,, +4,13849,,,,,,,,,,,,0.06807682663202286,,,,,, +4,13899,,,,,,,,,,,,0.08412441611289978,,,,,, +4,13949,,,,,,,,,,,,0.07946161925792694,,,,,, +4,13999,,,,,,,,,,,,0.0789819061756134,,,,,, +4,14049,,,,,,,,,,,,0.07687881588935852,,,,,, +4,14099,,,,,,,,,,,,0.06291314959526062,,,,,, +4,14149,,,,,,,,,,,,0.08639408648014069,,,,,, +4,14199,,,,,,,,,,,,0.079231396317482,,,,,, +4,14249,,,,,,,,,,,,0.07666225731372833,,,,,, +4,14299,,,,,,,,,,,,0.09179572761058807,,,,,, +4,14349,,,,,,,,,,,,0.07791668176651001,,,,,, +4,14399,,,,,,,,,,,,0.09152831137180328,,,,,, +4,14449,,,,,,,,,,,,0.08220507204532623,,,,,, +4,14499,,,,,,,,,,,,0.07405427098274231,,,,,, +4,14549,,,,,,,,,,,,0.07829976826906204,,,,,, +4,14599,,,,,,,,,,,,0.08104930818080902,,,,,, +4,14649,,,,,,,,,,,,0.08641165494918823,,,,,, +4,14699,,,,,,,,,,,,0.08194445073604584,,,,,, +4,14749,,,,,,,,,,,,0.07546015083789825,,,,,, +4,14799,,,,,,,,,,,,0.07375292479991913,,,,,, +4,14849,,,,,,,,,,,,0.080858513712883,,,,,, +4,14899,,,,,,,,,,,,0.07526446133852005,,,,,, +4,14949,,,,,,,,,,,,0.09391593933105469,,,,,, +4,14999,,,,,,,,,,,,0.07338597625494003,,,,,, +4,15049,,,,,,,,,,,,0.08247441798448563,,,,,, +4,15099,,,,,,,,,,,,0.08116582036018372,,,,,, +4,15149,,,,,,,,,,,,0.10081864893436432,,,,,, +4,15199,,,,,,,,,,,,0.08646777272224426,,,,,, +4,15249,,,,,,,,,,,,0.08546511828899384,,,,,, +4,15299,,,,,,,,,,,,0.07873073220252991,,,,,, +4,15349,,,,,,,,,,,,0.08674602210521698,,,,,, +4,15399,,,,,,,,,,,,0.08208402991294861,,,,,, +4,15449,,,,,,,,,,,,0.08627991378307343,,,,,, +4,15499,,,,,,,,,,,,0.07430855184793472,,,,,, +4,15549,,,,,,,,,,,,0.07058315724134445,,,,,, +4,15599,,,,,,,,,,,,0.08319427073001862,,,,,, +4,15649,,,,,,,,,,,,0.0770469605922699,,,,,, +4,15699,,,,,,,,,,,,0.0832493007183075,,,,,, +4,15749,,,,,,,,,,,,0.0791744589805603,,,,,, +4,15799,,,,,,,,,,,,0.08716143667697906,,,,,, +4,15849,,,,,,,,,,,,0.08746041357517242,,,,,, +4,15899,,,,,,,,,,,,0.0826416090130806,,,,,, +4,15949,,,,,,,,,,,,0.09309583157300949,,,,,, +4,15999,,,,,,,,,,,,0.08689143508672714,,,,,, +4,16049,,,,,,,,,,,,0.10332585871219635,,,,,, +4,16099,,,,,,,,,,,,0.08088095486164093,,,,,, +4,16149,,,,,,,,,,,,0.07735739648342133,,,,,, +4,16199,,,,,,,,,,,,0.07578054070472717,,,,,, +4,16249,,,,,,,,,,,,0.09373857080936432,,,,,, +4,16299,,,,,,,,,,,,0.08277563750743866,,,,,, +4,16349,,,,,,,,,,,,0.08657881617546082,,,,,, +4,16399,,,,,,,,,,,,0.09136860817670822,,,,,, +4,16449,,,,,,,,,,,,0.07913514971733093,,,,,, +4,16499,,,,,,,,,,,,0.0739419162273407,,,,,, +4,16549,,,,,,,,,,,,0.08023548126220703,,,,,, +4,16599,,,,,,,,,,,,0.08715145289897919,,,,,, +4,16649,,,,,,,,,,,,0.07247753441333771,,,,,, +4,16699,,,,,,,,,,,,0.07180401682853699,,,,,, +4,16749,,,,,,,,,,,,0.08027492463588715,,,,,, +4,16799,,,,,,,,,,,,0.08021581172943115,,,,,, +4,16849,,,,,,,,,,,,0.07595142722129822,,,,,, +4,16899,,,,,,,,,,,,0.0677218809723854,,,,,, +4,16949,,,,,,,,,,,,0.08650214970111847,,,,,, +4,16999,,,,,,,,,,,,0.0893322229385376,,,,,, +4,17049,,,,,,,,,,,,0.07653948664665222,,,,,, +4,17099,,,,,,,,,,,,0.06559190899133682,,,,,, +4,17149,,,,,,,,,,,,0.07970037311315536,,,,,, +4,17199,,,,,,,,,,,,0.07975403964519501,,,,,, +4,17209,,,,,,,,,,,,,0.24351762235164642,0.08077926188707352,0.17896851897239685,0.02792876958847046,0.1897115707397461,0.08077926188707352 +4,17209,,,,,,,0.24540996551513672,0.08116227388381958,0.1387072056531906,0.018777132034301758,0.12188955396413803,,,,,,, +5,17249,,,,,,,,,,,,0.09195836633443832,,,,,, +5,17299,,,,,,,,,,,,0.07643218338489532,,,,,, +5,17349,,,,,,,,,,,,0.07593429088592529,,,,,, +5,17399,,,,,,,,,,,,0.0867995023727417,,,,,, +5,17449,,,,,,,,,,,,0.07824674248695374,,,,,, +5,17499,,,,,,,,,,,,0.07798212766647339,,,,,, +5,17549,,,,,,,,,,,,0.07990728318691254,,,,,, +5,17599,,,,,,,,,,,,0.07951401174068451,,,,,, +5,17649,,,,,,,,,,,,0.0819883644580841,,,,,, +5,17699,,,,,,,,,,,,0.07593555748462677,,,,,, +5,17749,,,,,,,,,,,,0.0795455276966095,,,,,, +5,17799,,,,,,,,,,,,0.0810345932841301,,,,,, +5,17849,,,,,,,,,,,,0.07840822637081146,,,,,, +5,17899,,,,,,,,,,,,0.08203192055225372,,,,,, +5,17949,,,,,,,,,,,,0.07785288989543915,,,,,, +5,17999,,,,,,,,,,,,0.08241226524114609,,,,,, +5,18049,,,,,,,,,,,,0.07551956176757812,,,,,, +5,18099,,,,,,,,,,,,0.08672452718019485,,,,,, +5,18149,,,,,,,,,,,,0.06291598826646805,,,,,, +5,18199,,,,,,,,,,,,0.06993363797664642,,,,,, +5,18249,,,,,,,,,,,,0.0751081109046936,,,,,, +5,18299,,,,,,,,,,,,0.08068472146987915,,,,,, +5,18349,,,,,,,,,,,,0.0833476260304451,,,,,, +5,18399,,,,,,,,,,,,0.0754123106598854,,,,,, +5,18449,,,,,,,,,,,,0.0830940455198288,,,,,, +5,18499,,,,,,,,,,,,0.07959701120853424,,,,,, +5,18549,,,,,,,,,,,,0.0703655555844307,,,,,, +5,18599,,,,,,,,,,,,0.07817307114601135,,,,,, +5,18649,,,,,,,,,,,,0.07687778770923615,,,,,, +5,18699,,,,,,,,,,,,0.08109420537948608,,,,,, +5,18749,,,,,,,,,,,,0.08227269351482391,,,,,, +5,18799,,,,,,,,,,,,0.08383024483919144,,,,,, +5,18849,,,,,,,,,,,,0.08785051852464676,,,,,, +5,18899,,,,,,,,,,,,0.08143424987792969,,,,,, +5,18949,,,,,,,,,,,,0.07851109653711319,,,,,, +5,18999,,,,,,,,,,,,0.07094001024961472,,,,,, +5,19049,,,,,,,,,,,,0.07946471869945526,,,,,, +5,19099,,,,,,,,,,,,0.07184822112321854,,,,,, +5,19149,,,,,,,,,,,,0.08293338119983673,,,,,, +5,19199,,,,,,,,,,,,0.08497728407382965,,,,,, +5,19249,,,,,,,,,,,,0.07843638956546783,,,,,, +5,19299,,,,,,,,,,,,0.08204066008329391,,,,,, +5,19349,,,,,,,,,,,,0.06525720655918121,,,,,, +5,19399,,,,,,,,,,,,0.08427287638187408,,,,,, +5,19449,,,,,,,,,,,,0.06559483706951141,,,,,, +5,19499,,,,,,,,,,,,0.08745920658111572,,,,,, +5,19549,,,,,,,,,,,,0.08157810568809509,,,,,, +5,19599,,,,,,,,,,,,0.0752023309469223,,,,,, +5,19649,,,,,,,,,,,,0.08219162374734879,,,,,, +5,19699,,,,,,,,,,,,0.10179769992828369,,,,,, +5,19749,,,,,,,,,,,,0.08084792643785477,,,,,, +5,19799,,,,,,,,,,,,0.08328051120042801,,,,,, +5,19849,,,,,,,,,,,,0.08255641907453537,,,,,, +5,19899,,,,,,,,,,,,0.0876854732632637,,,,,, +5,19949,,,,,,,,,,,,0.07778098434209824,,,,,, +5,19999,,,,,,,,,,,,0.06995481252670288,,,,,, +5,20049,,,,,,,,,,,,0.08338761329650879,,,,,, +5,20099,,,,,,,,,,,,0.07935798168182373,,,,,, +5,20149,,,,,,,,,,,,0.08411900699138641,,,,,, +5,20199,,,,,,,,,,,,0.07426304370164871,,,,,, +5,20249,,,,,,,,,,,,0.08440101146697998,,,,,, +5,20299,,,,,,,,,,,,0.07707814872264862,,,,,, +5,20349,,,,,,,,,,,,0.09310431778430939,,,,,, +5,20399,,,,,,,,,,,,0.0891171395778656,,,,,, +5,20449,,,,,,,,,,,,0.09407374262809753,,,,,, +5,20499,,,,,,,,,,,,0.069851353764534,,,,,, +5,20549,,,,,,,,,,,,0.0750015527009964,,,,,, +5,20599,,,,,,,,,,,,0.08262748271226883,,,,,, +5,20649,,,,,,,,,,,,0.0839223638176918,,,,,, +5,20651,,,,,,,,,,,,,0.24463312327861786,0.08028177171945572,0.2102653980255127,0.03391540050506592,0.20897537469863892,0.08028177171945572 +5,20651,,,,,,,0.24505643546581268,0.08102486282587051,0.14494170248508453,0.02043604850769043,0.1289096623659134,,,,,,, +6,20699,,,,,,,,,,,,0.07801630347967148,,,,,, +6,20749,,,,,,,,,,,,0.07755836844444275,,,,,, +6,20799,,,,,,,,,,,,0.08336852490901947,,,,,, +6,20849,,,,,,,,,,,,0.08567235618829727,,,,,, +6,20899,,,,,,,,,,,,0.0803244560956955,,,,,, +6,20949,,,,,,,,,,,,0.08298072218894958,,,,,, +6,20999,,,,,,,,,,,,0.07443215698003769,,,,,, +6,21049,,,,,,,,,,,,0.09076583385467529,,,,,, +6,21099,,,,,,,,,,,,0.07698597013950348,,,,,, +6,21149,,,,,,,,,,,,0.07900959253311157,,,,,, +6,21199,,,,,,,,,,,,0.09492051601409912,,,,,, +6,21249,,,,,,,,,,,,0.07327184081077576,,,,,, +6,21299,,,,,,,,,,,,0.08825013041496277,,,,,, +6,21349,,,,,,,,,,,,0.08005346357822418,,,,,, +6,21399,,,,,,,,,,,,0.07784222811460495,,,,,, +6,21449,,,,,,,,,,,,0.08093571662902832,,,,,, +6,21499,,,,,,,,,,,,0.09137256443500519,,,,,, +6,21549,,,,,,,,,,,,0.08140116184949875,,,,,, +6,21599,,,,,,,,,,,,0.08900737762451172,,,,,, +6,21649,,,,,,,,,,,,0.08614243566989899,,,,,, +6,21699,,,,,,,,,,,,0.08785500377416611,,,,,, +6,21749,,,,,,,,,,,,0.08150891959667206,,,,,, +6,21799,,,,,,,,,,,,0.0851152241230011,,,,,, +6,21849,,,,,,,,,,,,0.08363010734319687,,,,,, +6,21899,,,,,,,,,,,,0.09167551249265671,,,,,, +6,21949,,,,,,,,,,,,0.07714542746543884,,,,,, +6,21999,,,,,,,,,,,,0.08511533588171005,,,,,, +6,22049,,,,,,,,,,,,0.08205960690975189,,,,,, +6,22099,,,,,,,,,,,,0.07304707169532776,,,,,, +6,22149,,,,,,,,,,,,0.07838473469018936,,,,,, +6,22199,,,,,,,,,,,,0.0868791937828064,,,,,, +6,22249,,,,,,,,,,,,0.07785774767398834,,,,,, +6,22299,,,,,,,,,,,,0.08497002720832825,,,,,, +6,22349,,,,,,,,,,,,0.07686325907707214,,,,,, +6,22399,,,,,,,,,,,,0.08454447984695435,,,,,, +6,22449,,,,,,,,,,,,0.08374819159507751,,,,,, +6,22499,,,,,,,,,,,,0.09601080417633057,,,,,, +6,22549,,,,,,,,,,,,0.0881347507238388,,,,,, +6,22599,,,,,,,,,,,,0.07820127159357071,,,,,, +6,22649,,,,,,,,,,,,0.07222018390893936,,,,,, +6,22699,,,,,,,,,,,,0.09479345381259918,,,,,, +6,22749,,,,,,,,,,,,0.07419729977846146,,,,,, +6,22799,,,,,,,,,,,,0.08055571466684341,,,,,, +6,22849,,,,,,,,,,,,0.07969380170106888,,,,,, +6,22899,,,,,,,,,,,,0.0707041472196579,,,,,, +6,22949,,,,,,,,,,,,0.07757876813411713,,,,,, +6,22999,,,,,,,,,,,,0.08202231675386429,,,,,, +6,23049,,,,,,,,,,,,0.06600993126630783,,,,,, +6,23099,,,,,,,,,,,,0.07221126556396484,,,,,, +6,23149,,,,,,,,,,,,0.08362004160881042,,,,,, +6,23199,,,,,,,,,,,,0.09117530286312103,,,,,, +6,23249,,,,,,,,,,,,0.08544769883155823,,,,,, +6,23299,,,,,,,,,,,,0.07686355710029602,,,,,, +6,23349,,,,,,,,,,,,0.08758173882961273,,,,,, +6,23399,,,,,,,,,,,,0.07555970549583435,,,,,, +6,23449,,,,,,,,,,,,0.09182902425527573,,,,,, +6,23499,,,,,,,,,,,,0.0907236784696579,,,,,, +6,23549,,,,,,,,,,,,0.07644997537136078,,,,,, +6,23599,,,,,,,,,,,,0.0814942866563797,,,,,, +6,23649,,,,,,,,,,,,0.07826903462409973,,,,,, +6,23699,,,,,,,,,,,,0.08812127262353897,,,,,, +6,23749,,,,,,,,,,,,0.07654173672199249,,,,,, +6,23799,,,,,,,,,,,,0.07738061994314194,,,,,, +6,23849,,,,,,,,,,,,0.08640813827514648,,,,,, +6,23899,,,,,,,,,,,,0.07799045741558075,,,,,, +6,23949,,,,,,,,,,,,0.08311659842729568,,,,,, +6,23999,,,,,,,,,,,,0.08292736858129501,,,,,, +6,24049,,,,,,,,,,,,0.08421540260314941,,,,,, +6,24093,,,,,,,,,,,,,0.24391703307628632,0.08028364926576614,0.1978888213634491,0.03389286994934082,0.2038448005914688,0.08028364926576614 +6,24093,,,,,,,0.24464808404445648,0.08075658977031708,0.1549372673034668,0.023685455322265625,0.1357782632112503,,,,,,, +7,24099,,,,,,,,,,,,0.07735420018434525,,,,,, +7,24149,,,,,,,,,,,,0.07752472162246704,,,,,, +7,24199,,,,,,,,,,,,0.08212234824895859,,,,,, +7,24249,,,,,,,,,,,,0.07795193791389465,,,,,, +7,24299,,,,,,,,,,,,0.07979890704154968,,,,,, +7,24349,,,,,,,,,,,,0.08083963394165039,,,,,, +7,24399,,,,,,,,,,,,0.0893184095621109,,,,,, +7,24449,,,,,,,,,,,,0.07420948147773743,,,,,, +7,24499,,,,,,,,,,,,0.07757134735584259,,,,,, +7,24549,,,,,,,,,,,,0.08302769064903259,,,,,, +7,24599,,,,,,,,,,,,0.08376903831958771,,,,,, +7,24649,,,,,,,,,,,,0.07994213700294495,,,,,, +7,24699,,,,,,,,,,,,0.07603877782821655,,,,,, +7,24749,,,,,,,,,,,,0.08503370732069016,,,,,, +7,24799,,,,,,,,,,,,0.08907940983772278,,,,,, +7,24849,,,,,,,,,,,,0.08860534429550171,,,,,, +7,24899,,,,,,,,,,,,0.08322327584028244,,,,,, +7,24949,,,,,,,,,,,,0.07508537173271179,,,,,, +7,24999,,,,,,,,,,,,0.07458922266960144,,,,,, +7,25049,,,,,,,,,,,,0.08160503208637238,,,,,, +7,25099,,,,,,,,,,,,0.08264506608247757,,,,,, +7,25149,,,,,,,,,,,,0.07009952515363693,,,,,, +7,25199,,,,,,,,,,,,0.06975056231021881,,,,,, +7,25249,,,,,,,,,,,,0.08017788827419281,,,,,, +7,25299,,,,,,,,,,,,0.08680939674377441,,,,,, +7,25349,,,,,,,,,,,,0.09041999280452728,,,,,, +7,25399,,,,,,,,,,,,0.07791788876056671,,,,,, +7,25449,,,,,,,,,,,,0.07966428995132446,,,,,, +7,25499,,,,,,,,,,,,0.08023253828287125,,,,,, +7,25549,,,,,,,,,,,,0.06765303015708923,,,,,, +7,25599,,,,,,,,,,,,0.07992327213287354,,,,,, +7,25649,,,,,,,,,,,,0.08493374288082123,,,,,, +7,25699,,,,,,,,,,,,0.07855790853500366,,,,,, +7,25749,,,,,,,,,,,,0.08022306859493256,,,,,, +7,25799,,,,,,,,,,,,0.08987343311309814,,,,,, +7,25849,,,,,,,,,,,,0.09077763557434082,,,,,, +7,25899,,,,,,,,,,,,0.09925605356693268,,,,,, +7,25949,,,,,,,,,,,,0.07114550471305847,,,,,, +7,25999,,,,,,,,,,,,0.08194878697395325,,,,,, +7,26049,,,,,,,,,,,,0.08453934639692307,,,,,, +7,26099,,,,,,,,,,,,0.07769747078418732,,,,,, +7,26149,,,,,,,,,,,,0.0891534611582756,,,,,, +7,26199,,,,,,,,,,,,0.08236607909202576,,,,,, +7,26249,,,,,,,,,,,,0.08779509365558624,,,,,, +7,26299,,,,,,,,,,,,0.080595962703228,,,,,, +7,26349,,,,,,,,,,,,0.07983182370662689,,,,,, +7,26399,,,,,,,,,,,,0.07957568764686584,,,,,, +7,26449,,,,,,,,,,,,0.08388439565896988,,,,,, +7,26499,,,,,,,,,,,,0.08214320242404938,,,,,, +7,26549,,,,,,,,,,,,0.08695568144321442,,,,,, +7,26599,,,,,,,,,,,,0.08996269106864929,,,,,, +7,26649,,,,,,,,,,,,0.09066599607467651,,,,,, +7,26699,,,,,,,,,,,,0.08488468080759048,,,,,, +7,26749,,,,,,,,,,,,0.09067495167255402,,,,,, +7,26799,,,,,,,,,,,,0.08369417488574982,,,,,, +7,26849,,,,,,,,,,,,0.06959487497806549,,,,,, +7,26899,,,,,,,,,,,,0.08528795838356018,,,,,, +7,26949,,,,,,,,,,,,0.09125958383083344,,,,,, +7,26999,,,,,,,,,,,,0.08135591447353363,,,,,, +7,27049,,,,,,,,,,,,0.07899844646453857,,,,,, +7,27099,,,,,,,,,,,,0.08523931354284286,,,,,, +7,27149,,,,,,,,,,,,0.07053454220294952,,,,,, +7,27199,,,,,,,,,,,,0.08186940848827362,,,,,, +7,27249,,,,,,,,,,,,0.08271584659814835,,,,,, +7,27299,,,,,,,,,,,,0.08487876504659653,,,,,, +7,27349,,,,,,,,,,,,0.08569367229938507,,,,,, +7,27399,,,,,,,,,,,,0.07813958078622818,,,,,, +7,27449,,,,,,,,,,,,0.077561154961586,,,,,, +7,27499,,,,,,,,,,,,0.08630933612585068,,,,,, +7,27535,,,,,,,,,,,,,0.24419698119163513,0.08053545653820038,0.1871030628681183,0.03086268901824951,0.19433803856372833,0.08053545653820038 +7,27535,,,,,,,0.24443311989307404,0.08064194768667221,0.15935011208057404,0.02507472038269043,0.14310568571090698,,,,,,, +8,27549,,,,,,,,,,,,0.08694764971733093,,,,,, +8,27599,,,,,,,,,,,,0.07607708871364594,,,,,, +8,27649,,,,,,,,,,,,0.08238063752651215,,,,,, +8,27699,,,,,,,,,,,,0.07835778594017029,,,,,, +8,27749,,,,,,,,,,,,0.07597295939922333,,,,,, +8,27799,,,,,,,,,,,,0.07010146975517273,,,,,, +8,27849,,,,,,,,,,,,0.08646738529205322,,,,,, +8,27899,,,,,,,,,,,,0.08153816312551498,,,,,, +8,27949,,,,,,,,,,,,0.08253517746925354,,,,,, +8,27999,,,,,,,,,,,,0.07767308503389359,,,,,, +8,28049,,,,,,,,,,,,0.0787474662065506,,,,,, +8,28099,,,,,,,,,,,,0.07333299517631531,,,,,, +8,28149,,,,,,,,,,,,0.08145881444215775,,,,,, +8,28199,,,,,,,,,,,,0.08110663294792175,,,,,, +8,28249,,,,,,,,,,,,0.08034171909093857,,,,,, +8,28299,,,,,,,,,,,,0.07196124643087387,,,,,, +8,28349,,,,,,,,,,,,0.08042412251234055,,,,,, +8,28399,,,,,,,,,,,,0.07705235481262207,,,,,, +8,28449,,,,,,,,,,,,0.07520590722560883,,,,,, +8,28499,,,,,,,,,,,,0.07609759271144867,,,,,, +8,28549,,,,,,,,,,,,0.08993854373693466,,,,,, +8,28599,,,,,,,,,,,,0.0854429304599762,,,,,, +8,28649,,,,,,,,,,,,0.08280983567237854,,,,,, +8,28699,,,,,,,,,,,,0.07975976169109344,,,,,, +8,28749,,,,,,,,,,,,0.07281471788883209,,,,,, +8,28799,,,,,,,,,,,,0.07329297810792923,,,,,, +8,28849,,,,,,,,,,,,0.08410200476646423,,,,,, +8,28899,,,,,,,,,,,,0.07845725864171982,,,,,, +8,28949,,,,,,,,,,,,0.07560442388057709,,,,,, +8,28999,,,,,,,,,,,,0.07417750358581543,,,,,, +8,29049,,,,,,,,,,,,0.08677352964878082,,,,,, +8,29099,,,,,,,,,,,,0.08845914900302887,,,,,, +8,29149,,,,,,,,,,,,0.0790235623717308,,,,,, +8,29199,,,,,,,,,,,,0.07796122133731842,,,,,, +8,29249,,,,,,,,,,,,0.07853086292743683,,,,,, +8,29299,,,,,,,,,,,,0.08317180722951889,,,,,, +8,29349,,,,,,,,,,,,0.08214552700519562,,,,,, +8,29399,,,,,,,,,,,,0.08611598610877991,,,,,, +8,29449,,,,,,,,,,,,0.07438622415065765,,,,,, +8,29499,,,,,,,,,,,,0.07108631730079651,,,,,, +8,29549,,,,,,,,,,,,0.08528158068656921,,,,,, +8,29599,,,,,,,,,,,,0.07670451700687408,,,,,, +8,29649,,,,,,,,,,,,0.08285284042358398,,,,,, +8,29699,,,,,,,,,,,,0.08311591297388077,,,,,, +8,29749,,,,,,,,,,,,0.08429758250713348,,,,,, +8,29799,,,,,,,,,,,,0.07588636875152588,,,,,, +8,29849,,,,,,,,,,,,0.08243153989315033,,,,,, +8,29899,,,,,,,,,,,,0.08165355771780014,,,,,, +8,29949,,,,,,,,,,,,0.07169286906719208,,,,,, +8,29999,,,,,,,,,,,,0.07416002452373505,,,,,, +8,30049,,,,,,,,,,,,0.08741401135921478,,,,,, +8,30099,,,,,,,,,,,,0.06945646554231644,,,,,, +8,30149,,,,,,,,,,,,0.09375308454036713,,,,,, +8,30199,,,,,,,,,,,,0.08868434280157089,,,,,, +8,30249,,,,,,,,,,,,0.08970308303833008,,,,,, +8,30299,,,,,,,,,,,,0.07994187623262405,,,,,, +8,30349,,,,,,,,,,,,0.07862065732479095,,,,,, +8,30399,,,,,,,,,,,,0.08407166600227356,,,,,, +8,30449,,,,,,,,,,,,0.0779632180929184,,,,,, +8,30499,,,,,,,,,,,,0.08359093964099884,,,,,, +8,30549,,,,,,,,,,,,0.08246712386608124,,,,,, +8,30599,,,,,,,,,,,,0.07494598627090454,,,,,, +8,30649,,,,,,,,,,,,0.08146817982196808,,,,,, +8,30699,,,,,,,,,,,,0.07328394055366516,,,,,, +8,30749,,,,,,,,,,,,0.07708660513162613,,,,,, +8,30799,,,,,,,,,,,,0.08201916515827179,,,,,, +8,30849,,,,,,,,,,,,0.08612900972366333,,,,,, +8,30899,,,,,,,,,,,,0.08504486083984375,,,,,, +8,30949,,,,,,,,,,,,0.09213720262050629,,,,,, +8,30977,,,,,,,,,,,,,0.2479294389486313,0.08201686292886734,nan,0.013035893440246582,0.19024716317653656,0.08201686292886734 +8,30977,,,,,,,0.244401216506958,0.08065818250179291,0.15947239100933075,0.024875521659851074,0.14485207200050354,,,,,,, +9,30999,,,,,,,,,,,,0.08423721045255661,,,,,, +9,31049,,,,,,,,,,,,0.07499231398105621,,,,,, +9,31099,,,,,,,,,,,,0.0790887400507927,,,,,, +9,31149,,,,,,,,,,,,0.09323953837156296,,,,,, +9,31199,,,,,,,,,,,,0.07625409960746765,,,,,, +9,31249,,,,,,,,,,,,0.07565771788358688,,,,,, +9,31299,,,,,,,,,,,,0.07861027121543884,,,,,, +9,31349,,,,,,,,,,,,0.06514082103967667,,,,,, +9,31399,,,,,,,,,,,,0.08467897027730942,,,,,, +9,31449,,,,,,,,,,,,0.07595513015985489,,,,,, +9,31499,,,,,,,,,,,,0.07433612644672394,,,,,, +9,31549,,,,,,,,,,,,0.08053828775882721,,,,,, +9,31599,,,,,,,,,,,,0.08569390326738358,,,,,, +9,31649,,,,,,,,,,,,0.07629625499248505,,,,,, +9,31699,,,,,,,,,,,,0.07267465442419052,,,,,, +9,31749,,,,,,,,,,,,0.07061435282230377,,,,,, +9,31799,,,,,,,,,,,,0.06630881130695343,,,,,, +9,31849,,,,,,,,,,,,0.07818934321403503,,,,,, +9,31899,,,,,,,,,,,,0.071149080991745,,,,,, +9,31949,,,,,,,,,,,,0.0799560546875,,,,,, +9,31999,,,,,,,,,,,,0.07817117124795914,,,,,, +9,32049,,,,,,,,,,,,0.0827515721321106,,,,,, +9,32099,,,,,,,,,,,,0.0828065425157547,,,,,, +9,32149,,,,,,,,,,,,0.07306602597236633,,,,,, +9,32199,,,,,,,,,,,,0.07466138154268265,,,,,, +9,32249,,,,,,,,,,,,0.07402528822422028,,,,,, +9,32299,,,,,,,,,,,,0.08547192066907883,,,,,, +9,32349,,,,,,,,,,,,0.0758093073964119,,,,,, +9,32399,,,,,,,,,,,,0.08367836475372314,,,,,, +9,32449,,,,,,,,,,,,0.08263862133026123,,,,,, +9,32499,,,,,,,,,,,,0.0777808278799057,,,,,, +9,32549,,,,,,,,,,,,0.07582439482212067,,,,,, +9,32599,,,,,,,,,,,,0.08125224709510803,,,,,, +9,32649,,,,,,,,,,,,0.093080073595047,,,,,, +9,32699,,,,,,,,,,,,0.0765252336859703,,,,,, +9,32749,,,,,,,,,,,,0.07562083750963211,,,,,, +9,32799,,,,,,,,,,,,0.07395144551992416,,,,,, +9,32849,,,,,,,,,,,,0.0736011266708374,,,,,, +9,32899,,,,,,,,,,,,0.08045093715190887,,,,,, +9,32949,,,,,,,,,,,,0.0795491561293602,,,,,, +9,32999,,,,,,,,,,,,0.07573723047971725,,,,,, +9,33049,,,,,,,,,,,,0.07322049140930176,,,,,, +9,33099,,,,,,,,,,,,0.07019771635532379,,,,,, +9,33149,,,,,,,,,,,,0.08745595812797546,,,,,, +9,33199,,,,,,,,,,,,0.09516838192939758,,,,,, +9,33249,,,,,,,,,,,,0.07747728377580643,,,,,, +9,33299,,,,,,,,,,,,0.08408303558826447,,,,,, +9,33349,,,,,,,,,,,,0.0857153832912445,,,,,, +9,33399,,,,,,,,,,,,0.0840764045715332,,,,,, +9,33449,,,,,,,,,,,,0.07494798302650452,,,,,, +9,33499,,,,,,,,,,,,0.08239191770553589,,,,,, +9,33549,,,,,,,,,,,,0.08901458978652954,,,,,, +9,33599,,,,,,,,,,,,0.07575136423110962,,,,,, +9,33649,,,,,,,,,,,,0.08713112026453018,,,,,, +9,33699,,,,,,,,,,,,0.09245718270540237,,,,,, +9,33749,,,,,,,,,,,,0.07525952905416489,,,,,, +9,33799,,,,,,,,,,,,0.08542777597904205,,,,,, +9,33849,,,,,,,,,,,,0.08305282145738602,,,,,, +9,33899,,,,,,,,,,,,0.08157826215028763,,,,,, +9,33949,,,,,,,,,,,,0.07767355442047119,,,,,, +9,33999,,,,,,,,,,,,0.07942015677690506,,,,,, +9,34049,,,,,,,,,,,,0.08417731523513794,,,,,, +9,34099,,,,,,,,,,,,0.07046996057033539,,,,,, +9,34149,,,,,,,,,,,,0.0926564410328865,,,,,, +9,34199,,,,,,,,,,,,0.07439586520195007,,,,,, +9,34249,,,,,,,,,,,,0.06934128701686859,,,,,, +9,34299,,,,,,,,,,,,0.07344754785299301,,,,,, +9,34349,,,,,,,,,,,,0.08643227815628052,,,,,, +9,34399,,,,,,,,,,,,0.06894882023334503,,,,,, +9,34419,,,,,,,,,,,,,0.24173709750175476,0.08036122471094131,0.2263192981481552,0.03295928239822388,0.2301194965839386,0.08036122471094131 +9,34419,,,,,,,0.24429495632648468,0.08062990009784698,0.16056741774082184,0.02521437406539917,0.14725111424922943,,,,,,, +10,34449,,,,,,,,,,,,0.07379913330078125,,,,,, +10,34499,,,,,,,,,,,,0.07684026658535004,,,,,, +10,34549,,,,,,,,,,,,0.09471136331558228,,,,,, +10,34599,,,,,,,,,,,,0.07883831858634949,,,,,, +10,34649,,,,,,,,,,,,0.08029219508171082,,,,,, +10,34699,,,,,,,,,,,,0.07230617105960846,,,,,, +10,34749,,,,,,,,,,,,0.07663851976394653,,,,,, +10,34799,,,,,,,,,,,,0.07498965412378311,,,,,, +10,34849,,,,,,,,,,,,0.07154031097888947,,,,,, +10,34899,,,,,,,,,,,,0.0735810250043869,,,,,, +10,34949,,,,,,,,,,,,0.08558671921491623,,,,,, +10,34999,,,,,,,,,,,,0.07070229947566986,,,,,, +10,35049,,,,,,,,,,,,0.08146601170301437,,,,,, +10,35099,,,,,,,,,,,,0.08584341406822205,,,,,, +10,35149,,,,,,,,,,,,0.08040232956409454,,,,,, +10,35199,,,,,,,,,,,,0.08214251697063446,,,,,, +10,35249,,,,,,,,,,,,0.08381393551826477,,,,,, +10,35299,,,,,,,,,,,,0.06653864681720734,,,,,, +10,35349,,,,,,,,,,,,0.07639925181865692,,,,,, +10,35399,,,,,,,,,,,,0.09150230139493942,,,,,, +10,35449,,,,,,,,,,,,0.09012553095817566,,,,,, +10,35499,,,,,,,,,,,,0.0901242047548294,,,,,, +10,35549,,,,,,,,,,,,0.07863931357860565,,,,,, +10,35599,,,,,,,,,,,,0.07513819634914398,,,,,, +10,35649,,,,,,,,,,,,0.07909581810235977,,,,,, +10,35699,,,,,,,,,,,,0.08265705406665802,,,,,, +10,35749,,,,,,,,,,,,0.0872800350189209,,,,,, +10,35799,,,,,,,,,,,,0.08041434735059738,,,,,, +10,35849,,,,,,,,,,,,0.08103302121162415,,,,,, +10,35899,,,,,,,,,,,,0.07173788547515869,,,,,, +10,35949,,,,,,,,,,,,0.08207403123378754,,,,,, +10,35999,,,,,,,,,,,,0.08518734574317932,,,,,, +10,36049,,,,,,,,,,,,0.07886575162410736,,,,,, +10,36099,,,,,,,,,,,,0.08373595774173737,,,,,, +10,36149,,,,,,,,,,,,0.08033671975135803,,,,,, +10,36199,,,,,,,,,,,,0.07686147093772888,,,,,, +10,36249,,,,,,,,,,,,0.08113695681095123,,,,,, +10,36299,,,,,,,,,,,,0.08178399503231049,,,,,, +10,36349,,,,,,,,,,,,0.07932570576667786,,,,,, +10,36399,,,,,,,,,,,,0.07404972612857819,,,,,, +10,36449,,,,,,,,,,,,0.06329396367073059,,,,,, +10,36499,,,,,,,,,,,,0.07084694504737854,,,,,, +10,36549,,,,,,,,,,,,0.07563050091266632,,,,,, +10,36599,,,,,,,,,,,,0.08406294137239456,,,,,, +10,36649,,,,,,,,,,,,0.0682300254702568,,,,,, +10,36699,,,,,,,,,,,,0.08095580339431763,,,,,, +10,36749,,,,,,,,,,,,0.07924723625183105,,,,,, +10,36799,,,,,,,,,,,,0.08978965133428574,,,,,, +10,36849,,,,,,,,,,,,0.07904088497161865,,,,,, +10,36899,,,,,,,,,,,,0.08515271544456482,,,,,, +10,36949,,,,,,,,,,,,0.07088951021432877,,,,,, +10,36999,,,,,,,,,,,,0.073799729347229,,,,,, +10,37049,,,,,,,,,,,,0.08353957533836365,,,,,, +10,37099,,,,,,,,,,,,0.07458722591400146,,,,,, +10,37149,,,,,,,,,,,,0.09186973422765732,,,,,, +10,37199,,,,,,,,,,,,0.07972956448793411,,,,,, +10,37249,,,,,,,,,,,,0.08087632060050964,,,,,, +10,37299,,,,,,,,,,,,0.07925763726234436,,,,,, +10,37349,,,,,,,,,,,,0.08214946836233139,,,,,, +10,37399,,,,,,,,,,,,0.08353553712368011,,,,,, +10,37449,,,,,,,,,,,,0.08091799169778824,,,,,, +10,37499,,,,,,,,,,,,0.07491149008274078,,,,,, +10,37549,,,,,,,,,,,,0.07978559285402298,,,,,, +10,37599,,,,,,,,,,,,0.08759308606386185,,,,,, +10,37649,,,,,,,,,,,,0.07287222146987915,,,,,, +10,37699,,,,,,,,,,,,0.07723517715930939,,,,,, +10,37749,,,,,,,,,,,,0.07203304767608643,,,,,, +10,37799,,,,,,,,,,,,0.07597224414348602,,,,,, +10,37849,,,,,,,,,,,,0.08887448906898499,,,,,, +10,37861,,,,,,,,,,,,,0.2416071891784668,0.07952757179737091,0.2282707244157791,0.04299116134643555,0.234418123960495,0.07952757179737091 +10,37861,,,,,,,0.2429863065481186,0.07979746907949448,0.18800002336502075,0.035282015800476074,0.16953864693641663,,,,,,, +11,37899,,,,,,,,,,,,0.07175701856613159,,,,,, +11,37949,,,,,,,,,,,,0.07526516914367676,,,,,, +11,37999,,,,,,,,,,,,0.08241849392652512,,,,,, +11,38049,,,,,,,,,,,,0.0944802314043045,,,,,, +11,38099,,,,,,,,,,,,0.07567480206489563,,,,,, +11,38149,,,,,,,,,,,,0.07608281821012497,,,,,, +11,38199,,,,,,,,,,,,0.08875763416290283,,,,,, +11,38249,,,,,,,,,,,,0.09025666117668152,,,,,, +11,38299,,,,,,,,,,,,0.07327309995889664,,,,,, +11,38349,,,,,,,,,,,,0.08457843214273453,,,,,, +11,38399,,,,,,,,,,,,0.08055190742015839,,,,,, +11,38449,,,,,,,,,,,,0.06648837774991989,,,,,, +11,38499,,,,,,,,,,,,0.07408451288938522,,,,,, +11,38549,,,,,,,,,,,,0.07249084115028381,,,,,, +11,38599,,,,,,,,,,,,0.07627210021018982,,,,,, +11,38649,,,,,,,,,,,,0.07150827348232269,,,,,, +11,38699,,,,,,,,,,,,0.0725347101688385,,,,,, +11,38749,,,,,,,,,,,,0.07164296507835388,,,,,, +11,38799,,,,,,,,,,,,0.07541125267744064,,,,,, +11,38849,,,,,,,,,,,,0.0809817835688591,,,,,, +11,38899,,,,,,,,,,,,0.0786980539560318,,,,,, +11,38949,,,,,,,,,,,,0.07213090360164642,,,,,, +11,38999,,,,,,,,,,,,0.08564522117376328,,,,,, +11,39049,,,,,,,,,,,,0.07425892353057861,,,,,, +11,39099,,,,,,,,,,,,0.0766790509223938,,,,,, +11,39149,,,,,,,,,,,,0.07560611516237259,,,,,, +11,39199,,,,,,,,,,,,0.0841204896569252,,,,,, +11,39249,,,,,,,,,,,,0.07220473885536194,,,,,, +11,39299,,,,,,,,,,,,0.08268826454877853,,,,,, +11,39349,,,,,,,,,,,,0.08297884464263916,,,,,, +11,39399,,,,,,,,,,,,0.09188070148229599,,,,,, +11,39449,,,,,,,,,,,,0.08515383303165436,,,,,, +11,39499,,,,,,,,,,,,0.07558906078338623,,,,,, +11,39549,,,,,,,,,,,,0.08292175829410553,,,,,, +11,39599,,,,,,,,,,,,0.07782047986984253,,,,,, +11,39649,,,,,,,,,,,,0.08551715314388275,,,,,, +11,39699,,,,,,,,,,,,0.0768188089132309,,,,,, +11,39749,,,,,,,,,,,,0.07682272791862488,,,,,, +11,39799,,,,,,,,,,,,0.07322853803634644,,,,,, +11,39849,,,,,,,,,,,,0.07958126068115234,,,,,, +11,39899,,,,,,,,,,,,0.07829488813877106,,,,,, +11,39949,,,,,,,,,,,,0.07175715267658234,,,,,, +11,39999,,,,,,,,,,,,0.07803493738174438,,,,,, +11,40049,,,,,,,,,,,,0.09024150669574738,,,,,, +11,40099,,,,,,,,,,,,0.07101492583751678,,,,,, +11,40149,,,,,,,,,,,,0.07307277619838715,,,,,, +11,40199,,,,,,,,,,,,0.09143323451280594,,,,,, +11,40249,,,,,,,,,,,,0.08738689869642258,,,,,, +11,40299,,,,,,,,,,,,0.08365002274513245,,,,,, +11,40349,,,,,,,,,,,,0.07929312437772751,,,,,, +11,40399,,,,,,,,,,,,0.0888366773724556,,,,,, +11,40449,,,,,,,,,,,,0.09387145191431046,,,,,, +11,40499,,,,,,,,,,,,0.07559868693351746,,,,,, +11,40549,,,,,,,,,,,,0.08581581711769104,,,,,, +11,40599,,,,,,,,,,,,0.08892729878425598,,,,,, +11,40649,,,,,,,,,,,,0.07932458817958832,,,,,, +11,40699,,,,,,,,,,,,0.08176608383655548,,,,,, +11,40749,,,,,,,,,,,,0.07674810290336609,,,,,, +11,40799,,,,,,,,,,,,0.08627215027809143,,,,,, +11,40849,,,,,,,,,,,,0.08440852165222168,,,,,, +11,40899,,,,,,,,,,,,0.07761585712432861,,,,,, +11,40949,,,,,,,,,,,,0.07316797226667404,,,,,, +11,40999,,,,,,,,,,,,0.08375848084688187,,,,,, +11,41049,,,,,,,,,,,,0.07270960509777069,,,,,, +11,41099,,,,,,,,,,,,0.07644709944725037,,,,,, +11,41149,,,,,,,,,,,,0.08124320954084396,,,,,, +11,41199,,,,,,,,,,,,0.08452844619750977,,,,,, +11,41249,,,,,,,,,,,,0.07885951548814774,,,,,, +11,41299,,,,,,,,,,,,0.08145734667778015,,,,,, +11,41303,,,,,,,,,,,,,0.2432534247636795,0.08230207860469818,0.22920645773410797,0.009603738784790039,0.23428936302661896,0.08230207860469818 +11,41303,,,,,,,0.24258191883563995,0.07958929240703583,0.19459259510040283,0.03778928518295288,0.1789407581090927,,,,,,, +12,41349,,,,,,,,,,,,0.07410743832588196,,,,,, +12,41399,,,,,,,,,,,,0.07118545472621918,,,,,, +12,41449,,,,,,,,,,,,0.07749457657337189,,,,,, +12,41499,,,,,,,,,,,,0.08076848089694977,,,,,, +12,41549,,,,,,,,,,,,0.07330647855997086,,,,,, +12,41599,,,,,,,,,,,,0.0785083994269371,,,,,, +12,41649,,,,,,,,,,,,0.08327007293701172,,,,,, +12,41699,,,,,,,,,,,,0.0840781182050705,,,,,, +12,41749,,,,,,,,,,,,0.08461808413267136,,,,,, +12,41799,,,,,,,,,,,,0.08808617293834686,,,,,, +12,41849,,,,,,,,,,,,0.08775500953197479,,,,,, +12,41899,,,,,,,,,,,,0.0869210734963417,,,,,, +12,41949,,,,,,,,,,,,0.08230715245008469,,,,,, +12,41999,,,,,,,,,,,,0.08875592052936554,,,,,, +12,42049,,,,,,,,,,,,0.08912040293216705,,,,,, +12,42099,,,,,,,,,,,,0.07758389413356781,,,,,, +12,42149,,,,,,,,,,,,0.08252761512994766,,,,,, +12,42199,,,,,,,,,,,,0.09143389761447906,,,,,, +12,42249,,,,,,,,,,,,0.07868266850709915,,,,,, +12,42299,,,,,,,,,,,,0.08285057544708252,,,,,, +12,42349,,,,,,,,,,,,0.07843650877475739,,,,,, +12,42399,,,,,,,,,,,,0.09146884083747864,,,,,, +12,42449,,,,,,,,,,,,0.08127006888389587,,,,,, +12,42499,,,,,,,,,,,,0.07147862017154694,,,,,, +12,42549,,,,,,,,,,,,0.07837758213281631,,,,,, +12,42599,,,,,,,,,,,,0.07491731643676758,,,,,, +12,42649,,,,,,,,,,,,0.08046039193868637,,,,,, +12,42699,,,,,,,,,,,,0.07044951617717743,,,,,, +12,42749,,,,,,,,,,,,0.08506645262241364,,,,,, +12,42799,,,,,,,,,,,,0.08431026339530945,,,,,, +12,42849,,,,,,,,,,,,0.07788459956645966,,,,,, +12,42899,,,,,,,,,,,,0.07650823146104813,,,,,, +12,42949,,,,,,,,,,,,0.07703202962875366,,,,,, +12,42999,,,,,,,,,,,,0.07461104542016983,,,,,, +12,43049,,,,,,,,,,,,0.07338794320821762,,,,,, +12,43099,,,,,,,,,,,,0.0844196304678917,,,,,, +12,43149,,,,,,,,,,,,0.08003879338502884,,,,,, +12,43199,,,,,,,,,,,,0.07073625177145004,,,,,, +12,43249,,,,,,,,,,,,0.07212750613689423,,,,,, +12,43299,,,,,,,,,,,,0.07791286706924438,,,,,, +12,43349,,,,,,,,,,,,0.08211861550807953,,,,,, +12,43399,,,,,,,,,,,,0.08838260173797607,,,,,, +12,43449,,,,,,,,,,,,0.0769382119178772,,,,,, +12,43499,,,,,,,,,,,,0.08784489333629608,,,,,, +12,43549,,,,,,,,,,,,0.06355814635753632,,,,,, +12,43599,,,,,,,,,,,,0.0664009302854538,,,,,, +12,43649,,,,,,,,,,,,0.07519413530826569,,,,,, +12,43699,,,,,,,,,,,,0.08240541815757751,,,,,, +12,43749,,,,,,,,,,,,0.08634328097105026,,,,,, +12,43799,,,,,,,,,,,,0.07582829892635345,,,,,, +12,43849,,,,,,,,,,,,0.07992520183324814,,,,,, +12,43899,,,,,,,,,,,,0.08670787513256073,,,,,, +12,43949,,,,,,,,,,,,0.06994642317295074,,,,,, +12,43999,,,,,,,,,,,,0.0849982351064682,,,,,, +12,44049,,,,,,,,,,,,0.06998661905527115,,,,,, +12,44099,,,,,,,,,,,,0.08656130731105804,,,,,, +12,44149,,,,,,,,,,,,0.0704793632030487,,,,,, +12,44199,,,,,,,,,,,,0.07684021443128586,,,,,, +12,44249,,,,,,,,,,,,0.07225167006254196,,,,,, +12,44299,,,,,,,,,,,,0.08455492556095123,,,,,, +12,44349,,,,,,,,,,,,0.06944780051708221,,,,,, +12,44399,,,,,,,,,,,,0.09648283571004868,,,,,, +12,44449,,,,,,,,,,,,0.066905677318573,,,,,, +12,44499,,,,,,,,,,,,0.09395909309387207,,,,,, +12,44549,,,,,,,,,,,,0.08990104496479034,,,,,, +12,44599,,,,,,,,,,,,0.0783328115940094,,,,,, +12,44649,,,,,,,,,,,,0.08854242414236069,,,,,, +12,44699,,,,,,,,,,,,0.07407381385564804,,,,,, +12,44745,,,,,,,,,,,,,0.2413812279701233,0.0794849768280983,0.21818310022354126,0.04350382089614868,0.2228730022907257,0.0794849768280983 +12,44745,,,,,,,0.24238920211791992,0.07948900014162064,0.19770963490009308,0.03899955749511719,0.18104897439479828,,,,,,, +13,44749,,,,,,,,,,,,0.07225395739078522,,,,,, +13,44799,,,,,,,,,,,,0.07838387787342072,,,,,, +13,44849,,,,,,,,,,,,0.0764387995004654,,,,,, +13,44899,,,,,,,,,,,,0.0854794830083847,,,,,, +13,44949,,,,,,,,,,,,0.07074178755283356,,,,,, +13,44999,,,,,,,,,,,,0.08109590411186218,,,,,, +13,45049,,,,,,,,,,,,0.07374228537082672,,,,,, +13,45099,,,,,,,,,,,,0.07236132025718689,,,,,, +13,45149,,,,,,,,,,,,0.08755159378051758,,,,,, +13,45199,,,,,,,,,,,,0.06644153594970703,,,,,, +13,45249,,,,,,,,,,,,0.07034935057163239,,,,,, +13,45299,,,,,,,,,,,,0.07319125533103943,,,,,, +13,45349,,,,,,,,,,,,0.08587799221277237,,,,,, +13,45399,,,,,,,,,,,,0.07666314393281937,,,,,, +13,45449,,,,,,,,,,,,0.07661949843168259,,,,,, +13,45499,,,,,,,,,,,,0.09016390889883041,,,,,, +13,45549,,,,,,,,,,,,0.07909869402647018,,,,,, +13,45599,,,,,,,,,,,,0.08491785824298859,,,,,, +13,45649,,,,,,,,,,,,0.07819481194019318,,,,,, +13,45699,,,,,,,,,,,,0.08366130292415619,,,,,, +13,45749,,,,,,,,,,,,0.06693916767835617,,,,,, +13,45799,,,,,,,,,,,,0.0820595920085907,,,,,, +13,45849,,,,,,,,,,,,0.09103946387767792,,,,,, +13,45899,,,,,,,,,,,,0.07387301325798035,,,,,, +13,45949,,,,,,,,,,,,0.0737612396478653,,,,,, +13,45999,,,,,,,,,,,,0.0736510157585144,,,,,, +13,46049,,,,,,,,,,,,0.059797272086143494,,,,,, +13,46099,,,,,,,,,,,,0.08216609805822372,,,,,, +13,46149,,,,,,,,,,,,0.07262678444385529,,,,,, +13,46199,,,,,,,,,,,,0.07353053987026215,,,,,, +13,46249,,,,,,,,,,,,0.076423279941082,,,,,, +13,46299,,,,,,,,,,,,0.07921019941568375,,,,,, +13,46349,,,,,,,,,,,,0.07589711993932724,,,,,, +13,46399,,,,,,,,,,,,0.07853139936923981,,,,,, +13,46449,,,,,,,,,,,,0.07881803065538406,,,,,, +13,46499,,,,,,,,,,,,0.08008342981338501,,,,,, +13,46549,,,,,,,,,,,,0.08532960712909698,,,,,, +13,46599,,,,,,,,,,,,0.09174832701683044,,,,,, +13,46649,,,,,,,,,,,,0.07747876644134521,,,,,, +13,46699,,,,,,,,,,,,0.06819896399974823,,,,,, +13,46749,,,,,,,,,,,,0.08930007368326187,,,,,, +13,46799,,,,,,,,,,,,0.08366543054580688,,,,,, +13,46849,,,,,,,,,,,,0.08210808038711548,,,,,, +13,46899,,,,,,,,,,,,0.08753547817468643,,,,,, +13,46949,,,,,,,,,,,,0.08439438045024872,,,,,, +13,46999,,,,,,,,,,,,0.07646636664867401,,,,,, +13,47049,,,,,,,,,,,,0.0836515799164772,,,,,, +13,47099,,,,,,,,,,,,0.07804162055253983,,,,,, +13,47149,,,,,,,,,,,,0.08917617797851562,,,,,, +13,47199,,,,,,,,,,,,0.07407975196838379,,,,,, +13,47249,,,,,,,,,,,,0.07760624587535858,,,,,, +13,47299,,,,,,,,,,,,0.0847053974866867,,,,,, +13,47349,,,,,,,,,,,,0.07284095138311386,,,,,, +13,47399,,,,,,,,,,,,0.08350283652544022,,,,,, +13,47449,,,,,,,,,,,,0.08816348016262054,,,,,, +13,47499,,,,,,,,,,,,0.07634314149618149,,,,,, +13,47549,,,,,,,,,,,,0.07871019840240479,,,,,, +13,47599,,,,,,,,,,,,0.08833841234445572,,,,,, +13,47649,,,,,,,,,,,,0.07030852138996124,,,,,, +13,47699,,,,,,,,,,,,0.0846492275595665,,,,,, +13,47749,,,,,,,,,,,,0.08894156664609909,,,,,, +13,47799,,,,,,,,,,,,0.08209813386201859,,,,,, +13,47849,,,,,,,,,,,,0.08642734587192535,,,,,, +13,47899,,,,,,,,,,,,0.07143394649028778,,,,,, +13,47949,,,,,,,,,,,,0.06738010793924332,,,,,, +13,47999,,,,,,,,,,,,0.07760348916053772,,,,,, +13,48049,,,,,,,,,,,,0.07500864565372467,,,,,, +13,48099,,,,,,,,,,,,0.07825997471809387,,,,,, +13,48149,,,,,,,,,,,,0.09345877170562744,,,,,, +13,48187,,,,,,,,,,,,,0.2425736039876938,0.07953572273254395,0.21756084263324738,0.042893171310424805,0.222077876329422,0.07953572273254395 +13,48187,,,,,,,0.24216952919960022,0.07938463985919952,0.20088815689086914,0.04026061296463013,0.18417979776859283,,,,,,, +14,48199,,,,,,,,,,,,0.08562985062599182,,,,,, +14,48249,,,,,,,,,,,,0.09082791209220886,,,,,, +14,48299,,,,,,,,,,,,0.07728665322065353,,,,,, +14,48349,,,,,,,,,,,,0.08355382829904556,,,,,, +14,48399,,,,,,,,,,,,0.08413724601268768,,,,,, +14,48449,,,,,,,,,,,,0.08081479370594025,,,,,, +14,48499,,,,,,,,,,,,0.08110877871513367,,,,,, +14,48549,,,,,,,,,,,,0.07729597389698029,,,,,, +14,48599,,,,,,,,,,,,0.07502205669879913,,,,,, +14,48649,,,,,,,,,,,,0.08485803008079529,,,,,, +14,48699,,,,,,,,,,,,0.08195213228464127,,,,,, +14,48749,,,,,,,,,,,,0.06575368344783783,,,,,, +14,48799,,,,,,,,,,,,0.08027034252882004,,,,,, +14,48849,,,,,,,,,,,,0.07960952818393707,,,,,, +14,48899,,,,,,,,,,,,0.08534999191761017,,,,,, +14,48949,,,,,,,,,,,,0.0772729367017746,,,,,, +14,48999,,,,,,,,,,,,0.07688818871974945,,,,,, +14,49049,,,,,,,,,,,,0.08055005967617035,,,,,, +14,49099,,,,,,,,,,,,0.08048661053180695,,,,,, +14,49149,,,,,,,,,,,,0.06635408103466034,,,,,, +14,49199,,,,,,,,,,,,0.07757096737623215,,,,,, +14,49249,,,,,,,,,,,,0.07794018089771271,,,,,, +14,49299,,,,,,,,,,,,0.08640007674694061,,,,,, +14,49349,,,,,,,,,,,,0.07933381199836731,,,,,, +14,49399,,,,,,,,,,,,0.07510542869567871,,,,,, +14,49449,,,,,,,,,,,,0.06770873069763184,,,,,, +14,49499,,,,,,,,,,,,0.07642021030187607,,,,,, +14,49549,,,,,,,,,,,,0.06462986022233963,,,,,, +14,49599,,,,,,,,,,,,0.08094547688961029,,,,,, +14,49649,,,,,,,,,,,,0.07712292671203613,,,,,, +14,49699,,,,,,,,,,,,0.07722680270671844,,,,,, +14,49749,,,,,,,,,,,,0.07581642270088196,,,,,, +14,49799,,,,,,,,,,,,0.07349372655153275,,,,,, +14,49849,,,,,,,,,,,,0.07514603435993195,,,,,, +14,49899,,,,,,,,,,,,0.07218390703201294,,,,,, +14,49949,,,,,,,,,,,,0.07170891016721725,,,,,, +14,49999,,,,,,,,,,,,0.06900948286056519,,,,,, +14,50049,,,,,,,,,,,,0.08059555292129517,,,,,, +14,50099,,,,,,,,,,,,0.08415459096431732,,,,,, +14,50149,,,,,,,,,,,,0.07736603915691376,,,,,, +14,50199,,,,,,,,,,,,0.07883919775485992,,,,,, +14,50249,,,,,,,,,,,,0.09267003834247589,,,,,, +14,50299,,,,,,,,,,,,0.08297699689865112,,,,,, +14,50349,,,,,,,,,,,,0.08360593020915985,,,,,, +14,50399,,,,,,,,,,,,0.0844041109085083,,,,,, +14,50449,,,,,,,,,,,,0.07934199273586273,,,,,, +14,50499,,,,,,,,,,,,0.0753021389245987,,,,,, +14,50549,,,,,,,,,,,,0.08359977602958679,,,,,, +14,50599,,,,,,,,,,,,0.08381339907646179,,,,,, +14,50649,,,,,,,,,,,,0.08050873130559921,,,,,, +14,50699,,,,,,,,,,,,0.08457154035568237,,,,,, +14,50749,,,,,,,,,,,,0.07449071109294891,,,,,, +14,50799,,,,,,,,,,,,0.08060254156589508,,,,,, +14,50849,,,,,,,,,,,,0.07908304035663605,,,,,, +14,50899,,,,,,,,,,,,0.07632893323898315,,,,,, +14,50949,,,,,,,,,,,,0.07065768539905548,,,,,, +14,50999,,,,,,,,,,,,0.07867173850536346,,,,,, +14,51049,,,,,,,,,,,,0.07219832390546799,,,,,, +14,51099,,,,,,,,,,,,0.08673472702503204,,,,,, +14,51149,,,,,,,,,,,,0.086065873503685,,,,,, +14,51199,,,,,,,,,,,,0.08250110596418381,,,,,, +14,51249,,,,,,,,,,,,0.07497118413448334,,,,,, +14,51299,,,,,,,,,,,,0.08567918837070465,,,,,, +14,51349,,,,,,,,,,,,0.0792401060461998,,,,,, +14,51399,,,,,,,,,,,,0.07487337291240692,,,,,, +14,51449,,,,,,,,,,,,0.09003639966249466,,,,,, +14,51499,,,,,,,,,,,,0.08107943832874298,,,,,, +14,51549,,,,,,,,,,,,0.0983937457203865,,,,,, +14,51599,,,,,,,,,,,,0.08257374167442322,,,,,, +14,51629,,,,,,,,,,,,,0.24099986255168915,0.07947327196598053,0.2326505482196808,0.04364466667175293,0.23904626071453094,0.07947327196598053 +14,51629,,,,,,,0.24178485572338104,0.07916682213544846,0.20729802548885345,0.04289931058883667,0.1901732087135315,,,,,,, +15,51649,,,,,,,,,,,,0.08766642212867737,,,,,, +15,51699,,,,,,,,,,,,0.07750684022903442,,,,,, +15,51749,,,,,,,,,,,,0.07967983186244965,,,,,, +15,51799,,,,,,,,,,,,0.08660466969013214,,,,,, +15,51849,,,,,,,,,,,,0.0657753199338913,,,,,, +15,51899,,,,,,,,,,,,0.07782848179340363,,,,,, +15,51949,,,,,,,,,,,,0.07413145154714584,,,,,, +15,51999,,,,,,,,,,,,0.08556340634822845,,,,,, +15,52049,,,,,,,,,,,,0.08290370553731918,,,,,, +15,52099,,,,,,,,,,,,0.07432219386100769,,,,,, +15,52149,,,,,,,,,,,,0.08314363658428192,,,,,, +15,52199,,,,,,,,,,,,0.09213245660066605,,,,,, +15,52249,,,,,,,,,,,,0.09386727958917618,,,,,, +15,52299,,,,,,,,,,,,0.07340888679027557,,,,,, +15,52349,,,,,,,,,,,,0.08020219206809998,,,,,, +15,52399,,,,,,,,,,,,0.0767393708229065,,,,,, +15,52449,,,,,,,,,,,,0.06195534020662308,,,,,, +15,52499,,,,,,,,,,,,0.07641392946243286,,,,,, +15,52549,,,,,,,,,,,,0.07918092608451843,,,,,, +15,52599,,,,,,,,,,,,0.08636471629142761,,,,,, +15,52649,,,,,,,,,,,,0.0649845078587532,,,,,, +15,52699,,,,,,,,,,,,0.07918545603752136,,,,,, +15,52749,,,,,,,,,,,,0.060996245592832565,,,,,, +15,52799,,,,,,,,,,,,0.08096889406442642,,,,,, +15,52849,,,,,,,,,,,,0.06708850711584091,,,,,, +15,52899,,,,,,,,,,,,0.07939746230840683,,,,,, +15,52949,,,,,,,,,,,,0.07378124445676804,,,,,, +15,52999,,,,,,,,,,,,0.07656338810920715,,,,,, +15,53049,,,,,,,,,,,,0.09408596158027649,,,,,, +15,53099,,,,,,,,,,,,0.07964035868644714,,,,,, +15,53149,,,,,,,,,,,,0.0864410549402237,,,,,, +15,53199,,,,,,,,,,,,0.07265092432498932,,,,,, +15,53249,,,,,,,,,,,,0.0752708911895752,,,,,, +15,53299,,,,,,,,,,,,0.073488250374794,,,,,, +15,53349,,,,,,,,,,,,0.08241529017686844,,,,,, +15,53399,,,,,,,,,,,,0.07634443044662476,,,,,, +15,53449,,,,,,,,,,,,0.08359363675117493,,,,,, +15,53499,,,,,,,,,,,,0.0841904804110527,,,,,, +15,53549,,,,,,,,,,,,0.0801098644733429,,,,,, +15,53599,,,,,,,,,,,,0.0720745325088501,,,,,, +15,53649,,,,,,,,,,,,0.08324743062257767,,,,,, +15,53699,,,,,,,,,,,,0.07361061125993729,,,,,, +15,53749,,,,,,,,,,,,0.0793464183807373,,,,,, +15,53799,,,,,,,,,,,,0.08537358790636063,,,,,, +15,53849,,,,,,,,,,,,0.07725880295038223,,,,,, +15,53899,,,,,,,,,,,,0.08216245472431183,,,,,, +15,53949,,,,,,,,,,,,0.07536537945270538,,,,,, +15,53999,,,,,,,,,,,,0.06687271595001221,,,,,, +15,54049,,,,,,,,,,,,0.0742231011390686,,,,,, +15,54099,,,,,,,,,,,,0.07568004727363586,,,,,, +15,54149,,,,,,,,,,,,0.07589572668075562,,,,,, +15,54199,,,,,,,,,,,,0.08235152065753937,,,,,, +15,54249,,,,,,,,,,,,0.08535517752170563,,,,,, +15,54299,,,,,,,,,,,,0.08348753303289413,,,,,, +15,54349,,,,,,,,,,,,0.08445662260055542,,,,,, +15,54399,,,,,,,,,,,,0.07851489633321762,,,,,, +15,54449,,,,,,,,,,,,0.07068120688199997,,,,,, +15,54499,,,,,,,,,,,,0.07315817475318909,,,,,, +15,54549,,,,,,,,,,,,0.07948549091815948,,,,,, +15,54599,,,,,,,,,,,,0.07696142792701721,,,,,, +15,54649,,,,,,,,,,,,0.08526325225830078,,,,,, +15,54699,,,,,,,,,,,,0.0817740261554718,,,,,, +15,54749,,,,,,,,,,,,0.07398094236850739,,,,,, +15,54799,,,,,,,,,,,,0.0785546749830246,,,,,, +15,54849,,,,,,,,,,,,0.0839364305138588,,,,,, +15,54899,,,,,,,,,,,,0.07086585462093353,,,,,, +15,54949,,,,,,,,,,,,0.08579406142234802,,,,,, +15,54999,,,,,,,,,,,,0.07577846944332123,,,,,, +15,55049,,,,,,,,,,,,0.07231742143630981,,,,,, +15,55071,,,,,,,,,,,,,0.24071632325649261,0.07922999560832977,0.23489585518836975,0.046572208404541016,0.23154710233211517,0.07922999560832977 +15,55071,,,,,,,0.24190141260623932,0.07925114780664444,0.20502683520317078,0.04187804460525513,0.1882825344800949,,,,,,, +16,55099,,,,,,,,,,,,0.07994569092988968,,,,,, +16,55149,,,,,,,,,,,,0.08040454983711243,,,,,, +16,55199,,,,,,,,,,,,0.06779056787490845,,,,,, +16,55249,,,,,,,,,,,,0.07407158613204956,,,,,, +16,55299,,,,,,,,,,,,0.07448413968086243,,,,,, +16,55349,,,,,,,,,,,,0.07764831185340881,,,,,, +16,55399,,,,,,,,,,,,0.0803091824054718,,,,,, +16,55449,,,,,,,,,,,,0.08109224587678909,,,,,, +16,55499,,,,,,,,,,,,0.0880620926618576,,,,,, +16,55549,,,,,,,,,,,,0.06979673355817795,,,,,, +16,55599,,,,,,,,,,,,0.0798625499010086,,,,,, +16,55649,,,,,,,,,,,,0.07636760920286179,,,,,, +16,55699,,,,,,,,,,,,0.09268774092197418,,,,,, +16,55749,,,,,,,,,,,,0.08629266917705536,,,,,, +16,55799,,,,,,,,,,,,0.07079552859067917,,,,,, +16,55849,,,,,,,,,,,,0.08312766999006271,,,,,, +16,55899,,,,,,,,,,,,0.08189016580581665,,,,,, +16,55949,,,,,,,,,,,,0.07318353652954102,,,,,, +16,55999,,,,,,,,,,,,0.08086413145065308,,,,,, +16,56049,,,,,,,,,,,,0.07817394286394119,,,,,, +16,56099,,,,,,,,,,,,0.07887101173400879,,,,,, +16,56149,,,,,,,,,,,,0.09173613786697388,,,,,, +16,56199,,,,,,,,,,,,0.06640617549419403,,,,,, +16,56249,,,,,,,,,,,,0.07985210418701172,,,,,, +16,56299,,,,,,,,,,,,0.07561241090297699,,,,,, +16,56349,,,,,,,,,,,,0.0779528021812439,,,,,, +16,56399,,,,,,,,,,,,0.06679721176624298,,,,,, +16,56449,,,,,,,,,,,,0.07657916843891144,,,,,, +16,56499,,,,,,,,,,,,0.08175969123840332,,,,,, +16,56549,,,,,,,,,,,,0.07652700692415237,,,,,, +16,56599,,,,,,,,,,,,0.07508009672164917,,,,,, +16,56649,,,,,,,,,,,,0.09020711481571198,,,,,, +16,56699,,,,,,,,,,,,0.08039967715740204,,,,,, +16,56749,,,,,,,,,,,,0.07701721787452698,,,,,, +16,56799,,,,,,,,,,,,0.08762344717979431,,,,,, +16,56849,,,,,,,,,,,,0.07233675569295883,,,,,, +16,56899,,,,,,,,,,,,0.07712973654270172,,,,,, +16,56949,,,,,,,,,,,,0.07400504499673843,,,,,, +16,56999,,,,,,,,,,,,0.07392363250255585,,,,,, +16,57049,,,,,,,,,,,,0.07830601930618286,,,,,, +16,57099,,,,,,,,,,,,0.07760010659694672,,,,,, +16,57149,,,,,,,,,,,,0.07993049174547195,,,,,, +16,57199,,,,,,,,,,,,0.08295446634292603,,,,,, +16,57249,,,,,,,,,,,,0.07976222783327103,,,,,, +16,57299,,,,,,,,,,,,0.0854712724685669,,,,,, +16,57349,,,,,,,,,,,,0.06639441847801208,,,,,, +16,57399,,,,,,,,,,,,0.07439795136451721,,,,,, +16,57449,,,,,,,,,,,,0.08005918562412262,,,,,, +16,57499,,,,,,,,,,,,0.07990963757038116,,,,,, +16,57549,,,,,,,,,,,,0.0835740715265274,,,,,, +16,57599,,,,,,,,,,,,0.08683216571807861,,,,,, +16,57649,,,,,,,,,,,,0.08122837543487549,,,,,, +16,57699,,,,,,,,,,,,0.07272133976221085,,,,,, +16,57749,,,,,,,,,,,,0.07964323461055756,,,,,, +16,57799,,,,,,,,,,,,0.087877556681633,,,,,, +16,57849,,,,,,,,,,,,0.08602922409772873,,,,,, +16,57899,,,,,,,,,,,,0.08257275819778442,,,,,, +16,57949,,,,,,,,,,,,0.08527883142232895,,,,,, +16,57999,,,,,,,,,,,,0.07166087627410889,,,,,, +16,58049,,,,,,,,,,,,0.08936122059822083,,,,,, +16,58099,,,,,,,,,,,,0.07139003276824951,,,,,, +16,58149,,,,,,,,,,,,0.07101976871490479,,,,,, +16,58199,,,,,,,,,,,,0.084046870470047,,,,,, +16,58249,,,,,,,,,,,,0.08492501080036163,,,,,, +16,58299,,,,,,,,,,,,0.07917823642492294,,,,,, +16,58349,,,,,,,,,,,,0.08471740037202835,,,,,, +16,58399,,,,,,,,,,,,0.07993414998054504,,,,,, +16,58449,,,,,,,,,,,,0.07247178256511688,,,,,, +16,58499,,,,,,,,,,,,0.07628390938043594,,,,,, +16,58513,,,,,,,,,,,,,0.241384357213974,0.07899462431669235,0.22431279718875885,0.0494045615196228,0.23023171722888947,0.07899462431669235 +16,58513,,,,,,,0.24129991233348846,0.07894059270620346,0.21391816437244415,0.04563248157501221,0.19451071321964264,,,,,,, +17,58549,,,,,,,,,,,,0.08019521832466125,,,,,, +17,58599,,,,,,,,,,,,0.07925580441951752,,,,,, +17,58649,,,,,,,,,,,,0.08846445381641388,,,,,, +17,58699,,,,,,,,,,,,0.07302327454090118,,,,,, +17,58749,,,,,,,,,,,,0.0815998986363411,,,,,, +17,58799,,,,,,,,,,,,0.07962475717067719,,,,,, +17,58849,,,,,,,,,,,,0.07409192621707916,,,,,, +17,58899,,,,,,,,,,,,0.07526617497205734,,,,,, +17,58949,,,,,,,,,,,,0.06826764345169067,,,,,, +17,58999,,,,,,,,,,,,0.08187077939510345,,,,,, +17,59049,,,,,,,,,,,,0.07609827071428299,,,,,, +17,59099,,,,,,,,,,,,0.07954868674278259,,,,,, +17,59149,,,,,,,,,,,,0.07802005857229233,,,,,, +17,59199,,,,,,,,,,,,0.08137990534305573,,,,,, +17,59249,,,,,,,,,,,,0.07579783350229263,,,,,, +17,59299,,,,,,,,,,,,0.08425957709550858,,,,,, +17,59349,,,,,,,,,,,,0.08075836300849915,,,,,, +17,59399,,,,,,,,,,,,0.08143538981676102,,,,,, +17,59449,,,,,,,,,,,,0.08278191089630127,,,,,, +17,59499,,,,,,,,,,,,0.09463638067245483,,,,,, +17,59549,,,,,,,,,,,,0.07056257128715515,,,,,, +17,59599,,,,,,,,,,,,0.07400235533714294,,,,,, +17,59649,,,,,,,,,,,,0.083785280585289,,,,,, +17,59699,,,,,,,,,,,,0.08505694568157196,,,,,, +17,59749,,,,,,,,,,,,0.07391220331192017,,,,,, +17,59799,,,,,,,,,,,,0.07430337369441986,,,,,, +17,59849,,,,,,,,,,,,0.07225765287876129,,,,,, +17,59899,,,,,,,,,,,,0.08926801383495331,,,,,, +17,59949,,,,,,,,,,,,0.0873190313577652,,,,,, +17,59999,,,,,,,,,,,,0.08301331847906113,,,,,, +17,60049,,,,,,,,,,,,0.08559492230415344,,,,,, +17,60099,,,,,,,,,,,,0.08465736359357834,,,,,, +17,60149,,,,,,,,,,,,0.07699035853147507,,,,,, +17,60199,,,,,,,,,,,,0.07956302911043167,,,,,, +17,60249,,,,,,,,,,,,0.08502202481031418,,,,,, +17,60299,,,,,,,,,,,,0.08184468001127243,,,,,, +17,60349,,,,,,,,,,,,0.06423063576221466,,,,,, +17,60399,,,,,,,,,,,,0.07522532343864441,,,,,, +17,60449,,,,,,,,,,,,0.06981655955314636,,,,,, +17,60499,,,,,,,,,,,,0.08594405651092529,,,,,, +17,60549,,,,,,,,,,,,0.0748823881149292,,,,,, +17,60599,,,,,,,,,,,,0.08173147588968277,,,,,, +17,60649,,,,,,,,,,,,0.07728245854377747,,,,,, +17,60699,,,,,,,,,,,,0.07972457259893417,,,,,, +17,60749,,,,,,,,,,,,0.0672285333275795,,,,,, +17,60799,,,,,,,,,,,,0.0775943174958229,,,,,, +17,60849,,,,,,,,,,,,0.08261518180370331,,,,,, +17,60899,,,,,,,,,,,,0.07339030504226685,,,,,, +17,60949,,,,,,,,,,,,0.06957874447107315,,,,,, +17,60999,,,,,,,,,,,,0.0772097185254097,,,,,, +17,61049,,,,,,,,,,,,0.07405811548233032,,,,,, +17,61099,,,,,,,,,,,,0.07193551957607269,,,,,, +17,61149,,,,,,,,,,,,0.06880258768796921,,,,,, +17,61199,,,,,,,,,,,,0.0659700259566307,,,,,, +17,61249,,,,,,,,,,,,0.07900280505418777,,,,,, +17,61299,,,,,,,,,,,,0.06730806827545166,,,,,, +17,61349,,,,,,,,,,,,0.08286543190479279,,,,,, +17,61399,,,,,,,,,,,,0.07767342031002045,,,,,, +17,61449,,,,,,,,,,,,0.08779285103082657,,,,,, +17,61499,,,,,,,,,,,,0.0850822851061821,,,,,, +17,61549,,,,,,,,,,,,0.0728747546672821,,,,,, +17,61599,,,,,,,,,,,,0.07663492858409882,,,,,, +17,61649,,,,,,,,,,,,0.08607141673564911,,,,,, +17,61699,,,,,,,,,,,,0.08152499794960022,,,,,, +17,61749,,,,,,,,,,,,0.07035087049007416,,,,,, +17,61799,,,,,,,,,,,,0.07574404776096344,,,,,, +17,61849,,,,,,,,,,,,0.08548112213611603,,,,,, +17,61899,,,,,,,,,,,,0.0803617388010025,,,,,, +17,61949,,,,,,,,,,,,0.07371127605438232,,,,,, +17,61955,,,,,,,,,,,,,0.23931851983070374,0.07857357710599899,0.24261650443077087,0.05447125434875488,0.2396438717842102,0.07857357710599899 +17,61955,,,,,,,0.24063971638679504,0.07857487350702286,0.22396399080753326,0.05006420612335205,0.2061796486377716,,,,,,, +18,61999,,,,,,,,,,,,0.08571404218673706,,,,,, +18,62049,,,,,,,,,,,,0.07370974123477936,,,,,, +18,62099,,,,,,,,,,,,0.08747898042201996,,,,,, +18,62149,,,,,,,,,,,,0.06930047273635864,,,,,, +18,62199,,,,,,,,,,,,0.07219206541776657,,,,,, +18,62249,,,,,,,,,,,,0.07430537045001984,,,,,, +18,62299,,,,,,,,,,,,0.07724505662918091,,,,,, +18,62349,,,,,,,,,,,,0.06407861411571503,,,,,, +18,62399,,,,,,,,,,,,0.07671123743057251,,,,,, +18,62449,,,,,,,,,,,,0.08072690665721893,,,,,, +18,62499,,,,,,,,,,,,0.08953673392534256,,,,,, +18,62549,,,,,,,,,,,,0.0939422994852066,,,,,, +18,62599,,,,,,,,,,,,0.0756952315568924,,,,,, +18,62649,,,,,,,,,,,,0.08330004662275314,,,,,, +18,62699,,,,,,,,,,,,0.07842137664556503,,,,,, +18,62749,,,,,,,,,,,,0.08067348599433899,,,,,, +18,62799,,,,,,,,,,,,0.07310633361339569,,,,,, +18,62849,,,,,,,,,,,,0.08508110046386719,,,,,, +18,62899,,,,,,,,,,,,0.07530415803194046,,,,,, +18,62949,,,,,,,,,,,,0.0817365050315857,,,,,, +18,62999,,,,,,,,,,,,0.07567909359931946,,,,,, +18,63049,,,,,,,,,,,,0.07955209910869598,,,,,, +18,63099,,,,,,,,,,,,0.0662810355424881,,,,,, +18,63149,,,,,,,,,,,,0.09396852552890778,,,,,, +18,63199,,,,,,,,,,,,0.07475044578313828,,,,,, +18,63249,,,,,,,,,,,,0.08328313380479813,,,,,, +18,63299,,,,,,,,,,,,0.06898656487464905,,,,,, +18,63349,,,,,,,,,,,,0.07093784213066101,,,,,, +18,63399,,,,,,,,,,,,0.08857031911611557,,,,,, +18,63449,,,,,,,,,,,,0.07069101184606552,,,,,, +18,63499,,,,,,,,,,,,0.07539486885070801,,,,,, +18,63549,,,,,,,,,,,,0.07840478420257568,,,,,, +18,63599,,,,,,,,,,,,0.05985422804951668,,,,,, +18,63649,,,,,,,,,,,,0.08542075753211975,,,,,, +18,63699,,,,,,,,,,,,0.07145784795284271,,,,,, +18,63749,,,,,,,,,,,,0.07961788028478622,,,,,, +18,63799,,,,,,,,,,,,0.07571758329868317,,,,,, +18,63849,,,,,,,,,,,,0.07842151820659637,,,,,, +18,63899,,,,,,,,,,,,0.08503156900405884,,,,,, +18,63949,,,,,,,,,,,,0.08930724114179611,,,,,, +18,63999,,,,,,,,,,,,0.07850880920886993,,,,,, +18,64049,,,,,,,,,,,,0.06956826150417328,,,,,, +18,64099,,,,,,,,,,,,0.07531838864088058,,,,,, +18,64149,,,,,,,,,,,,0.08453455567359924,,,,,, +18,64199,,,,,,,,,,,,0.08384053409099579,,,,,, +18,64249,,,,,,,,,,,,0.07763989269733429,,,,,, +18,64299,,,,,,,,,,,,0.07492046058177948,,,,,, +18,64349,,,,,,,,,,,,0.09283323585987091,,,,,, +18,64399,,,,,,,,,,,,0.07893642783164978,,,,,, +18,64449,,,,,,,,,,,,0.08029558509588242,,,,,, +18,64499,,,,,,,,,,,,0.07020410895347595,,,,,, +18,64549,,,,,,,,,,,,0.07258628308773041,,,,,, +18,64599,,,,,,,,,,,,0.0766410380601883,,,,,, +18,64649,,,,,,,,,,,,0.08777517080307007,,,,,, +18,64699,,,,,,,,,,,,0.07460556924343109,,,,,, +18,64749,,,,,,,,,,,,0.07658138871192932,,,,,, +18,64799,,,,,,,,,,,,0.07527855038642883,,,,,, +18,64849,,,,,,,,,,,,0.06343454122543335,,,,,, +18,64899,,,,,,,,,,,,0.07909287512302399,,,,,, +18,64949,,,,,,,,,,,,0.07088913768529892,,,,,, +18,64999,,,,,,,,,,,,0.06850825995206833,,,,,, +18,65049,,,,,,,,,,,,0.08230212330818176,,,,,, +18,65099,,,,,,,,,,,,0.07856966555118561,,,,,, +18,65149,,,,,,,,,,,,0.07042285799980164,,,,,, +18,65199,,,,,,,,,,,,0.06543370336294174,,,,,, +18,65249,,,,,,,,,,,,0.07471765577793121,,,,,, +18,65299,,,,,,,,,,,,0.07565029710531235,,,,,, +18,65349,,,,,,,,,,,,0.06922998279333115,,,,,, +18,65397,,,,,,,,,,,,,0.23958851397037506,0.07878779619932175,0.2505348026752472,0.051893413066864014,0.2520864009857178,0.07878779619932175 +18,65397,,,,,,,0.2400626838207245,0.07827277481555939,0.23194514214992523,0.05371779203414917,0.21737979352474213,,,,,,, +19,65399,,,,,,,,,,,,0.07228108495473862,,,,,, +19,65449,,,,,,,,,,,,0.07989360392093658,,,,,, +19,65499,,,,,,,,,,,,0.08177002519369125,,,,,, +19,65549,,,,,,,,,,,,0.08556881546974182,,,,,, +19,65599,,,,,,,,,,,,0.0780840590596199,,,,,, +19,65649,,,,,,,,,,,,0.0791015475988388,,,,,, +19,65699,,,,,,,,,,,,0.07546624541282654,,,,,, +19,65749,,,,,,,,,,,,0.07843722403049469,,,,,, +19,65799,,,,,,,,,,,,0.07217366993427277,,,,,, +19,65849,,,,,,,,,,,,0.0667877271771431,,,,,, +19,65899,,,,,,,,,,,,0.07552404701709747,,,,,, +19,65949,,,,,,,,,,,,0.07695210725069046,,,,,, +19,65999,,,,,,,,,,,,0.08364273607730865,,,,,, +19,66049,,,,,,,,,,,,0.09004054218530655,,,,,, +19,66099,,,,,,,,,,,,0.07166894525289536,,,,,, +19,66149,,,,,,,,,,,,0.08299849927425385,,,,,, +19,66199,,,,,,,,,,,,0.08763295412063599,,,,,, +19,66249,,,,,,,,,,,,0.07128752768039703,,,,,, +19,66299,,,,,,,,,,,,0.08390267193317413,,,,,, +19,66349,,,,,,,,,,,,0.07375380396842957,,,,,, +19,66399,,,,,,,,,,,,0.07131229341030121,,,,,, +19,66449,,,,,,,,,,,,0.07347719371318817,,,,,, +19,66499,,,,,,,,,,,,0.07774107903242111,,,,,, +19,66549,,,,,,,,,,,,0.08062049746513367,,,,,, +19,66599,,,,,,,,,,,,0.06848745048046112,,,,,, +19,66649,,,,,,,,,,,,0.07943341881036758,,,,,, +19,66699,,,,,,,,,,,,0.0960405245423317,,,,,, +19,66749,,,,,,,,,,,,0.07765446603298187,,,,,, +19,66799,,,,,,,,,,,,0.07865361869335175,,,,,, +19,66849,,,,,,,,,,,,0.08161932229995728,,,,,, +19,66899,,,,,,,,,,,,0.08379881083965302,,,,,, +19,66949,,,,,,,,,,,,0.08056908845901489,,,,,, +19,66999,,,,,,,,,,,,0.06892462074756622,,,,,, +19,67049,,,,,,,,,,,,0.08439265936613083,,,,,, +19,67099,,,,,,,,,,,,0.07701234519481659,,,,,, +19,67149,,,,,,,,,,,,0.08230757713317871,,,,,, +19,67199,,,,,,,,,,,,0.07636415213346481,,,,,, +19,67249,,,,,,,,,,,,0.07794579863548279,,,,,, +19,67299,,,,,,,,,,,,0.07095569372177124,,,,,, +19,67349,,,,,,,,,,,,0.07677257806062698,,,,,, +19,67399,,,,,,,,,,,,0.06689631938934326,,,,,, +19,67449,,,,,,,,,,,,0.0677928775548935,,,,,, +19,67499,,,,,,,,,,,,0.06915619224309921,,,,,, +19,67549,,,,,,,,,,,,0.07363127171993256,,,,,, +19,67599,,,,,,,,,,,,0.07739996165037155,,,,,, +19,67649,,,,,,,,,,,,0.07930459082126617,,,,,, +19,67699,,,,,,,,,,,,0.08503320068120956,,,,,, +19,67749,,,,,,,,,,,,0.06772001087665558,,,,,, +19,67799,,,,,,,,,,,,0.07725600898265839,,,,,, +19,67849,,,,,,,,,,,,0.08828844130039215,,,,,, +19,67899,,,,,,,,,,,,0.0655374675989151,,,,,, +19,67949,,,,,,,,,,,,0.08175307512283325,,,,,, +19,67999,,,,,,,,,,,,0.07078072428703308,,,,,, +19,68049,,,,,,,,,,,,0.07861261069774628,,,,,, +19,68099,,,,,,,,,,,,0.07872909307479858,,,,,, +19,68149,,,,,,,,,,,,0.07397574186325073,,,,,, +19,68199,,,,,,,,,,,,0.08371693640947342,,,,,, +19,68249,,,,,,,,,,,,0.08498790860176086,,,,,, +19,68299,,,,,,,,,,,,0.07943134009838104,,,,,, +19,68349,,,,,,,,,,,,0.06575281918048859,,,,,, +19,68399,,,,,,,,,,,,0.08465763181447983,,,,,, +19,68449,,,,,,,,,,,,0.0862557515501976,,,,,, +19,68499,,,,,,,,,,,,0.07852642983198166,,,,,, +19,68549,,,,,,,,,,,,0.07798194140195847,,,,,, +19,68599,,,,,,,,,,,,0.08353415131568909,,,,,, +19,68649,,,,,,,,,,,,0.08552704751491547,,,,,, +19,68699,,,,,,,,,,,,0.08517522364854813,,,,,, +19,68749,,,,,,,,,,,,0.07902072370052338,,,,,, +19,68799,,,,,,,,,,,,0.08877882361412048,,,,,, +19,68839,,,,,,,,,,,,,0.2391943633556366,0.0779745951294899,0.24885542690753937,0.06167924404144287,0.24448998272418976,0.0779745951294899 +19,68839,,,,,,,0.2394639104604721,0.07797623425722122,0.23953811824321747,0.057295918464660645,0.22621040046215057,,,,,,, +20,68849,,,,,,,,,,,,0.07678967714309692,,,,,, +20,68899,,,,,,,,,,,,0.0924215316772461,,,,,, +20,68949,,,,,,,,,,,,0.08743187040090561,,,,,, +20,68999,,,,,,,,,,,,0.08691168576478958,,,,,, +20,69049,,,,,,,,,,,,0.0765436440706253,,,,,, +20,69099,,,,,,,,,,,,0.073025181889534,,,,,, +20,69149,,,,,,,,,,,,0.07763504236936569,,,,,, +20,69199,,,,,,,,,,,,0.07853385806083679,,,,,, +20,69249,,,,,,,,,,,,0.07130952924489975,,,,,, +20,69299,,,,,,,,,,,,0.07124191522598267,,,,,, +20,69349,,,,,,,,,,,,0.08875470608472824,,,,,, +20,69399,,,,,,,,,,,,0.07922476530075073,,,,,, +20,69449,,,,,,,,,,,,0.0896676629781723,,,,,, +20,69499,,,,,,,,,,,,0.0726768970489502,,,,,, +20,69549,,,,,,,,,,,,0.08366848528385162,,,,,, +20,69599,,,,,,,,,,,,0.08431189507246017,,,,,, +20,69649,,,,,,,,,,,,0.07467599958181381,,,,,, +20,69699,,,,,,,,,,,,0.09166494756937027,,,,,, +20,69749,,,,,,,,,,,,0.07352179288864136,,,,,, +20,69799,,,,,,,,,,,,0.08185907453298569,,,,,, +20,69849,,,,,,,,,,,,0.07656821608543396,,,,,, +20,69899,,,,,,,,,,,,0.06925448775291443,,,,,, +20,69949,,,,,,,,,,,,0.09050078690052032,,,,,, +20,69999,,,,,,,,,,,,0.08198203891515732,,,,,, +20,70049,,,,,,,,,,,,0.08153223991394043,,,,,, +20,70099,,,,,,,,,,,,0.07296689599752426,,,,,, +20,70149,,,,,,,,,,,,0.07461318373680115,,,,,, +20,70199,,,,,,,,,,,,0.08112572133541107,,,,,, +20,70249,,,,,,,,,,,,0.0876668244600296,,,,,, +20,70299,,,,,,,,,,,,0.07458813488483429,,,,,, +20,70349,,,,,,,,,,,,0.06795904040336609,,,,,, +20,70399,,,,,,,,,,,,0.09291836619377136,,,,,, +20,70449,,,,,,,,,,,,0.07786864787340164,,,,,, +20,70499,,,,,,,,,,,,0.0804678350687027,,,,,, +20,70549,,,,,,,,,,,,0.08885513246059418,,,,,, +20,70599,,,,,,,,,,,,0.08084531128406525,,,,,, +20,70649,,,,,,,,,,,,0.08408054709434509,,,,,, +20,70699,,,,,,,,,,,,0.06868989765644073,,,,,, +20,70749,,,,,,,,,,,,0.06403051316738129,,,,,, +20,70799,,,,,,,,,,,,0.07682237029075623,,,,,, +20,70849,,,,,,,,,,,,0.07122635841369629,,,,,, +20,70899,,,,,,,,,,,,0.0778256356716156,,,,,, +20,70949,,,,,,,,,,,,0.0796879306435585,,,,,, +20,70999,,,,,,,,,,,,0.08231154829263687,,,,,, +20,71049,,,,,,,,,,,,0.07898160070180893,,,,,, +20,71099,,,,,,,,,,,,0.07643432915210724,,,,,, +20,71149,,,,,,,,,,,,0.07903257012367249,,,,,, +20,71199,,,,,,,,,,,,0.06946554034948349,,,,,, +20,71249,,,,,,,,,,,,0.07433602213859558,,,,,, +20,71299,,,,,,,,,,,,0.08634422719478607,,,,,, +20,71349,,,,,,,,,,,,0.08240221440792084,,,,,, +20,71399,,,,,,,,,,,,0.07454998046159744,,,,,, +20,71449,,,,,,,,,,,,0.08235757052898407,,,,,, +20,71499,,,,,,,,,,,,0.07554340362548828,,,,,, +20,71549,,,,,,,,,,,,0.09687885642051697,,,,,, +20,71599,,,,,,,,,,,,0.08102075755596161,,,,,, +20,71649,,,,,,,,,,,,0.07695257663726807,,,,,, +20,71699,,,,,,,,,,,,0.0939171314239502,,,,,, +20,71749,,,,,,,,,,,,0.0912400633096695,,,,,, +20,71799,,,,,,,,,,,,0.059226684272289276,,,,,, +20,71849,,,,,,,,,,,,0.06357944756746292,,,,,, +20,71899,,,,,,,,,,,,0.06851917505264282,,,,,, +20,71949,,,,,,,,,,,,0.07361558079719543,,,,,, +20,71999,,,,,,,,,,,,0.08267616480588913,,,,,, +20,72049,,,,,,,,,,,,0.06183178722858429,,,,,, +20,72099,,,,,,,,,,,,0.08002305030822754,,,,,, +20,72149,,,,,,,,,,,,0.06964698433876038,,,,,, +20,72199,,,,,,,,,,,,0.07290057837963104,,,,,, +20,72249,,,,,,,,,,,,0.07291560620069504,,,,,, +20,72281,,,,,,,,,,,,,0.2402544617652893,0.07801138609647751,0.26579052209854126,0.06123650074005127,0.2695119082927704,0.07801138609647751 +20,72281,,,,,,,0.2396397590637207,0.0781533494591713,0.23521967232227325,0.055142343044281006,0.22168505191802979,,,,,,, +21,72299,,,,,,,,,,,,0.08169551193714142,,,,,, +21,72349,,,,,,,,,,,,0.07585972547531128,,,,,, +21,72399,,,,,,,,,,,,0.07830546796321869,,,,,, +21,72449,,,,,,,,,,,,0.0689893364906311,,,,,, +21,72499,,,,,,,,,,,,0.08822217583656311,,,,,, +21,72549,,,,,,,,,,,,0.0783132016658783,,,,,, +21,72599,,,,,,,,,,,,0.08019262552261353,,,,,, +21,72649,,,,,,,,,,,,0.07250368595123291,,,,,, +21,72699,,,,,,,,,,,,0.07310814410448074,,,,,, +21,72749,,,,,,,,,,,,0.0816638171672821,,,,,, +21,72799,,,,,,,,,,,,0.08342179656028748,,,,,, +21,72849,,,,,,,,,,,,0.07789745926856995,,,,,, +21,72899,,,,,,,,,,,,0.08802282065153122,,,,,, +21,72949,,,,,,,,,,,,0.06747286021709442,,,,,, +21,72999,,,,,,,,,,,,0.09004061669111252,,,,,, +21,73049,,,,,,,,,,,,0.06995876133441925,,,,,, +21,73099,,,,,,,,,,,,0.08999887108802795,,,,,, +21,73149,,,,,,,,,,,,0.07447438687086105,,,,,, +21,73199,,,,,,,,,,,,0.08636150509119034,,,,,, +21,73249,,,,,,,,,,,,0.06332256644964218,,,,,, +21,73299,,,,,,,,,,,,0.08030954748392105,,,,,, +21,73349,,,,,,,,,,,,0.08319075405597687,,,,,, +21,73399,,,,,,,,,,,,0.07419274002313614,,,,,, +21,73449,,,,,,,,,,,,0.08319590985774994,,,,,, +21,73499,,,,,,,,,,,,0.08396793901920319,,,,,, +21,73549,,,,,,,,,,,,0.07697542756795883,,,,,, +21,73599,,,,,,,,,,,,0.07962307333946228,,,,,, +21,73649,,,,,,,,,,,,0.07366526126861572,,,,,, +21,73699,,,,,,,,,,,,0.084557443857193,,,,,, +21,73749,,,,,,,,,,,,0.06905453652143478,,,,,, +21,73799,,,,,,,,,,,,0.0837143063545227,,,,,, +21,73849,,,,,,,,,,,,0.08953030407428741,,,,,, +21,73899,,,,,,,,,,,,0.07698720693588257,,,,,, +21,73949,,,,,,,,,,,,0.08130140602588654,,,,,, +21,73999,,,,,,,,,,,,0.07504826039075851,,,,,, +21,74049,,,,,,,,,,,,0.08712884783744812,,,,,, +21,74099,,,,,,,,,,,,0.07019627094268799,,,,,, +21,74149,,,,,,,,,,,,0.07245337218046188,,,,,, +21,74199,,,,,,,,,,,,0.09354685246944427,,,,,, +21,74249,,,,,,,,,,,,0.07694651186466217,,,,,, +21,74299,,,,,,,,,,,,0.08925987780094147,,,,,, +21,74349,,,,,,,,,,,,0.08764636516571045,,,,,, +21,74399,,,,,,,,,,,,0.0801149308681488,,,,,, +21,74449,,,,,,,,,,,,0.08088903874158859,,,,,, +21,74499,,,,,,,,,,,,0.08037015050649643,,,,,, +21,74549,,,,,,,,,,,,0.08010628074407578,,,,,, +21,74599,,,,,,,,,,,,0.08739465475082397,,,,,, +21,74649,,,,,,,,,,,,0.08928348124027252,,,,,, +21,74699,,,,,,,,,,,,0.07426463067531586,,,,,, +21,74749,,,,,,,,,,,,0.07615432143211365,,,,,, +21,74799,,,,,,,,,,,,0.07718110829591751,,,,,, +21,74849,,,,,,,,,,,,0.0791437178850174,,,,,, +21,74899,,,,,,,,,,,,0.07676424086093903,,,,,, +21,74949,,,,,,,,,,,,0.07232227921485901,,,,,, +21,74999,,,,,,,,,,,,0.07640070468187332,,,,,, +21,75049,,,,,,,,,,,,0.07977764308452606,,,,,, +21,75099,,,,,,,,,,,,0.08518414199352264,,,,,, +21,75149,,,,,,,,,,,,0.08084143698215485,,,,,, +21,75199,,,,,,,,,,,,0.07707828283309937,,,,,, +21,75249,,,,,,,,,,,,0.08468247205018997,,,,,, +21,75299,,,,,,,,,,,,0.08115126192569733,,,,,, +21,75349,,,,,,,,,,,,0.08311198651790619,,,,,, +21,75399,,,,,,,,,,,,0.07532142102718353,,,,,, +21,75449,,,,,,,,,,,,0.06751550734043121,,,,,, +21,75499,,,,,,,,,,,,0.0697825700044632,,,,,, +21,75549,,,,,,,,,,,,0.07450689375400543,,,,,, +21,75599,,,,,,,,,,,,0.09790446609258652,,,,,, +21,75649,,,,,,,,,,,,0.06408946961164474,,,,,, +21,75699,,,,,,,,,,,,0.07792488485574722,,,,,, +21,75723,,,,,,,,,,,,,0.23862449824810028,0.07780660688877106,0.25617715716362,0.06370073556900024,0.25285738706588745,0.07780660688877106 +21,75723,,,,,,,0.24021758139133453,0.0793873742222786,0.20823730528354645,0.040232956409454346,0.21366076171398163,,,,,,, +22,75749,,,,,,,,,,,,0.08861784636974335,,,,,, +22,75799,,,,,,,,,,,,0.07389567792415619,,,,,, +22,75849,,,,,,,,,,,,0.0712437555193901,,,,,, +22,75899,,,,,,,,,,,,0.08321923017501831,,,,,, +22,75949,,,,,,,,,,,,0.07614864408969879,,,,,, +22,75999,,,,,,,,,,,,0.07817152142524719,,,,,, +22,76049,,,,,,,,,,,,0.07738884538412094,,,,,, +22,76099,,,,,,,,,,,,0.07756934314966202,,,,,, +22,76149,,,,,,,,,,,,0.07252934575080872,,,,,, +22,76199,,,,,,,,,,,,0.07291212677955627,,,,,, +22,76249,,,,,,,,,,,,0.07675354182720184,,,,,, +22,76299,,,,,,,,,,,,0.08256187289953232,,,,,, +22,76349,,,,,,,,,,,,0.08310994505882263,,,,,, +22,76399,,,,,,,,,,,,0.07785597443580627,,,,,, +22,76449,,,,,,,,,,,,0.07678617537021637,,,,,, +22,76499,,,,,,,,,,,,0.08252575248479843,,,,,, +22,76549,,,,,,,,,,,,0.07331319153308868,,,,,, +22,76599,,,,,,,,,,,,0.08987168967723846,,,,,, +22,76649,,,,,,,,,,,,0.090923011302948,,,,,, +22,76699,,,,,,,,,,,,0.07578139752149582,,,,,, +22,76749,,,,,,,,,,,,0.08300156891345978,,,,,, +22,76799,,,,,,,,,,,,0.07318586111068726,,,,,, +22,76849,,,,,,,,,,,,0.07581694424152374,,,,,, +22,76899,,,,,,,,,,,,0.06266003847122192,,,,,, +22,76949,,,,,,,,,,,,0.08035227656364441,,,,,, +22,76999,,,,,,,,,,,,0.07772544771432877,,,,,, +22,77049,,,,,,,,,,,,0.08292251080274582,,,,,, +22,77099,,,,,,,,,,,,0.07942275702953339,,,,,, +22,77149,,,,,,,,,,,,0.07529930770397186,,,,,, +22,77199,,,,,,,,,,,,0.07595883309841156,,,,,, +22,77249,,,,,,,,,,,,0.08303529769182205,,,,,, +22,77299,,,,,,,,,,,,0.07147911936044693,,,,,, +22,77349,,,,,,,,,,,,0.06991410255432129,,,,,, +22,77399,,,,,,,,,,,,0.07528719305992126,,,,,, +22,77449,,,,,,,,,,,,0.07445821911096573,,,,,, +22,77499,,,,,,,,,,,,0.0738358274102211,,,,,, +22,77549,,,,,,,,,,,,0.08567002415657043,,,,,, +22,77599,,,,,,,,,,,,0.06957617402076721,,,,,, +22,77649,,,,,,,,,,,,0.06579213589429855,,,,,, +22,77699,,,,,,,,,,,,0.07719643414020538,,,,,, +22,77749,,,,,,,,,,,,0.08245736360549927,,,,,, +22,77799,,,,,,,,,,,,0.0813710018992424,,,,,, +22,77849,,,,,,,,,,,,0.07940365374088287,,,,,, +22,77899,,,,,,,,,,,,0.07129083573818207,,,,,, +22,77949,,,,,,,,,,,,0.07667529582977295,,,,,, +22,77999,,,,,,,,,,,,0.07313471287488937,,,,,, +22,78049,,,,,,,,,,,,0.07295158505439758,,,,,, +22,78099,,,,,,,,,,,,0.08522462099790573,,,,,, +22,78149,,,,,,,,,,,,0.07460615038871765,,,,,, +22,78199,,,,,,,,,,,,0.08106102794408798,,,,,, +22,78249,,,,,,,,,,,,0.07718198001384735,,,,,, +22,78299,,,,,,,,,,,,0.07784663140773773,,,,,, +22,78349,,,,,,,,,,,,0.06688422709703445,,,,,, +22,78399,,,,,,,,,,,,0.08312809467315674,,,,,, +22,78449,,,,,,,,,,,,0.0764695405960083,,,,,, +22,78499,,,,,,,,,,,,0.0789233148097992,,,,,, +22,78549,,,,,,,,,,,,0.07336015999317169,,,,,, +22,78599,,,,,,,,,,,,0.07690032571554184,,,,,, +22,78649,,,,,,,,,,,,0.07752139866352081,,,,,, +22,78699,,,,,,,,,,,,0.06510206311941147,,,,,, +22,78749,,,,,,,,,,,,0.07004062086343765,,,,,, +22,78799,,,,,,,,,,,,0.08200949430465698,,,,,, +22,78849,,,,,,,,,,,,0.0624186247587204,,,,,, +22,78899,,,,,,,,,,,,0.07967151701450348,,,,,, +22,78949,,,,,,,,,,,,0.08117732405662537,,,,,, +22,78999,,,,,,,,,,,,0.07012531906366348,,,,,, +22,79049,,,,,,,,,,,,0.07496660202741623,,,,,, +22,79099,,,,,,,,,,,,0.08250214904546738,,,,,, +22,79149,,,,,,,,,,,,0.08193295449018478,,,,,, +22,79165,,,,,,,,,,,,,0.23971892893314362,0.07830619066953659,0.25215521454811096,0.05768895149230957,0.24779683351516724,0.07830619066953659 +22,79165,,,,,,,0.23847070336341858,0.07748915255069733,0.25151753425598145,0.06318765878677368,0.23710641264915466,,,,,,, +23,79199,,,,,,,,,,,,0.08222083747386932,,,,,, +23,79249,,,,,,,,,,,,0.08889848738908768,,,,,, +23,79299,,,,,,,,,,,,0.07105211913585663,,,,,, +23,79349,,,,,,,,,,,,0.06619352847337723,,,,,, +23,79399,,,,,,,,,,,,0.06818046420812607,,,,,, +23,79449,,,,,,,,,,,,0.07387402653694153,,,,,, +23,79499,,,,,,,,,,,,0.06960739195346832,,,,,, +23,79549,,,,,,,,,,,,0.07718858122825623,,,,,, +23,79599,,,,,,,,,,,,0.07858328521251678,,,,,, +23,79649,,,,,,,,,,,,0.07173189520835876,,,,,, +23,79699,,,,,,,,,,,,0.08099164068698883,,,,,, +23,79749,,,,,,,,,,,,0.07349297404289246,,,,,, +23,79799,,,,,,,,,,,,0.07466484606266022,,,,,, +23,79849,,,,,,,,,,,,0.0830472782254219,,,,,, +23,79899,,,,,,,,,,,,0.07659333944320679,,,,,, +23,79949,,,,,,,,,,,,0.08422423899173737,,,,,, +23,79999,,,,,,,,,,,,0.07776428759098053,,,,,, +23,80049,,,,,,,,,,,,0.0667848065495491,,,,,, +23,80099,,,,,,,,,,,,0.0677979364991188,,,,,, +23,80149,,,,,,,,,,,,0.07851789891719818,,,,,, +23,80199,,,,,,,,,,,,0.08213582634925842,,,,,, +23,80249,,,,,,,,,,,,0.07373957335948944,,,,,, +23,80299,,,,,,,,,,,,0.0797499269247055,,,,,, +23,80349,,,,,,,,,,,,0.08362618833780289,,,,,, +23,80399,,,,,,,,,,,,0.07689791917800903,,,,,, +23,80449,,,,,,,,,,,,0.07909170538187027,,,,,, +23,80499,,,,,,,,,,,,0.07777264714241028,,,,,, +23,80549,,,,,,,,,,,,0.07124181091785431,,,,,, +23,80599,,,,,,,,,,,,0.08948275446891785,,,,,, +23,80649,,,,,,,,,,,,0.06403903663158417,,,,,, +23,80699,,,,,,,,,,,,0.08796684443950653,,,,,, +23,80749,,,,,,,,,,,,0.07881498336791992,,,,,, +23,80799,,,,,,,,,,,,0.08038198202848434,,,,,, +23,80849,,,,,,,,,,,,0.0857025682926178,,,,,, +23,80899,,,,,,,,,,,,0.07902178168296814,,,,,, +23,80949,,,,,,,,,,,,0.08848223090171814,,,,,, +23,80999,,,,,,,,,,,,0.06976787000894547,,,,,, +23,81049,,,,,,,,,,,,0.08116470277309418,,,,,, +23,81099,,,,,,,,,,,,0.07641154527664185,,,,,, +23,81149,,,,,,,,,,,,0.08116798102855682,,,,,, +23,81199,,,,,,,,,,,,0.08148849010467529,,,,,, +23,81249,,,,,,,,,,,,0.08176018297672272,,,,,, +23,81299,,,,,,,,,,,,0.07975589483976364,,,,,, +23,81349,,,,,,,,,,,,0.07575821131467819,,,,,, +23,81399,,,,,,,,,,,,0.08501044660806656,,,,,, +23,81449,,,,,,,,,,,,0.07500867545604706,,,,,, +23,81499,,,,,,,,,,,,0.06888756155967712,,,,,, +23,81549,,,,,,,,,,,,0.07624969631433487,,,,,, +23,81599,,,,,,,,,,,,0.07871001213788986,,,,,, +23,81649,,,,,,,,,,,,0.07837136089801788,,,,,, +23,81699,,,,,,,,,,,,0.08253084123134613,,,,,, +23,81749,,,,,,,,,,,,0.07792134582996368,,,,,, +23,81799,,,,,,,,,,,,0.06157342717051506,,,,,, +23,81849,,,,,,,,,,,,0.07048213481903076,,,,,, +23,81899,,,,,,,,,,,,0.07593412697315216,,,,,, +23,81949,,,,,,,,,,,,0.0752127468585968,,,,,, +23,81999,,,,,,,,,,,,0.08322342485189438,,,,,, +23,82049,,,,,,,,,,,,0.08632813394069672,,,,,, +23,82099,,,,,,,,,,,,0.0665091797709465,,,,,, +23,82149,,,,,,,,,,,,0.06591638922691345,,,,,, +23,82199,,,,,,,,,,,,0.07296641170978546,,,,,, +23,82249,,,,,,,,,,,,0.08308486640453339,,,,,, +23,82299,,,,,,,,,,,,0.08068037778139114,,,,,, +23,82349,,,,,,,,,,,,0.07946239411830902,,,,,, +23,82399,,,,,,,,,,,,0.0777653306722641,,,,,, +23,82449,,,,,,,,,,,,0.07318802177906036,,,,,, +23,82499,,,,,,,,,,,,0.07573162019252777,,,,,, +23,82549,,,,,,,,,,,,0.0726296603679657,,,,,, +23,82599,,,,,,,,,,,,0.07186837494373322,,,,,, +23,82607,,,,,,,,,,,,,0.23912817239761353,0.07867152243852615,0.2447003275156021,0.05329263210296631,0.23926758766174316,0.07867152243852615 +23,82607,,,,,,,0.23808017373085022,0.07730337977409363,0.2559894323348999,0.06542706489562988,0.24178479611873627,,,,,,, +24,82649,,,,,,,,,,,,0.07172270864248276,,,,,, +24,82699,,,,,,,,,,,,0.08272518962621689,,,,,, +24,82749,,,,,,,,,,,,0.071042001247406,,,,,, +24,82799,,,,,,,,,,,,0.07163669168949127,,,,,, +24,82849,,,,,,,,,,,,0.08606334030628204,,,,,, +24,82899,,,,,,,,,,,,0.08215778321027756,,,,,, +24,82949,,,,,,,,,,,,0.06885448098182678,,,,,, +24,82999,,,,,,,,,,,,0.08369991183280945,,,,,, +24,83049,,,,,,,,,,,,0.07572171092033386,,,,,, +24,83099,,,,,,,,,,,,0.07780637592077255,,,,,, +24,83149,,,,,,,,,,,,0.07891657948493958,,,,,, +24,83199,,,,,,,,,,,,0.07787627726793289,,,,,, +24,83249,,,,,,,,,,,,0.09016342461109161,,,,,, +24,83299,,,,,,,,,,,,0.06930053979158401,,,,,, +24,83349,,,,,,,,,,,,0.07197017222642899,,,,,, +24,83399,,,,,,,,,,,,0.08282545208930969,,,,,, +24,83449,,,,,,,,,,,,0.0693683922290802,,,,,, +24,83499,,,,,,,,,,,,0.06806393712759018,,,,,, +24,83549,,,,,,,,,,,,0.07743698358535767,,,,,, +24,83599,,,,,,,,,,,,0.0691305473446846,,,,,, +24,83649,,,,,,,,,,,,0.0737200379371643,,,,,, +24,83699,,,,,,,,,,,,0.06544250249862671,,,,,, +24,83749,,,,,,,,,,,,0.07156457751989365,,,,,, +24,83799,,,,,,,,,,,,0.07900310307741165,,,,,, +24,83849,,,,,,,,,,,,0.07968202978372574,,,,,, +24,83899,,,,,,,,,,,,0.08822724223136902,,,,,, +24,83949,,,,,,,,,,,,0.07066687941551208,,,,,, +24,83999,,,,,,,,,,,,0.0784291997551918,,,,,, +24,84049,,,,,,,,,,,,0.07190427929162979,,,,,, +24,84099,,,,,,,,,,,,0.0784204974770546,,,,,, +24,84149,,,,,,,,,,,,0.076021209359169,,,,,, +24,84199,,,,,,,,,,,,0.06916816532611847,,,,,, +24,84249,,,,,,,,,,,,0.08311199396848679,,,,,, +24,84299,,,,,,,,,,,,0.07363700866699219,,,,,, +24,84349,,,,,,,,,,,,0.09151960164308548,,,,,, +24,84399,,,,,,,,,,,,0.07732726633548737,,,,,, +24,84449,,,,,,,,,,,,0.0797538310289383,,,,,, +24,84499,,,,,,,,,,,,0.06884884089231491,,,,,, +24,84549,,,,,,,,,,,,0.08501158654689789,,,,,, +24,84599,,,,,,,,,,,,0.08358804881572723,,,,,, +24,84649,,,,,,,,,,,,0.07951811701059341,,,,,, +24,84699,,,,,,,,,,,,0.07264308631420135,,,,,, +24,84749,,,,,,,,,,,,0.07568874210119247,,,,,, +24,84799,,,,,,,,,,,,0.06648212671279907,,,,,, +24,84849,,,,,,,,,,,,0.07213430106639862,,,,,, +24,84899,,,,,,,,,,,,0.08580680936574936,,,,,, +24,84949,,,,,,,,,,,,0.0892661064863205,,,,,, +24,84999,,,,,,,,,,,,0.08659692108631134,,,,,, +24,85049,,,,,,,,,,,,0.07624948024749756,,,,,, +24,85099,,,,,,,,,,,,0.08497530221939087,,,,,, +24,85149,,,,,,,,,,,,0.08023250102996826,,,,,, +24,85199,,,,,,,,,,,,0.07629384100437164,,,,,, +24,85249,,,,,,,,,,,,0.08464397490024567,,,,,, +24,85299,,,,,,,,,,,,0.08329878747463226,,,,,, +24,85349,,,,,,,,,,,,0.0780603364109993,,,,,, +24,85399,,,,,,,,,,,,0.07092006504535675,,,,,, +24,85449,,,,,,,,,,,,0.07380105555057526,,,,,, +24,85499,,,,,,,,,,,,0.06859232485294342,,,,,, +24,85549,,,,,,,,,,,,0.07123780250549316,,,,,, +24,85599,,,,,,,,,,,,0.08340086042881012,,,,,, +24,85649,,,,,,,,,,,,0.08645898103713989,,,,,, +24,85699,,,,,,,,,,,,0.08324787765741348,,,,,, +24,85749,,,,,,,,,,,,0.07675351202487946,,,,,, +24,85799,,,,,,,,,,,,0.07943801581859589,,,,,, +24,85849,,,,,,,,,,,,0.08369326591491699,,,,,, +24,85899,,,,,,,,,,,,0.08118000626564026,,,,,, +24,85949,,,,,,,,,,,,0.07807527482509613,,,,,, +24,85999,,,,,,,,,,,,0.08302512764930725,,,,,, +24,86049,,,,,,,,,,,,0.06269500404596329,,,,,, +24,86049,,,,,,,,,,,,,0.23765848577022552,0.07795164734125137,0.25468990206718445,0.06195533275604248,0.2545396089553833,0.07795164734125137 +24,86049,,,,,,,0.2378533035516739,0.07719901204109192,0.2584531903266907,0.06669348478317261,0.24475210905075073,,,,,,, +25,86099,,,,,,,,,,,,0.0852719247341156,,,,,, +25,86149,,,,,,,,,,,,0.08660665154457092,,,,,, +25,86199,,,,,,,,,,,,0.06702794134616852,,,,,, +25,86249,,,,,,,,,,,,0.07158677279949188,,,,,, +25,86299,,,,,,,,,,,,0.0836373120546341,,,,,, +25,86349,,,,,,,,,,,,0.08568345010280609,,,,,, +25,86399,,,,,,,,,,,,0.07343457639217377,,,,,, +25,86449,,,,,,,,,,,,0.09149311482906342,,,,,, +25,86499,,,,,,,,,,,,0.07144388556480408,,,,,, +25,86549,,,,,,,,,,,,0.07616929709911346,,,,,, +25,86599,,,,,,,,,,,,0.08215764164924622,,,,,, +25,86649,,,,,,,,,,,,0.07985598593950272,,,,,, +25,86699,,,,,,,,,,,,0.06934814155101776,,,,,, +25,86749,,,,,,,,,,,,0.0668647289276123,,,,,, +25,86799,,,,,,,,,,,,0.07603520154953003,,,,,, +25,86849,,,,,,,,,,,,0.07255691289901733,,,,,, +25,86899,,,,,,,,,,,,0.08412420004606247,,,,,, +25,86949,,,,,,,,,,,,0.06895285844802856,,,,,, +25,86999,,,,,,,,,,,,0.07549673318862915,,,,,, +25,87049,,,,,,,,,,,,0.060712262988090515,,,,,, +25,87099,,,,,,,,,,,,0.07065034657716751,,,,,, +25,87149,,,,,,,,,,,,0.08617505431175232,,,,,, +25,87199,,,,,,,,,,,,0.07507296651601791,,,,,, +25,87249,,,,,,,,,,,,0.07261424511671066,,,,,, +25,87299,,,,,,,,,,,,0.08153572678565979,,,,,, +25,87349,,,,,,,,,,,,0.0741826668381691,,,,,, +25,87399,,,,,,,,,,,,0.07006021589040756,,,,,, +25,87449,,,,,,,,,,,,0.07986622303724289,,,,,, +25,87499,,,,,,,,,,,,0.07115582376718521,,,,,, +25,87549,,,,,,,,,,,,0.06894925236701965,,,,,, +25,87599,,,,,,,,,,,,0.07875291258096695,,,,,, +25,87649,,,,,,,,,,,,0.07332353293895721,,,,,, +25,87699,,,,,,,,,,,,0.06779955327510834,,,,,, +25,87749,,,,,,,,,,,,0.0699545368552208,,,,,, +25,87799,,,,,,,,,,,,0.09251497685909271,,,,,, +25,87849,,,,,,,,,,,,0.07663594186306,,,,,, +25,87899,,,,,,,,,,,,0.07489006221294403,,,,,, +25,87949,,,,,,,,,,,,0.08185955882072449,,,,,, +25,87999,,,,,,,,,,,,0.0728173479437828,,,,,, +25,88049,,,,,,,,,,,,0.07960553467273712,,,,,, +25,88099,,,,,,,,,,,,0.07287253439426422,,,,,, +25,88149,,,,,,,,,,,,0.0736776739358902,,,,,, +25,88199,,,,,,,,,,,,0.07816122472286224,,,,,, +25,88249,,,,,,,,,,,,0.08197851479053497,,,,,, +25,88299,,,,,,,,,,,,0.0805676281452179,,,,,, +25,88349,,,,,,,,,,,,0.08276348561048508,,,,,, +25,88399,,,,,,,,,,,,0.07376497983932495,,,,,, +25,88449,,,,,,,,,,,,0.084276482462883,,,,,, +25,88499,,,,,,,,,,,,0.08447138965129852,,,,,, +25,88549,,,,,,,,,,,,0.09697288274765015,,,,,, +25,88599,,,,,,,,,,,,0.08189564198255539,,,,,, +25,88649,,,,,,,,,,,,0.06577380001544952,,,,,, +25,88699,,,,,,,,,,,,0.07953087985515594,,,,,, +25,88749,,,,,,,,,,,,0.07915997505187988,,,,,, +25,88799,,,,,,,,,,,,0.08026504516601562,,,,,, +25,88849,,,,,,,,,,,,0.07918869704008102,,,,,, +25,88899,,,,,,,,,,,,0.08299954235553741,,,,,, +25,88949,,,,,,,,,,,,0.07476410269737244,,,,,, +25,88999,,,,,,,,,,,,0.07608109712600708,,,,,, +25,89049,,,,,,,,,,,,0.08341822773218155,,,,,, +25,89099,,,,,,,,,,,,0.07390771806240082,,,,,, +25,89149,,,,,,,,,,,,0.07267504930496216,,,,,, +25,89199,,,,,,,,,,,,0.08633163571357727,,,,,, +25,89249,,,,,,,,,,,,0.08069609850645065,,,,,, +25,89299,,,,,,,,,,,,0.0742826759815216,,,,,, +25,89349,,,,,,,,,,,,0.07774834334850311,,,,,, +25,89399,,,,,,,,,,,,0.07707099616527557,,,,,, +25,89449,,,,,,,,,,,,0.0679219514131546,,,,,, +25,89491,,,,,,,,,,,,,0.23940947651863098,0.07776697725057602,0.28189653158187866,0.06417763233184814,0.2824917137622833,0.07776697725057602 +25,89491,,,,,,,0.23856030404567719,0.07759890705347061,0.24904242157936096,0.061862409114837646,0.23457632958889008,,,,,,, +26,89499,,,,,,,,,,,,0.0696483626961708,,,,,, +26,89549,,,,,,,,,,,,0.0887230858206749,,,,,, +26,89599,,,,,,,,,,,,0.06843854486942291,,,,,, +26,89649,,,,,,,,,,,,0.06568586826324463,,,,,, +26,89699,,,,,,,,,,,,0.07456165552139282,,,,,, +26,89749,,,,,,,,,,,,0.07089635729789734,,,,,, +26,89799,,,,,,,,,,,,0.07908323407173157,,,,,, +26,89849,,,,,,,,,,,,0.08032606542110443,,,,,, +26,89899,,,,,,,,,,,,0.07892006635665894,,,,,, +26,89949,,,,,,,,,,,,0.08228107541799545,,,,,, +26,89999,,,,,,,,,,,,0.07672290503978729,,,,,, +26,90049,,,,,,,,,,,,0.06572211533784866,,,,,, +26,90099,,,,,,,,,,,,0.07278558611869812,,,,,, +26,90149,,,,,,,,,,,,0.08300260454416275,,,,,, +26,90199,,,,,,,,,,,,0.08711344003677368,,,,,, +26,90249,,,,,,,,,,,,0.06763216853141785,,,,,, +26,90299,,,,,,,,,,,,0.08051285147666931,,,,,, +26,90349,,,,,,,,,,,,0.08129920810461044,,,,,, +26,90399,,,,,,,,,,,,0.07726989686489105,,,,,, +26,90449,,,,,,,,,,,,0.08330103754997253,,,,,, +26,90499,,,,,,,,,,,,0.08327767252922058,,,,,, +26,90549,,,,,,,,,,,,0.07118608802556992,,,,,, +26,90599,,,,,,,,,,,,0.08530241250991821,,,,,, +26,90649,,,,,,,,,,,,0.07224638760089874,,,,,, +26,90699,,,,,,,,,,,,0.07512981444597244,,,,,, +26,90749,,,,,,,,,,,,0.07470044493675232,,,,,, +26,90799,,,,,,,,,,,,0.08630478382110596,,,,,, +26,90849,,,,,,,,,,,,0.06214834004640579,,,,,, +26,90899,,,,,,,,,,,,0.08184339106082916,,,,,, +26,90949,,,,,,,,,,,,0.08226580172777176,,,,,, +26,90999,,,,,,,,,,,,0.0875120535492897,,,,,, +26,91049,,,,,,,,,,,,0.07821637392044067,,,,,, +26,91099,,,,,,,,,,,,0.07488115131855011,,,,,, +26,91149,,,,,,,,,,,,0.08558482676744461,,,,,, +26,91199,,,,,,,,,,,,0.08532214909791946,,,,,, +26,91249,,,,,,,,,,,,0.07975293695926666,,,,,, +26,91299,,,,,,,,,,,,0.07335445284843445,,,,,, +26,91349,,,,,,,,,,,,0.08765089511871338,,,,,, +26,91399,,,,,,,,,,,,0.0845247209072113,,,,,, +26,91449,,,,,,,,,,,,0.07593336701393127,,,,,, +26,91499,,,,,,,,,,,,0.07917352020740509,,,,,, +26,91549,,,,,,,,,,,,0.06708794087171555,,,,,, +26,91599,,,,,,,,,,,,0.08481793850660324,,,,,, +26,91649,,,,,,,,,,,,0.08375154435634613,,,,,, +26,91699,,,,,,,,,,,,0.0797945186495781,,,,,, +26,91749,,,,,,,,,,,,0.07216040790081024,,,,,, +26,91799,,,,,,,,,,,,0.08297504484653473,,,,,, +26,91849,,,,,,,,,,,,0.07170660048723221,,,,,, +26,91899,,,,,,,,,,,,0.07561011612415314,,,,,, +26,91949,,,,,,,,,,,,0.07336428016424179,,,,,, +26,91999,,,,,,,,,,,,0.06901401281356812,,,,,, +26,92049,,,,,,,,,,,,0.07192856073379517,,,,,, +26,92099,,,,,,,,,,,,0.08387471735477448,,,,,, +26,92149,,,,,,,,,,,,0.08432354778051376,,,,,, +26,92199,,,,,,,,,,,,0.07302422821521759,,,,,, +26,92249,,,,,,,,,,,,0.07766243815422058,,,,,, +26,92299,,,,,,,,,,,,0.08721287548542023,,,,,, +26,92349,,,,,,,,,,,,0.08512438833713531,,,,,, +26,92399,,,,,,,,,,,,0.06846684217453003,,,,,, +26,92449,,,,,,,,,,,,0.08239484578371048,,,,,, +26,92499,,,,,,,,,,,,0.06667399406433105,,,,,, +26,92549,,,,,,,,,,,,0.07041515409946442,,,,,, +26,92599,,,,,,,,,,,,0.08695394545793533,,,,,, +26,92649,,,,,,,,,,,,0.09298637509346008,,,,,, +26,92699,,,,,,,,,,,,0.0842823013663292,,,,,, +26,92749,,,,,,,,,,,,0.07443428039550781,,,,,, +26,92799,,,,,,,,,,,,0.07922682166099548,,,,,, +26,92849,,,,,,,,,,,,0.08030027896165848,,,,,, +26,92899,,,,,,,,,,,,0.08228383958339691,,,,,, +26,92933,,,,,,,,,,,,,0.2394133359193802,0.0792934000492096,0.2569103538990021,0.045809149742126465,0.2559998631477356,0.0792934000492096 +26,92933,,,,,,,0.23714475333690643,0.07679194211959839,0.26775065064430237,0.07160604000091553,0.25338655710220337,,,,,,, +27,92949,,,,,,,,,,,,0.08064483851194382,,,,,, +27,92999,,,,,,,,,,,,0.0593898668885231,,,,,, +27,93049,,,,,,,,,,,,0.07558749616146088,,,,,, +27,93099,,,,,,,,,,,,0.07527880370616913,,,,,, +27,93149,,,,,,,,,,,,0.06269615143537521,,,,,, +27,93199,,,,,,,,,,,,0.08123072981834412,,,,,, +27,93249,,,,,,,,,,,,0.0750354677438736,,,,,, +27,93299,,,,,,,,,,,,0.07272440940141678,,,,,, +27,93349,,,,,,,,,,,,0.07447171956300735,,,,,, +27,93399,,,,,,,,,,,,0.08791601657867432,,,,,, +27,93449,,,,,,,,,,,,0.07643778622150421,,,,,, +27,93499,,,,,,,,,,,,0.0790376290678978,,,,,, +27,93549,,,,,,,,,,,,0.07018698751926422,,,,,, +27,93599,,,,,,,,,,,,0.0866984948515892,,,,,, +27,93649,,,,,,,,,,,,0.07690322399139404,,,,,, +27,93699,,,,,,,,,,,,0.07505118101835251,,,,,, +27,93749,,,,,,,,,,,,0.08019097149372101,,,,,, +27,93799,,,,,,,,,,,,0.07884300500154495,,,,,, +27,93849,,,,,,,,,,,,0.07008005678653717,,,,,, +27,93899,,,,,,,,,,,,0.07547958940267563,,,,,, +27,93949,,,,,,,,,,,,0.06960668414831161,,,,,, +27,93999,,,,,,,,,,,,0.07886098325252533,,,,,, +27,94049,,,,,,,,,,,,0.0667625367641449,,,,,, +27,94099,,,,,,,,,,,,0.08187112212181091,,,,,, +27,94149,,,,,,,,,,,,0.07319317758083344,,,,,, +27,94199,,,,,,,,,,,,0.07843157649040222,,,,,, +27,94249,,,,,,,,,,,,0.07088208198547363,,,,,, +27,94299,,,,,,,,,,,,0.07181710004806519,,,,,, +27,94349,,,,,,,,,,,,0.06553302705287933,,,,,, +27,94399,,,,,,,,,,,,0.07507487386465073,,,,,, +27,94449,,,,,,,,,,,,0.07299955189228058,,,,,, +27,94499,,,,,,,,,,,,0.07563614845275879,,,,,, +27,94549,,,,,,,,,,,,0.07290856540203094,,,,,, +27,94599,,,,,,,,,,,,0.0733911544084549,,,,,, +27,94649,,,,,,,,,,,,0.07216860353946686,,,,,, +27,94699,,,,,,,,,,,,0.07614772021770477,,,,,, +27,94749,,,,,,,,,,,,0.08310265094041824,,,,,, +27,94799,,,,,,,,,,,,0.07339230179786682,,,,,, +27,94849,,,,,,,,,,,,0.07732057571411133,,,,,, +27,94899,,,,,,,,,,,,0.08803288638591766,,,,,, +27,94949,,,,,,,,,,,,0.07037395238876343,,,,,, +27,94999,,,,,,,,,,,,0.07529021799564362,,,,,, +27,95049,,,,,,,,,,,,0.06362954527139664,,,,,, +27,95099,,,,,,,,,,,,0.0757996216416359,,,,,, +27,95149,,,,,,,,,,,,0.07761485129594803,,,,,, +27,95199,,,,,,,,,,,,0.06929320096969604,,,,,, +27,95249,,,,,,,,,,,,0.07710873335599899,,,,,, +27,95299,,,,,,,,,,,,0.08022654801607132,,,,,, +27,95349,,,,,,,,,,,,0.07227174192667007,,,,,, +27,95399,,,,,,,,,,,,0.08179423213005066,,,,,, +27,95449,,,,,,,,,,,,0.07631891965866089,,,,,, +27,95499,,,,,,,,,,,,0.06962268799543381,,,,,, +27,95549,,,,,,,,,,,,0.07669995725154877,,,,,, +27,95599,,,,,,,,,,,,0.0745895504951477,,,,,, +27,95649,,,,,,,,,,,,0.0729823112487793,,,,,, +27,95699,,,,,,,,,,,,0.06525632739067078,,,,,, +27,95749,,,,,,,,,,,,0.07764545828104019,,,,,, +27,95799,,,,,,,,,,,,0.08149338513612747,,,,,, +27,95849,,,,,,,,,,,,0.09061124175786972,,,,,, +27,95899,,,,,,,,,,,,0.0815998911857605,,,,,, +27,95949,,,,,,,,,,,,0.07123428583145142,,,,,, +27,95999,,,,,,,,,,,,0.0738137736916542,,,,,, +27,96049,,,,,,,,,,,,0.09094353020191193,,,,,, +27,96099,,,,,,,,,,,,0.07698426395654678,,,,,, +27,96149,,,,,,,,,,,,0.07656064629554749,,,,,, +27,96199,,,,,,,,,,,,0.07239541411399841,,,,,, +27,96249,,,,,,,,,,,,0.08171970397233963,,,,,, +27,96299,,,,,,,,,,,,0.07899270951747894,,,,,, +27,96349,,,,,,,,,,,,0.07396316528320312,,,,,, +27,96375,,,,,,,,,,,,,0.2377144992351532,0.07708393782377243,0.2712765336036682,0.07239711284637451,0.2688734829425812,0.07708393782377243 +27,96375,,,,,,,0.2373545616865158,0.07697615772485733,0.26365914940834045,0.06938868761062622,0.2493700385093689,,,,,,, +28,96399,,,,,,,,,,,,0.08845680952072144,,,,,, +28,96449,,,,,,,,,,,,0.08014270663261414,,,,,, +28,96499,,,,,,,,,,,,0.06977992504835129,,,,,, +28,96549,,,,,,,,,,,,0.08074712753295898,,,,,, +28,96599,,,,,,,,,,,,0.08828575909137726,,,,,, +28,96649,,,,,,,,,,,,0.08319473266601562,,,,,, +28,96699,,,,,,,,,,,,0.07620012760162354,,,,,, +28,96749,,,,,,,,,,,,0.07225870341062546,,,,,, +28,96799,,,,,,,,,,,,0.06760828197002411,,,,,, +28,96849,,,,,,,,,,,,0.07417425513267517,,,,,, +28,96899,,,,,,,,,,,,0.07851957529783249,,,,,, +28,96949,,,,,,,,,,,,0.07593214511871338,,,,,, +28,96999,,,,,,,,,,,,0.08197711408138275,,,,,, +28,97049,,,,,,,,,,,,0.07314693927764893,,,,,, +28,97099,,,,,,,,,,,,0.08691838383674622,,,,,, +28,97149,,,,,,,,,,,,0.07487453520298004,,,,,, +28,97199,,,,,,,,,,,,0.07048262655735016,,,,,, +28,97249,,,,,,,,,,,,0.07811270654201508,,,,,, +28,97299,,,,,,,,,,,,0.06975574046373367,,,,,, +28,97349,,,,,,,,,,,,0.08502312749624252,,,,,, +28,97399,,,,,,,,,,,,0.07682214677333832,,,,,, +28,97449,,,,,,,,,,,,0.0656612440943718,,,,,, +28,97499,,,,,,,,,,,,0.07280918210744858,,,,,, +28,97549,,,,,,,,,,,,0.07041575014591217,,,,,, +28,97599,,,,,,,,,,,,0.06645460426807404,,,,,, +28,97649,,,,,,,,,,,,0.09404617547988892,,,,,, +28,97699,,,,,,,,,,,,0.08123856782913208,,,,,, +28,97749,,,,,,,,,,,,0.06211302429437637,,,,,, +28,97799,,,,,,,,,,,,0.09430001676082611,,,,,, +28,97849,,,,,,,,,,,,0.07449628412723541,,,,,, +28,97899,,,,,,,,,,,,0.08516621589660645,,,,,, +28,97949,,,,,,,,,,,,0.08230456709861755,,,,,, +28,97999,,,,,,,,,,,,0.07416195422410965,,,,,, +28,98049,,,,,,,,,,,,0.07392102479934692,,,,,, +28,98099,,,,,,,,,,,,0.07932978123426437,,,,,, +28,98149,,,,,,,,,,,,0.08322277665138245,,,,,, +28,98199,,,,,,,,,,,,0.07098342478275299,,,,,, +28,98249,,,,,,,,,,,,0.07661551237106323,,,,,, +28,98299,,,,,,,,,,,,0.06970047205686569,,,,,, +28,98349,,,,,,,,,,,,0.0731189027428627,,,,,, +28,98399,,,,,,,,,,,,0.08054560422897339,,,,,, +28,98449,,,,,,,,,,,,0.08082939684391022,,,,,, +28,98499,,,,,,,,,,,,0.07990267872810364,,,,,, +28,98549,,,,,,,,,,,,0.07914351671934128,,,,,, +28,98599,,,,,,,,,,,,0.07542511075735092,,,,,, +28,98649,,,,,,,,,,,,0.0859876349568367,,,,,, +28,98699,,,,,,,,,,,,0.08588086068630219,,,,,, +28,98749,,,,,,,,,,,,0.07854637503623962,,,,,, +28,98799,,,,,,,,,,,,0.07440127432346344,,,,,, +28,98849,,,,,,,,,,,,0.08317246288061142,,,,,, +28,98899,,,,,,,,,,,,0.08261853456497192,,,,,, +28,98949,,,,,,,,,,,,0.08126939833164215,,,,,, +28,98999,,,,,,,,,,,,0.07187037169933319,,,,,, +28,99049,,,,,,,,,,,,0.06923936307430267,,,,,, +28,99099,,,,,,,,,,,,0.07864534854888916,,,,,, +28,99149,,,,,,,,,,,,0.0693884864449501,,,,,, +28,99199,,,,,,,,,,,,0.06475949287414551,,,,,, +28,99249,,,,,,,,,,,,0.05915989726781845,,,,,, +28,99299,,,,,,,,,,,,0.06548668444156647,,,,,, +28,99349,,,,,,,,,,,,0.07236071676015854,,,,,, +28,99399,,,,,,,,,,,,0.07627817988395691,,,,,, +28,99449,,,,,,,,,,,,0.08002545684576035,,,,,, +28,99499,,,,,,,,,,,,0.09077700972557068,,,,,, +28,99549,,,,,,,,,,,,0.08026258647441864,,,,,, +28,99599,,,,,,,,,,,,0.0724167674779892,,,,,, +28,99649,,,,,,,,,,,,0.08674238622188568,,,,,, +28,99699,,,,,,,,,,,,0.08034798502922058,,,,,, +28,99749,,,,,,,,,,,,0.06384369730949402,,,,,, +28,99799,,,,,,,,,,,,0.07616187632083893,,,,,, +28,99817,,,,,,,,,,,,,0.23504246771335602,0.07748053222894669,0.29176485538482666,0.06762456893920898,0.29050251841545105,0.07748053222894669 +28,99817,,,,,,,0.23710818588733673,0.07682670652866364,0.2670396864414215,0.07119333744049072,0.251284122467041,,,,,,, +29,99849,,,,,,,,,,,,0.0856308788061142,,,,,, +29,99899,,,,,,,,,,,,0.08315867930650711,,,,,, +29,99949,,,,,,,,,,,,0.07674062252044678,,,,,, +29,99999,,,,,,,,,,,,0.08156035840511322,,,,,, +29,100049,,,,,,,,,,,,0.07425674796104431,,,,,, +29,100099,,,,,,,,,,,,0.08125925809144974,,,,,, +29,100149,,,,,,,,,,,,0.08244482427835464,,,,,, +29,100199,,,,,,,,,,,,0.07100313901901245,,,,,, +29,100249,,,,,,,,,,,,0.06931747496128082,,,,,, +29,100299,,,,,,,,,,,,0.0719030350446701,,,,,, +29,100349,,,,,,,,,,,,0.07236702740192413,,,,,, +29,100399,,,,,,,,,,,,0.07548734545707703,,,,,, +29,100449,,,,,,,,,,,,0.07166440784931183,,,,,, +29,100499,,,,,,,,,,,,0.07410848140716553,,,,,, +29,100549,,,,,,,,,,,,0.06738138198852539,,,,,, +29,100599,,,,,,,,,,,,0.08136815577745438,,,,,, +29,100649,,,,,,,,,,,,0.07510436326265335,,,,,, +29,100699,,,,,,,,,,,,0.07553358376026154,,,,,, +29,100749,,,,,,,,,,,,0.07682490348815918,,,,,, +29,100799,,,,,,,,,,,,0.08032839745283127,,,,,, +29,100849,,,,,,,,,,,,0.07842709124088287,,,,,, +29,100899,,,,,,,,,,,,0.07136644423007965,,,,,, +29,100949,,,,,,,,,,,,0.07187541574239731,,,,,, +29,100999,,,,,,,,,,,,0.08073584735393524,,,,,, +29,101049,,,,,,,,,,,,0.08058574795722961,,,,,, +29,101099,,,,,,,,,,,,0.08015776425600052,,,,,, +29,101149,,,,,,,,,,,,0.07888320088386536,,,,,, +29,101199,,,,,,,,,,,,0.06769251823425293,,,,,, +29,101249,,,,,,,,,,,,0.07779490947723389,,,,,, +29,101299,,,,,,,,,,,,0.07077351212501526,,,,,, +29,101349,,,,,,,,,,,,0.06690999865531921,,,,,, +29,101399,,,,,,,,,,,,0.06877855956554413,,,,,, +29,101449,,,,,,,,,,,,0.07006626576185226,,,,,, +29,101499,,,,,,,,,,,,0.07603117823600769,,,,,, +29,101549,,,,,,,,,,,,0.07686186581850052,,,,,, +29,101599,,,,,,,,,,,,0.06735671311616898,,,,,, +29,101649,,,,,,,,,,,,0.08174002170562744,,,,,, +29,101699,,,,,,,,,,,,0.0835021436214447,,,,,, +29,101749,,,,,,,,,,,,0.08704788982868195,,,,,, +29,101799,,,,,,,,,,,,0.08453149348497391,,,,,, +29,101849,,,,,,,,,,,,0.08333227038383484,,,,,, +29,101899,,,,,,,,,,,,0.08023862540721893,,,,,, +29,101949,,,,,,,,,,,,0.08629602193832397,,,,,, +29,101999,,,,,,,,,,,,0.07886940985918045,,,,,, +29,102049,,,,,,,,,,,,0.07881293445825577,,,,,, +29,102099,,,,,,,,,,,,0.07072144001722336,,,,,, +29,102149,,,,,,,,,,,,0.08254171162843704,,,,,, +29,102199,,,,,,,,,,,,0.07678020000457764,,,,,, +29,102249,,,,,,,,,,,,0.07777675986289978,,,,,, +29,102299,,,,,,,,,,,,0.0782710537314415,,,,,, +29,102349,,,,,,,,,,,,0.08258719742298126,,,,,, +29,102399,,,,,,,,,,,,0.07019637525081635,,,,,, +29,102449,,,,,,,,,,,,0.07675997912883759,,,,,, +29,102499,,,,,,,,,,,,0.07644923031330109,,,,,, +29,102549,,,,,,,,,,,,0.08160048723220825,,,,,, +29,102599,,,,,,,,,,,,0.07811055332422256,,,,,, +29,102649,,,,,,,,,,,,0.07389189302921295,,,,,, +29,102699,,,,,,,,,,,,0.07022039592266083,,,,,, +29,102749,,,,,,,,,,,,0.07503806799650192,,,,,, +29,102799,,,,,,,,,,,,0.07585214078426361,,,,,, +29,102849,,,,,,,,,,,,0.06849727034568787,,,,,, +29,102899,,,,,,,,,,,,0.06559209525585175,,,,,, +29,102949,,,,,,,,,,,,0.07779921591281891,,,,,, +29,102999,,,,,,,,,,,,0.07870443910360336,,,,,, +29,103049,,,,,,,,,,,,0.08641719818115234,,,,,, +29,103099,,,,,,,,,,,,0.08493135124444962,,,,,, +29,103149,,,,,,,,,,,,0.08425777405500412,,,,,, +29,103199,,,,,,,,,,,,0.08124063909053802,,,,,, +29,103249,,,,,,,,,,,,0.0858658030629158,,,,,, +29,103259,,,,,,,,,,,,,0.2372858226299286,0.07807271182537079,0.2718946933746338,0.06049853563308716,0.2701239585876465,0.07807271182537079 +29,103259,,,,,,,0.23759010434150696,0.07713079452514648,0.26016733050346375,0.06750786304473877,0.24599070847034454,,,,,,, +30,103299,,,,,,,,,,,,0.07250789552927017,,,,,, +30,103349,,,,,,,,,,,,0.07855601608753204,,,,,, +30,103399,,,,,,,,,,,,0.07583770155906677,,,,,, +30,103449,,,,,,,,,,,,0.07688190788030624,,,,,, +30,103499,,,,,,,,,,,,0.08330631256103516,,,,,, +30,103549,,,,,,,,,,,,0.09038785845041275,,,,,, +30,103599,,,,,,,,,,,,0.07422353327274323,,,,,, +30,103649,,,,,,,,,,,,0.08058473467826843,,,,,, +30,103699,,,,,,,,,,,,0.06766994297504425,,,,,, +30,103749,,,,,,,,,,,,0.08574199676513672,,,,,, +30,103799,,,,,,,,,,,,0.076130710542202,,,,,, +30,103849,,,,,,,,,,,,0.07811771333217621,,,,,, +30,103899,,,,,,,,,,,,0.07784871757030487,,,,,, +30,103949,,,,,,,,,,,,0.06887488067150116,,,,,, +30,103999,,,,,,,,,,,,0.07342815399169922,,,,,, +30,104049,,,,,,,,,,,,0.07455362379550934,,,,,, +30,104099,,,,,,,,,,,,0.07022064179182053,,,,,, +30,104149,,,,,,,,,,,,0.0817236453294754,,,,,, +30,104199,,,,,,,,,,,,0.07846760749816895,,,,,, +30,104249,,,,,,,,,,,,0.0744752585887909,,,,,, +30,104299,,,,,,,,,,,,0.0758747011423111,,,,,, +30,104349,,,,,,,,,,,,0.07303722202777863,,,,,, +30,104399,,,,,,,,,,,,0.0761074423789978,,,,,, +30,104449,,,,,,,,,,,,0.08872860670089722,,,,,, +30,104499,,,,,,,,,,,,0.08151695132255554,,,,,, +30,104549,,,,,,,,,,,,0.08031237870454788,,,,,, +30,104599,,,,,,,,,,,,0.0679469108581543,,,,,, +30,104649,,,,,,,,,,,,0.06257086992263794,,,,,, +30,104699,,,,,,,,,,,,0.0784718245267868,,,,,, +30,104749,,,,,,,,,,,,0.08870121836662292,,,,,, +30,104799,,,,,,,,,,,,0.08841399848461151,,,,,, +30,104849,,,,,,,,,,,,0.07553578913211823,,,,,, +30,104899,,,,,,,,,,,,0.08620083332061768,,,,,, +30,104949,,,,,,,,,,,,0.07699503004550934,,,,,, +30,104999,,,,,,,,,,,,0.06999175250530243,,,,,, +30,105049,,,,,,,,,,,,0.07813125103712082,,,,,, +30,105099,,,,,,,,,,,,0.07619033753871918,,,,,, +30,105149,,,,,,,,,,,,0.07278911769390106,,,,,, +30,105199,,,,,,,,,,,,0.06986694037914276,,,,,, +30,105249,,,,,,,,,,,,0.07104875892400742,,,,,, +30,105299,,,,,,,,,,,,0.07231795787811279,,,,,, +30,105349,,,,,,,,,,,,0.0794682502746582,,,,,, +30,105399,,,,,,,,,,,,0.0747646614909172,,,,,, +30,105449,,,,,,,,,,,,0.07962989807128906,,,,,, +30,105499,,,,,,,,,,,,0.07892170548439026,,,,,, +30,105549,,,,,,,,,,,,0.07871551811695099,,,,,, +30,105599,,,,,,,,,,,,0.06732377409934998,,,,,, +30,105649,,,,,,,,,,,,0.06908195465803146,,,,,, +30,105699,,,,,,,,,,,,0.06395916640758514,,,,,, +30,105749,,,,,,,,,,,,0.06882697343826294,,,,,, +30,105799,,,,,,,,,,,,0.08132949471473694,,,,,, +30,105849,,,,,,,,,,,,0.07914817333221436,,,,,, +30,105899,,,,,,,,,,,,0.07453937828540802,,,,,, +30,105949,,,,,,,,,,,,0.06980883330106735,,,,,, +30,105999,,,,,,,,,,,,0.0733429342508316,,,,,, +30,106049,,,,,,,,,,,,0.07670002430677414,,,,,, +30,106099,,,,,,,,,,,,0.06881286203861237,,,,,, +30,106149,,,,,,,,,,,,0.07392387092113495,,,,,, +30,106199,,,,,,,,,,,,0.07854260504245758,,,,,, +30,106249,,,,,,,,,,,,0.07868313789367676,,,,,, +30,106299,,,,,,,,,,,,0.07200437784194946,,,,,, +30,106349,,,,,,,,,,,,0.07973547279834747,,,,,, +30,106399,,,,,,,,,,,,0.0801565945148468,,,,,, +30,106449,,,,,,,,,,,,0.06900681555271149,,,,,, +30,106499,,,,,,,,,,,,0.07032104581594467,,,,,, +30,106549,,,,,,,,,,,,0.07092417031526566,,,,,, +30,106599,,,,,,,,,,,,0.08783150464296341,,,,,, +30,106649,,,,,,,,,,,,0.07608901709318161,,,,,, +30,106699,,,,,,,,,,,,0.0738934874534607,,,,,, +30,106701,,,,,,,,,,,,,0.2379414290189743,0.08050152659416199,0.2849053144454956,0.03127098083496094,0.28110167384147644,0.08050152659416199 +30,106701,,,,,,,0.23659679293632507,0.07656560093164444,0.2728840112686157,0.07434684038162231,0.256814181804657,,,,,,, +31,106749,,,,,,,,,,,,0.0680476725101471,,,,,, +31,106799,,,,,,,,,,,,0.07492579519748688,,,,,, +31,106849,,,,,,,,,,,,0.07531829178333282,,,,,, +31,106899,,,,,,,,,,,,0.0728021115064621,,,,,, +31,106949,,,,,,,,,,,,0.06538233160972595,,,,,, +31,106999,,,,,,,,,,,,0.08298993110656738,,,,,, +31,107049,,,,,,,,,,,,0.06744802743196487,,,,,, +31,107099,,,,,,,,,,,,0.09051987528800964,,,,,, +31,107149,,,,,,,,,,,,0.07336875796318054,,,,,, +31,107199,,,,,,,,,,,,0.06818610429763794,,,,,, +31,107249,,,,,,,,,,,,0.08368483185768127,,,,,, +31,107299,,,,,,,,,,,,0.07145190984010696,,,,,, +31,107349,,,,,,,,,,,,0.064503014087677,,,,,, +31,107399,,,,,,,,,,,,0.07564699649810791,,,,,, +31,107449,,,,,,,,,,,,0.08304882049560547,,,,,, +31,107499,,,,,,,,,,,,0.06999768316745758,,,,,, +31,107549,,,,,,,,,,,,0.07438633590936661,,,,,, +31,107599,,,,,,,,,,,,0.08339352905750275,,,,,, +31,107649,,,,,,,,,,,,0.07016633450984955,,,,,, +31,107699,,,,,,,,,,,,0.07855571806430817,,,,,, +31,107749,,,,,,,,,,,,0.08750949800014496,,,,,, +31,107799,,,,,,,,,,,,0.0800921693444252,,,,,, +31,107849,,,,,,,,,,,,0.06293171644210815,,,,,, +31,107899,,,,,,,,,,,,0.07924099266529083,,,,,, +31,107949,,,,,,,,,,,,0.07085016369819641,,,,,, +31,107999,,,,,,,,,,,,0.08989541977643967,,,,,, +31,108049,,,,,,,,,,,,0.07124695181846619,,,,,, +31,108099,,,,,,,,,,,,0.07986289262771606,,,,,, +31,108149,,,,,,,,,,,,0.07329536974430084,,,,,, +31,108199,,,,,,,,,,,,0.08745831251144409,,,,,, +31,108249,,,,,,,,,,,,0.08221399784088135,,,,,, +31,108299,,,,,,,,,,,,0.08244884014129639,,,,,, +31,108349,,,,,,,,,,,,0.07836499810218811,,,,,, +31,108399,,,,,,,,,,,,0.0632045641541481,,,,,, +31,108449,,,,,,,,,,,,0.06822927296161652,,,,,, +31,108499,,,,,,,,,,,,0.07984796166419983,,,,,, +31,108549,,,,,,,,,,,,0.06262006610631943,,,,,, +31,108599,,,,,,,,,,,,0.07647950202226639,,,,,, +31,108649,,,,,,,,,,,,0.09293261170387268,,,,,, +31,108699,,,,,,,,,,,,0.07550853490829468,,,,,, +31,108749,,,,,,,,,,,,0.07418940961360931,,,,,, +31,108799,,,,,,,,,,,,0.07618223130702972,,,,,, +31,108849,,,,,,,,,,,,0.06320182979106903,,,,,, +31,108899,,,,,,,,,,,,0.0733259990811348,,,,,, +31,108949,,,,,,,,,,,,0.07286829501390457,,,,,, +31,108999,,,,,,,,,,,,0.0696677714586258,,,,,, +31,109049,,,,,,,,,,,,0.06896813213825226,,,,,, +31,109099,,,,,,,,,,,,0.08934590965509415,,,,,, +31,109149,,,,,,,,,,,,0.07236963510513306,,,,,, +31,109199,,,,,,,,,,,,0.06564988195896149,,,,,, +31,109249,,,,,,,,,,,,0.0674462616443634,,,,,, +31,109299,,,,,,,,,,,,0.0721823200583458,,,,,, +31,109349,,,,,,,,,,,,0.0817326158285141,,,,,, +31,109399,,,,,,,,,,,,0.07745090872049332,,,,,, +31,109449,,,,,,,,,,,,0.07882297039031982,,,,,, +31,109499,,,,,,,,,,,,0.08062344789505005,,,,,, +31,109549,,,,,,,,,,,,0.07496503740549088,,,,,, +31,109599,,,,,,,,,,,,0.08157183974981308,,,,,, +31,109649,,,,,,,,,,,,0.08975715190172195,,,,,, +31,109699,,,,,,,,,,,,0.08946835994720459,,,,,, +31,109749,,,,,,,,,,,,0.0716337114572525,,,,,, +31,109799,,,,,,,,,,,,0.0728522390127182,,,,,, +31,109849,,,,,,,,,,,,0.08894818276166916,,,,,, +31,109899,,,,,,,,,,,,0.07752032577991486,,,,,, +31,109949,,,,,,,,,,,,0.0763331800699234,,,,,, +31,109999,,,,,,,,,,,,0.07442490756511688,,,,,, +31,110049,,,,,,,,,,,,0.07503984868526459,,,,,, +31,110099,,,,,,,,,,,,0.07280846685171127,,,,,, +31,110143,,,,,,,,,,,,,0.2364320456981659,0.07614284753799438,0.2951577305793762,0.08372187614440918,0.29070401191711426,0.07614284753799438 +31,110143,,,,,,,0.23628267645835876,0.07640682905912399,0.27639102935791016,0.07626575231552124,0.2610328197479248,,,,,,, +32,110149,,,,,,,,,,,,0.08852264285087585,,,,,, +32,110199,,,,,,,,,,,,0.08495493978261948,,,,,, +32,110249,,,,,,,,,,,,0.06550775468349457,,,,,, +32,110299,,,,,,,,,,,,0.0701795369386673,,,,,, +32,110349,,,,,,,,,,,,0.09019806981086731,,,,,, +32,110399,,,,,,,,,,,,0.08185417950153351,,,,,, +32,110449,,,,,,,,,,,,0.08879101276397705,,,,,, +32,110499,,,,,,,,,,,,0.08515368402004242,,,,,, +32,110549,,,,,,,,,,,,0.07722274959087372,,,,,, +32,110599,,,,,,,,,,,,0.07693402469158173,,,,,, +32,110649,,,,,,,,,,,,0.08223658800125122,,,,,, +32,110699,,,,,,,,,,,,0.079567551612854,,,,,, +32,110749,,,,,,,,,,,,0.08728551864624023,,,,,, +32,110799,,,,,,,,,,,,0.0819796621799469,,,,,, +32,110849,,,,,,,,,,,,0.07289467751979828,,,,,, +32,110899,,,,,,,,,,,,0.07783281803131104,,,,,, +32,110949,,,,,,,,,,,,0.0792381688952446,,,,,, +32,110999,,,,,,,,,,,,0.08290380984544754,,,,,, +32,111049,,,,,,,,,,,,0.07616710662841797,,,,,, +32,111099,,,,,,,,,,,,0.08051861077547073,,,,,, +32,111149,,,,,,,,,,,,0.0711449384689331,,,,,, +32,111199,,,,,,,,,,,,0.07510402798652649,,,,,, +32,111249,,,,,,,,,,,,0.07162891328334808,,,,,, +32,111299,,,,,,,,,,,,0.07419821619987488,,,,,, +32,111349,,,,,,,,,,,,0.0753331184387207,,,,,, +32,111399,,,,,,,,,,,,0.09676595777273178,,,,,, +32,111449,,,,,,,,,,,,0.07908359915018082,,,,,, +32,111499,,,,,,,,,,,,0.08604207634925842,,,,,, +32,111549,,,,,,,,,,,,0.078359454870224,,,,,, +32,111599,,,,,,,,,,,,0.06831155717372894,,,,,, +32,111649,,,,,,,,,,,,0.08408469706773758,,,,,, +32,111699,,,,,,,,,,,,0.07557730376720428,,,,,, +32,111749,,,,,,,,,,,,0.078184112906456,,,,,, +32,111799,,,,,,,,,,,,0.07849274575710297,,,,,, +32,111849,,,,,,,,,,,,0.07942008972167969,,,,,, +32,111899,,,,,,,,,,,,0.07208932936191559,,,,,, +32,111949,,,,,,,,,,,,0.07939539849758148,,,,,, +32,111999,,,,,,,,,,,,0.0752682164311409,,,,,, +32,112049,,,,,,,,,,,,0.07805046439170837,,,,,, +32,112099,,,,,,,,,,,,0.08266004174947739,,,,,, +32,112149,,,,,,,,,,,,0.08028088510036469,,,,,, +32,112199,,,,,,,,,,,,0.07781767845153809,,,,,, +32,112249,,,,,,,,,,,,0.0717424601316452,,,,,, +32,112299,,,,,,,,,,,,0.0753524899482727,,,,,, +32,112349,,,,,,,,,,,,0.07481353729963303,,,,,, +32,112399,,,,,,,,,,,,0.05610872060060501,,,,,, +32,112449,,,,,,,,,,,,0.07354465126991272,,,,,, +32,112499,,,,,,,,,,,,0.08179932832717896,,,,,, +32,112549,,,,,,,,,,,,0.0850905254483223,,,,,, +32,112599,,,,,,,,,,,,0.07609564810991287,,,,,, +32,112649,,,,,,,,,,,,0.08256104588508606,,,,,, +32,112699,,,,,,,,,,,,0.08657494187355042,,,,,, +32,112749,,,,,,,,,,,,0.0702911838889122,,,,,, +32,112799,,,,,,,,,,,,0.0690402165055275,,,,,, +32,112849,,,,,,,,,,,,0.07263161242008209,,,,,, +32,112899,,,,,,,,,,,,0.0781111866235733,,,,,, +32,112949,,,,,,,,,,,,0.07208719104528427,,,,,, +32,112999,,,,,,,,,,,,0.089957095682621,,,,,, +32,113049,,,,,,,,,,,,0.08455947041511536,,,,,, +32,113099,,,,,,,,,,,,0.07626062631607056,,,,,, +32,113149,,,,,,,,,,,,0.08146294206380844,,,,,, +32,113199,,,,,,,,,,,,0.07487984001636505,,,,,, +32,113249,,,,,,,,,,,,0.0722719356417656,,,,,, +32,113299,,,,,,,,,,,,0.08466871082782745,,,,,, +32,113349,,,,,,,,,,,,0.08618251979351044,,,,,, +32,113399,,,,,,,,,,,,0.06687554717063904,,,,,, +32,113449,,,,,,,,,,,,0.08586207777261734,,,,,, +32,113499,,,,,,,,,,,,0.07877451181411743,,,,,, +32,113549,,,,,,,,,,,,0.0773126631975174,,,,,, +32,113585,,,,,,,,,,,,,0.23638156056404114,0.07909233868122101,0.2893942594528198,0.048228681087493896,0.28538939356803894,0.07909233868122101 +32,113585,,,,,,,0.23710697889328003,0.07688391953706741,0.26590996980667114,0.07050204277038574,0.2496727705001831,,,,,,, +33,113599,,,,,,,,,,,,0.06987467408180237,,,,,, +33,113649,,,,,,,,,,,,0.07646310329437256,,,,,, +33,113699,,,,,,,,,,,,0.08131087571382523,,,,,, +33,113749,,,,,,,,,,,,0.07618197798728943,,,,,, +33,113799,,,,,,,,,,,,0.08687946200370789,,,,,, +33,113849,,,,,,,,,,,,0.06538998335599899,,,,,, +33,113899,,,,,,,,,,,,0.06827257573604584,,,,,, +33,113949,,,,,,,,,,,,0.06873120367527008,,,,,, +33,113999,,,,,,,,,,,,0.07344716787338257,,,,,, +33,114049,,,,,,,,,,,,0.07916652411222458,,,,,, +33,114099,,,,,,,,,,,,0.056529752910137177,,,,,, +33,114149,,,,,,,,,,,,0.0778745710849762,,,,,, +33,114199,,,,,,,,,,,,0.07258192449808121,,,,,, +33,114249,,,,,,,,,,,,0.07959131896495819,,,,,, +33,114299,,,,,,,,,,,,0.07823377847671509,,,,,, +33,114349,,,,,,,,,,,,0.07016313076019287,,,,,, +33,114399,,,,,,,,,,,,0.07135828584432602,,,,,, +33,114449,,,,,,,,,,,,0.08467884361743927,,,,,, +33,114499,,,,,,,,,,,,0.07170777767896652,,,,,, +33,114549,,,,,,,,,,,,0.0733814388513565,,,,,, +33,114599,,,,,,,,,,,,0.07713145017623901,,,,,, +33,114649,,,,,,,,,,,,0.08204791694879532,,,,,, +33,114699,,,,,,,,,,,,0.07196811586618423,,,,,, +33,114749,,,,,,,,,,,,0.0647290050983429,,,,,, +33,114799,,,,,,,,,,,,0.08527760207653046,,,,,, +33,114849,,,,,,,,,,,,0.07162372022867203,,,,,, +33,114899,,,,,,,,,,,,0.07502704858779907,,,,,, +33,114949,,,,,,,,,,,,0.08529197424650192,,,,,, +33,114999,,,,,,,,,,,,0.08268015086650848,,,,,, +33,115049,,,,,,,,,,,,0.08049793541431427,,,,,, +33,115099,,,,,,,,,,,,0.07540376484394073,,,,,, +33,115149,,,,,,,,,,,,0.06908842921257019,,,,,, +33,115199,,,,,,,,,,,,0.08529232442378998,,,,,, +33,115249,,,,,,,,,,,,0.08055894076824188,,,,,, +33,115299,,,,,,,,,,,,0.08588827401399612,,,,,, +33,115349,,,,,,,,,,,,0.07134173810482025,,,,,, +33,115399,,,,,,,,,,,,0.07692481577396393,,,,,, +33,115449,,,,,,,,,,,,0.07958690822124481,,,,,, +33,115499,,,,,,,,,,,,0.08313767611980438,,,,,, +33,115549,,,,,,,,,,,,0.07157614827156067,,,,,, +33,115599,,,,,,,,,,,,0.08050811290740967,,,,,, +33,115649,,,,,,,,,,,,0.0787985771894455,,,,,, +33,115699,,,,,,,,,,,,0.07744118571281433,,,,,, +33,115749,,,,,,,,,,,,0.07483984529972076,,,,,, +33,115799,,,,,,,,,,,,0.07408580929040909,,,,,, +33,115849,,,,,,,,,,,,0.06174727529287338,,,,,, +33,115899,,,,,,,,,,,,0.0662555992603302,,,,,, +33,115949,,,,,,,,,,,,0.0762692540884018,,,,,, +33,115999,,,,,,,,,,,,0.06658077239990234,,,,,, +33,116049,,,,,,,,,,,,0.06866377592086792,,,,,, +33,116099,,,,,,,,,,,,0.07478217780590057,,,,,, +33,116149,,,,,,,,,,,,0.09595984220504761,,,,,, +33,116199,,,,,,,,,,,,0.06839460134506226,,,,,, +33,116249,,,,,,,,,,,,0.07106408476829529,,,,,, +33,116299,,,,,,,,,,,,0.0755733996629715,,,,,, +33,116349,,,,,,,,,,,,0.07502299547195435,,,,,, +33,116399,,,,,,,,,,,,0.07073508203029633,,,,,, +33,116449,,,,,,,,,,,,0.08213543891906738,,,,,, +33,116499,,,,,,,,,,,,0.08377288281917572,,,,,, +33,116549,,,,,,,,,,,,0.08720992505550385,,,,,, +33,116599,,,,,,,,,,,,0.07509654015302658,,,,,, +33,116649,,,,,,,,,,,,0.08378413319587708,,,,,, +33,116699,,,,,,,,,,,,0.07338554412126541,,,,,, +33,116749,,,,,,,,,,,,0.08195734024047852,,,,,, +33,116799,,,,,,,,,,,,0.07861728221178055,,,,,, +33,116849,,,,,,,,,,,,0.0645805150270462,,,,,, +33,116899,,,,,,,,,,,,0.06832225620746613,,,,,, +33,116949,,,,,,,,,,,,0.07162193953990936,,,,,, +33,116999,,,,,,,,,,,,0.07240553200244904,,,,,, +33,117027,,,,,,,,,,,,,0.2351461946964264,0.07569392770528793,0.3065906763076782,0.08912408351898193,0.30653712153434753,0.07569392770528793 +33,117027,,,,,,,0.23715835809707642,0.07730624824762344,0.2574732005596161,0.06540006399154663,0.25003647804260254,,,,,,, +34,117049,,,,,,,,,,,,0.054323598742485046,,,,,, +34,117099,,,,,,,,,,,,0.07306873798370361,,,,,, +34,117149,,,,,,,,,,,,0.07144834846258163,,,,,, +34,117199,,,,,,,,,,,,0.0792594701051712,,,,,, +34,117249,,,,,,,,,,,,0.08241157233715057,,,,,, +34,117299,,,,,,,,,,,,0.0834336131811142,,,,,, +34,117349,,,,,,,,,,,,0.07475195825099945,,,,,, +34,117399,,,,,,,,,,,,0.07669328153133392,,,,,, +34,117449,,,,,,,,,,,,0.07892085611820221,,,,,, +34,117499,,,,,,,,,,,,0.07232178002595901,,,,,, +34,117549,,,,,,,,,,,,0.07914624363183975,,,,,, +34,117599,,,,,,,,,,,,0.07430325448513031,,,,,, +34,117649,,,,,,,,,,,,0.0755704939365387,,,,,, +34,117699,,,,,,,,,,,,0.0751059427857399,,,,,, +34,117749,,,,,,,,,,,,0.07466621696949005,,,,,, +34,117799,,,,,,,,,,,,0.07842360436916351,,,,,, +34,117849,,,,,,,,,,,,0.08412729203701019,,,,,, +34,117899,,,,,,,,,,,,0.07455164194107056,,,,,, +34,117949,,,,,,,,,,,,0.07276325672864914,,,,,, +34,117999,,,,,,,,,,,,0.0689861848950386,,,,,, +34,118049,,,,,,,,,,,,0.06472766399383545,,,,,, +34,118099,,,,,,,,,,,,0.06027616187930107,,,,,, +34,118149,,,,,,,,,,,,0.08034049719572067,,,,,, +34,118199,,,,,,,,,,,,0.07547693699598312,,,,,, +34,118249,,,,,,,,,,,,0.07773672044277191,,,,,, +34,118299,,,,,,,,,,,,0.09000922739505768,,,,,, +34,118349,,,,,,,,,,,,0.0805625170469284,,,,,, +34,118399,,,,,,,,,,,,0.08202776312828064,,,,,, +34,118449,,,,,,,,,,,,0.07452249526977539,,,,,, +34,118499,,,,,,,,,,,,0.06525833159685135,,,,,, +34,118549,,,,,,,,,,,,0.08047305792570114,,,,,, +34,118599,,,,,,,,,,,,0.0688382089138031,,,,,, +34,118649,,,,,,,,,,,,0.07453591376543045,,,,,, +34,118699,,,,,,,,,,,,0.08259450644254684,,,,,, +34,118749,,,,,,,,,,,,0.07046403735876083,,,,,, +34,118799,,,,,,,,,,,,0.06955070048570633,,,,,, +34,118849,,,,,,,,,,,,0.07431890070438385,,,,,, +34,118899,,,,,,,,,,,,0.08927175402641296,,,,,, +34,118949,,,,,,,,,,,,0.06875474005937576,,,,,, +34,118999,,,,,,,,,,,,0.0648830384016037,,,,,, +34,119049,,,,,,,,,,,,0.06668190658092499,,,,,, +34,119099,,,,,,,,,,,,0.06250420212745667,,,,,, +34,119149,,,,,,,,,,,,0.0770195722579956,,,,,, +34,119199,,,,,,,,,,,,0.07100279629230499,,,,,, +34,119249,,,,,,,,,,,,0.06294108182191849,,,,,, +34,119299,,,,,,,,,,,,0.07414576411247253,,,,,, +34,119349,,,,,,,,,,,,0.08044283092021942,,,,,, +34,119399,,,,,,,,,,,,0.08154456317424774,,,,,, +34,119449,,,,,,,,,,,,0.0727846622467041,,,,,, +34,119499,,,,,,,,,,,,0.07696357369422913,,,,,, +34,119549,,,,,,,,,,,,0.07531724870204926,,,,,, +34,119599,,,,,,,,,,,,0.07072631269693375,,,,,, +34,119649,,,,,,,,,,,,0.08201254904270172,,,,,, +34,119699,,,,,,,,,,,,0.0674579069018364,,,,,, +34,119749,,,,,,,,,,,,0.08184908330440521,,,,,, +34,119799,,,,,,,,,,,,0.07569147646427155,,,,,, +34,119849,,,,,,,,,,,,0.0741703063249588,,,,,, +34,119899,,,,,,,,,,,,0.07884915173053741,,,,,, +34,119949,,,,,,,,,,,,0.0713481530547142,,,,,, +34,119999,,,,,,,,,,,,0.06913928687572479,,,,,, +34,120049,,,,,,,,,,,,0.0805421695113182,,,,,, +34,120099,,,,,,,,,,,,0.07319176197052002,,,,,, +34,120149,,,,,,,,,,,,0.05985155329108238,,,,,, +34,120199,,,,,,,,,,,,0.07242186367511749,,,,,, +34,120249,,,,,,,,,,,,0.07399539649486542,,,,,, +34,120299,,,,,,,,,,,,0.06810298562049866,,,,,, +34,120349,,,,,,,,,,,,0.06513917446136475,,,,,, +34,120399,,,,,,,,,,,,0.07256321609020233,,,,,, +34,120449,,,,,,,,,,,,0.07357656955718994,,,,,, +34,120469,,,,,,,,,,,,,0.2363022118806839,0.07678551971912384,0.2896430790424347,0.07598811388015747,0.28742286562919617,0.07678551971912384 +34,120469,,,,,,,0.23613408207893372,0.0763595774769783,0.2774758040904999,0.07683521509170532,0.2605028748512268,,,,,,, +35,120499,,,,,,,,,,,,0.07173626124858856,,,,,, +35,120549,,,,,,,,,,,,0.07156582176685333,,,,,, +35,120599,,,,,,,,,,,,0.06666800379753113,,,,,, +35,120649,,,,,,,,,,,,0.07024581730365753,,,,,, +35,120699,,,,,,,,,,,,0.09667924046516418,,,,,, +35,120749,,,,,,,,,,,,0.06647724658250809,,,,,, +35,120799,,,,,,,,,,,,0.07816518098115921,,,,,, +35,120849,,,,,,,,,,,,0.07034908980131149,,,,,, +35,120899,,,,,,,,,,,,0.06665656715631485,,,,,, +35,120949,,,,,,,,,,,,0.08010190725326538,,,,,, +35,120999,,,,,,,,,,,,0.06357914209365845,,,,,, +35,121049,,,,,,,,,,,,0.0868653729557991,,,,,, +35,121099,,,,,,,,,,,,0.0689292699098587,,,,,, +35,121149,,,,,,,,,,,,0.07115542888641357,,,,,, +35,121199,,,,,,,,,,,,0.0753839984536171,,,,,, +35,121249,,,,,,,,,,,,0.07181958109140396,,,,,, +35,121299,,,,,,,,,,,,0.07321756333112717,,,,,, +35,121349,,,,,,,,,,,,0.06462307274341583,,,,,, +35,121399,,,,,,,,,,,,0.06692273914813995,,,,,, +35,121449,,,,,,,,,,,,0.07901319861412048,,,,,, +35,121499,,,,,,,,,,,,0.0776967704296112,,,,,, +35,121549,,,,,,,,,,,,0.07588385045528412,,,,,, +35,121599,,,,,,,,,,,,0.0668562799692154,,,,,, +35,121649,,,,,,,,,,,,0.07466761767864227,,,,,, +35,121699,,,,,,,,,,,,0.07930834591388702,,,,,, +35,121749,,,,,,,,,,,,0.07806392759084702,,,,,, +35,121799,,,,,,,,,,,,0.07542571425437927,,,,,, +35,121849,,,,,,,,,,,,0.07349593937397003,,,,,, +35,121899,,,,,,,,,,,,0.06640449166297913,,,,,, +35,121949,,,,,,,,,,,,0.08723458647727966,,,,,, +35,121999,,,,,,,,,,,,0.07878699898719788,,,,,, +35,122049,,,,,,,,,,,,0.08066287636756897,,,,,, +35,122099,,,,,,,,,,,,0.07951909303665161,,,,,, +35,122149,,,,,,,,,,,,0.07872360199689865,,,,,, +35,122199,,,,,,,,,,,,0.07578343152999878,,,,,, +35,122249,,,,,,,,,,,,0.082106813788414,,,,,, +35,122299,,,,,,,,,,,,0.07765085995197296,,,,,, +35,122349,,,,,,,,,,,,0.06672554463148117,,,,,, +35,122399,,,,,,,,,,,,0.0741732120513916,,,,,, +35,122449,,,,,,,,,,,,0.07283908873796463,,,,,, +35,122499,,,,,,,,,,,,0.08837594091892242,,,,,, +35,122549,,,,,,,,,,,,0.07779926806688309,,,,,, +35,122599,,,,,,,,,,,,0.07121439278125763,,,,,, +35,122649,,,,,,,,,,,,0.0899929404258728,,,,,, +35,122699,,,,,,,,,,,,0.07477991282939911,,,,,, +35,122749,,,,,,,,,,,,0.07349380850791931,,,,,, +35,122799,,,,,,,,,,,,0.07539864629507065,,,,,, +35,122849,,,,,,,,,,,,0.07504241913557053,,,,,, +35,122899,,,,,,,,,,,,0.06939452141523361,,,,,, +35,122949,,,,,,,,,,,,0.08063668757677078,,,,,, +35,122999,,,,,,,,,,,,0.08551307022571564,,,,,, +35,123049,,,,,,,,,,,,0.07619670778512955,,,,,, +35,123099,,,,,,,,,,,,0.07831914722919464,,,,,, +35,123149,,,,,,,,,,,,0.07632309198379517,,,,,, +35,123199,,,,,,,,,,,,0.07702943682670593,,,,,, +35,123249,,,,,,,,,,,,0.08933418244123459,,,,,, +35,123299,,,,,,,,,,,,0.08819922804832458,,,,,, +35,123349,,,,,,,,,,,,0.07216660678386688,,,,,, +35,123399,,,,,,,,,,,,0.08350135385990143,,,,,, +35,123449,,,,,,,,,,,,0.07279272377490997,,,,,, +35,123499,,,,,,,,,,,,0.07952053844928741,,,,,, +35,123549,,,,,,,,,,,,0.07368095219135284,,,,,, +35,123599,,,,,,,,,,,,0.0854315459728241,,,,,, +35,123649,,,,,,,,,,,,0.07933104783296585,,,,,, +35,123699,,,,,,,,,,,,0.07977074384689331,,,,,, +35,123749,,,,,,,,,,,,0.08153627812862396,,,,,, +35,123799,,,,,,,,,,,,0.07202012091875076,,,,,, +35,123849,,,,,,,,,,,,0.0788460373878479,,,,,, +35,123899,,,,,,,,,,,,0.08212491869926453,,,,,, +35,123911,,,,,,,,,,,,,0.23521214723587036,0.07875659316778183,0.3104906976222992,0.05226898193359375,0.307420551776886,0.07875659316778183 +35,123911,,,,,,,0.23542509973049164,0.07597939670085907,0.28556403517723083,0.0814363956451416,0.26872995495796204,,,,,,, +36,123949,,,,,,,,,,,,0.0668078362941742,,,,,, +36,123999,,,,,,,,,,,,0.07469233870506287,,,,,, +36,124049,,,,,,,,,,,,0.07571514695882797,,,,,, +36,124099,,,,,,,,,,,,0.0798238217830658,,,,,, +36,124149,,,,,,,,,,,,0.0808982327580452,,,,,, +36,124199,,,,,,,,,,,,0.06866124272346497,,,,,, +36,124249,,,,,,,,,,,,0.07754676043987274,,,,,, +36,124299,,,,,,,,,,,,0.08866238594055176,,,,,, +36,124349,,,,,,,,,,,,0.06992779672145844,,,,,, +36,124399,,,,,,,,,,,,0.07352131605148315,,,,,, +36,124449,,,,,,,,,,,,0.07617206126451492,,,,,, +36,124499,,,,,,,,,,,,0.07957466691732407,,,,,, +36,124549,,,,,,,,,,,,0.07233767211437225,,,,,, +36,124599,,,,,,,,,,,,0.08150498569011688,,,,,, +36,124649,,,,,,,,,,,,0.08270223438739777,,,,,, +36,124699,,,,,,,,,,,,0.08297800272703171,,,,,, +36,124749,,,,,,,,,,,,0.06718452274799347,,,,,, +36,124799,,,,,,,,,,,,0.06447238475084305,,,,,, +36,124849,,,,,,,,,,,,0.06600219756364822,,,,,, +36,124899,,,,,,,,,,,,0.08094726502895355,,,,,, +36,124949,,,,,,,,,,,,0.07986566424369812,,,,,, +36,124999,,,,,,,,,,,,0.06438713520765305,,,,,, +36,125049,,,,,,,,,,,,0.07715427875518799,,,,,, +36,125099,,,,,,,,,,,,0.08070433139801025,,,,,, +36,125149,,,,,,,,,,,,0.06812459230422974,,,,,, +36,125199,,,,,,,,,,,,0.07543008029460907,,,,,, +36,125249,,,,,,,,,,,,0.06666652858257294,,,,,, +36,125299,,,,,,,,,,,,0.07191275805234909,,,,,, +36,125349,,,,,,,,,,,,0.0662364512681961,,,,,, +36,125399,,,,,,,,,,,,0.07430481910705566,,,,,, +36,125449,,,,,,,,,,,,0.08625389635562897,,,,,, +36,125499,,,,,,,,,,,,0.08373627066612244,,,,,, +36,125549,,,,,,,,,,,,0.0736074298620224,,,,,, +36,125599,,,,,,,,,,,,0.07384639233350754,,,,,, +36,125649,,,,,,,,,,,,0.07136577367782593,,,,,, +36,125699,,,,,,,,,,,,0.06215096265077591,,,,,, +36,125749,,,,,,,,,,,,0.07217224687337875,,,,,, +36,125799,,,,,,,,,,,,0.07780346274375916,,,,,, +36,125849,,,,,,,,,,,,0.08949153870344162,,,,,, +36,125899,,,,,,,,,,,,0.061525993049144745,,,,,, +36,125949,,,,,,,,,,,,0.07598944008350372,,,,,, +36,125999,,,,,,,,,,,,0.07720165699720383,,,,,, +36,126049,,,,,,,,,,,,0.07766410708427429,,,,,, +36,126099,,,,,,,,,,,,0.08173710107803345,,,,,, +36,126149,,,,,,,,,,,,0.0745021179318428,,,,,, +36,126199,,,,,,,,,,,,0.06651327013969421,,,,,, +36,126249,,,,,,,,,,,,0.08090144395828247,,,,,, +36,126299,,,,,,,,,,,,0.08053457736968994,,,,,, +36,126349,,,,,,,,,,,,0.07609179615974426,,,,,, +36,126399,,,,,,,,,,,,0.08806543052196503,,,,,, +36,126449,,,,,,,,,,,,0.07733254134654999,,,,,, +36,126499,,,,,,,,,,,,0.08573904633522034,,,,,, +36,126549,,,,,,,,,,,,0.08218254148960114,,,,,, +36,126599,,,,,,,,,,,,0.07219476997852325,,,,,, +36,126649,,,,,,,,,,,,0.08138370513916016,,,,,, +36,126699,,,,,,,,,,,,0.07271507382392883,,,,,, +36,126749,,,,,,,,,,,,0.06681627780199051,,,,,, +36,126799,,,,,,,,,,,,0.08756861835718155,,,,,, +36,126849,,,,,,,,,,,,0.07469311356544495,,,,,, +36,126899,,,,,,,,,,,,0.07645237445831299,,,,,, +36,126949,,,,,,,,,,,,0.07477693259716034,,,,,, +36,126999,,,,,,,,,,,,0.07584583014249802,,,,,, +36,127049,,,,,,,,,,,,0.07449306547641754,,,,,, +36,127099,,,,,,,,,,,,0.07803720235824585,,,,,, +36,127149,,,,,,,,,,,,0.06871610879898071,,,,,, +36,127199,,,,,,,,,,,,0.08145586401224136,,,,,, +36,127249,,,,,,,,,,,,0.07580848783254623,,,,,, +36,127299,,,,,,,,,,,,0.08882789313793182,,,,,, +36,127349,,,,,,,,,,,,0.07696311175823212,,,,,, +36,127353,,,,,,,,,,,,,0.23661339282989502,0.07932538539171219,0.29336100816726685,0.04542428255081177,0.29202601313591003,0.07932538539171219 +36,127353,,,,,,,0.235455721616745,0.07601627707481384,0.2848411500453949,0.08098876476287842,0.2683538496494293,,,,,,, +37,127399,,,,,,,,,,,,0.07025003433227539,,,,,, +37,127449,,,,,,,,,,,,0.08358584344387054,,,,,, +37,127499,,,,,,,,,,,,0.08423654735088348,,,,,, +37,127549,,,,,,,,,,,,0.07127510756254196,,,,,, +37,127599,,,,,,,,,,,,0.08227235078811646,,,,,, +37,127649,,,,,,,,,,,,0.08091872930526733,,,,,, +37,127699,,,,,,,,,,,,0.07454942911863327,,,,,, +37,127749,,,,,,,,,,,,0.08286604285240173,,,,,, +37,127799,,,,,,,,,,,,0.07469958066940308,,,,,, +37,127849,,,,,,,,,,,,0.0764373242855072,,,,,, +37,127899,,,,,,,,,,,,0.07271179556846619,,,,,, +37,127949,,,,,,,,,,,,0.07521520555019379,,,,,, +37,127999,,,,,,,,,,,,0.07319814711809158,,,,,, +37,128049,,,,,,,,,,,,0.08112336695194244,,,,,, +37,128099,,,,,,,,,,,,0.07683250308036804,,,,,, +37,128149,,,,,,,,,,,,0.07682263851165771,,,,,, +37,128199,,,,,,,,,,,,0.08052816241979599,,,,,, +37,128249,,,,,,,,,,,,0.07327757030725479,,,,,, +37,128299,,,,,,,,,,,,0.08117739111185074,,,,,, +37,128349,,,,,,,,,,,,0.08080703020095825,,,,,, +37,128399,,,,,,,,,,,,0.08165585249662399,,,,,, +37,128449,,,,,,,,,,,,0.07983611524105072,,,,,, +37,128499,,,,,,,,,,,,0.07871353626251221,,,,,, +37,128549,,,,,,,,,,,,0.07523024082183838,,,,,, +37,128599,,,,,,,,,,,,0.07536692917346954,,,,,, +37,128649,,,,,,,,,,,,0.07110701501369476,,,,,, +37,128699,,,,,,,,,,,,0.08050194382667542,,,,,, +37,128749,,,,,,,,,,,,0.07890129834413528,,,,,, +37,128799,,,,,,,,,,,,0.07149165868759155,,,,,, +37,128849,,,,,,,,,,,,0.08369338512420654,,,,,, +37,128899,,,,,,,,,,,,0.08488188683986664,,,,,, +37,128949,,,,,,,,,,,,0.07977224886417389,,,,,, +37,128999,,,,,,,,,,,,0.06944283843040466,,,,,, +37,129049,,,,,,,,,,,,0.06533581763505936,,,,,, +37,129099,,,,,,,,,,,,0.06726709753274918,,,,,, +37,129149,,,,,,,,,,,,0.08014847338199615,,,,,, +37,129199,,,,,,,,,,,,0.0719112753868103,,,,,, +37,129249,,,,,,,,,,,,0.06587893515825272,,,,,, +37,129299,,,,,,,,,,,,0.06193823367357254,,,,,, +37,129349,,,,,,,,,,,,0.08482877165079117,,,,,, +37,129399,,,,,,,,,,,,0.0753084048628807,,,,,, +37,129449,,,,,,,,,,,,0.07274320721626282,,,,,, +37,129499,,,,,,,,,,,,0.07725082337856293,,,,,, +37,129549,,,,,,,,,,,,0.07003059983253479,,,,,, +37,129599,,,,,,,,,,,,0.06361496448516846,,,,,, +37,129649,,,,,,,,,,,,0.07657362520694733,,,,,, +37,129699,,,,,,,,,,,,0.07095561921596527,,,,,, +37,129749,,,,,,,,,,,,0.07474104315042496,,,,,, +37,129799,,,,,,,,,,,,0.07345029711723328,,,,,, +37,129849,,,,,,,,,,,,0.07103966176509857,,,,,, +37,129899,,,,,,,,,,,,0.07524383068084717,,,,,, +37,129949,,,,,,,,,,,,0.07320815324783325,,,,,, +37,129999,,,,,,,,,,,,0.0837528258562088,,,,,, +37,130049,,,,,,,,,,,,0.07773669809103012,,,,,, +37,130099,,,,,,,,,,,,0.07687562704086304,,,,,, +37,130149,,,,,,,,,,,,0.06676533073186874,,,,,, +37,130199,,,,,,,,,,,,0.07836537808179855,,,,,, +37,130249,,,,,,,,,,,,0.08325491100549698,,,,,, +37,130299,,,,,,,,,,,,0.07982255518436432,,,,,, +37,130349,,,,,,,,,,,,0.0765155553817749,,,,,, +37,130399,,,,,,,,,,,,0.0706905722618103,,,,,, +37,130449,,,,,,,,,,,,0.0807613730430603,,,,,, +37,130499,,,,,,,,,,,,0.07009493559598923,,,,,, +37,130549,,,,,,,,,,,,0.0804232582449913,,,,,, +37,130599,,,,,,,,,,,,0.07041706144809723,,,,,, +37,130649,,,,,,,,,,,,0.07001128792762756,,,,,, +37,130699,,,,,,,,,,,,0.07447957992553711,,,,,, +37,130749,,,,,,,,,,,,0.07133401185274124,,,,,, +37,130795,,,,,,,,,,,,,0.23385460674762726,0.0752827599644661,0.3073119521141052,0.09407192468643188,0.3053649365901947,0.0752827599644661 +37,130795,,,,,,,0.23520253598690033,0.07587071508169174,0.2879294455051422,0.08273553848266602,0.27101579308509827,,,,,,, +38,130799,,,,,,,,,,,,0.08399087190628052,,,,,, +38,130849,,,,,,,,,,,,0.06525927037000656,,,,,, +38,130899,,,,,,,,,,,,0.08016503602266312,,,,,, +38,130949,,,,,,,,,,,,0.07302848994731903,,,,,, +38,130999,,,,,,,,,,,,0.06871536374092102,,,,,, +38,131049,,,,,,,,,,,,0.07949501276016235,,,,,, +38,131099,,,,,,,,,,,,0.06721732020378113,,,,,, +38,131149,,,,,,,,,,,,0.0712265819311142,,,,,, +38,131199,,,,,,,,,,,,0.07946307957172394,,,,,, +38,131249,,,,,,,,,,,,0.08189001679420471,,,,,, +38,131299,,,,,,,,,,,,0.07163814455270767,,,,,, +38,131349,,,,,,,,,,,,0.06435542553663254,,,,,, +38,131399,,,,,,,,,,,,0.06642509251832962,,,,,, +38,131449,,,,,,,,,,,,0.06903983652591705,,,,,, +38,131499,,,,,,,,,,,,0.07620706409215927,,,,,, +38,131549,,,,,,,,,,,,0.0848858579993248,,,,,, +38,131599,,,,,,,,,,,,0.07949262857437134,,,,,, +38,131649,,,,,,,,,,,,0.07099920511245728,,,,,, +38,131699,,,,,,,,,,,,0.07820484042167664,,,,,, +38,131749,,,,,,,,,,,,0.07472621649503708,,,,,, +38,131799,,,,,,,,,,,,0.06838271021842957,,,,,, +38,131849,,,,,,,,,,,,0.06854076683521271,,,,,, +38,131899,,,,,,,,,,,,0.070456363260746,,,,,, +38,131949,,,,,,,,,,,,0.07156448066234589,,,,,, +38,131999,,,,,,,,,,,,0.06893768161535263,,,,,, +38,132049,,,,,,,,,,,,0.06725910305976868,,,,,, +38,132099,,,,,,,,,,,,0.08139951527118683,,,,,, +38,132149,,,,,,,,,,,,0.07921810448169708,,,,,, +38,132199,,,,,,,,,,,,0.0690251886844635,,,,,, +38,132249,,,,,,,,,,,,0.07930328696966171,,,,,, +38,132299,,,,,,,,,,,,0.0757410079240799,,,,,, +38,132349,,,,,,,,,,,,0.066433385014534,,,,,, +38,132399,,,,,,,,,,,,0.07157114148139954,,,,,, +38,132449,,,,,,,,,,,,0.06469845771789551,,,,,, +38,132499,,,,,,,,,,,,0.09065897762775421,,,,,, +38,132549,,,,,,,,,,,,0.07029310613870621,,,,,, +38,132599,,,,,,,,,,,,0.07600803673267365,,,,,, +38,132649,,,,,,,,,,,,0.0703856572508812,,,,,, +38,132699,,,,,,,,,,,,0.07734742760658264,,,,,, +38,132749,,,,,,,,,,,,0.07109232246875763,,,,,, +38,132799,,,,,,,,,,,,0.08347119390964508,,,,,, +38,132849,,,,,,,,,,,,0.09100586175918579,,,,,, +38,132899,,,,,,,,,,,,0.07521931827068329,,,,,, +38,132949,,,,,,,,,,,,0.06448064744472504,,,,,, +38,132999,,,,,,,,,,,,0.07260170578956604,,,,,, +38,133049,,,,,,,,,,,,0.07049953192472458,,,,,, +38,133099,,,,,,,,,,,,0.07994763553142548,,,,,, +38,133149,,,,,,,,,,,,0.08250671625137329,,,,,, +38,133199,,,,,,,,,,,,0.07439331710338593,,,,,, +38,133249,,,,,,,,,,,,0.08096086233854294,,,,,, +38,133299,,,,,,,,,,,,0.07715437561273575,,,,,, +38,133349,,,,,,,,,,,,0.07759000360965729,,,,,, +38,133399,,,,,,,,,,,,0.07088035345077515,,,,,, +38,133449,,,,,,,,,,,,0.07661139965057373,,,,,, +38,133499,,,,,,,,,,,,0.06668763607740402,,,,,, +38,133549,,,,,,,,,,,,0.08114321529865265,,,,,, +38,133599,,,,,,,,,,,,0.07489100098609924,,,,,, +38,133649,,,,,,,,,,,,0.06337089836597443,,,,,, +38,133699,,,,,,,,,,,,0.08694003522396088,,,,,, +38,133749,,,,,,,,,,,,0.09130938351154327,,,,,, +38,133799,,,,,,,,,,,,0.07328039407730103,,,,,, +38,133849,,,,,,,,,,,,0.07766400277614594,,,,,, +38,133899,,,,,,,,,,,,0.0772581398487091,,,,,, +38,133949,,,,,,,,,,,,0.0697484165430069,,,,,, +38,133999,,,,,,,,,,,,0.08308850228786469,,,,,, +38,134049,,,,,,,,,,,,0.06523993611335754,,,,,, +38,134099,,,,,,,,,,,,0.0721110999584198,,,,,, +38,134149,,,,,,,,,,,,0.07896291464567184,,,,,, +38,134199,,,,,,,,,,,,0.0868910551071167,,,,,, +38,134237,,,,,,,,,,,,,0.23632210493087769,0.07839388400316238,0.30119505524635315,0.05663365125656128,0.2996184825897217,0.07839388400316238 +38,134237,,,,,,,0.2347535938024521,0.07562775909900665,0.2929289937019348,0.08569294214248657,0.27653399109840393,,,,,,, +39,134249,,,,,,,,,,,,0.08473709970712662,,,,,, +39,134299,,,,,,,,,,,,0.08417825400829315,,,,,, +39,134349,,,,,,,,,,,,0.08067067712545395,,,,,, +39,134399,,,,,,,,,,,,0.06579902768135071,,,,,, +39,134449,,,,,,,,,,,,0.06896314769983292,,,,,, +39,134499,,,,,,,,,,,,0.07544507086277008,,,,,, +39,134549,,,,,,,,,,,,0.08541901409626007,,,,,, +39,134599,,,,,,,,,,,,0.08034098148345947,,,,,, +39,134649,,,,,,,,,,,,0.08442854881286621,,,,,, +39,134699,,,,,,,,,,,,0.07619208097457886,,,,,, +39,134749,,,,,,,,,,,,0.07853133976459503,,,,,, +39,134799,,,,,,,,,,,,0.06805473566055298,,,,,, +39,134849,,,,,,,,,,,,0.08697344362735748,,,,,, +39,134899,,,,,,,,,,,,0.07541961967945099,,,,,, +39,134949,,,,,,,,,,,,0.07539359480142593,,,,,, +39,134999,,,,,,,,,,,,0.08967472612857819,,,,,, +39,135049,,,,,,,,,,,,0.08954707533121109,,,,,, +39,135099,,,,,,,,,,,,0.07376831769943237,,,,,, +39,135149,,,,,,,,,,,,0.07072266936302185,,,,,, +39,135199,,,,,,,,,,,,0.08255130052566528,,,,,, +39,135249,,,,,,,,,,,,0.07916684448719025,,,,,, +39,135299,,,,,,,,,,,,0.08152364939451218,,,,,, +39,135349,,,,,,,,,,,,0.08058282732963562,,,,,, +39,135399,,,,,,,,,,,,0.08021582663059235,,,,,, +39,135449,,,,,,,,,,,,0.07311820983886719,,,,,, +39,135499,,,,,,,,,,,,0.07852651923894882,,,,,, +39,135549,,,,,,,,,,,,0.07950519025325775,,,,,, +39,135599,,,,,,,,,,,,0.07697243988513947,,,,,, +39,135649,,,,,,,,,,,,0.06340881437063217,,,,,, +39,135699,,,,,,,,,,,,0.0776921883225441,,,,,, +39,135749,,,,,,,,,,,,0.07918469607830048,,,,,, +39,135799,,,,,,,,,,,,0.07189243286848068,,,,,, +39,135849,,,,,,,,,,,,0.07421150803565979,,,,,, +39,135899,,,,,,,,,,,,0.07387595623731613,,,,,, +39,135949,,,,,,,,,,,,0.08275453746318817,,,,,, +39,135999,,,,,,,,,,,,0.07878586649894714,,,,,, +39,136049,,,,,,,,,,,,0.08646103739738464,,,,,, +39,136099,,,,,,,,,,,,0.08796729147434235,,,,,, +39,136149,,,,,,,,,,,,0.06254072487354279,,,,,, +39,136199,,,,,,,,,,,,0.06589402258396149,,,,,, +39,136249,,,,,,,,,,,,0.07681673765182495,,,,,, +39,136299,,,,,,,,,,,,0.07651302218437195,,,,,, +39,136349,,,,,,,,,,,,0.06947602331638336,,,,,, +39,136399,,,,,,,,,,,,0.06715035438537598,,,,,, +39,136449,,,,,,,,,,,,0.08330728113651276,,,,,, +39,136499,,,,,,,,,,,,0.06641613692045212,,,,,, +39,136549,,,,,,,,,,,,0.08468469977378845,,,,,, +39,136599,,,,,,,,,,,,0.08699027448892593,,,,,, +39,136649,,,,,,,,,,,,0.0737621933221817,,,,,, +39,136699,,,,,,,,,,,,0.08940906822681427,,,,,, +39,136749,,,,,,,,,,,,0.07162156701087952,,,,,, +39,136799,,,,,,,,,,,,0.07906769216060638,,,,,, +39,136849,,,,,,,,,,,,0.08024612069129944,,,,,, +39,136899,,,,,,,,,,,,0.06681697815656662,,,,,, +39,136949,,,,,,,,,,,,0.06563195586204529,,,,,, +39,136999,,,,,,,,,,,,0.06931230425834656,,,,,, +39,137049,,,,,,,,,,,,0.06838308274745941,,,,,, +39,137099,,,,,,,,,,,,0.07207094132900238,,,,,, +39,137149,,,,,,,,,,,,0.07568378746509552,,,,,, +39,137199,,,,,,,,,,,,0.07904525101184845,,,,,, +39,137249,,,,,,,,,,,,0.07680023461580276,,,,,, +39,137299,,,,,,,,,,,,0.08447388559579849,,,,,, +39,137349,,,,,,,,,,,,0.08413639664649963,,,,,, +39,137399,,,,,,,,,,,,0.07647387683391571,,,,,, +39,137449,,,,,,,,,,,,0.07797975838184357,,,,,, +39,137499,,,,,,,,,,,,0.08060044050216675,,,,,, +39,137549,,,,,,,,,,,,0.07874149084091187,,,,,, +39,137599,,,,,,,,,,,,0.072396419942379,,,,,, +39,137649,,,,,,,,,,,,0.07881803065538406,,,,,, +39,137679,,,,,,,,,,,,,0.23593510687351227,0.07867461442947388,0.28605419397354126,0.053255438804626465,0.28090527653694153,0.07867461442947388 +39,137679,,,,,,,0.23503801226615906,0.07582767307758331,0.2888883054256439,0.08327442407608032,0.27179938554763794,,,,,,, +40,137699,,,,,,,,,,,,0.0734710693359375,,,,,, +40,137749,,,,,,,,,,,,0.08602504432201385,,,,,, +40,137799,,,,,,,,,,,,0.08232893794775009,,,,,, +40,137849,,,,,,,,,,,,0.07903574407100677,,,,,, +40,137899,,,,,,,,,,,,0.06405830383300781,,,,,, +40,137949,,,,,,,,,,,,0.07422526925802231,,,,,, +40,137999,,,,,,,,,,,,0.08976458013057709,,,,,, +40,138049,,,,,,,,,,,,0.06513673067092896,,,,,, +40,138099,,,,,,,,,,,,0.07260899990797043,,,,,, +40,138149,,,,,,,,,,,,0.07397211343050003,,,,,, +40,138199,,,,,,,,,,,,0.07585413753986359,,,,,, +40,138249,,,,,,,,,,,,0.08369679749011993,,,,,, +40,138299,,,,,,,,,,,,0.07119733095169067,,,,,, +40,138349,,,,,,,,,,,,0.07990947365760803,,,,,, +40,138399,,,,,,,,,,,,0.07469829171895981,,,,,, +40,138449,,,,,,,,,,,,0.07597794383764267,,,,,, +40,138499,,,,,,,,,,,,0.06640103459358215,,,,,, +40,138549,,,,,,,,,,,,0.08014501631259918,,,,,, +40,138599,,,,,,,,,,,,0.06260478496551514,,,,,, +40,138649,,,,,,,,,,,,0.07208891212940216,,,,,, +40,138699,,,,,,,,,,,,0.06847132742404938,,,,,, +40,138749,,,,,,,,,,,,0.07347538322210312,,,,,, +40,138799,,,,,,,,,,,,0.08165911585092545,,,,,, +40,138849,,,,,,,,,,,,0.07635708153247833,,,,,, +40,138899,,,,,,,,,,,,0.07391893118619919,,,,,, +40,138949,,,,,,,,,,,,0.07542705535888672,,,,,, +40,138999,,,,,,,,,,,,0.07757193595170975,,,,,, +40,139049,,,,,,,,,,,,0.07478147745132446,,,,,, +40,139099,,,,,,,,,,,,0.07032424956560135,,,,,, +40,139149,,,,,,,,,,,,0.07413671910762787,,,,,, +40,139199,,,,,,,,,,,,0.07395439594984055,,,,,, +40,139249,,,,,,,,,,,,0.07453295588493347,,,,,, +40,139299,,,,,,,,,,,,0.07745344936847687,,,,,, +40,139349,,,,,,,,,,,,0.06984440982341766,,,,,, +40,139399,,,,,,,,,,,,0.06888067722320557,,,,,, +40,139449,,,,,,,,,,,,0.06747671961784363,,,,,, +40,139499,,,,,,,,,,,,0.07177124917507172,,,,,, +40,139549,,,,,,,,,,,,0.08850052207708359,,,,,, +40,139599,,,,,,,,,,,,0.0712764784693718,,,,,, +40,139649,,,,,,,,,,,,0.0738341361284256,,,,,, +40,139699,,,,,,,,,,,,0.07190843671560287,,,,,, +40,139749,,,,,,,,,,,,0.06986015290021896,,,,,, +40,139799,,,,,,,,,,,,0.07128410041332245,,,,,, +40,139849,,,,,,,,,,,,0.07554688304662704,,,,,, +40,139899,,,,,,,,,,,,0.0792762041091919,,,,,, +40,139949,,,,,,,,,,,,0.0767882764339447,,,,,, +40,139999,,,,,,,,,,,,0.07273683696985245,,,,,, +40,140049,,,,,,,,,,,,0.07224348187446594,,,,,, +40,140099,,,,,,,,,,,,0.06943555176258087,,,,,, +40,140149,,,,,,,,,,,,0.08201296627521515,,,,,, +40,140199,,,,,,,,,,,,0.08109422028064728,,,,,, +40,140249,,,,,,,,,,,,0.07084526866674423,,,,,, +40,140299,,,,,,,,,,,,0.07322362065315247,,,,,, +40,140349,,,,,,,,,,,,0.07177142053842545,,,,,, +40,140399,,,,,,,,,,,,0.0697382465004921,,,,,, +40,140449,,,,,,,,,,,,0.06484298408031464,,,,,, +40,140499,,,,,,,,,,,,0.07984120398759842,,,,,, +40,140549,,,,,,,,,,,,0.07721789181232452,,,,,, +40,140599,,,,,,,,,,,,0.08483491837978363,,,,,, +40,140649,,,,,,,,,,,,0.07056351006031036,,,,,, +40,140699,,,,,,,,,,,,0.0833023190498352,,,,,, +40,140749,,,,,,,,,,,,0.08157042413949966,,,,,, +40,140799,,,,,,,,,,,,0.07312767207622528,,,,,, +40,140849,,,,,,,,,,,,0.07028862833976746,,,,,, +40,140899,,,,,,,,,,,,0.07814918458461761,,,,,, +40,140949,,,,,,,,,,,,0.0752391368150711,,,,,, +40,140999,,,,,,,,,,,,0.0709560364484787,,,,,, +40,141049,,,,,,,,,,,,0.07540564984083176,,,,,, +40,141099,,,,,,,,,,,,0.07966937124729156,,,,,, +40,141121,,,,,,,,,,,,,0.2356686294078827,0.07826418429613113,0.3044377863407135,0.05819439888000488,0.29869017004966736,0.07826418429613113 +40,141121,,,,,,,0.2346070408821106,0.07558587938547134,0.29380863904953003,0.0862005352973938,0.27705010771751404,,,,,,, +41,141149,,,,,,,,,,,,0.07668846100568771,,,,,, +41,141199,,,,,,,,,,,,0.06921720504760742,,,,,, +41,141249,,,,,,,,,,,,0.3020230829715729,,,,,, +41,141299,,,,,,,,,,,,0.07240938395261765,,,,,, +41,141349,,,,,,,,,,,,0.08585063368082047,,,,,, +41,141399,,,,,,,,,,,,0.0778719112277031,,,,,, +41,141449,,,,,,,,,,,,0.08362460136413574,,,,,, +41,141499,,,,,,,,,,,,0.08414449542760849,,,,,, +41,141549,,,,,,,,,,,,0.07942202687263489,,,,,, +41,141599,,,,,,,,,,,,0.07222290337085724,,,,,, +41,141649,,,,,,,,,,,,0.06853120028972626,,,,,, +41,141699,,,,,,,,,,,,0.07969766855239868,,,,,, +41,141749,,,,,,,,,,,,0.08552726358175278,,,,,, +41,141799,,,,,,,,,,,,0.08825598657131195,,,,,, +41,141849,,,,,,,,,,,,0.07163819670677185,,,,,, +41,141899,,,,,,,,,,,,0.08418124914169312,,,,,, +41,141949,,,,,,,,,,,,0.06688687205314636,,,,,, +41,141999,,,,,,,,,,,,0.0742046982049942,,,,,, +41,142049,,,,,,,,,,,,0.08787770569324493,,,,,, +41,142099,,,,,,,,,,,,0.07468268275260925,,,,,, +41,142149,,,,,,,,,,,,0.07598984241485596,,,,,, +41,142199,,,,,,,,,,,,0.07561922073364258,,,,,, +41,142249,,,,,,,,,,,,0.08394435048103333,,,,,, +41,142299,,,,,,,,,,,,0.09051157534122467,,,,,, +41,142349,,,,,,,,,,,,0.07724522054195404,,,,,, +41,142399,,,,,,,,,,,,0.07832584530115128,,,,,, +41,142449,,,,,,,,,,,,0.0624719113111496,,,,,, +41,142499,,,,,,,,,,,,0.06583651900291443,,,,,, +41,142549,,,,,,,,,,,,0.07194611430168152,,,,,, +41,142599,,,,,,,,,,,,0.07630914449691772,,,,,, +41,142649,,,,,,,,,,,,0.06482265144586563,,,,,, +41,142699,,,,,,,,,,,,0.06856894493103027,,,,,, +41,142749,,,,,,,,,,,,0.07675793766975403,,,,,, +41,142799,,,,,,,,,,,,0.0751158595085144,,,,,, +41,142849,,,,,,,,,,,,0.08291123062372208,,,,,, +41,142899,,,,,,,,,,,,0.06952410936355591,,,,,, +41,142949,,,,,,,,,,,,0.08175024390220642,,,,,, +41,142999,,,,,,,,,,,,0.08156561851501465,,,,,, +41,143049,,,,,,,,,,,,0.07980507612228394,,,,,, +41,143099,,,,,,,,,,,,0.08383297175168991,,,,,, +41,143149,,,,,,,,,,,,0.090667225420475,,,,,, +41,143199,,,,,,,,,,,,0.08187942206859589,,,,,, +41,143249,,,,,,,,,,,,0.075721874833107,,,,,, +41,143299,,,,,,,,,,,,0.06736539304256439,,,,,, +41,143349,,,,,,,,,,,,0.07457371056079865,,,,,, +41,143399,,,,,,,,,,,,0.07635149359703064,,,,,, +41,143449,,,,,,,,,,,,0.07255053520202637,,,,,, +41,143499,,,,,,,,,,,,0.0933404192328453,,,,,, +41,143549,,,,,,,,,,,,0.07749064266681671,,,,,, +41,143599,,,,,,,,,,,,0.07488766312599182,,,,,, +41,143649,,,,,,,,,,,,0.08350905776023865,,,,,, +41,143699,,,,,,,,,,,,0.08035881072282791,,,,,, +41,143749,,,,,,,,,,,,0.0723586454987526,,,,,, +41,143799,,,,,,,,,,,,0.06726794689893723,,,,,, +41,143849,,,,,,,,,,,,0.08498068153858185,,,,,, +41,143899,,,,,,,,,,,,0.0770636796951294,,,,,, +41,143949,,,,,,,,,,,,0.07106642425060272,,,,,, +41,143999,,,,,,,,,,,,0.07904274016618729,,,,,, +41,144049,,,,,,,,,,,,0.07906978577375412,,,,,, +41,144099,,,,,,,,,,,,0.07774832099676132,,,,,, +41,144149,,,,,,,,,,,,0.07020753622055054,,,,,, +41,144199,,,,,,,,,,,,0.07964776456356049,,,,,, +41,144249,,,,,,,,,,,,0.08898581564426422,,,,,, +41,144299,,,,,,,,,,,,0.06198413670063019,,,,,, +41,144349,,,,,,,,,,,,0.08194316923618317,,,,,, +41,144399,,,,,,,,,,,,0.06874595582485199,,,,,, +41,144449,,,,,,,,,,,,0.07221006602048874,,,,,, +41,144499,,,,,,,,,,,,0.0878881961107254,,,,,, +41,144549,,,,,,,,,,,,0.07245481014251709,,,,,, +41,144563,,,,,,,,,,,,,0.23448994755744934,0.07585299015045166,0.30066028237342834,0.08720993995666504,0.2994340658187866,0.07585299015045166 +41,144563,,,,,,,0.23488377034664154,0.07575178891420364,0.2905561029911041,0.08418697118759155,0.27672573924064636,,,,,,, +42,144599,,,,,,,,,,,,0.0777864009141922,,,,,, +42,144649,,,,,,,,,,,,0.06745687872171402,,,,,, +42,144699,,,,,,,,,,,,0.07864689826965332,,,,,, +42,144749,,,,,,,,,,,,0.062334269285202026,,,,,, +42,144799,,,,,,,,,,,,0.06982946395874023,,,,,, +42,144849,,,,,,,,,,,,0.08200915157794952,,,,,, +42,144899,,,,,,,,,,,,0.07912907004356384,,,,,, +42,144949,,,,,,,,,,,,0.07111899554729462,,,,,, +42,144999,,,,,,,,,,,,0.061843693256378174,,,,,, +42,145049,,,,,,,,,,,,0.07823759317398071,,,,,, +42,145099,,,,,,,,,,,,0.0741867646574974,,,,,, +42,145149,,,,,,,,,,,,0.08083628118038177,,,,,, +42,145199,,,,,,,,,,,,0.07577722519636154,,,,,, +42,145249,,,,,,,,,,,,0.0762839987874031,,,,,, +42,145299,,,,,,,,,,,,0.07132421433925629,,,,,, +42,145349,,,,,,,,,,,,0.06837695091962814,,,,,, +42,145399,,,,,,,,,,,,0.0750073716044426,,,,,, +42,145449,,,,,,,,,,,,0.06842344999313354,,,,,, +42,145499,,,,,,,,,,,,0.0723564475774765,,,,,, +42,145549,,,,,,,,,,,,0.07753089815378189,,,,,, +42,145599,,,,,,,,,,,,0.06949165463447571,,,,,, +42,145649,,,,,,,,,,,,0.0739729106426239,,,,,, +42,145699,,,,,,,,,,,,0.07119950652122498,,,,,, +42,145749,,,,,,,,,,,,0.07409456372261047,,,,,, +42,145799,,,,,,,,,,,,0.07490935921669006,,,,,, +42,145849,,,,,,,,,,,,0.061078548431396484,,,,,, +42,145899,,,,,,,,,,,,0.07371791452169418,,,,,, +42,145949,,,,,,,,,,,,0.07231178134679794,,,,,, +42,145999,,,,,,,,,,,,0.08520009368658066,,,,,, +42,146049,,,,,,,,,,,,0.08468940109014511,,,,,, +42,146099,,,,,,,,,,,,0.06444329023361206,,,,,, +42,146149,,,,,,,,,,,,0.07100345194339752,,,,,, +42,146199,,,,,,,,,,,,0.07559382915496826,,,,,, +42,146249,,,,,,,,,,,,0.07305461168289185,,,,,, +42,146299,,,,,,,,,,,,0.07160820066928864,,,,,, +42,146349,,,,,,,,,,,,0.08225077390670776,,,,,, +42,146399,,,,,,,,,,,,0.07509039342403412,,,,,, +42,146449,,,,,,,,,,,,0.07325026392936707,,,,,, +42,146499,,,,,,,,,,,,0.06302718073129654,,,,,, +42,146549,,,,,,,,,,,,0.07111836969852448,,,,,, +42,146599,,,,,,,,,,,,0.0768464207649231,,,,,, +42,146649,,,,,,,,,,,,0.07027792930603027,,,,,, +42,146699,,,,,,,,,,,,0.0650719702243805,,,,,, +42,146749,,,,,,,,,,,,0.06945813447237015,,,,,, +42,146799,,,,,,,,,,,,0.07455619424581528,,,,,, +42,146849,,,,,,,,,,,,0.06777732819318771,,,,,, +42,146899,,,,,,,,,,,,0.08892861008644104,,,,,, +42,146949,,,,,,,,,,,,0.07659074664115906,,,,,, +42,146999,,,,,,,,,,,,0.07482881844043732,,,,,, +42,147049,,,,,,,,,,,,0.07329781353473663,,,,,, +42,147099,,,,,,,,,,,,0.07488150894641876,,,,,, +42,147149,,,,,,,,,,,,0.07812116295099258,,,,,, +42,147199,,,,,,,,,,,,0.06475518643856049,,,,,, +42,147249,,,,,,,,,,,,0.07436548173427582,,,,,, +42,147299,,,,,,,,,,,,0.08080017566680908,,,,,, +42,147349,,,,,,,,,,,,0.07825282216072083,,,,,, +42,147399,,,,,,,,,,,,0.07086139172315598,,,,,, +42,147449,,,,,,,,,,,,0.07141642272472382,,,,,, +42,147499,,,,,,,,,,,,0.07113707065582275,,,,,, +42,147549,,,,,,,,,,,,0.07558391988277435,,,,,, +42,147599,,,,,,,,,,,,0.08152559399604797,,,,,, +42,147649,,,,,,,,,,,,0.07650626450777054,,,,,, +42,147699,,,,,,,,,,,,0.06766485422849655,,,,,, +42,147749,,,,,,,,,,,,0.07079538702964783,,,,,, +42,147799,,,,,,,,,,,,0.071189746260643,,,,,, +42,147849,,,,,,,,,,,,0.07134027779102325,,,,,, +42,147899,,,,,,,,,,,,0.08655901253223419,,,,,, +42,147949,,,,,,,,,,,,0.07809987664222717,,,,,, +42,147999,,,,,,,,,,,,0.07787419855594635,,,,,, +42,148005,,,,,,,,,,,,,0.23558370769023895,0.07739533483982086,0.3019488453865051,0.06864988803863525,0.29765263199806213,0.07739533483982086 +42,148005,,,,,,,0.23422586917877197,0.07536082714796066,0.2984398603439331,0.08892101049423218,0.2822103202342987,,,,,,, +43,148049,,,,,,,,,,,,0.07996013015508652,,,,,, +43,148099,,,,,,,,,,,,0.07247419655323029,,,,,, +43,148149,,,,,,,,,,,,0.07981570810079575,,,,,, +43,148199,,,,,,,,,,,,0.07359929382801056,,,,,, +43,148249,,,,,,,,,,,,0.08111180365085602,,,,,, +43,148299,,,,,,,,,,,,0.07407578825950623,,,,,, +43,148349,,,,,,,,,,,,0.06566154211759567,,,,,, +43,148399,,,,,,,,,,,,0.07839855551719666,,,,,, +43,148449,,,,,,,,,,,,0.0755075067281723,,,,,, +43,148499,,,,,,,,,,,,0.07730761170387268,,,,,, +43,148549,,,,,,,,,,,,0.07692959159612656,,,,,, +43,148599,,,,,,,,,,,,0.08546200394630432,,,,,, +43,148649,,,,,,,,,,,,0.07388868182897568,,,,,, +43,148699,,,,,,,,,,,,0.07695116847753525,,,,,, +43,148749,,,,,,,,,,,,0.07923116534948349,,,,,, +43,148799,,,,,,,,,,,,0.08330382406711578,,,,,, +43,148849,,,,,,,,,,,,0.07744576036930084,,,,,, +43,148899,,,,,,,,,,,,0.06988531351089478,,,,,, +43,148949,,,,,,,,,,,,0.07480765879154205,,,,,, +43,148999,,,,,,,,,,,,0.06430954486131668,,,,,, +43,149049,,,,,,,,,,,,0.07733919471502304,,,,,, +43,149099,,,,,,,,,,,,0.07748840749263763,,,,,, +43,149149,,,,,,,,,,,,0.08961094915866852,,,,,, +43,149199,,,,,,,,,,,,0.07339701056480408,,,,,, +43,149249,,,,,,,,,,,,0.0740322396159172,,,,,, +43,149299,,,,,,,,,,,,0.08321031183004379,,,,,, +43,149349,,,,,,,,,,,,0.07907907664775848,,,,,, +43,149399,,,,,,,,,,,,0.06461893022060394,,,,,, +43,149449,,,,,,,,,,,,0.08018691092729568,,,,,, +43,149499,,,,,,,,,,,,0.06946861743927002,,,,,, +43,149549,,,,,,,,,,,,0.07688011229038239,,,,,, +43,149599,,,,,,,,,,,,0.0660935789346695,,,,,, +43,149649,,,,,,,,,,,,0.08321702480316162,,,,,, +43,149699,,,,,,,,,,,,0.0753018707036972,,,,,, +43,149749,,,,,,,,,,,,0.08043566346168518,,,,,, +43,149799,,,,,,,,,,,,0.0841447040438652,,,,,, +43,149849,,,,,,,,,,,,0.0658939927816391,,,,,, +43,149899,,,,,,,,,,,,0.0859970673918724,,,,,, +43,149949,,,,,,,,,,,,0.08220265805721283,,,,,, +43,149999,,,,,,,,,,,,0.07710222154855728,,,,,, +43,150049,,,,,,,,,,,,0.06376583874225616,,,,,, +43,150099,,,,,,,,,,,,0.07398470491170883,,,,,, +43,150149,,,,,,,,,,,,0.07780909538269043,,,,,, +43,150199,,,,,,,,,,,,0.07545417547225952,,,,,, +43,150249,,,,,,,,,,,,0.07938297837972641,,,,,, +43,150299,,,,,,,,,,,,0.07898479700088501,,,,,, +43,150349,,,,,,,,,,,,0.0736560970544815,,,,,, +43,150399,,,,,,,,,,,,0.07515867799520493,,,,,, +43,150449,,,,,,,,,,,,0.07493376731872559,,,,,, +43,150499,,,,,,,,,,,,0.07109765708446503,,,,,, +43,150549,,,,,,,,,,,,0.06630837917327881,,,,,, +43,150599,,,,,,,,,,,,0.07251790165901184,,,,,, +43,150649,,,,,,,,,,,,0.07174936681985855,,,,,, +43,150699,,,,,,,,,,,,0.07340428233146667,,,,,, +43,150749,,,,,,,,,,,,0.07867182046175003,,,,,, +43,150799,,,,,,,,,,,,0.0809735432267189,,,,,, +43,150849,,,,,,,,,,,,0.08018285036087036,,,,,, +43,150899,,,,,,,,,,,,0.07817752659320831,,,,,, +43,150949,,,,,,,,,,,,0.07088204473257065,,,,,, +43,150999,,,,,,,,,,,,0.07334280759096146,,,,,, +43,151049,,,,,,,,,,,,0.0733579695224762,,,,,, +43,151099,,,,,,,,,,,,0.0709007978439331,,,,,, +43,151149,,,,,,,,,,,,0.07101261615753174,,,,,, +43,151199,,,,,,,,,,,,0.06536036729812622,,,,,, +43,151249,,,,,,,,,,,,0.07388760149478912,,,,,, +43,151299,,,,,,,,,,,,0.07518085837364197,,,,,, +43,151349,,,,,,,,,,,,0.08096468448638916,,,,,, +43,151399,,,,,,,,,,,,0.07803371548652649,,,,,, +43,151447,,,,,,,,,,,,,0.23663508892059326,0.07657282799482346,0.29174646735191345,0.0785476565361023,0.2934286892414093,0.07657282799482346 +43,151447,,,,,,,0.23496751487255096,0.07592002302408218,0.2872442305088043,0.08215755224227905,0.2725517451763153,,,,,,, +44,151449,,,,,,,,,,,,0.06719597429037094,,,,,, +44,151499,,,,,,,,,,,,0.06561075150966644,,,,,, +44,151549,,,,,,,,,,,,0.07688111066818237,,,,,, +44,151599,,,,,,,,,,,,0.08127221465110779,,,,,, +44,151649,,,,,,,,,,,,0.07261940836906433,,,,,, +44,151699,,,,,,,,,,,,0.078338623046875,,,,,, +44,151749,,,,,,,,,,,,0.07890680432319641,,,,,, +44,151799,,,,,,,,,,,,0.07519211620092392,,,,,, +44,151849,,,,,,,,,,,,0.06645692884922028,,,,,, +44,151899,,,,,,,,,,,,0.07245081663131714,,,,,, +44,151949,,,,,,,,,,,,0.07658502459526062,,,,,, +44,151999,,,,,,,,,,,,0.08449311554431915,,,,,, +44,152049,,,,,,,,,,,,0.07410674542188644,,,,,, +44,152099,,,,,,,,,,,,0.07331523299217224,,,,,, +44,152149,,,,,,,,,,,,0.06430038064718246,,,,,, +44,152199,,,,,,,,,,,,0.06946475803852081,,,,,, +44,152249,,,,,,,,,,,,0.06188762187957764,,,,,, +44,152299,,,,,,,,,,,,0.07747666537761688,,,,,, +44,152349,,,,,,,,,,,,0.06858699023723602,,,,,, +44,152399,,,,,,,,,,,,0.08096224069595337,,,,,, +44,152449,,,,,,,,,,,,0.06075843796133995,,,,,, +44,152499,,,,,,,,,,,,0.08493788540363312,,,,,, +44,152549,,,,,,,,,,,,0.07902936637401581,,,,,, +44,152599,,,,,,,,,,,,0.07500942796468735,,,,,, +44,152649,,,,,,,,,,,,0.06629404425621033,,,,,, +44,152699,,,,,,,,,,,,0.0681251659989357,,,,,, +44,152749,,,,,,,,,,,,0.07428154349327087,,,,,, +44,152799,,,,,,,,,,,,0.06698772311210632,,,,,, +44,152849,,,,,,,,,,,,0.0758352130651474,,,,,, +44,152899,,,,,,,,,,,,0.08420230448246002,,,,,, +44,152949,,,,,,,,,,,,0.07946456223726273,,,,,, +44,152999,,,,,,,,,,,,0.06806860864162445,,,,,, +44,153049,,,,,,,,,,,,0.07603051513433456,,,,,, +44,153099,,,,,,,,,,,,0.06933745741844177,,,,,, +44,153149,,,,,,,,,,,,0.06878352165222168,,,,,, +44,153199,,,,,,,,,,,,0.06522535532712936,,,,,, +44,153249,,,,,,,,,,,,0.07199554145336151,,,,,, +44,153299,,,,,,,,,,,,0.06600810587406158,,,,,, +44,153349,,,,,,,,,,,,0.0798087865114212,,,,,, +44,153399,,,,,,,,,,,,0.07434263825416565,,,,,, +44,153449,,,,,,,,,,,,0.0721493512392044,,,,,, +44,153499,,,,,,,,,,,,0.06213729456067085,,,,,, +44,153549,,,,,,,,,,,,0.0707169771194458,,,,,, +44,153599,,,,,,,,,,,,0.07456544786691666,,,,,, +44,153649,,,,,,,,,,,,0.08058611303567886,,,,,, +44,153699,,,,,,,,,,,,0.07046271115541458,,,,,, +44,153749,,,,,,,,,,,,0.07581302523612976,,,,,, +44,153799,,,,,,,,,,,,0.07293254137039185,,,,,, +44,153849,,,,,,,,,,,,0.07315920293331146,,,,,, +44,153899,,,,,,,,,,,,0.07381919026374817,,,,,, +44,153949,,,,,,,,,,,,0.06475867331027985,,,,,, +44,153999,,,,,,,,,,,,0.0806325301527977,,,,,, +44,154049,,,,,,,,,,,,0.07792666554450989,,,,,, +44,154099,,,,,,,,,,,,0.07206926494836807,,,,,, +44,154149,,,,,,,,,,,,0.06566140055656433,,,,,, +44,154199,,,,,,,,,,,,0.0813026875257492,,,,,, +44,154249,,,,,,,,,,,,0.07736934721469879,,,,,, +44,154299,,,,,,,,,,,,0.06879621744155884,,,,,, +44,154349,,,,,,,,,,,,0.07651475071907043,,,,,, +44,154399,,,,,,,,,,,,0.07199221104383469,,,,,, +44,154449,,,,,,,,,,,,0.07789959758520126,,,,,, +44,154499,,,,,,,,,,,,0.07218606770038605,,,,,, +44,154549,,,,,,,,,,,,0.07061644643545151,,,,,, +44,154599,,,,,,,,,,,,0.08215019106864929,,,,,, +44,154649,,,,,,,,,,,,0.06990693509578705,,,,,, +44,154699,,,,,,,,,,,,0.07507282495498657,,,,,, +44,154749,,,,,,,,,,,,0.06679769605398178,,,,,, +44,154799,,,,,,,,,,,,0.07753659784793854,,,,,, +44,154849,,,,,,,,,,,,0.06733261048793793,,,,,, +44,154889,,,,,,,,,,,,,0.2356709986925125,0.07934844493865967,0.3137512505054474,0.045146822929382324,0.310817152261734,0.07934844493865967 +44,154889,,,,,,,0.2326681911945343,0.07453603297472,0.3145346939563751,0.09888732433319092,0.29585176706314087,,,,,,, +45,154899,,,,,,,,,,,,0.06864412128925323,,,,,, +45,154949,,,,,,,,,,,,0.07595312595367432,,,,,, +45,154999,,,,,,,,,,,,0.06563879549503326,,,,,, +45,155049,,,,,,,,,,,,0.07945071905851364,,,,,, +45,155099,,,,,,,,,,,,0.07484317570924759,,,,,, +45,155149,,,,,,,,,,,,0.08579744398593903,,,,,, +45,155199,,,,,,,,,,,,0.06918548047542572,,,,,, +45,155249,,,,,,,,,,,,0.06470172107219696,,,,,, +45,155299,,,,,,,,,,,,0.08101488649845123,,,,,, +45,155349,,,,,,,,,,,,0.06450338661670685,,,,,, +45,155399,,,,,,,,,,,,0.0696471631526947,,,,,, +45,155449,,,,,,,,,,,,0.07889733463525772,,,,,, +45,155499,,,,,,,,,,,,0.0726107731461525,,,,,, +45,155549,,,,,,,,,,,,0.06675766408443451,,,,,, +45,155599,,,,,,,,,,,,0.061386577785015106,,,,,, +45,155649,,,,,,,,,,,,0.06890007108449936,,,,,, +45,155699,,,,,,,,,,,,0.0815376341342926,,,,,, +45,155749,,,,,,,,,,,,0.06891685724258423,,,,,, +45,155799,,,,,,,,,,,,0.06702729314565659,,,,,, +45,155849,,,,,,,,,,,,0.07389882206916809,,,,,, +45,155899,,,,,,,,,,,,0.08222885429859161,,,,,, +45,155949,,,,,,,,,,,,0.08384796977043152,,,,,, +45,155999,,,,,,,,,,,,0.06396616995334625,,,,,, +45,156049,,,,,,,,,,,,0.07364046573638916,,,,,, +45,156099,,,,,,,,,,,,0.0716196820139885,,,,,, +45,156149,,,,,,,,,,,,0.09119852632284164,,,,,, +45,156199,,,,,,,,,,,,0.06815758347511292,,,,,, +45,156249,,,,,,,,,,,,0.0733230859041214,,,,,, +45,156299,,,,,,,,,,,,0.096368707716465,,,,,, +45,156349,,,,,,,,,,,,0.07735291123390198,,,,,, +45,156399,,,,,,,,,,,,0.07196921855211258,,,,,, +45,156449,,,,,,,,,,,,0.07228785753250122,,,,,, +45,156499,,,,,,,,,,,,0.06539730727672577,,,,,, +45,156549,,,,,,,,,,,,0.0770336240530014,,,,,, +45,156599,,,,,,,,,,,,0.07832958549261093,,,,,, +45,156649,,,,,,,,,,,,0.07631878554821014,,,,,, +45,156699,,,,,,,,,,,,0.07064210623502731,,,,,, +45,156749,,,,,,,,,,,,0.0644490122795105,,,,,, +45,156799,,,,,,,,,,,,0.08618269860744476,,,,,, +45,156849,,,,,,,,,,,,0.07128068804740906,,,,,, +45,156899,,,,,,,,,,,,0.07126377522945404,,,,,, +45,156949,,,,,,,,,,,,0.08449745178222656,,,,,, +45,156999,,,,,,,,,,,,0.07591288536787033,,,,,, +45,157049,,,,,,,,,,,,0.07902626693248749,,,,,, +45,157099,,,,,,,,,,,,0.07112815976142883,,,,,, +45,157149,,,,,,,,,,,,0.07469679415225983,,,,,, +45,157199,,,,,,,,,,,,0.08665986359119415,,,,,, +45,157249,,,,,,,,,,,,0.07560352981090546,,,,,, +45,157299,,,,,,,,,,,,0.07012341916561127,,,,,, +45,157349,,,,,,,,,,,,0.08573100715875626,,,,,, +45,157399,,,,,,,,,,,,0.062497466802597046,,,,,, +45,157449,,,,,,,,,,,,0.07343693822622299,,,,,, +45,157499,,,,,,,,,,,,0.07974826544523239,,,,,, +45,157549,,,,,,,,,,,,0.07873178273439407,,,,,, +45,157599,,,,,,,,,,,,0.07771974056959152,,,,,, +45,157649,,,,,,,,,,,,0.07361795008182526,,,,,, +45,157699,,,,,,,,,,,,0.07648826390504837,,,,,, +45,157749,,,,,,,,,,,,0.08068515360355377,,,,,, +45,157799,,,,,,,,,,,,0.07459572702646255,,,,,, +45,157849,,,,,,,,,,,,0.06989143043756485,,,,,, +45,157899,,,,,,,,,,,,0.08079870790243149,,,,,, +45,157949,,,,,,,,,,,,0.06996040046215057,,,,,, +45,157999,,,,,,,,,,,,0.07357507944107056,,,,,, +45,158049,,,,,,,,,,,,0.0722428411245346,,,,,, +45,158099,,,,,,,,,,,,0.08399280905723572,,,,,, +45,158149,,,,,,,,,,,,0.06919457763433456,,,,,, +45,158199,,,,,,,,,,,,0.07610772550106049,,,,,, +45,158249,,,,,,,,,,,,0.06636806577444077,,,,,, +45,158299,,,,,,,,,,,,0.06480474770069122,,,,,, +45,158331,,,,,,,,,,,,,0.2337169647216797,0.07692675292491913,0.3128417730331421,0.07428860664367676,0.30979034304618835,0.07692675292491913 +45,158331,,,,,,,0.23179544508457184,0.07408618927001953,0.3230553865432739,0.1043350100517273,0.3047492504119873,,,,,,, +46,158349,,,,,,,,,,,,0.07233233749866486,,,,,, +46,158399,,,,,,,,,,,,0.07089021801948547,,,,,, +46,158449,,,,,,,,,,,,0.07063622772693634,,,,,, +46,158499,,,,,,,,,,,,0.06621193885803223,,,,,, +46,158549,,,,,,,,,,,,0.0831366553902626,,,,,, +46,158599,,,,,,,,,,,,0.07218753546476364,,,,,, +46,158649,,,,,,,,,,,,0.08995549380779266,,,,,, +46,158699,,,,,,,,,,,,0.0882481187582016,,,,,, +46,158749,,,,,,,,,,,,0.07518929243087769,,,,,, +46,158799,,,,,,,,,,,,0.06639033555984497,,,,,, +46,158849,,,,,,,,,,,,0.07859684526920319,,,,,, +46,158899,,,,,,,,,,,,0.07862198352813721,,,,,, +46,158949,,,,,,,,,,,,0.08300800621509552,,,,,, +46,158999,,,,,,,,,,,,0.07248884439468384,,,,,, +46,159049,,,,,,,,,,,,0.06699923425912857,,,,,, +46,159099,,,,,,,,,,,,0.0698280930519104,,,,,, +46,159149,,,,,,,,,,,,0.07504934072494507,,,,,, +46,159199,,,,,,,,,,,,0.08407720923423767,,,,,, +46,159249,,,,,,,,,,,,0.07038083672523499,,,,,, +46,159299,,,,,,,,,,,,0.07339794933795929,,,,,, +46,159349,,,,,,,,,,,,0.07673472166061401,,,,,, +46,159399,,,,,,,,,,,,0.07570980489253998,,,,,, +46,159449,,,,,,,,,,,,0.07317451387643814,,,,,, +46,159499,,,,,,,,,,,,0.09055716544389725,,,,,, +46,159549,,,,,,,,,,,,0.0687708780169487,,,,,, +46,159599,,,,,,,,,,,,0.07667398452758789,,,,,, +46,159649,,,,,,,,,,,,0.07831096649169922,,,,,, +46,159699,,,,,,,,,,,,0.05656338483095169,,,,,, +46,159749,,,,,,,,,,,,0.08500771224498749,,,,,, +46,159799,,,,,,,,,,,,0.07839812338352203,,,,,, +46,159849,,,,,,,,,,,,0.08943136781454086,,,,,, +46,159899,,,,,,,,,,,,0.06890571117401123,,,,,, +46,159949,,,,,,,,,,,,0.06932412087917328,,,,,, +46,159999,,,,,,,,,,,,0.07207940518856049,,,,,, +46,160049,,,,,,,,,,,,0.08024145662784576,,,,,, +46,160099,,,,,,,,,,,,0.07699081301689148,,,,,, +46,160149,,,,,,,,,,,,0.06775707751512527,,,,,, +46,160199,,,,,,,,,,,,0.0745546966791153,,,,,, +46,160249,,,,,,,,,,,,0.085728719830513,,,,,, +46,160299,,,,,,,,,,,,0.06635929644107819,,,,,, +46,160349,,,,,,,,,,,,0.07708844542503357,,,,,, +46,160399,,,,,,,,,,,,0.06453125923871994,,,,,, +46,160449,,,,,,,,,,,,0.06925362348556519,,,,,, +46,160499,,,,,,,,,,,,0.08307190984487534,,,,,, +46,160549,,,,,,,,,,,,0.06261526048183441,,,,,, +46,160599,,,,,,,,,,,,0.0691361203789711,,,,,, +46,160649,,,,,,,,,,,,0.07490494847297668,,,,,, +46,160699,,,,,,,,,,,,0.07597711682319641,,,,,, +46,160749,,,,,,,,,,,,0.07075764238834381,,,,,, +46,160799,,,,,,,,,,,,0.07166646420955658,,,,,, +46,160849,,,,,,,,,,,,0.06773631274700165,,,,,, +46,160899,,,,,,,,,,,,0.0766250491142273,,,,,, +46,160949,,,,,,,,,,,,0.08008016645908356,,,,,, +46,160999,,,,,,,,,,,,0.08305931836366653,,,,,, +46,161049,,,,,,,,,,,,0.06657855957746506,,,,,, +46,161099,,,,,,,,,,,,0.07426787912845612,,,,,, +46,161149,,,,,,,,,,,,0.07309600710868835,,,,,, +46,161199,,,,,,,,,,,,0.07335293292999268,,,,,, +46,161249,,,,,,,,,,,,0.06180556118488312,,,,,, +46,161299,,,,,,,,,,,,0.08454158902168274,,,,,, +46,161349,,,,,,,,,,,,0.07489942759275436,,,,,, +46,161399,,,,,,,,,,,,0.06829695403575897,,,,,, +46,161449,,,,,,,,,,,,0.06723423302173615,,,,,, +46,161499,,,,,,,,,,,,0.08527027070522308,,,,,, +46,161549,,,,,,,,,,,,0.0769432932138443,,,,,, +46,161599,,,,,,,,,,,,0.07302805781364441,,,,,, +46,161649,,,,,,,,,,,,0.07471496611833572,,,,,, +46,161699,,,,,,,,,,,,0.059274934232234955,,,,,, +46,161749,,,,,,,,,,,,0.0744878426194191,,,,,, +46,161773,,,,,,,,,,,,,0.23356378078460693,0.07688779383897781,0.3039724826812744,0.07475745677947998,0.2977238893508911,0.07688779383897781 +46,161773,,,,,,,0.2318069189786911,0.07409793138504028,0.3228561282157898,0.10418939590454102,0.3045027256011963,,,,,,, +47,161799,,,,,,,,,,,,0.0680297389626503,,,,,, +47,161849,,,,,,,,,,,,0.0781148225069046,,,,,, +47,161899,,,,,,,,,,,,0.0852375477552414,,,,,, +47,161949,,,,,,,,,,,,0.07197725027799606,,,,,, +47,161999,,,,,,,,,,,,0.07375845313072205,,,,,, +47,162049,,,,,,,,,,,,0.07254008948802948,,,,,, +47,162099,,,,,,,,,,,,0.0726957619190216,,,,,, +47,162149,,,,,,,,,,,,0.07151956856250763,,,,,, +47,162199,,,,,,,,,,,,0.06869437545537949,,,,,, +47,162249,,,,,,,,,,,,0.07272511720657349,,,,,, +47,162299,,,,,,,,,,,,0.06925331056118011,,,,,, +47,162349,,,,,,,,,,,,0.08204536139965057,,,,,, +47,162399,,,,,,,,,,,,0.06796924769878387,,,,,, +47,162449,,,,,,,,,,,,0.06744001805782318,,,,,, +47,162499,,,,,,,,,,,,0.07295092940330505,,,,,, +47,162549,,,,,,,,,,,,0.06871040910482407,,,,,, +47,162599,,,,,,,,,,,,0.0817982479929924,,,,,, +47,162649,,,,,,,,,,,,0.06976976990699768,,,,,, +47,162699,,,,,,,,,,,,0.06971386075019836,,,,,, +47,162749,,,,,,,,,,,,0.07579714059829712,,,,,, +47,162799,,,,,,,,,,,,0.08270514011383057,,,,,, +47,162849,,,,,,,,,,,,0.07664027810096741,,,,,, +47,162899,,,,,,,,,,,,0.06761399656534195,,,,,, +47,162949,,,,,,,,,,,,0.07342115044593811,,,,,, +47,162999,,,,,,,,,,,,0.06458286195993423,,,,,, +47,163049,,,,,,,,,,,,0.07688697427511215,,,,,, +47,163099,,,,,,,,,,,,0.07629916071891785,,,,,, +47,163149,,,,,,,,,,,,0.06657637655735016,,,,,, +47,163199,,,,,,,,,,,,0.0744258463382721,,,,,, +47,163249,,,,,,,,,,,,0.09161406010389328,,,,,, +47,163299,,,,,,,,,,,,0.07375875115394592,,,,,, +47,163349,,,,,,,,,,,,0.061610154807567596,,,,,, +47,163399,,,,,,,,,,,,0.09777282178401947,,,,,, +47,163449,,,,,,,,,,,,0.07049663364887238,,,,,, +47,163499,,,,,,,,,,,,0.06822469830513,,,,,, +47,163549,,,,,,,,,,,,0.07324470579624176,,,,,, +47,163599,,,,,,,,,,,,0.07805295288562775,,,,,, +47,163649,,,,,,,,,,,,0.07582002133131027,,,,,, +47,163699,,,,,,,,,,,,0.07639269530773163,,,,,, +47,163749,,,,,,,,,,,,0.07293355464935303,,,,,, +47,163799,,,,,,,,,,,,0.08204980194568634,,,,,, +47,163849,,,,,,,,,,,,0.07406537234783173,,,,,, +47,163899,,,,,,,,,,,,0.07742482423782349,,,,,, +47,163949,,,,,,,,,,,,0.07670735567808151,,,,,, +47,163999,,,,,,,,,,,,0.07115229964256287,,,,,, +47,164049,,,,,,,,,,,,0.08194396644830704,,,,,, +47,164099,,,,,,,,,,,,0.08138824999332428,,,,,, +47,164149,,,,,,,,,,,,0.06755619496107101,,,,,, +47,164199,,,,,,,,,,,,0.081573486328125,,,,,, +47,164249,,,,,,,,,,,,0.07302608340978622,,,,,, +47,164299,,,,,,,,,,,,0.08097611367702484,,,,,, +47,164349,,,,,,,,,,,,0.06938507407903671,,,,,, +47,164399,,,,,,,,,,,,0.07033270597457886,,,,,, +47,164449,,,,,,,,,,,,0.07714004814624786,,,,,, +47,164499,,,,,,,,,,,,0.06578922271728516,,,,,, +47,164549,,,,,,,,,,,,0.07587766647338867,,,,,, +47,164599,,,,,,,,,,,,0.07344008982181549,,,,,, +47,164649,,,,,,,,,,,,0.06807422637939453,,,,,, +47,164699,,,,,,,,,,,,0.08123809099197388,,,,,, +47,164749,,,,,,,,,,,,0.08401493728160858,,,,,, +47,164799,,,,,,,,,,,,0.07307841628789902,,,,,, +47,164849,,,,,,,,,,,,0.07622786611318588,,,,,, +47,164899,,,,,,,,,,,,0.06913304328918457,,,,,, +47,164949,,,,,,,,,,,,0.07164084911346436,,,,,, +47,164999,,,,,,,,,,,,0.08029162883758545,,,,,, +47,165049,,,,,,,,,,,,0.07738558202981949,,,,,, +47,165099,,,,,,,,,,,,0.08538059145212173,,,,,, +47,165149,,,,,,,,,,,,0.07040103524923325,,,,,, +47,165199,,,,,,,,,,,,0.07463088631629944,,,,,, +47,165215,,,,,,,,,,,,,0.23283249139785767,0.07647950202226639,0.31449028849601746,0.0796707272529602,0.3076607286930084,0.07647950202226639 +47,165215,,,,,,,0.23102621734142303,0.07367720454931259,0.3306126892566681,0.10926830768585205,0.3117477595806122,,,,,,, +48,165249,,,,,,,,,,,,0.0670585036277771,,,,,, +48,165299,,,,,,,,,,,,0.07604861259460449,,,,,, +48,165349,,,,,,,,,,,,0.07285059988498688,,,,,, +48,165399,,,,,,,,,,,,0.06902575492858887,,,,,, +48,165449,,,,,,,,,,,,0.06828806549310684,,,,,, +48,165499,,,,,,,,,,,,0.07129712402820587,,,,,, +48,165549,,,,,,,,,,,,0.07975481450557709,,,,,, +48,165599,,,,,,,,,,,,0.06768307089805603,,,,,, +48,165649,,,,,,,,,,,,0.08202621340751648,,,,,, +48,165699,,,,,,,,,,,,0.07295194268226624,,,,,, +48,165749,,,,,,,,,,,,0.07577995210886002,,,,,, +48,165799,,,,,,,,,,,,0.06865116953849792,,,,,, +48,165849,,,,,,,,,,,,0.07286906987428665,,,,,, +48,165899,,,,,,,,,,,,0.0678449496626854,,,,,, +48,165949,,,,,,,,,,,,0.07977554202079773,,,,,, +48,165999,,,,,,,,,,,,0.07619114220142365,,,,,, +48,166049,,,,,,,,,,,,0.06191731616854668,,,,,, +48,166099,,,,,,,,,,,,0.07561372965574265,,,,,, +48,166149,,,,,,,,,,,,0.08078748732805252,,,,,, +48,166199,,,,,,,,,,,,0.061515726149082184,,,,,, +48,166249,,,,,,,,,,,,0.06695476174354553,,,,,, +48,166299,,,,,,,,,,,,0.0748380497097969,,,,,, +48,166349,,,,,,,,,,,,0.07590483129024506,,,,,, +48,166399,,,,,,,,,,,,0.06783890724182129,,,,,, +48,166449,,,,,,,,,,,,0.08149782568216324,,,,,, +48,166499,,,,,,,,,,,,0.07671554386615753,,,,,, +48,166549,,,,,,,,,,,,0.07448012381792068,,,,,, +48,166599,,,,,,,,,,,,0.0786341056227684,,,,,, +48,166649,,,,,,,,,,,,0.07804767787456512,,,,,, +48,166699,,,,,,,,,,,,0.07406492531299591,,,,,, +48,166749,,,,,,,,,,,,0.07027082145214081,,,,,, +48,166799,,,,,,,,,,,,0.07481874525547028,,,,,, +48,166849,,,,,,,,,,,,0.06955704838037491,,,,,, +48,166899,,,,,,,,,,,,0.06684687733650208,,,,,, +48,166949,,,,,,,,,,,,0.07869017124176025,,,,,, +48,166999,,,,,,,,,,,,0.07557205855846405,,,,,, +48,167049,,,,,,,,,,,,0.07659664750099182,,,,,, +48,167099,,,,,,,,,,,,0.07242931425571442,,,,,, +48,167149,,,,,,,,,,,,0.08299393951892853,,,,,, +48,167199,,,,,,,,,,,,0.0715695470571518,,,,,, +48,167249,,,,,,,,,,,,0.07018601894378662,,,,,, +48,167299,,,,,,,,,,,,0.07057442516088486,,,,,, +48,167349,,,,,,,,,,,,0.08474169671535492,,,,,, +48,167399,,,,,,,,,,,,0.0798882246017456,,,,,, +48,167449,,,,,,,,,,,,0.06665636599063873,,,,,, +48,167499,,,,,,,,,,,,0.07692073285579681,,,,,, +48,167549,,,,,,,,,,,,0.06961887329816818,,,,,, +48,167599,,,,,,,,,,,,0.0684303492307663,,,,,, +48,167649,,,,,,,,,,,,0.07096628844738007,,,,,, +48,167699,,,,,,,,,,,,0.07840950042009354,,,,,, +48,167749,,,,,,,,,,,,0.07468025386333466,,,,,, +48,167799,,,,,,,,,,,,0.08128205686807632,,,,,, +48,167849,,,,,,,,,,,,0.08004932105541229,,,,,, +48,167899,,,,,,,,,,,,0.08166755735874176,,,,,, +48,167949,,,,,,,,,,,,0.08167335391044617,,,,,, +48,167999,,,,,,,,,,,,0.08150440454483032,,,,,, +48,168049,,,,,,,,,,,,0.07868175208568573,,,,,, +48,168099,,,,,,,,,,,,0.06140296161174774,,,,,, +48,168149,,,,,,,,,,,,0.06944773346185684,,,,,, +48,168199,,,,,,,,,,,,0.07128627598285675,,,,,, +48,168249,,,,,,,,,,,,0.06803207099437714,,,,,, +48,168299,,,,,,,,,,,,0.06866560876369476,,,,,, +48,168349,,,,,,,,,,,,0.06921215355396271,,,,,, +48,168399,,,,,,,,,,,,0.0733400285243988,,,,,, +48,168449,,,,,,,,,,,,0.07618891447782516,,,,,, +48,168499,,,,,,,,,,,,0.07178474962711334,,,,,, +48,168549,,,,,,,,,,,,0.076483815908432,,,,,, +48,168599,,,,,,,,,,,,0.07487191259860992,,,,,, +48,168649,,,,,,,,,,,,0.08349853754043579,,,,,, +48,168657,,,,,,,,,,,,,0.23673123121261597,0.08127664774656296,0.32133904099464417,0.021943390369415283,0.31656840443611145,0.08127664774656296 +48,168657,,,,,,,0.23094995319843292,0.07367002218961716,0.330750435590744,0.10935741662979126,0.3111919164657593,,,,,,, +49,168699,,,,,,,,,,,,0.07508967816829681,,,,,, +49,168749,,,,,,,,,,,,0.07163213938474655,,,,,, +49,168799,,,,,,,,,,,,0.07935930788516998,,,,,, +49,168849,,,,,,,,,,,,0.06701132655143738,,,,,, +49,168899,,,,,,,,,,,,0.07567941397428513,,,,,, +49,168949,,,,,,,,,,,,0.0818091481924057,,,,,, +49,168999,,,,,,,,,,,,0.0899171233177185,,,,,, +49,169049,,,,,,,,,,,,0.07531028240919113,,,,,, +49,169099,,,,,,,,,,,,0.07739587128162384,,,,,, +49,169149,,,,,,,,,,,,0.07956310361623764,,,,,, +49,169199,,,,,,,,,,,,0.07342427223920822,,,,,, +49,169249,,,,,,,,,,,,0.07322951406240463,,,,,, +49,169299,,,,,,,,,,,,0.07236003875732422,,,,,, +49,169349,,,,,,,,,,,,0.07822363078594208,,,,,, +49,169399,,,,,,,,,,,,0.08660537004470825,,,,,, +49,169449,,,,,,,,,,,,0.0728001594543457,,,,,, +49,169499,,,,,,,,,,,,0.07446545362472534,,,,,, +49,169549,,,,,,,,,,,,0.06128517910838127,,,,,, +49,169599,,,,,,,,,,,,0.06993602216243744,,,,,, +49,169649,,,,,,,,,,,,0.07491616904735565,,,,,, +49,169699,,,,,,,,,,,,0.07980452477931976,,,,,, +49,169749,,,,,,,,,,,,0.07341094315052032,,,,,, +49,169799,,,,,,,,,,,,0.06818322837352753,,,,,, +49,169849,,,,,,,,,,,,0.07738092541694641,,,,,, +49,169899,,,,,,,,,,,,0.07079081237316132,,,,,, +49,169949,,,,,,,,,,,,0.07552678883075714,,,,,, +49,169999,,,,,,,,,,,,0.07439123094081879,,,,,, +49,170049,,,,,,,,,,,,0.07087987661361694,,,,,, +49,170099,,,,,,,,,,,,0.05080041661858559,,,,,, +49,170149,,,,,,,,,,,,0.07325787842273712,,,,,, +49,170199,,,,,,,,,,,,0.06764374673366547,,,,,, +49,170249,,,,,,,,,,,,0.06596997380256653,,,,,, +49,170299,,,,,,,,,,,,0.0862874984741211,,,,,, +49,170349,,,,,,,,,,,,0.07997441291809082,,,,,, +49,170399,,,,,,,,,,,,0.0822058916091919,,,,,, +49,170449,,,,,,,,,,,,0.06951871514320374,,,,,, +49,170499,,,,,,,,,,,,0.07410494983196259,,,,,, +49,170549,,,,,,,,,,,,0.08757483959197998,,,,,, +49,170599,,,,,,,,,,,,0.07252445816993713,,,,,, +49,170649,,,,,,,,,,,,0.06374125182628632,,,,,, +49,170699,,,,,,,,,,,,0.07188665866851807,,,,,, +49,170749,,,,,,,,,,,,0.0829273983836174,,,,,, +49,170799,,,,,,,,,,,,0.07819457352161407,,,,,, +49,170849,,,,,,,,,,,,0.08007371425628662,,,,,, +49,170899,,,,,,,,,,,,0.06019795686006546,,,,,, +49,170949,,,,,,,,,,,,0.07783916592597961,,,,,, +49,170999,,,,,,,,,,,,0.07987076789140701,,,,,, +49,171049,,,,,,,,,,,,0.07708479464054108,,,,,, +49,171099,,,,,,,,,,,,0.07293680310249329,,,,,, +49,171149,,,,,,,,,,,,0.06103329360485077,,,,,, +49,171199,,,,,,,,,,,,0.07538992166519165,,,,,, +49,171249,,,,,,,,,,,,0.07847213745117188,,,,,, +49,171299,,,,,,,,,,,,0.06928087770938873,,,,,, +49,171349,,,,,,,,,,,,0.07614113390445709,,,,,, +49,171399,,,,,,,,,,,,0.08167694509029388,,,,,, +49,171449,,,,,,,,,,,,0.08169287443161011,,,,,, +49,171499,,,,,,,,,,,,0.06716197729110718,,,,,, +49,171549,,,,,,,,,,,,0.0717250183224678,,,,,, +49,171599,,,,,,,,,,,,0.06880456209182739,,,,,, +49,171649,,,,,,,,,,,,0.08859153836965561,,,,,, +49,171699,,,,,,,,,,,,0.07317927479743958,,,,,, +49,171749,,,,,,,,,,,,0.08030205965042114,,,,,, +49,171799,,,,,,,,,,,,0.0876217782497406,,,,,, +49,171849,,,,,,,,,,,,0.09720046818256378,,,,,, +49,171899,,,,,,,,,,,,0.07460866868495941,,,,,, +49,171949,,,,,,,,,,,,0.0729634016752243,,,,,, +49,171999,,,,,,,,,,,,0.07661116123199463,,,,,, +49,172049,,,,,,,,,,,,0.07994506508111954,,,,,, +49,172099,,,,,,,,,,,,0.08839322626590729,,,,,, +49,172099,,,,,,,,,,,,,0.23568570613861084,0.0800076499581337,0.3196263313293457,0.03721410036087036,0.3161584436893463,0.0800076499581337 +49,172099,,,,,,,0.23055079579353333,0.07344046980142593,0.3349224030971527,0.11212974786758423,0.31561246514320374,,,,,,, +50,172100,0.23340749740600586,0.07512389868497849,0.3112040162086487,0.09660923480987549,0.3092760145664215,0.07512389868497849,,,,,,,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d24bfa15d8a0fc613d234591567270cdd7e6ffeb --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml @@ -0,0 +1,23 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: gifflar + num_layers: 8 + pooling: global_mean + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 43 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..770b280b3e250b4e1f7a28ee02412e4c9012fbfa --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv @@ -0,0 +1,363 @@ +epoch,step,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +0,49,,,,,,0.10656079649925232,,,,,, +0,99,,,,,,0.07918696105480194,,,,,, +0,149,,,,,,0.08966390043497086,,,,,, +0,199,,,,,,0.07442498952150345,,,,,, +0,249,,,,,,0.07633574306964874,,,,,, +0,299,,,,,,0.07766182720661163,,,,,, +0,349,,,,,,0.08864840120077133,,,,,, +0,399,,,,,,0.07429435104131699,,,,,, +0,449,,,,,,0.07457974553108215,,,,,, +0,499,,,,,,0.07449458539485931,,,,,, +0,549,,,,,,0.07824009656906128,,,,,, +0,599,,,,,,0.08364374935626984,,,,,, +0,649,,,,,,0.08571885526180267,,,,,, +0,699,,,,,,0.08272051066160202,,,,,, +0,749,,,,,,0.07687094062566757,,,,,, +0,799,,,,,,0.081873320043087,,,,,, +0,849,,,,,,0.07295450568199158,,,,,, +0,899,,,,,,0.07786170393228531,,,,,, +0,949,,,,,,0.0865931510925293,,,,,, +0,999,,,,,,0.09093126654624939,,,,,, +0,1049,,,,,,0.08143405616283417,,,,,, +0,1099,,,,,,0.07266318798065186,,,,,, +0,1149,,,,,,0.07660601288080215,,,,,, +0,1199,,,,,,0.07845278084278107,,,,,, +0,1249,,,,,,0.08556556701660156,,,,,, +0,1299,,,,,,0.07669660449028015,,,,,, +0,1349,,,,,,0.07551416754722595,,,,,, +0,1399,,,,,,0.08179377019405365,,,,,, +0,1449,,,,,,0.09523524343967438,,,,,, +0,1499,,,,,,0.07413659989833832,,,,,, +0,1549,,,,,,0.08415216207504272,,,,,, +0,1599,,,,,,0.08853858709335327,,,,,, +0,1649,,,,,,0.08164754509925842,,,,,, +0,1699,,,,,,0.0703892633318901,,,,,, +0,1749,,,,,,0.07498907297849655,,,,,, +0,1799,,,,,,0.08232085406780243,,,,,, +0,1849,,,,,,0.07005390524864197,,,,,, +0,1899,,,,,,0.08315552771091461,,,,,, +0,1949,,,,,,0.07780316472053528,,,,,, +0,1999,,,,,,0.0767495185136795,,,,,, +0,2049,,,,,,0.0772436112165451,,,,,, +0,2099,,,,,,0.09512246400117874,,,,,, +0,2149,,,,,,0.07678690552711487,,,,,, +0,2199,,,,,,0.08140146732330322,,,,,, +0,2249,,,,,,0.0786316990852356,,,,,, +0,2299,,,,,,0.06410501152276993,,,,,, +0,2349,,,,,,0.07274773716926575,,,,,, +0,2399,,,,,,0.0769033133983612,,,,,, +0,2449,,,,,,0.08622735738754272,,,,,, +0,2499,,,,,,0.07031718641519547,,,,,, +0,2549,,,,,,0.0773017555475235,,,,,, +0,2599,,,,,,0.0889986902475357,,,,,, +0,2649,,,,,,0.08157023787498474,,,,,, +0,2699,,,,,,0.062325671315193176,,,,,, +0,2749,,,,,,0.07246209681034088,,,,,, +0,2799,,,,,,0.06860002130270004,,,,,, +0,2849,,,,,,0.08600163459777832,,,,,, +0,2899,,,,,,0.08062432706356049,,,,,, +0,2949,,,,,,0.08483830839395523,,,,,, +0,2999,,,,,,0.08598488569259644,,,,,, +0,3049,,,,,,0.07641704380512238,,,,,, +0,3099,,,,,,0.07071031630039215,,,,,, +0,3149,,,,,,0.08164630085229874,,,,,, +0,3199,,,,,,0.09002281725406647,,,,,, +0,3249,,,,,,0.0748073160648346,,,,,, +0,3299,,,,,,0.0737869143486023,,,,,, +0,3349,,,,,,0.07013440132141113,,,,,, +0,3399,,,,,,0.0776873305439949,,,,,, +0,3443,,,,,,,0.2456742525100708,0.08233717083930969,0.22485043108463287,0.0039441585540771484,0.18449720740318298,0.08233717083930969 +0,3443,0.2410636842250824,0.08056072890758514,0.20890644192695618,0.03056091070175171,0.19511915743350983,,,,,,, +1,3449,,,,,,0.07631923258304596,,,,,, +1,3499,,,,,,0.08187772333621979,,,,,, +1,3549,,,,,,0.08352215588092804,,,,,, +1,3599,,,,,,0.08853448927402496,,,,,, +1,3649,,,,,,0.08801828324794769,,,,,, +1,3699,,,,,,0.07272728532552719,,,,,, +1,3749,,,,,,0.08294332027435303,,,,,, +1,3799,,,,,,0.06070024147629738,,,,,, +1,3849,,,,,,0.07757826149463654,,,,,, +1,3899,,,,,,0.06507556140422821,,,,,, +1,3949,,,,,,0.07228469848632812,,,,,, +1,3999,,,,,,0.07850684225559235,,,,,, +1,4049,,,,,,0.08163385093212128,,,,,, +1,4099,,,,,,0.08176657557487488,,,,,, +1,4149,,,,,,0.06951310485601425,,,,,, +1,4199,,,,,,0.07158327102661133,,,,,, +1,4249,,,,,,0.0670691579580307,,,,,, +1,4299,,,,,,0.07410520315170288,,,,,, +1,4349,,,,,,0.07273953408002853,,,,,, +1,4399,,,,,,0.06893819570541382,,,,,, +1,4449,,,,,,0.07835319638252258,,,,,, +1,4499,,,,,,0.06528303027153015,,,,,, +1,4549,,,,,,0.07360564172267914,,,,,, +1,4599,,,,,,0.08440127968788147,,,,,, +1,4649,,,,,,0.0843934714794159,,,,,, +1,4699,,,,,,0.07654622197151184,,,,,, +1,4749,,,,,,0.07130050659179688,,,,,, +1,4799,,,,,,0.07589997351169586,,,,,, +1,4849,,,,,,0.0636216327548027,,,,,, +1,4899,,,,,,0.07723759114742279,,,,,, +1,4949,,,,,,0.08599197864532471,,,,,, +1,4999,,,,,,0.06871181726455688,,,,,, +1,5049,,,,,,0.06988242268562317,,,,,, +1,5099,,,,,,0.08639556169509888,,,,,, +1,5149,,,,,,0.07334205508232117,,,,,, +1,5199,,,,,,0.08907254040241241,,,,,, +1,5249,,,,,,0.08946721255779266,,,,,, +1,5299,,,,,,0.07474857568740845,,,,,, +1,5349,,,,,,0.08014962822198868,,,,,, +1,5399,,,,,,0.08245387673377991,,,,,, +1,5449,,,,,,0.06554370373487473,,,,,, +1,5499,,,,,,0.07481525838375092,,,,,, +1,5549,,,,,,0.0717223584651947,,,,,, +1,5599,,,,,,0.0686953067779541,,,,,, +1,5649,,,,,,0.08287684619426727,,,,,, +1,5699,,,,,,0.06593187153339386,,,,,, +1,5749,,,,,,0.06699061393737793,,,,,, +1,5799,,,,,,0.07700007408857346,,,,,, +1,5849,,,,,,0.08678852021694183,,,,,, +1,5899,,,,,,0.07414783537387848,,,,,, +1,5949,,,,,,0.08144469559192657,,,,,, +1,5999,,,,,,0.07440276443958282,,,,,, +1,6049,,,,,,0.07489877939224243,,,,,, +1,6099,,,,,,0.07624939829111099,,,,,, +1,6149,,,,,,0.07860981673002243,,,,,, +1,6199,,,,,,0.07093720883131027,,,,,, +1,6249,,,,,,0.07354860007762909,,,,,, +1,6299,,,,,,0.08529588580131531,,,,,, +1,6349,,,,,,0.07022488117218018,,,,,, +1,6399,,,,,,0.07159630954265594,,,,,, +1,6449,,,,,,0.07962659001350403,,,,,, +1,6499,,,,,,0.0695074051618576,,,,,, +1,6549,,,,,,0.07825581729412079,,,,,, +1,6599,,,,,,0.07411238551139832,,,,,, +1,6649,,,,,,0.08437946438789368,,,,,, +1,6699,,,,,,0.09445519745349884,,,,,, +1,6749,,,,,,0.07940572500228882,,,,,, +1,6799,,,,,,0.08919894695281982,,,,,, +1,6849,,,,,,0.08615801483392715,,,,,, +1,6887,,,,,,,0.24061140418052673,0.07835353910923004,0.24070405960083008,0.05213528871536255,0.20887072384357452,0.07835353910923004 +1,6887,0.2352631390094757,0.07627121359109879,0.2871963083744049,0.08218210935592651,0.2616448998451233,,,,,,, +2,6899,,,,,,0.09289248287677765,,,,,, +2,6949,,,,,,0.08457498252391815,,,,,, +2,6999,,,,,,0.07362106442451477,,,,,, +2,7049,,,,,,0.07874385267496109,,,,,, +2,7099,,,,,,0.08067258447408676,,,,,, +2,7149,,,,,,0.08196800202131271,,,,,, +2,7199,,,,,,0.07467648386955261,,,,,, +2,7249,,,,,,0.0706029087305069,,,,,, +2,7299,,,,,,0.07856865227222443,,,,,, +2,7349,,,,,,0.07029222697019577,,,,,, +2,7399,,,,,,0.0671403557062149,,,,,, +2,7449,,,,,,0.07807356864213943,,,,,, +2,7499,,,,,,0.07610009610652924,,,,,, +2,7549,,,,,,0.08587376028299332,,,,,, +2,7599,,,,,,0.06580683588981628,,,,,, +2,7649,,,,,,0.07280650734901428,,,,,, +2,7699,,,,,,0.092304527759552,,,,,, +2,7749,,,,,,0.07743177562952042,,,,,, +2,7799,,,,,,0.07856686413288116,,,,,, +2,7849,,,,,,0.09018239378929138,,,,,, +2,7899,,,,,,0.08131956309080124,,,,,, +2,7949,,,,,,0.06957582384347916,,,,,, +2,7999,,,,,,0.07939356565475464,,,,,, +2,8049,,,,,,0.07305163145065308,,,,,, +2,8099,,,,,,0.08117131888866425,,,,,, +2,8149,,,,,,0.0880478024482727,,,,,, +2,8199,,,,,,0.07211296260356903,,,,,, +2,8249,,,,,,0.06625334918498993,,,,,, +2,8299,,,,,,0.06784126162528992,,,,,, +2,8349,,,,,,0.07466575503349304,,,,,, +2,8399,,,,,,0.08758433163166046,,,,,, +2,8449,,,,,,0.08056481182575226,,,,,, +2,8499,,,,,,0.07287176698446274,,,,,, +2,8549,,,,,,0.07334703952074051,,,,,, +2,8599,,,,,,0.08714000880718231,,,,,, +2,8649,,,,,,0.06838953495025635,,,,,, +2,8699,,,,,,0.06308933347463608,,,,,, +2,8749,,,,,,0.06680211424827576,,,,,, +2,8799,,,,,,0.0767384022474289,,,,,, +2,8849,,,,,,0.0835697203874588,,,,,, +2,8899,,,,,,0.08122383058071136,,,,,, +2,8949,,,,,,0.07053330540657043,,,,,, +2,8999,,,,,,0.08970731496810913,,,,,, +2,9049,,,,,,0.06075853109359741,,,,,, +2,9099,,,,,,0.07645271718502045,,,,,, +2,9149,,,,,,0.06955906748771667,,,,,, +2,9199,,,,,,0.0717124417424202,,,,,, +2,9249,,,,,,0.0756043791770935,,,,,, +2,9299,,,,,,0.08855174481868744,,,,,, +2,9349,,,,,,0.07900390028953552,,,,,, +2,9399,,,,,,0.07355573773384094,,,,,, +2,9449,,,,,,0.0690590888261795,,,,,, +2,9499,,,,,,0.08189916610717773,,,,,, +2,9549,,,,,,0.07723107933998108,,,,,, +2,9599,,,,,,0.06964696943759918,,,,,, +2,9649,,,,,,0.07515132427215576,,,,,, +2,9699,,,,,,0.06749631464481354,,,,,, +2,9749,,,,,,0.08484084904193878,,,,,, +2,9799,,,,,,0.06541192531585693,,,,,, +2,9849,,,,,,0.06817585229873657,,,,,, +2,9899,,,,,,0.06690585613250732,,,,,, +2,9949,,,,,,0.07019537687301636,,,,,, +2,9999,,,,,,0.07722094655036926,,,,,, +2,10049,,,,,,0.07427795231342316,,,,,, +2,10099,,,,,,0.07203590869903564,,,,,, +2,10149,,,,,,0.08472458273172379,,,,,, +2,10199,,,,,,0.06626901030540466,,,,,, +2,10249,,,,,,0.07949960231781006,,,,,, +2,10299,,,,,,0.08562508225440979,,,,,, +2,10331,,,,,,,0.24051472544670105,0.07856374233961105,0.23863624036312103,0.049592435359954834,0.20692798495292664,0.07856374233961105 +2,10331,0.23252561688423157,0.07481934875249863,0.31587928533554077,0.09964889287948608,0.29368624091148376,,,,,,, +3,10349,,,,,,0.0723121166229248,,,,,, +3,10399,,,,,,0.06059293448925018,,,,,, +3,10449,,,,,,0.07808917760848999,,,,,, +3,10499,,,,,,0.07768085598945618,,,,,, +3,10549,,,,,,0.06875552237033844,,,,,, +3,10599,,,,,,0.07291968911886215,,,,,, +3,10649,,,,,,0.0746455192565918,,,,,, +3,10699,,,,,,0.07682487368583679,,,,,, +3,10749,,,,,,0.08228978514671326,,,,,, +3,10799,,,,,,0.0724024698138237,,,,,, +3,10849,,,,,,0.0902097076177597,,,,,, +3,10899,,,,,,0.06970714032649994,,,,,, +3,10949,,,,,,0.06205516681075096,,,,,, +3,10999,,,,,,0.07645976543426514,,,,,, +3,11049,,,,,,0.07875944674015045,,,,,, +3,11099,,,,,,0.07402173429727554,,,,,, +3,11149,,,,,,0.07467228919267654,,,,,, +3,11199,,,,,,0.06890937685966492,,,,,, +3,11249,,,,,,0.07111221551895142,,,,,, +3,11299,,,,,,0.07773298025131226,,,,,, +3,11349,,,,,,0.07248535752296448,,,,,, +3,11399,,,,,,0.0681176409125328,,,,,, +3,11449,,,,,,0.07088799774646759,,,,,, +3,11499,,,,,,0.0631328672170639,,,,,, +3,11549,,,,,,0.06886464357376099,,,,,, +3,11599,,,,,,0.06542502343654633,,,,,, +3,11649,,,,,,0.07246817648410797,,,,,, +3,11699,,,,,,0.07620646059513092,,,,,, +3,11749,,,,,,0.08870097994804382,,,,,, +3,11799,,,,,,0.06293720752000809,,,,,, +3,11849,,,,,,0.07124696671962738,,,,,, +3,11899,,,,,,0.07943538576364517,,,,,, +3,11949,,,,,,0.08433704078197479,,,,,, +3,11999,,,,,,0.07122079282999039,,,,,, +3,12049,,,,,,0.07893196493387222,,,,,, +3,12099,,,,,,0.0763590931892395,,,,,, +3,12149,,,,,,0.07227720320224762,,,,,, +3,12199,,,,,,0.0920347273349762,,,,,, +3,12249,,,,,,0.06805865466594696,,,,,, +3,12299,,,,,,0.07826456427574158,,,,,, +3,12349,,,,,,0.06735249608755112,,,,,, +3,12399,,,,,,0.08468528836965561,,,,,, +3,12449,,,,,,0.07536984980106354,,,,,, +3,12499,,,,,,0.07693051546812057,,,,,, +3,12549,,,,,,0.061606600880622864,,,,,, +3,12599,,,,,,0.06891995668411255,,,,,, +3,12649,,,,,,0.07036829739809036,,,,,, +3,12699,,,,,,0.06602472066879272,,,,,, +3,12749,,,,,,0.07697874307632446,,,,,, +3,12799,,,,,,0.07384362071752548,,,,,, +3,12849,,,,,,0.06985872983932495,,,,,, +3,12899,,,,,,0.07797281444072723,,,,,, +3,12949,,,,,,0.07419535517692566,,,,,, +3,12999,,,,,,0.0706801638007164,,,,,, +3,13049,,,,,,0.07885511219501495,,,,,, +3,13099,,,,,,0.07461710274219513,,,,,, +3,13149,,,,,,0.08002157509326935,,,,,, +3,13199,,,,,,0.08975255489349365,,,,,, +3,13249,,,,,,0.07342082262039185,,,,,, +3,13299,,,,,,0.08562634885311127,,,,,, +3,13349,,,,,,0.06648945808410645,,,,,, +3,13399,,,,,,0.0634743794798851,,,,,, +3,13449,,,,,,0.06959952414035797,,,,,, +3,13499,,,,,,0.06909283250570297,,,,,, +3,13549,,,,,,0.07605836540460587,,,,,, +3,13599,,,,,,0.07680347561836243,,,,,, +3,13649,,,,,,0.07701259851455688,,,,,, +3,13699,,,,,,0.07804031670093536,,,,,, +3,13749,,,,,,0.09523892402648926,,,,,, +3,13775,,,,,,,0.2414623349905014,0.0786748081445694,0.25467851758003235,0.04824882745742798,0.22632458806037903,0.0786748081445694 +3,13775,0.2323174774646759,0.07490403950214386,0.3148198425769806,0.09862881898880005,0.2978551983833313,,,,,,, +4,13799,,,,,,0.07697530835866928,,,,,, +4,13849,,,,,,0.061388663947582245,,,,,, +4,13899,,,,,,0.07187998294830322,,,,,, +4,13949,,,,,,0.07586808502674103,,,,,, +4,13999,,,,,,0.07320225983858109,,,,,, +4,14049,,,,,,0.07391193509101868,,,,,, +4,14099,,,,,,0.07374320924282074,,,,,, +4,14149,,,,,,0.08046360313892365,,,,,, +4,14199,,,,,,0.07017038762569427,,,,,, +4,14249,,,,,,0.07316786795854568,,,,,, +4,14299,,,,,,0.06051567196846008,,,,,, +4,14349,,,,,,0.07896736264228821,,,,,, +4,14399,,,,,,0.07510853558778763,,,,,, +4,14449,,,,,,0.07477616518735886,,,,,, +4,14499,,,,,,0.07756783068180084,,,,,, +4,14549,,,,,,0.07443604618310928,,,,,, +4,14599,,,,,,0.07131792604923248,,,,,, +4,14649,,,,,,0.07213374972343445,,,,,, +4,14699,,,,,,0.06609256565570831,,,,,, +4,14749,,,,,,0.05895334854722023,,,,,, +4,14799,,,,,,0.07172144949436188,,,,,, +4,14849,,,,,,0.06542643904685974,,,,,, +4,14899,,,,,,0.07253806293010712,,,,,, +4,14949,,,,,,0.06866014748811722,,,,,, +4,14999,,,,,,0.08217564225196838,,,,,, +4,15049,,,,,,0.06875024735927582,,,,,, +4,15099,,,,,,0.07567882537841797,,,,,, +4,15149,,,,,,0.07093261182308197,,,,,, +4,15199,,,,,,0.08071384578943253,,,,,, +4,15249,,,,,,0.06424999237060547,,,,,, +4,15299,,,,,,0.08098693937063217,,,,,, +4,15349,,,,,,0.06740938127040863,,,,,, +4,15399,,,,,,0.08235746622085571,,,,,, +4,15449,,,,,,0.0722610354423523,,,,,, +4,15499,,,,,,0.07469803094863892,,,,,, +4,15549,,,,,,0.07183843851089478,,,,,, +4,15599,,,,,,0.07961256057024002,,,,,, +4,15649,,,,,,0.07923427224159241,,,,,, +4,15699,,,,,,0.08014814555644989,,,,,, +4,15749,,,,,,0.0787743628025055,,,,,, +4,15799,,,,,,0.07012179493904114,,,,,, +4,15849,,,,,,0.06174975633621216,,,,,, +4,15899,,,,,,0.07048046588897705,,,,,, +4,15949,,,,,,0.07423976063728333,,,,,, +4,15999,,,,,,0.06853259354829788,,,,,, +4,16049,,,,,,0.07636009156703949,,,,,, +4,16099,,,,,,0.06882372498512268,,,,,, +4,16149,,,,,,0.08080828189849854,,,,,, +4,16199,,,,,,0.07813739776611328,,,,,, +4,16249,,,,,,0.08923546969890594,,,,,, +4,16299,,,,,,0.10058459639549255,,,,,, +4,16349,,,,,,0.07926228642463684,,,,,, +4,16399,,,,,,0.07030227780342102,,,,,, +4,16449,,,,,,0.08763986825942993,,,,,, +4,16499,,,,,,0.08108682930469513,,,,,, +4,16549,,,,,,0.08116577565670013,,,,,, +4,16599,,,,,,0.07887473702430725,,,,,, +4,16649,,,,,,0.0839729756116867,,,,,, +4,16699,,,,,,0.08276726305484772,,,,,, +4,16749,,,,,,0.07098492234945297,,,,,, +4,16799,,,,,,0.08239051699638367,,,,,, +4,16849,,,,,,0.07515991479158401,,,,,, +4,16899,,,,,,0.08406107127666473,,,,,, +4,16949,,,,,,0.07616804540157318,,,,,, +4,16999,,,,,,0.07135720551013947,,,,,, +4,17049,,,,,,0.07615013420581818,,,,,, +4,17099,,,,,,0.07027272880077362,,,,,, +4,17149,,,,,,0.07434924691915512,,,,,, +4,17199,,,,,,0.0748327225446701,,,,,, +4,17219,,,,,,,0.24013297259807587,0.07821003347635269,0.24517416954040527,0.053871333599090576,0.2074778825044632,0.07821003347635269 +4,17219,0.23276373744010925,0.07544686645269394,0.30563122034072876,0.09208709001541138,0.29204174876213074,,,,,,, +5,17249,,,,,,0.08185383677482605,,,,,, +5,17299,,,,,,0.08249165117740631,,,,,, +5,17349,,,,,,0.08000750094652176,,,,,, +5,17399,,,,,,0.08624565601348877,,,,,, +5,17449,,,,,,0.06831403076648712,,,,,, +5,17499,,,,,,0.0855041891336441,,,,,, +5,17549,,,,,,0.07958317548036575,,,,,, +5,17599,,,,,,0.08523336797952652,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d24bfa15d8a0fc613d234591567270cdd7e6ffeb --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml @@ -0,0 +1,23 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: gifflar + num_layers: 8 + pooling: global_mean + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 43 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..74ca449715960e1a6708919f358b86f159113957 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv @@ -0,0 +1,37 @@ +epoch,step,train/loss +5,17249,0.07185162603855133 +5,17299,0.07237642258405685 +5,17349,0.07495835423469543 +5,17399,0.07536111027002335 +5,17449,0.07888965308666229 +5,17499,0.0800815224647522 +5,17549,0.08133960515260696 +5,17599,0.06726940721273422 +5,17649,0.07866805791854858 +5,17699,0.07481804490089417 +5,17749,0.08270683884620667 +5,17799,0.0855855643749237 +5,17849,0.07805442810058594 +5,17899,0.05894206091761589 +5,17949,0.07167454808950424 +5,17999,0.09532815963029861 +5,18049,0.06574904918670654 +5,18099,0.07858704030513763 +5,18149,0.08590363711118698 +5,18199,0.06211869418621063 +5,18249,0.0768509954214096 +5,18299,0.06422040611505508 +5,18349,0.07871697098016739 +5,18399,0.07828624546527863 +5,18449,0.07872753590345383 +5,18499,0.0775206983089447 +5,18549,0.06542109698057175 +5,18599,0.0756266713142395 +5,18649,0.07259243726730347 +5,18699,0.07505715638399124 +5,18749,0.08236841857433319 +5,18799,0.06736496090888977 +5,18849,0.07866888493299484 +5,18899,0.07853015512228012 +5,18949,0.07383895665407181 +5,18999,0.07533453404903412 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d24bfa15d8a0fc613d234591567270cdd7e6ffeb --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/hparams.yaml @@ -0,0 +1,23 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: gifflar + num_layers: 8 + pooling: global_mean + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 43 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..ba8ae1228df81f9f1cf56601f3188133b9a1a4d5 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/metrics.csv @@ -0,0 +1,3192 @@ +epoch,step,test/MeanAbsoluteError,test/MeanSquaredError,test/PearsonCorrCoef,test/R2Score,test/SpearmanCorrCoef,test/loss,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +5,17249,,,,,,,,,,,,0.07185175269842148,,,,,, +5,17299,,,,,,,,,,,,0.07235058397054672,,,,,, +5,17349,,,,,,,,,,,,0.075071319937706,,,,,, +5,17399,,,,,,,,,,,,0.07581736147403717,,,,,, +5,17449,,,,,,,,,,,,0.07757296413183212,,,,,, +5,17499,,,,,,,,,,,,0.08098070323467255,,,,,, +5,17549,,,,,,,,,,,,0.08160020411014557,,,,,, +5,17599,,,,,,,,,,,,0.06802331656217575,,,,,, +5,17649,,,,,,,,,,,,0.07542391866445541,,,,,, +5,17699,,,,,,,,,,,,0.07591591030359268,,,,,, +5,17749,,,,,,,,,,,,0.08160558342933655,,,,,, +5,17799,,,,,,,,,,,,0.08433423936367035,,,,,, +5,17849,,,,,,,,,,,,0.07714177668094635,,,,,, +5,17899,,,,,,,,,,,,0.06074104458093643,,,,,, +5,17949,,,,,,,,,,,,0.07079751789569855,,,,,, +5,17999,,,,,,,,,,,,0.1081617921590805,,,,,, +5,18049,,,,,,,,,,,,0.06572827696800232,,,,,, +5,18099,,,,,,,,,,,,0.07870170474052429,,,,,, +5,18149,,,,,,,,,,,,0.08020856231451035,,,,,, +5,18199,,,,,,,,,,,,0.06167719513177872,,,,,, +5,18249,,,,,,,,,,,,0.07990230619907379,,,,,, +5,18299,,,,,,,,,,,,0.061566539108753204,,,,,, +5,18349,,,,,,,,,,,,0.07757744938135147,,,,,, +5,18399,,,,,,,,,,,,0.07608084380626678,,,,,, +5,18449,,,,,,,,,,,,0.07602863758802414,,,,,, +5,18499,,,,,,,,,,,,0.07732217758893967,,,,,, +5,18549,,,,,,,,,,,,0.06322573125362396,,,,,, +5,18599,,,,,,,,,,,,0.07329761981964111,,,,,, +5,18649,,,,,,,,,,,,0.07206625491380692,,,,,, +5,18699,,,,,,,,,,,,0.07662280648946762,,,,,, +5,18749,,,,,,,,,,,,0.08121183514595032,,,,,, +5,18799,,,,,,,,,,,,0.06764714419841766,,,,,, +5,18849,,,,,,,,,,,,0.07613719999790192,,,,,, +5,18899,,,,,,,,,,,,0.08019047975540161,,,,,, +5,18949,,,,,,,,,,,,0.07450579106807709,,,,,, +5,18999,,,,,,,,,,,,0.07476001977920532,,,,,, +5,19049,,,,,,,,,,,,0.07857370376586914,,,,,, +5,19099,,,,,,,,,,,,0.07666727155447006,,,,,, +5,19149,,,,,,,,,,,,0.07109571993350983,,,,,, +5,19199,,,,,,,,,,,,0.07202497124671936,,,,,, +5,19249,,,,,,,,,,,,0.060739245265722275,,,,,, +5,19299,,,,,,,,,,,,0.08324580639600754,,,,,, +5,19349,,,,,,,,,,,,0.07649807631969452,,,,,, +5,19399,,,,,,,,,,,,0.07854136824607849,,,,,, +5,19449,,,,,,,,,,,,0.060380157083272934,,,,,, +5,19499,,,,,,,,,,,,0.07588598877191544,,,,,, +5,19549,,,,,,,,,,,,0.081001877784729,,,,,, +5,19599,,,,,,,,,,,,0.06746290624141693,,,,,, +5,19649,,,,,,,,,,,,0.0728507712483406,,,,,, +5,19699,,,,,,,,,,,,0.075677789747715,,,,,, +5,19749,,,,,,,,,,,,0.07898552715778351,,,,,, +5,19799,,,,,,,,,,,,0.0776059478521347,,,,,, +5,19849,,,,,,,,,,,,0.07997071743011475,,,,,, +5,19899,,,,,,,,,,,,0.07714705169200897,,,,,, +5,19949,,,,,,,,,,,,0.06930812448263168,,,,,, +5,19999,,,,,,,,,,,,0.07846587151288986,,,,,, +5,20049,,,,,,,,,,,,0.07476401329040527,,,,,, +5,20099,,,,,,,,,,,,0.07161670923233032,,,,,, +5,20149,,,,,,,,,,,,0.07339748740196228,,,,,, +5,20199,,,,,,,,,,,,0.08021973073482513,,,,,, +5,20249,,,,,,,,,,,,0.06911908090114594,,,,,, +5,20299,,,,,,,,,,,,0.06816361099481583,,,,,, +5,20349,,,,,,,,,,,,0.07329410314559937,,,,,, +5,20399,,,,,,,,,,,,0.07418303191661835,,,,,, +5,20449,,,,,,,,,,,,0.07267244160175323,,,,,, +5,20499,,,,,,,,,,,,0.07567518949508667,,,,,, +5,20549,,,,,,,,,,,,0.09158069640398026,,,,,, +5,20599,,,,,,,,,,,,0.0738595649600029,,,,,, +5,20649,,,,,,,,,,,,0.07006228715181351,,,,,, +5,20663,,,,,,,,,,,,,0.24033227562904358,0.07856200635433197,0.2523491382598877,0.049613356590270996,0.22153450548648834,0.07856200635433197 +5,20663,,,,,,,0.23230348527431488,0.07475296407938004,0.31743353605270386,0.10045331716537476,0.2986995279788971,,,,,,, +6,20699,,,,,,,,,,,,0.06674641370773315,,,,,, +6,20749,,,,,,,,,,,,0.07471363246440887,,,,,, +6,20799,,,,,,,,,,,,0.0773342177271843,,,,,, +6,20849,,,,,,,,,,,,0.08593980222940445,,,,,, +6,20899,,,,,,,,,,,,0.08499972522258759,,,,,, +6,20949,,,,,,,,,,,,0.08236255496740341,,,,,, +6,20999,,,,,,,,,,,,0.08704189956188202,,,,,, +6,21049,,,,,,,,,,,,0.0779520645737648,,,,,, +6,21099,,,,,,,,,,,,0.0798586830496788,,,,,, +6,21149,,,,,,,,,,,,0.07961393147706985,,,,,, +6,21199,,,,,,,,,,,,0.06918589770793915,,,,,, +6,21249,,,,,,,,,,,,0.06902827322483063,,,,,, +6,21299,,,,,,,,,,,,0.09133751690387726,,,,,, +6,21349,,,,,,,,,,,,0.06436251103878021,,,,,, +6,21399,,,,,,,,,,,,0.07002702355384827,,,,,, +6,21449,,,,,,,,,,,,0.07005622982978821,,,,,, +6,21499,,,,,,,,,,,,0.08120933175086975,,,,,, +6,21549,,,,,,,,,,,,0.08455301821231842,,,,,, +6,21599,,,,,,,,,,,,0.0751877874135971,,,,,, +6,21649,,,,,,,,,,,,0.08117103576660156,,,,,, +6,21699,,,,,,,,,,,,0.07272122800350189,,,,,, +6,21749,,,,,,,,,,,,0.08085417747497559,,,,,, +6,21799,,,,,,,,,,,,0.07418931275606155,,,,,, +6,21849,,,,,,,,,,,,0.07260803133249283,,,,,, +6,21899,,,,,,,,,,,,0.0762091800570488,,,,,, +6,21949,,,,,,,,,,,,0.06999439001083374,,,,,, +6,21999,,,,,,,,,,,,0.07389266788959503,,,,,, +6,22049,,,,,,,,,,,,0.08496204763650894,,,,,, +6,22099,,,,,,,,,,,,0.07748964428901672,,,,,, +6,22149,,,,,,,,,,,,0.09982215613126755,,,,,, +6,22199,,,,,,,,,,,,0.06925694644451141,,,,,, +6,22249,,,,,,,,,,,,0.07229262590408325,,,,,, +6,22299,,,,,,,,,,,,0.07466438412666321,,,,,, +6,22349,,,,,,,,,,,,0.07887110114097595,,,,,, +6,22399,,,,,,,,,,,,0.06974546611309052,,,,,, +6,22449,,,,,,,,,,,,0.08037284761667252,,,,,, +6,22499,,,,,,,,,,,,0.08064956963062286,,,,,, +6,22549,,,,,,,,,,,,0.07630683481693268,,,,,, +6,22599,,,,,,,,,,,,0.07254554331302643,,,,,, +6,22649,,,,,,,,,,,,0.07547931373119354,,,,,, +6,22699,,,,,,,,,,,,0.05794413760304451,,,,,, +6,22749,,,,,,,,,,,,0.0883268266916275,,,,,, +6,22799,,,,,,,,,,,,0.06782452762126923,,,,,, +6,22849,,,,,,,,,,,,0.07827241718769073,,,,,, +6,22899,,,,,,,,,,,,0.06246715784072876,,,,,, +6,22949,,,,,,,,,,,,0.0755155086517334,,,,,, +6,22999,,,,,,,,,,,,0.06994983553886414,,,,,, +6,23049,,,,,,,,,,,,0.07824521511793137,,,,,, +6,23099,,,,,,,,,,,,0.08382092416286469,,,,,, +6,23149,,,,,,,,,,,,0.06861667335033417,,,,,, +6,23199,,,,,,,,,,,,0.07934843003749847,,,,,, +6,23249,,,,,,,,,,,,0.07011023163795471,,,,,, +6,23299,,,,,,,,,,,,0.07741127163171768,,,,,, +6,23349,,,,,,,,,,,,0.06606496870517731,,,,,, +6,23399,,,,,,,,,,,,0.07415957748889923,,,,,, +6,23449,,,,,,,,,,,,0.07336670905351639,,,,,, +6,23499,,,,,,,,,,,,0.07974118739366531,,,,,, +6,23549,,,,,,,,,,,,0.09021344035863876,,,,,, +6,23599,,,,,,,,,,,,0.06472520530223846,,,,,, +6,23649,,,,,,,,,,,,0.08013565093278885,,,,,, +6,23699,,,,,,,,,,,,0.07145102322101593,,,,,, +6,23749,,,,,,,,,,,,0.06736306846141815,,,,,, +6,23799,,,,,,,,,,,,0.0752011239528656,,,,,, +6,23849,,,,,,,,,,,,0.0752967894077301,,,,,, +6,23899,,,,,,,,,,,,0.06947983056306839,,,,,, +6,23949,,,,,,,,,,,,0.07115130126476288,,,,,, +6,23999,,,,,,,,,,,,0.07123537361621857,,,,,, +6,24049,,,,,,,,,,,,0.06693902611732483,,,,,, +6,24099,,,,,,,,,,,,0.07351034879684448,,,,,, +6,24107,,,,,,,,,,,,,0.23892582952976227,0.07757901400327682,0.2534140944480896,0.06150496006011963,0.2242019772529602,0.07757901400327682 +6,24107,,,,,,,0.23466940224170685,0.07618942856788635,0.2905595302581787,0.08316123485565186,0.2750145196914673,,,,,,, +7,24149,,,,,,,,,,,,0.0763784795999527,,,,,, +7,24199,,,,,,,,,,,,0.08130976557731628,,,,,, +7,24249,,,,,,,,,,,,0.07314485311508179,,,,,, +7,24299,,,,,,,,,,,,0.07489383220672607,,,,,, +7,24349,,,,,,,,,,,,0.07997922599315643,,,,,, +7,24399,,,,,,,,,,,,0.07518498599529266,,,,,, +7,24449,,,,,,,,,,,,0.0807109847664833,,,,,, +7,24499,,,,,,,,,,,,0.08452735096216202,,,,,, +7,24549,,,,,,,,,,,,0.07327099144458771,,,,,, +7,24599,,,,,,,,,,,,0.062301889061927795,,,,,, +7,24649,,,,,,,,,,,,0.074544258415699,,,,,, +7,24699,,,,,,,,,,,,0.07163849472999573,,,,,, +7,24749,,,,,,,,,,,,0.06717148423194885,,,,,, +7,24799,,,,,,,,,,,,0.08264294266700745,,,,,, +7,24849,,,,,,,,,,,,0.09003008902072906,,,,,, +7,24899,,,,,,,,,,,,0.08503221720457077,,,,,, +7,24949,,,,,,,,,,,,0.07682313770055771,,,,,, +7,24999,,,,,,,,,,,,0.07970371842384338,,,,,, +7,25049,,,,,,,,,,,,0.07744349539279938,,,,,, +7,25099,,,,,,,,,,,,0.08128310739994049,,,,,, +7,25149,,,,,,,,,,,,0.07721538841724396,,,,,, +7,25199,,,,,,,,,,,,0.07508544623851776,,,,,, +7,25249,,,,,,,,,,,,0.08645135164260864,,,,,, +7,25299,,,,,,,,,,,,0.0965443104505539,,,,,, +7,25349,,,,,,,,,,,,0.0879070982336998,,,,,, +7,25399,,,,,,,,,,,,0.07644305378198624,,,,,, +7,25449,,,,,,,,,,,,0.06096935272216797,,,,,, +7,25499,,,,,,,,,,,,0.06825478374958038,,,,,, +7,25549,,,,,,,,,,,,0.07532777637243271,,,,,, +7,25599,,,,,,,,,,,,0.07450195401906967,,,,,, +7,25649,,,,,,,,,,,,0.0705101266503334,,,,,, +7,25699,,,,,,,,,,,,0.08196304738521576,,,,,, +7,25749,,,,,,,,,,,,0.08342123031616211,,,,,, +7,25799,,,,,,,,,,,,0.07758834958076477,,,,,, +7,25849,,,,,,,,,,,,0.08041873574256897,,,,,, +7,25899,,,,,,,,,,,,0.08055078238248825,,,,,, +7,25949,,,,,,,,,,,,0.0730149894952774,,,,,, +7,25999,,,,,,,,,,,,0.07192577421665192,,,,,, +7,26049,,,,,,,,,,,,0.07485198974609375,,,,,, +7,26099,,,,,,,,,,,,0.06634365022182465,,,,,, +7,26149,,,,,,,,,,,,0.07816433906555176,,,,,, +7,26199,,,,,,,,,,,,0.07720286399126053,,,,,, +7,26249,,,,,,,,,,,,0.07629210501909256,,,,,, +7,26299,,,,,,,,,,,,0.08837629854679108,,,,,, +7,26349,,,,,,,,,,,,0.0748845636844635,,,,,, +7,26399,,,,,,,,,,,,0.068553626537323,,,,,, +7,26449,,,,,,,,,,,,0.0760796070098877,,,,,, +7,26499,,,,,,,,,,,,0.08027920126914978,,,,,, +7,26549,,,,,,,,,,,,0.0727730244398117,,,,,, +7,26599,,,,,,,,,,,,0.07609491795301437,,,,,, +7,26649,,,,,,,,,,,,0.07979141175746918,,,,,, +7,26699,,,,,,,,,,,,0.07196357846260071,,,,,, +7,26749,,,,,,,,,,,,0.06338731944561005,,,,,, +7,26799,,,,,,,,,,,,0.06308154761791229,,,,,, +7,26849,,,,,,,,,,,,0.07119456678628922,,,,,, +7,26899,,,,,,,,,,,,0.08323077857494354,,,,,, +7,26949,,,,,,,,,,,,0.0858905166387558,,,,,, +7,26999,,,,,,,,,,,,0.07770220190286636,,,,,, +7,27049,,,,,,,,,,,,0.07722996175289154,,,,,, +7,27099,,,,,,,,,,,,0.0758858323097229,,,,,, +7,27149,,,,,,,,,,,,0.05835098773241043,,,,,, +7,27199,,,,,,,,,,,,0.061938103288412094,,,,,, +7,27249,,,,,,,,,,,,0.07192543148994446,,,,,, +7,27299,,,,,,,,,,,,0.07615183293819427,,,,,, +7,27349,,,,,,,,,,,,0.06916189193725586,,,,,, +7,27399,,,,,,,,,,,,0.07540316879749298,,,,,, +7,27449,,,,,,,,,,,,0.07689365744590759,,,,,, +7,27499,,,,,,,,,,,,0.06687900424003601,,,,,, +7,27549,,,,,,,,,,,,0.06908422708511353,,,,,, +7,27551,,,,,,,,,,,,,0.23977364599704742,0.07756947726011276,0.2569290101528168,0.06162029504776001,0.2255539447069168,0.07756947726011276 +7,27551,,,,,,,0.23425525426864624,0.07647459954023361,0.2872743606567383,0.07972288131713867,0.2801281809806824,,,,,,, +8,27599,,,,,,,,,,,,0.07438043504953384,,,,,, +8,27649,,,,,,,,,,,,0.08423656225204468,,,,,, +8,27699,,,,,,,,,,,,0.061864081770181656,,,,,, +8,27749,,,,,,,,,,,,0.07876493781805038,,,,,, +8,27799,,,,,,,,,,,,0.08906199038028717,,,,,, +8,27849,,,,,,,,,,,,0.0759623646736145,,,,,, +8,27899,,,,,,,,,,,,0.08649979531764984,,,,,, +8,27949,,,,,,,,,,,,0.056056827306747437,,,,,, +8,27999,,,,,,,,,,,,0.07160384953022003,,,,,, +8,28049,,,,,,,,,,,,0.06272970139980316,,,,,, +8,28099,,,,,,,,,,,,0.0703304335474968,,,,,, +8,28149,,,,,,,,,,,,0.07135319709777832,,,,,, +8,28199,,,,,,,,,,,,0.07504086941480637,,,,,, +8,28249,,,,,,,,,,,,0.07706774771213531,,,,,, +8,28299,,,,,,,,,,,,0.06753085553646088,,,,,, +8,28349,,,,,,,,,,,,0.07056856155395508,,,,,, +8,28399,,,,,,,,,,,,0.07784857600927353,,,,,, +8,28449,,,,,,,,,,,,0.07057958841323853,,,,,, +8,28499,,,,,,,,,,,,0.07355370372533798,,,,,, +8,28549,,,,,,,,,,,,0.06435205042362213,,,,,, +8,28599,,,,,,,,,,,,0.076434426009655,,,,,, +8,28649,,,,,,,,,,,,0.06705065816640854,,,,,, +8,28699,,,,,,,,,,,,0.07046899944543839,,,,,, +8,28749,,,,,,,,,,,,0.08917991816997528,,,,,, +8,28799,,,,,,,,,,,,0.06852036714553833,,,,,, +8,28849,,,,,,,,,,,,0.08296208828687668,,,,,, +8,28899,,,,,,,,,,,,0.08645361661911011,,,,,, +8,28949,,,,,,,,,,,,0.07230100780725479,,,,,, +8,28999,,,,,,,,,,,,0.0751427561044693,,,,,, +8,29049,,,,,,,,,,,,0.07934528589248657,,,,,, +8,29099,,,,,,,,,,,,0.08674485236406326,,,,,, +8,29149,,,,,,,,,,,,0.09131348133087158,,,,,, +8,29199,,,,,,,,,,,,0.08850450813770294,,,,,, +8,29249,,,,,,,,,,,,0.09268888831138611,,,,,, +8,29299,,,,,,,,,,,,0.06637237221002579,,,,,, +8,29349,,,,,,,,,,,,0.07784394919872284,,,,,, +8,29399,,,,,,,,,,,,0.08236508071422577,,,,,, +8,29449,,,,,,,,,,,,0.07461556792259216,,,,,, +8,29499,,,,,,,,,,,,0.07499366253614426,,,,,, +8,29549,,,,,,,,,,,,0.10305860638618469,,,,,, +8,29599,,,,,,,,,,,,0.06947563588619232,,,,,, +8,29649,,,,,,,,,,,,0.0838024765253067,,,,,, +8,29699,,,,,,,,,,,,0.07419030368328094,,,,,, +8,29749,,,,,,,,,,,,0.07299414277076721,,,,,, +8,29799,,,,,,,,,,,,0.07394148409366608,,,,,, +8,29849,,,,,,,,,,,,0.0813692957162857,,,,,, +8,29899,,,,,,,,,,,,0.06739666312932968,,,,,, +8,29949,,,,,,,,,,,,0.08249472826719284,,,,,, +8,29999,,,,,,,,,,,,0.07521668821573257,,,,,, +8,30049,,,,,,,,,,,,0.07052098214626312,,,,,, +8,30099,,,,,,,,,,,,0.08040428161621094,,,,,, +8,30149,,,,,,,,,,,,0.09795267879962921,,,,,, +8,30199,,,,,,,,,,,,0.08371923863887787,,,,,, +8,30249,,,,,,,,,,,,0.07338482141494751,,,,,, +8,30299,,,,,,,,,,,,0.07863077521324158,,,,,, +8,30349,,,,,,,,,,,,0.07907362282276154,,,,,, +8,30399,,,,,,,,,,,,0.07004410773515701,,,,,, +8,30449,,,,,,,,,,,,0.07779712975025177,,,,,, +8,30499,,,,,,,,,,,,0.07567626237869263,,,,,, +8,30549,,,,,,,,,,,,0.06582783907651901,,,,,, +8,30599,,,,,,,,,,,,0.09063424170017242,,,,,, +8,30649,,,,,,,,,,,,0.0712321400642395,,,,,, +8,30699,,,,,,,,,,,,0.07593332231044769,,,,,, +8,30749,,,,,,,,,,,,0.0705932229757309,,,,,, +8,30799,,,,,,,,,,,,0.08165152370929718,,,,,, +8,30849,,,,,,,,,,,,0.06516529619693756,,,,,, +8,30899,,,,,,,,,,,,0.06474259495735168,,,,,, +8,30949,,,,,,,,,,,,0.07456047087907791,,,,,, +8,30995,,,,,,,,,,,,,0.2374424934387207,0.07754991948604584,0.256502240896225,0.06185692548751831,0.22669121623039246,0.07754991948604584 +8,30995,,,,,,,0.23642177879810333,0.07715466618537903,0.2710076868534088,0.0715475082397461,0.25729015469551086,,,,,,, +9,30999,,,,,,,,,,,,0.07629464566707611,,,,,, +9,31049,,,,,,,,,,,,0.07941818237304688,,,,,, +9,31099,,,,,,,,,,,,0.06608163565397263,,,,,, +9,31149,,,,,,,,,,,,0.05929580330848694,,,,,, +9,31199,,,,,,,,,,,,0.0774354487657547,,,,,, +9,31249,,,,,,,,,,,,0.07280890643596649,,,,,, +9,31299,,,,,,,,,,,,0.07172645628452301,,,,,, +9,31349,,,,,,,,,,,,0.07010476291179657,,,,,, +9,31399,,,,,,,,,,,,0.0785694569349289,,,,,, +9,31449,,,,,,,,,,,,0.06772014498710632,,,,,, +9,31499,,,,,,,,,,,,0.07070823758840561,,,,,, +9,31549,,,,,,,,,,,,0.09075842797756195,,,,,, +9,31599,,,,,,,,,,,,0.07382640987634659,,,,,, +9,31649,,,,,,,,,,,,0.06789389252662659,,,,,, +9,31699,,,,,,,,,,,,0.06343122571706772,,,,,, +9,31749,,,,,,,,,,,,0.069844089448452,,,,,, +9,31799,,,,,,,,,,,,0.0709574818611145,,,,,, +9,31849,,,,,,,,,,,,0.07053978741168976,,,,,, +9,31899,,,,,,,,,,,,0.08096960186958313,,,,,, +9,31949,,,,,,,,,,,,0.07324135303497314,,,,,, +9,31999,,,,,,,,,,,,0.06407804787158966,,,,,, +9,32049,,,,,,,,,,,,0.07923541218042374,,,,,, +9,32099,,,,,,,,,,,,0.08010590821504593,,,,,, +9,32149,,,,,,,,,,,,0.07577496767044067,,,,,, +9,32199,,,,,,,,,,,,0.06992728263139725,,,,,, +9,32249,,,,,,,,,,,,0.07053877413272858,,,,,, +9,32299,,,,,,,,,,,,0.06718849390745163,,,,,, +9,32349,,,,,,,,,,,,0.07237812131643295,,,,,, +9,32399,,,,,,,,,,,,0.07696831971406937,,,,,, +9,32449,,,,,,,,,,,,0.08196277916431427,,,,,, +9,32499,,,,,,,,,,,,0.07431471347808838,,,,,, +9,32549,,,,,,,,,,,,0.09427954256534576,,,,,, +9,32599,,,,,,,,,,,,0.07509637624025345,,,,,, +9,32649,,,,,,,,,,,,0.07555936276912689,,,,,, +9,32699,,,,,,,,,,,,0.06891179084777832,,,,,, +9,32749,,,,,,,,,,,,0.08022969961166382,,,,,, +9,32799,,,,,,,,,,,,0.07360851019620895,,,,,, +9,32849,,,,,,,,,,,,0.07078449428081512,,,,,, +9,32899,,,,,,,,,,,,0.080630362033844,,,,,, +9,32949,,,,,,,,,,,,0.06593400239944458,,,,,, +9,32999,,,,,,,,,,,,0.08283077925443649,,,,,, +9,33049,,,,,,,,,,,,0.07160338014364243,,,,,, +9,33099,,,,,,,,,,,,0.06426511704921722,,,,,, +9,33149,,,,,,,,,,,,0.07554996758699417,,,,,, +9,33199,,,,,,,,,,,,0.07848834991455078,,,,,, +9,33249,,,,,,,,,,,,0.06830582767724991,,,,,, +9,33299,,,,,,,,,,,,0.07357984781265259,,,,,, +9,33349,,,,,,,,,,,,0.08080210536718369,,,,,, +9,33399,,,,,,,,,,,,0.09505746513605118,,,,,, +9,33449,,,,,,,,,,,,0.07254830002784729,,,,,, +9,33499,,,,,,,,,,,,0.0706835389137268,,,,,, +9,33549,,,,,,,,,,,,0.07100322842597961,,,,,, +9,33599,,,,,,,,,,,,0.07260174304246902,,,,,, +9,33649,,,,,,,,,,,,0.07347656786441803,,,,,, +9,33699,,,,,,,,,,,,0.08328269422054291,,,,,, +9,33749,,,,,,,,,,,,0.07016287744045258,,,,,, +9,33799,,,,,,,,,,,,0.08258457481861115,,,,,, +9,33849,,,,,,,,,,,,0.0761730745434761,,,,,, +9,33899,,,,,,,,,,,,0.06846629083156586,,,,,, +9,33949,,,,,,,,,,,,0.06514222919940948,,,,,, +9,33999,,,,,,,,,,,,0.06388868391513824,,,,,, +9,34049,,,,,,,,,,,,0.0670929104089737,,,,,, +9,34099,,,,,,,,,,,,0.07319606840610504,,,,,, +9,34149,,,,,,,,,,,,0.06749371439218521,,,,,, +9,34199,,,,,,,,,,,,0.06998708844184875,,,,,, +9,34249,,,,,,,,,,,,0.08236823976039886,,,,,, +9,34299,,,,,,,,,,,,0.08005087822675705,,,,,, +9,34349,,,,,,,,,,,,0.07179779559373856,,,,,, +9,34399,,,,,,,,,,,,0.08250033855438232,,,,,, +9,34439,,,,,,,,,,,,,0.24086801707744598,0.0791778564453125,0.232794851064682,0.042163312435150146,0.19133128225803375,0.0791778564453125 +9,34439,,,,,,,0.23169176280498505,0.07447265088558197,0.3227558135986328,0.10381871461868286,0.30456671118736267,,,,,,, +10,34449,,,,,,,,,,,,0.07336395978927612,,,,,, +10,34499,,,,,,,,,,,,0.07559481263160706,,,,,, +10,34549,,,,,,,,,,,,0.06545630097389221,,,,,, +10,34599,,,,,,,,,,,,0.0645456314086914,,,,,, +10,34649,,,,,,,,,,,,0.07469905912876129,,,,,, +10,34699,,,,,,,,,,,,0.06866925954818726,,,,,, +10,34749,,,,,,,,,,,,0.08064612001180649,,,,,, +10,34799,,,,,,,,,,,,0.0765996053814888,,,,,, +10,34849,,,,,,,,,,,,0.08087709546089172,,,,,, +10,34899,,,,,,,,,,,,0.06856521964073181,,,,,, +10,34949,,,,,,,,,,,,0.07325518131256104,,,,,, +10,34999,,,,,,,,,,,,0.06788201630115509,,,,,, +10,35049,,,,,,,,,,,,0.086067795753479,,,,,, +10,35099,,,,,,,,,,,,0.08250311017036438,,,,,, +10,35149,,,,,,,,,,,,0.06617408990859985,,,,,, +10,35199,,,,,,,,,,,,0.06815940141677856,,,,,, +10,35249,,,,,,,,,,,,0.0870717465877533,,,,,, +10,35299,,,,,,,,,,,,0.07505393028259277,,,,,, +10,35349,,,,,,,,,,,,0.07831866294145584,,,,,, +10,35399,,,,,,,,,,,,0.08484924584627151,,,,,, +10,35449,,,,,,,,,,,,0.07462235540151596,,,,,, +10,35499,,,,,,,,,,,,0.07645255327224731,,,,,, +10,35549,,,,,,,,,,,,0.08862912654876709,,,,,, +10,35599,,,,,,,,,,,,0.0704319179058075,,,,,, +10,35649,,,,,,,,,,,,0.07393518090248108,,,,,, +10,35699,,,,,,,,,,,,0.06658688187599182,,,,,, +10,35749,,,,,,,,,,,,0.06998641788959503,,,,,, +10,35799,,,,,,,,,,,,0.06622468680143356,,,,,, +10,35849,,,,,,,,,,,,0.0826377123594284,,,,,, +10,35899,,,,,,,,,,,,0.07298290729522705,,,,,, +10,35949,,,,,,,,,,,,0.07397711277008057,,,,,, +10,35999,,,,,,,,,,,,0.06902388483285904,,,,,, +10,36049,,,,,,,,,,,,0.08359700441360474,,,,,, +10,36099,,,,,,,,,,,,0.07648263871669769,,,,,, +10,36149,,,,,,,,,,,,0.07315272092819214,,,,,, +10,36199,,,,,,,,,,,,0.08961126208305359,,,,,, +10,36249,,,,,,,,,,,,0.08586902916431427,,,,,, +10,36299,,,,,,,,,,,,0.07217031717300415,,,,,, +10,36349,,,,,,,,,,,,0.07655514776706696,,,,,, +10,36399,,,,,,,,,,,,0.07127982378005981,,,,,, +10,36449,,,,,,,,,,,,0.08229292929172516,,,,,, +10,36499,,,,,,,,,,,,0.0937451422214508,,,,,, +10,36549,,,,,,,,,,,,0.07016482949256897,,,,,, +10,36599,,,,,,,,,,,,0.07271851599216461,,,,,, +10,36649,,,,,,,,,,,,0.06640540808439255,,,,,, +10,36699,,,,,,,,,,,,0.08015558123588562,,,,,, +10,36749,,,,,,,,,,,,0.09154899418354034,,,,,, +10,36799,,,,,,,,,,,,0.07853114604949951,,,,,, +10,36849,,,,,,,,,,,,0.06469976902008057,,,,,, +10,36899,,,,,,,,,,,,0.07973778247833252,,,,,, +10,36949,,,,,,,,,,,,0.08671323955059052,,,,,, +10,36999,,,,,,,,,,,,0.06455136090517044,,,,,, +10,37049,,,,,,,,,,,,0.07383513450622559,,,,,, +10,37099,,,,,,,,,,,,0.07427854835987091,,,,,, +10,37149,,,,,,,,,,,,0.06341741979122162,,,,,, +10,37199,,,,,,,,,,,,0.08443006128072739,,,,,, +10,37249,,,,,,,,,,,,0.06799984723329544,,,,,, +10,37299,,,,,,,,,,,,0.06086675450205803,,,,,, +10,37349,,,,,,,,,,,,0.06610153615474701,,,,,, +10,37399,,,,,,,,,,,,0.0725904256105423,,,,,, +10,37449,,,,,,,,,,,,0.07040134817361832,,,,,, +10,37499,,,,,,,,,,,,0.08619020879268646,,,,,, +10,37549,,,,,,,,,,,,0.07924683392047882,,,,,, +10,37599,,,,,,,,,,,,0.07878222316503525,,,,,, +10,37649,,,,,,,,,,,,0.07143815606832504,,,,,, +10,37699,,,,,,,,,,,,0.07539966702461243,,,,,, +10,37749,,,,,,,,,,,,0.08758300542831421,,,,,, +10,37799,,,,,,,,,,,,0.06345483660697937,,,,,, +10,37849,,,,,,,,,,,,0.07707227021455765,,,,,, +10,37883,,,,,,,,,,,,,0.24033094942569733,0.07862638682126999,0.2300969809293747,0.04883456230163574,0.19997620582580566,0.07862638682126999 +10,37883,,,,,,,0.23378096520900726,0.07567369192838669,0.3006972670555115,0.08935868740081787,0.2834224998950958,,,,,,, +11,37899,,,,,,,,,,,,0.07256823778152466,,,,,, +11,37949,,,,,,,,,,,,0.07349593937397003,,,,,, +11,37999,,,,,,,,,,,,0.07152750343084335,,,,,, +11,38049,,,,,,,,,,,,0.06462185829877853,,,,,, +11,38099,,,,,,,,,,,,0.06734961271286011,,,,,, +11,38149,,,,,,,,,,,,0.06752088665962219,,,,,, +11,38199,,,,,,,,,,,,0.07479198276996613,,,,,, +11,38249,,,,,,,,,,,,0.09133470058441162,,,,,, +11,38299,,,,,,,,,,,,0.06312499940395355,,,,,, +11,38349,,,,,,,,,,,,0.07768218219280243,,,,,, +11,38399,,,,,,,,,,,,0.07284237444400787,,,,,, +11,38449,,,,,,,,,,,,0.07296536862850189,,,,,, +11,38499,,,,,,,,,,,,0.07791134715080261,,,,,, +11,38549,,,,,,,,,,,,0.06717199832201004,,,,,, +11,38599,,,,,,,,,,,,0.06862413883209229,,,,,, +11,38649,,,,,,,,,,,,0.07399161905050278,,,,,, +11,38699,,,,,,,,,,,,0.06997878849506378,,,,,, +11,38749,,,,,,,,,,,,0.07318022102117538,,,,,, +11,38799,,,,,,,,,,,,0.0691150650382042,,,,,, +11,38849,,,,,,,,,,,,0.0710822343826294,,,,,, +11,38899,,,,,,,,,,,,0.07422678172588348,,,,,, +11,38949,,,,,,,,,,,,0.07203441113233566,,,,,, +11,38999,,,,,,,,,,,,0.06693793833255768,,,,,, +11,39049,,,,,,,,,,,,0.07210682332515717,,,,,, +11,39099,,,,,,,,,,,,0.07893717288970947,,,,,, +11,39149,,,,,,,,,,,,0.07385984808206558,,,,,, +11,39199,,,,,,,,,,,,0.07850553095340729,,,,,, +11,39249,,,,,,,,,,,,0.07961195707321167,,,,,, +11,39299,,,,,,,,,,,,0.08727329969406128,,,,,, +11,39349,,,,,,,,,,,,0.08747733384370804,,,,,, +11,39399,,,,,,,,,,,,0.0838395208120346,,,,,, +11,39449,,,,,,,,,,,,0.08115555346012115,,,,,, +11,39499,,,,,,,,,,,,0.08522743731737137,,,,,, +11,39549,,,,,,,,,,,,0.08296222984790802,,,,,, +11,39599,,,,,,,,,,,,0.08381855487823486,,,,,, +11,39649,,,,,,,,,,,,0.07512634992599487,,,,,, +11,39699,,,,,,,,,,,,0.08348524570465088,,,,,, +11,39749,,,,,,,,,,,,0.06805621832609177,,,,,, +11,39799,,,,,,,,,,,,0.07244148850440979,,,,,, +11,39849,,,,,,,,,,,,0.069279745221138,,,,,, +11,39899,,,,,,,,,,,,0.07656417787075043,,,,,, +11,39949,,,,,,,,,,,,0.07961896806955338,,,,,, +11,39999,,,,,,,,,,,,0.07896234095096588,,,,,, +11,40049,,,,,,,,,,,,0.08461801707744598,,,,,, +11,40099,,,,,,,,,,,,0.08058004826307297,,,,,, +11,40149,,,,,,,,,,,,0.0724884495139122,,,,,, +11,40199,,,,,,,,,,,,0.07192628085613251,,,,,, +11,40249,,,,,,,,,,,,0.06931330263614655,,,,,, +11,40299,,,,,,,,,,,,0.0690004974603653,,,,,, +11,40349,,,,,,,,,,,,0.08506907522678375,,,,,, +11,40399,,,,,,,,,,,,0.06012272462248802,,,,,, +11,40449,,,,,,,,,,,,0.06244887411594391,,,,,, +11,40499,,,,,,,,,,,,0.0773477852344513,,,,,, +11,40549,,,,,,,,,,,,0.06745953112840652,,,,,, +11,40599,,,,,,,,,,,,0.08168543875217438,,,,,, +11,40649,,,,,,,,,,,,0.06971972435712814,,,,,, +11,40699,,,,,,,,,,,,0.07645945250988007,,,,,, +11,40749,,,,,,,,,,,,0.08605382591485977,,,,,, +11,40799,,,,,,,,,,,,0.0764433965086937,,,,,, +11,40849,,,,,,,,,,,,0.08300387859344482,,,,,, +11,40899,,,,,,,,,,,,0.0715159922838211,,,,,, +11,40949,,,,,,,,,,,,0.0716051310300827,,,,,, +11,40999,,,,,,,,,,,,0.08440148830413818,,,,,, +11,41049,,,,,,,,,,,,0.07240966707468033,,,,,, +11,41099,,,,,,,,,,,,0.07218298316001892,,,,,, +11,41149,,,,,,,,,,,,0.07305923849344254,,,,,, +11,41199,,,,,,,,,,,,0.08428175747394562,,,,,, +11,41249,,,,,,,,,,,,0.06998001039028168,,,,,, +11,41299,,,,,,,,,,,,0.07641954720020294,,,,,, +11,41327,,,,,,,,,,,,,0.2386910766363144,0.07721465080976486,0.25966987013816833,0.06591272354125977,0.2261759638786316,0.07721465080976486 +11,41327,,,,,,,0.23375263810157776,0.07614748924970627,0.2933114469051361,0.08366632461547852,0.2845902740955353,,,,,,, +12,41349,,,,,,,,,,,,0.059702642261981964,,,,,, +12,41399,,,,,,,,,,,,0.08416596055030823,,,,,, +12,41449,,,,,,,,,,,,0.07985424995422363,,,,,, +12,41499,,,,,,,,,,,,0.07083119451999664,,,,,, +12,41549,,,,,,,,,,,,0.06109336391091347,,,,,, +12,41599,,,,,,,,,,,,0.06433220952749252,,,,,, +12,41649,,,,,,,,,,,,0.06757223606109619,,,,,, +12,41699,,,,,,,,,,,,0.0766495019197464,,,,,, +12,41749,,,,,,,,,,,,0.07025475800037384,,,,,, +12,41799,,,,,,,,,,,,0.08421915769577026,,,,,, +12,41849,,,,,,,,,,,,0.08262468874454498,,,,,, +12,41899,,,,,,,,,,,,0.08059689402580261,,,,,, +12,41949,,,,,,,,,,,,0.08013860881328583,,,,,, +12,41999,,,,,,,,,,,,0.07553672045469284,,,,,, +12,42049,,,,,,,,,,,,0.07153365015983582,,,,,, +12,42099,,,,,,,,,,,,0.07863855361938477,,,,,, +12,42149,,,,,,,,,,,,0.07191997021436691,,,,,, +12,42199,,,,,,,,,,,,0.08268199115991592,,,,,, +12,42249,,,,,,,,,,,,0.07795831561088562,,,,,, +12,42299,,,,,,,,,,,,0.053236670792102814,,,,,, +12,42349,,,,,,,,,,,,0.06105080991983414,,,,,, +12,42399,,,,,,,,,,,,0.06191286817193031,,,,,, +12,42449,,,,,,,,,,,,0.06491698324680328,,,,,, +12,42499,,,,,,,,,,,,0.08006763458251953,,,,,, +12,42549,,,,,,,,,,,,0.07631555199623108,,,,,, +12,42599,,,,,,,,,,,,0.06738534569740295,,,,,, +12,42649,,,,,,,,,,,,0.07420806586742401,,,,,, +12,42699,,,,,,,,,,,,0.0827995017170906,,,,,, +12,42749,,,,,,,,,,,,0.06540422886610031,,,,,, +12,42799,,,,,,,,,,,,0.05745038762688637,,,,,, +12,42849,,,,,,,,,,,,0.06569816172122955,,,,,, +12,42899,,,,,,,,,,,,0.07978042960166931,,,,,, +12,42949,,,,,,,,,,,,0.07071785628795624,,,,,, +12,42999,,,,,,,,,,,,0.06845647096633911,,,,,, +12,43049,,,,,,,,,,,,0.07098163664340973,,,,,, +12,43099,,,,,,,,,,,,0.0665561705827713,,,,,, +12,43149,,,,,,,,,,,,0.07463972270488739,,,,,, +12,43199,,,,,,,,,,,,0.07944139838218689,,,,,, +12,43249,,,,,,,,,,,,0.0770627036690712,,,,,, +12,43299,,,,,,,,,,,,0.06311101466417313,,,,,, +12,43349,,,,,,,,,,,,0.06578689813613892,,,,,, +12,43399,,,,,,,,,,,,0.07119529694318771,,,,,, +12,43449,,,,,,,,,,,,0.07625238597393036,,,,,, +12,43499,,,,,,,,,,,,0.07459167391061783,,,,,, +12,43549,,,,,,,,,,,,0.07473362982273102,,,,,, +12,43599,,,,,,,,,,,,0.07617825269699097,,,,,, +12,43649,,,,,,,,,,,,0.06626445055007935,,,,,, +12,43699,,,,,,,,,,,,0.08510518074035645,,,,,, +12,43749,,,,,,,,,,,,0.0653209388256073,,,,,, +12,43799,,,,,,,,,,,,0.08124899119138718,,,,,, +12,43849,,,,,,,,,,,,0.06804174929857254,,,,,, +12,43899,,,,,,,,,,,,0.06877683103084564,,,,,, +12,43949,,,,,,,,,,,,0.0638507679104805,,,,,, +12,43999,,,,,,,,,,,,0.06982241570949554,,,,,, +12,44049,,,,,,,,,,,,0.05652043968439102,,,,,, +12,44099,,,,,,,,,,,,0.08065898716449738,,,,,, +12,44149,,,,,,,,,,,,0.08108368515968323,,,,,, +12,44199,,,,,,,,,,,,0.06124866008758545,,,,,, +12,44249,,,,,,,,,,,,0.07993428409099579,,,,,, +12,44299,,,,,,,,,,,,0.0803527683019638,,,,,, +12,44349,,,,,,,,,,,,0.0775856077671051,,,,,, +12,44399,,,,,,,,,,,,0.0749213770031929,,,,,, +12,44449,,,,,,,,,,,,0.06346401572227478,,,,,, +12,44499,,,,,,,,,,,,0.07383608818054199,,,,,, +12,44549,,,,,,,,,,,,0.07229182124137878,,,,,, +12,44599,,,,,,,,,,,,0.08838683366775513,,,,,, +12,44649,,,,,,,,,,,,0.07016207277774811,,,,,, +12,44699,,,,,,,,,,,,0.07975785434246063,,,,,, +12,44749,,,,,,,,,,,,0.07842350751161575,,,,,, +12,44771,,,,,,,,,,,,,0.24201242625713348,0.07890987396240234,0.24553897976875305,0.04540514945983887,0.22718524932861328,0.07890987396240234 +12,44771,,,,,,,0.23177558183670044,0.07456723600625992,0.3214833736419678,0.10267698764801025,0.3071456253528595,,,,,,, +13,44799,,,,,,,,,,,,0.08306222409009933,,,,,, +13,44849,,,,,,,,,,,,0.07478368282318115,,,,,, +13,44899,,,,,,,,,,,,0.06570178270339966,,,,,, +13,44949,,,,,,,,,,,,0.06195816025137901,,,,,, +13,44999,,,,,,,,,,,,0.07258838415145874,,,,,, +13,45049,,,,,,,,,,,,0.094089575111866,,,,,, +13,45099,,,,,,,,,,,,0.08105617761611938,,,,,, +13,45149,,,,,,,,,,,,0.08660586178302765,,,,,, +13,45199,,,,,,,,,,,,0.07346431910991669,,,,,, +13,45249,,,,,,,,,,,,0.0686625987291336,,,,,, +13,45299,,,,,,,,,,,,0.06761573255062103,,,,,, +13,45349,,,,,,,,,,,,0.08779267221689224,,,,,, +13,45399,,,,,,,,,,,,0.07399037480354309,,,,,, +13,45449,,,,,,,,,,,,0.07985172420740128,,,,,, +13,45499,,,,,,,,,,,,0.0913584977388382,,,,,, +13,45549,,,,,,,,,,,,0.08422119915485382,,,,,, +13,45599,,,,,,,,,,,,0.08033683151006699,,,,,, +13,45649,,,,,,,,,,,,0.07712937891483307,,,,,, +13,45699,,,,,,,,,,,,0.06915602087974548,,,,,, +13,45749,,,,,,,,,,,,0.07917826622724533,,,,,, +13,45799,,,,,,,,,,,,0.08091317862272263,,,,,, +13,45849,,,,,,,,,,,,0.07203579694032669,,,,,, +13,45899,,,,,,,,,,,,0.0733465626835823,,,,,, +13,45949,,,,,,,,,,,,0.06888634711503983,,,,,, +13,45999,,,,,,,,,,,,0.07366596162319183,,,,,, +13,46049,,,,,,,,,,,,0.05759231746196747,,,,,, +13,46099,,,,,,,,,,,,0.07095558941364288,,,,,, +13,46149,,,,,,,,,,,,0.07263831794261932,,,,,, +13,46199,,,,,,,,,,,,0.07586240768432617,,,,,, +13,46249,,,,,,,,,,,,0.07311621308326721,,,,,, +13,46299,,,,,,,,,,,,0.07958406955003738,,,,,, +13,46349,,,,,,,,,,,,0.0755392387509346,,,,,, +13,46399,,,,,,,,,,,,0.07331809401512146,,,,,, +13,46449,,,,,,,,,,,,0.07857698202133179,,,,,, +13,46499,,,,,,,,,,,,0.07439428567886353,,,,,, +13,46549,,,,,,,,,,,,0.07942430675029755,,,,,, +13,46599,,,,,,,,,,,,0.07340213656425476,,,,,, +13,46649,,,,,,,,,,,,0.07473350316286087,,,,,, +13,46699,,,,,,,,,,,,0.06513994932174683,,,,,, +13,46749,,,,,,,,,,,,0.07568611204624176,,,,,, +13,46799,,,,,,,,,,,,0.07075348496437073,,,,,, +13,46849,,,,,,,,,,,,0.07416080683469772,,,,,, +13,46899,,,,,,,,,,,,0.08230151236057281,,,,,, +13,46949,,,,,,,,,,,,0.0645284354686737,,,,,, +13,46999,,,,,,,,,,,,0.07382968068122864,,,,,, +13,47049,,,,,,,,,,,,0.08119206130504608,,,,,, +13,47099,,,,,,,,,,,,0.06437323987483978,,,,,, +13,47149,,,,,,,,,,,,0.07317878305912018,,,,,, +13,47199,,,,,,,,,,,,0.07277405261993408,,,,,, +13,47249,,,,,,,,,,,,0.08749033510684967,,,,,, +13,47299,,,,,,,,,,,,0.0742301195859909,,,,,, +13,47349,,,,,,,,,,,,0.07621324062347412,,,,,, +13,47399,,,,,,,,,,,,0.0765969455242157,,,,,, +13,47449,,,,,,,,,,,,0.08228202164173126,,,,,, +13,47499,,,,,,,,,,,,0.09702702611684799,,,,,, +13,47549,,,,,,,,,,,,0.08556637167930603,,,,,, +13,47599,,,,,,,,,,,,0.08402720093727112,,,,,, +13,47649,,,,,,,,,,,,0.09166450053453445,,,,,, +13,47699,,,,,,,,,,,,0.08413559198379517,,,,,, +13,47749,,,,,,,,,,,,0.06176203116774559,,,,,, +13,47799,,,,,,,,,,,,0.07423219084739685,,,,,, +13,47849,,,,,,,,,,,,0.06760101020336151,,,,,, +13,47899,,,,,,,,,,,,0.07483786344528198,,,,,, +13,47949,,,,,,,,,,,,0.07409264892339706,,,,,, +13,47999,,,,,,,,,,,,0.07787767052650452,,,,,, +13,48049,,,,,,,,,,,,0.07006107270717621,,,,,, +13,48099,,,,,,,,,,,,0.059432290494441986,,,,,, +13,48149,,,,,,,,,,,,0.07789886742830276,,,,,, +13,48199,,,,,,,,,,,,0.07995141297578812,,,,,, +13,48215,,,,,,,,,,,,,0.2434040606021881,0.0802273377776146,0.2575762867927551,0.029467463493347168,0.2280104160308838,0.0802273377776146 +13,48215,,,,,,,0.23493297398090363,0.07661035656929016,0.28466135263442993,0.07810103893280029,0.27524611353874207,,,,,,, +14,48249,,,,,,,,,,,,0.07562717795372009,,,,,, +14,48299,,,,,,,,,,,,0.07014954090118408,,,,,, +14,48349,,,,,,,,,,,,0.07165239751338959,,,,,, +14,48399,,,,,,,,,,,,0.07766330987215042,,,,,, +14,48449,,,,,,,,,,,,0.06648619472980499,,,,,, +14,48499,,,,,,,,,,,,0.08239544928073883,,,,,, +14,48549,,,,,,,,,,,,0.0729907900094986,,,,,, +14,48599,,,,,,,,,,,,0.06916418671607971,,,,,, +14,48649,,,,,,,,,,,,0.08176416903734207,,,,,, +14,48699,,,,,,,,,,,,0.0802401453256607,,,,,, +14,48749,,,,,,,,,,,,0.06692428886890411,,,,,, +14,48799,,,,,,,,,,,,0.06012634560465813,,,,,, +14,48849,,,,,,,,,,,,0.07084678113460541,,,,,, +14,48899,,,,,,,,,,,,0.0804336741566658,,,,,, +14,48949,,,,,,,,,,,,0.07504859566688538,,,,,, +14,48999,,,,,,,,,,,,0.0739227756857872,,,,,, +14,49049,,,,,,,,,,,,0.0860886350274086,,,,,, +14,49099,,,,,,,,,,,,0.08243878930807114,,,,,, +14,49149,,,,,,,,,,,,0.0699988454580307,,,,,, +14,49199,,,,,,,,,,,,0.07161961495876312,,,,,, +14,49249,,,,,,,,,,,,0.07335872948169708,,,,,, +14,49299,,,,,,,,,,,,0.06858708709478378,,,,,, +14,49349,,,,,,,,,,,,0.07117576897144318,,,,,, +14,49399,,,,,,,,,,,,0.07881826162338257,,,,,, +14,49449,,,,,,,,,,,,0.07789286971092224,,,,,, +14,49499,,,,,,,,,,,,0.08166702091693878,,,,,, +14,49549,,,,,,,,,,,,0.07455724477767944,,,,,, +14,49599,,,,,,,,,,,,0.08286648988723755,,,,,, +14,49649,,,,,,,,,,,,0.0777420699596405,,,,,, +14,49699,,,,,,,,,,,,0.08049017190933228,,,,,, +14,49749,,,,,,,,,,,,0.07258664071559906,,,,,, +14,49799,,,,,,,,,,,,0.07570725679397583,,,,,, +14,49849,,,,,,,,,,,,0.0775241106748581,,,,,, +14,49899,,,,,,,,,,,,0.08186551928520203,,,,,, +14,49949,,,,,,,,,,,,0.08739424496889114,,,,,, +14,49999,,,,,,,,,,,,0.07362613081932068,,,,,, +14,50049,,,,,,,,,,,,0.057332202792167664,,,,,, +14,50099,,,,,,,,,,,,0.06875582039356232,,,,,, +14,50149,,,,,,,,,,,,0.07404731959104538,,,,,, +14,50199,,,,,,,,,,,,0.06702454388141632,,,,,, +14,50249,,,,,,,,,,,,0.07213156670331955,,,,,, +14,50299,,,,,,,,,,,,0.08183237910270691,,,,,, +14,50349,,,,,,,,,,,,0.07152467221021652,,,,,, +14,50399,,,,,,,,,,,,0.06944067776203156,,,,,, +14,50449,,,,,,,,,,,,0.08023899793624878,,,,,, +14,50499,,,,,,,,,,,,0.06640107929706573,,,,,, +14,50549,,,,,,,,,,,,0.058317311108112335,,,,,, +14,50599,,,,,,,,,,,,0.06513583660125732,,,,,, +14,50649,,,,,,,,,,,,0.07168736308813095,,,,,, +14,50699,,,,,,,,,,,,0.068955197930336,,,,,, +14,50749,,,,,,,,,,,,0.06881672888994217,,,,,, +14,50799,,,,,,,,,,,,0.0749245285987854,,,,,, +14,50849,,,,,,,,,,,,0.07658638060092926,,,,,, +14,50899,,,,,,,,,,,,0.06601683795452118,,,,,, +14,50949,,,,,,,,,,,,0.0828041210770607,,,,,, +14,50999,,,,,,,,,,,,0.08897699415683746,,,,,, +14,51049,,,,,,,,,,,,0.07774138450622559,,,,,, +14,51099,,,,,,,,,,,,0.07215632498264313,,,,,, +14,51149,,,,,,,,,,,,0.07232484221458435,,,,,, +14,51199,,,,,,,,,,,,0.07640037685632706,,,,,, +14,51249,,,,,,,,,,,,0.07329826802015305,,,,,, +14,51299,,,,,,,,,,,,0.07621312141418457,,,,,, +14,51349,,,,,,,,,,,,0.07279734313488007,,,,,, +14,51399,,,,,,,,,,,,0.06621149182319641,,,,,, +14,51449,,,,,,,,,,,,0.06611460447311401,,,,,, +14,51499,,,,,,,,,,,,0.06550809741020203,,,,,, +14,51549,,,,,,,,,,,,0.07674527168273926,,,,,, +14,51599,,,,,,,,,,,,0.06641622632741928,,,,,, +14,51649,,,,,,,,,,,,0.07703988254070282,,,,,, +14,51659,,,,,,,,,,,,,0.24003247916698456,0.0777810662984848,0.25821447372436523,0.059060633182525635,0.2301573008298874,0.0777810662984848 +14,51659,,,,,,,0.2308022379875183,0.07405401021242142,0.33066463470458984,0.10884660482406616,0.3149201571941376,,,,,,, +15,51699,,,,,,,,,,,,0.07337655127048492,,,,,, +15,51749,,,,,,,,,,,,0.08760674297809601,,,,,, +15,51799,,,,,,,,,,,,0.0634785145521164,,,,,, +15,51849,,,,,,,,,,,,0.06588416546583176,,,,,, +15,51899,,,,,,,,,,,,0.12613895535469055,,,,,, +15,51949,,,,,,,,,,,,0.07113996893167496,,,,,, +15,51999,,,,,,,,,,,,0.08393444120883942,,,,,, +15,52049,,,,,,,,,,,,0.09243816137313843,,,,,, +15,52099,,,,,,,,,,,,0.05608702450990677,,,,,, +15,52149,,,,,,,,,,,,0.07105688750743866,,,,,, +15,52199,,,,,,,,,,,,0.0771329328417778,,,,,, +15,52249,,,,,,,,,,,,0.06425704061985016,,,,,, +15,52299,,,,,,,,,,,,0.06608584523200989,,,,,, +15,52349,,,,,,,,,,,,0.07172463834285736,,,,,, +15,52399,,,,,,,,,,,,0.0738976001739502,,,,,, +15,52449,,,,,,,,,,,,0.0854995846748352,,,,,, +15,52499,,,,,,,,,,,,0.06642983853816986,,,,,, +15,52549,,,,,,,,,,,,0.062034353613853455,,,,,, +15,52599,,,,,,,,,,,,0.07583992183208466,,,,,, +15,52649,,,,,,,,,,,,0.07816678285598755,,,,,, +15,52699,,,,,,,,,,,,0.06913027167320251,,,,,, +15,52749,,,,,,,,,,,,0.07210128009319305,,,,,, +15,52799,,,,,,,,,,,,0.07756708562374115,,,,,, +15,52849,,,,,,,,,,,,0.08760008215904236,,,,,, +15,52899,,,,,,,,,,,,0.07053939998149872,,,,,, +15,52949,,,,,,,,,,,,0.07324961572885513,,,,,, +15,52999,,,,,,,,,,,,0.06343059241771698,,,,,, +15,53049,,,,,,,,,,,,0.0772557184100151,,,,,, +15,53099,,,,,,,,,,,,0.07342888414859772,,,,,, +15,53149,,,,,,,,,,,,0.06834307312965393,,,,,, +15,53199,,,,,,,,,,,,0.06175496429204941,,,,,, +15,53249,,,,,,,,,,,,0.07441908121109009,,,,,, +15,53299,,,,,,,,,,,,0.06926727294921875,,,,,, +15,53349,,,,,,,,,,,,0.07640320062637329,,,,,, +15,53399,,,,,,,,,,,,0.06828083842992783,,,,,, +15,53449,,,,,,,,,,,,0.07894690334796906,,,,,, +15,53499,,,,,,,,,,,,0.07405687123537064,,,,,, +15,53549,,,,,,,,,,,,0.07934822142124176,,,,,, +15,53599,,,,,,,,,,,,0.06757207959890366,,,,,, +15,53649,,,,,,,,,,,,0.0860302597284317,,,,,, +15,53699,,,,,,,,,,,,0.07221205532550812,,,,,, +15,53749,,,,,,,,,,,,0.07428302615880966,,,,,, +15,53799,,,,,,,,,,,,0.08730190247297287,,,,,, +15,53849,,,,,,,,,,,,0.08253462612628937,,,,,, +15,53899,,,,,,,,,,,,0.08561793714761734,,,,,, +15,53949,,,,,,,,,,,,0.08854783326387405,,,,,, +15,53999,,,,,,,,,,,,0.0882120430469513,,,,,, +15,54049,,,,,,,,,,,,0.07987920939922333,,,,,, +15,54099,,,,,,,,,,,,0.08929160982370377,,,,,, +15,54149,,,,,,,,,,,,0.06883276253938675,,,,,, +15,54199,,,,,,,,,,,,0.08501353859901428,,,,,, +15,54249,,,,,,,,,,,,0.06978689879179001,,,,,, +15,54299,,,,,,,,,,,,0.08452479541301727,,,,,, +15,54349,,,,,,,,,,,,0.07677698135375977,,,,,, +15,54399,,,,,,,,,,,,0.08120331168174744,,,,,, +15,54449,,,,,,,,,,,,0.0886620357632637,,,,,, +15,54499,,,,,,,,,,,,0.08541928976774216,,,,,, +15,54549,,,,,,,,,,,,0.07512257248163223,,,,,, +15,54599,,,,,,,,,,,,0.06116422638297081,,,,,, +15,54649,,,,,,,,,,,,0.08332276344299316,,,,,, +15,54699,,,,,,,,,,,,0.08193831145763397,,,,,, +15,54749,,,,,,,,,,,,0.08522316813468933,,,,,, +15,54799,,,,,,,,,,,,0.08391902595758438,,,,,, +15,54849,,,,,,,,,,,,0.07847179472446442,,,,,, +15,54899,,,,,,,,,,,,0.08237463235855103,,,,,, +15,54949,,,,,,,,,,,,0.07338292896747589,,,,,, +15,54999,,,,,,,,,,,,0.06646479666233063,,,,,, +15,55049,,,,,,,,,,,,0.08793085068464279,,,,,, +15,55099,,,,,,,,,,,,0.0824696272611618,,,,,, +15,55103,,,,,,,,,,,,,0.2376163899898529,0.07780563086271286,0.25309401750564575,0.05876350402832031,0.21714802086353302,0.07780563086271286 +15,55103,,,,,,,0.23419077694416046,0.07634315639734268,0.290107399225235,0.08129584789276123,0.28171995282173157,,,,,,, +16,55149,,,,,,,,,,,,0.07950395345687866,,,,,, +16,55199,,,,,,,,,,,,0.07114843279123306,,,,,, +16,55249,,,,,,,,,,,,0.0793047547340393,,,,,, +16,55299,,,,,,,,,,,,0.08664402365684509,,,,,, +16,55349,,,,,,,,,,,,0.06684550642967224,,,,,, +16,55399,,,,,,,,,,,,0.07917256653308868,,,,,, +16,55449,,,,,,,,,,,,0.07578346133232117,,,,,, +16,55499,,,,,,,,,,,,0.06285259127616882,,,,,, +16,55549,,,,,,,,,,,,0.07768256962299347,,,,,, +16,55599,,,,,,,,,,,,0.07970419526100159,,,,,, +16,55649,,,,,,,,,,,,0.07732957601547241,,,,,, +16,55699,,,,,,,,,,,,0.0719095766544342,,,,,, +16,55749,,,,,,,,,,,,0.06924551725387573,,,,,, +16,55799,,,,,,,,,,,,0.07657038420438766,,,,,, +16,55849,,,,,,,,,,,,0.06532203406095505,,,,,, +16,55899,,,,,,,,,,,,0.09079842269420624,,,,,, +16,55949,,,,,,,,,,,,0.07225531339645386,,,,,, +16,55999,,,,,,,,,,,,0.07368655502796173,,,,,, +16,56049,,,,,,,,,,,,0.07745632529258728,,,,,, +16,56099,,,,,,,,,,,,0.07483223080635071,,,,,, +16,56149,,,,,,,,,,,,0.07366548478603363,,,,,, +16,56199,,,,,,,,,,,,0.0775904506444931,,,,,, +16,56249,,,,,,,,,,,,0.07177677750587463,,,,,, +16,56299,,,,,,,,,,,,0.07573450356721878,,,,,, +16,56349,,,,,,,,,,,,0.0766366496682167,,,,,, +16,56399,,,,,,,,,,,,0.07372614741325378,,,,,, +16,56449,,,,,,,,,,,,0.07512244582176208,,,,,, +16,56499,,,,,,,,,,,,0.07411162555217743,,,,,, +16,56549,,,,,,,,,,,,0.06937182694673538,,,,,, +16,56599,,,,,,,,,,,,0.07766495645046234,,,,,, +16,56649,,,,,,,,,,,,0.07019050419330597,,,,,, +16,56699,,,,,,,,,,,,0.06333161890506744,,,,,, +16,56749,,,,,,,,,,,,0.07359111309051514,,,,,, +16,56799,,,,,,,,,,,,0.08046747744083405,,,,,, +16,56849,,,,,,,,,,,,0.0629730150103569,,,,,, +16,56899,,,,,,,,,,,,0.07403185963630676,,,,,, +16,56949,,,,,,,,,,,,0.06781890988349915,,,,,, +16,56999,,,,,,,,,,,,0.08659137785434723,,,,,, +16,57049,,,,,,,,,,,,0.06915538012981415,,,,,, +16,57099,,,,,,,,,,,,0.0790654718875885,,,,,, +16,57149,,,,,,,,,,,,0.07734909653663635,,,,,, +16,57199,,,,,,,,,,,,0.06792198121547699,,,,,, +16,57249,,,,,,,,,,,,0.08504733443260193,,,,,, +16,57299,,,,,,,,,,,,0.06253574788570404,,,,,, +16,57349,,,,,,,,,,,,0.0724027007818222,,,,,, +16,57399,,,,,,,,,,,,0.07083692401647568,,,,,, +16,57449,,,,,,,,,,,,0.07306518405675888,,,,,, +16,57499,,,,,,,,,,,,0.057349760085344315,,,,,, +16,57549,,,,,,,,,,,,0.07802017033100128,,,,,, +16,57599,,,,,,,,,,,,0.0634789690375328,,,,,, +16,57649,,,,,,,,,,,,0.0791914239525795,,,,,, +16,57699,,,,,,,,,,,,0.0940152034163475,,,,,, +16,57749,,,,,,,,,,,,0.0696808397769928,,,,,, +16,57799,,,,,,,,,,,,0.07205671072006226,,,,,, +16,57849,,,,,,,,,,,,0.06585386395454407,,,,,, +16,57899,,,,,,,,,,,,0.06978316605091095,,,,,, +16,57949,,,,,,,,,,,,0.0842219889163971,,,,,, +16,57999,,,,,,,,,,,,0.07654747366905212,,,,,, +16,58049,,,,,,,,,,,,0.07278081774711609,,,,,, +16,58099,,,,,,,,,,,,0.07796764373779297,,,,,, +16,58149,,,,,,,,,,,,0.08857282996177673,,,,,, +16,58199,,,,,,,,,,,,0.09336692839860916,,,,,, +16,58249,,,,,,,,,,,,0.08194836229085922,,,,,, +16,58299,,,,,,,,,,,,0.07526300847530365,,,,,, +16,58349,,,,,,,,,,,,0.07829335331916809,,,,,, +16,58399,,,,,,,,,,,,0.07464669644832611,,,,,, +16,58449,,,,,,,,,,,,0.07669104635715485,,,,,, +16,58499,,,,,,,,,,,,0.07061762362718582,,,,,, +16,58547,,,,,,,,,,,,,0.2411598265171051,0.07831210643053055,0.25725600123405457,0.05263650417327881,0.21891668438911438,0.07831210643053055 +16,58547,,,,,,,0.2322545349597931,0.07486408203840256,0.316329687833786,0.09910231828689575,0.3002438247203827,,,,,,, +17,58549,,,,,,,,,,,,0.0687607154250145,,,,,, +17,58599,,,,,,,,,,,,0.0782070904970169,,,,,, +17,58649,,,,,,,,,,,,0.07504843175411224,,,,,, +17,58699,,,,,,,,,,,,0.07753591239452362,,,,,, +17,58749,,,,,,,,,,,,0.07582210004329681,,,,,, +17,58799,,,,,,,,,,,,0.07072009146213531,,,,,, +17,58849,,,,,,,,,,,,0.07567175477743149,,,,,, +17,58899,,,,,,,,,,,,0.06968101859092712,,,,,, +17,58949,,,,,,,,,,,,0.08327293395996094,,,,,, +17,58999,,,,,,,,,,,,0.0706278383731842,,,,,, +17,59049,,,,,,,,,,,,0.07717593014240265,,,,,, +17,59099,,,,,,,,,,,,0.0736437439918518,,,,,, +17,59149,,,,,,,,,,,,0.07575850188732147,,,,,, +17,59199,,,,,,,,,,,,0.07117626070976257,,,,,, +17,59249,,,,,,,,,,,,0.06946079432964325,,,,,, +17,59299,,,,,,,,,,,,0.07029358297586441,,,,,, +17,59349,,,,,,,,,,,,0.07393606007099152,,,,,, +17,59399,,,,,,,,,,,,0.06644552946090698,,,,,, +17,59449,,,,,,,,,,,,0.07881671190261841,,,,,, +17,59499,,,,,,,,,,,,0.07563934475183487,,,,,, +17,59549,,,,,,,,,,,,0.06903492659330368,,,,,, +17,59599,,,,,,,,,,,,0.06952536106109619,,,,,, +17,59649,,,,,,,,,,,,0.07060866802930832,,,,,, +17,59699,,,,,,,,,,,,0.08028396964073181,,,,,, +17,59749,,,,,,,,,,,,0.06582639366388321,,,,,, +17,59799,,,,,,,,,,,,0.0755055844783783,,,,,, +17,59849,,,,,,,,,,,,0.07390847057104111,,,,,, +17,59899,,,,,,,,,,,,0.06661838293075562,,,,,, +17,59949,,,,,,,,,,,,0.06580357253551483,,,,,, +17,59999,,,,,,,,,,,,0.07661937922239304,,,,,, +17,60049,,,,,,,,,,,,0.07266376912593842,,,,,, +17,60099,,,,,,,,,,,,0.07212523370981216,,,,,, +17,60149,,,,,,,,,,,,0.06615476310253143,,,,,, +17,60199,,,,,,,,,,,,0.06944964826107025,,,,,, +17,60249,,,,,,,,,,,,0.08969591557979584,,,,,, +17,60299,,,,,,,,,,,,0.06319715082645416,,,,,, +17,60349,,,,,,,,,,,,0.06498932838439941,,,,,, +17,60399,,,,,,,,,,,,0.07246812433004379,,,,,, +17,60449,,,,,,,,,,,,0.07255612313747406,,,,,, +17,60499,,,,,,,,,,,,0.08755090832710266,,,,,, +17,60549,,,,,,,,,,,,0.08272319287061691,,,,,, +17,60599,,,,,,,,,,,,0.0750887542963028,,,,,, +17,60649,,,,,,,,,,,,0.07202786207199097,,,,,, +17,60699,,,,,,,,,,,,0.07609908282756805,,,,,, +17,60749,,,,,,,,,,,,0.08318216353654861,,,,,, +17,60799,,,,,,,,,,,,0.07322408258914948,,,,,, +17,60849,,,,,,,,,,,,0.07744984328746796,,,,,, +17,60899,,,,,,,,,,,,0.07429412007331848,,,,,, +17,60949,,,,,,,,,,,,0.05957316607236862,,,,,, +17,60999,,,,,,,,,,,,0.07121385633945465,,,,,, +17,61049,,,,,,,,,,,,0.07446005940437317,,,,,, +17,61099,,,,,,,,,,,,0.06127899885177612,,,,,, +17,61149,,,,,,,,,,,,0.06864916533231735,,,,,, +17,61199,,,,,,,,,,,,0.07405586540699005,,,,,, +17,61249,,,,,,,,,,,,0.07277244329452515,,,,,, +17,61299,,,,,,,,,,,,0.06722448766231537,,,,,, +17,61349,,,,,,,,,,,,0.08531442284584045,,,,,, +17,61399,,,,,,,,,,,,0.07103276252746582,,,,,, +17,61449,,,,,,,,,,,,0.08031336218118668,,,,,, +17,61499,,,,,,,,,,,,0.06140198931097984,,,,,, +17,61549,,,,,,,,,,,,0.06988011300563812,,,,,, +17,61599,,,,,,,,,,,,0.07427378743886948,,,,,, +17,61649,,,,,,,,,,,,0.08330528438091278,,,,,, +17,61699,,,,,,,,,,,,0.06883116066455841,,,,,, +17,61749,,,,,,,,,,,,0.06947050988674164,,,,,, +17,61799,,,,,,,,,,,,0.06864006817340851,,,,,, +17,61849,,,,,,,,,,,,0.08721316605806351,,,,,, +17,61899,,,,,,,,,,,,0.0656236857175827,,,,,, +17,61949,,,,,,,,,,,,0.07058434933423996,,,,,, +17,61991,,,,,,,,,,,,,0.2401556670665741,0.0776292011141777,0.25968992710113525,0.060897767543792725,0.22865357995033264,0.0776292011141777 +17,61991,,,,,,,0.23107661306858063,0.07413056492805481,0.3292316496372223,0.10793697834014893,0.3119056820869446,,,,,,, +18,61999,,,,,,,,,,,,0.0781334787607193,,,,,, +18,62049,,,,,,,,,,,,0.07864817976951599,,,,,, +18,62099,,,,,,,,,,,,0.06941626965999603,,,,,, +18,62149,,,,,,,,,,,,0.0766296461224556,,,,,, +18,62199,,,,,,,,,,,,0.06051935255527496,,,,,, +18,62249,,,,,,,,,,,,0.0720863789319992,,,,,, +18,62299,,,,,,,,,,,,0.07469027489423752,,,,,, +18,62349,,,,,,,,,,,,0.05705332010984421,,,,,, +18,62399,,,,,,,,,,,,0.059919193387031555,,,,,, +18,62449,,,,,,,,,,,,0.08415665477514267,,,,,, +18,62499,,,,,,,,,,,,0.07214290648698807,,,,,, +18,62549,,,,,,,,,,,,0.08048497140407562,,,,,, +18,62599,,,,,,,,,,,,0.058311112225055695,,,,,, +18,62649,,,,,,,,,,,,0.08120124042034149,,,,,, +18,62699,,,,,,,,,,,,0.065963014960289,,,,,, +18,62749,,,,,,,,,,,,0.06295138597488403,,,,,, +18,62799,,,,,,,,,,,,0.07246078550815582,,,,,, +18,62849,,,,,,,,,,,,0.0661933422088623,,,,,, +18,62899,,,,,,,,,,,,0.0639955922961235,,,,,, +18,62949,,,,,,,,,,,,0.07285697013139725,,,,,, +18,62999,,,,,,,,,,,,0.06729846447706223,,,,,, +18,63049,,,,,,,,,,,,0.06993228942155838,,,,,, +18,63099,,,,,,,,,,,,0.07052047550678253,,,,,, +18,63149,,,,,,,,,,,,0.0683027133345604,,,,,, +18,63199,,,,,,,,,,,,0.067573681473732,,,,,, +18,63249,,,,,,,,,,,,0.07642195373773575,,,,,, +18,63299,,,,,,,,,,,,0.07364558428525925,,,,,, +18,63349,,,,,,,,,,,,0.06645829975605011,,,,,, +18,63399,,,,,,,,,,,,0.08222296833992004,,,,,, +18,63449,,,,,,,,,,,,0.06453671306371689,,,,,, +18,63499,,,,,,,,,,,,0.07306742668151855,,,,,, +18,63549,,,,,,,,,,,,0.07978127151727676,,,,,, +18,63599,,,,,,,,,,,,0.06105675548315048,,,,,, +18,63649,,,,,,,,,,,,0.07378274202346802,,,,,, +18,63699,,,,,,,,,,,,0.06480327248573303,,,,,, +18,63749,,,,,,,,,,,,0.07857579737901688,,,,,, +18,63799,,,,,,,,,,,,0.07363525778055191,,,,,, +18,63849,,,,,,,,,,,,0.07618699967861176,,,,,, +18,63899,,,,,,,,,,,,0.08067712187767029,,,,,, +18,63949,,,,,,,,,,,,0.08372265845537186,,,,,, +18,63999,,,,,,,,,,,,0.06884433329105377,,,,,, +18,64049,,,,,,,,,,,,0.06689459085464478,,,,,, +18,64099,,,,,,,,,,,,0.07151095569133759,,,,,, +18,64149,,,,,,,,,,,,0.09141803532838821,,,,,, +18,64199,,,,,,,,,,,,0.060214728116989136,,,,,, +18,64249,,,,,,,,,,,,0.07362785935401917,,,,,, +18,64299,,,,,,,,,,,,0.0758701041340828,,,,,, +18,64349,,,,,,,,,,,,0.07533906400203705,,,,,, +18,64399,,,,,,,,,,,,0.0666014701128006,,,,,, +18,64449,,,,,,,,,,,,0.07304104417562485,,,,,, +18,64499,,,,,,,,,,,,0.07290905714035034,,,,,, +18,64549,,,,,,,,,,,,0.05813952907919884,,,,,, +18,64599,,,,,,,,,,,,0.07778213918209076,,,,,, +18,64649,,,,,,,,,,,,0.07578569650650024,,,,,, +18,64699,,,,,,,,,,,,0.07419955730438232,,,,,, +18,64749,,,,,,,,,,,,0.058605700731277466,,,,,, +18,64799,,,,,,,,,,,,0.07244664430618286,,,,,, +18,64849,,,,,,,,,,,,0.08038315922021866,,,,,, +18,64899,,,,,,,,,,,,0.062098968774080276,,,,,, +18,64949,,,,,,,,,,,,0.0776045173406601,,,,,, +18,64999,,,,,,,,,,,,0.07034078240394592,,,,,, +18,65049,,,,,,,,,,,,0.07566748559474945,,,,,, +18,65099,,,,,,,,,,,,0.07561182975769043,,,,,, +18,65149,,,,,,,,,,,,0.05721310153603554,,,,,, +18,65199,,,,,,,,,,,,0.0630621388554573,,,,,, +18,65249,,,,,,,,,,,,0.07051589339971542,,,,,, +18,65299,,,,,,,,,,,,0.06975193321704865,,,,,, +18,65349,,,,,,,,,,,,0.06371299922466278,,,,,, +18,65399,,,,,,,,,,,,0.07031763345003128,,,,,, +18,65435,,,,,,,,,,,,,0.23960235714912415,0.07807236164808273,0.2605345547199249,0.05553680658340454,0.23258738219738007,0.07807236164808273 +18,65435,,,,,,,0.22764834761619568,0.07229330390691757,0.36076420545578003,0.13005638122558594,0.34337666630744934,,,,,,, +19,65449,,,,,,,,,,,,0.08186204731464386,,,,,, +19,65499,,,,,,,,,,,,0.0679030567407608,,,,,, +19,65549,,,,,,,,,,,,0.06251482665538788,,,,,, +19,65599,,,,,,,,,,,,0.07404434680938721,,,,,, +19,65649,,,,,,,,,,,,0.07308612763881683,,,,,, +19,65699,,,,,,,,,,,,0.08045458793640137,,,,,, +19,65749,,,,,,,,,,,,0.07281606644392014,,,,,, +19,65799,,,,,,,,,,,,0.06968634575605392,,,,,, +19,65849,,,,,,,,,,,,0.06128201633691788,,,,,, +19,65899,,,,,,,,,,,,0.06369507312774658,,,,,, +19,65949,,,,,,,,,,,,0.07202601432800293,,,,,, +19,65999,,,,,,,,,,,,0.07378163188695908,,,,,, +19,66049,,,,,,,,,,,,0.08102885633707047,,,,,, +19,66099,,,,,,,,,,,,0.07503613829612732,,,,,, +19,66149,,,,,,,,,,,,0.06740155816078186,,,,,, +19,66199,,,,,,,,,,,,0.07644915580749512,,,,,, +19,66249,,,,,,,,,,,,0.07708568871021271,,,,,, +19,66299,,,,,,,,,,,,0.0847402885556221,,,,,, +19,66349,,,,,,,,,,,,0.0820440948009491,,,,,, +19,66399,,,,,,,,,,,,0.05962330847978592,,,,,, +19,66449,,,,,,,,,,,,0.07156743109226227,,,,,, +19,66499,,,,,,,,,,,,0.06967669725418091,,,,,, +19,66549,,,,,,,,,,,,0.06908205896615982,,,,,, +19,66599,,,,,,,,,,,,0.0748329609632492,,,,,, +19,66649,,,,,,,,,,,,0.0727672129869461,,,,,, +19,66699,,,,,,,,,,,,0.07758311927318573,,,,,, +19,66749,,,,,,,,,,,,0.08265699446201324,,,,,, +19,66799,,,,,,,,,,,,0.06676889955997467,,,,,, +19,66849,,,,,,,,,,,,0.07569574564695358,,,,,, +19,66899,,,,,,,,,,,,0.07110200077295303,,,,,, +19,66949,,,,,,,,,,,,0.07582928240299225,,,,,, +19,66999,,,,,,,,,,,,0.07799143344163895,,,,,, +19,67049,,,,,,,,,,,,0.075961634516716,,,,,, +19,67099,,,,,,,,,,,,0.07438700646162033,,,,,, +19,67149,,,,,,,,,,,,0.07181258499622345,,,,,, +19,67199,,,,,,,,,,,,0.07605084776878357,,,,,, +19,67249,,,,,,,,,,,,0.07423928380012512,,,,,, +19,67299,,,,,,,,,,,,0.07526908069849014,,,,,, +19,67349,,,,,,,,,,,,0.07299032807350159,,,,,, +19,67399,,,,,,,,,,,,0.0676528811454773,,,,,, +19,67449,,,,,,,,,,,,0.07764771580696106,,,,,, +19,67499,,,,,,,,,,,,0.06901545822620392,,,,,, +19,67549,,,,,,,,,,,,0.07630106061697006,,,,,, +19,67599,,,,,,,,,,,,0.06756304204463959,,,,,, +19,67649,,,,,,,,,,,,0.06065966933965683,,,,,, +19,67699,,,,,,,,,,,,0.07413032650947571,,,,,, +19,67749,,,,,,,,,,,,0.071983702480793,,,,,, +19,67799,,,,,,,,,,,,0.07058412581682205,,,,,, +19,67849,,,,,,,,,,,,0.06740068644285202,,,,,, +19,67899,,,,,,,,,,,,0.06875098496675491,,,,,, +19,67949,,,,,,,,,,,,0.08057530224323273,,,,,, +19,67999,,,,,,,,,,,,0.06916828453540802,,,,,, +19,68049,,,,,,,,,,,,0.07788453996181488,,,,,, +19,68099,,,,,,,,,,,,0.07827258855104446,,,,,, +19,68149,,,,,,,,,,,,0.07324282824993134,,,,,, +19,68199,,,,,,,,,,,,0.07438104599714279,,,,,, +19,68249,,,,,,,,,,,,0.07480695098638535,,,,,, +19,68299,,,,,,,,,,,,0.06836147606372833,,,,,, +19,68349,,,,,,,,,,,,0.07325516641139984,,,,,, +19,68399,,,,,,,,,,,,0.07577119022607803,,,,,, +19,68449,,,,,,,,,,,,0.07671648263931274,,,,,, +19,68499,,,,,,,,,,,,0.06706288456916809,,,,,, +19,68549,,,,,,,,,,,,0.07958317548036575,,,,,, +19,68599,,,,,,,,,,,,0.07223673164844513,,,,,, +19,68649,,,,,,,,,,,,0.07978947460651398,,,,,, +19,68699,,,,,,,,,,,,0.0706663429737091,,,,,, +19,68749,,,,,,,,,,,,0.05424155294895172,,,,,, +19,68799,,,,,,,,,,,,0.06579826772212982,,,,,, +19,68849,,,,,,,,,,,,0.06236705929040909,,,,,, +19,68879,,,,,,,,,,,,,0.23778127133846283,0.07891157269477844,0.2621760964393616,0.04538464546203613,0.23330463469028473,0.07891157269477844 +19,68879,,,,,,,0.2272549271583557,0.07222703844308853,0.3620316684246063,0.13083690404891968,0.34415221214294434,,,,,,, +20,68899,,,,,,,,,,,,0.06263129413127899,,,,,, +20,68949,,,,,,,,,,,,0.07697640359401703,,,,,, +20,68999,,,,,,,,,,,,0.08436942845582962,,,,,, +20,69049,,,,,,,,,,,,0.08181387931108475,,,,,, +20,69099,,,,,,,,,,,,0.06541749835014343,,,,,, +20,69149,,,,,,,,,,,,0.06960513442754745,,,,,, +20,69199,,,,,,,,,,,,0.06683839112520218,,,,,, +20,69249,,,,,,,,,,,,0.07878802716732025,,,,,, +20,69299,,,,,,,,,,,,0.06692780554294586,,,,,, +20,69349,,,,,,,,,,,,0.06843215972185135,,,,,, +20,69399,,,,,,,,,,,,0.0690934956073761,,,,,, +20,69449,,,,,,,,,,,,0.08409133553504944,,,,,, +20,69499,,,,,,,,,,,,0.07493696361780167,,,,,, +20,69549,,,,,,,,,,,,0.058976951986551285,,,,,, +20,69599,,,,,,,,,,,,0.06974124908447266,,,,,, +20,69649,,,,,,,,,,,,0.06483381986618042,,,,,, +20,69699,,,,,,,,,,,,0.06951215118169785,,,,,, +20,69749,,,,,,,,,,,,0.07210884988307953,,,,,, +20,69799,,,,,,,,,,,,0.06981103122234344,,,,,, +20,69849,,,,,,,,,,,,0.07393015921115875,,,,,, +20,69899,,,,,,,,,,,,0.06245525926351547,,,,,, +20,69949,,,,,,,,,,,,0.06990364193916321,,,,,, +20,69999,,,,,,,,,,,,0.06872163712978363,,,,,, +20,70049,,,,,,,,,,,,0.06986667215824127,,,,,, +20,70099,,,,,,,,,,,,0.07888425886631012,,,,,, +20,70149,,,,,,,,,,,,0.0636209174990654,,,,,, +20,70199,,,,,,,,,,,,0.06847591698169708,,,,,, +20,70249,,,,,,,,,,,,0.07196247577667236,,,,,, +20,70299,,,,,,,,,,,,0.07277543097734451,,,,,, +20,70349,,,,,,,,,,,,0.06650559604167938,,,,,, +20,70399,,,,,,,,,,,,0.0703720897436142,,,,,, +20,70449,,,,,,,,,,,,0.07501360774040222,,,,,, +20,70499,,,,,,,,,,,,0.06132200360298157,,,,,, +20,70549,,,,,,,,,,,,0.06816962361335754,,,,,, +20,70599,,,,,,,,,,,,0.06902322918176651,,,,,, +20,70649,,,,,,,,,,,,0.07712282240390778,,,,,, +20,70699,,,,,,,,,,,,0.08745120465755463,,,,,, +20,70749,,,,,,,,,,,,0.06139775365591049,,,,,, +20,70799,,,,,,,,,,,,0.06891083717346191,,,,,, +20,70849,,,,,,,,,,,,0.07281099259853363,,,,,, +20,70899,,,,,,,,,,,,0.0657675564289093,,,,,, +20,70949,,,,,,,,,,,,0.06569500267505646,,,,,, +20,70999,,,,,,,,,,,,0.07202606648206711,,,,,, +20,71049,,,,,,,,,,,,0.07774652540683746,,,,,, +20,71099,,,,,,,,,,,,0.06972894817590714,,,,,, +20,71149,,,,,,,,,,,,0.06616321206092834,,,,,, +20,71199,,,,,,,,,,,,0.07143904268741608,,,,,, +20,71249,,,,,,,,,,,,0.07188653945922852,,,,,, +20,71299,,,,,,,,,,,,0.07596614956855774,,,,,, +20,71349,,,,,,,,,,,,0.07659609615802765,,,,,, +20,71399,,,,,,,,,,,,0.08442772179841995,,,,,, +20,71449,,,,,,,,,,,,0.0649372935295105,,,,,, +20,71499,,,,,,,,,,,,0.06566619127988815,,,,,, +20,71549,,,,,,,,,,,,0.07382630556821823,,,,,, +20,71599,,,,,,,,,,,,0.06771556288003922,,,,,, +20,71649,,,,,,,,,,,,0.07058287411928177,,,,,, +20,71699,,,,,,,,,,,,0.06813236325979233,,,,,, +20,71749,,,,,,,,,,,,0.07834784686565399,,,,,, +20,71799,,,,,,,,,,,,0.07554559409618378,,,,,, +20,71849,,,,,,,,,,,,0.07997148483991623,,,,,, +20,71899,,,,,,,,,,,,0.07092703878879547,,,,,, +20,71949,,,,,,,,,,,,0.06880629062652588,,,,,, +20,71999,,,,,,,,,,,,0.07811620831489563,,,,,, +20,72049,,,,,,,,,,,,0.07653636485338211,,,,,, +20,72099,,,,,,,,,,,,0.06771357357501984,,,,,, +20,72149,,,,,,,,,,,,0.06999925523996353,,,,,, +20,72199,,,,,,,,,,,,0.07067631185054779,,,,,, +20,72249,,,,,,,,,,,,0.06822919845581055,,,,,, +20,72299,,,,,,,,,,,,0.08019141852855682,,,,,, +20,72323,,,,,,,,,,,,,0.23852066695690155,0.0772099494934082,0.260677307844162,0.06596958637237549,0.23016633093357086,0.0772099494934082 +20,72323,,,,,,,0.22646526992321014,0.07171400636434555,0.37034037709236145,0.13701939582824707,0.35254988074302673,,,,,,, +21,72349,,,,,,,,,,,,0.07818329334259033,,,,,, +21,72399,,,,,,,,,,,,0.07082045078277588,,,,,, +21,72449,,,,,,,,,,,,0.06871198862791061,,,,,, +21,72499,,,,,,,,,,,,0.07292211055755615,,,,,, +21,72549,,,,,,,,,,,,0.06705842912197113,,,,,, +21,72599,,,,,,,,,,,,0.06426030397415161,,,,,, +21,72649,,,,,,,,,,,,0.06708492338657379,,,,,, +21,72699,,,,,,,,,,,,0.06510666012763977,,,,,, +21,72749,,,,,,,,,,,,0.07432059943675995,,,,,, +21,72799,,,,,,,,,,,,0.0743541419506073,,,,,, +21,72849,,,,,,,,,,,,0.0653456598520279,,,,,, +21,72899,,,,,,,,,,,,0.07446551322937012,,,,,, +21,72949,,,,,,,,,,,,0.05957210808992386,,,,,, +21,72999,,,,,,,,,,,,0.06913311779499054,,,,,, +21,73049,,,,,,,,,,,,0.07099234312772751,,,,,, +21,73099,,,,,,,,,,,,0.06707928329706192,,,,,, +21,73149,,,,,,,,,,,,0.06983077526092529,,,,,, +21,73199,,,,,,,,,,,,0.06551644206047058,,,,,, +21,73249,,,,,,,,,,,,0.061521850526332855,,,,,, +21,73299,,,,,,,,,,,,0.06381843239068985,,,,,, +21,73349,,,,,,,,,,,,0.06275690346956253,,,,,, +21,73399,,,,,,,,,,,,0.07128380239009857,,,,,, +21,73449,,,,,,,,,,,,0.0730111300945282,,,,,, +21,73499,,,,,,,,,,,,0.0791732668876648,,,,,, +21,73549,,,,,,,,,,,,0.08359773457050323,,,,,, +21,73599,,,,,,,,,,,,0.06476835906505585,,,,,, +21,73649,,,,,,,,,,,,0.06494760513305664,,,,,, +21,73699,,,,,,,,,,,,0.06529022753238678,,,,,, +21,73749,,,,,,,,,,,,0.07083576172590256,,,,,, +21,73799,,,,,,,,,,,,0.07502950727939606,,,,,, +21,73849,,,,,,,,,,,,0.06571756303310394,,,,,, +21,73899,,,,,,,,,,,,0.07161407172679901,,,,,, +21,73949,,,,,,,,,,,,0.06366638094186783,,,,,, +21,73999,,,,,,,,,,,,0.0751543715596199,,,,,, +21,74049,,,,,,,,,,,,0.06782332062721252,,,,,, +21,74099,,,,,,,,,,,,0.08418446779251099,,,,,, +21,74149,,,,,,,,,,,,0.06053805351257324,,,,,, +21,74199,,,,,,,,,,,,0.07950523495674133,,,,,, +21,74249,,,,,,,,,,,,0.07565222680568695,,,,,, +21,74299,,,,,,,,,,,,0.07535147666931152,,,,,, +21,74349,,,,,,,,,,,,0.06292153894901276,,,,,, +21,74399,,,,,,,,,,,,0.06562627851963043,,,,,, +21,74449,,,,,,,,,,,,0.06941783428192139,,,,,, +21,74499,,,,,,,,,,,,0.066490039229393,,,,,, +21,74549,,,,,,,,,,,,0.06528935581445694,,,,,, +21,74599,,,,,,,,,,,,0.06705868244171143,,,,,, +21,74649,,,,,,,,,,,,0.0756826177239418,,,,,, +21,74699,,,,,,,,,,,,0.07230904698371887,,,,,, +21,74749,,,,,,,,,,,,0.07483036071062088,,,,,, +21,74799,,,,,,,,,,,,0.0690751001238823,,,,,, +21,74849,,,,,,,,,,,,0.06815019249916077,,,,,, +21,74899,,,,,,,,,,,,0.08076054602861404,,,,,, +21,74949,,,,,,,,,,,,0.07845453172922134,,,,,, +21,74999,,,,,,,,,,,,0.07276751101016998,,,,,, +21,75049,,,,,,,,,,,,0.07141979038715363,,,,,, +21,75099,,,,,,,,,,,,0.06743374466896057,,,,,, +21,75149,,,,,,,,,,,,0.06391627341508865,,,,,, +21,75199,,,,,,,,,,,,0.06321492791175842,,,,,, +21,75249,,,,,,,,,,,,0.07139121741056442,,,,,, +21,75299,,,,,,,,,,,,0.08782824873924255,,,,,, +21,75349,,,,,,,,,,,,0.06665012985467911,,,,,, +21,75399,,,,,,,,,,,,0.07016550004482269,,,,,, +21,75449,,,,,,,,,,,,0.08620880544185638,,,,,, +21,75499,,,,,,,,,,,,0.08771118521690369,,,,,, +21,75549,,,,,,,,,,,,0.06526988744735718,,,,,, +21,75599,,,,,,,,,,,,0.0617704801261425,,,,,, +21,75649,,,,,,,,,,,,0.07422337681055069,,,,,, +21,75699,,,,,,,,,,,,0.08562059700489044,,,,,, +21,75749,,,,,,,,,,,,0.07045179605484009,,,,,, +21,75767,,,,,,,,,,,,,0.237868994474411,0.07705597579479218,0.26056969165802,0.06783223152160645,0.233305424451828,0.07705597579479218 +21,75767,,,,,,,0.22527189552783966,0.07107578217983246,0.3805067241191864,0.144697368144989,0.3620659112930298,,,,,,, +22,75799,,,,,,,,,,,,0.06903388351202011,,,,,, +22,75849,,,,,,,,,,,,0.07189600169658661,,,,,, +22,75899,,,,,,,,,,,,0.07291589677333832,,,,,, +22,75949,,,,,,,,,,,,0.07637214660644531,,,,,, +22,75999,,,,,,,,,,,,0.06769727915525436,,,,,, +22,76049,,,,,,,,,,,,0.0665205866098404,,,,,, +22,76099,,,,,,,,,,,,0.06298752129077911,,,,,, +22,76149,,,,,,,,,,,,0.07174235582351685,,,,,, +22,76199,,,,,,,,,,,,0.06993816792964935,,,,,, +22,76249,,,,,,,,,,,,0.07149511575698853,,,,,, +22,76299,,,,,,,,,,,,0.06636068969964981,,,,,, +22,76349,,,,,,,,,,,,0.06443370878696442,,,,,, +22,76399,,,,,,,,,,,,0.07477837800979614,,,,,, +22,76449,,,,,,,,,,,,0.06892942637205124,,,,,, +22,76499,,,,,,,,,,,,0.07034532725811005,,,,,, +22,76549,,,,,,,,,,,,0.06147705018520355,,,,,, +22,76599,,,,,,,,,,,,0.08004963397979736,,,,,, +22,76649,,,,,,,,,,,,0.07576911896467209,,,,,, +22,76699,,,,,,,,,,,,0.06971102952957153,,,,,, +22,76749,,,,,,,,,,,,0.07316508144140244,,,,,, +22,76799,,,,,,,,,,,,0.06848476082086563,,,,,, +22,76849,,,,,,,,,,,,0.0719185322523117,,,,,, +22,76899,,,,,,,,,,,,0.0735655277967453,,,,,, +22,76949,,,,,,,,,,,,0.06393074244260788,,,,,, +22,76999,,,,,,,,,,,,0.06787349283695221,,,,,, +22,77049,,,,,,,,,,,,0.0863473191857338,,,,,, +22,77099,,,,,,,,,,,,0.06607285141944885,,,,,, +22,77149,,,,,,,,,,,,0.06708477437496185,,,,,, +22,77199,,,,,,,,,,,,0.07725955545902252,,,,,, +22,77249,,,,,,,,,,,,0.08059804141521454,,,,,, +22,77299,,,,,,,,,,,,0.07963830232620239,,,,,, +22,77349,,,,,,,,,,,,0.07667770981788635,,,,,, +22,77399,,,,,,,,,,,,0.06657182425260544,,,,,, +22,77449,,,,,,,,,,,,0.06548267602920532,,,,,, +22,77499,,,,,,,,,,,,0.08082059025764465,,,,,, +22,77549,,,,,,,,,,,,0.06826720386743546,,,,,, +22,77599,,,,,,,,,,,,0.07519824057817459,,,,,, +22,77649,,,,,,,,,,,,0.06942752003669739,,,,,, +22,77699,,,,,,,,,,,,0.07931637018918991,,,,,, +22,77749,,,,,,,,,,,,0.07728588581085205,,,,,, +22,77799,,,,,,,,,,,,0.08817446231842041,,,,,, +22,77849,,,,,,,,,,,,0.07157807052135468,,,,,, +22,77899,,,,,,,,,,,,0.07982143759727478,,,,,, +22,77949,,,,,,,,,,,,0.08261047303676605,,,,,, +22,77999,,,,,,,,,,,,0.07439585775136948,,,,,, +22,78049,,,,,,,,,,,,0.06664325296878815,,,,,, +22,78099,,,,,,,,,,,,0.07177437841892242,,,,,, +22,78149,,,,,,,,,,,,0.07708878815174103,,,,,, +22,78199,,,,,,,,,,,,0.07668411731719971,,,,,, +22,78249,,,,,,,,,,,,0.0673256441950798,,,,,, +22,78299,,,,,,,,,,,,0.09093768894672394,,,,,, +22,78349,,,,,,,,,,,,0.0748530775308609,,,,,, +22,78399,,,,,,,,,,,,0.07948270440101624,,,,,, +22,78449,,,,,,,,,,,,0.07265428453683853,,,,,, +22,78499,,,,,,,,,,,,0.062460899353027344,,,,,, +22,78549,,,,,,,,,,,,0.06423087418079376,,,,,, +22,78599,,,,,,,,,,,,0.06551668047904968,,,,,, +22,78649,,,,,,,,,,,,0.06242355704307556,,,,,, +22,78699,,,,,,,,,,,,0.05933605134487152,,,,,, +22,78749,,,,,,,,,,,,0.0787205696105957,,,,,, +22,78799,,,,,,,,,,,,0.06150658801198006,,,,,, +22,78849,,,,,,,,,,,,0.07469527423381805,,,,,, +22,78899,,,,,,,,,,,,0.08214990794658661,,,,,, +22,78949,,,,,,,,,,,,0.0753462165594101,,,,,, +22,78999,,,,,,,,,,,,0.0759812742471695,,,,,, +22,79049,,,,,,,,,,,,0.05867163464426994,,,,,, +22,79099,,,,,,,,,,,,0.059855278581380844,,,,,, +22,79149,,,,,,,,,,,,0.0578455850481987,,,,,, +22,79199,,,,,,,,,,,,0.06293655931949615,,,,,, +22,79211,,,,,,,,,,,,,0.23758713901042938,0.07702406495809555,0.26375481486320496,0.06821835041046143,0.23484110832214355,0.07702406495809555 +22,79211,,,,,,,0.2264593541622162,0.0719200074672699,0.3673054277896881,0.13454508781433105,0.35188859701156616,,,,,,, +23,79249,,,,,,,,,,,,0.08924569189548492,,,,,, +23,79299,,,,,,,,,,,,0.06554868817329407,,,,,, +23,79349,,,,,,,,,,,,0.06248367205262184,,,,,, +23,79399,,,,,,,,,,,,0.06438721716403961,,,,,, +23,79449,,,,,,,,,,,,0.07331565022468567,,,,,, +23,79499,,,,,,,,,,,,0.07176223397254944,,,,,, +23,79549,,,,,,,,,,,,0.07358373701572418,,,,,, +23,79599,,,,,,,,,,,,0.08717244863510132,,,,,, +23,79649,,,,,,,,,,,,0.061355553567409515,,,,,, +23,79699,,,,,,,,,,,,0.07382476329803467,,,,,, +23,79749,,,,,,,,,,,,0.06979142129421234,,,,,, +23,79799,,,,,,,,,,,,0.06859347224235535,,,,,, +23,79849,,,,,,,,,,,,0.06946684420108795,,,,,, +23,79899,,,,,,,,,,,,0.07045982778072357,,,,,, +23,79949,,,,,,,,,,,,0.0620364174246788,,,,,, +23,79999,,,,,,,,,,,,0.07670988142490387,,,,,, +23,80049,,,,,,,,,,,,0.07791699469089508,,,,,, +23,80099,,,,,,,,,,,,0.07206538319587708,,,,,, +23,80149,,,,,,,,,,,,0.06733177602291107,,,,,, +23,80199,,,,,,,,,,,,0.0665665939450264,,,,,, +23,80249,,,,,,,,,,,,0.07757703959941864,,,,,, +23,80299,,,,,,,,,,,,0.07360640168190002,,,,,, +23,80349,,,,,,,,,,,,0.07391244173049927,,,,,, +23,80399,,,,,,,,,,,,0.07428053021430969,,,,,, +23,80449,,,,,,,,,,,,0.06879942119121552,,,,,, +23,80499,,,,,,,,,,,,0.06653732061386108,,,,,, +23,80549,,,,,,,,,,,,0.0783693864941597,,,,,, +23,80599,,,,,,,,,,,,0.06608574837446213,,,,,, +23,80649,,,,,,,,,,,,0.0734560489654541,,,,,, +23,80699,,,,,,,,,,,,0.06984229385852814,,,,,, +23,80749,,,,,,,,,,,,0.07069312781095505,,,,,, +23,80799,,,,,,,,,,,,0.06069152057170868,,,,,, +23,80849,,,,,,,,,,,,0.0765310749411583,,,,,, +23,80899,,,,,,,,,,,,0.07840463519096375,,,,,, +23,80949,,,,,,,,,,,,0.054401613771915436,,,,,, +23,80999,,,,,,,,,,,,0.06478619575500488,,,,,, +23,81049,,,,,,,,,,,,0.06533142924308777,,,,,, +23,81099,,,,,,,,,,,,0.06718175113201141,,,,,, +23,81149,,,,,,,,,,,,0.0679236650466919,,,,,, +23,81199,,,,,,,,,,,,0.0709662064909935,,,,,, +23,81249,,,,,,,,,,,,0.06577799469232559,,,,,, +23,81299,,,,,,,,,,,,0.061406537890434265,,,,,, +23,81349,,,,,,,,,,,,0.06781502813100815,,,,,, +23,81399,,,,,,,,,,,,0.0783545970916748,,,,,, +23,81449,,,,,,,,,,,,0.07332298159599304,,,,,, +23,81499,,,,,,,,,,,,0.06338416785001755,,,,,, +23,81549,,,,,,,,,,,,0.0731121078133583,,,,,, +23,81599,,,,,,,,,,,,0.08270151913166046,,,,,, +23,81649,,,,,,,,,,,,0.04854204133152962,,,,,, +23,81699,,,,,,,,,,,,0.07374025881290436,,,,,, +23,81749,,,,,,,,,,,,0.06864123046398163,,,,,, +23,81799,,,,,,,,,,,,0.07989274710416794,,,,,, +23,81849,,,,,,,,,,,,0.07553654909133911,,,,,, +23,81899,,,,,,,,,,,,0.06971661746501923,,,,,, +23,81949,,,,,,,,,,,,0.06759141385555267,,,,,, +23,81999,,,,,,,,,,,,0.06501317769289017,,,,,, +23,82049,,,,,,,,,,,,0.07363523542881012,,,,,, +23,82099,,,,,,,,,,,,0.06161786988377571,,,,,, +23,82149,,,,,,,,,,,,0.06824801117181778,,,,,, +23,82199,,,,,,,,,,,,0.07941477000713348,,,,,, +23,82249,,,,,,,,,,,,0.05770324170589447,,,,,, +23,82299,,,,,,,,,,,,0.07182617485523224,,,,,, +23,82349,,,,,,,,,,,,0.06543869525194168,,,,,, +23,82399,,,,,,,,,,,,0.0570216178894043,,,,,, +23,82449,,,,,,,,,,,,0.0775972232222557,,,,,, +23,82499,,,,,,,,,,,,0.06672151386737823,,,,,, +23,82549,,,,,,,,,,,,0.07368138432502747,,,,,, +23,82599,,,,,,,,,,,,0.07966472208499908,,,,,, +23,82649,,,,,,,,,,,,0.07404249906539917,,,,,, +23,82655,,,,,,,,,,,,,0.23947329819202423,0.07791613042354584,0.25932955741882324,0.0574268102645874,0.23021471500396729,0.07791613042354584 +23,82655,,,,,,,0.22538970410823822,0.07120618969202042,0.37855005264282227,0.14312785863876343,0.3598014712333679,,,,,,, +24,82699,,,,,,,,,,,,0.06488867104053497,,,,,, +24,82749,,,,,,,,,,,,0.07633659988641739,,,,,, +24,82799,,,,,,,,,,,,0.06064457446336746,,,,,, +24,82849,,,,,,,,,,,,0.07464691996574402,,,,,, +24,82899,,,,,,,,,,,,0.07082101702690125,,,,,, +24,82949,,,,,,,,,,,,0.06698182225227356,,,,,, +24,82999,,,,,,,,,,,,0.07341085374355316,,,,,, +24,83049,,,,,,,,,,,,0.06729438900947571,,,,,, +24,83099,,,,,,,,,,,,0.06764921545982361,,,,,, +24,83149,,,,,,,,,,,,0.07083413004875183,,,,,, +24,83199,,,,,,,,,,,,0.06133917719125748,,,,,, +24,83249,,,,,,,,,,,,0.07282043248414993,,,,,, +24,83299,,,,,,,,,,,,0.07229477167129517,,,,,, +24,83349,,,,,,,,,,,,0.07015262544155121,,,,,, +24,83399,,,,,,,,,,,,0.07143685966730118,,,,,, +24,83449,,,,,,,,,,,,0.07833608239889145,,,,,, +24,83499,,,,,,,,,,,,0.06336921453475952,,,,,, +24,83549,,,,,,,,,,,,0.05993274971842766,,,,,, +24,83599,,,,,,,,,,,,0.061371058225631714,,,,,, +24,83649,,,,,,,,,,,,0.07152794301509857,,,,,, +24,83699,,,,,,,,,,,,0.07204054296016693,,,,,, +24,83749,,,,,,,,,,,,0.07330502569675446,,,,,, +24,83799,,,,,,,,,,,,0.0755588710308075,,,,,, +24,83849,,,,,,,,,,,,0.07147882878780365,,,,,, +24,83899,,,,,,,,,,,,0.07063846290111542,,,,,, +24,83949,,,,,,,,,,,,0.07684511691331863,,,,,, +24,83999,,,,,,,,,,,,0.062408216297626495,,,,,, +24,84049,,,,,,,,,,,,0.06983081996440887,,,,,, +24,84099,,,,,,,,,,,,0.07088245451450348,,,,,, +24,84149,,,,,,,,,,,,0.06568607687950134,,,,,, +24,84199,,,,,,,,,,,,0.0711008757352829,,,,,, +24,84249,,,,,,,,,,,,0.0745466947555542,,,,,, +24,84299,,,,,,,,,,,,0.0739346444606781,,,,,, +24,84349,,,,,,,,,,,,0.0705864429473877,,,,,, +24,84399,,,,,,,,,,,,0.08743321895599365,,,,,, +24,84449,,,,,,,,,,,,0.06697361916303635,,,,,, +24,84499,,,,,,,,,,,,0.06710943579673767,,,,,, +24,84549,,,,,,,,,,,,0.06964226067066193,,,,,, +24,84599,,,,,,,,,,,,0.07620704174041748,,,,,, +24,84649,,,,,,,,,,,,0.060913000255823135,,,,,, +24,84699,,,,,,,,,,,,0.07997345924377441,,,,,, +24,84749,,,,,,,,,,,,0.06353193521499634,,,,,, +24,84799,,,,,,,,,,,,0.0779532939195633,,,,,, +24,84849,,,,,,,,,,,,0.07168839126825333,,,,,, +24,84899,,,,,,,,,,,,0.07239622622728348,,,,,, +24,84949,,,,,,,,,,,,0.07379783689975739,,,,,, +24,84999,,,,,,,,,,,,0.07316909730434418,,,,,, +24,85049,,,,,,,,,,,,0.07428084313869476,,,,,, +24,85099,,,,,,,,,,,,0.08218307048082352,,,,,, +24,85149,,,,,,,,,,,,0.06799107044935226,,,,,, +24,85199,,,,,,,,,,,,0.08150067925453186,,,,,, +24,85249,,,,,,,,,,,,0.07452704012393951,,,,,, +24,85299,,,,,,,,,,,,0.0700419694185257,,,,,, +24,85349,,,,,,,,,,,,0.06830170750617981,,,,,, +24,85399,,,,,,,,,,,,0.061786528676748276,,,,,, +24,85449,,,,,,,,,,,,0.06791000068187714,,,,,, +24,85499,,,,,,,,,,,,0.07162541151046753,,,,,, +24,85549,,,,,,,,,,,,0.06965820491313934,,,,,, +24,85599,,,,,,,,,,,,0.062024395912885666,,,,,, +24,85649,,,,,,,,,,,,0.07510149478912354,,,,,, +24,85699,,,,,,,,,,,,0.07161887735128403,,,,,, +24,85749,,,,,,,,,,,,0.069700688123703,,,,,, +24,85799,,,,,,,,,,,,0.06486357748508453,,,,,, +24,85849,,,,,,,,,,,,0.07496901601552963,,,,,, +24,85899,,,,,,,,,,,,0.07387060672044754,,,,,, +24,85949,,,,,,,,,,,,0.058147579431533813,,,,,, +24,85999,,,,,,,,,,,,0.07137230038642883,,,,,, +24,86049,,,,,,,,,,,,0.07564640790224075,,,,,, +24,86099,,,,,,,,,,,,0.06995946168899536,,,,,, +24,86099,,,,,,,,,,,,,0.23686358332633972,0.07739301025867462,0.26641085743904114,0.06375503540039062,0.23682259023189545,0.07739301025867462 +24,86099,,,,,,,0.22552025318145752,0.0713169127702713,0.3767852485179901,0.14178985357284546,0.3595004975795746,,,,,,, +25,86149,,,,,,,,,,,,0.06721215695142746,,,,,, +25,86199,,,,,,,,,,,,0.06274660676717758,,,,,, +25,86249,,,,,,,,,,,,0.06782311201095581,,,,,, +25,86299,,,,,,,,,,,,0.07588406652212143,,,,,, +25,86349,,,,,,,,,,,,0.07607290148735046,,,,,, +25,86399,,,,,,,,,,,,0.06630346179008484,,,,,, +25,86449,,,,,,,,,,,,0.05960039794445038,,,,,, +25,86499,,,,,,,,,,,,0.07044331729412079,,,,,, +25,86549,,,,,,,,,,,,0.06968115270137787,,,,,, +25,86599,,,,,,,,,,,,0.07662911713123322,,,,,, +25,86649,,,,,,,,,,,,0.07014984637498856,,,,,, +25,86699,,,,,,,,,,,,0.07067535817623138,,,,,, +25,86749,,,,,,,,,,,,0.08266565203666687,,,,,, +25,86799,,,,,,,,,,,,0.0648566484451294,,,,,, +25,86849,,,,,,,,,,,,0.06380965560674667,,,,,, +25,86899,,,,,,,,,,,,0.07070762664079666,,,,,, +25,86949,,,,,,,,,,,,0.06973709166049957,,,,,, +25,86999,,,,,,,,,,,,0.06653311103582382,,,,,, +25,87049,,,,,,,,,,,,0.07749582827091217,,,,,, +25,87099,,,,,,,,,,,,0.06122228875756264,,,,,, +25,87149,,,,,,,,,,,,0.07811538875102997,,,,,, +25,87199,,,,,,,,,,,,0.07071523368358612,,,,,, +25,87249,,,,,,,,,,,,0.08267636597156525,,,,,, +25,87299,,,,,,,,,,,,0.07325195521116257,,,,,, +25,87349,,,,,,,,,,,,0.06252683699131012,,,,,, +25,87399,,,,,,,,,,,,0.06766927242279053,,,,,, +25,87449,,,,,,,,,,,,0.07016202807426453,,,,,, +25,87499,,,,,,,,,,,,0.05995476245880127,,,,,, +25,87549,,,,,,,,,,,,0.06321816146373749,,,,,, +25,87599,,,,,,,,,,,,0.06833358108997345,,,,,, +25,87649,,,,,,,,,,,,0.058099858462810516,,,,,, +25,87699,,,,,,,,,,,,0.07656306773424149,,,,,, +25,87749,,,,,,,,,,,,0.06577491760253906,,,,,, +25,87799,,,,,,,,,,,,0.07354015856981277,,,,,, +25,87849,,,,,,,,,,,,0.07590442150831223,,,,,, +25,87899,,,,,,,,,,,,0.0994688868522644,,,,,, +25,87949,,,,,,,,,,,,0.08170346915721893,,,,,, +25,87999,,,,,,,,,,,,0.07647894322872162,,,,,, +25,88049,,,,,,,,,,,,0.0830732136964798,,,,,, +25,88099,,,,,,,,,,,,0.06585508584976196,,,,,, +25,88149,,,,,,,,,,,,0.07344257831573486,,,,,, +25,88199,,,,,,,,,,,,0.07644004374742508,,,,,, +25,88249,,,,,,,,,,,,0.08198580145835876,,,,,, +25,88299,,,,,,,,,,,,0.05843200907111168,,,,,, +25,88349,,,,,,,,,,,,0.07016138732433319,,,,,, +25,88399,,,,,,,,,,,,0.06700152158737183,,,,,, +25,88449,,,,,,,,,,,,0.06396139413118362,,,,,, +25,88499,,,,,,,,,,,,0.06955478340387344,,,,,, +25,88549,,,,,,,,,,,,0.06276586651802063,,,,,, +25,88599,,,,,,,,,,,,0.0777459442615509,,,,,, +25,88649,,,,,,,,,,,,0.06767792254686356,,,,,, +25,88699,,,,,,,,,,,,0.07977332174777985,,,,,, +25,88749,,,,,,,,,,,,0.07126900553703308,,,,,, +25,88799,,,,,,,,,,,,0.08222082257270813,,,,,, +25,88849,,,,,,,,,,,,0.07943638414144516,,,,,, +25,88899,,,,,,,,,,,,0.06932869553565979,,,,,, +25,88949,,,,,,,,,,,,0.07148995995521545,,,,,, +25,88999,,,,,,,,,,,,0.07920297980308533,,,,,, +25,89049,,,,,,,,,,,,0.07784523069858551,,,,,, +25,89099,,,,,,,,,,,,0.05582326650619507,,,,,, +25,89149,,,,,,,,,,,,0.06433740258216858,,,,,, +25,89199,,,,,,,,,,,,0.0757676213979721,,,,,, +25,89249,,,,,,,,,,,,0.07120364904403687,,,,,, +25,89299,,,,,,,,,,,,0.07589253783226013,,,,,, +25,89349,,,,,,,,,,,,0.0654880478978157,,,,,, +25,89399,,,,,,,,,,,,0.07461238652467728,,,,,, +25,89449,,,,,,,,,,,,0.0789918452501297,,,,,, +25,89499,,,,,,,,,,,,0.0701274499297142,,,,,, +25,89543,,,,,,,,,,,,,0.23941949009895325,0.07770263403654099,0.2459835708141327,0.0600094199180603,0.22545501589775085,0.07770263403654099 +25,89543,,,,,,,0.2296312302350998,0.07445146143436432,0.32712846994400024,0.10407078266143799,0.32720404863357544,,,,,,, +26,89549,,,,,,,,,,,,0.07236789166927338,,,,,, +26,89599,,,,,,,,,,,,0.06606101989746094,,,,,, +26,89649,,,,,,,,,,,,0.06817929446697235,,,,,, +26,89699,,,,,,,,,,,,0.07561502605676651,,,,,, +26,89749,,,,,,,,,,,,0.0796533077955246,,,,,, +26,89799,,,,,,,,,,,,0.08010023832321167,,,,,, +26,89849,,,,,,,,,,,,0.07741487771272659,,,,,, +26,89899,,,,,,,,,,,,0.07194629311561584,,,,,, +26,89949,,,,,,,,,,,,0.07688140124082565,,,,,, +26,89999,,,,,,,,,,,,0.06686178594827652,,,,,, +26,90049,,,,,,,,,,,,0.07808186113834381,,,,,, +26,90099,,,,,,,,,,,,0.07113688439130783,,,,,, +26,90149,,,,,,,,,,,,0.0781436637043953,,,,,, +26,90199,,,,,,,,,,,,0.07299485057592392,,,,,, +26,90249,,,,,,,,,,,,0.06592434644699097,,,,,, +26,90299,,,,,,,,,,,,0.08112744987010956,,,,,, +26,90349,,,,,,,,,,,,0.06791670620441437,,,,,, +26,90399,,,,,,,,,,,,0.06720651686191559,,,,,, +26,90449,,,,,,,,,,,,0.07139688730239868,,,,,, +26,90499,,,,,,,,,,,,0.06678573042154312,,,,,, +26,90549,,,,,,,,,,,,0.0666871964931488,,,,,, +26,90599,,,,,,,,,,,,0.08380287140607834,,,,,, +26,90649,,,,,,,,,,,,0.06942000985145569,,,,,, +26,90699,,,,,,,,,,,,0.08083491027355194,,,,,, +26,90749,,,,,,,,,,,,0.07226480543613434,,,,,, +26,90799,,,,,,,,,,,,0.06550349295139313,,,,,, +26,90849,,,,,,,,,,,,0.07361097633838654,,,,,, +26,90899,,,,,,,,,,,,0.06869523972272873,,,,,, +26,90949,,,,,,,,,,,,0.06484203785657883,,,,,, +26,90999,,,,,,,,,,,,0.07110124826431274,,,,,, +26,91049,,,,,,,,,,,,0.07431947439908981,,,,,, +26,91099,,,,,,,,,,,,0.06586158275604248,,,,,, +26,91149,,,,,,,,,,,,0.0645095705986023,,,,,, +26,91199,,,,,,,,,,,,0.0692828893661499,,,,,, +26,91249,,,,,,,,,,,,0.06844089925289154,,,,,, +26,91299,,,,,,,,,,,,0.06915952265262604,,,,,, +26,91349,,,,,,,,,,,,0.07365058362483978,,,,,, +26,91399,,,,,,,,,,,,0.06097858399152756,,,,,, +26,91449,,,,,,,,,,,,0.07039070129394531,,,,,, +26,91499,,,,,,,,,,,,0.0620809942483902,,,,,, +26,91549,,,,,,,,,,,,0.06593291461467743,,,,,, +26,91599,,,,,,,,,,,,0.06711272895336151,,,,,, +26,91649,,,,,,,,,,,,0.06825000047683716,,,,,, +26,91699,,,,,,,,,,,,0.07437139004468918,,,,,, +26,91749,,,,,,,,,,,,0.07557035982608795,,,,,, +26,91799,,,,,,,,,,,,0.07639840990304947,,,,,, +26,91849,,,,,,,,,,,,0.07069508731365204,,,,,, +26,91899,,,,,,,,,,,,0.06478258222341537,,,,,, +26,91949,,,,,,,,,,,,0.08172129839658737,,,,,, +26,91999,,,,,,,,,,,,0.07380914688110352,,,,,, +26,92049,,,,,,,,,,,,0.06997642666101456,,,,,, +26,92099,,,,,,,,,,,,0.08576875925064087,,,,,, +26,92149,,,,,,,,,,,,0.07608813047409058,,,,,, +26,92199,,,,,,,,,,,,0.07092954218387604,,,,,, +26,92249,,,,,,,,,,,,0.07556997239589691,,,,,, +26,92299,,,,,,,,,,,,0.08153817057609558,,,,,, +26,92349,,,,,,,,,,,,0.07174691557884216,,,,,, +26,92399,,,,,,,,,,,,0.07920718938112259,,,,,, +26,92449,,,,,,,,,,,,0.07047851383686066,,,,,, +26,92499,,,,,,,,,,,,0.06904483586549759,,,,,, +26,92549,,,,,,,,,,,,0.08425182104110718,,,,,, +26,92599,,,,,,,,,,,,0.07217565178871155,,,,,, +26,92649,,,,,,,,,,,,0.06709054857492447,,,,,, +26,92699,,,,,,,,,,,,0.05717553198337555,,,,,, +26,92749,,,,,,,,,,,,0.06597919762134552,,,,,, +26,92799,,,,,,,,,,,,0.06805083155632019,,,,,, +26,92849,,,,,,,,,,,,0.08202207833528519,,,,,, +26,92899,,,,,,,,,,,,0.07130912691354752,,,,,, +26,92949,,,,,,,,,,,,0.08878792077302933,,,,,, +26,92987,,,,,,,,,,,,,0.2379118651151657,0.07717263698577881,0.25776341557502747,0.0664210319519043,0.23594503104686737,0.07717263698577881 +26,92987,,,,,,,0.2263803780078888,0.07163811475038528,0.37158694863319397,0.1379287838935852,0.3562561571598053,,,,,,, +27,92999,,,,,,,,,,,,0.07004096359014511,,,,,, +27,93049,,,,,,,,,,,,0.058422625064849854,,,,,, +27,93099,,,,,,,,,,,,0.06564721465110779,,,,,, +27,93149,,,,,,,,,,,,0.06308048963546753,,,,,, +27,93199,,,,,,,,,,,,0.06481758505105972,,,,,, +27,93249,,,,,,,,,,,,0.07424020022153854,,,,,, +27,93299,,,,,,,,,,,,0.06484804302453995,,,,,, +27,93349,,,,,,,,,,,,0.08031024783849716,,,,,, +27,93399,,,,,,,,,,,,0.08485245704650879,,,,,, +27,93449,,,,,,,,,,,,0.08221577107906342,,,,,, +27,93499,,,,,,,,,,,,0.06569118052721024,,,,,, +27,93549,,,,,,,,,,,,0.07529185712337494,,,,,, +27,93599,,,,,,,,,,,,0.07382505387067795,,,,,, +27,93649,,,,,,,,,,,,0.07022204995155334,,,,,, +27,93699,,,,,,,,,,,,0.07035238295793533,,,,,, +27,93749,,,,,,,,,,,,0.06286564469337463,,,,,, +27,93799,,,,,,,,,,,,0.0858522430062294,,,,,, +27,93849,,,,,,,,,,,,0.06449830532073975,,,,,, +27,93899,,,,,,,,,,,,0.08072656393051147,,,,,, +27,93949,,,,,,,,,,,,0.07315654307603836,,,,,, +27,93999,,,,,,,,,,,,0.06823510676622391,,,,,, +27,94049,,,,,,,,,,,,0.06611895561218262,,,,,, +27,94099,,,,,,,,,,,,0.07097461074590683,,,,,, +27,94149,,,,,,,,,,,,0.07156188040971756,,,,,, +27,94199,,,,,,,,,,,,0.0734999030828476,,,,,, +27,94249,,,,,,,,,,,,0.07846546173095703,,,,,, +27,94299,,,,,,,,,,,,0.07600143551826477,,,,,, +27,94349,,,,,,,,,,,,0.06407284736633301,,,,,, +27,94399,,,,,,,,,,,,0.08076369762420654,,,,,, +27,94449,,,,,,,,,,,,0.061367813497781754,,,,,, +27,94499,,,,,,,,,,,,0.07291039824485779,,,,,, +27,94549,,,,,,,,,,,,0.07410334795713425,,,,,, +27,94599,,,,,,,,,,,,0.0643586739897728,,,,,, +27,94649,,,,,,,,,,,,0.07080166041851044,,,,,, +27,94699,,,,,,,,,,,,0.06578086316585541,,,,,, +27,94749,,,,,,,,,,,,0.066897913813591,,,,,, +27,94799,,,,,,,,,,,,0.06663435697555542,,,,,, +27,94849,,,,,,,,,,,,0.07323934137821198,,,,,, +27,94899,,,,,,,,,,,,0.05943373590707779,,,,,, +27,94949,,,,,,,,,,,,0.07374517619609833,,,,,, +27,94999,,,,,,,,,,,,0.07113376259803772,,,,,, +27,95049,,,,,,,,,,,,0.0714968740940094,,,,,, +27,95099,,,,,,,,,,,,0.06676482409238815,,,,,, +27,95149,,,,,,,,,,,,0.06597919762134552,,,,,, +27,95199,,,,,,,,,,,,0.08378130197525024,,,,,, +27,95249,,,,,,,,,,,,0.0873335599899292,,,,,, +27,95299,,,,,,,,,,,,0.06361202895641327,,,,,, +27,95349,,,,,,,,,,,,0.06616149842739105,,,,,, +27,95399,,,,,,,,,,,,0.08027436584234238,,,,,, +27,95449,,,,,,,,,,,,0.0822373628616333,,,,,, +27,95499,,,,,,,,,,,,0.06494475901126862,,,,,, +27,95549,,,,,,,,,,,,0.07365190237760544,,,,,, +27,95599,,,,,,,,,,,,0.06415446847677231,,,,,, +27,95649,,,,,,,,,,,,0.06851580739021301,,,,,, +27,95699,,,,,,,,,,,,0.07444731891155243,,,,,, +27,95749,,,,,,,,,,,,0.07114380598068237,,,,,, +27,95799,,,,,,,,,,,,0.0644490122795105,,,,,, +27,95849,,,,,,,,,,,,0.0790729820728302,,,,,, +27,95899,,,,,,,,,,,,0.07508201152086258,,,,,, +27,95949,,,,,,,,,,,,0.07782812416553497,,,,,, +27,95999,,,,,,,,,,,,0.0675201267004013,,,,,, +27,96049,,,,,,,,,,,,0.06724511086940765,,,,,, +27,96099,,,,,,,,,,,,0.0697750449180603,,,,,, +27,96149,,,,,,,,,,,,0.07987327873706818,,,,,, +27,96199,,,,,,,,,,,,0.07260341197252274,,,,,, +27,96249,,,,,,,,,,,,0.07134321331977844,,,,,, +27,96299,,,,,,,,,,,,0.06952020525932312,,,,,, +27,96349,,,,,,,,,,,,0.07858417928218842,,,,,, +27,96399,,,,,,,,,,,,0.07046593725681305,,,,,, +27,96431,,,,,,,,,,,,,0.23891252279281616,0.07734839618206024,0.26095104217529297,0.06429481506347656,0.2326795905828476,0.07734839618206024 +27,96431,,,,,,,0.22545255720615387,0.07129096984863281,0.377301961183548,0.14211076498031616,0.362552672624588,,,,,,, +28,96449,,,,,,,,,,,,0.06437285989522934,,,,,, +28,96499,,,,,,,,,,,,0.06807355582714081,,,,,, +28,96549,,,,,,,,,,,,0.07175040990114212,,,,,, +28,96599,,,,,,,,,,,,0.0692068487405777,,,,,, +28,96649,,,,,,,,,,,,0.08314413577318192,,,,,, +28,96699,,,,,,,,,,,,0.08293373882770538,,,,,, +28,96749,,,,,,,,,,,,0.0676640123128891,,,,,, +28,96799,,,,,,,,,,,,0.07706423848867416,,,,,, +28,96849,,,,,,,,,,,,0.06500105559825897,,,,,, +28,96899,,,,,,,,,,,,0.09114663302898407,,,,,, +28,96949,,,,,,,,,,,,0.07313833385705948,,,,,, +28,96999,,,,,,,,,,,,0.07005487382411957,,,,,, +28,97049,,,,,,,,,,,,0.07099245488643646,,,,,, +28,97099,,,,,,,,,,,,0.07726137340068817,,,,,, +28,97149,,,,,,,,,,,,0.06658244132995605,,,,,, +28,97199,,,,,,,,,,,,0.06907311081886292,,,,,, +28,97249,,,,,,,,,,,,0.059412408620119095,,,,,, +28,97299,,,,,,,,,,,,0.06915856897830963,,,,,, +28,97349,,,,,,,,,,,,0.06723984330892563,,,,,, +28,97399,,,,,,,,,,,,0.06984885782003403,,,,,, +28,97449,,,,,,,,,,,,0.06312598288059235,,,,,, +28,97499,,,,,,,,,,,,0.0708286315202713,,,,,, +28,97549,,,,,,,,,,,,0.0788264125585556,,,,,, +28,97599,,,,,,,,,,,,0.06381529569625854,,,,,, +28,97649,,,,,,,,,,,,0.08310981094837189,,,,,, +28,97699,,,,,,,,,,,,0.0819476842880249,,,,,, +28,97749,,,,,,,,,,,,0.06045942381024361,,,,,, +28,97799,,,,,,,,,,,,0.07059638202190399,,,,,, +28,97849,,,,,,,,,,,,0.06195918098092079,,,,,, +28,97899,,,,,,,,,,,,0.07932576537132263,,,,,, +28,97949,,,,,,,,,,,,0.05742731690406799,,,,,, +28,97999,,,,,,,,,,,,0.08112561702728271,,,,,, +28,98049,,,,,,,,,,,,0.06785215437412262,,,,,, +28,98099,,,,,,,,,,,,0.08286425471305847,,,,,, +28,98149,,,,,,,,,,,,0.08537092059850693,,,,,, +28,98199,,,,,,,,,,,,0.06888516247272491,,,,,, +28,98249,,,,,,,,,,,,0.07465602457523346,,,,,, +28,98299,,,,,,,,,,,,0.06919720023870468,,,,,, +28,98349,,,,,,,,,,,,0.07429184019565582,,,,,, +28,98399,,,,,,,,,,,,0.0745147317647934,,,,,, +28,98449,,,,,,,,,,,,0.06620481610298157,,,,,, +28,98499,,,,,,,,,,,,0.07829319685697556,,,,,, +28,98549,,,,,,,,,,,,0.08005904406309128,,,,,, +28,98599,,,,,,,,,,,,0.06701060384511948,,,,,, +28,98649,,,,,,,,,,,,0.07286953926086426,,,,,, +28,98699,,,,,,,,,,,,0.07233615964651108,,,,,, +28,98749,,,,,,,,,,,,0.06594111025333405,,,,,, +28,98799,,,,,,,,,,,,0.06349600851535797,,,,,, +28,98849,,,,,,,,,,,,0.07466775923967361,,,,,, +28,98899,,,,,,,,,,,,0.07225533574819565,,,,,, +28,98949,,,,,,,,,,,,0.07135666161775589,,,,,, +28,98999,,,,,,,,,,,,0.08551372587680817,,,,,, +28,99049,,,,,,,,,,,,0.07433110475540161,,,,,, +28,99099,,,,,,,,,,,,0.06649366021156311,,,,,, +28,99149,,,,,,,,,,,,0.07380186021327972,,,,,, +28,99199,,,,,,,,,,,,0.08353531360626221,,,,,, +28,99249,,,,,,,,,,,,0.05900297686457634,,,,,, +28,99299,,,,,,,,,,,,0.07078318297863007,,,,,, +28,99349,,,,,,,,,,,,0.07079031318426132,,,,,, +28,99399,,,,,,,,,,,,0.06774254888296127,,,,,, +28,99449,,,,,,,,,,,,0.06994810700416565,,,,,, +28,99499,,,,,,,,,,,,0.07598775625228882,,,,,, +28,99549,,,,,,,,,,,,0.07479287683963776,,,,,, +28,99599,,,,,,,,,,,,0.06693719327449799,,,,,, +28,99649,,,,,,,,,,,,0.07943035662174225,,,,,, +28,99699,,,,,,,,,,,,1.1774884462356567,,,,,, +28,99749,,,,,,,,,,,,0.08149684220552444,,,,,, +28,99799,,,,,,,,,,,,0.06727093458175659,,,,,, +28,99849,,,,,,,,,,,,0.07025399059057236,,,,,, +28,99875,,,,,,,,,,,,,0.23749077320098877,0.0769784078001976,0.2622576355934143,0.0687706470489502,0.23259267210960388,0.0769784078001976 +28,99875,,,,,,,0.22579313814640045,0.0717325285077095,0.37069860100746155,0.13680607080459595,0.3588569760322571,,,,,,, +29,99899,,,,,,,,,,,,0.07041236758232117,,,,,, +29,99949,,,,,,,,,,,,0.07452034950256348,,,,,, +29,99999,,,,,,,,,,,,0.0751834362745285,,,,,, +29,100049,,,,,,,,,,,,0.07127156853675842,,,,,, +29,100099,,,,,,,,,,,,0.0712798684835434,,,,,, +29,100149,,,,,,,,,,,,0.0753985345363617,,,,,, +29,100199,,,,,,,,,,,,0.07581673562526703,,,,,, +29,100249,,,,,,,,,,,,0.07173006236553192,,,,,, +29,100299,,,,,,,,,,,,0.07080972194671631,,,,,, +29,100349,,,,,,,,,,,,0.06221163645386696,,,,,, +29,100399,,,,,,,,,,,,0.08029082417488098,,,,,, +29,100449,,,,,,,,,,,,0.06900584697723389,,,,,, +29,100499,,,,,,,,,,,,0.06821559369564056,,,,,, +29,100549,,,,,,,,,,,,0.08169936388731003,,,,,, +29,100599,,,,,,,,,,,,0.07207620143890381,,,,,, +29,100649,,,,,,,,,,,,0.07399240881204605,,,,,, +29,100699,,,,,,,,,,,,0.06637592613697052,,,,,, +29,100749,,,,,,,,,,,,0.07169850170612335,,,,,, +29,100799,,,,,,,,,,,,0.0708262175321579,,,,,, +29,100849,,,,,,,,,,,,0.06720130890607834,,,,,, +29,100899,,,,,,,,,,,,0.06836435943841934,,,,,, +29,100949,,,,,,,,,,,,0.06731951236724854,,,,,, +29,100999,,,,,,,,,,,,0.06452221423387527,,,,,, +29,101049,,,,,,,,,,,,0.08104988187551498,,,,,, +29,101099,,,,,,,,,,,,0.08533166348934174,,,,,, +29,101149,,,,,,,,,,,,0.08150623738765717,,,,,, +29,101199,,,,,,,,,,,,0.06317715346813202,,,,,, +29,101249,,,,,,,,,,,,0.08146960288286209,,,,,, +29,101299,,,,,,,,,,,,0.07791224122047424,,,,,, +29,101349,,,,,,,,,,,,0.057947516441345215,,,,,, +29,101399,,,,,,,,,,,,0.06734117865562439,,,,,, +29,101449,,,,,,,,,,,,0.07434993982315063,,,,,, +29,101499,,,,,,,,,,,,0.05890114605426788,,,,,, +29,101549,,,,,,,,,,,,0.07629915326833725,,,,,, +29,101599,,,,,,,,,,,,0.07429815828800201,,,,,, +29,101649,,,,,,,,,,,,0.08128650486469269,,,,,, +29,101699,,,,,,,,,,,,0.07319965958595276,,,,,, +29,101749,,,,,,,,,,,,0.06663428246974945,,,,,, +29,101799,,,,,,,,,,,,0.07529111951589584,,,,,, +29,101849,,,,,,,,,,,,0.0711929202079773,,,,,, +29,101899,,,,,,,,,,,,0.06847472488880157,,,,,, +29,101949,,,,,,,,,,,,0.06542603671550751,,,,,, +29,101999,,,,,,,,,,,,0.07759944349527359,,,,,, +29,102049,,,,,,,,,,,,0.07281021028757095,,,,,, +29,102099,,,,,,,,,,,,0.06680238246917725,,,,,, +29,102149,,,,,,,,,,,,0.0662536770105362,,,,,, +29,102199,,,,,,,,,,,,0.0691470354795456,,,,,, +29,102249,,,,,,,,,,,,0.06335016340017319,,,,,, +29,102299,,,,,,,,,,,,0.06748242676258087,,,,,, +29,102349,,,,,,,,,,,,0.07826364785432816,,,,,, +29,102399,,,,,,,,,,,,0.0730595588684082,,,,,, +29,102449,,,,,,,,,,,,0.07742393016815186,,,,,, +29,102499,,,,,,,,,,,,0.07166595011949539,,,,,, +29,102549,,,,,,,,,,,,0.06590445339679718,,,,,, +29,102599,,,,,,,,,,,,0.07551190257072449,,,,,, +29,102649,,,,,,,,,,,,0.0772712379693985,,,,,, +29,102699,,,,,,,,,,,,0.0741814523935318,,,,,, +29,102749,,,,,,,,,,,,0.08790924400091171,,,,,, +29,102799,,,,,,,,,,,,0.072224460542202,,,,,, +29,102849,,,,,,,,,,,,0.06933258473873138,,,,,, +29,102899,,,,,,,,,,,,0.07229575514793396,,,,,, +29,102949,,,,,,,,,,,,0.07185402512550354,,,,,, +29,102999,,,,,,,,,,,,0.07260581851005554,,,,,, +29,103049,,,,,,,,,,,,0.06681643426418304,,,,,, +29,103099,,,,,,,,,,,,0.07264229655265808,,,,,, +29,103149,,,,,,,,,,,,0.07050195336341858,,,,,, +29,103199,,,,,,,,,,,,0.07363161444664001,,,,,, +29,103249,,,,,,,,,,,,0.0725550651550293,,,,,, +29,103299,,,,,,,,,,,,0.07096268981695175,,,,,, +29,103319,,,,,,,,,,,,,0.2372291088104248,0.0773945078253746,0.2648800015449524,0.06373697519302368,0.23568421602249146,0.0773945078253746 +29,103319,,,,,,,0.22642743587493896,0.0717758908867836,0.36953020095825195,0.13627338409423828,0.3551838994026184,,,,,,, +30,103349,,,,,,,,,,,,0.07298780232667923,,,,,, +30,103399,,,,,,,,,,,,0.0754624679684639,,,,,, +30,103449,,,,,,,,,,,,0.072822704911232,,,,,, +30,103499,,,,,,,,,,,,0.0850234255194664,,,,,, +30,103549,,,,,,,,,,,,0.07612619549036026,,,,,, +30,103599,,,,,,,,,,,,0.07038355618715286,,,,,, +30,103649,,,,,,,,,,,,0.07539775222539902,,,,,, +30,103699,,,,,,,,,,,,0.06190943345427513,,,,,, +30,103749,,,,,,,,,,,,0.08065369725227356,,,,,, +30,103799,,,,,,,,,,,,0.06740234047174454,,,,,, +30,103849,,,,,,,,,,,,0.06402091681957245,,,,,, +30,103899,,,,,,,,,,,,0.0721389502286911,,,,,, +30,103949,,,,,,,,,,,,0.06613802909851074,,,,,, +30,103999,,,,,,,,,,,,0.06534992158412933,,,,,, +30,104049,,,,,,,,,,,,0.08060150593519211,,,,,, +30,104099,,,,,,,,,,,,0.07384853810071945,,,,,, +30,104149,,,,,,,,,,,,0.06906367838382721,,,,,, +30,104199,,,,,,,,,,,,0.07018018513917923,,,,,, +30,104249,,,,,,,,,,,,0.07890565693378448,,,,,, +30,104299,,,,,,,,,,,,0.06542019546031952,,,,,, +30,104349,,,,,,,,,,,,0.07151594758033752,,,,,, +30,104399,,,,,,,,,,,,0.05844084173440933,,,,,, +30,104449,,,,,,,,,,,,0.07620497047901154,,,,,, +30,104499,,,,,,,,,,,,0.05900367349386215,,,,,, +30,104549,,,,,,,,,,,,0.06622879207134247,,,,,, +30,104599,,,,,,,,,,,,0.06339330971240997,,,,,, +30,104649,,,,,,,,,,,,0.06269513815641403,,,,,, +30,104699,,,,,,,,,,,,0.07121525704860687,,,,,, +30,104749,,,,,,,,,,,,0.0663638561964035,,,,,, +30,104799,,,,,,,,,,,,0.08183617144823074,,,,,, +30,104849,,,,,,,,,,,,0.06984290480613708,,,,,, +30,104899,,,,,,,,,,,,0.0742562785744667,,,,,, +30,104949,,,,,,,,,,,,0.06704875081777573,,,,,, +30,104999,,,,,,,,,,,,0.07187795639038086,,,,,, +30,105049,,,,,,,,,,,,0.059966038912534714,,,,,, +30,105099,,,,,,,,,,,,0.06607318669557571,,,,,, +30,105149,,,,,,,,,,,,0.07627075910568237,,,,,, +30,105199,,,,,,,,,,,,0.05498192831873894,,,,,, +30,105249,,,,,,,,,,,,0.06127914786338806,,,,,, +30,105299,,,,,,,,,,,,0.07642760127782822,,,,,, +30,105349,,,,,,,,,,,,0.06886974722146988,,,,,, +30,105399,,,,,,,,,,,,0.07110229134559631,,,,,, +30,105449,,,,,,,,,,,,0.051245786249637604,,,,,, +30,105499,,,,,,,,,,,,0.07488805055618286,,,,,, +30,105549,,,,,,,,,,,,0.07513485848903656,,,,,, +30,105599,,,,,,,,,,,,0.08237826824188232,,,,,, +30,105649,,,,,,,,,,,,0.06950435042381287,,,,,, +30,105699,,,,,,,,,,,,0.06680727005004883,,,,,, +30,105749,,,,,,,,,,,,0.07072403281927109,,,,,, +30,105799,,,,,,,,,,,,0.06726354360580444,,,,,, +30,105849,,,,,,,,,,,,0.06361854076385498,,,,,, +30,105899,,,,,,,,,,,,0.07118654251098633,,,,,, +30,105949,,,,,,,,,,,,0.07952135801315308,,,,,, +30,105999,,,,,,,,,,,,0.07701191306114197,,,,,, +30,106049,,,,,,,,,,,,0.07042716443538666,,,,,, +30,106099,,,,,,,,,,,,0.06777971982955933,,,,,, +30,106149,,,,,,,,,,,,0.06131329387426376,,,,,, +30,106199,,,,,,,,,,,,0.06901106983423233,,,,,, +30,106249,,,,,,,,,,,,0.06794427335262299,,,,,, +30,106299,,,,,,,,,,,,0.06775294244289398,,,,,, +30,106349,,,,,,,,,,,,0.057933565229177475,,,,,, +30,106399,,,,,,,,,,,,0.07580028474330902,,,,,, +30,106449,,,,,,,,,,,,0.07078951597213745,,,,,, +30,106499,,,,,,,,,,,,0.06546243280172348,,,,,, +30,106549,,,,,,,,,,,,0.0748213604092598,,,,,, +30,106599,,,,,,,,,,,,0.06466157734394073,,,,,, +30,106649,,,,,,,,,,,,0.07012014091014862,,,,,, +30,106699,,,,,,,,,,,,0.07665552198886871,,,,,, +30,106749,,,,,,,,,,,,0.07328830659389496,,,,,, +30,106763,,,,,,,,,,,,,0.2386743724346161,0.07704149186611176,0.26527291536331177,0.06800752878189087,0.23580509424209595,0.07704149186611176 +30,106763,,,,,,,0.22439207136631012,0.07064041495323181,0.38737401366233826,0.1499369740486145,0.37120869755744934,,,,,,, +31,106799,,,,,,,,,,,,0.07165062427520752,,,,,, +31,106849,,,,,,,,,,,,0.06776100397109985,,,,,, +31,106899,,,,,,,,,,,,0.07947036623954773,,,,,, +31,106949,,,,,,,,,,,,0.08078517019748688,,,,,, +31,106999,,,,,,,,,,,,0.06312930583953857,,,,,, +31,107049,,,,,,,,,,,,0.06255558133125305,,,,,, +31,107099,,,,,,,,,,,,0.07149719446897507,,,,,, +31,107149,,,,,,,,,,,,0.07745269685983658,,,,,, +31,107199,,,,,,,,,,,,0.05944165959954262,,,,,, +31,107249,,,,,,,,,,,,0.0653836652636528,,,,,, +31,107299,,,,,,,,,,,,0.06892703473567963,,,,,, +31,107349,,,,,,,,,,,,0.07426100224256516,,,,,, +31,107399,,,,,,,,,,,,0.07472217082977295,,,,,, +31,107449,,,,,,,,,,,,0.07323586940765381,,,,,, +31,107499,,,,,,,,,,,,0.08516846597194672,,,,,, +31,107549,,,,,,,,,,,,0.061190083622932434,,,,,, +31,107599,,,,,,,,,,,,0.06600748747587204,,,,,, +31,107649,,,,,,,,,,,,0.07557941973209381,,,,,, +31,107699,,,,,,,,,,,,0.05868395417928696,,,,,, +31,107749,,,,,,,,,,,,0.06840910762548447,,,,,, +31,107799,,,,,,,,,,,,0.0654655173420906,,,,,, +31,107849,,,,,,,,,,,,0.08127748966217041,,,,,, +31,107899,,,,,,,,,,,,0.07723518460988998,,,,,, +31,107949,,,,,,,,,,,,0.062193840742111206,,,,,, +31,107999,,,,,,,,,,,,0.0703745037317276,,,,,, +31,108049,,,,,,,,,,,,0.07209040224552155,,,,,, +31,108099,,,,,,,,,,,,0.07604604959487915,,,,,, +31,108149,,,,,,,,,,,,0.06760815531015396,,,,,, +31,108199,,,,,,,,,,,,0.06807351112365723,,,,,, +31,108249,,,,,,,,,,,,0.06423763930797577,,,,,, +31,108299,,,,,,,,,,,,0.08063904941082001,,,,,, +31,108349,,,,,,,,,,,,0.06267065554857254,,,,,, +31,108399,,,,,,,,,,,,0.07127552479505539,,,,,, +31,108449,,,,,,,,,,,,0.0639832466840744,,,,,, +31,108499,,,,,,,,,,,,0.06554099917411804,,,,,, +31,108549,,,,,,,,,,,,0.0800318568944931,,,,,, +31,108599,,,,,,,,,,,,0.07907634973526001,,,,,, +31,108649,,,,,,,,,,,,0.06597131490707397,,,,,, +31,108699,,,,,,,,,,,,0.07038816809654236,,,,,, +31,108749,,,,,,,,,,,,0.07102835178375244,,,,,, +31,108799,,,,,,,,,,,,0.07474669814109802,,,,,, +31,108849,,,,,,,,,,,,0.06849139928817749,,,,,, +31,108899,,,,,,,,,,,,0.074167899787426,,,,,, +31,108949,,,,,,,,,,,,0.07522952556610107,,,,,, +31,108999,,,,,,,,,,,,0.07292775809764862,,,,,, +31,109049,,,,,,,,,,,,0.07795251160860062,,,,,, +31,109099,,,,,,,,,,,,0.06792241334915161,,,,,, +31,109149,,,,,,,,,,,,0.07854915410280228,,,,,, +31,109199,,,,,,,,,,,,0.06265633553266525,,,,,, +31,109249,,,,,,,,,,,,0.07901625335216522,,,,,, +31,109299,,,,,,,,,,,,0.0632597804069519,,,,,, +31,109349,,,,,,,,,,,,0.06626534461975098,,,,,, +31,109399,,,,,,,,,,,,0.07734164595603943,,,,,, +31,109449,,,,,,,,,,,,0.060923777520656586,,,,,, +31,109499,,,,,,,,,,,,0.06837452948093414,,,,,, +31,109549,,,,,,,,,,,,0.06675179302692413,,,,,, +31,109599,,,,,,,,,,,,0.06282622367143631,,,,,, +31,109649,,,,,,,,,,,,0.0661366730928421,,,,,, +31,109699,,,,,,,,,,,,0.07224198430776596,,,,,, +31,109749,,,,,,,,,,,,0.08680413663387299,,,,,, +31,109799,,,,,,,,,,,,0.06309738755226135,,,,,, +31,109849,,,,,,,,,,,,0.07470062375068665,,,,,, +31,109899,,,,,,,,,,,,0.07395686954259872,,,,,, +31,109949,,,,,,,,,,,,0.1114206463098526,,,,,, +31,109999,,,,,,,,,,,,0.0746794044971466,,,,,, +31,110049,,,,,,,,,,,,0.08472354710102081,,,,,, +31,110099,,,,,,,,,,,,0.07522675395011902,,,,,, +31,110149,,,,,,,,,,,,0.07949703931808472,,,,,, +31,110199,,,,,,,,,,,,0.07532213628292084,,,,,, +31,110207,,,,,,,,,,,,,0.23870430886745453,0.07740379124879837,0.2541346848011017,0.06362462043762207,0.2207881659269333,0.07740379124879837 +31,110207,,,,,,,0.22563022375106812,0.07594636082649231,0.3236919939517975,0.08608353137969971,0.3604097068309784,,,,,,, +32,110249,,,,,,,,,,,,0.08081008493900299,,,,,, +32,110299,,,,,,,,,,,,0.08100327849388123,,,,,, +32,110349,,,,,,,,,,,,0.07118305563926697,,,,,, +32,110399,,,,,,,,,,,,0.07872292399406433,,,,,, +32,110449,,,,,,,,,,,,0.07613785564899445,,,,,, +32,110499,,,,,,,,,,,,0.08475513756275177,,,,,, +32,110549,,,,,,,,,,,,0.07025718688964844,,,,,, +32,110599,,,,,,,,,,,,0.062048353254795074,,,,,, +32,110649,,,,,,,,,,,,0.07578172534704208,,,,,, +32,110699,,,,,,,,,,,,0.07751579582691193,,,,,, +32,110749,,,,,,,,,,,,0.0835762619972229,,,,,, +32,110799,,,,,,,,,,,,0.07777366042137146,,,,,, +32,110849,,,,,,,,,,,,0.07408437132835388,,,,,, +32,110899,,,,,,,,,,,,0.07595129311084747,,,,,, +32,110949,,,,,,,,,,,,0.07346713542938232,,,,,, +32,110999,,,,,,,,,,,,0.07163572311401367,,,,,, +32,111049,,,,,,,,,,,,0.07779299467802048,,,,,, +32,111099,,,,,,,,,,,,0.07578563690185547,,,,,, +32,111149,,,,,,,,,,,,0.07819391787052155,,,,,, +32,111199,,,,,,,,,,,,0.07657567411661148,,,,,, +32,111249,,,,,,,,,,,,0.07016579806804657,,,,,, +32,111299,,,,,,,,,,,,0.07947931438684464,,,,,, +32,111349,,,,,,,,,,,,0.06469780951738358,,,,,, +32,111399,,,,,,,,,,,,0.07326064258813858,,,,,, +32,111449,,,,,,,,,,,,0.0704890638589859,,,,,, +32,111499,,,,,,,,,,,,0.0760296881198883,,,,,, +32,111549,,,,,,,,,,,,0.07279130816459656,,,,,, +32,111599,,,,,,,,,,,,0.06747031956911087,,,,,, +32,111649,,,,,,,,,,,,0.07341223210096359,,,,,, +32,111699,,,,,,,,,,,,0.06846190989017487,,,,,, +32,111749,,,,,,,,,,,,0.06651835143566132,,,,,, +32,111799,,,,,,,,,,,,0.07101696729660034,,,,,, +32,111849,,,,,,,,,,,,0.0599638968706131,,,,,, +32,111899,,,,,,,,,,,,0.06360901892185211,,,,,, +32,111949,,,,,,,,,,,,0.07426504045724869,,,,,, +32,111999,,,,,,,,,,,,0.07490111142396927,,,,,, +32,112049,,,,,,,,,,,,0.07236623018980026,,,,,, +32,112099,,,,,,,,,,,,0.08269204199314117,,,,,, +32,112149,,,,,,,,,,,,0.06265575438737869,,,,,, +32,112199,,,,,,,,,,,,0.06420058012008667,,,,,, +32,112249,,,,,,,,,,,,0.06677220016717911,,,,,, +32,112299,,,,,,,,,,,,0.06694351136684418,,,,,, +32,112349,,,,,,,,,,,,0.07709744572639465,,,,,, +32,112399,,,,,,,,,,,,0.06537356972694397,,,,,, +32,112449,,,,,,,,,,,,0.08897535502910614,,,,,, +32,112499,,,,,,,,,,,,0.05978861451148987,,,,,, +32,112549,,,,,,,,,,,,0.07356011867523193,,,,,, +32,112599,,,,,,,,,,,,0.07822050899267197,,,,,, +32,112649,,,,,,,,,,,,0.06562487781047821,,,,,, +32,112699,,,,,,,,,,,,0.06798060983419418,,,,,, +32,112749,,,,,,,,,,,,0.0748739242553711,,,,,, +32,112799,,,,,,,,,,,,0.07043866813182831,,,,,, +32,112849,,,,,,,,,,,,0.07124821096658707,,,,,, +32,112899,,,,,,,,,,,,0.07339577376842499,,,,,, +32,112949,,,,,,,,,,,,0.07214658707380295,,,,,, +32,112999,,,,,,,,,,,,0.08233408629894257,,,,,, +32,113049,,,,,,,,,,,,0.07116386294364929,,,,,, +32,113099,,,,,,,,,,,,0.08207724988460541,,,,,, +32,113149,,,,,,,,,,,,0.07819084078073502,,,,,, +32,113199,,,,,,,,,,,,0.06826503574848175,,,,,, +32,113249,,,,,,,,,,,,0.0665278434753418,,,,,, +32,113299,,,,,,,,,,,,0.07501968741416931,,,,,, +32,113349,,,,,,,,,,,,0.07505026459693909,,,,,, +32,113399,,,,,,,,,,,,0.06942637264728546,,,,,, +32,113449,,,,,,,,,,,,0.0762050449848175,,,,,, +32,113499,,,,,,,,,,,,0.07229389995336533,,,,,, +32,113549,,,,,,,,,,,,0.06399784982204437,,,,,, +32,113599,,,,,,,,,,,,0.08300328254699707,,,,,, +32,113649,,,,,,,,,,,,0.07283998280763626,,,,,, +32,113651,,,,,,,,,,,,,0.23734568059444427,0.07693953067064285,0.2660914361476898,0.06924092769622803,0.23892101645469666,0.07693953067064285 +32,113651,,,,,,,0.2272808849811554,0.07218322157859802,0.3629249334335327,0.13137322664260864,0.34825921058654785,,,,,,, +33,113699,,,,,,,,,,,,0.06935784220695496,,,,,, +33,113749,,,,,,,,,,,,0.06705501675605774,,,,,, +33,113799,,,,,,,,,,,,0.07727484405040741,,,,,, +33,113849,,,,,,,,,,,,0.0644606351852417,,,,,, +33,113899,,,,,,,,,,,,0.06763559579849243,,,,,, +33,113949,,,,,,,,,,,,0.07035714387893677,,,,,, +33,113999,,,,,,,,,,,,0.057635996490716934,,,,,, +33,114049,,,,,,,,,,,,0.07439427077770233,,,,,, +33,114099,,,,,,,,,,,,0.08308093249797821,,,,,, +33,114149,,,,,,,,,,,,0.06568591296672821,,,,,, +33,114199,,,,,,,,,,,,0.06885156780481339,,,,,, +33,114249,,,,,,,,,,,,0.0652417540550232,,,,,, +33,114299,,,,,,,,,,,,0.06191901117563248,,,,,, +33,114349,,,,,,,,,,,,0.07027371972799301,,,,,, +33,114399,,,,,,,,,,,,0.07003068923950195,,,,,, +33,114449,,,,,,,,,,,,0.0804644227027893,,,,,, +33,114499,,,,,,,,,,,,0.07372406870126724,,,,,, +33,114549,,,,,,,,,,,,0.06319218873977661,,,,,, +33,114599,,,,,,,,,,,,0.07259996980428696,,,,,, +33,114649,,,,,,,,,,,,0.0811108946800232,,,,,, +33,114699,,,,,,,,,,,,0.060244761407375336,,,,,, +33,114749,,,,,,,,,,,,0.08048786967992783,,,,,, +33,114799,,,,,,,,,,,,0.06690460443496704,,,,,, +33,114849,,,,,,,,,,,,0.08246259391307831,,,,,, +33,114899,,,,,,,,,,,,0.0653931275010109,,,,,, +33,114949,,,,,,,,,,,,0.06230238080024719,,,,,, +33,114999,,,,,,,,,,,,0.06711561977863312,,,,,, +33,115049,,,,,,,,,,,,0.0792546272277832,,,,,, +33,115099,,,,,,,,,,,,0.0749368816614151,,,,,, +33,115149,,,,,,,,,,,,0.08061391115188599,,,,,, +33,115199,,,,,,,,,,,,0.06511784344911575,,,,,, +33,115249,,,,,,,,,,,,0.06996602565050125,,,,,, +33,115299,,,,,,,,,,,,0.07131083309650421,,,,,, +33,115349,,,,,,,,,,,,0.07105332612991333,,,,,, +33,115399,,,,,,,,,,,,0.06982913613319397,,,,,, +33,115449,,,,,,,,,,,,0.07603134214878082,,,,,, +33,115499,,,,,,,,,,,,0.0707644671201706,,,,,, +33,115549,,,,,,,,,,,,0.06799323111772537,,,,,, +33,115599,,,,,,,,,,,,0.06755591928958893,,,,,, +33,115649,,,,,,,,,,,,0.06889031082391739,,,,,, +33,115699,,,,,,,,,,,,0.08255501091480255,,,,,, +33,115749,,,,,,,,,,,,0.06547479331493378,,,,,, +33,115799,,,,,,,,,,,,0.06913509964942932,,,,,, +33,115849,,,,,,,,,,,,0.07915924489498138,,,,,, +33,115899,,,,,,,,,,,,0.07423825562000275,,,,,, +33,115949,,,,,,,,,,,,0.08038090169429779,,,,,, +33,115999,,,,,,,,,,,,0.05961574986577034,,,,,, +33,116049,,,,,,,,,,,,0.07255083322525024,,,,,, +33,116099,,,,,,,,,,,,0.0661594420671463,,,,,, +33,116149,,,,,,,,,,,,0.06953123211860657,,,,,, +33,116199,,,,,,,,,,,,0.07692430168390274,,,,,, +33,116249,,,,,,,,,,,,0.06923982501029968,,,,,, +33,116299,,,,,,,,,,,,0.06740410625934601,,,,,, +33,116349,,,,,,,,,,,,0.0826660767197609,,,,,, +33,116399,,,,,,,,,,,,0.0762176588177681,,,,,, +33,116449,,,,,,,,,,,,0.07752196490764618,,,,,, +33,116499,,,,,,,,,,,,0.07756967842578888,,,,,, +33,116549,,,,,,,,,,,,0.06547185778617859,,,,,, +33,116599,,,,,,,,,,,,0.07976819574832916,,,,,, +33,116649,,,,,,,,,,,,0.07452172785997391,,,,,, +33,116699,,,,,,,,,,,,0.06166229397058487,,,,,, +33,116749,,,,,,,,,,,,0.07083126157522202,,,,,, +33,116799,,,,,,,,,,,,0.06227705255150795,,,,,, +33,116849,,,,,,,,,,,,0.07458086311817169,,,,,, +33,116899,,,,,,,,,,,,0.05614972114562988,,,,,, +33,116949,,,,,,,,,,,,0.06900257617235184,,,,,, +33,116999,,,,,,,,,,,,0.07121055573225021,,,,,, +33,117049,,,,,,,,,,,,0.0772799551486969,,,,,, +33,117095,,,,,,,,,,,,,0.24071305990219116,0.07794051617383957,0.26165077090263367,0.05713176727294922,0.2311355322599411,0.07794051617383957 +33,117095,,,,,,,0.22582627832889557,0.0715547576546669,0.37331798672676086,0.13891589641571045,0.35986366868019104,,,,,,, +34,117099,,,,,,,,,,,,0.0773056149482727,,,,,, +34,117149,,,,,,,,,,,,0.07769493013620377,,,,,, +34,117199,,,,,,,,,,,,0.06551370769739151,,,,,, +34,117249,,,,,,,,,,,,0.07241921126842499,,,,,, +34,117299,,,,,,,,,,,,0.06494732201099396,,,,,, +34,117349,,,,,,,,,,,,0.07838685065507889,,,,,, +34,117399,,,,,,,,,,,,0.07131615281105042,,,,,, +34,117449,,,,,,,,,,,,0.07912427932024002,,,,,, +34,117499,,,,,,,,,,,,0.07107596099376678,,,,,, +34,117549,,,,,,,,,,,,0.06328774243593216,,,,,, +34,117599,,,,,,,,,,,,0.06832447648048401,,,,,, +34,117649,,,,,,,,,,,,0.07952941954135895,,,,,, +34,117699,,,,,,,,,,,,0.06460097432136536,,,,,, +34,117749,,,,,,,,,,,,0.06709910184144974,,,,,, +34,117799,,,,,,,,,,,,0.07167725265026093,,,,,, +34,117849,,,,,,,,,,,,0.06130102276802063,,,,,, +34,117899,,,,,,,,,,,,0.07340899109840393,,,,,, +34,117949,,,,,,,,,,,,0.07038488984107971,,,,,, +34,117999,,,,,,,,,,,,0.07237894088029861,,,,,, +34,118049,,,,,,,,,,,,0.08272507786750793,,,,,, +34,118099,,,,,,,,,,,,0.07731091976165771,,,,,, +34,118149,,,,,,,,,,,,0.07659664750099182,,,,,, +34,118199,,,,,,,,,,,,0.07581153512001038,,,,,, +34,118249,,,,,,,,,,,,0.06737112253904343,,,,,, +34,118299,,,,,,,,,,,,0.0711219310760498,,,,,, +34,118349,,,,,,,,,,,,0.06712725758552551,,,,,, +34,118399,,,,,,,,,,,,0.07243242114782333,,,,,, +34,118449,,,,,,,,,,,,0.07011694461107254,,,,,, +34,118499,,,,,,,,,,,,0.06161178648471832,,,,,, +34,118549,,,,,,,,,,,,0.06970621645450592,,,,,, +34,118599,,,,,,,,,,,,0.0771169513463974,,,,,, +34,118649,,,,,,,,,,,,0.07220090180635452,,,,,, +34,118699,,,,,,,,,,,,0.06515522301197052,,,,,, +34,118749,,,,,,,,,,,,0.08044099807739258,,,,,, +34,118799,,,,,,,,,,,,0.07900214195251465,,,,,, +34,118849,,,,,,,,,,,,0.08391456305980682,,,,,, +34,118899,,,,,,,,,,,,0.0828317180275917,,,,,, +34,118949,,,,,,,,,,,,0.07931055128574371,,,,,, +34,118999,,,,,,,,,,,,0.07006512582302094,,,,,, +34,119049,,,,,,,,,,,,0.07302148640155792,,,,,, +34,119099,,,,,,,,,,,,0.08138410747051239,,,,,, +34,119149,,,,,,,,,,,,0.07514774799346924,,,,,, +34,119199,,,,,,,,,,,,0.07869237661361694,,,,,, +34,119249,,,,,,,,,,,,0.07281413674354553,,,,,, +34,119299,,,,,,,,,,,,0.0791965126991272,,,,,, +34,119349,,,,,,,,,,,,0.0780029147863388,,,,,, +34,119399,,,,,,,,,,,,0.08022212982177734,,,,,, +34,119449,,,,,,,,,,,,0.05270345136523247,,,,,, +34,119499,,,,,,,,,,,,0.07474613189697266,,,,,, +34,119549,,,,,,,,,,,,0.06656599044799805,,,,,, +34,119599,,,,,,,,,,,,0.06701189279556274,,,,,, +34,119649,,,,,,,,,,,,0.061573371291160583,,,,,, +34,119699,,,,,,,,,,,,0.09222494810819626,,,,,, +34,119749,,,,,,,,,,,,0.07825641334056854,,,,,, +34,119799,,,,,,,,,,,,0.0700506642460823,,,,,, +34,119849,,,,,,,,,,,,0.07189374417066574,,,,,, +34,119899,,,,,,,,,,,,0.06886419653892517,,,,,, +34,119949,,,,,,,,,,,,0.07232878357172012,,,,,, +34,119999,,,,,,,,,,,,0.07130606472492218,,,,,, +34,120049,,,,,,,,,,,,0.061823077499866486,,,,,, +34,120099,,,,,,,,,,,,0.07108476012945175,,,,,, +34,120149,,,,,,,,,,,,0.07058589160442352,,,,,, +34,120199,,,,,,,,,,,,0.06600092351436615,,,,,, +34,120249,,,,,,,,,,,,0.07428160309791565,,,,,, +34,120299,,,,,,,,,,,,0.06623993813991547,,,,,, +34,120349,,,,,,,,,,,,0.06941141188144684,,,,,, +34,120399,,,,,,,,,,,,0.07260629534721375,,,,,, +34,120449,,,,,,,,,,,,0.06584613025188446,,,,,, +34,120499,,,,,,,,,,,,0.08193553984165192,,,,,, +34,120539,,,,,,,,,,,,,0.23858143389225006,0.07738159596920013,0.2641768753528595,0.0638931393623352,0.23674950003623962,0.07738159596920013 +34,120539,,,,,,,0.2276296317577362,0.07274994999170303,0.3543855845928192,0.12454932928085327,0.3453383147716522,,,,,,, +35,120549,,,,,,,,,,,,0.08641915768384933,,,,,, +35,120599,,,,,,,,,,,,0.07191102206707001,,,,,, +35,120649,,,,,,,,,,,,0.07384255528450012,,,,,, +35,120699,,,,,,,,,,,,0.056784629821777344,,,,,, +35,120749,,,,,,,,,,,,0.0714692696928978,,,,,, +35,120799,,,,,,,,,,,,0.07750384509563446,,,,,, +35,120849,,,,,,,,,,,,0.07159657776355743,,,,,, +35,120899,,,,,,,,,,,,0.07008478790521622,,,,,, +35,120949,,,,,,,,,,,,0.07345536351203918,,,,,, +35,120999,,,,,,,,,,,,0.06469066441059113,,,,,, +35,121049,,,,,,,,,,,,0.07182362675666809,,,,,, +35,121099,,,,,,,,,,,,0.07527069747447968,,,,,, +35,121149,,,,,,,,,,,,0.06583070755004883,,,,,, +35,121199,,,,,,,,,,,,0.06853843480348587,,,,,, +35,121249,,,,,,,,,,,,0.0714358389377594,,,,,, +35,121299,,,,,,,,,,,,0.06207513436675072,,,,,, +35,121349,,,,,,,,,,,,0.07500487565994263,,,,,, +35,121399,,,,,,,,,,,,0.07326215505599976,,,,,, +35,121449,,,,,,,,,,,,0.07901342213153839,,,,,, +35,121499,,,,,,,,,,,,0.05556735023856163,,,,,, +35,121549,,,,,,,,,,,,0.07185928523540497,,,,,, +35,121599,,,,,,,,,,,,0.06380224227905273,,,,,, +35,121649,,,,,,,,,,,,0.06481647491455078,,,,,, +35,121699,,,,,,,,,,,,0.06904328614473343,,,,,, +35,121749,,,,,,,,,,,,0.05025048553943634,,,,,, +35,121799,,,,,,,,,,,,0.07172621786594391,,,,,, +35,121849,,,,,,,,,,,,0.07085710763931274,,,,,, +35,121899,,,,,,,,,,,,0.0748402550816536,,,,,, +35,121949,,,,,,,,,,,,0.0759248286485672,,,,,, +35,121999,,,,,,,,,,,,0.07410138845443726,,,,,, +35,122049,,,,,,,,,,,,0.09527374804019928,,,,,, +35,122099,,,,,,,,,,,,0.08004211634397507,,,,,, +35,122149,,,,,,,,,,,,0.06978148221969604,,,,,, +35,122199,,,,,,,,,,,,0.07135054469108582,,,,,, +35,122249,,,,,,,,,,,,0.07836435735225677,,,,,, +35,122299,,,,,,,,,,,,0.06688585877418518,,,,,, +35,122349,,,,,,,,,,,,0.0716344490647316,,,,,, +35,122399,,,,,,,,,,,,0.06999310106039047,,,,,, +35,122449,,,,,,,,,,,,0.061828240752220154,,,,,, +35,122499,,,,,,,,,,,,0.06771482527256012,,,,,, +35,122549,,,,,,,,,,,,0.07897065579891205,,,,,, +35,122599,,,,,,,,,,,,0.07126718759536743,,,,,, +35,122649,,,,,,,,,,,,0.07583558559417725,,,,,, +35,122699,,,,,,,,,,,,0.0776524618268013,,,,,, +35,122749,,,,,,,,,,,,0.06215674802660942,,,,,, +35,122799,,,,,,,,,,,,0.09955984354019165,,,,,, +35,122849,,,,,,,,,,,,0.08901432901620865,,,,,, +35,122899,,,,,,,,,,,,0.08752401918172836,,,,,, +35,122949,,,,,,,,,,,,0.07520405203104019,,,,,, +35,122999,,,,,,,,,,,,0.07595814764499664,,,,,, +35,123049,,,,,,,,,,,,0.07932247966527939,,,,,, +35,123099,,,,,,,,,,,,0.07233275473117828,,,,,, +35,123149,,,,,,,,,,,,0.06665355712175369,,,,,, +35,123199,,,,,,,,,,,,0.0659250020980835,,,,,, +35,123249,,,,,,,,,,,,0.07036152482032776,,,,,, +35,123299,,,,,,,,,,,,0.07616771757602692,,,,,, +35,123349,,,,,,,,,,,,0.05978367105126381,,,,,, +35,123399,,,,,,,,,,,,0.07114953547716141,,,,,, +35,123449,,,,,,,,,,,,0.06631239503622055,,,,,, +35,123499,,,,,,,,,,,,0.07408016920089722,,,,,, +35,123549,,,,,,,,,,,,0.07449835538864136,,,,,, +35,123599,,,,,,,,,,,,0.0730038583278656,,,,,, +35,123649,,,,,,,,,,,,0.06978832185268402,,,,,, +35,123699,,,,,,,,,,,,0.07181704044342041,,,,,, +35,123749,,,,,,,,,,,,0.05603032559156418,,,,,, +35,123799,,,,,,,,,,,,0.06577038764953613,,,,,, +35,123849,,,,,,,,,,,,0.06624717265367508,,,,,, +35,123899,,,,,,,,,,,,0.06785810738801956,,,,,, +35,123949,,,,,,,,,,,,0.06931201368570328,,,,,, +35,123983,,,,,,,,,,,,,0.23863673210144043,0.07818788290023804,0.2667689919471741,0.05413931608200073,0.2404160350561142,0.07818788290023804 +35,123983,,,,,,,0.22613297402858734,0.0719260722398758,0.3678402602672577,0.13446617126464844,0.3611548840999603,,,,,,, +36,123999,,,,,,,,,,,,0.06636328995227814,,,,,, +36,124049,,,,,,,,,,,,0.0697706863284111,,,,,, +36,124099,,,,,,,,,,,,0.08838918805122375,,,,,, +36,124149,,,,,,,,,,,,0.06907887756824493,,,,,, +36,124199,,,,,,,,,,,,0.06784778088331223,,,,,, +36,124249,,,,,,,,,,,,0.058196499943733215,,,,,, +36,124299,,,,,,,,,,,,0.07278203219175339,,,,,, +36,124349,,,,,,,,,,,,0.06623753905296326,,,,,, +36,124399,,,,,,,,,,,,0.06280701607465744,,,,,, +36,124449,,,,,,,,,,,,0.07695360481739044,,,,,, +36,124499,,,,,,,,,,,,0.06995706260204315,,,,,, +36,124549,,,,,,,,,,,,0.07282520085573196,,,,,, +36,124599,,,,,,,,,,,,0.07324707508087158,,,,,, +36,124649,,,,,,,,,,,,0.06570981442928314,,,,,, +36,124699,,,,,,,,,,,,0.07554760575294495,,,,,, +36,124749,,,,,,,,,,,,0.06759360432624817,,,,,, +36,124799,,,,,,,,,,,,0.07960875332355499,,,,,, +36,124849,,,,,,,,,,,,0.07990030199289322,,,,,, +36,124899,,,,,,,,,,,,0.07597154378890991,,,,,, +36,124949,,,,,,,,,,,,0.06613779067993164,,,,,, +36,124999,,,,,,,,,,,,0.07542431354522705,,,,,, +36,125049,,,,,,,,,,,,0.07758697867393494,,,,,, +36,125099,,,,,,,,,,,,0.07679077237844467,,,,,, +36,125149,,,,,,,,,,,,0.07585218548774719,,,,,, +36,125199,,,,,,,,,,,,0.0643501877784729,,,,,, +36,125249,,,,,,,,,,,,0.06319671869277954,,,,,, +36,125299,,,,,,,,,,,,0.07631899416446686,,,,,, +36,125349,,,,,,,,,,,,0.07095657289028168,,,,,, +36,125399,,,,,,,,,,,,0.0620659664273262,,,,,, +36,125449,,,,,,,,,,,,0.07323437929153442,,,,,, +36,125499,,,,,,,,,,,,0.061666592955589294,,,,,, +36,125549,,,,,,,,,,,,0.08258072286844254,,,,,, +36,125599,,,,,,,,,,,,0.07451207935810089,,,,,, +36,125649,,,,,,,,,,,,0.07108785212039948,,,,,, +36,125699,,,,,,,,,,,,0.08063247799873352,,,,,, +36,125749,,,,,,,,,,,,0.0795191302895546,,,,,, +36,125799,,,,,,,,,,,,0.06792604923248291,,,,,, +36,125849,,,,,,,,,,,,0.06799835711717606,,,,,, +36,125899,,,,,,,,,,,,0.05870355665683746,,,,,, +36,125949,,,,,,,,,,,,0.06858102232217789,,,,,, +36,125999,,,,,,,,,,,,0.06664356589317322,,,,,, +36,126049,,,,,,,,,,,,0.0724065825343132,,,,,, +36,126099,,,,,,,,,,,,0.07353562116622925,,,,,, +36,126149,,,,,,,,,,,,0.07654403150081635,,,,,, +36,126199,,,,,,,,,,,,0.07600829005241394,,,,,, +36,126249,,,,,,,,,,,,0.062051549553871155,,,,,, +36,126299,,,,,,,,,,,,0.06706954538822174,,,,,, +36,126349,,,,,,,,,,,,0.0599907785654068,,,,,, +36,126399,,,,,,,,,,,,0.07030260562896729,,,,,, +36,126449,,,,,,,,,,,,0.06629395484924316,,,,,, +36,126499,,,,,,,,,,,,0.05671902745962143,,,,,, +36,126549,,,,,,,,,,,,0.05753065645694733,,,,,, +36,126599,,,,,,,,,,,,0.07493709027767181,,,,,, +36,126649,,,,,,,,,,,,0.08766082674264908,,,,,, +36,126699,,,,,,,,,,,,0.0750860869884491,,,,,, +36,126749,,,,,,,,,,,,0.08145208656787872,,,,,, +36,126799,,,,,,,,,,,,0.06666930019855499,,,,,, +36,126849,,,,,,,,,,,,0.09212730824947357,,,,,, +36,126899,,,,,,,,,,,,0.06296754628419876,,,,,, +36,126949,,,,,,,,,,,,0.07028423994779587,,,,,, +36,126999,,,,,,,,,,,,0.0745229423046112,,,,,, +36,127049,,,,,,,,,,,,0.06297319382429123,,,,,, +36,127099,,,,,,,,,,,,0.06873329728841782,,,,,, +36,127149,,,,,,,,,,,,0.05894891172647476,,,,,, +36,127199,,,,,,,,,,,,0.07013736665248871,,,,,, +36,127249,,,,,,,,,,,,0.07657071948051453,,,,,, +36,127299,,,,,,,,,,,,0.06068374961614609,,,,,, +36,127349,,,,,,,,,,,,0.07476182281970978,,,,,, +36,127399,,,,,,,,,,,,0.06948080658912659,,,,,, +36,127427,,,,,,,,,,,,,0.23949401080608368,0.0779283344745636,0.2564142942428589,0.05727916955947876,0.23627758026123047,0.0779283344745636 +36,127427,,,,,,,0.22628653049468994,0.07164682447910309,0.3717041611671448,0.1378195881843567,0.3580484688282013,,,,,,, +37,127449,,,,,,,,,,,,0.06572700291872025,,,,,, +37,127499,,,,,,,,,,,,0.0799381211400032,,,,,, +37,127549,,,,,,,,,,,,0.06753970682621002,,,,,, +37,127599,,,,,,,,,,,,0.06855592131614685,,,,,, +37,127649,,,,,,,,,,,,0.0694376677274704,,,,,, +37,127699,,,,,,,,,,,,0.07964478433132172,,,,,, +37,127749,,,,,,,,,,,,0.0643206387758255,,,,,, +37,127799,,,,,,,,,,,,0.0651487410068512,,,,,, +37,127849,,,,,,,,,,,,0.06339466571807861,,,,,, +37,127899,,,,,,,,,,,,0.06978289037942886,,,,,, +37,127949,,,,,,,,,,,,0.0766708105802536,,,,,, +37,127999,,,,,,,,,,,,0.07446299493312836,,,,,, +37,128049,,,,,,,,,,,,0.06509122997522354,,,,,, +37,128099,,,,,,,,,,,,0.06431560963392258,,,,,, +37,128149,,,,,,,,,,,,0.05894219130277634,,,,,, +37,128199,,,,,,,,,,,,0.07269370555877686,,,,,, +37,128249,,,,,,,,,,,,0.07446973025798798,,,,,, +37,128299,,,,,,,,,,,,0.06671730428934097,,,,,, +37,128349,,,,,,,,,,,,0.06381375342607498,,,,,, +37,128399,,,,,,,,,,,,0.07396595925092697,,,,,, +37,128449,,,,,,,,,,,,0.06565579771995544,,,,,, +37,128499,,,,,,,,,,,,0.07284952700138092,,,,,, +37,128549,,,,,,,,,,,,0.07475592941045761,,,,,, +37,128599,,,,,,,,,,,,0.07674612104892731,,,,,, +37,128649,,,,,,,,,,,,0.07938624918460846,,,,,, +37,128699,,,,,,,,,,,,0.07337649911642075,,,,,, +37,128749,,,,,,,,,,,,0.07387690246105194,,,,,, +37,128799,,,,,,,,,,,,0.08706407994031906,,,,,, +37,128849,,,,,,,,,,,,0.0816294327378273,,,,,, +37,128899,,,,,,,,,,,,0.07076302170753479,,,,,, +37,128949,,,,,,,,,,,,0.06726706027984619,,,,,, +37,128999,,,,,,,,,,,,0.07664504647254944,,,,,, +37,129049,,,,,,,,,,,,0.0693783164024353,,,,,, +37,129099,,,,,,,,,,,,0.07335209846496582,,,,,, +37,129149,,,,,,,,,,,,0.07067438215017319,,,,,, +37,129199,,,,,,,,,,,,0.062039922922849655,,,,,, +37,129249,,,,,,,,,,,,0.06880047917366028,,,,,, +37,129299,,,,,,,,,,,,0.06460916250944138,,,,,, +37,129349,,,,,,,,,,,,0.07517781108617783,,,,,, +37,129399,,,,,,,,,,,,0.07716643065214157,,,,,, +37,129449,,,,,,,,,,,,0.059349700808525085,,,,,, +37,129499,,,,,,,,,,,,0.0639168918132782,,,,,, +37,129549,,,,,,,,,,,,0.0676235556602478,,,,,, +37,129599,,,,,,,,,,,,0.08264383673667908,,,,,, +37,129649,,,,,,,,,,,,0.06707093119621277,,,,,, +37,129699,,,,,,,,,,,,0.0750662237405777,,,,,, +37,129749,,,,,,,,,,,,0.08367013931274414,,,,,, +37,129799,,,,,,,,,,,,0.06913592666387558,,,,,, +37,129849,,,,,,,,,,,,0.08059855550527573,,,,,, +37,129899,,,,,,,,,,,,0.08161213994026184,,,,,, +37,129949,,,,,,,,,,,,0.06837651878595352,,,,,, +37,129999,,,,,,,,,,,,0.07472272217273712,,,,,, +37,130049,,,,,,,,,,,,0.07519642263650894,,,,,, +37,130099,,,,,,,,,,,,0.06724608689546585,,,,,, +37,130149,,,,,,,,,,,,0.06320664286613464,,,,,, +37,130199,,,,,,,,,,,,0.06459498405456543,,,,,, +37,130249,,,,,,,,,,,,0.06587184965610504,,,,,, +37,130299,,,,,,,,,,,,0.06318283081054688,,,,,, +37,130349,,,,,,,,,,,,0.08547254651784897,,,,,, +37,130399,,,,,,,,,,,,0.07856664061546326,,,,,, +37,130449,,,,,,,,,,,,0.06477559357881546,,,,,, +37,130499,,,,,,,,,,,,0.07169019430875778,,,,,, +37,130549,,,,,,,,,,,,0.07784019410610199,,,,,, +37,130599,,,,,,,,,,,,0.0708131343126297,,,,,, +37,130649,,,,,,,,,,,,0.07038342207670212,,,,,, +37,130699,,,,,,,,,,,,0.06559313088655472,,,,,, +37,130749,,,,,,,,,,,,0.08782811462879181,,,,,, +37,130799,,,,,,,,,,,,0.06997629255056381,,,,,, +37,130849,,,,,,,,,,,,0.06454908102750778,,,,,, +37,130871,,,,,,,,,,,,,0.23872840404510498,0.07716894894838333,0.2648881673812866,0.06646567583084106,0.23780454695224762,0.07716894894838333 +37,130871,,,,,,,0.226004958152771,0.07153953611850739,0.37349221110343933,0.13911890983581543,0.3614444136619568,,,,,,, +38,130899,,,,,,,,,,,,0.06474743038415909,,,,,, +38,130949,,,,,,,,,,,,0.0845710039138794,,,,,, +38,130999,,,,,,,,,,,,0.06816452741622925,,,,,, +38,131049,,,,,,,,,,,,0.0568619929254055,,,,,, +38,131099,,,,,,,,,,,,0.0731024295091629,,,,,, +38,131149,,,,,,,,,,,,0.07302529364824295,,,,,, +38,131199,,,,,,,,,,,,0.064969502389431,,,,,, +38,131249,,,,,,,,,,,,0.07170358300209045,,,,,, +38,131299,,,,,,,,,,,,0.07163754105567932,,,,,, +38,131349,,,,,,,,,,,,0.062143899500370026,,,,,, +38,131399,,,,,,,,,,,,0.06896452605724335,,,,,, +38,131449,,,,,,,,,,,,0.06469573080539703,,,,,, +38,131499,,,,,,,,,,,,0.07510770112276077,,,,,, +38,131549,,,,,,,,,,,,0.07820790261030197,,,,,, +38,131599,,,,,,,,,,,,0.06961508840322495,,,,,, +38,131649,,,,,,,,,,,,0.07614362239837646,,,,,, +38,131699,,,,,,,,,,,,0.059983253479003906,,,,,, +38,131749,,,,,,,,,,,,0.060442931950092316,,,,,, +38,131799,,,,,,,,,,,,0.06165998801589012,,,,,, +38,131849,,,,,,,,,,,,0.06507134437561035,,,,,, +38,131899,,,,,,,,,,,,0.06355121731758118,,,,,, +38,131949,,,,,,,,,,,,0.06205710768699646,,,,,, +38,131999,,,,,,,,,,,,0.06984405219554901,,,,,, +38,132049,,,,,,,,,,,,0.0639975443482399,,,,,, +38,132099,,,,,,,,,,,,0.0727151483297348,,,,,, +38,132149,,,,,,,,,,,,0.07033716142177582,,,,,, +38,132199,,,,,,,,,,,,0.07136645913124084,,,,,, +38,132249,,,,,,,,,,,,0.061095576733350754,,,,,, +38,132299,,,,,,,,,,,,0.08938206732273102,,,,,, +38,132349,,,,,,,,,,,,0.07966279983520508,,,,,, +38,132399,,,,,,,,,,,,0.07463281601667404,,,,,, +38,132449,,,,,,,,,,,,0.08466216921806335,,,,,, +38,132499,,,,,,,,,,,,0.06823587417602539,,,,,, +38,132549,,,,,,,,,,,,0.07138016819953918,,,,,, +38,132599,,,,,,,,,,,,0.08266618847846985,,,,,, +38,132649,,,,,,,,,,,,0.06665944308042526,,,,,, +38,132699,,,,,,,,,,,,0.05741453915834427,,,,,, +38,132749,,,,,,,,,,,,0.06652263551950455,,,,,, +38,132799,,,,,,,,,,,,0.07318135350942612,,,,,, +38,132849,,,,,,,,,,,,0.07655903697013855,,,,,, +38,132899,,,,,,,,,,,,0.07379452139139175,,,,,, +38,132949,,,,,,,,,,,,0.05953031778335571,,,,,, +38,132999,,,,,,,,,,,,0.06715352833271027,,,,,, +38,133049,,,,,,,,,,,,0.06560659408569336,,,,,, +38,133099,,,,,,,,,,,,0.06731545925140381,,,,,, +38,133149,,,,,,,,,,,,0.06933828443288803,,,,,, +38,133199,,,,,,,,,,,,0.07532855123281479,,,,,, +38,133249,,,,,,,,,,,,0.06771838665008545,,,,,, +38,133299,,,,,,,,,,,,0.06904160976409912,,,,,, +38,133349,,,,,,,,,,,,0.07785671204328537,,,,,, +38,133399,,,,,,,,,,,,0.08216504752635956,,,,,, +38,133449,,,,,,,,,,,,0.06988051533699036,,,,,, +38,133499,,,,,,,,,,,,0.06686919927597046,,,,,, +38,133549,,,,,,,,,,,,0.07110000401735306,,,,,, +38,133599,,,,,,,,,,,,0.06150677800178528,,,,,, +38,133649,,,,,,,,,,,,0.06840306520462036,,,,,, +38,133699,,,,,,,,,,,,0.05691145732998848,,,,,, +38,133749,,,,,,,,,,,,0.06816186755895615,,,,,, +38,133799,,,,,,,,,,,,0.0670044794678688,,,,,, +38,133849,,,,,,,,,,,,0.0737818256020546,,,,,, +38,133899,,,,,,,,,,,,0.08152952045202255,,,,,, +38,133949,,,,,,,,,,,,0.07350275665521622,,,,,, +38,133999,,,,,,,,,,,,0.06599944084882736,,,,,, +38,134049,,,,,,,,,,,,0.08179444819688797,,,,,, +38,134099,,,,,,,,,,,,0.07883056998252869,,,,,, +38,134149,,,,,,,,,,,,0.07960391044616699,,,,,, +38,134199,,,,,,,,,,,,0.06019347906112671,,,,,, +38,134249,,,,,,,,,,,,0.06523852795362473,,,,,, +38,134299,,,,,,,,,,,,0.0717591941356659,,,,,, +38,134315,,,,,,,,,,,,,0.2367696464061737,0.07763385027647018,0.2625197768211365,0.060841500759124756,0.2343461662530899,0.07763385027647018 +38,134315,,,,,,,0.2267676740884781,0.07241088151931763,0.36022719740867615,0.12864220142364502,0.35210543870925903,,,,,,, +39,134349,,,,,,,,,,,,0.08015694469213486,,,,,, +39,134399,,,,,,,,,,,,0.08082539588212967,,,,,, +39,134449,,,,,,,,,,,,0.074513278901577,,,,,, +39,134499,,,,,,,,,,,,0.07838371396064758,,,,,, +39,134549,,,,,,,,,,,,0.07616133987903595,,,,,, +39,134599,,,,,,,,,,,,0.06757533550262451,,,,,, +39,134649,,,,,,,,,,,,0.083139568567276,,,,,, +39,134699,,,,,,,,,,,,0.06633133441209793,,,,,, +39,134749,,,,,,,,,,,,0.07027586549520493,,,,,, +39,134799,,,,,,,,,,,,0.08232858777046204,,,,,, +39,134849,,,,,,,,,,,,0.07307597994804382,,,,,, +39,134899,,,,,,,,,,,,0.057605769485235214,,,,,, +39,134949,,,,,,,,,,,,0.07243610918521881,,,,,, +39,134999,,,,,,,,,,,,0.06640170514583588,,,,,, +39,135049,,,,,,,,,,,,0.08023159205913544,,,,,, +39,135099,,,,,,,,,,,,0.06995421648025513,,,,,, +39,135149,,,,,,,,,,,,0.06386616826057434,,,,,, +39,135199,,,,,,,,,,,,0.061452340334653854,,,,,, +39,135249,,,,,,,,,,,,0.07908737659454346,,,,,, +39,135299,,,,,,,,,,,,0.07247665524482727,,,,,, +39,135349,,,,,,,,,,,,0.06431874632835388,,,,,, +39,135399,,,,,,,,,,,,0.05784197151660919,,,,,, +39,135449,,,,,,,,,,,,0.06852659583091736,,,,,, +39,135499,,,,,,,,,,,,0.07001779973506927,,,,,, +39,135549,,,,,,,,,,,,0.07768245041370392,,,,,, +39,135599,,,,,,,,,,,,0.06188676133751869,,,,,, +39,135649,,,,,,,,,,,,0.07201136648654938,,,,,, +39,135699,,,,,,,,,,,,0.06764325499534607,,,,,, +39,135749,,,,,,,,,,,,0.07394058257341385,,,,,, +39,135799,,,,,,,,,,,,0.08849765360355377,,,,,, +39,135849,,,,,,,,,,,,0.06994816660881042,,,,,, +39,135899,,,,,,,,,,,,0.0756097286939621,,,,,, +39,135949,,,,,,,,,,,,0.069498211145401,,,,,, +39,135999,,,,,,,,,,,,0.07784269005060196,,,,,, +39,136049,,,,,,,,,,,,0.06911498308181763,,,,,, +39,136099,,,,,,,,,,,,0.06981705129146576,,,,,, +39,136149,,,,,,,,,,,,0.07801582664251328,,,,,, +39,136199,,,,,,,,,,,,0.06138758361339569,,,,,, +39,136249,,,,,,,,,,,,0.07810934633016586,,,,,, +39,136299,,,,,,,,,,,,0.0722523108124733,,,,,, +39,136349,,,,,,,,,,,,0.05944385007023811,,,,,, +39,136399,,,,,,,,,,,,0.07202862948179245,,,,,, +39,136449,,,,,,,,,,,,0.07312212884426117,,,,,, +39,136499,,,,,,,,,,,,0.06349653005599976,,,,,, +39,136549,,,,,,,,,,,,0.07295835018157959,,,,,, +39,136599,,,,,,,,,,,,0.06858168542385101,,,,,, +39,136649,,,,,,,,,,,,0.06948269158601761,,,,,, +39,136699,,,,,,,,,,,,0.06968343257904053,,,,,, +39,136749,,,,,,,,,,,,0.08647652715444565,,,,,, +39,136799,,,,,,,,,,,,0.06903627514839172,,,,,, +39,136849,,,,,,,,,,,,0.0860341340303421,,,,,, +39,136899,,,,,,,,,,,,0.07514596730470657,,,,,, +39,136949,,,,,,,,,,,,0.0704169049859047,,,,,, +39,136999,,,,,,,,,,,,0.06551086902618408,,,,,, +39,137049,,,,,,,,,,,,0.07412184774875641,,,,,, +39,137099,,,,,,,,,,,,0.0733344778418541,,,,,, +39,137149,,,,,,,,,,,,0.07221408933401108,,,,,, +39,137199,,,,,,,,,,,,0.07781073451042175,,,,,, +39,137249,,,,,,,,,,,,0.06685836613178253,,,,,, +39,137299,,,,,,,,,,,,0.07465262711048126,,,,,, +39,137349,,,,,,,,,,,,0.059068117290735245,,,,,, +39,137399,,,,,,,,,,,,0.06922793388366699,,,,,, +39,137449,,,,,,,,,,,,0.06627591699361801,,,,,, +39,137499,,,,,,,,,,,,0.07270664721727371,,,,,, +39,137549,,,,,,,,,,,,0.07663290947675705,,,,,, +39,137599,,,,,,,,,,,,0.06735705584287643,,,,,, +39,137649,,,,,,,,,,,,0.07211707532405853,,,,,, +39,137699,,,,,,,,,,,,0.052247896790504456,,,,,, +39,137749,,,,,,,,,,,,0.06896039843559265,,,,,, +39,137759,,,,,,,,,,,,,0.23699596524238586,0.07712725549936295,0.2651098370552063,0.06696999073028564,0.23739536106586456,0.07712725549936295 +39,137759,,,,,,,0.22394907474517822,0.0705459713935852,0.38888341188430786,0.1510675549507141,0.3720517158508301,,,,,,, +40,137799,,,,,,,,,,,,0.07201269268989563,,,,,, +40,137849,,,,,,,,,,,,0.06128126382827759,,,,,, +40,137899,,,,,,,,,,,,0.06696194410324097,,,,,, +40,137949,,,,,,,,,,,,0.0684141218662262,,,,,, +40,137999,,,,,,,,,,,,0.06508012115955353,,,,,, +40,138049,,,,,,,,,,,,0.05483211576938629,,,,,, +40,138099,,,,,,,,,,,,0.06837824732065201,,,,,, +40,138149,,,,,,,,,,,,0.0679381936788559,,,,,, +40,138199,,,,,,,,,,,,0.06988738477230072,,,,,, +40,138249,,,,,,,,,,,,0.07046028971672058,,,,,, +40,138299,,,,,,,,,,,,0.07915008068084717,,,,,, +40,138349,,,,,,,,,,,,0.06566140055656433,,,,,, +40,138399,,,,,,,,,,,,0.06408372521400452,,,,,, +40,138449,,,,,,,,,,,,0.07019634544849396,,,,,, +40,138499,,,,,,,,,,,,0.07959361374378204,,,,,, +40,138549,,,,,,,,,,,,0.07638736069202423,,,,,, +40,138599,,,,,,,,,,,,0.09066848456859589,,,,,, +40,138649,,,,,,,,,,,,0.06764696538448334,,,,,, +40,138699,,,,,,,,,,,,0.0764063373208046,,,,,, +40,138749,,,,,,,,,,,,0.06695343554019928,,,,,, +40,138799,,,,,,,,,,,,0.07065023481845856,,,,,, +40,138849,,,,,,,,,,,,0.06515166163444519,,,,,, +40,138899,,,,,,,,,,,,0.0730924904346466,,,,,, +40,138949,,,,,,,,,,,,0.07750118523836136,,,,,, +40,138999,,,,,,,,,,,,0.06921079754829407,,,,,, +40,139049,,,,,,,,,,,,0.07747600972652435,,,,,, +40,139099,,,,,,,,,,,,0.0724724680185318,,,,,, +40,139149,,,,,,,,,,,,0.05900072306394577,,,,,, +40,139199,,,,,,,,,,,,0.0734933391213417,,,,,, +40,139249,,,,,,,,,,,,0.07206899672746658,,,,,, +40,139299,,,,,,,,,,,,0.08006458729505539,,,,,, +40,139349,,,,,,,,,,,,0.0699324980378151,,,,,, +40,139399,,,,,,,,,,,,0.07226419448852539,,,,,, +40,139449,,,,,,,,,,,,0.07487040758132935,,,,,, +40,139499,,,,,,,,,,,,0.07127983868122101,,,,,, +40,139549,,,,,,,,,,,,0.07404254376888275,,,,,, +40,139599,,,,,,,,,,,,0.06363562494516373,,,,,, +40,139649,,,,,,,,,,,,0.07269210368394852,,,,,, +40,139699,,,,,,,,,,,,0.06925111263990402,,,,,, +40,139749,,,,,,,,,,,,0.07033884525299072,,,,,, +40,139799,,,,,,,,,,,,0.07624004781246185,,,,,, +40,139849,,,,,,,,,,,,0.06760704517364502,,,,,, +40,139899,,,,,,,,,,,,0.056983478367328644,,,,,, +40,139949,,,,,,,,,,,,0.08293203264474869,,,,,, +40,139999,,,,,,,,,,,,0.09139875322580338,,,,,, +40,140049,,,,,,,,,,,,0.0748462826013565,,,,,, +40,140099,,,,,,,,,,,,0.08041009306907654,,,,,, +40,140149,,,,,,,,,,,,0.06626621633768082,,,,,, +40,140199,,,,,,,,,,,,0.07016945630311966,,,,,, +40,140249,,,,,,,,,,,,0.06116617098450661,,,,,, +40,140299,,,,,,,,,,,,0.0725560337305069,,,,,, +40,140349,,,,,,,,,,,,0.06992977857589722,,,,,, +40,140399,,,,,,,,,,,,0.07172250747680664,,,,,, +40,140449,,,,,,,,,,,,0.07426150888204575,,,,,, +40,140499,,,,,,,,,,,,0.07202062755823135,,,,,, +40,140549,,,,,,,,,,,,0.06042598560452461,,,,,, +40,140599,,,,,,,,,,,,0.06876634806394577,,,,,, +40,140649,,,,,,,,,,,,0.0662221908569336,,,,,, +40,140699,,,,,,,,,,,,0.06534017622470856,,,,,, +40,140749,,,,,,,,,,,,0.0705844908952713,,,,,, +40,140799,,,,,,,,,,,,0.06961685419082642,,,,,, +40,140849,,,,,,,,,,,,0.06359192728996277,,,,,, +40,140899,,,,,,,,,,,,0.06785086542367935,,,,,, +40,140949,,,,,,,,,,,,0.07387979328632355,,,,,, +40,140999,,,,,,,,,,,,0.06613072007894516,,,,,, +40,141049,,,,,,,,,,,,0.06731681525707245,,,,,, +40,141099,,,,,,,,,,,,0.07096779346466064,,,,,, +40,141149,,,,,,,,,,,,0.06659246236085892,,,,,, +40,141199,,,,,,,,,,,,0.0732991024851799,,,,,, +40,141203,,,,,,,,,,,,,0.2375229150056839,0.07692629098892212,0.268741250038147,0.0694010853767395,0.24132153391838074,0.07692629098892212 +40,141203,,,,,,,0.2236773669719696,0.0707758367061615,0.38579845428466797,0.14831119775772095,0.37455764412879944,,,,,,, +41,141249,,,,,,,,,,,,0.07602117210626602,,,,,, +41,141299,,,,,,,,,,,,0.059785280376672745,,,,,, +41,141349,,,,,,,,,,,,0.07016630470752716,,,,,, +41,141399,,,,,,,,,,,,0.053949613124132156,,,,,, +41,141449,,,,,,,,,,,,0.06488516181707382,,,,,, +41,141499,,,,,,,,,,,,0.07508307695388794,,,,,, +41,141549,,,,,,,,,,,,0.06717540323734283,,,,,, +41,141599,,,,,,,,,,,,0.07035566121339798,,,,,, +41,141649,,,,,,,,,,,,0.07212688028812408,,,,,, +41,141699,,,,,,,,,,,,0.08328031003475189,,,,,, +41,141749,,,,,,,,,,,,0.06595183908939362,,,,,, +41,141799,,,,,,,,,,,,0.07053352892398834,,,,,, +41,141849,,,,,,,,,,,,0.06835246086120605,,,,,, +41,141899,,,,,,,,,,,,0.06619977951049805,,,,,, +41,141949,,,,,,,,,,,,0.06800055503845215,,,,,, +41,141999,,,,,,,,,,,,0.0736684799194336,,,,,, +41,142049,,,,,,,,,,,,0.07624448090791702,,,,,, +41,142099,,,,,,,,,,,,0.08307690918445587,,,,,, +41,142149,,,,,,,,,,,,0.07084326446056366,,,,,, +41,142199,,,,,,,,,,,,0.06556930392980576,,,,,, +41,142249,,,,,,,,,,,,0.06616821885108948,,,,,, +41,142299,,,,,,,,,,,,0.07796232402324677,,,,,, +41,142349,,,,,,,,,,,,0.061736635863780975,,,,,, +41,142399,,,,,,,,,,,,0.062476035207509995,,,,,, +41,142449,,,,,,,,,,,,0.06927661597728729,,,,,, +41,142499,,,,,,,,,,,,0.0644364207983017,,,,,, +41,142549,,,,,,,,,,,,0.07338057458400726,,,,,, +41,142599,,,,,,,,,,,,0.07038918137550354,,,,,, +41,142649,,,,,,,,,,,,0.06676729768514633,,,,,, +41,142699,,,,,,,,,,,,0.07336819171905518,,,,,, +41,142749,,,,,,,,,,,,0.07145000249147415,,,,,, +41,142799,,,,,,,,,,,,0.0732741430401802,,,,,, +41,142849,,,,,,,,,,,,0.06620729714632034,,,,,, +41,142899,,,,,,,,,,,,0.06986413896083832,,,,,, +41,142949,,,,,,,,,,,,0.06424188613891602,,,,,, +41,142999,,,,,,,,,,,,0.05865783989429474,,,,,, +41,143049,,,,,,,,,,,,0.06777555495500565,,,,,, +41,143099,,,,,,,,,,,,0.06997966766357422,,,,,, +41,143149,,,,,,,,,,,,0.07226090878248215,,,,,, +41,143199,,,,,,,,,,,,0.06106400489807129,,,,,, +41,143249,,,,,,,,,,,,0.06696359813213348,,,,,, +41,143299,,,,,,,,,,,,0.07073721289634705,,,,,, +41,143349,,,,,,,,,,,,0.0719994306564331,,,,,, +41,143399,,,,,,,,,,,,0.05832953006029129,,,,,, +41,143449,,,,,,,,,,,,0.07023591548204422,,,,,, +41,143499,,,,,,,,,,,,0.0737965926527977,,,,,, +41,143549,,,,,,,,,,,,0.06807586550712585,,,,,, +41,143599,,,,,,,,,,,,0.07578331232070923,,,,,, +41,143649,,,,,,,,,,,,0.07145021110773087,,,,,, +41,143699,,,,,,,,,,,,0.08141925930976868,,,,,, +41,143749,,,,,,,,,,,,0.06561107933521271,,,,,, +41,143799,,,,,,,,,,,,0.06442083418369293,,,,,, +41,143849,,,,,,,,,,,,0.060338638722896576,,,,,, +41,143899,,,,,,,,,,,,0.0679311454296112,,,,,, +41,143949,,,,,,,,,,,,0.06409800052642822,,,,,, +41,143999,,,,,,,,,,,,0.07299697399139404,,,,,, +41,144049,,,,,,,,,,,,0.06435605138540268,,,,,, +41,144099,,,,,,,,,,,,0.06910708546638489,,,,,, +41,144149,,,,,,,,,,,,0.06301453709602356,,,,,, +41,144199,,,,,,,,,,,,0.07069642841815948,,,,,, +41,144249,,,,,,,,,,,,0.0789751335978508,,,,,, +41,144299,,,,,,,,,,,,0.07150512933731079,,,,,, +41,144349,,,,,,,,,,,,0.0677742063999176,,,,,, +41,144399,,,,,,,,,,,,0.07519993185997009,,,,,, +41,144449,,,,,,,,,,,,0.07819300889968872,,,,,, +41,144499,,,,,,,,,,,,0.06308788061141968,,,,,, +41,144549,,,,,,,,,,,,0.07622095942497253,,,,,, +41,144599,,,,,,,,,,,,0.07948406785726547,,,,,, +41,144647,,,,,,,,,,,,,0.23657402396202087,0.07677526772022247,0.26813459396362305,0.07122814655303955,0.24063032865524292,0.07677526772022247 +41,144647,,,,,,,0.22189734876155853,0.06937839090824127,0.406424880027771,0.1651139259338379,0.3876664340496063,,,,,,, +42,144649,,,,,,,,,,,,0.06872861087322235,,,,,, +42,144699,,,,,,,,,,,,0.060721881687641144,,,,,, +42,144749,,,,,,,,,,,,0.07635755836963654,,,,,, +42,144799,,,,,,,,,,,,0.06052045524120331,,,,,, +42,144849,,,,,,,,,,,,0.06966563314199448,,,,,, +42,144899,,,,,,,,,,,,0.0776209607720375,,,,,, +42,144949,,,,,,,,,,,,0.0726277157664299,,,,,, +42,144999,,,,,,,,,,,,0.07536819577217102,,,,,, +42,145049,,,,,,,,,,,,0.07804524153470993,,,,,, +42,145099,,,,,,,,,,,,0.06310172379016876,,,,,, +42,145149,,,,,,,,,,,,0.07023961842060089,,,,,, +42,145199,,,,,,,,,,,,0.07437454164028168,,,,,, +42,145249,,,,,,,,,,,,0.06421880424022675,,,,,, +42,145299,,,,,,,,,,,,0.0676046758890152,,,,,, +42,145349,,,,,,,,,,,,0.07671566307544708,,,,,, +42,145399,,,,,,,,,,,,0.0635991320014,,,,,, +42,145449,,,,,,,,,,,,0.06946504861116409,,,,,, +42,145499,,,,,,,,,,,,0.071377232670784,,,,,, +42,145549,,,,,,,,,,,,0.06169508025050163,,,,,, +42,145599,,,,,,,,,,,,0.06119686737656593,,,,,, +42,145649,,,,,,,,,,,,0.06638949364423752,,,,,, +42,145699,,,,,,,,,,,,0.07284434139728546,,,,,, +42,145749,,,,,,,,,,,,0.06577528268098831,,,,,, +42,145799,,,,,,,,,,,,0.06110692024230957,,,,,, +42,145849,,,,,,,,,,,,0.07512423396110535,,,,,, +42,145899,,,,,,,,,,,,0.06651358306407928,,,,,, +42,145949,,,,,,,,,,,,0.06759879738092422,,,,,, +42,145999,,,,,,,,,,,,0.07071205973625183,,,,,, +42,146049,,,,,,,,,,,,0.06360886991024017,,,,,, +42,146099,,,,,,,,,,,,0.06619903445243835,,,,,, +42,146149,,,,,,,,,,,,0.07121364027261734,,,,,, +42,146199,,,,,,,,,,,,0.06426360458135605,,,,,, +42,146249,,,,,,,,,,,,0.0803365483880043,,,,,, +42,146299,,,,,,,,,,,,0.07156571745872498,,,,,, +42,146349,,,,,,,,,,,,0.060125045478343964,,,,,, +42,146399,,,,,,,,,,,,0.06523334234952927,,,,,, +42,146449,,,,,,,,,,,,0.07177625596523285,,,,,, +42,146499,,,,,,,,,,,,0.06927607953548431,,,,,, +42,146549,,,,,,,,,,,,0.06895151734352112,,,,,, +42,146599,,,,,,,,,,,,0.0732584297657013,,,,,, +42,146649,,,,,,,,,,,,0.0759979858994484,,,,,, +42,146699,,,,,,,,,,,,0.06753797829151154,,,,,, +42,146749,,,,,,,,,,,,0.06393958628177643,,,,,, +42,146799,,,,,,,,,,,,0.06469027698040009,,,,,, +42,146849,,,,,,,,,,,,0.07052972912788391,,,,,, +42,146899,,,,,,,,,,,,0.060782670974731445,,,,,, +42,146949,,,,,,,,,,,,0.06510628759860992,,,,,, +42,146999,,,,,,,,,,,,0.07017689943313599,,,,,, +42,147049,,,,,,,,,,,,0.06366676092147827,,,,,, +42,147099,,,,,,,,,,,,0.06809720396995544,,,,,, +42,147149,,,,,,,,,,,,0.08659698814153671,,,,,, +42,147199,,,,,,,,,,,,0.07098682224750519,,,,,, +42,147249,,,,,,,,,,,,0.06409617513418198,,,,,, +42,147299,,,,,,,,,,,,0.07121437788009644,,,,,, +42,147349,,,,,,,,,,,,0.0638197660446167,,,,,, +42,147399,,,,,,,,,,,,0.08312888443470001,,,,,, +42,147449,,,,,,,,,,,,0.08057773113250732,,,,,, +42,147499,,,,,,,,,,,,0.06693682074546814,,,,,, +42,147549,,,,,,,,,,,,0.06074347719550133,,,,,, +42,147599,,,,,,,,,,,,0.06016969308257103,,,,,, +42,147649,,,,,,,,,,,,0.07001437246799469,,,,,, +42,147699,,,,,,,,,,,,0.07218728959560394,,,,,, +42,147749,,,,,,,,,,,,0.06025899201631546,,,,,, +42,147799,,,,,,,,,,,,0.07459577172994614,,,,,, +42,147849,,,,,,,,,,,,0.07270720601081848,,,,,, +42,147899,,,,,,,,,,,,0.0659913420677185,,,,,, +42,147949,,,,,,,,,,,,0.06051081418991089,,,,,, +42,147999,,,,,,,,,,,,0.07512488961219788,,,,,, +42,148049,,,,,,,,,,,,0.05983744561672211,,,,,, +42,148091,,,,,,,,,,,,,0.23754630982875824,0.07692629098892212,0.26431846618652344,0.0694010853767395,0.23609036207199097,0.07692629098892212 +42,148091,,,,,,,0.2224598377943039,0.07007826119661331,0.39641475677490234,0.1567055583000183,0.3833606541156769,,,,,,, +43,148099,,,,,,,,,,,,0.0658668726682663,,,,,, +43,148149,,,,,,,,,,,,0.07269774377346039,,,,,, +43,148199,,,,,,,,,,,,0.05659077689051628,,,,,, +43,148249,,,,,,,,,,,,0.052955880761146545,,,,,, +43,148299,,,,,,,,,,,,0.08841612935066223,,,,,, +43,148349,,,,,,,,,,,,0.07476258277893066,,,,,, +43,148399,,,,,,,,,,,,0.07614238560199738,,,,,, +43,148449,,,,,,,,,,,,0.0732010155916214,,,,,, +43,148499,,,,,,,,,,,,0.0555461123585701,,,,,, +43,148549,,,,,,,,,,,,0.09167543053627014,,,,,, +43,148599,,,,,,,,,,,,0.05749303847551346,,,,,, +43,148649,,,,,,,,,,,,0.0773276761174202,,,,,, +43,148699,,,,,,,,,,,,0.08072225749492645,,,,,, +43,148749,,,,,,,,,,,,0.07338452339172363,,,,,, +43,148799,,,,,,,,,,,,0.06835441291332245,,,,,, +43,148849,,,,,,,,,,,,0.07513837516307831,,,,,, +43,148899,,,,,,,,,,,,0.07197178900241852,,,,,, +43,148949,,,,,,,,,,,,0.07020226120948792,,,,,, +43,148999,,,,,,,,,,,,0.06489202380180359,,,,,, +43,149049,,,,,,,,,,,,0.08429084718227386,,,,,, +43,149099,,,,,,,,,,,,0.06463418900966644,,,,,, +43,149149,,,,,,,,,,,,0.06839123368263245,,,,,, +43,149199,,,,,,,,,,,,0.07478418201208115,,,,,, +43,149249,,,,,,,,,,,,0.07054214179515839,,,,,, +43,149299,,,,,,,,,,,,0.0650608241558075,,,,,, +43,149349,,,,,,,,,,,,0.06204059347510338,,,,,, +43,149399,,,,,,,,,,,,0.05621109530329704,,,,,, +43,149449,,,,,,,,,,,,0.0758776068687439,,,,,, +43,149499,,,,,,,,,,,,0.06746987998485565,,,,,, +43,149549,,,,,,,,,,,,0.07065492868423462,,,,,, +43,149599,,,,,,,,,,,,0.0666358545422554,,,,,, +43,149649,,,,,,,,,,,,0.06115884706377983,,,,,, +43,149699,,,,,,,,,,,,0.07445967197418213,,,,,, +43,149749,,,,,,,,,,,,0.07102766633033752,,,,,, +43,149799,,,,,,,,,,,,0.0733121782541275,,,,,, +43,149849,,,,,,,,,,,,0.05585664510726929,,,,,, +43,149899,,,,,,,,,,,,0.06884124875068665,,,,,, +43,149949,,,,,,,,,,,,0.0738089308142662,,,,,, +43,149999,,,,,,,,,,,,0.06925678253173828,,,,,, +43,150049,,,,,,,,,,,,0.06504812091588974,,,,,, +43,150099,,,,,,,,,,,,0.059088729321956635,,,,,, +43,150149,,,,,,,,,,,,0.06914457678794861,,,,,, +43,150199,,,,,,,,,,,,0.0600179061293602,,,,,, +43,150249,,,,,,,,,,,,0.06151995807886124,,,,,, +43,150299,,,,,,,,,,,,0.06885069608688354,,,,,, +43,150349,,,,,,,,,,,,0.07856924086809158,,,,,, +43,150399,,,,,,,,,,,,0.07117965072393417,,,,,, +43,150449,,,,,,,,,,,,0.06217733398079872,,,,,, +43,150499,,,,,,,,,,,,0.07010230422019958,,,,,, +43,150549,,,,,,,,,,,,0.06987033784389496,,,,,, +43,150599,,,,,,,,,,,,0.060684263706207275,,,,,, +43,150649,,,,,,,,,,,,0.07219196856021881,,,,,, +43,150699,,,,,,,,,,,,0.0660870149731636,,,,,, +43,150749,,,,,,,,,,,,0.056610267609357834,,,,,, +43,150799,,,,,,,,,,,,0.06512340903282166,,,,,, +43,150849,,,,,,,,,,,,0.0761282667517662,,,,,, +43,150899,,,,,,,,,,,,0.07604682445526123,,,,,, +43,150949,,,,,,,,,,,,0.06272050738334656,,,,,, +43,150999,,,,,,,,,,,,0.059923551976680756,,,,,, +43,151049,,,,,,,,,,,,0.08123362064361572,,,,,, +43,151099,,,,,,,,,,,,0.07172775268554688,,,,,, +43,151149,,,,,,,,,,,,0.06583244353532791,,,,,, +43,151199,,,,,,,,,,,,0.0728033035993576,,,,,, +43,151249,,,,,,,,,,,,0.06888233125209808,,,,,, +43,151299,,,,,,,,,,,,0.0572538748383522,,,,,, +43,151349,,,,,,,,,,,,0.07282759249210358,,,,,, +43,151399,,,,,,,,,,,,0.06101122498512268,,,,,, +43,151449,,,,,,,,,,,,0.07039973884820938,,,,,, +43,151499,,,,,,,,,,,,0.06961807608604431,,,,,, +43,151535,,,,,,,,,,,,,0.23605480790138245,0.07709014415740967,0.2687685191631317,0.06741893291473389,0.24255003035068512,0.07709014415740967 +43,151535,,,,,,,0.2216707020998001,0.0692359134554863,0.4085383713245392,0.16683971881866455,0.3893693685531616,,,,,,, +44,151549,,,,,,,,,,,,0.05819060653448105,,,,,, +44,151599,,,,,,,,,,,,0.07691115885972977,,,,,, +44,151649,,,,,,,,,,,,0.07434356957674026,,,,,, +44,151699,,,,,,,,,,,,0.06948361545801163,,,,,, +44,151749,,,,,,,,,,,,0.06743547320365906,,,,,, +44,151799,,,,,,,,,,,,0.06288298964500427,,,,,, +44,151849,,,,,,,,,,,,0.06713917851448059,,,,,, +44,151899,,,,,,,,,,,,0.0737413689494133,,,,,, +44,151949,,,,,,,,,,,,0.07209140807390213,,,,,, +44,151999,,,,,,,,,,,,0.06919294595718384,,,,,, +44,152049,,,,,,,,,,,,0.06511849164962769,,,,,, +44,152099,,,,,,,,,,,,0.07334217429161072,,,,,, +44,152149,,,,,,,,,,,,0.07277839630842209,,,,,, +44,152199,,,,,,,,,,,,0.06296118348836899,,,,,, +44,152249,,,,,,,,,,,,0.07556838542222977,,,,,, +44,152299,,,,,,,,,,,,0.06647839397192001,,,,,, +44,152349,,,,,,,,,,,,0.07210714370012283,,,,,, +44,152399,,,,,,,,,,,,0.06058325991034508,,,,,, +44,152449,,,,,,,,,,,,0.08097300678491592,,,,,, +44,152499,,,,,,,,,,,,0.057222023606300354,,,,,, +44,152549,,,,,,,,,,,,0.053703151643276215,,,,,, +44,152599,,,,,,,,,,,,0.08055220544338226,,,,,, +44,152649,,,,,,,,,,,,0.06546604633331299,,,,,, +44,152699,,,,,,,,,,,,0.0627853274345398,,,,,, +44,152749,,,,,,,,,,,,0.06357372552156448,,,,,, +44,152799,,,,,,,,,,,,0.07453885674476624,,,,,, +44,152849,,,,,,,,,,,,0.07286970317363739,,,,,, +44,152899,,,,,,,,,,,,0.05806199461221695,,,,,, +44,152949,,,,,,,,,,,,0.06364959478378296,,,,,, +44,152999,,,,,,,,,,,,0.0683179646730423,,,,,, +44,153049,,,,,,,,,,,,0.07433275133371353,,,,,, +44,153099,,,,,,,,,,,,0.06892930716276169,,,,,, +44,153149,,,,,,,,,,,,0.06417212635278702,,,,,, +44,153199,,,,,,,,,,,,0.0677860677242279,,,,,, +44,153249,,,,,,,,,,,,0.06911537796258926,,,,,, +44,153299,,,,,,,,,,,,0.07711204886436462,,,,,, +44,153349,,,,,,,,,,,,0.07249626517295837,,,,,, +44,153399,,,,,,,,,,,,0.06539034098386765,,,,,, +44,153449,,,,,,,,,,,,0.0672001987695694,,,,,, +44,153499,,,,,,,,,,,,0.06379780918359756,,,,,, +44,153549,,,,,,,,,,,,0.07861672341823578,,,,,, +44,153599,,,,,,,,,,,,0.05627262219786644,,,,,, +44,153649,,,,,,,,,,,,0.06633879989385605,,,,,, +44,153699,,,,,,,,,,,,0.06845113635063171,,,,,, +44,153749,,,,,,,,,,,,0.059952493757009506,,,,,, +44,153799,,,,,,,,,,,,0.06796690076589584,,,,,, +44,153849,,,,,,,,,,,,0.06670036166906357,,,,,, +44,153899,,,,,,,,,,,,0.07069232314825058,,,,,, +44,153949,,,,,,,,,,,,0.07476839423179626,,,,,, +44,153999,,,,,,,,,,,,0.07267982512712479,,,,,, +44,154049,,,,,,,,,,,,0.0629139095544815,,,,,, +44,154099,,,,,,,,,,,,0.06620805710554123,,,,,, +44,154149,,,,,,,,,,,,0.07718399912118912,,,,,, +44,154199,,,,,,,,,,,,0.07062013447284698,,,,,, +44,154249,,,,,,,,,,,,0.07041940093040466,,,,,, +44,154299,,,,,,,,,,,,0.07231460511684418,,,,,, +44,154349,,,,,,,,,,,,0.08567233383655548,,,,,, +44,154399,,,,,,,,,,,,0.07349412143230438,,,,,, +44,154449,,,,,,,,,,,,0.06306368112564087,,,,,, +44,154499,,,,,,,,,,,,0.07491454482078552,,,,,, +44,154549,,,,,,,,,,,,0.07295378297567368,,,,,, +44,154599,,,,,,,,,,,,0.07337012887001038,,,,,, +44,154649,,,,,,,,,,,,0.07107048481702805,,,,,, +44,154699,,,,,,,,,,,,0.08315339684486389,,,,,, +44,154749,,,,,,,,,,,,0.06947045773267746,,,,,, +44,154799,,,,,,,,,,,,0.07706943899393082,,,,,, +44,154849,,,,,,,,,,,,0.060208071023225784,,,,,, +44,154899,,,,,,,,,,,,0.06649951636791229,,,,,, +44,154949,,,,,,,,,,,,0.06594045460224152,,,,,, +44,154979,,,,,,,,,,,,,0.23663876950740814,0.07672788947820663,0.26975977420806885,0.07180118560791016,0.24336424469947815,0.07672788947820663 +44,154979,,,,,,,0.22174401581287384,0.06940916925668716,0.4060803949832916,0.16475200653076172,0.38954660296440125,,,,,,, +45,154999,,,,,,,,,,,,0.06919322162866592,,,,,, +45,155049,,,,,,,,,,,,0.06975898146629333,,,,,, +45,155099,,,,,,,,,,,,0.06938575208187103,,,,,, +45,155149,,,,,,,,,,,,0.06683531403541565,,,,,, +45,155199,,,,,,,,,,,,0.0621369443833828,,,,,, +45,155249,,,,,,,,,,,,0.06566379964351654,,,,,, +45,155299,,,,,,,,,,,,0.07064016908407211,,,,,, +45,155349,,,,,,,,,,,,0.06645473092794418,,,,,, +45,155399,,,,,,,,,,,,0.06397049129009247,,,,,, +45,155449,,,,,,,,,,,,0.07333621382713318,,,,,, +45,155499,,,,,,,,,,,,0.06777822971343994,,,,,, +45,155549,,,,,,,,,,,,0.0739908218383789,,,,,, +45,155599,,,,,,,,,,,,0.07076264917850494,,,,,, +45,155649,,,,,,,,,,,,0.06516773998737335,,,,,, +45,155699,,,,,,,,,,,,0.08146846294403076,,,,,, +45,155749,,,,,,,,,,,,0.060288749635219574,,,,,, +45,155799,,,,,,,,,,,,0.07060780376195908,,,,,, +45,155849,,,,,,,,,,,,0.061251185834407806,,,,,, +45,155899,,,,,,,,,,,,0.07206746935844421,,,,,, +45,155949,,,,,,,,,,,,0.07254372537136078,,,,,, +45,155999,,,,,,,,,,,,0.07339900732040405,,,,,, +45,156049,,,,,,,,,,,,0.07140845060348511,,,,,, +45,156099,,,,,,,,,,,,0.07000777125358582,,,,,, +45,156149,,,,,,,,,,,,0.07948993891477585,,,,,, +45,156199,,,,,,,,,,,,0.08191761374473572,,,,,, +45,156249,,,,,,,,,,,,0.05798061937093735,,,,,, +45,156299,,,,,,,,,,,,0.0691385492682457,,,,,, +45,156349,,,,,,,,,,,,0.05628608167171478,,,,,, +45,156399,,,,,,,,,,,,0.06848673522472382,,,,,, +45,156449,,,,,,,,,,,,0.0851966142654419,,,,,, +45,156499,,,,,,,,,,,,0.06538013368844986,,,,,, +45,156549,,,,,,,,,,,,0.06292403489351273,,,,,, +45,156599,,,,,,,,,,,,0.0660535991191864,,,,,, +45,156649,,,,,,,,,,,,0.06820975244045258,,,,,, +45,156699,,,,,,,,,,,,0.08475163578987122,,,,,, +45,156749,,,,,,,,,,,,0.06833059340715408,,,,,, +45,156799,,,,,,,,,,,,0.06734682619571686,,,,,, +45,156849,,,,,,,,,,,,0.061588361859321594,,,,,, +45,156899,,,,,,,,,,,,0.057562895119190216,,,,,, +45,156949,,,,,,,,,,,,0.05421612411737442,,,,,, +45,156999,,,,,,,,,,,,0.07048383355140686,,,,,, +45,157049,,,,,,,,,,,,0.08061013370752335,,,,,, +45,157099,,,,,,,,,,,,0.06915964186191559,,,,,, +45,157149,,,,,,,,,,,,0.07068484276533127,,,,,, +45,157199,,,,,,,,,,,,0.09274722635746002,,,,,, +45,157249,,,,,,,,,,,,0.06528395414352417,,,,,, +45,157299,,,,,,,,,,,,0.06632223725318909,,,,,, +45,157349,,,,,,,,,,,,0.06498286128044128,,,,,, +45,157399,,,,,,,,,,,,0.07237587869167328,,,,,, +45,157449,,,,,,,,,,,,0.0725301206111908,,,,,, +45,157499,,,,,,,,,,,,0.06913493573665619,,,,,, +45,157549,,,,,,,,,,,,0.06713731586933136,,,,,, +45,157599,,,,,,,,,,,,0.07368117570877075,,,,,, +45,157649,,,,,,,,,,,,0.07023721933364868,,,,,, +45,157699,,,,,,,,,,,,0.07372944056987762,,,,,, +45,157749,,,,,,,,,,,,0.06223937124013901,,,,,, +45,157799,,,,,,,,,,,,0.06286032497882843,,,,,, +45,157849,,,,,,,,,,,,0.06051815673708916,,,,,, +45,157899,,,,,,,,,,,,0.06336593627929688,,,,,, +45,157949,,,,,,,,,,,,0.060853566974401474,,,,,, +45,157999,,,,,,,,,,,,0.0720115676522255,,,,,, +45,158049,,,,,,,,,,,,0.06445857882499695,,,,,, +45,158099,,,,,,,,,,,,0.07410810887813568,,,,,, +45,158149,,,,,,,,,,,,0.06575235724449158,,,,,, +45,158199,,,,,,,,,,,,0.06204569339752197,,,,,, +45,158249,,,,,,,,,,,,0.06418705731630325,,,,,, +45,158299,,,,,,,,,,,,0.06255829334259033,,,,,, +45,158349,,,,,,,,,,,,0.0743541419506073,,,,,, +45,158399,,,,,,,,,,,,0.06887713074684143,,,,,, +45,158423,,,,,,,,,,,,,0.23669832944869995,0.07695924490690231,0.26727038621902466,0.06900250911712646,0.24180522561073303,0.07695924490690231 +45,158423,,,,,,,0.22022226452827454,0.06851731985807419,0.4189765453338623,0.17549055814743042,0.40061235427856445,,,,,,, +46,158449,,,,,,,,,,,,0.06883508712053299,,,,,, +46,158499,,,,,,,,,,,,0.060661789029836655,,,,,, +46,158549,,,,,,,,,,,,0.07293026149272919,,,,,, +46,158599,,,,,,,,,,,,0.06275317072868347,,,,,, +46,158649,,,,,,,,,,,,0.06545501202344894,,,,,, +46,158699,,,,,,,,,,,,0.07758262008428574,,,,,, +46,158749,,,,,,,,,,,,0.06967443227767944,,,,,, +46,158799,,,,,,,,,,,,0.07346180081367493,,,,,, +46,158849,,,,,,,,,,,,0.08256009221076965,,,,,, +46,158899,,,,,,,,,,,,0.07596839964389801,,,,,, +46,158949,,,,,,,,,,,,0.07012065500020981,,,,,, +46,158999,,,,,,,,,,,,0.07614953815937042,,,,,, +46,159049,,,,,,,,,,,,0.06557206809520721,,,,,, +46,159099,,,,,,,,,,,,0.06487856060266495,,,,,, +46,159149,,,,,,,,,,,,0.07333628833293915,,,,,, +46,159199,,,,,,,,,,,,0.05744469165802002,,,,,, +46,159249,,,,,,,,,,,,0.07441599667072296,,,,,, +46,159299,,,,,,,,,,,,0.07644551992416382,,,,,, +46,159349,,,,,,,,,,,,0.06354694068431854,,,,,, +46,159399,,,,,,,,,,,,0.07046541571617126,,,,,, +46,159449,,,,,,,,,,,,0.06910227239131927,,,,,, +46,159499,,,,,,,,,,,,0.06193355470895767,,,,,, +46,159549,,,,,,,,,,,,0.0783950686454773,,,,,, +46,159599,,,,,,,,,,,,0.07258455455303192,,,,,, +46,159649,,,,,,,,,,,,0.06714914739131927,,,,,, +46,159699,,,,,,,,,,,,0.07311780750751495,,,,,, +46,159749,,,,,,,,,,,,0.06061369925737381,,,,,, +46,159799,,,,,,,,,,,,0.06618042290210724,,,,,, +46,159849,,,,,,,,,,,,0.07596856355667114,,,,,, +46,159899,,,,,,,,,,,,0.06669027358293533,,,,,, +46,159949,,,,,,,,,,,,0.06690510362386703,,,,,, +46,159999,,,,,,,,,,,,0.07169574499130249,,,,,, +46,160049,,,,,,,,,,,,0.05728856474161148,,,,,, +46,160099,,,,,,,,,,,,0.08068928122520447,,,,,, +46,160149,,,,,,,,,,,,0.06313557922840118,,,,,, +46,160199,,,,,,,,,,,,0.05076802894473076,,,,,, +46,160249,,,,,,,,,,,,0.07719436287879944,,,,,, +46,160299,,,,,,,,,,,,0.06145075708627701,,,,,, +46,160349,,,,,,,,,,,,0.07132910192012787,,,,,, +46,160399,,,,,,,,,,,,0.06844626367092133,,,,,, +46,160449,,,,,,,,,,,,0.0724758729338646,,,,,, +46,160499,,,,,,,,,,,,0.08197301626205444,,,,,, +46,160549,,,,,,,,,,,,0.07944197952747345,,,,,, +46,160599,,,,,,,,,,,,0.06158643215894699,,,,,, +46,160649,,,,,,,,,,,,0.07418105006217957,,,,,, +46,160699,,,,,,,,,,,,0.0726637989282608,,,,,, +46,160749,,,,,,,,,,,,0.06998508423566818,,,,,, +46,160799,,,,,,,,,,,,0.067153699696064,,,,,, +46,160849,,,,,,,,,,,,0.053723640739917755,,,,,, +46,160899,,,,,,,,,,,,0.07241000235080719,,,,,, +46,160949,,,,,,,,,,,,0.06506504118442535,,,,,, +46,160999,,,,,,,,,,,,0.06979885697364807,,,,,, +46,161049,,,,,,,,,,,,0.06895983219146729,,,,,, +46,161099,,,,,,,,,,,,0.06449215859174728,,,,,, +46,161149,,,,,,,,,,,,0.06631990522146225,,,,,, +46,161199,,,,,,,,,,,,0.0728239044547081,,,,,, +46,161249,,,,,,,,,,,,0.07465289533138275,,,,,, +46,161299,,,,,,,,,,,,0.07327578961849213,,,,,, +46,161349,,,,,,,,,,,,0.059128206223249435,,,,,, +46,161399,,,,,,,,,,,,0.059858135879039764,,,,,, +46,161449,,,,,,,,,,,,0.06533627957105637,,,,,, +46,161499,,,,,,,,,,,,0.06379355490207672,,,,,, +46,161549,,,,,,,,,,,,0.06314854323863983,,,,,, +46,161599,,,,,,,,,,,,0.06938903033733368,,,,,, +46,161649,,,,,,,,,,,,0.060664501041173935,,,,,, +46,161699,,,,,,,,,,,,0.07516486942768097,,,,,, +46,161749,,,,,,,,,,,,0.07689757645130157,,,,,, +46,161799,,,,,,,,,,,,0.07219800353050232,,,,,, +46,161849,,,,,,,,,,,,0.054771788418293,,,,,, +46,161867,,,,,,,,,,,,,0.2376394122838974,0.07800613343715668,0.2665056586265564,0.05633801221847534,0.24156424403190613,0.07800613343715668 +46,161867,,,,,,,0.2200327068567276,0.06846732646226883,0.41969844698905945,0.17607879638671875,0.4017418324947357,,,,,,, +47,161899,,,,,,,,,,,,0.06791123747825623,,,,,, +47,161949,,,,,,,,,,,,0.07030987739562988,,,,,, +47,161999,,,,,,,,,,,,0.0806654840707779,,,,,, +47,162049,,,,,,,,,,,,0.062281787395477295,,,,,, +47,162099,,,,,,,,,,,,0.06838960200548172,,,,,, +47,162149,,,,,,,,,,,,0.06732532382011414,,,,,, +47,162199,,,,,,,,,,,,0.06646814942359924,,,,,, +47,162249,,,,,,,,,,,,0.06027097627520561,,,,,, +47,162299,,,,,,,,,,,,0.05897250026464462,,,,,, +47,162349,,,,,,,,,,,,0.07205983251333237,,,,,, +47,162399,,,,,,,,,,,,0.0784064531326294,,,,,, +47,162449,,,,,,,,,,,,0.06564944982528687,,,,,, +47,162499,,,,,,,,,,,,0.06519760936498642,,,,,, +47,162549,,,,,,,,,,,,0.07681886851787567,,,,,, +47,162599,,,,,,,,,,,,0.06781640648841858,,,,,, +47,162649,,,,,,,,,,,,0.07366490364074707,,,,,, +47,162699,,,,,,,,,,,,0.08736694604158401,,,,,, +47,162749,,,,,,,,,,,,0.06846510618925095,,,,,, +47,162799,,,,,,,,,,,,0.05971432104706764,,,,,, +47,162849,,,,,,,,,,,,0.06591435521841049,,,,,, +47,162899,,,,,,,,,,,,0.07191496342420578,,,,,, +47,162949,,,,,,,,,,,,0.06491456925868988,,,,,, +47,162999,,,,,,,,,,,,0.08518889546394348,,,,,, +47,163049,,,,,,,,,,,,0.07651231437921524,,,,,, +47,163099,,,,,,,,,,,,0.07298669219017029,,,,,, +47,163149,,,,,,,,,,,,0.0790034681558609,,,,,, +47,163199,,,,,,,,,,,,0.06963615864515305,,,,,, +47,163249,,,,,,,,,,,,0.06021970510482788,,,,,, +47,163299,,,,,,,,,,,,0.08260180056095123,,,,,, +47,163349,,,,,,,,,,,,0.060325123369693756,,,,,, +47,163399,,,,,,,,,,,,0.059793345630168915,,,,,, +47,163449,,,,,,,,,,,,0.07342450320720673,,,,,, +47,163499,,,,,,,,,,,,0.06313382089138031,,,,,, +47,163549,,,,,,,,,,,,0.06569235026836395,,,,,, +47,163599,,,,,,,,,,,,0.07295133918523788,,,,,, +47,163649,,,,,,,,,,,,0.05990942567586899,,,,,, +47,163699,,,,,,,,,,,,0.06795215606689453,,,,,, +47,163749,,,,,,,,,,,,0.08115556836128235,,,,,, +47,163799,,,,,,,,,,,,0.07270985096693039,,,,,, +47,163849,,,,,,,,,,,,0.08151606470346451,,,,,, +47,163899,,,,,,,,,,,,0.06655491888523102,,,,,, +47,163949,,,,,,,,,,,,0.07360106706619263,,,,,, +47,163999,,,,,,,,,,,,0.06109766289591789,,,,,, +47,164049,,,,,,,,,,,,0.06653271615505219,,,,,, +47,164099,,,,,,,,,,,,0.06024639308452606,,,,,, +47,164149,,,,,,,,,,,,0.07097911089658737,,,,,, +47,164199,,,,,,,,,,,,0.0642373114824295,,,,,, +47,164249,,,,,,,,,,,,0.0556071475148201,,,,,, +47,164299,,,,,,,,,,,,0.06650857627391815,,,,,, +47,164349,,,,,,,,,,,,0.06834691762924194,,,,,, +47,164399,,,,,,,,,,,,0.06714017689228058,,,,,, +47,164449,,,,,,,,,,,,0.07321331650018692,,,,,, +47,164499,,,,,,,,,,,,0.06089281290769577,,,,,, +47,164549,,,,,,,,,,,,0.07136587798595428,,,,,, +47,164599,,,,,,,,,,,,0.0679340809583664,,,,,, +47,164649,,,,,,,,,,,,0.06405358016490936,,,,,, +47,164699,,,,,,,,,,,,0.054195865988731384,,,,,, +47,164749,,,,,,,,,,,,0.07434999197721481,,,,,, +47,164799,,,,,,,,,,,,0.06164916604757309,,,,,, +47,164849,,,,,,,,,,,,0.06935550272464752,,,,,, +47,164899,,,,,,,,,,,,0.07099369913339615,,,,,, +47,164949,,,,,,,,,,,,0.06965222209692001,,,,,, +47,164999,,,,,,,,,,,,0.06864826381206512,,,,,, +47,165049,,,,,,,,,,,,0.06960811465978622,,,,,, +47,165099,,,,,,,,,,,,0.056644730269908905,,,,,, +47,165149,,,,,,,,,,,,0.062218088656663895,,,,,, +47,165199,,,,,,,,,,,,0.06608160585165024,,,,,, +47,165249,,,,,,,,,,,,0.07001981139183044,,,,,, +47,165299,,,,,,,,,,,,0.06611630320549011,,,,,, +47,165311,,,,,,,,,,,,,0.23840872943401337,0.07784221321344376,0.26804205775260925,0.05832093954086304,0.24429753422737122,0.07784221321344376 +47,165311,,,,,,,0.22104063630104065,0.0692511573433876,0.4086337089538574,0.16665148735046387,0.3937126398086548,,,,,,, +48,165349,,,,,,,,,,,,0.06386231631040573,,,,,, +48,165399,,,,,,,,,,,,0.06596368551254272,,,,,, +48,165449,,,,,,,,,,,,0.07058568298816681,,,,,, +48,165499,,,,,,,,,,,,0.06222035363316536,,,,,, +48,165549,,,,,,,,,,,,0.06532755494117737,,,,,, +48,165599,,,,,,,,,,,,0.06921178102493286,,,,,, +48,165649,,,,,,,,,,,,0.06939572840929031,,,,,, +48,165699,,,,,,,,,,,,0.06875061988830566,,,,,, +48,165749,,,,,,,,,,,,0.06545958667993546,,,,,, +48,165799,,,,,,,,,,,,0.06780021637678146,,,,,, +48,165849,,,,,,,,,,,,0.07385618984699249,,,,,, +48,165899,,,,,,,,,,,,0.07108248770236969,,,,,, +48,165949,,,,,,,,,,,,0.07154245674610138,,,,,, +48,165999,,,,,,,,,,,,0.07181889563798904,,,,,, +48,166049,,,,,,,,,,,,0.07453018426895142,,,,,, +48,166099,,,,,,,,,,,,0.06484851986169815,,,,,, +48,166149,,,,,,,,,,,,0.06396172940731049,,,,,, +48,166199,,,,,,,,,,,,0.07119961082935333,,,,,, +48,166249,,,,,,,,,,,,0.0786740630865097,,,,,, +48,166299,,,,,,,,,,,,0.07575934380292892,,,,,, +48,166349,,,,,,,,,,,,0.07037372887134552,,,,,, +48,166399,,,,,,,,,,,,0.07119414210319519,,,,,, +48,166449,,,,,,,,,,,,0.06577052175998688,,,,,, +48,166499,,,,,,,,,,,,0.07539519667625427,,,,,, +48,166549,,,,,,,,,,,,0.06835572421550751,,,,,, +48,166599,,,,,,,,,,,,0.0749531090259552,,,,,, +48,166649,,,,,,,,,,,,0.06907011568546295,,,,,, +48,166699,,,,,,,,,,,,0.07898843288421631,,,,,, +48,166749,,,,,,,,,,,,0.05891096591949463,,,,,, +48,166799,,,,,,,,,,,,0.07149811089038849,,,,,, +48,166849,,,,,,,,,,,,0.08343815058469772,,,,,, +48,166899,,,,,,,,,,,,0.08292359858751297,,,,,, +48,166949,,,,,,,,,,,,0.05992087349295616,,,,,, +48,166999,,,,,,,,,,,,0.06653431057929993,,,,,, +48,167049,,,,,,,,,,,,0.06742776930332184,,,,,, +48,167099,,,,,,,,,,,,0.060064300894737244,,,,,, +48,167149,,,,,,,,,,,,0.0593622550368309,,,,,, +48,167199,,,,,,,,,,,,0.06383216381072998,,,,,, +48,167249,,,,,,,,,,,,0.06935165822505951,,,,,, +48,167299,,,,,,,,,,,,0.06741654872894287,,,,,, +48,167349,,,,,,,,,,,,0.06752253323793411,,,,,, +48,167399,,,,,,,,,,,,0.07615570724010468,,,,,, +48,167449,,,,,,,,,,,,0.07776552438735962,,,,,, +48,167499,,,,,,,,,,,,0.0746804028749466,,,,,, +48,167549,,,,,,,,,,,,0.058592937886714935,,,,,, +48,167599,,,,,,,,,,,,0.07696931064128876,,,,,, +48,167649,,,,,,,,,,,,0.07116404175758362,,,,,, +48,167699,,,,,,,,,,,,0.06627896428108215,,,,,, +48,167749,,,,,,,,,,,,0.06464411318302155,,,,,, +48,167799,,,,,,,,,,,,0.06375053524971008,,,,,, +48,167849,,,,,,,,,,,,0.0770621970295906,,,,,, +48,167899,,,,,,,,,,,,0.06193869188427925,,,,,, +48,167949,,,,,,,,,,,,0.0630011111497879,,,,,, +48,167999,,,,,,,,,,,,0.06309914588928223,,,,,, +48,168049,,,,,,,,,,,,0.06330502033233643,,,,,, +48,168099,,,,,,,,,,,,0.06747472286224365,,,,,, +48,168149,,,,,,,,,,,,0.06379634141921997,,,,,, +48,168199,,,,,,,,,,,,0.06748001277446747,,,,,, +48,168249,,,,,,,,,,,,0.07149983942508698,,,,,, +48,168299,,,,,,,,,,,,0.0679665058851242,,,,,, +48,168349,,,,,,,,,,,,0.07679903507232666,,,,,, +48,168399,,,,,,,,,,,,0.07414348423480988,,,,,, +48,168449,,,,,,,,,,,,0.05862880498170853,,,,,, +48,168499,,,,,,,,,,,,0.07122544199228287,,,,,, +48,168549,,,,,,,,,,,,0.08583889901638031,,,,,, +48,168599,,,,,,,,,,,,0.08850954473018646,,,,,, +48,168649,,,,,,,,,,,,0.07835708558559418,,,,,, +48,168699,,,,,,,,,,,,0.06916792690753937,,,,,, +48,168749,,,,,,,,,,,,0.05910852923989296,,,,,, +48,168755,,,,,,,,,,,,,0.23664535582065582,0.07660333812236786,0.2713155150413513,0.07330793142318726,0.24302434921264648,0.07660333812236786 +48,168755,,,,,,,0.21953722834587097,0.06821268051862717,0.42333754897117615,0.17914628982543945,0.4047067165374756,,,,,,, +49,168799,,,,,,,,,,,,0.06328994780778885,,,,,, +49,168849,,,,,,,,,,,,0.08041151612997055,,,,,, +49,168899,,,,,,,,,,,,0.06616998463869095,,,,,, +49,168949,,,,,,,,,,,,0.06971462070941925,,,,,, +49,168999,,,,,,,,,,,,0.06342185288667679,,,,,, +49,169049,,,,,,,,,,,,0.0606747567653656,,,,,, +49,169099,,,,,,,,,,,,0.07409219443798065,,,,,, +49,169149,,,,,,,,,,,,0.06361701339483261,,,,,, +49,169199,,,,,,,,,,,,0.06926803290843964,,,,,, +49,169249,,,,,,,,,,,,0.06016818434000015,,,,,, +49,169299,,,,,,,,,,,,0.07494412362575531,,,,,, +49,169349,,,,,,,,,,,,0.06172263249754906,,,,,, +49,169399,,,,,,,,,,,,0.06788106262683868,,,,,, +49,169449,,,,,,,,,,,,0.06537884473800659,,,,,, +49,169499,,,,,,,,,,,,0.06615632772445679,,,,,, +49,169549,,,,,,,,,,,,0.07206760346889496,,,,,, +49,169599,,,,,,,,,,,,0.055968090891838074,,,,,, +49,169649,,,,,,,,,,,,0.06537044793367386,,,,,, +49,169699,,,,,,,,,,,,0.0722966343164444,,,,,, +49,169749,,,,,,,,,,,,0.06020133197307587,,,,,, +49,169799,,,,,,,,,,,,0.0650690346956253,,,,,, +49,169849,,,,,,,,,,,,0.06664639711380005,,,,,, +49,169899,,,,,,,,,,,,0.08153501152992249,,,,,, +49,169949,,,,,,,,,,,,0.08042643219232559,,,,,, +49,169999,,,,,,,,,,,,0.0803072601556778,,,,,, +49,170049,,,,,,,,,,,,0.0665106251835823,,,,,, +49,170099,,,,,,,,,,,,0.055965226143598557,,,,,, +49,170149,,,,,,,,,,,,0.05020205304026604,,,,,, +49,170199,,,,,,,,,,,,0.06899172067642212,,,,,, +49,170249,,,,,,,,,,,,0.07143132388591766,,,,,, +49,170299,,,,,,,,,,,,0.08082056790590286,,,,,, +49,170349,,,,,,,,,,,,0.06687500327825546,,,,,, +49,170399,,,,,,,,,,,,0.05934707075357437,,,,,, +49,170449,,,,,,,,,,,,0.06828573346138,,,,,, +49,170499,,,,,,,,,,,,0.05857899785041809,,,,,, +49,170549,,,,,,,,,,,,0.07041044533252716,,,,,, +49,170599,,,,,,,,,,,,0.0755632147192955,,,,,, +49,170649,,,,,,,,,,,,0.07727648317813873,,,,,, +49,170699,,,,,,,,,,,,0.06319612264633179,,,,,, +49,170749,,,,,,,,,,,,0.06392399966716766,,,,,, +49,170799,,,,,,,,,,,,0.06791287660598755,,,,,, +49,170849,,,,,,,,,,,,0.06020275503396988,,,,,, +49,170899,,,,,,,,,,,,0.07037815451622009,,,,,, +49,170949,,,,,,,,,,,,0.05489063635468483,,,,,, +49,170999,,,,,,,,,,,,0.07178893685340881,,,,,, +49,171049,,,,,,,,,,,,0.08236511796712875,,,,,, +49,171099,,,,,,,,,,,,0.06266766786575317,,,,,, +49,171149,,,,,,,,,,,,0.0763159841299057,,,,,, +49,171199,,,,,,,,,,,,0.07004888355731964,,,,,, +49,171249,,,,,,,,,,,,0.07923193275928497,,,,,, +49,171299,,,,,,,,,,,,0.06905536353588104,,,,,, +49,171349,,,,,,,,,,,,0.0668438971042633,,,,,, +49,171399,,,,,,,,,,,,0.06237636134028435,,,,,, +49,171449,,,,,,,,,,,,0.06375493109226227,,,,,, +49,171499,,,,,,,,,,,,0.0833248719573021,,,,,, +49,171549,,,,,,,,,,,,0.06711103767156601,,,,,, +49,171599,,,,,,,,,,,,0.06377846747636795,,,,,, +49,171649,,,,,,,,,,,,0.07984457910060883,,,,,, +49,171699,,,,,,,,,,,,0.058695338666439056,,,,,, +49,171749,,,,,,,,,,,,0.07139864563941956,,,,,, +49,171799,,,,,,,,,,,,0.06807413697242737,,,,,, +49,171849,,,,,,,,,,,,0.06812955439090729,,,,,, +49,171899,,,,,,,,,,,,0.06875832378864288,,,,,, +49,171949,,,,,,,,,,,,0.057805102318525314,,,,,, +49,171999,,,,,,,,,,,,0.06582100689411163,,,,,, +49,172049,,,,,,,,,,,,0.0831318125128746,,,,,, +49,172099,,,,,,,,,,,,0.0759967491030693,,,,,, +49,172149,,,,,,,,,,,,0.0638791173696518,,,,,, +49,172199,,,,,,,,,,,,0.07988661527633667,,,,,, +49,172199,,,,,,,,,,,,,0.23619914054870605,0.07665199786424637,0.2715834677219391,0.07271933555603027,0.24438545107841492,0.07665199786424637 +49,172199,,,,,,,0.2199658304452896,0.06853000074625015,0.41886526346206665,0.17533540725708008,0.40081077814102173,,,,,,, +50,172200,0.2370331734418869,0.07688800990581512,0.2661176919937134,0.07041490077972412,0.24108551442623138,0.07688800990581512,,,,,,,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e04a3b6761919a15b5cf07c4851f4cf6df92656c --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml @@ -0,0 +1,22 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: sweetnet + num_layers: 16 + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 43 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..1ab7791cef5f8e3ddaeaeb03b54c757f348b9094 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv @@ -0,0 +1,97 @@ +epoch,step,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +0,49,,,,,,0.08388811349868774,,,,,, +0,99,,,,,,0.10216234624385834,,,,,, +0,149,,,,,,0.0855562686920166,,,,,, +0,199,,,,,,0.09321336448192596,,,,,, +0,249,,,,,,0.1007053554058075,,,,,, +0,299,,,,,,0.07874541729688644,,,,,, +0,349,,,,,,0.08233687281608582,,,,,, +0,399,,,,,,0.07534334063529968,,,,,, +0,449,,,,,,0.0934503898024559,,,,,, +0,499,,,,,,0.0802527666091919,,,,,, +0,549,,,,,,0.09130729734897614,,,,,, +0,599,,,,,,0.08415951579809189,,,,,, +0,649,,,,,,0.08772262930870056,,,,,, +0,699,,,,,,0.0830405056476593,,,,,, +0,749,,,,,,0.07798415422439575,,,,,, +0,799,,,,,,0.08920863270759583,,,,,, +0,849,,,,,,0.08700984716415405,,,,,, +0,899,,,,,,0.07319904863834381,,,,,, +0,949,,,,,,0.08273889124393463,,,,,, +0,999,,,,,,0.08749556541442871,,,,,, +0,1049,,,,,,0.07491324841976166,,,,,, +0,1099,,,,,,0.08784081786870956,,,,,, +0,1149,,,,,,0.09018014371395111,,,,,, +0,1199,,,,,,0.07718037068843842,,,,,, +0,1249,,,,,,0.08412379026412964,,,,,, +0,1299,,,,,,0.07406212389469147,,,,,, +0,1349,,,,,,0.0793122798204422,,,,,, +0,1399,,,,,,0.0786973088979721,,,,,, +0,1449,,,,,,0.07997262477874756,,,,,, +0,1499,,,,,,0.06704673916101456,,,,,, +0,1549,,,,,,0.07329721748828888,,,,,, +0,1599,,,,,,0.09068983793258667,,,,,, +0,1649,,,,,,0.08924861252307892,,,,,, +0,1699,,,,,,0.08664675056934357,,,,,, +0,1749,,,,,,0.09725609421730042,,,,,, +0,1799,,,,,,0.07859526574611664,,,,,, +0,1849,,,,,,0.08847641944885254,,,,,, +0,1899,,,,,,0.07932386547327042,,,,,, +0,1949,,,,,,0.08019405603408813,,,,,, +0,1999,,,,,,0.09008166193962097,,,,,, +0,2049,,,,,,0.0930856317281723,,,,,, +0,2099,,,,,,0.08869922906160355,,,,,, +0,2149,,,,,,0.09920918941497803,,,,,, +0,2199,,,,,,0.08015277981758118,,,,,, +0,2249,,,,,,0.09079998731613159,,,,,, +0,2299,,,,,,0.08267915993928909,,,,,, +0,2349,,,,,,0.08108300715684891,,,,,, +0,2399,,,,,,0.0775560587644577,,,,,, +0,2449,,,,,,0.07977057993412018,,,,,, +0,2499,,,,,,0.08706203103065491,,,,,, +0,2549,,,,,,0.08416187763214111,,,,,, +0,2599,,,,,,0.06939032673835754,,,,,, +0,2649,,,,,,0.07570115476846695,,,,,, +0,2699,,,,,,0.07086978107690811,,,,,, +0,2749,,,,,,0.0759887620806694,,,,,, +0,2799,,,,,,0.07649315893650055,,,,,, +0,2849,,,,,,0.09259645640850067,,,,,, +0,2899,,,,,,0.07965490221977234,,,,,, +0,2949,,,,,,0.08176486194133759,,,,,, +0,2999,,,,,,0.07409823685884476,,,,,, +0,3049,,,,,,0.08124478161334991,,,,,, +0,3099,,,,,,0.08453717827796936,,,,,, +0,3149,,,,,,0.06766544282436371,,,,,, +0,3199,,,,,,0.08994880318641663,,,,,, +0,3249,,,,,,0.08550594747066498,,,,,, +0,3299,,,,,,0.08320712298154831,,,,,, +0,3349,,,,,,0.08586937934160233,,,,,, +0,3399,,,,,,0.08438414335250854,,,,,, +0,3443,,,,,,,0.24307027459144592,0.07975802570581436,0.18795442581176758,0.0351448655128479,0.1481495350599289,0.07975802570581436 +0,3443,0.24787677824497223,0.08404511958360672,0.10919687151908875,-0.01138150691986084,0.10639559477567673,,,,,,, +1,3449,,,,,,0.0681367740035057,,,,,, +1,3499,,,,,,0.07606565952301025,,,,,, +1,3549,,,,,,0.08201363682746887,,,,,, +1,3599,,,,,,0.08515547960996628,,,,,, +1,3649,,,,,,0.09270371496677399,,,,,, +1,3699,,,,,,0.0772261843085289,,,,,, +1,3749,,,,,,0.09261143207550049,,,,,, +1,3799,,,,,,0.07697796076536179,,,,,, +1,3849,,,,,,0.08492811769247055,,,,,, +1,3899,,,,,,0.08948181569576263,,,,,, +1,3949,,,,,,0.07871675491333008,,,,,, +1,3999,,,,,,0.08615582436323166,,,,,, +1,4049,,,,,,0.08666005730628967,,,,,, +1,4099,,,,,,0.058604370802640915,,,,,, +1,4149,,,,,,0.07518270611763,,,,,, +1,4199,,,,,,0.08326047658920288,,,,,, +1,4249,,,,,,0.06974588334560394,,,,,, +1,4299,,,,,,0.073076531291008,,,,,, +1,4349,,,,,,0.08086439967155457,,,,,, +1,4399,,,,,,0.0801098495721817,,,,,, +1,4449,,,,,,0.08512294292449951,,,,,, +1,4499,,,,,,0.07533182203769684,,,,,, +1,4549,,,,,,0.06570381671190262,,,,,, +1,4599,,,,,,0.07811304926872253,,,,,, +1,4649,,,,,,0.0796656459569931,,,,,, +1,4699,,,,,,0.07825014740228653,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e04a3b6761919a15b5cf07c4851f4cf6df92656c --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml @@ -0,0 +1,22 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: sweetnet + num_layers: 16 + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 43 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..8c22b8fd071ad72c3d3d097f566571d26d89132b --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/metrics.csv @@ -0,0 +1,225 @@ +epoch,step,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +1,3449,,,,,,0.07786133885383606,,,,,, +1,3499,,,,,,0.07688912749290466,,,,,, +1,3549,,,,,,0.07357418537139893,,,,,, +1,3599,,,,,,0.0795016884803772,,,,,, +1,3649,,,,,,0.07063755393028259,,,,,, +1,3699,,,,,,0.07631219923496246,,,,,, +1,3749,,,,,,0.06365974247455597,,,,,, +1,3799,,,,,,0.08241981267929077,,,,,, +1,3849,,,,,,0.0779370591044426,,,,,, +1,3899,,,,,,0.06563401222229004,,,,,, +1,3949,,,,,,0.07878659665584564,,,,,, +1,3999,,,,,,0.08367772400379181,,,,,, +1,4049,,,,,,0.08736704289913177,,,,,, +1,4099,,,,,,0.07984725385904312,,,,,, +1,4149,,,,,,0.08972132205963135,,,,,, +1,4199,,,,,,0.08744145184755325,,,,,, +1,4249,,,,,,0.08043539524078369,,,,,, +1,4299,,,,,,0.09696833789348602,,,,,, +1,4349,,,,,,0.08171270042657852,,,,,, +1,4399,,,,,,0.08730283379554749,,,,,, +1,4449,,,,,,0.08093704283237457,,,,,, +1,4499,,,,,,0.07454672455787659,,,,,, +1,4549,,,,,,0.07317573577165604,,,,,, +1,4599,,,,,,0.08327227830886841,,,,,, +1,4649,,,,,,0.07143848389387131,,,,,, +1,4699,,,,,,0.09136886894702911,,,,,, +1,4749,,,,,,0.08182407915592194,,,,,, +1,4799,,,,,,0.08683820068836212,,,,,, +1,4849,,,,,,0.07071494311094284,,,,,, +1,4899,,,,,,0.0776018351316452,,,,,, +1,4949,,,,,,0.06827138364315033,,,,,, +1,4999,,,,,,0.06886941194534302,,,,,, +1,5049,,,,,,0.0905894935131073,,,,,, +1,5099,,,,,,0.08958427608013153,,,,,, +1,5149,,,,,,0.07700611650943756,,,,,, +1,5199,,,,,,0.07953996956348419,,,,,, +1,5249,,,,,,0.07910604029893875,,,,,, +1,5299,,,,,,0.07421949505805969,,,,,, +1,5349,,,,,,0.08772246539592743,,,,,, +1,5399,,,,,,0.0729043036699295,,,,,, +1,5449,,,,,,0.08293335884809494,,,,,, +1,5499,,,,,,0.07145652174949646,,,,,, +1,5549,,,,,,0.07297110557556152,,,,,, +1,5599,,,,,,0.08113010227680206,,,,,, +1,5649,,,,,,0.0851583480834961,,,,,, +1,5699,,,,,,0.08950597047805786,,,,,, +1,5749,,,,,,0.0810697078704834,,,,,, +1,5799,,,,,,0.08282572031021118,,,,,, +1,5849,,,,,,0.08194883167743683,,,,,, +1,5899,,,,,,0.08707885444164276,,,,,, +1,5949,,,,,,0.07950876653194427,,,,,, +1,5999,,,,,,0.0812290757894516,,,,,, +1,6049,,,,,,0.0685386061668396,,,,,, +1,6099,,,,,,0.07300744950771332,,,,,, +1,6149,,,,,,0.0845588892698288,,,,,, +1,6199,,,,,,0.0804489478468895,,,,,, +1,6249,,,,,,0.08311319351196289,,,,,, +1,6299,,,,,,0.08081627637147903,,,,,, +1,6349,,,,,,0.07294031977653503,,,,,, +1,6399,,,,,,0.08067959547042847,,,,,, +1,6449,,,,,,0.08419083058834076,,,,,, +1,6499,,,,,,0.07240040600299835,,,,,, +1,6549,,,,,,0.06425128877162933,,,,,, +1,6599,,,,,,0.08639641851186752,,,,,, +1,6649,,,,,,0.07149176299571991,,,,,, +1,6699,,,,,,0.0797647014260292,,,,,, +1,6749,,,,,,0.08702337741851807,,,,,, +1,6799,,,,,,0.08475326001644135,,,,,, +1,6849,,,,,,0.07674646377563477,,,,,, +1,6887,,,,,,,0.2428445965051651,0.07992887496948242,0.18706274032592773,0.033078014850616455,0.11303585767745972,0.07992887496948242 +1,6887,0.2407272905111313,0.07905744761228561,0.2218627631664276,0.048657000064849854,0.18757736682891846,,,,,,, +2,6899,,,,,,0.079951211810112,,,,,, +2,6949,,,,,,0.06626259535551071,,,,,, +2,6999,,,,,,0.08248317241668701,,,,,, +2,7049,,,,,,0.07892666757106781,,,,,, +2,7099,,,,,,0.07992112636566162,,,,,, +2,7149,,,,,,0.07959146052598953,,,,,, +2,7199,,,,,,0.07685515284538269,,,,,, +2,7249,,,,,,0.070386603474617,,,,,, +2,7299,,,,,,0.07962964475154877,,,,,, +2,7349,,,,,,0.07473650574684143,,,,,, +2,7399,,,,,,0.07190623879432678,,,,,, +2,7449,,,,,,0.06905049085617065,,,,,, +2,7499,,,,,,0.08455823361873627,,,,,, +2,7549,,,,,,0.08871592581272125,,,,,, +2,7599,,,,,,0.08088777959346771,,,,,, +2,7649,,,,,,0.08846043050289154,,,,,, +2,7699,,,,,,0.08095838874578476,,,,,, +2,7749,,,,,,0.08411553502082825,,,,,, +2,7799,,,,,,0.08224877715110779,,,,,, +2,7849,,,,,,0.08819214254617691,,,,,, +2,7899,,,,,,0.0811326652765274,,,,,, +2,7949,,,,,,0.07009361684322357,,,,,, +2,7999,,,,,,0.07954050600528717,,,,,, +2,8049,,,,,,0.08421425521373749,,,,,, +2,8099,,,,,,0.08549927175045013,,,,,, +2,8149,,,,,,0.08675982058048248,,,,,, +2,8199,,,,,,0.09372960031032562,,,,,, +2,8249,,,,,,0.06981371343135834,,,,,, +2,8299,,,,,,0.06895104050636292,,,,,, +2,8349,,,,,,0.08631926029920578,,,,,, +2,8399,,,,,,0.08894161880016327,,,,,, +2,8449,,,,,,0.07643241435289383,,,,,, +2,8499,,,,,,0.07419160008430481,,,,,, +2,8549,,,,,,0.07535037398338318,,,,,, +2,8599,,,,,,0.08159302175045013,,,,,, +2,8649,,,,,,0.0858563631772995,,,,,, +2,8699,,,,,,0.07294251769781113,,,,,, +2,8749,,,,,,0.0963500589132309,,,,,, +2,8799,,,,,,0.08062624931335449,,,,,, +2,8849,,,,,,0.090266652405262,,,,,, +2,8899,,,,,,0.08601074665784836,,,,,, +2,8949,,,,,,0.0781533420085907,,,,,, +2,8999,,,,,,0.07838068902492523,,,,,, +2,9049,,,,,,0.08509926497936249,,,,,, +2,9099,,,,,,0.09269696474075317,,,,,, +2,9149,,,,,,0.07801882177591324,,,,,, +2,9199,,,,,,0.07585069537162781,,,,,, +2,9249,,,,,,0.08448976278305054,,,,,, +2,9299,,,,,,0.08630229532718658,,,,,, +2,9349,,,,,,0.08794878423213959,,,,,, +2,9399,,,,,,0.07871226966381073,,,,,, +2,9449,,,,,,0.0849204808473587,,,,,, +2,9499,,,,,,0.0656745508313179,,,,,, +2,9549,,,,,,0.08139486610889435,,,,,, +2,9599,,,,,,0.08917397260665894,,,,,, +2,9649,,,,,,0.07125058770179749,,,,,, +2,9699,,,,,,0.08216413110494614,,,,,, +2,9749,,,,,,0.0756622776389122,,,,,, +2,9799,,,,,,0.08457911014556885,,,,,, +2,9849,,,,,,0.08410723507404327,,,,,, +2,9899,,,,,,0.07081694155931473,,,,,, +2,9949,,,,,,0.07675020396709442,,,,,, +2,9999,,,,,,0.0777721181511879,,,,,, +2,10049,,,,,,0.08317817747592926,,,,,, +2,10099,,,,,,0.07605941593647003,,,,,, +2,10149,,,,,,0.07838498800992966,,,,,, +2,10199,,,,,,0.07740110158920288,,,,,, +2,10249,,,,,,0.07606194913387299,,,,,, +2,10299,,,,,,0.07760202884674072,,,,,, +2,10331,,,,,,,0.2423388510942459,0.08073865622282028,0.19311639666557312,0.023281872272491455,0.13198409974575043,0.08073865622282028 +2,10331,0.23929673433303833,0.07818306982517242,0.24353653192520142,0.05917179584503174,0.20856839418411255,,,,,,, +3,10349,,,,,,0.0911257416009903,,,,,, +3,10399,,,,,,0.07968185842037201,,,,,, +3,10449,,,,,,0.08848444372415543,,,,,, +3,10499,,,,,,0.07711395621299744,,,,,, +3,10549,,,,,,0.09371352940797806,,,,,, +3,10599,,,,,,0.07983207702636719,,,,,, +3,10649,,,,,,0.06718545407056808,,,,,, +3,10699,,,,,,0.07691479474306107,,,,,, +3,10749,,,,,,0.06831815838813782,,,,,, +3,10799,,,,,,0.07032796740531921,,,,,, +3,10849,,,,,,0.08033628761768341,,,,,, +3,10899,,,,,,0.07291938364505768,,,,,, +3,10949,,,,,,0.08197033405303955,,,,,, +3,10999,,,,,,0.06579996645450592,,,,,, +3,11049,,,,,,0.08071856945753098,,,,,, +3,11099,,,,,,0.0769806057214737,,,,,, +3,11149,,,,,,0.08159823715686798,,,,,, +3,11199,,,,,,0.07865844666957855,,,,,, +3,11249,,,,,,0.08081309497356415,,,,,, +3,11299,,,,,,0.07246294617652893,,,,,, +3,11349,,,,,,0.08488431572914124,,,,,, +3,11399,,,,,,0.0833190381526947,,,,,, +3,11449,,,,,,0.09000639617443085,,,,,, +3,11499,,,,,,0.08565282821655273,,,,,, +3,11549,,,,,,0.07199060171842575,,,,,, +3,11599,,,,,,0.0733889788389206,,,,,, +3,11649,,,,,,0.07584719359874725,,,,,, +3,11699,,,,,,0.07567227631807327,,,,,, +3,11749,,,,,,0.07646821439266205,,,,,, +3,11799,,,,,,0.0734507143497467,,,,,, +3,11849,,,,,,0.07725149393081665,,,,,, +3,11899,,,,,,0.08244595676660538,,,,,, +3,11949,,,,,,0.07498682290315628,,,,,, +3,11999,,,,,,0.07249443233013153,,,,,, +3,12049,,,,,,0.06906521320343018,,,,,, +3,12099,,,,,,0.08445877581834793,,,,,, +3,12149,,,,,,0.07974586635828018,,,,,, +3,12199,,,,,,0.0855690985918045,,,,,, +3,12249,,,,,,0.08733657747507095,,,,,, +3,12299,,,,,,0.08693091571331024,,,,,, +3,12349,,,,,,0.09198538959026337,,,,,, +3,12399,,,,,,0.07624098658561707,,,,,, +3,12449,,,,,,0.07106149196624756,,,,,, +3,12499,,,,,,0.0731172040104866,,,,,, +3,12549,,,,,,0.08462018519639969,,,,,, +3,12599,,,,,,0.07961779832839966,,,,,, +3,12649,,,,,,0.07693125307559967,,,,,, +3,12699,,,,,,0.07730059325695038,,,,,, +3,12749,,,,,,0.08786369860172272,,,,,, +3,12799,,,,,,0.07671517133712769,,,,,, +3,12849,,,,,,0.0738433450460434,,,,,, +3,12899,,,,,,0.08356526494026184,,,,,, +3,12949,,,,,,0.07429598271846771,,,,,, +3,12999,,,,,,0.07874700427055359,,,,,, +3,13049,,,,,,0.07369473576545715,,,,,, +3,13099,,,,,,0.07921695709228516,,,,,, +3,13149,,,,,,0.07825799286365509,,,,,, +3,13199,,,,,,0.07284682244062424,,,,,, +3,13249,,,,,,0.07541198283433914,,,,,, +3,13299,,,,,,0.07726070284843445,,,,,, +3,13349,,,,,,0.06720633804798126,,,,,, +3,13399,,,,,,0.08659391850233078,,,,,, +3,13449,,,,,,0.08258906751871109,,,,,, +3,13499,,,,,,0.0862850770354271,,,,,, +3,13549,,,,,,0.06959103047847748,,,,,, +3,13599,,,,,,0.0821298360824585,,,,,, +3,13649,,,,,,0.09408324956893921,,,,,, +3,13699,,,,,,0.08034470677375793,,,,,, +3,13749,,,,,,0.062180764973163605,,,,,, +3,13775,,,,,,,0.24564437568187714,0.08101589977741241,0.184833362698555,0.019928038120269775,0.15625159442424774,0.08101589977741241 +3,13775,0.23864004015922546,0.07784240692853928,0.25182831287384033,0.06327164173126221,0.22233828902244568,,,,,,, +4,13799,,,,,,0.07924309372901917,,,,,, +4,13849,,,,,,0.07122133672237396,,,,,, +4,13899,,,,,,0.06907612085342407,,,,,, +4,13949,,,,,,0.08634354174137115,,,,,, +4,13999,,,,,,0.08188614249229431,,,,,, +4,14049,,,,,,0.08861803263425827,,,,,, +4,14099,,,,,,0.0859004408121109,,,,,, +4,14149,,,,,,0.06870737671852112,,,,,, +4,14199,,,,,,0.07716614753007889,,,,,, +4,14249,,,,,,0.07641813158988953,,,,,, +4,14299,,,,,,0.0628974661231041,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e04a3b6761919a15b5cf07c4851f4cf6df92656c --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml @@ -0,0 +1,22 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: sweetnet + num_layers: 16 + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 43 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..dfd6cd787d14ac62acaf5290db3e873906769481 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/metrics.csv @@ -0,0 +1,1334 @@ +epoch,step,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +4,13799,,,,,,0.08741734176874161,,,,,, +4,13849,,,,,,0.07546859234571457,,,,,, +4,13899,,,,,,0.07419124245643616,,,,,, +4,13949,,,,,,0.07214954495429993,,,,,, +4,13999,,,,,,0.08561449497938156,,,,,, +4,14049,,,,,,0.08803869783878326,,,,,, +4,14099,,,,,,0.07533102482557297,,,,,, +4,14149,,,,,,0.07835216075181961,,,,,, +4,14199,,,,,,0.09060768783092499,,,,,, +4,14249,,,,,,0.07750582695007324,,,,,, +4,14299,,,,,,0.07087589800357819,,,,,, +4,14349,,,,,,0.07916562259197235,,,,,, +4,14399,,,,,,0.07782582193613052,,,,,, +4,14449,,,,,,0.08946681022644043,,,,,, +4,14499,,,,,,0.07488523423671722,,,,,, +4,14549,,,,,,0.08429359644651413,,,,,, +4,14599,,,,,,0.08178447932004929,,,,,, +4,14649,,,,,,0.06895329058170319,,,,,, +4,14699,,,,,,0.07855689525604248,,,,,, +4,14749,,,,,,0.07720164954662323,,,,,, +4,14799,,,,,,0.07003427296876907,,,,,, +4,14849,,,,,,0.087688148021698,,,,,, +4,14899,,,,,,0.058297548443078995,,,,,, +4,14949,,,,,,0.08399557322263718,,,,,, +4,14999,,,,,,0.08868458867073059,,,,,, +4,15049,,,,,,0.08217436075210571,,,,,, +4,15099,,,,,,0.0824580043554306,,,,,, +4,15149,,,,,,0.08736208081245422,,,,,, +4,15199,,,,,,0.07710635662078857,,,,,, +4,15249,,,,,,0.07727095484733582,,,,,, +4,15299,,,,,,0.07279283553361893,,,,,, +4,15349,,,,,,0.08152757585048676,,,,,, +4,15399,,,,,,0.07989521324634552,,,,,, +4,15449,,,,,,0.07497096061706543,,,,,, +4,15499,,,,,,0.07501927763223648,,,,,, +4,15549,,,,,,0.07807422429323196,,,,,, +4,15599,,,,,,0.08458483219146729,,,,,, +4,15649,,,,,,0.07833535969257355,,,,,, +4,15699,,,,,,0.09079738706350327,,,,,, +4,15749,,,,,,0.0701671838760376,,,,,, +4,15799,,,,,,0.07326415181159973,,,,,, +4,15849,,,,,,0.0789603739976883,,,,,, +4,15899,,,,,,0.07889299094676971,,,,,, +4,15949,,,,,,0.0781865268945694,,,,,, +4,15999,,,,,,0.06999260187149048,,,,,, +4,16049,,,,,,0.07905632257461548,,,,,, +4,16099,,,,,,0.07189316302537918,,,,,, +4,16149,,,,,,0.07220342755317688,,,,,, +4,16199,,,,,,0.07463077455759048,,,,,, +4,16249,,,,,,0.07877461612224579,,,,,, +4,16299,,,,,,0.06703780591487885,,,,,, +4,16349,,,,,,0.0769832655787468,,,,,, +4,16399,,,,,,0.08317574858665466,,,,,, +4,16449,,,,,,0.0825233906507492,,,,,, +4,16499,,,,,,0.08888594806194305,,,,,, +4,16549,,,,,,0.0847126692533493,,,,,, +4,16599,,,,,,0.07897502183914185,,,,,, +4,16649,,,,,,0.072728231549263,,,,,, +4,16699,,,,,,0.07665809988975525,,,,,, +4,16749,,,,,,0.08621205389499664,,,,,, +4,16799,,,,,,0.0764518678188324,,,,,, +4,16849,,,,,,0.07122839242219925,,,,,, +4,16899,,,,,,0.08034373819828033,,,,,, +4,16949,,,,,,0.08485832065343857,,,,,, +4,16999,,,,,,0.08220191299915314,,,,,, +4,17049,,,,,,0.09143947809934616,,,,,, +4,17099,,,,,,0.08503314852714539,,,,,, +4,17149,,,,,,0.07855559885501862,,,,,, +4,17199,,,,,,0.07949613034725189,,,,,, +4,17219,,,,,,,0.24431057274341583,0.08009027689695358,0.18562142550945282,0.03112548589706421,0.13532570004463196,0.08009027689695358 +4,17219,0.23897111415863037,0.07807202637195587,0.24662315845489502,0.06051510572433472,0.21166487038135529,,,,,,, +5,17249,,,,,,0.07676487416028976,,,,,, +5,17299,,,,,,0.08336614072322845,,,,,, +5,17349,,,,,,0.0819607824087143,,,,,, +5,17399,,,,,,0.08113186806440353,,,,,, +5,17449,,,,,,0.08307405561208725,,,,,, +5,17499,,,,,,0.07037048786878586,,,,,, +5,17549,,,,,,0.08786014467477798,,,,,, +5,17599,,,,,,0.06616616994142532,,,,,, +5,17649,,,,,,0.0768594890832901,,,,,, +5,17699,,,,,,0.08254159986972809,,,,,, +5,17749,,,,,,0.06334051489830017,,,,,, +5,17799,,,,,,0.06701889634132385,,,,,, +5,17849,,,,,,0.0704217404127121,,,,,, +5,17899,,,,,,0.059559814631938934,,,,,, +5,17949,,,,,,0.08276353776454926,,,,,, +5,17999,,,,,,0.07566548138856888,,,,,, +5,18049,,,,,,0.07119207829236984,,,,,, +5,18099,,,,,,0.07606321573257446,,,,,, +5,18149,,,,,,0.07626071572303772,,,,,, +5,18199,,,,,,0.0764455497264862,,,,,, +5,18249,,,,,,0.0817413330078125,,,,,, +5,18299,,,,,,0.08027124404907227,,,,,, +5,18349,,,,,,0.07322339713573456,,,,,, +5,18399,,,,,,0.09341762959957123,,,,,, +5,18449,,,,,,0.06432656943798065,,,,,, +5,18499,,,,,,0.07551581412553787,,,,,, +5,18549,,,,,,0.08024974167346954,,,,,, +5,18599,,,,,,0.07853420078754425,,,,,, +5,18649,,,,,,0.07678589224815369,,,,,, +5,18699,,,,,,0.09048770368099213,,,,,, +5,18749,,,,,,0.08237355947494507,,,,,, +5,18799,,,,,,0.06977479159832001,,,,,, +5,18849,,,,,,0.08126434683799744,,,,,, +5,18899,,,,,,0.0811743289232254,,,,,, +5,18949,,,,,,0.0789283961057663,,,,,, +5,18999,,,,,,0.08589077740907669,,,,,, +5,19049,,,,,,0.07168283313512802,,,,,, +5,19099,,,,,,0.06395164132118225,,,,,, +5,19149,,,,,,0.08421797305345535,,,,,, +5,19199,,,,,,0.09887120127677917,,,,,, +5,19249,,,,,,0.08136516809463501,,,,,, +5,19299,,,,,,0.07855359464883804,,,,,, +5,19349,,,,,,0.07556293904781342,,,,,, +5,19399,,,,,,0.07843879610300064,,,,,, +5,19449,,,,,,0.07568894326686859,,,,,, +5,19499,,,,,,0.08717168867588043,,,,,, +5,19549,,,,,,0.07159489393234253,,,,,, +5,19599,,,,,,0.08420191705226898,,,,,, +5,19649,,,,,,0.06161299720406532,,,,,, +5,19699,,,,,,0.07611848413944244,,,,,, +5,19749,,,,,,0.07795076817274094,,,,,, +5,19799,,,,,,0.07472160458564758,,,,,, +5,19849,,,,,,0.0746777355670929,,,,,, +5,19899,,,,,,0.07734312117099762,,,,,, +5,19949,,,,,,0.07600680738687515,,,,,, +5,19999,,,,,,0.08858415484428406,,,,,, +5,20049,,,,,,0.0845714658498764,,,,,, +5,20099,,,,,,0.08980877697467804,,,,,, +5,20149,,,,,,0.08098077774047852,,,,,, +5,20199,,,,,,0.08655717223882675,,,,,, +5,20249,,,,,,0.06724429130554199,,,,,, +5,20299,,,,,,0.07782319188117981,,,,,, +5,20349,,,,,,0.07154403626918793,,,,,, +5,20399,,,,,,0.0786103829741478,,,,,, +5,20449,,,,,,0.07660291343927383,,,,,, +5,20499,,,,,,0.07484543323516846,,,,,, +5,20549,,,,,,0.07501861453056335,,,,,, +5,20599,,,,,,0.08074064552783966,,,,,, +5,20649,,,,,,0.07772921025753021,,,,,, +5,20663,,,,,,,0.24188248813152313,0.0799143835902214,0.2093326449394226,0.03325331211090088,0.1635536104440689,0.0799143835902214 +5,20663,0.23723866045475006,0.07710693031549454,0.2688694894313812,0.07212167978286743,0.23453643918037415,,,,,,, +6,20699,,,,,,0.08403125405311584,,,,,, +6,20749,,,,,,0.08115894347429276,,,,,, +6,20799,,,,,,0.08576729893684387,,,,,, +6,20849,,,,,,0.06718422472476959,,,,,, +6,20899,,,,,,0.07586412131786346,,,,,, +6,20949,,,,,,0.0857454463839531,,,,,, +6,20999,,,,,,0.07949857413768768,,,,,, +6,21049,,,,,,0.08554895222187042,,,,,, +6,21099,,,,,,0.08493838459253311,,,,,, +6,21149,,,,,,0.07454274594783783,,,,,, +6,21199,,,,,,0.08057142049074173,,,,,, +6,21249,,,,,,0.07564838230609894,,,,,, +6,21299,,,,,,0.09090153872966766,,,,,, +6,21349,,,,,,0.07033482939004898,,,,,, +6,21399,,,,,,0.06841740012168884,,,,,, +6,21449,,,,,,0.08105845004320145,,,,,, +6,21499,,,,,,0.07158811390399933,,,,,, +6,21549,,,,,,0.0873168557882309,,,,,, +6,21599,,,,,,0.07780035585165024,,,,,, +6,21649,,,,,,0.07736464589834213,,,,,, +6,21699,,,,,,0.07204823195934296,,,,,, +6,21749,,,,,,0.07816623896360397,,,,,, +6,21799,,,,,,0.0846073254942894,,,,,, +6,21849,,,,,,0.07403219491243362,,,,,, +6,21899,,,,,,0.07938915491104126,,,,,, +6,21949,,,,,,0.07934057712554932,,,,,, +6,21999,,,,,,0.08007627725601196,,,,,, +6,22049,,,,,,0.08014832437038422,,,,,, +6,22099,,,,,,0.07678353786468506,,,,,, +6,22149,,,,,,0.08708062767982483,,,,,, +6,22199,,,,,,0.08551530539989471,,,,,, +6,22249,,,,,,0.07616369426250458,,,,,, +6,22299,,,,,,0.07638710737228394,,,,,, +6,22349,,,,,,0.08043354749679565,,,,,, +6,22399,,,,,,0.10160332918167114,,,,,, +6,22449,,,,,,0.09072577953338623,,,,,, +6,22499,,,,,,0.08942574262619019,,,,,, +6,22549,,,,,,0.08746577799320221,,,,,, +6,22599,,,,,,0.0801737904548645,,,,,, +6,22649,,,,,,0.08026677370071411,,,,,, +6,22699,,,,,,0.07200542837381363,,,,,, +6,22749,,,,,,0.09565897285938263,,,,,, +6,22799,,,,,,0.09591035544872284,,,,,, +6,22849,,,,,,0.07383350282907486,,,,,, +6,22899,,,,,,0.06649626791477203,,,,,, +6,22949,,,,,,0.07809530198574066,,,,,, +6,22999,,,,,,0.08537249267101288,,,,,, +6,23049,,,,,,0.08112448453903198,,,,,, +6,23099,,,,,,0.07933664321899414,,,,,, +6,23149,,,,,,0.08876686543226242,,,,,, +6,23199,,,,,,0.07519214600324631,,,,,, +6,23249,,,,,,0.07510419189929962,,,,,, +6,23299,,,,,,0.0846848338842392,,,,,, +6,23349,,,,,,0.08233222365379333,,,,,, +6,23399,,,,,,0.09393054991960526,,,,,, +6,23449,,,,,,0.08437766879796982,,,,,, +6,23499,,,,,,0.08446265757083893,,,,,, +6,23549,,,,,,0.09275855869054794,,,,,, +6,23599,,,,,,0.07690387964248657,,,,,, +6,23649,,,,,,0.08543004095554352,,,,,, +6,23699,,,,,,0.08497542142868042,,,,,, +6,23749,,,,,,0.07616639137268066,,,,,, +6,23799,,,,,,0.0821763128042221,,,,,, +6,23849,,,,,,0.0850110799074173,,,,,, +6,23899,,,,,,0.08288733661174774,,,,,, +6,23949,,,,,,0.0819273293018341,,,,,, +6,23999,,,,,,0.07726640999317169,,,,,, +6,24049,,,,,,0.08449141681194305,,,,,, +6,24099,,,,,,0.08104085177183151,,,,,, +6,24107,,,,,,,0.24775084853172302,0.08198036998510361,nan,0.008260488510131836,0.10349677503108978,0.08198036998510361 +6,24107,0.24350324273109436,0.08179399371147156,0.15888866782188416,0.015719592571258545,0.16284221410751343,,,,,,, +7,24149,,,,,,0.09618672728538513,,,,,, +7,24199,,,,,,0.0824613943696022,,,,,, +7,24249,,,,,,0.0910579264163971,,,,,, +7,24299,,,,,,0.06989841163158417,,,,,, +7,24349,,,,,,0.08373664319515228,,,,,, +7,24399,,,,,,0.07766248285770416,,,,,, +7,24449,,,,,,0.07418851554393768,,,,,, +7,24499,,,,,,0.07033559679985046,,,,,, +7,24549,,,,,,0.08052956312894821,,,,,, +7,24599,,,,,,0.06809940934181213,,,,,, +7,24649,,,,,,0.08099529147148132,,,,,, +7,24699,,,,,,0.08025278151035309,,,,,, +7,24749,,,,,,0.08259212970733643,,,,,, +7,24799,,,,,,0.07537303119897842,,,,,, +7,24849,,,,,,0.07197880744934082,,,,,, +7,24899,,,,,,0.07492133975028992,,,,,, +7,24949,,,,,,0.08231750130653381,,,,,, +7,24999,,,,,,0.06724129617214203,,,,,, +7,25049,,,,,,0.07606442272663116,,,,,, +7,25099,,,,,,0.08893880248069763,,,,,, +7,25149,,,,,,0.08133386075496674,,,,,, +7,25199,,,,,,0.08109623193740845,,,,,, +7,25249,,,,,,0.08441277593374252,,,,,, +7,25299,,,,,,0.07348588109016418,,,,,, +7,25349,,,,,,0.07629901170730591,,,,,, +7,25399,,,,,,0.07094605267047882,,,,,, +7,25449,,,,,,0.08475945889949799,,,,,, +7,25499,,,,,,0.08080960810184479,,,,,, +7,25549,,,,,,0.07088908553123474,,,,,, +7,25599,,,,,,0.08250606060028076,,,,,, +7,25649,,,,,,0.08565014600753784,,,,,, +7,25699,,,,,,0.07747519761323929,,,,,, +7,25749,,,,,,0.07537037879228592,,,,,, +7,25799,,,,,,0.0769849494099617,,,,,, +7,25849,,,,,,0.07322341203689575,,,,,, +7,25899,,,,,,0.07843898236751556,,,,,, +7,25949,,,,,,0.07249739021062851,,,,,, +7,25999,,,,,,0.07854543626308441,,,,,, +7,26049,,,,,,0.08518142998218536,,,,,, +7,26099,,,,,,0.07934676855802536,,,,,, +7,26149,,,,,,0.08592867851257324,,,,,, +7,26199,,,,,,0.08420571684837341,,,,,, +7,26249,,,,,,0.08779219537973404,,,,,, +7,26299,,,,,,0.08711168169975281,,,,,, +7,26349,,,,,,0.06810687482357025,,,,,, +7,26399,,,,,,0.07530883699655533,,,,,, +7,26449,,,,,,0.08721911907196045,,,,,, +7,26499,,,,,,0.0689428374171257,,,,,, +7,26549,,,,,,0.0718601644039154,,,,,, +7,26599,,,,,,0.0801692083477974,,,,,, +7,26649,,,,,,0.09008936583995819,,,,,, +7,26699,,,,,,0.0804714560508728,,,,,, +7,26749,,,,,,0.08062635362148285,,,,,, +7,26799,,,,,,0.07670386135578156,,,,,, +7,26849,,,,,,0.06954742223024368,,,,,, +7,26899,,,,,,0.08106066286563873,,,,,, +7,26949,,,,,,0.0746406763792038,,,,,, +7,26999,,,,,,0.06939032673835754,,,,,, +7,27049,,,,,,0.07818087935447693,,,,,, +7,27099,,,,,,0.08036179095506668,,,,,, +7,27149,,,,,,0.07899551838636398,,,,,, +7,27199,,,,,,0.08300110697746277,,,,,, +7,27249,,,,,,0.08173968642950058,,,,,, +7,27299,,,,,,0.08070055395364761,,,,,, +7,27349,,,,,,0.08202226459980011,,,,,, +7,27399,,,,,,0.07277172803878784,,,,,, +7,27449,,,,,,0.08254374563694,,,,,, +7,27499,,,,,,0.0838521420955658,,,,,, +7,27549,,,,,,0.07663394510746002,,,,,, +7,27551,,,,,,,0.24273043870925903,0.08001333475112915,0.1874786764383316,0.032056331634521484,0.1385774165391922,0.08001333475112915 +7,27551,0.2432851344347,0.08035115897655487,0.1853293925523758,0.03308594226837158,0.16375286877155304,,,,,,, +8,27599,,,,,,0.0755041241645813,,,,,, +8,27649,,,,,,0.0882633849978447,,,,,, +8,27699,,,,,,0.09273514151573181,,,,,, +8,27749,,,,,,0.09011861681938171,,,,,, +8,27799,,,,,,0.08272608369588852,,,,,, +8,27849,,,,,,0.07916013151407242,,,,,, +8,27899,,,,,,0.09325230121612549,,,,,, +8,27949,,,,,,0.07589638978242874,,,,,, +8,27999,,,,,,0.07552269101142883,,,,,, +8,28049,,,,,,0.0905989408493042,,,,,, +8,28099,,,,,,0.07360738515853882,,,,,, +8,28149,,,,,,0.0797913670539856,,,,,, +8,28199,,,,,,0.08075881004333496,,,,,, +8,28249,,,,,,0.08491916209459305,,,,,, +8,28299,,,,,,0.08572793006896973,,,,,, +8,28349,,,,,,0.07803569734096527,,,,,, +8,28399,,,,,,0.08736424893140793,,,,,, +8,28449,,,,,,0.08698990195989609,,,,,, +8,28499,,,,,,0.07869972288608551,,,,,, +8,28549,,,,,,0.09067746251821518,,,,,, +8,28599,,,,,,0.0912681594491005,,,,,, +8,28649,,,,,,0.08407153189182281,,,,,, +8,28699,,,,,,0.07171918451786041,,,,,, +8,28749,,,,,,0.08463146537542343,,,,,, +8,28799,,,,,,0.0789007768034935,,,,,, +8,28849,,,,,,0.07372965663671494,,,,,, +8,28899,,,,,,0.08921852707862854,,,,,, +8,28949,,,,,,0.07865914702415466,,,,,, +8,28999,,,,,,0.07963334023952484,,,,,, +8,29049,,,,,,0.0776829868555069,,,,,, +8,29099,,,,,,0.0839303582906723,,,,,, +8,29149,,,,,,0.08632133156061172,,,,,, +8,29199,,,,,,0.08261550962924957,,,,,, +8,29249,,,,,,0.07671313732862473,,,,,, +8,29299,,,,,,0.09436796605587006,,,,,, +8,29349,,,,,,0.08060885965824127,,,,,, +8,29399,,,,,,0.08117873966693878,,,,,, +8,29449,,,,,,0.0840056985616684,,,,,, +8,29499,,,,,,0.08319735527038574,,,,,, +8,29549,,,,,,0.08713065087795258,,,,,, +8,29599,,,,,,0.0799192264676094,,,,,, +8,29649,,,,,,0.07596614211797714,,,,,, +8,29699,,,,,,0.0763651430606842,,,,,, +8,29749,,,,,,0.06955477595329285,,,,,, +8,29799,,,,,,0.07575822621583939,,,,,, +8,29849,,,,,,0.0734110102057457,,,,,, +8,29899,,,,,,0.08127360790967941,,,,,, +8,29949,,,,,,0.07882238924503326,,,,,, +8,29999,,,,,,0.07563469558954239,,,,,, +8,30049,,,,,,0.08273385465145111,,,,,, +8,30099,,,,,,0.06938090920448303,,,,,, +8,30149,,,,,,0.08383231610059738,,,,,, +8,30199,,,,,,0.07098701596260071,,,,,, +8,30249,,,,,,0.08006510138511658,,,,,, +8,30299,,,,,,0.0711357370018959,,,,,, +8,30349,,,,,,0.07916373014450073,,,,,, +8,30399,,,,,,0.08030049502849579,,,,,, +8,30449,,,,,,0.07617069780826569,,,,,, +8,30499,,,,,,0.07575592398643494,,,,,, +8,30549,,,,,,0.07165169715881348,,,,,, +8,30599,,,,,,0.065804123878479,,,,,, +8,30649,,,,,,0.0789976492524147,,,,,, +8,30699,,,,,,0.08351567387580872,,,,,, +8,30749,,,,,,0.07252176851034164,,,,,, +8,30799,,,,,,0.06385309994220734,,,,,, +8,30849,,,,,,0.06789367645978928,,,,,, +8,30899,,,,,,0.08432051539421082,,,,,, +8,30949,,,,,,0.07993778586387634,,,,,, +8,30995,,,,,,,0.2435343712568283,0.07964766770601273,0.20639799535274506,0.036479830741882324,0.16442514955997467,0.07964766770601273 +8,30995,0.24184733629226685,0.07965441048145294,0.20638155937194824,0.041458845138549805,0.1765342652797699,,,,,,, +9,30999,,,,,,0.07663307338953018,,,,,, +9,31049,,,,,,0.07891014218330383,,,,,, +9,31099,,,,,,0.07364525645971298,,,,,, +9,31149,,,,,,0.07506737112998962,,,,,, +9,31199,,,,,,0.07559304684400558,,,,,, +9,31249,,,,,,0.07102730870246887,,,,,, +9,31299,,,,,,0.07319144159555435,,,,,, +9,31349,,,,,,0.08096286654472351,,,,,, +9,31399,,,,,,0.07220461964607239,,,,,, +9,31449,,,,,,0.07478436827659607,,,,,, +9,31499,,,,,,0.0760033056139946,,,,,, +9,31549,,,,,,0.08417068421840668,,,,,, +9,31599,,,,,,0.08482550829648972,,,,,, +9,31649,,,,,,0.08365790545940399,,,,,, +9,31699,,,,,,0.07369515299797058,,,,,, +9,31749,,,,,,0.07497852295637131,,,,,, +9,31799,,,,,,0.08166660368442535,,,,,, +9,31849,,,,,,0.06958858668804169,,,,,, +9,31899,,,,,,0.07595156878232956,,,,,, +9,31949,,,,,,0.0684894248843193,,,,,, +9,31999,,,,,,0.0776333212852478,,,,,, +9,32049,,,,,,0.07381868362426758,,,,,, +9,32099,,,,,,0.07044287025928497,,,,,, +9,32149,,,,,,0.08158287405967712,,,,,, +9,32199,,,,,,0.08091870695352554,,,,,, +9,32249,,,,,,0.07788161933422089,,,,,, +9,32299,,,,,,0.0758146420121193,,,,,, +9,32349,,,,,,0.07834954559803009,,,,,, +9,32399,,,,,,0.08352835476398468,,,,,, +9,32449,,,,,,0.0743873119354248,,,,,, +9,32499,,,,,,0.07345673441886902,,,,,, +9,32549,,,,,,0.07649967074394226,,,,,, +9,32599,,,,,,0.0857451930642128,,,,,, +9,32649,,,,,,0.0828058123588562,,,,,, +9,32699,,,,,,0.0743098258972168,,,,,, +9,32749,,,,,,0.08475946635007858,,,,,, +9,32799,,,,,,0.0711706131696701,,,,,, +9,32849,,,,,,0.07078906893730164,,,,,, +9,32899,,,,,,0.07673850655555725,,,,,, +9,32949,,,,,,0.08480454981327057,,,,,, +9,32999,,,,,,0.08059732615947723,,,,,, +9,33049,,,,,,0.07270754873752594,,,,,, +9,33099,,,,,,0.07572099566459656,,,,,, +9,33149,,,,,,0.062467701733112335,,,,,, +9,33199,,,,,,0.07389593124389648,,,,,, +9,33249,,,,,,0.07971277832984924,,,,,, +9,33299,,,,,,0.08999504148960114,,,,,, +9,33349,,,,,,0.08120421320199966,,,,,, +9,33399,,,,,,0.09106867760419846,,,,,, +9,33449,,,,,,0.0797613263130188,,,,,, +9,33499,,,,,,0.077079176902771,,,,,, +9,33549,,,,,,0.08554847538471222,,,,,, +9,33599,,,,,,0.08449803292751312,,,,,, +9,33649,,,,,,0.0727001279592514,,,,,, +9,33699,,,,,,0.07671614736318588,,,,,, +9,33749,,,,,,0.07241714000701904,,,,,, +9,33799,,,,,,0.07240106165409088,,,,,, +9,33849,,,,,,0.06809833645820618,,,,,, +9,33899,,,,,,0.07513394951820374,,,,,, +9,33949,,,,,,0.07816141843795776,,,,,, +9,33999,,,,,,0.07553306967020035,,,,,, +9,34049,,,,,,0.06578109413385391,,,,,, +9,34099,,,,,,0.07158738374710083,,,,,, +9,34149,,,,,,0.06811172515153885,,,,,, +9,34199,,,,,,0.07808256149291992,,,,,, +9,34249,,,,,,0.09158098697662354,,,,,, +9,34299,,,,,,0.07389111071825027,,,,,, +9,34349,,,,,,0.0704263299703598,,,,,, +9,34399,,,,,,0.0780949518084526,,,,,, +9,34439,,,,,,,0.24227793514728546,0.07940135896205902,0.19938115775585175,0.03945952653884888,0.16734641790390015,0.07940135896205902 +9,34439,0.23794251680374146,0.07746351510286331,0.2609197497367859,0.06783366203308105,0.22980996966362,,,,,,, +10,34449,,,,,,0.07392938435077667,,,,,, +10,34499,,,,,,0.07004183530807495,,,,,, +10,34549,,,,,,0.07257825136184692,,,,,, +10,34599,,,,,,0.06950590014457703,,,,,, +10,34649,,,,,,0.08891329169273376,,,,,, +10,34699,,,,,,0.07879224419593811,,,,,, +10,34749,,,,,,0.08550235629081726,,,,,, +10,34799,,,,,,0.07222991436719894,,,,,, +10,34849,,,,,,0.0828045904636383,,,,,, +10,34899,,,,,,0.08872227370738983,,,,,, +10,34949,,,,,,0.08182846754789352,,,,,, +10,34999,,,,,,0.07311862707138062,,,,,, +10,35049,,,,,,0.06523724645376205,,,,,, +10,35099,,,,,,0.07750419527292252,,,,,, +10,35149,,,,,,0.07467429339885712,,,,,, +10,35199,,,,,,0.07029569149017334,,,,,, +10,35249,,,,,,0.0739729180932045,,,,,, +10,35299,,,,,,0.09234370291233063,,,,,, +10,35349,,,,,,0.06749352812767029,,,,,, +10,35399,,,,,,0.07047264277935028,,,,,, +10,35449,,,,,,0.07521504163742065,,,,,, +10,35499,,,,,,0.07194116711616516,,,,,, +10,35549,,,,,,0.07922796159982681,,,,,, +10,35599,,,,,,0.08657655119895935,,,,,, +10,35649,,,,,,0.0678715705871582,,,,,, +10,35699,,,,,,0.08332342654466629,,,,,, +10,35749,,,,,,0.08451983332633972,,,,,, +10,35799,,,,,,0.07673003524541855,,,,,, +10,35849,,,,,,0.09104190766811371,,,,,, +10,35899,,,,,,0.07294997572898865,,,,,, +10,35949,,,,,,0.0768786370754242,,,,,, +10,35999,,,,,,0.07134280353784561,,,,,, +10,36049,,,,,,0.07619233429431915,,,,,, +10,36099,,,,,,0.08345159888267517,,,,,, +10,36149,,,,,,0.0723007395863533,,,,,, +10,36199,,,,,,0.08100870251655579,,,,,, +10,36249,,,,,,0.08025643974542618,,,,,, +10,36299,,,,,,0.08116200566291809,,,,,, +10,36349,,,,,,0.07776302099227905,,,,,, +10,36399,,,,,,0.07374610006809235,,,,,, +10,36449,,,,,,0.07850657403469086,,,,,, +10,36499,,,,,,0.0809101015329361,,,,,, +10,36549,,,,,,0.077189140021801,,,,,, +10,36599,,,,,,0.07934187352657318,,,,,, +10,36649,,,,,,0.0877661406993866,,,,,, +10,36699,,,,,,0.07895602285861969,,,,,, +10,36749,,,,,,0.08101962506771088,,,,,, +10,36799,,,,,,0.08158406615257263,,,,,, +10,36849,,,,,,0.06825394928455353,,,,,, +10,36899,,,,,,0.08208787441253662,,,,,, +10,36949,,,,,,0.07989148795604706,,,,,, +10,36999,,,,,,0.0636255145072937,,,,,, +10,37049,,,,,,0.07308255136013031,,,,,, +10,37099,,,,,,0.07356039434671402,,,,,, +10,37149,,,,,,0.08299246430397034,,,,,, +10,37199,,,,,,0.07329796999692917,,,,,, +10,37249,,,,,,0.07662610709667206,,,,,, +10,37299,,,,,,0.07474826276302338,,,,,, +10,37349,,,,,,0.07938394695520401,,,,,, +10,37399,,,,,,0.07434424757957458,,,,,, +10,37449,,,,,,0.07128894329071045,,,,,, +10,37499,,,,,,0.07664839178323746,,,,,, +10,37549,,,,,,0.08665861934423447,,,,,, +10,37599,,,,,,0.0819617360830307,,,,,, +10,37649,,,,,,0.07874315977096558,,,,,, +10,37699,,,,,,0.07450762391090393,,,,,, +10,37749,,,,,,0.07068578898906708,,,,,, +10,37799,,,,,,0.07873762398958206,,,,,, +10,37849,,,,,,0.07093260437250137,,,,,, +10,37883,,,,,,,0.2423062026500702,0.07920722663402557,0.20695869624614716,0.04180800914764404,0.16974928975105286,0.07920722663402557 +10,37883,0.2365346997976303,0.07673939317464828,0.27702778577804565,0.07653963565826416,0.24877403676509857,,,,,,, +11,37899,,,,,,0.07403966784477234,,,,,, +11,37949,,,,,,0.06550070643424988,,,,,, +11,37999,,,,,,0.07861050963401794,,,,,, +11,38049,,,,,,0.06701380759477615,,,,,, +11,38099,,,,,,0.08509187400341034,,,,,, +11,38149,,,,,,0.0815071389079094,,,,,, +11,38199,,,,,,0.09138458967208862,,,,,, +11,38249,,,,,,0.077363982796669,,,,,, +11,38299,,,,,,0.0689331516623497,,,,,, +11,38349,,,,,,0.08118048310279846,,,,,, +11,38399,,,,,,0.07239779829978943,,,,,, +11,38449,,,,,,0.07967089116573334,,,,,, +11,38499,,,,,,0.08317521214485168,,,,,, +11,38549,,,,,,0.07746739685535431,,,,,, +11,38599,,,,,,0.08570008724927902,,,,,, +11,38649,,,,,,0.08257447183132172,,,,,, +11,38699,,,,,,0.07138286530971527,,,,,, +11,38749,,,,,,0.06903098523616791,,,,,, +11,38799,,,,,,0.06283838301897049,,,,,, +11,38849,,,,,,0.08694000542163849,,,,,, +11,38899,,,,,,0.07422678172588348,,,,,, +11,38949,,,,,,0.07039488852024078,,,,,, +11,38999,,,,,,0.06293487548828125,,,,,, +11,39049,,,,,,0.08336375653743744,,,,,, +11,39099,,,,,,0.08160533010959625,,,,,, +11,39149,,,,,,0.0870644599199295,,,,,, +11,39199,,,,,,0.07704520225524902,,,,,, +11,39249,,,,,,0.0744173675775528,,,,,, +11,39299,,,,,,0.06830153614282608,,,,,, +11,39349,,,,,,0.08065538108348846,,,,,, +11,39399,,,,,,0.0718981996178627,,,,,, +11,39449,,,,,,0.07844313979148865,,,,,, +11,39499,,,,,,0.0851564109325409,,,,,, +11,39549,,,,,,0.05705169588327408,,,,,, +11,39599,,,,,,0.08767574280500412,,,,,, +11,39649,,,,,,0.07733561098575592,,,,,, +11,39699,,,,,,0.08274496346712112,,,,,, +11,39749,,,,,,0.07246934622526169,,,,,, +11,39799,,,,,,0.09164229035377502,,,,,, +11,39849,,,,,,0.07951316237449646,,,,,, +11,39899,,,,,,0.06569409370422363,,,,,, +11,39949,,,,,,0.07291834056377411,,,,,, +11,39999,,,,,,0.08151091635227203,,,,,, +11,40049,,,,,,0.07403868436813354,,,,,, +11,40099,,,,,,0.06295236945152283,,,,,, +11,40149,,,,,,0.06409021466970444,,,,,, +11,40199,,,,,,0.07208774983882904,,,,,, +11,40249,,,,,,0.06775112450122833,,,,,, +11,40299,,,,,,0.06580238789319992,,,,,, +11,40349,,,,,,0.07416929304599762,,,,,, +11,40399,,,,,,0.09425044804811478,,,,,, +11,40449,,,,,,0.07255871593952179,,,,,, +11,40499,,,,,,0.06843550503253937,,,,,, +11,40549,,,,,,0.08401244133710861,,,,,, +11,40599,,,,,,0.07252827286720276,,,,,, +11,40649,,,,,,0.06544042378664017,,,,,, +11,40699,,,,,,0.06890884041786194,,,,,, +11,40749,,,,,,0.07042494416236877,,,,,, +11,40799,,,,,,0.08819394558668137,,,,,, +11,40849,,,,,,0.07137461006641388,,,,,, +11,40899,,,,,,0.06870226562023163,,,,,, +11,40949,,,,,,0.08156418800354004,,,,,, +11,40999,,,,,,0.07654045522212982,,,,,, +11,41049,,,,,,0.07966572046279907,,,,,, +11,41099,,,,,,0.07209707796573639,,,,,, +11,41149,,,,,,0.07767654210329056,,,,,, +11,41199,,,,,,0.07070991396903992,,,,,, +11,41249,,,,,,0.07856746017932892,,,,,, +11,41299,,,,,,0.08052103221416473,,,,,, +11,41327,,,,,,,0.24182161688804626,0.07911676168441772,0.21074992418289185,0.042902350425720215,0.17399288713932037,0.07911676168441772 +11,41327,0.23568879067897797,0.07630719244480133,0.2862473130226135,0.08176153898239136,0.2586801052093506,,,,,,, +12,41349,,,,,,0.07691588997840881,,,,,, +12,41399,,,,,,0.07826803624629974,,,,,, +12,41449,,,,,,0.07123349606990814,,,,,, +12,41499,,,,,,0.08104608952999115,,,,,, +12,41549,,,,,,0.060113511979579926,,,,,, +12,41599,,,,,,0.069938063621521,,,,,, +12,41649,,,,,,0.08265968412160873,,,,,, +12,41699,,,,,,0.08747957646846771,,,,,, +12,41749,,,,,,0.07829058170318604,,,,,, +12,41799,,,,,,0.08848565816879272,,,,,, +12,41849,,,,,,0.06642872095108032,,,,,, +12,41899,,,,,,0.07484215497970581,,,,,, +12,41949,,,,,,0.08615291863679886,,,,,, +12,41999,,,,,,0.07786816358566284,,,,,, +12,42049,,,,,,0.07631967961788177,,,,,, +12,42099,,,,,,0.07225265353918076,,,,,, +12,42149,,,,,,0.09132358431816101,,,,,, +12,42199,,,,,,0.06828337907791138,,,,,, +12,42249,,,,,,0.07916048169136047,,,,,, +12,42299,,,,,,0.08157820999622345,,,,,, +12,42349,,,,,,0.06589788943529129,,,,,, +12,42399,,,,,,0.07090510427951813,,,,,, +12,42449,,,,,,0.0805571973323822,,,,,, +12,42499,,,,,,0.0841919332742691,,,,,, +12,42549,,,,,,0.06578391790390015,,,,,, +12,42599,,,,,,0.06906405836343765,,,,,, +12,42649,,,,,,0.07465273886919022,,,,,, +12,42699,,,,,,0.08247508108615875,,,,,, +12,42749,,,,,,0.0759551003575325,,,,,, +12,42799,,,,,,0.07615672796964645,,,,,, +12,42849,,,,,,0.07250803709030151,,,,,, +12,42899,,,,,,0.07332538068294525,,,,,, +12,42949,,,,,,0.0816362202167511,,,,,, +12,42999,,,,,,0.08267821371555328,,,,,, +12,43049,,,,,,0.0743471309542656,,,,,, +12,43099,,,,,,0.07611055672168732,,,,,, +12,43149,,,,,,0.08255419135093689,,,,,, +12,43199,,,,,,0.08978271484375,,,,,, +12,43249,,,,,,0.08269196003675461,,,,,, +12,43299,,,,,,0.06921090185642242,,,,,, +12,43349,,,,,,0.07399772852659225,,,,,, +12,43399,,,,,,0.08449260890483856,,,,,, +12,43449,,,,,,0.0746176540851593,,,,,, +12,43499,,,,,,0.06837916374206543,,,,,, +12,43549,,,,,,0.06661965698003769,,,,,, +12,43599,,,,,,0.07233953475952148,,,,,, +12,43649,,,,,,0.08561966568231583,,,,,, +12,43699,,,,,,0.060229722410440445,,,,,, +12,43749,,,,,,0.0789530798792839,,,,,, +12,43799,,,,,,0.08021283894777298,,,,,, +12,43849,,,,,,0.07690948247909546,,,,,, +12,43899,,,,,,0.08069895207881927,,,,,, +12,43949,,,,,,0.07488264888525009,,,,,, +12,43999,,,,,,0.07439658045768738,,,,,, +12,44049,,,,,,0.08490945398807526,,,,,, +12,44099,,,,,,0.07675587385892868,,,,,, +12,44149,,,,,,0.0697309821844101,,,,,, +12,44199,,,,,,0.06767747551202774,,,,,, +12,44249,,,,,,0.07434764504432678,,,,,, +12,44299,,,,,,0.07610105723142624,,,,,, +12,44349,,,,,,0.07652731239795685,,,,,, +12,44399,,,,,,0.08192960917949677,,,,,, +12,44449,,,,,,0.0751093178987503,,,,,, +12,44499,,,,,,0.0744272992014885,,,,,, +12,44549,,,,,,0.08490036427974701,,,,,, +12,44599,,,,,,0.06955812871456146,,,,,, +12,44649,,,,,,0.06860826909542084,,,,,, +12,44699,,,,,,0.06792528182268143,,,,,, +12,44749,,,,,,0.07248178124427795,,,,,, +12,44771,,,,,,,0.24323271214962006,0.07976874709129333,0.2127736210823059,0.035015106201171875,0.17751753330230713,0.07976874709129333 +12,44771,0.23660938441753387,0.07688098400831223,0.2743241488933563,0.07483965158462524,0.2474677860736847,,,,,,, +13,44799,,,,,,0.07629501074552536,,,,,, +13,44849,,,,,,0.06525120139122009,,,,,, +13,44899,,,,,,0.07722774147987366,,,,,, +13,44949,,,,,,0.07818429917097092,,,,,, +13,44999,,,,,,0.08356910943984985,,,,,, +13,45049,,,,,,0.06695181876420975,,,,,, +13,45099,,,,,,0.08211827278137207,,,,,, +13,45149,,,,,,0.07906327396631241,,,,,, +13,45199,,,,,,0.0750420093536377,,,,,, +13,45249,,,,,,0.07113847136497498,,,,,, +13,45299,,,,,,0.08115218579769135,,,,,, +13,45349,,,,,,0.06628992408514023,,,,,, +13,45399,,,,,,0.08131594955921173,,,,,, +13,45449,,,,,,0.09389431774616241,,,,,, +13,45499,,,,,,0.08858820796012878,,,,,, +13,45549,,,,,,0.07194504141807556,,,,,, +13,45599,,,,,,0.0756840705871582,,,,,, +13,45649,,,,,,0.07519252598285675,,,,,, +13,45699,,,,,,0.07169435173273087,,,,,, +13,45749,,,,,,0.08425699174404144,,,,,, +13,45799,,,,,,0.07913969457149506,,,,,, +13,45849,,,,,,0.07454818487167358,,,,,, +13,45899,,,,,,0.08216933161020279,,,,,, +13,45949,,,,,,0.07413017004728317,,,,,, +13,45999,,,,,,0.08219344168901443,,,,,, +13,46049,,,,,,0.07426923513412476,,,,,, +13,46099,,,,,,0.07687865197658539,,,,,, +13,46149,,,,,,0.08192333579063416,,,,,, +13,46199,,,,,,0.07305518537759781,,,,,, +13,46249,,,,,,0.07206891477108002,,,,,, +13,46299,,,,,,0.07445046305656433,,,,,, +13,46349,,,,,,0.07810358703136444,,,,,, +13,46399,,,,,,0.07907098531723022,,,,,, +13,46449,,,,,,0.06025476008653641,,,,,, +13,46499,,,,,,0.07376150786876678,,,,,, +13,46549,,,,,,0.07291348278522491,,,,,, +13,46599,,,,,,0.0722874253988266,,,,,, +13,46649,,,,,,0.08109362423419952,,,,,, +13,46699,,,,,,0.0764019563794136,,,,,, +13,46749,,,,,,0.08137093484401703,,,,,, +13,46799,,,,,,0.07708412408828735,,,,,, +13,46849,,,,,,0.07950063049793243,,,,,, +13,46899,,,,,,0.08951737731695175,,,,,, +13,46949,,,,,,0.07546118646860123,,,,,, +13,46999,,,,,,0.07552152872085571,,,,,, +13,47049,,,,,,0.0766439139842987,,,,,, +13,47099,,,,,,0.07151757180690765,,,,,, +13,47149,,,,,,0.08020804822444916,,,,,, +13,47199,,,,,,0.06769397109746933,,,,,, +13,47249,,,,,,0.0663510411977768,,,,,, +13,47299,,,,,,0.07666546106338501,,,,,, +13,47349,,,,,,0.08269447833299637,,,,,, +13,47399,,,,,,0.07195381820201874,,,,,, +13,47449,,,,,,0.06985989212989807,,,,,, +13,47499,,,,,,0.07567984610795975,,,,,, +13,47549,,,,,,0.0778702050447464,,,,,, +13,47599,,,,,,0.07811005413532257,,,,,, +13,47649,,,,,,0.07215635478496552,,,,,, +13,47699,,,,,,0.07077278196811676,,,,,, +13,47749,,,,,,0.07473523169755936,,,,,, +13,47799,,,,,,0.08840002864599228,,,,,, +13,47849,,,,,,0.08378878980875015,,,,,, +13,47899,,,,,,0.08061398565769196,,,,,, +13,47949,,,,,,0.07708768546581268,,,,,, +13,47999,,,,,,0.06502456963062286,,,,,, +13,48049,,,,,,0.06014416739344597,,,,,, +13,48099,,,,,,0.08178108185529709,,,,,, +13,48149,,,,,,0.07135629653930664,,,,,, +13,48199,,,,,,0.08253432810306549,,,,,, +13,48215,,,,,,,0.24084416031837463,0.07908672839403152,0.21392638981342316,0.04326564073562622,0.1774812787771225,0.07908672839403152 +13,48215,0.23510858416557312,0.0760205090045929,0.2922263741493225,0.0851852297782898,0.26500773429870605,,,,,,, +14,48249,,,,,,0.07813100516796112,,,,,, +14,48299,,,,,,0.07141314446926117,,,,,, +14,48349,,,,,,0.06633983552455902,,,,,, +14,48399,,,,,,0.08409133553504944,,,,,, +14,48449,,,,,,0.08009663969278336,,,,,, +14,48499,,,,,,0.08597707748413086,,,,,, +14,48549,,,,,,0.07336737960577011,,,,,, +14,48599,,,,,,0.07184752821922302,,,,,, +14,48649,,,,,,0.07603592425584793,,,,,, +14,48699,,,,,,0.07666690647602081,,,,,, +14,48749,,,,,,0.0703921988606453,,,,,, +14,48799,,,,,,0.08667422831058502,,,,,, +14,48849,,,,,,0.07893103361129761,,,,,, +14,48899,,,,,,0.07720495760440826,,,,,, +14,48949,,,,,,0.07556869089603424,,,,,, +14,48999,,,,,,0.08814996480941772,,,,,, +14,49049,,,,,,0.06906619668006897,,,,,, +14,49099,,,,,,0.0808548778295517,,,,,, +14,49149,,,,,,0.08095215260982513,,,,,, +14,49199,,,,,,0.07263074815273285,,,,,, +14,49249,,,,,,0.0825430303812027,,,,,, +14,49299,,,,,,0.08414256572723389,,,,,, +14,49349,,,,,,0.07719673216342926,,,,,, +14,49399,,,,,,0.06755362451076508,,,,,, +14,49449,,,,,,0.07991580665111542,,,,,, +14,49499,,,,,,0.08479128777980804,,,,,, +14,49549,,,,,,0.0869898796081543,,,,,, +14,49599,,,,,,0.07194075733423233,,,,,, +14,49649,,,,,,0.08587036281824112,,,,,, +14,49699,,,,,,0.07151131331920624,,,,,, +14,49749,,,,,,0.0758640468120575,,,,,, +14,49799,,,,,,0.09526064991950989,,,,,, +14,49849,,,,,,0.08231264352798462,,,,,, +14,49899,,,,,,0.0761021226644516,,,,,, +14,49949,,,,,,0.07460109889507294,,,,,, +14,49999,,,,,,0.06851312518119812,,,,,, +14,50049,,,,,,0.06110705807805061,,,,,, +14,50099,,,,,,0.08413425087928772,,,,,, +14,50149,,,,,,0.07972385734319687,,,,,, +14,50199,,,,,,0.07611829042434692,,,,,, +14,50249,,,,,,0.08752928674221039,,,,,, +14,50299,,,,,,0.07803778350353241,,,,,, +14,50349,,,,,,0.07020291686058044,,,,,, +14,50399,,,,,,0.07427544891834259,,,,,, +14,50449,,,,,,0.07929600775241852,,,,,, +14,50499,,,,,,0.06846364587545395,,,,,, +14,50549,,,,,,0.0710427537560463,,,,,, +14,50599,,,,,,0.07232870161533356,,,,,, +14,50649,,,,,,0.07961393892765045,,,,,, +14,50699,,,,,,0.07163621485233307,,,,,, +14,50749,,,,,,0.08599827438592911,,,,,, +14,50799,,,,,,0.08784004300832748,,,,,, +14,50849,,,,,,0.07434667646884918,,,,,, +14,50899,,,,,,0.07937848567962646,,,,,, +14,50949,,,,,,0.06242547929286957,,,,,, +14,50999,,,,,,0.06946191191673279,,,,,, +14,51049,,,,,,0.08621136844158173,,,,,, +14,51099,,,,,,0.08158864080905914,,,,,, +14,51149,,,,,,0.08461722731590271,,,,,, +14,51199,,,,,,0.08411909639835358,,,,,, +14,51249,,,,,,0.08814533054828644,,,,,, +14,51299,,,,,,0.08036776632070541,,,,,, +14,51349,,,,,,0.08852843940258026,,,,,, +14,51399,,,,,,0.08130218088626862,,,,,, +14,51449,,,,,,0.08511896431446075,,,,,, +14,51499,,,,,,0.0777486115694046,,,,,, +14,51549,,,,,,0.07968790084123611,,,,,, +14,51599,,,,,,0.07391239702701569,,,,,, +14,51649,,,,,,0.07208757847547531,,,,,, +14,51659,,,,,,,0.24868939816951752,0.08265718072652817,nan,7.295608520507812e-05,0.04577413201332092,0.08265718072652817 +14,51659,0.239641934633255,0.09536706656217575,0.12925034761428833,-0.1476123332977295,0.2229360193014145,,,,,,, +15,51699,,,,,,0.07689578831195831,,,,,, +15,51749,,,,,,0.08668465912342072,,,,,, +15,51799,,,,,,0.09005661308765411,,,,,, +15,51849,,,,,,0.0952431783080101,,,,,, +15,51899,,,,,,0.08251530677080154,,,,,, +15,51949,,,,,,0.08791464567184448,,,,,, +15,51999,,,,,,0.08376559615135193,,,,,, +15,52049,,,,,,0.0874824970960617,,,,,, +15,52099,,,,,,0.08037382364273071,,,,,, +15,52149,,,,,,0.08770968019962311,,,,,, +15,52199,,,,,,0.0905216708779335,,,,,, +15,52249,,,,,,0.08131757378578186,,,,,, +15,52299,,,,,,0.08550392091274261,,,,,, +15,52349,,,,,,0.09272225946187973,,,,,, +15,52399,,,,,,0.07433861494064331,,,,,, +15,52449,,,,,,0.08084738999605179,,,,,, +15,52499,,,,,,0.0888906717300415,,,,,, +15,52549,,,,,,0.08373066037893295,,,,,, +15,52599,,,,,,0.07850159704685211,,,,,, +15,52649,,,,,,0.0902426540851593,,,,,, +15,52699,,,,,,0.07810958474874496,,,,,, +15,52749,,,,,,0.09290435910224915,,,,,, +15,52799,,,,,,0.09015116095542908,,,,,, +15,52849,,,,,,0.09232006967067719,,,,,, +15,52899,,,,,,0.0779096931219101,,,,,, +15,52949,,,,,,0.07935254275798798,,,,,, +15,52999,,,,,,0.08521124720573425,,,,,, +15,53049,,,,,,0.08659806847572327,,,,,, +15,53099,,,,,,0.08396930992603302,,,,,, +15,53149,,,,,,0.07546377182006836,,,,,, +15,53199,,,,,,0.08616917580366135,,,,,, +15,53249,,,,,,0.08807581663131714,,,,,, +15,53299,,,,,,0.08686467260122299,,,,,, +15,53349,,,,,,0.09915174543857574,,,,,, +15,53399,,,,,,0.0867311879992485,,,,,, +15,53449,,,,,,0.07033655047416687,,,,,, +15,53499,,,,,,0.09473554790019989,,,,,, +15,53549,,,,,,0.07865355163812637,,,,,, +15,53599,,,,,,0.09148335456848145,,,,,, +15,53649,,,,,,0.08863198757171631,,,,,, +15,53699,,,,,,0.08425325155258179,,,,,, +15,53749,,,,,,0.09081359207630157,,,,,, +15,53799,,,,,,0.09468313306570053,,,,,, +15,53849,,,,,,0.08975335210561752,,,,,, +15,53899,,,,,,0.08419162780046463,,,,,, +15,53949,,,,,,0.08412076532840729,,,,,, +15,53999,,,,,,0.08201751857995987,,,,,, +15,54049,,,,,,0.07934556156396866,,,,,, +15,54099,,,,,,0.0889744758605957,,,,,, +15,54149,,,,,,0.07730427384376526,,,,,, +15,54199,,,,,,0.08980973064899445,,,,,, +15,54249,,,,,,0.08063750714063644,,,,,, +15,54299,,,,,,0.09410534054040909,,,,,, +15,54349,,,,,,0.07991281151771545,,,,,, +15,54399,,,,,,0.08092372864484787,,,,,, +15,54449,,,,,,0.07494420558214188,,,,,, +15,54499,,,,,,0.09479252249002457,,,,,, +15,54549,,,,,,0.07198695838451385,,,,,, +15,54599,,,,,,0.09952722489833832,,,,,, +15,54649,,,,,,0.08886194229125977,,,,,, +15,54699,,,,,,0.08088217675685883,,,,,, +15,54749,,,,,,0.08815473318099976,,,,,, +15,54799,,,,,,0.08766278624534607,,,,,, +15,54849,,,,,,0.10207053273916245,,,,,, +15,54899,,,,,,0.08112047612667084,,,,,, +15,54949,,,,,,0.09192478656768799,,,,,, +15,54999,,,,,,0.09489359706640244,,,,,, +15,55049,,,,,,0.07876479625701904,,,,,, +15,55099,,,,,,0.09053528308868408,,,,,, +15,55103,,,,,,,0.2486206442117691,0.08279937505722046,nan,-0.0016472339630126953,0.07346843183040619,0.08279937505722046 +15,55103,0.2499460130929947,0.08357731997966766,0.0009019798599183559,-0.00574803352355957,0.0005825439002364874,,,,,,, +16,55149,,,,,,0.08855496346950531,,,,,, +16,55199,,,,,,0.08153441548347473,,,,,, +16,55249,,,,,,0.07967604696750641,,,,,, +16,55299,,,,,,0.07929781824350357,,,,,, +16,55349,,,,,,0.07925830781459808,,,,,, +16,55399,,,,,,0.07987920939922333,,,,,, +16,55449,,,,,,0.07771115005016327,,,,,, +16,55499,,,,,,0.082806795835495,,,,,, +16,55549,,,,,,0.06598253548145294,,,,,, +16,55599,,,,,,0.08299050480127335,,,,,, +16,55649,,,,,,0.095601387321949,,,,,, +16,55699,,,,,,0.07188437134027481,,,,,, +16,55749,,,,,,0.07754267007112503,,,,,, +16,55799,,,,,,0.0802387073636055,,,,,, +16,55849,,,,,,0.07639841735363007,,,,,, +16,55899,,,,,,0.07794369012117386,,,,,, +16,55949,,,,,,0.07662731409072876,,,,,, +16,55999,,,,,,0.07191749662160873,,,,,, +16,56049,,,,,,0.08347116410732269,,,,,, +16,56099,,,,,,0.08009721338748932,,,,,, +16,56149,,,,,,0.07750491797924042,,,,,, +16,56199,,,,,,0.0768866240978241,,,,,, +16,56249,,,,,,0.08401967585086823,,,,,, +16,56299,,,,,,0.07284519821405411,,,,,, +16,56349,,,,,,0.07331046462059021,,,,,, +16,56399,,,,,,0.0757148340344429,,,,,, +16,56449,,,,,,0.07493992894887924,,,,,, +16,56499,,,,,,0.08360087871551514,,,,,, +16,56549,,,,,,0.07533947378396988,,,,,, +16,56599,,,,,,0.08519816398620605,,,,,, +16,56649,,,,,,0.08382655680179596,,,,,, +16,56699,,,,,,0.08242789655923843,,,,,, +16,56749,,,,,,0.07590687274932861,,,,,, +16,56799,,,,,,0.08201386034488678,,,,,, +16,56849,,,,,,0.08337037265300751,,,,,, +16,56899,,,,,,0.08439688384532928,,,,,, +16,56949,,,,,,0.08704540133476257,,,,,, +16,56999,,,,,,0.08347073197364807,,,,,, +16,57049,,,,,,0.08522231876850128,,,,,, +16,57099,,,,,,0.06942936778068542,,,,,, +16,57149,,,,,,0.0707167237997055,,,,,, +16,57199,,,,,,0.07808908075094223,,,,,, +16,57249,,,,,,0.08058331906795502,,,,,, +16,57299,,,,,,0.06819276511669159,,,,,, +16,57349,,,,,,0.08004535734653473,,,,,, +16,57399,,,,,,0.08379348367452621,,,,,, +16,57449,,,,,,0.08532886952161789,,,,,, +16,57499,,,,,,0.07952192425727844,,,,,, +16,57549,,,,,,0.0863720029592514,,,,,, +16,57599,,,,,,0.07671613991260529,,,,,, +16,57649,,,,,,0.06358900666236877,,,,,, +16,57699,,,,,,0.08262030780315399,,,,,, +16,57749,,,,,,0.08835548162460327,,,,,, +16,57799,,,,,,0.07608191668987274,,,,,, +16,57849,,,,,,0.08852170407772064,,,,,, +16,57899,,,,,,0.08277736604213715,,,,,, +16,57949,,,,,,0.09735342115163803,,,,,, +16,57999,,,,,,0.07520999014377594,,,,,, +16,58049,,,,,,0.07184339314699173,,,,,, +16,58099,,,,,,0.07308031618595123,,,,,, +16,58149,,,,,,0.08148573338985443,,,,,, +16,58199,,,,,,0.08819148689508438,,,,,, +16,58249,,,,,,0.08144740760326385,,,,,, +16,58299,,,,,,0.06991151720285416,,,,,, +16,58349,,,,,,0.0788620188832283,,,,,, +16,58399,,,,,,0.07619746029376984,,,,,, +16,58449,,,,,,0.06344525516033173,,,,,, +16,58499,,,,,,0.07415638864040375,,,,,, +16,58547,,,,,,,0.24711772799491882,0.0834309533238411,0.18725703656673431,-0.009287595748901367,0.15286841988563538,0.0834309533238411 +16,58547,0.24551299214363098,0.08148984611034393,0.1486193835735321,0.01938086748123169,0.13811171054840088,,,,,,, +17,58549,,,,,,0.06691597402095795,,,,,, +17,58599,,,,,,0.08272187411785126,,,,,, +17,58649,,,,,,0.07652955502271652,,,,,, +17,58699,,,,,,0.06667382270097733,,,,,, +17,58749,,,,,,0.08827394247055054,,,,,, +17,58799,,,,,,0.08142615854740143,,,,,, +17,58849,,,,,,0.06833624839782715,,,,,, +17,58899,,,,,,0.06420782208442688,,,,,, +17,58949,,,,,,0.07695502042770386,,,,,, +17,58999,,,,,,0.08273132145404816,,,,,, +17,59049,,,,,,0.08981442451477051,,,,,, +17,59099,,,,,,0.08043843507766724,,,,,, +17,59149,,,,,,0.0856323093175888,,,,,, +17,59199,,,,,,0.06823807954788208,,,,,, +17,59249,,,,,,0.09172482788562775,,,,,, +17,59299,,,,,,0.07395666837692261,,,,,, +17,59349,,,,,,0.08541633188724518,,,,,, +17,59399,,,,,,0.08899752795696259,,,,,, +17,59449,,,,,,0.09493710100650787,,,,,, +17,59499,,,,,,0.07835899293422699,,,,,, +17,59549,,,,,,0.08902791887521744,,,,,, +17,59599,,,,,,0.0775795429944992,,,,,, +17,59649,,,,,,0.07882727682590485,,,,,, +17,59699,,,,,,0.08873116225004196,,,,,, +17,59749,,,,,,0.07368749380111694,,,,,, +17,59799,,,,,,0.09113703668117523,,,,,, +17,59849,,,,,,0.07886192202568054,,,,,, +17,59899,,,,,,0.08485157042741776,,,,,, +17,59949,,,,,,0.08805501461029053,,,,,, +17,59999,,,,,,0.08255472779273987,,,,,, +17,60049,,,,,,0.08412569761276245,,,,,, +17,60099,,,,,,0.07719039916992188,,,,,, +17,60149,,,,,,0.08860360085964203,,,,,, +17,60199,,,,,,0.08467049896717072,,,,,, +17,60249,,,,,,0.08112946152687073,,,,,, +17,60299,,,,,,0.0670657753944397,,,,,, +17,60349,,,,,,0.07896101474761963,,,,,, +17,60399,,,,,,0.08979043364524841,,,,,, +17,60449,,,,,,0.08031389117240906,,,,,, +17,60499,,,,,,0.08236971497535706,,,,,, +17,60549,,,,,,0.07455714046955109,,,,,, +17,60599,,,,,,0.0779007226228714,,,,,, +17,60649,,,,,,0.08485373854637146,,,,,, +17,60699,,,,,,0.0765555277466774,,,,,, +17,60749,,,,,,0.0722539871931076,,,,,, +17,60799,,,,,,0.08028463274240494,,,,,, +17,60849,,,,,,0.09266649931669235,,,,,, +17,60899,,,,,,0.08838249742984772,,,,,, +17,60949,,,,,,0.11544713377952576,,,,,, +17,60999,,,,,,0.08803805708885193,,,,,, +17,61049,,,,,,0.07771404832601547,,,,,, +17,61099,,,,,,0.07065778970718384,,,,,, +17,61149,,,,,,0.07537315785884857,,,,,, +17,61199,,,,,,0.08856764435768127,,,,,, +17,61249,,,,,,0.08702979981899261,,,,,, +17,61299,,,,,,0.07751777768135071,,,,,, +17,61349,,,,,,0.089713454246521,,,,,, +17,61399,,,,,,0.08842571079730988,,,,,, +17,61449,,,,,,0.08296949416399002,,,,,, +17,61499,,,,,,0.07311690598726273,,,,,, +17,61549,,,,,,0.09357009828090668,,,,,, +17,61599,,,,,,0.07864424586296082,,,,,, +17,61649,,,,,,0.07750415802001953,,,,,, +17,61699,,,,,,0.07630700618028641,,,,,, +17,61749,,,,,,0.06075419485569,,,,,, +17,61799,,,,,,0.07938172668218613,,,,,, +17,61849,,,,,,0.07956905663013458,,,,,, +17,61899,,,,,,0.077463299036026,,,,,, +17,61949,,,,,,0.08711059391498566,,,,,, +17,61991,,,,,,,0.24397918581962585,0.08035702258348465,0.18480627238750458,0.02789860963821411,0.16473424434661865,0.08035702258348465 +17,61991,0.2442297488451004,0.08148238807916641,0.16394518315792084,0.019462883472442627,0.17905007302761078,,,,,,, +18,61999,,,,,,0.09333502501249313,,,,,, +18,62049,,,,,,0.08750992268323898,,,,,, +18,62099,,,,,,0.08100196719169617,,,,,, +18,62149,,,,,,0.07102551311254501,,,,,, +18,62199,,,,,,0.07984986901283264,,,,,, +18,62249,,,,,,0.07857051491737366,,,,,, +18,62299,,,,,,0.08209766447544098,,,,,, +18,62349,,,,,,0.08460962772369385,,,,,, +18,62399,,,,,,0.08404965698719025,,,,,, +18,62449,,,,,,0.07426099479198456,,,,,, +18,62499,,,,,,0.07572274655103683,,,,,, +18,62549,,,,,,0.08899615705013275,,,,,, +18,62599,,,,,,0.06811684370040894,,,,,, +18,62649,,,,,,0.07936769723892212,,,,,, +18,62699,,,,,,0.07141782343387604,,,,,, +18,62749,,,,,,0.07781524956226349,,,,,, +18,62799,,,,,,0.08716835081577301,,,,,, +18,62849,,,,,,0.08166587352752686,,,,,, +18,62899,,,,,,0.07505094259977341,,,,,, +18,62949,,,,,,0.08264418691396713,,,,,, +18,62999,,,,,,0.08933807164430618,,,,,, +18,63049,,,,,,0.09019109606742859,,,,,, +18,63099,,,,,,0.07933210581541061,,,,,, +18,63149,,,,,,0.08854609727859497,,,,,, +18,63199,,,,,,0.07806996256113052,,,,,, +18,63249,,,,,,0.08204314112663269,,,,,, +18,63299,,,,,,0.0867706835269928,,,,,, +18,63349,,,,,,0.07070498168468475,,,,,, +18,63399,,,,,,0.08414784073829651,,,,,, +18,63449,,,,,,0.0806608721613884,,,,,, +18,63499,,,,,,0.07833752036094666,,,,,, +18,63549,,,,,,0.0819278433918953,,,,,, +18,63599,,,,,,0.07115057110786438,,,,,, +18,63649,,,,,,0.08266863226890564,,,,,, +18,63699,,,,,,0.0793885886669159,,,,,, +18,63749,,,,,,0.08118213713169098,,,,,, +18,63799,,,,,,0.08387662470340729,,,,,, +18,63849,,,,,,0.08210533857345581,,,,,, +18,63899,,,,,,0.06761632114648819,,,,,, +18,63949,,,,,,0.07059458643198013,,,,,, +18,63999,,,,,,0.086968794465065,,,,,, +18,64049,,,,,,0.08317950367927551,,,,,, +18,64099,,,,,,0.08503232151269913,,,,,, +18,64149,,,,,,0.07191362231969833,,,,,, +18,64199,,,,,,0.07466539740562439,,,,,, +18,64249,,,,,,0.07987290620803833,,,,,, +18,64299,,,,,,0.06828886270523071,,,,,, +18,64349,,,,,,0.07586415857076645,,,,,, +18,64399,,,,,,0.0686921700835228,,,,,, +18,64449,,,,,,0.0736805647611618,,,,,, +18,64499,,,,,,0.08155244588851929,,,,,, +18,64549,,,,,,0.08450499922037125,,,,,, +18,64599,,,,,,0.09313980489969254,,,,,, +18,64649,,,,,,0.07760454714298248,,,,,, +18,64699,,,,,,0.07783399522304535,,,,,, +18,64749,,,,,,0.07920940220355988,,,,,, +18,64799,,,,,,0.08515103161334991,,,,,, +18,64849,,,,,,0.07237043976783752,,,,,, +18,64899,,,,,,0.07983071357011795,,,,,, +18,64949,,,,,,0.07016599178314209,,,,,, +18,64999,,,,,,0.07176317274570465,,,,,, +18,65049,,,,,,0.07677751034498215,,,,,, +18,65099,,,,,,0.06338341534137726,,,,,, +18,65149,,,,,,0.08123420178890228,,,,,, +18,65199,,,,,,0.06875801831483841,,,,,, +18,65249,,,,,,0.07634125649929047,,,,,, +18,65299,,,,,,0.08481469750404358,,,,,, +18,65349,,,,,,0.07957503199577332,,,,,, +18,65399,,,,,,0.08321067690849304,,,,,, +18,65435,,,,,,,0.24233965575695038,0.07995710521936417,0.21066448092460632,0.03273648023605347,0.17763514816761017,0.07995710521936417 +18,65435,0.23946471512317657,0.07826752215623856,0.24216744303703308,0.05815410614013672,0.22662301361560822,,,,,,, +19,65449,,,,,,0.089450404047966,,,,,, +19,65499,,,,,,0.0863354504108429,,,,,, +19,65549,,,,,,0.08952359110116959,,,,,, +19,65599,,,,,,0.0734749361872673,,,,,, +19,65649,,,,,,0.07880233973264694,,,,,, +19,65699,,,,,,0.07859238237142563,,,,,, +19,65749,,,,,,0.06923407316207886,,,,,, +19,65799,,,,,,0.07591447234153748,,,,,, +19,65849,,,,,,0.06185489520430565,,,,,, +19,65899,,,,,,0.07433256506919861,,,,,, +19,65949,,,,,,0.07664138078689575,,,,,, +19,65999,,,,,,0.07561632245779037,,,,,, +19,66049,,,,,,0.07941139489412308,,,,,, +19,66099,,,,,,0.07668468356132507,,,,,, +19,66149,,,,,,0.07573574781417847,,,,,, +19,66199,,,,,,0.07284966111183167,,,,,, +19,66249,,,,,,0.08911052346229553,,,,,, +19,66299,,,,,,0.08651664853096008,,,,,, +19,66349,,,,,,0.0721946731209755,,,,,, +19,66399,,,,,,0.07604780793190002,,,,,, +19,66449,,,,,,0.081608846783638,,,,,, +19,66499,,,,,,0.07873670756816864,,,,,, +19,66549,,,,,,0.06639894843101501,,,,,, +19,66599,,,,,,0.0709962472319603,,,,,, +19,66649,,,,,,0.07842326909303665,,,,,, +19,66699,,,,,,0.07624642550945282,,,,,, +19,66749,,,,,,0.08646339178085327,,,,,, +19,66799,,,,,,0.07654177397489548,,,,,, +19,66849,,,,,,0.07541113346815109,,,,,, +19,66899,,,,,,0.08721053600311279,,,,,, +19,66949,,,,,,0.0835118442773819,,,,,, +19,66999,,,,,,0.07619132846593857,,,,,, +19,67049,,,,,,0.07804980874061584,,,,,, +19,67099,,,,,,0.07023380696773529,,,,,, +19,67149,,,,,,0.08167707175016403,,,,,, +19,67199,,,,,,0.08643816411495209,,,,,, +19,67249,,,,,,0.0661979466676712,,,,,, +19,67299,,,,,,0.07944685220718384,,,,,, +19,67349,,,,,,0.0695604532957077,,,,,, +19,67399,,,,,,0.07326041162014008,,,,,, +19,67449,,,,,,0.06509776413440704,,,,,, +19,67499,,,,,,0.0639394149184227,,,,,, +19,67549,,,,,,0.07882821559906006,,,,,, +19,67599,,,,,,0.07760408520698547,,,,,, +19,67649,,,,,,0.07834097743034363,,,,,, +19,67699,,,,,,0.08133924752473831,,,,,, +19,67749,,,,,,0.077980637550354,,,,,, +19,67799,,,,,,0.06912870705127716,,,,,, +19,67849,,,,,,0.07039470970630646,,,,,, +19,67899,,,,,,0.0847756415605545,,,,,, +19,67949,,,,,,0.08673939108848572,,,,,, +19,67999,,,,,,0.09834463894367218,,,,,, +19,68049,,,,,,0.08653216063976288,,,,,, +19,68099,,,,,,0.083381786942482,,,,,, +19,68149,,,,,,0.08980673551559448,,,,,, +19,68199,,,,,,0.09036274254322052,,,,,, +19,68249,,,,,,0.09483198076486588,,,,,, +19,68299,,,,,,0.07810292392969131,,,,,, +19,68349,,,,,,0.0746566504240036,,,,,, +19,68399,,,,,,0.07485929131507874,,,,,, +19,68449,,,,,,0.0835605263710022,,,,,, +19,68499,,,,,,0.08334923535585403,,,,,, +19,68549,,,,,,0.07890574634075165,,,,,, +19,68599,,,,,,0.07847285270690918,,,,,, +19,68649,,,,,,0.07985392212867737,,,,,, +19,68699,,,,,,0.07265564799308777,,,,,, +19,68749,,,,,,0.07660137116909027,,,,,, +19,68799,,,,,,0.0833861455321312,,,,,, +19,68849,,,,,,0.07623718678951263,,,,,, +19,68879,,,,,,,0.24368895590305328,0.08142486214637756,0.19987773895263672,0.014980614185333252,0.1669246256351471,0.08142486214637756 +19,68879,0.2390444427728653,0.0781395360827446,0.2459728717803955,0.05969148874282837,0.22593200206756592,,,,,,, +20,68899,,,,,,0.07138599455356598,,,,,, +20,68949,,,,,,0.06942958384752274,,,,,, +20,68999,,,,,,0.08001956343650818,,,,,, +20,69049,,,,,,0.07160922139883041,,,,,, +20,69099,,,,,,0.08447910100221634,,,,,, +20,69149,,,,,,0.07170271873474121,,,,,, +20,69199,,,,,,0.08354751020669937,,,,,, +20,69249,,,,,,0.07330210506916046,,,,,, +20,69299,,,,,,0.07201497256755829,,,,,, +20,69349,,,,,,0.08214764297008514,,,,,, +20,69399,,,,,,0.08271367847919464,,,,,, +20,69449,,,,,,0.06878095120191574,,,,,, +20,69499,,,,,,0.07619547843933105,,,,,, +20,69549,,,,,,0.06759481132030487,,,,,, +20,69599,,,,,,0.06981725245714188,,,,,, +20,69649,,,,,,0.062040045857429504,,,,,, +20,69699,,,,,,0.07823295891284943,,,,,, +20,69749,,,,,,0.06438112258911133,,,,,, +20,69799,,,,,,0.07145212590694427,,,,,, +20,69849,,,,,,0.07449088990688324,,,,,, +20,69899,,,,,,0.08211779594421387,,,,,, +20,69949,,,,,,0.08630652725696564,,,,,, +20,69999,,,,,,0.08202837407588959,,,,,, +20,70049,,,,,,0.07145632803440094,,,,,, +20,70099,,,,,,0.07835152745246887,,,,,, +20,70149,,,,,,0.074920654296875,,,,,, +20,70199,,,,,,0.09227799624204636,,,,,, +20,70249,,,,,,0.07836136221885681,,,,,, +20,70299,,,,,,0.07800620794296265,,,,,, +20,70349,,,,,,0.07018271088600159,,,,,, +20,70399,,,,,,0.07924709469079971,,,,,, +20,70449,,,,,,0.088524729013443,,,,,, +20,70499,,,,,,0.07548707723617554,,,,,, +20,70549,,,,,,0.07524580508470535,,,,,, +20,70599,,,,,,0.083894282579422,,,,,, +20,70649,,,,,,0.07874168455600739,,,,,, +20,70699,,,,,,0.07407496869564056,,,,,, +20,70749,,,,,,0.07853725552558899,,,,,, +20,70799,,,,,,0.07545861601829529,,,,,, +20,70849,,,,,,0.08403873443603516,,,,,, +20,70899,,,,,,0.07959218323230743,,,,,, +20,70949,,,,,,0.060333795845508575,,,,,, +20,70999,,,,,,0.08497744798660278,,,,,, +20,71049,,,,,,0.08514147996902466,,,,,, +20,71099,,,,,,0.08704927563667297,,,,,, +20,71149,,,,,,0.07196283340454102,,,,,, +20,71199,,,,,,0.08084266632795334,,,,,, +20,71249,,,,,,0.08571918308734894,,,,,, +20,71299,,,,,,0.07937583327293396,,,,,, +20,71349,,,,,,0.09082914143800735,,,,,, +20,71399,,,,,,0.09196825325489044,,,,,, +20,71449,,,,,,0.08364468812942505,,,,,, +20,71499,,,,,,0.08010906726121902,,,,,, +20,71549,,,,,,0.0888046994805336,,,,,, +20,71599,,,,,,0.07587432861328125,,,,,, +20,71649,,,,,,0.08648437261581421,,,,,, +20,71699,,,,,,0.07867537438869476,,,,,, +20,71749,,,,,,0.07083462178707123,,,,,, +20,71799,,,,,,0.08207426965236664,,,,,, +20,71849,,,,,,0.07845685631036758,,,,,, +20,71899,,,,,,0.07000516355037689,,,,,, +20,71949,,,,,,0.07247263193130493,,,,,, +20,71999,,,,,,0.07097280025482178,,,,,, +20,72049,,,,,,0.07389767467975616,,,,,, +20,72099,,,,,,0.06726374477148056,,,,,, +20,72149,,,,,,0.07794582843780518,,,,,, +20,72199,,,,,,0.07663629949092865,,,,,, +20,72249,,,,,,0.07014559209346771,,,,,, +20,72299,,,,,,0.07708533108234406,,,,,, +20,72323,,,,,,,0.2418437898159027,0.0791722908616066,0.2071576714515686,0.04223066568374634,0.17188642919063568,0.0791722908616066 +20,72323,0.23752029240131378,0.07733915746212006,0.26416000723838806,0.06933391094207764,0.24479757249355316,,,,,,, +21,72349,,,,,,0.06719936430454254,,,,,, +21,72399,,,,,,0.07844260334968567,,,,,, +21,72449,,,,,,0.0766875222325325,,,,,, +21,72499,,,,,,0.0743984580039978,,,,,, +21,72549,,,,,,0.0793500617146492,,,,,, +21,72599,,,,,,0.08101574331521988,,,,,, +21,72649,,,,,,0.0897078812122345,,,,,, +21,72699,,,,,,0.08081825077533722,,,,,, +21,72749,,,,,,0.07775335758924484,,,,,, +21,72799,,,,,,0.06686589866876602,,,,,, +21,72849,,,,,,0.06987893581390381,,,,,, +21,72899,,,,,,0.07582832872867584,,,,,, +21,72949,,,,,,0.07635307312011719,,,,,, +21,72999,,,,,,0.06683813035488129,,,,,, +21,73049,,,,,,0.07462913542985916,,,,,, +21,73099,,,,,,0.08691753447055817,,,,,, +21,73149,,,,,,0.08234217017889023,,,,,, +21,73199,,,,,,0.0716855525970459,,,,,, +21,73249,,,,,,0.07618743181228638,,,,,, +21,73299,,,,,,0.06819844990968704,,,,,, +21,73349,,,,,,0.07741917669773102,,,,,, +21,73399,,,,,,0.08543561398983002,,,,,, +21,73449,,,,,,0.07579812407493591,,,,,, +21,73499,,,,,,0.07056751102209091,,,,,, +21,73549,,,,,,0.07547867298126221,,,,,, +21,73599,,,,,,0.07146704196929932,,,,,, +21,73649,,,,,,0.08646342903375626,,,,,, +21,73699,,,,,,0.07511921226978302,,,,,, +21,73749,,,,,,0.09044834226369858,,,,,, +21,73799,,,,,,0.0806431695818901,,,,,, +21,73849,,,,,,0.07895728200674057,,,,,, +21,73899,,,,,,0.07399182766675949,,,,,, +21,73949,,,,,,0.07191009819507599,,,,,, +21,73999,,,,,,0.07076633721590042,,,,,, +21,74049,,,,,,0.08266399800777435,,,,,, +21,74099,,,,,,0.08098401129245758,,,,,, +21,74149,,,,,,0.06122071295976639,,,,,, +21,74199,,,,,,0.07393724471330643,,,,,, +21,74249,,,,,,0.07846832275390625,,,,,, +21,74299,,,,,,0.0717368870973587,,,,,, +21,74349,,,,,,0.07845555245876312,,,,,, +21,74399,,,,,,0.078484445810318,,,,,, +21,74449,,,,,,0.06779008358716965,,,,,, +21,74499,,,,,,0.07405970990657806,,,,,, +21,74549,,,,,,0.06909708678722382,,,,,, +21,74599,,,,,,0.076850026845932,,,,,, +21,74649,,,,,,0.0753420740365982,,,,,, +21,74699,,,,,,0.07428120076656342,,,,,, +21,74749,,,,,,0.07447604089975357,,,,,, +21,74799,,,,,,0.07075535506010056,,,,,, +21,74849,,,,,,0.07352565228939056,,,,,, +21,74899,,,,,,0.0704740434885025,,,,,, +21,74949,,,,,,0.08617325127124786,,,,,, +21,74999,,,,,,0.08365599811077118,,,,,, +21,75049,,,,,,0.07340049743652344,,,,,, +21,75099,,,,,,0.06612204760313034,,,,,, +21,75149,,,,,,0.06269329786300659,,,,,, +21,75199,,,,,,0.0795251876115799,,,,,, +21,75249,,,,,,0.07075724750757217,,,,,, +21,75299,,,,,,0.07191932946443558,,,,,, +21,75349,,,,,,0.07227680087089539,,,,,, +21,75399,,,,,,0.08773583918809891,,,,,, +21,75449,,,,,,0.09794542193412781,,,,,, +21,75499,,,,,,0.0684773325920105,,,,,, +21,75549,,,,,,0.07891206443309784,,,,,, +21,75599,,,,,,0.0765053927898407,,,,,, +21,75649,,,,,,0.07577071338891983,,,,,, +21,75699,,,,,,0.07681917399168015,,,,,, +21,75749,,,,,,0.08151587843894958,,,,,, +21,75767,,,,,,,0.24135369062423706,0.07969214022159576,0.210440993309021,0.035941898822784424,0.174337238073349,0.07969214022159576 +21,75767,0.23571154475212097,0.07637735456228256,0.2849617898464203,0.08089572191238403,0.2596340477466583,,,,,,, +22,75799,,,,,,0.06791628152132034,,,,,, +22,75849,,,,,,0.07825592160224915,,,,,, +22,75899,,,,,,0.07185639441013336,,,,,, +22,75949,,,,,,0.06851033866405487,,,,,, +22,75999,,,,,,0.08462442457675934,,,,,, +22,76049,,,,,,0.08458505570888519,,,,,, +22,76099,,,,,,0.07639871537685394,,,,,, +22,76149,,,,,,0.07764730602502823,,,,,, +22,76199,,,,,,0.07952852547168732,,,,,, +22,76249,,,,,,0.07030517607927322,,,,,, +22,76299,,,,,,0.08833250403404236,,,,,, +22,76349,,,,,,0.06987658143043518,,,,,, +22,76399,,,,,,0.08022642135620117,,,,,, +22,76449,,,,,,0.07714170962572098,,,,,, +22,76499,,,,,,0.06892307102680206,,,,,, +22,76549,,,,,,0.08419835567474365,,,,,, +22,76599,,,,,,0.08307525515556335,,,,,, +22,76649,,,,,,0.0666443407535553,,,,,, +22,76699,,,,,,0.06457854807376862,,,,,, +22,76749,,,,,,0.06788568198680878,,,,,, +22,76799,,,,,,0.08539582788944244,,,,,, +22,76849,,,,,,0.07294722646474838,,,,,, +22,76899,,,,,,0.07415634393692017,,,,,, +22,76949,,,,,,0.07542714476585388,,,,,, +22,76999,,,,,,0.07330642640590668,,,,,, +22,77049,,,,,,0.0667625144124031,,,,,, +22,77099,,,,,,0.06840066611766815,,,,,, +22,77149,,,,,,0.07575567066669464,,,,,, +22,77199,,,,,,0.09101888537406921,,,,,, +22,77249,,,,,,0.07662412524223328,,,,,, +22,77299,,,,,,0.09263110160827637,,,,,, +22,77349,,,,,,0.09182000160217285,,,,,, +22,77399,,,,,,0.0784464180469513,,,,,, +22,77449,,,,,,0.06907295435667038,,,,,, +22,77499,,,,,,0.06839950382709503,,,,,, +22,77549,,,,,,0.08141035586595535,,,,,, +22,77599,,,,,,0.07486303150653839,,,,,, +22,77649,,,,,,0.07613576948642731,,,,,, +22,77699,,,,,,0.09310761839151382,,,,,, +22,77749,,,,,,0.07619711011648178,,,,,, +22,77799,,,,,,0.08415023982524872,,,,,, +22,77849,,,,,,0.07671770453453064,,,,,, +22,77899,,,,,,0.09001182019710541,,,,,, +22,77949,,,,,,0.07693831622600555,,,,,, +22,77999,,,,,,0.05926540493965149,,,,,, +22,78049,,,,,,0.06955213844776154,,,,,, +22,78099,,,,,,0.07567474991083145,,,,,, +22,78149,,,,,,0.08145757764577866,,,,,, +22,78199,,,,,,0.07797045260667801,,,,,, +22,78249,,,,,,0.0773310661315918,,,,,, +22,78299,,,,,,0.08330503106117249,,,,,, +22,78349,,,,,,0.08371275663375854,,,,,, +22,78399,,,,,,0.07173565030097961,,,,,, +22,78449,,,,,,0.06790754199028015,,,,,, +22,78499,,,,,,0.06440725922584534,,,,,, +22,78549,,,,,,0.07178864628076553,,,,,, +22,78599,,,,,,0.07224465906620026,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e04a3b6761919a15b5cf07c4851f4cf6df92656c --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml @@ -0,0 +1,22 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: sweetnet + num_layers: 16 + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 43 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..6965d9e13f8e1bcdad7c2f505113b3d28b4a8e12 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/metrics.csv @@ -0,0 +1,1987 @@ +epoch,step,test/MeanAbsoluteError,test/MeanSquaredError,test/PearsonCorrCoef,test/R2Score,test/SpearmanCorrCoef,test/loss,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +22,75799,,,,,,,,,,,,0.0843079537153244,,,,,, +22,75849,,,,,,,,,,,,0.08726198971271515,,,,,, +22,75899,,,,,,,,,,,,0.08128578215837479,,,,,, +22,75949,,,,,,,,,,,,0.08038252592086792,,,,,, +22,75999,,,,,,,,,,,,0.06564409285783768,,,,,, +22,76049,,,,,,,,,,,,0.09231983125209808,,,,,, +22,76099,,,,,,,,,,,,0.0774243175983429,,,,,, +22,76149,,,,,,,,,,,,0.07680366933345795,,,,,, +22,76199,,,,,,,,,,,,0.07662403583526611,,,,,, +22,76249,,,,,,,,,,,,0.07643329352140427,,,,,, +22,76299,,,,,,,,,,,,0.07528246939182281,,,,,, +22,76349,,,,,,,,,,,,0.07362398505210876,,,,,, +22,76399,,,,,,,,,,,,0.07243269681930542,,,,,, +22,76449,,,,,,,,,,,,0.07826720178127289,,,,,, +22,76499,,,,,,,,,,,,0.07929624617099762,,,,,, +22,76549,,,,,,,,,,,,0.07042500376701355,,,,,, +22,76599,,,,,,,,,,,,0.07066275179386139,,,,,, +22,76649,,,,,,,,,,,,0.07603445649147034,,,,,, +22,76699,,,,,,,,,,,,0.06877859681844711,,,,,, +22,76749,,,,,,,,,,,,0.07370990514755249,,,,,, +22,76799,,,,,,,,,,,,0.08315926045179367,,,,,, +22,76849,,,,,,,,,,,,0.07928715646266937,,,,,, +22,76899,,,,,,,,,,,,0.0849955603480339,,,,,, +22,76949,,,,,,,,,,,,0.0772392526268959,,,,,, +22,76999,,,,,,,,,,,,0.0695212110877037,,,,,, +22,77049,,,,,,,,,,,,0.0821203887462616,,,,,, +22,77099,,,,,,,,,,,,0.09128911048173904,,,,,, +22,77149,,,,,,,,,,,,0.08771826326847076,,,,,, +22,77199,,,,,,,,,,,,0.08191367983818054,,,,,, +22,77249,,,,,,,,,,,,0.07788950949907303,,,,,, +22,77299,,,,,,,,,,,,0.08576986938714981,,,,,, +22,77349,,,,,,,,,,,,0.07651524990797043,,,,,, +22,77399,,,,,,,,,,,,0.07078404724597931,,,,,, +22,77449,,,,,,,,,,,,0.07325442135334015,,,,,, +22,77499,,,,,,,,,,,,0.07637476921081543,,,,,, +22,77549,,,,,,,,,,,,0.06913453340530396,,,,,, +22,77599,,,,,,,,,,,,0.07594026625156403,,,,,, +22,77649,,,,,,,,,,,,0.08631610870361328,,,,,, +22,77699,,,,,,,,,,,,0.08217021822929382,,,,,, +22,77749,,,,,,,,,,,,0.07067963480949402,,,,,, +22,77799,,,,,,,,,,,,0.07110150158405304,,,,,, +22,77849,,,,,,,,,,,,0.08064810931682587,,,,,, +22,77899,,,,,,,,,,,,0.08098503947257996,,,,,, +22,77949,,,,,,,,,,,,0.09026627987623215,,,,,, +22,77999,,,,,,,,,,,,0.07316853851079941,,,,,, +22,78049,,,,,,,,,,,,0.06306532025337219,,,,,, +22,78099,,,,,,,,,,,,0.06883751600980759,,,,,, +22,78149,,,,,,,,,,,,0.08198067545890808,,,,,, +22,78199,,,,,,,,,,,,0.06031423062086105,,,,,, +22,78249,,,,,,,,,,,,0.07136109471321106,,,,,, +22,78299,,,,,,,,,,,,0.06974047422409058,,,,,, +22,78349,,,,,,,,,,,,0.08148281276226044,,,,,, +22,78399,,,,,,,,,,,,0.07673627138137817,,,,,, +22,78449,,,,,,,,,,,,0.06581627577543259,,,,,, +22,78499,,,,,,,,,,,,0.06209772080183029,,,,,, +22,78549,,,,,,,,,,,,0.09074530005455017,,,,,, +22,78599,,,,,,,,,,,,0.08030234277248383,,,,,, +22,78649,,,,,,,,,,,,0.06655986607074738,,,,,, +22,78699,,,,,,,,,,,,0.07244870066642761,,,,,, +22,78749,,,,,,,,,,,,0.07853513956069946,,,,,, +22,78799,,,,,,,,,,,,0.0730152502655983,,,,,, +22,78849,,,,,,,,,,,,0.07937144488096237,,,,,, +22,78899,,,,,,,,,,,,0.06681402027606964,,,,,, +22,78949,,,,,,,,,,,,0.0778442993760109,,,,,, +22,78999,,,,,,,,,,,,0.06434488296508789,,,,,, +22,79049,,,,,,,,,,,,0.07058447599411011,,,,,, +22,79099,,,,,,,,,,,,0.068485789000988,,,,,, +22,79149,,,,,,,,,,,,0.08511976152658463,,,,,, +22,79199,,,,,,,,,,,,0.0748877078294754,,,,,, +22,79211,,,,,,,,,,,,,0.2417004108428955,0.07899373769760132,0.21276284754276276,0.04439061880111694,0.17888188362121582,0.07899373769760132 +22,79211,,,,,,,0.2341560274362564,0.07554446905851364,0.3018553853034973,0.09093058109283447,0.2754207253456116,,,,,,, +23,79249,,,,,,,,,,,,0.06781835854053497,,,,,, +23,79299,,,,,,,,,,,,0.07106839120388031,,,,,, +23,79349,,,,,,,,,,,,0.066049724817276,,,,,, +23,79399,,,,,,,,,,,,0.07416932284832001,,,,,, +23,79449,,,,,,,,,,,,0.06339848041534424,,,,,, +23,79499,,,,,,,,,,,,0.07436082512140274,,,,,, +23,79549,,,,,,,,,,,,0.0733085572719574,,,,,, +23,79599,,,,,,,,,,,,0.07537700235843658,,,,,, +23,79649,,,,,,,,,,,,0.07022804021835327,,,,,, +23,79699,,,,,,,,,,,,0.07406381517648697,,,,,, +23,79749,,,,,,,,,,,,0.06857284903526306,,,,,, +23,79799,,,,,,,,,,,,0.07692046463489532,,,,,, +23,79849,,,,,,,,,,,,0.08017410337924957,,,,,, +23,79899,,,,,,,,,,,,0.0721861869096756,,,,,, +23,79949,,,,,,,,,,,,0.07236458361148834,,,,,, +23,79999,,,,,,,,,,,,0.07189217954874039,,,,,, +23,80049,,,,,,,,,,,,0.08885858952999115,,,,,, +23,80099,,,,,,,,,,,,0.07866857200860977,,,,,, +23,80149,,,,,,,,,,,,0.07445142418146133,,,,,, +23,80199,,,,,,,,,,,,0.06900110095739365,,,,,, +23,80249,,,,,,,,,,,,0.05605904012918472,,,,,, +23,80299,,,,,,,,,,,,0.0823235735297203,,,,,, +23,80349,,,,,,,,,,,,0.06460505723953247,,,,,, +23,80399,,,,,,,,,,,,0.07695214450359344,,,,,, +23,80449,,,,,,,,,,,,0.07909359037876129,,,,,, +23,80499,,,,,,,,,,,,0.07551470398902893,,,,,, +23,80549,,,,,,,,,,,,0.07029488682746887,,,,,, +23,80599,,,,,,,,,,,,0.06762179732322693,,,,,, +23,80649,,,,,,,,,,,,0.07154545187950134,,,,,, +23,80699,,,,,,,,,,,,0.07217614352703094,,,,,, +23,80749,,,,,,,,,,,,0.07041534036397934,,,,,, +23,80799,,,,,,,,,,,,0.08301900327205658,,,,,, +23,80849,,,,,,,,,,,,0.06767834722995758,,,,,, +23,80899,,,,,,,,,,,,0.06796322017908096,,,,,, +23,80949,,,,,,,,,,,,0.07075121253728867,,,,,, +23,80999,,,,,,,,,,,,0.08832159638404846,,,,,, +23,81049,,,,,,,,,,,,0.0693705677986145,,,,,, +23,81099,,,,,,,,,,,,0.07828929275274277,,,,,, +23,81149,,,,,,,,,,,,0.07655947655439377,,,,,, +23,81199,,,,,,,,,,,,0.07752782106399536,,,,,, +23,81249,,,,,,,,,,,,0.06640912592411041,,,,,, +23,81299,,,,,,,,,,,,0.07554236054420471,,,,,, +23,81349,,,,,,,,,,,,0.08067843317985535,,,,,, +23,81399,,,,,,,,,,,,0.0825299322605133,,,,,, +23,81449,,,,,,,,,,,,0.0768381804227829,,,,,, +23,81499,,,,,,,,,,,,0.07797761261463165,,,,,, +23,81549,,,,,,,,,,,,0.0806146189570427,,,,,, +23,81599,,,,,,,,,,,,0.0785897970199585,,,,,, +23,81649,,,,,,,,,,,,0.08543273061513901,,,,,, +23,81699,,,,,,,,,,,,0.08074049651622772,,,,,, +23,81749,,,,,,,,,,,,0.08158466219902039,,,,,, +23,81799,,,,,,,,,,,,0.07501427829265594,,,,,, +23,81849,,,,,,,,,,,,0.08749368786811829,,,,,, +23,81899,,,,,,,,,,,,0.08289365470409393,,,,,, +23,81949,,,,,,,,,,,,0.0793035626411438,,,,,, +23,81999,,,,,,,,,,,,0.06599422544240952,,,,,, +23,82049,,,,,,,,,,,,0.08094844222068787,,,,,, +23,82099,,,,,,,,,,,,0.07156406342983246,,,,,, +23,82149,,,,,,,,,,,,0.07357071340084076,,,,,, +23,82199,,,,,,,,,,,,0.08051678538322449,,,,,, +23,82249,,,,,,,,,,,,0.06343050301074982,,,,,, +23,82299,,,,,,,,,,,,0.08107991516590118,,,,,, +23,82349,,,,,,,,,,,,0.07748347520828247,,,,,, +23,82399,,,,,,,,,,,,0.08373984694480896,,,,,, +23,82449,,,,,,,,,,,,0.0810544416308403,,,,,, +23,82499,,,,,,,,,,,,0.07883667200803757,,,,,, +23,82549,,,,,,,,,,,,0.07201037555932999,,,,,, +23,82599,,,,,,,,,,,,0.06253170967102051,,,,,, +23,82649,,,,,,,,,,,,0.07884404063224792,,,,,, +23,82655,,,,,,,,,,,,,0.24129818379878998,0.07934626936912537,0.2214198261499405,0.04012596607208252,0.1852860301733017,0.07934626936912537 +23,82655,,,,,,,0.23470979928970337,0.07592330127954483,0.29443788528442383,0.08636510372161865,0.2688938081264496,,,,,,, +24,82699,,,,,,,,,,,,0.07954011857509613,,,,,, +24,82749,,,,,,,,,,,,0.07987929880619049,,,,,, +24,82799,,,,,,,,,,,,0.08758583664894104,,,,,, +24,82849,,,,,,,,,,,,0.07775191217660904,,,,,, +24,82899,,,,,,,,,,,,0.0858096107840538,,,,,, +24,82949,,,,,,,,,,,,0.07496381551027298,,,,,, +24,82999,,,,,,,,,,,,0.08071736246347427,,,,,, +24,83049,,,,,,,,,,,,0.07451899349689484,,,,,, +24,83099,,,,,,,,,,,,0.06794795393943787,,,,,, +24,83149,,,,,,,,,,,,0.06844674795866013,,,,,, +24,83199,,,,,,,,,,,,0.06680503487586975,,,,,, +24,83249,,,,,,,,,,,,0.07146860659122467,,,,,, +24,83299,,,,,,,,,,,,0.09823936969041824,,,,,, +24,83349,,,,,,,,,,,,0.07032805681228638,,,,,, +24,83399,,,,,,,,,,,,0.0873006209731102,,,,,, +24,83449,,,,,,,,,,,,0.07166358828544617,,,,,, +24,83499,,,,,,,,,,,,0.07261675596237183,,,,,, +24,83549,,,,,,,,,,,,0.08006355166435242,,,,,, +24,83599,,,,,,,,,,,,0.0602031908929348,,,,,, +24,83649,,,,,,,,,,,,0.07025127112865448,,,,,, +24,83699,,,,,,,,,,,,0.07984840869903564,,,,,, +24,83749,,,,,,,,,,,,0.08618423342704773,,,,,, +24,83799,,,,,,,,,,,,0.07794123888015747,,,,,, +24,83849,,,,,,,,,,,,0.07664157450199127,,,,,, +24,83899,,,,,,,,,,,,0.061797671020030975,,,,,, +24,83949,,,,,,,,,,,,0.07070406526327133,,,,,, +24,83999,,,,,,,,,,,,0.07704734057188034,,,,,, +24,84049,,,,,,,,,,,,0.07797010242938995,,,,,, +24,84099,,,,,,,,,,,,0.05919719859957695,,,,,, +24,84149,,,,,,,,,,,,0.07195189595222473,,,,,, +24,84199,,,,,,,,,,,,0.07041012495756149,,,,,, +24,84249,,,,,,,,,,,,0.07349013537168503,,,,,, +24,84299,,,,,,,,,,,,0.06406351923942566,,,,,, +24,84349,,,,,,,,,,,,0.08337558805942535,,,,,, +24,84399,,,,,,,,,,,,0.07654532045125961,,,,,, +24,84449,,,,,,,,,,,,0.08203713595867157,,,,,, +24,84499,,,,,,,,,,,,0.09681054949760437,,,,,, +24,84549,,,,,,,,,,,,0.07592497020959854,,,,,, +24,84599,,,,,,,,,,,,0.07339826226234436,,,,,, +24,84649,,,,,,,,,,,,0.07503443956375122,,,,,, +24,84699,,,,,,,,,,,,0.0893375426530838,,,,,, +24,84749,,,,,,,,,,,,0.07459656894207001,,,,,, +24,84799,,,,,,,,,,,,0.06953641772270203,,,,,, +24,84849,,,,,,,,,,,,0.08173109591007233,,,,,, +24,84899,,,,,,,,,,,,0.07921852171421051,,,,,, +24,84949,,,,,,,,,,,,0.0804411917924881,,,,,, +24,84999,,,,,,,,,,,,0.07028459012508392,,,,,, +24,85049,,,,,,,,,,,,0.06349734961986542,,,,,, +24,85099,,,,,,,,,,,,0.08872658014297485,,,,,, +24,85149,,,,,,,,,,,,0.0798492282629013,,,,,, +24,85199,,,,,,,,,,,,0.09011576324701309,,,,,, +24,85249,,,,,,,,,,,,0.08459120988845825,,,,,, +24,85299,,,,,,,,,,,,0.07682089507579803,,,,,, +24,85349,,,,,,,,,,,,0.07729187607765198,,,,,, +24,85399,,,,,,,,,,,,0.07578252255916595,,,,,, +24,85449,,,,,,,,,,,,0.08459962159395218,,,,,, +24,85499,,,,,,,,,,,,0.07926832139492035,,,,,, +24,85549,,,,,,,,,,,,0.06902151554822922,,,,,, +24,85599,,,,,,,,,,,,0.07574211061000824,,,,,, +24,85649,,,,,,,,,,,,0.08395978808403015,,,,,, +24,85699,,,,,,,,,,,,0.07822354882955551,,,,,, +24,85749,,,,,,,,,,,,0.07587266713380814,,,,,, +24,85799,,,,,,,,,,,,0.07821638137102127,,,,,, +24,85849,,,,,,,,,,,,0.073784738779068,,,,,, +24,85899,,,,,,,,,,,,0.08261251449584961,,,,,, +24,85949,,,,,,,,,,,,0.0725090354681015,,,,,, +24,85999,,,,,,,,,,,,0.07898526638746262,,,,,, +24,86049,,,,,,,,,,,,0.0860232561826706,,,,,, +24,86099,,,,,,,,,,,,0.08480197191238403,,,,,, +24,86099,,,,,,,,,,,,,0.24514205753803253,0.08105114847421646,0.2094787061214447,0.01950150728225708,0.17797552049160004,0.08105114847421646 +24,86099,,,,,,,0.2347661554813385,0.07593484222888947,0.294260174036026,0.08622664213180542,0.2707808315753937,,,,,,, +25,86149,,,,,,,,,,,,0.07855186611413956,,,,,, +25,86199,,,,,,,,,,,,0.08220468461513519,,,,,, +25,86249,,,,,,,,,,,,0.07391892373561859,,,,,, +25,86299,,,,,,,,,,,,0.07484553754329681,,,,,, +25,86349,,,,,,,,,,,,0.07309554517269135,,,,,, +25,86399,,,,,,,,,,,,0.08718744665384293,,,,,, +25,86449,,,,,,,,,,,,0.08100694417953491,,,,,, +25,86499,,,,,,,,,,,,0.071602463722229,,,,,, +25,86549,,,,,,,,,,,,0.08325985074043274,,,,,, +25,86599,,,,,,,,,,,,0.07086358219385147,,,,,, +25,86649,,,,,,,,,,,,0.06664392352104187,,,,,, +25,86699,,,,,,,,,,,,0.06758011877536774,,,,,, +25,86749,,,,,,,,,,,,0.07724089920520782,,,,,, +25,86799,,,,,,,,,,,,0.06985608488321304,,,,,, +25,86849,,,,,,,,,,,,0.08030208200216293,,,,,, +25,86899,,,,,,,,,,,,0.08482913672924042,,,,,, +25,86949,,,,,,,,,,,,0.08850601315498352,,,,,, +25,86999,,,,,,,,,,,,0.0820341557264328,,,,,, +25,87049,,,,,,,,,,,,0.06945987790822983,,,,,, +25,87099,,,,,,,,,,,,0.06500102579593658,,,,,, +25,87149,,,,,,,,,,,,0.07435373961925507,,,,,, +25,87199,,,,,,,,,,,,0.07195302098989487,,,,,, +25,87249,,,,,,,,,,,,0.0728345662355423,,,,,, +25,87299,,,,,,,,,,,,0.07710263133049011,,,,,, +25,87349,,,,,,,,,,,,0.08895448595285416,,,,,, +25,87399,,,,,,,,,,,,0.058174923062324524,,,,,, +25,87449,,,,,,,,,,,,0.08537757396697998,,,,,, +25,87499,,,,,,,,,,,,0.0756332129240036,,,,,, +25,87549,,,,,,,,,,,,0.07084241509437561,,,,,, +25,87599,,,,,,,,,,,,0.07321880012750626,,,,,, +25,87649,,,,,,,,,,,,0.07878406345844269,,,,,, +25,87699,,,,,,,,,,,,0.0779201090335846,,,,,, +25,87749,,,,,,,,,,,,0.07498791813850403,,,,,, +25,87799,,,,,,,,,,,,0.07195699214935303,,,,,, +25,87849,,,,,,,,,,,,0.08760076761245728,,,,,, +25,87899,,,,,,,,,,,,0.07870472967624664,,,,,, +25,87949,,,,,,,,,,,,0.08170095086097717,,,,,, +25,87999,,,,,,,,,,,,0.0694047287106514,,,,,, +25,88049,,,,,,,,,,,,0.07330167293548584,,,,,, +25,88099,,,,,,,,,,,,0.08066323399543762,,,,,, +25,88149,,,,,,,,,,,,0.0740312784910202,,,,,, +25,88199,,,,,,,,,,,,0.0652676522731781,,,,,, +25,88249,,,,,,,,,,,,0.07773910462856293,,,,,, +25,88299,,,,,,,,,,,,0.08284546434879303,,,,,, +25,88349,,,,,,,,,,,,0.06867858022451401,,,,,, +25,88399,,,,,,,,,,,,0.07466012239456177,,,,,, +25,88449,,,,,,,,,,,,0.08101688325405121,,,,,, +25,88499,,,,,,,,,,,,0.07266303151845932,,,,,, +25,88549,,,,,,,,,,,,0.0827699601650238,,,,,, +25,88599,,,,,,,,,,,,0.07033026218414307,,,,,, +25,88649,,,,,,,,,,,,0.07769852876663208,,,,,, +25,88699,,,,,,,,,,,,0.07839536666870117,,,,,, +25,88749,,,,,,,,,,,,0.08999118208885193,,,,,, +25,88799,,,,,,,,,,,,0.07217080146074295,,,,,, +25,88849,,,,,,,,,,,,0.08365650475025177,,,,,, +25,88899,,,,,,,,,,,,0.07198898494243622,,,,,, +25,88949,,,,,,,,,,,,0.07967351377010345,,,,,, +25,88999,,,,,,,,,,,,0.07364458590745926,,,,,, +25,89049,,,,,,,,,,,,0.06470590084791183,,,,,, +25,89099,,,,,,,,,,,,0.07100115716457367,,,,,, +25,89149,,,,,,,,,,,,0.083870068192482,,,,,, +25,89199,,,,,,,,,,,,0.07682286202907562,,,,,, +25,89249,,,,,,,,,,,,0.08596086502075195,,,,,, +25,89299,,,,,,,,,,,,0.08667690306901932,,,,,, +25,89349,,,,,,,,,,,,0.07495731115341187,,,,,, +25,89399,,,,,,,,,,,,0.07522305846214294,,,,,, +25,89449,,,,,,,,,,,,0.06656874716281891,,,,,, +25,89499,,,,,,,,,,,,0.060990165919065475,,,,,, +25,89543,,,,,,,,,,,,,0.24072305858135223,0.07884540408849716,0.22003903985023499,0.046185076236724854,0.18639764189720154,0.07884540408849716 +25,89543,,,,,,,0.23313231766223907,0.07499086111783981,0.31258252263069153,0.09758961200714111,0.28567275404930115,,,,,,, +26,89549,,,,,,,,,,,,0.07453297078609467,,,,,, +26,89599,,,,,,,,,,,,0.09201546013355255,,,,,, +26,89649,,,,,,,,,,,,0.07246185839176178,,,,,, +26,89699,,,,,,,,,,,,0.07445865124464035,,,,,, +26,89749,,,,,,,,,,,,0.06972913444042206,,,,,, +26,89799,,,,,,,,,,,,0.0791059210896492,,,,,, +26,89849,,,,,,,,,,,,0.07785937935113907,,,,,, +26,89899,,,,,,,,,,,,0.06886384636163712,,,,,, +26,89949,,,,,,,,,,,,0.060600802302360535,,,,,, +26,89999,,,,,,,,,,,,0.07743089646100998,,,,,, +26,90049,,,,,,,,,,,,0.07540720701217651,,,,,, +26,90099,,,,,,,,,,,,0.07704409956932068,,,,,, +26,90149,,,,,,,,,,,,0.06278735399246216,,,,,, +26,90199,,,,,,,,,,,,0.06796909868717194,,,,,, +26,90249,,,,,,,,,,,,0.062546506524086,,,,,, +26,90299,,,,,,,,,,,,0.07096046209335327,,,,,, +26,90349,,,,,,,,,,,,0.07324729114770889,,,,,, +26,90399,,,,,,,,,,,,0.08323583006858826,,,,,, +26,90449,,,,,,,,,,,,0.07329320907592773,,,,,, +26,90499,,,,,,,,,,,,0.0748460590839386,,,,,, +26,90549,,,,,,,,,,,,0.07595910131931305,,,,,, +26,90599,,,,,,,,,,,,0.07488483190536499,,,,,, +26,90649,,,,,,,,,,,,0.0723278820514679,,,,,, +26,90699,,,,,,,,,,,,0.07371318340301514,,,,,, +26,90749,,,,,,,,,,,,0.07806295901536942,,,,,, +26,90799,,,,,,,,,,,,0.07404106855392456,,,,,, +26,90849,,,,,,,,,,,,0.090985506772995,,,,,, +26,90899,,,,,,,,,,,,0.070094034075737,,,,,, +26,90949,,,,,,,,,,,,0.07667669653892517,,,,,, +26,90999,,,,,,,,,,,,0.0787964016199112,,,,,, +26,91049,,,,,,,,,,,,0.08260911703109741,,,,,, +26,91099,,,,,,,,,,,,0.0800502598285675,,,,,, +26,91149,,,,,,,,,,,,0.07295627892017365,,,,,, +26,91199,,,,,,,,,,,,0.07163986563682556,,,,,, +26,91249,,,,,,,,,,,,0.08515806496143341,,,,,, +26,91299,,,,,,,,,,,,0.06823347508907318,,,,,, +26,91349,,,,,,,,,,,,0.07408896088600159,,,,,, +26,91399,,,,,,,,,,,,0.06826113909482956,,,,,, +26,91449,,,,,,,,,,,,0.07881862670183182,,,,,, +26,91499,,,,,,,,,,,,0.07406073063611984,,,,,, +26,91549,,,,,,,,,,,,0.07040417194366455,,,,,, +26,91599,,,,,,,,,,,,0.07066935300827026,,,,,, +26,91649,,,,,,,,,,,,0.08800296485424042,,,,,, +26,91699,,,,,,,,,,,,0.07711192220449448,,,,,, +26,91749,,,,,,,,,,,,0.0687297135591507,,,,,, +26,91799,,,,,,,,,,,,0.06921961903572083,,,,,, +26,91849,,,,,,,,,,,,0.07378526031970978,,,,,, +26,91899,,,,,,,,,,,,0.07104383409023285,,,,,, +26,91949,,,,,,,,,,,,0.08467406779527664,,,,,, +26,91999,,,,,,,,,,,,0.09289820492267609,,,,,, +26,92049,,,,,,,,,,,,0.0742509737610817,,,,,, +26,92099,,,,,,,,,,,,0.06672677397727966,,,,,, +26,92149,,,,,,,,,,,,0.06512066721916199,,,,,, +26,92199,,,,,,,,,,,,0.07850866764783859,,,,,, +26,92249,,,,,,,,,,,,0.07042846083641052,,,,,, +26,92299,,,,,,,,,,,,0.08110568672418594,,,,,, +26,92349,,,,,,,,,,,,0.07654794305562973,,,,,, +26,92399,,,,,,,,,,,,0.08020283281803131,,,,,, +26,92449,,,,,,,,,,,,0.07830992341041565,,,,,, +26,92499,,,,,,,,,,,,0.07126461714506149,,,,,, +26,92549,,,,,,,,,,,,0.07457368075847626,,,,,, +26,92599,,,,,,,,,,,,0.0777052789926529,,,,,, +26,92649,,,,,,,,,,,,0.07431600987911224,,,,,, +26,92699,,,,,,,,,,,,0.06704956293106079,,,,,, +26,92749,,,,,,,,,,,,0.06847558170557022,,,,,, +26,92799,,,,,,,,,,,,0.07918065786361694,,,,,, +26,92849,,,,,,,,,,,,0.07074640691280365,,,,,, +26,92899,,,,,,,,,,,,0.07017284631729126,,,,,, +26,92949,,,,,,,,,,,,0.07064782828092575,,,,,, +26,92987,,,,,,,,,,,,,0.2419077754020691,0.07903409004211426,0.21833579242229462,0.043902456760406494,0.1855185329914093,0.07903409004211426 +26,92987,,,,,,,0.23320910334587097,0.07504542917013168,0.3116030991077423,0.09692215919494629,0.28522834181785583,,,,,,, +27,92999,,,,,,,,,,,,0.07640939950942993,,,,,, +27,93049,,,,,,,,,,,,0.06937490403652191,,,,,, +27,93099,,,,,,,,,,,,0.07538285106420517,,,,,, +27,93149,,,,,,,,,,,,0.08296606689691544,,,,,, +27,93199,,,,,,,,,,,,0.07723523676395416,,,,,, +27,93249,,,,,,,,,,,,0.0807218998670578,,,,,, +27,93299,,,,,,,,,,,,0.08352148532867432,,,,,, +27,93349,,,,,,,,,,,,0.08260330557823181,,,,,, +27,93399,,,,,,,,,,,,0.07581688463687897,,,,,, +27,93449,,,,,,,,,,,,0.07055090367794037,,,,,, +27,93499,,,,,,,,,,,,0.07506345212459564,,,,,, +27,93549,,,,,,,,,,,,0.07744526863098145,,,,,, +27,93599,,,,,,,,,,,,0.08327516913414001,,,,,, +27,93649,,,,,,,,,,,,0.06504692137241364,,,,,, +27,93699,,,,,,,,,,,,0.06668270379304886,,,,,, +27,93749,,,,,,,,,,,,0.06191200017929077,,,,,, +27,93799,,,,,,,,,,,,0.07371409982442856,,,,,, +27,93849,,,,,,,,,,,,0.06990794837474823,,,,,, +27,93899,,,,,,,,,,,,0.08572562783956528,,,,,, +27,93949,,,,,,,,,,,,0.06282347440719604,,,,,, +27,93999,,,,,,,,,,,,0.08393774181604385,,,,,, +27,94049,,,,,,,,,,,,0.07382883876562119,,,,,, +27,94099,,,,,,,,,,,,0.06677597761154175,,,,,, +27,94149,,,,,,,,,,,,0.06386776268482208,,,,,, +27,94199,,,,,,,,,,,,0.0797717422246933,,,,,, +27,94249,,,,,,,,,,,,0.0801985040307045,,,,,, +27,94299,,,,,,,,,,,,0.07927548885345459,,,,,, +27,94349,,,,,,,,,,,,0.0727500468492508,,,,,, +27,94399,,,,,,,,,,,,0.06321852654218674,,,,,, +27,94449,,,,,,,,,,,,0.0725594237446785,,,,,, +27,94499,,,,,,,,,,,,0.06780227273702621,,,,,, +27,94549,,,,,,,,,,,,0.0667072981595993,,,,,, +27,94599,,,,,,,,,,,,0.07980448752641678,,,,,, +27,94649,,,,,,,,,,,,0.07523436844348907,,,,,, +27,94699,,,,,,,,,,,,0.071942538022995,,,,,, +27,94749,,,,,,,,,,,,0.07062005251646042,,,,,, +27,94799,,,,,,,,,,,,0.06809553503990173,,,,,, +27,94849,,,,,,,,,,,,0.07199682295322418,,,,,, +27,94899,,,,,,,,,,,,0.07165160775184631,,,,,, +27,94949,,,,,,,,,,,,0.07180722057819366,,,,,, +27,94999,,,,,,,,,,,,0.06628857553005219,,,,,, +27,95049,,,,,,,,,,,,0.09320326149463654,,,,,, +27,95099,,,,,,,,,,,,0.07854034006595612,,,,,, +27,95149,,,,,,,,,,,,0.06861677020788193,,,,,, +27,95199,,,,,,,,,,,,0.07864795625209808,,,,,, +27,95249,,,,,,,,,,,,0.07917509973049164,,,,,, +27,95299,,,,,,,,,,,,0.06520231068134308,,,,,, +27,95349,,,,,,,,,,,,0.07989293336868286,,,,,, +27,95399,,,,,,,,,,,,0.07183369249105453,,,,,, +27,95449,,,,,,,,,,,,0.09054424613714218,,,,,, +27,95499,,,,,,,,,,,,0.08265957236289978,,,,,, +27,95549,,,,,,,,,,,,0.07032549381256104,,,,,, +27,95599,,,,,,,,,,,,0.07427922636270523,,,,,, +27,95649,,,,,,,,,,,,0.07477530837059021,,,,,, +27,95699,,,,,,,,,,,,0.06366148591041565,,,,,, +27,95749,,,,,,,,,,,,0.07530610263347626,,,,,, +27,95799,,,,,,,,,,,,0.0814158245921135,,,,,, +27,95849,,,,,,,,,,,,0.08021523058414459,,,,,, +27,95899,,,,,,,,,,,,0.07435211539268494,,,,,, +27,95949,,,,,,,,,,,,0.07179266214370728,,,,,, +27,95999,,,,,,,,,,,,0.07466436922550201,,,,,, +27,96049,,,,,,,,,,,,0.07691057026386261,,,,,, +27,96099,,,,,,,,,,,,0.07517349720001221,,,,,, +27,96149,,,,,,,,,,,,0.06933051347732544,,,,,, +27,96199,,,,,,,,,,,,0.08242486417293549,,,,,, +27,96249,,,,,,,,,,,,0.07082177698612213,,,,,, +27,96299,,,,,,,,,,,,0.05865848809480667,,,,,, +27,96349,,,,,,,,,,,,0.07308858633041382,,,,,, +27,96399,,,,,,,,,,,,0.08122919499874115,,,,,, +27,96431,,,,,,,,,,,,,0.24101810157299042,0.07872070372104645,0.2203129380941391,0.047693610191345215,0.1909082680940628,0.07872070372104645 +27,96431,,,,,,,0.23234987258911133,0.07462850213050842,0.3195396363735199,0.10194915533065796,0.2937304973602295,,,,,,, +28,96449,,,,,,,,,,,,0.06486091017723083,,,,,, +28,96499,,,,,,,,,,,,0.07022501528263092,,,,,, +28,96549,,,,,,,,,,,,0.06355729699134827,,,,,, +28,96599,,,,,,,,,,,,0.0798211544752121,,,,,, +28,96649,,,,,,,,,,,,0.07481160759925842,,,,,, +28,96699,,,,,,,,,,,,0.07283339649438858,,,,,, +28,96749,,,,,,,,,,,,0.07111653685569763,,,,,, +28,96799,,,,,,,,,,,,0.08151913434267044,,,,,, +28,96849,,,,,,,,,,,,0.07648904621601105,,,,,, +28,96899,,,,,,,,,,,,0.07237116247415543,,,,,, +28,96949,,,,,,,,,,,,0.08215069770812988,,,,,, +28,96999,,,,,,,,,,,,0.07789759337902069,,,,,, +28,97049,,,,,,,,,,,,0.07980796694755554,,,,,, +28,97099,,,,,,,,,,,,0.09932611882686615,,,,,, +28,97149,,,,,,,,,,,,0.07484914362430573,,,,,, +28,97199,,,,,,,,,,,,0.07595096528530121,,,,,, +28,97249,,,,,,,,,,,,0.0681770071387291,,,,,, +28,97299,,,,,,,,,,,,0.07514775544404984,,,,,, +28,97349,,,,,,,,,,,,0.07547641545534134,,,,,, +28,97399,,,,,,,,,,,,0.07007153332233429,,,,,, +28,97449,,,,,,,,,,,,0.09592597186565399,,,,,, +28,97499,,,,,,,,,,,,0.08002631366252899,,,,,, +28,97549,,,,,,,,,,,,0.07016739994287491,,,,,, +28,97599,,,,,,,,,,,,0.06738121062517166,,,,,, +28,97649,,,,,,,,,,,,0.07862692326307297,,,,,, +28,97699,,,,,,,,,,,,0.07806076109409332,,,,,, +28,97749,,,,,,,,,,,,0.08170881867408752,,,,,, +28,97799,,,,,,,,,,,,0.07945404946804047,,,,,, +28,97849,,,,,,,,,,,,0.08190219849348068,,,,,, +28,97899,,,,,,,,,,,,0.07418908178806305,,,,,, +28,97949,,,,,,,,,,,,0.08617201447486877,,,,,, +28,97999,,,,,,,,,,,,0.0780002623796463,,,,,, +28,98049,,,,,,,,,,,,0.06900673359632492,,,,,, +28,98099,,,,,,,,,,,,0.08151400089263916,,,,,, +28,98149,,,,,,,,,,,,0.08842625468969345,,,,,, +28,98199,,,,,,,,,,,,0.07651853561401367,,,,,, +28,98249,,,,,,,,,,,,0.06874563544988632,,,,,, +28,98299,,,,,,,,,,,,0.07988901436328888,,,,,, +28,98349,,,,,,,,,,,,0.07937230169773102,,,,,, +28,98399,,,,,,,,,,,,0.06250479817390442,,,,,, +28,98449,,,,,,,,,,,,0.07870565354824066,,,,,, +28,98499,,,,,,,,,,,,0.08552289754152298,,,,,, +28,98549,,,,,,,,,,,,0.07869783043861389,,,,,, +28,98599,,,,,,,,,,,,0.08567257970571518,,,,,, +28,98649,,,,,,,,,,,,0.054860346019268036,,,,,, +28,98699,,,,,,,,,,,,0.0791291818022728,,,,,, +28,98749,,,,,,,,,,,,0.06797750294208527,,,,,, +28,98799,,,,,,,,,,,,0.07659602165222168,,,,,, +28,98849,,,,,,,,,,,,0.07371827960014343,,,,,, +28,98899,,,,,,,,,,,,0.07914379239082336,,,,,, +28,98949,,,,,,,,,,,,0.07182518392801285,,,,,, +28,98999,,,,,,,,,,,,0.06661393493413925,,,,,, +28,99049,,,,,,,,,,,,0.06995371729135513,,,,,, +28,99099,,,,,,,,,,,,0.07117342203855515,,,,,, +28,99149,,,,,,,,,,,,0.06837210804224014,,,,,, +28,99199,,,,,,,,,,,,0.08395238220691681,,,,,, +28,99249,,,,,,,,,,,,0.075760118663311,,,,,, +28,99299,,,,,,,,,,,,0.088857501745224,,,,,, +28,99349,,,,,,,,,,,,0.0727032721042633,,,,,, +28,99399,,,,,,,,,,,,0.09419868141412735,,,,,, +28,99449,,,,,,,,,,,,0.07159803062677383,,,,,, +28,99499,,,,,,,,,,,,0.08377809822559357,,,,,, +28,99549,,,,,,,,,,,,0.0695226788520813,,,,,, +28,99599,,,,,,,,,,,,0.0687948614358902,,,,,, +28,99649,,,,,,,,,,,,0.07727784663438797,,,,,, +28,99699,,,,,,,,,,,,0.06999706476926804,,,,,, +28,99749,,,,,,,,,,,,0.0837804451584816,,,,,, +28,99799,,,,,,,,,,,,0.0710403099656105,,,,,, +28,99849,,,,,,,,,,,,0.07673738896846771,,,,,, +28,99875,,,,,,,,,,,,,0.24098962545394897,0.07888461649417877,0.21833275258541107,0.045710742473602295,0.18838317692279816,0.07888461649417877 +28,99875,,,,,,,0.23238052427768707,0.07469365000724792,0.3183652460575104,0.10115748643875122,0.2941053807735443,,,,,,, +29,99899,,,,,,,,,,,,0.07631845027208328,,,,,, +29,99949,,,,,,,,,,,,0.07515376806259155,,,,,, +29,99999,,,,,,,,,,,,0.07260580360889435,,,,,, +29,100049,,,,,,,,,,,,0.06419666111469269,,,,,, +29,100099,,,,,,,,,,,,0.07714314013719559,,,,,, +29,100149,,,,,,,,,,,,0.07275547087192535,,,,,, +29,100199,,,,,,,,,,,,0.07969272136688232,,,,,, +29,100249,,,,,,,,,,,,0.0635552927851677,,,,,, +29,100299,,,,,,,,,,,,0.06633923202753067,,,,,, +29,100349,,,,,,,,,,,,0.07149378210306168,,,,,, +29,100399,,,,,,,,,,,,0.0714007169008255,,,,,, +29,100449,,,,,,,,,,,,0.06860250234603882,,,,,, +29,100499,,,,,,,,,,,,0.06879428774118423,,,,,, +29,100549,,,,,,,,,,,,0.059294797480106354,,,,,, +29,100599,,,,,,,,,,,,0.07915832847356796,,,,,, +29,100649,,,,,,,,,,,,0.07188733667135239,,,,,, +29,100699,,,,,,,,,,,,0.07660402357578278,,,,,, +29,100749,,,,,,,,,,,,0.08691632002592087,,,,,, +29,100799,,,,,,,,,,,,0.07942913472652435,,,,,, +29,100849,,,,,,,,,,,,0.08289727568626404,,,,,, +29,100899,,,,,,,,,,,,0.0704621821641922,,,,,, +29,100949,,,,,,,,,,,,0.06513598561286926,,,,,, +29,100999,,,,,,,,,,,,0.07632318139076233,,,,,, +29,101049,,,,,,,,,,,,0.0680767148733139,,,,,, +29,101099,,,,,,,,,,,,0.07189060747623444,,,,,, +29,101149,,,,,,,,,,,,0.06872764229774475,,,,,, +29,101199,,,,,,,,,,,,0.07485775649547577,,,,,, +29,101249,,,,,,,,,,,,0.07354211062192917,,,,,, +29,101299,,,,,,,,,,,,0.08206332474946976,,,,,, +29,101349,,,,,,,,,,,,0.0765390694141388,,,,,, +29,101399,,,,,,,,,,,,0.06344949454069138,,,,,, +29,101449,,,,,,,,,,,,0.07685846090316772,,,,,, +29,101499,,,,,,,,,,,,0.07902759313583374,,,,,, +29,101549,,,,,,,,,,,,0.07929663360118866,,,,,, +29,101599,,,,,,,,,,,,0.07168209552764893,,,,,, +29,101649,,,,,,,,,,,,0.06959252804517746,,,,,, +29,101699,,,,,,,,,,,,0.07198556512594223,,,,,, +29,101749,,,,,,,,,,,,0.07307320088148117,,,,,, +29,101799,,,,,,,,,,,,0.06869550049304962,,,,,, +29,101849,,,,,,,,,,,,0.07321956008672714,,,,,, +29,101899,,,,,,,,,,,,0.06261353939771652,,,,,, +29,101949,,,,,,,,,,,,0.06847599148750305,,,,,, +29,101999,,,,,,,,,,,,0.06915779411792755,,,,,, +29,102049,,,,,,,,,,,,0.07112793624401093,,,,,, +29,102099,,,,,,,,,,,,0.07277152687311172,,,,,, +29,102149,,,,,,,,,,,,0.0823575109243393,,,,,, +29,102199,,,,,,,,,,,,0.07537367939949036,,,,,, +29,102249,,,,,,,,,,,,0.07074795663356781,,,,,, +29,102299,,,,,,,,,,,,0.06553922593593597,,,,,, +29,102349,,,,,,,,,,,,0.07191949337720871,,,,,, +29,102399,,,,,,,,,,,,0.0645609200000763,,,,,, +29,102449,,,,,,,,,,,,0.07464371621608734,,,,,, +29,102499,,,,,,,,,,,,0.08344841003417969,,,,,, +29,102549,,,,,,,,,,,,0.07975707203149796,,,,,, +29,102599,,,,,,,,,,,,0.06518542766571045,,,,,, +29,102649,,,,,,,,,,,,0.07616815716028214,,,,,, +29,102699,,,,,,,,,,,,0.09155620634555817,,,,,, +29,102749,,,,,,,,,,,,0.062294356524944305,,,,,, +29,102799,,,,,,,,,,,,0.06242386996746063,,,,,, +29,102849,,,,,,,,,,,,0.06813067197799683,,,,,, +29,102899,,,,,,,,,,,,0.07207198441028595,,,,,, +29,102949,,,,,,,,,,,,0.07462242990732193,,,,,, +29,102999,,,,,,,,,,,,0.07808815687894821,,,,,, +29,103049,,,,,,,,,,,,0.07953758537769318,,,,,, +29,103099,,,,,,,,,,,,0.08292052149772644,,,,,, +29,103149,,,,,,,,,,,,0.07202969491481781,,,,,, +29,103199,,,,,,,,,,,,0.06986695528030396,,,,,, +29,103249,,,,,,,,,,,,0.0729297623038292,,,,,, +29,103299,,,,,,,,,,,,0.0698101818561554,,,,,, +29,103319,,,,,,,,,,,,,0.24251419305801392,0.07968879491090775,0.22026433050632477,0.03598231077194214,0.1924811452627182,0.07968879491090775 +29,103319,,,,,,,0.23229455947875977,0.07460344582796097,0.320063978433609,0.1022634506225586,0.2948800027370453,,,,,,, +30,103349,,,,,,,,,,,,0.07236222922801971,,,,,, +30,103399,,,,,,,,,,,,0.07516686618328094,,,,,, +30,103449,,,,,,,,,,,,0.06754416227340698,,,,,, +30,103499,,,,,,,,,,,,0.07338441908359528,,,,,, +30,103549,,,,,,,,,,,,0.07170531153678894,,,,,, +30,103599,,,,,,,,,,,,0.0698586255311966,,,,,, +30,103649,,,,,,,,,,,,0.0851014256477356,,,,,, +30,103699,,,,,,,,,,,,0.08032205700874329,,,,,, +30,103749,,,,,,,,,,,,0.06963638961315155,,,,,, +30,103799,,,,,,,,,,,,0.08370044827461243,,,,,, +30,103849,,,,,,,,,,,,0.07278572022914886,,,,,, +30,103899,,,,,,,,,,,,0.06881177425384521,,,,,, +30,103949,,,,,,,,,,,,0.0739223062992096,,,,,, +30,103999,,,,,,,,,,,,0.06292209774255753,,,,,, +30,104049,,,,,,,,,,,,0.0843145102262497,,,,,, +30,104099,,,,,,,,,,,,0.09174790233373642,,,,,, +30,104149,,,,,,,,,,,,0.07489533722400665,,,,,, +30,104199,,,,,,,,,,,,0.07145185768604279,,,,,, +30,104249,,,,,,,,,,,,0.06530305743217468,,,,,, +30,104299,,,,,,,,,,,,0.08668065816164017,,,,,, +30,104349,,,,,,,,,,,,0.0717388391494751,,,,,, +30,104399,,,,,,,,,,,,0.0730028748512268,,,,,, +30,104449,,,,,,,,,,,,0.0678798109292984,,,,,, +30,104499,,,,,,,,,,,,0.06527713686227798,,,,,, +30,104549,,,,,,,,,,,,0.08494623750448227,,,,,, +30,104599,,,,,,,,,,,,0.07707513123750687,,,,,, +30,104649,,,,,,,,,,,,0.06776463985443115,,,,,, +30,104699,,,,,,,,,,,,0.07120465487241745,,,,,, +30,104749,,,,,,,,,,,,0.06963701546192169,,,,,, +30,104799,,,,,,,,,,,,0.08188673853874207,,,,,, +30,104849,,,,,,,,,,,,0.0778941810131073,,,,,, +30,104899,,,,,,,,,,,,0.0747671127319336,,,,,, +30,104949,,,,,,,,,,,,0.07468092441558838,,,,,, +30,104999,,,,,,,,,,,,0.08395400643348694,,,,,, +30,105049,,,,,,,,,,,,0.06389812380075455,,,,,, +30,105099,,,,,,,,,,,,0.07818382978439331,,,,,, +30,105149,,,,,,,,,,,,0.07198871672153473,,,,,, +30,105199,,,,,,,,,,,,0.06948306411504745,,,,,, +30,105249,,,,,,,,,,,,0.07864472270011902,,,,,, +30,105299,,,,,,,,,,,,0.07584141939878464,,,,,, +30,105349,,,,,,,,,,,,0.07289309054613113,,,,,, +30,105399,,,,,,,,,,,,0.07812920212745667,,,,,, +30,105449,,,,,,,,,,,,0.06553858518600464,,,,,, +30,105499,,,,,,,,,,,,0.06624595075845718,,,,,, +30,105549,,,,,,,,,,,,0.06807949393987656,,,,,, +30,105599,,,,,,,,,,,,0.06665326654911041,,,,,, +30,105649,,,,,,,,,,,,0.08050592243671417,,,,,, +30,105699,,,,,,,,,,,,0.07350128889083862,,,,,, +30,105749,,,,,,,,,,,,0.07856953144073486,,,,,, +30,105799,,,,,,,,,,,,0.07776759564876556,,,,,, +30,105849,,,,,,,,,,,,0.06972441077232361,,,,,, +30,105899,,,,,,,,,,,,0.09050505608320236,,,,,, +30,105949,,,,,,,,,,,,0.08157406002283096,,,,,, +30,105999,,,,,,,,,,,,0.07764076441526413,,,,,, +30,106049,,,,,,,,,,,,0.0779648870229721,,,,,, +30,106099,,,,,,,,,,,,0.08006414771080017,,,,,, +30,106149,,,,,,,,,,,,0.08171818405389786,,,,,, +30,106199,,,,,,,,,,,,0.0707564651966095,,,,,, +30,106249,,,,,,,,,,,,0.07253163307905197,,,,,, +30,106299,,,,,,,,,,,,0.07328793406486511,,,,,, +30,106349,,,,,,,,,,,,0.07832290977239609,,,,,, +30,106399,,,,,,,,,,,,0.078267902135849,,,,,, +30,106449,,,,,,,,,,,,0.086829274892807,,,,,, +30,106499,,,,,,,,,,,,0.07485160231590271,,,,,, +30,106549,,,,,,,,,,,,0.07749789953231812,,,,,, +30,106599,,,,,,,,,,,,0.08274638652801514,,,,,, +30,106649,,,,,,,,,,,,0.08212544023990631,,,,,, +30,106699,,,,,,,,,,,,0.06296294182538986,,,,,, +30,106749,,,,,,,,,,,,0.06643445789813995,,,,,, +30,106763,,,,,,,,,,,,,0.24152635037899017,0.07893779873847961,0.22741936147212982,0.04506736993789673,0.19537535309791565,0.07893779873847961 +30,106763,,,,,,,0.23122261464595795,0.07404740154743195,0.33022990822792053,0.10893809795379639,0.30465957522392273,,,,,,, +31,106799,,,,,,,,,,,,0.0813262090086937,,,,,, +31,106849,,,,,,,,,,,,0.07713782787322998,,,,,, +31,106899,,,,,,,,,,,,0.07228301465511322,,,,,, +31,106949,,,,,,,,,,,,0.06687016785144806,,,,,, +31,106999,,,,,,,,,,,,0.061184220016002655,,,,,, +31,107049,,,,,,,,,,,,0.0646422728896141,,,,,, +31,107099,,,,,,,,,,,,0.0900937169790268,,,,,, +31,107149,,,,,,,,,,,,0.06951763480901718,,,,,, +31,107199,,,,,,,,,,,,0.08845478296279907,,,,,, +31,107249,,,,,,,,,,,,0.07265487313270569,,,,,, +31,107299,,,,,,,,,,,,0.07014016062021255,,,,,, +31,107349,,,,,,,,,,,,0.06579869240522385,,,,,, +31,107399,,,,,,,,,,,,0.06709586083889008,,,,,, +31,107449,,,,,,,,,,,,0.07699333131313324,,,,,, +31,107499,,,,,,,,,,,,0.07592032849788666,,,,,, +31,107549,,,,,,,,,,,,0.07502186298370361,,,,,, +31,107599,,,,,,,,,,,,0.08158448338508606,,,,,, +31,107649,,,,,,,,,,,,0.07101787626743317,,,,,, +31,107699,,,,,,,,,,,,0.07615631073713303,,,,,, +31,107749,,,,,,,,,,,,0.07298555225133896,,,,,, +31,107799,,,,,,,,,,,,0.07640083134174347,,,,,, +31,107849,,,,,,,,,,,,0.0833943635225296,,,,,, +31,107899,,,,,,,,,,,,0.06730371713638306,,,,,, +31,107949,,,,,,,,,,,,0.06882981956005096,,,,,, +31,107999,,,,,,,,,,,,0.08097594976425171,,,,,, +31,108049,,,,,,,,,,,,0.06701995432376862,,,,,, +31,108099,,,,,,,,,,,,0.07236766815185547,,,,,, +31,108149,,,,,,,,,,,,0.06466471403837204,,,,,, +31,108199,,,,,,,,,,,,0.0787370502948761,,,,,, +31,108249,,,,,,,,,,,,0.08331295847892761,,,,,, +31,108299,,,,,,,,,,,,0.08461075276136398,,,,,, +31,108349,,,,,,,,,,,,0.0666108950972557,,,,,, +31,108399,,,,,,,,,,,,0.07196567207574844,,,,,, +31,108449,,,,,,,,,,,,0.07943080365657806,,,,,, +31,108499,,,,,,,,,,,,0.06826150417327881,,,,,, +31,108549,,,,,,,,,,,,0.06664862483739853,,,,,, +31,108599,,,,,,,,,,,,0.06786112487316132,,,,,, +31,108649,,,,,,,,,,,,0.0701734647154808,,,,,, +31,108699,,,,,,,,,,,,0.07185416668653488,,,,,, +31,108749,,,,,,,,,,,,0.07476800680160522,,,,,, +31,108799,,,,,,,,,,,,0.06862826645374298,,,,,, +31,108849,,,,,,,,,,,,0.06575115770101547,,,,,, +31,108899,,,,,,,,,,,,0.08293203264474869,,,,,, +31,108949,,,,,,,,,,,,0.08039353787899017,,,,,, +31,108999,,,,,,,,,,,,0.05936388671398163,,,,,, +31,109049,,,,,,,,,,,,0.07738722860813141,,,,,, +31,109099,,,,,,,,,,,,0.07491739094257355,,,,,, +31,109149,,,,,,,,,,,,0.08732771873474121,,,,,, +31,109199,,,,,,,,,,,,0.07253426313400269,,,,,, +31,109249,,,,,,,,,,,,0.07237228751182556,,,,,, +31,109299,,,,,,,,,,,,0.06698344647884369,,,,,, +31,109349,,,,,,,,,,,,0.0708264485001564,,,,,, +31,109399,,,,,,,,,,,,0.07923725247383118,,,,,, +31,109449,,,,,,,,,,,,0.0748264417052269,,,,,, +31,109499,,,,,,,,,,,,0.07381300628185272,,,,,, +31,109549,,,,,,,,,,,,0.07143469899892807,,,,,, +31,109599,,,,,,,,,,,,0.07214213907718658,,,,,, +31,109649,,,,,,,,,,,,0.059017032384872437,,,,,, +31,109699,,,,,,,,,,,,0.07259804010391235,,,,,, +31,109749,,,,,,,,,,,,0.0719398558139801,,,,,, +31,109799,,,,,,,,,,,,0.08575010299682617,,,,,, +31,109849,,,,,,,,,,,,0.07268810272216797,,,,,, +31,109899,,,,,,,,,,,,0.0695575699210167,,,,,, +31,109949,,,,,,,,,,,,0.07053307443857193,,,,,, +31,109999,,,,,,,,,,,,0.07346002757549286,,,,,, +31,110049,,,,,,,,,,,,0.07884205132722855,,,,,, +31,110099,,,,,,,,,,,,0.06803931295871735,,,,,, +31,110149,,,,,,,,,,,,0.08165278285741806,,,,,, +31,110199,,,,,,,,,,,,0.07319512963294983,,,,,, +31,110207,,,,,,,,,,,,,0.23985131084918976,0.07861828058958054,0.2287062108516693,0.048932671546936035,0.19251136481761932,0.07861828058958054 +31,110207,,,,,,,0.2313786894083023,0.07409682124853134,0.32934314012527466,0.10833442211151123,0.3033527433872223,,,,,,, +32,110249,,,,,,,,,,,,0.06780130416154861,,,,,, +32,110299,,,,,,,,,,,,0.07562316954135895,,,,,, +32,110349,,,,,,,,,,,,0.07711359113454819,,,,,, +32,110399,,,,,,,,,,,,0.08503251522779465,,,,,, +32,110449,,,,,,,,,,,,0.07901108264923096,,,,,, +32,110499,,,,,,,,,,,,0.06865988671779633,,,,,, +32,110549,,,,,,,,,,,,0.06946514546871185,,,,,, +32,110599,,,,,,,,,,,,0.07514014840126038,,,,,, +32,110649,,,,,,,,,,,,0.06696073710918427,,,,,, +32,110699,,,,,,,,,,,,0.07240386307239532,,,,,, +32,110749,,,,,,,,,,,,0.07727859914302826,,,,,, +32,110799,,,,,,,,,,,,0.07333862781524658,,,,,, +32,110849,,,,,,,,,,,,0.07804413139820099,,,,,, +32,110899,,,,,,,,,,,,0.06323043256998062,,,,,, +32,110949,,,,,,,,,,,,0.06423409283161163,,,,,, +32,110999,,,,,,,,,,,,0.0716235563158989,,,,,, +32,111049,,,,,,,,,,,,0.07469362020492554,,,,,, +32,111099,,,,,,,,,,,,0.07120329141616821,,,,,, +32,111149,,,,,,,,,,,,0.07194916903972626,,,,,, +32,111199,,,,,,,,,,,,0.08604837208986282,,,,,, +32,111249,,,,,,,,,,,,0.07768170535564423,,,,,, +32,111299,,,,,,,,,,,,0.0764583945274353,,,,,, +32,111349,,,,,,,,,,,,0.07597082853317261,,,,,, +32,111399,,,,,,,,,,,,0.06879200041294098,,,,,, +32,111449,,,,,,,,,,,,0.06937916576862335,,,,,, +32,111499,,,,,,,,,,,,0.08765412867069244,,,,,, +32,111549,,,,,,,,,,,,0.07103091478347778,,,,,, +32,111599,,,,,,,,,,,,0.07951267063617706,,,,,, +32,111649,,,,,,,,,,,,0.06320009380578995,,,,,, +32,111699,,,,,,,,,,,,0.06840946525335312,,,,,, +32,111749,,,,,,,,,,,,0.07075629383325577,,,,,, +32,111799,,,,,,,,,,,,0.06879495084285736,,,,,, +32,111849,,,,,,,,,,,,0.08245612680912018,,,,,, +32,111899,,,,,,,,,,,,0.07482762634754181,,,,,, +32,111949,,,,,,,,,,,,0.06764901429414749,,,,,, +32,111999,,,,,,,,,,,,0.0784895196557045,,,,,, +32,112049,,,,,,,,,,,,0.07994914054870605,,,,,, +32,112099,,,,,,,,,,,,0.0709507167339325,,,,,, +32,112149,,,,,,,,,,,,0.07356271147727966,,,,,, +32,112199,,,,,,,,,,,,0.06282390654087067,,,,,, +32,112249,,,,,,,,,,,,0.06763597577810287,,,,,, +32,112299,,,,,,,,,,,,0.0714554414153099,,,,,, +32,112349,,,,,,,,,,,,0.08263634145259857,,,,,, +32,112399,,,,,,,,,,,,0.08374827355146408,,,,,, +32,112449,,,,,,,,,,,,0.0760832205414772,,,,,, +32,112499,,,,,,,,,,,,0.08811464160680771,,,,,, +32,112549,,,,,,,,,,,,0.06850805878639221,,,,,, +32,112599,,,,,,,,,,,,0.07519739866256714,,,,,, +32,112649,,,,,,,,,,,,0.07084046304225922,,,,,, +32,112699,,,,,,,,,,,,0.06378023326396942,,,,,, +32,112749,,,,,,,,,,,,0.08396564424037933,,,,,, +32,112799,,,,,,,,,,,,0.06997081637382507,,,,,, +32,112849,,,,,,,,,,,,0.07818755507469177,,,,,, +32,112899,,,,,,,,,,,,0.06762958317995071,,,,,, +32,112949,,,,,,,,,,,,0.06883370876312256,,,,,, +32,112999,,,,,,,,,,,,0.08715421706438065,,,,,, +32,113049,,,,,,,,,,,,0.06474016606807709,,,,,, +32,113099,,,,,,,,,,,,0.08136595040559769,,,,,, +32,113149,,,,,,,,,,,,0.07199420034885406,,,,,, +32,113199,,,,,,,,,,,,0.08260676264762878,,,,,, +32,113249,,,,,,,,,,,,0.06382620334625244,,,,,, +32,113299,,,,,,,,,,,,0.06767783313989639,,,,,, +32,113349,,,,,,,,,,,,0.07917588949203491,,,,,, +32,113399,,,,,,,,,,,,0.0712629109621048,,,,,, +32,113449,,,,,,,,,,,,0.0916571319103241,,,,,, +32,113499,,,,,,,,,,,,0.07969208806753159,,,,,, +32,113549,,,,,,,,,,,,0.08617199212312698,,,,,, +32,113599,,,,,,,,,,,,0.07680173218250275,,,,,, +32,113649,,,,,,,,,,,,0.0782427042722702,,,,,, +32,113651,,,,,,,,,,,,,0.24022185802459717,0.07894007116556168,0.231268048286438,0.04503989219665527,0.19473129510879517,0.07894007116556168 +32,113651,,,,,,,0.23148086667060852,0.07416746020317078,0.32814857363700867,0.10749602317810059,0.30404236912727356,,,,,,, +33,113699,,,,,,,,,,,,0.07407254725694656,,,,,, +33,113749,,,,,,,,,,,,0.06963837146759033,,,,,, +33,113799,,,,,,,,,,,,0.07544577121734619,,,,,, +33,113849,,,,,,,,,,,,0.07497742772102356,,,,,, +33,113899,,,,,,,,,,,,0.06919197738170624,,,,,, +33,113949,,,,,,,,,,,,0.07173354178667068,,,,,, +33,113999,,,,,,,,,,,,0.08272203058004379,,,,,, +33,114049,,,,,,,,,,,,0.06304767727851868,,,,,, +33,114099,,,,,,,,,,,,0.06679460406303406,,,,,, +33,114149,,,,,,,,,,,,0.08015288412570953,,,,,, +33,114199,,,,,,,,,,,,0.07774542272090912,,,,,, +33,114249,,,,,,,,,,,,0.06501223891973495,,,,,, +33,114299,,,,,,,,,,,,0.07417742908000946,,,,,, +33,114349,,,,,,,,,,,,0.070929616689682,,,,,, +33,114399,,,,,,,,,,,,0.06973014771938324,,,,,, +33,114449,,,,,,,,,,,,0.07015082240104675,,,,,, +33,114499,,,,,,,,,,,,0.07121926546096802,,,,,, +33,114549,,,,,,,,,,,,0.07336323708295822,,,,,, +33,114599,,,,,,,,,,,,0.07377312332391739,,,,,, +33,114649,,,,,,,,,,,,0.07042408734560013,,,,,, +33,114699,,,,,,,,,,,,0.07449966669082642,,,,,, +33,114749,,,,,,,,,,,,0.07601439952850342,,,,,, +33,114799,,,,,,,,,,,,0.07583475857973099,,,,,, +33,114849,,,,,,,,,,,,0.08291158080101013,,,,,, +33,114899,,,,,,,,,,,,0.0750933587551117,,,,,, +33,114949,,,,,,,,,,,,0.07858811318874359,,,,,, +33,114999,,,,,,,,,,,,0.07505761086940765,,,,,, +33,115049,,,,,,,,,,,,0.07171166688203812,,,,,, +33,115099,,,,,,,,,,,,0.06395159661769867,,,,,, +33,115149,,,,,,,,,,,,0.0713454857468605,,,,,, +33,115199,,,,,,,,,,,,0.06845691800117493,,,,,, +33,115249,,,,,,,,,,,,0.06920217722654343,,,,,, +33,115299,,,,,,,,,,,,0.0729152262210846,,,,,, +33,115349,,,,,,,,,,,,0.08222135901451111,,,,,, +33,115399,,,,,,,,,,,,0.07755541801452637,,,,,, +33,115449,,,,,,,,,,,,0.07939624786376953,,,,,, +33,115499,,,,,,,,,,,,0.08053030073642731,,,,,, +33,115549,,,,,,,,,,,,0.0718240886926651,,,,,, +33,115599,,,,,,,,,,,,0.07375659048557281,,,,,, +33,115649,,,,,,,,,,,,0.07647515088319778,,,,,, +33,115699,,,,,,,,,,,,0.07668035477399826,,,,,, +33,115749,,,,,,,,,,,,0.06997906416654587,,,,,, +33,115799,,,,,,,,,,,,0.07957321405410767,,,,,, +33,115849,,,,,,,,,,,,0.07026080787181854,,,,,, +33,115899,,,,,,,,,,,,0.06458110362291336,,,,,, +33,115949,,,,,,,,,,,,0.07695938646793365,,,,,, +33,115999,,,,,,,,,,,,0.0704648494720459,,,,,, +33,116049,,,,,,,,,,,,0.07685724645853043,,,,,, +33,116099,,,,,,,,,,,,0.07270394265651703,,,,,, +33,116149,,,,,,,,,,,,0.055371396243572235,,,,,, +33,116199,,,,,,,,,,,,0.07209983468055725,,,,,, +33,116249,,,,,,,,,,,,0.07177840173244476,,,,,, +33,116299,,,,,,,,,,,,0.07368644326925278,,,,,, +33,116349,,,,,,,,,,,,0.07566496729850769,,,,,, +33,116399,,,,,,,,,,,,0.08029188960790634,,,,,, +33,116449,,,,,,,,,,,,0.07267272472381592,,,,,, +33,116499,,,,,,,,,,,,0.07725968956947327,,,,,, +33,116549,,,,,,,,,,,,0.07835020124912262,,,,,, +33,116599,,,,,,,,,,,,0.06571061909198761,,,,,, +33,116649,,,,,,,,,,,,0.07312875986099243,,,,,, +33,116699,,,,,,,,,,,,0.07275930047035217,,,,,, +33,116749,,,,,,,,,,,,0.07158289104700089,,,,,, +33,116799,,,,,,,,,,,,0.06641553342342377,,,,,, +33,116849,,,,,,,,,,,,0.07559873163700104,,,,,, +33,116899,,,,,,,,,,,,0.07402914762496948,,,,,, +33,116949,,,,,,,,,,,,0.07758845388889313,,,,,, +33,116999,,,,,,,,,,,,0.07753122597932816,,,,,, +33,117049,,,,,,,,,,,,0.07593577355146408,,,,,, +33,117095,,,,,,,,,,,,,0.24041719734668732,0.07856777310371399,0.2317308932542801,0.049543678760528564,0.20079150795936584,0.07856777310371399 +33,117095,,,,,,,0.2315213829278946,0.07418116927146912,0.3278353810310364,0.1073228120803833,0.30157768726348877,,,,,,, +34,117099,,,,,,,,,,,,0.07735095173120499,,,,,, +34,117149,,,,,,,,,,,,0.07707232236862183,,,,,, +34,117199,,,,,,,,,,,,0.07822639495134354,,,,,, +34,117249,,,,,,,,,,,,0.06654584407806396,,,,,, +34,117299,,,,,,,,,,,,0.07430156320333481,,,,,, +34,117349,,,,,,,,,,,,0.07156974077224731,,,,,, +34,117399,,,,,,,,,,,,0.07045530527830124,,,,,, +34,117449,,,,,,,,,,,,0.08620855212211609,,,,,, +34,117499,,,,,,,,,,,,0.07968582212924957,,,,,, +34,117549,,,,,,,,,,,,0.07190680503845215,,,,,, +34,117599,,,,,,,,,,,,0.08333387225866318,,,,,, +34,117649,,,,,,,,,,,,0.07870267331600189,,,,,, +34,117699,,,,,,,,,,,,0.07889577001333237,,,,,, +34,117749,,,,,,,,,,,,0.0709143579006195,,,,,, +34,117799,,,,,,,,,,,,0.07700524479150772,,,,,, +34,117849,,,,,,,,,,,,0.06533187627792358,,,,,, +34,117899,,,,,,,,,,,,0.07308761030435562,,,,,, +34,117949,,,,,,,,,,,,0.09037807583808899,,,,,, +34,117999,,,,,,,,,,,,0.07533800601959229,,,,,, +34,118049,,,,,,,,,,,,0.0679125040769577,,,,,, +34,118099,,,,,,,,,,,,0.0703633651137352,,,,,, +34,118149,,,,,,,,,,,,0.0715637058019638,,,,,, +34,118199,,,,,,,,,,,,0.09283220767974854,,,,,, +34,118249,,,,,,,,,,,,0.15231075882911682,,,,,, +34,118299,,,,,,,,,,,,0.0767548531293869,,,,,, +34,118349,,,,,,,,,,,,0.07082763314247131,,,,,, +34,118399,,,,,,,,,,,,0.08929071575403214,,,,,, +34,118449,,,,,,,,,,,,0.07437143474817276,,,,,, +34,118499,,,,,,,,,,,,0.07218894362449646,,,,,, +34,118549,,,,,,,,,,,,0.06798471510410309,,,,,, +34,118599,,,,,,,,,,,,0.07403803616762161,,,,,, +34,118649,,,,,,,,,,,,0.06731025129556656,,,,,, +34,118699,,,,,,,,,,,,0.0806904137134552,,,,,, +34,118749,,,,,,,,,,,,0.07884147018194199,,,,,, +34,118799,,,,,,,,,,,,0.06884786486625671,,,,,, +34,118849,,,,,,,,,,,,0.07209990918636322,,,,,, +34,118899,,,,,,,,,,,,0.06852899491786957,,,,,, +34,118949,,,,,,,,,,,,0.0696011632680893,,,,,, +34,118999,,,,,,,,,,,,0.06412146985530853,,,,,, +34,119049,,,,,,,,,,,,0.07072043418884277,,,,,, +34,119099,,,,,,,,,,,,0.0699329823255539,,,,,, +34,119149,,,,,,,,,,,,0.07877544313669205,,,,,, +34,119199,,,,,,,,,,,,0.06453169137239456,,,,,, +34,119249,,,,,,,,,,,,0.07876425981521606,,,,,, +34,119299,,,,,,,,,,,,0.0868435651063919,,,,,, +34,119349,,,,,,,,,,,,0.0666816234588623,,,,,, +34,119399,,,,,,,,,,,,0.08221345394849777,,,,,, +34,119449,,,,,,,,,,,,0.07780519127845764,,,,,, +34,119499,,,,,,,,,,,,0.08676332235336304,,,,,, +34,119549,,,,,,,,,,,,0.07294369488954544,,,,,, +34,119599,,,,,,,,,,,,0.08506536483764648,,,,,, +34,119649,,,,,,,,,,,,0.08783113956451416,,,,,, +34,119699,,,,,,,,,,,,0.06775794923305511,,,,,, +34,119749,,,,,,,,,,,,0.08307824283838272,,,,,, +34,119799,,,,,,,,,,,,0.07432729005813599,,,,,, +34,119849,,,,,,,,,,,,0.07080653309822083,,,,,, +34,119899,,,,,,,,,,,,0.07734530419111252,,,,,, +34,119949,,,,,,,,,,,,0.07069268822669983,,,,,, +34,119999,,,,,,,,,,,,0.06746363639831543,,,,,, +34,120049,,,,,,,,,,,,0.06457844376564026,,,,,, +34,120099,,,,,,,,,,,,0.07663184404373169,,,,,, +34,120149,,,,,,,,,,,,0.07648396492004395,,,,,, +34,120199,,,,,,,,,,,,0.07015186548233032,,,,,, +34,120249,,,,,,,,,,,,0.0773950144648552,,,,,, +34,120299,,,,,,,,,,,,0.07634063810110092,,,,,, +34,120349,,,,,,,,,,,,0.07622428238391876,,,,,, +34,120399,,,,,,,,,,,,0.07852378487586975,,,,,, +34,120449,,,,,,,,,,,,0.07314467430114746,,,,,, +34,120499,,,,,,,,,,,,0.07239395380020142,,,,,, +34,120539,,,,,,,,,,,,,0.24191628396511078,0.07994601875543594,0.22818109393119812,0.03287065029144287,0.19708137214183807,0.07994601875543594 +34,120539,,,,,,,0.23084557056427002,0.07388029247522354,0.33332565426826477,0.1109514832496643,0.3089706003665924,,,,,,, +35,120549,,,,,,,,,,,,0.0837763249874115,,,,,, +35,120599,,,,,,,,,,,,0.07885086536407471,,,,,, +35,120649,,,,,,,,,,,,0.06908337771892548,,,,,, +35,120699,,,,,,,,,,,,0.07763030380010605,,,,,, +35,120749,,,,,,,,,,,,0.0781852975487709,,,,,, +35,120799,,,,,,,,,,,,0.07754164934158325,,,,,, +35,120849,,,,,,,,,,,,0.0819789320230484,,,,,, +35,120899,,,,,,,,,,,,0.07589079439640045,,,,,, +35,120949,,,,,,,,,,,,0.06925258785486221,,,,,, +35,120999,,,,,,,,,,,,0.060976117849349976,,,,,, +35,121049,,,,,,,,,,,,0.07020340859889984,,,,,, +35,121099,,,,,,,,,,,,0.07394210994243622,,,,,, +35,121149,,,,,,,,,,,,0.08149778842926025,,,,,, +35,121199,,,,,,,,,,,,0.0863901898264885,,,,,, +35,121249,,,,,,,,,,,,0.06977400928735733,,,,,, +35,121299,,,,,,,,,,,,0.07019250839948654,,,,,, +35,121349,,,,,,,,,,,,0.08016271889209747,,,,,, +35,121399,,,,,,,,,,,,0.08374863117933273,,,,,, +35,121449,,,,,,,,,,,,0.06568960845470428,,,,,, +35,121499,,,,,,,,,,,,0.07959059625864029,,,,,, +35,121549,,,,,,,,,,,,0.07238058745861053,,,,,, +35,121599,,,,,,,,,,,,0.07625317573547363,,,,,, +35,121649,,,,,,,,,,,,0.07046647369861603,,,,,, +35,121699,,,,,,,,,,,,0.0739937424659729,,,,,, +35,121749,,,,,,,,,,,,0.06476758420467377,,,,,, +35,121799,,,,,,,,,,,,0.06786344945430756,,,,,, +35,121849,,,,,,,,,,,,0.07639679312705994,,,,,, +35,121899,,,,,,,,,,,,0.08119478821754456,,,,,, +35,121949,,,,,,,,,,,,0.056685179471969604,,,,,, +35,121999,,,,,,,,,,,,0.07347849756479263,,,,,, +35,122049,,,,,,,,,,,,0.06370984017848969,,,,,, +35,122099,,,,,,,,,,,,0.0827036052942276,,,,,, +35,122149,,,,,,,,,,,,0.0703965574502945,,,,,, +35,122199,,,,,,,,,,,,0.08818338066339493,,,,,, +35,122249,,,,,,,,,,,,0.06060853973031044,,,,,, +35,122299,,,,,,,,,,,,0.08112164586782455,,,,,, +35,122349,,,,,,,,,,,,0.08195393532514572,,,,,, +35,122399,,,,,,,,,,,,0.07710830122232437,,,,,, +35,122449,,,,,,,,,,,,0.06874391436576843,,,,,, +35,122499,,,,,,,,,,,,0.06754852831363678,,,,,, +35,122549,,,,,,,,,,,,0.06588900834321976,,,,,, +35,122599,,,,,,,,,,,,0.06662783771753311,,,,,, +35,122649,,,,,,,,,,,,0.07764139771461487,,,,,, +35,122699,,,,,,,,,,,,0.07891875505447388,,,,,, +35,122749,,,,,,,,,,,,0.06390096247196198,,,,,, +35,122799,,,,,,,,,,,,0.0756811574101448,,,,,, +35,122849,,,,,,,,,,,,0.07088666409254074,,,,,, +35,122899,,,,,,,,,,,,0.07392160594463348,,,,,, +35,122949,,,,,,,,,,,,0.0621335506439209,,,,,, +35,122999,,,,,,,,,,,,0.06759453564882278,,,,,, +35,123049,,,,,,,,,,,,0.07819566875696182,,,,,, +35,123099,,,,,,,,,,,,0.07729417085647583,,,,,, +35,123149,,,,,,,,,,,,0.06723913550376892,,,,,, +35,123199,,,,,,,,,,,,0.068758025765419,,,,,, +35,123249,,,,,,,,,,,,0.07701548933982849,,,,,, +35,123299,,,,,,,,,,,,0.07529592514038086,,,,,, +35,123349,,,,,,,,,,,,0.07187025249004364,,,,,, +35,123399,,,,,,,,,,,,0.06508369743824005,,,,,, +35,123449,,,,,,,,,,,,0.06422945857048035,,,,,, +35,123499,,,,,,,,,,,,0.07384112477302551,,,,,, +35,123549,,,,,,,,,,,,0.06335733085870743,,,,,, +35,123599,,,,,,,,,,,,0.0703747570514679,,,,,, +35,123649,,,,,,,,,,,,0.06313901394605637,,,,,, +35,123699,,,,,,,,,,,,0.06646644324064255,,,,,, +35,123749,,,,,,,,,,,,0.07687404751777649,,,,,, +35,123799,,,,,,,,,,,,0.06891259551048279,,,,,, +35,123849,,,,,,,,,,,,0.08180149644613266,,,,,, +35,123899,,,,,,,,,,,,0.06861557066440582,,,,,, +35,123949,,,,,,,,,,,,0.07568588107824326,,,,,, +35,123983,,,,,,,,,,,,,0.24021224677562714,0.07834777981042862,0.2286880761384964,0.052204906940460205,0.19786934554576874,0.07834777981042862 +35,123983,,,,,,,0.23037749528884888,0.07356030493974686,0.3389780819416046,0.11479508876800537,0.31426307559013367,,,,,,, +36,123999,,,,,,,,,,,,0.07614520192146301,,,,,, +36,124049,,,,,,,,,,,,0.08233244717121124,,,,,, +36,124099,,,,,,,,,,,,0.06651227176189423,,,,,, +36,124149,,,,,,,,,,,,0.06835034489631653,,,,,, +36,124199,,,,,,,,,,,,0.07511068880558014,,,,,, +36,124249,,,,,,,,,,,,0.06494443863630295,,,,,, +36,124299,,,,,,,,,,,,0.0699363648891449,,,,,, +36,124349,,,,,,,,,,,,0.08156009018421173,,,,,, +36,124399,,,,,,,,,,,,0.07689988613128662,,,,,, +36,124449,,,,,,,,,,,,0.07738243043422699,,,,,, +36,124499,,,,,,,,,,,,0.07759471982717514,,,,,, +36,124549,,,,,,,,,,,,0.06809101998806,,,,,, +36,124599,,,,,,,,,,,,0.0616140216588974,,,,,, +36,124649,,,,,,,,,,,,0.07418178021907806,,,,,, +36,124699,,,,,,,,,,,,0.0720459595322609,,,,,, +36,124749,,,,,,,,,,,,0.06669741868972778,,,,,, +36,124799,,,,,,,,,,,,0.06266139447689056,,,,,, +36,124849,,,,,,,,,,,,0.07503701746463776,,,,,, +36,124899,,,,,,,,,,,,0.0823596715927124,,,,,, +36,124949,,,,,,,,,,,,0.05970758944749832,,,,,, +36,124999,,,,,,,,,,,,0.07911330461502075,,,,,, +36,125049,,,,,,,,,,,,0.07654446363449097,,,,,, +36,125099,,,,,,,,,,,,0.07294972240924835,,,,,, +36,125149,,,,,,,,,,,,0.07182025164365768,,,,,, +36,125199,,,,,,,,,,,,0.08469590544700623,,,,,, +36,125249,,,,,,,,,,,,0.06580229103565216,,,,,, +36,125299,,,,,,,,,,,,0.09017381817102432,,,,,, +36,125349,,,,,,,,,,,,0.06863541901111603,,,,,, +36,125399,,,,,,,,,,,,0.07441648840904236,,,,,, +36,125449,,,,,,,,,,,,0.08000296354293823,,,,,, +36,125499,,,,,,,,,,,,0.0826462060213089,,,,,, +36,125549,,,,,,,,,,,,0.07442757487297058,,,,,, +36,125599,,,,,,,,,,,,0.07628153264522552,,,,,, +36,125649,,,,,,,,,,,,0.07244446873664856,,,,,, +36,125699,,,,,,,,,,,,0.07808217406272888,,,,,, +36,125749,,,,,,,,,,,,0.07981250435113907,,,,,, +36,125799,,,,,,,,,,,,0.06695783138275146,,,,,, +36,125849,,,,,,,,,,,,0.08185986429452896,,,,,, +36,125899,,,,,,,,,,,,0.08077292144298553,,,,,, +36,125949,,,,,,,,,,,,0.07536020874977112,,,,,, +36,125999,,,,,,,,,,,,0.07082927972078323,,,,,, +36,126049,,,,,,,,,,,,0.07093417644500732,,,,,, +36,126099,,,,,,,,,,,,0.07900891453027725,,,,,, +36,126149,,,,,,,,,,,,0.06354323774576187,,,,,, +36,126199,,,,,,,,,,,,0.07818455994129181,,,,,, +36,126249,,,,,,,,,,,,0.07899023592472076,,,,,, +36,126299,,,,,,,,,,,,0.07158568501472473,,,,,, +36,126349,,,,,,,,,,,,0.07947205007076263,,,,,, +36,126399,,,,,,,,,,,,0.07277996093034744,,,,,, +36,126449,,,,,,,,,,,,0.06966747343540192,,,,,, +36,126499,,,,,,,,,,,,0.07710883766412735,,,,,, +36,126549,,,,,,,,,,,,0.0769936591386795,,,,,, +36,126599,,,,,,,,,,,,0.06320574879646301,,,,,, +36,126649,,,,,,,,,,,,0.07223021984100342,,,,,, +36,126699,,,,,,,,,,,,0.07929500192403793,,,,,, +36,126749,,,,,,,,,,,,0.07853303849697113,,,,,, +36,126799,,,,,,,,,,,,0.07844220846891403,,,,,, +36,126849,,,,,,,,,,,,0.06442421674728394,,,,,, +36,126899,,,,,,,,,,,,0.06904634833335876,,,,,, +36,126949,,,,,,,,,,,,0.07938909530639648,,,,,, +36,126999,,,,,,,,,,,,0.06879120320081711,,,,,, +36,127049,,,,,,,,,,,,0.07615936547517776,,,,,, +36,127099,,,,,,,,,,,,0.057240404188632965,,,,,, +36,127149,,,,,,,,,,,,0.08334807306528091,,,,,, +36,127199,,,,,,,,,,,,0.07889565825462341,,,,,, +36,127249,,,,,,,,,,,,0.07379791140556335,,,,,, +36,127299,,,,,,,,,,,,0.07619953900575638,,,,,, +36,127349,,,,,,,,,,,,0.07405225932598114,,,,,, +36,127399,,,,,,,,,,,,0.0767555981874466,,,,,, +36,127427,,,,,,,,,,,,,0.2404165416955948,0.078340083360672,0.231265589594841,0.05229806900024414,0.19899286329746246,0.078340083360672 +36,127427,,,,,,,0.23160110414028168,0.07444803416728973,0.32323309779167175,0.10411667823791504,0.2994469404220581,,,,,,, +37,127449,,,,,,,,,,,,0.07585650682449341,,,,,, +37,127499,,,,,,,,,,,,0.08021941781044006,,,,,, +37,127549,,,,,,,,,,,,0.07099385559558868,,,,,, +37,127599,,,,,,,,,,,,0.06842412799596786,,,,,, +37,127649,,,,,,,,,,,,0.07855726778507233,,,,,, +37,127699,,,,,,,,,,,,0.06625121831893921,,,,,, +37,127749,,,,,,,,,,,,0.07015275210142136,,,,,, +37,127799,,,,,,,,,,,,0.07101517915725708,,,,,, +37,127849,,,,,,,,,,,,0.06279706954956055,,,,,, +37,127899,,,,,,,,,,,,0.07504945993423462,,,,,, +37,127949,,,,,,,,,,,,0.08297837525606155,,,,,, +37,127999,,,,,,,,,,,,0.0807274580001831,,,,,, +37,128049,,,,,,,,,,,,0.08075252175331116,,,,,, +37,128099,,,,,,,,,,,,0.07952140271663666,,,,,, +37,128149,,,,,,,,,,,,0.06646494567394257,,,,,, +37,128199,,,,,,,,,,,,0.06371299177408218,,,,,, +37,128249,,,,,,,,,,,,0.07669927179813385,,,,,, +37,128299,,,,,,,,,,,,0.08437571674585342,,,,,, +37,128349,,,,,,,,,,,,0.07755754888057709,,,,,, +37,128399,,,,,,,,,,,,0.08006195724010468,,,,,, +37,128449,,,,,,,,,,,,0.07663237303495407,,,,,, +37,128499,,,,,,,,,,,,0.07799560576677322,,,,,, +37,128549,,,,,,,,,,,,0.07646708190441132,,,,,, +37,128599,,,,,,,,,,,,0.08165708184242249,,,,,, +37,128649,,,,,,,,,,,,0.0674988180398941,,,,,, +37,128699,,,,,,,,,,,,0.0699886679649353,,,,,, +37,128749,,,,,,,,,,,,0.07823771238327026,,,,,, +37,128799,,,,,,,,,,,,0.07618953287601471,,,,,, +37,128849,,,,,,,,,,,,0.08105383068323135,,,,,, +37,128899,,,,,,,,,,,,0.07615531235933304,,,,,, +37,128949,,,,,,,,,,,,0.07130415737628937,,,,,, +37,128999,,,,,,,,,,,,0.0655982494354248,,,,,, +37,129049,,,,,,,,,,,,0.07960440218448639,,,,,, +37,129099,,,,,,,,,,,,0.07075142860412598,,,,,, +37,129149,,,,,,,,,,,,0.07519236207008362,,,,,, +37,129199,,,,,,,,,,,,0.06361373513936996,,,,,, +37,129249,,,,,,,,,,,,0.07363727688789368,,,,,, +37,129299,,,,,,,,,,,,0.07244402170181274,,,,,, +37,129349,,,,,,,,,,,,0.07200062274932861,,,,,, +37,129399,,,,,,,,,,,,0.06717430055141449,,,,,, +37,129449,,,,,,,,,,,,0.08053082972764969,,,,,, +37,129499,,,,,,,,,,,,0.07859774678945541,,,,,, +37,129549,,,,,,,,,,,,0.06924298405647278,,,,,, +37,129599,,,,,,,,,,,,0.05900929868221283,,,,,, +37,129649,,,,,,,,,,,,0.06565648317337036,,,,,, +37,129699,,,,,,,,,,,,0.07277770340442657,,,,,, +37,129749,,,,,,,,,,,,0.08028553426265717,,,,,, +37,129799,,,,,,,,,,,,0.07941786199808121,,,,,, +37,129849,,,,,,,,,,,,0.09147154539823532,,,,,, +37,129899,,,,,,,,,,,,0.06255483627319336,,,,,, +37,129949,,,,,,,,,,,,0.05992109701037407,,,,,, +37,129999,,,,,,,,,,,,0.07551534473896027,,,,,, +37,130049,,,,,,,,,,,,0.08039583265781403,,,,,, +37,130099,,,,,,,,,,,,0.07254748046398163,,,,,, +37,130149,,,,,,,,,,,,0.06221463158726692,,,,,, +37,130199,,,,,,,,,,,,0.06887449324131012,,,,,, +37,130249,,,,,,,,,,,,0.07969406992197037,,,,,, +37,130299,,,,,,,,,,,,0.06809999793767929,,,,,, +37,130349,,,,,,,,,,,,0.08158624172210693,,,,,, +37,130399,,,,,,,,,,,,0.07558108121156693,,,,,, +37,130449,,,,,,,,,,,,0.06859954446554184,,,,,, +37,130499,,,,,,,,,,,,0.07405988872051239,,,,,, +37,130549,,,,,,,,,,,,0.06988106667995453,,,,,, +37,130599,,,,,,,,,,,,0.07154995203018188,,,,,, +37,130649,,,,,,,,,,,,0.06042574346065521,,,,,, +37,130699,,,,,,,,,,,,0.062277913093566895,,,,,, +37,130749,,,,,,,,,,,,0.0782352089881897,,,,,, +37,130799,,,,,,,,,,,,0.08857981860637665,,,,,, +37,130849,,,,,,,,,,,,0.058020733296871185,,,,,, +37,130871,,,,,,,,,,,,,0.24047856032848358,0.08031640201807022,0.22916457056999207,0.02838999032974243,0.19668346643447876,0.08031640201807022 +37,130871,,,,,,,0.23005609214305878,0.073448546230793,0.3409472107887268,0.11614149808883667,0.31586962938308716,,,,,,, +38,130899,,,,,,,,,,,,0.06861747801303864,,,,,, +38,130949,,,,,,,,,,,,0.06945888698101044,,,,,, +38,130999,,,,,,,,,,,,0.05631113052368164,,,,,, +38,131049,,,,,,,,,,,,0.06778629869222641,,,,,, +38,131099,,,,,,,,,,,,0.07772259414196014,,,,,, +38,131149,,,,,,,,,,,,0.0732056125998497,,,,,, +38,131199,,,,,,,,,,,,0.07008260488510132,,,,,, +38,131249,,,,,,,,,,,,0.06352739781141281,,,,,, +38,131299,,,,,,,,,,,,0.07576148957014084,,,,,, +38,131349,,,,,,,,,,,,0.0696401596069336,,,,,, +38,131399,,,,,,,,,,,,0.07572051137685776,,,,,, +38,131449,,,,,,,,,,,,0.06518934667110443,,,,,, +38,131499,,,,,,,,,,,,0.0675722062587738,,,,,, +38,131549,,,,,,,,,,,,0.07073269784450531,,,,,, +38,131599,,,,,,,,,,,,0.0707693099975586,,,,,, +38,131649,,,,,,,,,,,,0.07605760544538498,,,,,, +38,131699,,,,,,,,,,,,0.06501173973083496,,,,,, +38,131749,,,,,,,,,,,,0.06987044215202332,,,,,, +38,131799,,,,,,,,,,,,0.0783454179763794,,,,,, +38,131849,,,,,,,,,,,,0.07103182375431061,,,,,, +38,131899,,,,,,,,,,,,0.08453354239463806,,,,,, +38,131949,,,,,,,,,,,,0.07149657607078552,,,,,, +38,131999,,,,,,,,,,,,0.06790342181921005,,,,,, +38,132049,,,,,,,,,,,,0.07554641366004944,,,,,, +38,132099,,,,,,,,,,,,0.07137497514486313,,,,,, +38,132149,,,,,,,,,,,,0.08331035822629929,,,,,, +38,132199,,,,,,,,,,,,0.07522515952587128,,,,,, +38,132249,,,,,,,,,,,,0.07024319469928741,,,,,, +38,132299,,,,,,,,,,,,0.07325112074613571,,,,,, +38,132349,,,,,,,,,,,,0.07826237380504608,,,,,, +38,132399,,,,,,,,,,,,0.07325690239667892,,,,,, +38,132449,,,,,,,,,,,,0.0758724957704544,,,,,, +38,132499,,,,,,,,,,,,0.07780352234840393,,,,,, +38,132549,,,,,,,,,,,,0.06097697466611862,,,,,, +38,132599,,,,,,,,,,,,0.07220236957073212,,,,,, +38,132649,,,,,,,,,,,,0.0658305212855339,,,,,, +38,132699,,,,,,,,,,,,0.0789632499217987,,,,,, +38,132749,,,,,,,,,,,,0.06798357516527176,,,,,, +38,132799,,,,,,,,,,,,0.07082600891590118,,,,,, +38,132849,,,,,,,,,,,,0.06889131665229797,,,,,, +38,132899,,,,,,,,,,,,0.07622560113668442,,,,,, +38,132949,,,,,,,,,,,,0.07360135018825531,,,,,, +38,132999,,,,,,,,,,,,0.07169059664011002,,,,,, +38,133049,,,,,,,,,,,,0.07001301646232605,,,,,, +38,133099,,,,,,,,,,,,0.07541915774345398,,,,,, +38,133149,,,,,,,,,,,,0.0864219069480896,,,,,, +38,133199,,,,,,,,,,,,0.06642225384712219,,,,,, +38,133249,,,,,,,,,,,,0.07083116471767426,,,,,, +38,133299,,,,,,,,,,,,0.07774771749973297,,,,,, +38,133349,,,,,,,,,,,,0.0633511170744896,,,,,, +38,133399,,,,,,,,,,,,0.07243761420249939,,,,,, +38,133449,,,,,,,,,,,,0.07267029583454132,,,,,, +38,133499,,,,,,,,,,,,0.08359122276306152,,,,,, +38,133549,,,,,,,,,,,,0.06601085513830185,,,,,, +38,133599,,,,,,,,,,,,0.07166104018688202,,,,,, +38,133649,,,,,,,,,,,,0.08034727722406387,,,,,, +38,133699,,,,,,,,,,,,0.06026666611433029,,,,,, +38,133749,,,,,,,,,,,,0.07762294262647629,,,,,, +38,133799,,,,,,,,,,,,0.06943260133266449,,,,,, +38,133849,,,,,,,,,,,,0.08525928854942322,,,,,, +38,133899,,,,,,,,,,,,0.0703786164522171,,,,,, +38,133949,,,,,,,,,,,,0.06548848003149033,,,,,, +38,133999,,,,,,,,,,,,0.07474342733621597,,,,,, +38,134049,,,,,,,,,,,,0.07878879457712173,,,,,, +38,134099,,,,,,,,,,,,0.07722638547420502,,,,,, +38,134149,,,,,,,,,,,,0.07539103180170059,,,,,, +38,134199,,,,,,,,,,,,0.08500306308269501,,,,,, +38,134249,,,,,,,,,,,,0.08693204820156097,,,,,, +38,134299,,,,,,,,,,,,0.07123684883117676,,,,,, +38,134315,,,,,,,,,,,,,0.24026267230510712,0.07839685678482056,0.22975243628025055,0.05161130428314209,0.19181905686855316,0.07839685678482056 +38,134315,,,,,,,0.23071205615997314,0.07382279634475708,0.3344085216522217,0.1116483211517334,0.3093493580818176,,,,,,, +39,134349,,,,,,,,,,,,0.06219768524169922,,,,,, +39,134399,,,,,,,,,,,,0.06167571246623993,,,,,, +39,134449,,,,,,,,,,,,0.0681287869811058,,,,,, +39,134499,,,,,,,,,,,,0.0796637311577797,,,,,, +39,134549,,,,,,,,,,,,0.08052335679531097,,,,,, +39,134599,,,,,,,,,,,,0.06645143777132034,,,,,, +39,134649,,,,,,,,,,,,0.07811835408210754,,,,,, +39,134699,,,,,,,,,,,,0.06331758201122284,,,,,, +39,134749,,,,,,,,,,,,0.06839131563901901,,,,,, +39,134799,,,,,,,,,,,,0.06874614208936691,,,,,, +39,134849,,,,,,,,,,,,0.08061742782592773,,,,,, +39,134899,,,,,,,,,,,,0.05624862015247345,,,,,, +39,134949,,,,,,,,,,,,0.07589640468358994,,,,,, +39,134999,,,,,,,,,,,,0.07394125312566757,,,,,, +39,135049,,,,,,,,,,,,0.06621045619249344,,,,,, +39,135099,,,,,,,,,,,,0.07916988432407379,,,,,, +39,135149,,,,,,,,,,,,0.0681668221950531,,,,,, +39,135199,,,,,,,,,,,,0.11384817957878113,,,,,, +39,135249,,,,,,,,,,,,0.08291873335838318,,,,,, +39,135299,,,,,,,,,,,,0.07023437321186066,,,,,, +39,135349,,,,,,,,,,,,0.0660320594906807,,,,,, +39,135399,,,,,,,,,,,,0.06009437143802643,,,,,, +39,135449,,,,,,,,,,,,0.07797688245773315,,,,,, +39,135499,,,,,,,,,,,,0.0684191882610321,,,,,, +39,135549,,,,,,,,,,,,0.07815690338611603,,,,,, +39,135599,,,,,,,,,,,,0.0662788450717926,,,,,, +39,135649,,,,,,,,,,,,0.06303466856479645,,,,,, +39,135699,,,,,,,,,,,,0.08094779402017593,,,,,, +39,135749,,,,,,,,,,,,0.06277976930141449,,,,,, +39,135799,,,,,,,,,,,,0.0874180942773819,,,,,, +39,135849,,,,,,,,,,,,0.06280151009559631,,,,,, +39,135899,,,,,,,,,,,,0.06330817192792892,,,,,, +39,135949,,,,,,,,,,,,0.07798737287521362,,,,,, +39,135999,,,,,,,,,,,,0.07580676674842834,,,,,, +39,136049,,,,,,,,,,,,0.0786895900964737,,,,,, +39,136099,,,,,,,,,,,,0.08997827768325806,,,,,, +39,136149,,,,,,,,,,,,0.07914800941944122,,,,,, +39,136199,,,,,,,,,,,,0.07915997505187988,,,,,, +39,136249,,,,,,,,,,,,0.08297591656446457,,,,,, +39,136299,,,,,,,,,,,,0.06833010911941528,,,,,, +39,136349,,,,,,,,,,,,0.07284072041511536,,,,,, +39,136399,,,,,,,,,,,,0.061488062143325806,,,,,, +39,136449,,,,,,,,,,,,0.06667095422744751,,,,,, +39,136499,,,,,,,,,,,,0.060730285942554474,,,,,, +39,136549,,,,,,,,,,,,0.07424266636371613,,,,,, +39,136599,,,,,,,,,,,,0.06938113272190094,,,,,, +39,136649,,,,,,,,,,,,0.06992799788713455,,,,,, +39,136699,,,,,,,,,,,,0.07393653690814972,,,,,, +39,136749,,,,,,,,,,,,0.07263600826263428,,,,,, +39,136799,,,,,,,,,,,,0.0831729918718338,,,,,, +39,136849,,,,,,,,,,,,0.06526480615139008,,,,,, +39,136899,,,,,,,,,,,,0.06329730153083801,,,,,, +39,136949,,,,,,,,,,,,0.06971624493598938,,,,,, +39,136999,,,,,,,,,,,,0.06945362687110901,,,,,, +39,137049,,,,,,,,,,,,0.07338236272335052,,,,,, +39,137099,,,,,,,,,,,,0.07235747575759888,,,,,, +39,137149,,,,,,,,,,,,0.07505692541599274,,,,,, +39,137199,,,,,,,,,,,,0.08257836103439331,,,,,, +39,137249,,,,,,,,,,,,0.07266755402088165,,,,,, +39,137299,,,,,,,,,,,,0.07450234144926071,,,,,, +39,137349,,,,,,,,,,,,0.06678102910518646,,,,,, +39,137399,,,,,,,,,,,,0.08722232282161713,,,,,, +39,137449,,,,,,,,,,,,0.06785805523395538,,,,,, +39,137499,,,,,,,,,,,,0.07042840123176575,,,,,, +39,137549,,,,,,,,,,,,0.07135911285877228,,,,,, +39,137599,,,,,,,,,,,,0.07625788450241089,,,,,, +39,137649,,,,,,,,,,,,0.06921103596687317,,,,,, +39,137699,,,,,,,,,,,,0.06341466307640076,,,,,, +39,137749,,,,,,,,,,,,0.07577422261238098,,,,,, +39,137759,,,,,,,,,,,,,0.23978963494300842,0.0789417028427124,0.23447251319885254,0.045020103454589844,0.20176613330841064,0.0789417028427124 +39,137759,,,,,,,0.23048542439937592,0.07373035699129105,0.3361164927482605,0.11274886131286621,0.31175029277801514,,,,,,, +40,137799,,,,,,,,,,,,0.06775262206792831,,,,,, +40,137849,,,,,,,,,,,,0.07265349477529526,,,,,, +40,137899,,,,,,,,,,,,0.07771703600883484,,,,,, +40,137949,,,,,,,,,,,,0.074272520840168,,,,,, +40,137999,,,,,,,,,,,,0.07810395956039429,,,,,, +40,138049,,,,,,,,,,,,0.06650997698307037,,,,,, +40,138099,,,,,,,,,,,,0.09170378744602203,,,,,, +40,138149,,,,,,,,,,,,0.07285992801189423,,,,,, +40,138199,,,,,,,,,,,,0.06942270696163177,,,,,, +40,138249,,,,,,,,,,,,0.07551819086074829,,,,,, +40,138299,,,,,,,,,,,,0.06868154555559158,,,,,, +40,138349,,,,,,,,,,,,0.08110612630844116,,,,,, +40,138399,,,,,,,,,,,,0.06870810687541962,,,,,, +40,138449,,,,,,,,,,,,0.06455972790718079,,,,,, +40,138499,,,,,,,,,,,,0.07607410848140717,,,,,, +40,138549,,,,,,,,,,,,0.07224230468273163,,,,,, +40,138599,,,,,,,,,,,,0.07611100375652313,,,,,, +40,138649,,,,,,,,,,,,0.07263185828924179,,,,,, +40,138699,,,,,,,,,,,,0.07951842248439789,,,,,, +40,138749,,,,,,,,,,,,0.07480525970458984,,,,,, +40,138799,,,,,,,,,,,,0.07411214709281921,,,,,, +40,138849,,,,,,,,,,,,0.061967283487319946,,,,,, +40,138899,,,,,,,,,,,,0.06836997717618942,,,,,, +40,138949,,,,,,,,,,,,0.06209467351436615,,,,,, +40,138999,,,,,,,,,,,,0.06193624064326286,,,,,, +40,139049,,,,,,,,,,,,0.07949163019657135,,,,,, +40,139099,,,,,,,,,,,,0.07504333555698395,,,,,, +40,139149,,,,,,,,,,,,0.06591483950614929,,,,,, +40,139199,,,,,,,,,,,,0.07158245146274567,,,,,, +40,139249,,,,,,,,,,,,0.07496286183595657,,,,,, +40,139299,,,,,,,,,,,,0.06647587567567825,,,,,, +40,139349,,,,,,,,,,,,0.0685509443283081,,,,,, +40,139399,,,,,,,,,,,,0.06038646399974823,,,,,, +40,139449,,,,,,,,,,,,0.07660574465990067,,,,,, +40,139499,,,,,,,,,,,,0.0717822015285492,,,,,, +40,139549,,,,,,,,,,,,0.07415992021560669,,,,,, +40,139599,,,,,,,,,,,,0.07783061265945435,,,,,, +40,139649,,,,,,,,,,,,0.08951333165168762,,,,,, +40,139699,,,,,,,,,,,,0.07769060134887695,,,,,, +40,139749,,,,,,,,,,,,0.07556335628032684,,,,,, +40,139799,,,,,,,,,,,,0.07526004314422607,,,,,, +40,139849,,,,,,,,,,,,0.06693919003009796,,,,,, +40,139899,,,,,,,,,,,,0.06815160810947418,,,,,, +40,139949,,,,,,,,,,,,0.08454536646604538,,,,,, +40,139999,,,,,,,,,,,,0.06695372611284256,,,,,, +40,140049,,,,,,,,,,,,0.07287872582674026,,,,,, +40,140099,,,,,,,,,,,,0.0663490742444992,,,,,, +40,140149,,,,,,,,,,,,0.06156972050666809,,,,,, +40,140199,,,,,,,,,,,,0.07497939467430115,,,,,, +40,140249,,,,,,,,,,,,0.0727805495262146,,,,,, +40,140299,,,,,,,,,,,,0.07037541270256042,,,,,, +40,140349,,,,,,,,,,,,0.0718577578663826,,,,,, +40,140399,,,,,,,,,,,,0.07511718571186066,,,,,, +40,140449,,,,,,,,,,,,0.08549041301012039,,,,,, +40,140499,,,,,,,,,,,,0.06652259826660156,,,,,, +40,140549,,,,,,,,,,,,0.07138803601264954,,,,,, +40,140599,,,,,,,,,,,,0.06742285937070847,,,,,, +40,140649,,,,,,,,,,,,0.06993799656629562,,,,,, +40,140699,,,,,,,,,,,,0.08282694220542908,,,,,, +40,140749,,,,,,,,,,,,0.0606888085603714,,,,,, +40,140799,,,,,,,,,,,,0.0691506415605545,,,,,, +40,140849,,,,,,,,,,,,0.07077252864837646,,,,,, +40,140899,,,,,,,,,,,,0.08002716302871704,,,,,, +40,140949,,,,,,,,,,,,0.06709065288305283,,,,,, +40,140999,,,,,,,,,,,,0.06739107519388199,,,,,, +40,141049,,,,,,,,,,,,0.0795779824256897,,,,,, +40,141099,,,,,,,,,,,,0.08330507576465607,,,,,, +40,141149,,,,,,,,,,,,0.07524514198303223,,,,,, +40,141199,,,,,,,,,,,,0.06745623052120209,,,,,, +40,141203,,,,,,,,,,,,,0.2416696846485138,0.07935259491205215,0.22196738421916962,0.04004949331283569,0.19325141608715057,0.07935259491205215 +40,141203,,,,,,,0.23002853989601135,0.0734783262014389,0.3404679000377655,0.1157921552658081,0.3156178593635559,,,,,,, +41,141249,,,,,,,,,,,,0.0843093991279602,,,,,, +41,141299,,,,,,,,,,,,0.08106494694948196,,,,,, +41,141349,,,,,,,,,,,,0.0711403414607048,,,,,, +41,141399,,,,,,,,,,,,0.08115307986736298,,,,,, +41,141449,,,,,,,,,,,,0.07352709025144577,,,,,, +41,141499,,,,,,,,,,,,0.06620388478040695,,,,,, +41,141549,,,,,,,,,,,,0.07802195847034454,,,,,, +41,141599,,,,,,,,,,,,0.08687576651573181,,,,,, +41,141649,,,,,,,,,,,,0.08383759111166,,,,,, +41,141699,,,,,,,,,,,,0.0705394297838211,,,,,, +41,141749,,,,,,,,,,,,0.06144264340400696,,,,,, +41,141799,,,,,,,,,,,,0.0702272355556488,,,,,, +41,141849,,,,,,,,,,,,0.07499700039625168,,,,,, +41,141899,,,,,,,,,,,,0.06632346659898758,,,,,, +41,141949,,,,,,,,,,,,0.056813795119524,,,,,, +41,141999,,,,,,,,,,,,0.0687527060508728,,,,,, +41,142049,,,,,,,,,,,,0.08511532843112946,,,,,, +41,142099,,,,,,,,,,,,0.0790950208902359,,,,,, +41,142149,,,,,,,,,,,,0.05802251398563385,,,,,, +41,142199,,,,,,,,,,,,0.07032183557748795,,,,,, +41,142249,,,,,,,,,,,,0.08251526206731796,,,,,, +41,142299,,,,,,,,,,,,0.07788224518299103,,,,,, +41,142349,,,,,,,,,,,,0.07350301742553711,,,,,, +41,142399,,,,,,,,,,,,0.07610940933227539,,,,,, +41,142449,,,,,,,,,,,,0.07870382070541382,,,,,, +41,142499,,,,,,,,,,,,0.06464574486017227,,,,,, +41,142549,,,,,,,,,,,,0.06426481902599335,,,,,, +41,142599,,,,,,,,,,,,0.07199545204639435,,,,,, +41,142649,,,,,,,,,,,,0.06555622071027756,,,,,, +41,142699,,,,,,,,,,,,0.08324873447418213,,,,,, +41,142749,,,,,,,,,,,,0.07441535592079163,,,,,, +41,142799,,,,,,,,,,,,0.06378380954265594,,,,,, +41,142849,,,,,,,,,,,,0.08387874811887741,,,,,, +41,142899,,,,,,,,,,,,0.07244539260864258,,,,,, +41,142949,,,,,,,,,,,,0.08658915758132935,,,,,, +41,142999,,,,,,,,,,,,0.08132809400558472,,,,,, +41,143049,,,,,,,,,,,,0.07538959383964539,,,,,, +41,143099,,,,,,,,,,,,0.08413948118686676,,,,,, +41,143149,,,,,,,,,,,,0.07475531101226807,,,,,, +41,143199,,,,,,,,,,,,0.07753686606884003,,,,,, +41,143249,,,,,,,,,,,,0.06623280048370361,,,,,, +41,143299,,,,,,,,,,,,0.0854954719543457,,,,,, +41,143349,,,,,,,,,,,,0.0703936368227005,,,,,, +41,143399,,,,,,,,,,,,0.07792097330093384,,,,,, +41,143449,,,,,,,,,,,,0.06631819903850555,,,,,, +41,143499,,,,,,,,,,,,0.08138744533061981,,,,,, +41,143549,,,,,,,,,,,,0.07524237036705017,,,,,, +41,143599,,,,,,,,,,,,0.0641070082783699,,,,,, +41,143649,,,,,,,,,,,,0.06172170117497444,,,,,, +41,143699,,,,,,,,,,,,0.06675880402326584,,,,,, +41,143749,,,,,,,,,,,,0.07191064953804016,,,,,, +41,143799,,,,,,,,,,,,0.07919155061244965,,,,,, +41,143849,,,,,,,,,,,,0.07504042983055115,,,,,, +41,143899,,,,,,,,,,,,0.07660266757011414,,,,,, +41,143949,,,,,,,,,,,,0.06998171657323837,,,,,, +41,143999,,,,,,,,,,,,0.06715507060289383,,,,,, +41,144049,,,,,,,,,,,,0.07087993621826172,,,,,, +41,144099,,,,,,,,,,,,0.07950173318386078,,,,,, +41,144149,,,,,,,,,,,,0.07407231628894806,,,,,, +41,144199,,,,,,,,,,,,0.070322185754776,,,,,, +41,144249,,,,,,,,,,,,0.07863973081111908,,,,,, +41,144299,,,,,,,,,,,,0.07741139084100723,,,,,, +41,144349,,,,,,,,,,,,0.08258959650993347,,,,,, +41,144399,,,,,,,,,,,,0.08849360793828964,,,,,, +41,144449,,,,,,,,,,,,0.07450257986783981,,,,,, +41,144499,,,,,,,,,,,,0.08735044300556183,,,,,, +41,144549,,,,,,,,,,,,0.07511797547340393,,,,,, +41,144599,,,,,,,,,,,,0.06758464872837067,,,,,, +41,144647,,,,,,,,,,,,,0.24054916203022003,0.07850965112447739,0.2286173701286316,0.05024677515029907,0.19733379781246185,0.07850965112447739 +41,144647,,,,,,,0.2295878827571869,0.07321857661008835,0.34500405192375183,0.11891257762908936,0.32164236903190613,,,,,,, +42,144649,,,,,,,,,,,,0.08053223788738251,,,,,, +42,144699,,,,,,,,,,,,0.06464073807001114,,,,,, +42,144749,,,,,,,,,,,,0.07676723599433899,,,,,, +42,144799,,,,,,,,,,,,0.07357426732778549,,,,,, +42,144849,,,,,,,,,,,,0.0718614012002945,,,,,, +42,144899,,,,,,,,,,,,0.08663658797740936,,,,,, +42,144949,,,,,,,,,,,,0.06748495995998383,,,,,, +42,144999,,,,,,,,,,,,0.06251909583806992,,,,,, +42,145049,,,,,,,,,,,,0.07257603108882904,,,,,, +42,145099,,,,,,,,,,,,0.0738920047879219,,,,,, +42,145149,,,,,,,,,,,,0.07240234315395355,,,,,, +42,145199,,,,,,,,,,,,0.07422293722629547,,,,,, +42,145249,,,,,,,,,,,,0.0715188980102539,,,,,, +42,145299,,,,,,,,,,,,0.08082062005996704,,,,,, +42,145349,,,,,,,,,,,,0.07910069823265076,,,,,, +42,145399,,,,,,,,,,,,0.06958453357219696,,,,,, +42,145449,,,,,,,,,,,,0.07474437355995178,,,,,, +42,145499,,,,,,,,,,,,0.06278237700462341,,,,,, +42,145549,,,,,,,,,,,,0.08146616816520691,,,,,, +42,145599,,,,,,,,,,,,0.06804788112640381,,,,,, +42,145649,,,,,,,,,,,,0.0578954741358757,,,,,, +42,145699,,,,,,,,,,,,0.06197744607925415,,,,,, +42,145749,,,,,,,,,,,,0.0683741420507431,,,,,, +42,145799,,,,,,,,,,,,0.05791649594902992,,,,,, +42,145849,,,,,,,,,,,,0.08209267258644104,,,,,, +42,145899,,,,,,,,,,,,0.0781857818365097,,,,,, +42,145949,,,,,,,,,,,,0.07856549322605133,,,,,, +42,145999,,,,,,,,,,,,0.08494296669960022,,,,,, +42,146049,,,,,,,,,,,,0.07406412065029144,,,,,, +42,146099,,,,,,,,,,,,0.07952635735273361,,,,,, +42,146149,,,,,,,,,,,,0.07157789170742035,,,,,, +42,146199,,,,,,,,,,,,0.061853352934122086,,,,,, +42,146249,,,,,,,,,,,,0.07541155815124512,,,,,, +42,146299,,,,,,,,,,,,0.07600825279951096,,,,,, +42,146349,,,,,,,,,,,,0.06427465379238129,,,,,, +42,146399,,,,,,,,,,,,0.07120116800069809,,,,,, +42,146449,,,,,,,,,,,,0.07762839645147324,,,,,, +42,146499,,,,,,,,,,,,0.06916394829750061,,,,,, +42,146549,,,,,,,,,,,,0.06367142498493195,,,,,, +42,146599,,,,,,,,,,,,0.07766883075237274,,,,,, +42,146649,,,,,,,,,,,,0.06227381154894829,,,,,, +42,146699,,,,,,,,,,,,0.07108543813228607,,,,,, +42,146749,,,,,,,,,,,,0.06968866288661957,,,,,, +42,146799,,,,,,,,,,,,0.07538016140460968,,,,,, +42,146849,,,,,,,,,,,,0.0699203759431839,,,,,, +42,146899,,,,,,,,,,,,0.07405799627304077,,,,,, +42,146949,,,,,,,,,,,,0.06989920139312744,,,,,, +42,146999,,,,,,,,,,,,0.06666919589042664,,,,,, +42,147049,,,,,,,,,,,,0.07136958837509155,,,,,, +42,147099,,,,,,,,,,,,0.07843729108572006,,,,,, +42,147149,,,,,,,,,,,,0.0886753648519516,,,,,, +42,147199,,,,,,,,,,,,0.07729296386241913,,,,,, +42,147249,,,,,,,,,,,,0.07278401404619217,,,,,, +42,147299,,,,,,,,,,,,0.06891992688179016,,,,,, +42,147349,,,,,,,,,,,,0.08214130997657776,,,,,, +42,147399,,,,,,,,,,,,0.07013958692550659,,,,,, +42,147449,,,,,,,,,,,,0.06938868761062622,,,,,, +42,147499,,,,,,,,,,,,0.0632837787270546,,,,,, +42,147549,,,,,,,,,,,,0.06643196940422058,,,,,, +42,147599,,,,,,,,,,,,0.07239994406700134,,,,,, +42,147649,,,,,,,,,,,,0.08072353154420853,,,,,, +42,147699,,,,,,,,,,,,0.07345367968082428,,,,,, +42,147749,,,,,,,,,,,,0.07426281273365021,,,,,, +42,147799,,,,,,,,,,,,0.06937500834465027,,,,,, +42,147849,,,,,,,,,,,,0.07283413410186768,,,,,, +42,147899,,,,,,,,,,,,0.06788109242916107,,,,,, +42,147949,,,,,,,,,,,,0.0750751942396164,,,,,, +42,147999,,,,,,,,,,,,0.07223954051733017,,,,,, +42,148049,,,,,,,,,,,,0.07100915163755417,,,,,, +42,148091,,,,,,,,,,,,,0.23979288339614868,0.07818502932786942,0.2349255532026291,0.05417376756668091,0.203323632478714,0.07818502932786942 +42,148091,,,,,,,0.22798855602741241,0.07241392880678177,0.35867244005203247,0.12859302759170532,0.33449140191078186,,,,,,, +43,148099,,,,,,,,,,,,0.07605543732643127,,,,,, +43,148149,,,,,,,,,,,,0.06626972556114197,,,,,, +43,148199,,,,,,,,,,,,0.06925082951784134,,,,,, +43,148249,,,,,,,,,,,,0.06141594052314758,,,,,, +43,148299,,,,,,,,,,,,0.07989133894443512,,,,,, +43,148349,,,,,,,,,,,,0.06615250557661057,,,,,, +43,148399,,,,,,,,,,,,0.08180491626262665,,,,,, +43,148449,,,,,,,,,,,,0.08002083003520966,,,,,, +43,148499,,,,,,,,,,,,0.08500498533248901,,,,,, +43,148549,,,,,,,,,,,,0.0600314736366272,,,,,, +43,148599,,,,,,,,,,,,0.06768056750297546,,,,,, +43,148649,,,,,,,,,,,,0.07794825732707977,,,,,, +43,148699,,,,,,,,,,,,0.06627660989761353,,,,,, +43,148749,,,,,,,,,,,,0.07748803496360779,,,,,, +43,148799,,,,,,,,,,,,0.08237562328577042,,,,,, +43,148849,,,,,,,,,,,,0.07381847500801086,,,,,, +43,148899,,,,,,,,,,,,0.06287908554077148,,,,,, +43,148949,,,,,,,,,,,,0.0781446024775505,,,,,, +43,148999,,,,,,,,,,,,0.07504624128341675,,,,,, +43,149049,,,,,,,,,,,,0.05957518517971039,,,,,, +43,149099,,,,,,,,,,,,0.0756101906299591,,,,,, +43,149149,,,,,,,,,,,,0.07401653379201889,,,,,, +43,149199,,,,,,,,,,,,0.06515352427959442,,,,,, +43,149249,,,,,,,,,,,,0.06600344181060791,,,,,, +43,149299,,,,,,,,,,,,0.06382457911968231,,,,,, +43,149349,,,,,,,,,,,,0.08571792393922806,,,,,, +43,149399,,,,,,,,,,,,0.07050898671150208,,,,,, +43,149449,,,,,,,,,,,,0.07292328774929047,,,,,, +43,149499,,,,,,,,,,,,0.07153932750225067,,,,,, +43,149549,,,,,,,,,,,,0.07352384179830551,,,,,, +43,149599,,,,,,,,,,,,0.08046314120292664,,,,,, +43,149649,,,,,,,,,,,,0.06660018861293793,,,,,, +43,149699,,,,,,,,,,,,0.07058799266815186,,,,,, +43,149749,,,,,,,,,,,,0.0640319436788559,,,,,, +43,149799,,,,,,,,,,,,0.0757506936788559,,,,,, +43,149849,,,,,,,,,,,,0.08430235087871552,,,,,, +43,149899,,,,,,,,,,,,0.0742000937461853,,,,,, +43,149949,,,,,,,,,,,,0.07477505505084991,,,,,, +43,149999,,,,,,,,,,,,0.07204839587211609,,,,,, +43,150049,,,,,,,,,,,,0.06403082609176636,,,,,, +43,150099,,,,,,,,,,,,0.0740019902586937,,,,,, +43,150149,,,,,,,,,,,,0.07112050801515579,,,,,, +43,150199,,,,,,,,,,,,0.07484504580497742,,,,,, +43,150249,,,,,,,,,,,,0.06947968900203705,,,,,, +43,150299,,,,,,,,,,,,0.06642833352088928,,,,,, +43,150349,,,,,,,,,,,,0.06804141402244568,,,,,, +43,150399,,,,,,,,,,,,0.07359256595373154,,,,,, +43,150449,,,,,,,,,,,,0.07076777517795563,,,,,, +43,150499,,,,,,,,,,,,0.07602222263813019,,,,,, +43,150549,,,,,,,,,,,,0.06565464287996292,,,,,, +43,150599,,,,,,,,,,,,0.07145193219184875,,,,,, +43,150649,,,,,,,,,,,,0.08510858565568924,,,,,, +43,150699,,,,,,,,,,,,0.06309778988361359,,,,,, +43,150749,,,,,,,,,,,,0.07019607722759247,,,,,, +43,150799,,,,,,,,,,,,0.08646111190319061,,,,,, +43,150849,,,,,,,,,,,,0.06633369624614716,,,,,, +43,150899,,,,,,,,,,,,0.07968065142631531,,,,,, +43,150949,,,,,,,,,,,,0.0771973505616188,,,,,, +43,150999,,,,,,,,,,,,0.06976740807294846,,,,,, +43,151049,,,,,,,,,,,,0.07096140831708908,,,,,, +43,151099,,,,,,,,,,,,0.08343606442213058,,,,,, +43,151149,,,,,,,,,,,,0.06817345321178436,,,,,, +43,151199,,,,,,,,,,,,0.06730380654335022,,,,,, +43,151249,,,,,,,,,,,,0.07143107056617737,,,,,, +43,151299,,,,,,,,,,,,0.07850892841815948,,,,,, +43,151349,,,,,,,,,,,,0.07674413919448853,,,,,, +43,151399,,,,,,,,,,,,0.06378301233053207,,,,,, +43,151449,,,,,,,,,,,,0.07713717222213745,,,,,, +43,151499,,,,,,,,,,,,0.07207608222961426,,,,,, +43,151535,,,,,,,,,,,,,0.23986753821372986,0.07833262532949448,0.23437659442424774,0.05238825082778931,0.2027510553598404,0.07833262532949448 +43,151535,,,,,,,0.2273542284965515,0.07202140241861343,0.3651685416698456,0.13332676887512207,0.3399660289287567,,,,,,, +44,151549,,,,,,,,,,,,0.07901426404714584,,,,,, +44,151599,,,,,,,,,,,,0.0768815129995346,,,,,, +44,151649,,,,,,,,,,,,0.07449759542942047,,,,,, +44,151699,,,,,,,,,,,,0.0644293874502182,,,,,, +44,151749,,,,,,,,,,,,0.0639936625957489,,,,,, +44,151799,,,,,,,,,,,,0.06007685512304306,,,,,, +44,151849,,,,,,,,,,,,0.07273700833320618,,,,,, +44,151899,,,,,,,,,,,,0.0692756325006485,,,,,, +44,151949,,,,,,,,,,,,0.06622117757797241,,,,,, +44,151999,,,,,,,,,,,,0.07274102419614792,,,,,, +44,152049,,,,,,,,,,,,0.07195504009723663,,,,,, +44,152099,,,,,,,,,,,,0.06624627113342285,,,,,, +44,152149,,,,,,,,,,,,0.08926379680633545,,,,,, +44,152199,,,,,,,,,,,,0.07227488607168198,,,,,, +44,152249,,,,,,,,,,,,0.0739622712135315,,,,,, +44,152299,,,,,,,,,,,,0.07378815114498138,,,,,, +44,152349,,,,,,,,,,,,0.07185515761375427,,,,,, +44,152399,,,,,,,,,,,,0.0823013037443161,,,,,, +44,152449,,,,,,,,,,,,0.0640159398317337,,,,,, +44,152499,,,,,,,,,,,,0.06668438017368317,,,,,, +44,152549,,,,,,,,,,,,0.07244544476270676,,,,,, +44,152599,,,,,,,,,,,,0.07966163754463196,,,,,, +44,152649,,,,,,,,,,,,0.07488155364990234,,,,,, +44,152699,,,,,,,,,,,,0.06378455460071564,,,,,, +44,152749,,,,,,,,,,,,0.06470291316509247,,,,,, +44,152799,,,,,,,,,,,,0.0779680460691452,,,,,, +44,152849,,,,,,,,,,,,0.06675704568624496,,,,,, +44,152899,,,,,,,,,,,,0.07523730397224426,,,,,, +44,152949,,,,,,,,,,,,0.07472031563520432,,,,,, +44,152999,,,,,,,,,,,,0.06605623662471771,,,,,, +44,153049,,,,,,,,,,,,0.07950897514820099,,,,,, +44,153099,,,,,,,,,,,,0.07314667105674744,,,,,, +44,153149,,,,,,,,,,,,0.08145315200090408,,,,,, +44,153199,,,,,,,,,,,,0.08096593618392944,,,,,, +44,153249,,,,,,,,,,,,0.07171041518449783,,,,,, +44,153299,,,,,,,,,,,,0.06818652898073196,,,,,, +44,153349,,,,,,,,,,,,0.07038531452417374,,,,,, +44,153399,,,,,,,,,,,,0.08822378516197205,,,,,, +44,153449,,,,,,,,,,,,0.06475010514259338,,,,,, +44,153499,,,,,,,,,,,,0.06186537817120552,,,,,, +44,153549,,,,,,,,,,,,0.07319188863039017,,,,,, +44,153599,,,,,,,,,,,,0.07152114808559418,,,,,, +44,153649,,,,,,,,,,,,0.06791811436414719,,,,,, +44,153699,,,,,,,,,,,,0.07134775817394257,,,,,, +44,153749,,,,,,,,,,,,0.06906168162822723,,,,,, +44,153799,,,,,,,,,,,,0.07275053858757019,,,,,, +44,153849,,,,,,,,,,,,0.07040099799633026,,,,,, +44,153899,,,,,,,,,,,,0.07739251852035522,,,,,, +44,153949,,,,,,,,,,,,0.08702320605516434,,,,,, +44,153999,,,,,,,,,,,,0.060245245695114136,,,,,, +44,154049,,,,,,,,,,,,0.07428669184446335,,,,,, +44,154099,,,,,,,,,,,,0.08821271359920502,,,,,, +44,154149,,,,,,,,,,,,0.0802503451704979,,,,,, +44,154199,,,,,,,,,,,,0.07238730788230896,,,,,, +44,154249,,,,,,,,,,,,0.06893360614776611,,,,,, +44,154299,,,,,,,,,,,,0.06111043691635132,,,,,, +44,154349,,,,,,,,,,,,0.07991141080856323,,,,,, +44,154399,,,,,,,,,,,,0.07407887279987335,,,,,, +44,154449,,,,,,,,,,,,0.06943309307098389,,,,,, +44,154499,,,,,,,,,,,,0.06355855613946915,,,,,, +44,154549,,,,,,,,,,,,0.07356421649456024,,,,,, +44,154599,,,,,,,,,,,,0.07505390793085098,,,,,, +44,154649,,,,,,,,,,,,0.07982468605041504,,,,,, +44,154699,,,,,,,,,,,,0.08106379210948944,,,,,, +44,154749,,,,,,,,,,,,0.07377932965755463,,,,,, +44,154799,,,,,,,,,,,,0.07572846114635468,,,,,, +44,154849,,,,,,,,,,,,0.07028278708457947,,,,,, +44,154899,,,,,,,,,,,,0.06845319271087646,,,,,, +44,154949,,,,,,,,,,,,0.08248810470104218,,,,,, +44,154979,,,,,,,,,,,,,0.24084141850471497,0.08082281798124313,0.22559861838817596,0.022263765335083008,0.19154395163059235,0.08082281798124313 +44,154979,,,,,,,0.22722117602825165,0.07223644107580185,0.3618241548538208,0.13072466850280762,0.3403274416923523,,,,,,, +45,154999,,,,,,,,,,,,0.0650705099105835,,,,,, +45,155049,,,,,,,,,,,,0.07546240836381912,,,,,, +45,155099,,,,,,,,,,,,0.0738716572523117,,,,,, +45,155149,,,,,,,,,,,,0.0681474581360817,,,,,, +45,155199,,,,,,,,,,,,0.07677611708641052,,,,,, +45,155249,,,,,,,,,,,,0.07087360322475433,,,,,, +45,155299,,,,,,,,,,,,0.07322121411561966,,,,,, +45,155349,,,,,,,,,,,,0.08386486023664474,,,,,, +45,155399,,,,,,,,,,,,0.08552753180265427,,,,,, +45,155449,,,,,,,,,,,,0.07945851981639862,,,,,, +45,155499,,,,,,,,,,,,0.06770770996809006,,,,,, +45,155549,,,,,,,,,,,,0.07388269901275635,,,,,, +45,155599,,,,,,,,,,,,0.08205782622098923,,,,,, +45,155649,,,,,,,,,,,,0.06437335908412933,,,,,, +45,155699,,,,,,,,,,,,0.06996597349643707,,,,,, +45,155749,,,,,,,,,,,,0.06636127084493637,,,,,, +45,155799,,,,,,,,,,,,0.0722242072224617,,,,,, +45,155849,,,,,,,,,,,,0.07641533017158508,,,,,, +45,155899,,,,,,,,,,,,0.0673956573009491,,,,,, +45,155949,,,,,,,,,,,,0.07540050894021988,,,,,, +45,155999,,,,,,,,,,,,0.0648932158946991,,,,,, +45,156049,,,,,,,,,,,,0.07429834455251694,,,,,, +45,156099,,,,,,,,,,,,0.06344703584909439,,,,,, +45,156149,,,,,,,,,,,,0.07093693315982819,,,,,, +45,156199,,,,,,,,,,,,0.07632683217525482,,,,,, +45,156249,,,,,,,,,,,,0.0616585798561573,,,,,, +45,156299,,,,,,,,,,,,0.07111841440200806,,,,,, +45,156349,,,,,,,,,,,,0.06533878296613693,,,,,, +45,156399,,,,,,,,,,,,0.06419801712036133,,,,,, +45,156449,,,,,,,,,,,,0.08371306955814362,,,,,, +45,156499,,,,,,,,,,,,0.06633215397596359,,,,,, +45,156549,,,,,,,,,,,,0.06704089045524597,,,,,, +45,156599,,,,,,,,,,,,0.07081404328346252,,,,,, +45,156649,,,,,,,,,,,,0.0819021463394165,,,,,, +45,156699,,,,,,,,,,,,0.0809859186410904,,,,,, +45,156749,,,,,,,,,,,,0.07502233982086182,,,,,, +45,156799,,,,,,,,,,,,0.08130262792110443,,,,,, +45,156849,,,,,,,,,,,,0.07324208319187164,,,,,, +45,156899,,,,,,,,,,,,0.05514270067214966,,,,,, +45,156949,,,,,,,,,,,,0.07034805417060852,,,,,, +45,156999,,,,,,,,,,,,0.06524734199047089,,,,,, +45,157049,,,,,,,,,,,,0.08272126317024231,,,,,, +45,157099,,,,,,,,,,,,0.0693146139383316,,,,,, +45,157149,,,,,,,,,,,,0.06517528742551804,,,,,, +45,157199,,,,,,,,,,,,0.06388288736343384,,,,,, +45,157249,,,,,,,,,,,,0.06076473742723465,,,,,, +45,157299,,,,,,,,,,,,0.06547100841999054,,,,,, +45,157349,,,,,,,,,,,,0.06696227192878723,,,,,, +45,157399,,,,,,,,,,,,0.08810204267501831,,,,,, +45,157449,,,,,,,,,,,,0.07675738632678986,,,,,, +45,157499,,,,,,,,,,,,0.07584968209266663,,,,,, +45,157549,,,,,,,,,,,,0.08871789276599884,,,,,, +45,157599,,,,,,,,,,,,0.07723740488290787,,,,,, +45,157649,,,,,,,,,,,,0.06497354060411453,,,,,, +45,157699,,,,,,,,,,,,0.07184188067913055,,,,,, +45,157749,,,,,,,,,,,,0.059973884373903275,,,,,, +45,157799,,,,,,,,,,,,0.07375329732894897,,,,,, +45,157849,,,,,,,,,,,,0.06788983941078186,,,,,, +45,157899,,,,,,,,,,,,0.06842809915542603,,,,,, +45,157949,,,,,,,,,,,,0.07421645522117615,,,,,, +45,157999,,,,,,,,,,,,0.07188808917999268,,,,,, +45,158049,,,,,,,,,,,,0.07549543678760529,,,,,, +45,158099,,,,,,,,,,,,0.06418464332818985,,,,,, +45,158149,,,,,,,,,,,,0.08286923915147781,,,,,, +45,158199,,,,,,,,,,,,0.06817165017127991,,,,,, +45,158249,,,,,,,,,,,,0.06356725841760635,,,,,, +45,158299,,,,,,,,,,,,0.06673243641853333,,,,,, +45,158349,,,,,,,,,,,,0.07511048018932343,,,,,, +45,158399,,,,,,,,,,,,0.07848916947841644,,,,,, +45,158423,,,,,,,,,,,,,0.23968972265720367,0.07825004309415817,0.2356521040201187,0.053387343883514404,0.2052011340856552,0.07825004309415817 +45,158423,,,,,,,0.2274221032857895,0.0720776617527008,0.36424145102500916,0.1326504945755005,0.33859357237815857,,,,,,, +46,158449,,,,,,,,,,,,0.06460484117269516,,,,,, +46,158499,,,,,,,,,,,,0.07524377107620239,,,,,, +46,158549,,,,,,,,,,,,0.07217885553836823,,,,,, +46,158599,,,,,,,,,,,,0.06378643214702606,,,,,, +46,158649,,,,,,,,,,,,0.06681709736585617,,,,,, +46,158699,,,,,,,,,,,,0.07872045040130615,,,,,, +46,158749,,,,,,,,,,,,0.07030998170375824,,,,,, +46,158799,,,,,,,,,,,,0.07184382528066635,,,,,, +46,158849,,,,,,,,,,,,0.06577377021312714,,,,,, +46,158899,,,,,,,,,,,,0.07210396230220795,,,,,, +46,158949,,,,,,,,,,,,0.07109372317790985,,,,,, +46,158999,,,,,,,,,,,,0.07473453879356384,,,,,, +46,159049,,,,,,,,,,,,0.07304955273866653,,,,,, +46,159099,,,,,,,,,,,,0.08258876949548721,,,,,, +46,159149,,,,,,,,,,,,0.08014614880084991,,,,,, +46,159199,,,,,,,,,,,,0.0812489241361618,,,,,, +46,159249,,,,,,,,,,,,0.06409326195716858,,,,,, +46,159299,,,,,,,,,,,,0.07105474174022675,,,,,, +46,159349,,,,,,,,,,,,0.06811127066612244,,,,,, +46,159399,,,,,,,,,,,,0.07174102216959,,,,,, +46,159449,,,,,,,,,,,,0.0626048892736435,,,,,, +46,159499,,,,,,,,,,,,0.07417906820774078,,,,,, +46,159549,,,,,,,,,,,,0.06938328593969345,,,,,, +46,159599,,,,,,,,,,,,0.06533783674240112,,,,,, +46,159649,,,,,,,,,,,,0.07914439588785172,,,,,, +46,159699,,,,,,,,,,,,0.06885550171136856,,,,,, +46,159749,,,,,,,,,,,,0.072238489985466,,,,,, +46,159799,,,,,,,,,,,,0.07751752436161041,,,,,, +46,159849,,,,,,,,,,,,0.06783074140548706,,,,,, +46,159899,,,,,,,,,,,,0.059657372534275055,,,,,, +46,159949,,,,,,,,,,,,0.07258826494216919,,,,,, +46,159999,,,,,,,,,,,,0.07093910127878189,,,,,, +46,160049,,,,,,,,,,,,0.07508678734302521,,,,,, +46,160099,,,,,,,,,,,,0.07238370925188065,,,,,, +46,160149,,,,,,,,,,,,0.07069429755210876,,,,,, +46,160199,,,,,,,,,,,,0.06217750906944275,,,,,, +46,160249,,,,,,,,,,,,0.06501661241054535,,,,,, +46,160299,,,,,,,,,,,,0.07931669056415558,,,,,, +46,160349,,,,,,,,,,,,0.08540819585323334,,,,,, +46,160399,,,,,,,,,,,,0.060345202684402466,,,,,, +46,160449,,,,,,,,,,,,0.06734706461429596,,,,,, +46,160499,,,,,,,,,,,,0.0768602043390274,,,,,, +46,160549,,,,,,,,,,,,0.07458893954753876,,,,,, +46,160599,,,,,,,,,,,,0.07235248386859894,,,,,, +46,160649,,,,,,,,,,,,0.07340304553508759,,,,,, +46,160699,,,,,,,,,,,,0.07808074355125427,,,,,, +46,160749,,,,,,,,,,,,0.0749426782131195,,,,,, +46,160799,,,,,,,,,,,,0.0813794881105423,,,,,, +46,160849,,,,,,,,,,,,0.06595958769321442,,,,,, +46,160899,,,,,,,,,,,,0.06785114109516144,,,,,, +46,160949,,,,,,,,,,,,0.07767008244991302,,,,,, +46,160999,,,,,,,,,,,,0.07487359642982483,,,,,, +46,161049,,,,,,,,,,,,0.06619240343570709,,,,,, +46,161099,,,,,,,,,,,,0.0696469321846962,,,,,, +46,161149,,,,,,,,,,,,0.08142874389886856,,,,,, +46,161199,,,,,,,,,,,,0.07337333261966705,,,,,, +46,161249,,,,,,,,,,,,0.06774358451366425,,,,,, +46,161299,,,,,,,,,,,,0.07354165613651276,,,,,, +46,161349,,,,,,,,,,,,0.06792689859867096,,,,,, +46,161399,,,,,,,,,,,,0.07851604372262955,,,,,, +46,161449,,,,,,,,,,,,0.06747647374868393,,,,,, +46,161499,,,,,,,,,,,,0.06454797089099884,,,,,, +46,161549,,,,,,,,,,,,0.07119951397180557,,,,,, +46,161599,,,,,,,,,,,,0.07658876478672028,,,,,, +46,161649,,,,,,,,,,,,0.06434846669435501,,,,,, +46,161699,,,,,,,,,,,,0.06764857470989227,,,,,, +46,161749,,,,,,,,,,,,0.08564137667417526,,,,,, +46,161799,,,,,,,,,,,,0.08054198324680328,,,,,, +46,161849,,,,,,,,,,,,0.07687529176473618,,,,,, +46,161867,,,,,,,,,,,,,0.24044618010520935,0.07847272604703903,0.22790199518203735,0.05069345235824585,0.19250164926052094,0.07847272604703903 +46,161867,,,,,,,0.22691255807876587,0.07183723151683807,0.36819490790367126,0.13553816080093384,0.34413209557533264,,,,,,, +47,161899,,,,,,,,,,,,0.07095567882061005,,,,,, +47,161949,,,,,,,,,,,,0.0702548623085022,,,,,, +47,161999,,,,,,,,,,,,0.07910283654928207,,,,,, +47,162049,,,,,,,,,,,,0.0730435773730278,,,,,, +47,162099,,,,,,,,,,,,0.06531260907649994,,,,,, +47,162149,,,,,,,,,,,,0.07005467265844345,,,,,, +47,162199,,,,,,,,,,,,0.07690446078777313,,,,,, +47,162249,,,,,,,,,,,,0.07461830228567123,,,,,, +47,162299,,,,,,,,,,,,0.07866351306438446,,,,,, +47,162349,,,,,,,,,,,,0.06480049341917038,,,,,, +47,162399,,,,,,,,,,,,0.0661613866686821,,,,,, +47,162449,,,,,,,,,,,,0.06623978912830353,,,,,, +47,162499,,,,,,,,,,,,0.07644760608673096,,,,,, +47,162549,,,,,,,,,,,,0.07716763764619827,,,,,, +47,162599,,,,,,,,,,,,0.06647516787052155,,,,,, +47,162649,,,,,,,,,,,,0.06230241432785988,,,,,, +47,162699,,,,,,,,,,,,0.07178632915019989,,,,,, +47,162749,,,,,,,,,,,,0.07357441633939743,,,,,, +47,162799,,,,,,,,,,,,0.07319377362728119,,,,,, +47,162849,,,,,,,,,,,,0.07502655684947968,,,,,, +47,162899,,,,,,,,,,,,0.08584840595722198,,,,,, +47,162949,,,,,,,,,,,,0.08175837993621826,,,,,, +47,162999,,,,,,,,,,,,0.07515564560890198,,,,,, +47,163049,,,,,,,,,,,,0.06983201950788498,,,,,, +47,163099,,,,,,,,,,,,0.06084927171468735,,,,,, +47,163149,,,,,,,,,,,,0.07217425107955933,,,,,, +47,163199,,,,,,,,,,,,0.07067009061574936,,,,,, +47,163249,,,,,,,,,,,,0.06687475740909576,,,,,, +47,163299,,,,,,,,,,,,0.08789326995611191,,,,,, +47,163349,,,,,,,,,,,,0.08077264577150345,,,,,, +47,163399,,,,,,,,,,,,0.07658353447914124,,,,,, +47,163449,,,,,,,,,,,,0.059458065778017044,,,,,, +47,163499,,,,,,,,,,,,0.07162433117628098,,,,,, +47,163549,,,,,,,,,,,,0.06316354870796204,,,,,, +47,163599,,,,,,,,,,,,0.08487668633460999,,,,,, +47,163649,,,,,,,,,,,,0.06815589219331741,,,,,, +47,163699,,,,,,,,,,,,0.07089120894670486,,,,,, +47,163749,,,,,,,,,,,,0.057575080543756485,,,,,, +47,163799,,,,,,,,,,,,0.0670095905661583,,,,,, +47,163849,,,,,,,,,,,,0.06486177444458008,,,,,, +47,163899,,,,,,,,,,,,0.06945562362670898,,,,,, +47,163949,,,,,,,,,,,,0.0665353462100029,,,,,, +47,163999,,,,,,,,,,,,0.07547551393508911,,,,,, +47,164049,,,,,,,,,,,,0.06990160048007965,,,,,, +47,164099,,,,,,,,,,,,0.07083876430988312,,,,,, +47,164149,,,,,,,,,,,,0.0807759016752243,,,,,, +47,164199,,,,,,,,,,,,0.06973166763782501,,,,,, +47,164249,,,,,,,,,,,,0.07783406227827072,,,,,, +47,164299,,,,,,,,,,,,0.06579750776290894,,,,,, +47,164349,,,,,,,,,,,,0.07106345891952515,,,,,, +47,164399,,,,,,,,,,,,0.06430547684431076,,,,,, +47,164449,,,,,,,,,,,,0.09157104790210724,,,,,, +47,164499,,,,,,,,,,,,0.07423996180295944,,,,,, +47,164549,,,,,,,,,,,,0.07082753628492355,,,,,, +47,164599,,,,,,,,,,,,0.07737341523170471,,,,,, +47,164649,,,,,,,,,,,,0.06660425662994385,,,,,, +47,164699,,,,,,,,,,,,0.06420391798019409,,,,,, +47,164749,,,,,,,,,,,,0.07282204926013947,,,,,, +47,164799,,,,,,,,,,,,0.07108230888843536,,,,,, +47,164849,,,,,,,,,,,,0.05845055729150772,,,,,, +47,164899,,,,,,,,,,,,0.059229589998722076,,,,,, +47,164949,,,,,,,,,,,,0.06942282617092133,,,,,, +47,164999,,,,,,,,,,,,0.07494465261697769,,,,,, +47,165049,,,,,,,,,,,,0.07543094456195831,,,,,, +47,165099,,,,,,,,,,,,0.07391352951526642,,,,,, +47,165149,,,,,,,,,,,,0.07104545086622238,,,,,, +47,165199,,,,,,,,,,,,0.06309586018323898,,,,,, +47,165249,,,,,,,,,,,,0.06073947995901108,,,,,, +47,165299,,,,,,,,,,,,0.05795275419950485,,,,,, +47,165311,,,,,,,,,,,,,0.2393830269575119,0.07846317440271378,0.23441138863563538,0.05080902576446533,0.20045378804206848,0.07846317440271378 +47,165311,,,,,,,0.22713389992713928,0.07193974405527115,0.3665207326412201,0.13430684804916382,0.34131377935409546,,,,,,, +48,165349,,,,,,,,,,,,0.07382981479167938,,,,,, +48,165399,,,,,,,,,,,,0.08398662507534027,,,,,, +48,165449,,,,,,,,,,,,0.07114632427692413,,,,,, +48,165499,,,,,,,,,,,,0.07259570807218552,,,,,, +48,165549,,,,,,,,,,,,0.07457143068313599,,,,,, +48,165599,,,,,,,,,,,,0.07255536317825317,,,,,, +48,165649,,,,,,,,,,,,0.08235181123018265,,,,,, +48,165699,,,,,,,,,,,,0.06481776386499405,,,,,, +48,165749,,,,,,,,,,,,0.08191605657339096,,,,,, +48,165799,,,,,,,,,,,,0.06816161423921585,,,,,, +48,165849,,,,,,,,,,,,0.07715418934822083,,,,,, +48,165899,,,,,,,,,,,,0.0752732902765274,,,,,, +48,165949,,,,,,,,,,,,0.06303752213716507,,,,,, +48,165999,,,,,,,,,,,,0.08544345200061798,,,,,, +48,166049,,,,,,,,,,,,0.07409606128931046,,,,,, +48,166099,,,,,,,,,,,,0.08047835528850555,,,,,, +48,166149,,,,,,,,,,,,0.06611422449350357,,,,,, +48,166199,,,,,,,,,,,,0.07485517859458923,,,,,, +48,166249,,,,,,,,,,,,0.06692489981651306,,,,,, +48,166299,,,,,,,,,,,,0.07149965316057205,,,,,, +48,166349,,,,,,,,,,,,0.07075663655996323,,,,,, +48,166399,,,,,,,,,,,,0.07238055020570755,,,,,, +48,166449,,,,,,,,,,,,0.06452476233243942,,,,,, +48,166499,,,,,,,,,,,,0.06822337210178375,,,,,, +48,166549,,,,,,,,,,,,0.07357264310121536,,,,,, +48,166599,,,,,,,,,,,,0.07096578180789948,,,,,, +48,166649,,,,,,,,,,,,0.05595090240240097,,,,,, +48,166699,,,,,,,,,,,,0.06581002473831177,,,,,, +48,166749,,,,,,,,,,,,0.07173185050487518,,,,,, +48,166799,,,,,,,,,,,,0.07280013710260391,,,,,, +48,166849,,,,,,,,,,,,0.07059015333652496,,,,,, +48,166899,,,,,,,,,,,,0.07394008338451385,,,,,, +48,166949,,,,,,,,,,,,0.06368010491132736,,,,,, +48,166999,,,,,,,,,,,,0.0735616460442543,,,,,, +48,167049,,,,,,,,,,,,0.06616536527872086,,,,,, +48,167099,,,,,,,,,,,,0.06391173601150513,,,,,, +48,167149,,,,,,,,,,,,0.08261257410049438,,,,,, +48,167199,,,,,,,,,,,,0.06644850224256516,,,,,, +48,167249,,,,,,,,,,,,0.07947176694869995,,,,,, +48,167299,,,,,,,,,,,,0.07660834491252899,,,,,, +48,167349,,,,,,,,,,,,0.0703747421503067,,,,,, +48,167399,,,,,,,,,,,,0.07352989912033081,,,,,, +48,167449,,,,,,,,,,,,0.07597826421260834,,,,,, +48,167499,,,,,,,,,,,,0.07440624386072159,,,,,, +48,167549,,,,,,,,,,,,0.07828176766633987,,,,,, +48,167599,,,,,,,,,,,,0.07767173647880554,,,,,, +48,167649,,,,,,,,,,,,0.0792313814163208,,,,,, +48,167699,,,,,,,,,,,,0.07664799690246582,,,,,, +48,167749,,,,,,,,,,,,0.07835599035024643,,,,,, +48,167799,,,,,,,,,,,,0.080293208360672,,,,,, +48,167849,,,,,,,,,,,,0.0710175409913063,,,,,, +48,167899,,,,,,,,,,,,0.06947653740644455,,,,,, +48,167949,,,,,,,,,,,,0.06157322973012924,,,,,, +48,167999,,,,,,,,,,,,0.062136635184288025,,,,,, +48,168049,,,,,,,,,,,,0.07585911452770233,,,,,, +48,168099,,,,,,,,,,,,0.074334055185318,,,,,, +48,168149,,,,,,,,,,,,0.07239386439323425,,,,,, +48,168199,,,,,,,,,,,,0.05493810772895813,,,,,, +48,168249,,,,,,,,,,,,0.06882898509502411,,,,,, +48,168299,,,,,,,,,,,,0.07719175517559052,,,,,, +48,168349,,,,,,,,,,,,0.0743342787027359,,,,,, +48,168399,,,,,,,,,,,,0.07035943865776062,,,,,, +48,168449,,,,,,,,,,,,0.08528611063957214,,,,,, +48,168499,,,,,,,,,,,,0.06180528551340103,,,,,, +48,168549,,,,,,,,,,,,0.08102641254663467,,,,,, +48,168599,,,,,,,,,,,,0.06380794197320938,,,,,, +48,168649,,,,,,,,,,,,0.06893476843833923,,,,,, +48,168699,,,,,,,,,,,,0.05969706550240517,,,,,, +48,168749,,,,,,,,,,,,0.0782390758395195,,,,,, +48,168755,,,,,,,,,,,,,0.23935994505882263,0.07841305434703827,0.23269309103488922,0.051415324211120605,0.20182165503501892,0.07841305434703827 +48,168755,,,,,,,0.2265743464231491,0.07166726142168045,0.3709642291069031,0.13758891820907593,0.3450179100036621,,,,,,, +49,168799,,,,,,,,,,,,0.06462743878364563,,,,,, +49,168849,,,,,,,,,,,,0.07848326116800308,,,,,, +49,168899,,,,,,,,,,,,0.0651264488697052,,,,,, +49,168949,,,,,,,,,,,,0.07345588505268097,,,,,, +49,168999,,,,,,,,,,,,0.051393717527389526,,,,,, +49,169049,,,,,,,,,,,,0.07422754168510437,,,,,, +49,169099,,,,,,,,,,,,0.08703320473432541,,,,,, +49,169149,,,,,,,,,,,,0.06293145567178726,,,,,, +49,169199,,,,,,,,,,,,0.06035486236214638,,,,,, +49,169249,,,,,,,,,,,,0.07209662348031998,,,,,, +49,169299,,,,,,,,,,,,0.07108429074287415,,,,,, +49,169349,,,,,,,,,,,,0.07081037759780884,,,,,, +49,169399,,,,,,,,,,,,0.06900368630886078,,,,,, +49,169449,,,,,,,,,,,,0.08025215566158295,,,,,, +49,169499,,,,,,,,,,,,0.07843269407749176,,,,,, +49,169549,,,,,,,,,,,,0.07392365485429764,,,,,, +49,169599,,,,,,,,,,,,0.07007961720228195,,,,,, +49,169649,,,,,,,,,,,,0.08097532391548157,,,,,, +49,169699,,,,,,,,,,,,0.06341609358787537,,,,,, +49,169749,,,,,,,,,,,,0.0653044730424881,,,,,, +49,169799,,,,,,,,,,,,0.06754733622074127,,,,,, +49,169849,,,,,,,,,,,,0.07286234200000763,,,,,, +49,169899,,,,,,,,,,,,0.0775357186794281,,,,,, +49,169949,,,,,,,,,,,,0.07204338908195496,,,,,, +49,169999,,,,,,,,,,,,0.055153220891952515,,,,,, +49,170049,,,,,,,,,,,,0.06964626908302307,,,,,, +49,170099,,,,,,,,,,,,0.0811426192522049,,,,,, +49,170149,,,,,,,,,,,,0.06694906204938889,,,,,, +49,170199,,,,,,,,,,,,0.06991603970527649,,,,,, +49,170249,,,,,,,,,,,,0.05142631381750107,,,,,, +49,170299,,,,,,,,,,,,0.0707428976893425,,,,,, +49,170349,,,,,,,,,,,,0.06814810633659363,,,,,, +49,170399,,,,,,,,,,,,0.0747489258646965,,,,,, +49,170449,,,,,,,,,,,,0.07595013082027435,,,,,, +49,170499,,,,,,,,,,,,0.06019696220755577,,,,,, +49,170549,,,,,,,,,,,,0.07208958268165588,,,,,, +49,170599,,,,,,,,,,,,0.06638699769973755,,,,,, +49,170649,,,,,,,,,,,,0.07249109447002411,,,,,, +49,170699,,,,,,,,,,,,0.06979783624410629,,,,,, +49,170749,,,,,,,,,,,,0.06932864338159561,,,,,, +49,170799,,,,,,,,,,,,0.06423118710517883,,,,,, +49,170849,,,,,,,,,,,,0.07262884080410004,,,,,, +49,170899,,,,,,,,,,,,0.08096522837877274,,,,,, +49,170949,,,,,,,,,,,,0.07031287997961044,,,,,, +49,170999,,,,,,,,,,,,0.06134799122810364,,,,,, +49,171049,,,,,,,,,,,,0.07086321711540222,,,,,, +49,171099,,,,,,,,,,,,0.0659320205450058,,,,,, +49,171149,,,,,,,,,,,,0.07366514205932617,,,,,, +49,171199,,,,,,,,,,,,0.07405580580234528,,,,,, +49,171249,,,,,,,,,,,,0.06279594451189041,,,,,, +49,171299,,,,,,,,,,,,0.07082702964544296,,,,,, +49,171349,,,,,,,,,,,,0.06247812509536743,,,,,, +49,171399,,,,,,,,,,,,0.06710389256477356,,,,,, +49,171449,,,,,,,,,,,,0.07793591171503067,,,,,, +49,171499,,,,,,,,,,,,0.07903718948364258,,,,,, +49,171549,,,,,,,,,,,,0.08353382349014282,,,,,, +49,171599,,,,,,,,,,,,0.08068394660949707,,,,,, +49,171649,,,,,,,,,,,,0.059589970856904984,,,,,, +49,171699,,,,,,,,,,,,0.07189925014972687,,,,,, +49,171749,,,,,,,,,,,,0.06208071857690811,,,,,, +49,171799,,,,,,,,,,,,0.06628647446632385,,,,,, +49,171849,,,,,,,,,,,,0.0705304965376854,,,,,, +49,171899,,,,,,,,,,,,0.07140544056892395,,,,,, +49,171949,,,,,,,,,,,,0.06524364650249481,,,,,, +49,171999,,,,,,,,,,,,0.07288915663957596,,,,,, +49,172049,,,,,,,,,,,,0.06905119866132736,,,,,, +49,172099,,,,,,,,,,,,0.07842319458723068,,,,,, +49,172149,,,,,,,,,,,,0.07214489579200745,,,,,, +49,172199,,,,,,,,,,,,0.06504469364881516,,,,,, +49,172199,,,,,,,,,,,,,0.2393324375152588,0.07832556962966919,0.23313172161579132,0.05247366428375244,0.20300281047821045,0.07832556962966919 +49,172199,,,,,,,0.22548937797546387,0.07110393047332764,0.3799613416194916,0.14435899257659912,0.3552548587322235,,,,,,, +50,172200,0.241166353225708,0.07910767197608948,0.2128688246011734,0.0435788631439209,0.18263666331768036,0.07910767197608948,,,,,,,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6f872cb215d5ad160e1d2d4853483a97da9dbdf0 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml @@ -0,0 +1,23 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: gifflar + num_layers: 8 + pooling: global_mean + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 44 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..c149d85920bf88c442034313a01ffe7682402aa5 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv @@ -0,0 +1,52 @@ +epoch,step,train/loss +0,49,0.08003626018762589 +0,99,0.09078513085842133 +0,149,0.08091548830270767 +0,199,0.08097609877586365 +0,249,0.08102457225322723 +0,299,0.08301417529582977 +0,349,0.08610585331916809 +0,399,0.08502880483865738 +0,449,0.0960264727473259 +0,499,0.07729538530111313 +0,549,0.08857426047325134 +0,599,0.09073326736688614 +0,649,0.0820859894156456 +0,699,0.08472107350826263 +0,749,0.09114639461040497 +0,799,0.0711016058921814 +0,849,0.08110672235488892 +0,899,0.08151710033416748 +0,949,0.08140866458415985 +0,999,0.069959856569767 +0,1049,0.06763889640569687 +0,1099,0.07958220690488815 +0,1149,0.08547987043857574 +0,1199,0.07144340872764587 +0,1249,0.07605753093957901 +0,1299,0.0714554712176323 +0,1349,0.07643546164035797 +0,1399,0.07403038442134857 +0,1449,0.07169679552316666 +0,1499,0.08218634873628616 +0,1549,0.0801498219370842 +0,1599,0.07415124773979187 +0,1649,0.0879269540309906 +0,1699,0.05987190455198288 +0,1749,0.07732964307069778 +0,1799,0.07431954890489578 +0,1849,0.0829710066318512 +0,1899,0.08042403310537338 +0,1949,0.07851314544677734 +0,1999,0.07959397882223129 +0,2049,0.08086477220058441 +0,2099,0.08161906898021698 +0,2149,0.07687868922948837 +0,2199,0.08360119163990021 +0,2249,0.0701226219534874 +0,2299,0.06676062941551208 +0,2349,0.0792357325553894 +0,2399,0.06796278059482574 +0,2449,0.08319472521543503 +0,2499,0.08177202939987183 +0,2549,0.07524104416370392 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6f872cb215d5ad160e1d2d4853483a97da9dbdf0 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml @@ -0,0 +1,23 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: gifflar + num_layers: 8 + pooling: global_mean + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 44 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..88821e4f056e75241e583e2f8515014fe8c40d68 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv @@ -0,0 +1,54 @@ +epoch,step,train/loss +0,49,0.07998401671648026 +0,99,0.08914139121770859 +0,149,0.07917076349258423 +0,199,0.08471974730491638 +0,249,0.08420324325561523 +0,299,0.08586268126964569 +0,349,0.0838388055562973 +0,399,0.08598030358552933 +0,449,0.09362571686506271 +0,499,0.07548592984676361 +0,549,0.08366184681653976 +0,599,0.08736029267311096 +0,649,0.08109179139137268 +0,699,0.08418052643537521 +0,749,0.08977542072534561 +0,799,0.07077222317457199 +0,849,0.08262693881988525 +0,899,0.08109159022569656 +0,949,0.07967276871204376 +0,999,0.07169009745121002 +0,1049,0.06605616956949234 +0,1099,0.07870398461818695 +0,1149,0.08579546213150024 +0,1199,0.06976328790187836 +0,1249,0.07703857123851776 +0,1299,0.0696515366435051 +0,1349,0.07750803232192993 +0,1399,0.07398037612438202 +0,1449,0.07214565575122833 +0,1499,0.0831713080406189 +0,1549,0.08117252588272095 +0,1599,0.073797807097435 +0,1649,0.08598601818084717 +0,1699,0.05820533260703087 +0,1749,0.07753492891788483 +0,1799,0.074045330286026 +0,1849,0.08154448121786118 +0,1899,0.07833869010210037 +0,1949,0.0796414464712143 +0,1999,0.07492054253816605 +0,2049,0.080782450735569 +0,2099,0.08037116378545761 +0,2149,0.07761123776435852 +0,2199,0.08326950669288635 +0,2249,0.06869586557149887 +0,2299,0.06739915907382965 +0,2349,0.07618880271911621 +0,2399,0.0669938251376152 +0,2449,0.08534961938858032 +0,2499,0.08224932849407196 +0,2549,0.07667463272809982 +0,2599,0.07385756075382233 +0,2649,0.07286062091588974 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6f872cb215d5ad160e1d2d4853483a97da9dbdf0 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/hparams.yaml @@ -0,0 +1,23 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: gifflar + num_layers: 8 + pooling: global_mean + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 44 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..828e54a572d392087f60419ec6ffec76f9402fa8 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/metrics.csv @@ -0,0 +1,3546 @@ +epoch,step,test/MeanAbsoluteError,test/MeanSquaredError,test/PearsonCorrCoef,test/R2Score,test/SpearmanCorrCoef,test/loss,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +0,49,,,,,,,,,,,,0.08110474050045013,,,,,, +0,99,,,,,,,,,,,,0.09030728787183762,,,,,, +0,149,,,,,,,,,,,,0.08033320307731628,,,,,, +0,199,,,,,,,,,,,,0.08740758895874023,,,,,, +0,249,,,,,,,,,,,,0.08141788840293884,,,,,, +0,299,,,,,,,,,,,,0.07937868684530258,,,,,, +0,349,,,,,,,,,,,,0.08493764698505402,,,,,, +0,399,,,,,,,,,,,,0.08895817399024963,,,,,, +0,449,,,,,,,,,,,,0.09602658450603485,,,,,, +0,499,,,,,,,,,,,,0.07643790543079376,,,,,, +0,549,,,,,,,,,,,,0.08679072558879852,,,,,, +0,599,,,,,,,,,,,,0.08788172155618668,,,,,, +0,649,,,,,,,,,,,,0.08212503790855408,,,,,, +0,699,,,,,,,,,,,,0.08316071331501007,,,,,, +0,749,,,,,,,,,,,,0.08799315243959427,,,,,, +0,799,,,,,,,,,,,,0.07091587036848068,,,,,, +0,849,,,,,,,,,,,,0.08270995318889618,,,,,, +0,899,,,,,,,,,,,,0.07940752804279327,,,,,, +0,949,,,,,,,,,,,,0.08024751394987106,,,,,, +0,999,,,,,,,,,,,,0.07134298980236053,,,,,, +0,1049,,,,,,,,,,,,0.06709932535886765,,,,,, +0,1099,,,,,,,,,,,,0.07882122695446014,,,,,, +0,1149,,,,,,,,,,,,0.08383958041667938,,,,,, +0,1199,,,,,,,,,,,,0.07040202617645264,,,,,, +0,1249,,,,,,,,,,,,0.07711164653301239,,,,,, +0,1299,,,,,,,,,,,,0.07143343985080719,,,,,, +0,1349,,,,,,,,,,,,0.07608195394277573,,,,,, +0,1399,,,,,,,,,,,,0.07422438263893127,,,,,, +0,1449,,,,,,,,,,,,0.07356949150562286,,,,,, +0,1499,,,,,,,,,,,,0.08401617407798767,,,,,, +0,1549,,,,,,,,,,,,0.08061861246824265,,,,,, +0,1599,,,,,,,,,,,,0.07451000809669495,,,,,, +0,1649,,,,,,,,,,,,0.08816098421812057,,,,,, +0,1699,,,,,,,,,,,,0.06099183112382889,,,,,, +0,1749,,,,,,,,,,,,0.07727460563182831,,,,,, +0,1799,,,,,,,,,,,,0.07221470773220062,,,,,, +0,1849,,,,,,,,,,,,0.09432712197303772,,,,,, +0,1899,,,,,,,,,,,,0.07692762464284897,,,,,, +0,1949,,,,,,,,,,,,0.08203738927841187,,,,,, +0,1999,,,,,,,,,,,,0.08134813606739044,,,,,, +0,2049,,,,,,,,,,,,0.0816325843334198,,,,,, +0,2099,,,,,,,,,,,,0.0807022973895073,,,,,, +0,2149,,,,,,,,,,,,0.07926148176193237,,,,,, +0,2199,,,,,,,,,,,,0.08185859024524689,,,,,, +0,2249,,,,,,,,,,,,0.07240413129329681,,,,,, +0,2299,,,,,,,,,,,,0.06923523545265198,,,,,, +0,2349,,,,,,,,,,,,0.07996778935194016,,,,,, +0,2399,,,,,,,,,,,,0.06644880771636963,,,,,, +0,2449,,,,,,,,,,,,0.0839456170797348,,,,,, +0,2499,,,,,,,,,,,,0.08260418474674225,,,,,, +0,2549,,,,,,,,,,,,0.07654386013746262,,,,,, +0,2599,,,,,,,,,,,,0.07576791942119598,,,,,, +0,2649,,,,,,,,,,,,0.07716340571641922,,,,,, +0,2699,,,,,,,,,,,,0.07721488177776337,,,,,, +0,2749,,,,,,,,,,,,0.07268200069665909,,,,,, +0,2799,,,,,,,,,,,,0.06841197609901428,,,,,, +0,2849,,,,,,,,,,,,0.07694264501333237,,,,,, +0,2899,,,,,,,,,,,,0.08788639307022095,,,,,, +0,2949,,,,,,,,,,,,0.07452116906642914,,,,,, +0,2999,,,,,,,,,,,,0.08461104333400726,,,,,, +0,3049,,,,,,,,,,,,0.07426393032073975,,,,,, +0,3099,,,,,,,,,,,,0.0821320116519928,,,,,, +0,3149,,,,,,,,,,,,0.08328604698181152,,,,,, +0,3199,,,,,,,,,,,,0.07458613067865372,,,,,, +0,3249,,,,,,,,,,,,0.08006446063518524,,,,,, +0,3299,,,,,,,,,,,,0.08221595734357834,,,,,, +0,3349,,,,,,,,,,,,0.09101942181587219,,,,,, +0,3399,,,,,,,,,,,,0.07481037080287933,,,,,, +0,3443,,,,,,,,,,,,,0.24105896055698395,0.07873332500457764,0.22358018159866333,0.04754096269607544,0.1869184821844101,0.07873332500457764 +0,3443,,,,,,,0.24104860424995422,0.08032051473855972,0.2113015353679657,0.033448100090026855,0.19401822984218597,,,,,,, +1,3449,,,,,,,,,,,,0.0751628577709198,,,,,, +1,3499,,,,,,,,,,,,0.07616264373064041,,,,,, +1,3549,,,,,,,,,,,,0.08027312159538269,,,,,, +1,3599,,,,,,,,,,,,0.06393460929393768,,,,,, +1,3649,,,,,,,,,,,,0.0671733170747757,,,,,, +1,3699,,,,,,,,,,,,0.06530814617872238,,,,,, +1,3749,,,,,,,,,,,,0.06598823517560959,,,,,, +1,3799,,,,,,,,,,,,0.07467079907655716,,,,,, +1,3849,,,,,,,,,,,,0.06452050060033798,,,,,, +1,3899,,,,,,,,,,,,0.08387423306703568,,,,,, +1,3949,,,,,,,,,,,,0.07939770072698593,,,,,, +1,3999,,,,,,,,,,,,0.0824955552816391,,,,,, +1,4049,,,,,,,,,,,,0.07484625279903412,,,,,, +1,4099,,,,,,,,,,,,0.07629641890525818,,,,,, +1,4149,,,,,,,,,,,,0.0736059695482254,,,,,, +1,4199,,,,,,,,,,,,0.08040127158164978,,,,,, +1,4249,,,,,,,,,,,,0.06780825555324554,,,,,, +1,4299,,,,,,,,,,,,0.07059663534164429,,,,,, +1,4349,,,,,,,,,,,,0.07650600373744965,,,,,, +1,4399,,,,,,,,,,,,0.07984305918216705,,,,,, +1,4449,,,,,,,,,,,,0.07959704101085663,,,,,, +1,4499,,,,,,,,,,,,0.0813698098063469,,,,,, +1,4549,,,,,,,,,,,,0.07217152416706085,,,,,, +1,4599,,,,,,,,,,,,0.07691794633865356,,,,,, +1,4649,,,,,,,,,,,,0.07680152356624603,,,,,, +1,4699,,,,,,,,,,,,0.08738608658313751,,,,,, +1,4749,,,,,,,,,,,,0.07920238375663757,,,,,, +1,4799,,,,,,,,,,,,0.08241896331310272,,,,,, +1,4849,,,,,,,,,,,,0.07127797603607178,,,,,, +1,4899,,,,,,,,,,,,0.06690330803394318,,,,,, +1,4949,,,,,,,,,,,,0.07272616028785706,,,,,, +1,4999,,,,,,,,,,,,0.0785977840423584,,,,,, +1,5049,,,,,,,,,,,,0.0632769986987114,,,,,, +1,5099,,,,,,,,,,,,0.07762141525745392,,,,,, +1,5149,,,,,,,,,,,,0.07479434460401535,,,,,, +1,5199,,,,,,,,,,,,0.0635005459189415,,,,,, +1,5249,,,,,,,,,,,,0.06660342216491699,,,,,, +1,5299,,,,,,,,,,,,0.08250419795513153,,,,,, +1,5349,,,,,,,,,,,,0.07036027312278748,,,,,, +1,5399,,,,,,,,,,,,0.081353560090065,,,,,, +1,5449,,,,,,,,,,,,0.07229539752006531,,,,,, +1,5499,,,,,,,,,,,,0.08361037075519562,,,,,, +1,5549,,,,,,,,,,,,0.0882149338722229,,,,,, +1,5599,,,,,,,,,,,,0.07903219759464264,,,,,, +1,5649,,,,,,,,,,,,0.08402593433856964,,,,,, +1,5699,,,,,,,,,,,,0.07170549035072327,,,,,, +1,5749,,,,,,,,,,,,0.09178964793682098,,,,,, +1,5799,,,,,,,,,,,,0.08004588633775711,,,,,, +1,5849,,,,,,,,,,,,0.07768644392490387,,,,,, +1,5899,,,,,,,,,,,,0.06561742722988129,,,,,, +1,5949,,,,,,,,,,,,0.07784892618656158,,,,,, +1,5999,,,,,,,,,,,,0.06149253621697426,,,,,, +1,6049,,,,,,,,,,,,0.06053400784730911,,,,,, +1,6099,,,,,,,,,,,,0.07063174247741699,,,,,, +1,6149,,,,,,,,,,,,0.07413766533136368,,,,,, +1,6199,,,,,,,,,,,,0.07041618227958679,,,,,, +1,6249,,,,,,,,,,,,0.08324568718671799,,,,,, +1,6299,,,,,,,,,,,,0.0786287784576416,,,,,, +1,6349,,,,,,,,,,,,0.0709456205368042,,,,,, +1,6399,,,,,,,,,,,,0.07623988389968872,,,,,, +1,6449,,,,,,,,,,,,0.07184383273124695,,,,,, +1,6499,,,,,,,,,,,,0.08379396796226501,,,,,, +1,6549,,,,,,,,,,,,0.07467623054981232,,,,,, +1,6599,,,,,,,,,,,,0.06301483511924744,,,,,, +1,6649,,,,,,,,,,,,0.07377069443464279,,,,,, +1,6699,,,,,,,,,,,,0.07654876261949539,,,,,, +1,6749,,,,,,,,,,,,0.06985680758953094,,,,,, +1,6799,,,,,,,,,,,,0.07197581231594086,,,,,, +1,6849,,,,,,,,,,,,0.07164818793535233,,,,,, +1,6887,,,,,,,,,,,,,0.24027639627456665,0.07816062867641449,0.23976263403892517,0.05446898937225342,0.20188793540000916,0.07816062867641449 +1,6887,,,,,,,0.2351929098367691,0.076191246509552,0.288610577583313,0.08315521478652954,0.26384681463241577,,,,,,, +2,6899,,,,,,,,,,,,0.07463907450437546,,,,,, +2,6949,,,,,,,,,,,,0.08120092749595642,,,,,, +2,6999,,,,,,,,,,,,0.07575759291648865,,,,,, +2,7049,,,,,,,,,,,,0.08388453722000122,,,,,, +2,7099,,,,,,,,,,,,0.07584960758686066,,,,,, +2,7149,,,,,,,,,,,,0.07853226363658905,,,,,, +2,7199,,,,,,,,,,,,0.06871183961629868,,,,,, +2,7249,,,,,,,,,,,,0.07678879052400589,,,,,, +2,7299,,,,,,,,,,,,0.07570990920066833,,,,,, +2,7349,,,,,,,,,,,,0.07891152799129486,,,,,, +2,7399,,,,,,,,,,,,0.06609807163476944,,,,,, +2,7449,,,,,,,,,,,,0.07091490179300308,,,,,, +2,7499,,,,,,,,,,,,0.0667862519621849,,,,,, +2,7549,,,,,,,,,,,,0.07100829482078552,,,,,, +2,7599,,,,,,,,,,,,0.06120731681585312,,,,,, +2,7649,,,,,,,,,,,,0.06722746789455414,,,,,, +2,7699,,,,,,,,,,,,0.06569989025592804,,,,,, +2,7749,,,,,,,,,,,,0.06914649903774261,,,,,, +2,7799,,,,,,,,,,,,0.08853691816329956,,,,,, +2,7849,,,,,,,,,,,,0.08257018029689789,,,,,, +2,7899,,,,,,,,,,,,0.06750702857971191,,,,,, +2,7949,,,,,,,,,,,,0.08281652629375458,,,,,, +2,7999,,,,,,,,,,,,0.07396100461483002,,,,,, +2,8049,,,,,,,,,,,,0.08777542412281036,,,,,, +2,8099,,,,,,,,,,,,0.07979783415794373,,,,,, +2,8149,,,,,,,,,,,,0.08066925406455994,,,,,, +2,8199,,,,,,,,,,,,0.08111882209777832,,,,,, +2,8249,,,,,,,,,,,,0.07280734181404114,,,,,, +2,8299,,,,,,,,,,,,0.07199500501155853,,,,,, +2,8349,,,,,,,,,,,,0.0782398208975792,,,,,, +2,8399,,,,,,,,,,,,0.07824227213859558,,,,,, +2,8449,,,,,,,,,,,,0.09352302551269531,,,,,, +2,8499,,,,,,,,,,,,0.07467305660247803,,,,,, +2,8549,,,,,,,,,,,,0.07135221362113953,,,,,, +2,8599,,,,,,,,,,,,0.07764197885990143,,,,,, +2,8649,,,,,,,,,,,,0.0659562349319458,,,,,, +2,8699,,,,,,,,,,,,0.06881386786699295,,,,,, +2,8749,,,,,,,,,,,,0.06773854792118073,,,,,, +2,8799,,,,,,,,,,,,0.07120577991008759,,,,,, +2,8849,,,,,,,,,,,,0.08128941804170609,,,,,, +2,8899,,,,,,,,,,,,0.0746210515499115,,,,,, +2,8949,,,,,,,,,,,,0.07026155292987823,,,,,, +2,8999,,,,,,,,,,,,0.06463077664375305,,,,,, +2,9049,,,,,,,,,,,,0.07008691132068634,,,,,, +2,9099,,,,,,,,,,,,0.07121168076992035,,,,,, +2,9149,,,,,,,,,,,,0.07377319037914276,,,,,, +2,9199,,,,,,,,,,,,0.08300186693668365,,,,,, +2,9249,,,,,,,,,,,,0.0693550556898117,,,,,, +2,9299,,,,,,,,,,,,0.0680575892329216,,,,,, +2,9349,,,,,,,,,,,,0.07957883179187775,,,,,, +2,9399,,,,,,,,,,,,0.0705910250544548,,,,,, +2,9449,,,,,,,,,,,,0.0761106088757515,,,,,, +2,9499,,,,,,,,,,,,0.0748792290687561,,,,,, +2,9549,,,,,,,,,,,,0.08438411355018616,,,,,, +2,9599,,,,,,,,,,,,0.07472829520702362,,,,,, +2,9649,,,,,,,,,,,,0.08141180872917175,,,,,, +2,9699,,,,,,,,,,,,0.0838603749871254,,,,,, +2,9749,,,,,,,,,,,,0.07103878259658813,,,,,, +2,9799,,,,,,,,,,,,0.07862637937068939,,,,,, +2,9849,,,,,,,,,,,,0.06545449793338776,,,,,, +2,9899,,,,,,,,,,,,0.07700921595096588,,,,,, +2,9949,,,,,,,,,,,,0.06031300127506256,,,,,, +2,9999,,,,,,,,,,,,0.0755683034658432,,,,,, +2,10049,,,,,,,,,,,,0.08177118003368378,,,,,, +2,10099,,,,,,,,,,,,0.07483501732349396,,,,,, +2,10149,,,,,,,,,,,,0.08250296115875244,,,,,, +2,10199,,,,,,,,,,,,0.08965077996253967,,,,,, +2,10249,,,,,,,,,,,,0.06405775994062424,,,,,, +2,10299,,,,,,,,,,,,0.07033233344554901,,,,,, +2,10331,,,,,,,,,,,,,0.2394299954175949,0.07777128368616104,0.2532478868961334,0.05917900800704956,0.2147963047027588,0.07777128368616104 +2,10331,,,,,,,0.23275385797023773,0.07494685798883438,0.3133999705314636,0.09810489416122437,0.2925623953342438,,,,,,, +3,10349,,,,,,,,,,,,0.05647134780883789,,,,,, +3,10399,,,,,,,,,,,,0.08159159123897552,,,,,, +3,10449,,,,,,,,,,,,0.07394242286682129,,,,,, +3,10499,,,,,,,,,,,,0.08018834888935089,,,,,, +3,10549,,,,,,,,,,,,0.06191611289978027,,,,,, +3,10599,,,,,,,,,,,,0.06523942202329636,,,,,, +3,10649,,,,,,,,,,,,0.07234174013137817,,,,,, +3,10699,,,,,,,,,,,,0.06995436549186707,,,,,, +3,10749,,,,,,,,,,,,0.06705111265182495,,,,,, +3,10799,,,,,,,,,,,,0.08220474421977997,,,,,, +3,10849,,,,,,,,,,,,0.07317544519901276,,,,,, +3,10899,,,,,,,,,,,,0.07366479933261871,,,,,, +3,10949,,,,,,,,,,,,0.08036315441131592,,,,,, +3,10999,,,,,,,,,,,,0.07398222386837006,,,,,, +3,11049,,,,,,,,,,,,0.07783230394124985,,,,,, +3,11099,,,,,,,,,,,,0.08096171915531158,,,,,, +3,11149,,,,,,,,,,,,0.0751027911901474,,,,,, +3,11199,,,,,,,,,,,,0.07783554494380951,,,,,, +3,11249,,,,,,,,,,,,0.06716060638427734,,,,,, +3,11299,,,,,,,,,,,,0.06554602831602097,,,,,, +3,11349,,,,,,,,,,,,0.07059021294116974,,,,,, +3,11399,,,,,,,,,,,,0.06334000080823898,,,,,, +3,11449,,,,,,,,,,,,0.07447747886180878,,,,,, +3,11499,,,,,,,,,,,,0.09739984571933746,,,,,, +3,11549,,,,,,,,,,,,0.07413312792778015,,,,,, +3,11599,,,,,,,,,,,,0.0697694942355156,,,,,, +3,11649,,,,,,,,,,,,0.06341772526502609,,,,,, +3,11699,,,,,,,,,,,,0.07273809611797333,,,,,, +3,11749,,,,,,,,,,,,0.08231838047504425,,,,,, +3,11799,,,,,,,,,,,,0.07329674065113068,,,,,, +3,11849,,,,,,,,,,,,0.07840678095817566,,,,,, +3,11899,,,,,,,,,,,,0.05953788757324219,,,,,, +3,11949,,,,,,,,,,,,0.07470402121543884,,,,,, +3,11999,,,,,,,,,,,,0.08833719044923782,,,,,, +3,12049,,,,,,,,,,,,0.06429485976696014,,,,,, +3,12099,,,,,,,,,,,,0.07167970389127731,,,,,, +3,12149,,,,,,,,,,,,0.07303228229284286,,,,,, +3,12199,,,,,,,,,,,,0.07480680197477341,,,,,, +3,12249,,,,,,,,,,,,0.07546786218881607,,,,,, +3,12299,,,,,,,,,,,,0.07740049809217453,,,,,, +3,12349,,,,,,,,,,,,0.08040206879377365,,,,,, +3,12399,,,,,,,,,,,,0.07118155062198639,,,,,, +3,12449,,,,,,,,,,,,0.07701750099658966,,,,,, +3,12499,,,,,,,,,,,,0.05971487611532211,,,,,, +3,12549,,,,,,,,,,,,0.06582984328269958,,,,,, +3,12599,,,,,,,,,,,,0.06503453850746155,,,,,, +3,12649,,,,,,,,,,,,0.05728892982006073,,,,,, +3,12699,,,,,,,,,,,,0.07957947999238968,,,,,, +3,12749,,,,,,,,,,,,0.07403229176998138,,,,,, +3,12799,,,,,,,,,,,,0.060378268361091614,,,,,, +3,12849,,,,,,,,,,,,0.06896620988845825,,,,,, +3,12899,,,,,,,,,,,,0.08777026832103729,,,,,, +3,12949,,,,,,,,,,,,0.07145608961582184,,,,,, +3,12999,,,,,,,,,,,,0.08538798987865448,,,,,, +3,13049,,,,,,,,,,,,0.0890417993068695,,,,,, +3,13099,,,,,,,,,,,,0.06472334265708923,,,,,, +3,13149,,,,,,,,,,,,0.08390425145626068,,,,,, +3,13199,,,,,,,,,,,,0.0714716836810112,,,,,, +3,13249,,,,,,,,,,,,0.07830255478620529,,,,,, +3,13299,,,,,,,,,,,,0.07746894657611847,,,,,, +3,13349,,,,,,,,,,,,0.0758831650018692,,,,,, +3,13399,,,,,,,,,,,,0.07441984117031097,,,,,, +3,13449,,,,,,,,,,,,0.07751299440860748,,,,,, +3,13499,,,,,,,,,,,,0.07011039555072784,,,,,, +3,13549,,,,,,,,,,,,0.07554979622364044,,,,,, +3,13599,,,,,,,,,,,,0.07313606142997742,,,,,, +3,13649,,,,,,,,,,,,0.08375740796327591,,,,,, +3,13699,,,,,,,,,,,,0.08490899205207825,,,,,, +3,13749,,,,,,,,,,,,0.07478999346494675,,,,,, +3,13775,,,,,,,,,,,,,0.2403617799282074,0.07848940789699554,0.24374303221702576,0.05049169063568115,0.2139202207326889,0.07848940789699554 +3,13775,,,,,,,0.2316489964723587,0.07438711822032928,0.3241051137447357,0.10485082864761353,0.3046451508998871,,,,,,, +4,13799,,,,,,,,,,,,0.08356857299804688,,,,,, +4,13849,,,,,,,,,,,,0.0738140344619751,,,,,, +4,13899,,,,,,,,,,,,0.06827451288700104,,,,,, +4,13949,,,,,,,,,,,,0.08317481726408005,,,,,, +4,13999,,,,,,,,,,,,0.06580077111721039,,,,,, +4,14049,,,,,,,,,,,,0.07832752913236618,,,,,, +4,14099,,,,,,,,,,,,0.06895653903484344,,,,,, +4,14149,,,,,,,,,,,,0.08960427343845367,,,,,, +4,14199,,,,,,,,,,,,0.07947288453578949,,,,,, +4,14249,,,,,,,,,,,,0.07831177115440369,,,,,, +4,14299,,,,,,,,,,,,0.07913202047348022,,,,,, +4,14349,,,,,,,,,,,,0.07328912615776062,,,,,, +4,14399,,,,,,,,,,,,0.07250455021858215,,,,,, +4,14449,,,,,,,,,,,,0.066590815782547,,,,,, +4,14499,,,,,,,,,,,,0.07898275554180145,,,,,, +4,14549,,,,,,,,,,,,0.07089227437973022,,,,,, +4,14599,,,,,,,,,,,,0.08209030330181122,,,,,, +4,14649,,,,,,,,,,,,0.07049086689949036,,,,,, +4,14699,,,,,,,,,,,,0.08081990480422974,,,,,, +4,14749,,,,,,,,,,,,0.07839208841323853,,,,,, +4,14799,,,,,,,,,,,,0.06862176954746246,,,,,, +4,14849,,,,,,,,,,,,0.08269837498664856,,,,,, +4,14899,,,,,,,,,,,,0.07915644347667694,,,,,, +4,14949,,,,,,,,,,,,0.06963935494422913,,,,,, +4,14999,,,,,,,,,,,,0.07551079988479614,,,,,, +4,15049,,,,,,,,,,,,0.07205457985401154,,,,,, +4,15099,,,,,,,,,,,,0.07935398072004318,,,,,, +4,15149,,,,,,,,,,,,0.07274361699819565,,,,,, +4,15199,,,,,,,,,,,,0.08420909941196442,,,,,, +4,15249,,,,,,,,,,,,0.08919444680213928,,,,,, +4,15299,,,,,,,,,,,,0.06942731887102127,,,,,, +4,15349,,,,,,,,,,,,0.08873213827610016,,,,,, +4,15399,,,,,,,,,,,,0.06982121616601944,,,,,, +4,15449,,,,,,,,,,,,0.08403228968381882,,,,,, +4,15499,,,,,,,,,,,,0.07824897021055222,,,,,, +4,15549,,,,,,,,,,,,0.07465068995952606,,,,,, +4,15599,,,,,,,,,,,,0.08114618062973022,,,,,, +4,15649,,,,,,,,,,,,0.07971667498350143,,,,,, +4,15699,,,,,,,,,,,,0.07165811955928802,,,,,, +4,15749,,,,,,,,,,,,0.07550357282161713,,,,,, +4,15799,,,,,,,,,,,,0.07022474706172943,,,,,, +4,15849,,,,,,,,,,,,0.07307650148868561,,,,,, +4,15899,,,,,,,,,,,,0.07872463762760162,,,,,, +4,15949,,,,,,,,,,,,0.0727003663778305,,,,,, +4,15999,,,,,,,,,,,,0.0815306007862091,,,,,, +4,16049,,,,,,,,,,,,0.0784611701965332,,,,,, +4,16099,,,,,,,,,,,,0.07356463372707367,,,,,, +4,16149,,,,,,,,,,,,0.06737349927425385,,,,,, +4,16199,,,,,,,,,,,,0.06207146495580673,,,,,, +4,16249,,,,,,,,,,,,0.07088702917098999,,,,,, +4,16299,,,,,,,,,,,,0.06887586414813995,,,,,, +4,16349,,,,,,,,,,,,0.07773417234420776,,,,,, +4,16399,,,,,,,,,,,,0.08048656582832336,,,,,, +4,16449,,,,,,,,,,,,0.07410235702991486,,,,,, +4,16499,,,,,,,,,,,,0.0816555917263031,,,,,, +4,16549,,,,,,,,,,,,0.07099979370832443,,,,,, +4,16599,,,,,,,,,,,,0.0793459564447403,,,,,, +4,16649,,,,,,,,,,,,0.08184592425823212,,,,,, +4,16699,,,,,,,,,,,,0.08658382296562195,,,,,, +4,16749,,,,,,,,,,,,0.08044815063476562,,,,,, +4,16799,,,,,,,,,,,,0.07818031311035156,,,,,, +4,16849,,,,,,,,,,,,0.07593576610088348,,,,,, +4,16899,,,,,,,,,,,,0.07138366252183914,,,,,, +4,16949,,,,,,,,,,,,0.0719701424241066,,,,,, +4,16999,,,,,,,,,,,,0.07382529228925705,,,,,, +4,17049,,,,,,,,,,,,0.06460471451282501,,,,,, +4,17099,,,,,,,,,,,,0.07306459546089172,,,,,, +4,17149,,,,,,,,,,,,0.08777077496051788,,,,,, +4,17199,,,,,,,,,,,,0.07064875960350037,,,,,, +4,17219,,,,,,,,,,,,,0.23988722264766693,0.07843964546918869,0.25035756826400757,0.0510936975479126,0.21985085308551788,0.07843964546918869 +4,17219,,,,,,,0.23299221694469452,0.07527521997690201,0.3078862428665161,0.09416615962982178,0.285230427980423,,,,,,, +5,17249,,,,,,,,,,,,0.07099887728691101,,,,,, +5,17299,,,,,,,,,,,,0.06834252178668976,,,,,, +5,17349,,,,,,,,,,,,0.07365541905164719,,,,,, +5,17399,,,,,,,,,,,,0.0810326337814331,,,,,, +5,17449,,,,,,,,,,,,0.0663873553276062,,,,,, +5,17499,,,,,,,,,,,,0.08425329625606537,,,,,, +5,17549,,,,,,,,,,,,0.07975930720567703,,,,,, +5,17599,,,,,,,,,,,,0.0676921084523201,,,,,, +5,17649,,,,,,,,,,,,0.07499624788761139,,,,,, +5,17699,,,,,,,,,,,,0.0791846364736557,,,,,, +5,17749,,,,,,,,,,,,0.06613381952047348,,,,,, +5,17799,,,,,,,,,,,,0.07435262203216553,,,,,, +5,17849,,,,,,,,,,,,0.07145944237709045,,,,,, +5,17899,,,,,,,,,,,,0.06551055610179901,,,,,, +5,17949,,,,,,,,,,,,0.07830928266048431,,,,,, +5,17999,,,,,,,,,,,,0.07707799971103668,,,,,, +5,18049,,,,,,,,,,,,0.07003045082092285,,,,,, +5,18099,,,,,,,,,,,,0.07585079222917557,,,,,, +5,18149,,,,,,,,,,,,0.07091648131608963,,,,,, +5,18199,,,,,,,,,,,,0.08004045486450195,,,,,, +5,18249,,,,,,,,,,,,0.07946014404296875,,,,,, +5,18299,,,,,,,,,,,,0.06891196966171265,,,,,, +5,18349,,,,,,,,,,,,0.07115039229393005,,,,,, +5,18399,,,,,,,,,,,,0.07950921356678009,,,,,, +5,18449,,,,,,,,,,,,0.07943814247846603,,,,,, +5,18499,,,,,,,,,,,,0.0692325234413147,,,,,, +5,18549,,,,,,,,,,,,0.07341261953115463,,,,,, +5,18599,,,,,,,,,,,,0.0689283013343811,,,,,, +5,18649,,,,,,,,,,,,0.0707176923751831,,,,,, +5,18699,,,,,,,,,,,,0.08004654943943024,,,,,, +5,18749,,,,,,,,,,,,0.08186857402324677,,,,,, +5,18799,,,,,,,,,,,,0.06473930180072784,,,,,, +5,18849,,,,,,,,,,,,0.08798378705978394,,,,,, +5,18899,,,,,,,,,,,,0.06581732630729675,,,,,, +5,18949,,,,,,,,,,,,0.06415209174156189,,,,,, +5,18999,,,,,,,,,,,,0.08180642873048782,,,,,, +5,19049,,,,,,,,,,,,0.055445630103349686,,,,,, +5,19099,,,,,,,,,,,,0.07083648443222046,,,,,, +5,19149,,,,,,,,,,,,0.07030196487903595,,,,,, +5,19199,,,,,,,,,,,,0.06767179071903229,,,,,, +5,19249,,,,,,,,,,,,0.07161691784858704,,,,,, +5,19299,,,,,,,,,,,,0.07441247999668121,,,,,, +5,19349,,,,,,,,,,,,0.06582196056842804,,,,,, +5,19399,,,,,,,,,,,,0.07109696418046951,,,,,, +5,19449,,,,,,,,,,,,0.07507729530334473,,,,,, +5,19499,,,,,,,,,,,,0.07814991474151611,,,,,, +5,19549,,,,,,,,,,,,0.06650157272815704,,,,,, +5,19599,,,,,,,,,,,,0.06122551113367081,,,,,, +5,19649,,,,,,,,,,,,0.07057394087314606,,,,,, +5,19699,,,,,,,,,,,,0.08033646643161774,,,,,, +5,19749,,,,,,,,,,,,0.07130424678325653,,,,,, +5,19799,,,,,,,,,,,,0.07698637247085571,,,,,, +5,19849,,,,,,,,,,,,0.07072079181671143,,,,,, +5,19899,,,,,,,,,,,,0.07361794263124466,,,,,, +5,19949,,,,,,,,,,,,0.06876567751169205,,,,,, +5,19999,,,,,,,,,,,,0.07754303514957428,,,,,, +5,20049,,,,,,,,,,,,0.06425917148590088,,,,,, +5,20099,,,,,,,,,,,,0.0801185816526413,,,,,, +5,20149,,,,,,,,,,,,0.0850614607334137,,,,,, +5,20199,,,,,,,,,,,,0.06337118148803711,,,,,, +5,20249,,,,,,,,,,,,0.08575708419084549,,,,,, +5,20299,,,,,,,,,,,,0.0793452039361,,,,,, +5,20349,,,,,,,,,,,,0.07916557788848877,,,,,, +5,20399,,,,,,,,,,,,0.08041810989379883,,,,,, +5,20449,,,,,,,,,,,,0.08061681687831879,,,,,, +5,20499,,,,,,,,,,,,0.07860074192285538,,,,,, +5,20549,,,,,,,,,,,,0.07298313081264496,,,,,, +5,20599,,,,,,,,,,,,0.07049980759620667,,,,,, +5,20649,,,,,,,,,,,,0.07609240710735321,,,,,, +5,20663,,,,,,,,,,,,,0.23880122601985931,0.07780423760414124,0.2524391710758209,0.05878031253814697,0.2224123775959015,0.07780423760414124 +5,20663,,,,,,,0.23113390803337097,0.07430649548768997,0.32593390345573425,0.10582786798477173,0.30472153425216675,,,,,,, +6,20699,,,,,,,,,,,,0.08928091824054718,,,,,, +6,20749,,,,,,,,,,,,0.07340022176504135,,,,,, +6,20799,,,,,,,,,,,,0.07515764981508255,,,,,, +6,20849,,,,,,,,,,,,0.0689876526594162,,,,,, +6,20899,,,,,,,,,,,,0.06141631305217743,,,,,, +6,20949,,,,,,,,,,,,0.07066933065652847,,,,,, +6,20999,,,,,,,,,,,,0.07145285606384277,,,,,, +6,21049,,,,,,,,,,,,0.07189835608005524,,,,,, +6,21099,,,,,,,,,,,,0.06685230135917664,,,,,, +6,21149,,,,,,,,,,,,0.07422100007534027,,,,,, +6,21199,,,,,,,,,,,,0.07855227589607239,,,,,, +6,21249,,,,,,,,,,,,0.07295103371143341,,,,,, +6,21299,,,,,,,,,,,,0.06904996931552887,,,,,, +6,21349,,,,,,,,,,,,0.08018870651721954,,,,,, +6,21399,,,,,,,,,,,,0.07052022963762283,,,,,, +6,21449,,,,,,,,,,,,0.08823685348033905,,,,,, +6,21499,,,,,,,,,,,,0.07031998038291931,,,,,, +6,21549,,,,,,,,,,,,0.06586416065692902,,,,,, +6,21599,,,,,,,,,,,,0.07195982336997986,,,,,, +6,21649,,,,,,,,,,,,0.0773453414440155,,,,,, +6,21699,,,,,,,,,,,,0.07384054362773895,,,,,, +6,21749,,,,,,,,,,,,0.06663502752780914,,,,,, +6,21799,,,,,,,,,,,,0.07562889903783798,,,,,, +6,21849,,,,,,,,,,,,0.07572479546070099,,,,,, +6,21899,,,,,,,,,,,,0.08003640174865723,,,,,, +6,21949,,,,,,,,,,,,0.08072604984045029,,,,,, +6,21999,,,,,,,,,,,,0.06850908696651459,,,,,, +6,22049,,,,,,,,,,,,0.07862904667854309,,,,,, +6,22099,,,,,,,,,,,,0.08039553463459015,,,,,, +6,22149,,,,,,,,,,,,0.07543964684009552,,,,,, +6,22199,,,,,,,,,,,,0.07308809459209442,,,,,, +6,22249,,,,,,,,,,,,0.07795656472444534,,,,,, +6,22299,,,,,,,,,,,,0.07516336441040039,,,,,, +6,22349,,,,,,,,,,,,0.07205470651388168,,,,,, +6,22399,,,,,,,,,,,,0.06918114423751831,,,,,, +6,22449,,,,,,,,,,,,0.0746951699256897,,,,,, +6,22499,,,,,,,,,,,,0.07235268503427505,,,,,, +6,22549,,,,,,,,,,,,0.07439754903316498,,,,,, +6,22599,,,,,,,,,,,,0.06694211810827255,,,,,, +6,22649,,,,,,,,,,,,0.07395660132169724,,,,,, +6,22699,,,,,,,,,,,,0.08263999968767166,,,,,, +6,22749,,,,,,,,,,,,0.0755457654595375,,,,,, +6,22799,,,,,,,,,,,,0.08160106837749481,,,,,, +6,22849,,,,,,,,,,,,0.07824830710887909,,,,,, +6,22899,,,,,,,,,,,,0.0711776465177536,,,,,, +6,22949,,,,,,,,,,,,0.08051151782274246,,,,,, +6,22999,,,,,,,,,,,,0.06805793195962906,,,,,, +6,23049,,,,,,,,,,,,0.07753276079893112,,,,,, +6,23099,,,,,,,,,,,,0.07346384227275848,,,,,, +6,23149,,,,,,,,,,,,0.07524891942739487,,,,,, +6,23199,,,,,,,,,,,,0.0786575973033905,,,,,, +6,23249,,,,,,,,,,,,0.07286986708641052,,,,,, +6,23299,,,,,,,,,,,,0.07326830923557281,,,,,, +6,23349,,,,,,,,,,,,0.0778508186340332,,,,,, +6,23399,,,,,,,,,,,,0.06366999447345734,,,,,, +6,23449,,,,,,,,,,,,0.06630323827266693,,,,,, +6,23499,,,,,,,,,,,,0.06168027222156525,,,,,, +6,23549,,,,,,,,,,,,0.0712631344795227,,,,,, +6,23599,,,,,,,,,,,,0.07370105385780334,,,,,, +6,23649,,,,,,,,,,,,0.0835355594754219,,,,,, +6,23699,,,,,,,,,,,,0.06486767530441284,,,,,, +6,23749,,,,,,,,,,,,0.0732032060623169,,,,,, +6,23799,,,,,,,,,,,,0.06875378638505936,,,,,, +6,23849,,,,,,,,,,,,0.08302399516105652,,,,,, +6,23899,,,,,,,,,,,,0.083696648478508,,,,,, +6,23949,,,,,,,,,,,,0.05972577631473541,,,,,, +6,23999,,,,,,,,,,,,0.09027281403541565,,,,,, +6,24049,,,,,,,,,,,,0.07485055923461914,,,,,, +6,24099,,,,,,,,,,,,0.06267543137073517,,,,,, +6,24107,,,,,,,,,,,,,0.23903167247772217,0.07753147929906845,0.25255393981933594,0.06207996606826782,0.22474926710128784,0.07753147929906845 +6,24107,,,,,,,0.23129424452781677,0.07439035922288895,0.32454535365104675,0.10481369495391846,0.3025727868080139,,,,,,, +7,24149,,,,,,,,,,,,0.06821935623884201,,,,,, +7,24199,,,,,,,,,,,,0.06182783097028732,,,,,, +7,24249,,,,,,,,,,,,0.07574232667684555,,,,,, +7,24299,,,,,,,,,,,,0.05563431233167648,,,,,, +7,24349,,,,,,,,,,,,0.08380033820867538,,,,,, +7,24399,,,,,,,,,,,,0.07821832597255707,,,,,, +7,24449,,,,,,,,,,,,0.06745287775993347,,,,,, +7,24499,,,,,,,,,,,,0.08416400104761124,,,,,, +7,24549,,,,,,,,,,,,0.0777396485209465,,,,,, +7,24599,,,,,,,,,,,,0.06790125370025635,,,,,, +7,24649,,,,,,,,,,,,0.06613793969154358,,,,,, +7,24699,,,,,,,,,,,,0.06032054126262665,,,,,, +7,24749,,,,,,,,,,,,0.08494037389755249,,,,,, +7,24799,,,,,,,,,,,,0.0760345607995987,,,,,, +7,24849,,,,,,,,,,,,0.07915341854095459,,,,,, +7,24899,,,,,,,,,,,,0.07480141520500183,,,,,, +7,24949,,,,,,,,,,,,0.06319382786750793,,,,,, +7,24999,,,,,,,,,,,,0.07264772057533264,,,,,, +7,25049,,,,,,,,,,,,0.07182052731513977,,,,,, +7,25099,,,,,,,,,,,,0.0790758728981018,,,,,, +7,25149,,,,,,,,,,,,0.07861721515655518,,,,,, +7,25199,,,,,,,,,,,,0.08131778985261917,,,,,, +7,25249,,,,,,,,,,,,0.07135285437107086,,,,,, +7,25299,,,,,,,,,,,,0.06710832566022873,,,,,, +7,25349,,,,,,,,,,,,0.06477399170398712,,,,,, +7,25399,,,,,,,,,,,,0.08105698227882385,,,,,, +7,25449,,,,,,,,,,,,0.0832759365439415,,,,,, +7,25499,,,,,,,,,,,,0.07336899638175964,,,,,, +7,25549,,,,,,,,,,,,0.07243094593286514,,,,,, +7,25599,,,,,,,,,,,,0.07380399107933044,,,,,, +7,25649,,,,,,,,,,,,0.06710323691368103,,,,,, +7,25699,,,,,,,,,,,,0.0855136513710022,,,,,, +7,25749,,,,,,,,,,,,0.07697021216154099,,,,,, +7,25799,,,,,,,,,,,,0.06415977329015732,,,,,, +7,25849,,,,,,,,,,,,0.06577853858470917,,,,,, +7,25899,,,,,,,,,,,,0.0741966962814331,,,,,, +7,25949,,,,,,,,,,,,0.064663365483284,,,,,, +7,25999,,,,,,,,,,,,0.07358461618423462,,,,,, +7,26049,,,,,,,,,,,,0.06438930332660675,,,,,, +7,26099,,,,,,,,,,,,0.07984458655118942,,,,,, +7,26149,,,,,,,,,,,,0.09189043939113617,,,,,, +7,26199,,,,,,,,,,,,0.0828637182712555,,,,,, +7,26249,,,,,,,,,,,,0.06533003598451614,,,,,, +7,26299,,,,,,,,,,,,0.07066826522350311,,,,,, +7,26349,,,,,,,,,,,,0.05896008387207985,,,,,, +7,26399,,,,,,,,,,,,0.06949696689844131,,,,,, +7,26449,,,,,,,,,,,,0.0640181303024292,,,,,, +7,26499,,,,,,,,,,,,0.07373617589473724,,,,,, +7,26549,,,,,,,,,,,,0.06682468950748444,,,,,, +7,26599,,,,,,,,,,,,0.0655103400349617,,,,,, +7,26649,,,,,,,,,,,,0.07646186649799347,,,,,, +7,26699,,,,,,,,,,,,0.07682834565639496,,,,,, +7,26749,,,,,,,,,,,,0.09632167965173721,,,,,, +7,26799,,,,,,,,,,,,0.07274028658866882,,,,,, +7,26849,,,,,,,,,,,,0.08249996602535248,,,,,, +7,26899,,,,,,,,,,,,0.07880207896232605,,,,,, +7,26949,,,,,,,,,,,,0.07606515288352966,,,,,, +7,26999,,,,,,,,,,,,0.07857388257980347,,,,,, +7,27049,,,,,,,,,,,,0.07764837890863419,,,,,, +7,27099,,,,,,,,,,,,0.07560211420059204,,,,,, +7,27149,,,,,,,,,,,,0.08896587044000626,,,,,, +7,27199,,,,,,,,,,,,0.07044760882854462,,,,,, +7,27249,,,,,,,,,,,,0.06887125968933105,,,,,, +7,27299,,,,,,,,,,,,0.07970678806304932,,,,,, +7,27349,,,,,,,,,,,,0.07794293761253357,,,,,, +7,27399,,,,,,,,,,,,0.0828537568449974,,,,,, +7,27449,,,,,,,,,,,,0.08093687891960144,,,,,, +7,27499,,,,,,,,,,,,0.07993735373020172,,,,,, +7,27549,,,,,,,,,,,,0.0756666511297226,,,,,, +7,27551,,,,,,,,,,,,,0.24295510351657867,0.08028765767812729,0.24892495572566986,0.02873772382736206,0.2204720824956894,0.08028765767812729 +7,27551,,,,,,,0.231869637966156,0.07480023056268692,0.3174687325954437,0.09988278150558472,0.297053724527359,,,,,,, +8,27599,,,,,,,,,,,,0.09352907538414001,,,,,, +8,27649,,,,,,,,,,,,0.06705130636692047,,,,,, +8,27699,,,,,,,,,,,,0.06199052929878235,,,,,, +8,27749,,,,,,,,,,,,0.07209357619285583,,,,,, +8,27799,,,,,,,,,,,,0.07678769528865814,,,,,, +8,27849,,,,,,,,,,,,0.06666307896375656,,,,,, +8,27899,,,,,,,,,,,,0.07086066901683807,,,,,, +8,27949,,,,,,,,,,,,0.07677486538887024,,,,,, +8,27999,,,,,,,,,,,,0.0695483461022377,,,,,, +8,28049,,,,,,,,,,,,0.07113353908061981,,,,,, +8,28099,,,,,,,,,,,,0.08407101780176163,,,,,, +8,28149,,,,,,,,,,,,0.07493998110294342,,,,,, +8,28199,,,,,,,,,,,,0.07312877476215363,,,,,, +8,28249,,,,,,,,,,,,0.06764209270477295,,,,,, +8,28299,,,,,,,,,,,,0.07304704189300537,,,,,, +8,28349,,,,,,,,,,,,0.07993584871292114,,,,,, +8,28399,,,,,,,,,,,,0.08217950165271759,,,,,, +8,28449,,,,,,,,,,,,0.0820644348859787,,,,,, +8,28499,,,,,,,,,,,,0.06748315691947937,,,,,, +8,28549,,,,,,,,,,,,0.08150716125965118,,,,,, +8,28599,,,,,,,,,,,,0.07635649293661118,,,,,, +8,28649,,,,,,,,,,,,0.08151766657829285,,,,,, +8,28699,,,,,,,,,,,,0.08698031306266785,,,,,, +8,28749,,,,,,,,,,,,0.07948362827301025,,,,,, +8,28799,,,,,,,,,,,,0.0739905834197998,,,,,, +8,28849,,,,,,,,,,,,0.080796018242836,,,,,, +8,28899,,,,,,,,,,,,0.07744802534580231,,,,,, +8,28949,,,,,,,,,,,,0.06493271142244339,,,,,, +8,28999,,,,,,,,,,,,0.08695223927497864,,,,,, +8,29049,,,,,,,,,,,,0.062215473502874374,,,,,, +8,29099,,,,,,,,,,,,0.07662650942802429,,,,,, +8,29149,,,,,,,,,,,,0.07774196565151215,,,,,, +8,29199,,,,,,,,,,,,0.07492442429065704,,,,,, +8,29249,,,,,,,,,,,,0.08540505170822144,,,,,, +8,29299,,,,,,,,,,,,0.0895310640335083,,,,,, +8,29349,,,,,,,,,,,,0.07543036341667175,,,,,, +8,29399,,,,,,,,,,,,0.08777918666601181,,,,,, +8,29449,,,,,,,,,,,,0.0816587507724762,,,,,, +8,29499,,,,,,,,,,,,0.09252241253852844,,,,,, +8,29549,,,,,,,,,,,,0.08092986792325974,,,,,, +8,29599,,,,,,,,,,,,0.0807923898100853,,,,,, +8,29649,,,,,,,,,,,,0.07654182612895966,,,,,, +8,29699,,,,,,,,,,,,0.0798877477645874,,,,,, +8,29749,,,,,,,,,,,,0.07045795768499374,,,,,, +8,29799,,,,,,,,,,,,0.07430396974086761,,,,,, +8,29849,,,,,,,,,,,,0.07239200174808502,,,,,, +8,29899,,,,,,,,,,,,0.07275764644145966,,,,,, +8,29949,,,,,,,,,,,,0.08093376457691193,,,,,, +8,29999,,,,,,,,,,,,0.078457310795784,,,,,, +8,30049,,,,,,,,,,,,0.0656706914305687,,,,,, +8,30099,,,,,,,,,,,,0.07109324634075165,,,,,, +8,30149,,,,,,,,,,,,0.07583577930927277,,,,,, +8,30199,,,,,,,,,,,,0.07568538188934326,,,,,, +8,30249,,,,,,,,,,,,0.08957690745592117,,,,,, +8,30299,,,,,,,,,,,,0.07599285244941711,,,,,, +8,30349,,,,,,,,,,,,0.07128027826547623,,,,,, +8,30399,,,,,,,,,,,,0.08018006384372711,,,,,, +8,30449,,,,,,,,,,,,0.07590439915657043,,,,,, +8,30499,,,,,,,,,,,,0.06572914123535156,,,,,, +8,30549,,,,,,,,,,,,0.06619071960449219,,,,,, +8,30599,,,,,,,,,,,,0.0804009661078453,,,,,, +8,30649,,,,,,,,,,,,0.06871087104082108,,,,,, +8,30699,,,,,,,,,,,,0.07637125253677368,,,,,, +8,30749,,,,,,,,,,,,0.06839088350534439,,,,,, +8,30799,,,,,,,,,,,,0.07600203901529312,,,,,, +8,30849,,,,,,,,,,,,0.0935211181640625,,,,,, +8,30899,,,,,,,,,,,,0.07067406177520752,,,,,, +8,30949,,,,,,,,,,,,0.08603662252426147,,,,,, +8,30995,,,,,,,,,,,,,0.23957006633281708,0.07838496565818787,0.2564278841018677,0.05175513029098511,0.22685980796813965,0.07838496565818787 +8,30995,,,,,,,0.23725706338882446,0.07779493182897568,0.2574937045574188,0.0638422966003418,0.24080884456634521,,,,,,, +9,30999,,,,,,,,,,,,0.07935097813606262,,,,,, +9,31049,,,,,,,,,,,,0.08085977286100388,,,,,, +9,31099,,,,,,,,,,,,0.08321605622768402,,,,,, +9,31149,,,,,,,,,,,,0.07503373920917511,,,,,, +9,31199,,,,,,,,,,,,0.07556959241628647,,,,,, +9,31249,,,,,,,,,,,,0.07067621499300003,,,,,, +9,31299,,,,,,,,,,,,0.07704795897006989,,,,,, +9,31349,,,,,,,,,,,,0.07151079922914505,,,,,, +9,31399,,,,,,,,,,,,0.0704062432050705,,,,,, +9,31449,,,,,,,,,,,,0.07527893781661987,,,,,, +9,31499,,,,,,,,,,,,0.07800087332725525,,,,,, +9,31549,,,,,,,,,,,,0.07131873071193695,,,,,, +9,31599,,,,,,,,,,,,0.07213178277015686,,,,,, +9,31649,,,,,,,,,,,,0.08036834001541138,,,,,, +9,31699,,,,,,,,,,,,0.0715077668428421,,,,,, +9,31749,,,,,,,,,,,,0.07766715437173843,,,,,, +9,31799,,,,,,,,,,,,0.07775361835956573,,,,,, +9,31849,,,,,,,,,,,,0.07335810363292694,,,,,, +9,31899,,,,,,,,,,,,0.0666048675775528,,,,,, +9,31949,,,,,,,,,,,,0.08376972377300262,,,,,, +9,31999,,,,,,,,,,,,0.07274238765239716,,,,,, +9,32049,,,,,,,,,,,,0.07466781139373779,,,,,, +9,32099,,,,,,,,,,,,0.07270248979330063,,,,,, +9,32149,,,,,,,,,,,,0.07308683544397354,,,,,, +9,32199,,,,,,,,,,,,0.084557443857193,,,,,, +9,32249,,,,,,,,,,,,0.07781243324279785,,,,,, +9,32299,,,,,,,,,,,,0.06979437172412872,,,,,, +9,32349,,,,,,,,,,,,0.06836473196744919,,,,,, +9,32399,,,,,,,,,,,,0.07802151143550873,,,,,, +9,32449,,,,,,,,,,,,0.07607010006904602,,,,,, +9,32499,,,,,,,,,,,,0.07731564342975616,,,,,, +9,32549,,,,,,,,,,,,0.07046134769916534,,,,,, +9,32599,,,,,,,,,,,,0.08350064605474472,,,,,, +9,32649,,,,,,,,,,,,0.06315270066261292,,,,,, +9,32699,,,,,,,,,,,,0.07196855545043945,,,,,, +9,32749,,,,,,,,,,,,0.0823560506105423,,,,,, +9,32799,,,,,,,,,,,,0.0694429874420166,,,,,, +9,32849,,,,,,,,,,,,0.08804010599851608,,,,,, +9,32899,,,,,,,,,,,,0.06700072437524796,,,,,, +9,32949,,,,,,,,,,,,0.06998849660158157,,,,,, +9,32999,,,,,,,,,,,,0.07698211073875427,,,,,, +9,33049,,,,,,,,,,,,0.0899963229894638,,,,,, +9,33099,,,,,,,,,,,,0.08154608309268951,,,,,, +9,33149,,,,,,,,,,,,0.08141663670539856,,,,,, +9,33199,,,,,,,,,,,,0.08251013606786728,,,,,, +9,33249,,,,,,,,,,,,0.06722376495599747,,,,,, +9,33299,,,,,,,,,,,,0.07459921389818192,,,,,, +9,33349,,,,,,,,,,,,0.08081427216529846,,,,,, +9,33399,,,,,,,,,,,,0.07818853110074997,,,,,, +9,33449,,,,,,,,,,,,0.06919051706790924,,,,,, +9,33499,,,,,,,,,,,,0.051763083785772324,,,,,, +9,33549,,,,,,,,,,,,0.0806107297539711,,,,,, +9,33599,,,,,,,,,,,,0.06686672568321228,,,,,, +9,33649,,,,,,,,,,,,0.08641350269317627,,,,,, +9,33699,,,,,,,,,,,,0.08464773744344711,,,,,, +9,33749,,,,,,,,,,,,0.07071947306394577,,,,,, +9,33799,,,,,,,,,,,,0.06648489087820053,,,,,, +9,33849,,,,,,,,,,,,0.07696572691202164,,,,,, +9,33899,,,,,,,,,,,,0.07225234806537628,,,,,, +9,33949,,,,,,,,,,,,0.06080783158540726,,,,,, +9,33999,,,,,,,,,,,,0.07642945647239685,,,,,, +9,34049,,,,,,,,,,,,0.079920694231987,,,,,, +9,34099,,,,,,,,,,,,0.07518017292022705,,,,,, +9,34149,,,,,,,,,,,,0.08056750893592834,,,,,, +9,34199,,,,,,,,,,,,0.0656508207321167,,,,,, +9,34249,,,,,,,,,,,,0.08898759633302689,,,,,, +9,34299,,,,,,,,,,,,0.07807700335979462,,,,,, +9,34349,,,,,,,,,,,,0.06982141733169556,,,,,, +9,34399,,,,,,,,,,,,0.09263007342815399,,,,,, +9,34439,,,,,,,,,,,,,0.238529771566391,0.07788662612438202,0.26746422052383423,0.057783663272857666,0.23444944620132446,0.07788662612438202 +9,34439,,,,,,,0.23215337097644806,0.07484579086303711,0.3164164125919342,0.0993238091468811,0.29888081550598145,,,,,,, +10,34449,,,,,,,,,,,,0.07870007306337357,,,,,, +10,34499,,,,,,,,,,,,0.08382941782474518,,,,,, +10,34549,,,,,,,,,,,,0.0972401350736618,,,,,, +10,34599,,,,,,,,,,,,0.09127465635538101,,,,,, +10,34649,,,,,,,,,,,,0.07265684008598328,,,,,, +10,34699,,,,,,,,,,,,0.06533234566450119,,,,,, +10,34749,,,,,,,,,,,,0.08044813573360443,,,,,, +10,34799,,,,,,,,,,,,0.08227001130580902,,,,,, +10,34849,,,,,,,,,,,,0.07617004960775375,,,,,, +10,34899,,,,,,,,,,,,0.07711931318044662,,,,,, +10,34949,,,,,,,,,,,,0.07732446491718292,,,,,, +10,34999,,,,,,,,,,,,0.08213531970977783,,,,,, +10,35049,,,,,,,,,,,,0.08569642901420593,,,,,, +10,35099,,,,,,,,,,,,0.07168211042881012,,,,,, +10,35149,,,,,,,,,,,,0.081041119992733,,,,,, +10,35199,,,,,,,,,,,,0.0736583024263382,,,,,, +10,35249,,,,,,,,,,,,0.07382264733314514,,,,,, +10,35299,,,,,,,,,,,,0.07496608793735504,,,,,, +10,35349,,,,,,,,,,,,0.0766865611076355,,,,,, +10,35399,,,,,,,,,,,,0.08337000757455826,,,,,, +10,35449,,,,,,,,,,,,0.06969217211008072,,,,,, +10,35499,,,,,,,,,,,,0.07115636765956879,,,,,, +10,35549,,,,,,,,,,,,0.0781039446592331,,,,,, +10,35599,,,,,,,,,,,,0.06485351920127869,,,,,, +10,35649,,,,,,,,,,,,0.06781351566314697,,,,,, +10,35699,,,,,,,,,,,,0.06683272123336792,,,,,, +10,35749,,,,,,,,,,,,0.07410522550344467,,,,,, +10,35799,,,,,,,,,,,,0.07410362362861633,,,,,, +10,35849,,,,,,,,,,,,0.07404190301895142,,,,,, +10,35899,,,,,,,,,,,,0.07836523652076721,,,,,, +10,35949,,,,,,,,,,,,0.07645511627197266,,,,,, +10,35999,,,,,,,,,,,,0.07947683334350586,,,,,, +10,36049,,,,,,,,,,,,0.06556987762451172,,,,,, +10,36099,,,,,,,,,,,,0.0747276246547699,,,,,, +10,36149,,,,,,,,,,,,0.08733565360307693,,,,,, +10,36199,,,,,,,,,,,,0.0874229297041893,,,,,, +10,36249,,,,,,,,,,,,0.05842733755707741,,,,,, +10,36299,,,,,,,,,,,,0.08284547179937363,,,,,, +10,36349,,,,,,,,,,,,0.07357074320316315,,,,,, +10,36399,,,,,,,,,,,,0.06656928360462189,,,,,, +10,36449,,,,,,,,,,,,0.06811846047639847,,,,,, +10,36499,,,,,,,,,,,,0.08247815072536469,,,,,, +10,36549,,,,,,,,,,,,0.06931266188621521,,,,,, +10,36599,,,,,,,,,,,,0.07043188810348511,,,,,, +10,36649,,,,,,,,,,,,0.071569062769413,,,,,, +10,36699,,,,,,,,,,,,0.07056211680173874,,,,,, +10,36749,,,,,,,,,,,,0.07668764144182205,,,,,, +10,36799,,,,,,,,,,,,0.07914423942565918,,,,,, +10,36849,,,,,,,,,,,,0.07434047758579254,,,,,, +10,36899,,,,,,,,,,,,0.08252303302288055,,,,,, +10,36949,,,,,,,,,,,,0.08332875370979309,,,,,, +10,36999,,,,,,,,,,,,0.08195950090885162,,,,,, +10,37049,,,,,,,,,,,,0.08412467688322067,,,,,, +10,37099,,,,,,,,,,,,0.06674392521381378,,,,,, +10,37149,,,,,,,,,,,,0.06991582363843918,,,,,, +10,37199,,,,,,,,,,,,0.07378924638032913,,,,,, +10,37249,,,,,,,,,,,,0.07462325692176819,,,,,, +10,37299,,,,,,,,,,,,0.08177760243415833,,,,,, +10,37349,,,,,,,,,,,,0.0703217163681984,,,,,, +10,37399,,,,,,,,,,,,0.06997717916965485,,,,,, +10,37449,,,,,,,,,,,,0.08190342783927917,,,,,, +10,37499,,,,,,,,,,,,0.06850199401378632,,,,,, +10,37549,,,,,,,,,,,,0.07015389204025269,,,,,, +10,37599,,,,,,,,,,,,0.0719418153166771,,,,,, +10,37649,,,,,,,,,,,,0.06961255520582199,,,,,, +10,37699,,,,,,,,,,,,0.07378070056438446,,,,,, +10,37749,,,,,,,,,,,,0.07499551773071289,,,,,, +10,37799,,,,,,,,,,,,0.0718759223818779,,,,,, +10,37849,,,,,,,,,,,,0.07456302642822266,,,,,, +10,37883,,,,,,,,,,,,,0.23766589164733887,0.07710925489664078,0.25967463850975037,0.06718772649765015,0.22793138027191162,0.07710925489664078 +10,37883,,,,,,,0.2333901971578598,0.07559224963188171,0.3027757704257965,0.09035289287567139,0.2819746136665344,,,,,,, +11,37899,,,,,,,,,,,,0.06044182553887367,,,,,, +11,37949,,,,,,,,,,,,0.076742023229599,,,,,, +11,37999,,,,,,,,,,,,0.07756134122610092,,,,,, +11,38049,,,,,,,,,,,,0.07391650974750519,,,,,, +11,38099,,,,,,,,,,,,0.08950619399547577,,,,,, +11,38149,,,,,,,,,,,,0.07375594973564148,,,,,, +11,38199,,,,,,,,,,,,0.07382906973361969,,,,,, +11,38249,,,,,,,,,,,,0.09279394894838333,,,,,, +11,38299,,,,,,,,,,,,0.06809037923812866,,,,,, +11,38349,,,,,,,,,,,,0.07697301357984543,,,,,, +11,38399,,,,,,,,,,,,0.08433598279953003,,,,,, +11,38449,,,,,,,,,,,,0.06075838953256607,,,,,, +11,38499,,,,,,,,,,,,0.08942578732967377,,,,,, +11,38549,,,,,,,,,,,,0.07405981421470642,,,,,, +11,38599,,,,,,,,,,,,0.067722387611866,,,,,, +11,38649,,,,,,,,,,,,0.0674314945936203,,,,,, +11,38699,,,,,,,,,,,,0.07587514072656631,,,,,, +11,38749,,,,,,,,,,,,0.07224033027887344,,,,,, +11,38799,,,,,,,,,,,,0.07401686906814575,,,,,, +11,38849,,,,,,,,,,,,0.07207206636667252,,,,,, +11,38899,,,,,,,,,,,,0.062231943011283875,,,,,, +11,38949,,,,,,,,,,,,0.08425307273864746,,,,,, +11,38999,,,,,,,,,,,,0.08236309140920639,,,,,, +11,39049,,,,,,,,,,,,0.07842539250850677,,,,,, +11,39099,,,,,,,,,,,,0.07013505697250366,,,,,, +11,39149,,,,,,,,,,,,0.07236748933792114,,,,,, +11,39199,,,,,,,,,,,,0.07951386272907257,,,,,, +11,39249,,,,,,,,,,,,0.07537965476512909,,,,,, +11,39299,,,,,,,,,,,,0.07586125284433365,,,,,, +11,39349,,,,,,,,,,,,0.06574006378650665,,,,,, +11,39399,,,,,,,,,,,,0.07558511197566986,,,,,, +11,39449,,,,,,,,,,,,0.07320268452167511,,,,,, +11,39499,,,,,,,,,,,,0.06686428189277649,,,,,, +11,39549,,,,,,,,,,,,0.07054167240858078,,,,,, +11,39599,,,,,,,,,,,,0.07737962901592255,,,,,, +11,39649,,,,,,,,,,,,0.06865697354078293,,,,,, +11,39699,,,,,,,,,,,,0.07140891253948212,,,,,, +11,39749,,,,,,,,,,,,0.09030526131391525,,,,,, +11,39799,,,,,,,,,,,,0.07738877832889557,,,,,, +11,39849,,,,,,,,,,,,0.06626516580581665,,,,,, +11,39899,,,,,,,,,,,,0.07152187824249268,,,,,, +11,39949,,,,,,,,,,,,0.08090722560882568,,,,,, +11,39999,,,,,,,,,,,,0.06867870688438416,,,,,, +11,40049,,,,,,,,,,,,0.07316221296787262,,,,,, +11,40099,,,,,,,,,,,,0.07284843921661377,,,,,, +11,40149,,,,,,,,,,,,0.07103332132101059,,,,,, +11,40199,,,,,,,,,,,,0.08101959526538849,,,,,, +11,40249,,,,,,,,,,,,0.07758885622024536,,,,,, +11,40299,,,,,,,,,,,,0.07381764054298401,,,,,, +11,40349,,,,,,,,,,,,0.06959269940853119,,,,,, +11,40399,,,,,,,,,,,,0.06624814122915268,,,,,, +11,40449,,,,,,,,,,,,0.07408026605844498,,,,,, +11,40499,,,,,,,,,,,,0.07266567647457123,,,,,, +11,40549,,,,,,,,,,,,0.08935912698507309,,,,,, +11,40599,,,,,,,,,,,,0.06789868324995041,,,,,, +11,40649,,,,,,,,,,,,0.0774027556180954,,,,,, +11,40699,,,,,,,,,,,,0.07359124720096588,,,,,, +11,40749,,,,,,,,,,,,0.07688380777835846,,,,,, +11,40799,,,,,,,,,,,,0.08302316069602966,,,,,, +11,40849,,,,,,,,,,,,0.07323218137025833,,,,,, +11,40899,,,,,,,,,,,,0.07791930437088013,,,,,, +11,40949,,,,,,,,,,,,0.07625339925289154,,,,,, +11,40999,,,,,,,,,,,,0.07350721210241318,,,,,, +11,41049,,,,,,,,,,,,0.072260782122612,,,,,, +11,41099,,,,,,,,,,,,0.06940601766109467,,,,,, +11,41149,,,,,,,,,,,,0.08649936318397522,,,,,, +11,41199,,,,,,,,,,,,0.06732355058193207,,,,,, +11,41249,,,,,,,,,,,,0.08738768100738525,,,,,, +11,41299,,,,,,,,,,,,0.07425779849290848,,,,,, +11,41327,,,,,,,,,,,,,0.23899419605731964,0.07724589109420776,0.26429465413093567,0.06553483009338379,0.23190990090370178,0.07724589109420776 +11,41327,,,,,,,0.23238717019557953,0.07496029138565063,0.3143549859523773,0.09795182943344116,0.29494261741638184,,,,,,, +12,41349,,,,,,,,,,,,0.0629057064652443,,,,,, +12,41399,,,,,,,,,,,,0.07528437674045563,,,,,, +12,41449,,,,,,,,,,,,0.07663076370954514,,,,,, +12,41499,,,,,,,,,,,,0.08022484183311462,,,,,, +12,41549,,,,,,,,,,,,0.07255515456199646,,,,,, +12,41599,,,,,,,,,,,,0.08017706871032715,,,,,, +12,41649,,,,,,,,,,,,0.07743170857429504,,,,,, +12,41699,,,,,,,,,,,,0.08177320659160614,,,,,, +12,41749,,,,,,,,,,,,0.06145848333835602,,,,,, +12,41799,,,,,,,,,,,,0.06813328713178635,,,,,, +12,41849,,,,,,,,,,,,0.07582930475473404,,,,,, +12,41899,,,,,,,,,,,,0.0822136178612709,,,,,, +12,41949,,,,,,,,,,,,0.061654992401599884,,,,,, +12,41999,,,,,,,,,,,,0.07729296386241913,,,,,, +12,42049,,,,,,,,,,,,0.07061941921710968,,,,,, +12,42099,,,,,,,,,,,,0.06273822486400604,,,,,, +12,42149,,,,,,,,,,,,0.07123368978500366,,,,,, +12,42199,,,,,,,,,,,,0.07582460343837738,,,,,, +12,42249,,,,,,,,,,,,0.07669942080974579,,,,,, +12,42299,,,,,,,,,,,,0.07325844466686249,,,,,, +12,42349,,,,,,,,,,,,0.06543035060167313,,,,,, +12,42399,,,,,,,,,,,,0.06738677620887756,,,,,, +12,42449,,,,,,,,,,,,0.07885477691888809,,,,,, +12,42499,,,,,,,,,,,,0.056307125836610794,,,,,, +12,42549,,,,,,,,,,,,0.07673990726470947,,,,,, +12,42599,,,,,,,,,,,,0.06726646423339844,,,,,, +12,42649,,,,,,,,,,,,0.06900103390216827,,,,,, +12,42699,,,,,,,,,,,,0.07075560092926025,,,,,, +12,42749,,,,,,,,,,,,0.07978445291519165,,,,,, +12,42799,,,,,,,,,,,,0.07235634326934814,,,,,, +12,42849,,,,,,,,,,,,0.06600929796695709,,,,,, +12,42899,,,,,,,,,,,,0.07399053126573563,,,,,, +12,42949,,,,,,,,,,,,0.06653684377670288,,,,,, +12,42999,,,,,,,,,,,,0.0779159665107727,,,,,, +12,43049,,,,,,,,,,,,0.09126060456037521,,,,,, +12,43099,,,,,,,,,,,,0.06667015701532364,,,,,, +12,43149,,,,,,,,,,,,0.08128520846366882,,,,,, +12,43199,,,,,,,,,,,,0.08833859860897064,,,,,, +12,43249,,,,,,,,,,,,0.07541988790035248,,,,,, +12,43299,,,,,,,,,,,,0.06691093742847443,,,,,, +12,43349,,,,,,,,,,,,0.06718862056732178,,,,,, +12,43399,,,,,,,,,,,,0.08208893984556198,,,,,, +12,43449,,,,,,,,,,,,0.07716868817806244,,,,,, +12,43499,,,,,,,,,,,,0.06938794255256653,,,,,, +12,43549,,,,,,,,,,,,0.0743134394288063,,,,,, +12,43599,,,,,,,,,,,,0.0638798251748085,,,,,, +12,43649,,,,,,,,,,,,0.07610055804252625,,,,,, +12,43699,,,,,,,,,,,,0.07121104747056961,,,,,, +12,43749,,,,,,,,,,,,0.08513942360877991,,,,,, +12,43799,,,,,,,,,,,,0.07865013927221298,,,,,, +12,43849,,,,,,,,,,,,0.06860534846782684,,,,,, +12,43899,,,,,,,,,,,,0.08014611899852753,,,,,, +12,43949,,,,,,,,,,,,0.07491317391395569,,,,,, +12,43999,,,,,,,,,,,,0.06969825178384781,,,,,, +12,44049,,,,,,,,,,,,0.06979402899742126,,,,,, +12,44099,,,,,,,,,,,,0.07167630642652512,,,,,, +12,44149,,,,,,,,,,,,0.07039017975330353,,,,,, +12,44199,,,,,,,,,,,,0.06787782907485962,,,,,, +12,44249,,,,,,,,,,,,0.0708470344543457,,,,,, +12,44299,,,,,,,,,,,,0.06886552274227142,,,,,, +12,44349,,,,,,,,,,,,0.07834191620349884,,,,,, +12,44399,,,,,,,,,,,,0.07907874882221222,,,,,, +12,44449,,,,,,,,,,,,0.07278461754322052,,,,,, +12,44499,,,,,,,,,,,,0.07054562866687775,,,,,, +12,44549,,,,,,,,,,,,0.07946957647800446,,,,,, +12,44599,,,,,,,,,,,,0.07611577957868576,,,,,, +12,44649,,,,,,,,,,,,0.06663627922534943,,,,,, +12,44699,,,,,,,,,,,,0.08469991385936737,,,,,, +12,44749,,,,,,,,,,,,0.08470246195793152,,,,,, +12,44771,,,,,,,,,,,,,0.24838589131832123,0.08311378210783005,nan,-0.005450725555419922,0.1387290060520172,0.08311378210783005 +12,44771,,,,,,,0.23280082643032074,0.07532978802919388,0.3077637255191803,0.09350627660751343,0.29337605834007263,,,,,,, +13,44799,,,,,,,,,,,,0.0826166570186615,,,,,, +13,44849,,,,,,,,,,,,0.07565662264823914,,,,,, +13,44899,,,,,,,,,,,,0.07603619992733002,,,,,, +13,44949,,,,,,,,,,,,0.08061449229717255,,,,,, +13,44999,,,,,,,,,,,,0.07657749950885773,,,,,, +13,45049,,,,,,,,,,,,0.07598741352558136,,,,,, +13,45099,,,,,,,,,,,,0.07947024703025818,,,,,, +13,45149,,,,,,,,,,,,0.07083147764205933,,,,,, +13,45199,,,,,,,,,,,,0.06063251197338104,,,,,, +13,45249,,,,,,,,,,,,0.07756708562374115,,,,,, +13,45299,,,,,,,,,,,,0.08299064636230469,,,,,, +13,45349,,,,,,,,,,,,0.08265060186386108,,,,,, +13,45399,,,,,,,,,,,,0.08389806747436523,,,,,, +13,45449,,,,,,,,,,,,0.08254764974117279,,,,,, +13,45499,,,,,,,,,,,,0.07820442318916321,,,,,, +13,45549,,,,,,,,,,,,0.06710579246282578,,,,,, +13,45599,,,,,,,,,,,,0.08441023528575897,,,,,, +13,45649,,,,,,,,,,,,0.07942595332860947,,,,,, +13,45699,,,,,,,,,,,,0.073869988322258,,,,,, +13,45749,,,,,,,,,,,,0.075589619576931,,,,,, +13,45799,,,,,,,,,,,,0.08062824606895447,,,,,, +13,45849,,,,,,,,,,,,0.0689711645245552,,,,,, +13,45899,,,,,,,,,,,,0.06919629871845245,,,,,, +13,45949,,,,,,,,,,,,0.060142774134874344,,,,,, +13,45999,,,,,,,,,,,,0.07156486809253693,,,,,, +13,46049,,,,,,,,,,,,0.07028579711914062,,,,,, +13,46099,,,,,,,,,,,,0.07663501054048538,,,,,, +13,46149,,,,,,,,,,,,0.07885725796222687,,,,,, +13,46199,,,,,,,,,,,,0.07215890288352966,,,,,, +13,46249,,,,,,,,,,,,0.07505257427692413,,,,,, +13,46299,,,,,,,,,,,,0.07273983955383301,,,,,, +13,46349,,,,,,,,,,,,0.07354656606912613,,,,,, +13,46399,,,,,,,,,,,,0.07281780242919922,,,,,, +13,46449,,,,,,,,,,,,0.06684787571430206,,,,,, +13,46499,,,,,,,,,,,,0.07997176051139832,,,,,, +13,46549,,,,,,,,,,,,0.08020006120204926,,,,,, +13,46599,,,,,,,,,,,,0.07384524494409561,,,,,, +13,46649,,,,,,,,,,,,0.07636334002017975,,,,,, +13,46699,,,,,,,,,,,,0.07150286436080933,,,,,, +13,46749,,,,,,,,,,,,0.06912888586521149,,,,,, +13,46799,,,,,,,,,,,,0.0781073197722435,,,,,, +13,46849,,,,,,,,,,,,0.08154875785112381,,,,,, +13,46899,,,,,,,,,,,,0.06906796991825104,,,,,, +13,46949,,,,,,,,,,,,0.08002321422100067,,,,,, +13,46999,,,,,,,,,,,,0.0606592521071434,,,,,, +13,47049,,,,,,,,,,,,0.070370152592659,,,,,, +13,47099,,,,,,,,,,,,0.06955539435148239,,,,,, +13,47149,,,,,,,,,,,,0.08160611242055893,,,,,, +13,47199,,,,,,,,,,,,0.07062430679798126,,,,,, +13,47249,,,,,,,,,,,,0.0700995996594429,,,,,, +13,47299,,,,,,,,,,,,0.07619860768318176,,,,,, +13,47349,,,,,,,,,,,,0.07652167230844498,,,,,, +13,47399,,,,,,,,,,,,0.06985007226467133,,,,,, +13,47449,,,,,,,,,,,,0.07664021849632263,,,,,, +13,47499,,,,,,,,,,,,0.08312386274337769,,,,,, +13,47549,,,,,,,,,,,,0.07256698608398438,,,,,, +13,47599,,,,,,,,,,,,0.07158385217189789,,,,,, +13,47649,,,,,,,,,,,,0.06747646629810333,,,,,, +13,47699,,,,,,,,,,,,0.08659615367650986,,,,,, +13,47749,,,,,,,,,,,,0.06805524230003357,,,,,, +13,47799,,,,,,,,,,,,0.0780596137046814,,,,,, +13,47849,,,,,,,,,,,,0.068470299243927,,,,,, +13,47899,,,,,,,,,,,,0.06399916112422943,,,,,, +13,47949,,,,,,,,,,,,0.07529307156801224,,,,,, +13,47999,,,,,,,,,,,,0.07739245891571045,,,,,, +13,48049,,,,,,,,,,,,0.06865915656089783,,,,,, +13,48099,,,,,,,,,,,,0.06205100566148758,,,,,, +13,48149,,,,,,,,,,,,0.08953389525413513,,,,,, +13,48199,,,,,,,,,,,,0.0858246386051178,,,,,, +13,48215,,,,,,,,,,,,,0.24226315319538116,0.07906176894903183,0.2526226341724396,0.04356759786605835,0.23132458329200745,0.07906176894903183 +13,48215,,,,,,,0.23343122005462646,0.07553187012672424,0.30365580320358276,0.09107351303100586,0.28575435280799866,,,,,,, +14,48249,,,,,,,,,,,,0.07999390363693237,,,,,, +14,48299,,,,,,,,,,,,0.07735467702150345,,,,,, +14,48349,,,,,,,,,,,,0.08170540630817413,,,,,, +14,48399,,,,,,,,,,,,0.07635363936424255,,,,,, +14,48449,,,,,,,,,,,,0.07800333946943283,,,,,, +14,48499,,,,,,,,,,,,0.07544828951358795,,,,,, +14,48549,,,,,,,,,,,,0.07752709090709686,,,,,, +14,48599,,,,,,,,,,,,0.06435550004243851,,,,,, +14,48649,,,,,,,,,,,,0.0662989616394043,,,,,, +14,48699,,,,,,,,,,,,0.07673803716897964,,,,,, +14,48749,,,,,,,,,,,,0.08456037193536758,,,,,, +14,48799,,,,,,,,,,,,0.07182151079177856,,,,,, +14,48849,,,,,,,,,,,,0.07110001891851425,,,,,, +14,48899,,,,,,,,,,,,0.06886126101016998,,,,,, +14,48949,,,,,,,,,,,,0.08195163309574127,,,,,, +14,48999,,,,,,,,,,,,0.08472420275211334,,,,,, +14,49049,,,,,,,,,,,,0.09545238316059113,,,,,, +14,49099,,,,,,,,,,,,0.06957713514566422,,,,,, +14,49149,,,,,,,,,,,,0.07297348976135254,,,,,, +14,49199,,,,,,,,,,,,0.07412068545818329,,,,,, +14,49249,,,,,,,,,,,,0.07570391893386841,,,,,, +14,49299,,,,,,,,,,,,0.07752377539873123,,,,,, +14,49349,,,,,,,,,,,,0.06226373091340065,,,,,, +14,49399,,,,,,,,,,,,0.06988562643527985,,,,,, +14,49449,,,,,,,,,,,,0.069163978099823,,,,,, +14,49499,,,,,,,,,,,,0.07486274838447571,,,,,, +14,49549,,,,,,,,,,,,0.07297778129577637,,,,,, +14,49599,,,,,,,,,,,,0.05840066820383072,,,,,, +14,49649,,,,,,,,,,,,0.08354516327381134,,,,,, +14,49699,,,,,,,,,,,,0.0683843344449997,,,,,, +14,49749,,,,,,,,,,,,0.07661056518554688,,,,,, +14,49799,,,,,,,,,,,,0.07412274181842804,,,,,, +14,49849,,,,,,,,,,,,0.07116679847240448,,,,,, +14,49899,,,,,,,,,,,,0.08268245309591293,,,,,, +14,49949,,,,,,,,,,,,0.0821557343006134,,,,,, +14,49999,,,,,,,,,,,,0.09170673787593842,,,,,, +14,50049,,,,,,,,,,,,0.09016802161931992,,,,,, +14,50099,,,,,,,,,,,,0.07095001637935638,,,,,, +14,50149,,,,,,,,,,,,0.07662810385227203,,,,,, +14,50199,,,,,,,,,,,,0.07130414992570877,,,,,, +14,50249,,,,,,,,,,,,0.06515984982252121,,,,,, +14,50299,,,,,,,,,,,,0.08370007574558258,,,,,, +14,50349,,,,,,,,,,,,0.07470834255218506,,,,,, +14,50399,,,,,,,,,,,,0.07204940170049667,,,,,, +14,50449,,,,,,,,,,,,0.08625774085521698,,,,,, +14,50499,,,,,,,,,,,,0.07936590909957886,,,,,, +14,50549,,,,,,,,,,,,0.07521841675043106,,,,,, +14,50599,,,,,,,,,,,,0.06652376055717468,,,,,, +14,50649,,,,,,,,,,,,0.06497927010059357,,,,,, +14,50699,,,,,,,,,,,,0.07356917858123779,,,,,, +14,50749,,,,,,,,,,,,0.07522248476743698,,,,,, +14,50799,,,,,,,,,,,,0.07548681646585464,,,,,, +14,50849,,,,,,,,,,,,0.07531324028968811,,,,,, +14,50899,,,,,,,,,,,,0.0735340341925621,,,,,, +14,50949,,,,,,,,,,,,0.0711754783987999,,,,,, +14,50999,,,,,,,,,,,,0.0674193799495697,,,,,, +14,51049,,,,,,,,,,,,0.08626750111579895,,,,,, +14,51099,,,,,,,,,,,,0.07246410101652145,,,,,, +14,51149,,,,,,,,,,,,0.07579216361045837,,,,,, +14,51199,,,,,,,,,,,,0.0704704225063324,,,,,, +14,51249,,,,,,,,,,,,0.07550585269927979,,,,,, +14,51299,,,,,,,,,,,,0.07365967333316803,,,,,, +14,51349,,,,,,,,,,,,0.08304643630981445,,,,,, +14,51399,,,,,,,,,,,,0.06977111846208572,,,,,, +14,51449,,,,,,,,,,,,0.06862325966358185,,,,,, +14,51499,,,,,,,,,,,,0.06996071338653564,,,,,, +14,51549,,,,,,,,,,,,0.07368732988834381,,,,,, +14,51599,,,,,,,,,,,,0.08270158618688583,,,,,, +14,51649,,,,,,,,,,,,0.07813998311758041,,,,,, +14,51659,,,,,,,,,,,,,0.25034967064857483,0.08475439250469208,nan,-0.02529764175415039,0.006236535031348467,0.08475439250469208 +14,51659,,,,,,,0.23452633619308472,0.07659313082695007,0.2850607633590698,0.07829850912094116,0.2766479551792145,,,,,,, +15,51699,,,,,,,,,,,,0.08757245540618896,,,,,, +15,51749,,,,,,,,,,,,0.09273441135883331,,,,,, +15,51799,,,,,,,,,,,,0.08753268420696259,,,,,, +15,51849,,,,,,,,,,,,0.08331401646137238,,,,,, +15,51899,,,,,,,,,,,,0.08199124038219452,,,,,, +15,51949,,,,,,,,,,,,0.0754190981388092,,,,,, +15,51999,,,,,,,,,,,,0.07219042629003525,,,,,, +15,52049,,,,,,,,,,,,0.08533180505037308,,,,,, +15,52099,,,,,,,,,,,,0.08095189929008484,,,,,, +15,52149,,,,,,,,,,,,0.08749805390834808,,,,,, +15,52199,,,,,,,,,,,,0.0862504094839096,,,,,, +15,52249,,,,,,,,,,,,0.08594951033592224,,,,,, +15,52299,,,,,,,,,,,,0.07027821242809296,,,,,, +15,52349,,,,,,,,,,,,0.07125246524810791,,,,,, +15,52399,,,,,,,,,,,,0.08598436415195465,,,,,, +15,52449,,,,,,,,,,,,0.0983675867319107,,,,,, +15,52499,,,,,,,,,,,,0.08927048742771149,,,,,, +15,52549,,,,,,,,,,,,0.07459104806184769,,,,,, +15,52599,,,,,,,,,,,,0.07441836595535278,,,,,, +15,52649,,,,,,,,,,,,0.07872157543897629,,,,,, +15,52699,,,,,,,,,,,,0.08081135153770447,,,,,, +15,52749,,,,,,,,,,,,0.07928280532360077,,,,,, +15,52799,,,,,,,,,,,,0.08707422018051147,,,,,, +15,52849,,,,,,,,,,,,0.09151142835617065,,,,,, +15,52899,,,,,,,,,,,,0.08656839281320572,,,,,, +15,52949,,,,,,,,,,,,0.08528322726488113,,,,,, +15,52999,,,,,,,,,,,,0.07998771965503693,,,,,, +15,53049,,,,,,,,,,,,0.06944447755813599,,,,,, +15,53099,,,,,,,,,,,,0.07408502697944641,,,,,, +15,53149,,,,,,,,,,,,0.08762813359498978,,,,,, +15,53199,,,,,,,,,,,,0.07098385691642761,,,,,, +15,53249,,,,,,,,,,,,0.0687904804944992,,,,,, +15,53299,,,,,,,,,,,,0.07308966666460037,,,,,, +15,53349,,,,,,,,,,,,0.06602220237255096,,,,,, +15,53399,,,,,,,,,,,,0.08280503749847412,,,,,, +15,53449,,,,,,,,,,,,0.08033941686153412,,,,,, +15,53499,,,,,,,,,,,,0.0740492194890976,,,,,, +15,53549,,,,,,,,,,,,0.07258466631174088,,,,,, +15,53599,,,,,,,,,,,,0.07423503696918488,,,,,, +15,53649,,,,,,,,,,,,0.06999967992305756,,,,,, +15,53699,,,,,,,,,,,,0.08458970487117767,,,,,, +15,53749,,,,,,,,,,,,0.07865587621927261,,,,,, +15,53799,,,,,,,,,,,,0.07459229230880737,,,,,, +15,53849,,,,,,,,,,,,0.08457370847463608,,,,,, +15,53899,,,,,,,,,,,,0.08086568117141724,,,,,, +15,53949,,,,,,,,,,,,0.07900328934192657,,,,,, +15,53999,,,,,,,,,,,,0.09213108569383621,,,,,, +15,54049,,,,,,,,,,,,0.0681760311126709,,,,,, +15,54099,,,,,,,,,,,,0.07200971245765686,,,,,, +15,54149,,,,,,,,,,,,0.08505071699619293,,,,,, +15,54199,,,,,,,,,,,,0.0743945837020874,,,,,, +15,54249,,,,,,,,,,,,0.08525151014328003,,,,,, +15,54299,,,,,,,,,,,,0.08247840404510498,,,,,, +15,54349,,,,,,,,,,,,0.08845173567533493,,,,,, +15,54399,,,,,,,,,,,,0.0760020762681961,,,,,, +15,54449,,,,,,,,,,,,0.06982800364494324,,,,,, +15,54499,,,,,,,,,,,,0.06372077018022537,,,,,, +15,54549,,,,,,,,,,,,0.06977113336324692,,,,,, +15,54599,,,,,,,,,,,,0.06590116024017334,,,,,, +15,54649,,,,,,,,,,,,0.07470595836639404,,,,,, +15,54699,,,,,,,,,,,,0.07840344309806824,,,,,, +15,54749,,,,,,,,,,,,0.07436279952526093,,,,,, +15,54799,,,,,,,,,,,,0.08100047707557678,,,,,, +15,54849,,,,,,,,,,,,0.09914618730545044,,,,,, +15,54899,,,,,,,,,,,,0.08272911608219147,,,,,, +15,54949,,,,,,,,,,,,0.08305630087852478,,,,,, +15,54999,,,,,,,,,,,,0.07698281109333038,,,,,, +15,55049,,,,,,,,,,,,0.07544280588626862,,,,,, +15,55099,,,,,,,,,,,,0.08177394419908524,,,,,, +15,55103,,,,,,,,,,,,,0.24518436193466187,0.0803484246134758,0.2515018582344055,0.028002619743347168,0.21605297923088074,0.0803484246134758 +15,55103,,,,,,,0.24206121265888214,0.08001579344272614,0.20069241523742676,0.03711354732513428,0.1841648519039154,,,,,,, +16,55149,,,,,,,,,,,,0.07324743270874023,,,,,, +16,55199,,,,,,,,,,,,0.08529965579509735,,,,,, +16,55249,,,,,,,,,,,,0.0834314227104187,,,,,, +16,55299,,,,,,,,,,,,0.08236836642026901,,,,,, +16,55349,,,,,,,,,,,,0.07094815373420715,,,,,, +16,55399,,,,,,,,,,,,0.07822032272815704,,,,,, +16,55449,,,,,,,,,,,,0.08085434138774872,,,,,, +16,55499,,,,,,,,,,,,0.07109343260526657,,,,,, +16,55549,,,,,,,,,,,,0.07562588155269623,,,,,, +16,55599,,,,,,,,,,,,0.07878634333610535,,,,,, +16,55649,,,,,,,,,,,,0.08420084416866302,,,,,, +16,55699,,,,,,,,,,,,0.07628984749317169,,,,,, +16,55749,,,,,,,,,,,,0.07882135361433029,,,,,, +16,55799,,,,,,,,,,,,0.07226260006427765,,,,,, +16,55849,,,,,,,,,,,,0.08010120689868927,,,,,, +16,55899,,,,,,,,,,,,0.07049190998077393,,,,,, +16,55949,,,,,,,,,,,,0.08556045591831207,,,,,, +16,55999,,,,,,,,,,,,0.07703739404678345,,,,,, +16,56049,,,,,,,,,,,,0.06989976763725281,,,,,, +16,56099,,,,,,,,,,,,0.07167549431324005,,,,,, +16,56149,,,,,,,,,,,,0.07043112814426422,,,,,, +16,56199,,,,,,,,,,,,0.06911039352416992,,,,,, +16,56249,,,,,,,,,,,,0.07897202670574188,,,,,, +16,56299,,,,,,,,,,,,0.07274818420410156,,,,,, +16,56349,,,,,,,,,,,,0.08245926350355148,,,,,, +16,56399,,,,,,,,,,,,0.08013343811035156,,,,,, +16,56449,,,,,,,,,,,,0.07599924504756927,,,,,, +16,56499,,,,,,,,,,,,0.08745911717414856,,,,,, +16,56549,,,,,,,,,,,,0.07574394345283508,,,,,, +16,56599,,,,,,,,,,,,0.07688754796981812,,,,,, +16,56649,,,,,,,,,,,,0.07029817998409271,,,,,, +16,56699,,,,,,,,,,,,0.08157095313072205,,,,,, +16,56749,,,,,,,,,,,,0.07134789973497391,,,,,, +16,56799,,,,,,,,,,,,0.06590015441179276,,,,,, +16,56849,,,,,,,,,,,,0.06806787103414536,,,,,, +16,56899,,,,,,,,,,,,0.07715652883052826,,,,,, +16,56949,,,,,,,,,,,,0.08234941959381104,,,,,, +16,56999,,,,,,,,,,,,0.07282531261444092,,,,,, +16,57049,,,,,,,,,,,,0.06688724458217621,,,,,, +16,57099,,,,,,,,,,,,0.07554356008768082,,,,,, +16,57149,,,,,,,,,,,,0.08129890263080597,,,,,, +16,57199,,,,,,,,,,,,0.07152760028839111,,,,,, +16,57249,,,,,,,,,,,,0.08362841606140137,,,,,, +16,57299,,,,,,,,,,,,0.0727144405245781,,,,,, +16,57349,,,,,,,,,,,,0.07296598702669144,,,,,, +16,57399,,,,,,,,,,,,0.060194216668605804,,,,,, +16,57449,,,,,,,,,,,,0.0770837590098381,,,,,, +16,57499,,,,,,,,,,,,0.06557895243167877,,,,,, +16,57549,,,,,,,,,,,,0.07751990854740143,,,,,, +16,57599,,,,,,,,,,,,0.06811424344778061,,,,,, +16,57649,,,,,,,,,,,,0.0809267908334732,,,,,, +16,57699,,,,,,,,,,,,0.07588550448417664,,,,,, +16,57749,,,,,,,,,,,,0.0622665174305439,,,,,, +16,57799,,,,,,,,,,,,0.07455634325742722,,,,,, +16,57849,,,,,,,,,,,,0.07543355226516724,,,,,, +16,57899,,,,,,,,,,,,0.07211507856845856,,,,,, +16,57949,,,,,,,,,,,,0.07705263793468475,,,,,, +16,57999,,,,,,,,,,,,0.0870468020439148,,,,,, +16,58049,,,,,,,,,,,,0.09039314836263657,,,,,, +16,58099,,,,,,,,,,,,0.07566684484481812,,,,,, +16,58149,,,,,,,,,,,,0.0790838897228241,,,,,, +16,58199,,,,,,,,,,,,0.07755222916603088,,,,,, +16,58249,,,,,,,,,,,,0.06922100484371185,,,,,, +16,58299,,,,,,,,,,,,0.07514073699712753,,,,,, +16,58349,,,,,,,,,,,,0.06589533388614655,,,,,, +16,58399,,,,,,,,,,,,0.07624603807926178,,,,,, +16,58449,,,,,,,,,,,,0.06273500621318817,,,,,, +16,58499,,,,,,,,,,,,0.0859331339597702,,,,,, +16,58547,,,,,,,,,,,,,0.23719148337841034,0.0770544782280922,0.2637424170970917,0.06785041093826294,0.22913530468940735,0.0770544782280922 +16,58547,,,,,,,0.23287977278232574,0.07513926923274994,0.310794472694397,0.09580355882644653,0.2932833135128021,,,,,,, +17,58549,,,,,,,,,,,,0.07343878597021103,,,,,, +17,58599,,,,,,,,,,,,0.06928100436925888,,,,,, +17,58649,,,,,,,,,,,,0.06894367933273315,,,,,, +17,58699,,,,,,,,,,,,0.08073674142360687,,,,,, +17,58749,,,,,,,,,,,,0.08435185998678207,,,,,, +17,58799,,,,,,,,,,,,0.07051294296979904,,,,,, +17,58849,,,,,,,,,,,,0.06627113372087479,,,,,, +17,58899,,,,,,,,,,,,0.07969402521848679,,,,,, +17,58949,,,,,,,,,,,,0.079784095287323,,,,,, +17,58999,,,,,,,,,,,,0.0757804736495018,,,,,, +17,59049,,,,,,,,,,,,0.07812930643558502,,,,,, +17,59099,,,,,,,,,,,,0.08286114037036896,,,,,, +17,59149,,,,,,,,,,,,0.06675811856985092,,,,,, +17,59199,,,,,,,,,,,,0.06879222393035889,,,,,, +17,59249,,,,,,,,,,,,0.07626138627529144,,,,,, +17,59299,,,,,,,,,,,,0.06901129335165024,,,,,, +17,59349,,,,,,,,,,,,0.06639735400676727,,,,,, +17,59399,,,,,,,,,,,,0.06996192783117294,,,,,, +17,59449,,,,,,,,,,,,0.07061494886875153,,,,,, +17,59499,,,,,,,,,,,,0.05565467104315758,,,,,, +17,59549,,,,,,,,,,,,0.07695171236991882,,,,,, +17,59599,,,,,,,,,,,,0.07090350985527039,,,,,, +17,59649,,,,,,,,,,,,0.06697875261306763,,,,,, +17,59699,,,,,,,,,,,,0.07315472513437271,,,,,, +17,59749,,,,,,,,,,,,0.0715465098619461,,,,,, +17,59799,,,,,,,,,,,,0.07092282176017761,,,,,, +17,59849,,,,,,,,,,,,0.08467110991477966,,,,,, +17,59899,,,,,,,,,,,,0.0786520391702652,,,,,, +17,59949,,,,,,,,,,,,0.0948307067155838,,,,,, +17,59999,,,,,,,,,,,,0.0771389901638031,,,,,, +17,60049,,,,,,,,,,,,0.08219262957572937,,,,,, +17,60099,,,,,,,,,,,,0.07689232379198074,,,,,, +17,60149,,,,,,,,,,,,0.07608690112829208,,,,,, +17,60199,,,,,,,,,,,,0.06690634787082672,,,,,, +17,60249,,,,,,,,,,,,0.07928595691919327,,,,,, +17,60299,,,,,,,,,,,,0.06966003775596619,,,,,, +17,60349,,,,,,,,,,,,0.06535686552524567,,,,,, +17,60399,,,,,,,,,,,,0.06955710053443909,,,,,, +17,60449,,,,,,,,,,,,0.08412341773509979,,,,,, +17,60499,,,,,,,,,,,,0.07987278699874878,,,,,, +17,60549,,,,,,,,,,,,0.06990662217140198,,,,,, +17,60599,,,,,,,,,,,,0.08099402487277985,,,,,, +17,60649,,,,,,,,,,,,0.07541000097990036,,,,,, +17,60699,,,,,,,,,,,,0.06878150254487991,,,,,, +17,60749,,,,,,,,,,,,0.07418493926525116,,,,,, +17,60799,,,,,,,,,,,,0.08298999071121216,,,,,, +17,60849,,,,,,,,,,,,0.07491418719291687,,,,,, +17,60899,,,,,,,,,,,,0.0696282908320427,,,,,, +17,60949,,,,,,,,,,,,0.0787731185555458,,,,,, +17,60999,,,,,,,,,,,,0.0866646021604538,,,,,, +17,61049,,,,,,,,,,,,0.07545856386423111,,,,,, +17,61099,,,,,,,,,,,,0.0719374567270279,,,,,, +17,61149,,,,,,,,,,,,0.06696728616952896,,,,,, +17,61199,,,,,,,,,,,,0.07216885685920715,,,,,, +17,61249,,,,,,,,,,,,0.06706486642360687,,,,,, +17,61299,,,,,,,,,,,,0.07659637182950974,,,,,, +17,61349,,,,,,,,,,,,0.07626116275787354,,,,,, +17,61399,,,,,,,,,,,,0.09084359556436539,,,,,, +17,61449,,,,,,,,,,,,0.07692556828260422,,,,,, +17,61499,,,,,,,,,,,,0.0750795304775238,,,,,, +17,61549,,,,,,,,,,,,0.07854223996400833,,,,,, +17,61599,,,,,,,,,,,,0.08055740594863892,,,,,, +17,61649,,,,,,,,,,,,0.08999297767877579,,,,,, +17,61699,,,,,,,,,,,,0.07952730357646942,,,,,, +17,61749,,,,,,,,,,,,0.07457024604082108,,,,,, +17,61799,,,,,,,,,,,,0.08726609498262405,,,,,, +17,61849,,,,,,,,,,,,0.09053162485361099,,,,,, +17,61899,,,,,,,,,,,,0.09329558908939362,,,,,, +17,61949,,,,,,,,,,,,0.07137352228164673,,,,,, +17,61991,,,,,,,,,,,,,0.23816296458244324,0.07725302875041962,0.2564772069454193,0.06544846296310425,0.22351990640163422,0.07725302875041962 +17,61991,,,,,,,0.23357245326042175,0.07563614845275879,0.30187860131263733,0.08982080221176147,0.28871721029281616,,,,,,, +18,61999,,,,,,,,,,,,0.07569275796413422,,,,,, +18,62049,,,,,,,,,,,,0.08033352345228195,,,,,, +18,62099,,,,,,,,,,,,0.07850510627031326,,,,,, +18,62149,,,,,,,,,,,,0.07668524235486984,,,,,, +18,62199,,,,,,,,,,,,0.08424796164035797,,,,,, +18,62249,,,,,,,,,,,,0.08547285199165344,,,,,, +18,62299,,,,,,,,,,,,0.06527523696422577,,,,,, +18,62349,,,,,,,,,,,,0.0746552050113678,,,,,, +18,62399,,,,,,,,,,,,0.07447163760662079,,,,,, +18,62449,,,,,,,,,,,,0.0756252333521843,,,,,, +18,62499,,,,,,,,,,,,0.06740209460258484,,,,,, +18,62549,,,,,,,,,,,,0.06965183466672897,,,,,, +18,62599,,,,,,,,,,,,0.06925956904888153,,,,,, +18,62649,,,,,,,,,,,,0.09037400782108307,,,,,, +18,62699,,,,,,,,,,,,0.07303997129201889,,,,,, +18,62749,,,,,,,,,,,,0.06759845465421677,,,,,, +18,62799,,,,,,,,,,,,0.06502944231033325,,,,,, +18,62849,,,,,,,,,,,,0.06608068197965622,,,,,, +18,62899,,,,,,,,,,,,0.06589348614215851,,,,,, +18,62949,,,,,,,,,,,,0.06949107348918915,,,,,, +18,62999,,,,,,,,,,,,0.06980443000793457,,,,,, +18,63049,,,,,,,,,,,,0.0774792730808258,,,,,, +18,63099,,,,,,,,,,,,0.07238784432411194,,,,,, +18,63149,,,,,,,,,,,,0.06579557061195374,,,,,, +18,63199,,,,,,,,,,,,0.07203487306833267,,,,,, +18,63249,,,,,,,,,,,,0.08205761015415192,,,,,, +18,63299,,,,,,,,,,,,0.06620319187641144,,,,,, +18,63349,,,,,,,,,,,,0.07781524956226349,,,,,, +18,63399,,,,,,,,,,,,0.062007419764995575,,,,,, +18,63449,,,,,,,,,,,,0.07064211368560791,,,,,, +18,63499,,,,,,,,,,,,0.07000689208507538,,,,,, +18,63549,,,,,,,,,,,,0.08063143491744995,,,,,, +18,63599,,,,,,,,,,,,0.07024173438549042,,,,,, +18,63649,,,,,,,,,,,,0.07341708242893219,,,,,, +18,63699,,,,,,,,,,,,0.06495720148086548,,,,,, +18,63749,,,,,,,,,,,,0.08130386471748352,,,,,, +18,63799,,,,,,,,,,,,0.07632480561733246,,,,,, +18,63849,,,,,,,,,,,,0.0894923210144043,,,,,, +18,63899,,,,,,,,,,,,0.07644084841012955,,,,,, +18,63949,,,,,,,,,,,,0.08125999569892883,,,,,, +18,63999,,,,,,,,,,,,0.09018994122743607,,,,,, +18,64049,,,,,,,,,,,,0.07450169324874878,,,,,, +18,64099,,,,,,,,,,,,0.07790833711624146,,,,,, +18,64149,,,,,,,,,,,,0.07295872271060944,,,,,, +18,64199,,,,,,,,,,,,0.06960609555244446,,,,,, +18,64249,,,,,,,,,,,,0.0736832246184349,,,,,, +18,64299,,,,,,,,,,,,0.09907002747058868,,,,,, +18,64349,,,,,,,,,,,,0.08223114907741547,,,,,, +18,64399,,,,,,,,,,,,0.07608736306428909,,,,,, +18,64449,,,,,,,,,,,,0.08252808451652527,,,,,, +18,64499,,,,,,,,,,,,0.07259231805801392,,,,,, +18,64549,,,,,,,,,,,,0.07186058908700943,,,,,, +18,64599,,,,,,,,,,,,0.06548488140106201,,,,,, +18,64649,,,,,,,,,,,,0.07651515305042267,,,,,, +18,64699,,,,,,,,,,,,0.07124355435371399,,,,,, +18,64749,,,,,,,,,,,,0.08886561542749405,,,,,, +18,64799,,,,,,,,,,,,0.06969128549098969,,,,,, +18,64849,,,,,,,,,,,,0.060484178364276886,,,,,, +18,64899,,,,,,,,,,,,0.09133454412221909,,,,,, +18,64949,,,,,,,,,,,,0.07592891156673431,,,,,, +18,64999,,,,,,,,,,,,0.10139292478561401,,,,,, +18,65049,,,,,,,,,,,,0.08059535920619965,,,,,, +18,65099,,,,,,,,,,,,0.05508501082658768,,,,,, +18,65149,,,,,,,,,,,,0.07646435499191284,,,,,, +18,65199,,,,,,,,,,,,0.06724268943071365,,,,,, +18,65249,,,,,,,,,,,,0.07211117446422577,,,,,, +18,65299,,,,,,,,,,,,0.07412440329790115,,,,,, +18,65349,,,,,,,,,,,,0.06831918656826019,,,,,, +18,65399,,,,,,,,,,,,0.08806519210338593,,,,,, +18,65435,,,,,,,,,,,,,0.2446673959493637,0.08186522126197815,0.2547643184661865,0.00965350866317749,0.22925294935703278,0.08186522126197815 +18,65435,,,,,,,0.23481133580207825,0.07676129788160324,0.2823747992515564,0.07628899812698364,0.2772377133369446,,,,,,, +19,65449,,,,,,,,,,,,0.08906745910644531,,,,,, +19,65499,,,,,,,,,,,,0.08399822562932968,,,,,, +19,65549,,,,,,,,,,,,0.09831491112709045,,,,,, +19,65599,,,,,,,,,,,,0.06639408320188522,,,,,, +19,65649,,,,,,,,,,,,0.09396791458129883,,,,,, +19,65699,,,,,,,,,,,,0.058749958872795105,,,,,, +19,65749,,,,,,,,,,,,0.07673871517181396,,,,,, +19,65799,,,,,,,,,,,,0.08791102468967438,,,,,, +19,65849,,,,,,,,,,,,0.07368659973144531,,,,,, +19,65899,,,,,,,,,,,,0.07993617653846741,,,,,, +19,65949,,,,,,,,,,,,0.07429960370063782,,,,,, +19,65999,,,,,,,,,,,,0.0835755467414856,,,,,, +19,66049,,,,,,,,,,,,0.07512369751930237,,,,,, +19,66099,,,,,,,,,,,,0.06902372092008591,,,,,, +19,66149,,,,,,,,,,,,0.09074895083904266,,,,,, +19,66199,,,,,,,,,,,,0.08927753567695618,,,,,, +19,66249,,,,,,,,,,,,0.06782813370227814,,,,,, +19,66299,,,,,,,,,,,,0.08127332478761673,,,,,, +19,66349,,,,,,,,,,,,0.06772784888744354,,,,,, +19,66399,,,,,,,,,,,,0.0713493824005127,,,,,, +19,66449,,,,,,,,,,,,0.06461948156356812,,,,,, +19,66499,,,,,,,,,,,,0.07774481177330017,,,,,, +19,66549,,,,,,,,,,,,0.07980906218290329,,,,,, +19,66599,,,,,,,,,,,,0.07876689732074738,,,,,, +19,66649,,,,,,,,,,,,0.06959724426269531,,,,,, +19,66699,,,,,,,,,,,,0.07925723493099213,,,,,, +19,66749,,,,,,,,,,,,0.09474343806505203,,,,,, +19,66799,,,,,,,,,,,,0.07573201507329941,,,,,, +19,66849,,,,,,,,,,,,0.06319500505924225,,,,,, +19,66899,,,,,,,,,,,,0.05842708796262741,,,,,, +19,66949,,,,,,,,,,,,0.07810083031654358,,,,,, +19,66999,,,,,,,,,,,,0.08538760244846344,,,,,, +19,67049,,,,,,,,,,,,0.08160863071680069,,,,,, +19,67099,,,,,,,,,,,,0.08190019428730011,,,,,, +19,67149,,,,,,,,,,,,0.06850387901067734,,,,,, +19,67199,,,,,,,,,,,,0.06815965473651886,,,,,, +19,67249,,,,,,,,,,,,0.08253961056470871,,,,,, +19,67299,,,,,,,,,,,,0.08914706110954285,,,,,, +19,67349,,,,,,,,,,,,0.07459478825330734,,,,,, +19,67399,,,,,,,,,,,,0.07171881198883057,,,,,, +19,67449,,,,,,,,,,,,0.07738175243139267,,,,,, +19,67499,,,,,,,,,,,,0.06452283263206482,,,,,, +19,67549,,,,,,,,,,,,0.07751002907752991,,,,,, +19,67599,,,,,,,,,,,,0.05837855488061905,,,,,, +19,67649,,,,,,,,,,,,0.0610431507229805,,,,,, +19,67699,,,,,,,,,,,,0.06925506144762039,,,,,, +19,67749,,,,,,,,,,,,0.0861087292432785,,,,,, +19,67799,,,,,,,,,,,,0.06473377346992493,,,,,, +19,67849,,,,,,,,,,,,0.0712413340806961,,,,,, +19,67899,,,,,,,,,,,,0.07028142362833023,,,,,, +19,67949,,,,,,,,,,,,0.06691902875900269,,,,,, +19,67999,,,,,,,,,,,,0.08317683637142181,,,,,, +19,68049,,,,,,,,,,,,0.08429338783025742,,,,,, +19,68099,,,,,,,,,,,,0.08876444399356842,,,,,, +19,68149,,,,,,,,,,,,0.07400371134281158,,,,,, +19,68199,,,,,,,,,,,,0.08005738258361816,,,,,, +19,68249,,,,,,,,,,,,0.0846535712480545,,,,,, +19,68299,,,,,,,,,,,,0.06183762103319168,,,,,, +19,68349,,,,,,,,,,,,0.0731816291809082,,,,,, +19,68399,,,,,,,,,,,,0.06556317955255508,,,,,, +19,68449,,,,,,,,,,,,0.08101170510053635,,,,,, +19,68499,,,,,,,,,,,,0.07029663771390915,,,,,, +19,68549,,,,,,,,,,,,0.07381688058376312,,,,,, +19,68599,,,,,,,,,,,,0.08339498937129974,,,,,, +19,68649,,,,,,,,,,,,0.06574180722236633,,,,,, +19,68699,,,,,,,,,,,,0.07136452198028564,,,,,, +19,68749,,,,,,,,,,,,0.07249496877193451,,,,,, +19,68799,,,,,,,,,,,,0.07558023929595947,,,,,, +19,68849,,,,,,,,,,,,0.0622028112411499,,,,,, +19,68879,,,,,,,,,,,,,0.23773424327373505,0.07684080302715302,0.26775771379470825,0.0704352855682373,0.24176613986492157,0.07684080302715302 +19,68879,,,,,,,0.2327275574207306,0.07516246289014816,0.31090426445007324,0.09552323818206787,0.29569578170776367,,,,,,, +20,68899,,,,,,,,,,,,0.07345297187566757,,,,,, +20,68949,,,,,,,,,,,,0.07325981557369232,,,,,, +20,68999,,,,,,,,,,,,0.08042920380830765,,,,,, +20,69049,,,,,,,,,,,,0.06591455638408661,,,,,, +20,69099,,,,,,,,,,,,0.07337963581085205,,,,,, +20,69149,,,,,,,,,,,,0.07261815667152405,,,,,, +20,69199,,,,,,,,,,,,0.0713188648223877,,,,,, +20,69249,,,,,,,,,,,,0.0824022889137268,,,,,, +20,69299,,,,,,,,,,,,0.0729704275727272,,,,,, +20,69349,,,,,,,,,,,,0.06720506399869919,,,,,, +20,69399,,,,,,,,,,,,0.07711100578308105,,,,,, +20,69449,,,,,,,,,,,,0.06503617763519287,,,,,, +20,69499,,,,,,,,,,,,0.07351444661617279,,,,,, +20,69549,,,,,,,,,,,,0.06557899713516235,,,,,, +20,69599,,,,,,,,,,,,0.0792551264166832,,,,,, +20,69649,,,,,,,,,,,,0.0613984689116478,,,,,, +20,69699,,,,,,,,,,,,0.07854684442281723,,,,,, +20,69749,,,,,,,,,,,,0.06106527894735336,,,,,, +20,69799,,,,,,,,,,,,0.06791336834430695,,,,,, +20,69849,,,,,,,,,,,,0.06259229779243469,,,,,, +20,69899,,,,,,,,,,,,0.0691804587841034,,,,,, +20,69949,,,,,,,,,,,,0.07704339176416397,,,,,, +20,69999,,,,,,,,,,,,0.07861989736557007,,,,,, +20,70049,,,,,,,,,,,,0.07851586490869522,,,,,, +20,70099,,,,,,,,,,,,0.09495150297880173,,,,,, +20,70149,,,,,,,,,,,,0.07314471155405045,,,,,, +20,70199,,,,,,,,,,,,0.08157312870025635,,,,,, +20,70249,,,,,,,,,,,,0.07675184309482574,,,,,, +20,70299,,,,,,,,,,,,0.07044129073619843,,,,,, +20,70349,,,,,,,,,,,,0.07210154831409454,,,,,, +20,70399,,,,,,,,,,,,0.07941661775112152,,,,,, +20,70449,,,,,,,,,,,,0.06335192173719406,,,,,, +20,70499,,,,,,,,,,,,0.07545974850654602,,,,,, +20,70549,,,,,,,,,,,,0.08242586255073547,,,,,, +20,70599,,,,,,,,,,,,0.08054882287979126,,,,,, +20,70649,,,,,,,,,,,,0.07977598160505295,,,,,, +20,70699,,,,,,,,,,,,0.08326086401939392,,,,,, +20,70749,,,,,,,,,,,,0.07127150148153305,,,,,, +20,70799,,,,,,,,,,,,0.07976692914962769,,,,,, +20,70849,,,,,,,,,,,,0.07138463854789734,,,,,, +20,70899,,,,,,,,,,,,0.07229433953762054,,,,,, +20,70949,,,,,,,,,,,,0.056456711143255234,,,,,, +20,70999,,,,,,,,,,,,0.06454350799322128,,,,,, +20,71049,,,,,,,,,,,,0.07500302791595459,,,,,, +20,71099,,,,,,,,,,,,0.07276702672243118,,,,,, +20,71149,,,,,,,,,,,,0.07094081491231918,,,,,, +20,71199,,,,,,,,,,,,0.0768035501241684,,,,,, +20,71249,,,,,,,,,,,,0.08634783327579498,,,,,, +20,71299,,,,,,,,,,,,0.08381768316030502,,,,,, +20,71349,,,,,,,,,,,,0.078598752617836,,,,,, +20,71399,,,,,,,,,,,,0.07457688450813293,,,,,, +20,71449,,,,,,,,,,,,0.06028003618121147,,,,,, +20,71499,,,,,,,,,,,,0.07082055509090424,,,,,, +20,71549,,,,,,,,,,,,0.08129146695137024,,,,,, +20,71599,,,,,,,,,,,,0.07265173643827438,,,,,, +20,71649,,,,,,,,,,,,0.0617893822491169,,,,,, +20,71699,,,,,,,,,,,,0.07169051468372345,,,,,, +20,71749,,,,,,,,,,,,0.0643298476934433,,,,,, +20,71799,,,,,,,,,,,,0.0696619525551796,,,,,, +20,71849,,,,,,,,,,,,0.07575293630361557,,,,,, +20,71899,,,,,,,,,,,,0.0706094428896904,,,,,, +20,71949,,,,,,,,,,,,0.0795823410153389,,,,,, +20,71999,,,,,,,,,,,,0.06256553530693054,,,,,, +20,72049,,,,,,,,,,,,0.08208344876766205,,,,,, +20,72099,,,,,,,,,,,,0.08273906260728836,,,,,, +20,72149,,,,,,,,,,,,0.06444160640239716,,,,,, +20,72199,,,,,,,,,,,,0.06993991881608963,,,,,, +20,72249,,,,,,,,,,,,0.07764109969139099,,,,,, +20,72299,,,,,,,,,,,,0.07665666937828064,,,,,, +20,72323,,,,,,,,,,,,,0.24802230298519135,0.08215337246656418,nan,0.00616765022277832,0.15421156585216522,0.08215337246656418 +20,72323,,,,,,,0.23005308210849762,0.07363475859165192,0.3381859362125397,0.11390030384063721,0.3236384093761444,,,,,,, +21,72349,,,,,,,,,,,,0.08372907340526581,,,,,, +21,72399,,,,,,,,,,,,0.06594713777303696,,,,,, +21,72449,,,,,,,,,,,,0.07180672138929367,,,,,, +21,72499,,,,,,,,,,,,0.07693252712488174,,,,,, +21,72549,,,,,,,,,,,,0.08289271593093872,,,,,, +21,72599,,,,,,,,,,,,0.07174449414014816,,,,,, +21,72649,,,,,,,,,,,,0.08192233741283417,,,,,, +21,72699,,,,,,,,,,,,0.07515199482440948,,,,,, +21,72749,,,,,,,,,,,,0.07699772715568542,,,,,, +21,72799,,,,,,,,,,,,0.06550249457359314,,,,,, +21,72849,,,,,,,,,,,,0.08020681142807007,,,,,, +21,72899,,,,,,,,,,,,0.06724774837493896,,,,,, +21,72949,,,,,,,,,,,,0.06464532017707825,,,,,, +21,72999,,,,,,,,,,,,0.07613169401884079,,,,,, +21,73049,,,,,,,,,,,,0.07990284264087677,,,,,, +21,73099,,,,,,,,,,,,0.0730694830417633,,,,,, +21,73149,,,,,,,,,,,,0.0793161615729332,,,,,, +21,73199,,,,,,,,,,,,0.07356266677379608,,,,,, +21,73249,,,,,,,,,,,,0.08346696943044662,,,,,, +21,73299,,,,,,,,,,,,0.0624571368098259,,,,,, +21,73349,,,,,,,,,,,,0.07468276470899582,,,,,, +21,73399,,,,,,,,,,,,0.07347491383552551,,,,,, +21,73449,,,,,,,,,,,,0.07518935948610306,,,,,, +21,73499,,,,,,,,,,,,0.06356604397296906,,,,,, +21,73549,,,,,,,,,,,,0.07256067544221878,,,,,, +21,73599,,,,,,,,,,,,0.0716414600610733,,,,,, +21,73649,,,,,,,,,,,,0.07548859715461731,,,,,, +21,73699,,,,,,,,,,,,0.08292710781097412,,,,,, +21,73749,,,,,,,,,,,,0.06697714328765869,,,,,, +21,73799,,,,,,,,,,,,0.07178148627281189,,,,,, +21,73849,,,,,,,,,,,,0.07291945815086365,,,,,, +21,73899,,,,,,,,,,,,0.07875698804855347,,,,,, +21,73949,,,,,,,,,,,,0.06825710833072662,,,,,, +21,73999,,,,,,,,,,,,0.0706225335597992,,,,,, +21,74049,,,,,,,,,,,,0.06162840873003006,,,,,, +21,74099,,,,,,,,,,,,0.07386669516563416,,,,,, +21,74149,,,,,,,,,,,,0.07102104276418686,,,,,, +21,74199,,,,,,,,,,,,0.06609964370727539,,,,,, +21,74249,,,,,,,,,,,,0.07442972809076309,,,,,, +21,74299,,,,,,,,,,,,0.07664540410041809,,,,,, +21,74349,,,,,,,,,,,,0.07430487871170044,,,,,, +21,74399,,,,,,,,,,,,0.07629355788230896,,,,,, +21,74449,,,,,,,,,,,,0.07173465937376022,,,,,, +21,74499,,,,,,,,,,,,0.0645999163389206,,,,,, +21,74549,,,,,,,,,,,,0.06259787082672119,,,,,, +21,74599,,,,,,,,,,,,0.07918144762516022,,,,,, +21,74649,,,,,,,,,,,,0.0612870492041111,,,,,, +21,74699,,,,,,,,,,,,0.0782565250992775,,,,,, +21,74749,,,,,,,,,,,,0.07494519650936127,,,,,, +21,74799,,,,,,,,,,,,0.0815214216709137,,,,,, +21,74849,,,,,,,,,,,,0.07615814357995987,,,,,, +21,74899,,,,,,,,,,,,0.06912634521722794,,,,,, +21,74949,,,,,,,,,,,,0.07440144568681717,,,,,, +21,74999,,,,,,,,,,,,0.08667684346437454,,,,,, +21,75049,,,,,,,,,,,,0.08531642705202103,,,,,, +21,75099,,,,,,,,,,,,0.077828049659729,,,,,, +21,75149,,,,,,,,,,,,0.07111354172229767,,,,,, +21,75199,,,,,,,,,,,,0.08140711486339569,,,,,, +21,75249,,,,,,,,,,,,0.0830879658460617,,,,,, +21,75299,,,,,,,,,,,,0.0798397809267044,,,,,, +21,75349,,,,,,,,,,,,0.07138194143772125,,,,,, +21,75399,,,,,,,,,,,,0.056795112788677216,,,,,, +21,75449,,,,,,,,,,,,0.08194690942764282,,,,,, +21,75499,,,,,,,,,,,,0.07073290646076202,,,,,, +21,75549,,,,,,,,,,,,0.05765453726053238,,,,,, +21,75599,,,,,,,,,,,,0.07554036378860474,,,,,, +21,75649,,,,,,,,,,,,0.08497671782970428,,,,,, +21,75699,,,,,,,,,,,,0.08380703628063202,,,,,, +21,75749,,,,,,,,,,,,0.08455163985490799,,,,,, +21,75767,,,,,,,,,,,,,0.24283437430858612,0.07894410192966461,0.26344001293182373,0.044991135597229004,0.23482927680015564,0.07894410192966461 +21,75767,,,,,,,0.23115374147891998,0.07423165440559387,0.32769620418548584,0.1067204475402832,0.31290411949157715,,,,,,, +22,75799,,,,,,,,,,,,0.06926430016756058,,,,,, +22,75849,,,,,,,,,,,,0.07150861620903015,,,,,, +22,75899,,,,,,,,,,,,0.07573193311691284,,,,,, +22,75949,,,,,,,,,,,,0.07210731506347656,,,,,, +22,75999,,,,,,,,,,,,0.07911476492881775,,,,,, +22,76049,,,,,,,,,,,,0.06646201014518738,,,,,, +22,76099,,,,,,,,,,,,0.0664193406701088,,,,,, +22,76149,,,,,,,,,,,,0.06351563334465027,,,,,, +22,76199,,,,,,,,,,,,0.0677831619977951,,,,,, +22,76249,,,,,,,,,,,,0.06075197458267212,,,,,, +22,76299,,,,,,,,,,,,0.07238974422216415,,,,,, +22,76349,,,,,,,,,,,,0.07095617055892944,,,,,, +22,76399,,,,,,,,,,,,0.07447340339422226,,,,,, +22,76449,,,,,,,,,,,,0.07120435684919357,,,,,, +22,76499,,,,,,,,,,,,0.0777260810136795,,,,,, +22,76549,,,,,,,,,,,,0.06328606605529785,,,,,, +22,76599,,,,,,,,,,,,0.07867403328418732,,,,,, +22,76649,,,,,,,,,,,,0.08622220158576965,,,,,, +22,76699,,,,,,,,,,,,0.07015463709831238,,,,,, +22,76749,,,,,,,,,,,,0.062188711017370224,,,,,, +22,76799,,,,,,,,,,,,0.07591996341943741,,,,,, +22,76849,,,,,,,,,,,,0.07985292375087738,,,,,, +22,76899,,,,,,,,,,,,0.08356474339962006,,,,,, +22,76949,,,,,,,,,,,,0.09094569087028503,,,,,, +22,76999,,,,,,,,,,,,0.06533291935920715,,,,,, +22,77049,,,,,,,,,,,,0.07713956385850906,,,,,, +22,77099,,,,,,,,,,,,0.07911588251590729,,,,,, +22,77149,,,,,,,,,,,,0.07142898440361023,,,,,, +22,77199,,,,,,,,,,,,0.0801105797290802,,,,,, +22,77249,,,,,,,,,,,,0.07917173951864243,,,,,, +22,77299,,,,,,,,,,,,0.08561816066503525,,,,,, +22,77349,,,,,,,,,,,,0.08856409043073654,,,,,, +22,77399,,,,,,,,,,,,0.08083073794841766,,,,,, +22,77449,,,,,,,,,,,,0.08551200479269028,,,,,, +22,77499,,,,,,,,,,,,0.0852409154176712,,,,,, +22,77549,,,,,,,,,,,,0.07596740871667862,,,,,, +22,77599,,,,,,,,,,,,0.06683879345655441,,,,,, +22,77649,,,,,,,,,,,,0.06247180700302124,,,,,, +22,77699,,,,,,,,,,,,0.07979115843772888,,,,,, +22,77749,,,,,,,,,,,,0.08232605457305908,,,,,, +22,77799,,,,,,,,,,,,0.07173099368810654,,,,,, +22,77849,,,,,,,,,,,,0.07042072713375092,,,,,, +22,77899,,,,,,,,,,,,0.08329671621322632,,,,,, +22,77949,,,,,,,,,,,,0.08357957750558853,,,,,, +22,77999,,,,,,,,,,,,0.07444081455469131,,,,,, +22,78049,,,,,,,,,,,,0.07968511432409286,,,,,, +22,78099,,,,,,,,,,,,0.07428380101919174,,,,,, +22,78149,,,,,,,,,,,,0.09381935000419617,,,,,, +22,78199,,,,,,,,,,,,0.06473935395479202,,,,,, +22,78249,,,,,,,,,,,,0.06994850188493729,,,,,, +22,78299,,,,,,,,,,,,0.07889339327812195,,,,,, +22,78349,,,,,,,,,,,,0.08072040230035782,,,,,, +22,78399,,,,,,,,,,,,0.07376447319984436,,,,,, +22,78449,,,,,,,,,,,,0.07268036901950836,,,,,, +22,78499,,,,,,,,,,,,0.07797787338495255,,,,,, +22,78549,,,,,,,,,,,,0.07920848578214645,,,,,, +22,78599,,,,,,,,,,,,0.06822487711906433,,,,,, +22,78649,,,,,,,,,,,,0.07115821540355682,,,,,, +22,78699,,,,,,,,,,,,0.06663024425506592,,,,,, +22,78749,,,,,,,,,,,,0.07378930598497391,,,,,, +22,78799,,,,,,,,,,,,0.07143881916999817,,,,,, +22,78849,,,,,,,,,,,,0.08313469588756561,,,,,, +22,78899,,,,,,,,,,,,0.07322968542575836,,,,,, +22,78949,,,,,,,,,,,,0.062214091420173645,,,,,, +22,78999,,,,,,,,,,,,0.07225491106510162,,,,,, +22,79049,,,,,,,,,,,,0.07368673384189606,,,,,, +22,79099,,,,,,,,,,,,0.09007599949836731,,,,,, +22,79149,,,,,,,,,,,,0.07779775559902191,,,,,, +22,79199,,,,,,,,,,,,0.0715462863445282,,,,,, +22,79211,,,,,,,,,,,,,0.24090228974819183,0.07869739830493927,0.26686325669288635,0.04797554016113281,0.23879987001419067,0.07869739830493927 +22,79211,,,,,,,0.2334609478712082,0.0755520910024643,0.30321723222732544,0.09084254503250122,0.29215195775032043,,,,,,, +23,79249,,,,,,,,,,,,0.06967848539352417,,,,,, +23,79299,,,,,,,,,,,,0.07297782599925995,,,,,, +23,79349,,,,,,,,,,,,0.07096081972122192,,,,,, +23,79399,,,,,,,,,,,,0.07290203869342804,,,,,, +23,79449,,,,,,,,,,,,0.06840361654758453,,,,,, +23,79499,,,,,,,,,,,,0.07006767392158508,,,,,, +23,79549,,,,,,,,,,,,0.07579531520605087,,,,,, +23,79599,,,,,,,,,,,,0.07050512731075287,,,,,, +23,79649,,,,,,,,,,,,0.056127384305000305,,,,,, +23,79699,,,,,,,,,,,,0.07030268758535385,,,,,, +23,79749,,,,,,,,,,,,0.0689179077744484,,,,,, +23,79799,,,,,,,,,,,,0.0781179666519165,,,,,, +23,79849,,,,,,,,,,,,0.07062257826328278,,,,,, +23,79899,,,,,,,,,,,,0.054663240909576416,,,,,, +23,79949,,,,,,,,,,,,0.07855276018381119,,,,,, +23,79999,,,,,,,,,,,,0.071865014731884,,,,,, +23,80049,,,,,,,,,,,,0.08007312566041946,,,,,, +23,80099,,,,,,,,,,,,0.05994846671819687,,,,,, +23,80149,,,,,,,,,,,,0.07487714290618896,,,,,, +23,80199,,,,,,,,,,,,0.08078154921531677,,,,,, +23,80249,,,,,,,,,,,,0.07041828334331512,,,,,, +23,80299,,,,,,,,,,,,0.06495469063520432,,,,,, +23,80349,,,,,,,,,,,,0.06375338137149811,,,,,, +23,80399,,,,,,,,,,,,0.08023391664028168,,,,,, +23,80449,,,,,,,,,,,,0.08568321168422699,,,,,, +23,80499,,,,,,,,,,,,0.06476856768131256,,,,,, +23,80549,,,,,,,,,,,,0.056578926742076874,,,,,, +23,80599,,,,,,,,,,,,0.06187792494893074,,,,,, +23,80649,,,,,,,,,,,,0.058111753314733505,,,,,, +23,80699,,,,,,,,,,,,0.055619873106479645,,,,,, +23,80749,,,,,,,,,,,,0.06661560386419296,,,,,, +23,80799,,,,,,,,,,,,0.060741838067770004,,,,,, +23,80849,,,,,,,,,,,,0.0852339044213295,,,,,, +23,80899,,,,,,,,,,,,0.08611879497766495,,,,,, +23,80949,,,,,,,,,,,,0.11943595856428146,,,,,, +23,80999,,,,,,,,,,,,0.09197191894054413,,,,,, +23,81049,,,,,,,,,,,,0.07809646427631378,,,,,, +23,81099,,,,,,,,,,,,0.0799475684762001,,,,,, +23,81149,,,,,,,,,,,,0.08560876548290253,,,,,, +23,81199,,,,,,,,,,,,0.0793781653046608,,,,,, +23,81249,,,,,,,,,,,,0.07859329134225845,,,,,, +23,81299,,,,,,,,,,,,0.08217132091522217,,,,,, +23,81349,,,,,,,,,,,,0.07656322419643402,,,,,, +23,81399,,,,,,,,,,,,0.0885266363620758,,,,,, +23,81449,,,,,,,,,,,,0.08466870337724686,,,,,, +23,81499,,,,,,,,,,,,0.06955288350582123,,,,,, +23,81549,,,,,,,,,,,,0.1003202497959137,,,,,, +23,81599,,,,,,,,,,,,0.07473546266555786,,,,,, +23,81649,,,,,,,,,,,,0.09034210443496704,,,,,, +23,81699,,,,,,,,,,,,0.0805358961224556,,,,,, +23,81749,,,,,,,,,,,,0.09355466067790985,,,,,, +23,81799,,,,,,,,,,,,0.06859656423330307,,,,,, +23,81849,,,,,,,,,,,,0.07373487204313278,,,,,, +23,81899,,,,,,,,,,,,0.07925240695476532,,,,,, +23,81949,,,,,,,,,,,,0.08932267129421234,,,,,, +23,81999,,,,,,,,,,,,0.09268234670162201,,,,,, +23,82049,,,,,,,,,,,,0.07915400713682175,,,,,, +23,82099,,,,,,,,,,,,0.07621896266937256,,,,,, +23,82149,,,,,,,,,,,,0.09029035270214081,,,,,, +23,82199,,,,,,,,,,,,0.08699429780244827,,,,,, +23,82249,,,,,,,,,,,,0.07184362411499023,,,,,, +23,82299,,,,,,,,,,,,0.07817485183477402,,,,,, +23,82349,,,,,,,,,,,,0.0721612274646759,,,,,, +23,82399,,,,,,,,,,,,0.07929821312427521,,,,,, +23,82449,,,,,,,,,,,,0.07606805860996246,,,,,, +23,82499,,,,,,,,,,,,0.0859466940164566,,,,,, +23,82549,,,,,,,,,,,,0.07356614619493484,,,,,, +23,82599,,,,,,,,,,,,0.07754313200712204,,,,,, +23,82649,,,,,,,,,,,,0.08273227512836456,,,,,, +23,82655,,,,,,,,,,,,,0.24355457723140717,0.07963584363460541,0.21982748806476593,0.03662294149398804,0.17152632772922516,0.07963584363460541 +23,82655,,,,,,,0.24049800634384155,0.08259663730859756,0.19084401428699493,0.0060517191886901855,0.22807344794273376,,,,,,, +24,82699,,,,,,,,,,,,0.07915514707565308,,,,,, +24,82749,,,,,,,,,,,,0.08043017983436584,,,,,, +24,82799,,,,,,,,,,,,0.084778793156147,,,,,, +24,82849,,,,,,,,,,,,0.08184026926755905,,,,,, +24,82899,,,,,,,,,,,,0.07245250791311264,,,,,, +24,82949,,,,,,,,,,,,0.08905293792486191,,,,,, +24,82999,,,,,,,,,,,,0.07551556825637817,,,,,, +24,83049,,,,,,,,,,,,0.08308670669794083,,,,,, +24,83099,,,,,,,,,,,,0.09099824726581573,,,,,, +24,83149,,,,,,,,,,,,0.07989040017127991,,,,,, +24,83199,,,,,,,,,,,,0.07641614973545074,,,,,, +24,83249,,,,,,,,,,,,0.08342370390892029,,,,,, +24,83299,,,,,,,,,,,,0.07853499054908752,,,,,, +24,83349,,,,,,,,,,,,0.0775914341211319,,,,,, +24,83399,,,,,,,,,,,,0.0776984766125679,,,,,, +24,83449,,,,,,,,,,,,0.07315556704998016,,,,,, +24,83499,,,,,,,,,,,,0.07396360486745834,,,,,, +24,83549,,,,,,,,,,,,0.07674103230237961,,,,,, +24,83599,,,,,,,,,,,,0.08412665128707886,,,,,, +24,83649,,,,,,,,,,,,0.07365468144416809,,,,,, +24,83699,,,,,,,,,,,,0.08596395701169968,,,,,, +24,83749,,,,,,,,,,,,0.08268347382545471,,,,,, +24,83799,,,,,,,,,,,,0.07620841264724731,,,,,, +24,83849,,,,,,,,,,,,0.06958730518817902,,,,,, +24,83899,,,,,,,,,,,,0.06656172126531601,,,,,, +24,83949,,,,,,,,,,,,0.07230022549629211,,,,,, +24,83999,,,,,,,,,,,,0.07279914617538452,,,,,, +24,84049,,,,,,,,,,,,0.07369282096624374,,,,,, +24,84099,,,,,,,,,,,,0.07336429506540298,,,,,, +24,84149,,,,,,,,,,,,0.08445720374584198,,,,,, +24,84199,,,,,,,,,,,,0.07167872041463852,,,,,, +24,84249,,,,,,,,,,,,0.0815993994474411,,,,,, +24,84299,,,,,,,,,,,,0.06720897555351257,,,,,, +24,84349,,,,,,,,,,,,0.07985016703605652,,,,,, +24,84399,,,,,,,,,,,,0.07686600089073181,,,,,, +24,84449,,,,,,,,,,,,0.07533660531044006,,,,,, +24,84499,,,,,,,,,,,,0.08109229803085327,,,,,, +24,84549,,,,,,,,,,,,0.0917680412530899,,,,,, +24,84599,,,,,,,,,,,,0.0750172957777977,,,,,, +24,84649,,,,,,,,,,,,0.07553809136152267,,,,,, +24,84699,,,,,,,,,,,,0.06492509692907333,,,,,, +24,84749,,,,,,,,,,,,0.09268538653850555,,,,,, +24,84799,,,,,,,,,,,,0.07617136090993881,,,,,, +24,84849,,,,,,,,,,,,0.0822598934173584,,,,,, +24,84899,,,,,,,,,,,,0.08260233700275421,,,,,, +24,84949,,,,,,,,,,,,0.07918194681406021,,,,,, +24,84999,,,,,,,,,,,,0.066256582736969,,,,,, +24,85049,,,,,,,,,,,,0.07325054705142975,,,,,, +24,85099,,,,,,,,,,,,0.07433006167411804,,,,,, +24,85149,,,,,,,,,,,,0.07387343794107437,,,,,, +24,85199,,,,,,,,,,,,0.07365821301937103,,,,,, +24,85249,,,,,,,,,,,,0.08691748976707458,,,,,, +24,85299,,,,,,,,,,,,0.08374010026454926,,,,,, +24,85349,,,,,,,,,,,,0.07944032549858093,,,,,, +24,85399,,,,,,,,,,,,0.0641230046749115,,,,,, +24,85449,,,,,,,,,,,,0.07793953269720078,,,,,, +24,85499,,,,,,,,,,,,0.06402568519115448,,,,,, +24,85549,,,,,,,,,,,,0.0707114040851593,,,,,, +24,85599,,,,,,,,,,,,0.07459744811058044,,,,,, +24,85649,,,,,,,,,,,,0.07618283480405807,,,,,, +24,85699,,,,,,,,,,,,0.07368499785661697,,,,,, +24,85749,,,,,,,,,,,,0.07498753815889359,,,,,, +24,85799,,,,,,,,,,,,0.0788758173584938,,,,,, +24,85849,,,,,,,,,,,,0.07534155249595642,,,,,, +24,85899,,,,,,,,,,,,0.07492271065711975,,,,,, +24,85949,,,,,,,,,,,,0.073446124792099,,,,,, +24,85999,,,,,,,,,,,,0.0705380067229271,,,,,, +24,86049,,,,,,,,,,,,0.07677050679922104,,,,,, +24,86099,,,,,,,,,,,,0.09063921123743057,,,,,, +24,86099,,,,,,,,,,,,,0.23872582614421844,0.07713005691766739,0.26170864701271057,0.06693613529205322,0.23081032931804657,0.07713005691766739 +24,86099,,,,,,,0.2356833666563034,0.07643688470125198,0.2835920453071594,0.08018302917480469,0.2593974471092224,,,,,,, +25,86149,,,,,,,,,,,,0.07547055184841156,,,,,, +25,86199,,,,,,,,,,,,0.0726328194141388,,,,,, +25,86249,,,,,,,,,,,,0.07698109745979309,,,,,, +25,86299,,,,,,,,,,,,0.09066683053970337,,,,,, +25,86349,,,,,,,,,,,,0.07740415632724762,,,,,, +25,86399,,,,,,,,,,,,0.0744883194565773,,,,,, +25,86449,,,,,,,,,,,,0.07704378664493561,,,,,, +25,86499,,,,,,,,,,,,0.08313502371311188,,,,,, +25,86549,,,,,,,,,,,,0.07891717553138733,,,,,, +25,86599,,,,,,,,,,,,0.08098983019590378,,,,,, +25,86649,,,,,,,,,,,,0.07891838997602463,,,,,, +25,86699,,,,,,,,,,,,0.09819328784942627,,,,,, +25,86749,,,,,,,,,,,,0.06953280419111252,,,,,, +25,86799,,,,,,,,,,,,0.0819578617811203,,,,,, +25,86849,,,,,,,,,,,,0.07758790999650955,,,,,, +25,86899,,,,,,,,,,,,0.08499622344970703,,,,,, +25,86949,,,,,,,,,,,,0.07942270487546921,,,,,, +25,86999,,,,,,,,,,,,0.08537762612104416,,,,,, +25,87049,,,,,,,,,,,,0.07646460086107254,,,,,, +25,87099,,,,,,,,,,,,0.07727575302124023,,,,,, +25,87149,,,,,,,,,,,,0.0906243771314621,,,,,, +25,87199,,,,,,,,,,,,0.07700267434120178,,,,,, +25,87249,,,,,,,,,,,,0.0701175332069397,,,,,, +25,87299,,,,,,,,,,,,0.07466696947813034,,,,,, +25,87349,,,,,,,,,,,,0.07908734679222107,,,,,, +25,87399,,,,,,,,,,,,0.07091236114501953,,,,,, +25,87449,,,,,,,,,,,,0.07492926716804504,,,,,, +25,87499,,,,,,,,,,,,0.0812075138092041,,,,,, +25,87549,,,,,,,,,,,,0.06875622272491455,,,,,, +25,87599,,,,,,,,,,,,0.07414473593235016,,,,,, +25,87649,,,,,,,,,,,,0.0808580219745636,,,,,, +25,87699,,,,,,,,,,,,0.08374940603971481,,,,,, +25,87749,,,,,,,,,,,,0.07133232057094574,,,,,, +25,87799,,,,,,,,,,,,0.08880539238452911,,,,,, +25,87849,,,,,,,,,,,,0.07200861722230911,,,,,, +25,87899,,,,,,,,,,,,0.07029178738594055,,,,,, +25,87949,,,,,,,,,,,,0.08135001361370087,,,,,, +25,87999,,,,,,,,,,,,0.07754506915807724,,,,,, +25,88049,,,,,,,,,,,,0.07035282254219055,,,,,, +25,88099,,,,,,,,,,,,0.07633374631404877,,,,,, +25,88149,,,,,,,,,,,,0.06289784610271454,,,,,, +25,88199,,,,,,,,,,,,0.07409350574016571,,,,,, +25,88249,,,,,,,,,,,,0.07428131997585297,,,,,, +25,88299,,,,,,,,,,,,0.07480182498693466,,,,,, +25,88349,,,,,,,,,,,,0.07610157132148743,,,,,, +25,88399,,,,,,,,,,,,0.0633903369307518,,,,,, +25,88449,,,,,,,,,,,,0.0663384348154068,,,,,, +25,88499,,,,,,,,,,,,0.06572350859642029,,,,,, +25,88549,,,,,,,,,,,,0.06577646732330322,,,,,, +25,88599,,,,,,,,,,,,0.07464392483234406,,,,,, +25,88649,,,,,,,,,,,,0.09392599016427994,,,,,, +25,88699,,,,,,,,,,,,0.07855913043022156,,,,,, +25,88749,,,,,,,,,,,,0.0760842114686966,,,,,, +25,88799,,,,,,,,,,,,0.0737939178943634,,,,,, +25,88849,,,,,,,,,,,,0.07770781964063644,,,,,, +25,88899,,,,,,,,,,,,0.0844196230173111,,,,,, +25,88949,,,,,,,,,,,,0.09454569220542908,,,,,, +25,88999,,,,,,,,,,,,0.09446011483669281,,,,,, +25,89049,,,,,,,,,,,,0.08507676422595978,,,,,, +25,89099,,,,,,,,,,,,0.06991136074066162,,,,,, +25,89149,,,,,,,,,,,,0.09075003862380981,,,,,, +25,89199,,,,,,,,,,,,0.0860871821641922,,,,,, +25,89249,,,,,,,,,,,,0.0768439769744873,,,,,, +25,89299,,,,,,,,,,,,0.09271256625652313,,,,,, +25,89349,,,,,,,,,,,,0.09282495826482773,,,,,, +25,89399,,,,,,,,,,,,0.08823537081480026,,,,,, +25,89449,,,,,,,,,,,,0.08146621286869049,,,,,, +25,89499,,,,,,,,,,,,0.06233467906713486,,,,,, +25,89543,,,,,,,,,,,,,0.2432510256767273,0.07921266555786133,0.23582299053668976,0.04174220561981201,0.1969822198152542,0.07921266555786133 +25,89543,,,,,,,0.23961320519447327,0.07937121391296387,0.22612935304641724,0.04486924409866333,0.21879088878631592,,,,,,, +26,89549,,,,,,,,,,,,0.073764368891716,,,,,, +26,89599,,,,,,,,,,,,0.08497090637683868,,,,,, +26,89649,,,,,,,,,,,,0.0744975358247757,,,,,, +26,89699,,,,,,,,,,,,0.07604000717401505,,,,,, +26,89749,,,,,,,,,,,,0.0773320198059082,,,,,, +26,89799,,,,,,,,,,,,0.09221488237380981,,,,,, +26,89849,,,,,,,,,,,,0.08036478608846664,,,,,, +26,89899,,,,,,,,,,,,0.06947515159845352,,,,,, +26,89949,,,,,,,,,,,,0.0712515264749527,,,,,, +26,89999,,,,,,,,,,,,0.0836525410413742,,,,,, +26,90049,,,,,,,,,,,,0.06787235289812088,,,,,, +26,90099,,,,,,,,,,,,0.07925315201282501,,,,,, +26,90149,,,,,,,,,,,,0.08743166923522949,,,,,, +26,90199,,,,,,,,,,,,0.08998289704322815,,,,,, +26,90249,,,,,,,,,,,,0.06740816682577133,,,,,, +26,90299,,,,,,,,,,,,0.07639650255441666,,,,,, +26,90349,,,,,,,,,,,,0.05901104956865311,,,,,, +26,90399,,,,,,,,,,,,0.0697840005159378,,,,,, +26,90449,,,,,,,,,,,,0.06282541900873184,,,,,, +26,90499,,,,,,,,,,,,0.0786096453666687,,,,,, +26,90549,,,,,,,,,,,,0.07122647762298584,,,,,, +26,90599,,,,,,,,,,,,0.07570016384124756,,,,,, +26,90649,,,,,,,,,,,,0.06883373856544495,,,,,, +26,90699,,,,,,,,,,,,0.08028584718704224,,,,,, +26,90749,,,,,,,,,,,,0.0704839825630188,,,,,, +26,90799,,,,,,,,,,,,0.0675235241651535,,,,,, +26,90849,,,,,,,,,,,,0.07452370226383209,,,,,, +26,90899,,,,,,,,,,,,0.07363449782133102,,,,,, +26,90949,,,,,,,,,,,,0.06847894191741943,,,,,, +26,90999,,,,,,,,,,,,0.07440776377916336,,,,,, +26,91049,,,,,,,,,,,,0.08755621314048767,,,,,, +26,91099,,,,,,,,,,,,0.06409479677677155,,,,,, +26,91149,,,,,,,,,,,,0.07391276955604553,,,,,, +26,91199,,,,,,,,,,,,0.08445572108030319,,,,,, +26,91249,,,,,,,,,,,,0.07808740437030792,,,,,, +26,91299,,,,,,,,,,,,0.0676785334944725,,,,,, +26,91349,,,,,,,,,,,,0.06823010742664337,,,,,, +26,91399,,,,,,,,,,,,0.07474265992641449,,,,,, +26,91449,,,,,,,,,,,,0.08399999141693115,,,,,, +26,91499,,,,,,,,,,,,0.06978023797273636,,,,,, +26,91549,,,,,,,,,,,,0.08329159766435623,,,,,, +26,91599,,,,,,,,,,,,0.07423733174800873,,,,,, +26,91649,,,,,,,,,,,,0.0726761519908905,,,,,, +26,91699,,,,,,,,,,,,0.07439881563186646,,,,,, +26,91749,,,,,,,,,,,,0.08247612416744232,,,,,, +26,91799,,,,,,,,,,,,0.07642967998981476,,,,,, +26,91849,,,,,,,,,,,,0.07405219227075577,,,,,, +26,91899,,,,,,,,,,,,0.05750051885843277,,,,,, +26,91949,,,,,,,,,,,,0.07325749844312668,,,,,, +26,91999,,,,,,,,,,,,0.07427315413951874,,,,,, +26,92049,,,,,,,,,,,,0.06559891998767853,,,,,, +26,92099,,,,,,,,,,,,0.07170084118843079,,,,,, +26,92149,,,,,,,,,,,,0.08045873045921326,,,,,, +26,92199,,,,,,,,,,,,0.05477876961231232,,,,,, +26,92249,,,,,,,,,,,,0.07832664251327515,,,,,, +26,92299,,,,,,,,,,,,0.0726347416639328,,,,,, +26,92349,,,,,,,,,,,,0.06924069672822952,,,,,, +26,92399,,,,,,,,,,,,0.07551641762256622,,,,,, +26,92449,,,,,,,,,,,,0.07856310904026031,,,,,, +26,92499,,,,,,,,,,,,0.07374625653028488,,,,,, +26,92549,,,,,,,,,,,,0.09219928085803986,,,,,, +26,92599,,,,,,,,,,,,0.08183611929416656,,,,,, +26,92649,,,,,,,,,,,,0.06473539769649506,,,,,, +26,92699,,,,,,,,,,,,0.06702401489019394,,,,,, +26,92749,,,,,,,,,,,,0.07230953872203827,,,,,, +26,92799,,,,,,,,,,,,0.0739898756146431,,,,,, +26,92849,,,,,,,,,,,,0.07522127032279968,,,,,, +26,92899,,,,,,,,,,,,0.0725490152835846,,,,,, +26,92949,,,,,,,,,,,,0.06903588771820068,,,,,, +26,92987,,,,,,,,,,,,,0.2399797886610031,0.07770419120788574,0.27146679162979126,0.059990644454956055,0.23990869522094727,0.07770419120788574 +26,92987,,,,,,,0.23327070474624634,0.07539328187704086,0.3055184781551361,0.09275323152542114,0.28278958797454834,,,,,,, +27,92999,,,,,,,,,,,,0.05993703752756119,,,,,, +27,93049,,,,,,,,,,,,0.08764231204986572,,,,,, +27,93099,,,,,,,,,,,,0.06860417127609253,,,,,, +27,93149,,,,,,,,,,,,0.08443254232406616,,,,,, +27,93199,,,,,,,,,,,,0.07871359586715698,,,,,, +27,93249,,,,,,,,,,,,0.0755610391497612,,,,,, +27,93299,,,,,,,,,,,,0.07302816212177277,,,,,, +27,93349,,,,,,,,,,,,0.07439166307449341,,,,,, +27,93399,,,,,,,,,,,,0.06870116293430328,,,,,, +27,93449,,,,,,,,,,,,0.07879859209060669,,,,,, +27,93499,,,,,,,,,,,,0.06969115138053894,,,,,, +27,93549,,,,,,,,,,,,0.07074504345655441,,,,,, +27,93599,,,,,,,,,,,,0.07223094254732132,,,,,, +27,93649,,,,,,,,,,,,0.07875809818506241,,,,,, +27,93699,,,,,,,,,,,,0.07393936067819595,,,,,, +27,93749,,,,,,,,,,,,0.0751677080988884,,,,,, +27,93799,,,,,,,,,,,,0.07064054906368256,,,,,, +27,93849,,,,,,,,,,,,0.0697762742638588,,,,,, +27,93899,,,,,,,,,,,,0.0702570229768753,,,,,, +27,93949,,,,,,,,,,,,0.06313616037368774,,,,,, +27,93999,,,,,,,,,,,,0.06526579707860947,,,,,, +27,94049,,,,,,,,,,,,0.0738406553864479,,,,,, +27,94099,,,,,,,,,,,,0.07666277885437012,,,,,, +27,94149,,,,,,,,,,,,0.0689571350812912,,,,,, +27,94199,,,,,,,,,,,,0.06410657614469528,,,,,, +27,94249,,,,,,,,,,,,0.07361742854118347,,,,,, +27,94299,,,,,,,,,,,,0.0740179792046547,,,,,, +27,94349,,,,,,,,,,,,0.07085433602333069,,,,,, +27,94399,,,,,,,,,,,,0.0682205781340599,,,,,, +27,94449,,,,,,,,,,,,0.07796555757522583,,,,,, +27,94499,,,,,,,,,,,,0.06261694431304932,,,,,, +27,94549,,,,,,,,,,,,0.06828417629003525,,,,,, +27,94599,,,,,,,,,,,,0.0711708515882492,,,,,, +27,94649,,,,,,,,,,,,0.07763964682817459,,,,,, +27,94699,,,,,,,,,,,,0.08379647135734558,,,,,, +27,94749,,,,,,,,,,,,0.07727769762277603,,,,,, +27,94799,,,,,,,,,,,,0.06450153887271881,,,,,, +27,94849,,,,,,,,,,,,0.07534941285848618,,,,,, +27,94899,,,,,,,,,,,,0.07599831372499466,,,,,, +27,94949,,,,,,,,,,,,0.05638585984706879,,,,,, +27,94999,,,,,,,,,,,,0.06559377163648605,,,,,, +27,95049,,,,,,,,,,,,0.06903666257858276,,,,,, +27,95099,,,,,,,,,,,,0.0762898325920105,,,,,, +27,95149,,,,,,,,,,,,0.07375526428222656,,,,,, +27,95199,,,,,,,,,,,,0.07470551133155823,,,,,, +27,95249,,,,,,,,,,,,0.06515885889530182,,,,,, +27,95299,,,,,,,,,,,,0.07144186645746231,,,,,, +27,95349,,,,,,,,,,,,0.07052497565746307,,,,,, +27,95399,,,,,,,,,,,,0.07629569619894028,,,,,, +27,95449,,,,,,,,,,,,0.06859192252159119,,,,,, +27,95499,,,,,,,,,,,,0.08478179574012756,,,,,, +27,95549,,,,,,,,,,,,0.07960070669651031,,,,,, +27,95599,,,,,,,,,,,,0.060189925134181976,,,,,, +27,95649,,,,,,,,,,,,0.07912644743919373,,,,,, +27,95699,,,,,,,,,,,,0.08057570457458496,,,,,, +27,95749,,,,,,,,,,,,0.07051591575145721,,,,,, +27,95799,,,,,,,,,,,,0.06607741117477417,,,,,, +27,95849,,,,,,,,,,,,0.08043175935745239,,,,,, +27,95899,,,,,,,,,,,,0.0735560804605484,,,,,, +27,95949,,,,,,,,,,,,0.07034611701965332,,,,,, +27,95999,,,,,,,,,,,,0.07710741460323334,,,,,, +27,96049,,,,,,,,,,,,0.06653989851474762,,,,,, +27,96099,,,,,,,,,,,,0.06617097556591034,,,,,, +27,96149,,,,,,,,,,,,0.08644872903823853,,,,,, +27,96199,,,,,,,,,,,,0.07628166675567627,,,,,, +27,96249,,,,,,,,,,,,0.07389509677886963,,,,,, +27,96299,,,,,,,,,,,,0.0612809881567955,,,,,, +27,96349,,,,,,,,,,,,0.08331571519374847,,,,,, +27,96399,,,,,,,,,,,,0.08017610013484955,,,,,, +27,96431,,,,,,,,,,,,,0.24509787559509277,0.08081310987472534,0.20274609327316284,0.022381186485290527,0.1704898327589035,0.08081310987472534 +27,96431,,,,,,,0.22858521342277527,0.07300655543804169,0.3490149676799774,0.12146514654159546,0.33168503642082214,,,,,,, +28,96449,,,,,,,,,,,,0.07240070402622223,,,,,, +28,96499,,,,,,,,,,,,0.07514211535453796,,,,,, +28,96549,,,,,,,,,,,,0.07200661301612854,,,,,, +28,96599,,,,,,,,,,,,0.07418228685855865,,,,,, +28,96649,,,,,,,,,,,,0.0823981761932373,,,,,, +28,96699,,,,,,,,,,,,0.060966476798057556,,,,,, +28,96749,,,,,,,,,,,,0.0746830478310585,,,,,, +28,96799,,,,,,,,,,,,0.062306955456733704,,,,,, +28,96849,,,,,,,,,,,,0.082225501537323,,,,,, +28,96899,,,,,,,,,,,,0.07081876695156097,,,,,, +28,96949,,,,,,,,,,,,0.0734357163310051,,,,,, +28,96999,,,,,,,,,,,,0.07413553446531296,,,,,, +28,97049,,,,,,,,,,,,0.07069198787212372,,,,,, +28,97099,,,,,,,,,,,,0.06608127057552338,,,,,, +28,97149,,,,,,,,,,,,0.061719849705696106,,,,,, +28,97199,,,,,,,,,,,,0.09036295861005783,,,,,, +28,97249,,,,,,,,,,,,0.0688195452094078,,,,,, +28,97299,,,,,,,,,,,,0.06442166864871979,,,,,, +28,97349,,,,,,,,,,,,0.07170043885707855,,,,,, +28,97399,,,,,,,,,,,,0.07718057185411453,,,,,, +28,97449,,,,,,,,,,,,0.06829074025154114,,,,,, +28,97499,,,,,,,,,,,,0.08204315602779388,,,,,, +28,97549,,,,,,,,,,,,0.06212397664785385,,,,,, +28,97599,,,,,,,,,,,,0.07945172488689423,,,,,, +28,97649,,,,,,,,,,,,0.06316335499286652,,,,,, +28,97699,,,,,,,,,,,,0.07842135429382324,,,,,, +28,97749,,,,,,,,,,,,0.0715174451470375,,,,,, +28,97799,,,,,,,,,,,,0.07505921274423599,,,,,, +28,97849,,,,,,,,,,,,0.07266004383563995,,,,,, +28,97899,,,,,,,,,,,,0.06912045180797577,,,,,, +28,97949,,,,,,,,,,,,0.06748995184898376,,,,,, +28,97999,,,,,,,,,,,,0.07914106547832489,,,,,, +28,98049,,,,,,,,,,,,0.06074921786785126,,,,,, +28,98099,,,,,,,,,,,,0.06774020195007324,,,,,, +28,98149,,,,,,,,,,,,0.059879474341869354,,,,,, +28,98199,,,,,,,,,,,,0.07074372470378876,,,,,, +28,98249,,,,,,,,,,,,0.07184594869613647,,,,,, +28,98299,,,,,,,,,,,,0.08531320095062256,,,,,, +28,98349,,,,,,,,,,,,0.05896025896072388,,,,,, +28,98399,,,,,,,,,,,,0.07465529441833496,,,,,, +28,98449,,,,,,,,,,,,0.07103025913238525,,,,,, +28,98499,,,,,,,,,,,,0.06960652768611908,,,,,, +28,98549,,,,,,,,,,,,0.07624749839305878,,,,,, +28,98599,,,,,,,,,,,,0.08318933844566345,,,,,, +28,98649,,,,,,,,,,,,0.06990191340446472,,,,,, +28,98699,,,,,,,,,,,,0.06044330075383186,,,,,, +28,98749,,,,,,,,,,,,0.07694756239652634,,,,,, +28,98799,,,,,,,,,,,,0.06819789111614227,,,,,, +28,98849,,,,,,,,,,,,0.06677047908306122,,,,,, +28,98899,,,,,,,,,,,,0.06641741096973419,,,,,, +28,98949,,,,,,,,,,,,0.07700786739587784,,,,,, +28,98999,,,,,,,,,,,,0.06845764070749283,,,,,, +28,99049,,,,,,,,,,,,0.07405763864517212,,,,,, +28,99099,,,,,,,,,,,,0.07009311020374298,,,,,, +28,99149,,,,,,,,,,,,0.06549727916717529,,,,,, +28,99199,,,,,,,,,,,,0.0664479061961174,,,,,, +28,99249,,,,,,,,,,,,0.07054390013217926,,,,,, +28,99299,,,,,,,,,,,,0.05989442020654678,,,,,, +28,99349,,,,,,,,,,,,0.06798365712165833,,,,,, +28,99399,,,,,,,,,,,,0.06856988370418549,,,,,, +28,99449,,,,,,,,,,,,0.07733897864818573,,,,,, +28,99499,,,,,,,,,,,,0.06878238916397095,,,,,, +28,99549,,,,,,,,,,,,0.07272427529096603,,,,,, +28,99599,,,,,,,,,,,,0.0737065002322197,,,,,, +28,99649,,,,,,,,,,,,0.07723650336265564,,,,,, +28,99699,,,,,,,,,,,,0.06784132122993469,,,,,, +28,99749,,,,,,,,,,,,0.06145313382148743,,,,,, +28,99799,,,,,,,,,,,,0.06509100645780563,,,,,, +28,99849,,,,,,,,,,,,0.07390987873077393,,,,,, +28,99875,,,,,,,,,,,,,0.23555414378643036,0.07661650329828262,0.2797822058200836,0.07314866781234741,0.2510225772857666,0.07661650329828262 +28,99875,,,,,,,0.22793778777122498,0.07257751375436783,0.35619595646858215,0.12662190198898315,0.3382728695869446,,,,,,, +29,99899,,,,,,,,,,,,0.07808136194944382,,,,,, +29,99949,,,,,,,,,,,,0.07189454883337021,,,,,, +29,99999,,,,,,,,,,,,0.062202338129282,,,,,, +29,100049,,,,,,,,,,,,0.06749657541513443,,,,,, +29,100099,,,,,,,,,,,,0.07421086728572845,,,,,, +29,100149,,,,,,,,,,,,0.07504025101661682,,,,,, +29,100199,,,,,,,,,,,,0.0734773799777031,,,,,, +29,100249,,,,,,,,,,,,0.0670890212059021,,,,,, +29,100299,,,,,,,,,,,,0.08848275244235992,,,,,, +29,100349,,,,,,,,,,,,0.06653229147195816,,,,,, +29,100399,,,,,,,,,,,,0.07151538133621216,,,,,, +29,100449,,,,,,,,,,,,0.07537241280078888,,,,,, +29,100499,,,,,,,,,,,,0.08409277349710464,,,,,, +29,100549,,,,,,,,,,,,0.06295624375343323,,,,,, +29,100599,,,,,,,,,,,,0.05983884260058403,,,,,, +29,100649,,,,,,,,,,,,0.08719031512737274,,,,,, +29,100699,,,,,,,,,,,,0.07264551520347595,,,,,, +29,100749,,,,,,,,,,,,0.07044993340969086,,,,,, +29,100799,,,,,,,,,,,,0.07779359817504883,,,,,, +29,100849,,,,,,,,,,,,0.05115760117769241,,,,,, +29,100899,,,,,,,,,,,,0.07204237580299377,,,,,, +29,100949,,,,,,,,,,,,0.08832783997058868,,,,,, +29,100999,,,,,,,,,,,,0.06261993944644928,,,,,, +29,101049,,,,,,,,,,,,0.08286620676517487,,,,,, +29,101099,,,,,,,,,,,,0.05642621964216232,,,,,, +29,101149,,,,,,,,,,,,0.07187546044588089,,,,,, +29,101199,,,,,,,,,,,,0.06612125039100647,,,,,, +29,101249,,,,,,,,,,,,0.07440486550331116,,,,,, +29,101299,,,,,,,,,,,,0.08155032992362976,,,,,, +29,101349,,,,,,,,,,,,0.0736703872680664,,,,,, +29,101399,,,,,,,,,,,,0.06473493576049805,,,,,, +29,101449,,,,,,,,,,,,0.08453834056854248,,,,,, +29,101499,,,,,,,,,,,,0.0811229944229126,,,,,, +29,101549,,,,,,,,,,,,0.07386447489261627,,,,,, +29,101599,,,,,,,,,,,,0.0734807550907135,,,,,, +29,101649,,,,,,,,,,,,0.06334636360406876,,,,,, +29,101699,,,,,,,,,,,,0.06557467579841614,,,,,, +29,101749,,,,,,,,,,,,0.061246730387210846,,,,,, +29,101799,,,,,,,,,,,,0.08992994576692581,,,,,, +29,101849,,,,,,,,,,,,0.07726825773715973,,,,,, +29,101899,,,,,,,,,,,,0.08069245517253876,,,,,, +29,101949,,,,,,,,,,,,0.07273542881011963,,,,,, +29,101999,,,,,,,,,,,,0.07378324121236801,,,,,, +29,102049,,,,,,,,,,,,0.06834866851568222,,,,,, +29,102099,,,,,,,,,,,,0.06583752483129501,,,,,, +29,102149,,,,,,,,,,,,0.07499620318412781,,,,,, +29,102199,,,,,,,,,,,,0.06932114064693451,,,,,, +29,102249,,,,,,,,,,,,0.061341479420661926,,,,,, +29,102299,,,,,,,,,,,,0.07566765695810318,,,,,, +29,102349,,,,,,,,,,,,0.06812728196382523,,,,,, +29,102399,,,,,,,,,,,,0.0755172148346901,,,,,, +29,102449,,,,,,,,,,,,0.07263036072254181,,,,,, +29,102499,,,,,,,,,,,,0.07396434247493744,,,,,, +29,102549,,,,,,,,,,,,0.06275907903909683,,,,,, +29,102599,,,,,,,,,,,,0.0774228647351265,,,,,, +29,102649,,,,,,,,,,,,0.07096569240093231,,,,,, +29,102699,,,,,,,,,,,,0.07996311783790588,,,,,, +29,102749,,,,,,,,,,,,0.0555412694811821,,,,,, +29,102799,,,,,,,,,,,,0.06912928819656372,,,,,, +29,102849,,,,,,,,,,,,0.051873669028282166,,,,,, +29,102899,,,,,,,,,,,,0.06375396251678467,,,,,, +29,102949,,,,,,,,,,,,0.05303608998656273,,,,,, +29,102999,,,,,,,,,,,,0.08260016143321991,,,,,, +29,103049,,,,,,,,,,,,0.06239397078752518,,,,,, +29,103099,,,,,,,,,,,,0.057768046855926514,,,,,, +29,103149,,,,,,,,,,,,0.07621829211711884,,,,,, +29,103199,,,,,,,,,,,,0.07198172807693481,,,,,, +29,103249,,,,,,,,,,,,0.06876277923583984,,,,,, +29,103299,,,,,,,,,,,,0.07290767133235931,,,,,, +29,103319,,,,,,,,,,,,,0.23523560166358948,0.07699453085660934,0.27812105417251587,0.06857562065124512,0.24940775334835052,0.07699453085660934 +29,103319,,,,,,,0.22813479602336884,0.0778617262840271,0.29651159048080444,0.06303775310516357,0.3403152525424957,,,,,,, +30,103349,,,,,,,,,,,,0.06733481585979462,,,,,, +30,103399,,,,,,,,,,,,0.07083632797002792,,,,,, +30,103449,,,,,,,,,,,,0.057674869894981384,,,,,, +30,103499,,,,,,,,,,,,0.0766257792711258,,,,,, +30,103549,,,,,,,,,,,,0.07169521600008011,,,,,, +30,103599,,,,,,,,,,,,0.06346611678600311,,,,,, +30,103649,,,,,,,,,,,,0.0520314946770668,,,,,, +30,103699,,,,,,,,,,,,0.07111483812332153,,,,,, +30,103749,,,,,,,,,,,,0.06922420859336853,,,,,, +30,103799,,,,,,,,,,,,0.0685114860534668,,,,,, +30,103849,,,,,,,,,,,,0.06886429339647293,,,,,, +30,103899,,,,,,,,,,,,0.0704704225063324,,,,,, +30,103949,,,,,,,,,,,,0.07146943360567093,,,,,, +30,103999,,,,,,,,,,,,0.06926090270280838,,,,,, +30,104049,,,,,,,,,,,,0.0704488679766655,,,,,, +30,104099,,,,,,,,,,,,0.0760926902294159,,,,,, +30,104149,,,,,,,,,,,,0.07390148937702179,,,,,, +30,104199,,,,,,,,,,,,0.07559119164943695,,,,,, +30,104249,,,,,,,,,,,,0.06210319325327873,,,,,, +30,104299,,,,,,,,,,,,0.07297031581401825,,,,,, +30,104349,,,,,,,,,,,,0.07916837185621262,,,,,, +30,104399,,,,,,,,,,,,0.08081074059009552,,,,,, +30,104449,,,,,,,,,,,,0.06973392516374588,,,,,, +30,104499,,,,,,,,,,,,0.06478269398212433,,,,,, +30,104549,,,,,,,,,,,,0.07018685340881348,,,,,, +30,104599,,,,,,,,,,,,0.08612470328807831,,,,,, +30,104649,,,,,,,,,,,,0.07076790928840637,,,,,, +30,104699,,,,,,,,,,,,0.07403044402599335,,,,,, +30,104749,,,,,,,,,,,,0.07954332232475281,,,,,, +30,104799,,,,,,,,,,,,0.08002893626689911,,,,,, +30,104849,,,,,,,,,,,,0.06344246119260788,,,,,, +30,104899,,,,,,,,,,,,0.06718257814645767,,,,,, +30,104949,,,,,,,,,,,,0.07406570017337799,,,,,, +30,104999,,,,,,,,,,,,0.0744081363081932,,,,,, +30,105049,,,,,,,,,,,,0.07779066264629364,,,,,, +30,105099,,,,,,,,,,,,0.06970833241939545,,,,,, +30,105149,,,,,,,,,,,,0.06449908763170242,,,,,, +30,105199,,,,,,,,,,,,0.08017048239707947,,,,,, +30,105249,,,,,,,,,,,,0.05871032923460007,,,,,, +30,105299,,,,,,,,,,,,0.07423831522464752,,,,,, +30,105349,,,,,,,,,,,,0.07911232858896255,,,,,, +30,105399,,,,,,,,,,,,0.06214628368616104,,,,,, +30,105449,,,,,,,,,,,,0.07259547710418701,,,,,, +30,105499,,,,,,,,,,,,0.06775526702404022,,,,,, +30,105549,,,,,,,,,,,,0.06560416519641876,,,,,, +30,105599,,,,,,,,,,,,0.074221670627594,,,,,, +30,105649,,,,,,,,,,,,0.05933017283678055,,,,,, +30,105699,,,,,,,,,,,,0.06659197062253952,,,,,, +30,105749,,,,,,,,,,,,0.06681305170059204,,,,,, +30,105799,,,,,,,,,,,,0.06968706101179123,,,,,, +30,105849,,,,,,,,,,,,0.07531972974538803,,,,,, +30,105899,,,,,,,,,,,,0.07660423219203949,,,,,, +30,105949,,,,,,,,,,,,0.06493034213781357,,,,,, +30,105999,,,,,,,,,,,,0.06994791328907013,,,,,, +30,106049,,,,,,,,,,,,0.07772181928157806,,,,,, +30,106099,,,,,,,,,,,,0.06831998378038406,,,,,, +30,106149,,,,,,,,,,,,0.06780461966991425,,,,,, +30,106199,,,,,,,,,,,,0.0627136379480362,,,,,, +30,106249,,,,,,,,,,,,0.08603517711162567,,,,,, +30,106299,,,,,,,,,,,,0.055947937071323395,,,,,, +30,106349,,,,,,,,,,,,0.07173433154821396,,,,,, +30,106399,,,,,,,,,,,,0.07844270765781403,,,,,, +30,106449,,,,,,,,,,,,0.0679241269826889,,,,,, +30,106499,,,,,,,,,,,,0.06337622553110123,,,,,, +30,106549,,,,,,,,,,,,0.07453668862581253,,,,,, +30,106599,,,,,,,,,,,,0.08914508670568466,,,,,, +30,106649,,,,,,,,,,,,0.07609009742736816,,,,,, +30,106699,,,,,,,,,,,,0.07172519713640213,,,,,, +30,106749,,,,,,,,,,,,0.07796873152256012,,,,,, +30,106763,,,,,,,,,,,,,0.23603346943855286,0.07681597024202347,0.27314144372940063,0.07073569297790527,0.24709822237491608,0.07681597024202347 +30,106763,,,,,,,0.2265731692314148,0.07198888808488846,0.3662821352481842,0.13370972871780396,0.351468563079834,,,,,,, +31,106799,,,,,,,,,,,,0.07070766389369965,,,,,, +31,106849,,,,,,,,,,,,0.08569596707820892,,,,,, +31,106899,,,,,,,,,,,,0.08280518651008606,,,,,, +31,106949,,,,,,,,,,,,0.06556414067745209,,,,,, +31,106999,,,,,,,,,,,,0.07502862811088562,,,,,, +31,107049,,,,,,,,,,,,0.07640086114406586,,,,,, +31,107099,,,,,,,,,,,,0.06925369054079056,,,,,, +31,107149,,,,,,,,,,,,0.06566858291625977,,,,,, +31,107199,,,,,,,,,,,,0.07804922759532928,,,,,, +31,107249,,,,,,,,,,,,0.0731600970029831,,,,,, +31,107299,,,,,,,,,,,,0.06117402762174606,,,,,, +31,107349,,,,,,,,,,,,0.06850330531597137,,,,,, +31,107399,,,,,,,,,,,,0.07268878072500229,,,,,, +31,107449,,,,,,,,,,,,0.07248727232217789,,,,,, +31,107499,,,,,,,,,,,,0.06797179579734802,,,,,, +31,107549,,,,,,,,,,,,0.06727410852909088,,,,,, +31,107599,,,,,,,,,,,,0.07914234697818756,,,,,, +31,107649,,,,,,,,,,,,0.0720023661851883,,,,,, +31,107699,,,,,,,,,,,,0.06804482638835907,,,,,, +31,107749,,,,,,,,,,,,0.07361497730016708,,,,,, +31,107799,,,,,,,,,,,,0.08207520842552185,,,,,, +31,107849,,,,,,,,,,,,0.06671622395515442,,,,,, +31,107899,,,,,,,,,,,,0.06516927480697632,,,,,, +31,107949,,,,,,,,,,,,0.07356936484575272,,,,,, +31,107999,,,,,,,,,,,,0.06689189374446869,,,,,, +31,108049,,,,,,,,,,,,0.07054656744003296,,,,,, +31,108099,,,,,,,,,,,,0.06798789650201797,,,,,, +31,108149,,,,,,,,,,,,0.07407321035861969,,,,,, +31,108199,,,,,,,,,,,,0.08028586208820343,,,,,, +31,108249,,,,,,,,,,,,0.07217413187026978,,,,,, +31,108299,,,,,,,,,,,,0.06865619122982025,,,,,, +31,108349,,,,,,,,,,,,0.06601396203041077,,,,,, +31,108399,,,,,,,,,,,,0.07245694845914841,,,,,, +31,108449,,,,,,,,,,,,0.07354913651943207,,,,,, +31,108499,,,,,,,,,,,,0.0636548399925232,,,,,, +31,108549,,,,,,,,,,,,0.07988038659095764,,,,,, +31,108599,,,,,,,,,,,,0.07072871923446655,,,,,, +31,108649,,,,,,,,,,,,0.0728549137711525,,,,,, +31,108699,,,,,,,,,,,,0.07593993842601776,,,,,, +31,108749,,,,,,,,,,,,0.062210556119680405,,,,,, +31,108799,,,,,,,,,,,,0.07955217361450195,,,,,, +31,108849,,,,,,,,,,,,0.07787597179412842,,,,,, +31,108899,,,,,,,,,,,,0.08128689229488373,,,,,, +31,108949,,,,,,,,,,,,0.08300605416297913,,,,,, +31,108999,,,,,,,,,,,,0.06263180077075958,,,,,, +31,109049,,,,,,,,,,,,0.06873423606157303,,,,,, +31,109099,,,,,,,,,,,,0.07388070225715637,,,,,, +31,109149,,,,,,,,,,,,0.07546845078468323,,,,,, +31,109199,,,,,,,,,,,,0.07603594660758972,,,,,, +31,109249,,,,,,,,,,,,0.07234276831150055,,,,,, +31,109299,,,,,,,,,,,,0.07505890727043152,,,,,, +31,109349,,,,,,,,,,,,0.06749657541513443,,,,,, +31,109399,,,,,,,,,,,,0.08125627040863037,,,,,, +31,109449,,,,,,,,,,,,0.06955775618553162,,,,,, +31,109499,,,,,,,,,,,,0.06947516649961472,,,,,, +31,109549,,,,,,,,,,,,0.06794819235801697,,,,,, +31,109599,,,,,,,,,,,,0.06735675781965256,,,,,, +31,109649,,,,,,,,,,,,0.06756459176540375,,,,,, +31,109699,,,,,,,,,,,,0.061000630259513855,,,,,, +31,109749,,,,,,,,,,,,0.07331882417201996,,,,,, +31,109799,,,,,,,,,,,,0.06485465168952942,,,,,, +31,109849,,,,,,,,,,,,0.07236316800117493,,,,,, +31,109899,,,,,,,,,,,,0.06236838176846504,,,,,, +31,109949,,,,,,,,,,,,0.07423252612352371,,,,,, +31,109999,,,,,,,,,,,,0.07883495092391968,,,,,, +31,110049,,,,,,,,,,,,0.06542624533176422,,,,,, +31,110099,,,,,,,,,,,,0.07811684906482697,,,,,, +31,110149,,,,,,,,,,,,0.07401569187641144,,,,,, +31,110199,,,,,,,,,,,,0.07736048847436905,,,,,, +31,110207,,,,,,,,,,,,,0.23504255712032318,0.07642688602209091,0.28060391545295715,0.0754426121711731,0.25063779950141907,0.07642688602209091 +31,110207,,,,,,,0.2281114161014557,0.07280877977609634,0.35282576084136963,0.123843252658844,0.34118255972862244,,,,,,, +32,110249,,,,,,,,,,,,0.06781049072742462,,,,,, +32,110299,,,,,,,,,,,,0.06507672369480133,,,,,, +32,110349,,,,,,,,,,,,0.09198546409606934,,,,,, +32,110399,,,,,,,,,,,,0.07766701281070709,,,,,, +32,110449,,,,,,,,,,,,0.06692512333393097,,,,,, +32,110499,,,,,,,,,,,,0.09685724228620529,,,,,, +32,110549,,,,,,,,,,,,0.07255399227142334,,,,,, +32,110599,,,,,,,,,,,,0.06928132474422455,,,,,, +32,110649,,,,,,,,,,,,0.07496697455644608,,,,,, +32,110699,,,,,,,,,,,,0.0740375816822052,,,,,, +32,110749,,,,,,,,,,,,0.0700056403875351,,,,,, +32,110799,,,,,,,,,,,,0.07804448902606964,,,,,, +32,110849,,,,,,,,,,,,0.05398818105459213,,,,,, +32,110899,,,,,,,,,,,,0.06297170370817184,,,,,, +32,110949,,,,,,,,,,,,0.06912870705127716,,,,,, +32,110999,,,,,,,,,,,,0.06476452946662903,,,,,, +32,111049,,,,,,,,,,,,0.0765826404094696,,,,,, +32,111099,,,,,,,,,,,,0.07013307511806488,,,,,, +32,111149,,,,,,,,,,,,0.077715203166008,,,,,, +32,111199,,,,,,,,,,,,0.0635855421423912,,,,,, +32,111249,,,,,,,,,,,,0.07326813787221909,,,,,, +32,111299,,,,,,,,,,,,0.0624583475291729,,,,,, +32,111349,,,,,,,,,,,,0.061724886298179626,,,,,, +32,111399,,,,,,,,,,,,0.080301433801651,,,,,, +32,111449,,,,,,,,,,,,0.07311325520277023,,,,,, +32,111499,,,,,,,,,,,,0.06350810825824738,,,,,, +32,111549,,,,,,,,,,,,0.07565566897392273,,,,,, +32,111599,,,,,,,,,,,,0.06571291387081146,,,,,, +32,111649,,,,,,,,,,,,0.06369023025035858,,,,,, +32,111699,,,,,,,,,,,,0.07635435461997986,,,,,, +32,111749,,,,,,,,,,,,0.07794058322906494,,,,,, +32,111799,,,,,,,,,,,,0.07682038843631744,,,,,, +32,111849,,,,,,,,,,,,0.06725829839706421,,,,,, +32,111899,,,,,,,,,,,,0.06876663863658905,,,,,, +32,111949,,,,,,,,,,,,0.07364839315414429,,,,,, +32,111999,,,,,,,,,,,,0.0710398331284523,,,,,, +32,112049,,,,,,,,,,,,0.08165435492992401,,,,,, +32,112099,,,,,,,,,,,,0.05973043665289879,,,,,, +32,112149,,,,,,,,,,,,0.06839422136545181,,,,,, +32,112199,,,,,,,,,,,,0.07401276379823685,,,,,, +32,112249,,,,,,,,,,,,0.0657334104180336,,,,,, +32,112299,,,,,,,,,,,,0.07262793183326721,,,,,, +32,112349,,,,,,,,,,,,0.0766650065779686,,,,,, +32,112399,,,,,,,,,,,,0.06114790588617325,,,,,, +32,112449,,,,,,,,,,,,0.06752116978168488,,,,,, +32,112499,,,,,,,,,,,,0.0730411484837532,,,,,, +32,112549,,,,,,,,,,,,0.07103437185287476,,,,,, +32,112599,,,,,,,,,,,,0.07692267000675201,,,,,, +32,112649,,,,,,,,,,,,0.07494338601827621,,,,,, +32,112699,,,,,,,,,,,,0.06693501770496368,,,,,, +32,112749,,,,,,,,,,,,0.06185528635978699,,,,,, +32,112799,,,,,,,,,,,,0.0771474540233612,,,,,, +32,112849,,,,,,,,,,,,0.07645633816719055,,,,,, +32,112899,,,,,,,,,,,,0.07779856771230698,,,,,, +32,112949,,,,,,,,,,,,0.06883666664361954,,,,,, +32,112999,,,,,,,,,,,,0.06691879779100418,,,,,, +32,113049,,,,,,,,,,,,0.08839188516139984,,,,,, +32,113099,,,,,,,,,,,,0.06392757594585419,,,,,, +32,113149,,,,,,,,,,,,0.06705998629331589,,,,,, +32,113199,,,,,,,,,,,,0.06558796763420105,,,,,, +32,113249,,,,,,,,,,,,0.0651867464184761,,,,,, +32,113299,,,,,,,,,,,,0.06996135413646698,,,,,, +32,113349,,,,,,,,,,,,0.08781048655509949,,,,,, +32,113399,,,,,,,,,,,,0.06129950284957886,,,,,, +32,113449,,,,,,,,,,,,0.06589134782552719,,,,,, +32,113499,,,,,,,,,,,,0.07599781453609467,,,,,, +32,113549,,,,,,,,,,,,0.07399202883243561,,,,,, +32,113599,,,,,,,,,,,,0.07703110575675964,,,,,, +32,113649,,,,,,,,,,,,0.06901101768016815,,,,,, +32,113651,,,,,,,,,,,,,0.23687376081943512,0.07721418142318726,0.27788686752319336,0.0659184455871582,0.24871236085891724,0.07721418142318726 +32,113651,,,,,,,0.22644144296646118,0.07177699357271194,0.3694949448108673,0.1362711787223816,0.3563888669013977,,,,,,, +33,113699,,,,,,,,,,,,0.07244564592838287,,,,,, +33,113749,,,,,,,,,,,,0.07402081787586212,,,,,, +33,113799,,,,,,,,,,,,0.07656977325677872,,,,,, +33,113849,,,,,,,,,,,,0.06408079713582993,,,,,, +33,113899,,,,,,,,,,,,0.07411215454339981,,,,,, +33,113949,,,,,,,,,,,,0.07498620450496674,,,,,, +33,113999,,,,,,,,,,,,0.07340328395366669,,,,,, +33,114049,,,,,,,,,,,,0.05491240322589874,,,,,, +33,114099,,,,,,,,,,,,0.06742715835571289,,,,,, +33,114149,,,,,,,,,,,,0.07663977146148682,,,,,, +33,114199,,,,,,,,,,,,0.07131757587194443,,,,,, +33,114249,,,,,,,,,,,,0.07399865984916687,,,,,, +33,114299,,,,,,,,,,,,0.07685470581054688,,,,,, +33,114349,,,,,,,,,,,,0.08323556184768677,,,,,, +33,114399,,,,,,,,,,,,0.07786450535058975,,,,,, +33,114449,,,,,,,,,,,,0.07537798583507538,,,,,, +33,114499,,,,,,,,,,,,0.07107626646757126,,,,,, +33,114549,,,,,,,,,,,,0.0862094908952713,,,,,, +33,114599,,,,,,,,,,,,0.07217323780059814,,,,,, +33,114649,,,,,,,,,,,,0.06087556481361389,,,,,, +33,114699,,,,,,,,,,,,0.07878409326076508,,,,,, +33,114749,,,,,,,,,,,,0.05783711373806,,,,,, +33,114799,,,,,,,,,,,,0.06894791126251221,,,,,, +33,114849,,,,,,,,,,,,0.06921720504760742,,,,,, +33,114899,,,,,,,,,,,,0.08212365210056305,,,,,, +33,114949,,,,,,,,,,,,0.08007379621267319,,,,,, +33,114999,,,,,,,,,,,,0.07266746461391449,,,,,, +33,115049,,,,,,,,,,,,0.07276536524295807,,,,,, +33,115099,,,,,,,,,,,,0.0721784383058548,,,,,, +33,115149,,,,,,,,,,,,0.07477978616952896,,,,,, +33,115199,,,,,,,,,,,,0.06392930448055267,,,,,, +33,115249,,,,,,,,,,,,0.06017972528934479,,,,,, +33,115299,,,,,,,,,,,,0.06141930818557739,,,,,, +33,115349,,,,,,,,,,,,0.06959451735019684,,,,,, +33,115399,,,,,,,,,,,,0.0778154581785202,,,,,, +33,115449,,,,,,,,,,,,0.07591667771339417,,,,,, +33,115499,,,,,,,,,,,,0.06907647848129272,,,,,, +33,115549,,,,,,,,,,,,0.06716600805521011,,,,,, +33,115599,,,,,,,,,,,,0.0669940784573555,,,,,, +33,115649,,,,,,,,,,,,0.06113659590482712,,,,,, +33,115699,,,,,,,,,,,,0.06599841266870499,,,,,, +33,115749,,,,,,,,,,,,0.051490556448698044,,,,,, +33,115799,,,,,,,,,,,,0.07614735513925552,,,,,, +33,115849,,,,,,,,,,,,0.07289725542068481,,,,,, +33,115899,,,,,,,,,,,,0.07784849405288696,,,,,, +33,115949,,,,,,,,,,,,0.0833616629242897,,,,,, +33,115999,,,,,,,,,,,,0.07855455577373505,,,,,, +33,116049,,,,,,,,,,,,0.08109010756015778,,,,,, +33,116099,,,,,,,,,,,,0.06828980892896652,,,,,, +33,116149,,,,,,,,,,,,0.0602361224591732,,,,,, +33,116199,,,,,,,,,,,,0.08515030145645142,,,,,, +33,116249,,,,,,,,,,,,0.07354316860437393,,,,,, +33,116299,,,,,,,,,,,,0.070022352039814,,,,,, +33,116349,,,,,,,,,,,,0.07278113067150116,,,,,, +33,116399,,,,,,,,,,,,0.08897939324378967,,,,,, +33,116449,,,,,,,,,,,,0.06588295102119446,,,,,, +33,116499,,,,,,,,,,,,0.07284396886825562,,,,,, +33,116549,,,,,,,,,,,,0.07469093799591064,,,,,, +33,116599,,,,,,,,,,,,0.07978552579879761,,,,,, +33,116649,,,,,,,,,,,,0.06338979303836823,,,,,, +33,116699,,,,,,,,,,,,0.080544114112854,,,,,, +33,116749,,,,,,,,,,,,0.08468951284885406,,,,,, +33,116799,,,,,,,,,,,,0.07539927959442139,,,,,, +33,116849,,,,,,,,,,,,0.07810243964195251,,,,,, +33,116899,,,,,,,,,,,,0.07052002847194672,,,,,, +33,116949,,,,,,,,,,,,0.07027500867843628,,,,,, +33,116999,,,,,,,,,,,,0.07813423126935959,,,,,, +33,117049,,,,,,,,,,,,0.07921579480171204,,,,,, +33,117095,,,,,,,,,,,,,0.23723800480365753,0.07663491368293762,0.27585965394973755,0.07292598485946655,0.24827228486537933,0.07663491368293762 +33,117095,,,,,,,0.2273770272731781,0.0725424736738205,0.35749176144599915,0.12704169750213623,0.34722900390625,,,,,,, +34,117099,,,,,,,,,,,,0.07606159150600433,,,,,, +34,117149,,,,,,,,,,,,0.07009690999984741,,,,,, +34,117199,,,,,,,,,,,,0.07517103850841522,,,,,, +34,117249,,,,,,,,,,,,0.07406094670295715,,,,,, +34,117299,,,,,,,,,,,,0.07823710888624191,,,,,, +34,117349,,,,,,,,,,,,0.0671120434999466,,,,,, +34,117399,,,,,,,,,,,,0.0848325788974762,,,,,, +34,117449,,,,,,,,,,,,0.07373884320259094,,,,,, +34,117499,,,,,,,,,,,,0.07472333312034607,,,,,, +34,117549,,,,,,,,,,,,0.08855530619621277,,,,,, +34,117599,,,,,,,,,,,,0.06789866834878922,,,,,, +34,117649,,,,,,,,,,,,0.07435007393360138,,,,,, +34,117699,,,,,,,,,,,,0.08071760833263397,,,,,, +34,117749,,,,,,,,,,,,0.07847698777914047,,,,,, +34,117799,,,,,,,,,,,,0.08086389303207397,,,,,, +34,117849,,,,,,,,,,,,0.0777382105588913,,,,,, +34,117899,,,,,,,,,,,,0.07216735184192657,,,,,, +34,117949,,,,,,,,,,,,0.06699496507644653,,,,,, +34,117999,,,,,,,,,,,,0.07793166488409042,,,,,, +34,118049,,,,,,,,,,,,0.06956789642572403,,,,,, +34,118099,,,,,,,,,,,,0.07096955180168152,,,,,, +34,118149,,,,,,,,,,,,0.07985758036375046,,,,,, +34,118199,,,,,,,,,,,,0.06366532295942307,,,,,, +34,118249,,,,,,,,,,,,0.08026350289583206,,,,,, +34,118299,,,,,,,,,,,,0.07039114832878113,,,,,, +34,118349,,,,,,,,,,,,0.06467712670564651,,,,,, +34,118399,,,,,,,,,,,,0.05900613218545914,,,,,, +34,118449,,,,,,,,,,,,0.07713659107685089,,,,,, +34,118499,,,,,,,,,,,,0.08827608823776245,,,,,, +34,118549,,,,,,,,,,,,0.07328449189662933,,,,,, +34,118599,,,,,,,,,,,,0.07801635563373566,,,,,, +34,118649,,,,,,,,,,,,0.08372227847576141,,,,,, +34,118699,,,,,,,,,,,,0.06504634767770767,,,,,, +34,118749,,,,,,,,,,,,0.06640540063381195,,,,,, +34,118799,,,,,,,,,,,,0.06957773864269257,,,,,, +34,118849,,,,,,,,,,,,0.06770601123571396,,,,,, +34,118899,,,,,,,,,,,,0.06453351676464081,,,,,, +34,118949,,,,,,,,,,,,0.07019761204719543,,,,,, +34,118999,,,,,,,,,,,,0.06530673056840897,,,,,, +34,119049,,,,,,,,,,,,0.06695254892110825,,,,,, +34,119099,,,,,,,,,,,,0.07477421313524246,,,,,, +34,119149,,,,,,,,,,,,0.07299040257930756,,,,,, +34,119199,,,,,,,,,,,,0.07303421944379807,,,,,, +34,119249,,,,,,,,,,,,0.06567889451980591,,,,,, +34,119299,,,,,,,,,,,,0.0779033675789833,,,,,, +34,119349,,,,,,,,,,,,0.06898194551467896,,,,,, +34,119399,,,,,,,,,,,,0.07619252800941467,,,,,, +34,119449,,,,,,,,,,,,0.06519891321659088,,,,,, +34,119499,,,,,,,,,,,,0.07665959000587463,,,,,, +34,119549,,,,,,,,,,,,0.06708933413028717,,,,,, +34,119599,,,,,,,,,,,,0.07229039072990417,,,,,, +34,119649,,,,,,,,,,,,0.07037893682718277,,,,,, +34,119699,,,,,,,,,,,,0.06615497171878815,,,,,, +34,119749,,,,,,,,,,,,0.07263695448637009,,,,,, +34,119799,,,,,,,,,,,,0.07276046276092529,,,,,, +34,119849,,,,,,,,,,,,0.06267547607421875,,,,,, +34,119899,,,,,,,,,,,,0.0800410583615303,,,,,, +34,119949,,,,,,,,,,,,0.07308551669120789,,,,,, +34,119999,,,,,,,,,,,,0.06992311775684357,,,,,, +34,120049,,,,,,,,,,,,0.08400709182024002,,,,,, +34,120099,,,,,,,,,,,,0.07119172811508179,,,,,, +34,120149,,,,,,,,,,,,0.07205802202224731,,,,,, +34,120199,,,,,,,,,,,,0.06606006622314453,,,,,, +34,120249,,,,,,,,,,,,0.07142071425914764,,,,,, +34,120299,,,,,,,,,,,,0.07058512419462204,,,,,, +34,120349,,,,,,,,,,,,0.07375702261924744,,,,,, +34,120399,,,,,,,,,,,,0.06786040961742401,,,,,, +34,120449,,,,,,,,,,,,0.06610017269849777,,,,,, +34,120499,,,,,,,,,,,,0.07141567021608353,,,,,, +34,120539,,,,,,,,,,,,,0.23778577148914337,0.07732561975717545,0.28016790747642517,0.06457030773162842,0.2528505027294159,0.07732561975717545 +34,120539,,,,,,,0.22555193305015564,0.0713055357336998,0.37705591320991516,0.14193040132522583,0.36339765787124634,,,,,,, +35,120549,,,,,,,,,,,,0.07235851883888245,,,,,, +35,120599,,,,,,,,,,,,0.07789088785648346,,,,,, +35,120649,,,,,,,,,,,,0.05682076886296272,,,,,, +35,120699,,,,,,,,,,,,0.07076204568147659,,,,,, +35,120749,,,,,,,,,,,,0.06615203619003296,,,,,, +35,120799,,,,,,,,,,,,0.06954608857631683,,,,,, +35,120849,,,,,,,,,,,,0.0745476707816124,,,,,, +35,120899,,,,,,,,,,,,0.066476009786129,,,,,, +35,120949,,,,,,,,,,,,0.07064284384250641,,,,,, +35,120999,,,,,,,,,,,,0.07348830997943878,,,,,, +35,121049,,,,,,,,,,,,0.06842809170484543,,,,,, +35,121099,,,,,,,,,,,,0.07844908535480499,,,,,, +35,121149,,,,,,,,,,,,0.07462078332901001,,,,,, +35,121199,,,,,,,,,,,,0.07482187449932098,,,,,, +35,121249,,,,,,,,,,,,0.06507986783981323,,,,,, +35,121299,,,,,,,,,,,,0.07752607017755508,,,,,, +35,121349,,,,,,,,,,,,0.07644181698560715,,,,,, +35,121399,,,,,,,,,,,,0.06263917684555054,,,,,, +35,121449,,,,,,,,,,,,0.07010270655155182,,,,,, +35,121499,,,,,,,,,,,,0.0640040785074234,,,,,, +35,121549,,,,,,,,,,,,0.08919902890920639,,,,,, +35,121599,,,,,,,,,,,,0.06967747211456299,,,,,, +35,121649,,,,,,,,,,,,0.06816086173057556,,,,,, +35,121699,,,,,,,,,,,,0.06751290708780289,,,,,, +35,121749,,,,,,,,,,,,0.05884986370801926,,,,,, +35,121799,,,,,,,,,,,,0.07202421873807907,,,,,, +35,121849,,,,,,,,,,,,0.07546010613441467,,,,,, +35,121899,,,,,,,,,,,,0.06536441296339035,,,,,, +35,121949,,,,,,,,,,,,0.06706978380680084,,,,,, +35,121999,,,,,,,,,,,,0.06958938390016556,,,,,, +35,122049,,,,,,,,,,,,0.07288717478513718,,,,,, +35,122099,,,,,,,,,,,,0.06286327540874481,,,,,, +35,122149,,,,,,,,,,,,0.0765356793999672,,,,,, +35,122199,,,,,,,,,,,,0.07120508700609207,,,,,, +35,122249,,,,,,,,,,,,0.0781155377626419,,,,,, +35,122299,,,,,,,,,,,,0.07248476147651672,,,,,, +35,122349,,,,,,,,,,,,0.0660717636346817,,,,,, +35,122399,,,,,,,,,,,,0.06942909210920334,,,,,, +35,122449,,,,,,,,,,,,0.05268588289618492,,,,,, +35,122499,,,,,,,,,,,,0.07256294786930084,,,,,, +35,122549,,,,,,,,,,,,0.06071934103965759,,,,,, +35,122599,,,,,,,,,,,,0.07349608838558197,,,,,, +35,122649,,,,,,,,,,,,0.07234294712543488,,,,,, +35,122699,,,,,,,,,,,,0.07178375124931335,,,,,, +35,122749,,,,,,,,,,,,0.06773529946804047,,,,,, +35,122799,,,,,,,,,,,,0.06899124383926392,,,,,, +35,122849,,,,,,,,,,,,0.06608507037162781,,,,,, +35,122899,,,,,,,,,,,,0.06578384339809418,,,,,, +35,122949,,,,,,,,,,,,0.07693499326705933,,,,,, +35,122999,,,,,,,,,,,,0.06847124546766281,,,,,, +35,123049,,,,,,,,,,,,0.06899884343147278,,,,,, +35,123099,,,,,,,,,,,,0.07833816111087799,,,,,, +35,123149,,,,,,,,,,,,0.06580737978219986,,,,,, +35,123199,,,,,,,,,,,,0.06208840012550354,,,,,, +35,123249,,,,,,,,,,,,0.07000415027141571,,,,,, +35,123299,,,,,,,,,,,,0.07245273888111115,,,,,, +35,123349,,,,,,,,,,,,0.07265730947256088,,,,,, +35,123399,,,,,,,,,,,,0.07590286433696747,,,,,, +35,123449,,,,,,,,,,,,0.07528986036777496,,,,,, +35,123499,,,,,,,,,,,,0.056066323071718216,,,,,, +35,123549,,,,,,,,,,,,0.08055819571018219,,,,,, +35,123599,,,,,,,,,,,,0.07370874285697937,,,,,, +35,123649,,,,,,,,,,,,0.05752617120742798,,,,,, +35,123699,,,,,,,,,,,,0.054467979818582535,,,,,, +35,123749,,,,,,,,,,,,0.07725289463996887,,,,,, +35,123799,,,,,,,,,,,,0.06427057087421417,,,,,, +35,123849,,,,,,,,,,,,0.06328903883695602,,,,,, +35,123899,,,,,,,,,,,,0.06995868682861328,,,,,, +35,123949,,,,,,,,,,,,0.08147382736206055,,,,,, +35,123983,,,,,,,,,,,,,0.2355872094631195,0.076894611120224,0.2788771986961365,0.06978440284729004,0.2521829307079315,0.076894611120224 +35,123983,,,,,,,0.22484609484672546,0.07096174359321594,0.38242676854133606,0.1460709571838379,0.3674834966659546,,,,,,, +36,123999,,,,,,,,,,,,0.06759485602378845,,,,,, +36,124049,,,,,,,,,,,,0.06555245816707611,,,,,, +36,124099,,,,,,,,,,,,0.06876344978809357,,,,,, +36,124149,,,,,,,,,,,,0.07190150767564774,,,,,, +36,124199,,,,,,,,,,,,0.07751365005970001,,,,,, +36,124249,,,,,,,,,,,,0.08250393718481064,,,,,, +36,124299,,,,,,,,,,,,0.06213892623782158,,,,,, +36,124349,,,,,,,,,,,,0.08697497844696045,,,,,, +36,124399,,,,,,,,,,,,0.06836086511611938,,,,,, +36,124449,,,,,,,,,,,,0.06743557751178741,,,,,, +36,124499,,,,,,,,,,,,0.06229500472545624,,,,,, +36,124549,,,,,,,,,,,,0.07254283875226974,,,,,, +36,124599,,,,,,,,,,,,0.07192355394363403,,,,,, +36,124649,,,,,,,,,,,,0.0672595202922821,,,,,, +36,124699,,,,,,,,,,,,0.06573473662137985,,,,,, +36,124749,,,,,,,,,,,,0.07418988645076752,,,,,, +36,124799,,,,,,,,,,,,0.07288040220737457,,,,,, +36,124849,,,,,,,,,,,,0.0641348659992218,,,,,, +36,124899,,,,,,,,,,,,0.0567835196852684,,,,,, +36,124949,,,,,,,,,,,,0.05985787510871887,,,,,, +36,124999,,,,,,,,,,,,0.07395191490650177,,,,,, +36,125049,,,,,,,,,,,,0.0729660764336586,,,,,, +36,125099,,,,,,,,,,,,0.07009728252887726,,,,,, +36,125149,,,,,,,,,,,,0.06801491975784302,,,,,, +36,125199,,,,,,,,,,,,0.056860871613025665,,,,,, +36,125249,,,,,,,,,,,,0.0732470229268074,,,,,, +36,125299,,,,,,,,,,,,0.06992188096046448,,,,,, +36,125349,,,,,,,,,,,,0.07313553988933563,,,,,, +36,125399,,,,,,,,,,,,0.06582668423652649,,,,,, +36,125449,,,,,,,,,,,,0.06458431482315063,,,,,, +36,125499,,,,,,,,,,,,0.07445608824491501,,,,,, +36,125549,,,,,,,,,,,,0.05528842657804489,,,,,, +36,125599,,,,,,,,,,,,0.07098349928855896,,,,,, +36,125649,,,,,,,,,,,,0.0787612646818161,,,,,, +36,125699,,,,,,,,,,,,0.07323101907968521,,,,,, +36,125749,,,,,,,,,,,,0.07570619881153107,,,,,, +36,125799,,,,,,,,,,,,0.06141526997089386,,,,,, +36,125849,,,,,,,,,,,,0.06937535852193832,,,,,, +36,125899,,,,,,,,,,,,0.058289334177970886,,,,,, +36,125949,,,,,,,,,,,,0.08139708638191223,,,,,, +36,125999,,,,,,,,,,,,0.06373941898345947,,,,,, +36,126049,,,,,,,,,,,,0.07018767297267914,,,,,, +36,126099,,,,,,,,,,,,0.06387724727392197,,,,,, +36,126149,,,,,,,,,,,,0.06536306440830231,,,,,, +36,126199,,,,,,,,,,,,0.05823113024234772,,,,,, +36,126249,,,,,,,,,,,,0.06209868937730789,,,,,, +36,126299,,,,,,,,,,,,0.07118982076644897,,,,,, +36,126349,,,,,,,,,,,,0.06633419543504715,,,,,, +36,126399,,,,,,,,,,,,0.07031969726085663,,,,,, +36,126449,,,,,,,,,,,,0.06387913972139359,,,,,, +36,126499,,,,,,,,,,,,0.05918846279382706,,,,,, +36,126549,,,,,,,,,,,,0.06953588128089905,,,,,, +36,126599,,,,,,,,,,,,0.06893733143806458,,,,,, +36,126649,,,,,,,,,,,,0.07026146352291107,,,,,, +36,126699,,,,,,,,,,,,0.060677897185087204,,,,,, +36,126749,,,,,,,,,,,,0.08218791335821152,,,,,, +36,126799,,,,,,,,,,,,0.07137561589479446,,,,,, +36,126849,,,,,,,,,,,,0.07339582592248917,,,,,, +36,126899,,,,,,,,,,,,0.08624008297920227,,,,,, +36,126949,,,,,,,,,,,,0.07479437440633774,,,,,, +36,126999,,,,,,,,,,,,0.07627685368061066,,,,,, +36,127049,,,,,,,,,,,,0.07170063257217407,,,,,, +36,127099,,,,,,,,,,,,0.06003238260746002,,,,,, +36,127149,,,,,,,,,,,,0.05988688766956329,,,,,, +36,127199,,,,,,,,,,,,0.06472925841808319,,,,,, +36,127249,,,,,,,,,,,,0.0653403252363205,,,,,, +36,127299,,,,,,,,,,,,0.056193757802248,,,,,, +36,127349,,,,,,,,,,,,0.060599468648433685,,,,,, +36,127399,,,,,,,,,,,,0.05412731319665909,,,,,, +36,127427,,,,,,,,,,,,,0.23503375053405762,0.07647659629583359,0.28072088956832886,0.07484126091003418,0.2555359899997711,0.07647659629583359 +36,127427,,,,,,,0.22434110939502716,0.07065217941999435,0.38721612095832825,0.1497923731803894,0.37248507142066956,,,,,,, +37,127449,,,,,,,,,,,,0.07199063897132874,,,,,, +37,127499,,,,,,,,,,,,0.061689894646406174,,,,,, +37,127549,,,,,,,,,,,,0.06939185410737991,,,,,, +37,127599,,,,,,,,,,,,0.06741654127836227,,,,,, +37,127649,,,,,,,,,,,,0.06917118281126022,,,,,, +37,127699,,,,,,,,,,,,0.08226603269577026,,,,,, +37,127749,,,,,,,,,,,,0.07244303822517395,,,,,, +37,127799,,,,,,,,,,,,0.07426978647708893,,,,,, +37,127849,,,,,,,,,,,,0.0713382139801979,,,,,, +37,127899,,,,,,,,,,,,0.06868220865726471,,,,,, +37,127949,,,,,,,,,,,,0.08924880623817444,,,,,, +37,127999,,,,,,,,,,,,0.07641354203224182,,,,,, +37,128049,,,,,,,,,,,,0.07386959344148636,,,,,, +37,128099,,,,,,,,,,,,0.07383893430233002,,,,,, +37,128149,,,,,,,,,,,,0.07213645428419113,,,,,, +37,128199,,,,,,,,,,,,0.0742759108543396,,,,,, +37,128249,,,,,,,,,,,,0.08666212856769562,,,,,, +37,128299,,,,,,,,,,,,0.07454989850521088,,,,,, +37,128349,,,,,,,,,,,,0.07789406925439835,,,,,, +37,128399,,,,,,,,,,,,0.07740399241447449,,,,,, +37,128449,,,,,,,,,,,,0.07124282419681549,,,,,, +37,128499,,,,,,,,,,,,0.08333665132522583,,,,,, +37,128549,,,,,,,,,,,,0.07291778177022934,,,,,, +37,128599,,,,,,,,,,,,0.06808602809906006,,,,,, +37,128649,,,,,,,,,,,,0.07227011024951935,,,,,, +37,128699,,,,,,,,,,,,0.08000072091817856,,,,,, +37,128749,,,,,,,,,,,,0.08168663084506989,,,,,, +37,128799,,,,,,,,,,,,0.06285057216882706,,,,,, +37,128849,,,,,,,,,,,,0.07290598005056381,,,,,, +37,128899,,,,,,,,,,,,0.06962485611438751,,,,,, +37,128949,,,,,,,,,,,,0.07229537516832352,,,,,, +37,128999,,,,,,,,,,,,0.06793834269046783,,,,,, +37,129049,,,,,,,,,,,,0.06882753223180771,,,,,, +37,129099,,,,,,,,,,,,0.06859871745109558,,,,,, +37,129149,,,,,,,,,,,,0.07054576277732849,,,,,, +37,129199,,,,,,,,,,,,0.07321052253246307,,,,,, +37,129249,,,,,,,,,,,,0.0724731907248497,,,,,, +37,129299,,,,,,,,,,,,0.07654990255832672,,,,,, +37,129349,,,,,,,,,,,,0.06613524258136749,,,,,, +37,129399,,,,,,,,,,,,0.06904520094394684,,,,,, +37,129449,,,,,,,,,,,,0.0668705478310585,,,,,, +37,129499,,,,,,,,,,,,0.09966246783733368,,,,,, +37,129549,,,,,,,,,,,,0.06712089478969574,,,,,, +37,129599,,,,,,,,,,,,0.0693085715174675,,,,,, +37,129649,,,,,,,,,,,,0.0687824934720993,,,,,, +37,129699,,,,,,,,,,,,0.07657888531684875,,,,,, +37,129749,,,,,,,,,,,,0.07606641948223114,,,,,, +37,129799,,,,,,,,,,,,0.08401402086019516,,,,,, +37,129849,,,,,,,,,,,,0.0715491771697998,,,,,, +37,129899,,,,,,,,,,,,0.078688845038414,,,,,, +37,129949,,,,,,,,,,,,0.07024435698986053,,,,,, +37,129999,,,,,,,,,,,,0.0680750384926796,,,,,, +37,130049,,,,,,,,,,,,0.05548813194036484,,,,,, +37,130099,,,,,,,,,,,,0.0776025652885437,,,,,, +37,130149,,,,,,,,,,,,0.07580432295799255,,,,,, +37,130199,,,,,,,,,,,,0.05705138295888901,,,,,, +37,130249,,,,,,,,,,,,0.07878635823726654,,,,,, +37,130299,,,,,,,,,,,,0.09042099118232727,,,,,, +37,130349,,,,,,,,,,,,0.07362831383943558,,,,,, +37,130399,,,,,,,,,,,,0.06610436737537384,,,,,, +37,130449,,,,,,,,,,,,0.06348611414432526,,,,,, +37,130499,,,,,,,,,,,,0.07017813622951508,,,,,, +37,130549,,,,,,,,,,,,0.07567687332630157,,,,,, +37,130599,,,,,,,,,,,,0.06829224526882172,,,,,, +37,130649,,,,,,,,,,,,0.07694436609745026,,,,,, +37,130699,,,,,,,,,,,,0.07045936584472656,,,,,, +37,130749,,,,,,,,,,,,0.07658781111240387,,,,,, +37,130799,,,,,,,,,,,,0.07775754481554031,,,,,, +37,130849,,,,,,,,,,,,0.07773705571889877,,,,,, +37,130871,,,,,,,,,,,,,0.23702190816402435,0.07626351714134216,0.282661497592926,0.07741886377334595,0.2543243169784546,0.07626351714134216 +37,130871,,,,,,,0.22907905280590057,0.07589875161647797,0.31118056178092957,0.08666008710861206,0.3343610465526581,,,,,,, +38,130899,,,,,,,,,,,,0.0713789090514183,,,,,, +38,130949,,,,,,,,,,,,0.07255259156227112,,,,,, +38,130999,,,,,,,,,,,,0.06949910521507263,,,,,, +38,131049,,,,,,,,,,,,0.07574285566806793,,,,,, +38,131099,,,,,,,,,,,,0.06545332819223404,,,,,, +38,131149,,,,,,,,,,,,0.06898326426744461,,,,,, +38,131199,,,,,,,,,,,,0.06735529005527496,,,,,, +38,131249,,,,,,,,,,,,0.06745922565460205,,,,,, +38,131299,,,,,,,,,,,,0.07353457808494568,,,,,, +38,131349,,,,,,,,,,,,0.06572259217500687,,,,,, +38,131399,,,,,,,,,,,,0.07099746912717819,,,,,, +38,131449,,,,,,,,,,,,0.09109026193618774,,,,,, +38,131499,,,,,,,,,,,,0.07331880927085876,,,,,, +38,131549,,,,,,,,,,,,0.07904952764511108,,,,,, +38,131599,,,,,,,,,,,,0.06545473635196686,,,,,, +38,131649,,,,,,,,,,,,0.06862129271030426,,,,,, +38,131699,,,,,,,,,,,,0.074851855635643,,,,,, +38,131749,,,,,,,,,,,,0.07372994720935822,,,,,, +38,131799,,,,,,,,,,,,0.06861842423677444,,,,,, +38,131849,,,,,,,,,,,,0.08110149204730988,,,,,, +38,131899,,,,,,,,,,,,0.06962372362613678,,,,,, +38,131949,,,,,,,,,,,,0.0738222599029541,,,,,, +38,131999,,,,,,,,,,,,0.07007449865341187,,,,,, +38,132049,,,,,,,,,,,,0.06379285454750061,,,,,, +38,132099,,,,,,,,,,,,0.08391212671995163,,,,,, +38,132149,,,,,,,,,,,,0.07462076842784882,,,,,, +38,132199,,,,,,,,,,,,0.07197589427232742,,,,,, +38,132249,,,,,,,,,,,,0.06276175379753113,,,,,, +38,132299,,,,,,,,,,,,0.06563568860292435,,,,,, +38,132349,,,,,,,,,,,,0.08365873992443085,,,,,, +38,132399,,,,,,,,,,,,0.06019458547234535,,,,,, +38,132449,,,,,,,,,,,,0.049815092235803604,,,,,, +38,132499,,,,,,,,,,,,0.06492879986763,,,,,, +38,132549,,,,,,,,,,,,0.07360879331827164,,,,,, +38,132599,,,,,,,,,,,,0.06662049144506454,,,,,, +38,132649,,,,,,,,,,,,0.08448272198438644,,,,,, +38,132699,,,,,,,,,,,,0.07909762114286423,,,,,, +38,132749,,,,,,,,,,,,0.06932726502418518,,,,,, +38,132799,,,,,,,,,,,,0.07792340219020844,,,,,, +38,132849,,,,,,,,,,,,0.09074273705482483,,,,,, +38,132899,,,,,,,,,,,,0.06913091987371445,,,,,, +38,132949,,,,,,,,,,,,0.06271781027317047,,,,,, +38,132999,,,,,,,,,,,,0.06545567512512207,,,,,, +38,133049,,,,,,,,,,,,0.06104746833443642,,,,,, +38,133099,,,,,,,,,,,,0.06420863419771194,,,,,, +38,133149,,,,,,,,,,,,0.07688415050506592,,,,,, +38,133199,,,,,,,,,,,,0.06916045397520065,,,,,, +38,133249,,,,,,,,,,,,0.07428233325481415,,,,,, +38,133299,,,,,,,,,,,,0.07147262990474701,,,,,, +38,133349,,,,,,,,,,,,0.07378517836332321,,,,,, +38,133399,,,,,,,,,,,,0.07036838680505753,,,,,, +38,133449,,,,,,,,,,,,0.07770369946956635,,,,,, +38,133499,,,,,,,,,,,,0.06859724223613739,,,,,, +38,133549,,,,,,,,,,,,0.07658767700195312,,,,,, +38,133599,,,,,,,,,,,,0.05530982464551926,,,,,, +38,133649,,,,,,,,,,,,0.08045823127031326,,,,,, +38,133699,,,,,,,,,,,,0.0755414366722107,,,,,, +38,133749,,,,,,,,,,,,0.06571679562330246,,,,,, +38,133799,,,,,,,,,,,,0.0660424679517746,,,,,, +38,133849,,,,,,,,,,,,0.06861622631549835,,,,,, +38,133899,,,,,,,,,,,,0.07057300209999084,,,,,, +38,133949,,,,,,,,,,,,0.07324393093585968,,,,,, +38,133999,,,,,,,,,,,,5.173343181610107,,,,,, +38,134049,,,,,,,,,,,,0.10124150663614273,,,,,, +38,134099,,,,,,,,,,,,0.07468489557504654,,,,,, +38,134149,,,,,,,,,,,,0.08214955776929855,,,,,, +38,134199,,,,,,,,,,,,0.06981886923313141,,,,,, +38,134249,,,,,,,,,,,,0.07910355925559998,,,,,, +38,134299,,,,,,,,,,,,0.07667434215545654,,,,,, +38,134315,,,,,,,,,,,,,0.24084897339344025,0.07799668610095978,0.26073819398880005,0.056452274322509766,0.22811000049114227,0.07799668610095978 +38,134315,,,,,,,0.2270553708076477,0.07395036518573761,0.3398929536342621,0.11009418964385986,0.34919634461402893,,,,,,, +39,134349,,,,,,,,,,,,0.07320395112037659,,,,,, +39,134399,,,,,,,,,,,,0.07805992662906647,,,,,, +39,134449,,,,,,,,,,,,0.0647718757390976,,,,,, +39,134499,,,,,,,,,,,,0.08015245199203491,,,,,, +39,134549,,,,,,,,,,,,0.06279686838388443,,,,,, +39,134599,,,,,,,,,,,,0.07508362829685211,,,,,, +39,134649,,,,,,,,,,,,0.07205218076705933,,,,,, +39,134699,,,,,,,,,,,,0.06725190579891205,,,,,, +39,134749,,,,,,,,,,,,0.07600419223308563,,,,,, +39,134799,,,,,,,,,,,,0.06723202019929886,,,,,, +39,134849,,,,,,,,,,,,0.06613082438707352,,,,,, +39,134899,,,,,,,,,,,,0.07540635019540787,,,,,, +39,134949,,,,,,,,,,,,0.07737448811531067,,,,,, +39,134999,,,,,,,,,,,,0.08264930546283722,,,,,, +39,135049,,,,,,,,,,,,0.07673235237598419,,,,,, +39,135099,,,,,,,,,,,,0.08003883808851242,,,,,, +39,135149,,,,,,,,,,,,0.07371224462985992,,,,,, +39,135199,,,,,,,,,,,,0.07352229952812195,,,,,, +39,135249,,,,,,,,,,,,0.0772632509469986,,,,,, +39,135299,,,,,,,,,,,,0.07468670606613159,,,,,, +39,135349,,,,,,,,,,,,0.06588946282863617,,,,,, +39,135399,,,,,,,,,,,,0.06898322701454163,,,,,, +39,135449,,,,,,,,,,,,0.08222638815641403,,,,,, +39,135499,,,,,,,,,,,,0.07843305170536041,,,,,, +39,135549,,,,,,,,,,,,0.07284698635339737,,,,,, +39,135599,,,,,,,,,,,,0.0838530883193016,,,,,, +39,135649,,,,,,,,,,,,0.07589682936668396,,,,,, +39,135699,,,,,,,,,,,,0.07092490047216415,,,,,, +39,135749,,,,,,,,,,,,0.0716133713722229,,,,,, +39,135799,,,,,,,,,,,,0.06519488990306854,,,,,, +39,135849,,,,,,,,,,,,0.07697923481464386,,,,,, +39,135899,,,,,,,,,,,,0.06520389020442963,,,,,, +39,135949,,,,,,,,,,,,0.08115971088409424,,,,,, +39,135999,,,,,,,,,,,,0.08111117780208588,,,,,, +39,136049,,,,,,,,,,,,0.07150648534297943,,,,,, +39,136099,,,,,,,,,,,,0.07572327554225922,,,,,, +39,136149,,,,,,,,,,,,0.07455743849277496,,,,,, +39,136199,,,,,,,,,,,,0.07335284352302551,,,,,, +39,136249,,,,,,,,,,,,0.06769716739654541,,,,,, +39,136299,,,,,,,,,,,,0.07842531055212021,,,,,, +39,136349,,,,,,,,,,,,0.07483837008476257,,,,,, +39,136399,,,,,,,,,,,,0.0690867155790329,,,,,, +39,136449,,,,,,,,,,,,0.055605705827474594,,,,,, +39,136499,,,,,,,,,,,,0.060019876807928085,,,,,, +39,136549,,,,,,,,,,,,0.0579209066927433,,,,,, +39,136599,,,,,,,,,,,,0.0730275958776474,,,,,, +39,136649,,,,,,,,,,,,0.05987134948372841,,,,,, +39,136699,,,,,,,,,,,,0.07179294526576996,,,,,, +39,136749,,,,,,,,,,,,0.07625391334295273,,,,,, +39,136799,,,,,,,,,,,,0.07982352375984192,,,,,, +39,136849,,,,,,,,,,,,0.0735752135515213,,,,,, +39,136899,,,,,,,,,,,,0.07731479406356812,,,,,, +39,136949,,,,,,,,,,,,0.06288912892341614,,,,,, +39,136999,,,,,,,,,,,,0.07056449353694916,,,,,, +39,137049,,,,,,,,,,,,0.06740684062242508,,,,,, +39,137099,,,,,,,,,,,,0.07279428839683533,,,,,, +39,137149,,,,,,,,,,,,0.0725645199418068,,,,,, +39,137199,,,,,,,,,,,,0.07371552288532257,,,,,, +39,137249,,,,,,,,,,,,0.06176663190126419,,,,,, +39,137299,,,,,,,,,,,,0.059505339711904526,,,,,, +39,137349,,,,,,,,,,,,0.07318341732025146,,,,,, +39,137399,,,,,,,,,,,,0.06696897000074387,,,,,, +39,137449,,,,,,,,,,,,0.07615023851394653,,,,,, +39,137499,,,,,,,,,,,,0.06500545144081116,,,,,, +39,137549,,,,,,,,,,,,0.08189055323600769,,,,,, +39,137599,,,,,,,,,,,,0.07936659455299377,,,,,, +39,137649,,,,,,,,,,,,0.09116552770137787,,,,,, +39,137699,,,,,,,,,,,,0.05927552282810211,,,,,, +39,137749,,,,,,,,,,,,0.08072751015424728,,,,,, +39,137759,,,,,,,,,,,,,0.23623378574848175,0.0764966830611229,0.28210917115211487,0.07459825277328491,0.25499945878982544,0.0764966830611229 +39,137759,,,,,,,0.2271985411643982,0.07219762355089188,0.36271142959594727,0.1311856508255005,0.3475395143032074,,,,,,, +40,137799,,,,,,,,,,,,0.08020657300949097,,,,,, +40,137849,,,,,,,,,,,,0.07849044352769852,,,,,, +40,137899,,,,,,,,,,,,0.07164637744426727,,,,,, +40,137949,,,,,,,,,,,,0.06322351843118668,,,,,, +40,137999,,,,,,,,,,,,0.06572739779949188,,,,,, +40,138049,,,,,,,,,,,,0.06560567766427994,,,,,, +40,138099,,,,,,,,,,,,0.06424805521965027,,,,,, +40,138149,,,,,,,,,,,,0.07068494707345963,,,,,, +40,138199,,,,,,,,,,,,0.0644766315817833,,,,,, +40,138249,,,,,,,,,,,,0.0767400860786438,,,,,, +40,138299,,,,,,,,,,,,0.08120158314704895,,,,,, +40,138349,,,,,,,,,,,,0.06383193284273148,,,,,, +40,138399,,,,,,,,,,,,0.05744124948978424,,,,,, +40,138449,,,,,,,,,,,,0.07913254201412201,,,,,, +40,138499,,,,,,,,,,,,0.06995508819818497,,,,,, +40,138549,,,,,,,,,,,,0.0712706446647644,,,,,, +40,138599,,,,,,,,,,,,0.0747135803103447,,,,,, +40,138649,,,,,,,,,,,,0.06536956876516342,,,,,, +40,138699,,,,,,,,,,,,0.06832925230264664,,,,,, +40,138749,,,,,,,,,,,,0.07069254666566849,,,,,, +40,138799,,,,,,,,,,,,0.06819882243871689,,,,,, +40,138849,,,,,,,,,,,,0.07603085041046143,,,,,, +40,138899,,,,,,,,,,,,0.0744439885020256,,,,,, +40,138949,,,,,,,,,,,,0.0743102952837944,,,,,, +40,138999,,,,,,,,,,,,0.06318718940019608,,,,,, +40,139049,,,,,,,,,,,,0.06869787722826004,,,,,, +40,139099,,,,,,,,,,,,0.06607259809970856,,,,,, +40,139149,,,,,,,,,,,,0.06965835392475128,,,,,, +40,139199,,,,,,,,,,,,0.0745578482747078,,,,,, +40,139249,,,,,,,,,,,,0.08360619097948074,,,,,, +40,139299,,,,,,,,,,,,0.06345825642347336,,,,,, +40,139349,,,,,,,,,,,,0.07170163094997406,,,,,, +40,139399,,,,,,,,,,,,0.0803804025053978,,,,,, +40,139449,,,,,,,,,,,,0.0676455870270729,,,,,, +40,139499,,,,,,,,,,,,0.07130312919616699,,,,,, +40,139549,,,,,,,,,,,,0.06500989198684692,,,,,, +40,139599,,,,,,,,,,,,0.06502233445644379,,,,,, +40,139649,,,,,,,,,,,,0.06765655428171158,,,,,, +40,139699,,,,,,,,,,,,0.06211214140057564,,,,,, +40,139749,,,,,,,,,,,,0.07995705306529999,,,,,, +40,139799,,,,,,,,,,,,0.06179344654083252,,,,,, +40,139849,,,,,,,,,,,,0.06961149722337723,,,,,, +40,139899,,,,,,,,,,,,0.08284367620944977,,,,,, +40,139949,,,,,,,,,,,,0.06590205430984497,,,,,, +40,139999,,,,,,,,,,,,0.07215693593025208,,,,,, +40,140049,,,,,,,,,,,,0.07118315249681473,,,,,, +40,140099,,,,,,,,,,,,0.08145847171545029,,,,,, +40,140149,,,,,,,,,,,,0.05707772821187973,,,,,, +40,140199,,,,,,,,,,,,0.06524807214736938,,,,,, +40,140249,,,,,,,,,,,,0.08724501729011536,,,,,, +40,140299,,,,,,,,,,,,0.07625894248485565,,,,,, +40,140349,,,,,,,,,,,,0.10151023417711258,,,,,, +40,140399,,,,,,,,,,,,0.08433365076780319,,,,,, +40,140449,,,,,,,,,,,,0.07441726326942444,,,,,, +40,140499,,,,,,,,,,,,0.06359042972326279,,,,,, +40,140549,,,,,,,,,,,,0.07388864457607269,,,,,, +40,140599,,,,,,,,,,,,0.06802991032600403,,,,,, +40,140649,,,,,,,,,,,,0.06544989347457886,,,,,, +40,140699,,,,,,,,,,,,0.08231968432664871,,,,,, +40,140749,,,,,,,,,,,,0.07552073895931244,,,,,, +40,140799,,,,,,,,,,,,0.07282072305679321,,,,,, +40,140849,,,,,,,,,,,,0.0713360533118248,,,,,, +40,140899,,,,,,,,,,,,0.06900685280561447,,,,,, +40,140949,,,,,,,,,,,,0.07757199555635452,,,,,, +40,140999,,,,,,,,,,,,0.07821360230445862,,,,,, +40,141049,,,,,,,,,,,,0.06625352054834366,,,,,, +40,141099,,,,,,,,,,,,0.07189242541790009,,,,,, +40,141149,,,,,,,,,,,,0.06565611064434052,,,,,, +40,141199,,,,,,,,,,,,0.0723758265376091,,,,,, +40,141203,,,,,,,,,,,,,0.2382565140724182,0.07827167212963104,0.26468926668167114,0.053125619888305664,0.22858931124210358,0.07827167212963104 +40,141203,,,,,,,0.22703054547309875,0.07862052321434021,0.2954637408256531,0.05390119552612305,0.3478339910507202,,,,,,, +41,141249,,,,,,,,,,,,0.07322394847869873,,,,,, +41,141299,,,,,,,,,,,,0.06159309670329094,,,,,, +41,141349,,,,,,,,,,,,0.08018802851438522,,,,,, +41,141399,,,,,,,,,,,,0.06353238224983215,,,,,, +41,141449,,,,,,,,,,,,0.08397845178842545,,,,,, +41,141499,,,,,,,,,,,,0.07821011543273926,,,,,, +41,141549,,,,,,,,,,,,0.07037519663572311,,,,,, +41,141599,,,,,,,,,,,,0.06118694692850113,,,,,, +41,141649,,,,,,,,,,,,0.06507646292448044,,,,,, +41,141699,,,,,,,,,,,,0.07652626931667328,,,,,, +41,141749,,,,,,,,,,,,0.07841227203607559,,,,,, +41,141799,,,,,,,,,,,,0.0902998149394989,,,,,, +41,141849,,,,,,,,,,,,0.06886124610900879,,,,,, +41,141899,,,,,,,,,,,,0.07244408130645752,,,,,, +41,141949,,,,,,,,,,,,0.08270794153213501,,,,,, +41,141999,,,,,,,,,,,,0.07609585672616959,,,,,, +41,142049,,,,,,,,,,,,0.0642513856291771,,,,,, +41,142099,,,,,,,,,,,,0.06431819498538971,,,,,, +41,142149,,,,,,,,,,,,0.07434257864952087,,,,,, +41,142199,,,,,,,,,,,,0.07251283526420593,,,,,, +41,142249,,,,,,,,,,,,0.07131856679916382,,,,,, +41,142299,,,,,,,,,,,,0.06888185441493988,,,,,, +41,142349,,,,,,,,,,,,0.07676558941602707,,,,,, +41,142399,,,,,,,,,,,,0.06444298475980759,,,,,, +41,142449,,,,,,,,,,,,0.060335204005241394,,,,,, +41,142499,,,,,,,,,,,,0.07874707877635956,,,,,, +41,142549,,,,,,,,,,,,0.06876017898321152,,,,,, +41,142599,,,,,,,,,,,,0.07129686325788498,,,,,, +41,142649,,,,,,,,,,,,0.07334578782320023,,,,,, +41,142699,,,,,,,,,,,,0.06888820230960846,,,,,, +41,142749,,,,,,,,,,,,0.06768271327018738,,,,,, +41,142799,,,,,,,,,,,,0.06767772883176804,,,,,, +41,142849,,,,,,,,,,,,0.0687447264790535,,,,,, +41,142899,,,,,,,,,,,,0.07007516920566559,,,,,, +41,142949,,,,,,,,,,,,0.07601174712181091,,,,,, +41,142999,,,,,,,,,,,,0.07890918105840683,,,,,, +41,143049,,,,,,,,,,,,0.0747503787279129,,,,,, +41,143099,,,,,,,,,,,,0.06851993501186371,,,,,, +41,143149,,,,,,,,,,,,0.08659420907497406,,,,,, +41,143199,,,,,,,,,,,,0.06986981630325317,,,,,, +41,143249,,,,,,,,,,,,0.08181411027908325,,,,,, +41,143299,,,,,,,,,,,,0.06960400938987732,,,,,, +41,143349,,,,,,,,,,,,0.07504110783338547,,,,,, +41,143399,,,,,,,,,,,,0.07149521261453629,,,,,, +41,143449,,,,,,,,,,,,0.0703461691737175,,,,,, +41,143499,,,,,,,,,,,,0.07503007352352142,,,,,, +41,143549,,,,,,,,,,,,0.07694371044635773,,,,,, +41,143599,,,,,,,,,,,,0.06408904492855072,,,,,, +41,143649,,,,,,,,,,,,0.06228049844503403,,,,,, +41,143699,,,,,,,,,,,,0.08258259296417236,,,,,, +41,143749,,,,,,,,,,,,0.06553465127944946,,,,,, +41,143799,,,,,,,,,,,,0.08086219429969788,,,,,, +41,143849,,,,,,,,,,,,0.07206656783819199,,,,,, +41,143899,,,,,,,,,,,,0.068275585770607,,,,,, +41,143949,,,,,,,,,,,,0.06722602248191833,,,,,, +41,143999,,,,,,,,,,,,0.06348647177219391,,,,,, +41,144049,,,,,,,,,,,,0.0667542964220047,,,,,, +41,144099,,,,,,,,,,,,0.06952373683452606,,,,,, +41,144149,,,,,,,,,,,,0.07058605551719666,,,,,, +41,144199,,,,,,,,,,,,0.07847006618976593,,,,,, +41,144249,,,,,,,,,,,,0.0643589049577713,,,,,, +41,144299,,,,,,,,,,,,0.07222145795822144,,,,,, +41,144349,,,,,,,,,,,,0.056906770914793015,,,,,, +41,144399,,,,,,,,,,,,0.08961766958236694,,,,,, +41,144449,,,,,,,,,,,,0.0847611129283905,,,,,, +41,144499,,,,,,,,,,,,0.07086175680160522,,,,,, +41,144549,,,,,,,,,,,,0.07975661009550095,,,,,, +41,144599,,,,,,,,,,,,0.08130708336830139,,,,,, +41,144647,,,,,,,,,,,,,0.23750026524066925,0.07650618255138397,0.28176820278167725,0.07448327541351318,0.2530580759048462,0.07650618255138397 +41,144647,,,,,,,0.22702574729919434,0.07219575345516205,0.36289578676223755,0.13121533393859863,0.342235803604126,,,,,,, +42,144649,,,,,,,,,,,,0.07704879343509674,,,,,, +42,144699,,,,,,,,,,,,0.06950636953115463,,,,,, +42,144749,,,,,,,,,,,,0.0654536709189415,,,,,, +42,144799,,,,,,,,,,,,0.06291912496089935,,,,,, +42,144849,,,,,,,,,,,,0.06510018557310104,,,,,, +42,144899,,,,,,,,,,,,0.08265288174152374,,,,,, +42,144949,,,,,,,,,,,,0.08370901644229889,,,,,, +42,144999,,,,,,,,,,,,0.0836869403719902,,,,,, +42,145049,,,,,,,,,,,,0.07153292745351791,,,,,, +42,145099,,,,,,,,,,,,0.07493516057729721,,,,,, +42,145149,,,,,,,,,,,,0.06078476831316948,,,,,, +42,145199,,,,,,,,,,,,0.08339619636535645,,,,,, +42,145249,,,,,,,,,,,,0.06678399443626404,,,,,, +42,145299,,,,,,,,,,,,0.07174329459667206,,,,,, +42,145349,,,,,,,,,,,,0.0782230868935585,,,,,, +42,145399,,,,,,,,,,,,0.07767009735107422,,,,,, +42,145449,,,,,,,,,,,,0.0714472085237503,,,,,, +42,145499,,,,,,,,,,,,0.076680026948452,,,,,, +42,145549,,,,,,,,,,,,0.06771402060985565,,,,,, +42,145599,,,,,,,,,,,,0.07470773160457611,,,,,, +42,145649,,,,,,,,,,,,0.06345915794372559,,,,,, +42,145699,,,,,,,,,,,,0.07882048189640045,,,,,, +42,145749,,,,,,,,,,,,0.08015260100364685,,,,,, +42,145799,,,,,,,,,,,,0.06720204651355743,,,,,, +42,145849,,,,,,,,,,,,0.07769264280796051,,,,,, +42,145899,,,,,,,,,,,,0.06458588689565659,,,,,, +42,145949,,,,,,,,,,,,0.06685805320739746,,,,,, +42,145999,,,,,,,,,,,,0.06386061012744904,,,,,, +42,146049,,,,,,,,,,,,0.06439416855573654,,,,,, +42,146099,,,,,,,,,,,,0.0882677212357521,,,,,, +42,146149,,,,,,,,,,,,0.07608380913734436,,,,,, +42,146199,,,,,,,,,,,,0.08964547514915466,,,,,, +42,146249,,,,,,,,,,,,0.07586777210235596,,,,,, +42,146299,,,,,,,,,,,,0.07396630942821503,,,,,, +42,146349,,,,,,,,,,,,0.07159578800201416,,,,,, +42,146399,,,,,,,,,,,,0.06682360172271729,,,,,, +42,146449,,,,,,,,,,,,0.07555551826953888,,,,,, +42,146499,,,,,,,,,,,,0.06038755178451538,,,,,, +42,146549,,,,,,,,,,,,0.07554537802934647,,,,,, +42,146599,,,,,,,,,,,,0.07017844915390015,,,,,, +42,146649,,,,,,,,,,,,0.06325545907020569,,,,,, +42,146699,,,,,,,,,,,,0.08314262330532074,,,,,, +42,146749,,,,,,,,,,,,0.07685166597366333,,,,,, +42,146799,,,,,,,,,,,,0.06253788620233536,,,,,, +42,146849,,,,,,,,,,,,0.06736955791711807,,,,,, +42,146899,,,,,,,,,,,,0.07136355340480804,,,,,, +42,146949,,,,,,,,,,,,0.07355957478284836,,,,,, +42,146999,,,,,,,,,,,,0.059078048914670944,,,,,, +42,147049,,,,,,,,,,,,0.07546377182006836,,,,,, +42,147099,,,,,,,,,,,,0.06409460306167603,,,,,, +42,147149,,,,,,,,,,,,0.06632036715745926,,,,,, +42,147199,,,,,,,,,,,,0.055583126842975616,,,,,, +42,147249,,,,,,,,,,,,0.0685572698712349,,,,,, +42,147299,,,,,,,,,,,,0.06430207192897797,,,,,, +42,147349,,,,,,,,,,,,0.07773314416408539,,,,,, +42,147399,,,,,,,,,,,,0.08269044756889343,,,,,, +42,147449,,,,,,,,,,,,0.06226931884884834,,,,,, +42,147499,,,,,,,,,,,,0.081597700715065,,,,,, +42,147549,,,,,,,,,,,,0.07930099964141846,,,,,, +42,147599,,,,,,,,,,,,0.06182262673974037,,,,,, +42,147649,,,,,,,,,,,,0.066817507147789,,,,,, +42,147699,,,,,,,,,,,,0.05671066790819168,,,,,, +42,147749,,,,,,,,,,,,0.0725843757390976,,,,,, +42,147799,,,,,,,,,,,,0.06580005586147308,,,,,, +42,147849,,,,,,,,,,,,0.07227300107479095,,,,,, +42,147899,,,,,,,,,,,,0.07026016712188721,,,,,, +42,147949,,,,,,,,,,,,0.06944338232278824,,,,,, +42,147999,,,,,,,,,,,,0.07052375376224518,,,,,, +42,148049,,,,,,,,,,,,0.06830348819494247,,,,,, +42,148091,,,,,,,,,,,,,0.23608626425266266,0.0766826719045639,0.2817319929599762,0.07234823703765869,0.2532173991203308,0.0766826719045639 +42,148091,,,,,,,0.22605383396148682,0.0718124583363533,0.369469553232193,0.13583481311798096,0.35483318567276,,,,,,, +43,148099,,,,,,,,,,,,0.06032944470643997,,,,,, +43,148149,,,,,,,,,,,,0.07668846100568771,,,,,, +43,148199,,,,,,,,,,,,0.08045874536037445,,,,,, +43,148249,,,,,,,,,,,,0.06121432036161423,,,,,, +43,148299,,,,,,,,,,,,0.065495565533638,,,,,, +43,148349,,,,,,,,,,,,0.06954176723957062,,,,,, +43,148399,,,,,,,,,,,,0.06361781060695648,,,,,, +43,148449,,,,,,,,,,,,0.05366343632340431,,,,,, +43,148499,,,,,,,,,,,,0.07027222216129303,,,,,, +43,148549,,,,,,,,,,,,0.07548779994249344,,,,,, +43,148599,,,,,,,,,,,,0.07176080346107483,,,,,, +43,148649,,,,,,,,,,,,0.06451666355133057,,,,,, +43,148699,,,,,,,,,,,,0.07445028424263,,,,,, +43,148749,,,,,,,,,,,,0.07378274202346802,,,,,, +43,148799,,,,,,,,,,,,0.06591610610485077,,,,,, +43,148849,,,,,,,,,,,,0.0619959756731987,,,,,, +43,148899,,,,,,,,,,,,0.06678244471549988,,,,,, +43,148949,,,,,,,,,,,,0.06490449607372284,,,,,, +43,148999,,,,,,,,,,,,0.06861389428377151,,,,,, +43,149049,,,,,,,,,,,,0.06423011422157288,,,,,, +43,149099,,,,,,,,,,,,0.07086973637342453,,,,,, +43,149149,,,,,,,,,,,,0.06634817272424698,,,,,, +43,149199,,,,,,,,,,,,0.07639829814434052,,,,,, +43,149249,,,,,,,,,,,,0.06361435353755951,,,,,, +43,149299,,,,,,,,,,,,0.07270276546478271,,,,,, +43,149349,,,,,,,,,,,,0.05905507877469063,,,,,, +43,149399,,,,,,,,,,,,0.07448887825012207,,,,,, +43,149449,,,,,,,,,,,,0.08325540274381638,,,,,, +43,149499,,,,,,,,,,,,0.0653432309627533,,,,,, +43,149549,,,,,,,,,,,,0.0689319372177124,,,,,, +43,149599,,,,,,,,,,,,0.06744779646396637,,,,,, +43,149649,,,,,,,,,,,,0.07786329090595245,,,,,, +43,149699,,,,,,,,,,,,0.07272610068321228,,,,,, +43,149749,,,,,,,,,,,,0.06577619910240173,,,,,, +43,149799,,,,,,,,,,,,0.07561030983924866,,,,,, +43,149849,,,,,,,,,,,,0.07788461446762085,,,,,, +43,149899,,,,,,,,,,,,0.07193386554718018,,,,,, +43,149949,,,,,,,,,,,,0.06622600555419922,,,,,, +43,149999,,,,,,,,,,,,0.06118321046233177,,,,,, +43,150049,,,,,,,,,,,,0.08795417845249176,,,,,, +43,150099,,,,,,,,,,,,0.06847947835922241,,,,,, +43,150149,,,,,,,,,,,,0.0666390135884285,,,,,, +43,150199,,,,,,,,,,,,0.06333118677139282,,,,,, +43,150249,,,,,,,,,,,,0.07643963396549225,,,,,, +43,150299,,,,,,,,,,,,0.07441037893295288,,,,,, +43,150349,,,,,,,,,,,,0.0716443657875061,,,,,, +43,150399,,,,,,,,,,,,0.06261169910430908,,,,,, +43,150449,,,,,,,,,,,,0.07222817838191986,,,,,, +43,150499,,,,,,,,,,,,0.06985975056886673,,,,,, +43,150549,,,,,,,,,,,,0.06237732991576195,,,,,, +43,150599,,,,,,,,,,,,0.06683820486068726,,,,,, +43,150649,,,,,,,,,,,,0.06930667161941528,,,,,, +43,150699,,,,,,,,,,,,0.06493090093135834,,,,,, +43,150749,,,,,,,,,,,,0.07570235431194305,,,,,, +43,150799,,,,,,,,,,,,0.07598128914833069,,,,,, +43,150849,,,,,,,,,,,,0.0633375495672226,,,,,, +43,150899,,,,,,,,,,,,0.07837376743555069,,,,,, +43,150949,,,,,,,,,,,,0.07202897220849991,,,,,, +43,150999,,,,,,,,,,,,0.0769115462899208,,,,,, +43,151049,,,,,,,,,,,,0.07303401827812195,,,,,, +43,151099,,,,,,,,,,,,0.06954310834407806,,,,,, +43,151149,,,,,,,,,,,,0.0654267817735672,,,,,, +43,151199,,,,,,,,,,,,0.07765007019042969,,,,,, +43,151249,,,,,,,,,,,,0.06221996247768402,,,,,, +43,151299,,,,,,,,,,,,0.059166036546230316,,,,,, +43,151349,,,,,,,,,,,,0.06281283497810364,,,,,, +43,151399,,,,,,,,,,,,0.07234703749418259,,,,,, +43,151449,,,,,,,,,,,,0.07071082293987274,,,,,, +43,151499,,,,,,,,,,,,0.0721391811966896,,,,,, +43,151535,,,,,,,,,,,,,0.23630085587501526,0.07659546285867691,0.28011825680732727,0.0734032392501831,0.25712957978248596,0.07659546285867691 +43,151535,,,,,,,0.22449079155921936,0.0708407387137413,0.38442865014076233,0.14753156900405884,0.368750661611557,,,,,,, +44,151549,,,,,,,,,,,,0.07369367778301239,,,,,, +44,151599,,,,,,,,,,,,0.07162820547819138,,,,,, +44,151649,,,,,,,,,,,,0.05630668252706528,,,,,, +44,151699,,,,,,,,,,,,0.06807617843151093,,,,,, +44,151749,,,,,,,,,,,,0.07318266481161118,,,,,, +44,151799,,,,,,,,,,,,0.07462736964225769,,,,,, +44,151849,,,,,,,,,,,,0.07197026908397675,,,,,, +44,151899,,,,,,,,,,,,0.060084037482738495,,,,,, +44,151949,,,,,,,,,,,,0.0620511956512928,,,,,, +44,151999,,,,,,,,,,,,0.0671527087688446,,,,,, +44,152049,,,,,,,,,,,,0.0562029629945755,,,,,, +44,152099,,,,,,,,,,,,0.08227844536304474,,,,,, +44,152149,,,,,,,,,,,,0.07042895257472992,,,,,, +44,152199,,,,,,,,,,,,0.065940722823143,,,,,, +44,152249,,,,,,,,,,,,0.06507102400064468,,,,,, +44,152299,,,,,,,,,,,,0.07222123444080353,,,,,, +44,152349,,,,,,,,,,,,0.06968551874160767,,,,,, +44,152399,,,,,,,,,,,,0.06700555980205536,,,,,, +44,152449,,,,,,,,,,,,0.08107904344797134,,,,,, +44,152499,,,,,,,,,,,,0.07900743931531906,,,,,, +44,152549,,,,,,,,,,,,0.07069256156682968,,,,,, +44,152599,,,,,,,,,,,,0.25165286660194397,,,,,, +44,152649,,,,,,,,,,,,0.08406497538089752,,,,,, +44,152699,,,,,,,,,,,,0.06973771005868912,,,,,, +44,152749,,,,,,,,,,,,0.06862816959619522,,,,,, +44,152799,,,,,,,,,,,,0.06962309032678604,,,,,, +44,152849,,,,,,,,,,,,0.0744166448712349,,,,,, +44,152899,,,,,,,,,,,,0.07193391025066376,,,,,, +44,152949,,,,,,,,,,,,0.07149846851825714,,,,,, +44,152999,,,,,,,,,,,,0.07863955944776535,,,,,, +44,153049,,,,,,,,,,,,0.06143263354897499,,,,,, +44,153099,,,,,,,,,,,,0.05727216973900795,,,,,, +44,153149,,,,,,,,,,,,0.07584662735462189,,,,,, +44,153199,,,,,,,,,,,,0.06606146693229675,,,,,, +44,153249,,,,,,,,,,,,0.07061322778463364,,,,,, +44,153299,,,,,,,,,,,,0.08605442941188812,,,,,, +44,153349,,,,,,,,,,,,0.07455339282751083,,,,,, +44,153399,,,,,,,,,,,,0.06698140501976013,,,,,, +44,153449,,,,,,,,,,,,0.0788455605506897,,,,,, +44,153499,,,,,,,,,,,,0.0633828192949295,,,,,, +44,153549,,,,,,,,,,,,0.08029168844223022,,,,,, +44,153599,,,,,,,,,,,,0.06744684278964996,,,,,, +44,153649,,,,,,,,,,,,0.07108213007450104,,,,,, +44,153699,,,,,,,,,,,,0.07624568790197372,,,,,, +44,153749,,,,,,,,,,,,0.07159079611301422,,,,,, +44,153799,,,,,,,,,,,,0.07466858625411987,,,,,, +44,153849,,,,,,,,,,,,0.06720621883869171,,,,,, +44,153899,,,,,,,,,,,,0.0710180252790451,,,,,, +44,153949,,,,,,,,,,,,0.08013363182544708,,,,,, +44,153999,,,,,,,,,,,,0.07395584881305695,,,,,, +44,154049,,,,,,,,,,,,0.07877848297357559,,,,,, +44,154099,,,,,,,,,,,,0.07114356756210327,,,,,, +44,154149,,,,,,,,,,,,0.07173052430152893,,,,,, +44,154199,,,,,,,,,,,,0.07387223839759827,,,,,, +44,154249,,,,,,,,,,,,0.0734291598200798,,,,,, +44,154299,,,,,,,,,,,,0.07546083629131317,,,,,, +44,154349,,,,,,,,,,,,0.07175838947296143,,,,,, +44,154399,,,,,,,,,,,,0.06381041556596756,,,,,, +44,154449,,,,,,,,,,,,0.06930006295442581,,,,,, +44,154499,,,,,,,,,,,,0.05765046179294586,,,,,, +44,154549,,,,,,,,,,,,0.07006195932626724,,,,,, +44,154599,,,,,,,,,,,,0.06669807434082031,,,,,, +44,154649,,,,,,,,,,,,0.0797809362411499,,,,,, +44,154699,,,,,,,,,,,,0.0671667754650116,,,,,, +44,154749,,,,,,,,,,,,0.05997645854949951,,,,,, +44,154799,,,,,,,,,,,,0.08382797241210938,,,,,, +44,154849,,,,,,,,,,,,0.06324366480112076,,,,,, +44,154899,,,,,,,,,,,,0.06444931775331497,,,,,, +44,154949,,,,,,,,,,,,0.06945987045764923,,,,,, +44,154979,,,,,,,,,,,,,0.23984520137310028,0.07745058089494705,0.2816470265388489,0.06305861473083496,0.25728514790534973,0.07745058089494705 +44,154979,,,,,,,0.22409427165985107,0.07075104862451553,0.38585165143013,0.14861804246902466,0.3716687262058258,,,,,,, +45,154999,,,,,,,,,,,,0.060851261019706726,,,,,, +45,155049,,,,,,,,,,,,0.06739020347595215,,,,,, +45,155099,,,,,,,,,,,,0.05792650207877159,,,,,, +45,155149,,,,,,,,,,,,0.06520186364650726,,,,,, +45,155199,,,,,,,,,,,,0.06657297909259796,,,,,, +45,155249,,,,,,,,,,,,0.07424533367156982,,,,,, +45,155299,,,,,,,,,,,,0.07071222364902496,,,,,, +45,155349,,,,,,,,,,,,0.07892701774835587,,,,,, +45,155399,,,,,,,,,,,,0.07228346168994904,,,,,, +45,155449,,,,,,,,,,,,0.06689824908971786,,,,,, +45,155499,,,,,,,,,,,,0.06380003690719604,,,,,, +45,155549,,,,,,,,,,,,0.07481617480516434,,,,,, +45,155599,,,,,,,,,,,,0.06714224815368652,,,,,, +45,155649,,,,,,,,,,,,0.06657269597053528,,,,,, +45,155699,,,,,,,,,,,,0.07514382898807526,,,,,, +45,155749,,,,,,,,,,,,0.06704892218112946,,,,,, +45,155799,,,,,,,,,,,,0.07216362655162811,,,,,, +45,155849,,,,,,,,,,,,0.08244241774082184,,,,,, +45,155899,,,,,,,,,,,,0.08034580200910568,,,,,, +45,155949,,,,,,,,,,,,0.06885097920894623,,,,,, +45,155999,,,,,,,,,,,,0.06405457854270935,,,,,, +45,156049,,,,,,,,,,,,0.06570137292146683,,,,,, +45,156099,,,,,,,,,,,,0.0754563957452774,,,,,, +45,156149,,,,,,,,,,,,0.0661260187625885,,,,,, +45,156199,,,,,,,,,,,,0.0713396817445755,,,,,, +45,156249,,,,,,,,,,,,0.07661794871091843,,,,,, +45,156299,,,,,,,,,,,,0.06683520972728729,,,,,, +45,156349,,,,,,,,,,,,0.07283280789852142,,,,,, +45,156399,,,,,,,,,,,,0.07758292555809021,,,,,, +45,156449,,,,,,,,,,,,0.07411888241767883,,,,,, +45,156499,,,,,,,,,,,,0.0740661472082138,,,,,, +45,156549,,,,,,,,,,,,0.07347217947244644,,,,,, +45,156599,,,,,,,,,,,,0.06627717614173889,,,,,, +45,156649,,,,,,,,,,,,0.07305674999952316,,,,,, +45,156699,,,,,,,,,,,,0.06617854535579681,,,,,, +45,156749,,,,,,,,,,,,0.07414056360721588,,,,,, +45,156799,,,,,,,,,,,,0.07684510946273804,,,,,, +45,156849,,,,,,,,,,,,0.0699569433927536,,,,,, +45,156899,,,,,,,,,,,,0.06288889795541763,,,,,, +45,156949,,,,,,,,,,,,0.063760906457901,,,,,, +45,156999,,,,,,,,,,,,0.06580732017755508,,,,,, +45,157049,,,,,,,,,,,,0.07105962187051773,,,,,, +45,157099,,,,,,,,,,,,0.07715442776679993,,,,,, +45,157149,,,,,,,,,,,,0.07657963782548904,,,,,, +45,157199,,,,,,,,,,,,0.06848938763141632,,,,,, +45,157249,,,,,,,,,,,,0.06833656132221222,,,,,, +45,157299,,,,,,,,,,,,0.07307977974414825,,,,,, +45,157349,,,,,,,,,,,,0.060683004558086395,,,,,, +45,157399,,,,,,,,,,,,0.07313524186611176,,,,,, +45,157449,,,,,,,,,,,,0.07309088110923767,,,,,, +45,157499,,,,,,,,,,,,0.0664980337023735,,,,,, +45,157549,,,,,,,,,,,,0.07010303437709808,,,,,, +45,157599,,,,,,,,,,,,0.07551063597202301,,,,,, +45,157649,,,,,,,,,,,,0.0635996162891388,,,,,, +45,157699,,,,,,,,,,,,0.06983225792646408,,,,,, +45,157749,,,,,,,,,,,,0.06710785627365112,,,,,, +45,157799,,,,,,,,,,,,0.07186421006917953,,,,,, +45,157849,,,,,,,,,,,,0.06736297905445099,,,,,, +45,157899,,,,,,,,,,,,0.06908184289932251,,,,,, +45,157949,,,,,,,,,,,,0.07511694729328156,,,,,, +45,157999,,,,,,,,,,,,0.07635513693094254,,,,,, +45,158049,,,,,,,,,,,,0.0803346037864685,,,,,, +45,158099,,,,,,,,,,,,0.06535448879003525,,,,,, +45,158149,,,,,,,,,,,,0.06912078708410263,,,,,, +45,158199,,,,,,,,,,,,0.06640605628490448,,,,,, +45,158249,,,,,,,,,,,,0.0749148577451706,,,,,, +45,158299,,,,,,,,,,,,0.06667867302894592,,,,,, +45,158349,,,,,,,,,,,,0.07198074460029602,,,,,, +45,158399,,,,,,,,,,,,0.07202404737472534,,,,,, +45,158423,,,,,,,,,,,,,0.23876482248306274,0.07747505605220795,0.28221824765205383,0.0627625584602356,0.2567148506641388,0.07747505605220795 +45,158423,,,,,,,0.22280053794384003,0.06999735534191132,0.3972660005092621,0.15767556428909302,0.38197386264801025,,,,,,, +46,158449,,,,,,,,,,,,0.07309513539075851,,,,,, +46,158499,,,,,,,,,,,,0.06642963737249374,,,,,, +46,158549,,,,,,,,,,,,0.06896422803401947,,,,,, +46,158599,,,,,,,,,,,,0.07190859317779541,,,,,, +46,158649,,,,,,,,,,,,0.0615093857049942,,,,,, +46,158699,,,,,,,,,,,,0.07989482581615448,,,,,, +46,158749,,,,,,,,,,,,0.06764759123325348,,,,,, +46,158799,,,,,,,,,,,,0.07511965930461884,,,,,, +46,158849,,,,,,,,,,,,0.07352431118488312,,,,,, +46,158899,,,,,,,,,,,,0.06053459644317627,,,,,, +46,158949,,,,,,,,,,,,0.06549853086471558,,,,,, +46,158999,,,,,,,,,,,,0.0725521668791771,,,,,, +46,159049,,,,,,,,,,,,0.08186763525009155,,,,,, +46,159099,,,,,,,,,,,,0.07743299007415771,,,,,, +46,159149,,,,,,,,,,,,0.0733618289232254,,,,,, +46,159199,,,,,,,,,,,,0.062096353620290756,,,,,, +46,159249,,,,,,,,,,,,0.0655614510178566,,,,,, +46,159299,,,,,,,,,,,,0.06615923345088959,,,,,, +46,159349,,,,,,,,,,,,0.067986398935318,,,,,, +46,159399,,,,,,,,,,,,0.07041387259960175,,,,,, +46,159449,,,,,,,,,,,,0.0728977620601654,,,,,, +46,159499,,,,,,,,,,,,0.0690775141119957,,,,,, +46,159549,,,,,,,,,,,,0.0625576376914978,,,,,, +46,159599,,,,,,,,,,,,0.072944775223732,,,,,, +46,159649,,,,,,,,,,,,0.07060962915420532,,,,,, +46,159699,,,,,,,,,,,,0.06162501499056816,,,,,, +46,159749,,,,,,,,,,,,0.06948348879814148,,,,,, +46,159799,,,,,,,,,,,,0.06247522681951523,,,,,, +46,159849,,,,,,,,,,,,0.08160008490085602,,,,,, +46,159899,,,,,,,,,,,,0.07575137168169022,,,,,, +46,159949,,,,,,,,,,,,0.06414023041725159,,,,,, +46,159999,,,,,,,,,,,,0.0634007602930069,,,,,, +46,160049,,,,,,,,,,,,0.07708218693733215,,,,,, +46,160099,,,,,,,,,,,,0.0666385367512703,,,,,, +46,160149,,,,,,,,,,,,0.06730996072292328,,,,,, +46,160199,,,,,,,,,,,,0.06305952370166779,,,,,, +46,160249,,,,,,,,,,,,0.0691576898097992,,,,,, +46,160299,,,,,,,,,,,,0.07434681057929993,,,,,, +46,160349,,,,,,,,,,,,0.07398630678653717,,,,,, +46,160399,,,,,,,,,,,,0.06778274476528168,,,,,, +46,160449,,,,,,,,,,,,0.07157602906227112,,,,,, +46,160499,,,,,,,,,,,,0.07073689997196198,,,,,, +46,160549,,,,,,,,,,,,0.06553944945335388,,,,,, +46,160599,,,,,,,,,,,,0.06990022212266922,,,,,, +46,160649,,,,,,,,,,,,0.056211985647678375,,,,,, +46,160699,,,,,,,,,,,,0.06114399433135986,,,,,, +46,160749,,,,,,,,,,,,0.06972484290599823,,,,,, +46,160799,,,,,,,,,,,,0.06443128734827042,,,,,, +46,160849,,,,,,,,,,,,0.067336305975914,,,,,, +46,160899,,,,,,,,,,,,0.06597596406936646,,,,,, +46,160949,,,,,,,,,,,,0.06411418318748474,,,,,, +46,160999,,,,,,,,,,,,0.07371711730957031,,,,,, +46,161049,,,,,,,,,,,,0.07189977169036865,,,,,, +46,161099,,,,,,,,,,,,0.0772341787815094,,,,,, +46,161149,,,,,,,,,,,,0.05438618361949921,,,,,, +46,161199,,,,,,,,,,,,0.06847957521677017,,,,,, +46,161249,,,,,,,,,,,,0.07058309018611908,,,,,, +46,161299,,,,,,,,,,,,0.07370372116565704,,,,,, +46,161349,,,,,,,,,,,,0.06251627951860428,,,,,, +46,161399,,,,,,,,,,,,0.06553059071302414,,,,,, +46,161449,,,,,,,,,,,,0.06466055661439896,,,,,, +46,161499,,,,,,,,,,,,0.062351878732442856,,,,,, +46,161549,,,,,,,,,,,,0.07377079129219055,,,,,, +46,161599,,,,,,,,,,,,0.07145004719495773,,,,,, +46,161649,,,,,,,,,,,,0.06730818748474121,,,,,, +46,161699,,,,,,,,,,,,0.07116483896970749,,,,,, +46,161749,,,,,,,,,,,,0.07878362387418747,,,,,, +46,161799,,,,,,,,,,,,0.0727754533290863,,,,,, +46,161849,,,,,,,,,,,,0.057420723140239716,,,,,, +46,161867,,,,,,,,,,,,,0.23737958073616028,0.0765284076333046,0.2825232446193695,0.07421445846557617,0.25922825932502747,0.0765284076333046 +46,161867,,,,,,,0.22244934737682343,0.06979821622371674,0.4002470076084137,0.16007423400878906,0.38494306802749634,,,,,,, +47,161899,,,,,,,,,,,,0.06634983420372009,,,,,, +47,161949,,,,,,,,,,,,0.07238784432411194,,,,,, +47,161999,,,,,,,,,,,,0.06892440468072891,,,,,, +47,162049,,,,,,,,,,,,0.0643068477511406,,,,,, +47,162099,,,,,,,,,,,,0.06722257286310196,,,,,, +47,162149,,,,,,,,,,,,0.07535092532634735,,,,,, +47,162199,,,,,,,,,,,,0.06303916871547699,,,,,, +47,162249,,,,,,,,,,,,0.07620006799697876,,,,,, +47,162299,,,,,,,,,,,,0.08388806879520416,,,,,, +47,162349,,,,,,,,,,,,0.06430772691965103,,,,,, +47,162399,,,,,,,,,,,,0.07115226984024048,,,,,, +47,162449,,,,,,,,,,,,0.08082106709480286,,,,,, +47,162499,,,,,,,,,,,,0.06189248338341713,,,,,, +47,162549,,,,,,,,,,,,0.08235935866832733,,,,,, +47,162599,,,,,,,,,,,,0.07084657996892929,,,,,, +47,162649,,,,,,,,,,,,0.08293528854846954,,,,,, +47,162699,,,,,,,,,,,,0.06986308097839355,,,,,, +47,162749,,,,,,,,,,,,0.0662531778216362,,,,,, +47,162799,,,,,,,,,,,,0.05933215841650963,,,,,, +47,162849,,,,,,,,,,,,0.06653569638729095,,,,,, +47,162899,,,,,,,,,,,,0.05268445983529091,,,,,, +47,162949,,,,,,,,,,,,0.07421638071537018,,,,,, +47,162999,,,,,,,,,,,,0.06508477032184601,,,,,, +47,163049,,,,,,,,,,,,0.06758461147546768,,,,,, +47,163099,,,,,,,,,,,,0.083804190158844,,,,,, +47,163149,,,,,,,,,,,,0.06249045580625534,,,,,, +47,163199,,,,,,,,,,,,0.06450185179710388,,,,,, +47,163249,,,,,,,,,,,,0.6551944613456726,,,,,, +47,163299,,,,,,,,,,,,0.07111266255378723,,,,,, +47,163349,,,,,,,,,,,,0.06641991436481476,,,,,, +47,163399,,,,,,,,,,,,0.0756092295050621,,,,,, +47,163449,,,,,,,,,,,,0.08372479677200317,,,,,, +47,163499,,,,,,,,,,,,0.07693976163864136,,,,,, +47,163549,,,,,,,,,,,,0.05980746075510979,,,,,, +47,163599,,,,,,,,,,,,0.06900927424430847,,,,,, +47,163649,,,,,,,,,,,,0.06488291174173355,,,,,, +47,163699,,,,,,,,,,,,0.07023470103740692,,,,,, +47,163749,,,,,,,,,,,,0.07206501066684723,,,,,, +47,163799,,,,,,,,,,,,0.07878866791725159,,,,,, +47,163849,,,,,,,,,,,,0.06624212861061096,,,,,, +47,163899,,,,,,,,,,,,0.08349825441837311,,,,,, +47,163949,,,,,,,,,,,,0.07891061902046204,,,,,, +47,163999,,,,,,,,,,,,0.06663785129785538,,,,,, +47,164049,,,,,,,,,,,,0.07503286004066467,,,,,, +47,164099,,,,,,,,,,,,0.07041357457637787,,,,,, +47,164149,,,,,,,,,,,,0.0805465430021286,,,,,, +47,164199,,,,,,,,,,,,0.06941857188940048,,,,,, +47,164249,,,,,,,,,,,,0.06882628798484802,,,,,, +47,164299,,,,,,,,,,,,0.05280507355928421,,,,,, +47,164349,,,,,,,,,,,,0.06845773011445999,,,,,, +47,164399,,,,,,,,,,,,0.06244464963674545,,,,,, +47,164449,,,,,,,,,,,,0.07432335615158081,,,,,, +47,164499,,,,,,,,,,,,0.07230532169342041,,,,,, +47,164549,,,,,,,,,,,,0.07428565621376038,,,,,, +47,164599,,,,,,,,,,,,0.063905730843544,,,,,, +47,164649,,,,,,,,,,,,0.07139663398265839,,,,,, +47,164699,,,,,,,,,,,,0.06609419733285904,,,,,, +47,164749,,,,,,,,,,,,0.0719761773943901,,,,,, +47,164799,,,,,,,,,,,,0.06928587704896927,,,,,, +47,164849,,,,,,,,,,,,0.06123132258653641,,,,,, +47,164899,,,,,,,,,,,,0.06456223130226135,,,,,, +47,164949,,,,,,,,,,,,0.06199151650071144,,,,,, +47,164999,,,,,,,,,,,,0.07845322787761688,,,,,, +47,165049,,,,,,,,,,,,0.0596485398709774,,,,,, +47,165099,,,,,,,,,,,,0.06193389743566513,,,,,, +47,165149,,,,,,,,,,,,0.07253517210483551,,,,,, +47,165199,,,,,,,,,,,,0.064931221306324,,,,,, +47,165249,,,,,,,,,,,,0.07980087399482727,,,,,, +47,165299,,,,,,,,,,,,0.07178857922554016,,,,,, +47,165311,,,,,,,,,,,,,0.2367904633283615,0.07676824182271957,0.28101861476898193,0.07131302356719971,0.2563168406486511,0.07676824182271957 +47,165311,,,,,,,0.2226719707250595,0.07005996257066727,0.396472305059433,0.15691351890563965,0.38354378938674927,,,,,,, +48,165349,,,,,,,,,,,,0.06960944086313248,,,,,, +48,165399,,,,,,,,,,,,0.06981348246335983,,,,,, +48,165449,,,,,,,,,,,,0.07661246508359909,,,,,, +48,165499,,,,,,,,,,,,0.061278168112039566,,,,,, +48,165549,,,,,,,,,,,,0.07688155025243759,,,,,, +48,165599,,,,,,,,,,,,0.07022997736930847,,,,,, +48,165649,,,,,,,,,,,,0.06836943328380585,,,,,, +48,165699,,,,,,,,,,,,0.0798354297876358,,,,,, +48,165749,,,,,,,,,,,,0.07561185210943222,,,,,, +48,165799,,,,,,,,,,,,0.08040940016508102,,,,,, +48,165849,,,,,,,,,,,,0.0684095099568367,,,,,, +48,165899,,,,,,,,,,,,0.06175342947244644,,,,,, +48,165949,,,,,,,,,,,,0.07730735093355179,,,,,, +48,165999,,,,,,,,,,,,0.0637340396642685,,,,,, +48,166049,,,,,,,,,,,,0.06927348673343658,,,,,, +48,166099,,,,,,,,,,,,0.06812433898448944,,,,,, +48,166149,,,,,,,,,,,,0.06658796966075897,,,,,, +48,166199,,,,,,,,,,,,0.06979778409004211,,,,,, +48,166249,,,,,,,,,,,,0.06129737198352814,,,,,, +48,166299,,,,,,,,,,,,0.06836506724357605,,,,,, +48,166349,,,,,,,,,,,,0.06650005280971527,,,,,, +48,166399,,,,,,,,,,,,0.0708673745393753,,,,,, +48,166449,,,,,,,,,,,,0.08305336534976959,,,,,, +48,166499,,,,,,,,,,,,0.056310441344976425,,,,,, +48,166549,,,,,,,,,,,,0.05756281316280365,,,,,, +48,166599,,,,,,,,,,,,0.056451838463544846,,,,,, +48,166649,,,,,,,,,,,,0.07660309970378876,,,,,, +48,166699,,,,,,,,,,,,0.07458684593439102,,,,,, +48,166749,,,,,,,,,,,,0.06220273673534393,,,,,, +48,166799,,,,,,,,,,,,0.07502718269824982,,,,,, +48,166849,,,,,,,,,,,,0.07397657632827759,,,,,, +48,166899,,,,,,,,,,,,0.07832563668489456,,,,,, +48,166949,,,,,,,,,,,,0.06746615469455719,,,,,, +48,166999,,,,,,,,,,,,0.07507000863552094,,,,,, +48,167049,,,,,,,,,,,,0.061169661581516266,,,,,, +48,167099,,,,,,,,,,,,0.0619242861866951,,,,,, +48,167149,,,,,,,,,,,,0.06997780501842499,,,,,, +48,167199,,,,,,,,,,,,0.07071854919195175,,,,,, +48,167249,,,,,,,,,,,,0.0570191890001297,,,,,, +48,167299,,,,,,,,,,,,0.06688734143972397,,,,,, +48,167349,,,,,,,,,,,,0.06571416556835175,,,,,, +48,167399,,,,,,,,,,,,0.06592312455177307,,,,,, +48,167449,,,,,,,,,,,,0.08103027194738388,,,,,, +48,167499,,,,,,,,,,,,0.05769995599985123,,,,,, +48,167549,,,,,,,,,,,,0.07165271043777466,,,,,, +48,167599,,,,,,,,,,,,0.07385647296905518,,,,,, +48,167649,,,,,,,,,,,,0.06002141162753105,,,,,, +48,167699,,,,,,,,,,,,0.07938370853662491,,,,,, +48,167749,,,,,,,,,,,,0.06162167713046074,,,,,, +48,167799,,,,,,,,,,,,0.08240735530853271,,,,,, +48,167849,,,,,,,,,,,,0.07049578428268433,,,,,, +48,167899,,,,,,,,,,,,0.07989920675754547,,,,,, +48,167949,,,,,,,,,,,,0.08329475671052933,,,,,, +48,167999,,,,,,,,,,,,0.06676172465085983,,,,,, +48,168049,,,,,,,,,,,,0.06881032139062881,,,,,, +48,168099,,,,,,,,,,,,0.06511443108320236,,,,,, +48,168149,,,,,,,,,,,,0.07858649641275406,,,,,, +48,168199,,,,,,,,,,,,0.06960885971784592,,,,,, +48,168249,,,,,,,,,,,,0.07345543056726456,,,,,, +48,168299,,,,,,,,,,,,0.07469052076339722,,,,,, +48,168349,,,,,,,,,,,,0.0687689408659935,,,,,, +48,168399,,,,,,,,,,,,0.06511587649583817,,,,,, +48,168449,,,,,,,,,,,,0.06533268094062805,,,,,, +48,168499,,,,,,,,,,,,0.0795263797044754,,,,,, +48,168549,,,,,,,,,,,,0.056881796568632126,,,,,, +48,168599,,,,,,,,,,,,0.06581278145313263,,,,,, +48,168649,,,,,,,,,,,,0.061289459466934204,,,,,, +48,168699,,,,,,,,,,,,0.07273171842098236,,,,,, +48,168749,,,,,,,,,,,,0.07615987956523895,,,,,, +48,168755,,,,,,,,,,,,,0.23807814717292786,0.07660267502069473,0.28298527002334595,0.07331597805023193,0.2571580111980438,0.07660267502069473 +48,168755,,,,,,,0.22217734158039093,0.06973545998334885,0.4012684226036072,0.16082364320755005,0.38620316982269287,,,,,,, +49,168799,,,,,,,,,,,,0.05847778171300888,,,,,, +49,168849,,,,,,,,,,,,0.07005391269922256,,,,,, +49,168899,,,,,,,,,,,,0.06491061300039291,,,,,, +49,168949,,,,,,,,,,,,0.06450460851192474,,,,,, +49,168999,,,,,,,,,,,,0.06303609162569046,,,,,, +49,169049,,,,,,,,,,,,0.060246482491493225,,,,,, +49,169099,,,,,,,,,,,,0.06223192811012268,,,,,, +49,169149,,,,,,,,,,,,0.0703793540596962,,,,,, +49,169199,,,,,,,,,,,,0.06737835705280304,,,,,, +49,169249,,,,,,,,,,,,0.06607672572135925,,,,,, +49,169299,,,,,,,,,,,,0.061943747103214264,,,,,, +49,169349,,,,,,,,,,,,0.07062582671642303,,,,,, +49,169399,,,,,,,,,,,,0.060759902000427246,,,,,, +49,169449,,,,,,,,,,,,0.07556760311126709,,,,,, +49,169499,,,,,,,,,,,,0.06472799181938171,,,,,, +49,169549,,,,,,,,,,,,0.06507444381713867,,,,,, +49,169599,,,,,,,,,,,,0.06967204809188843,,,,,, +49,169649,,,,,,,,,,,,0.07375271618366241,,,,,, +49,169699,,,,,,,,,,,,0.06928974390029907,,,,,, +49,169749,,,,,,,,,,,,0.06774856150150299,,,,,, +49,169799,,,,,,,,,,,,0.06641202419996262,,,,,, +49,169849,,,,,,,,,,,,0.07803170382976532,,,,,, +49,169899,,,,,,,,,,,,0.06905275583267212,,,,,, +49,169949,,,,,,,,,,,,0.05157101899385452,,,,,, +49,169999,,,,,,,,,,,,0.08185355365276337,,,,,, +49,170049,,,,,,,,,,,,0.07218889892101288,,,,,, +49,170099,,,,,,,,,,,,0.07934196293354034,,,,,, +49,170149,,,,,,,,,,,,0.0668923556804657,,,,,, +49,170199,,,,,,,,,,,,0.05875064432621002,,,,,, +49,170249,,,,,,,,,,,,0.06547897309064865,,,,,, +49,170299,,,,,,,,,,,,0.06002864986658096,,,,,, +49,170349,,,,,,,,,,,,0.05752350762486458,,,,,, +49,170399,,,,,,,,,,,,0.06512589007616043,,,,,, +49,170449,,,,,,,,,,,,0.07782535254955292,,,,,, +49,170499,,,,,,,,,,,,0.05709369108080864,,,,,, +49,170549,,,,,,,,,,,,0.06292378902435303,,,,,, +49,170599,,,,,,,,,,,,0.07257160544395447,,,,,, +49,170649,,,,,,,,,,,,0.06814055144786835,,,,,, +49,170699,,,,,,,,,,,,0.06015709042549133,,,,,, +49,170749,,,,,,,,,,,,0.08331678807735443,,,,,, +49,170799,,,,,,,,,,,,0.06002487987279892,,,,,, +49,170849,,,,,,,,,,,,0.0697709396481514,,,,,, +49,170899,,,,,,,,,,,,0.07975225150585175,,,,,, +49,170949,,,,,,,,,,,,0.06666438281536102,,,,,, +49,170999,,,,,,,,,,,,0.07837280631065369,,,,,, +49,171049,,,,,,,,,,,,0.07432617247104645,,,,,, +49,171099,,,,,,,,,,,,0.06528085470199585,,,,,, +49,171149,,,,,,,,,,,,0.07685698568820953,,,,,, +49,171199,,,,,,,,,,,,0.07188063114881516,,,,,, +49,171249,,,,,,,,,,,,0.06405383348464966,,,,,, +49,171299,,,,,,,,,,,,0.07367515563964844,,,,,, +49,171349,,,,,,,,,,,,0.06892627477645874,,,,,, +49,171399,,,,,,,,,,,,0.0743573009967804,,,,,, +49,171449,,,,,,,,,,,,0.0678684264421463,,,,,, +49,171499,,,,,,,,,,,,0.07379652559757233,,,,,, +49,171549,,,,,,,,,,,,0.06979233026504517,,,,,, +49,171599,,,,,,,,,,,,0.06993313133716583,,,,,, +49,171649,,,,,,,,,,,,0.06821146607398987,,,,,, +49,171699,,,,,,,,,,,,0.08013637363910675,,,,,, +49,171749,,,,,,,,,,,,0.07229089736938477,,,,,, +49,171799,,,,,,,,,,,,0.06573610007762909,,,,,, +49,171849,,,,,,,,,,,,0.058668218553066254,,,,,, +49,171899,,,,,,,,,,,,0.08086174726486206,,,,,, +49,171949,,,,,,,,,,,,0.06871349364519119,,,,,, +49,171999,,,,,,,,,,,,0.06367900967597961,,,,,, +49,172049,,,,,,,,,,,,0.06259750574827194,,,,,, +49,172099,,,,,,,,,,,,0.05443038046360016,,,,,, +49,172149,,,,,,,,,,,,0.06828278303146362,,,,,, +49,172199,,,,,,,,,,,,0.059393879026174545,,,,,, +49,172199,,,,,,,,,,,,,0.23707570135593414,0.07660999149084091,0.2833573818206787,0.07322746515274048,0.25595223903656006,0.07660999149084091 +49,172199,,,,,,,0.2221638411283493,0.0696747750043869,0.40213996171951294,0.16155469417572021,0.38681527972221375,,,,,,, +50,172200,0.23736673593521118,0.07654805481433868,0.2768315076828003,0.07452493906021118,0.2505037784576416,0.07654805481433868,,,,,,,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..dd9ae13b16589005e010676db681cbc9f5e2cdf5 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml @@ -0,0 +1,22 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: sweetnet + num_layers: 16 + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 44 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..21df5581dcb171b6f73b857d80f385312883f818 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv @@ -0,0 +1,104 @@ +epoch,step,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +0,49,,,,,,0.0910230427980423,,,,,, +0,99,,,,,,0.08251883089542389,,,,,, +0,149,,,,,,0.09061519056558609,,,,,, +0,199,,,,,,0.10760483890771866,,,,,, +0,249,,,,,,0.07812255620956421,,,,,, +0,299,,,,,,0.08517830073833466,,,,,, +0,349,,,,,,0.09029436111450195,,,,,, +0,399,,,,,,0.08006718009710312,,,,,, +0,449,,,,,,0.08254551887512207,,,,,, +0,499,,,,,,0.09737291187047958,,,,,, +0,549,,,,,,0.10211268067359924,,,,,, +0,599,,,,,,0.09384427964687347,,,,,, +0,649,,,,,,0.08443571627140045,,,,,, +0,699,,,,,,0.09378410875797272,,,,,, +0,749,,,,,,0.07908351719379425,,,,,, +0,799,,,,,,0.07664477825164795,,,,,, +0,849,,,,,,0.09395650774240494,,,,,, +0,899,,,,,,0.0755353718996048,,,,,, +0,949,,,,,,0.0880047082901001,,,,,, +0,999,,,,,,0.09083733707666397,,,,,, +0,1049,,,,,,0.09738975018262863,,,,,, +0,1099,,,,,,0.06331107765436172,,,,,, +0,1149,,,,,,0.09680154919624329,,,,,, +0,1199,,,,,,0.07868291437625885,,,,,, +0,1249,,,,,,0.08827805519104004,,,,,, +0,1299,,,,,,0.09052259474992752,,,,,, +0,1349,,,,,,0.08704131841659546,,,,,, +0,1399,,,,,,0.06867191195487976,,,,,, +0,1449,,,,,,0.070943184196949,,,,,, +0,1499,,,,,,0.07747001945972443,,,,,, +0,1549,,,,,,0.09429258108139038,,,,,, +0,1599,,,,,,0.0852852463722229,,,,,, +0,1649,,,,,,0.08531174063682556,,,,,, +0,1699,,,,,,0.09217147529125214,,,,,, +0,1749,,,,,,0.07689342647790909,,,,,, +0,1799,,,,,,0.08868195116519928,,,,,, +0,1849,,,,,,0.07767385989427567,,,,,, +0,1899,,,,,,0.08361369371414185,,,,,, +0,1949,,,,,,0.0921759158372879,,,,,, +0,1999,,,,,,0.08524218201637268,,,,,, +0,2049,,,,,,0.07990028709173203,,,,,, +0,2099,,,,,,0.08057725429534912,,,,,, +0,2149,,,,,,0.08218476176261902,,,,,, +0,2199,,,,,,0.07493272423744202,,,,,, +0,2249,,,,,,0.08003711700439453,,,,,, +0,2299,,,,,,0.10026701539754868,,,,,, +0,2349,,,,,,0.07654494792222977,,,,,, +0,2399,,,,,,0.08254940807819366,,,,,, +0,2449,,,,,,0.07471814751625061,,,,,, +0,2499,,,,,,0.09558328986167908,,,,,, +0,2549,,,,,,0.08631299436092377,,,,,, +0,2599,,,,,,0.08259443938732147,,,,,, +0,2649,,,,,,0.07196107506752014,,,,,, +0,2699,,,,,,0.07247720658779144,,,,,, +0,2749,,,,,,0.07165221124887466,,,,,, +0,2799,,,,,,0.07701173424720764,,,,,, +0,2849,,,,,,0.08754812180995941,,,,,, +0,2899,,,,,,0.08933427929878235,,,,,, +0,2949,,,,,,0.09897841513156891,,,,,, +0,2999,,,,,,0.08207827806472778,,,,,, +0,3049,,,,,,0.087654247879982,,,,,, +0,3099,,,,,,0.07470713555812836,,,,,, +0,3149,,,,,,0.08186334371566772,,,,,, +0,3199,,,,,,0.0779532939195633,,,,,, +0,3249,,,,,,0.0925188958644867,,,,,, +0,3299,,,,,,0.07618691772222519,,,,,, +0,3349,,,,,,0.08595044165849686,,,,,, +0,3399,,,,,,0.08104521781206131,,,,,, +0,3443,,,,,,,0.24372294545173645,0.0801038071513176,0.18923580646514893,0.03096175193786621,0.1360284686088562,0.0801038071513176 +0,3443,0.24583400785923004,0.08261434733867645,0.1429588794708252,0.005845010280609131,0.12622390687465668,,,,,,, +1,3449,,,,,,0.06512634456157684,,,,,, +1,3499,,,,,,0.07774164527654648,,,,,, +1,3549,,,,,,0.07862908393144608,,,,,, +1,3599,,,,,,0.07788325101137161,,,,,, +1,3649,,,,,,0.07552099972963333,,,,,, +1,3699,,,,,,0.08078157901763916,,,,,, +1,3749,,,,,,0.08200936019420624,,,,,, +1,3799,,,,,,0.08210279047489166,,,,,, +1,3849,,,,,,0.06871602684259415,,,,,, +1,3899,,,,,,0.09722081571817398,,,,,, +1,3949,,,,,,0.07939943671226501,,,,,, +1,3999,,,,,,0.0810556560754776,,,,,, +1,4049,,,,,,0.078296959400177,,,,,, +1,4099,,,,,,0.07401968538761139,,,,,, +1,4149,,,,,,0.08656742423772812,,,,,, +1,4199,,,,,,0.08224181830883026,,,,,, +1,4249,,,,,,0.06782330572605133,,,,,, +1,4299,,,,,,0.07601915299892426,,,,,, +1,4349,,,,,,0.07515690475702286,,,,,, +1,4399,,,,,,0.09410582482814789,,,,,, +1,4449,,,,,,0.08190061151981354,,,,,, +1,4499,,,,,,0.07679465413093567,,,,,, +1,4549,,,,,,0.07566162943840027,,,,,, +1,4599,,,,,,0.08287528157234192,,,,,, +1,4649,,,,,,0.08090321719646454,,,,,, +1,4699,,,,,,0.09399636089801788,,,,,, +1,4749,,,,,,0.08887769281864166,,,,,, +1,4799,,,,,,0.0836026519536972,,,,,, +1,4849,,,,,,0.08305074274539948,,,,,, +1,4899,,,,,,0.08330734819173813,,,,,, +1,4949,,,,,,0.07534473389387131,,,,,, +1,4999,,,,,,0.07537692785263062,,,,,, +1,5049,,,,,,0.0763932317495346,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..dd9ae13b16589005e010676db681cbc9f5e2cdf5 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml @@ -0,0 +1,22 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: sweetnet + num_layers: 16 + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 44 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..3dd9f49fa0bc891a7d30f9b79ead81a03a03cfb1 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv @@ -0,0 +1,2042 @@ +epoch,step,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +1,3449,,,,,,0.08562818169593811,,,,,, +1,3499,,,,,,0.061704494059085846,,,,,, +1,3549,,,,,,0.0855780839920044,,,,,, +1,3599,,,,,,0.07426373660564423,,,,,, +1,3649,,,,,,0.08639349043369293,,,,,, +1,3699,,,,,,0.06908812373876572,,,,,, +1,3749,,,,,,0.07270778715610504,,,,,, +1,3799,,,,,,0.0791841596364975,,,,,, +1,3849,,,,,,0.0744774118065834,,,,,, +1,3899,,,,,,0.071623295545578,,,,,, +1,3949,,,,,,0.07038044184446335,,,,,, +1,3999,,,,,,0.07519122213125229,,,,,, +1,4049,,,,,,0.07920447736978531,,,,,, +1,4099,,,,,,0.07594355940818787,,,,,, +1,4149,,,,,,0.07772059738636017,,,,,, +1,4199,,,,,,0.08071696758270264,,,,,, +1,4249,,,,,,0.08978927135467529,,,,,, +1,4299,,,,,,0.07632175087928772,,,,,, +1,4349,,,,,,0.07590802013874054,,,,,, +1,4399,,,,,,0.07637020200490952,,,,,, +1,4449,,,,,,0.08167880773544312,,,,,, +1,4499,,,,,,0.08067845553159714,,,,,, +1,4549,,,,,,0.0674421489238739,,,,,, +1,4599,,,,,,0.08030477166175842,,,,,, +1,4649,,,,,,0.07893991470336914,,,,,, +1,4699,,,,,,0.07565437257289886,,,,,, +1,4749,,,,,,0.07285290211439133,,,,,, +1,4799,,,,,,0.07386790215969086,,,,,, +1,4849,,,,,,0.08047996461391449,,,,,, +1,4899,,,,,,0.07194468379020691,,,,,, +1,4949,,,,,,0.07254784554243088,,,,,, +1,4999,,,,,,0.07286881655454636,,,,,, +1,5049,,,,,,0.07667490839958191,,,,,, +1,5099,,,,,,0.07676507532596588,,,,,, +1,5149,,,,,,0.06607154756784439,,,,,, +1,5199,,,,,,0.08770852535963058,,,,,, +1,5249,,,,,,0.08188460022211075,,,,,, +1,5299,,,,,,0.08294880390167236,,,,,, +1,5349,,,,,,0.07360473275184631,,,,,, +1,5399,,,,,,0.07801699638366699,,,,,, +1,5449,,,,,,0.08837680518627167,,,,,, +1,5499,,,,,,0.0818541869521141,,,,,, +1,5549,,,,,,0.0783606469631195,,,,,, +1,5599,,,,,,0.07783918082714081,,,,,, +1,5649,,,,,,0.07085743546485901,,,,,, +1,5699,,,,,,0.0737505555152893,,,,,, +1,5749,,,,,,0.08791503310203552,,,,,, +1,5799,,,,,,0.08065937459468842,,,,,, +1,5849,,,,,,0.07327823340892792,,,,,, +1,5899,,,,,,0.08164281398057938,,,,,, +1,5949,,,,,,0.0960775837302208,,,,,, +1,5999,,,,,,0.08138133585453033,,,,,, +1,6049,,,,,,0.06667712330818176,,,,,, +1,6099,,,,,,0.07229489088058472,,,,,, +1,6149,,,,,,0.0720495879650116,,,,,, +1,6199,,,,,,0.06871539354324341,,,,,, +1,6249,,,,,,0.0723971426486969,,,,,, +1,6299,,,,,,0.07202786207199097,,,,,, +1,6349,,,,,,0.0726819634437561,,,,,, +1,6399,,,,,,0.0755540281534195,,,,,, +1,6449,,,,,,0.07597385346889496,,,,,, +1,6499,,,,,,0.08159850537776947,,,,,, +1,6549,,,,,,0.0832468569278717,,,,,, +1,6599,,,,,,0.07663104683160782,,,,,, +1,6649,,,,,,0.07243948429822922,,,,,, +1,6699,,,,,,0.07749002426862717,,,,,, +1,6749,,,,,,0.08865243196487427,,,,,, +1,6799,,,,,,0.08620710670948029,,,,,, +1,6849,,,,,,0.0739467591047287,,,,,, +1,6887,,,,,,,0.2424483299255371,0.07929429411888123,0.2044953554868698,0.040754735469818115,0.1302088052034378,0.07929429411888123 +1,6887,0.23997503519058228,0.07862084358930588,0.2330702841281891,0.053907811641693115,0.18849880993366241,,,,,,, +2,6899,,,,,,0.08310878276824951,,,,,, +2,6949,,,,,,0.08258545398712158,,,,,, +2,6999,,,,,,0.0811358243227005,,,,,, +2,7049,,,,,,0.07508298754692078,,,,,, +2,7099,,,,,,0.06612510979175568,,,,,, +2,7149,,,,,,0.08793875575065613,,,,,, +2,7199,,,,,,0.09086033701896667,,,,,, +2,7249,,,,,,0.07748100906610489,,,,,, +2,7299,,,,,,0.06777079403400421,,,,,, +2,7349,,,,,,0.0681491494178772,,,,,, +2,7399,,,,,,0.07718856632709503,,,,,, +2,7449,,,,,,0.07034142315387726,,,,,, +2,7499,,,,,,0.08125205338001251,,,,,, +2,7549,,,,,,0.07343026250600815,,,,,, +2,7599,,,,,,0.069033682346344,,,,,, +2,7649,,,,,,0.09034549444913864,,,,,, +2,7699,,,,,,0.07012071460485458,,,,,, +2,7749,,,,,,0.0762181431055069,,,,,, +2,7799,,,,,,0.07895320653915405,,,,,, +2,7849,,,,,,0.07360702753067017,,,,,, +2,7899,,,,,,0.08540567010641098,,,,,, +2,7949,,,,,,0.07337157428264618,,,,,, +2,7999,,,,,,0.07065823674201965,,,,,, +2,8049,,,,,,0.07060837745666504,,,,,, +2,8099,,,,,,0.06828665733337402,,,,,, +2,8149,,,,,,0.08921341598033905,,,,,, +2,8199,,,,,,0.0742998868227005,,,,,, +2,8249,,,,,,0.07529757916927338,,,,,, +2,8299,,,,,,0.07882770895957947,,,,,, +2,8349,,,,,,0.061035118997097015,,,,,, +2,8399,,,,,,0.07400623708963394,,,,,, +2,8449,,,,,,0.08368140459060669,,,,,, +2,8499,,,,,,0.07735031843185425,,,,,, +2,8549,,,,,,0.08666004985570908,,,,,, +2,8599,,,,,,0.09114410728216171,,,,,, +2,8649,,,,,,0.07732567936182022,,,,,, +2,8699,,,,,,0.07696521282196045,,,,,, +2,8749,,,,,,0.09112352132797241,,,,,, +2,8799,,,,,,0.08868883550167084,,,,,, +2,8849,,,,,,0.08536508679389954,,,,,, +2,8899,,,,,,0.06496137380599976,,,,,, +2,8949,,,,,,0.09362971037626266,,,,,, +2,8999,,,,,,0.07479837536811829,,,,,, +2,9049,,,,,,0.07690729945898056,,,,,, +2,9099,,,,,,0.0756416916847229,,,,,, +2,9149,,,,,,0.07462908327579498,,,,,, +2,9199,,,,,,0.06993314623832703,,,,,, +2,9249,,,,,,0.08443865925073624,,,,,, +2,9299,,,,,,0.0916057825088501,,,,,, +2,9349,,,,,,0.08264641463756561,,,,,, +2,9399,,,,,,0.08211861550807953,,,,,, +2,9449,,,,,,0.06927994638681412,,,,,, +2,9499,,,,,,0.07577390968799591,,,,,, +2,9549,,,,,,0.06683710962533951,,,,,, +2,9599,,,,,,0.08173717558383942,,,,,, +2,9649,,,,,,0.08246247470378876,,,,,, +2,9699,,,,,,0.07250601053237915,,,,,, +2,9749,,,,,,0.07881461083889008,,,,,, +2,9799,,,,,,0.08754083514213562,,,,,, +2,9849,,,,,,0.08078136295080185,,,,,, +2,9899,,,,,,0.0852491557598114,,,,,, +2,9949,,,,,,0.06525138020515442,,,,,, +2,9999,,,,,,0.0782691016793251,,,,,, +2,10049,,,,,,0.08969442546367645,,,,,, +2,10099,,,,,,0.07558870315551758,,,,,, +2,10149,,,,,,0.08282320946455002,,,,,, +2,10199,,,,,,0.07713576406240463,,,,,, +2,10249,,,,,,0.06315378844738007,,,,,, +2,10299,,,,,,0.08701446652412415,,,,,, +2,10331,,,,,,,0.24488955736160278,0.08097442239522934,0.19391661882400513,0.02042973041534424,0.13650646805763245,0.08097442239522934 +2,10331,0.23883585631847382,0.07792286574840546,0.24984131753444672,0.06230384111404419,0.2112521231174469,,,,,,, +3,10349,,,,,,0.07510732114315033,,,,,, +3,10399,,,,,,0.07832259684801102,,,,,, +3,10449,,,,,,0.09016256034374237,,,,,, +3,10499,,,,,,0.07529371231794357,,,,,, +3,10549,,,,,,0.3134617507457733,,,,,, +3,10599,,,,,,0.0919496938586235,,,,,, +3,10649,,,,,,0.07954596728086472,,,,,, +3,10699,,,,,,0.07747028768062592,,,,,, +3,10749,,,,,,0.08196938037872314,,,,,, +3,10799,,,,,,0.07834513485431671,,,,,, +3,10849,,,,,,0.09309321641921997,,,,,, +3,10899,,,,,,0.09736469388008118,,,,,, +3,10949,,,,,,0.06454773247241974,,,,,, +3,10999,,,,,,0.08084329962730408,,,,,, +3,11049,,,,,,0.08540284633636475,,,,,, +3,11099,,,,,,0.09360675513744354,,,,,, +3,11149,,,,,,0.07380630820989609,,,,,, +3,11199,,,,,,0.08217040449380875,,,,,, +3,11249,,,,,,0.08460746705532074,,,,,, +3,11299,,,,,,0.07739471644163132,,,,,, +3,11349,,,,,,0.0855226069688797,,,,,, +3,11399,,,,,,0.06847348064184189,,,,,, +3,11449,,,,,,0.08860351145267487,,,,,, +3,11499,,,,,,0.08259116113185883,,,,,, +3,11549,,,,,,0.09649927914142609,,,,,, +3,11599,,,,,,0.08228520303964615,,,,,, +3,11649,,,,,,0.07712957262992859,,,,,, +3,11699,,,,,,0.08044879138469696,,,,,, +3,11749,,,,,,0.07805570960044861,,,,,, +3,11799,,,,,,0.08226549625396729,,,,,, +3,11849,,,,,,0.08260434865951538,,,,,, +3,11899,,,,,,0.07020050287246704,,,,,, +3,11949,,,,,,0.08231891691684723,,,,,, +3,11999,,,,,,0.07756542414426804,,,,,, +3,12049,,,,,,0.09147053956985474,,,,,, +3,12099,,,,,,0.09027135372161865,,,,,, +3,12149,,,,,,0.09425009042024612,,,,,, +3,12199,,,,,,0.08145137131214142,,,,,, +3,12249,,,,,,0.07194207608699799,,,,,, +3,12299,,,,,,0.07943911850452423,,,,,, +3,12349,,,,,,0.08551114052534103,,,,,, +3,12399,,,,,,0.0875953882932663,,,,,, +3,12449,,,,,,0.08590605109930038,,,,,, +3,12499,,,,,,0.07491160929203033,,,,,, +3,12549,,,,,,0.08192850649356842,,,,,, +3,12599,,,,,,0.08780437707901001,,,,,, +3,12649,,,,,,0.08823847770690918,,,,,, +3,12699,,,,,,0.08527281880378723,,,,,, +3,12749,,,,,,0.0907360166311264,,,,,, +3,12799,,,,,,0.08584342151880264,,,,,, +3,12849,,,,,,0.0771118625998497,,,,,, +3,12899,,,,,,0.09424427151679993,,,,,, +3,12949,,,,,,0.07531717419624329,,,,,, +3,12999,,,,,,0.08140823245048523,,,,,, +3,13049,,,,,,0.08648886531591415,,,,,, +3,13099,,,,,,0.07950092852115631,,,,,, +3,13149,,,,,,0.06954091787338257,,,,,, +3,13199,,,,,,0.07287076115608215,,,,,, +3,13249,,,,,,0.09552942216396332,,,,,, +3,13299,,,,,,0.08248596638441086,,,,,, +3,13349,,,,,,0.08504533767700195,,,,,, +3,13399,,,,,,0.09829339385032654,,,,,, +3,13449,,,,,,0.07957293093204498,,,,,, +3,13499,,,,,,0.07059236615896225,,,,,, +3,13549,,,,,,0.07615416496992111,,,,,, +3,13599,,,,,,0.08467739820480347,,,,,, +3,13649,,,,,,0.09559138119220734,,,,,, +3,13699,,,,,,0.07677411288022995,,,,,, +3,13749,,,,,,0.08516561985015869,,,,,, +3,13775,,,,,,,0.24867261946201324,0.08262766897678375,nan,0.0004299283027648926,0.015087305568158627,0.08262766897678375 +3,13775,0.2539534270763397,0.4334249198436737,0.0009211903088726103,-4.215662002563477,0.017673010006546974,,,,,,, +4,13799,,,,,,0.07514996081590652,,,,,, +4,13849,,,,,,0.08221897482872009,,,,,, +4,13899,,,,,,0.08226750791072845,,,,,, +4,13949,,,,,,0.08996384590864182,,,,,, +4,13999,,,,,,0.08701947331428528,,,,,, +4,14049,,,,,,0.08887024968862534,,,,,, +4,14099,,,,,,0.07782774418592453,,,,,, +4,14149,,,,,,0.09482163190841675,,,,,, +4,14199,,,,,,0.09211157262325287,,,,,, +4,14249,,,,,,0.08537806570529938,,,,,, +4,14299,,,,,,0.07055280357599258,,,,,, +4,14349,,,,,,0.07139785587787628,,,,,, +4,14399,,,,,,0.09058994054794312,,,,,, +4,14449,,,,,,0.07852786779403687,,,,,, +4,14499,,,,,,0.08067938685417175,,,,,, +4,14549,,,,,,0.0839088186621666,,,,,, +4,14599,,,,,,0.07900238037109375,,,,,, +4,14649,,,,,,0.07387898117303848,,,,,, +4,14699,,,,,,0.08620849251747131,,,,,, +4,14749,,,,,,0.08275625854730606,,,,,, +4,14799,,,,,,0.08356563746929169,,,,,, +4,14849,,,,,,0.0864732638001442,,,,,, +4,14899,,,,,,0.08701938390731812,,,,,, +4,14949,,,,,,0.09556982666254044,,,,,, +4,14999,,,,,,0.07051155716180801,,,,,, +4,15049,,,,,,0.0888662338256836,,,,,, +4,15099,,,,,,0.24997298419475555,,,,,, +4,15149,,,,,,0.09237834811210632,,,,,, +4,15199,,,,,,0.06485137343406677,,,,,, +4,15249,,,,,,0.0823846384882927,,,,,, +4,15299,,,,,,0.08500337600708008,,,,,, +4,15349,,,,,,0.07891625165939331,,,,,, +4,15399,,,,,,0.08306069672107697,,,,,, +4,15449,,,,,,0.08225090801715851,,,,,, +4,15499,,,,,,0.08040163666009903,,,,,, +4,15549,,,,,,0.08329245448112488,,,,,, +4,15599,,,,,,0.08619549870491028,,,,,, +4,15649,,,,,,0.07541581988334656,,,,,, +4,15699,,,,,,0.08577331900596619,,,,,, +4,15749,,,,,,0.09131497889757156,,,,,, +4,15799,,,,,,0.07909327000379562,,,,,, +4,15849,,,,,,0.08435441553592682,,,,,, +4,15899,,,,,,0.08582842350006104,,,,,, +4,15949,,,,,,0.07293860614299774,,,,,, +4,15999,,,,,,0.08352942764759064,,,,,, +4,16049,,,,,,0.09079478681087494,,,,,, +4,16099,,,,,,0.08057481795549393,,,,,, +4,16149,,,,,,0.0909440666437149,,,,,, +4,16199,,,,,,0.07343289256095886,,,,,, +4,16249,,,,,,0.08959384262561798,,,,,, +4,16299,,,,,,0.08560962975025177,,,,,, +4,16349,,,,,,0.06485260277986526,,,,,, +4,16399,,,,,,0.09816793352365494,,,,,, +4,16449,,,,,,0.08915242552757263,,,,,, +4,16499,,,,,,0.08803224563598633,,,,,, +4,16549,,,,,,0.088744156062603,,,,,, +4,16599,,,,,,0.0891784280538559,,,,,, +4,16649,,,,,,0.08388076722621918,,,,,, +4,16699,,,,,,0.07196063548326492,,,,,, +4,16749,,,,,,0.07881298661231995,,,,,, +4,16799,,,,,,0.08477999269962311,,,,,, +4,16849,,,,,,0.08437791466712952,,,,,, +4,16899,,,,,,0.08803208917379379,,,,,, +4,16949,,,,,,0.08053846657276154,,,,,, +4,16999,,,,,,0.08302871882915497,,,,,, +4,17049,,,,,,0.0820441022515297,,,,,, +4,17099,,,,,,0.08496572822332382,,,,,, +4,17149,,,,,,0.07974697649478912,,,,,, +4,17199,,,,,,0.0811806470155716,,,,,, +4,17219,,,,,,,0.24869975447654724,0.08266403526067734,nan,-1.0013580322265625e-05,0.05843215063214302,0.08266403526067734 +4,17219,0.25203388929367065,0.39080125093460083,0.0017818344058468938,-3.7028017044067383,-0.001659167231991887,,,,,,, +5,17249,,,,,,0.08351389318704605,,,,,, +5,17299,,,,,,0.08499022573232651,,,,,, +5,17349,,,,,,0.07236505299806595,,,,,, +5,17399,,,,,,0.08525362610816956,,,,,, +5,17449,,,,,,0.07476142048835754,,,,,, +5,17499,,,,,,0.08711713552474976,,,,,, +5,17549,,,,,,0.08939271420240402,,,,,, +5,17599,,,,,,0.07988853752613068,,,,,, +5,17649,,,,,,0.09658724069595337,,,,,, +5,17699,,,,,,0.09281259775161743,,,,,, +5,17749,,,,,,0.08203816413879395,,,,,, +5,17799,,,,,,0.08615148067474365,,,,,, +5,17849,,,,,,0.0900852233171463,,,,,, +5,17899,,,,,,0.06783335655927658,,,,,, +5,17949,,,,,,0.09286636114120483,,,,,, +5,17999,,,,,,0.07930769771337509,,,,,, +5,18049,,,,,,0.09528427571058273,,,,,, +5,18099,,,,,,0.08432808518409729,,,,,, +5,18149,,,,,,0.08783426880836487,,,,,, +5,18199,,,,,,0.08905329555273056,,,,,, +5,18249,,,,,,0.07850895822048187,,,,,, +5,18299,,,,,,0.08236423134803772,,,,,, +5,18349,,,,,,0.07515519857406616,,,,,, +5,18399,,,,,,0.07341515272855759,,,,,, +5,18449,,,,,,0.08730572462081909,,,,,, +5,18499,,,,,,0.08811793476343155,,,,,, +5,18549,,,,,,0.08439735323190689,,,,,, +5,18599,,,,,,0.08477052301168442,,,,,, +5,18649,,,,,,0.0836903303861618,,,,,, +5,18699,,,,,,0.089958056807518,,,,,, +5,18749,,,,,,0.09201203286647797,,,,,, +5,18799,,,,,,0.06656157970428467,,,,,, +5,18849,,,,,,0.08778825402259827,,,,,, +5,18899,,,,,,0.08022753894329071,,,,,, +5,18949,,,,,,0.08353610336780548,,,,,, +5,18999,,,,,,0.09280429035425186,,,,,, +5,19049,,,,,,0.07742247730493546,,,,,, +5,19099,,,,,,0.0894559770822525,,,,,, +5,19149,,,,,,0.08698047697544098,,,,,, +5,19199,,,,,,0.07970340549945831,,,,,, +5,19249,,,,,,0.08271817862987518,,,,,, +5,19299,,,,,,0.07963433861732483,,,,,, +5,19349,,,,,,0.10392493009567261,,,,,, +5,19399,,,,,,0.08532703667879105,,,,,, +5,19449,,,,,,0.08919707685709,,,,,, +5,19499,,,,,,0.09537650644779205,,,,,, +5,19549,,,,,,0.07350119948387146,,,,,, +5,19599,,,,,,0.07692013680934906,,,,,, +5,19649,,,,,,0.09423793852329254,,,,,, +5,19699,,,,,,0.08287441730499268,,,,,, +5,19749,,,,,,0.0811842605471611,,,,,, +5,19799,,,,,,0.09691666066646576,,,,,, +5,19849,,,,,,0.09607867151498795,,,,,, +5,19899,,,,,,0.0820818841457367,,,,,, +5,19949,,,,,,0.08163665980100632,,,,,, +5,19999,,,,,,0.08235400915145874,,,,,, +5,20049,,,,,,0.08960883319377899,,,,,, +5,20099,,,,,,0.08044952899217606,,,,,, +5,20149,,,,,,0.08451062440872192,,,,,, +5,20199,,,,,,0.07747289538383484,,,,,, +5,20249,,,,,,0.09347666800022125,,,,,, +5,20299,,,,,,0.075269415974617,,,,,, +5,20349,,,,,,0.08229220658540726,,,,,, +5,20399,,,,,,0.09121429175138474,,,,,, +5,20449,,,,,,0.07441844046115875,,,,,, +5,20499,,,,,,0.08338965475559235,,,,,, +5,20549,,,,,,0.08041153848171234,,,,,, +5,20599,,,,,,0.08287841081619263,,,,,, +5,20649,,,,,,0.08287069201469421,,,,,, +5,20663,,,,,,,0.24866527318954468,0.08260224759578705,nan,0.0007375478744506836,0.06330259889364243,0.08260224759578705 +5,20663,0.250544011592865,0.084186851978302,0.003622764488682151,-0.013073921203613281,0.0014102321583777666,,,,,,, +6,20699,,,,,,0.08903701603412628,,,,,, +6,20749,,,,,,0.08530405908823013,,,,,, +6,20799,,,,,,0.07482735067605972,,,,,, +6,20849,,,,,,0.08685418963432312,,,,,, +6,20899,,,,,,0.09501007944345474,,,,,, +6,20949,,,,,,0.0813281461596489,,,,,, +6,20999,,,,,,0.0925469696521759,,,,,, +6,21049,,,,,,0.0869554728269577,,,,,, +6,21099,,,,,,0.08858805149793625,,,,,, +6,21149,,,,,,0.07038536667823792,,,,,, +6,21199,,,,,,0.08655716478824615,,,,,, +6,21249,,,,,,0.09001019597053528,,,,,, +6,21299,,,,,,0.07528997957706451,,,,,, +6,21349,,,,,,0.08105022460222244,,,,,, +6,21399,,,,,,0.06978446990251541,,,,,, +6,21449,,,,,,0.07421982288360596,,,,,, +6,21499,,,,,,0.09144658595323563,,,,,, +6,21549,,,,,,0.08112022280693054,,,,,, +6,21599,,,,,,0.08841210603713989,,,,,, +6,21649,,,,,,0.07867249846458435,,,,,, +6,21699,,,,,,0.08567418903112411,,,,,, +6,21749,,,,,,0.07952680438756943,,,,,, +6,21799,,,,,,0.09376633167266846,,,,,, +6,21849,,,,,,0.08695283532142639,,,,,, +6,21899,,,,,,0.08198975026607513,,,,,, +6,21949,,,,,,0.10234318673610687,,,,,, +6,21999,,,,,,0.0786736011505127,,,,,, +6,22049,,,,,,0.07918739318847656,,,,,, +6,22099,,,,,,0.08409525454044342,,,,,, +6,22149,,,,,,0.09147555381059647,,,,,, +6,22199,,,,,,0.09071088582277298,,,,,, +6,22249,,,,,,0.08370444178581238,,,,,, +6,22299,,,,,,0.08622441440820694,,,,,, +6,22349,,,,,,0.07479774206876755,,,,,, +6,22399,,,,,,0.08751006424427032,,,,,, +6,22449,,,,,,0.06564134359359741,,,,,, +6,22499,,,,,,0.08940690755844116,,,,,, +6,22549,,,,,,0.08366599678993225,,,,,, +6,22599,,,,,,0.07108376920223236,,,,,, +6,22649,,,,,,0.0812389999628067,,,,,, +6,22699,,,,,,0.07816681265830994,,,,,, +6,22749,,,,,,0.08806601166725159,,,,,, +6,22799,,,,,,0.07374205440282822,,,,,, +6,22849,,,,,,0.0779276043176651,,,,,, +6,22899,,,,,,0.07742106914520264,,,,,, +6,22949,,,,,,0.0804864838719368,,,,,, +6,22999,,,,,,0.08574648201465607,,,,,, +6,23049,,,,,,0.09932632744312286,,,,,, +6,23099,,,,,,0.08221457153558731,,,,,, +6,23149,,,,,,0.08935233950614929,,,,,, +6,23199,,,,,,0.0960528701543808,,,,,, +6,23249,,,,,,0.07961561530828476,,,,,, +6,23299,,,,,,0.09977617859840393,,,,,, +6,23349,,,,,,0.08741406351327896,,,,,, +6,23399,,,,,,0.09198617190122604,,,,,, +6,23449,,,,,,0.09007738530635834,,,,,, +6,23499,,,,,,0.08379189670085907,,,,,, +6,23549,,,,,,0.0870368480682373,,,,,, +6,23599,,,,,,0.072755366563797,,,,,, +6,23649,,,,,,0.08173751831054688,,,,,, +6,23699,,,,,,0.08393152058124542,,,,,, +6,23749,,,,,,0.07855387032032013,,,,,, +6,23799,,,,,,0.07506243139505386,,,,,, +6,23849,,,,,,0.08342516422271729,,,,,, +6,23899,,,,,,0.08842305839061737,,,,,, +6,23949,,,,,,0.07836691290140152,,,,,, +6,23999,,,,,,0.07523652911186218,,,,,, +6,24049,,,,,,0.09252437949180603,,,,,, +6,24099,,,,,,0.08412743359804153,,,,,, +6,24107,,,,,,,0.2490212470293045,0.08310314267873764,nan,-0.005321979522705078,-0.05292028933763504,0.08310314267873764 +6,24107,0.2505013644695282,0.084129199385643,-0.002191255334764719,-0.012384772300720215,-0.002711336361244321,,,,,,, +7,24149,,,,,,0.08963875472545624,,,,,, +7,24199,,,,,,0.0861433893442154,,,,,, +7,24249,,,,,,0.07864058017730713,,,,,, +7,24299,,,,,,0.07402698695659637,,,,,, +7,24349,,,,,,0.07904525101184845,,,,,, +7,24399,,,,,,0.08209694921970367,,,,,, +7,24449,,,,,,0.08130404353141785,,,,,, +7,24499,,,,,,0.06160857155919075,,,,,, +7,24549,,,,,,0.0925726443529129,,,,,, +7,24599,,,,,,0.09134085476398468,,,,,, +7,24649,,,,,,0.07159547507762909,,,,,, +7,24699,,,,,,0.08453584462404251,,,,,, +7,24749,,,,,,0.0778510570526123,,,,,, +7,24799,,,,,,0.08980404585599899,,,,,, +7,24849,,,,,,0.07875025272369385,,,,,, +7,24899,,,,,,0.08898033946752548,,,,,, +7,24949,,,,,,0.09099137037992477,,,,,, +7,24999,,,,,,0.09626086056232452,,,,,, +7,25049,,,,,,0.07430242747068405,,,,,, +7,25099,,,,,,0.08193893730640411,,,,,, +7,25149,,,,,,0.08523748070001602,,,,,, +7,25199,,,,,,0.07780852913856506,,,,,, +7,25249,,,,,,0.08806055039167404,,,,,, +7,25299,,,,,,0.07689638435840607,,,,,, +7,25349,,,,,,0.07493577897548676,,,,,, +7,25399,,,,,,0.07530739903450012,,,,,, +7,25449,,,,,,0.08111800253391266,,,,,, +7,25499,,,,,,0.07125144451856613,,,,,, +7,25549,,,,,,0.07267715036869049,,,,,, +7,25599,,,,,,0.07509525120258331,,,,,, +7,25649,,,,,,0.08948636054992676,,,,,, +7,25699,,,,,,0.09356639534235,,,,,, +7,25749,,,,,,0.0767199918627739,,,,,, +7,25799,,,,,,0.08427806943655014,,,,,, +7,25849,,,,,,0.08002222329378128,,,,,, +7,25899,,,,,,0.0820605456829071,,,,,, +7,25949,,,,,,0.07258030772209167,,,,,, +7,25999,,,,,,0.08803262561559677,,,,,, +7,26049,,,,,,0.08475228399038315,,,,,, +7,26099,,,,,,0.07934561371803284,,,,,, +7,26149,,,,,,0.09482152760028839,,,,,, +7,26199,,,,,,0.07617051154375076,,,,,, +7,26249,,,,,,0.08607839047908783,,,,,, +7,26299,,,,,,0.08606867492198944,,,,,, +7,26349,,,,,,0.09123627841472626,,,,,, +7,26399,,,,,,0.0906112864613533,,,,,, +7,26449,,,,,,0.08505043387413025,,,,,, +7,26499,,,,,,0.07993761450052261,,,,,, +7,26549,,,,,,0.07694607228040695,,,,,, +7,26599,,,,,,0.08795806765556335,,,,,, +7,26649,,,,,,0.08550749719142914,,,,,, +7,26699,,,,,,0.07776080816984177,,,,,, +7,26749,,,,,,0.09319167584180832,,,,,, +7,26799,,,,,,0.08899493515491486,,,,,, +7,26849,,,,,,0.07565081119537354,,,,,, +7,26899,,,,,,0.08397646248340607,,,,,, +7,26949,,,,,,0.07332216203212738,,,,,, +7,26999,,,,,,0.08781381696462631,,,,,, +7,27049,,,,,,0.08035275340080261,,,,,, +7,27099,,,,,,0.08311821520328522,,,,,, +7,27149,,,,,,0.08503337949514389,,,,,, +7,27199,,,,,,0.08438740670681,,,,,, +7,27249,,,,,,0.09235648810863495,,,,,, +7,27299,,,,,,0.08043798059225082,,,,,, +7,27349,,,,,,0.09151993691921234,,,,,, +7,27399,,,,,,0.08311548084020615,,,,,, +7,27449,,,,,,0.07938186824321747,,,,,, +7,27499,,,,,,0.08260110020637512,,,,,, +7,27549,,,,,,0.09441311657428741,,,,,, +7,27551,,,,,,,0.24875763058662415,0.08268224447965622,nan,-0.0002301931381225586,-0.07260040193796158,0.08268224447965622 +7,27551,0.25005215406417847,0.08376283198595047,0.006141229532659054,-0.007974863052368164,0.00740169920027256,,,,,,, +8,27599,,,,,,0.07658153772354126,,,,,, +8,27649,,,,,,0.07709120959043503,,,,,, +8,27699,,,,,,0.08810881525278091,,,,,, +8,27749,,,,,,0.0926637202501297,,,,,, +8,27799,,,,,,0.08750176429748535,,,,,, +8,27849,,,,,,0.090828537940979,,,,,, +8,27899,,,,,,0.08077044785022736,,,,,, +8,27949,,,,,,0.07746228575706482,,,,,, +8,27999,,,,,,0.08450795710086823,,,,,, +8,28049,,,,,,0.08140221238136292,,,,,, +8,28099,,,,,,0.08354990929365158,,,,,, +8,28149,,,,,,0.08648531883955002,,,,,, +8,28199,,,,,,0.07220003753900528,,,,,, +8,28249,,,,,,0.07751869410276413,,,,,, +8,28299,,,,,,0.0902017205953598,,,,,, +8,28349,,,,,,0.08915495872497559,,,,,, +8,28399,,,,,,0.08364735543727875,,,,,, +8,28449,,,,,,0.07978768646717072,,,,,, +8,28499,,,,,,0.08193852007389069,,,,,, +8,28549,,,,,,0.08500692248344421,,,,,, +8,28599,,,,,,0.08364220708608627,,,,,, +8,28649,,,,,,0.0870843231678009,,,,,, +8,28699,,,,,,0.09017544239759445,,,,,, +8,28749,,,,,,0.08870813250541687,,,,,, +8,28799,,,,,,0.07920164614915848,,,,,, +8,28849,,,,,,0.08037930727005005,,,,,, +8,28899,,,,,,0.07563197612762451,,,,,, +8,28949,,,,,,0.0958743765950203,,,,,, +8,28999,,,,,,0.08905159682035446,,,,,, +8,29049,,,,,,0.08724133670330048,,,,,, +8,29099,,,,,,0.09115993976593018,,,,,, +8,29149,,,,,,0.0809531882405281,,,,,, +8,29199,,,,,,0.08695770800113678,,,,,, +8,29249,,,,,,0.08312948048114777,,,,,, +8,29299,,,,,,0.08357707411050797,,,,,, +8,29349,,,,,,0.07361890375614166,,,,,, +8,29399,,,,,,0.0850706622004509,,,,,, +8,29449,,,,,,0.07282257080078125,,,,,, +8,29499,,,,,,0.08142021298408508,,,,,, +8,29549,,,,,,0.10014325380325317,,,,,, +8,29599,,,,,,0.08521666377782822,,,,,, +8,29649,,,,,,0.08028505742549896,,,,,, +8,29699,,,,,,0.08243818581104279,,,,,, +8,29749,,,,,,0.0770728662610054,,,,,, +8,29799,,,,,,0.08074167370796204,,,,,, +8,29849,,,,,,0.0806782990694046,,,,,, +8,29899,,,,,,0.08613436669111252,,,,,, +8,29949,,,,,,0.08832104504108429,,,,,, +8,29999,,,,,,0.09280149638652802,,,,,, +8,30049,,,,,,0.08816105872392654,,,,,, +8,30099,,,,,,0.09420935809612274,,,,,, +8,30149,,,,,,0.08130858838558197,,,,,, +8,30199,,,,,,0.08188478648662567,,,,,, +8,30249,,,,,,0.08635874837636948,,,,,, +8,30299,,,,,,0.08285869657993317,,,,,, +8,30349,,,,,,0.07797899842262268,,,,,, +8,30399,,,,,,0.0799085944890976,,,,,, +8,30449,,,,,,0.0933045968413353,,,,,, +8,30499,,,,,,0.07536163181066513,,,,,, +8,30549,,,,,,0.0730094462633133,,,,,, +8,30599,,,,,,0.07160160690546036,,,,,, +8,30649,,,,,,0.08326452225446701,,,,,, +8,30699,,,,,,0.09642741084098816,,,,,, +8,30749,,,,,,0.09020425379276276,,,,,, +8,30799,,,,,,0.08196070045232773,,,,,, +8,30849,,,,,,0.07353246212005615,,,,,, +8,30899,,,,,,0.08210218697786331,,,,,, +8,30949,,,,,,0.0869232788681984,,,,,, +8,30995,,,,,,,0.24893644452095032,0.08280491083860397,nan,-0.0017142295837402344,0.04786711558699608,0.08280491083860397 +8,30995,0.24960555136203766,0.08442376554012299,0.014013192616403103,-0.015922069549560547,0.023363405838608742,,,,,,, +9,30999,,,,,,0.08011852204799652,,,,,, +9,31049,,,,,,0.08589073270559311,,,,,, +9,31099,,,,,,0.07670589536428452,,,,,, +9,31149,,,,,,0.07958943396806717,,,,,, +9,31199,,,,,,0.07501383125782013,,,,,, +9,31249,,,,,,0.08171705156564713,,,,,, +9,31299,,,,,,0.07427146285772324,,,,,, +9,31349,,,,,,0.08416873961687088,,,,,, +9,31399,,,,,,0.07708443701267242,,,,,, +9,31449,,,,,,0.07874678075313568,,,,,, +9,31499,,,,,,0.08168203383684158,,,,,, +9,31549,,,,,,0.08564296364784241,,,,,, +9,31599,,,,,,0.0858519971370697,,,,,, +9,31649,,,,,,0.08090421557426453,,,,,, +9,31699,,,,,,0.08265114575624466,,,,,, +9,31749,,,,,,0.07642575353384018,,,,,, +9,31799,,,,,,0.07650194317102432,,,,,, +9,31849,,,,,,0.08294948935508728,,,,,, +9,31899,,,,,,0.08519424498081207,,,,,, +9,31949,,,,,,0.08457070589065552,,,,,, +9,31999,,,,,,0.08976727724075317,,,,,, +9,32049,,,,,,0.07847823947668076,,,,,, +9,32099,,,,,,0.08952782303094864,,,,,, +9,32149,,,,,,0.07751108705997467,,,,,, +9,32199,,,,,,0.09536941349506378,,,,,, +9,32249,,,,,,0.08340597152709961,,,,,, +9,32299,,,,,,0.07951159030199051,,,,,, +9,32349,,,,,,0.07568556070327759,,,,,, +9,32399,,,,,,0.07568376511335373,,,,,, +9,32449,,,,,,0.08213305473327637,,,,,, +9,32499,,,,,,0.08587896823883057,,,,,, +9,32549,,,,,,0.07348737120628357,,,,,, +9,32599,,,,,,0.07839776575565338,,,,,, +9,32649,,,,,,0.08122937381267548,,,,,, +9,32699,,,,,,0.08720171451568604,,,,,, +9,32749,,,,,,0.07942574471235275,,,,,, +9,32799,,,,,,0.08982063829898834,,,,,, +9,32849,,,,,,0.07674017548561096,,,,,, +9,32899,,,,,,0.0768662840127945,,,,,, +9,32949,,,,,,0.08276385068893433,,,,,, +9,32999,,,,,,0.09119952470064163,,,,,, +9,33049,,,,,,0.07445794343948364,,,,,, +9,33099,,,,,,0.0933358445763588,,,,,, +9,33149,,,,,,0.08258000016212463,,,,,, +9,33199,,,,,,0.08987659215927124,,,,,, +9,33249,,,,,,0.08317433297634125,,,,,, +9,33299,,,,,,0.07682915031909943,,,,,, +9,33349,,,,,,0.08217711746692657,,,,,, +9,33399,,,,,,0.08048099279403687,,,,,, +9,33449,,,,,,0.07554808259010315,,,,,, +9,33499,,,,,,0.07864786684513092,,,,,, +9,33549,,,,,,0.08683986961841583,,,,,, +9,33599,,,,,,0.08965960144996643,,,,,, +9,33649,,,,,,0.09129855781793594,,,,,, +9,33699,,,,,,0.07583875209093094,,,,,, +9,33749,,,,,,0.09125971049070358,,,,,, +9,33799,,,,,,0.08332356065511703,,,,,, +9,33849,,,,,,0.08507503569126129,,,,,, +9,33899,,,,,,0.08110382407903671,,,,,, +9,33949,,,,,,0.07771686464548111,,,,,, +9,33999,,,,,,0.09782290458679199,,,,,, +9,34049,,,,,,0.07524731010198593,,,,,, +9,34099,,,,,,0.07802409678697586,,,,,, +9,34149,,,,,,0.07669246941804886,,,,,, +9,34199,,,,,,0.08765113353729248,,,,,, +9,34249,,,,,,0.09292124211788177,,,,,, +9,34299,,,,,,0.08938339352607727,,,,,, +9,34349,,,,,,0.08161016553640366,,,,,, +9,34399,,,,,,0.08219052851200104,,,,,, +9,34439,,,,,,,0.2487415373325348,0.08267378062009811,nan,-0.00012791156768798828,-0.06750214844942093,0.08267378062009811 +9,34439,0.2492084801197052,0.08312738686800003,0.043056003749370575,-0.0003261566162109375,0.04653008282184601,,,,,,, +10,34449,,,,,,0.08195631951093674,,,,,, +10,34499,,,,,,0.09052430093288422,,,,,, +10,34549,,,,,,0.08338841795921326,,,,,, +10,34599,,,,,,0.07850151509046555,,,,,, +10,34649,,,,,,0.08131934702396393,,,,,, +10,34699,,,,,,0.06542658805847168,,,,,, +10,34749,,,,,,0.08670812845230103,,,,,, +10,34799,,,,,,0.09101845324039459,,,,,, +10,34849,,,,,,0.08201782405376434,,,,,, +10,34899,,,,,,0.06881459057331085,,,,,, +10,34949,,,,,,0.09347739815711975,,,,,, +10,34999,,,,,,0.07860520482063293,,,,,, +10,35049,,,,,,0.07703743129968643,,,,,, +10,35099,,,,,,0.08873917162418365,,,,,, +10,35149,,,,,,0.08062466979026794,,,,,, +10,35199,,,,,,0.0821848213672638,,,,,, +10,35249,,,,,,0.0987861156463623,,,,,, +10,35299,,,,,,0.09731565415859222,,,,,, +10,35349,,,,,,0.08748149871826172,,,,,, +10,35399,,,,,,0.0815376415848732,,,,,, +10,35449,,,,,,0.08986563980579376,,,,,, +10,35499,,,,,,0.07068951427936554,,,,,, +10,35549,,,,,,0.07929837703704834,,,,,, +10,35599,,,,,,0.07300616800785065,,,,,, +10,35649,,,,,,0.0880848616361618,,,,,, +10,35699,,,,,,0.07895733416080475,,,,,, +10,35749,,,,,,0.09149794280529022,,,,,, +10,35799,,,,,,0.07864131778478622,,,,,, +10,35849,,,,,,0.0821109414100647,,,,,, +10,35899,,,,,,0.08760574460029602,,,,,, +10,35949,,,,,,0.08650130778551102,,,,,, +10,35999,,,,,,0.07417052984237671,,,,,, +10,36049,,,,,,0.09353413432836533,,,,,, +10,36099,,,,,,0.0840713381767273,,,,,, +10,36149,,,,,,0.07532018423080444,,,,,, +10,36199,,,,,,0.08923079073429108,,,,,, +10,36249,,,,,,0.08567182719707489,,,,,, +10,36299,,,,,,0.08203194290399551,,,,,, +10,36349,,,,,,0.08121129870414734,,,,,, +10,36399,,,,,,0.075995072722435,,,,,, +10,36449,,,,,,0.08696021884679794,,,,,, +10,36499,,,,,,0.07707206159830093,,,,,, +10,36549,,,,,,0.08439173549413681,,,,,, +10,36599,,,,,,0.07360941916704178,,,,,, +10,36649,,,,,,0.0833187997341156,,,,,, +10,36699,,,,,,0.0759197473526001,,,,,, +10,36749,,,,,,0.07841158658266068,,,,,, +10,36799,,,,,,0.07909011840820312,,,,,, +10,36849,,,,,,0.0791262611746788,,,,,, +10,36899,,,,,,0.082210972905159,,,,,, +10,36949,,,,,,0.07119233906269073,,,,,, +10,36999,,,,,,0.0884798914194107,,,,,, +10,37049,,,,,,0.09844058752059937,,,,,, +10,37099,,,,,,0.0871281623840332,,,,,, +10,37149,,,,,,0.07795418053865433,,,,,, +10,37199,,,,,,0.08341141045093536,,,,,, +10,37249,,,,,,0.09061110019683838,,,,,, +10,37299,,,,,,0.077840656042099,,,,,, +10,37349,,,,,,0.07490101456642151,,,,,, +10,37399,,,,,,0.07738792896270752,,,,,, +10,37449,,,,,,0.07972291857004166,,,,,, +10,37499,,,,,,0.08566252887248993,,,,,, +10,37549,,,,,,0.08226969838142395,,,,,, +10,37599,,,,,,0.08914169669151306,,,,,, +10,37649,,,,,,0.09177438169717789,,,,,, +10,37699,,,,,,0.0877322256565094,,,,,, +10,37749,,,,,,0.08100111037492752,,,,,, +10,37799,,,,,,0.07848389446735382,,,,,, +10,37849,,,,,,0.08001091331243515,,,,,, +10,37883,,,,,,,0.24816931784152985,0.08229170739650726,nan,0.004494190216064453,0.09935168921947479,0.08229170739650726 +10,37883,0.24857619404792786,0.08278714865446091,0.0702965036034584,0.0037630200386047363,0.06841865926980972,,,,,,, +11,37899,,,,,,0.08239778131246567,,,,,, +11,37949,,,,,,0.0948043093085289,,,,,, +11,37999,,,,,,0.0798211395740509,,,,,, +11,38049,,,,,,0.09205055236816406,,,,,, +11,38099,,,,,,0.07544143497943878,,,,,, +11,38149,,,,,,0.08773372322320938,,,,,, +11,38199,,,,,,0.07626655697822571,,,,,, +11,38249,,,,,,0.08084795624017715,,,,,, +11,38299,,,,,,0.07325991243124008,,,,,, +11,38349,,,,,,0.08601042628288269,,,,,, +11,38399,,,,,,0.06989094614982605,,,,,, +11,38449,,,,,,0.07741270214319229,,,,,, +11,38499,,,,,,0.07271736860275269,,,,,, +11,38549,,,,,,0.0796341598033905,,,,,, +11,38599,,,,,,0.08318803459405899,,,,,, +11,38649,,,,,,0.0830969363451004,,,,,, +11,38699,,,,,,0.07138743251562119,,,,,, +11,38749,,,,,,0.08967502415180206,,,,,, +11,38799,,,,,,0.08843360841274261,,,,,, +11,38849,,,,,,0.07540567219257355,,,,,, +11,38899,,,,,,0.08566394448280334,,,,,, +11,38949,,,,,,0.08014605939388275,,,,,, +11,38999,,,,,,0.07921192795038223,,,,,, +11,39049,,,,,,0.08301529288291931,,,,,, +11,39099,,,,,,0.08954058587551117,,,,,, +11,39149,,,,,,0.06680857390165329,,,,,, +11,39199,,,,,,0.07730711996555328,,,,,, +11,39249,,,,,,0.0734875276684761,,,,,, +11,39299,,,,,,0.08018103241920471,,,,,, +11,39349,,,,,,0.08405528962612152,,,,,, +11,39399,,,,,,0.07515700161457062,,,,,, +11,39449,,,,,,0.08585768938064575,,,,,, +11,39499,,,,,,0.07390709221363068,,,,,, +11,39549,,,,,,0.08948184549808502,,,,,, +11,39599,,,,,,0.08366669714450836,,,,,, +11,39649,,,,,,0.07316668331623077,,,,,, +11,39699,,,,,,0.08311079442501068,,,,,, +11,39749,,,,,,0.08308723568916321,,,,,, +11,39799,,,,,,0.07104665786027908,,,,,, +11,39849,,,,,,0.08333254605531693,,,,,, +11,39899,,,,,,0.08040925860404968,,,,,, +11,39949,,,,,,0.09048551321029663,,,,,, +11,39999,,,,,,0.0787348747253418,,,,,, +11,40049,,,,,,0.09589444100856781,,,,,, +11,40099,,,,,,0.07577048242092133,,,,,, +11,40149,,,,,,0.07812346518039703,,,,,, +11,40199,,,,,,0.06716986745595932,,,,,, +11,40249,,,,,,0.06828470528125763,,,,,, +11,40299,,,,,,0.07764409482479095,,,,,, +11,40349,,,,,,0.07322215288877487,,,,,, +11,40399,,,,,,0.08929106593132019,,,,,, +11,40449,,,,,,0.07580898702144623,,,,,, +11,40499,,,,,,0.0859752669930458,,,,,, +11,40549,,,,,,0.09193693101406097,,,,,, +11,40599,,,,,,0.07701265811920166,,,,,, +11,40649,,,,,,0.07652007043361664,,,,,, +11,40699,,,,,,0.07491441071033478,,,,,, +11,40749,,,,,,0.08209210634231567,,,,,, +11,40799,,,,,,0.0828292965888977,,,,,, +11,40849,,,,,,0.080995574593544,,,,,, +11,40899,,,,,,0.08093765377998352,,,,,, +11,40949,,,,,,0.07441610097885132,,,,,, +11,40999,,,,,,0.0645846426486969,,,,,, +11,41049,,,,,,0.07108233869075775,,,,,, +11,41099,,,,,,0.08401019126176834,,,,,, +11,41149,,,,,,0.07274331152439117,,,,,, +11,41199,,,,,,0.08806721866130829,,,,,, +11,41249,,,,,,0.07517844438552856,,,,,, +11,41299,,,,,,0.07867880165576935,,,,,, +11,41327,,,,,,,0.24281901121139526,0.07949566841125488,0.19920819997787476,0.0383186936378479,0.14518067240715027,0.07949566841125488 +11,41327,0.2455248236656189,0.08135326206684113,0.1478586345911026,0.021018624305725098,0.1359330415725708,,,,,,, +12,41349,,,,,,0.07837190479040146,,,,,, +12,41399,,,,,,0.07063999772071838,,,,,, +12,41449,,,,,,0.08233369886875153,,,,,, +12,41499,,,,,,0.08094079792499542,,,,,, +12,41549,,,,,,0.08090709894895554,,,,,, +12,41599,,,,,,0.08402140438556671,,,,,, +12,41649,,,,,,0.08827300369739532,,,,,, +12,41699,,,,,,0.07481664419174194,,,,,, +12,41749,,,,,,0.07717050611972809,,,,,, +12,41799,,,,,,0.07574987411499023,,,,,, +12,41849,,,,,,0.07922690361738205,,,,,, +12,41899,,,,,,0.07943867892026901,,,,,, +12,41949,,,,,,0.07568864524364471,,,,,, +12,41999,,,,,,0.08190444111824036,,,,,, +12,42049,,,,,,0.08504495024681091,,,,,, +12,42099,,,,,,0.07468155771493912,,,,,, +12,42149,,,,,,0.0626765787601471,,,,,, +12,42199,,,,,,0.07681904733181,,,,,, +12,42249,,,,,,0.0758814588189125,,,,,, +12,42299,,,,,,0.07628882676362991,,,,,, +12,42349,,,,,,0.07723666727542877,,,,,, +12,42399,,,,,,0.07716836035251617,,,,,, +12,42449,,,,,,0.07871127128601074,,,,,, +12,42499,,,,,,0.06955020129680634,,,,,, +12,42549,,,,,,0.08130303025245667,,,,,, +12,42599,,,,,,0.07954873889684677,,,,,, +12,42649,,,,,,0.08640426397323608,,,,,, +12,42699,,,,,,0.07678075134754181,,,,,, +12,42749,,,,,,0.0735093206167221,,,,,, +12,42799,,,,,,0.07748281210660934,,,,,, +12,42849,,,,,,0.0712265744805336,,,,,, +12,42899,,,,,,0.08728586137294769,,,,,, +12,42949,,,,,,0.06338581442832947,,,,,, +12,42999,,,,,,0.08214810490608215,,,,,, +12,43049,,,,,,0.06738758832216263,,,,,, +12,43099,,,,,,0.08244121074676514,,,,,, +12,43149,,,,,,0.07679972052574158,,,,,, +12,43199,,,,,,0.06495805084705353,,,,,, +12,43249,,,,,,0.09154224395751953,,,,,, +12,43299,,,,,,0.0771191418170929,,,,,, +12,43349,,,,,,0.07522808015346527,,,,,, +12,43399,,,,,,0.08905427157878876,,,,,, +12,43449,,,,,,0.08356490731239319,,,,,, +12,43499,,,,,,0.0876193642616272,,,,,, +12,43549,,,,,,0.09038179367780685,,,,,, +12,43599,,,,,,0.0943470150232315,,,,,, +12,43649,,,,,,0.07672170549631119,,,,,, +12,43699,,,,,,0.07428665459156036,,,,,, +12,43749,,,,,,0.08861495554447174,,,,,, +12,43799,,,,,,0.08572931587696075,,,,,, +12,43849,,,,,,0.07151729613542557,,,,,, +12,43899,,,,,,0.08962252736091614,,,,,, +12,43949,,,,,,0.06903159618377686,,,,,, +12,43999,,,,,,0.08359365165233612,,,,,, +12,44049,,,,,,0.0872250348329544,,,,,, +12,44099,,,,,,0.07051873207092285,,,,,, +12,44149,,,,,,0.06968309730291367,,,,,, +12,44199,,,,,,0.07354129105806351,,,,,, +12,44249,,,,,,0.07917511463165283,,,,,, +12,44299,,,,,,0.0785410925745964,,,,,, +12,44349,,,,,,0.07702630758285522,,,,,, +12,44399,,,,,,0.06736079603433609,,,,,, +12,44449,,,,,,0.06611530482769012,,,,,, +12,44499,,,,,,0.07116445153951645,,,,,, +12,44549,,,,,,0.08385355770587921,,,,,, +12,44599,,,,,,0.07446371763944626,,,,,, +12,44649,,,,,,0.07767171412706375,,,,,, +12,44699,,,,,,0.07107603549957275,,,,,, +12,44749,,,,,,0.08035615086555481,,,,,, +12,44771,,,,,,,0.242596834897995,0.0794137641787529,0.20958256721496582,0.03930950164794922,0.16338810324668884,0.0794137641787529 +12,44771,0.2399314045906067,0.07861543446779251,0.23267485201358795,0.05397003889083862,0.20181845128536224,,,,,,, +13,44799,,,,,,0.07896576821804047,,,,,, +13,44849,,,,,,0.08226467669010162,,,,,, +13,44899,,,,,,0.07317477464675903,,,,,, +13,44949,,,,,,0.0830238088965416,,,,,, +13,44999,,,,,,0.07146628946065903,,,,,, +13,45049,,,,,,0.07692213356494904,,,,,, +13,45099,,,,,,0.0692291408777237,,,,,, +13,45149,,,,,,0.07860241830348969,,,,,, +13,45199,,,,,,0.073147252202034,,,,,, +13,45249,,,,,,0.07638292759656906,,,,,, +13,45299,,,,,,0.08799956738948822,,,,,, +13,45349,,,,,,0.08025692403316498,,,,,, +13,45399,,,,,,0.08621206879615784,,,,,, +13,45449,,,,,,0.08305346965789795,,,,,, +13,45499,,,,,,0.07618336379528046,,,,,, +13,45549,,,,,,0.0714377909898758,,,,,, +13,45599,,,,,,0.06663304567337036,,,,,, +13,45649,,,,,,0.07653892040252686,,,,,, +13,45699,,,,,,0.06961585581302643,,,,,, +13,45749,,,,,,0.08903098106384277,,,,,, +13,45799,,,,,,0.07792140543460846,,,,,, +13,45849,,,,,,0.0743679478764534,,,,,, +13,45899,,,,,,0.08913064002990723,,,,,, +13,45949,,,,,,0.0750756487250328,,,,,, +13,45999,,,,,,0.08406670391559601,,,,,, +13,46049,,,,,,0.07649687677621841,,,,,, +13,46099,,,,,,0.08443684875965118,,,,,, +13,46149,,,,,,0.07260650396347046,,,,,, +13,46199,,,,,,0.06693268567323685,,,,,, +13,46249,,,,,,0.08326085656881332,,,,,, +13,46299,,,,,,0.07258673757314682,,,,,, +13,46349,,,,,,0.07214324176311493,,,,,, +13,46399,,,,,,0.07701244205236435,,,,,, +13,46449,,,,,,0.07105834782123566,,,,,, +13,46499,,,,,,0.06965646147727966,,,,,, +13,46549,,,,,,0.07375209033489227,,,,,, +13,46599,,,,,,0.08054975420236588,,,,,, +13,46649,,,,,,0.07796767354011536,,,,,, +13,46699,,,,,,0.07781141996383667,,,,,, +13,46749,,,,,,0.06244036927819252,,,,,, +13,46799,,,,,,0.07639152556657791,,,,,, +13,46849,,,,,,0.07723269611597061,,,,,, +13,46899,,,,,,0.0774884968996048,,,,,, +13,46949,,,,,,0.07017591595649719,,,,,, +13,46999,,,,,,0.07445675134658813,,,,,, +13,47049,,,,,,0.07504640519618988,,,,,, +13,47099,,,,,,0.08083856105804443,,,,,, +13,47149,,,,,,0.07448476552963257,,,,,, +13,47199,,,,,,0.07253485918045044,,,,,, +13,47249,,,,,,0.08005797863006592,,,,,, +13,47299,,,,,,0.07904516905546188,,,,,, +13,47349,,,,,,0.07345279306173325,,,,,, +13,47399,,,,,,0.07983310520648956,,,,,, +13,47449,,,,,,0.07769709080457687,,,,,, +13,47499,,,,,,0.08276037871837616,,,,,, +13,47549,,,,,,0.08743992447853088,,,,,, +13,47599,,,,,,0.08418019115924835,,,,,, +13,47649,,,,,,0.06878577917814255,,,,,, +13,47699,,,,,,0.08494402468204498,,,,,, +13,47749,,,,,,0.07916532456874847,,,,,, +13,47799,,,,,,0.08282162994146347,,,,,, +13,47849,,,,,,0.06014612317085266,,,,,, +13,47899,,,,,,0.06880613416433334,,,,,, +13,47949,,,,,,0.06485515832901001,,,,,, +13,47999,,,,,,0.08118852227926254,,,,,, +13,48049,,,,,,0.07660902291536331,,,,,, +13,48099,,,,,,0.07657413184642792,,,,,, +13,48149,,,,,,0.07210386544466019,,,,,, +13,48199,,,,,,0.07390215992927551,,,,,, +13,48215,,,,,,,0.24140453338623047,0.07919926196336746,0.2097025364637375,0.04190438985824585,0.16950540244579315,0.07919926196336746 +13,48215,0.23819585144519806,0.07776296883821487,0.2536022663116455,0.06422853469848633,0.22440150380134583,,,,,,, +14,48249,,,,,,0.06805558502674103,,,,,, +14,48299,,,,,,0.07679736614227295,,,,,, +14,48349,,,,,,0.08301304280757904,,,,,, +14,48399,,,,,,0.07380346953868866,,,,,, +14,48449,,,,,,0.06195873022079468,,,,,, +14,48499,,,,,,0.07971134781837463,,,,,, +14,48549,,,,,,0.07919272035360336,,,,,, +14,48599,,,,,,0.08982890099287033,,,,,, +14,48649,,,,,,0.07280053198337555,,,,,, +14,48699,,,,,,0.07080531865358353,,,,,, +14,48749,,,,,,0.08614674210548401,,,,,, +14,48799,,,,,,0.060120582580566406,,,,,, +14,48849,,,,,,0.08356831967830658,,,,,, +14,48899,,,,,,0.0706799104809761,,,,,, +14,48949,,,,,,0.07485789805650711,,,,,, +14,48999,,,,,,0.06859123706817627,,,,,, +14,49049,,,,,,0.07728417217731476,,,,,, +14,49099,,,,,,0.08490774035453796,,,,,, +14,49149,,,,,,0.08018814027309418,,,,,, +14,49199,,,,,,0.0755571722984314,,,,,, +14,49249,,,,,,0.09055948257446289,,,,,, +14,49299,,,,,,0.0903950184583664,,,,,, +14,49349,,,,,,0.0862889215350151,,,,,, +14,49399,,,,,,0.0667061135172844,,,,,, +14,49449,,,,,,0.06443672627210617,,,,,, +14,49499,,,,,,0.08788127452135086,,,,,, +14,49549,,,,,,0.07445767521858215,,,,,, +14,49599,,,,,,0.07404735684394836,,,,,, +14,49649,,,,,,0.07096024602651596,,,,,, +14,49699,,,,,,0.08531001955270767,,,,,, +14,49749,,,,,,0.07583840191364288,,,,,, +14,49799,,,,,,0.07986411452293396,,,,,, +14,49849,,,,,,0.07171174883842468,,,,,, +14,49899,,,,,,0.07063233107328415,,,,,, +14,49949,,,,,,0.08530528843402863,,,,,, +14,49999,,,,,,0.07703579217195511,,,,,, +14,50049,,,,,,0.06606563925743103,,,,,, +14,50099,,,,,,0.07351026684045792,,,,,, +14,50149,,,,,,0.07785721868276596,,,,,, +14,50199,,,,,,0.07525652647018433,,,,,, +14,50249,,,,,,0.07470987737178802,,,,,, +14,50299,,,,,,0.08004406839609146,,,,,, +14,50349,,,,,,0.08242597430944443,,,,,, +14,50399,,,,,,0.07928445935249329,,,,,, +14,50449,,,,,,0.08342202007770538,,,,,, +14,50499,,,,,,0.07263609766960144,,,,,, +14,50549,,,,,,0.09046671539545059,,,,,, +14,50599,,,,,,0.06469936668872833,,,,,, +14,50649,,,,,,0.09291262924671173,,,,,, +14,50699,,,,,,0.07285704463720322,,,,,, +14,50749,,,,,,0.07714161276817322,,,,,, +14,50799,,,,,,0.07268714904785156,,,,,, +14,50849,,,,,,0.08083081245422363,,,,,, +14,50899,,,,,,0.07069514691829681,,,,,, +14,50949,,,,,,0.07657261192798615,,,,,, +14,50999,,,,,,0.08419975638389587,,,,,, +14,51049,,,,,,0.06931750476360321,,,,,, +14,51099,,,,,,0.07193943858146667,,,,,, +14,51149,,,,,,0.07249385118484497,,,,,, +14,51199,,,,,,0.07815653830766678,,,,,, +14,51249,,,,,,0.08727133274078369,,,,,, +14,51299,,,,,,0.08698561042547226,,,,,, +14,51349,,,,,,0.07529594004154205,,,,,, +14,51399,,,,,,0.07547424733638763,,,,,, +14,51449,,,,,,0.08488956838846207,,,,,, +14,51499,,,,,,0.07453345507383347,,,,,, +14,51549,,,,,,0.09389781206846237,,,,,, +14,51599,,,,,,0.06834961473941803,,,,,, +14,51649,,,,,,0.07157637178897858,,,,,, +14,51659,,,,,,,0.24260009825229645,0.07960040867328644,0.1977653056383133,0.03705155849456787,0.1521887481212616,0.07960040867328644 +14,51659,0.23722374439239502,0.07725790143013,0.26531627774238586,0.0703015923500061,0.23601293563842773,,,,,,, +15,51699,,,,,,0.06767794489860535,,,,,, +15,51749,,,,,,0.07636862248182297,,,,,, +15,51799,,,,,,0.07498800754547119,,,,,, +15,51849,,,,,,0.0901435911655426,,,,,, +15,51899,,,,,,0.07357832789421082,,,,,, +15,51949,,,,,,0.07612072676420212,,,,,, +15,51999,,,,,,0.08851461112499237,,,,,, +15,52049,,,,,,0.07189156115055084,,,,,, +15,52099,,,,,,0.07052965462207794,,,,,, +15,52149,,,,,,0.07954061031341553,,,,,, +15,52199,,,,,,0.08378420770168304,,,,,, +15,52249,,,,,,0.0775124728679657,,,,,, +15,52299,,,,,,0.0795762836933136,,,,,, +15,52349,,,,,,0.07428441941738129,,,,,, +15,52399,,,,,,0.0790291503071785,,,,,, +15,52449,,,,,,0.0803782045841217,,,,,, +15,52499,,,,,,0.07905806601047516,,,,,, +15,52549,,,,,,0.06805476546287537,,,,,, +15,52599,,,,,,0.08043934404850006,,,,,, +15,52649,,,,,,0.06805505603551865,,,,,, +15,52699,,,,,,0.07351160049438477,,,,,, +15,52749,,,,,,0.0823187530040741,,,,,, +15,52799,,,,,,0.07900539040565491,,,,,, +15,52849,,,,,,0.07845383137464523,,,,,, +15,52899,,,,,,0.07652468979358673,,,,,, +15,52949,,,,,,0.06588180363178253,,,,,, +15,52999,,,,,,0.08115352690219879,,,,,, +15,53049,,,,,,0.06883719563484192,,,,,, +15,53099,,,,,,0.07259885966777802,,,,,, +15,53149,,,,,,0.07856418192386627,,,,,, +15,53199,,,,,,0.06669691205024719,,,,,, +15,53249,,,,,,0.07498958706855774,,,,,, +15,53299,,,,,,0.07800482958555222,,,,,, +15,53349,,,,,,0.08317873626947403,,,,,, +15,53399,,,,,,0.08200469613075256,,,,,, +15,53449,,,,,,0.07714257389307022,,,,,, +15,53499,,,,,,0.08238255977630615,,,,,, +15,53549,,,,,,0.0831223726272583,,,,,, +15,53599,,,,,,0.06971268355846405,,,,,, +15,53649,,,,,,0.07037386298179626,,,,,, +15,53699,,,,,,0.07213138043880463,,,,,, +15,53749,,,,,,0.07404881715774536,,,,,, +15,53799,,,,,,0.07150363177061081,,,,,, +15,53849,,,,,,0.07924602925777435,,,,,, +15,53899,,,,,,0.07468275725841522,,,,,, +15,53949,,,,,,0.08267531543970108,,,,,, +15,53999,,,,,,0.07583892345428467,,,,,, +15,54049,,,,,,0.0780712366104126,,,,,, +15,54099,,,,,,0.07508710771799088,,,,,, +15,54149,,,,,,0.07564334571361542,,,,,, +15,54199,,,,,,0.067172572016716,,,,,, +15,54249,,,,,,0.09109778702259064,,,,,, +15,54299,,,,,,0.07034045457839966,,,,,, +15,54349,,,,,,0.08813925832509995,,,,,, +15,54399,,,,,,0.07737787067890167,,,,,, +15,54449,,,,,,0.0843706950545311,,,,,, +15,54499,,,,,,0.08119877427816391,,,,,, +15,54549,,,,,,0.08236626535654068,,,,,, +15,54599,,,,,,0.08272016048431396,,,,,, +15,54649,,,,,,0.07833091914653778,,,,,, +15,54699,,,,,,0.08465361595153809,,,,,, +15,54749,,,,,,0.06721213459968567,,,,,, +15,54799,,,,,,0.09717060625553131,,,,,, +15,54849,,,,,,0.08202125132083893,,,,,, +15,54899,,,,,,0.07140122354030609,,,,,, +15,54949,,,,,,0.07256820797920227,,,,,, +15,54999,,,,,,0.08245448768138885,,,,,, +15,55049,,,,,,0.07627955079078674,,,,,, +15,55099,,,,,,0.0760246068239212,,,,,, +15,55103,,,,,,,0.24111714959144592,0.07861171662807465,0.22376903891563416,0.049012064933776855,0.18503017723560333,0.07861171662807465 +15,55103,0.2370336353778839,0.07713475823402405,0.2680792212486267,0.07179194688796997,0.23604382574558258,,,,,,, +16,55149,,,,,,0.06988266855478287,,,,,, +16,55199,,,,,,0.06721431016921997,,,,,, +16,55249,,,,,,0.07900932431221008,,,,,, +16,55299,,,,,,0.08153609186410904,,,,,, +16,55349,,,,,,0.06938346475362778,,,,,, +16,55399,,,,,,0.08369550108909607,,,,,, +16,55449,,,,,,0.08778692781925201,,,,,, +16,55499,,,,,,0.07110235095024109,,,,,, +16,55549,,,,,,0.06330593675374985,,,,,, +16,55599,,,,,,0.0806887149810791,,,,,, +16,55649,,,,,,0.08074066042900085,,,,,, +16,55699,,,,,,0.08177732676267624,,,,,, +16,55749,,,,,,0.06544257700443268,,,,,, +16,55799,,,,,,0.06688784807920456,,,,,, +16,55849,,,,,,0.06014449894428253,,,,,, +16,55899,,,,,,0.07214464247226715,,,,,, +16,55949,,,,,,0.0869772657752037,,,,,, +16,55999,,,,,,0.07647404074668884,,,,,, +16,56049,,,,,,0.073562391102314,,,,,, +16,56099,,,,,,0.07868833839893341,,,,,, +16,56149,,,,,,0.06972867995500565,,,,,, +16,56199,,,,,,0.07805609703063965,,,,,, +16,56249,,,,,,0.06874330341815948,,,,,, +16,56299,,,,,,0.08786055445671082,,,,,, +16,56349,,,,,,0.08457659184932709,,,,,, +16,56399,,,,,,0.074177086353302,,,,,, +16,56449,,,,,,0.07708095759153366,,,,,, +16,56499,,,,,,0.07255847752094269,,,,,, +16,56549,,,,,,0.07453789561986923,,,,,, +16,56599,,,,,,0.0781133621931076,,,,,, +16,56649,,,,,,0.0879548043012619,,,,,, +16,56699,,,,,,0.08301109075546265,,,,,, +16,56749,,,,,,0.06832611560821533,,,,,, +16,56799,,,,,,0.06132737919688225,,,,,, +16,56849,,,,,,0.08359131962060928,,,,,, +16,56899,,,,,,0.07266069948673248,,,,,, +16,56949,,,,,,0.07879525423049927,,,,,, +16,56999,,,,,,0.07566285133361816,,,,,, +16,57049,,,,,,0.08032745867967606,,,,,, +16,57099,,,,,,0.07390828430652618,,,,,, +16,57149,,,,,,0.07542333751916885,,,,,, +16,57199,,,,,,0.07796983420848846,,,,,, +16,57249,,,,,,0.07381519675254822,,,,,, +16,57299,,,,,,0.07445967197418213,,,,,, +16,57349,,,,,,0.06943820416927338,,,,,, +16,57399,,,,,,0.08317725360393524,,,,,, +16,57449,,,,,,0.08376558125019073,,,,,, +16,57499,,,,,,0.08129234611988068,,,,,, +16,57549,,,,,,0.07672251760959625,,,,,, +16,57599,,,,,,0.07404559850692749,,,,,, +16,57649,,,,,,0.06945708394050598,,,,,, +16,57699,,,,,,0.0777023583650589,,,,,, +16,57749,,,,,,0.07086291909217834,,,,,, +16,57799,,,,,,0.07561233639717102,,,,,, +16,57849,,,,,,0.07830888032913208,,,,,, +16,57899,,,,,,0.07401320338249207,,,,,, +16,57949,,,,,,0.07179529964923859,,,,,, +16,57999,,,,,,0.07450976967811584,,,,,, +16,58049,,,,,,0.0751023143529892,,,,,, +16,58099,,,,,,0.07202363014221191,,,,,, +16,58149,,,,,,0.08650640398263931,,,,,, +16,58199,,,,,,0.06541705131530762,,,,,, +16,58249,,,,,,0.08111825585365295,,,,,, +16,58299,,,,,,0.06660651415586472,,,,,, +16,58349,,,,,,0.08209051191806793,,,,,, +16,58399,,,,,,0.07329588383436203,,,,,, +16,58449,,,,,,0.07809342443943024,,,,,, +16,58499,,,,,,0.06993275880813599,,,,,, +16,58547,,,,,,,0.2440072000026703,0.08030061423778534,0.17034076154232025,0.028580963611602783,0.13311032950878143,0.08030061423778534 +16,58547,0.2362820953130722,0.07676760852336884,0.27622637152671814,0.07619494199752808,0.24649332463741302,,,,,,, +17,58549,,,,,,0.07055500149726868,,,,,, +17,58599,,,,,,0.07622980326414108,,,,,, +17,58649,,,,,,0.07284024357795715,,,,,, +17,58699,,,,,,0.07552897185087204,,,,,, +17,58749,,,,,,0.07322274148464203,,,,,, +17,58799,,,,,,0.08186875283718109,,,,,, +17,58849,,,,,,0.06091716140508652,,,,,, +17,58899,,,,,,0.07554221153259277,,,,,, +17,58949,,,,,,0.07786212116479874,,,,,, +17,58999,,,,,,0.07442407310009003,,,,,, +17,59049,,,,,,0.08074842393398285,,,,,, +17,59099,,,,,,0.06587664037942886,,,,,, +17,59149,,,,,,0.08607042580842972,,,,,, +17,59199,,,,,,0.07987458258867264,,,,,, +17,59249,,,,,,0.07735413312911987,,,,,, +17,59299,,,,,,0.07912606745958328,,,,,, +17,59349,,,,,,0.07498366385698318,,,,,, +17,59399,,,,,,0.07406718283891678,,,,,, +17,59449,,,,,,0.08757075667381287,,,,,, +17,59499,,,,,,0.09046171605587006,,,,,, +17,59549,,,,,,0.07096634805202484,,,,,, +17,59599,,,,,,0.08904656767845154,,,,,, +17,59649,,,,,,0.06148029863834381,,,,,, +17,59699,,,,,,0.08128373324871063,,,,,, +17,59749,,,,,,0.08286958187818527,,,,,, +17,59799,,,,,,0.0870315432548523,,,,,, +17,59849,,,,,,0.08248206973075867,,,,,, +17,59899,,,,,,0.07571161538362503,,,,,, +17,59949,,,,,,0.07713831961154938,,,,,, +17,59999,,,,,,0.08156166970729828,,,,,, +17,60049,,,,,,0.07643242180347443,,,,,, +17,60099,,,,,,0.07411913573741913,,,,,, +17,60149,,,,,,0.07298549264669418,,,,,, +17,60199,,,,,,0.07507474720478058,,,,,, +17,60249,,,,,,0.08958667516708374,,,,,, +17,60299,,,,,,0.07701630890369415,,,,,, +17,60349,,,,,,0.08831758797168732,,,,,, +17,60399,,,,,,0.06704466044902802,,,,,, +17,60449,,,,,,0.07463476806879044,,,,,, +17,60499,,,,,,0.07763972133398056,,,,,, +17,60549,,,,,,0.08000560104846954,,,,,, +17,60599,,,,,,0.07362622767686844,,,,,, +17,60649,,,,,,0.0700659304857254,,,,,, +17,60699,,,,,,0.08031345903873444,,,,,, +17,60749,,,,,,0.07977256178855896,,,,,, +17,60799,,,,,,0.09277115762233734,,,,,, +17,60849,,,,,,0.08349373936653137,,,,,, +17,60899,,,,,,0.07905203849077225,,,,,, +17,60949,,,,,,0.08383475989103317,,,,,, +17,60999,,,,,,0.08247849345207214,,,,,, +17,61049,,,,,,0.06768903136253357,,,,,, +17,61099,,,,,,0.07530418038368225,,,,,, +17,61149,,,,,,0.07661381363868713,,,,,, +17,61199,,,,,,0.08033617585897446,,,,,, +17,61249,,,,,,0.08287084102630615,,,,,, +17,61299,,,,,,0.07951007783412933,,,,,, +17,61349,,,,,,0.08312058448791504,,,,,, +17,61399,,,,,,0.07737334072589874,,,,,, +17,61449,,,,,,0.07688601315021515,,,,,, +17,61499,,,,,,0.07402017712593079,,,,,, +17,61549,,,,,,0.06559421122074127,,,,,, +17,61599,,,,,,0.08691895008087158,,,,,, +17,61649,,,,,,0.0818837359547615,,,,,, +17,61699,,,,,,0.06338883936405182,,,,,, +17,61749,,,,,,0.09795856475830078,,,,,, +17,61799,,,,,,0.08318571746349335,,,,,, +17,61849,,,,,,0.08503381907939911,,,,,, +17,61899,,,,,,0.06798595935106277,,,,,, +17,61949,,,,,,0.08368285000324249,,,,,, +17,61991,,,,,,,0.24162401258945465,0.07945811748504639,0.21858109533786774,0.03877288103103638,0.18186724185943604,0.07945811748504639 +17,61991,0.235988050699234,0.07657770067453384,0.2802824079990387,0.0784902572631836,0.2507078945636749,,,,,,, +18,61999,,,,,,0.058538906276226044,,,,,, +18,62049,,,,,,0.0819382593035698,,,,,, +18,62099,,,,,,0.06030067428946495,,,,,, +18,62149,,,,,,0.07263807952404022,,,,,, +18,62199,,,,,,0.07161171734333038,,,,,, +18,62249,,,,,,0.08371274173259735,,,,,, +18,62299,,,,,,0.07447512447834015,,,,,, +18,62349,,,,,,0.07632715255022049,,,,,, +18,62399,,,,,,0.07490271329879761,,,,,, +18,62449,,,,,,0.08593691885471344,,,,,, +18,62499,,,,,,0.08329416811466217,,,,,, +18,62549,,,,,,0.07432417571544647,,,,,, +18,62599,,,,,,0.07236890494823456,,,,,, +18,62649,,,,,,0.07958981394767761,,,,,, +18,62699,,,,,,0.06418944150209427,,,,,, +18,62749,,,,,,0.07035373151302338,,,,,, +18,62799,,,,,,0.09394045919179916,,,,,, +18,62849,,,,,,0.06759117543697357,,,,,, +18,62899,,,,,,0.08087673783302307,,,,,, +18,62949,,,,,,0.08336593210697174,,,,,, +18,62999,,,,,,0.08770505338907242,,,,,, +18,63049,,,,,,0.06641124933958054,,,,,, +18,63099,,,,,,0.07420943677425385,,,,,, +18,63149,,,,,,0.07584763318300247,,,,,, +18,63199,,,,,,0.07291671633720398,,,,,, +18,63249,,,,,,0.08701042830944061,,,,,, +18,63299,,,,,,0.08201484382152557,,,,,, +18,63349,,,,,,0.06625837832689285,,,,,, +18,63399,,,,,,0.07362287491559982,,,,,, +18,63449,,,,,,0.07892473042011261,,,,,, +18,63499,,,,,,0.0711468756198883,,,,,, +18,63549,,,,,,0.061895597726106644,,,,,, +18,63599,,,,,,0.07118818163871765,,,,,, +18,63649,,,,,,0.0722760483622551,,,,,, +18,63699,,,,,,0.05787110701203346,,,,,, +18,63749,,,,,,0.09084785729646683,,,,,, +18,63799,,,,,,0.0749216079711914,,,,,, +18,63849,,,,,,0.07001352310180664,,,,,, +18,63899,,,,,,0.08144894242286682,,,,,, +18,63949,,,,,,0.08327162265777588,,,,,, +18,63999,,,,,,0.08543455600738525,,,,,, +18,64049,,,,,,0.08300433307886124,,,,,, +18,64099,,,,,,0.07281255722045898,,,,,, +18,64149,,,,,,0.07113660871982574,,,,,, +18,64199,,,,,,0.07846790552139282,,,,,, +18,64249,,,,,,0.07444915175437927,,,,,, +18,64299,,,,,,0.07851344347000122,,,,,, +18,64349,,,,,,0.07358793914318085,,,,,, +18,64399,,,,,,0.08118642866611481,,,,,, +18,64449,,,,,,0.08709113299846649,,,,,, +18,64499,,,,,,0.08000294864177704,,,,,, +18,64549,,,,,,0.08181559294462204,,,,,, +18,64599,,,,,,0.0791783481836319,,,,,, +18,64649,,,,,,0.06263116747140884,,,,,, +18,64699,,,,,,0.08858302980661392,,,,,, +18,64749,,,,,,0.06862438470125198,,,,,, +18,64799,,,,,,0.08254603296518326,,,,,, +18,64849,,,,,,0.07806017994880676,,,,,, +18,64899,,,,,,0.07192035019397736,,,,,, +18,64949,,,,,,0.07673820853233337,,,,,, +18,64999,,,,,,0.0682186409831047,,,,,, +18,65049,,,,,,0.09252806007862091,,,,,, +18,65099,,,,,,0.07851096242666245,,,,,, +18,65149,,,,,,0.07730918377637863,,,,,, +18,65199,,,,,,0.09058315306901932,,,,,, +18,65249,,,,,,0.08728495240211487,,,,,, +18,65299,,,,,,0.07284744083881378,,,,,, +18,65349,,,,,,0.06388995796442032,,,,,, +18,65399,,,,,,0.07518912106752396,,,,,, +18,65435,,,,,,,0.24040834605693817,0.07909029722213745,0.22516660392284393,0.04322248697280884,0.18658538162708282,0.07909029722213745 +18,65435,0.23476126790046692,0.07590894401073456,0.29429125785827637,0.08654618263244629,0.26829224824905396,,,,,,, +19,65449,,,,,,0.06452975422143936,,,,,, +19,65499,,,,,,0.08635985851287842,,,,,, +19,65549,,,,,,0.07888936996459961,,,,,, +19,65599,,,,,,0.07553184032440186,,,,,, +19,65649,,,,,,0.06500169634819031,,,,,, +19,65699,,,,,,0.0734882652759552,,,,,, +19,65749,,,,,,0.06608343869447708,,,,,, +19,65799,,,,,,0.07287973910570145,,,,,, +19,65849,,,,,,0.08147181570529938,,,,,, +19,65899,,,,,,0.07278039306402206,,,,,, +19,65949,,,,,,0.0786224752664566,,,,,, +19,65999,,,,,,0.07956042885780334,,,,,, +19,66049,,,,,,0.07709087431430817,,,,,, +19,66099,,,,,,0.08363275974988937,,,,,, +19,66149,,,,,,0.06359179317951202,,,,,, +19,66199,,,,,,0.08568906038999557,,,,,, +19,66249,,,,,,0.07637055218219757,,,,,, +19,66299,,,,,,0.08110726624727249,,,,,, +19,66349,,,,,,0.08233781158924103,,,,,, +19,66399,,,,,,0.08471556007862091,,,,,, +19,66449,,,,,,0.06953254342079163,,,,,, +19,66499,,,,,,0.054833896458148956,,,,,, +19,66549,,,,,,0.0732707530260086,,,,,, +19,66599,,,,,,0.07692751288414001,,,,,, +19,66649,,,,,,0.0849577933549881,,,,,, +19,66699,,,,,,0.07127846777439117,,,,,, +19,66749,,,,,,0.07798151671886444,,,,,, +19,66799,,,,,,0.07398368418216705,,,,,, +19,66849,,,,,,0.06465277820825577,,,,,, +19,66899,,,,,,0.08083681762218475,,,,,, +19,66949,,,,,,0.07504376769065857,,,,,, +19,66999,,,,,,0.07631175220012665,,,,,, +19,67049,,,,,,0.07334139943122864,,,,,, +19,67099,,,,,,0.07164549827575684,,,,,, +19,67149,,,,,,0.07987343519926071,,,,,, +19,67199,,,,,,0.07343066483736038,,,,,, +19,67249,,,,,,0.0750817358493805,,,,,, +19,67299,,,,,,0.06523341685533524,,,,,, +19,67349,,,,,,0.07419836521148682,,,,,, +19,67399,,,,,,0.0736650750041008,,,,,, +19,67449,,,,,,0.08354535698890686,,,,,, +19,67499,,,,,,0.08087168633937836,,,,,, +19,67549,,,,,,0.08222803473472595,,,,,, +19,67599,,,,,,0.08727505803108215,,,,,, +19,67649,,,,,,0.07434764504432678,,,,,, +19,67699,,,,,,0.07470880448818207,,,,,, +19,67749,,,,,,0.07884899526834488,,,,,, +19,67799,,,,,,0.08489662408828735,,,,,, +19,67849,,,,,,0.07538151741027832,,,,,, +19,67899,,,,,,0.0872962474822998,,,,,, +19,67949,,,,,,0.06745144724845886,,,,,, +19,67999,,,,,,0.0714356005191803,,,,,, +19,68049,,,,,,0.08792348206043243,,,,,, +19,68099,,,,,,0.08469155430793762,,,,,, +19,68149,,,,,,0.07057829201221466,,,,,, +19,68199,,,,,,0.06713268905878067,,,,,, +19,68249,,,,,,0.07721847295761108,,,,,, +19,68299,,,,,,0.07022766023874283,,,,,, +19,68349,,,,,,0.06921951472759247,,,,,, +19,68399,,,,,,0.07370857894420624,,,,,, +19,68449,,,,,,0.07210078835487366,,,,,, +19,68499,,,,,,0.0765596330165863,,,,,, +19,68549,,,,,,0.08792988955974579,,,,,, +19,68599,,,,,,0.08382436633110046,,,,,, +19,68649,,,,,,0.08461061120033264,,,,,, +19,68699,,,,,,0.07044544816017151,,,,,, +19,68749,,,,,,0.06811033189296722,,,,,, +19,68799,,,,,,0.07463628053665161,,,,,, +19,68849,,,,,,0.07859228551387787,,,,,, +19,68879,,,,,,,0.24020220339298248,0.07897306978702545,0.2196662873029709,0.04464066028594971,0.17937007546424866,0.07897306978702545 +19,68879,0.23371174931526184,0.07534459233283997,0.3055731952190399,0.09332692623138428,0.281963586807251,,,,,,, +20,68899,,,,,,0.07276054471731186,,,,,, +20,68949,,,,,,0.08016017079353333,,,,,, +20,68999,,,,,,0.08379572629928589,,,,,, +20,69049,,,,,,0.0827474296092987,,,,,, +20,69099,,,,,,0.07909330725669861,,,,,, +20,69149,,,,,,0.06535279750823975,,,,,, +20,69199,,,,,,0.07651826739311218,,,,,, +20,69249,,,,,,0.08852352201938629,,,,,, +20,69299,,,,,,0.0921538919210434,,,,,, +20,69349,,,,,,0.08056184649467468,,,,,, +20,69399,,,,,,0.08036810159683228,,,,,, +20,69449,,,,,,0.09737548977136612,,,,,, +20,69499,,,,,,0.08470365405082703,,,,,, +20,69549,,,,,,0.07189960777759552,,,,,, +20,69599,,,,,,0.06658016890287399,,,,,, +20,69649,,,,,,0.06982893496751785,,,,,, +20,69699,,,,,,0.06166837736964226,,,,,, +20,69749,,,,,,0.07634058594703674,,,,,, +20,69799,,,,,,0.07572811841964722,,,,,, +20,69849,,,,,,0.08003829419612885,,,,,, +20,69899,,,,,,0.08019004762172699,,,,,, +20,69949,,,,,,0.07754330337047577,,,,,, +20,69999,,,,,,0.07111215591430664,,,,,, +20,70049,,,,,,0.07021714746952057,,,,,, +20,70099,,,,,,0.05837142467498779,,,,,, +20,70149,,,,,,0.07921373844146729,,,,,, +20,70199,,,,,,0.07297597825527191,,,,,, +20,70249,,,,,,0.07559389621019363,,,,,, +20,70299,,,,,,0.073316290974617,,,,,, +20,70349,,,,,,0.07132439315319061,,,,,, +20,70399,,,,,,0.07170964777469635,,,,,, +20,70449,,,,,,0.06514374911785126,,,,,, +20,70499,,,,,,0.07799852639436722,,,,,, +20,70549,,,,,,0.06775608658790588,,,,,, +20,70599,,,,,,0.06039135158061981,,,,,, +20,70649,,,,,,0.0770547017455101,,,,,, +20,70699,,,,,,0.07486534118652344,,,,,, +20,70749,,,,,,0.07843329757452011,,,,,, +20,70799,,,,,,0.06674090027809143,,,,,, +20,70849,,,,,,0.06604911386966705,,,,,, +20,70899,,,,,,0.07923819124698639,,,,,, +20,70949,,,,,,0.06975321471691132,,,,,, +20,70999,,,,,,0.08480684459209442,,,,,, +20,71049,,,,,,0.0723036602139473,,,,,, +20,71099,,,,,,0.08108397573232651,,,,,, +20,71149,,,,,,0.07957722246646881,,,,,, +20,71199,,,,,,0.07003490626811981,,,,,, +20,71249,,,,,,0.0690699890255928,,,,,, +20,71299,,,,,,0.07560267299413681,,,,,, +20,71349,,,,,,0.07361963391304016,,,,,, +20,71399,,,,,,0.0710483193397522,,,,,, +20,71449,,,,,,0.052278175950050354,,,,,, +20,71499,,,,,,0.07018591463565826,,,,,, +20,71549,,,,,,0.08129484951496124,,,,,, +20,71599,,,,,,0.07607638835906982,,,,,, +20,71649,,,,,,0.07224252074956894,,,,,, +20,71699,,,,,,0.08808471262454987,,,,,, +20,71749,,,,,,0.08844264596700668,,,,,, +20,71799,,,,,,0.08853460848331451,,,,,, +20,71849,,,,,,0.08051954209804535,,,,,, +20,71899,,,,,,0.08064602315425873,,,,,, +20,71949,,,,,,0.07008664309978485,,,,,, +20,71999,,,,,,0.08598576486110687,,,,,, +20,72049,,,,,,0.06991323828697205,,,,,, +20,72099,,,,,,0.06949354708194733,,,,,, +20,72149,,,,,,0.07984885573387146,,,,,, +20,72199,,,,,,0.08092384040355682,,,,,, +20,72249,,,,,,0.07413841784000397,,,,,, +20,72299,,,,,,0.07527489215135574,,,,,, +20,72323,,,,,,,0.24152466654777527,0.07964377105236053,0.22520560026168823,0.036527037620544434,0.18346692621707916,0.07964377105236053 +20,72323,0.23277628421783447,0.07486868649721146,0.31480249762535095,0.09906226396560669,0.29020461440086365,,,,,,, +21,72349,,,,,,0.07950219511985779,,,,,, +21,72399,,,,,,0.08301743865013123,,,,,, +21,72449,,,,,,0.07363803684711456,,,,,, +21,72499,,,,,,0.07054382562637329,,,,,, +21,72549,,,,,,0.0727897435426712,,,,,, +21,72599,,,,,,0.07042720913887024,,,,,, +21,72649,,,,,,0.06924181431531906,,,,,, +21,72699,,,,,,0.07700154930353165,,,,,, +21,72749,,,,,,0.07721304893493652,,,,,, +21,72799,,,,,,0.08373625576496124,,,,,, +21,72849,,,,,,0.07654249668121338,,,,,, +21,72899,,,,,,0.07632555067539215,,,,,, +21,72949,,,,,,0.07829613983631134,,,,,, +21,72999,,,,,,0.08385956287384033,,,,,, +21,73049,,,,,,0.07730754464864731,,,,,, +21,73099,,,,,,0.07439570128917694,,,,,, +21,73149,,,,,,0.06846646219491959,,,,,, +21,73199,,,,,,0.08054309338331223,,,,,, +21,73249,,,,,,0.07103018462657928,,,,,, +21,73299,,,,,,0.07824839651584625,,,,,, +21,73349,,,,,,0.0682976096868515,,,,,, +21,73399,,,,,,0.06528429687023163,,,,,, +21,73449,,,,,,0.07248331606388092,,,,,, +21,73499,,,,,,0.08468645811080933,,,,,, +21,73549,,,,,,0.08155066519975662,,,,,, +21,73599,,,,,,0.07289203256368637,,,,,, +21,73649,,,,,,0.07052648067474365,,,,,, +21,73699,,,,,,0.08575853705406189,,,,,, +21,73749,,,,,,0.0785038098692894,,,,,, +21,73799,,,,,,0.07597258687019348,,,,,, +21,73849,,,,,,0.06982412934303284,,,,,, +21,73899,,,,,,0.07459491491317749,,,,,, +21,73949,,,,,,0.08235867321491241,,,,,, +21,73999,,,,,,0.08016939461231232,,,,,, +21,74049,,,,,,0.0767410397529602,,,,,, +21,74099,,,,,,0.07029808312654495,,,,,, +21,74149,,,,,,0.08903653174638748,,,,,, +21,74199,,,,,,0.08091623336076736,,,,,, +21,74249,,,,,,0.07661329209804535,,,,,, +21,74299,,,,,,0.07791951298713684,,,,,, +21,74349,,,,,,0.07182125747203827,,,,,, +21,74399,,,,,,0.07923512160778046,,,,,, +21,74449,,,,,,0.07111435383558273,,,,,, +21,74499,,,,,,0.07378599047660828,,,,,, +21,74549,,,,,,0.06413551419973373,,,,,, +21,74599,,,,,,0.07525705546140671,,,,,, +21,74649,,,,,,0.07955363392829895,,,,,, +21,74699,,,,,,0.0729391947388649,,,,,, +21,74749,,,,,,0.07731065899133682,,,,,, +21,74799,,,,,,0.05988069623708725,,,,,, +21,74849,,,,,,0.06194747984409332,,,,,, +21,74899,,,,,,0.09057886898517609,,,,,, +21,74949,,,,,,0.07176235318183899,,,,,, +21,74999,,,,,,0.06774089485406876,,,,,, +21,75049,,,,,,0.06541512906551361,,,,,, +21,75099,,,,,,0.08187372237443924,,,,,, +21,75149,,,,,,0.08381886780261993,,,,,, +21,75199,,,,,,0.07316136360168457,,,,,, +21,75249,,,,,,0.07644043862819672,,,,,, +21,75299,,,,,,0.07034391909837723,,,,,, +21,75349,,,,,,0.06428521871566772,,,,,, +21,75399,,,,,,0.08968284726142883,,,,,, +21,75449,,,,,,0.07031187415122986,,,,,, +21,75499,,,,,,0.07552531361579895,,,,,, +21,75549,,,,,,0.06605200469493866,,,,,, +21,75599,,,,,,0.08403286337852478,,,,,, +21,75649,,,,,,0.07808290421962738,,,,,, +21,75699,,,,,,0.06454577296972275,,,,,, +21,75749,,,,,,0.07541730999946594,,,,,, +21,75767,,,,,,,0.24022525548934937,0.07900456339120865,0.21860548853874207,0.04425966739654541,0.1860692948102951,0.07900456339120865 +21,75767,0.23248834908008575,0.0747104287147522,0.3178548514842987,0.10096192359924316,0.2943545877933502,,,,,,, +22,75799,,,,,,0.07349810749292374,,,,,, +22,75849,,,,,,0.07005362212657928,,,,,, +22,75899,,,,,,0.07516370713710785,,,,,, +22,75949,,,,,,0.08849134296178818,,,,,, +22,75999,,,,,,0.07876177132129669,,,,,, +22,76049,,,,,,0.07657509297132492,,,,,, +22,76099,,,,,,0.07055504620075226,,,,,, +22,76149,,,,,,0.06776250898838043,,,,,, +22,76199,,,,,,0.07262319326400757,,,,,, +22,76249,,,,,,0.07685159891843796,,,,,, +22,76299,,,,,,0.07013396173715591,,,,,, +22,76349,,,,,,0.07721035927534103,,,,,, +22,76399,,,,,,0.07834652811288834,,,,,, +22,76449,,,,,,0.08391396701335907,,,,,, +22,76499,,,,,,0.08103711158037186,,,,,, +22,76549,,,,,,0.08690434694290161,,,,,, +22,76599,,,,,,0.0669938176870346,,,,,, +22,76649,,,,,,0.06181071698665619,,,,,, +22,76699,,,,,,0.07966877520084381,,,,,, +22,76749,,,,,,0.08319590240716934,,,,,, +22,76799,,,,,,0.07584310322999954,,,,,, +22,76849,,,,,,0.0701402872800827,,,,,, +22,76899,,,,,,0.07334326952695847,,,,,, +22,76949,,,,,,0.08410057425498962,,,,,, +22,76999,,,,,,0.07602448761463165,,,,,, +22,77049,,,,,,0.07193877547979355,,,,,, +22,77099,,,,,,0.07729147374629974,,,,,, +22,77149,,,,,,0.07410009205341339,,,,,, +22,77199,,,,,,0.06482252478599548,,,,,, +22,77249,,,,,,0.06624496728181839,,,,,, +22,77299,,,,,,0.09379787743091583,,,,,, +22,77349,,,,,,0.06936158984899521,,,,,, +22,77399,,,,,,0.07136838138103485,,,,,, +22,77449,,,,,,0.0758901908993721,,,,,, +22,77499,,,,,,0.0907907783985138,,,,,, +22,77549,,,,,,0.07510179281234741,,,,,, +22,77599,,,,,,0.0771699845790863,,,,,, +22,77649,,,,,,0.06312757730484009,,,,,, +22,77699,,,,,,0.07772139459848404,,,,,, +22,77749,,,,,,0.08265262842178345,,,,,, +22,77799,,,,,,0.06514842808246613,,,,,, +22,77849,,,,,,0.06975683569908142,,,,,, +22,77899,,,,,,0.07516977190971375,,,,,, +22,77949,,,,,,0.06451605260372162,,,,,, +22,77999,,,,,,0.07947316765785217,,,,,, +22,78049,,,,,,0.06693471968173981,,,,,, +22,78099,,,,,,0.058510713279247284,,,,,, +22,78149,,,,,,0.07936932146549225,,,,,, +22,78199,,,,,,0.06597448140382767,,,,,, +22,78249,,,,,,0.08086185902357101,,,,,, +22,78299,,,,,,0.07089464366436005,,,,,, +22,78349,,,,,,0.06557056307792664,,,,,, +22,78399,,,,,,0.0755782350897789,,,,,, +22,78449,,,,,,0.0751204565167427,,,,,, +22,78499,,,,,,0.07356464862823486,,,,,, +22,78549,,,,,,0.07057440280914307,,,,,, +22,78599,,,,,,0.07018571346998215,,,,,, +22,78649,,,,,,0.07494866847991943,,,,,, +22,78699,,,,,,0.07544173300266266,,,,,, +22,78749,,,,,,0.0774533599615097,,,,,, +22,78799,,,,,,0.07691740244626999,,,,,, +22,78849,,,,,,0.07185192406177521,,,,,, +22,78899,,,,,,0.07736578583717346,,,,,, +22,78949,,,,,,0.06997567415237427,,,,,, +22,78999,,,,,,0.06854738295078278,,,,,, +22,79049,,,,,,0.06796121597290039,,,,,, +22,79099,,,,,,0.07507162541151047,,,,,, +22,79149,,,,,,0.07083375751972198,,,,,, +22,79199,,,,,,0.0739450603723526,,,,,, +22,79211,,,,,,,0.2407417595386505,0.07879573851823807,0.22397080063819885,0.04678589105606079,0.1817619949579239,0.07879573851823807 +22,79211,0.23061199486255646,0.07376988977193832,0.33511507511138916,0.11228495836257935,0.3098796606063843,,,,,,, +23,79249,,,,,,0.06618337333202362,,,,,, +23,79299,,,,,,0.0701143890619278,,,,,, +23,79349,,,,,,0.08896869421005249,,,,,, +23,79399,,,,,,0.069564588367939,,,,,, +23,79449,,,,,,0.06274902820587158,,,,,, +23,79499,,,,,,0.08233745396137238,,,,,, +23,79549,,,,,,0.07409126311540604,,,,,, +23,79599,,,,,,0.070345439016819,,,,,, +23,79649,,,,,,0.07698068767786026,,,,,, +23,79699,,,,,,0.0711914524435997,,,,,, +23,79749,,,,,,0.08377444744110107,,,,,, +23,79799,,,,,,0.06575073301792145,,,,,, +23,79849,,,,,,0.06947395205497742,,,,,, +23,79899,,,,,,0.06976240873336792,,,,,, +23,79949,,,,,,0.06725405156612396,,,,,, +23,79999,,,,,,0.06725265085697174,,,,,, +23,80049,,,,,,0.06387392431497574,,,,,, +23,80099,,,,,,0.07681520283222198,,,,,, +23,80149,,,,,,0.08492287248373032,,,,,, +23,80199,,,,,,0.07833273708820343,,,,,, +23,80249,,,,,,0.06520537286996841,,,,,, +23,80299,,,,,,0.06866725534200668,,,,,, +23,80349,,,,,,0.08216390013694763,,,,,, +23,80399,,,,,,0.07205706089735031,,,,,, +23,80449,,,,,,0.06411275267601013,,,,,, +23,80499,,,,,,0.06921304762363434,,,,,, +23,80549,,,,,,0.07141934335231781,,,,,, +23,80599,,,,,,0.08000342547893524,,,,,, +23,80649,,,,,,0.06230124086141586,,,,,, +23,80699,,,,,,0.07857898622751236,,,,,, +23,80749,,,,,,0.07324884831905365,,,,,, +23,80799,,,,,,0.06738453358411789,,,,,, +23,80849,,,,,,0.0893947184085846,,,,,, +23,80899,,,,,,0.08982298523187637,,,,,, +23,80949,,,,,,0.07452642172574997,,,,,, +23,80999,,,,,,0.08516159653663635,,,,,, +23,81049,,,,,,0.07361970096826553,,,,,, +23,81099,,,,,,0.0734415203332901,,,,,, +23,81149,,,,,,0.0837291032075882,,,,,, +23,81199,,,,,,0.07388361543416977,,,,,, +23,81249,,,,,,0.06585545837879181,,,,,, +23,81299,,,,,,0.0736827403306961,,,,,, +23,81349,,,,,,0.06526930630207062,,,,,, +23,81399,,,,,,0.07726366817951202,,,,,, +23,81449,,,,,,0.07361391186714172,,,,,, +23,81499,,,,,,0.06760773062705994,,,,,, +23,81549,,,,,,0.07465489208698273,,,,,, +23,81599,,,,,,0.0735543817281723,,,,,, +23,81649,,,,,,0.07883843779563904,,,,,, +23,81699,,,,,,0.07103534042835236,,,,,, +23,81749,,,,,,0.0737762600183487,,,,,, +23,81799,,,,,,0.08076696842908859,,,,,, +23,81849,,,,,,0.06788890063762665,,,,,, +23,81899,,,,,,0.08186329901218414,,,,,, +23,81949,,,,,,0.0921003669500351,,,,,, +23,81999,,,,,,0.0632939338684082,,,,,, +23,82049,,,,,,0.07281556725502014,,,,,, +23,82099,,,,,,0.08773370087146759,,,,,, +23,82149,,,,,,0.07926975935697556,,,,,, +23,82199,,,,,,0.06795495748519897,,,,,, +23,82249,,,,,,0.06448689103126526,,,,,, +23,82299,,,,,,0.0758616030216217,,,,,, +23,82349,,,,,,0.07609320431947708,,,,,, +23,82399,,,,,,0.06555239856243134,,,,,, +23,82449,,,,,,0.06683185696601868,,,,,, +23,82499,,,,,,0.059026047587394714,,,,,, +23,82549,,,,,,0.06315895915031433,,,,,, +23,82599,,,,,,0.06962935626506805,,,,,, +23,82649,,,,,,0.06039907783269882,,,,,, +23,82655,,,,,,,0.2402244508266449,0.0786486491560936,0.2302948236465454,0.04856526851654053,0.1963902711868286,0.0786486491560936 +23,82655,0.2300417721271515,0.07344195991754532,0.34093835949897766,0.11623358726501465,0.31523147225379944,,,,,,, +24,82699,,,,,,0.06877118349075317,,,,,, +24,82749,,,,,,0.06158081814646721,,,,,, +24,82799,,,,,,0.06474916636943817,,,,,, +24,82849,,,,,,0.07776069641113281,,,,,, +24,82899,,,,,,0.07056096196174622,,,,,, +24,82949,,,,,,0.05785210803151131,,,,,, +24,82999,,,,,,0.06463463604450226,,,,,, +24,83049,,,,,,0.07400789856910706,,,,,, +24,83099,,,,,,0.06021185219287872,,,,,, +24,83149,,,,,,0.07654893398284912,,,,,, +24,83199,,,,,,0.08043313026428223,,,,,, +24,83249,,,,,,0.06948532164096832,,,,,, +24,83299,,,,,,0.07719189673662186,,,,,, +24,83349,,,,,,0.06685379147529602,,,,,, +24,83399,,,,,,0.07714690268039703,,,,,, +24,83449,,,,,,0.0856766626238823,,,,,, +24,83499,,,,,,0.0726369097828865,,,,,, +24,83549,,,,,,0.08417072892189026,,,,,, +24,83599,,,,,,0.08085663616657257,,,,,, +24,83649,,,,,,0.07905632257461548,,,,,, +24,83699,,,,,,0.08096255362033844,,,,,, +24,83749,,,,,,0.0685771182179451,,,,,, +24,83799,,,,,,0.08215907216072083,,,,,, +24,83849,,,,,,0.07532206922769547,,,,,, +24,83899,,,,,,0.0777537077665329,,,,,, +24,83949,,,,,,0.06626065075397491,,,,,, +24,83999,,,,,,0.07537350058555603,,,,,, +24,84049,,,,,,0.055643144994974136,,,,,, +24,84099,,,,,,0.07007118314504623,,,,,, +24,84149,,,,,,0.06422723829746246,,,,,, +24,84199,,,,,,0.07827892899513245,,,,,, +24,84249,,,,,,0.06858201324939728,,,,,, +24,84299,,,,,,0.08655482530593872,,,,,, +24,84349,,,,,,0.06950496882200241,,,,,, +24,84399,,,,,,0.06553517282009125,,,,,, +24,84449,,,,,,0.07289797067642212,,,,,, +24,84499,,,,,,0.07104334235191345,,,,,, +24,84549,,,,,,0.06873074173927307,,,,,, +24,84599,,,,,,0.0765218585729599,,,,,, +24,84649,,,,,,0.07232938706874847,,,,,, +24,84699,,,,,,0.07317687571048737,,,,,, +24,84749,,,,,,0.06369726359844208,,,,,, +24,84799,,,,,,0.07371149212121964,,,,,, +24,84849,,,,,,0.0727691724896431,,,,,, +24,84899,,,,,,0.07451777160167694,,,,,, +24,84949,,,,,,0.0683293268084526,,,,,, +24,84999,,,,,,0.06377367675304413,,,,,, +24,85049,,,,,,0.07236039638519287,,,,,, +24,85099,,,,,,0.06957006454467773,,,,,, +24,85149,,,,,,0.07835845649242401,,,,,, +24,85199,,,,,,0.07651235163211823,,,,,, +24,85249,,,,,,0.07182209193706512,,,,,, +24,85299,,,,,,0.06691840291023254,,,,,, +24,85349,,,,,,0.08120758831501007,,,,,, +24,85399,,,,,,0.08260893821716309,,,,,, +24,85449,,,,,,0.07342572510242462,,,,,, +24,85499,,,,,,0.060485780239105225,,,,,, +24,85549,,,,,,0.06054278463125229,,,,,, +24,85599,,,,,,0.08405344188213348,,,,,, +24,85649,,,,,,0.08157907426357269,,,,,, +24,85699,,,,,,0.07296650856733322,,,,,, +24,85749,,,,,,0.07732976973056793,,,,,, +24,85799,,,,,,0.06844152510166168,,,,,, +24,85849,,,,,,0.07005798816680908,,,,,, +24,85899,,,,,,0.07103486359119415,,,,,, +24,85949,,,,,,0.07328124344348907,,,,,, +24,85999,,,,,,0.07117316871881485,,,,,, +24,86049,,,,,,0.08171907067298889,,,,,, +24,86099,,,,,,0.055458325892686844,,,,,, +24,86099,,,,,,,0.23983508348464966,0.07855997234582901,0.2350834161043167,0.04963797330856323,0.20067939162254333,0.07855997234582901 +24,86099,0.2297353893518448,0.07330602407455444,0.3433316648006439,0.11786556243896484,0.31873390078544617,,,,,,, +25,86149,,,,,,0.06961913406848907,,,,,, +25,86199,,,,,,0.06670667976140976,,,,,, +25,86249,,,,,,0.07881428301334381,,,,,, +25,86299,,,,,,0.06513625383377075,,,,,, +25,86349,,,,,,0.06408919394016266,,,,,, +25,86399,,,,,,0.06652602553367615,,,,,, +25,86449,,,,,,0.07871191203594208,,,,,, +25,86499,,,,,,0.07087141275405884,,,,,, +25,86549,,,,,,0.08202813565731049,,,,,, +25,86599,,,,,,0.06871584057807922,,,,,, +25,86649,,,,,,0.08580736815929413,,,,,, +25,86699,,,,,,0.07695862650871277,,,,,, +25,86749,,,,,,0.08175189793109894,,,,,, +25,86799,,,,,,0.07835891097784042,,,,,, +25,86849,,,,,,0.08384910225868225,,,,,, +25,86899,,,,,,0.07583144307136536,,,,,, +25,86949,,,,,,0.07362867146730423,,,,,, +25,86999,,,,,,0.08052915334701538,,,,,, +25,87049,,,,,,0.06572078168392181,,,,,, +25,87099,,,,,,0.06429605931043625,,,,,, +25,87149,,,,,,0.07279863953590393,,,,,, +25,87199,,,,,,0.08494096249341965,,,,,, +25,87249,,,,,,0.08354300260543823,,,,,, +25,87299,,,,,,0.06924940645694733,,,,,, +25,87349,,,,,,0.07176860421895981,,,,,, +25,87399,,,,,,0.07452800869941711,,,,,, +25,87449,,,,,,0.08158832043409348,,,,,, +25,87499,,,,,,0.07052347809076309,,,,,, +25,87549,,,,,,0.06989991664886475,,,,,, +25,87599,,,,,,0.07287417352199554,,,,,, +25,87649,,,,,,0.06273376196622849,,,,,, +25,87699,,,,,,0.06690123677253723,,,,,, +25,87749,,,,,,0.07706353068351746,,,,,, +25,87799,,,,,,0.06891678273677826,,,,,, +25,87849,,,,,,0.06973347067832947,,,,,, +25,87899,,,,,,0.07139968872070312,,,,,, +25,87949,,,,,,0.06869912147521973,,,,,, +25,87999,,,,,,0.07723745703697205,,,,,, +25,88049,,,,,,0.0707000344991684,,,,,, +25,88099,,,,,,0.08426044881343842,,,,,, +25,88149,,,,,,0.07133765518665314,,,,,, +25,88199,,,,,,0.07177358865737915,,,,,, +25,88249,,,,,,0.07521239668130875,,,,,, +25,88299,,,,,,0.07310013473033905,,,,,, +25,88349,,,,,,0.07283855229616165,,,,,, +25,88399,,,,,,0.08426639437675476,,,,,, +25,88449,,,,,,0.0672789067029953,,,,,, +25,88499,,,,,,0.07077784836292267,,,,,, +25,88549,,,,,,0.08075518906116486,,,,,, +25,88599,,,,,,0.06682218611240387,,,,,, +25,88649,,,,,,0.0660289004445076,,,,,, +25,88699,,,,,,0.06792548298835754,,,,,, +25,88749,,,,,,0.06695466488599777,,,,,, +25,88799,,,,,,0.0728425532579422,,,,,, +25,88849,,,,,,0.06727178394794464,,,,,, +25,88899,,,,,,0.07433676719665527,,,,,, +25,88949,,,,,,0.06872482597827911,,,,,, +25,88999,,,,,,0.06540767103433609,,,,,, +25,89049,,,,,,0.06460058689117432,,,,,, +25,89099,,,,,,0.07641810178756714,,,,,, +25,89149,,,,,,0.06907786428928375,,,,,, +25,89199,,,,,,0.07734011858701706,,,,,, +25,89249,,,,,,0.08251357078552246,,,,,, +25,89299,,,,,,0.07015526294708252,,,,,, +25,89349,,,,,,0.06377919018268585,,,,,, +25,89399,,,,,,0.07687513530254364,,,,,, +25,89449,,,,,,0.07781630754470825,,,,,, +25,89499,,,,,,0.07801558077335358,,,,,, +25,89543,,,,,,,0.24014528095722198,0.07840172201395035,0.2339245229959488,0.051552414894104004,0.19954825937747955,0.07840172201395035 +25,89543,0.22923873364925385,0.07305961102247238,0.3476215600967407,0.12082165479660034,0.32200032472610474,,,,,,, +26,89549,,,,,,0.06516680121421814,,,,,, +26,89599,,,,,,0.06738205254077911,,,,,, +26,89649,,,,,,0.06390701234340668,,,,,, +26,89699,,,,,,0.0637168437242508,,,,,, +26,89749,,,,,,0.07389311492443085,,,,,, +26,89799,,,,,,0.0708184689283371,,,,,, +26,89849,,,,,,0.07560412585735321,,,,,, +26,89899,,,,,,0.06334810703992844,,,,,, +26,89949,,,,,,0.0677003264427185,,,,,, +26,89999,,,,,,0.0729859247803688,,,,,, +26,90049,,,,,,0.06587587296962738,,,,,, +26,90099,,,,,,0.06289412826299667,,,,,, +26,90149,,,,,,0.07773755490779877,,,,,, +26,90199,,,,,,0.07835561037063599,,,,,, +26,90249,,,,,,0.08298469334840775,,,,,, +26,90299,,,,,,0.08346714824438095,,,,,, +26,90349,,,,,,0.07402288913726807,,,,,, +26,90399,,,,,,0.07181557267904282,,,,,, +26,90449,,,,,,0.06601110100746155,,,,,, +26,90499,,,,,,0.07395970821380615,,,,,, +26,90549,,,,,,0.07196269929409027,,,,,, +26,90599,,,,,,0.08571252226829529,,,,,, +26,90649,,,,,,0.08608612418174744,,,,,, +26,90699,,,,,,0.07259537279605865,,,,,, +26,90749,,,,,,0.07191673666238785,,,,,, +26,90799,,,,,,0.07030768692493439,,,,,, +26,90849,,,,,,0.06926240026950836,,,,,, +26,90899,,,,,,0.08217622339725494,,,,,, +26,90949,,,,,,0.07766922563314438,,,,,, +26,90999,,,,,,0.07519526779651642,,,,,, +26,91049,,,,,,0.07961571961641312,,,,,, +26,91099,,,,,,0.07028866559267044,,,,,, +26,91149,,,,,,0.08311907947063446,,,,,, +26,91199,,,,,,0.07325398176908493,,,,,, +26,91249,,,,,,0.06528414040803909,,,,,, +26,91299,,,,,,0.0677536204457283,,,,,, +26,91349,,,,,,0.058253057301044464,,,,,, +26,91399,,,,,,0.0754476934671402,,,,,, +26,91449,,,,,,0.05300566554069519,,,,,, +26,91499,,,,,,0.07163038849830627,,,,,, +26,91549,,,,,,0.06620361655950546,,,,,, +26,91599,,,,,,0.06885439157485962,,,,,, +26,91649,,,,,,0.0835101455450058,,,,,, +26,91699,,,,,,0.06550969183444977,,,,,, +26,91749,,,,,,0.08160685747861862,,,,,, +26,91799,,,,,,0.08668231964111328,,,,,, +26,91849,,,,,,0.07352927327156067,,,,,, +26,91899,,,,,,0.06478965282440186,,,,,, +26,91949,,,,,,0.08249835669994354,,,,,, +26,91999,,,,,,0.08179353177547455,,,,,, +26,92049,,,,,,0.0725911483168602,,,,,, +26,92099,,,,,,0.08986219763755798,,,,,, +26,92149,,,,,,0.07438187301158905,,,,,, +26,92199,,,,,,0.08152404427528381,,,,,, +26,92249,,,,,,0.07889431715011597,,,,,, +26,92299,,,,,,0.08003372699022293,,,,,, +26,92349,,,,,,0.07374715805053711,,,,,, +26,92399,,,,,,0.071229949593544,,,,,, +26,92449,,,,,,0.07198113203048706,,,,,, +26,92499,,,,,,0.07105185091495514,,,,,, +26,92549,,,,,,0.08195468038320541,,,,,, +26,92599,,,,,,0.07231643795967102,,,,,, +26,92649,,,,,,0.07148158550262451,,,,,, +26,92699,,,,,,0.07704450935125351,,,,,, +26,92749,,,,,,0.06490572541952133,,,,,, +26,92799,,,,,,0.07251965999603271,,,,,, +26,92849,,,,,,0.07694321870803833,,,,,, +26,92899,,,,,,0.0774737298488617,,,,,, +26,92949,,,,,,0.07534634321928024,,,,,, +26,92987,,,,,,,0.23977620899677277,0.07804197818040848,0.23644284904003143,0.0559043288230896,0.19990766048431396,0.07804197818040848 +26,92987,0.22913657128810883,0.07303476333618164,0.34807541966438293,0.1211167573928833,0.32342973351478577,,,,,,, +27,92999,,,,,,0.0841892659664154,,,,,, +27,93049,,,,,,0.08055025339126587,,,,,, +27,93099,,,,,,0.06288886070251465,,,,,, +27,93149,,,,,,0.08282418549060822,,,,,, +27,93199,,,,,,0.07093343138694763,,,,,, +27,93249,,,,,,0.07453357428312302,,,,,, +27,93299,,,,,,0.08110695332288742,,,,,, +27,93349,,,,,,0.0713915154337883,,,,,, +27,93399,,,,,,0.07209089398384094,,,,,, +27,93449,,,,,,0.08238066732883453,,,,,, +27,93499,,,,,,0.07598699629306793,,,,,, +27,93549,,,,,,0.0716484934091568,,,,,, +27,93599,,,,,,0.0674235075712204,,,,,, +27,93649,,,,,,0.08253023028373718,,,,,, +27,93699,,,,,,0.07232166826725006,,,,,, +27,93749,,,,,,0.07387906312942505,,,,,, +27,93799,,,,,,0.07248175144195557,,,,,, +27,93849,,,,,,0.06843113899230957,,,,,, +27,93899,,,,,,0.059703946113586426,,,,,, +27,93949,,,,,,0.07104997336864471,,,,,, +27,93999,,,,,,0.07326126843690872,,,,,, +27,94049,,,,,,0.06413018703460693,,,,,, +27,94099,,,,,,0.08513790369033813,,,,,, +27,94149,,,,,,0.08538030087947845,,,,,, +27,94199,,,,,,0.07348708808422089,,,,,, +27,94249,,,,,,0.07634426653385162,,,,,, +27,94299,,,,,,0.07801498472690582,,,,,, +27,94349,,,,,,0.07742790877819061,,,,,, +27,94399,,,,,,0.06542055308818817,,,,,, +27,94449,,,,,,0.07014584541320801,,,,,, +27,94499,,,,,,0.06634170562028885,,,,,, +27,94549,,,,,,0.06970018148422241,,,,,, +27,94599,,,,,,0.06523177772760391,,,,,, +27,94649,,,,,,0.07842527329921722,,,,,, +27,94699,,,,,,0.06933781504631042,,,,,, +27,94749,,,,,,0.06392165273427963,,,,,, +27,94799,,,,,,0.07215256243944168,,,,,, +27,94849,,,,,,0.057760678231716156,,,,,, +27,94899,,,,,,0.06924335658550262,,,,,, +27,94949,,,,,,0.06582988798618317,,,,,, +27,94999,,,,,,0.06369081139564514,,,,,, +27,95049,,,,,,0.07676942646503448,,,,,, +27,95099,,,,,,0.0679076761007309,,,,,, +27,95149,,,,,,0.08160834014415741,,,,,, +27,95199,,,,,,0.07958126068115234,,,,,, +27,95249,,,,,,0.06815753877162933,,,,,, +27,95299,,,,,,0.06518661975860596,,,,,, +27,95349,,,,,,0.06845668703317642,,,,,, +27,95399,,,,,,0.08280235528945923,,,,,, +27,95449,,,,,,0.07449564337730408,,,,,, +27,95499,,,,,,0.07301578670740128,,,,,, +27,95549,,,,,,0.07468292862176895,,,,,, +27,95599,,,,,,0.07260259985923767,,,,,, +27,95649,,,,,,0.08421999961137772,,,,,, +27,95699,,,,,,0.07670680433511734,,,,,, +27,95749,,,,,,0.0675504207611084,,,,,, +27,95799,,,,,,0.061664801090955734,,,,,, +27,95849,,,,,,0.07829653471708298,,,,,, +27,95899,,,,,,0.06521040201187134,,,,,, +27,95949,,,,,,0.06921794265508652,,,,,, +27,95999,,,,,,0.07217219471931458,,,,,, +27,96049,,,,,,0.07017413526773453,,,,,, +27,96099,,,,,,0.06717880815267563,,,,,, +27,96149,,,,,,0.06548504531383514,,,,,, +27,96199,,,,,,0.07413792610168457,,,,,, +27,96249,,,,,,0.060187630355358124,,,,,, +27,96299,,,,,,0.06916143000125885,,,,,, +27,96349,,,,,,0.06392061710357666,,,,,, +27,96399,,,,,,0.06295125186443329,,,,,, +27,96431,,,,,,,0.23915214836597443,0.0781157836318016,0.23755963146686554,0.05501145124435425,0.19865085184574127,0.0781157836318016 +27,96431,0.22898392379283905,0.07287190109491348,0.3508518636226654,0.12307596206665039,0.3259967863559723,,,,,,, +28,96449,,,,,,0.0663277804851532,,,,,, +28,96499,,,,,,0.07640832662582397,,,,,, +28,96549,,,,,,0.07924792915582657,,,,,, +28,96599,,,,,,0.07401244342327118,,,,,, +28,96649,,,,,,0.06199713051319122,,,,,, +28,96699,,,,,,0.0770072415471077,,,,,, +28,96749,,,,,,0.07037068158388138,,,,,, +28,96799,,,,,,0.05926967039704323,,,,,, +28,96849,,,,,,0.061888717114925385,,,,,, +28,96899,,,,,,0.08018624782562256,,,,,, +28,96949,,,,,,0.06507138907909393,,,,,, +28,96999,,,,,,0.07518815994262695,,,,,, +28,97049,,,,,,0.06061560660600662,,,,,, +28,97099,,,,,,0.0785420835018158,,,,,, +28,97149,,,,,,0.07375258952379227,,,,,, +28,97199,,,,,,0.0758291631937027,,,,,, +28,97249,,,,,,0.0702362135052681,,,,,, +28,97299,,,,,,0.08314599096775055,,,,,, +28,97349,,,,,,0.08655727654695511,,,,,, +28,97399,,,,,,0.07599186152219772,,,,,, +28,97449,,,,,,0.07277431339025497,,,,,, +28,97499,,,,,,0.0792364552617073,,,,,, +28,97549,,,,,,0.08009674400091171,,,,,, +28,97599,,,,,,0.07965050637722015,,,,,, +28,97649,,,,,,0.07642855495214462,,,,,, +28,97699,,,,,,0.07738574594259262,,,,,, +28,97749,,,,,,0.0817221850156784,,,,,, +28,97799,,,,,,0.06438406556844711,,,,,, +28,97849,,,,,,0.07651694864034653,,,,,, +28,97899,,,,,,0.0680147260427475,,,,,, +28,97949,,,,,,0.070750892162323,,,,,, +28,97999,,,,,,0.0678805559873581,,,,,, +28,98049,,,,,,0.09259101748466492,,,,,, +28,98099,,,,,,0.08303606510162354,,,,,, +28,98149,,,,,,0.08605175465345383,,,,,, +28,98199,,,,,,0.08005184680223465,,,,,, +28,98249,,,,,,0.06557463109493256,,,,,, +28,98299,,,,,,0.061826229095458984,,,,,, +28,98349,,,,,,0.07293681800365448,,,,,, +28,98399,,,,,,0.05359918251633644,,,,,, +28,98449,,,,,,0.068252794444561,,,,,, +28,98499,,,,,,0.07564257830381393,,,,,, +28,98549,,,,,,0.05602060630917549,,,,,, +28,98599,,,,,,0.06996653974056244,,,,,, +28,98649,,,,,,0.07777991145849228,,,,,, +28,98699,,,,,,0.07289004325866699,,,,,, +28,98749,,,,,,0.07025808095932007,,,,,, +28,98799,,,,,,0.06667517125606537,,,,,, +28,98849,,,,,,0.0755901038646698,,,,,, +28,98899,,,,,,0.07097417116165161,,,,,, +28,98949,,,,,,0.06422965228557587,,,,,, +28,98999,,,,,,0.07479199022054672,,,,,, +28,99049,,,,,,0.06341204792261124,,,,,, +28,99099,,,,,,0.062352556735277176,,,,,, +28,99149,,,,,,0.07247255742549896,,,,,, +28,99199,,,,,,0.06981862336397171,,,,,, +28,99249,,,,,,0.07826173305511475,,,,,, +28,99299,,,,,,0.06851169466972351,,,,,, +28,99349,,,,,,0.0731465220451355,,,,,, +28,99399,,,,,,0.06827914714813232,,,,,, +28,99449,,,,,,0.07972130179405212,,,,,, +28,99499,,,,,,0.07119729369878769,,,,,, +28,99549,,,,,,0.06428050249814987,,,,,, +28,99599,,,,,,0.07320649921894073,,,,,, +28,99649,,,,,,0.07994947582483292,,,,,, +28,99699,,,,,,0.06591497361660004,,,,,, +28,99749,,,,,,0.06811923533678055,,,,,, +28,99799,,,,,,0.07095837593078613,,,,,, +28,99849,,,,,,0.0833703875541687,,,,,, +28,99875,,,,,,,0.23967517912387848,0.0784505233168602,0.23449480533599854,0.05096203088760376,0.20189636945724487,0.0784505233168602 +28,99875,0.2284337282180786,0.07264295220375061,0.3547608256340027,0.1258331537246704,0.3303697407245636,,,,,,, +29,99899,,,,,,0.07263760268688202,,,,,, +29,99949,,,,,,0.07622867822647095,,,,,, +29,99999,,,,,,0.08761651068925858,,,,,, +29,100049,,,,,,0.07759246975183487,,,,,, +29,100099,,,,,,0.05546896159648895,,,,,, +29,100149,,,,,,0.0759507492184639,,,,,, +29,100199,,,,,,0.07359468936920166,,,,,, +29,100249,,,,,,0.07881179451942444,,,,,, +29,100299,,,,,,0.07434919476509094,,,,,, +29,100349,,,,,,0.07426011562347412,,,,,, +29,100399,,,,,,0.08062096685171127,,,,,, +29,100449,,,,,,0.07183115184307098,,,,,, +29,100499,,,,,,0.0748203694820404,,,,,, +29,100549,,,,,,0.07216823101043701,,,,,, +29,100599,,,,,,0.06282056868076324,,,,,, +29,100649,,,,,,0.07043199986219406,,,,,, +29,100699,,,,,,0.06732987612485886,,,,,, +29,100749,,,,,,0.057996030896902084,,,,,, +29,100799,,,,,,0.06915867328643799,,,,,, +29,100849,,,,,,0.07160984724760056,,,,,, +29,100899,,,,,,0.07503482699394226,,,,,, +29,100949,,,,,,0.06688886880874634,,,,,, +29,100999,,,,,,0.08744381368160248,,,,,, +29,101049,,,,,,0.07115228474140167,,,,,, +29,101099,,,,,,0.07448703050613403,,,,,, +29,101149,,,,,,0.05966772884130478,,,,,, +29,101199,,,,,,0.07327257096767426,,,,,, +29,101249,,,,,,0.08218760043382645,,,,,, +29,101299,,,,,,0.06702920794487,,,,,, +29,101349,,,,,,0.0776749849319458,,,,,, +29,101399,,,,,,0.08249618113040924,,,,,, +29,101449,,,,,,0.07121685147285461,,,,,, +29,101499,,,,,,0.07096315175294876,,,,,, +29,101549,,,,,,0.06801947951316833,,,,,, +29,101599,,,,,,0.08873341977596283,,,,,, +29,101649,,,,,,0.06912927329540253,,,,,, +29,101699,,,,,,0.08210127055644989,,,,,, +29,101749,,,,,,0.06617990136146545,,,,,, +29,101799,,,,,,0.07705216109752655,,,,,, +29,101849,,,,,,0.0715021938085556,,,,,, +29,101899,,,,,,0.06669311225414276,,,,,, +29,101949,,,,,,0.07880933582782745,,,,,, +29,101999,,,,,,0.0834396556019783,,,,,, +29,102049,,,,,,0.0756433829665184,,,,,, +29,102099,,,,,,0.08103296905755997,,,,,, +29,102149,,,,,,0.07147229462862015,,,,,, +29,102199,,,,,,0.07258455455303192,,,,,, +29,102249,,,,,,0.08524182438850403,,,,,, +29,102299,,,,,,0.05493801832199097,,,,,, +29,102349,,,,,,0.08367986232042313,,,,,, +29,102399,,,,,,0.07068485021591187,,,,,, +29,102449,,,,,,0.06988523155450821,,,,,, +29,102499,,,,,,0.07028885185718536,,,,,, +29,102549,,,,,,0.06001408398151398,,,,,, +29,102599,,,,,,0.08740729093551636,,,,,, +29,102649,,,,,,0.07645171135663986,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..dd9ae13b16589005e010676db681cbc9f5e2cdf5 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml @@ -0,0 +1,22 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: sweetnet + num_layers: 16 + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 44 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..97fc2194f075c8beabfd42dad7742b5ebe44e80a --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/metrics.csv @@ -0,0 +1,939 @@ +epoch,step,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +29,99899,,,,,,0.06642037630081177,,,,,, +29,99949,,,,,,0.06522119790315628,,,,,, +29,99999,,,,,,0.07707758247852325,,,,,, +29,100049,,,,,,0.0684889554977417,,,,,, +29,100099,,,,,,0.07957588881254196,,,,,, +29,100149,,,,,,0.06527171283960342,,,,,, +29,100199,,,,,,0.06259400397539139,,,,,, +29,100249,,,,,,0.06950216740369797,,,,,, +29,100299,,,,,,0.07104448974132538,,,,,, +29,100349,,,,,,0.06804126501083374,,,,,, +29,100399,,,,,,0.08730107545852661,,,,,, +29,100449,,,,,,0.0727049708366394,,,,,, +29,100499,,,,,,0.07078269124031067,,,,,, +29,100549,,,,,,0.06636439263820648,,,,,, +29,100599,,,,,,0.07258377224206924,,,,,, +29,100649,,,,,,0.06792248785495758,,,,,, +29,100699,,,,,,0.07243739813566208,,,,,, +29,100749,,,,,,0.07445409893989563,,,,,, +29,100799,,,,,,0.07545873522758484,,,,,, +29,100849,,,,,,0.07855892181396484,,,,,, +29,100899,,,,,,0.07744117081165314,,,,,, +29,100949,,,,,,0.06960603594779968,,,,,, +29,100999,,,,,,0.07367609441280365,,,,,, +29,101049,,,,,,0.07725869119167328,,,,,, +29,101099,,,,,,0.063619464635849,,,,,, +29,101149,,,,,,0.07230609655380249,,,,,, +29,101199,,,,,,0.0697738379240036,,,,,, +29,101249,,,,,,0.06063200533390045,,,,,, +29,101299,,,,,,0.0821612998843193,,,,,, +29,101349,,,,,,0.07508860528469086,,,,,, +29,101399,,,,,,0.07478125393390656,,,,,, +29,101449,,,,,,0.06921681016683578,,,,,, +29,101499,,,,,,0.07374705374240875,,,,,, +29,101549,,,,,,0.07221225649118423,,,,,, +29,101599,,,,,,0.0635935440659523,,,,,, +29,101649,,,,,,0.06676243990659714,,,,,, +29,101699,,,,,,0.06397650390863419,,,,,, +29,101749,,,,,,0.06855246424674988,,,,,, +29,101799,,,,,,0.06841208040714264,,,,,, +29,101849,,,,,,0.08021217584609985,,,,,, +29,101899,,,,,,0.0810237005352974,,,,,, +29,101949,,,,,,0.06610886007547379,,,,,, +29,101999,,,,,,0.07855323702096939,,,,,, +29,102049,,,,,,0.06526479125022888,,,,,, +29,102099,,,,,,0.07163308560848236,,,,,, +29,102149,,,,,,0.0705409049987793,,,,,, +29,102199,,,,,,0.06365561485290527,,,,,, +29,102249,,,,,,0.08539558202028275,,,,,, +29,102299,,,,,,0.06895850598812103,,,,,, +29,102349,,,,,,0.06689931452274323,,,,,, +29,102399,,,,,,0.07364664226770401,,,,,, +29,102449,,,,,,0.07998757809400558,,,,,, +29,102499,,,,,,0.06672888249158859,,,,,, +29,102549,,,,,,0.07746889442205429,,,,,, +29,102599,,,,,,0.060306333005428314,,,,,, +29,102649,,,,,,0.06884326040744781,,,,,, +29,102699,,,,,,0.05806862562894821,,,,,, +29,102749,,,,,,0.06938691437244415,,,,,, +29,102799,,,,,,0.0843924880027771,,,,,, +29,102849,,,,,,0.06428967416286469,,,,,, +29,102899,,,,,,0.06808941811323166,,,,,, +29,102949,,,,,,0.07984985411167145,,,,,, +29,102999,,,,,,0.06527701765298843,,,,,, +29,103049,,,,,,0.07160963118076324,,,,,, +29,103099,,,,,,0.07300872355699539,,,,,, +29,103149,,,,,,0.07958406209945679,,,,,, +29,103199,,,,,,0.06975256651639938,,,,,, +29,103249,,,,,,0.07786829769611359,,,,,, +29,103299,,,,,,0.0755319893360138,,,,,, +29,103319,,,,,,,0.23943041265010834,0.07831777632236481,0.23398879170417786,0.052567899227142334,0.20138724148273468,0.07831777632236481 +29,103319,0.22804507613182068,0.07242044806480408,0.3585105538368225,0.12852096557617188,0.33420076966285706,,,,,,, +30,103349,,,,,,0.08033892512321472,,,,,, +30,103399,,,,,,0.07570788264274597,,,,,, +30,103449,,,,,,0.08079762011766434,,,,,, +30,103499,,,,,,0.07479149103164673,,,,,, +30,103549,,,,,,0.07631805539131165,,,,,, +30,103599,,,,,,0.060888007283210754,,,,,, +30,103649,,,,,,0.06600359082221985,,,,,, +30,103699,,,,,,0.0843101292848587,,,,,, +30,103749,,,,,,0.06880553066730499,,,,,, +30,103799,,,,,,0.06856168061494827,,,,,, +30,103849,,,,,,0.08327586948871613,,,,,, +30,103899,,,,,,0.07143274694681168,,,,,, +30,103949,,,,,,0.07860474288463593,,,,,, +30,103999,,,,,,0.07551141083240509,,,,,, +30,104049,,,,,,0.07534907758235931,,,,,, +30,104099,,,,,,0.07239395380020142,,,,,, +30,104149,,,,,,0.07469326257705688,,,,,, +30,104199,,,,,,0.07774335145950317,,,,,, +30,104249,,,,,,0.06790674477815628,,,,,, +30,104299,,,,,,0.0721290335059166,,,,,, +30,104349,,,,,,0.07625797390937805,,,,,, +30,104399,,,,,,0.0690334141254425,,,,,, +30,104449,,,,,,0.06093025207519531,,,,,, +30,104499,,,,,,0.07335999608039856,,,,,, +30,104549,,,,,,0.06795196235179901,,,,,, +30,104599,,,,,,0.07816556096076965,,,,,, +30,104649,,,,,,0.06253400444984436,,,,,, +30,104699,,,,,,0.07343940436840057,,,,,, +30,104749,,,,,,0.07051284611225128,,,,,, +30,104799,,,,,,0.06721127033233643,,,,,, +30,104849,,,,,,0.06977597624063492,,,,,, +30,104899,,,,,,0.06125689297914505,,,,,, +30,104949,,,,,,0.08349406719207764,,,,,, +30,104999,,,,,,0.06463795900344849,,,,,, +30,105049,,,,,,0.0663030743598938,,,,,, +30,105099,,,,,,0.07298906147480011,,,,,, +30,105149,,,,,,0.08518312871456146,,,,,, +30,105199,,,,,,0.0720682293176651,,,,,, +30,105249,,,,,,0.06611406058073044,,,,,, +30,105299,,,,,,0.06586381793022156,,,,,, +30,105349,,,,,,0.06736679375171661,,,,,, +30,105399,,,,,,0.0647381991147995,,,,,, +30,105449,,,,,,0.06038498133420944,,,,,, +30,105499,,,,,,0.08242055028676987,,,,,, +30,105549,,,,,,0.07952365279197693,,,,,, +30,105599,,,,,,0.06789135932922363,,,,,, +30,105649,,,,,,0.0678735300898552,,,,,, +30,105699,,,,,,0.06892657279968262,,,,,, +30,105749,,,,,,0.06972231715917587,,,,,, +30,105799,,,,,,0.07565245777368546,,,,,, +30,105849,,,,,,0.07189513742923737,,,,,, +30,105899,,,,,,0.07366019487380981,,,,,, +30,105949,,,,,,0.07182364910840988,,,,,, +30,105999,,,,,,0.07228142023086548,,,,,, +30,106049,,,,,,0.06015012413263321,,,,,, +30,106099,,,,,,0.07883542031049728,,,,,, +30,106149,,,,,,0.0666532814502716,,,,,, +30,106199,,,,,,0.08967623114585876,,,,,, +30,106249,,,,,,0.06813766807317734,,,,,, +30,106299,,,,,,0.08074716478586197,,,,,, +30,106349,,,,,,0.06617379188537598,,,,,, +30,106399,,,,,,0.08330492675304413,,,,,, +30,106449,,,,,,0.08393367379903793,,,,,, +30,106499,,,,,,0.0858171209692955,,,,,, +30,106549,,,,,,0.09129147976636887,,,,,, +30,106599,,,,,,0.06552166491746902,,,,,, +30,106649,,,,,,0.0725896954536438,,,,,, +30,106699,,,,,,0.07295501232147217,,,,,, +30,106749,,,,,,0.062037959694862366,,,,,, +30,106763,,,,,,,0.24015021324157715,0.07846396416425705,0.23591472208499908,0.050799429416656494,0.20111411809921265,0.07846396416425705 +30,106763,0.22780875861644745,0.07230540364980698,0.360439658164978,0.12990236282348633,0.3363141417503357,,,,,,, +31,106799,,,,,,0.073036789894104,,,,,, +31,106849,,,,,,0.07363983988761902,,,,,, +31,106899,,,,,,0.07721313834190369,,,,,, +31,106949,,,,,,0.07323700934648514,,,,,, +31,106999,,,,,,0.06615996360778809,,,,,, +31,107049,,,,,,0.07405064254999161,,,,,, +31,107099,,,,,,0.0706036388874054,,,,,, +31,107149,,,,,,0.0799173042178154,,,,,, +31,107199,,,,,,0.0781858041882515,,,,,, +31,107249,,,,,,0.05634153634309769,,,,,, +31,107299,,,,,,0.07170717418193817,,,,,, +31,107349,,,,,,0.069761261343956,,,,,, +31,107399,,,,,,0.08694803714752197,,,,,, +31,107449,,,,,,0.09269384294748306,,,,,, +31,107499,,,,,,0.07147759199142456,,,,,, +31,107549,,,,,,0.07449561357498169,,,,,, +31,107599,,,,,,0.06752271205186844,,,,,, +31,107649,,,,,,0.07073548436164856,,,,,, +31,107699,,,,,,0.06524205207824707,,,,,, +31,107749,,,,,,0.07288803160190582,,,,,, +31,107799,,,,,,0.07384256273508072,,,,,, +31,107849,,,,,,0.07443792372941971,,,,,, +31,107899,,,,,,0.07284508645534515,,,,,, +31,107949,,,,,,0.07659369707107544,,,,,, +31,107999,,,,,,0.06642547994852066,,,,,, +31,108049,,,,,,0.07230755686759949,,,,,, +31,108099,,,,,,0.0781579241156578,,,,,, +31,108149,,,,,,0.08420126140117645,,,,,, +31,108199,,,,,,0.07687101513147354,,,,,, +31,108249,,,,,,0.07384558022022247,,,,,, +31,108299,,,,,,0.059793539345264435,,,,,, +31,108349,,,,,,0.07805667817592621,,,,,, +31,108399,,,,,,0.07799415290355682,,,,,, +31,108449,,,,,,0.07101135700941086,,,,,, +31,108499,,,,,,0.06433042138814926,,,,,, +31,108549,,,,,,0.08138912916183472,,,,,, +31,108599,,,,,,0.07303903996944427,,,,,, +31,108649,,,,,,0.0697876438498497,,,,,, +31,108699,,,,,,0.08057577908039093,,,,,, +31,108749,,,,,,0.06869961321353912,,,,,, +31,108799,,,,,,0.07047916948795319,,,,,, +31,108849,,,,,,0.06799112260341644,,,,,, +31,108899,,,,,,0.07905101776123047,,,,,, +31,108949,,,,,,0.07520554214715958,,,,,, +31,108999,,,,,,0.06194501742720604,,,,,, +31,109049,,,,,,0.06446325778961182,,,,,, +31,109099,,,,,,0.07419341802597046,,,,,, +31,109149,,,,,,0.06882020086050034,,,,,, +31,109199,,,,,,0.05830618739128113,,,,,, +31,109249,,,,,,0.07382743060588837,,,,,, +31,109299,,,,,,0.06869258731603622,,,,,, +31,109349,,,,,,0.07581359148025513,,,,,, +31,109399,,,,,,0.06424899399280548,,,,,, +31,109449,,,,,,0.06734742224216461,,,,,, +31,109499,,,,,,0.07660529762506485,,,,,, +31,109549,,,,,,0.07974183559417725,,,,,, +31,109599,,,,,,0.06829608976840973,,,,,, +31,109649,,,,,,0.060265474021434784,,,,,, +31,109699,,,,,,0.07857931405305862,,,,,, +31,109749,,,,,,0.06615990400314331,,,,,, +31,109799,,,,,,0.06883783638477325,,,,,, +31,109849,,,,,,0.07836712896823883,,,,,, +31,109899,,,,,,0.08678510785102844,,,,,, +31,109949,,,,,,0.05990508943796158,,,,,, +31,109999,,,,,,0.07302281260490417,,,,,, +31,110049,,,,,,0.0756419450044632,,,,,, +31,110099,,,,,,0.061032362282276154,,,,,, +31,110149,,,,,,0.07743610441684723,,,,,, +31,110199,,,,,,0.08701197803020477,,,,,, +31,110207,,,,,,,0.240511953830719,0.07847491651773453,0.23081564903259277,0.0506669282913208,0.19589635729789734,0.07847491651773453 +31,110207,0.22812038660049438,0.07249315083026886,0.3573090136051178,0.12764644622802734,0.3339134454727173,,,,,,, +32,110249,,,,,,0.08649468421936035,,,,,, +32,110299,,,,,,0.06423192471265793,,,,,, +32,110349,,,,,,0.07959645986557007,,,,,, +32,110399,,,,,,0.058813534677028656,,,,,, +32,110449,,,,,,0.0824858546257019,,,,,, +32,110499,,,,,,0.07261327654123306,,,,,, +32,110549,,,,,,0.07302959263324738,,,,,, +32,110599,,,,,,0.06873119622468948,,,,,, +32,110649,,,,,,0.08439604938030243,,,,,, +32,110699,,,,,,0.06869830191135406,,,,,, +32,110749,,,,,,0.0813235193490982,,,,,, +32,110799,,,,,,0.0839705765247345,,,,,, +32,110849,,,,,,0.06875845789909363,,,,,, +32,110899,,,,,,0.06884972006082535,,,,,, +32,110949,,,,,,0.06730863451957703,,,,,, +32,110999,,,,,,0.07027534395456314,,,,,, +32,111049,,,,,,0.06879152357578278,,,,,, +32,111099,,,,,,0.07596612721681595,,,,,, +32,111149,,,,,,0.07326076179742813,,,,,, +32,111199,,,,,,0.07277782261371613,,,,,, +32,111249,,,,,,0.08174224197864532,,,,,, +32,111299,,,,,,0.07101976126432419,,,,,, +32,111349,,,,,,0.07836751639842987,,,,,, +32,111399,,,,,,0.07463055849075317,,,,,, +32,111449,,,,,,0.08076506108045578,,,,,, +32,111499,,,,,,0.08116514980792999,,,,,, +32,111549,,,,,,0.06959807127714157,,,,,, +32,111599,,,,,,0.07377222180366516,,,,,, +32,111649,,,,,,0.06969228386878967,,,,,, +32,111699,,,,,,0.06745026260614395,,,,,, +32,111749,,,,,,0.07132400572299957,,,,,, +32,111799,,,,,,0.06436630338430405,,,,,, +32,111849,,,,,,0.07166476547718048,,,,,, +32,111899,,,,,,0.0607631579041481,,,,,, +32,111949,,,,,,0.06842127442359924,,,,,, +32,111999,,,,,,0.07457379996776581,,,,,, +32,112049,,,,,,0.07496646046638489,,,,,, +32,112099,,,,,,0.0702337920665741,,,,,, +32,112149,,,,,,0.07243874669075012,,,,,, +32,112199,,,,,,0.06272831559181213,,,,,, +32,112249,,,,,,0.07681072503328323,,,,,, +32,112299,,,,,,0.06962428241968155,,,,,, +32,112349,,,,,,0.0723416656255722,,,,,, +32,112399,,,,,,0.0644773542881012,,,,,, +32,112449,,,,,,0.07147859781980515,,,,,, +32,112499,,,,,,0.1166999489068985,,,,,, +32,112549,,,,,,0.06383358687162399,,,,,, +32,112599,,,,,,0.07403399795293808,,,,,, +32,112649,,,,,,0.08671779930591583,,,,,, +32,112699,,,,,,0.07317598164081573,,,,,, +32,112749,,,,,,0.07965178787708282,,,,,, +32,112799,,,,,,0.08937659859657288,,,,,, +32,112849,,,,,,0.0673239678144455,,,,,, +32,112899,,,,,,0.06586303561925888,,,,,, +32,112949,,,,,,0.06779629737138748,,,,,, +32,112999,,,,,,0.06835468858480453,,,,,, +32,113049,,,,,,0.08147810399532318,,,,,, +32,113099,,,,,,0.07810575515031815,,,,,, +32,113149,,,,,,0.06985979527235031,,,,,, +32,113199,,,,,,0.06862856447696686,,,,,, +32,113249,,,,,,0.06743977963924408,,,,,, +32,113299,,,,,,0.07484543323516846,,,,,, +32,113349,,,,,,0.08492892235517502,,,,,, +32,113399,,,,,,0.0744161307811737,,,,,, +32,113449,,,,,,0.07473765313625336,,,,,, +32,113499,,,,,,0.07994332909584045,,,,,, +32,113549,,,,,,0.06601814180612564,,,,,, +32,113599,,,,,,0.07306905090808868,,,,,, +32,113649,,,,,,0.08128286898136139,,,,,, +32,113651,,,,,,,0.24088361859321594,0.07851626724004745,0.23420295119285583,0.0501667857170105,0.19950324296951294,0.07851626724004745 +32,113651,0.22769832611083984,0.07227413356304169,0.36097022891044617,0.1302715539932251,0.33782485127449036,,,,,,, +33,113699,,,,,,0.08062884956598282,,,,,, +33,113749,,,,,,0.06990811228752136,,,,,, +33,113799,,,,,,0.08026659488677979,,,,,, +33,113849,,,,,,0.07556596398353577,,,,,, +33,113899,,,,,,0.06395765393972397,,,,,, +33,113949,,,,,,0.06801927834749222,,,,,, +33,113999,,,,,,0.07527625560760498,,,,,, +33,114049,,,,,,0.07134415209293365,,,,,, +33,114099,,,,,,0.07379312813282013,,,,,, +33,114149,,,,,,0.06991949677467346,,,,,, +33,114199,,,,,,0.08274327963590622,,,,,, +33,114249,,,,,,0.07849572598934174,,,,,, +33,114299,,,,,,0.07793916761875153,,,,,, +33,114349,,,,,,0.0812235027551651,,,,,, +33,114399,,,,,,0.06578654050827026,,,,,, +33,114449,,,,,,0.07356530427932739,,,,,, +33,114499,,,,,,0.06778238713741302,,,,,, +33,114549,,,,,,0.07350639998912811,,,,,, +33,114599,,,,,,0.084556445479393,,,,,, +33,114649,,,,,,0.07392609119415283,,,,,, +33,114699,,,,,,0.0754861980676651,,,,,, +33,114749,,,,,,0.06773623079061508,,,,,, +33,114799,,,,,,0.07074718922376633,,,,,, +33,114849,,,,,,0.08094049990177155,,,,,, +33,114899,,,,,,0.08175010234117508,,,,,, +33,114949,,,,,,0.06814716756343842,,,,,, +33,114999,,,,,,0.06787249445915222,,,,,, +33,115049,,,,,,0.06633591651916504,,,,,, +33,115099,,,,,,0.0684380829334259,,,,,, +33,115149,,,,,,0.06894120573997498,,,,,, +33,115199,,,,,,0.06482440233230591,,,,,, +33,115249,,,,,,0.06626228243112564,,,,,, +33,115299,,,,,,0.06527984142303467,,,,,, +33,115349,,,,,,0.07057778537273407,,,,,, +33,115399,,,,,,0.06881861388683319,,,,,, +33,115449,,,,,,0.06427782773971558,,,,,, +33,115499,,,,,,0.07350356876850128,,,,,, +33,115549,,,,,,0.076779305934906,,,,,, +33,115599,,,,,,0.07304878532886505,,,,,, +33,115649,,,,,,0.06061669439077377,,,,,, +33,115699,,,,,,0.08055281639099121,,,,,, +33,115749,,,,,,0.07445413619279861,,,,,, +33,115799,,,,,,0.060246918350458145,,,,,, +33,115849,,,,,,0.09071576595306396,,,,,, +33,115899,,,,,,0.07450036704540253,,,,,, +33,115949,,,,,,0.07652533054351807,,,,,, +33,115999,,,,,,0.07811924815177917,,,,,, +33,116049,,,,,,0.0727551132440567,,,,,, +33,116099,,,,,,0.07552318274974823,,,,,, +33,116149,,,,,,0.0792996808886528,,,,,, +33,116199,,,,,,0.06942738592624664,,,,,, +33,116249,,,,,,0.0592317059636116,,,,,, +33,116299,,,,,,0.0698685497045517,,,,,, +33,116349,,,,,,0.0788188949227333,,,,,, +33,116399,,,,,,0.07916782051324844,,,,,, +33,116449,,,,,,0.07325109094381332,,,,,, +33,116499,,,,,,0.06568540632724762,,,,,, +33,116549,,,,,,0.06835366785526276,,,,,, +33,116599,,,,,,0.07177205383777618,,,,,, +33,116649,,,,,,0.0586303174495697,,,,,, +33,116699,,,,,,0.07452765852212906,,,,,, +33,116749,,,,,,0.07190753519535065,,,,,, +33,116799,,,,,,0.06476651132106781,,,,,, +33,116849,,,,,,0.07250884920358658,,,,,, +33,116899,,,,,,0.0759621262550354,,,,,, +33,116949,,,,,,0.08054118603467941,,,,,, +33,116999,,,,,,0.07757894694805145,,,,,, +33,117049,,,,,,0.08111083507537842,,,,,, +33,117095,,,,,,,0.2390538901090622,0.07827524095773697,0.24007146060466766,0.05308252573013306,0.2059338390827179,0.07827524095773697 +33,117095,0.2273661345243454,0.07205701619386673,0.3645613491535187,0.13289207220077515,0.3413117825984955,,,,,,, +34,117099,,,,,,0.07010384649038315,,,,,, +34,117149,,,,,,0.06834874302148819,,,,,, +34,117199,,,,,,0.07959690690040588,,,,,, +34,117249,,,,,,0.08167536556720734,,,,,, +34,117299,,,,,,0.06626029312610626,,,,,, +34,117349,,,,,,0.057133570313453674,,,,,, +34,117399,,,,,,0.07718487083911896,,,,,, +34,117449,,,,,,0.07992309331893921,,,,,, +34,117499,,,,,,0.07830746471881866,,,,,, +34,117549,,,,,,0.07228205353021622,,,,,, +34,117599,,,,,,0.07918769121170044,,,,,, +34,117649,,,,,,0.07321730256080627,,,,,, +34,117699,,,,,,0.07611049711704254,,,,,, +34,117749,,,,,,0.07468149811029434,,,,,, +34,117799,,,,,,0.0691460445523262,,,,,, +34,117849,,,,,,0.07237108796834946,,,,,, +34,117899,,,,,,0.06687031686306,,,,,, +34,117949,,,,,,0.06733104586601257,,,,,, +34,117999,,,,,,0.07932683825492859,,,,,, +34,118049,,,,,,0.06331191956996918,,,,,, +34,118099,,,,,,0.08026021718978882,,,,,, +34,118149,,,,,,0.06547783315181732,,,,,, +34,118199,,,,,,0.06440215557813644,,,,,, +34,118249,,,,,,0.0769752636551857,,,,,, +34,118299,,,,,,0.07387857139110565,,,,,, +34,118349,,,,,,0.07904726266860962,,,,,, +34,118399,,,,,,0.0672689750790596,,,,,, +34,118449,,,,,,0.0726388469338417,,,,,, +34,118499,,,,,,0.08096374571323395,,,,,, +34,118549,,,,,,0.06894669681787491,,,,,, +34,118599,,,,,,0.08006221055984497,,,,,, +34,118649,,,,,,0.06296824663877487,,,,,, +34,118699,,,,,,0.07470736652612686,,,,,, +34,118749,,,,,,0.06151704862713814,,,,,, +34,118799,,,,,,0.08065824210643768,,,,,, +34,118849,,,,,,0.07234353572130203,,,,,, +34,118899,,,,,,0.07136808335781097,,,,,, +34,118949,,,,,,0.0727265328168869,,,,,, +34,118999,,,,,,0.06863085925579071,,,,,, +34,119049,,,,,,0.06840751320123672,,,,,, +34,119099,,,,,,0.06532657146453857,,,,,, +34,119149,,,,,,0.07945554703474045,,,,,, +34,119199,,,,,,0.07963725924491882,,,,,, +34,119249,,,,,,0.06380672007799149,,,,,, +34,119299,,,,,,0.07572832703590393,,,,,, +34,119349,,,,,,0.06352455914020538,,,,,, +34,119399,,,,,,0.07715094834566116,,,,,, +34,119449,,,,,,0.05998159572482109,,,,,, +34,119499,,,,,,0.07691661268472672,,,,,, +34,119549,,,,,,0.07031136006116867,,,,,, +34,119599,,,,,,0.0806104987859726,,,,,, +34,119649,,,,,,0.07301127910614014,,,,,, +34,119699,,,,,,0.07907063513994217,,,,,, +34,119749,,,,,,0.08295264095067978,,,,,, +34,119799,,,,,,0.07939529418945312,,,,,, +34,119849,,,,,,0.06559601426124573,,,,,, +34,119899,,,,,,0.07935133576393127,,,,,, +34,119949,,,,,,0.06765881180763245,,,,,, +34,119999,,,,,,0.07728967070579529,,,,,, +34,120049,,,,,,0.0725860521197319,,,,,, +34,120099,,,,,,0.06071077659726143,,,,,, +34,120149,,,,,,0.0809587836265564,,,,,, +34,120199,,,,,,0.06182313710451126,,,,,, +34,120249,,,,,,0.0705188512802124,,,,,, +34,120299,,,,,,0.08408632129430771,,,,,, +34,120349,,,,,,0.08584843575954437,,,,,, +34,120399,,,,,,0.05638376623392105,,,,,, +34,120449,,,,,,0.06660988926887512,,,,,, +34,120499,,,,,,0.06837029755115509,,,,,, +34,120539,,,,,,,0.2391211986541748,0.07792834937572479,0.24104255437850952,0.05727893114089966,0.20528241991996765,0.07792834937572479 +34,120539,0.22614984214305878,0.071512371301651,0.373437762260437,0.13944226503372192,0.350467711687088,,,,,,, +35,120549,,,,,,0.07916432619094849,,,,,, +35,120599,,,,,,0.06569810211658478,,,,,, +35,120649,,,,,,0.06807923316955566,,,,,, +35,120699,,,,,,0.06417521834373474,,,,,, +35,120749,,,,,,0.07114937901496887,,,,,, +35,120799,,,,,,0.07158935070037842,,,,,, +35,120849,,,,,,0.06256130337715149,,,,,, +35,120899,,,,,,0.07201500982046127,,,,,, +35,120949,,,,,,0.07457781583070755,,,,,, +35,120999,,,,,,0.0819234549999237,,,,,, +35,121049,,,,,,0.07034093141555786,,,,,, +35,121099,,,,,,0.07176254689693451,,,,,, +35,121149,,,,,,0.0677240863442421,,,,,, +35,121199,,,,,,0.05770958960056305,,,,,, +35,121249,,,,,,0.07287585735321045,,,,,, +35,121299,,,,,,0.07051938772201538,,,,,, +35,121349,,,,,,0.07600029557943344,,,,,, +35,121399,,,,,,0.06328648328781128,,,,,, +35,121449,,,,,,0.07556003332138062,,,,,, +35,121499,,,,,,0.06717810779809952,,,,,, +35,121549,,,,,,0.06763223558664322,,,,,, +35,121599,,,,,,0.07644915580749512,,,,,, +35,121649,,,,,,0.08174163103103638,,,,,, +35,121699,,,,,,0.05769237130880356,,,,,, +35,121749,,,,,,0.08484221249818802,,,,,, +35,121799,,,,,,0.06700612604618073,,,,,, +35,121849,,,,,,0.0848575234413147,,,,,, +35,121899,,,,,,0.06824815273284912,,,,,, +35,121949,,,,,,0.07938818633556366,,,,,, +35,121999,,,,,,0.07003982365131378,,,,,, +35,122049,,,,,,0.056178316473960876,,,,,, +35,122099,,,,,,0.06938209384679794,,,,,, +35,122149,,,,,,0.06194799765944481,,,,,, +35,122199,,,,,,0.07806555926799774,,,,,, +35,122249,,,,,,0.07268418371677399,,,,,, +35,122299,,,,,,0.06418196856975555,,,,,, +35,122349,,,,,,0.06946691870689392,,,,,, +35,122399,,,,,,0.06660063564777374,,,,,, +35,122449,,,,,,0.07572972774505615,,,,,, +35,122499,,,,,,0.0773857831954956,,,,,, +35,122549,,,,,,0.07361610978841782,,,,,, +35,122599,,,,,,0.07020724564790726,,,,,, +35,122649,,,,,,0.0782417505979538,,,,,, +35,122699,,,,,,0.07362991571426392,,,,,, +35,122749,,,,,,0.08100992441177368,,,,,, +35,122799,,,,,,0.06129914149641991,,,,,, +35,122849,,,,,,0.07751544564962387,,,,,, +35,122899,,,,,,0.06887440383434296,,,,,, +35,122949,,,,,,0.07164786010980606,,,,,, +35,122999,,,,,,0.06736169755458832,,,,,, +35,123049,,,,,,0.07799215614795685,,,,,, +35,123099,,,,,,0.07164236903190613,,,,,, +35,123149,,,,,,0.06293907761573792,,,,,, +35,123199,,,,,,0.08363092690706253,,,,,, +35,123249,,,,,,0.08360064029693604,,,,,, +35,123299,,,,,,0.07295574247837067,,,,,, +35,123349,,,,,,0.07482649385929108,,,,,, +35,123399,,,,,,0.07605010271072388,,,,,, +35,123449,,,,,,0.06527885794639587,,,,,, +35,123499,,,,,,0.06614544987678528,,,,,, +35,123549,,,,,,0.08158377557992935,,,,,, +35,123599,,,,,,0.0734049454331398,,,,,, +35,123649,,,,,,0.07536842674016953,,,,,, +35,123699,,,,,,0.07262952625751495,,,,,, +35,123749,,,,,,0.06185997277498245,,,,,, +35,123799,,,,,,0.0827149897813797,,,,,, +35,123849,,,,,,0.061273060739040375,,,,,, +35,123899,,,,,,0.07571308314800262,,,,,, +35,123949,,,,,,0.06254734843969345,,,,,, +35,123983,,,,,,,0.2389507293701172,0.07797810435295105,0.24110190570354462,0.05667710304260254,0.20572279393672943,0.07797810435295105 +35,123983,0.225743368268013,0.07131703197956085,0.37657156586647034,0.14179390668869019,0.35357820987701416,,,,,,, +36,123999,,,,,,0.06938526779413223,,,,,, +36,124049,,,,,,0.07748493552207947,,,,,, +36,124099,,,,,,0.07965434342622757,,,,,, +36,124149,,,,,,0.07837608456611633,,,,,, +36,124199,,,,,,0.07162570208311081,,,,,, +36,124249,,,,,,0.06547816842794418,,,,,, +36,124299,,,,,,0.06664732843637466,,,,,, +36,124349,,,,,,0.0750376433134079,,,,,, +36,124399,,,,,,0.09019704163074493,,,,,, +36,124449,,,,,,0.07782747596502304,,,,,, +36,124499,,,,,,0.07682798057794571,,,,,, +36,124549,,,,,,0.06595075130462646,,,,,, +36,124599,,,,,,0.06467413157224655,,,,,, +36,124649,,,,,,0.07562094181776047,,,,,, +36,124699,,,,,,0.08924970030784607,,,,,, +36,124749,,,,,,0.0663955956697464,,,,,, +36,124799,,,,,,0.07537508010864258,,,,,, +36,124849,,,,,,0.0644155889749527,,,,,, +36,124899,,,,,,0.06400464475154877,,,,,, +36,124949,,,,,,0.06090041622519493,,,,,, +36,124999,,,,,,0.07717198133468628,,,,,, +36,125049,,,,,,0.06447778642177582,,,,,, +36,125099,,,,,,0.07007281482219696,,,,,, +36,125149,,,,,,0.06685851514339447,,,,,, +36,125199,,,,,,0.066034696996212,,,,,, +36,125249,,,,,,0.07323866337537766,,,,,, +36,125299,,,,,,0.07416124641895294,,,,,, +36,125349,,,,,,0.08349226415157318,,,,,, +36,125399,,,,,,0.07217942178249359,,,,,, +36,125449,,,,,,0.06986495852470398,,,,,, +36,125499,,,,,,0.06195671111345291,,,,,, +36,125549,,,,,,0.07309582084417343,,,,,, +36,125599,,,,,,0.08339430391788483,,,,,, +36,125649,,,,,,0.07359190285205841,,,,,, +36,125699,,,,,,0.07487181574106216,,,,,, +36,125749,,,,,,0.07004337012767792,,,,,, +36,125799,,,,,,0.06422148644924164,,,,,, +36,125849,,,,,,0.05922045558691025,,,,,, +36,125899,,,,,,0.0715489536523819,,,,,, +36,125949,,,,,,0.056746773421764374,,,,,, +36,125999,,,,,,0.07417282462120056,,,,,, +36,126049,,,,,,0.06325943768024445,,,,,, +36,126099,,,,,,0.06552885472774506,,,,,, +36,126149,,,,,,0.07675111293792725,,,,,, +36,126199,,,,,,0.07438249886035919,,,,,, +36,126249,,,,,,0.06529827415943146,,,,,, +36,126299,,,,,,0.059300608932971954,,,,,, +36,126349,,,,,,0.05868105590343475,,,,,, +36,126399,,,,,,0.07423819601535797,,,,,, +36,126449,,,,,,0.069981649518013,,,,,, +36,126499,,,,,,0.0677775889635086,,,,,, +36,126549,,,,,,0.06218164041638374,,,,,, +36,126599,,,,,,0.08271826803684235,,,,,, +36,126649,,,,,,0.07827596366405487,,,,,, +36,126699,,,,,,0.07787124812602997,,,,,, +36,126749,,,,,,0.06452930718660355,,,,,, +36,126799,,,,,,0.07221962511539459,,,,,, +36,126849,,,,,,0.06704197824001312,,,,,, +36,126899,,,,,,0.07251568138599396,,,,,, +36,126949,,,,,,0.07045362144708633,,,,,, +36,126999,,,,,,0.08028239011764526,,,,,, +36,127049,,,,,,0.06583979725837708,,,,,, +36,127099,,,,,,0.06691719591617584,,,,,, +36,127149,,,,,,0.07490203529596329,,,,,, +36,127199,,,,,,0.06391717493534088,,,,,, +36,127249,,,,,,0.07068104296922684,,,,,, +36,127299,,,,,,0.06601132452487946,,,,,, +36,127349,,,,,,0.08024146407842636,,,,,, +36,127399,,,,,,0.0663023442029953,,,,,, +36,127427,,,,,,,0.23879818618297577,0.0782378762960434,0.24016043543815613,0.053534507751464844,0.2056291401386261,0.0782378762960434 +36,127427,0.2254018932580948,0.07111552357673645,0.3797670304775238,0.14422404766082764,0.3556118309497833,,,,,,, +37,127449,,,,,,0.08172652125358582,,,,,, +37,127499,,,,,,0.07091522216796875,,,,,, +37,127549,,,,,,0.06978882849216461,,,,,, +37,127599,,,,,,0.06597194075584412,,,,,, +37,127649,,,,,,0.07103253155946732,,,,,, +37,127699,,,,,,0.0825045108795166,,,,,, +37,127749,,,,,,0.0763077437877655,,,,,, +37,127799,,,,,,0.077942855656147,,,,,, +37,127849,,,,,,0.06349128484725952,,,,,, +37,127899,,,,,,0.07007236778736115,,,,,, +37,127949,,,,,,0.0709744542837143,,,,,, +37,127999,,,,,,0.06773615628480911,,,,,, +37,128049,,,,,,0.0651252269744873,,,,,, +37,128099,,,,,,0.07163272053003311,,,,,, +37,128149,,,,,,0.0807306170463562,,,,,, +37,128199,,,,,,0.07548459619283676,,,,,, +37,128249,,,,,,0.06736478209495544,,,,,, +37,128299,,,,,,0.07253482937812805,,,,,, +37,128349,,,,,,0.07235193997621536,,,,,, +37,128399,,,,,,0.0674506351351738,,,,,, +37,128449,,,,,,0.05859530717134476,,,,,, +37,128499,,,,,,0.0716240406036377,,,,,, +37,128549,,,,,,0.07456065714359283,,,,,, +37,128599,,,,,,0.0808638334274292,,,,,, +37,128649,,,,,,0.07034439593553543,,,,,, +37,128699,,,,,,0.07088150084018707,,,,,, +37,128749,,,,,,0.07945527136325836,,,,,, +37,128799,,,,,,0.0687108039855957,,,,,, +37,128849,,,,,,0.07956711947917938,,,,,, +37,128899,,,,,,0.0693841502070427,,,,,, +37,128949,,,,,,0.07811108231544495,,,,,, +37,128999,,,,,,0.07436917722225189,,,,,, +37,129049,,,,,,0.08320873230695724,,,,,, +37,129099,,,,,,0.06859491765499115,,,,,, +37,129149,,,,,,0.07687223702669144,,,,,, +37,129199,,,,,,0.060700565576553345,,,,,, +37,129249,,,,,,0.0644904375076294,,,,,, +37,129299,,,,,,0.07025255262851715,,,,,, +37,129349,,,,,,0.08068247884511948,,,,,, +37,129399,,,,,,0.06679844856262207,,,,,, +37,129449,,,,,,0.057827502489089966,,,,,, +37,129499,,,,,,0.07789255678653717,,,,,, +37,129549,,,,,,0.061941903084516525,,,,,, +37,129599,,,,,,0.07348443567752838,,,,,, +37,129649,,,,,,0.06956411898136139,,,,,, +37,129699,,,,,,0.08077572286128998,,,,,, +37,129749,,,,,,0.0712718516588211,,,,,, +37,129799,,,,,,0.06728953868150711,,,,,, +37,129849,,,,,,0.08125823736190796,,,,,, +37,129899,,,,,,0.07031822204589844,,,,,, +37,129949,,,,,,0.07383742928504944,,,,,, +37,129999,,,,,,0.073595330119133,,,,,, +37,130049,,,,,,0.07669930905103683,,,,,, +37,130099,,,,,,0.08138415217399597,,,,,, +37,130149,,,,,,0.07021733373403549,,,,,, +37,130199,,,,,,0.06524764746427536,,,,,, +37,130249,,,,,,0.07212561368942261,,,,,, +37,130299,,,,,,0.06960898637771606,,,,,, +37,130349,,,,,,0.07011324167251587,,,,,, +37,130399,,,,,,0.07136023044586182,,,,,, +37,130449,,,,,,0.07414547353982925,,,,,, +37,130499,,,,,,0.06836630403995514,,,,,, +37,130549,,,,,,0.06662197411060333,,,,,, +37,130599,,,,,,0.07294991612434387,,,,,, +37,130649,,,,,,0.06995007395744324,,,,,, +37,130699,,,,,,0.06930439174175262,,,,,, +37,130749,,,,,,0.06300827115774155,,,,,, +37,130799,,,,,,0.07295607030391693,,,,,, +37,130849,,,,,,0.0718487799167633,,,,,, +37,130871,,,,,,,0.23923122882843018,0.07817989587783813,0.2412482500076294,0.05423593521118164,0.2069428563117981,0.07817989587783813 +37,130871,0.22529858350753784,0.07109647989273071,0.3800850808620453,0.14444953203201294,0.356949120759964,,,,,,, +38,130899,,,,,,0.06446082890033722,,,,,, +38,130949,,,,,,0.07366713881492615,,,,,, +38,130999,,,,,,0.07053971290588379,,,,,, +38,131049,,,,,,0.06461106240749359,,,,,, +38,131099,,,,,,0.07675982266664505,,,,,, +38,131149,,,,,,0.06469379365444183,,,,,, +38,131199,,,,,,0.06629355251789093,,,,,, +38,131249,,,,,,0.08064571022987366,,,,,, +38,131299,,,,,,0.07615365087985992,,,,,, +38,131349,,,,,,0.07333911955356598,,,,,, +38,131399,,,,,,0.07151859998703003,,,,,, +38,131449,,,,,,0.07222546637058258,,,,,, +38,131499,,,,,,0.08023840188980103,,,,,, +38,131549,,,,,,0.063514843583107,,,,,, +38,131599,,,,,,0.07494626194238663,,,,,, +38,131649,,,,,,0.07472807168960571,,,,,, +38,131699,,,,,,0.07765913754701614,,,,,, +38,131749,,,,,,0.05633888021111488,,,,,, +38,131799,,,,,,0.06334643065929413,,,,,, +38,131849,,,,,,0.08184187859296799,,,,,, +38,131899,,,,,,0.07331117987632751,,,,,, +38,131949,,,,,,0.08855810761451721,,,,,, +38,131999,,,,,,0.07184730470180511,,,,,, +38,132049,,,,,,0.07019230723381042,,,,,, +38,132099,,,,,,0.060432955622673035,,,,,, +38,132149,,,,,,0.06785592436790466,,,,,, +38,132199,,,,,,0.08153688907623291,,,,,, +38,132249,,,,,,0.05915841460227966,,,,,, +38,132299,,,,,,0.06087706983089447,,,,,, +38,132349,,,,,,0.0628533884882927,,,,,, +38,132399,,,,,,0.0743294507265091,,,,,, +38,132449,,,,,,0.06253035366535187,,,,,, +38,132499,,,,,,0.05800327658653259,,,,,, +38,132549,,,,,,0.07320014387369156,,,,,, +38,132599,,,,,,0.07052190601825714,,,,,, +38,132649,,,,,,0.0694018006324768,,,,,, +38,132699,,,,,,0.06909749656915665,,,,,, +38,132749,,,,,,0.07127028703689575,,,,,, +38,132799,,,,,,0.07184009999036789,,,,,, +38,132849,,,,,,0.07241567969322205,,,,,, +38,132899,,,,,,0.07098326086997986,,,,,, +38,132949,,,,,,0.07556130737066269,,,,,, +38,132999,,,,,,0.06961888819932938,,,,,, +38,133049,,,,,,0.062290310859680176,,,,,, +38,133099,,,,,,0.07404933869838715,,,,,, +38,133149,,,,,,0.06335421651601791,,,,,, +38,133199,,,,,,0.0680021122097969,,,,,, +38,133249,,,,,,0.08175894618034363,,,,,, +38,133299,,,,,,0.06838369369506836,,,,,, +38,133349,,,,,,0.061172083020210266,,,,,, +38,133399,,,,,,0.07013943791389465,,,,,, +38,133449,,,,,,0.071576327085495,,,,,, +38,133499,,,,,,0.07161484658718109,,,,,, +38,133549,,,,,,0.06624799221754074,,,,,, +38,133599,,,,,,0.0692855566740036,,,,,, +38,133649,,,,,,0.08536139875650406,,,,,, +38,133699,,,,,,0.07015829533338547,,,,,, +38,133749,,,,,,0.06316210329532623,,,,,, +38,133799,,,,,,0.07485739886760712,,,,,, +38,133849,,,,,,0.06569730490446091,,,,,, +38,133899,,,,,,0.07410374283790588,,,,,, +38,133949,,,,,,0.07431621104478836,,,,,, +38,133999,,,,,,0.06650508940219879,,,,,, +38,134049,,,,,,0.07087741792201996,,,,,, +38,134099,,,,,,0.08323870599269867,,,,,, +38,134149,,,,,,0.07255148887634277,,,,,, +38,134199,,,,,,0.06800703704357147,,,,,, +38,134249,,,,,,0.07642432302236557,,,,,, +38,134299,,,,,,0.08043131232261658,,,,,, +38,134315,,,,,,,0.23908624053001404,0.07800375670194626,0.24352425336837769,0.056366682052612305,0.21078532934188843,0.07800375670194626 +38,134315,0.22494018077850342,0.07086808234453201,0.38366857171058655,0.14719372987747192,0.3602779805660248,,,,,,, +39,134349,,,,,,0.06430888175964355,,,,,, +39,134399,,,,,,0.07124707102775574,,,,,, +39,134449,,,,,,0.08064744621515274,,,,,, +39,134499,,,,,,0.07515104860067368,,,,,, +39,134549,,,,,,0.06882098317146301,,,,,, +39,134599,,,,,,0.07292522490024567,,,,,, +39,134649,,,,,,0.07013224810361862,,,,,, +39,134699,,,,,,0.0823097676038742,,,,,, +39,134749,,,,,,0.05878070741891861,,,,,, +39,134799,,,,,,0.07267701625823975,,,,,, +39,134849,,,,,,0.07480727881193161,,,,,, +39,134899,,,,,,0.08190003782510757,,,,,, +39,134949,,,,,,0.07065601646900177,,,,,, +39,134999,,,,,,0.06789109110832214,,,,,, +39,135049,,,,,,0.07893244922161102,,,,,, +39,135099,,,,,,0.07492233067750931,,,,,, +39,135149,,,,,,0.06812092661857605,,,,,, +39,135199,,,,,,0.06792531907558441,,,,,, +39,135249,,,,,,0.07559183984994888,,,,,, +39,135299,,,,,,0.06983373314142227,,,,,, +39,135349,,,,,,0.07462228089570999,,,,,, +39,135399,,,,,,0.07590551674365997,,,,,, +39,135449,,,,,,0.067265585064888,,,,,, +39,135499,,,,,,0.07614908367395401,,,,,, +39,135549,,,,,,0.07118812948465347,,,,,, +39,135599,,,,,,0.07113900780677795,,,,,, +39,135649,,,,,,0.07021468877792358,,,,,, +39,135699,,,,,,0.06574790179729462,,,,,, +39,135749,,,,,,0.06469680368900299,,,,,, +39,135799,,,,,,0.07330995798110962,,,,,, +39,135849,,,,,,0.07416188716888428,,,,,, +39,135899,,,,,,0.07684636861085892,,,,,, +39,135949,,,,,,0.07751211524009705,,,,,, +39,135999,,,,,,0.0678376704454422,,,,,, +39,136049,,,,,,0.07781033217906952,,,,,, +39,136099,,,,,,0.07660350203514099,,,,,, +39,136149,,,,,,0.07017257064580917,,,,,, +39,136199,,,,,,0.0694270059466362,,,,,, +39,136249,,,,,,0.06965866684913635,,,,,, +39,136299,,,,,,0.0781000554561615,,,,,, +39,136349,,,,,,0.07260852307081223,,,,,, +39,136399,,,,,,0.06117831915616989,,,,,, +39,136449,,,,,,0.071335569024086,,,,,, +39,136499,,,,,,0.06517625600099564,,,,,, +39,136549,,,,,,0.05945904552936554,,,,,, +39,136599,,,,,,0.06015125289559364,,,,,, +39,136649,,,,,,0.06506025046110153,,,,,, +39,136699,,,,,,0.06630636751651764,,,,,, +39,136749,,,,,,0.07603354752063751,,,,,, +39,136799,,,,,,0.08397305011749268,,,,,, +39,136849,,,,,,0.08408810198307037,,,,,, +39,136899,,,,,,0.06927037239074707,,,,,, +39,136949,,,,,,0.07524324953556061,,,,,, +39,136999,,,,,,0.06871484965085983,,,,,, +39,137049,,,,,,0.07717719674110413,,,,,, +39,137099,,,,,,0.06890970468521118,,,,,, +39,137149,,,,,,0.07154540717601776,,,,,, +39,137199,,,,,,0.07655581831932068,,,,,, +39,137249,,,,,,0.06822296977043152,,,,,, +39,137299,,,,,,0.06667602062225342,,,,,, +39,137349,,,,,,0.0807318240404129,,,,,, +39,137399,,,,,,0.07409004867076874,,,,,, +39,137449,,,,,,0.07426376640796661,,,,,, +39,137499,,,,,,0.07378199696540833,,,,,, +39,137549,,,,,,0.07378183305263519,,,,,, +39,137599,,,,,,0.06663572043180466,,,,,, +39,137649,,,,,,0.06829992681741714,,,,,, +39,137699,,,,,,0.07532007992267609,,,,,, +39,137749,,,,,,0.06709638237953186,,,,,, +39,137759,,,,,,,0.23931218683719635,0.0779927596449852,0.24108247458934784,0.05649971961975098,0.2070094347000122,0.0779927596449852 +39,137759,0.22492970526218414,0.07089138776063919,0.38331231474876404,0.14691376686096191,0.3604658842086792,,,,,,, +40,137799,,,,,,0.08003391325473785,,,,,, +40,137849,,,,,,0.07408355921506882,,,,,, +40,137899,,,,,,0.07657042145729065,,,,,, +40,137949,,,,,,0.08531859517097473,,,,,, +40,137999,,,,,,0.06887935101985931,,,,,, +40,138049,,,,,,0.06591293215751648,,,,,, +40,138099,,,,,,0.0778452679514885,,,,,, +40,138149,,,,,,0.06724630296230316,,,,,, +40,138199,,,,,,0.07466048747301102,,,,,, +40,138249,,,,,,0.07402850687503815,,,,,, +40,138299,,,,,,0.06924914568662643,,,,,, +40,138349,,,,,,0.05811753496527672,,,,,, +40,138399,,,,,,0.06404381990432739,,,,,, +40,138449,,,,,,0.07154496014118195,,,,,, +40,138499,,,,,,0.0697925016283989,,,,,, +40,138549,,,,,,0.06911174952983856,,,,,, +40,138599,,,,,,0.08559930324554443,,,,,, +40,138649,,,,,,0.06339733302593231,,,,,, +40,138699,,,,,,0.0724439024925232,,,,,, +40,138749,,,,,,0.06636808812618256,,,,,, +40,138799,,,,,,0.06419135630130768,,,,,, +40,138849,,,,,,0.07551104575395584,,,,,, +40,138899,,,,,,0.08426423370838165,,,,,, +40,138949,,,,,,0.06173418462276459,,,,,, +40,138999,,,,,,0.06915286183357239,,,,,, +40,139049,,,,,,0.06356307864189148,,,,,, +40,139099,,,,,,0.06414936482906342,,,,,, +40,139149,,,,,,0.07881271094083786,,,,,, +40,139199,,,,,,0.06154031306505203,,,,,, +40,139249,,,,,,0.07700446248054504,,,,,, +40,139299,,,,,,0.06371092796325684,,,,,, +40,139349,,,,,,0.07159334421157837,,,,,, +40,139399,,,,,,0.06298886984586716,,,,,, +40,139449,,,,,,0.07199981063604355,,,,,, +40,139499,,,,,,0.07465872913599014,,,,,, +40,139549,,,,,,0.08005119860172272,,,,,, +40,139599,,,,,,0.06949444115161896,,,,,, +40,139649,,,,,,0.05738868564367294,,,,,, +40,139699,,,,,,0.06991453468799591,,,,,, +40,139749,,,,,,0.07066759467124939,,,,,, +40,139799,,,,,,0.06270934641361237,,,,,, +40,139849,,,,,,0.07060889154672623,,,,,, +40,139899,,,,,,0.06548185646533966,,,,,, +40,139949,,,,,,0.07801245152950287,,,,,, +40,139999,,,,,,0.07668246328830719,,,,,, +40,140049,,,,,,0.06718084216117859,,,,,, +40,140099,,,,,,0.06601881980895996,,,,,, +40,140149,,,,,,0.08643242716789246,,,,,, +40,140199,,,,,,0.06792711466550827,,,,,, +40,140249,,,,,,0.0667104721069336,,,,,, +40,140299,,,,,,0.07545933127403259,,,,,, +40,140349,,,,,,0.0659901574254036,,,,,, +40,140399,,,,,,0.07324812561273575,,,,,, +40,140449,,,,,,0.07267260551452637,,,,,, +40,140499,,,,,,0.08101393282413483,,,,,, +40,140549,,,,,,0.0622355192899704,,,,,, +40,140599,,,,,,0.07204544544219971,,,,,, +40,140649,,,,,,0.06698436290025711,,,,,, +40,140699,,,,,,0.07028882950544357,,,,,, +40,140749,,,,,,0.0615060031414032,,,,,, +40,140799,,,,,,0.07351891696453094,,,,,, +40,140849,,,,,,0.06595929712057114,,,,,, +40,140899,,,,,,0.08320122212171555,,,,,, +40,140949,,,,,,0.06192382797598839,,,,,, +40,140999,,,,,,0.07579900324344635,,,,,, +40,141049,,,,,,0.08661875128746033,,,,,, +40,141099,,,,,,0.06486615538597107,,,,,, +40,141149,,,,,,0.06173253804445267,,,,,, +40,141199,,,,,,0.07289071381092072,,,,,, +40,141203,,,,,,,0.2385757714509964,0.07813908159732819,0.24156372249126434,0.0547296404838562,0.207044318318367,0.07813908159732819 +40,141203,0.22463053464889526,0.07068800181150436,0.3864806294441223,0.14936602115631104,0.36335599422454834,,,,,,, +41,141249,,,,,,0.07280508428812027,,,,,, +41,141299,,,,,,0.07704700529575348,,,,,, +41,141349,,,,,,0.0688142478466034,,,,,, +41,141399,,,,,,0.060855261981487274,,,,,, +41,141449,,,,,,0.061208728700876236,,,,,, +41,141499,,,,,,0.06811324506998062,,,,,, +41,141549,,,,,,0.0749652087688446,,,,,, +41,141599,,,,,,0.06138259544968605,,,,,, +41,141649,,,,,,0.07731971144676208,,,,,, +41,141699,,,,,,0.06994454562664032,,,,,, +41,141749,,,,,,0.08124615252017975,,,,,, +41,141799,,,,,,0.07233428955078125,,,,,, +41,141849,,,,,,0.07421081513166428,,,,,, +41,141899,,,,,,0.07704058289527893,,,,,, +41,141949,,,,,,0.06938761472702026,,,,,, +41,141999,,,,,,0.06483068317174911,,,,,, +41,142049,,,,,,0.07738502323627472,,,,,, +41,142099,,,,,,0.06473636627197266,,,,,, +41,142149,,,,,,0.06368283182382584,,,,,, +41,142199,,,,,,0.0662425309419632,,,,,, +41,142249,,,,,,0.06566963344812393,,,,,, +41,142299,,,,,,0.07159142196178436,,,,,, +41,142349,,,,,,0.0761597603559494,,,,,, +41,142399,,,,,,0.07099573314189911,,,,,, +41,142449,,,,,,0.07648680359125137,,,,,, +41,142499,,,,,,0.06904968619346619,,,,,, +41,142549,,,,,,0.06893335282802582,,,,,, +41,142599,,,,,,0.0730440765619278,,,,,, +41,142649,,,,,,0.06282347440719604,,,,,, +41,142699,,,,,,0.07683631032705307,,,,,, +41,142749,,,,,,0.07276397198438644,,,,,, +41,142799,,,,,,0.06217688322067261,,,,,, +41,142849,,,,,,0.05829900503158569,,,,,, +41,142899,,,,,,0.0734521746635437,,,,,, +41,142949,,,,,,0.06950816512107849,,,,,, +41,142999,,,,,,0.07245177030563354,,,,,, +41,143049,,,,,,0.06746318936347961,,,,,, +41,143099,,,,,,0.07309391349554062,,,,,, +41,143149,,,,,,0.06369802355766296,,,,,, +41,143199,,,,,,0.06344539672136307,,,,,, +41,143249,,,,,,0.05036765709519386,,,,,, +41,143299,,,,,,0.06978936493396759,,,,,, +41,143349,,,,,,0.0747370570898056,,,,,, +41,143399,,,,,,0.06689232587814331,,,,,, +41,143449,,,,,,0.08265024423599243,,,,,, +41,143499,,,,,,0.074465811252594,,,,,, +41,143549,,,,,,0.06913566589355469,,,,,, +41,143599,,,,,,0.0700867623090744,,,,,, +41,143649,,,,,,0.07236084342002869,,,,,, +41,143699,,,,,,0.07213115692138672,,,,,, +41,143749,,,,,,0.06815265864133835,,,,,, +41,143799,,,,,,0.07835134863853455,,,,,, +41,143849,,,,,,0.06510554254055023,,,,,, +41,143899,,,,,,0.0649438351392746,,,,,, +41,143949,,,,,,0.06213165819644928,,,,,, +41,143999,,,,,,0.07148369401693344,,,,,, +41,144049,,,,,,0.06489983201026917,,,,,, +41,144099,,,,,,0.07779578864574432,,,,,, +41,144149,,,,,,0.06861225515604019,,,,,, +41,144199,,,,,,0.07294933497905731,,,,,, +41,144249,,,,,,0.07714368402957916,,,,,, +41,144299,,,,,,0.07009938359260559,,,,,, +41,144349,,,,,,0.06591365486383438,,,,,, +41,144399,,,,,,0.0797962173819542,,,,,, +41,144449,,,,,,0.07195989787578583,,,,,, +41,144499,,,,,,0.07063367962837219,,,,,, +41,144549,,,,,,0.06876695156097412,,,,,, +41,144599,,,,,,0.06753711402416229,,,,,, +41,144647,,,,,,,0.23857292532920837,0.07815023511648178,0.24347233772277832,0.05459469556808472,0.21065503358840942,0.07815023511648178 +41,144647,0.22386890649795532,0.07033151388168335,0.39199012517929077,0.15365594625473022,0.36882007122039795,,,,,,, +42,144649,,,,,,0.07661831378936768,,,,,, +42,144699,,,,,,0.0644659623503685,,,,,, +42,144749,,,,,,0.05756445601582527,,,,,, +42,144799,,,,,,0.06660733371973038,,,,,, +42,144849,,,,,,0.0722227394580841,,,,,, +42,144899,,,,,,0.0739130824804306,,,,,, +42,144949,,,,,,0.06811165064573288,,,,,, +42,144999,,,,,,0.07484744489192963,,,,,, +42,145049,,,,,,0.06269682943820953,,,,,, +42,145099,,,,,,0.0675240308046341,,,,,, +42,145149,,,,,,0.0623556450009346,,,,,, +42,145199,,,,,,0.08215957880020142,,,,,, +42,145249,,,,,,0.07061311602592468,,,,,, +42,145299,,,,,,0.07020208239555359,,,,,, +42,145349,,,,,,0.07481659203767776,,,,,, +42,145399,,,,,,0.06300479173660278,,,,,, +42,145449,,,,,,0.09036950021982193,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..dd9ae13b16589005e010676db681cbc9f5e2cdf5 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml @@ -0,0 +1,22 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: sweetnet + num_layers: 16 + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein +seed: 44 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..830f9f8de47c1d03a30de1f6df9fb9eef6fed580 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/metrics.csv @@ -0,0 +1,570 @@ +epoch,step,test/MeanAbsoluteError,test/MeanSquaredError,test/PearsonCorrCoef,test/R2Score,test/SpearmanCorrCoef,test/loss,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +42,144649,,,,,,,,,,,,0.07789413630962372,,,,,, +42,144699,,,,,,,,,,,,0.0669131800532341,,,,,, +42,144749,,,,,,,,,,,,0.06595689058303833,,,,,, +42,144799,,,,,,,,,,,,0.06702025234699249,,,,,, +42,144849,,,,,,,,,,,,0.06771926581859589,,,,,, +42,144899,,,,,,,,,,,,0.07969942688941956,,,,,, +42,144949,,,,,,,,,,,,0.07291611284017563,,,,,, +42,144999,,,,,,,,,,,,0.07639427483081818,,,,,, +42,145049,,,,,,,,,,,,0.06330572813749313,,,,,, +42,145099,,,,,,,,,,,,0.06631417572498322,,,,,, +42,145149,,,,,,,,,,,,0.06766310334205627,,,,,, +42,145199,,,,,,,,,,,,0.07162487506866455,,,,,, +42,145249,,,,,,,,,,,,0.07360754907131195,,,,,, +42,145299,,,,,,,,,,,,0.07348713278770447,,,,,, +42,145349,,,,,,,,,,,,0.07511818408966064,,,,,, +42,145399,,,,,,,,,,,,0.07401011139154434,,,,,, +42,145449,,,,,,,,,,,,0.059556394815444946,,,,,, +42,145499,,,,,,,,,,,,0.06758737564086914,,,,,, +42,145549,,,,,,,,,,,,0.07208320498466492,,,,,, +42,145599,,,,,,,,,,,,0.0707465410232544,,,,,, +42,145649,,,,,,,,,,,,0.06058631092309952,,,,,, +42,145699,,,,,,,,,,,,0.07548906654119492,,,,,, +42,145749,,,,,,,,,,,,0.07210995256900787,,,,,, +42,145799,,,,,,,,,,,,0.07857026159763336,,,,,, +42,145849,,,,,,,,,,,,0.06627155840396881,,,,,, +42,145899,,,,,,,,,,,,0.07059846073389053,,,,,, +42,145949,,,,,,,,,,,,0.078122079372406,,,,,, +42,145999,,,,,,,,,,,,0.06836290657520294,,,,,, +42,146049,,,,,,,,,,,,0.06958754360675812,,,,,, +42,146099,,,,,,,,,,,,0.06736794114112854,,,,,, +42,146149,,,,,,,,,,,,0.07231561094522476,,,,,, +42,146199,,,,,,,,,,,,0.06307356804609299,,,,,, +42,146249,,,,,,,,,,,,0.0671045258641243,,,,,, +42,146299,,,,,,,,,,,,0.07957436144351959,,,,,, +42,146349,,,,,,,,,,,,0.06584811955690384,,,,,, +42,146399,,,,,,,,,,,,0.057889312505722046,,,,,, +42,146449,,,,,,,,,,,,0.07778868079185486,,,,,, +42,146499,,,,,,,,,,,,0.07095737755298615,,,,,, +42,146549,,,,,,,,,,,,0.0813342034816742,,,,,, +42,146599,,,,,,,,,,,,0.06486418098211288,,,,,, +42,146649,,,,,,,,,,,,0.06405819952487946,,,,,, +42,146699,,,,,,,,,,,,0.07236803323030472,,,,,, +42,146749,,,,,,,,,,,,0.06108223646879196,,,,,, +42,146799,,,,,,,,,,,,0.06937826424837112,,,,,, +42,146849,,,,,,,,,,,,0.06075455993413925,,,,,, +42,146899,,,,,,,,,,,,0.06460489332675934,,,,,, +42,146949,,,,,,,,,,,,0.06942395865917206,,,,,, +42,146999,,,,,,,,,,,,0.0592968575656414,,,,,, +42,147049,,,,,,,,,,,,0.060284100472927094,,,,,, +42,147099,,,,,,,,,,,,0.06524328887462616,,,,,, +42,147149,,,,,,,,,,,,0.07475690543651581,,,,,, +42,147199,,,,,,,,,,,,0.07064427435398102,,,,,, +42,147249,,,,,,,,,,,,0.07135237753391266,,,,,, +42,147299,,,,,,,,,,,,0.06788209825754166,,,,,, +42,147349,,,,,,,,,,,,0.06598472595214844,,,,,, +42,147399,,,,,,,,,,,,0.06865546107292175,,,,,, +42,147449,,,,,,,,,,,,0.09025019407272339,,,,,, +42,147499,,,,,,,,,,,,0.07279422879219055,,,,,, +42,147549,,,,,,,,,,,,0.06626743823289871,,,,,, +42,147599,,,,,,,,,,,,0.06792831420898438,,,,,, +42,147649,,,,,,,,,,,,0.0695352852344513,,,,,, +42,147699,,,,,,,,,,,,0.06871864199638367,,,,,, +42,147749,,,,,,,,,,,,0.0746111199259758,,,,,, +42,147799,,,,,,,,,,,,0.06452082842588425,,,,,, +42,147849,,,,,,,,,,,,0.07126639038324356,,,,,, +42,147899,,,,,,,,,,,,0.07388570159673691,,,,,, +42,147949,,,,,,,,,,,,0.07618536055088043,,,,,, +42,147999,,,,,,,,,,,,0.07220476120710373,,,,,, +42,148049,,,,,,,,,,,,0.08067089319229126,,,,,, +42,148091,,,,,,,,,,,,,0.23853659629821777,0.07802838832139969,0.24269118905067444,0.05606871843338013,0.2086399644613266,0.07802838832139969 +42,148091,,,,,,,0.2231540083885193,0.0699649527668953,0.39757463335990906,0.1580694317817688,0.37446433305740356,,,,,,, +43,148099,,,,,,,,,,,,0.07453406602144241,,,,,, +43,148149,,,,,,,,,,,,0.06222590059041977,,,,,, +43,148199,,,,,,,,,,,,0.07407178729772568,,,,,, +43,148249,,,,,,,,,,,,0.08354280143976212,,,,,, +43,148299,,,,,,,,,,,,0.07313724607229233,,,,,, +43,148349,,,,,,,,,,,,0.06877899914979935,,,,,, +43,148399,,,,,,,,,,,,0.08033964037895203,,,,,, +43,148449,,,,,,,,,,,,0.07104585319757462,,,,,, +43,148499,,,,,,,,,,,,0.07493214309215546,,,,,, +43,148549,,,,,,,,,,,,0.07479274272918701,,,,,, +43,148599,,,,,,,,,,,,0.06259310245513916,,,,,, +43,148649,,,,,,,,,,,,0.0633435919880867,,,,,, +43,148699,,,,,,,,,,,,0.07502175867557526,,,,,, +43,148749,,,,,,,,,,,,0.0676458328962326,,,,,, +43,148799,,,,,,,,,,,,0.06652814149856567,,,,,, +43,148849,,,,,,,,,,,,0.07100165635347366,,,,,, +43,148899,,,,,,,,,,,,0.051001422107219696,,,,,, +43,148949,,,,,,,,,,,,0.0691758394241333,,,,,, +43,148999,,,,,,,,,,,,0.0700593888759613,,,,,, +43,149049,,,,,,,,,,,,0.06892881542444229,,,,,, +43,149099,,,,,,,,,,,,0.06701479852199554,,,,,, +43,149149,,,,,,,,,,,,0.07611537724733353,,,,,, +43,149199,,,,,,,,,,,,0.06995423883199692,,,,,, +43,149249,,,,,,,,,,,,0.07893931865692139,,,,,, +43,149299,,,,,,,,,,,,0.06939146667718887,,,,,, +43,149349,,,,,,,,,,,,0.06558581441640854,,,,,, +43,149399,,,,,,,,,,,,0.06924720108509064,,,,,, +43,149449,,,,,,,,,,,,0.07077567279338837,,,,,, +43,149499,,,,,,,,,,,,0.06661517173051834,,,,,, +43,149549,,,,,,,,,,,,0.07213836908340454,,,,,, +43,149599,,,,,,,,,,,,0.07125476002693176,,,,,, +43,149649,,,,,,,,,,,,0.07221463322639465,,,,,, +43,149699,,,,,,,,,,,,0.06744202226400375,,,,,, +43,149749,,,,,,,,,,,,0.08371540904045105,,,,,, +43,149799,,,,,,,,,,,,0.07388071715831757,,,,,, +43,149849,,,,,,,,,,,,0.06748120486736298,,,,,, +43,149899,,,,,,,,,,,,0.06686072796583176,,,,,, +43,149949,,,,,,,,,,,,0.06121158227324486,,,,,, +43,149999,,,,,,,,,,,,0.07646164298057556,,,,,, +43,150049,,,,,,,,,,,,0.0730089545249939,,,,,, +43,150099,,,,,,,,,,,,0.06363983452320099,,,,,, +43,150149,,,,,,,,,,,,0.07530557364225388,,,,,, +43,150199,,,,,,,,,,,,0.06333142518997192,,,,,, +43,150249,,,,,,,,,,,,0.06821794807910919,,,,,, +43,150299,,,,,,,,,,,,0.06114901229739189,,,,,, +43,150349,,,,,,,,,,,,0.0635840892791748,,,,,, +43,150399,,,,,,,,,,,,0.06324230879545212,,,,,, +43,150449,,,,,,,,,,,,0.0716947466135025,,,,,, +43,150499,,,,,,,,,,,,0.05811983719468117,,,,,, +43,150549,,,,,,,,,,,,0.07513698190450668,,,,,, +43,150599,,,,,,,,,,,,0.06061803922057152,,,,,, +43,150649,,,,,,,,,,,,0.07012269645929337,,,,,, +43,150699,,,,,,,,,,,,0.0554395355284214,,,,,, +43,150749,,,,,,,,,,,,0.0715792179107666,,,,,, +43,150799,,,,,,,,,,,,0.06849741190671921,,,,,, +43,150849,,,,,,,,,,,,0.0783969983458519,,,,,, +43,150899,,,,,,,,,,,,0.06915131211280823,,,,,, +43,150949,,,,,,,,,,,,0.06677868217229843,,,,,, +43,150999,,,,,,,,,,,,0.07408691942691803,,,,,, +43,151049,,,,,,,,,,,,0.06445877254009247,,,,,, +43,151099,,,,,,,,,,,,0.05649936944246292,,,,,, +43,151149,,,,,,,,,,,,0.07002116739749908,,,,,, +43,151199,,,,,,,,,,,,0.0737634152173996,,,,,, +43,151249,,,,,,,,,,,,0.0807768851518631,,,,,, +43,151299,,,,,,,,,,,,0.06587592512369156,,,,,, +43,151349,,,,,,,,,,,,0.07589997351169586,,,,,, +43,151399,,,,,,,,,,,,0.06504207104444504,,,,,, +43,151449,,,,,,,,,,,,0.06010114401578903,,,,,, +43,151499,,,,,,,,,,,,0.06487668305635452,,,,,, +43,151535,,,,,,,,,,,,,0.23866067826747894,0.07840747386217117,0.24154676496982574,0.05148285627365112,0.20796293020248413,0.07840747386217117 +43,151535,,,,,,,0.222955122590065,0.06987126916646957,0.3989916145801544,0.15919381380081177,0.37581607699394226,,,,,,, +44,151549,,,,,,,,,,,,0.07110470533370972,,,,,, +44,151599,,,,,,,,,,,,0.07466769218444824,,,,,, +44,151649,,,,,,,,,,,,0.06572408974170685,,,,,, +44,151699,,,,,,,,,,,,0.06614413857460022,,,,,, +44,151749,,,,,,,,,,,,0.06469150632619858,,,,,, +44,151799,,,,,,,,,,,,0.06856201589107513,,,,,, +44,151849,,,,,,,,,,,,0.07299080491065979,,,,,, +44,151899,,,,,,,,,,,,0.07887472212314606,,,,,, +44,151949,,,,,,,,,,,,0.06833741813898087,,,,,, +44,151999,,,,,,,,,,,,0.055915504693984985,,,,,, +44,152049,,,,,,,,,,,,0.07676587998867035,,,,,, +44,152099,,,,,,,,,,,,0.06818512827157974,,,,,, +44,152149,,,,,,,,,,,,0.05806605517864227,,,,,, +44,152199,,,,,,,,,,,,0.05120905861258507,,,,,, +44,152249,,,,,,,,,,,,0.06694594770669937,,,,,, +44,152299,,,,,,,,,,,,0.06400389969348907,,,,,, +44,152349,,,,,,,,,,,,0.07793538272380829,,,,,, +44,152399,,,,,,,,,,,,0.06938869506120682,,,,,, +44,152449,,,,,,,,,,,,0.08634631335735321,,,,,, +44,152499,,,,,,,,,,,,0.07109220325946808,,,,,, +44,152549,,,,,,,,,,,,0.058738693594932556,,,,,, +44,152599,,,,,,,,,,,,0.06614147871732712,,,,,, +44,152649,,,,,,,,,,,,0.07842199504375458,,,,,, +44,152699,,,,,,,,,,,,0.06163393706083298,,,,,, +44,152749,,,,,,,,,,,,0.060309600085020065,,,,,, +44,152799,,,,,,,,,,,,0.0665971040725708,,,,,, +44,152849,,,,,,,,,,,,0.06450369209051132,,,,,, +44,152899,,,,,,,,,,,,0.08237507939338684,,,,,, +44,152949,,,,,,,,,,,,0.07249368727207184,,,,,, +44,152999,,,,,,,,,,,,0.06516599655151367,,,,,, +44,153049,,,,,,,,,,,,0.05948997288942337,,,,,, +44,153099,,,,,,,,,,,,0.06347072124481201,,,,,, +44,153149,,,,,,,,,,,,0.07084134221076965,,,,,, +44,153199,,,,,,,,,,,,0.06783229112625122,,,,,, +44,153249,,,,,,,,,,,,0.06678031384944916,,,,,, +44,153299,,,,,,,,,,,,0.07008814811706543,,,,,, +44,153349,,,,,,,,,,,,0.05848780646920204,,,,,, +44,153399,,,,,,,,,,,,0.07210306078195572,,,,,, +44,153449,,,,,,,,,,,,0.08482960611581802,,,,,, +44,153499,,,,,,,,,,,,0.06460658460855484,,,,,, +44,153549,,,,,,,,,,,,0.0748649388551712,,,,,, +44,153599,,,,,,,,,,,,0.062394991517066956,,,,,, +44,153649,,,,,,,,,,,,0.06806504726409912,,,,,, +44,153699,,,,,,,,,,,,0.07590293884277344,,,,,, +44,153749,,,,,,,,,,,,0.07598920911550522,,,,,, +44,153799,,,,,,,,,,,,0.06850235909223557,,,,,, +44,153849,,,,,,,,,,,,0.08080185949802399,,,,,, +44,153899,,,,,,,,,,,,0.07050330936908722,,,,,, +44,153949,,,,,,,,,,,,0.11257661879062653,,,,,, +44,153999,,,,,,,,,,,,0.06670054793357849,,,,,, +44,154049,,,,,,,,,,,,0.07493136823177338,,,,,, +44,154099,,,,,,,,,,,,0.07321742177009583,,,,,, +44,154149,,,,,,,,,,,,0.0723424181342125,,,,,, +44,154199,,,,,,,,,,,,0.06270162761211395,,,,,, +44,154249,,,,,,,,,,,,0.06977425515651703,,,,,, +44,154299,,,,,,,,,,,,0.0714939683675766,,,,,, +44,154349,,,,,,,,,,,,0.06527519226074219,,,,,, +44,154399,,,,,,,,,,,,0.076606385409832,,,,,, +44,154449,,,,,,,,,,,,0.07898584008216858,,,,,, +44,154499,,,,,,,,,,,,0.07634018361568451,,,,,, +44,154549,,,,,,,,,,,,0.07644282281398773,,,,,, +44,154599,,,,,,,,,,,,0.08405442535877228,,,,,, +44,154649,,,,,,,,,,,,0.05885045602917671,,,,,, +44,154699,,,,,,,,,,,,0.06583032011985779,,,,,, +44,154749,,,,,,,,,,,,0.07263946533203125,,,,,, +44,154799,,,,,,,,,,,,0.07713387906551361,,,,,, +44,154849,,,,,,,,,,,,0.06990030407905579,,,,,, +44,154899,,,,,,,,,,,,0.05920874699950218,,,,,, +44,154949,,,,,,,,,,,,0.06880486011505127,,,,,, +44,154979,,,,,,,,,,,,,0.23857282102108002,0.0781843364238739,0.24142397940158844,0.05418217182159424,0.20656664669513702,0.0781843364238739 +44,154979,,,,,,,0.223055899143219,0.06992148607969284,0.39823436737060547,0.1585928201675415,0.37533169984817505,,,,,,, +45,154999,,,,,,,,,,,,0.06315787881612778,,,,,, +45,155049,,,,,,,,,,,,0.08127062022686005,,,,,, +45,155099,,,,,,,,,,,,0.07867354899644852,,,,,, +45,155149,,,,,,,,,,,,0.06931084394454956,,,,,, +45,155199,,,,,,,,,,,,0.06381892412900925,,,,,, +45,155249,,,,,,,,,,,,0.06859660148620605,,,,,, +45,155299,,,,,,,,,,,,0.07128764688968658,,,,,, +45,155349,,,,,,,,,,,,0.07697823643684387,,,,,, +45,155399,,,,,,,,,,,,0.07603435218334198,,,,,, +45,155449,,,,,,,,,,,,0.08536898344755173,,,,,, +45,155499,,,,,,,,,,,,0.0789741650223732,,,,,, +45,155549,,,,,,,,,,,,0.08068914711475372,,,,,, +45,155599,,,,,,,,,,,,0.07055895775556564,,,,,, +45,155649,,,,,,,,,,,,0.06414014846086502,,,,,, +45,155699,,,,,,,,,,,,0.061568375676870346,,,,,, +45,155749,,,,,,,,,,,,0.07118435949087143,,,,,, +45,155799,,,,,,,,,,,,0.0671929121017456,,,,,, +45,155849,,,,,,,,,,,,0.07832228392362595,,,,,, +45,155899,,,,,,,,,,,,0.062255170196294785,,,,,, +45,155949,,,,,,,,,,,,0.06499790400266647,,,,,, +45,155999,,,,,,,,,,,,0.07450778782367706,,,,,, +45,156049,,,,,,,,,,,,0.06406137347221375,,,,,, +45,156099,,,,,,,,,,,,0.06505373865365982,,,,,, +45,156149,,,,,,,,,,,,0.07961989939212799,,,,,, +45,156199,,,,,,,,,,,,0.0715247243642807,,,,,, +45,156249,,,,,,,,,,,,0.06844469159841537,,,,,, +45,156299,,,,,,,,,,,,0.07019549608230591,,,,,, +45,156349,,,,,,,,,,,,0.07241169363260269,,,,,, +45,156399,,,,,,,,,,,,0.0768871083855629,,,,,, +45,156449,,,,,,,,,,,,0.06723199784755707,,,,,, +45,156499,,,,,,,,,,,,0.05529482662677765,,,,,, +45,156549,,,,,,,,,,,,0.052262015640735626,,,,,, +45,156599,,,,,,,,,,,,0.08183789253234863,,,,,, +45,156649,,,,,,,,,,,,0.06719837337732315,,,,,, +45,156699,,,,,,,,,,,,0.07193896919488907,,,,,, +45,156749,,,,,,,,,,,,0.06303469091653824,,,,,, +45,156799,,,,,,,,,,,,0.06448488682508469,,,,,, +45,156849,,,,,,,,,,,,0.07429153472185135,,,,,, +45,156899,,,,,,,,,,,,0.06494394689798355,,,,,, +45,156949,,,,,,,,,,,,0.08026107400655746,,,,,, +45,156999,,,,,,,,,,,,0.06147491931915283,,,,,, +45,157049,,,,,,,,,,,,0.05935295671224594,,,,,, +45,157099,,,,,,,,,,,,0.07218073308467865,,,,,, +45,157149,,,,,,,,,,,,0.062400560826063156,,,,,, +45,157199,,,,,,,,,,,,0.06610260158777237,,,,,, +45,157249,,,,,,,,,,,,0.07576765865087509,,,,,, +45,157299,,,,,,,,,,,,0.06995512545108795,,,,,, +45,157349,,,,,,,,,,,,0.07189428806304932,,,,,, +45,157399,,,,,,,,,,,,0.06299495697021484,,,,,, +45,157449,,,,,,,,,,,,0.07356621325016022,,,,,, +45,157499,,,,,,,,,,,,0.07481373846530914,,,,,, +45,157549,,,,,,,,,,,,0.07396875321865082,,,,,, +45,157599,,,,,,,,,,,,0.06313540786504745,,,,,, +45,157649,,,,,,,,,,,,0.06478320062160492,,,,,, +45,157699,,,,,,,,,,,,0.08284452557563782,,,,,, +45,157749,,,,,,,,,,,,0.06514130532741547,,,,,, +45,157799,,,,,,,,,,,,0.0786811113357544,,,,,, +45,157849,,,,,,,,,,,,0.06810267269611359,,,,,, +45,157899,,,,,,,,,,,,0.07962164282798767,,,,,, +45,157949,,,,,,,,,,,,0.0691695287823677,,,,,, +45,157999,,,,,,,,,,,,0.06374049186706543,,,,,, +45,158049,,,,,,,,,,,,0.0670601949095726,,,,,, +45,158099,,,,,,,,,,,,0.07280054688453674,,,,,, +45,158149,,,,,,,,,,,,0.06335119903087616,,,,,, +45,158199,,,,,,,,,,,,0.06865307688713074,,,,,, +45,158249,,,,,,,,,,,,0.06763431429862976,,,,,, +45,158299,,,,,,,,,,,,0.06124444305896759,,,,,, +45,158349,,,,,,,,,,,,0.07818402349948883,,,,,, +45,158399,,,,,,,,,,,,0.06674928963184357,,,,,, +45,158423,,,,,,,,,,,,,0.2397257536649704,0.07851515710353851,0.2404673546552658,0.050180137157440186,0.2076929658651352,0.07851515710353851 +45,158423,,,,,,,0.22287464141845703,0.06996294111013412,0.3976447284221649,0.15808391571044922,0.37614160776138306,,,,,,, +46,158449,,,,,,,,,,,,0.06830749660730362,,,,,, +46,158499,,,,,,,,,,,,0.06237366795539856,,,,,, +46,158549,,,,,,,,,,,,0.06512804329395294,,,,,, +46,158599,,,,,,,,,,,,0.0897388756275177,,,,,, +46,158649,,,,,,,,,,,,0.06455649435520172,,,,,, +46,158699,,,,,,,,,,,,0.08046092838048935,,,,,, +46,158749,,,,,,,,,,,,0.06793554127216339,,,,,, +46,158799,,,,,,,,,,,,0.07109691202640533,,,,,, +46,158849,,,,,,,,,,,,0.07087160646915436,,,,,, +46,158899,,,,,,,,,,,,0.08319809287786484,,,,,, +46,158949,,,,,,,,,,,,0.0536513552069664,,,,,, +46,158999,,,,,,,,,,,,0.0710543543100357,,,,,, +46,159049,,,,,,,,,,,,0.05910013988614082,,,,,, +46,159099,,,,,,,,,,,,0.06876921653747559,,,,,, +46,159149,,,,,,,,,,,,0.06586253643035889,,,,,, +46,159199,,,,,,,,,,,,0.07325226068496704,,,,,, +46,159249,,,,,,,,,,,,0.07543987780809402,,,,,, +46,159299,,,,,,,,,,,,0.06771129369735718,,,,,, +46,159349,,,,,,,,,,,,0.07547161728143692,,,,,, +46,159399,,,,,,,,,,,,0.07409507781267166,,,,,, +46,159449,,,,,,,,,,,,0.06792014837265015,,,,,, +46,159499,,,,,,,,,,,,0.06447505950927734,,,,,, +46,159549,,,,,,,,,,,,0.07519082725048065,,,,,, +46,159599,,,,,,,,,,,,0.06916248798370361,,,,,, +46,159649,,,,,,,,,,,,0.07636405527591705,,,,,, +46,159699,,,,,,,,,,,,0.06488017737865448,,,,,, +46,159749,,,,,,,,,,,,0.07192745804786682,,,,,, +46,159799,,,,,,,,,,,,0.08147858083248138,,,,,, +46,159849,,,,,,,,,,,,0.06685948371887207,,,,,, +46,159899,,,,,,,,,,,,0.08528999984264374,,,,,, +46,159949,,,,,,,,,,,,0.06782928109169006,,,,,, +46,159999,,,,,,,,,,,,0.06969955563545227,,,,,, +46,160049,,,,,,,,,,,,0.0687771737575531,,,,,, +46,160099,,,,,,,,,,,,0.06747181713581085,,,,,, +46,160149,,,,,,,,,,,,0.07126869261264801,,,,,, +46,160199,,,,,,,,,,,,0.0690310150384903,,,,,, +46,160249,,,,,,,,,,,,0.06446096301078796,,,,,, +46,160299,,,,,,,,,,,,0.06662370264530182,,,,,, +46,160349,,,,,,,,,,,,0.06573733687400818,,,,,, +46,160399,,,,,,,,,,,,0.07861040532588959,,,,,, +46,160449,,,,,,,,,,,,0.07774904370307922,,,,,, +46,160499,,,,,,,,,,,,0.06950759887695312,,,,,, +46,160549,,,,,,,,,,,,0.07367879152297974,,,,,, +46,160599,,,,,,,,,,,,0.07555011659860611,,,,,, +46,160649,,,,,,,,,,,,0.08106769621372223,,,,,, +46,160699,,,,,,,,,,,,0.06860516965389252,,,,,, +46,160749,,,,,,,,,,,,0.06780414283275604,,,,,, +46,160799,,,,,,,,,,,,0.06688135862350464,,,,,, +46,160849,,,,,,,,,,,,0.07432106882333755,,,,,, +46,160899,,,,,,,,,,,,0.07007598131895065,,,,,, +46,160949,,,,,,,,,,,,0.06439494341611862,,,,,, +46,160999,,,,,,,,,,,,0.06919852644205093,,,,,, +46,161049,,,,,,,,,,,,0.052122563123703,,,,,, +46,161099,,,,,,,,,,,,0.07069131731987,,,,,, +46,161149,,,,,,,,,,,,0.056872155517339706,,,,,, +46,161199,,,,,,,,,,,,0.06743377447128296,,,,,, +46,161249,,,,,,,,,,,,0.07160431146621704,,,,,, +46,161299,,,,,,,,,,,,0.06472717970609665,,,,,, +46,161349,,,,,,,,,,,,0.07799745351076126,,,,,, +46,161399,,,,,,,,,,,,0.0696110725402832,,,,,, +46,161449,,,,,,,,,,,,0.06820724159479141,,,,,, +46,161499,,,,,,,,,,,,0.071966752409935,,,,,, +46,161549,,,,,,,,,,,,0.08262883126735687,,,,,, +46,161599,,,,,,,,,,,,0.07435847818851471,,,,,, +46,161649,,,,,,,,,,,,0.07766624540090561,,,,,, +46,161699,,,,,,,,,,,,0.07115834951400757,,,,,, +46,161749,,,,,,,,,,,,0.0723877102136612,,,,,, +46,161799,,,,,,,,,,,,0.07720842957496643,,,,,, +46,161849,,,,,,,,,,,,0.0645095705986023,,,,,, +46,161867,,,,,,,,,,,,,0.23866236209869385,0.07815399765968323,0.2443782389163971,0.054549217224121094,0.21013858914375305,0.07815399765968323 +46,161867,,,,,,,0.22276151180267334,0.06974667310714722,0.40086379647254944,0.16069388389587402,0.37820249795913696,,,,,,, +47,161899,,,,,,,,,,,,0.07060110569000244,,,,,, +47,161949,,,,,,,,,,,,0.06006535142660141,,,,,, +47,161999,,,,,,,,,,,,0.06762170046567917,,,,,, +47,162049,,,,,,,,,,,,0.0783938467502594,,,,,, +47,162099,,,,,,,,,,,,0.07409322261810303,,,,,, +47,162149,,,,,,,,,,,,0.07849324494600296,,,,,, +47,162199,,,,,,,,,,,,0.07377743721008301,,,,,, +47,162249,,,,,,,,,,,,0.06200474500656128,,,,,, +47,162299,,,,,,,,,,,,0.08041433244943619,,,,,, +47,162349,,,,,,,,,,,,0.06637829542160034,,,,,, +47,162399,,,,,,,,,,,,0.060538701713085175,,,,,, +47,162449,,,,,,,,,,,,0.0643138661980629,,,,,, +47,162499,,,,,,,,,,,,0.06663644313812256,,,,,, +47,162549,,,,,,,,,,,,0.06273786723613739,,,,,, +47,162599,,,,,,,,,,,,0.06788915395736694,,,,,, +47,162649,,,,,,,,,,,,0.07344457507133484,,,,,, +47,162699,,,,,,,,,,,,0.07695059478282928,,,,,, +47,162749,,,,,,,,,,,,0.06924508512020111,,,,,, +47,162799,,,,,,,,,,,,0.06532850861549377,,,,,, +47,162849,,,,,,,,,,,,0.06282660365104675,,,,,, +47,162899,,,,,,,,,,,,0.0663880854845047,,,,,, +47,162949,,,,,,,,,,,,0.06116624176502228,,,,,, +47,162999,,,,,,,,,,,,0.06968894600868225,,,,,, +47,163049,,,,,,,,,,,,0.06468932330608368,,,,,, +47,163099,,,,,,,,,,,,0.05950106680393219,,,,,, +47,163149,,,,,,,,,,,,0.07172441482543945,,,,,, +47,163199,,,,,,,,,,,,0.06753337383270264,,,,,, +47,163249,,,,,,,,,,,,0.0675734356045723,,,,,, +47,163299,,,,,,,,,,,,0.0635126456618309,,,,,, +47,163349,,,,,,,,,,,,0.07083384692668915,,,,,, +47,163399,,,,,,,,,,,,0.07630012929439545,,,,,, +47,163449,,,,,,,,,,,,0.07389377802610397,,,,,, +47,163499,,,,,,,,,,,,0.08080942928791046,,,,,, +47,163549,,,,,,,,,,,,0.0704803392291069,,,,,, +47,163599,,,,,,,,,,,,0.07545734941959381,,,,,, +47,163649,,,,,,,,,,,,0.06233148276805878,,,,,, +47,163699,,,,,,,,,,,,0.07545562088489532,,,,,, +47,163749,,,,,,,,,,,,0.06435614824295044,,,,,, +47,163799,,,,,,,,,,,,0.07068896293640137,,,,,, +47,163849,,,,,,,,,,,,0.06573712080717087,,,,,, +47,163899,,,,,,,,,,,,0.06729017198085785,,,,,, +47,163949,,,,,,,,,,,,0.06653834134340286,,,,,, +47,163999,,,,,,,,,,,,0.06420978903770447,,,,,, +47,164049,,,,,,,,,,,,0.06707949936389923,,,,,, +47,164099,,,,,,,,,,,,0.07344710826873779,,,,,, +47,164149,,,,,,,,,,,,0.06772753596305847,,,,,, +47,164199,,,,,,,,,,,,0.06360858678817749,,,,,, +47,164249,,,,,,,,,,,,0.06530654430389404,,,,,, +47,164299,,,,,,,,,,,,0.07834760844707489,,,,,, +47,164349,,,,,,,,,,,,0.06790617108345032,,,,,, +47,164399,,,,,,,,,,,,0.0705014169216156,,,,,, +47,164449,,,,,,,,,,,,0.06769272685050964,,,,,, +47,164499,,,,,,,,,,,,0.07548962533473969,,,,,, +47,164549,,,,,,,,,,,,0.07318044453859329,,,,,, +47,164599,,,,,,,,,,,,0.0653667151927948,,,,,, +47,164649,,,,,,,,,,,,0.06496500968933105,,,,,, +47,164699,,,,,,,,,,,,0.06403586268424988,,,,,, +47,164749,,,,,,,,,,,,0.07008497416973114,,,,,, +47,164799,,,,,,,,,,,,0.07072973996400833,,,,,, +47,164849,,,,,,,,,,,,0.07216410338878632,,,,,, +47,164899,,,,,,,,,,,,0.07801459729671478,,,,,, +47,164949,,,,,,,,,,,,0.06895497441291809,,,,,, +47,164999,,,,,,,,,,,,0.06538362056016922,,,,,, +47,165049,,,,,,,,,,,,0.06770474463701248,,,,,, +47,165099,,,,,,,,,,,,0.07875210046768188,,,,,, +47,165149,,,,,,,,,,,,0.07992769777774811,,,,,, +47,165199,,,,,,,,,,,,0.06842663884162903,,,,,, +47,165249,,,,,,,,,,,,0.06364179402589798,,,,,, +47,165299,,,,,,,,,,,,0.06857669353485107,,,,,, +47,165311,,,,,,,,,,,,,0.23903173208236694,0.0781395435333252,0.23877915740013123,0.05472409725189209,0.2060326188802719,0.0781395435333252 +47,165311,,,,,,,0.22314299643039703,0.07000213116407394,0.3970208168029785,0.1576160192489624,0.37465494871139526,,,,,,, +48,165349,,,,,,,,,,,,0.07232934236526489,,,,,, +48,165399,,,,,,,,,,,,0.07914988696575165,,,,,, +48,165449,,,,,,,,,,,,0.07068616151809692,,,,,, +48,165499,,,,,,,,,,,,0.07251134514808655,,,,,, +48,165549,,,,,,,,,,,,0.07587514817714691,,,,,, +48,165599,,,,,,,,,,,,0.06504778563976288,,,,,, +48,165649,,,,,,,,,,,,0.07791405916213989,,,,,, +48,165699,,,,,,,,,,,,0.06648704409599304,,,,,, +48,165749,,,,,,,,,,,,0.07039078325033188,,,,,, +48,165799,,,,,,,,,,,,0.06672599166631699,,,,,, +48,165849,,,,,,,,,,,,0.07388752698898315,,,,,, +48,165899,,,,,,,,,,,,0.0729558914899826,,,,,, +48,165949,,,,,,,,,,,,0.0682847797870636,,,,,, +48,165999,,,,,,,,,,,,0.07485338300466537,,,,,, +48,166049,,,,,,,,,,,,0.06202006712555885,,,,,, +48,166099,,,,,,,,,,,,0.06668785214424133,,,,,, +48,166149,,,,,,,,,,,,0.0615815594792366,,,,,, +48,166199,,,,,,,,,,,,0.07170616090297699,,,,,, +48,166249,,,,,,,,,,,,0.07076331973075867,,,,,, +48,166299,,,,,,,,,,,,0.07435555756092072,,,,,, +48,166349,,,,,,,,,,,,0.06151838228106499,,,,,, +48,166399,,,,,,,,,,,,0.0753815695643425,,,,,, +48,166449,,,,,,,,,,,,0.06800549477338791,,,,,, +48,166499,,,,,,,,,,,,0.06823991239070892,,,,,, +48,166549,,,,,,,,,,,,0.059350330382585526,,,,,, +48,166599,,,,,,,,,,,,0.0695696771144867,,,,,, +48,166649,,,,,,,,,,,,0.08007371425628662,,,,,, +48,166699,,,,,,,,,,,,0.0673379972577095,,,,,, +48,166749,,,,,,,,,,,,0.06227954849600792,,,,,, +48,166799,,,,,,,,,,,,0.07470494508743286,,,,,, +48,166849,,,,,,,,,,,,0.0677550882101059,,,,,, +48,166899,,,,,,,,,,,,0.06532074511051178,,,,,, +48,166949,,,,,,,,,,,,0.06902734935283661,,,,,, +48,166999,,,,,,,,,,,,0.06531035900115967,,,,,, +48,167049,,,,,,,,,,,,0.07336271554231644,,,,,, +48,167099,,,,,,,,,,,,0.06756366789340973,,,,,, +48,167149,,,,,,,,,,,,0.06858421862125397,,,,,, +48,167199,,,,,,,,,,,,0.0665551945567131,,,,,, +48,167249,,,,,,,,,,,,0.057269804179668427,,,,,, +48,167299,,,,,,,,,,,,0.06365744024515152,,,,,, +48,167349,,,,,,,,,,,,0.07247179001569748,,,,,, +48,167399,,,,,,,,,,,,0.07316984236240387,,,,,, +48,167449,,,,,,,,,,,,0.07003950327634811,,,,,, +48,167499,,,,,,,,,,,,0.06522323191165924,,,,,, +48,167549,,,,,,,,,,,,0.07229965180158615,,,,,, +48,167599,,,,,,,,,,,,0.07085198163986206,,,,,, +48,167649,,,,,,,,,,,,0.06120724231004715,,,,,, +48,167699,,,,,,,,,,,,0.0771031454205513,,,,,, +48,167749,,,,,,,,,,,,0.0715172067284584,,,,,, +48,167799,,,,,,,,,,,,0.06469666212797165,,,,,, +48,167849,,,,,,,,,,,,0.06323675811290741,,,,,, +48,167899,,,,,,,,,,,,0.07378784567117691,,,,,, +48,167949,,,,,,,,,,,,0.07885807007551193,,,,,, +48,167999,,,,,,,,,,,,0.07523775100708008,,,,,, +48,168049,,,,,,,,,,,,0.07196949422359467,,,,,, +48,168099,,,,,,,,,,,,0.06939493119716644,,,,,, +48,168149,,,,,,,,,,,,0.061638958752155304,,,,,, +48,168199,,,,,,,,,,,,0.06414666026830673,,,,,, +48,168249,,,,,,,,,,,,0.0716167688369751,,,,,, +48,168299,,,,,,,,,,,,0.06544232368469238,,,,,, +48,168349,,,,,,,,,,,,0.07463183254003525,,,,,, +48,168399,,,,,,,,,,,,0.05559025704860687,,,,,, +48,168449,,,,,,,,,,,,0.06920813024044037,,,,,, +48,168499,,,,,,,,,,,,0.06451921164989471,,,,,, +48,168549,,,,,,,,,,,,0.06741692125797272,,,,,, +48,168599,,,,,,,,,,,,0.06843274086713791,,,,,, +48,168649,,,,,,,,,,,,0.0860457718372345,,,,,, +48,168699,,,,,,,,,,,,0.07156291604042053,,,,,, +48,168749,,,,,,,,,,,,0.06616178900003433,,,,,, +48,168755,,,,,,,,,,,,,0.2387194037437439,0.07800587266683578,0.2428736835718155,0.05634111166000366,0.20950789749622345,0.07800587266683578 +48,168755,,,,,,,0.22246941924095154,0.06961815059185028,0.4027879238128662,0.16223764419555664,0.37943923473358154,,,,,,, +49,168799,,,,,,,,,,,,0.06093277782201767,,,,,, +49,168849,,,,,,,,,,,,0.07086320966482162,,,,,, +49,168899,,,,,,,,,,,,0.06606295704841614,,,,,, +49,168949,,,,,,,,,,,,0.07974132150411606,,,,,, +49,168999,,,,,,,,,,,,0.06938272714614868,,,,,, +49,169049,,,,,,,,,,,,0.06394128501415253,,,,,, +49,169099,,,,,,,,,,,,0.06443917751312256,,,,,, +49,169149,,,,,,,,,,,,0.06833507120609283,,,,,, +49,169199,,,,,,,,,,,,0.07355183362960815,,,,,, +49,169249,,,,,,,,,,,,0.06528792530298233,,,,,, +49,169299,,,,,,,,,,,,0.07306380569934845,,,,,, +49,169349,,,,,,,,,,,,0.06413060426712036,,,,,, +49,169399,,,,,,,,,,,,0.06216738373041153,,,,,, +49,169449,,,,,,,,,,,,0.06691250205039978,,,,,, +49,169499,,,,,,,,,,,,0.07098031044006348,,,,,, +49,169549,,,,,,,,,,,,0.07612884044647217,,,,,, +49,169599,,,,,,,,,,,,0.07994600385427475,,,,,, +49,169649,,,,,,,,,,,,0.06319941580295563,,,,,, +49,169699,,,,,,,,,,,,0.0840999037027359,,,,,, +49,169749,,,,,,,,,,,,0.06528161466121674,,,,,, +49,169799,,,,,,,,,,,,0.07028234750032425,,,,,, +49,169849,,,,,,,,,,,,0.06815105676651001,,,,,, +49,169899,,,,,,,,,,,,0.07681168615818024,,,,,, +49,169949,,,,,,,,,,,,0.06788287311792374,,,,,, +49,169999,,,,,,,,,,,,0.07041286677122116,,,,,, +49,170049,,,,,,,,,,,,0.07112391293048859,,,,,, +49,170099,,,,,,,,,,,,0.0825437605381012,,,,,, +49,170149,,,,,,,,,,,,0.08890585601329803,,,,,, +49,170199,,,,,,,,,,,,0.06784090399742126,,,,,, +49,170249,,,,,,,,,,,,0.08230985701084137,,,,,, +49,170299,,,,,,,,,,,,0.06896261870861053,,,,,, +49,170349,,,,,,,,,,,,0.08034838736057281,,,,,, +49,170399,,,,,,,,,,,,0.060523249208927155,,,,,, +49,170449,,,,,,,,,,,,0.08031278848648071,,,,,, +49,170499,,,,,,,,,,,,0.07523738592863083,,,,,, +49,170549,,,,,,,,,,,,0.07003938406705856,,,,,, +49,170599,,,,,,,,,,,,0.0716523751616478,,,,,, +49,170649,,,,,,,,,,,,0.07393478602170944,,,,,, +49,170699,,,,,,,,,,,,0.08230490982532501,,,,,, +49,170749,,,,,,,,,,,,0.057305507361888885,,,,,, +49,170799,,,,,,,,,,,,0.06512780487537384,,,,,, +49,170849,,,,,,,,,,,,0.06523852795362473,,,,,, +49,170899,,,,,,,,,,,,0.06406182050704956,,,,,, +49,170949,,,,,,,,,,,,0.06646199524402618,,,,,, +49,170999,,,,,,,,,,,,0.06802380830049515,,,,,, +49,171049,,,,,,,,,,,,0.061535269021987915,,,,,, +49,171099,,,,,,,,,,,,0.07987871021032333,,,,,, +49,171149,,,,,,,,,,,,0.0565747506916523,,,,,, +49,171199,,,,,,,,,,,,0.08005344122648239,,,,,, +49,171249,,,,,,,,,,,,0.06523015350103378,,,,,, +49,171299,,,,,,,,,,,,0.07282571494579315,,,,,, +49,171349,,,,,,,,,,,,0.07494912296533585,,,,,, +49,171399,,,,,,,,,,,,0.06727516651153564,,,,,, +49,171449,,,,,,,,,,,,0.0862848088145256,,,,,, +49,171499,,,,,,,,,,,,0.07274749875068665,,,,,, +49,171549,,,,,,,,,,,,0.06162174046039581,,,,,, +49,171599,,,,,,,,,,,,0.0578334704041481,,,,,, +49,171649,,,,,,,,,,,,0.0736108124256134,,,,,, +49,171699,,,,,,,,,,,,0.0700564980506897,,,,,, +49,171749,,,,,,,,,,,,0.0708424299955368,,,,,, +49,171799,,,,,,,,,,,,0.06700589507818222,,,,,, +49,171849,,,,,,,,,,,,0.05793849006295204,,,,,, +49,171899,,,,,,,,,,,,0.07869157195091248,,,,,, +49,171949,,,,,,,,,,,,0.07190297544002533,,,,,, +49,171999,,,,,,,,,,,,0.06512023508548737,,,,,, +49,172049,,,,,,,,,,,,0.05645729601383209,,,,,, +49,172099,,,,,,,,,,,,0.07179020345211029,,,,,, +49,172149,,,,,,,,,,,,0.07042785733938217,,,,,, +49,172199,,,,,,,,,,,,0.08265523612499237,,,,,, +49,172199,,,,,,,,,,,,,0.23837819695472717,0.0781421959400177,0.24423977732658386,0.054691970348358154,0.210115447640419,0.0781421959400177 +49,172199,,,,,,,0.22222930192947388,0.06951573491096497,0.40431585907936096,0.16347527503967285,0.38097083568573,,,,,,, +50,172200,0.23973548412322998,0.07874315977096558,0.2273501306772232,0.047985851764678955,0.1989615112543106,0.07874315977096558,,,,,,,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..019358fc9177849185b43f6c4a8f972680d8c173 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml @@ -0,0 +1,23 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: gifflar + num_layers: 8 + pooling: global_mean + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly +seed: 43 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..4ceeaa3b442dc60a71db793ad9319a0481ddb1f4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv @@ -0,0 +1,304 @@ +epoch,step,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +0,49,,,,,,0.0998455286026001,,,,,, +0,99,,,,,,0.090921550989151,,,,,, +0,149,,,,,,0.07452477514743805,,,,,, +0,199,,,,,,0.07445606589317322,,,,,, +0,249,,,,,,0.08550561219453812,,,,,, +0,299,,,,,,0.0822535902261734,,,,,, +0,349,,,,,,0.07866685837507248,,,,,, +0,399,,,,,,0.08059735596179962,,,,,, +0,449,,,,,,0.08402932435274124,,,,,, +0,499,,,,,,0.0867849737405777,,,,,, +0,549,,,,,,0.06409748643636703,,,,,, +0,599,,,,,,0.07741537690162659,,,,,, +0,649,,,,,,0.0759195014834404,,,,,, +0,699,,,,,,0.07821564376354218,,,,,, +0,749,,,,,,0.07099077105522156,,,,,, +0,799,,,,,,0.08237621933221817,,,,,, +0,849,,,,,,0.08541758358478546,,,,,, +0,899,,,,,,0.07932327687740326,,,,,, +0,949,,,,,,0.07744543254375458,,,,,, +0,999,,,,,,0.0907546728849411,,,,,, +0,1049,,,,,,0.06978541612625122,,,,,, +0,1099,,,,,,0.09135614335536957,,,,,, +0,1149,,,,,,0.09158885478973389,,,,,, +0,1199,,,,,,0.06785370409488678,,,,,, +0,1249,,,,,,0.0740240216255188,,,,,, +0,1299,,,,,,0.07667000591754913,,,,,, +0,1349,,,,,,0.08109870553016663,,,,,, +0,1399,,,,,,0.06764934957027435,,,,,, +0,1449,,,,,,0.0761486068367958,,,,,, +0,1499,,,,,,0.08363670110702515,,,,,, +0,1549,,,,,,0.07836119830608368,,,,,, +0,1599,,,,,,0.07473614811897278,,,,,, +0,1649,,,,,,0.0911782830953598,,,,,, +0,1699,,,,,,0.08447125554084778,,,,,, +0,1749,,,,,,0.07221947610378265,,,,,, +0,1799,,,,,,0.06998363137245178,,,,,, +0,1849,,,,,,0.06771431863307953,,,,,, +0,1899,,,,,,0.07818875461816788,,,,,, +0,1949,,,,,,0.08424592018127441,,,,,, +0,1999,,,,,,0.07058024406433105,,,,,, +0,2049,,,,,,0.08767494559288025,,,,,, +0,2099,,,,,,0.08213382959365845,,,,,, +0,2149,,,,,,0.09376886487007141,,,,,, +0,2199,,,,,,0.07999394834041595,,,,,, +0,2249,,,,,,0.08163382112979889,,,,,, +0,2299,,,,,,0.08767735213041306,,,,,, +0,2349,,,,,,1.2184021472930908,,,,,, +0,2399,,,,,,0.10333551466464996,,,,,, +0,2449,,,,,,0.09457343071699142,,,,,, +0,2499,,,,,,0.10654644668102264,,,,,, +0,2549,,,,,,0.09379475563764572,,,,,, +0,2599,,,,,,0.09332380443811417,,,,,, +0,2649,,,,,,0.089891716837883,,,,,, +0,2699,,,,,,0.09231418371200562,,,,,, +0,2749,,,,,,0.08159282058477402,,,,,, +0,2799,,,,,,0.08395092189311981,,,,,, +0,2849,,,,,,0.07495688647031784,,,,,, +0,2899,,,,,,0.09037497639656067,,,,,, +0,2949,,,,,,0.09569938480854034,,,,,, +0,2999,,,,,,0.08227492868900299,,,,,, +0,3049,,,,,,0.08711923658847809,,,,,, +0,3099,,,,,,0.07879835367202759,,,,,, +0,3149,,,,,,0.07360771298408508,,,,,, +0,3199,,,,,,0.07689650356769562,,,,,, +0,3249,,,,,,0.09106864780187607,,,,,, +0,3299,,,,,,0.09122290462255478,,,,,, +0,3349,,,,,,0.07932707667350769,,,,,, +0,3399,,,,,,0.07486097514629364,,,,,, +0,3449,,,,,,0.08882220089435577,,,,,, +0,3499,,,,,,0.07878720760345459,,,,,, +0,3549,,,,,,0.08670472353696823,,,,,, +0,3599,,,,,,0.08077369630336761,,,,,, +0,3649,,,,,,0.08746492117643356,,,,,, +0,3699,,,,,,0.08202464878559113,,,,,, +0,3749,,,,,,0.09144988656044006,,,,,, +0,3799,,,,,,0.08350303769111633,,,,,, +0,3849,,,,,,0.0732228010892868,,,,,, +0,3899,,,,,,0.08561675250530243,,,,,, +0,3949,,,,,,0.08180269598960876,,,,,, +0,3999,,,,,,0.0875452384352684,,,,,, +0,4049,,,,,,0.07925727963447571,,,,,, +0,4099,,,,,,0.08452913165092468,,,,,, +0,4149,,,,,,0.07141545414924622,,,,,, +0,4199,,,,,,0.07665975391864777,,,,,, +0,4249,,,,,,0.08585065603256226,,,,,, +0,4299,,,,,,0.08701048791408539,,,,,, +0,4349,,,,,,0.07597130537033081,,,,,, +0,4399,,,,,,0.09205509722232819,,,,,, +0,4449,,,,,,0.06613659858703613,,,,,, +0,4499,,,,,,0.0893499031662941,,,,,, +0,4549,,,,,,0.08448705822229385,,,,,, +0,4599,,,,,,0.07993347942829132,,,,,, +0,4649,,,,,,0.08597036451101303,,,,,, +0,4699,,,,,,0.07645861804485321,,,,,, +0,4749,,,,,,0.07721157371997833,,,,,, +0,4799,,,,,,0.08618000894784927,,,,,, +0,4849,,,,,,0.09103478491306305,,,,,, +0,4899,,,,,,0.06792357563972473,,,,,, +0,4949,,,,,,0.07726268470287323,,,,,, +0,4999,,,,,,0.06390906125307083,,,,,, +0,5049,,,,,,0.07361443340778351,,,,,, +0,5099,,,,,,0.08142486214637756,,,,,, +0,5149,,,,,,0.0734940767288208,,,,,, +0,5199,,,,,,0.07547774910926819,,,,,, +0,5249,,,,,,0.09574241936206818,,,,,, +0,5299,,,,,,0.08820213377475739,,,,,, +0,5349,,,,,,0.08830879628658295,,,,,, +0,5399,,,,,,0.0747784823179245,,,,,, +0,5449,,,,,,0.0850122720003128,,,,,, +0,5499,,,,,,0.08794023096561432,,,,,, +0,5549,,,,,,0.07830813527107239,,,,,, +0,5599,,,,,,0.08067165315151215,,,,,, +0,5649,,,,,,0.07846282422542572,,,,,, +0,5699,,,,,,0.07521708309650421,,,,,, +0,5735,,,,,,,0.24049945175647736,0.07905758917331696,0.20924337208271027,0.04080641269683838,0.21151022613048553,0.07905758917331696 +0,5735,0.2496047019958496,0.10411233454942703,0.060901939868927,-0.2579742670059204,0.12897399067878723,,,,,,, +1,5749,,,,,,0.07502922415733337,,,,,, +1,5799,,,,,,0.0912618637084961,,,,,, +1,5849,,,,,,0.0859246701002121,,,,,, +1,5899,,,,,,0.080275759100914,,,,,, +1,5949,,,,,,0.07362840324640274,,,,,, +1,5999,,,,,,0.07978188991546631,,,,,, +1,6049,,,,,,0.07044544816017151,,,,,, +1,6099,,,,,,0.07258837670087814,,,,,, +1,6149,,,,,,0.0897449404001236,,,,,, +1,6199,,,,,,0.08265232294797897,,,,,, +1,6249,,,,,,0.08545316755771637,,,,,, +1,6299,,,,,,0.06819471716880798,,,,,, +1,6349,,,,,,0.07188143581151962,,,,,, +1,6399,,,,,,0.08161237835884094,,,,,, +1,6449,,,,,,0.07410357892513275,,,,,, +1,6499,,,,,,0.07259812951087952,,,,,, +1,6549,,,,,,0.08032429218292236,,,,,, +1,6599,,,,,,0.07719159871339798,,,,,, +1,6649,,,,,,0.0847303494811058,,,,,, +1,6699,,,,,,0.07130550593137741,,,,,, +1,6749,,,,,,0.07773640751838684,,,,,, +1,6799,,,,,,0.08312699943780899,,,,,, +1,6849,,,,,,0.07806476950645447,,,,,, +1,6899,,,,,,0.07491884380578995,,,,,, +1,6949,,,,,,0.06829297542572021,,,,,, +1,6999,,,,,,0.07109436392784119,,,,,, +1,7049,,,,,,0.08020845055580139,,,,,, +1,7099,,,,,,0.09012986719608307,,,,,, +1,7149,,,,,,0.08382008969783783,,,,,, +1,7199,,,,,,0.07088477909564972,,,,,, +1,7249,,,,,,0.07630310207605362,,,,,, +1,7299,,,,,,0.0661420226097107,,,,,, +1,7349,,,,,,0.07383193075656891,,,,,, +1,7399,,,,,,0.06719346344470978,,,,,, +1,7449,,,,,,0.08016082644462585,,,,,, +1,7499,,,,,,0.0713823214173317,,,,,, +1,7549,,,,,,0.07389012724161148,,,,,, +1,7599,,,,,,0.0799078643321991,,,,,, +1,7649,,,,,,0.0772092416882515,,,,,, +1,7699,,,,,,0.0877225324511528,,,,,, +1,7749,,,,,,0.07673442363739014,,,,,, +1,7799,,,,,,0.0772620216012001,,,,,, +1,7849,,,,,,0.07418093085289001,,,,,, +1,7899,,,,,,0.08628639578819275,,,,,, +1,7949,,,,,,0.06823646277189255,,,,,, +1,7999,,,,,,0.07607296109199524,,,,,, +1,8049,,,,,,0.08660748600959778,,,,,, +1,8099,,,,,,0.06977500766515732,,,,,, +1,8149,,,,,,0.08557961881160736,,,,,, +1,8199,,,,,,0.0884605199098587,,,,,, +1,8249,,,,,,0.0788787454366684,,,,,, +1,8299,,,,,,0.07448288053274155,,,,,, +1,8349,,,,,,0.07901503145694733,,,,,, +1,8399,,,,,,0.08221940696239471,,,,,, +1,8449,,,,,,0.07748645544052124,,,,,, +1,8499,,,,,,0.06898144632577896,,,,,, +1,8549,,,,,,0.08539120852947235,,,,,, +1,8599,,,,,,0.07155288755893707,,,,,, +1,8649,,,,,,0.0750715509057045,,,,,, +1,8699,,,,,,0.08619598299264908,,,,,, +1,8749,,,,,,0.08346296846866608,,,,,, +1,8799,,,,,,0.07702809572219849,,,,,, +1,8849,,,,,,0.07410526275634766,,,,,, +1,8899,,,,,,0.07402214407920837,,,,,, +1,8949,,,,,,0.06726076453924179,,,,,, +1,8999,,,,,,0.08561425656080246,,,,,, +1,9049,,,,,,0.07540424168109894,,,,,, +1,9099,,,,,,0.07921247184276581,,,,,, +1,9149,,,,,,0.09072509407997131,,,,,, +1,9199,,,,,,0.07406996935606003,,,,,, +1,9249,,,,,,0.09130427241325378,,,,,, +1,9299,,,,,,0.0741882175207138,,,,,, +1,9349,,,,,,0.06920216977596283,,,,,, +1,9399,,,,,,0.08606851100921631,,,,,, +1,9449,,,,,,0.07606452703475952,,,,,, +1,9499,,,,,,0.07736355811357498,,,,,, +1,9549,,,,,,0.0838368684053421,,,,,, +1,9599,,,,,,0.07893640547990799,,,,,, +1,9649,,,,,,0.07802382111549377,,,,,, +1,9699,,,,,,0.07677377015352249,,,,,, +1,9749,,,,,,0.07061979174613953,,,,,, +1,9799,,,,,,0.08349832892417908,,,,,, +1,9849,,,,,,0.08914190530776978,,,,,, +1,9899,,,,,,0.07500240951776505,,,,,, +1,9949,,,,,,0.07438240945339203,,,,,, +1,9999,,,,,,0.06880170106887817,,,,,, +1,10049,,,,,,0.0783909484744072,,,,,, +1,10099,,,,,,0.09515947103500366,,,,,, +1,10149,,,,,,0.06627333164215088,,,,,, +1,10199,,,,,,0.07429848611354828,,,,,, +1,10249,,,,,,0.08175897598266602,,,,,, +1,10299,,,,,,0.07234521210193634,,,,,, +1,10349,,,,,,0.07410368323326111,,,,,, +1,10399,,,,,,0.09150826930999756,,,,,, +1,10449,,,,,,0.08573349565267563,,,,,, +1,10499,,,,,,0.07257102429866791,,,,,, +1,10549,,,,,,0.0694643035531044,,,,,, +1,10599,,,,,,0.07976347953081131,,,,,, +1,10649,,,,,,0.08225692808628082,,,,,, +1,10699,,,,,,0.06934700906276703,,,,,, +1,10749,,,,,,0.06927661597728729,,,,,, +1,10799,,,,,,0.061770759522914886,,,,,, +1,10849,,,,,,0.08401215821504593,,,,,, +1,10899,,,,,,0.07997459918260574,,,,,, +1,10949,,,,,,0.07653121650218964,,,,,, +1,10999,,,,,,0.07891252636909485,,,,,, +1,11049,,,,,,0.0770794227719307,,,,,, +1,11099,,,,,,0.06584164500236511,,,,,, +1,11149,,,,,,0.07690255343914032,,,,,, +1,11199,,,,,,0.07202380150556564,,,,,, +1,11249,,,,,,0.0763920396566391,,,,,, +1,11299,,,,,,0.069256991147995,,,,,, +1,11349,,,,,,0.0798318088054657,,,,,, +1,11399,,,,,,0.07361671328544617,,,,,, +1,11449,,,,,,0.08528630435466766,,,,,, +1,11471,,,,,,,0.24542520940303802,0.08188817650079727,0.15640249848365784,0.006463348865509033,0.17065320909023285,0.08188817650079727 +1,11471,0.23869021236896515,0.07774488627910614,0.2468234747648239,0.060629427433013916,0.22880426049232483,,,,,,, +2,11499,,,,,,0.08455962687730789,,,,,, +2,11549,,,,,,0.08335214853286743,,,,,, +2,11599,,,,,,0.0732620507478714,,,,,, +2,11649,,,,,,0.09567884355783463,,,,,, +2,11699,,,,,,0.07160292565822601,,,,,, +2,11749,,,,,,0.07585512101650238,,,,,, +2,11799,,,,,,0.07838285714387894,,,,,, +2,11849,,,,,,0.07855676114559174,,,,,, +2,11899,,,,,,0.07063308358192444,,,,,, +2,11949,,,,,,0.07657845318317413,,,,,, +2,11999,,,,,,0.07470585405826569,,,,,, +2,12049,,,,,,0.0852309837937355,,,,,, +2,12099,,,,,,0.06805255264043808,,,,,, +2,12149,,,,,,0.08208337426185608,,,,,, +2,12199,,,,,,0.07896952331066132,,,,,, +2,12249,,,,,,0.07047165185213089,,,,,, +2,12299,,,,,,0.07489395141601562,,,,,, +2,12349,,,,,,0.0848650336265564,,,,,, +2,12399,,,,,,0.0677710622549057,,,,,, +2,12449,,,,,,0.07610161602497101,,,,,, +2,12499,,,,,,0.07401303946971893,,,,,, +2,12549,,,,,,0.08619438111782074,,,,,, +2,12599,,,,,,0.08297805488109589,,,,,, +2,12649,,,,,,0.0964236930012703,,,,,, +2,12699,,,,,,0.07483600825071335,,,,,, +2,12749,,,,,,0.07906622439622879,,,,,, +2,12799,,,,,,0.07810664176940918,,,,,, +2,12849,,,,,,0.07585060596466064,,,,,, +2,12899,,,,,,0.08075680583715439,,,,,, +2,12949,,,,,,0.08267724514007568,,,,,, +2,12999,,,,,,0.07151855528354645,,,,,, +2,13049,,,,,,0.06997234374284744,,,,,, +2,13099,,,,,,0.06998339295387268,,,,,, +2,13149,,,,,,0.0835874155163765,,,,,, +2,13199,,,,,,0.077639140188694,,,,,, +2,13249,,,,,,0.08212120831012726,,,,,, +2,13299,,,,,,0.08306632936000824,,,,,, +2,13349,,,,,,0.07587084174156189,,,,,, +2,13399,,,,,,0.07857035100460052,,,,,, +2,13449,,,,,,0.0808381512761116,,,,,, +2,13499,,,,,,0.0767078548669815,,,,,, +2,13549,,,,,,0.0657360851764679,,,,,, +2,13599,,,,,,0.07783319056034088,,,,,, +2,13649,,,,,,0.06765773892402649,,,,,, +2,13699,,,,,,0.07099532335996628,,,,,, +2,13749,,,,,,0.08056551218032837,,,,,, +2,13799,,,,,,0.08388625085353851,,,,,, +2,13849,,,,,,0.08700326085090637,,,,,, +2,13899,,,,,,0.07563897967338562,,,,,, +2,13949,,,,,,0.07379516959190369,,,,,, +2,13999,,,,,,0.07358011603355408,,,,,, +2,14049,,,,,,0.0798286721110344,,,,,, +2,14099,,,,,,0.07496342062950134,,,,,, +2,14149,,,,,,0.07724559307098389,,,,,, +2,14199,,,,,,0.08418890833854675,,,,,, +2,14249,,,,,,0.07652370631694794,,,,,, +2,14299,,,,,,0.07612372189760208,,,,,, +2,14349,,,,,,0.07663597166538239,,,,,, +2,14399,,,,,,0.0763905793428421,,,,,, +2,14449,,,,,,0.07325479388237,,,,,, +2,14499,,,,,,0.05761389806866646,,,,,, +2,14549,,,,,,0.07465803623199463,,,,,, +2,14599,,,,,,0.07057707756757736,,,,,, +2,14649,,,,,,0.08226756006479263,,,,,, +2,14699,,,,,,0.06680767983198166,,,,,, +2,14749,,,,,,0.08077411353588104,,,,,, +2,14799,,,,,,0.0805254727602005,,,,,, +2,14849,,,,,,0.07802529633045197,,,,,, +2,14899,,,,,,0.07779621332883835,,,,,, +2,14949,,,,,,0.07338188588619232,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..019358fc9177849185b43f6c4a8f972680d8c173 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml @@ -0,0 +1,23 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: gifflar + num_layers: 8 + pooling: global_mean + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly +seed: 43 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..34e57e79423dd1f27048f361bd35a8647f487830 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv @@ -0,0 +1,5605 @@ +epoch,step,test/MeanAbsoluteError,test/MeanSquaredError,test/PearsonCorrCoef,test/R2Score,test/SpearmanCorrCoef,test/loss,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +2,11499,,,,,,,,,,,,0.07065174728631973,,,,,, +2,11549,,,,,,,,,,,,0.08773529529571533,,,,,, +2,11599,,,,,,,,,,,,0.07270888239145279,,,,,, +2,11649,,,,,,,,,,,,0.06659147888422012,,,,,, +2,11699,,,,,,,,,,,,0.07019099593162537,,,,,, +2,11749,,,,,,,,,,,,0.07404224574565887,,,,,, +2,11799,,,,,,,,,,,,0.07596103101968765,,,,,, +2,11849,,,,,,,,,,,,0.07996860891580582,,,,,, +2,11899,,,,,,,,,,,,0.08286640793085098,,,,,, +2,11949,,,,,,,,,,,,0.08488030731678009,,,,,, +2,11999,,,,,,,,,,,,0.08135595172643661,,,,,, +2,12049,,,,,,,,,,,,0.07494229823350906,,,,,, +2,12099,,,,,,,,,,,,0.07647872716188431,,,,,, +2,12149,,,,,,,,,,,,0.07453840970993042,,,,,, +2,12199,,,,,,,,,,,,0.08096252381801605,,,,,, +2,12249,,,,,,,,,,,,0.08193741738796234,,,,,, +2,12299,,,,,,,,,,,,0.06758300960063934,,,,,, +2,12349,,,,,,,,,,,,0.0873180404305458,,,,,, +2,12399,,,,,,,,,,,,0.0830761045217514,,,,,, +2,12449,,,,,,,,,,,,0.06996297091245651,,,,,, +2,12499,,,,,,,,,,,,0.08553194254636765,,,,,, +2,12549,,,,,,,,,,,,0.07373988628387451,,,,,, +2,12599,,,,,,,,,,,,0.08829496800899506,,,,,, +2,12649,,,,,,,,,,,,0.07450346648693085,,,,,, +2,12699,,,,,,,,,,,,0.09620028734207153,,,,,, +2,12749,,,,,,,,,,,,0.0648164451122284,,,,,, +2,12799,,,,,,,,,,,,0.06210360676050186,,,,,, +2,12849,,,,,,,,,,,,0.07494330406188965,,,,,, +2,12899,,,,,,,,,,,,0.06806553155183792,,,,,, +2,12949,,,,,,,,,,,,0.0765804797410965,,,,,, +2,12999,,,,,,,,,,,,0.08716195076704025,,,,,, +2,13049,,,,,,,,,,,,0.08133766055107117,,,,,, +2,13099,,,,,,,,,,,,0.0777810662984848,,,,,, +2,13149,,,,,,,,,,,,0.07356442511081696,,,,,, +2,13199,,,,,,,,,,,,0.09023846685886383,,,,,, +2,13249,,,,,,,,,,,,0.07184247672557831,,,,,, +2,13299,,,,,,,,,,,,0.08375851809978485,,,,,, +2,13349,,,,,,,,,,,,0.06984204053878784,,,,,, +2,13399,,,,,,,,,,,,0.082893505692482,,,,,, +2,13449,,,,,,,,,,,,0.08125458657741547,,,,,, +2,13499,,,,,,,,,,,,0.080961674451828,,,,,, +2,13549,,,,,,,,,,,,0.07397667318582535,,,,,, +2,13599,,,,,,,,,,,,0.07224729657173157,,,,,, +2,13649,,,,,,,,,,,,0.0761432871222496,,,,,, +2,13699,,,,,,,,,,,,0.08090316504240036,,,,,, +2,13749,,,,,,,,,,,,0.0736771821975708,,,,,, +2,13799,,,,,,,,,,,,0.06767839938402176,,,,,, +2,13849,,,,,,,,,,,,0.07381002604961395,,,,,, +2,13899,,,,,,,,,,,,0.08437386155128479,,,,,, +2,13949,,,,,,,,,,,,0.07358686625957489,,,,,, +2,13999,,,,,,,,,,,,0.08140227198600769,,,,,, +2,14049,,,,,,,,,,,,0.07579265534877777,,,,,, +2,14099,,,,,,,,,,,,0.07153163850307465,,,,,, +2,14149,,,,,,,,,,,,0.0692170262336731,,,,,, +2,14199,,,,,,,,,,,,0.08191416412591934,,,,,, +2,14249,,,,,,,,,,,,0.07787738740444183,,,,,, +2,14299,,,,,,,,,,,,0.07169289886951447,,,,,, +2,14349,,,,,,,,,,,,0.07325766980648041,,,,,, +2,14399,,,,,,,,,,,,0.06202855333685875,,,,,, +2,14449,,,,,,,,,,,,0.07772177457809448,,,,,, +2,14499,,,,,,,,,,,,0.08079475164413452,,,,,, +2,14549,,,,,,,,,,,,0.08313950896263123,,,,,, +2,14599,,,,,,,,,,,,0.06464898586273193,,,,,, +2,14649,,,,,,,,,,,,0.07649436593055725,,,,,, +2,14699,,,,,,,,,,,,0.06537190079689026,,,,,, +2,14749,,,,,,,,,,,,0.07143799215555191,,,,,, +2,14799,,,,,,,,,,,,0.07203437387943268,,,,,, +2,14849,,,,,,,,,,,,0.08508866280317307,,,,,, +2,14899,,,,,,,,,,,,0.0798937976360321,,,,,, +2,14949,,,,,,,,,,,,0.06650512665510178,,,,,, +2,14999,,,,,,,,,,,,0.07899093627929688,,,,,, +2,15049,,,,,,,,,,,,0.08420306444168091,,,,,, +2,15099,,,,,,,,,,,,0.07653272151947021,,,,,, +2,15149,,,,,,,,,,,,0.07637910544872284,,,,,, +2,15199,,,,,,,,,,,,0.06978026777505875,,,,,, +2,15249,,,,,,,,,,,,0.06214720010757446,,,,,, +2,15299,,,,,,,,,,,,0.07491010427474976,,,,,, +2,15349,,,,,,,,,,,,0.07777385413646698,,,,,, +2,15399,,,,,,,,,,,,0.08528073132038116,,,,,, +2,15449,,,,,,,,,,,,0.07392039895057678,,,,,, +2,15499,,,,,,,,,,,,0.07638106495141983,,,,,, +2,15549,,,,,,,,,,,,0.07731261849403381,,,,,, +2,15599,,,,,,,,,,,,0.06676231324672699,,,,,, +2,15649,,,,,,,,,,,,0.07100376486778259,,,,,, +2,15699,,,,,,,,,,,,0.0705123171210289,,,,,, +2,15749,,,,,,,,,,,,0.07737324386835098,,,,,, +2,15799,,,,,,,,,,,,0.08933357894420624,,,,,, +2,15849,,,,,,,,,,,,0.06943821161985397,,,,,, +2,15899,,,,,,,,,,,,0.07984483242034912,,,,,, +2,15949,,,,,,,,,,,,0.0664619728922844,,,,,, +2,15999,,,,,,,,,,,,0.07708447426557541,,,,,, +2,16049,,,,,,,,,,,,0.07037641108036041,,,,,, +2,16099,,,,,,,,,,,,0.07837748527526855,,,,,, +2,16149,,,,,,,,,,,,0.07940055429935455,,,,,, +2,16199,,,,,,,,,,,,0.07101514935493469,,,,,, +2,16249,,,,,,,,,,,,0.06622467935085297,,,,,, +2,16299,,,,,,,,,,,,0.06665825843811035,,,,,, +2,16349,,,,,,,,,,,,0.08097288757562637,,,,,, +2,16399,,,,,,,,,,,,0.0757393091917038,,,,,, +2,16449,,,,,,,,,,,,0.07481025159358978,,,,,, +2,16499,,,,,,,,,,,,0.07453493773937225,,,,,, +2,16549,,,,,,,,,,,,0.07745152711868286,,,,,, +2,16599,,,,,,,,,,,,0.08987905085086823,,,,,, +2,16649,,,,,,,,,,,,0.07072155177593231,,,,,, +2,16699,,,,,,,,,,,,0.07666380703449249,,,,,, +2,16749,,,,,,,,,,,,0.0717221200466156,,,,,, +2,16799,,,,,,,,,,,,0.07021338492631912,,,,,, +2,16849,,,,,,,,,,,,0.07676905393600464,,,,,, +2,16899,,,,,,,,,,,,0.06583637744188309,,,,,, +2,16949,,,,,,,,,,,,0.07858819514513016,,,,,, +2,16999,,,,,,,,,,,,0.07664649933576584,,,,,, +2,17049,,,,,,,,,,,,0.0785021111369133,,,,,, +2,17099,,,,,,,,,,,,0.08094368129968643,,,,,, +2,17149,,,,,,,,,,,,0.07247056812047958,,,,,, +2,17199,,,,,,,,,,,,0.06521940231323242,,,,,, +2,17207,,,,,,,,,,,,,0.24249009788036346,0.08040614426136017,0.19045402109622955,0.024444639682769775,0.1975356489419937,0.08040614426136017 +2,17207,,,,,,,0.23566806316375732,0.07617150247097015,0.2824762463569641,0.07963365316390991,0.26876595616340637,,,,,,, +3,17249,,,,,,,,,,,,0.08323641121387482,,,,,, +3,17299,,,,,,,,,,,,0.07313938438892365,,,,,, +3,17349,,,,,,,,,,,,0.07094408571720123,,,,,, +3,17399,,,,,,,,,,,,0.07345793396234512,,,,,, +3,17449,,,,,,,,,,,,0.07898552715778351,,,,,, +3,17499,,,,,,,,,,,,0.07502257823944092,,,,,, +3,17549,,,,,,,,,,,,0.07185252755880356,,,,,, +3,17599,,,,,,,,,,,,0.0687510296702385,,,,,, +3,17649,,,,,,,,,,,,0.07028903067111969,,,,,, +3,17699,,,,,,,,,,,,0.06878197193145752,,,,,, +3,17749,,,,,,,,,,,,0.06869436800479889,,,,,, +3,17799,,,,,,,,,,,,0.06500757485628128,,,,,, +3,17849,,,,,,,,,,,,0.07690198719501495,,,,,, +3,17899,,,,,,,,,,,,0.08122619986534119,,,,,, +3,17949,,,,,,,,,,,,0.06616434454917908,,,,,, +3,17999,,,,,,,,,,,,0.06535500288009644,,,,,, +3,18049,,,,,,,,,,,,0.0678846687078476,,,,,, +3,18099,,,,,,,,,,,,0.07488777488470078,,,,,, +3,18149,,,,,,,,,,,,0.06800908595323563,,,,,, +3,18199,,,,,,,,,,,,0.06810497492551804,,,,,, +3,18249,,,,,,,,,,,,0.08024176955223083,,,,,, +3,18299,,,,,,,,,,,,0.07764554023742676,,,,,, +3,18349,,,,,,,,,,,,0.07183772325515747,,,,,, +3,18399,,,,,,,,,,,,0.08445441722869873,,,,,, +3,18449,,,,,,,,,,,,0.07219164073467255,,,,,, +3,18499,,,,,,,,,,,,0.07423560321331024,,,,,, +3,18549,,,,,,,,,,,,0.08527524769306183,,,,,, +3,18599,,,,,,,,,,,,0.07145954668521881,,,,,, +3,18649,,,,,,,,,,,,0.07429730147123337,,,,,, +3,18699,,,,,,,,,,,,0.0648309588432312,,,,,, +3,18749,,,,,,,,,,,,0.07090429961681366,,,,,, +3,18799,,,,,,,,,,,,0.0691385418176651,,,,,, +3,18849,,,,,,,,,,,,0.07150374352931976,,,,,, +3,18899,,,,,,,,,,,,0.0703689306974411,,,,,, +3,18949,,,,,,,,,,,,0.08433136343955994,,,,,, +3,18999,,,,,,,,,,,,0.08271893858909607,,,,,, +3,19049,,,,,,,,,,,,0.07885129004716873,,,,,, +3,19099,,,,,,,,,,,,0.07560402154922485,,,,,, +3,19149,,,,,,,,,,,,0.07465609908103943,,,,,, +3,19199,,,,,,,,,,,,0.0648265853524208,,,,,, +3,19249,,,,,,,,,,,,0.06848202645778656,,,,,, +3,19299,,,,,,,,,,,,0.07270312309265137,,,,,, +3,19349,,,,,,,,,,,,0.06410747021436691,,,,,, +3,19399,,,,,,,,,,,,0.07153381407260895,,,,,, +3,19449,,,,,,,,,,,,0.07460007816553116,,,,,, +3,19499,,,,,,,,,,,,0.07903920114040375,,,,,, +3,19549,,,,,,,,,,,,0.07939758896827698,,,,,, +3,19599,,,,,,,,,,,,0.07580211758613586,,,,,, +3,19649,,,,,,,,,,,,0.06610362976789474,,,,,, +3,19699,,,,,,,,,,,,0.09093771129846573,,,,,, +3,19749,,,,,,,,,,,,0.08058999478816986,,,,,, +3,19799,,,,,,,,,,,,0.07400443404912949,,,,,, +3,19849,,,,,,,,,,,,0.07995201647281647,,,,,, +3,19899,,,,,,,,,,,,0.07752883434295654,,,,,, +3,19949,,,,,,,,,,,,0.07275279611349106,,,,,, +3,19999,,,,,,,,,,,,0.07238495349884033,,,,,, +3,20049,,,,,,,,,,,,0.061938025057315826,,,,,, +3,20099,,,,,,,,,,,,0.08785779774188995,,,,,, +3,20149,,,,,,,,,,,,0.09570523351430893,,,,,, +3,20199,,,,,,,,,,,,0.07198226451873779,,,,,, +3,20249,,,,,,,,,,,,0.07330893725156784,,,,,, +3,20299,,,,,,,,,,,,0.08400876820087433,,,,,, +3,20349,,,,,,,,,,,,0.0873020812869072,,,,,, +3,20399,,,,,,,,,,,,0.07348237931728363,,,,,, +3,20449,,,,,,,,,,,,0.06863066554069519,,,,,, +3,20499,,,,,,,,,,,,0.06316628307104111,,,,,, +3,20549,,,,,,,,,,,,0.07364514470100403,,,,,, +3,20599,,,,,,,,,,,,0.06907756626605988,,,,,, +3,20649,,,,,,,,,,,,0.07179796695709229,,,,,, +3,20699,,,,,,,,,,,,0.07632921636104584,,,,,, +3,20749,,,,,,,,,,,,0.07272957265377045,,,,,, +3,20799,,,,,,,,,,,,0.08009620755910873,,,,,, +3,20849,,,,,,,,,,,,0.08003880083560944,,,,,, +3,20899,,,,,,,,,,,,0.09081052243709564,,,,,, +3,20949,,,,,,,,,,,,0.07819238305091858,,,,,, +3,20999,,,,,,,,,,,,0.07544729113578796,,,,,, +3,21049,,,,,,,,,,,,0.07130216062068939,,,,,, +3,21099,,,,,,,,,,,,0.06940986961126328,,,,,, +3,21149,,,,,,,,,,,,0.06966745853424072,,,,,, +3,21199,,,,,,,,,,,,0.08435632288455963,,,,,, +3,21249,,,,,,,,,,,,0.07108703255653381,,,,,, +3,21299,,,,,,,,,,,,0.07430952787399292,,,,,, +3,21349,,,,,,,,,,,,0.07003439962863922,,,,,, +3,21399,,,,,,,,,,,,0.06793663650751114,,,,,, +3,21449,,,,,,,,,,,,0.07273945957422256,,,,,, +3,21499,,,,,,,,,,,,0.07438097894191742,,,,,, +3,21549,,,,,,,,,,,,0.07635925710201263,,,,,, +3,21599,,,,,,,,,,,,0.06498871743679047,,,,,, +3,21649,,,,,,,,,,,,0.07041780650615692,,,,,, +3,21699,,,,,,,,,,,,0.06857037544250488,,,,,, +3,21749,,,,,,,,,,,,0.07780821621417999,,,,,, +3,21799,,,,,,,,,,,,0.06876714527606964,,,,,, +3,21849,,,,,,,,,,,,0.07048234343528748,,,,,, +3,21899,,,,,,,,,,,,0.0749257355928421,,,,,, +3,21949,,,,,,,,,,,,0.0647481232881546,,,,,, +3,21999,,,,,,,,,,,,0.08591074496507645,,,,,, +3,22049,,,,,,,,,,,,0.07097961008548737,,,,,, +3,22099,,,,,,,,,,,,0.07838873565196991,,,,,, +3,22149,,,,,,,,,,,,0.07799707353115082,,,,,, +3,22199,,,,,,,,,,,,0.07074804604053497,,,,,, +3,22249,,,,,,,,,,,,0.08344089984893799,,,,,, +3,22299,,,,,,,,,,,,0.0725971907377243,,,,,, +3,22349,,,,,,,,,,,,0.06823402643203735,,,,,, +3,22399,,,,,,,,,,,,0.06427973508834839,,,,,, +3,22449,,,,,,,,,,,,0.08953862637281418,,,,,, +3,22499,,,,,,,,,,,,0.08298897743225098,,,,,, +3,22549,,,,,,,,,,,,0.07788141816854477,,,,,, +3,22599,,,,,,,,,,,,0.07560637593269348,,,,,, +3,22649,,,,,,,,,,,,0.0681416317820549,,,,,, +3,22699,,,,,,,,,,,,0.06078151613473892,,,,,, +3,22749,,,,,,,,,,,,0.07601404190063477,,,,,, +3,22799,,,,,,,,,,,,0.06536688655614853,,,,,, +3,22849,,,,,,,,,,,,0.06601113080978394,,,,,, +3,22899,,,,,,,,,,,,0.07595992833375931,,,,,, +3,22943,,,,,,,,,,,,,0.24141107499599457,0.07981247454881668,0.208303302526474,0.031647443771362305,0.20709282159805298,0.07981247454881668 +3,22943,,,,,,,0.2323780506849289,0.07449086010456085,0.31638747453689575,0.09993773698806763,0.3021523058414459,,,,,,, +4,22949,,,,,,,,,,,,0.08131051063537598,,,,,, +4,22999,,,,,,,,,,,,0.07253862917423248,,,,,, +4,23049,,,,,,,,,,,,0.08218182623386383,,,,,, +4,23099,,,,,,,,,,,,0.0751579999923706,,,,,, +4,23149,,,,,,,,,,,,0.06943798065185547,,,,,, +4,23199,,,,,,,,,,,,0.07109721004962921,,,,,, +4,23249,,,,,,,,,,,,0.09119879454374313,,,,,, +4,23299,,,,,,,,,,,,0.0756903886795044,,,,,, +4,23349,,,,,,,,,,,,0.07447393238544464,,,,,, +4,23399,,,,,,,,,,,,0.06999313831329346,,,,,, +4,23449,,,,,,,,,,,,0.07289061695337296,,,,,, +4,23499,,,,,,,,,,,,0.06184641644358635,,,,,, +4,23549,,,,,,,,,,,,0.06364405155181885,,,,,, +4,23599,,,,,,,,,,,,0.08416915684938431,,,,,, +4,23649,,,,,,,,,,,,0.06738246977329254,,,,,, +4,23699,,,,,,,,,,,,0.06863170117139816,,,,,, +4,23749,,,,,,,,,,,,0.08364112675189972,,,,,, +4,23799,,,,,,,,,,,,0.07686790078878403,,,,,, +4,23849,,,,,,,,,,,,0.0779498964548111,,,,,, +4,23899,,,,,,,,,,,,0.07785280048847198,,,,,, +4,23949,,,,,,,,,,,,0.07507608085870743,,,,,, +4,23999,,,,,,,,,,,,0.07917425036430359,,,,,, +4,24049,,,,,,,,,,,,0.07345649600028992,,,,,, +4,24099,,,,,,,,,,,,0.06678014993667603,,,,,, +4,24149,,,,,,,,,,,,0.07093392312526703,,,,,, +4,24199,,,,,,,,,,,,0.07103750109672546,,,,,, +4,24249,,,,,,,,,,,,0.08349069207906723,,,,,, +4,24299,,,,,,,,,,,,0.08519408106803894,,,,,, +4,24349,,,,,,,,,,,,0.07882934808731079,,,,,, +4,24399,,,,,,,,,,,,0.07221810519695282,,,,,, +4,24449,,,,,,,,,,,,0.0696626529097557,,,,,, +4,24499,,,,,,,,,,,,0.07320699095726013,,,,,, +4,24549,,,,,,,,,,,,0.08114786446094513,,,,,, +4,24599,,,,,,,,,,,,0.06995439529418945,,,,,, +4,24649,,,,,,,,,,,,0.06890547275543213,,,,,, +4,24699,,,,,,,,,,,,0.06215353682637215,,,,,, +4,24749,,,,,,,,,,,,0.08036106824874878,,,,,, +4,24799,,,,,,,,,,,,0.08294625580310822,,,,,, +4,24849,,,,,,,,,,,,0.07324382662773132,,,,,, +4,24899,,,,,,,,,,,,0.0719708800315857,,,,,, +4,24949,,,,,,,,,,,,0.0685260072350502,,,,,, +4,24999,,,,,,,,,,,,0.07179917395114899,,,,,, +4,25049,,,,,,,,,,,,0.07368811964988708,,,,,, +4,25099,,,,,,,,,,,,0.06826817989349365,,,,,, +4,25149,,,,,,,,,,,,0.07459139823913574,,,,,, +4,25199,,,,,,,,,,,,0.0722818374633789,,,,,, +4,25249,,,,,,,,,,,,0.06822551786899567,,,,,, +4,25299,,,,,,,,,,,,0.07076066732406616,,,,,, +4,25349,,,,,,,,,,,,0.0762874111533165,,,,,, +4,25399,,,,,,,,,,,,0.06943254172801971,,,,,, +4,25449,,,,,,,,,,,,0.07037082314491272,,,,,, +4,25499,,,,,,,,,,,,0.08996789902448654,,,,,, +4,25549,,,,,,,,,,,,0.06575334072113037,,,,,, +4,25599,,,,,,,,,,,,0.08164447546005249,,,,,, +4,25649,,,,,,,,,,,,0.0736762061715126,,,,,, +4,25699,,,,,,,,,,,,0.0696558877825737,,,,,, +4,25749,,,,,,,,,,,,0.06530316174030304,,,,,, +4,25799,,,,,,,,,,,,0.07231912016868591,,,,,, +4,25849,,,,,,,,,,,,0.07666906714439392,,,,,, +4,25899,,,,,,,,,,,,0.07768090814352036,,,,,, +4,25949,,,,,,,,,,,,0.059872761368751526,,,,,, +4,25999,,,,,,,,,,,,0.07478225231170654,,,,,, +4,26049,,,,,,,,,,,,0.0691249668598175,,,,,, +4,26099,,,,,,,,,,,,0.07421097159385681,,,,,, +4,26149,,,,,,,,,,,,0.0763726532459259,,,,,, +4,26199,,,,,,,,,,,,0.06405331939458847,,,,,, +4,26249,,,,,,,,,,,,0.07109315693378448,,,,,, +4,26299,,,,,,,,,,,,0.07255247235298157,,,,,, +4,26349,,,,,,,,,,,,0.07399937510490417,,,,,, +4,26399,,,,,,,,,,,,0.06559120118618011,,,,,, +4,26449,,,,,,,,,,,,0.07117889821529388,,,,,, +4,26499,,,,,,,,,,,,0.06632009148597717,,,,,, +4,26549,,,,,,,,,,,,0.06997270882129669,,,,,, +4,26599,,,,,,,,,,,,0.07771727442741394,,,,,, +4,26649,,,,,,,,,,,,0.07555307447910309,,,,,, +4,26699,,,,,,,,,,,,0.07202758640050888,,,,,, +4,26749,,,,,,,,,,,,0.06137492507696152,,,,,, +4,26799,,,,,,,,,,,,0.07137976586818695,,,,,, +4,26849,,,,,,,,,,,,0.06549171358346939,,,,,, +4,26899,,,,,,,,,,,,0.06658561527729034,,,,,, +4,26949,,,,,,,,,,,,0.0705176442861557,,,,,, +4,26999,,,,,,,,,,,,0.08185401558876038,,,,,, +4,27049,,,,,,,,,,,,0.06309010088443756,,,,,, +4,27099,,,,,,,,,,,,0.07169930636882782,,,,,, +4,27149,,,,,,,,,,,,0.06735692918300629,,,,,, +4,27199,,,,,,,,,,,,0.08803681284189224,,,,,, +4,27249,,,,,,,,,,,,0.07631765305995941,,,,,, +4,27299,,,,,,,,,,,,0.0801132395863533,,,,,, +4,27349,,,,,,,,,,,,0.0739160105586052,,,,,, +4,27399,,,,,,,,,,,,0.06977517902851105,,,,,, +4,27449,,,,,,,,,,,,0.08123213052749634,,,,,, +4,27499,,,,,,,,,,,,0.08302916586399078,,,,,, +4,27549,,,,,,,,,,,,0.08513868600130081,,,,,, +4,27599,,,,,,,,,,,,0.07663866877555847,,,,,, +4,27649,,,,,,,,,,,,0.07922577857971191,,,,,, +4,27699,,,,,,,,,,,,0.06636911630630493,,,,,, +4,27749,,,,,,,,,,,,0.09001801908016205,,,,,, +4,27799,,,,,,,,,,,,0.0760185718536377,,,,,, +4,27849,,,,,,,,,,,,0.06928013265132904,,,,,, +4,27899,,,,,,,,,,,,0.08101451396942139,,,,,, +4,27949,,,,,,,,,,,,0.07143750041723251,,,,,, +4,27999,,,,,,,,,,,,0.06817754358053207,,,,,, +4,28049,,,,,,,,,,,,0.06514608860015869,,,,,, +4,28099,,,,,,,,,,,,0.08013726770877838,,,,,, +4,28149,,,,,,,,,,,,0.07745905220508575,,,,,, +4,28199,,,,,,,,,,,,0.06591008603572845,,,,,, +4,28249,,,,,,,,,,,,0.07210760563611984,,,,,, +4,28299,,,,,,,,,,,,0.06862711906433105,,,,,, +4,28349,,,,,,,,,,,,0.05706886947154999,,,,,, +4,28399,,,,,,,,,,,,0.07250376790761948,,,,,, +4,28449,,,,,,,,,,,,0.08237285166978836,,,,,, +4,28499,,,,,,,,,,,,0.06543321162462234,,,,,, +4,28549,,,,,,,,,,,,0.06845235824584961,,,,,, +4,28599,,,,,,,,,,,,0.08232523500919342,,,,,, +4,28649,,,,,,,,,,,,0.08480162173509598,,,,,, +4,28679,,,,,,,,,,,,,0.241278737783432,0.08135783672332764,0.2244858592748642,0.012897789478302002,0.22473517060279846,0.08135783672332764 +4,28679,,,,,,,0.2291242927312851,0.07284466177225113,0.346356064081192,0.11983388662338257,0.3313678801059723,,,,,,, +5,28699,,,,,,,,,,,,0.07792580872774124,,,,,, +5,28749,,,,,,,,,,,,0.07062371075153351,,,,,, +5,28799,,,,,,,,,,,,0.0739082396030426,,,,,, +5,28849,,,,,,,,,,,,0.08609767258167267,,,,,, +5,28899,,,,,,,,,,,,0.07224413752555847,,,,,, +5,28949,,,,,,,,,,,,0.077388696372509,,,,,, +5,28999,,,,,,,,,,,,0.06884230673313141,,,,,, +5,29049,,,,,,,,,,,,0.06016397476196289,,,,,, +5,29099,,,,,,,,,,,,0.08934469521045685,,,,,, +5,29149,,,,,,,,,,,,0.07151877135038376,,,,,, +5,29199,,,,,,,,,,,,0.06763797253370285,,,,,, +5,29249,,,,,,,,,,,,0.07378817349672318,,,,,, +5,29299,,,,,,,,,,,,0.08681739866733551,,,,,, +5,29349,,,,,,,,,,,,0.07951580733060837,,,,,, +5,29399,,,,,,,,,,,,0.06371088325977325,,,,,, +5,29449,,,,,,,,,,,,0.07893852144479752,,,,,, +5,29499,,,,,,,,,,,,0.06767036765813828,,,,,, +5,29549,,,,,,,,,,,,0.060423344373703,,,,,, +5,29599,,,,,,,,,,,,0.06935859471559525,,,,,, +5,29649,,,,,,,,,,,,0.08652794361114502,,,,,, +5,29699,,,,,,,,,,,,0.07074971497058868,,,,,, +5,29749,,,,,,,,,,,,0.07054520398378372,,,,,, +5,29799,,,,,,,,,,,,0.07151027768850327,,,,,, +5,29849,,,,,,,,,,,,0.06484468281269073,,,,,, +5,29899,,,,,,,,,,,,0.09219186007976532,,,,,, +5,29949,,,,,,,,,,,,0.07907681167125702,,,,,, +5,29999,,,,,,,,,,,,0.060234494507312775,,,,,, +5,30049,,,,,,,,,,,,0.07558412849903107,,,,,, +5,30099,,,,,,,,,,,,0.07372322678565979,,,,,, +5,30149,,,,,,,,,,,,0.07614585757255554,,,,,, +5,30199,,,,,,,,,,,,0.0774412751197815,,,,,, +5,30249,,,,,,,,,,,,0.07256826758384705,,,,,, +5,30299,,,,,,,,,,,,0.07153114676475525,,,,,, +5,30349,,,,,,,,,,,,0.07847434282302856,,,,,, +5,30399,,,,,,,,,,,,0.0757378488779068,,,,,, +5,30449,,,,,,,,,,,,0.0699538141489029,,,,,, +5,30499,,,,,,,,,,,,0.07581058144569397,,,,,, +5,30549,,,,,,,,,,,,0.07001298666000366,,,,,, +5,30599,,,,,,,,,,,,0.07337384670972824,,,,,, +5,30649,,,,,,,,,,,,0.05806838721036911,,,,,, +5,30699,,,,,,,,,,,,0.0622941292822361,,,,,, +5,30749,,,,,,,,,,,,0.06520508229732513,,,,,, +5,30799,,,,,,,,,,,,0.07683694362640381,,,,,, +5,30849,,,,,,,,,,,,0.07222053408622742,,,,,, +5,30899,,,,,,,,,,,,0.07445870339870453,,,,,, +5,30949,,,,,,,,,,,,0.07843346893787384,,,,,, +5,30999,,,,,,,,,,,,0.06330020725727081,,,,,, +5,31049,,,,,,,,,,,,0.08301319926977158,,,,,, +5,31099,,,,,,,,,,,,0.06952404975891113,,,,,, +5,31149,,,,,,,,,,,,0.07653556764125824,,,,,, +5,31199,,,,,,,,,,,,0.08599241822957993,,,,,, +5,31249,,,,,,,,,,,,0.05612906441092491,,,,,, +5,31299,,,,,,,,,,,,0.0683361142873764,,,,,, +5,31349,,,,,,,,,,,,0.07016149163246155,,,,,, +5,31399,,,,,,,,,,,,0.07352419942617416,,,,,, +5,31449,,,,,,,,,,,,0.07798469811677933,,,,,, +5,31499,,,,,,,,,,,,0.0793323889374733,,,,,, +5,31549,,,,,,,,,,,,0.07724566757678986,,,,,, +5,31599,,,,,,,,,,,,0.07653478533029556,,,,,, +5,31649,,,,,,,,,,,,0.08503613620996475,,,,,, +5,31699,,,,,,,,,,,,0.07871586084365845,,,,,, +5,31749,,,,,,,,,,,,0.07595653086900711,,,,,, +5,31799,,,,,,,,,,,,0.06633393466472626,,,,,, +5,31849,,,,,,,,,,,,0.0781971886754036,,,,,, +5,31899,,,,,,,,,,,,0.061226099729537964,,,,,, +5,31949,,,,,,,,,,,,0.06984977424144745,,,,,, +5,31999,,,,,,,,,,,,0.06073182821273804,,,,,, +5,32049,,,,,,,,,,,,0.06479056179523468,,,,,, +5,32099,,,,,,,,,,,,0.06538717448711395,,,,,, +5,32149,,,,,,,,,,,,0.06628049910068512,,,,,, +5,32199,,,,,,,,,,,,0.0662185400724411,,,,,, +5,32249,,,,,,,,,,,,0.06734220683574677,,,,,, +5,32299,,,,,,,,,,,,0.06959345191717148,,,,,, +5,32349,,,,,,,,,,,,0.07441289722919464,,,,,, +5,32399,,,,,,,,,,,,0.06997259706258774,,,,,, +5,32449,,,,,,,,,,,,0.07405829429626465,,,,,, +5,32499,,,,,,,,,,,,0.06521442532539368,,,,,, +5,32549,,,,,,,,,,,,0.07126429677009583,,,,,, +5,32599,,,,,,,,,,,,0.06058911979198456,,,,,, +5,32649,,,,,,,,,,,,0.06854204088449478,,,,,, +5,32699,,,,,,,,,,,,0.0769076943397522,,,,,, +5,32749,,,,,,,,,,,,0.06625477969646454,,,,,, +5,32799,,,,,,,,,,,,0.07413484901189804,,,,,, +5,32849,,,,,,,,,,,,0.07943429052829742,,,,,, +5,32899,,,,,,,,,,,,0.0680435448884964,,,,,, +5,32949,,,,,,,,,,,,0.06404319405555725,,,,,, +5,32999,,,,,,,,,,,,0.06693054735660553,,,,,, +5,33049,,,,,,,,,,,,0.06482745707035065,,,,,, +5,33099,,,,,,,,,,,,0.07098378986120224,,,,,, +5,33149,,,,,,,,,,,,0.07301812618970871,,,,,, +5,33199,,,,,,,,,,,,0.07117713242769241,,,,,, +5,33249,,,,,,,,,,,,0.07857122272253036,,,,,, +5,33299,,,,,,,,,,,,0.07951346039772034,,,,,, +5,33349,,,,,,,,,,,,0.08049468696117401,,,,,, +5,33399,,,,,,,,,,,,0.07341723889112473,,,,,, +5,33449,,,,,,,,,,,,0.06469166278839111,,,,,, +5,33499,,,,,,,,,,,,0.07903308421373367,,,,,, +5,33549,,,,,,,,,,,,0.06982965022325516,,,,,, +5,33599,,,,,,,,,,,,0.07701686024665833,,,,,, +5,33649,,,,,,,,,,,,0.06600279361009598,,,,,, +5,33699,,,,,,,,,,,,0.07298590242862701,,,,,, +5,33749,,,,,,,,,,,,0.08019505441188812,,,,,, +5,33799,,,,,,,,,,,,0.06779806315898895,,,,,, +5,33849,,,,,,,,,,,,0.07657451927661896,,,,,, +5,33899,,,,,,,,,,,,0.08422120660543442,,,,,, +5,33949,,,,,,,,,,,,0.0758737176656723,,,,,, +5,33999,,,,,,,,,,,,0.061777256429195404,,,,,, +5,34049,,,,,,,,,,,,0.06551150977611542,,,,,, +5,34099,,,,,,,,,,,,0.07036513835191727,,,,,, +5,34149,,,,,,,,,,,,0.06581397354602814,,,,,, +5,34199,,,,,,,,,,,,0.06293317675590515,,,,,, +5,34249,,,,,,,,,,,,0.07030816376209259,,,,,, +5,34299,,,,,,,,,,,,0.06691344827413559,,,,,, +5,34349,,,,,,,,,,,,0.07550510764122009,,,,,, +5,34399,,,,,,,,,,,,0.06858903169631958,,,,,, +5,34415,,,,,,,,,,,,,0.24690115451812744,0.08505599945783615,0.17024433612823486,-0.03197145462036133,0.16447722911834717,0.08505599945783615 +5,34415,,,,,,,0.22733651101589203,0.0719962865114212,0.3609725832939148,0.13009119033813477,0.34690481424331665,,,,,,, +6,34449,,,,,,,,,,,,0.07258697599172592,,,,,, +6,34499,,,,,,,,,,,,0.06902482360601425,,,,,, +6,34549,,,,,,,,,,,,0.06778117269277573,,,,,, +6,34599,,,,,,,,,,,,0.06802460551261902,,,,,, +6,34649,,,,,,,,,,,,0.07283230125904083,,,,,, +6,34699,,,,,,,,,,,,0.07715248316526413,,,,,, +6,34749,,,,,,,,,,,,0.06729220598936081,,,,,, +6,34799,,,,,,,,,,,,0.07262333482503891,,,,,, +6,34849,,,,,,,,,,,,0.0758676528930664,,,,,, +6,34899,,,,,,,,,,,,0.0789603739976883,,,,,, +6,34949,,,,,,,,,,,,0.08591627329587936,,,,,, +6,34999,,,,,,,,,,,,0.06480913609266281,,,,,, +6,35049,,,,,,,,,,,,0.0694236308336258,,,,,, +6,35099,,,,,,,,,,,,0.07740519195795059,,,,,, +6,35149,,,,,,,,,,,,0.0800170823931694,,,,,, +6,35199,,,,,,,,,,,,0.07307294011116028,,,,,, +6,35249,,,,,,,,,,,,0.06938542425632477,,,,,, +6,35299,,,,,,,,,,,,0.05994034931063652,,,,,, +6,35349,,,,,,,,,,,,0.08384954184293747,,,,,, +6,35399,,,,,,,,,,,,0.07059980183839798,,,,,, +6,35449,,,,,,,,,,,,0.07135353982448578,,,,,, +6,35499,,,,,,,,,,,,0.07638251781463623,,,,,, +6,35549,,,,,,,,,,,,0.07108444720506668,,,,,, +6,35599,,,,,,,,,,,,0.07878740131855011,,,,,, +6,35649,,,,,,,,,,,,0.07002770900726318,,,,,, +6,35699,,,,,,,,,,,,0.06099258363246918,,,,,, +6,35749,,,,,,,,,,,,0.07021626830101013,,,,,, +6,35799,,,,,,,,,,,,0.08099778741598129,,,,,, +6,35849,,,,,,,,,,,,0.0658944696187973,,,,,, +6,35899,,,,,,,,,,,,0.06284134089946747,,,,,, +6,35949,,,,,,,,,,,,0.07127813994884491,,,,,, +6,35999,,,,,,,,,,,,0.06487336754798889,,,,,, +6,36049,,,,,,,,,,,,0.07469959557056427,,,,,, +6,36099,,,,,,,,,,,,0.06578986346721649,,,,,, +6,36149,,,,,,,,,,,,0.05820997804403305,,,,,, +6,36199,,,,,,,,,,,,0.07545371353626251,,,,,, +6,36249,,,,,,,,,,,,0.06548482179641724,,,,,, +6,36299,,,,,,,,,,,,0.07639490067958832,,,,,, +6,36349,,,,,,,,,,,,0.06376852095127106,,,,,, +6,36399,,,,,,,,,,,,0.06280797719955444,,,,,, +6,36449,,,,,,,,,,,,0.06306082010269165,,,,,, +6,36499,,,,,,,,,,,,0.07234390825033188,,,,,, +6,36549,,,,,,,,,,,,0.067221999168396,,,,,, +6,36599,,,,,,,,,,,,0.06549648195505142,,,,,, +6,36649,,,,,,,,,,,,0.07566717267036438,,,,,, +6,36699,,,,,,,,,,,,0.06522206217050552,,,,,, +6,36749,,,,,,,,,,,,0.06245266646146774,,,,,, +6,36799,,,,,,,,,,,,0.08235705643892288,,,,,, +6,36849,,,,,,,,,,,,0.07041357457637787,,,,,, +6,36899,,,,,,,,,,,,0.0721149891614914,,,,,, +6,36949,,,,,,,,,,,,0.08014754205942154,,,,,, +6,36999,,,,,,,,,,,,0.06706716865301132,,,,,, +6,37049,,,,,,,,,,,,0.07631566375494003,,,,,, +6,37099,,,,,,,,,,,,0.06586360931396484,,,,,, +6,37149,,,,,,,,,,,,0.06683161109685898,,,,,, +6,37199,,,,,,,,,,,,0.07854342460632324,,,,,, +6,37249,,,,,,,,,,,,0.07861830294132233,,,,,, +6,37299,,,,,,,,,,,,0.08122783899307251,,,,,, +6,37349,,,,,,,,,,,,0.06548705697059631,,,,,, +6,37399,,,,,,,,,,,,0.06490467488765717,,,,,, +6,37449,,,,,,,,,,,,0.08264967799186707,,,,,, +6,37499,,,,,,,,,,,,0.0848938524723053,,,,,, +6,37549,,,,,,,,,,,,0.0655812919139862,,,,,, +6,37599,,,,,,,,,,,,0.069806769490242,,,,,, +6,37649,,,,,,,,,,,,0.0776011198759079,,,,,, +6,37699,,,,,,,,,,,,0.07548560202121735,,,,,, +6,37749,,,,,,,,,,,,0.07965067774057388,,,,,, +6,37799,,,,,,,,,,,,0.06681064516305923,,,,,, +6,37849,,,,,,,,,,,,0.061651818454265594,,,,,, +6,37899,,,,,,,,,,,,0.07474955916404724,,,,,, +6,37949,,,,,,,,,,,,0.068684421479702,,,,,, +6,37999,,,,,,,,,,,,0.0692165270447731,,,,,, +6,38049,,,,,,,,,,,,0.07562991976737976,,,,,, +6,38099,,,,,,,,,,,,0.07283669710159302,,,,,, +6,38149,,,,,,,,,,,,0.06792697310447693,,,,,, +6,38199,,,,,,,,,,,,0.0661720409989357,,,,,, +6,38249,,,,,,,,,,,,0.07116413116455078,,,,,, +6,38299,,,,,,,,,,,,0.06561138480901718,,,,,, +6,38349,,,,,,,,,,,,0.07616625726222992,,,,,, +6,38399,,,,,,,,,,,,0.08360908180475235,,,,,, +6,38449,,,,,,,,,,,,0.08944188058376312,,,,,, +6,38499,,,,,,,,,,,,0.07005535066127777,,,,,, +6,38549,,,,,,,,,,,,0.07577921450138092,,,,,, +6,38599,,,,,,,,,,,,0.08427174389362335,,,,,, +6,38649,,,,,,,,,,,,0.0747033953666687,,,,,, +6,38699,,,,,,,,,,,,0.06500105559825897,,,,,, +6,38749,,,,,,,,,,,,0.07112029194831848,,,,,, +6,38799,,,,,,,,,,,,0.06209471449255943,,,,,, +6,38849,,,,,,,,,,,,0.06641893088817596,,,,,, +6,38899,,,,,,,,,,,,0.07451961934566498,,,,,, +6,38949,,,,,,,,,,,,0.056219954043626785,,,,,, +6,38999,,,,,,,,,,,,0.07170513272285461,,,,,, +6,39049,,,,,,,,,,,,0.07887659966945648,,,,,, +6,39099,,,,,,,,,,,,0.06773632764816284,,,,,, +6,39149,,,,,,,,,,,,0.0790359303355217,,,,,, +6,39199,,,,,,,,,,,,0.07418210804462433,,,,,, +6,39249,,,,,,,,,,,,0.06715067476034164,,,,,, +6,39299,,,,,,,,,,,,0.07457688450813293,,,,,, +6,39349,,,,,,,,,,,,0.06828738749027252,,,,,, +6,39399,,,,,,,,,,,,0.08330269157886505,,,,,, +6,39449,,,,,,,,,,,,0.05816110968589783,,,,,, +6,39499,,,,,,,,,,,,0.07339600473642349,,,,,, +6,39549,,,,,,,,,,,,0.062103189527988434,,,,,, +6,39599,,,,,,,,,,,,0.07287147641181946,,,,,, +6,39649,,,,,,,,,,,,0.06571388244628906,,,,,, +6,39699,,,,,,,,,,,,0.0781850665807724,,,,,, +6,39749,,,,,,,,,,,,0.06730975210666656,,,,,, +6,39799,,,,,,,,,,,,0.06499513238668442,,,,,, +6,39849,,,,,,,,,,,,0.07261133193969727,,,,,, +6,39899,,,,,,,,,,,,0.06228798255324364,,,,,, +6,39949,,,,,,,,,,,,0.07779262959957123,,,,,, +6,39999,,,,,,,,,,,,0.06677082926034927,,,,,, +6,40049,,,,,,,,,,,,0.0713765025138855,,,,,, +6,40099,,,,,,,,,,,,0.07654166221618652,,,,,, +6,40149,,,,,,,,,,,,0.08098219335079193,,,,,, +6,40151,,,,,,,,,,,,,0.24408641457557678,0.08317145705223083,0.1916338950395584,-0.00910651683807373,0.19765937328338623,0.08317145705223083 +6,40151,,,,,,,0.2256036400794983,0.07102680206298828,0.3767392039299011,0.1417863965034485,0.3608010709285736,,,,,,, +7,40199,,,,,,,,,,,,0.0605250746011734,,,,,, +7,40249,,,,,,,,,,,,0.07151806354522705,,,,,, +7,40299,,,,,,,,,,,,0.06949403136968613,,,,,, +7,40349,,,,,,,,,,,,0.0679263174533844,,,,,, +7,40399,,,,,,,,,,,,0.06285746395587921,,,,,, +7,40449,,,,,,,,,,,,0.06493759155273438,,,,,, +7,40499,,,,,,,,,,,,0.06712222844362259,,,,,, +7,40549,,,,,,,,,,,,0.0789901539683342,,,,,, +7,40599,,,,,,,,,,,,0.07495994865894318,,,,,, +7,40649,,,,,,,,,,,,0.07834583520889282,,,,,, +7,40699,,,,,,,,,,,,0.08086641132831573,,,,,, +7,40749,,,,,,,,,,,,0.06670520454645157,,,,,, +7,40799,,,,,,,,,,,,0.07960878312587738,,,,,, +7,40849,,,,,,,,,,,,0.0746174156665802,,,,,, +7,40899,,,,,,,,,,,,0.07148407399654388,,,,,, +7,40949,,,,,,,,,,,,0.06743302941322327,,,,,, +7,40999,,,,,,,,,,,,0.06497946381568909,,,,,, +7,41049,,,,,,,,,,,,0.07398445904254913,,,,,, +7,41099,,,,,,,,,,,,0.07281450927257538,,,,,, +7,41149,,,,,,,,,,,,0.06591218709945679,,,,,, +7,41199,,,,,,,,,,,,0.07440999895334244,,,,,, +7,41249,,,,,,,,,,,,0.0747738927602768,,,,,, +7,41299,,,,,,,,,,,,0.06461112201213837,,,,,, +7,41349,,,,,,,,,,,,0.0709565207362175,,,,,, +7,41399,,,,,,,,,,,,0.07172324508428574,,,,,, +7,41449,,,,,,,,,,,,0.07085984945297241,,,,,, +7,41499,,,,,,,,,,,,0.08379523456096649,,,,,, +7,41549,,,,,,,,,,,,0.06384673714637756,,,,,, +7,41599,,,,,,,,,,,,0.07948340475559235,,,,,, +7,41649,,,,,,,,,,,,0.07029339671134949,,,,,, +7,41699,,,,,,,,,,,,0.07333410531282425,,,,,, +7,41749,,,,,,,,,,,,0.07986702024936676,,,,,, +7,41799,,,,,,,,,,,,0.06818176805973053,,,,,, +7,41849,,,,,,,,,,,,0.0706748366355896,,,,,, +7,41899,,,,,,,,,,,,0.06472823768854141,,,,,, +7,41949,,,,,,,,,,,,0.0607292614877224,,,,,, +7,41999,,,,,,,,,,,,0.06870297342538834,,,,,, +7,42049,,,,,,,,,,,,0.06351808458566666,,,,,, +7,42099,,,,,,,,,,,,0.07094468176364899,,,,,, +7,42149,,,,,,,,,,,,0.08179543167352676,,,,,, +7,42199,,,,,,,,,,,,0.07126522064208984,,,,,, +7,42249,,,,,,,,,,,,0.06961370259523392,,,,,, +7,42299,,,,,,,,,,,,0.08045978844165802,,,,,, +7,42349,,,,,,,,,,,,0.07014689594507217,,,,,, +7,42399,,,,,,,,,,,,0.06508241593837738,,,,,, +7,42449,,,,,,,,,,,,0.07150353491306305,,,,,, +7,42499,,,,,,,,,,,,0.07325031608343124,,,,,, +7,42549,,,,,,,,,,,,0.07438724488019943,,,,,, +7,42599,,,,,,,,,,,,0.06422284245491028,,,,,, +7,42649,,,,,,,,,,,,0.06787151843309402,,,,,, +7,42699,,,,,,,,,,,,0.07220882177352905,,,,,, +7,42749,,,,,,,,,,,,0.07272288203239441,,,,,, +7,42799,,,,,,,,,,,,0.0685093104839325,,,,,, +7,42849,,,,,,,,,,,,0.059533849358558655,,,,,, +7,42899,,,,,,,,,,,,0.07658025622367859,,,,,, +7,42949,,,,,,,,,,,,0.07882426679134369,,,,,, +7,42999,,,,,,,,,,,,0.07329920679330826,,,,,, +7,43049,,,,,,,,,,,,0.07480323314666748,,,,,, +7,43099,,,,,,,,,,,,0.06927183270454407,,,,,, +7,43149,,,,,,,,,,,,0.06445227563381195,,,,,, +7,43199,,,,,,,,,,,,0.06129121780395508,,,,,, +7,43249,,,,,,,,,,,,0.0747990757226944,,,,,, +7,43299,,,,,,,,,,,,0.07297377288341522,,,,,, +7,43349,,,,,,,,,,,,0.08054590970277786,,,,,, +7,43399,,,,,,,,,,,,0.07355141639709473,,,,,, +7,43449,,,,,,,,,,,,0.06899994611740112,,,,,, +7,43499,,,,,,,,,,,,0.06704909354448318,,,,,, +7,43549,,,,,,,,,,,,0.06564437597990036,,,,,, +7,43599,,,,,,,,,,,,0.07366101443767548,,,,,, +7,43649,,,,,,,,,,,,0.0652034804224968,,,,,, +7,43699,,,,,,,,,,,,0.08600609004497528,,,,,, +7,43749,,,,,,,,,,,,0.06289777904748917,,,,,, +7,43799,,,,,,,,,,,,0.07030187547206879,,,,,, +7,43849,,,,,,,,,,,,0.06414678692817688,,,,,, +7,43899,,,,,,,,,,,,0.07902373373508453,,,,,, +7,43949,,,,,,,,,,,,0.06337490677833557,,,,,, +7,43999,,,,,,,,,,,,0.05822407454252243,,,,,, +7,44049,,,,,,,,,,,,0.0720016211271286,,,,,, +7,44099,,,,,,,,,,,,0.06755872070789337,,,,,, +7,44149,,,,,,,,,,,,0.06916352361440659,,,,,, +7,44199,,,,,,,,,,,,0.06259435415267944,,,,,, +7,44249,,,,,,,,,,,,0.07593415677547455,,,,,, +7,44299,,,,,,,,,,,,0.07208552956581116,,,,,, +7,44349,,,,,,,,,,,,0.06941725313663483,,,,,, +7,44399,,,,,,,,,,,,0.06893883645534515,,,,,, +7,44449,,,,,,,,,,,,0.059866663068532944,,,,,, +7,44499,,,,,,,,,,,,0.06984937936067581,,,,,, +7,44549,,,,,,,,,,,,0.07657702267169952,,,,,, +7,44599,,,,,,,,,,,,0.07734622061252594,,,,,, +7,44649,,,,,,,,,,,,0.061045750975608826,,,,,, +7,44699,,,,,,,,,,,,0.06996385753154755,,,,,, +7,44749,,,,,,,,,,,,0.06455016136169434,,,,,, +7,44799,,,,,,,,,,,,0.0639311671257019,,,,,, +7,44849,,,,,,,,,,,,0.074123315513134,,,,,, +7,44899,,,,,,,,,,,,0.0604683980345726,,,,,, +7,44949,,,,,,,,,,,,0.062156010419130325,,,,,, +7,44999,,,,,,,,,,,,0.07669475674629211,,,,,, +7,45049,,,,,,,,,,,,0.06425627321004868,,,,,, +7,45099,,,,,,,,,,,,0.08053457736968994,,,,,, +7,45149,,,,,,,,,,,,0.06512143462896347,,,,,, +7,45199,,,,,,,,,,,,0.06969064474105835,,,,,, +7,45249,,,,,,,,,,,,0.07252275943756104,,,,,, +7,45299,,,,,,,,,,,,0.07452263683080673,,,,,, +7,45349,,,,,,,,,,,,0.0733938217163086,,,,,, +7,45399,,,,,,,,,,,,0.08187978714704514,,,,,, +7,45449,,,,,,,,,,,,0.0701780915260315,,,,,, +7,45499,,,,,,,,,,,,0.05588330700993538,,,,,, +7,45549,,,,,,,,,,,,0.07083754241466522,,,,,, +7,45599,,,,,,,,,,,,0.06861042231321335,,,,,, +7,45649,,,,,,,,,,,,0.058925386518239975,,,,,, +7,45699,,,,,,,,,,,,0.06935226172208786,,,,,, +7,45749,,,,,,,,,,,,0.07065931707620621,,,,,, +7,45799,,,,,,,,,,,,0.07197453081607819,,,,,, +7,45849,,,,,,,,,,,,0.07252702116966248,,,,,, +7,45887,,,,,,,,,,,,,0.24224041402339935,0.08299791812896729,0.23048265278339386,-0.007001042366027832,0.23477260768413544,0.08299791812896729 +7,45887,,,,,,,0.22562818229198456,0.07182767987251282,0.36528533697128296,0.13210898637771606,0.3601700961589813,,,,,,, +8,45899,,,,,,,,,,,,0.07465897500514984,,,,,, +8,45949,,,,,,,,,,,,0.07413120567798615,,,,,, +8,45999,,,,,,,,,,,,0.06742437928915024,,,,,, +8,46049,,,,,,,,,,,,0.07904480397701263,,,,,, +8,46099,,,,,,,,,,,,0.0857362449169159,,,,,, +8,46149,,,,,,,,,,,,0.06464684009552002,,,,,, +8,46199,,,,,,,,,,,,0.07931512594223022,,,,,, +8,46249,,,,,,,,,,,,0.05963830649852753,,,,,, +8,46299,,,,,,,,,,,,0.07965834438800812,,,,,, +8,46349,,,,,,,,,,,,0.06909827888011932,,,,,, +8,46399,,,,,,,,,,,,0.06455116719007492,,,,,, +8,46449,,,,,,,,,,,,0.06481561064720154,,,,,, +8,46499,,,,,,,,,,,,0.06697387993335724,,,,,, +8,46549,,,,,,,,,,,,0.06208552420139313,,,,,, +8,46599,,,,,,,,,,,,0.06724914163351059,,,,,, +8,46649,,,,,,,,,,,,0.055109284818172455,,,,,, +8,46699,,,,,,,,,,,,0.07247966527938843,,,,,, +8,46749,,,,,,,,,,,,0.06612768769264221,,,,,, +8,46799,,,,,,,,,,,,0.054670579731464386,,,,,, +8,46849,,,,,,,,,,,,0.06579083949327469,,,,,, +8,46899,,,,,,,,,,,,0.08232098817825317,,,,,, +8,46949,,,,,,,,,,,,0.06520301103591919,,,,,, +8,46999,,,,,,,,,,,,0.08306337893009186,,,,,, +8,47049,,,,,,,,,,,,0.06610773503780365,,,,,, +8,47099,,,,,,,,,,,,0.07889413833618164,,,,,, +8,47149,,,,,,,,,,,,0.07672169804573059,,,,,, +8,47199,,,,,,,,,,,,0.06497727334499359,,,,,, +8,47249,,,,,,,,,,,,0.053592562675476074,,,,,, +8,47299,,,,,,,,,,,,0.07392672449350357,,,,,, +8,47349,,,,,,,,,,,,0.06365061551332474,,,,,, +8,47399,,,,,,,,,,,,0.055739935487508774,,,,,, +8,47449,,,,,,,,,,,,0.07260651886463165,,,,,, +8,47499,,,,,,,,,,,,0.06381335109472275,,,,,, +8,47549,,,,,,,,,,,,0.0754699558019638,,,,,, +8,47599,,,,,,,,,,,,0.0719466507434845,,,,,, +8,47649,,,,,,,,,,,,0.05898769944906235,,,,,, +8,47699,,,,,,,,,,,,0.06338587403297424,,,,,, +8,47749,,,,,,,,,,,,0.07644947618246078,,,,,, +8,47799,,,,,,,,,,,,0.06703044474124908,,,,,, +8,47849,,,,,,,,,,,,0.06925904750823975,,,,,, +8,47899,,,,,,,,,,,,0.06558725237846375,,,,,, +8,47949,,,,,,,,,,,,0.07485658675432205,,,,,, +8,47999,,,,,,,,,,,,0.06396058946847916,,,,,, +8,48049,,,,,,,,,,,,0.08038856834173203,,,,,, +8,48099,,,,,,,,,,,,0.06939481198787689,,,,,, +8,48149,,,,,,,,,,,,0.06667809188365936,,,,,, +8,48199,,,,,,,,,,,,0.06434346735477448,,,,,, +8,48249,,,,,,,,,,,,0.06536748260259628,,,,,, +8,48299,,,,,,,,,,,,0.06381116062402725,,,,,, +8,48349,,,,,,,,,,,,0.07469198107719421,,,,,, +8,48399,,,,,,,,,,,,0.06542673707008362,,,,,, +8,48449,,,,,,,,,,,,0.06489453464746475,,,,,, +8,48499,,,,,,,,,,,,0.06173962727189064,,,,,, +8,48549,,,,,,,,,,,,0.06929778307676315,,,,,, +8,48599,,,,,,,,,,,,0.07755282521247864,,,,,, +8,48649,,,,,,,,,,,,0.057806529104709625,,,,,, +8,48699,,,,,,,,,,,,0.06555256992578506,,,,,, +8,48749,,,,,,,,,,,,0.07013117522001266,,,,,, +8,48799,,,,,,,,,,,,0.06956357508897781,,,,,, +8,48849,,,,,,,,,,,,0.06538885831832886,,,,,, +8,48899,,,,,,,,,,,,0.07725682109594345,,,,,, +8,48949,,,,,,,,,,,,0.06465592980384827,,,,,, +8,48999,,,,,,,,,,,,0.06809036433696747,,,,,, +8,49049,,,,,,,,,,,,0.07305355370044708,,,,,, +8,49099,,,,,,,,,,,,0.07647699862718582,,,,,, +8,49149,,,,,,,,,,,,0.07406672835350037,,,,,, +8,49199,,,,,,,,,,,,0.06249925494194031,,,,,, +8,49249,,,,,,,,,,,,0.08255041390657425,,,,,, +8,49299,,,,,,,,,,,,0.06945911794900894,,,,,, +8,49349,,,,,,,,,,,,0.06682135909795761,,,,,, +8,49399,,,,,,,,,,,,0.07764686644077301,,,,,, +8,49449,,,,,,,,,,,,0.07376463711261749,,,,,, +8,49499,,,,,,,,,,,,0.06887272000312805,,,,,, +8,49549,,,,,,,,,,,,0.07532888650894165,,,,,, +8,49599,,,,,,,,,,,,0.06521673500537872,,,,,, +8,49649,,,,,,,,,,,,0.06660116463899612,,,,,, +8,49699,,,,,,,,,,,,0.05470170080661774,,,,,, +8,49749,,,,,,,,,,,,0.059271931648254395,,,,,, +8,49799,,,,,,,,,,,,0.06789673119783401,,,,,, +8,49849,,,,,,,,,,,,0.06937407702207565,,,,,, +8,49899,,,,,,,,,,,,0.08009415864944458,,,,,, +8,49949,,,,,,,,,,,,0.06470288336277008,,,,,, +8,49999,,,,,,,,,,,,0.06062038242816925,,,,,, +8,50049,,,,,,,,,,,,0.07351906597614288,,,,,, +8,50099,,,,,,,,,,,,0.06861384212970734,,,,,, +8,50149,,,,,,,,,,,,0.07039405405521393,,,,,, +8,50199,,,,,,,,,,,,0.06827790290117264,,,,,, +8,50249,,,,,,,,,,,,0.06248084455728531,,,,,, +8,50299,,,,,,,,,,,,0.07146723568439484,,,,,, +8,50349,,,,,,,,,,,,0.07149780541658401,,,,,, +8,50399,,,,,,,,,,,,0.05733845755457878,,,,,, +8,50449,,,,,,,,,,,,0.06360922753810883,,,,,, +8,50499,,,,,,,,,,,,0.07106905430555344,,,,,, +8,50549,,,,,,,,,,,,0.06477738916873932,,,,,, +8,50599,,,,,,,,,,,,0.07924186438322067,,,,,, +8,50649,,,,,,,,,,,,0.07659509778022766,,,,,, +8,50699,,,,,,,,,,,,0.0657142698764801,,,,,, +8,50749,,,,,,,,,,,,0.05705365911126137,,,,,, +8,50799,,,,,,,,,,,,0.06968089938163757,,,,,, +8,50849,,,,,,,,,,,,0.06121377646923065,,,,,, +8,50899,,,,,,,,,,,,0.07389520108699799,,,,,, +8,50949,,,,,,,,,,,,0.05906551703810692,,,,,, +8,50999,,,,,,,,,,,,0.06974443048238754,,,,,, +8,51049,,,,,,,,,,,,0.06199552118778229,,,,,, +8,51099,,,,,,,,,,,,0.05601947754621506,,,,,, +8,51149,,,,,,,,,,,,0.0602937713265419,,,,,, +8,51199,,,,,,,,,,,,0.06370580196380615,,,,,, +8,51249,,,,,,,,,,,,0.055679891258478165,,,,,, +8,51299,,,,,,,,,,,,0.08007699251174927,,,,,, +8,51349,,,,,,,,,,,,0.06848189234733582,,,,,, +8,51399,,,,,,,,,,,,0.05185206979513168,,,,,, +8,51449,,,,,,,,,,,,0.06170657277107239,,,,,, +8,51499,,,,,,,,,,,,0.07239372283220291,,,,,, +8,51549,,,,,,,,,,,,0.06771865487098694,,,,,, +8,51599,,,,,,,,,,,,0.05304215848445892,,,,,, +8,51623,,,,,,,,,,,,,0.23922960460186005,0.07855641841888428,0.228691965341568,0.046886980533599854,0.22630755603313446,0.07855641841888428 +8,51623,,,,,,,0.22055064141750336,0.06848841905593872,0.41532933712005615,0.17246371507644653,0.3961709439754486,,,,,,, +9,51649,,,,,,,,,,,,0.06473658233880997,,,,,, +9,51699,,,,,,,,,,,,0.0687410980463028,,,,,, +9,51749,,,,,,,,,,,,0.06497667729854584,,,,,, +9,51799,,,,,,,,,,,,0.06257086992263794,,,,,, +9,51849,,,,,,,,,,,,0.06538273394107819,,,,,, +9,51899,,,,,,,,,,,,0.0725688636302948,,,,,, +9,51949,,,,,,,,,,,,0.07606415450572968,,,,,, +9,51999,,,,,,,,,,,,0.06925796717405319,,,,,, +9,52049,,,,,,,,,,,,0.06967626512050629,,,,,, +9,52099,,,,,,,,,,,,0.07053928822278976,,,,,, +9,52149,,,,,,,,,,,,0.06345653533935547,,,,,, +9,52199,,,,,,,,,,,,0.06723982095718384,,,,,, +9,52249,,,,,,,,,,,,0.06697097420692444,,,,,, +9,52299,,,,,,,,,,,,0.06717993319034576,,,,,, +9,52349,,,,,,,,,,,,0.06569163501262665,,,,,, +9,52399,,,,,,,,,,,,0.07403482496738434,,,,,, +9,52449,,,,,,,,,,,,0.0704728290438652,,,,,, +9,52499,,,,,,,,,,,,0.06566974520683289,,,,,, +9,52549,,,,,,,,,,,,0.06096801906824112,,,,,, +9,52599,,,,,,,,,,,,0.07324012368917465,,,,,, +9,52649,,,,,,,,,,,,0.058030106127262115,,,,,, +9,52699,,,,,,,,,,,,0.0742296427488327,,,,,, +9,52749,,,,,,,,,,,,0.055278487503528595,,,,,, +9,52799,,,,,,,,,,,,0.07120811939239502,,,,,, +9,52849,,,,,,,,,,,,0.06994155049324036,,,,,, +9,52899,,,,,,,,,,,,0.06873372197151184,,,,,, +9,52949,,,,,,,,,,,,0.0865413099527359,,,,,, +9,52999,,,,,,,,,,,,0.05857259780168533,,,,,, +9,53049,,,,,,,,,,,,0.07099684327840805,,,,,, +9,53099,,,,,,,,,,,,0.057815760374069214,,,,,, +9,53149,,,,,,,,,,,,0.07756581157445908,,,,,, +9,53199,,,,,,,,,,,,0.061097148805856705,,,,,, +9,53249,,,,,,,,,,,,0.076720230281353,,,,,, +9,53299,,,,,,,,,,,,0.06906283646821976,,,,,, +9,53349,,,,,,,,,,,,0.057577818632125854,,,,,, +9,53399,,,,,,,,,,,,0.07314985990524292,,,,,, +9,53449,,,,,,,,,,,,0.07751919329166412,,,,,, +9,53499,,,,,,,,,,,,0.06573495268821716,,,,,, +9,53549,,,,,,,,,,,,0.05995388329029083,,,,,, +9,53599,,,,,,,,,,,,0.06478462368249893,,,,,, +9,53649,,,,,,,,,,,,0.07481487095355988,,,,,, +9,53699,,,,,,,,,,,,0.06876632571220398,,,,,, +9,53749,,,,,,,,,,,,0.07250301539897919,,,,,, +9,53799,,,,,,,,,,,,0.05934777110815048,,,,,, +9,53849,,,,,,,,,,,,0.07506376504898071,,,,,, +9,53899,,,,,,,,,,,,0.06302724778652191,,,,,, +9,53949,,,,,,,,,,,,0.06652645021677017,,,,,, +9,53999,,,,,,,,,,,,0.07029356062412262,,,,,, +9,54049,,,,,,,,,,,,0.05864548683166504,,,,,, +9,54099,,,,,,,,,,,,0.07502225041389465,,,,,, +9,54149,,,,,,,,,,,,0.0574508011341095,,,,,, +9,54199,,,,,,,,,,,,0.0731414183974266,,,,,, +9,54249,,,,,,,,,,,,0.0675206184387207,,,,,, +9,54299,,,,,,,,,,,,0.06454123556613922,,,,,, +9,54349,,,,,,,,,,,,0.06749290227890015,,,,,, +9,54399,,,,,,,,,,,,0.06165590137243271,,,,,, +9,54449,,,,,,,,,,,,0.062377654016017914,,,,,, +9,54499,,,,,,,,,,,,0.06475228071212769,,,,,, +9,54549,,,,,,,,,,,,0.07321436703205109,,,,,, +9,54599,,,,,,,,,,,,0.07906204462051392,,,,,, +9,54649,,,,,,,,,,,,0.07039520889520645,,,,,, +9,54699,,,,,,,,,,,,0.06489242613315582,,,,,, +9,54749,,,,,,,,,,,,0.08046376705169678,,,,,, +9,54799,,,,,,,,,,,,0.052357494831085205,,,,,, +9,54849,,,,,,,,,,,,0.05663801729679108,,,,,, +9,54899,,,,,,,,,,,,0.07247494161128998,,,,,, +9,54949,,,,,,,,,,,,0.059105321764945984,,,,,, +9,54999,,,,,,,,,,,,0.07070469111204147,,,,,, +9,55049,,,,,,,,,,,,0.057173117995262146,,,,,, +9,55099,,,,,,,,,,,,0.06591888517141342,,,,,, +9,55149,,,,,,,,,,,,0.05637139081954956,,,,,, +9,55199,,,,,,,,,,,,0.06819139420986176,,,,,, +9,55249,,,,,,,,,,,,0.06007053330540657,,,,,, +9,55299,,,,,,,,,,,,0.06737005710601807,,,,,, +9,55349,,,,,,,,,,,,0.06597494333982468,,,,,, +9,55399,,,,,,,,,,,,0.07195566594600677,,,,,, +9,55449,,,,,,,,,,,,0.04746338725090027,,,,,, +9,55499,,,,,,,,,,,,0.059613391757011414,,,,,, +9,55549,,,,,,,,,,,,0.06560686230659485,,,,,, +9,55599,,,,,,,,,,,,0.07142065465450287,,,,,, +9,55649,,,,,,,,,,,,0.06929807364940643,,,,,, +9,55699,,,,,,,,,,,,0.07018974423408508,,,,,, +9,55749,,,,,,,,,,,,0.07627598941326141,,,,,, +9,55799,,,,,,,,,,,,0.06106580048799515,,,,,, +9,55849,,,,,,,,,,,,0.07727604359388351,,,,,, +9,55899,,,,,,,,,,,,0.0602530762553215,,,,,, +9,55949,,,,,,,,,,,,0.06387034058570862,,,,,, +9,55999,,,,,,,,,,,,0.07475617527961731,,,,,, +9,56049,,,,,,,,,,,,0.059851791709661484,,,,,, +9,56099,,,,,,,,,,,,0.0628490000963211,,,,,, +9,56149,,,,,,,,,,,,0.06918085366487503,,,,,, +9,56199,,,,,,,,,,,,0.06228785961866379,,,,,, +9,56249,,,,,,,,,,,,0.06864920258522034,,,,,, +9,56299,,,,,,,,,,,,0.06561606377363205,,,,,, +9,56349,,,,,,,,,,,,0.06522226333618164,,,,,, +9,56399,,,,,,,,,,,,0.06407297402620316,,,,,, +9,56449,,,,,,,,,,,,0.0643799751996994,,,,,, +9,56499,,,,,,,,,,,,0.07055366039276123,,,,,, +9,56549,,,,,,,,,,,,0.07484650611877441,,,,,, +9,56599,,,,,,,,,,,,0.07301220297813416,,,,,, +9,56649,,,,,,,,,,,,0.07332292199134827,,,,,, +9,56699,,,,,,,,,,,,0.0713682621717453,,,,,, +9,56749,,,,,,,,,,,,0.06234487146139145,,,,,, +9,56799,,,,,,,,,,,,0.07515440881252289,,,,,, +9,56849,,,,,,,,,,,,0.0694657638669014,,,,,, +9,56899,,,,,,,,,,,,0.07012560963630676,,,,,, +9,56949,,,,,,,,,,,,0.07205316424369812,,,,,, +9,56999,,,,,,,,,,,,0.08048795163631439,,,,,, +9,57049,,,,,,,,,,,,0.07340963184833527,,,,,, +9,57099,,,,,,,,,,,,0.06375644356012344,,,,,, +9,57149,,,,,,,,,,,,0.07308028638362885,,,,,, +9,57199,,,,,,,,,,,,0.06595435738563538,,,,,, +9,57249,,,,,,,,,,,,0.05494419485330582,,,,,, +9,57299,,,,,,,,,,,,0.05745205283164978,,,,,, +9,57349,,,,,,,,,,,,0.05512997508049011,,,,,, +9,57359,,,,,,,,,,,,,0.2410164177417755,0.08219094574451447,0.2250303030014038,0.0027898550033569336,0.23244048655033112,0.08219094574451447 +9,57359,,,,,,,0.2190544605255127,0.06771110743284225,0.42647942900657654,0.18186110258102417,0.4076480567455292,,,,,,, +10,57399,,,,,,,,,,,,0.06179092824459076,,,,,, +10,57449,,,,,,,,,,,,0.06996482610702515,,,,,, +10,57499,,,,,,,,,,,,0.07161251455545425,,,,,, +10,57549,,,,,,,,,,,,0.0657869428396225,,,,,, +10,57599,,,,,,,,,,,,0.07034499943256378,,,,,, +10,57649,,,,,,,,,,,,0.06565030664205551,,,,,, +10,57699,,,,,,,,,,,,0.07232335954904556,,,,,, +10,57749,,,,,,,,,,,,0.0642356425523758,,,,,, +10,57799,,,,,,,,,,,,0.0693313255906105,,,,,, +10,57849,,,,,,,,,,,,0.06931455433368683,,,,,, +10,57899,,,,,,,,,,,,0.05960819870233536,,,,,, +10,57949,,,,,,,,,,,,0.05681731179356575,,,,,, +10,57999,,,,,,,,,,,,0.06444211304187775,,,,,, +10,58049,,,,,,,,,,,,0.07364477217197418,,,,,, +10,58099,,,,,,,,,,,,0.07143428921699524,,,,,, +10,58149,,,,,,,,,,,,0.08513031899929047,,,,,, +10,58199,,,,,,,,,,,,0.06775021553039551,,,,,, +10,58249,,,,,,,,,,,,0.06762173771858215,,,,,, +10,58299,,,,,,,,,,,,0.06902998685836792,,,,,, +10,58349,,,,,,,,,,,,0.06856291741132736,,,,,, +10,58399,,,,,,,,,,,,0.06668905168771744,,,,,, +10,58449,,,,,,,,,,,,0.07530155032873154,,,,,, +10,58499,,,,,,,,,,,,0.06523919105529785,,,,,, +10,58549,,,,,,,,,,,,0.0707046240568161,,,,,, +10,58599,,,,,,,,,,,,0.07694988697767258,,,,,, +10,58649,,,,,,,,,,,,0.06473565846681595,,,,,, +10,58699,,,,,,,,,,,,0.0697021633386612,,,,,, +10,58749,,,,,,,,,,,,0.06663872301578522,,,,,, +10,58799,,,,,,,,,,,,0.07157132774591446,,,,,, +10,58849,,,,,,,,,,,,0.07514475286006927,,,,,, +10,58899,,,,,,,,,,,,0.06343196332454681,,,,,, +10,58949,,,,,,,,,,,,0.06756480783224106,,,,,, +10,58999,,,,,,,,,,,,0.0792379230260849,,,,,, +10,59049,,,,,,,,,,,,0.0600363053381443,,,,,, +10,59099,,,,,,,,,,,,0.07674814015626907,,,,,, +10,59149,,,,,,,,,,,,0.05582636222243309,,,,,, +10,59199,,,,,,,,,,,,0.07110417634248734,,,,,, +10,59249,,,,,,,,,,,,0.06099959835410118,,,,,, +10,59299,,,,,,,,,,,,0.07191547006368637,,,,,, +10,59349,,,,,,,,,,,,0.06967980414628983,,,,,, +10,59399,,,,,,,,,,,,0.056890819221735,,,,,, +10,59449,,,,,,,,,,,,0.07044556736946106,,,,,, +10,59499,,,,,,,,,,,,0.06808675825595856,,,,,, +10,59549,,,,,,,,,,,,0.07900500297546387,,,,,, +10,59599,,,,,,,,,,,,0.07791750133037567,,,,,, +10,59649,,,,,,,,,,,,0.0707235187292099,,,,,, +10,59699,,,,,,,,,,,,0.06109336391091347,,,,,, +10,59749,,,,,,,,,,,,0.07515750825405121,,,,,, +10,59799,,,,,,,,,,,,0.06804923713207245,,,,,, +10,59849,,,,,,,,,,,,0.07383336871862411,,,,,, +10,59899,,,,,,,,,,,,0.06861062347888947,,,,,, +10,59949,,,,,,,,,,,,0.0616580955684185,,,,,, +10,59999,,,,,,,,,,,,0.07348789274692535,,,,,, +10,60049,,,,,,,,,,,,0.06035174801945686,,,,,, +10,60099,,,,,,,,,,,,0.059745583683252335,,,,,, +10,60149,,,,,,,,,,,,0.075492262840271,,,,,, +10,60199,,,,,,,,,,,,0.06741572171449661,,,,,, +10,60249,,,,,,,,,,,,0.08444544672966003,,,,,, +10,60299,,,,,,,,,,,,0.06288931518793106,,,,,, +10,60349,,,,,,,,,,,,0.058667391538619995,,,,,, +10,60399,,,,,,,,,,,,0.061775896698236465,,,,,, +10,60449,,,,,,,,,,,,0.06492175906896591,,,,,, +10,60499,,,,,,,,,,,,0.07880255579948425,,,,,, +10,60549,,,,,,,,,,,,0.07060036063194275,,,,,, +10,60599,,,,,,,,,,,,0.0651799663901329,,,,,, +10,60649,,,,,,,,,,,,0.07172901183366776,,,,,, +10,60699,,,,,,,,,,,,0.06507369130849838,,,,,, +10,60749,,,,,,,,,,,,0.07716228067874908,,,,,, +10,60799,,,,,,,,,,,,0.0558902733027935,,,,,, +10,60849,,,,,,,,,,,,0.06503136456012726,,,,,, +10,60899,,,,,,,,,,,,0.07147394120693207,,,,,, +10,60949,,,,,,,,,,,,0.06623068451881409,,,,,, +10,60999,,,,,,,,,,,,0.07519365847110748,,,,,, +10,61049,,,,,,,,,,,,0.061138369143009186,,,,,, +10,61099,,,,,,,,,,,,0.05622510612010956,,,,,, +10,61149,,,,,,,,,,,,0.08685117959976196,,,,,, +10,61199,,,,,,,,,,,,0.06892484426498413,,,,,, +10,61249,,,,,,,,,,,,0.07393941283226013,,,,,, +10,61299,,,,,,,,,,,,0.0667465552687645,,,,,, +10,61349,,,,,,,,,,,,0.06339085102081299,,,,,, +10,61399,,,,,,,,,,,,0.06324075162410736,,,,,, +10,61449,,,,,,,,,,,,0.06473464518785477,,,,,, +10,61499,,,,,,,,,,,,0.06408143043518066,,,,,, +10,61549,,,,,,,,,,,,0.06276994198560715,,,,,, +10,61599,,,,,,,,,,,,0.07785623520612717,,,,,, +10,61649,,,,,,,,,,,,0.07192423194646835,,,,,, +10,61699,,,,,,,,,,,,0.07726363837718964,,,,,, +10,61749,,,,,,,,,,,,0.07028379291296005,,,,,, +10,61799,,,,,,,,,,,,0.06991717219352722,,,,,, +10,61849,,,,,,,,,,,,0.060492485761642456,,,,,, +10,61899,,,,,,,,,,,,0.0663091391324997,,,,,, +10,61949,,,,,,,,,,,,0.07810662686824799,,,,,, +10,61999,,,,,,,,,,,,0.07372894883155823,,,,,, +10,62049,,,,,,,,,,,,0.06383448839187622,,,,,, +10,62099,,,,,,,,,,,,0.06389831006526947,,,,,, +10,62149,,,,,,,,,,,,0.06737116724252701,,,,,, +10,62199,,,,,,,,,,,,0.08227783441543579,,,,,, +10,62249,,,,,,,,,,,,0.06588898599147797,,,,,, +10,62299,,,,,,,,,,,,0.06400802731513977,,,,,, +10,62349,,,,,,,,,,,,0.0599098764359951,,,,,, +10,62399,,,,,,,,,,,,0.06195642054080963,,,,,, +10,62449,,,,,,,,,,,,0.07030627131462097,,,,,, +10,62499,,,,,,,,,,,,0.06917303800582886,,,,,, +10,62549,,,,,,,,,,,,0.06280834972858429,,,,,, +10,62599,,,,,,,,,,,,0.06723912060260773,,,,,, +10,62649,,,,,,,,,,,,0.06104772165417671,,,,,, +10,62699,,,,,,,,,,,,0.06556254625320435,,,,,, +10,62749,,,,,,,,,,,,0.06705225259065628,,,,,, +10,62799,,,,,,,,,,,,0.06784940510988235,,,,,, +10,62849,,,,,,,,,,,,0.06686659902334213,,,,,, +10,62899,,,,,,,,,,,,0.07330600917339325,,,,,, +10,62949,,,,,,,,,,,,0.06846722960472107,,,,,, +10,62999,,,,,,,,,,,,0.07709291577339172,,,,,, +10,63049,,,,,,,,,,,,0.0781138613820076,,,,,, +10,63095,,,,,,,,,,,,,0.24252545833587646,0.08313152194023132,0.22039368748664856,-0.008622050285339355,0.22314733266830444,0.08313152194023132 +10,63095,,,,,,,0.21758942306041718,0.06700556725263596,0.4363637864589691,0.19038039445877075,0.4167864918708801,,,,,,, +11,63099,,,,,,,,,,,,0.06741584837436676,,,,,, +11,63149,,,,,,,,,,,,0.06399045884609222,,,,,, +11,63199,,,,,,,,,,,,0.0599498488008976,,,,,, +11,63249,,,,,,,,,,,,0.0680040568113327,,,,,, +11,63299,,,,,,,,,,,,0.062220096588134766,,,,,, +11,63349,,,,,,,,,,,,0.06768818944692612,,,,,, +11,63399,,,,,,,,,,,,0.0526871532201767,,,,,, +11,63449,,,,,,,,,,,,0.06939809024333954,,,,,, +11,63499,,,,,,,,,,,,0.06898964941501617,,,,,, +11,63549,,,,,,,,,,,,0.06363658607006073,,,,,, +11,63599,,,,,,,,,,,,0.0719350203871727,,,,,, +11,63649,,,,,,,,,,,,0.05560794472694397,,,,,, +11,63699,,,,,,,,,,,,0.06028033792972565,,,,,, +11,63749,,,,,,,,,,,,0.0732964426279068,,,,,, +11,63799,,,,,,,,,,,,0.06352724134922028,,,,,, +11,63849,,,,,,,,,,,,0.06360496580600739,,,,,, +11,63899,,,,,,,,,,,,0.06172027811408043,,,,,, +11,63949,,,,,,,,,,,,0.06804061681032181,,,,,, +11,63999,,,,,,,,,,,,0.06521909683942795,,,,,, +11,64049,,,,,,,,,,,,0.06834724545478821,,,,,, +11,64099,,,,,,,,,,,,0.05699824541807175,,,,,, +11,64149,,,,,,,,,,,,0.06657637655735016,,,,,, +11,64199,,,,,,,,,,,,0.0722922682762146,,,,,, +11,64249,,,,,,,,,,,,0.07013833522796631,,,,,, +11,64299,,,,,,,,,,,,0.06751808524131775,,,,,, +11,64349,,,,,,,,,,,,0.06931618601083755,,,,,, +11,64399,,,,,,,,,,,,0.08127142488956451,,,,,, +11,64449,,,,,,,,,,,,0.06272134929895401,,,,,, +11,64499,,,,,,,,,,,,0.05955622345209122,,,,,, +11,64549,,,,,,,,,,,,0.06941355764865875,,,,,, +11,64599,,,,,,,,,,,,0.06952023506164551,,,,,, +11,64649,,,,,,,,,,,,0.060359712690114975,,,,,, +11,64699,,,,,,,,,,,,0.06755618751049042,,,,,, +11,64749,,,,,,,,,,,,0.06125800684094429,,,,,, +11,64799,,,,,,,,,,,,0.07000789791345596,,,,,, +11,64849,,,,,,,,,,,,0.06649637967348099,,,,,, +11,64899,,,,,,,,,,,,0.07747110724449158,,,,,, +11,64949,,,,,,,,,,,,0.06451654434204102,,,,,, +11,64999,,,,,,,,,,,,0.06969715654850006,,,,,, +11,65049,,,,,,,,,,,,0.06050582602620125,,,,,, +11,65099,,,,,,,,,,,,0.057167164981365204,,,,,, +11,65149,,,,,,,,,,,,0.06048610433936119,,,,,, +11,65199,,,,,,,,,,,,0.06548995524644852,,,,,, +11,65249,,,,,,,,,,,,0.06134464219212532,,,,,, +11,65299,,,,,,,,,,,,0.07008910179138184,,,,,, +11,65349,,,,,,,,,,,,0.06435158103704453,,,,,, +11,65399,,,,,,,,,,,,0.059471189975738525,,,,,, +11,65449,,,,,,,,,,,,0.06102028489112854,,,,,, +11,65499,,,,,,,,,,,,0.0652894675731659,,,,,, +11,65549,,,,,,,,,,,,0.06791271269321442,,,,,, +11,65599,,,,,,,,,,,,0.06482065469026566,,,,,, +11,65649,,,,,,,,,,,,0.061883918941020966,,,,,, +11,65699,,,,,,,,,,,,0.05946972221136093,,,,,, +11,65749,,,,,,,,,,,,0.05579162389039993,,,,,, +11,65799,,,,,,,,,,,,0.07319191098213196,,,,,, +11,65849,,,,,,,,,,,,0.06827658414840698,,,,,, +11,65899,,,,,,,,,,,,0.06847067177295685,,,,,, +11,65949,,,,,,,,,,,,0.06404168903827667,,,,,, +11,65999,,,,,,,,,,,,0.0633215606212616,,,,,, +11,66049,,,,,,,,,,,,0.07563290745019913,,,,,, +11,66099,,,,,,,,,,,,0.06530077755451202,,,,,, +11,66149,,,,,,,,,,,,0.06600108742713928,,,,,, +11,66199,,,,,,,,,,,,0.06016332283616066,,,,,, +11,66249,,,,,,,,,,,,0.07409919053316116,,,,,, +11,66299,,,,,,,,,,,,0.06792791187763214,,,,,, +11,66349,,,,,,,,,,,,0.05377897620201111,,,,,, +11,66399,,,,,,,,,,,,0.07975801080465317,,,,,, +11,66449,,,,,,,,,,,,0.06443218141794205,,,,,, +11,66499,,,,,,,,,,,,0.06258481740951538,,,,,, +11,66549,,,,,,,,,,,,0.0688694566488266,,,,,, +11,66599,,,,,,,,,,,,0.05579704791307449,,,,,, +11,66649,,,,,,,,,,,,0.07278266549110413,,,,,, +11,66699,,,,,,,,,,,,0.06351567804813385,,,,,, +11,66749,,,,,,,,,,,,0.0609453022480011,,,,,, +11,66799,,,,,,,,,,,,0.06646207720041275,,,,,, +11,66849,,,,,,,,,,,,0.06346240639686584,,,,,, +11,66899,,,,,,,,,,,,0.06797853112220764,,,,,, +11,66949,,,,,,,,,,,,0.07410981506109238,,,,,, +11,66999,,,,,,,,,,,,0.06670839339494705,,,,,, +11,67049,,,,,,,,,,,,0.0725385993719101,,,,,, +11,67099,,,,,,,,,,,,0.07058542966842651,,,,,, +11,67149,,,,,,,,,,,,0.07458455860614777,,,,,, +11,67199,,,,,,,,,,,,0.058049991726875305,,,,,, +11,67249,,,,,,,,,,,,0.06495152413845062,,,,,, +11,67299,,,,,,,,,,,,0.06648145616054535,,,,,, +11,67349,,,,,,,,,,,,0.06508853286504745,,,,,, +11,67399,,,,,,,,,,,,0.06912873685359955,,,,,, +11,67449,,,,,,,,,,,,0.058999624103307724,,,,,, +11,67499,,,,,,,,,,,,0.06138757988810539,,,,,, +11,67549,,,,,,,,,,,,0.06294384598731995,,,,,, +11,67599,,,,,,,,,,,,0.07363491505384445,,,,,, +11,67649,,,,,,,,,,,,0.06354741752147675,,,,,, +11,67699,,,,,,,,,,,,0.07792267203330994,,,,,, +11,67749,,,,,,,,,,,,0.05926472693681717,,,,,, +11,67799,,,,,,,,,,,,0.081703782081604,,,,,, +11,67849,,,,,,,,,,,,0.07336729764938354,,,,,, +11,67899,,,,,,,,,,,,0.0745132565498352,,,,,, +11,67949,,,,,,,,,,,,0.05956985056400299,,,,,, +11,67999,,,,,,,,,,,,0.058535799384117126,,,,,, +11,68049,,,,,,,,,,,,0.0579439215362072,,,,,, +11,68099,,,,,,,,,,,,0.0631307065486908,,,,,, +11,68149,,,,,,,,,,,,0.06513431668281555,,,,,, +11,68199,,,,,,,,,,,,0.06152995303273201,,,,,, +11,68249,,,,,,,,,,,,0.058509595692157745,,,,,, +11,68299,,,,,,,,,,,,0.06882378458976746,,,,,, +11,68349,,,,,,,,,,,,0.06928758323192596,,,,,, +11,68399,,,,,,,,,,,,0.07030703127384186,,,,,, +11,68449,,,,,,,,,,,,0.06451495736837387,,,,,, +11,68499,,,,,,,,,,,,0.0659860372543335,,,,,, +11,68549,,,,,,,,,,,,0.06596481800079346,,,,,, +11,68599,,,,,,,,,,,,0.06536948680877686,,,,,, +11,68649,,,,,,,,,,,,0.056866906583309174,,,,,, +11,68699,,,,,,,,,,,,0.05704650282859802,,,,,, +11,68749,,,,,,,,,,,,0.06736336648464203,,,,,, +11,68799,,,,,,,,,,,,0.06668718159198761,,,,,, +11,68831,,,,,,,,,,,,,0.2438805103302002,0.08362480252981186,0.19810914993286133,-0.014606952667236328,0.2080511599779129,0.08362480252981186 +11,68831,,,,,,,0.21649762988090515,0.06642312556505203,0.44434887170791626,0.197418212890625,0.4242645502090454,,,,,,, +12,68849,,,,,,,,,,,,0.060768481343984604,,,,,, +12,68899,,,,,,,,,,,,0.06689063459634781,,,,,, +12,68949,,,,,,,,,,,,0.05497921630740166,,,,,, +12,68999,,,,,,,,,,,,0.07480752468109131,,,,,, +12,69049,,,,,,,,,,,,0.06803377717733383,,,,,, +12,69099,,,,,,,,,,,,0.05846915766596794,,,,,, +12,69149,,,,,,,,,,,,0.05460245907306671,,,,,, +12,69199,,,,,,,,,,,,0.07009417563676834,,,,,, +12,69249,,,,,,,,,,,,0.06635281443595886,,,,,, +12,69299,,,,,,,,,,,,0.07463403791189194,,,,,, +12,69349,,,,,,,,,,,,0.06909625977277756,,,,,, +12,69399,,,,,,,,,,,,0.06090562790632248,,,,,, +12,69449,,,,,,,,,,,,0.059977464377880096,,,,,, +12,69499,,,,,,,,,,,,0.06501920521259308,,,,,, +12,69549,,,,,,,,,,,,0.08894984424114227,,,,,, +12,69599,,,,,,,,,,,,0.06945839524269104,,,,,, +12,69649,,,,,,,,,,,,0.07137659192085266,,,,,, +12,69699,,,,,,,,,,,,0.06870860606431961,,,,,, +12,69749,,,,,,,,,,,,0.06112571805715561,,,,,, +12,69799,,,,,,,,,,,,0.07093321532011032,,,,,, +12,69849,,,,,,,,,,,,0.06126386672258377,,,,,, +12,69899,,,,,,,,,,,,0.07802487909793854,,,,,, +12,69949,,,,,,,,,,,,0.06793398410081863,,,,,, +12,69999,,,,,,,,,,,,0.06882071495056152,,,,,, +12,70049,,,,,,,,,,,,0.0635027214884758,,,,,, +12,70099,,,,,,,,,,,,0.05315454304218292,,,,,, +12,70149,,,,,,,,,,,,0.07137802243232727,,,,,, +12,70199,,,,,,,,,,,,0.060366272926330566,,,,,, +12,70249,,,,,,,,,,,,0.06459113955497742,,,,,, +12,70299,,,,,,,,,,,,0.05919427052140236,,,,,, +12,70349,,,,,,,,,,,,0.05688223987817764,,,,,, +12,70399,,,,,,,,,,,,0.06910545378923416,,,,,, +12,70449,,,,,,,,,,,,0.06716198474168777,,,,,, +12,70499,,,,,,,,,,,,0.06218641251325607,,,,,, +12,70549,,,,,,,,,,,,0.06749008595943451,,,,,, +12,70599,,,,,,,,,,,,0.06685518473386765,,,,,, +12,70649,,,,,,,,,,,,0.06225939840078354,,,,,, +12,70699,,,,,,,,,,,,0.0645567923784256,,,,,, +12,70749,,,,,,,,,,,,0.06739839911460876,,,,,, +12,70799,,,,,,,,,,,,0.07074639946222305,,,,,, +12,70849,,,,,,,,,,,,0.056114308536052704,,,,,, +12,70899,,,,,,,,,,,,0.0668075680732727,,,,,, +12,70949,,,,,,,,,,,,0.06346697360277176,,,,,, +12,70999,,,,,,,,,,,,0.06525039672851562,,,,,, +12,71049,,,,,,,,,,,,0.059215642511844635,,,,,, +12,71099,,,,,,,,,,,,0.06926281750202179,,,,,, +12,71149,,,,,,,,,,,,0.07007341086864471,,,,,, +12,71199,,,,,,,,,,,,0.06640209257602692,,,,,, +12,71249,,,,,,,,,,,,0.05969833955168724,,,,,, +12,71299,,,,,,,,,,,,0.06684901565313339,,,,,, +12,71349,,,,,,,,,,,,0.062341779470443726,,,,,, +12,71399,,,,,,,,,,,,0.06219165027141571,,,,,, +12,71449,,,,,,,,,,,,0.05731586739420891,,,,,, +12,71499,,,,,,,,,,,,0.07760925590991974,,,,,, +12,71549,,,,,,,,,,,,0.06696519255638123,,,,,, +12,71599,,,,,,,,,,,,0.06525592505931854,,,,,, +12,71649,,,,,,,,,,,,0.06415873020887375,,,,,, +12,71699,,,,,,,,,,,,0.0733928233385086,,,,,, +12,71749,,,,,,,,,,,,0.062432367354631424,,,,,, +12,71799,,,,,,,,,,,,0.07243771851062775,,,,,, +12,71849,,,,,,,,,,,,0.06032960116863251,,,,,, +12,71899,,,,,,,,,,,,0.06783600896596909,,,,,, +12,71949,,,,,,,,,,,,0.06627722084522247,,,,,, +12,71999,,,,,,,,,,,,0.06618835031986237,,,,,, +12,72049,,,,,,,,,,,,0.056818798184394836,,,,,, +12,72099,,,,,,,,,,,,0.07215464860200882,,,,,, +12,72149,,,,,,,,,,,,0.0703958198428154,,,,,, +12,72199,,,,,,,,,,,,0.06358569860458374,,,,,, +12,72249,,,,,,,,,,,,0.05716167390346527,,,,,, +12,72299,,,,,,,,,,,,0.07062504440546036,,,,,, +12,72349,,,,,,,,,,,,0.06526362150907516,,,,,, +12,72399,,,,,,,,,,,,0.07915429025888443,,,,,, +12,72449,,,,,,,,,,,,0.06264486908912659,,,,,, +12,72499,,,,,,,,,,,,0.06151740998029709,,,,,, +12,72549,,,,,,,,,,,,0.07086119055747986,,,,,, +12,72599,,,,,,,,,,,,0.06686623394489288,,,,,, +12,72649,,,,,,,,,,,,0.05458784103393555,,,,,, +12,72699,,,,,,,,,,,,0.059751249849796295,,,,,, +12,72749,,,,,,,,,,,,0.07433207333087921,,,,,, +12,72799,,,,,,,,,,,,0.06209537386894226,,,,,, +12,72849,,,,,,,,,,,,0.05888991802930832,,,,,, +12,72899,,,,,,,,,,,,0.07245338708162308,,,,,, +12,72949,,,,,,,,,,,,0.0647306889295578,,,,,, +12,72999,,,,,,,,,,,,0.0691433995962143,,,,,, +12,73049,,,,,,,,,,,,0.05745522677898407,,,,,, +12,73099,,,,,,,,,,,,0.06822455674409866,,,,,, +12,73149,,,,,,,,,,,,0.06960879266262054,,,,,, +12,73199,,,,,,,,,,,,0.075698122382164,,,,,, +12,73249,,,,,,,,,,,,0.07385475188493729,,,,,, +12,73299,,,,,,,,,,,,0.06899519264698029,,,,,, +12,73349,,,,,,,,,,,,0.06720517575740814,,,,,, +12,73399,,,,,,,,,,,,0.0617135651409626,,,,,, +12,73449,,,,,,,,,,,,0.060261983424425125,,,,,, +12,73499,,,,,,,,,,,,0.07255340367555618,,,,,, +12,73549,,,,,,,,,,,,0.06976005434989929,,,,,, +12,73599,,,,,,,,,,,,0.06905986368656158,,,,,, +12,73649,,,,,,,,,,,,0.06698933243751526,,,,,, +12,73699,,,,,,,,,,,,0.05474018305540085,,,,,, +12,73749,,,,,,,,,,,,0.06564891338348389,,,,,, +12,73799,,,,,,,,,,,,0.06736618280410767,,,,,, +12,73849,,,,,,,,,,,,0.06541670858860016,,,,,, +12,73899,,,,,,,,,,,,0.06439139693975449,,,,,, +12,73949,,,,,,,,,,,,0.05278436467051506,,,,,, +12,73999,,,,,,,,,,,,0.06989160180091858,,,,,, +12,74049,,,,,,,,,,,,0.07136045396327972,,,,,, +12,74099,,,,,,,,,,,,0.06446105986833572,,,,,, +12,74149,,,,,,,,,,,,0.07347692549228668,,,,,, +12,74199,,,,,,,,,,,,0.06151357665657997,,,,,, +12,74249,,,,,,,,,,,,0.060512032359838486,,,,,, +12,74299,,,,,,,,,,,,0.066157266497612,,,,,, +12,74349,,,,,,,,,,,,0.05953601375222206,,,,,, +12,74399,,,,,,,,,,,,0.06496583670377731,,,,,, +12,74449,,,,,,,,,,,,0.07299499213695526,,,,,, +12,74499,,,,,,,,,,,,0.05702992156147957,,,,,, +12,74549,,,,,,,,,,,,0.0575532466173172,,,,,, +12,74567,,,,,,,,,,,,,0.24052603542804718,0.08048404008150101,0.21706296503543854,0.02349942922592163,0.22006498277187347,0.08048404008150101 +12,74567,,,,,,,0.21612341701984406,0.06633152067661285,0.44561871886253357,0.19852811098098755,0.4264311194419861,,,,,,, +13,74599,,,,,,,,,,,,0.06818835437297821,,,,,, +13,74649,,,,,,,,,,,,0.05628826469182968,,,,,, +13,74699,,,,,,,,,,,,0.05902887508273125,,,,,, +13,74749,,,,,,,,,,,,0.06408804655075073,,,,,, +13,74799,,,,,,,,,,,,0.06555245816707611,,,,,, +13,74849,,,,,,,,,,,,0.0650077536702156,,,,,, +13,74899,,,,,,,,,,,,0.06787931174039841,,,,,, +13,74949,,,,,,,,,,,,0.06388738751411438,,,,,, +13,74999,,,,,,,,,,,,0.06770065426826477,,,,,, +13,75049,,,,,,,,,,,,0.06786079704761505,,,,,, +13,75099,,,,,,,,,,,,0.0627489686012268,,,,,, +13,75149,,,,,,,,,,,,0.07226409763097763,,,,,, +13,75199,,,,,,,,,,,,0.0667717233300209,,,,,, +13,75249,,,,,,,,,,,,0.0698980912566185,,,,,, +13,75299,,,,,,,,,,,,0.0598427876830101,,,,,, +13,75349,,,,,,,,,,,,0.0629420354962349,,,,,, +13,75399,,,,,,,,,,,,0.05917342007160187,,,,,, +13,75449,,,,,,,,,,,,0.07082032412290573,,,,,, +13,75499,,,,,,,,,,,,0.060971103608608246,,,,,, +13,75549,,,,,,,,,,,,0.05892321467399597,,,,,, +13,75599,,,,,,,,,,,,0.07176897674798965,,,,,, +13,75649,,,,,,,,,,,,0.06716054677963257,,,,,, +13,75699,,,,,,,,,,,,0.0587511882185936,,,,,, +13,75749,,,,,,,,,,,,0.053633034229278564,,,,,, +13,75799,,,,,,,,,,,,0.058230768889188766,,,,,, +13,75849,,,,,,,,,,,,0.06049322336912155,,,,,, +13,75899,,,,,,,,,,,,0.05851474031805992,,,,,, +13,75949,,,,,,,,,,,,0.06617183983325958,,,,,, +13,75999,,,,,,,,,,,,0.06176697835326195,,,,,, +13,76049,,,,,,,,,,,,0.059723906219005585,,,,,, +13,76099,,,,,,,,,,,,0.06226728856563568,,,,,, +13,76149,,,,,,,,,,,,0.0714934766292572,,,,,, +13,76199,,,,,,,,,,,,0.06359731405973434,,,,,, +13,76249,,,,,,,,,,,,0.061576277017593384,,,,,, +13,76299,,,,,,,,,,,,0.04941960424184799,,,,,, +13,76349,,,,,,,,,,,,0.06504898518323898,,,,,, +13,76399,,,,,,,,,,,,0.07383439689874649,,,,,, +13,76449,,,,,,,,,,,,0.06570056080818176,,,,,, +13,76499,,,,,,,,,,,,0.06542384624481201,,,,,, +13,76549,,,,,,,,,,,,0.06819586455821991,,,,,, +13,76599,,,,,,,,,,,,0.06255082041025162,,,,,, +13,76649,,,,,,,,,,,,0.07590936124324799,,,,,, +13,76699,,,,,,,,,,,,0.061304863542318344,,,,,, +13,76749,,,,,,,,,,,,0.06531376391649246,,,,,, +13,76799,,,,,,,,,,,,0.05860942602157593,,,,,, +13,76849,,,,,,,,,,,,0.06363382935523987,,,,,, +13,76899,,,,,,,,,,,,0.06062135100364685,,,,,, +13,76949,,,,,,,,,,,,0.0764446035027504,,,,,, +13,76999,,,,,,,,,,,,0.06057924032211304,,,,,, +13,77049,,,,,,,,,,,,0.06647595763206482,,,,,, +13,77099,,,,,,,,,,,,0.06585133820772171,,,,,, +13,77149,,,,,,,,,,,,0.05945120379328728,,,,,, +13,77199,,,,,,,,,,,,0.06369762122631073,,,,,, +13,77249,,,,,,,,,,,,0.05684080719947815,,,,,, +13,77299,,,,,,,,,,,,0.06711295247077942,,,,,, +13,77349,,,,,,,,,,,,0.06221356242895126,,,,,, +13,77399,,,,,,,,,,,,0.06032949313521385,,,,,, +13,77449,,,,,,,,,,,,0.062099747359752655,,,,,, +13,77499,,,,,,,,,,,,0.06423236429691315,,,,,, +13,77549,,,,,,,,,,,,0.07616157829761505,,,,,, +13,77599,,,,,,,,,,,,0.06549552083015442,,,,,, +13,77649,,,,,,,,,,,,0.0675606057047844,,,,,, +13,77699,,,,,,,,,,,,0.06985709816217422,,,,,, +13,77749,,,,,,,,,,,,0.059169650077819824,,,,,, +13,77799,,,,,,,,,,,,0.06596089899539948,,,,,, +13,77849,,,,,,,,,,,,0.0641435757279396,,,,,, +13,77899,,,,,,,,,,,,0.05860355496406555,,,,,, +13,77949,,,,,,,,,,,,0.06145378202199936,,,,,, +13,77999,,,,,,,,,,,,0.06487488746643066,,,,,, +13,78049,,,,,,,,,,,,0.06619924306869507,,,,,, +13,78099,,,,,,,,,,,,0.06723998486995697,,,,,, +13,78149,,,,,,,,,,,,0.06717651337385178,,,,,, +13,78199,,,,,,,,,,,,0.06783667951822281,,,,,, +13,78249,,,,,,,,,,,,0.06868849694728851,,,,,, +13,78299,,,,,,,,,,,,0.07205251604318619,,,,,, +13,78349,,,,,,,,,,,,0.07092307507991791,,,,,, +13,78399,,,,,,,,,,,,0.06777635216712952,,,,,, +13,78449,,,,,,,,,,,,0.06724758446216583,,,,,, +13,78499,,,,,,,,,,,,0.060182902961969376,,,,,, +13,78549,,,,,,,,,,,,0.06468304991722107,,,,,, +13,78599,,,,,,,,,,,,0.06335564702749252,,,,,, +13,78649,,,,,,,,,,,,0.06420774012804031,,,,,, +13,78699,,,,,,,,,,,,0.05677574500441551,,,,,, +13,78749,,,,,,,,,,,,0.06774668395519257,,,,,, +13,78799,,,,,,,,,,,,0.06767592579126358,,,,,, +13,78849,,,,,,,,,,,,0.06851068139076233,,,,,, +13,78899,,,,,,,,,,,,0.07333578914403915,,,,,, +13,78949,,,,,,,,,,,,0.05686378851532936,,,,,, +13,78999,,,,,,,,,,,,0.06124787777662277,,,,,, +13,79049,,,,,,,,,,,,0.06453214585781097,,,,,, +13,79099,,,,,,,,,,,,0.07017575204372406,,,,,, +13,79149,,,,,,,,,,,,0.05136771500110626,,,,,, +13,79199,,,,,,,,,,,,0.06706750392913818,,,,,, +13,79249,,,,,,,,,,,,0.0634310394525528,,,,,, +13,79299,,,,,,,,,,,,0.059157829731702805,,,,,, +13,79349,,,,,,,,,,,,0.0720147043466568,,,,,, +13,79399,,,,,,,,,,,,0.08861279487609863,,,,,, +13,79449,,,,,,,,,,,,0.08066529035568237,,,,,, +13,79499,,,,,,,,,,,,0.07380972802639008,,,,,, +13,79549,,,,,,,,,,,,0.06538257002830505,,,,,, +13,79599,,,,,,,,,,,,0.06514041870832443,,,,,, +13,79649,,,,,,,,,,,,0.0550839826464653,,,,,, +13,79699,,,,,,,,,,,,0.06281331926584244,,,,,, +13,79749,,,,,,,,,,,,0.05865296721458435,,,,,, +13,79799,,,,,,,,,,,,0.06217747926712036,,,,,, +13,79849,,,,,,,,,,,,0.06595136225223541,,,,,, +13,79899,,,,,,,,,,,,0.057111404836177826,,,,,, +13,79949,,,,,,,,,,,,0.0585799366235733,,,,,, +13,79999,,,,,,,,,,,,0.058567699044942856,,,,,, +13,80049,,,,,,,,,,,,0.06737230718135834,,,,,, +13,80099,,,,,,,,,,,,0.073015958070755,,,,,, +13,80149,,,,,,,,,,,,0.07684025913476944,,,,,, +13,80199,,,,,,,,,,,,0.07479402422904968,,,,,, +13,80249,,,,,,,,,,,,0.06556709855794907,,,,,, +13,80299,,,,,,,,,,,,0.061735715717077255,,,,,, +13,80303,,,,,,,,,,,,,0.24040032923221588,0.08130079507827759,0.22599650919437408,0.013589978218078613,0.23163700103759766,0.08130079507827759 +13,80303,,,,,,,0.2147885411977768,0.06562897562980652,0.4550190269947052,0.20701199769973755,0.4350745975971222,,,,,,, +14,80349,,,,,,,,,,,,0.06005759537220001,,,,,, +14,80399,,,,,,,,,,,,0.06258618831634521,,,,,, +14,80449,,,,,,,,,,,,0.06458137929439545,,,,,, +14,80499,,,,,,,,,,,,0.08359111100435257,,,,,, +14,80549,,,,,,,,,,,,0.066979318857193,,,,,, +14,80599,,,,,,,,,,,,0.06976626813411713,,,,,, +14,80649,,,,,,,,,,,,0.06407718360424042,,,,,, +14,80699,,,,,,,,,,,,0.05592343956232071,,,,,, +14,80749,,,,,,,,,,,,0.08232221752405167,,,,,, +14,80799,,,,,,,,,,,,0.06189374998211861,,,,,, +14,80849,,,,,,,,,,,,0.0731956958770752,,,,,, +14,80899,,,,,,,,,,,,0.05865546315908432,,,,,, +14,80949,,,,,,,,,,,,0.07282581925392151,,,,,, +14,80999,,,,,,,,,,,,0.06730270385742188,,,,,, +14,81049,,,,,,,,,,,,0.05937454476952553,,,,,, +14,81099,,,,,,,,,,,,0.07691933214664459,,,,,, +14,81149,,,,,,,,,,,,0.06785982102155685,,,,,, +14,81199,,,,,,,,,,,,0.060239072889089584,,,,,, +14,81249,,,,,,,,,,,,0.05101720988750458,,,,,, +14,81299,,,,,,,,,,,,0.06918862462043762,,,,,, +14,81349,,,,,,,,,,,,0.06819415092468262,,,,,, +14,81399,,,,,,,,,,,,0.06400395929813385,,,,,, +14,81449,,,,,,,,,,,,0.07102562487125397,,,,,, +14,81499,,,,,,,,,,,,0.06462328881025314,,,,,, +14,81549,,,,,,,,,,,,0.060009803622961044,,,,,, +14,81599,,,,,,,,,,,,0.060447655618190765,,,,,, +14,81649,,,,,,,,,,,,0.07491381466388702,,,,,, +14,81699,,,,,,,,,,,,0.07791423797607422,,,,,, +14,81749,,,,,,,,,,,,0.05464618653059006,,,,,, +14,81799,,,,,,,,,,,,0.05316316708922386,,,,,, +14,81849,,,,,,,,,,,,0.05837615579366684,,,,,, +14,81899,,,,,,,,,,,,0.05780388042330742,,,,,, +14,81949,,,,,,,,,,,,0.07957260310649872,,,,,, +14,81999,,,,,,,,,,,,0.06431077420711517,,,,,, +14,82049,,,,,,,,,,,,0.05769278481602669,,,,,, +14,82099,,,,,,,,,,,,0.06909862905740738,,,,,, +14,82149,,,,,,,,,,,,0.07254567742347717,,,,,, +14,82199,,,,,,,,,,,,0.07133059203624725,,,,,, +14,82249,,,,,,,,,,,,0.06842021644115448,,,,,, +14,82299,,,,,,,,,,,,0.06278079003095627,,,,,, +14,82349,,,,,,,,,,,,0.06198665499687195,,,,,, +14,82399,,,,,,,,,,,,0.055218420922756195,,,,,, +14,82449,,,,,,,,,,,,0.06883878260850906,,,,,, +14,82499,,,,,,,,,,,,0.06301191449165344,,,,,, +14,82549,,,,,,,,,,,,0.05568955838680267,,,,,, +14,82599,,,,,,,,,,,,0.06528685986995697,,,,,, +14,82649,,,,,,,,,,,,0.06983449310064316,,,,,, +14,82699,,,,,,,,,,,,0.07405418157577515,,,,,, +14,82749,,,,,,,,,,,,0.0565943717956543,,,,,, +14,82799,,,,,,,,,,,,0.05870411917567253,,,,,, +14,82849,,,,,,,,,,,,0.056885864585638046,,,,,, +14,82899,,,,,,,,,,,,0.0692778080701828,,,,,, +14,82949,,,,,,,,,,,,0.059087056666612625,,,,,, +14,82999,,,,,,,,,,,,0.05520067363977432,,,,,, +14,83049,,,,,,,,,,,,0.06506098806858063,,,,,, +14,83099,,,,,,,,,,,,0.05968650057911873,,,,,, +14,83149,,,,,,,,,,,,0.061615198850631714,,,,,, +14,83199,,,,,,,,,,,,0.07216361910104752,,,,,, +14,83249,,,,,,,,,,,,0.06931053102016449,,,,,, +14,83299,,,,,,,,,,,,0.07182130962610245,,,,,, +14,83349,,,,,,,,,,,,0.05630199611186981,,,,,, +14,83399,,,,,,,,,,,,0.05825558677315712,,,,,, +14,83449,,,,,,,,,,,,0.06847739219665527,,,,,, +14,83499,,,,,,,,,,,,0.0784345418214798,,,,,, +14,83549,,,,,,,,,,,,0.06435592472553253,,,,,, +14,83599,,,,,,,,,,,,0.06920028477907181,,,,,, +14,83649,,,,,,,,,,,,0.06307481974363327,,,,,, +14,83699,,,,,,,,,,,,0.0770757794380188,,,,,, +14,83749,,,,,,,,,,,,0.0634981244802475,,,,,, +14,83799,,,,,,,,,,,,0.05813934653997421,,,,,, +14,83849,,,,,,,,,,,,0.059563249349594116,,,,,, +14,83899,,,,,,,,,,,,0.05752578750252724,,,,,, +14,83949,,,,,,,,,,,,0.060327306389808655,,,,,, +14,83999,,,,,,,,,,,,0.057490214705467224,,,,,, +14,84049,,,,,,,,,,,,0.08039509505033493,,,,,, +14,84099,,,,,,,,,,,,0.05164795741438866,,,,,, +14,84149,,,,,,,,,,,,0.0642002746462822,,,,,, +14,84199,,,,,,,,,,,,0.06654159724712372,,,,,, +14,84249,,,,,,,,,,,,0.05758634954690933,,,,,, +14,84299,,,,,,,,,,,,0.07415509968996048,,,,,, +14,84349,,,,,,,,,,,,0.07264835387468338,,,,,, +14,84399,,,,,,,,,,,,0.07010720670223236,,,,,, +14,84449,,,,,,,,,,,,0.06341840326786041,,,,,, +14,84499,,,,,,,,,,,,0.06971025466918945,,,,,, +14,84549,,,,,,,,,,,,0.06392129510641098,,,,,, +14,84599,,,,,,,,,,,,0.06510452926158905,,,,,, +14,84649,,,,,,,,,,,,0.06435179710388184,,,,,, +14,84699,,,,,,,,,,,,0.05780044570565224,,,,,, +14,84749,,,,,,,,,,,,0.06472989916801453,,,,,, +14,84799,,,,,,,,,,,,0.06942158937454224,,,,,, +14,84849,,,,,,,,,,,,0.0646820217370987,,,,,, +14,84899,,,,,,,,,,,,0.057443857192993164,,,,,, +14,84949,,,,,,,,,,,,0.06884617358446121,,,,,, +14,84999,,,,,,,,,,,,0.06342041492462158,,,,,, +14,85049,,,,,,,,,,,,0.05602402240037918,,,,,, +14,85099,,,,,,,,,,,,0.06090966984629631,,,,,, +14,85149,,,,,,,,,,,,0.05131570249795914,,,,,, +14,85199,,,,,,,,,,,,0.06765387952327728,,,,,, +14,85249,,,,,,,,,,,,0.07225362956523895,,,,,, +14,85299,,,,,,,,,,,,0.06788009405136108,,,,,, +14,85349,,,,,,,,,,,,0.06106258183717728,,,,,, +14,85399,,,,,,,,,,,,0.07213035970926285,,,,,, +14,85449,,,,,,,,,,,,0.05345176160335541,,,,,, +14,85499,,,,,,,,,,,,0.06896321475505829,,,,,, +14,85549,,,,,,,,,,,,0.047312553972005844,,,,,, +14,85599,,,,,,,,,,,,0.05660734698176384,,,,,, +14,85649,,,,,,,,,,,,0.05324963480234146,,,,,, +14,85699,,,,,,,,,,,,0.06362926959991455,,,,,, +14,85749,,,,,,,,,,,,0.07546638697385788,,,,,, +14,85799,,,,,,,,,,,,0.052420854568481445,,,,,, +14,85849,,,,,,,,,,,,0.0761018618941307,,,,,, +14,85899,,,,,,,,,,,,0.06767283380031586,,,,,, +14,85949,,,,,,,,,,,,0.053851500153541565,,,,,, +14,85999,,,,,,,,,,,,0.06760334223508835,,,,,, +14,86039,,,,,,,,,,,,,0.2430025041103363,0.08329994976520538,0.22341777384281158,-0.010665535926818848,0.2269531935453415,0.08329994976520538 +14,86039,,,,,,,0.21427485346794128,0.06540638953447342,0.4579769968986511,0.2097177505493164,0.43898072838783264,,,,,,, +15,86049,,,,,,,,,,,,0.06893334537744522,,,,,, +15,86099,,,,,,,,,,,,0.05844995006918907,,,,,, +15,86149,,,,,,,,,,,,0.05805002152919769,,,,,, +15,86199,,,,,,,,,,,,0.06287512183189392,,,,,, +15,86249,,,,,,,,,,,,0.0684344470500946,,,,,, +15,86299,,,,,,,,,,,,0.06074698269367218,,,,,, +15,86349,,,,,,,,,,,,0.05240880697965622,,,,,, +15,86399,,,,,,,,,,,,0.0631389245390892,,,,,, +15,86449,,,,,,,,,,,,0.06469103693962097,,,,,, +15,86499,,,,,,,,,,,,0.06054596230387688,,,,,, +15,86549,,,,,,,,,,,,0.05449500307440758,,,,,, +15,86599,,,,,,,,,,,,0.06432446092367172,,,,,, +15,86649,,,,,,,,,,,,0.06198310852050781,,,,,, +15,86699,,,,,,,,,,,,0.06196458265185356,,,,,, +15,86749,,,,,,,,,,,,0.07125692814588547,,,,,, +15,86799,,,,,,,,,,,,0.0719597339630127,,,,,, +15,86849,,,,,,,,,,,,0.06860578060150146,,,,,, +15,86899,,,,,,,,,,,,0.06730420142412186,,,,,, +15,86949,,,,,,,,,,,,0.05858398228883743,,,,,, +15,86999,,,,,,,,,,,,0.05324545502662659,,,,,, +15,87049,,,,,,,,,,,,0.06568581610918045,,,,,, +15,87099,,,,,,,,,,,,0.06274528801441193,,,,,, +15,87149,,,,,,,,,,,,0.057736434042453766,,,,,, +15,87199,,,,,,,,,,,,0.06301699578762054,,,,,, +15,87249,,,,,,,,,,,,0.0717332735657692,,,,,, +15,87299,,,,,,,,,,,,0.06464934349060059,,,,,, +15,87349,,,,,,,,,,,,0.05222637206315994,,,,,, +15,87399,,,,,,,,,,,,0.06207307428121567,,,,,, +15,87449,,,,,,,,,,,,0.06510482728481293,,,,,, +15,87499,,,,,,,,,,,,0.057111915200948715,,,,,, +15,87549,,,,,,,,,,,,0.07281580567359924,,,,,, +15,87599,,,,,,,,,,,,0.07120213657617569,,,,,, +15,87649,,,,,,,,,,,,0.06925763934850693,,,,,, +15,87699,,,,,,,,,,,,0.059719644486904144,,,,,, +15,87749,,,,,,,,,,,,0.06353691965341568,,,,,, +15,87799,,,,,,,,,,,,0.06696681678295135,,,,,, +15,87849,,,,,,,,,,,,0.06549239158630371,,,,,, +15,87899,,,,,,,,,,,,0.07612280547618866,,,,,, +15,87949,,,,,,,,,,,,0.05730104073882103,,,,,, +15,87999,,,,,,,,,,,,0.0627724826335907,,,,,, +15,88049,,,,,,,,,,,,0.0652705729007721,,,,,, +15,88099,,,,,,,,,,,,0.06174453720450401,,,,,, +15,88149,,,,,,,,,,,,0.06011646240949631,,,,,, +15,88199,,,,,,,,,,,,0.055173639208078384,,,,,, +15,88249,,,,,,,,,,,,0.05489831045269966,,,,,, +15,88299,,,,,,,,,,,,0.06039465591311455,,,,,, +15,88349,,,,,,,,,,,,0.0572233572602272,,,,,, +15,88399,,,,,,,,,,,,0.06695505976676941,,,,,, +15,88449,,,,,,,,,,,,0.06449286639690399,,,,,, +15,88499,,,,,,,,,,,,0.0667571872472763,,,,,, +15,88549,,,,,,,,,,,,0.06468294560909271,,,,,, +15,88599,,,,,,,,,,,,0.07847772538661957,,,,,, +15,88649,,,,,,,,,,,,0.06918305158615112,,,,,, +15,88699,,,,,,,,,,,,0.05724131315946579,,,,,, +15,88749,,,,,,,,,,,,0.06154628098011017,,,,,, +15,88799,,,,,,,,,,,,0.07337147742509842,,,,,, +15,88849,,,,,,,,,,,,0.07075939327478409,,,,,, +15,88899,,,,,,,,,,,,0.07332346588373184,,,,,, +15,88949,,,,,,,,,,,,0.05724605917930603,,,,,, +15,88999,,,,,,,,,,,,0.06717245280742645,,,,,, +15,89049,,,,,,,,,,,,0.06415561586618423,,,,,, +15,89099,,,,,,,,,,,,0.06423622369766235,,,,,, +15,89149,,,,,,,,,,,,0.06390149146318436,,,,,, +15,89199,,,,,,,,,,,,0.06566131114959717,,,,,, +15,89249,,,,,,,,,,,,0.0653572678565979,,,,,, +15,89299,,,,,,,,,,,,0.05245161056518555,,,,,, +15,89349,,,,,,,,,,,,0.06736086308956146,,,,,, +15,89399,,,,,,,,,,,,0.06196556240320206,,,,,, +15,89449,,,,,,,,,,,,0.06127562373876572,,,,,, +15,89499,,,,,,,,,,,,0.0613146536052227,,,,,, +15,89549,,,,,,,,,,,,0.05427645891904831,,,,,, +15,89599,,,,,,,,,,,,0.06328590214252472,,,,,, +15,89649,,,,,,,,,,,,0.057208798825740814,,,,,, +15,89699,,,,,,,,,,,,0.0637701153755188,,,,,, +15,89749,,,,,,,,,,,,0.0635140985250473,,,,,, +15,89799,,,,,,,,,,,,0.05705500766634941,,,,,, +15,89849,,,,,,,,,,,,0.06907862424850464,,,,,, +15,89899,,,,,,,,,,,,0.06659168004989624,,,,,, +15,89949,,,,,,,,,,,,0.06178027763962746,,,,,, +15,89999,,,,,,,,,,,,0.07005398720502853,,,,,, +15,90049,,,,,,,,,,,,0.07705837488174438,,,,,, +15,90099,,,,,,,,,,,,0.07039602845907211,,,,,, +15,90149,,,,,,,,,,,,0.06107304245233536,,,,,, +15,90199,,,,,,,,,,,,0.06208088621497154,,,,,, +15,90249,,,,,,,,,,,,0.07678259164094925,,,,,, +15,90299,,,,,,,,,,,,0.06492431461811066,,,,,, +15,90349,,,,,,,,,,,,0.052594125270843506,,,,,, +15,90399,,,,,,,,,,,,0.05805322527885437,,,,,, +15,90449,,,,,,,,,,,,0.057542793452739716,,,,,, +15,90499,,,,,,,,,,,,0.06286408007144928,,,,,, +15,90549,,,,,,,,,,,,0.06822517514228821,,,,,, +15,90599,,,,,,,,,,,,0.06165839731693268,,,,,, +15,90649,,,,,,,,,,,,0.05754261091351509,,,,,, +15,90699,,,,,,,,,,,,0.0621151402592659,,,,,, +15,90749,,,,,,,,,,,,0.06084258481860161,,,,,, +15,90799,,,,,,,,,,,,0.06682426482439041,,,,,, +15,90849,,,,,,,,,,,,0.06341442465782166,,,,,, +15,90899,,,,,,,,,,,,0.06815353780984879,,,,,, +15,90949,,,,,,,,,,,,0.05791783332824707,,,,,, +15,90999,,,,,,,,,,,,0.07512341439723969,,,,,, +15,91049,,,,,,,,,,,,0.04969058558344841,,,,,, +15,91099,,,,,,,,,,,,0.06715983897447586,,,,,, +15,91149,,,,,,,,,,,,0.0631793737411499,,,,,, +15,91199,,,,,,,,,,,,0.06456929445266724,,,,,, +15,91249,,,,,,,,,,,,0.05759831890463829,,,,,, +15,91299,,,,,,,,,,,,0.06736087054014206,,,,,, +15,91349,,,,,,,,,,,,0.07252581417560577,,,,,, +15,91399,,,,,,,,,,,,0.05953672528266907,,,,,, +15,91449,,,,,,,,,,,,0.0594167485833168,,,,,, +15,91499,,,,,,,,,,,,0.0679347962141037,,,,,, +15,91549,,,,,,,,,,,,0.054542191326618195,,,,,, +15,91599,,,,,,,,,,,,0.05391719937324524,,,,,, +15,91649,,,,,,,,,,,,0.06163778901100159,,,,,, +15,91699,,,,,,,,,,,,0.07143829762935638,,,,,, +15,91749,,,,,,,,,,,,0.06609375029802322,,,,,, +15,91775,,,,,,,,,,,,,0.24312099814414978,0.08342903852462769,0.2108321338891983,-0.012231707572937012,0.21403491497039795,0.08342903852462769 +15,91775,,,,,,,0.2115871161222458,0.06406251341104507,0.47534021735191345,0.22594189643859863,0.45436006784439087,,,,,,, +16,91799,,,,,,,,,,,,0.08204145729541779,,,,,, +16,91849,,,,,,,,,,,,0.06259395182132721,,,,,, +16,91899,,,,,,,,,,,,0.07197549194097519,,,,,, +16,91949,,,,,,,,,,,,0.06811822950839996,,,,,, +16,91999,,,,,,,,,,,,0.06818246096372604,,,,,, +16,92049,,,,,,,,,,,,0.06986996531486511,,,,,, +16,92099,,,,,,,,,,,,0.060874514281749725,,,,,, +16,92149,,,,,,,,,,,,0.07196259498596191,,,,,, +16,92199,,,,,,,,,,,,0.04726996645331383,,,,,, +16,92249,,,,,,,,,,,,0.06380179524421692,,,,,, +16,92299,,,,,,,,,,,,0.065085768699646,,,,,, +16,92349,,,,,,,,,,,,0.0697733610868454,,,,,, +16,92399,,,,,,,,,,,,0.06251628696918488,,,,,, +16,92449,,,,,,,,,,,,0.06497219949960709,,,,,, +16,92499,,,,,,,,,,,,0.0703759714961052,,,,,, +16,92549,,,,,,,,,,,,0.07093862444162369,,,,,, +16,92599,,,,,,,,,,,,0.05280721187591553,,,,,, +16,92649,,,,,,,,,,,,0.06619197130203247,,,,,, +16,92699,,,,,,,,,,,,0.07523176074028015,,,,,, +16,92749,,,,,,,,,,,,0.05485369265079498,,,,,, +16,92799,,,,,,,,,,,,0.07133297622203827,,,,,, +16,92849,,,,,,,,,,,,0.06566113233566284,,,,,, +16,92899,,,,,,,,,,,,0.07466310262680054,,,,,, +16,92949,,,,,,,,,,,,0.07087502628564835,,,,,, +16,92999,,,,,,,,,,,,0.05646205693483353,,,,,, +16,93049,,,,,,,,,,,,0.06090310588479042,,,,,, +16,93099,,,,,,,,,,,,0.07680825889110565,,,,,, +16,93149,,,,,,,,,,,,0.05685027688741684,,,,,, +16,93199,,,,,,,,,,,,0.059345975518226624,,,,,, +16,93249,,,,,,,,,,,,0.06638449430465698,,,,,, +16,93299,,,,,,,,,,,,0.06653307378292084,,,,,, +16,93349,,,,,,,,,,,,0.06189770996570587,,,,,, +16,93399,,,,,,,,,,,,0.06912753731012344,,,,,, +16,93449,,,,,,,,,,,,0.06947122514247894,,,,,, +16,93499,,,,,,,,,,,,0.07261460274457932,,,,,, +16,93549,,,,,,,,,,,,0.06229503080248833,,,,,, +16,93599,,,,,,,,,,,,0.05893956869840622,,,,,, +16,93649,,,,,,,,,,,,0.06676001846790314,,,,,, +16,93699,,,,,,,,,,,,0.05731749162077904,,,,,, +16,93749,,,,,,,,,,,,0.058519963175058365,,,,,, +16,93799,,,,,,,,,,,,0.053658321499824524,,,,,, +16,93849,,,,,,,,,,,,0.06198986619710922,,,,,, +16,93899,,,,,,,,,,,,0.06294621527194977,,,,,, +16,93949,,,,,,,,,,,,0.06767904758453369,,,,,, +16,93999,,,,,,,,,,,,0.06523449718952179,,,,,, +16,94049,,,,,,,,,,,,0.05386913940310478,,,,,, +16,94099,,,,,,,,,,,,0.05937879905104637,,,,,, +16,94149,,,,,,,,,,,,0.05735123157501221,,,,,, +16,94199,,,,,,,,,,,,0.07233688235282898,,,,,, +16,94249,,,,,,,,,,,,0.06485094130039215,,,,,, +16,94299,,,,,,,,,,,,0.07158641517162323,,,,,, +16,94349,,,,,,,,,,,,0.06506243348121643,,,,,, +16,94399,,,,,,,,,,,,0.0664859414100647,,,,,, +16,94449,,,,,,,,,,,,0.07620792090892792,,,,,, +16,94499,,,,,,,,,,,,0.057301443070173264,,,,,, +16,94549,,,,,,,,,,,,0.06178184226155281,,,,,, +16,94599,,,,,,,,,,,,0.06653357297182083,,,,,, +16,94649,,,,,,,,,,,,0.06843039393424988,,,,,, +16,94699,,,,,,,,,,,,0.05586960166692734,,,,,, +16,94749,,,,,,,,,,,,0.059565987437963486,,,,,, +16,94799,,,,,,,,,,,,0.06945575773715973,,,,,, +16,94849,,,,,,,,,,,,0.060513388365507126,,,,,, +16,94899,,,,,,,,,,,,0.0634286031126976,,,,,, +16,94949,,,,,,,,,,,,0.058824628591537476,,,,,, +16,94999,,,,,,,,,,,,0.06267110258340836,,,,,, +16,95049,,,,,,,,,,,,0.06281834095716476,,,,,, +16,95099,,,,,,,,,,,,0.056099358946084976,,,,,, +16,95149,,,,,,,,,,,,0.061424314975738525,,,,,, +16,95199,,,,,,,,,,,,0.07157217711210251,,,,,, +16,95249,,,,,,,,,,,,0.058763474225997925,,,,,, +16,95299,,,,,,,,,,,,0.05945859104394913,,,,,, +16,95349,,,,,,,,,,,,0.06553266942501068,,,,,, +16,95399,,,,,,,,,,,,0.06138737127184868,,,,,, +16,95449,,,,,,,,,,,,0.06584765762090683,,,,,, +16,95499,,,,,,,,,,,,0.07049328088760376,,,,,, +16,95549,,,,,,,,,,,,0.056448161602020264,,,,,, +16,95599,,,,,,,,,,,,0.06713488698005676,,,,,, +16,95649,,,,,,,,,,,,0.07279274612665176,,,,,, +16,95699,,,,,,,,,,,,0.06078581511974335,,,,,, +16,95749,,,,,,,,,,,,0.05855974555015564,,,,,, +16,95799,,,,,,,,,,,,0.07285267859697342,,,,,, +16,95849,,,,,,,,,,,,0.05934525281190872,,,,,, +16,95899,,,,,,,,,,,,0.05864451080560684,,,,,, +16,95949,,,,,,,,,,,,0.061098162084817886,,,,,, +16,95999,,,,,,,,,,,,0.06138119101524353,,,,,, +16,96049,,,,,,,,,,,,0.06023994833230972,,,,,, +16,96099,,,,,,,,,,,,0.06873368471860886,,,,,, +16,96149,,,,,,,,,,,,0.06540835648775101,,,,,, +16,96199,,,,,,,,,,,,0.06667470932006836,,,,,, +16,96249,,,,,,,,,,,,0.061383411288261414,,,,,, +16,96299,,,,,,,,,,,,0.06360430270433426,,,,,, +16,96349,,,,,,,,,,,,0.06458424776792526,,,,,, +16,96399,,,,,,,,,,,,0.05577276647090912,,,,,, +16,96449,,,,,,,,,,,,0.06371992826461792,,,,,, +16,96499,,,,,,,,,,,,0.0582331120967865,,,,,, +16,96549,,,,,,,,,,,,0.056659236550331116,,,,,, +16,96599,,,,,,,,,,,,0.06441792845726013,,,,,, +16,96649,,,,,,,,,,,,0.07591354846954346,,,,,, +16,96699,,,,,,,,,,,,0.0583232119679451,,,,,, +16,96749,,,,,,,,,,,,0.06186801940202713,,,,,, +16,96799,,,,,,,,,,,,0.06029701232910156,,,,,, +16,96849,,,,,,,,,,,,0.06006091088056564,,,,,, +16,96899,,,,,,,,,,,,0.06736627221107483,,,,,, +16,96949,,,,,,,,,,,,0.0721912682056427,,,,,, +16,96999,,,,,,,,,,,,0.06739592552185059,,,,,, +16,97049,,,,,,,,,,,,0.05788584426045418,,,,,, +16,97099,,,,,,,,,,,,0.06257153302431107,,,,,, +16,97149,,,,,,,,,,,,0.06000765040516853,,,,,, +16,97199,,,,,,,,,,,,0.07407252490520477,,,,,, +16,97249,,,,,,,,,,,,0.060557201504707336,,,,,, +16,97299,,,,,,,,,,,,0.06403130292892456,,,,,, +16,97349,,,,,,,,,,,,0.07144558429718018,,,,,, +16,97399,,,,,,,,,,,,0.05795777961611748,,,,,, +16,97449,,,,,,,,,,,,0.056606389582157135,,,,,, +16,97499,,,,,,,,,,,,0.06436717510223389,,,,,, +16,97511,,,,,,,,,,,,,0.241451233625412,0.08152548968791962,0.20965224504470825,0.010863721370697021,0.21288754045963287,0.08152548968791962 +16,97511,,,,,,,0.2111338973045349,0.06634946167469025,0.44949907064437866,0.19829028844833374,0.4564302861690521,,,,,,, +17,97549,,,,,,,,,,,,0.07524929940700531,,,,,, +17,97599,,,,,,,,,,,,0.05569608137011528,,,,,, +17,97649,,,,,,,,,,,,0.058923669159412384,,,,,, +17,97699,,,,,,,,,,,,0.06860513240098953,,,,,, +17,97749,,,,,,,,,,,,0.06995613873004913,,,,,, +17,97799,,,,,,,,,,,,0.050338342785835266,,,,,, +17,97849,,,,,,,,,,,,0.06644189357757568,,,,,, +17,97899,,,,,,,,,,,,0.05471721664071083,,,,,, +17,97949,,,,,,,,,,,,0.05517274886369705,,,,,, +17,97999,,,,,,,,,,,,0.07000932097434998,,,,,, +17,98049,,,,,,,,,,,,0.054788194596767426,,,,,, +17,98099,,,,,,,,,,,,0.06048237532377243,,,,,, +17,98149,,,,,,,,,,,,0.06712403893470764,,,,,, +17,98199,,,,,,,,,,,,0.05683857202529907,,,,,, +17,98249,,,,,,,,,,,,0.0657038688659668,,,,,, +17,98299,,,,,,,,,,,,0.06966866552829742,,,,,, +17,98349,,,,,,,,,,,,0.055129051208496094,,,,,, +17,98399,,,,,,,,,,,,0.052697449922561646,,,,,, +17,98449,,,,,,,,,,,,0.06654619425535202,,,,,, +17,98499,,,,,,,,,,,,0.06418606638908386,,,,,, +17,98549,,,,,,,,,,,,0.05593777447938919,,,,,, +17,98599,,,,,,,,,,,,0.06225454807281494,,,,,, +17,98649,,,,,,,,,,,,0.07072603702545166,,,,,, +17,98699,,,,,,,,,,,,0.06088821589946747,,,,,, +17,98749,,,,,,,,,,,,0.06819172203540802,,,,,, +17,98799,,,,,,,,,,,,0.05549588054418564,,,,,, +17,98849,,,,,,,,,,,,0.047956377267837524,,,,,, +17,98899,,,,,,,,,,,,0.05482013151049614,,,,,, +17,98949,,,,,,,,,,,,0.0687967985868454,,,,,, +17,98999,,,,,,,,,,,,0.061777129769325256,,,,,, +17,99049,,,,,,,,,,,,0.07319086045026779,,,,,, +17,99099,,,,,,,,,,,,0.05818904936313629,,,,,, +17,99149,,,,,,,,,,,,0.0590643435716629,,,,,, +17,99199,,,,,,,,,,,,0.06758256256580353,,,,,, +17,99249,,,,,,,,,,,,0.05135640501976013,,,,,, +17,99299,,,,,,,,,,,,0.06615675985813141,,,,,, +17,99349,,,,,,,,,,,,0.0573752224445343,,,,,, +17,99399,,,,,,,,,,,,0.06686920672655106,,,,,, +17,99449,,,,,,,,,,,,0.06253662705421448,,,,,, +17,99499,,,,,,,,,,,,0.06524220108985901,,,,,, +17,99549,,,,,,,,,,,,0.05400785431265831,,,,,, +17,99599,,,,,,,,,,,,0.07095067948102951,,,,,, +17,99649,,,,,,,,,,,,0.07382818311452866,,,,,, +17,99699,,,,,,,,,,,,0.06253085285425186,,,,,, +17,99749,,,,,,,,,,,,0.06975479423999786,,,,,, +17,99799,,,,,,,,,,,,0.05615959316492081,,,,,, +17,99849,,,,,,,,,,,,0.057763297110795975,,,,,, +17,99899,,,,,,,,,,,,0.05252457410097122,,,,,, +17,99949,,,,,,,,,,,,0.0645797997713089,,,,,, +17,99999,,,,,,,,,,,,0.0654359757900238,,,,,, +17,100049,,,,,,,,,,,,0.0711299329996109,,,,,, +17,100099,,,,,,,,,,,,0.06035327911376953,,,,,, +17,100149,,,,,,,,,,,,0.06130953133106232,,,,,, +17,100199,,,,,,,,,,,,0.07049493491649628,,,,,, +17,100249,,,,,,,,,,,,0.050943195819854736,,,,,, +17,100299,,,,,,,,,,,,0.057551220059394836,,,,,, +17,100349,,,,,,,,,,,,0.05723007768392563,,,,,, +17,100399,,,,,,,,,,,,0.0683201253414154,,,,,, +17,100449,,,,,,,,,,,,0.0651322454214096,,,,,, +17,100499,,,,,,,,,,,,0.06453980505466461,,,,,, +17,100549,,,,,,,,,,,,0.061152007430791855,,,,,, +17,100599,,,,,,,,,,,,0.048133231699466705,,,,,, +17,100649,,,,,,,,,,,,0.06376779079437256,,,,,, +17,100699,,,,,,,,,,,,0.05449237301945686,,,,,, +17,100749,,,,,,,,,,,,0.0712960809469223,,,,,, +17,100799,,,,,,,,,,,,0.06511183828115463,,,,,, +17,100849,,,,,,,,,,,,0.05628203600645065,,,,,, +17,100899,,,,,,,,,,,,0.0682021975517273,,,,,, +17,100949,,,,,,,,,,,,0.08098963648080826,,,,,, +17,100999,,,,,,,,,,,,0.06666155904531479,,,,,, +17,101049,,,,,,,,,,,,0.06375341862440109,,,,,, +17,101099,,,,,,,,,,,,0.06977979838848114,,,,,, +17,101149,,,,,,,,,,,,0.06594172865152359,,,,,, +17,101199,,,,,,,,,,,,0.0617312490940094,,,,,, +17,101249,,,,,,,,,,,,0.05913407355546951,,,,,, +17,101299,,,,,,,,,,,,0.06327085942029953,,,,,, +17,101349,,,,,,,,,,,,0.07636792957782745,,,,,, +17,101399,,,,,,,,,,,,0.05939933657646179,,,,,, +17,101449,,,,,,,,,,,,0.05671846121549606,,,,,, +17,101499,,,,,,,,,,,,0.062090128660202026,,,,,, +17,101549,,,,,,,,,,,,0.0710408017039299,,,,,, +17,101599,,,,,,,,,,,,0.05788087099790573,,,,,, +17,101649,,,,,,,,,,,,0.07881680130958557,,,,,, +17,101699,,,,,,,,,,,,0.061429571360349655,,,,,, +17,101749,,,,,,,,,,,,0.0629858523607254,,,,,, +17,101799,,,,,,,,,,,,0.061529405415058136,,,,,, +17,101849,,,,,,,,,,,,0.05977225676178932,,,,,, +17,101899,,,,,,,,,,,,0.06644177436828613,,,,,, +17,101949,,,,,,,,,,,,0.06573587656021118,,,,,, +17,101999,,,,,,,,,,,,0.06106845289468765,,,,,, +17,102049,,,,,,,,,,,,0.06920865923166275,,,,,, +17,102099,,,,,,,,,,,,0.06609585136175156,,,,,, +17,102149,,,,,,,,,,,,0.05957643687725067,,,,,, +17,102199,,,,,,,,,,,,0.061995647847652435,,,,,, +17,102249,,,,,,,,,,,,0.062374237924814224,,,,,, +17,102299,,,,,,,,,,,,0.06916975975036621,,,,,, +17,102349,,,,,,,,,,,,0.06130857765674591,,,,,, +17,102399,,,,,,,,,,,,0.06940679252147675,,,,,, +17,102449,,,,,,,,,,,,0.06430719792842865,,,,,, +17,102499,,,,,,,,,,,,0.06547727435827255,,,,,, +17,102549,,,,,,,,,,,,0.05884334444999695,,,,,, +17,102599,,,,,,,,,,,,0.05829509720206261,,,,,, +17,102649,,,,,,,,,,,,0.0538041889667511,,,,,, +17,102699,,,,,,,,,,,,0.06618744134902954,,,,,, +17,102749,,,,,,,,,,,,0.06986446678638458,,,,,, +17,102799,,,,,,,,,,,,0.06620298326015472,,,,,, +17,102849,,,,,,,,,,,,0.07845838367938995,,,,,, +17,102899,,,,,,,,,,,,0.05097244679927826,,,,,, +17,102949,,,,,,,,,,,,0.05613820254802704,,,,,, +17,102999,,,,,,,,,,,,0.07042057812213898,,,,,, +17,103049,,,,,,,,,,,,0.06306138634681702,,,,,, +17,103099,,,,,,,,,,,,0.07202139496803284,,,,,, +17,103149,,,,,,,,,,,,0.06602415442466736,,,,,, +17,103199,,,,,,,,,,,,0.06384627521038055,,,,,, +17,103247,,,,,,,,,,,,,0.24270053207874298,0.0826290026307106,0.20415954291820526,-0.0025249719619750977,0.20803774893283844,0.0826290026307106 +17,103247,,,,,,,0.2098737210035324,0.06326128542423248,0.4854139983654022,0.23562735319137573,0.46419376134872437,,,,,,, +18,103249,,,,,,,,,,,,0.060573019087314606,,,,,, +18,103299,,,,,,,,,,,,0.060909584164619446,,,,,, +18,103349,,,,,,,,,,,,0.06487508118152618,,,,,, +18,103399,,,,,,,,,,,,0.05561599135398865,,,,,, +18,103449,,,,,,,,,,,,0.0619068443775177,,,,,, +18,103499,,,,,,,,,,,,0.06213563680648804,,,,,, +18,103549,,,,,,,,,,,,0.06441739201545715,,,,,, +18,103599,,,,,,,,,,,,0.06701734662055969,,,,,, +18,103649,,,,,,,,,,,,0.06665884703397751,,,,,, +18,103699,,,,,,,,,,,,0.06203950196504593,,,,,, +18,103749,,,,,,,,,,,,0.060197412967681885,,,,,, +18,103799,,,,,,,,,,,,0.057217858731746674,,,,,, +18,103849,,,,,,,,,,,,0.06666933745145798,,,,,, +18,103899,,,,,,,,,,,,0.07557643949985504,,,,,, +18,103949,,,,,,,,,,,,0.07120795547962189,,,,,, +18,103999,,,,,,,,,,,,0.06420838832855225,,,,,, +18,104049,,,,,,,,,,,,0.07072511315345764,,,,,, +18,104099,,,,,,,,,,,,0.0665850043296814,,,,,, +18,104149,,,,,,,,,,,,0.06972048431634903,,,,,, +18,104199,,,,,,,,,,,,0.06426647305488586,,,,,, +18,104249,,,,,,,,,,,,0.06479320675134659,,,,,, +18,104299,,,,,,,,,,,,0.05663352832198143,,,,,, +18,104349,,,,,,,,,,,,0.06583146005868912,,,,,, +18,104399,,,,,,,,,,,,0.05452008545398712,,,,,, +18,104449,,,,,,,,,,,,0.07207119464874268,,,,,, +18,104499,,,,,,,,,,,,0.06984402239322662,,,,,, +18,104549,,,,,,,,,,,,0.0701180174946785,,,,,, +18,104599,,,,,,,,,,,,0.05766526237130165,,,,,, +18,104649,,,,,,,,,,,,0.06474044919013977,,,,,, +18,104699,,,,,,,,,,,,0.06014636531472206,,,,,, +18,104749,,,,,,,,,,,,0.06724055111408234,,,,,, +18,104799,,,,,,,,,,,,0.07138960808515549,,,,,, +18,104849,,,,,,,,,,,,0.056279584765434265,,,,,, +18,104899,,,,,,,,,,,,0.060579411685466766,,,,,, +18,104949,,,,,,,,,,,,0.06754893809556961,,,,,, +18,104999,,,,,,,,,,,,0.06130901724100113,,,,,, +18,105049,,,,,,,,,,,,0.06309178471565247,,,,,, +18,105099,,,,,,,,,,,,0.0642700344324112,,,,,, +18,105149,,,,,,,,,,,,0.05952845886349678,,,,,, +18,105199,,,,,,,,,,,,0.0625983253121376,,,,,, +18,105249,,,,,,,,,,,,0.06514213979244232,,,,,, +18,105299,,,,,,,,,,,,0.05765487253665924,,,,,, +18,105349,,,,,,,,,,,,0.059055909514427185,,,,,, +18,105399,,,,,,,,,,,,0.058127306401729584,,,,,, +18,105449,,,,,,,,,,,,0.07212578505277634,,,,,, +18,105499,,,,,,,,,,,,0.062049828469753265,,,,,, +18,105549,,,,,,,,,,,,0.06878472864627838,,,,,, +18,105599,,,,,,,,,,,,0.06687439233064651,,,,,, +18,105649,,,,,,,,,,,,0.058227092027664185,,,,,, +18,105699,,,,,,,,,,,,0.06312622129917145,,,,,, +18,105749,,,,,,,,,,,,0.05882716551423073,,,,,, +18,105799,,,,,,,,,,,,0.060574453324079514,,,,,, +18,105849,,,,,,,,,,,,0.06845870614051819,,,,,, +18,105899,,,,,,,,,,,,0.054772377014160156,,,,,, +18,105949,,,,,,,,,,,,0.05704262852668762,,,,,, +18,105999,,,,,,,,,,,,0.06324291229248047,,,,,, +18,106049,,,,,,,,,,,,0.06558816134929657,,,,,, +18,106099,,,,,,,,,,,,0.07131979614496231,,,,,, +18,106149,,,,,,,,,,,,0.06317102164030075,,,,,, +18,106199,,,,,,,,,,,,0.07171446084976196,,,,,, +18,106249,,,,,,,,,,,,0.058780308812856674,,,,,, +18,106299,,,,,,,,,,,,0.06748921424150467,,,,,, +18,106349,,,,,,,,,,,,0.06084956228733063,,,,,, +18,106399,,,,,,,,,,,,0.06236977130174637,,,,,, +18,106449,,,,,,,,,,,,0.07324258238077164,,,,,, +18,106499,,,,,,,,,,,,0.062229033559560776,,,,,, +18,106549,,,,,,,,,,,,0.06877591460943222,,,,,, +18,106599,,,,,,,,,,,,0.08493588864803314,,,,,, +18,106649,,,,,,,,,,,,0.06182378903031349,,,,,, +18,106699,,,,,,,,,,,,0.06350052356719971,,,,,, +18,106749,,,,,,,,,,,,0.06138649582862854,,,,,, +18,106799,,,,,,,,,,,,0.05591972917318344,,,,,, +18,106849,,,,,,,,,,,,0.05794254690408707,,,,,, +18,106899,,,,,,,,,,,,0.06585033237934113,,,,,, +18,106949,,,,,,,,,,,,0.058192089200019836,,,,,, +18,106999,,,,,,,,,,,,0.0688372477889061,,,,,, +18,107049,,,,,,,,,,,,0.06731972098350525,,,,,, +18,107099,,,,,,,,,,,,0.05328965187072754,,,,,, +18,107149,,,,,,,,,,,,0.059236425906419754,,,,,, +18,107199,,,,,,,,,,,,0.06399492919445038,,,,,, +18,107249,,,,,,,,,,,,0.06716161221265793,,,,,, +18,107299,,,,,,,,,,,,0.06372363120317459,,,,,, +18,107349,,,,,,,,,,,,0.05253324657678604,,,,,, +18,107399,,,,,,,,,,,,0.06510987877845764,,,,,, +18,107449,,,,,,,,,,,,0.05693396180868149,,,,,, +18,107499,,,,,,,,,,,,0.0594928115606308,,,,,, +18,107549,,,,,,,,,,,,0.05820292979478836,,,,,, +18,107599,,,,,,,,,,,,0.06532677263021469,,,,,, +18,107649,,,,,,,,,,,,0.06516006588935852,,,,,, +18,107699,,,,,,,,,,,,0.05806498974561691,,,,,, +18,107749,,,,,,,,,,,,0.0756678432226181,,,,,, +18,107799,,,,,,,,,,,,0.0778227150440216,,,,,, +18,107849,,,,,,,,,,,,0.07309068739414215,,,,,, +18,107899,,,,,,,,,,,,0.04253815859556198,,,,,, +18,107949,,,,,,,,,,,,0.07076680660247803,,,,,, +18,107999,,,,,,,,,,,,0.0652250349521637,,,,,, +18,108049,,,,,,,,,,,,0.07056479901075363,,,,,, +18,108099,,,,,,,,,,,,0.058717992156744,,,,,, +18,108149,,,,,,,,,,,,0.06465015560388565,,,,,, +18,108199,,,,,,,,,,,,0.06245657801628113,,,,,, +18,108249,,,,,,,,,,,,0.06675500422716141,,,,,, +18,108299,,,,,,,,,,,,0.0757993757724762,,,,,, +18,108349,,,,,,,,,,,,0.06556479632854462,,,,,, +18,108399,,,,,,,,,,,,0.06972970813512802,,,,,, +18,108449,,,,,,,,,,,,0.06249716877937317,,,,,, +18,108499,,,,,,,,,,,,0.06354366987943649,,,,,, +18,108549,,,,,,,,,,,,0.07706162333488464,,,,,, +18,108599,,,,,,,,,,,,0.06822948902845383,,,,,, +18,108649,,,,,,,,,,,,0.06226426735520363,,,,,, +18,108699,,,,,,,,,,,,0.07028880715370178,,,,,, +18,108749,,,,,,,,,,,,0.06144382804632187,,,,,, +18,108799,,,,,,,,,,,,0.06403850018978119,,,,,, +18,108849,,,,,,,,,,,,0.06431561708450317,,,,,, +18,108899,,,,,,,,,,,,0.06354548037052155,,,,,, +18,108949,,,,,,,,,,,,0.05828847363591194,,,,,, +18,108983,,,,,,,,,,,,,0.24265162646770477,0.08278164267539978,0.20213016867637634,-0.004377007484436035,0.20577077567577362,0.08278164267539978 +18,108983,,,,,,,0.2094777226448059,0.06307559460401535,0.4877254366874695,0.23786306381225586,0.4672752022743225,,,,,,, +19,108999,,,,,,,,,,,,0.0699724331498146,,,,,, +19,109049,,,,,,,,,,,,0.0625564232468605,,,,,, +19,109099,,,,,,,,,,,,0.06320694088935852,,,,,, +19,109149,,,,,,,,,,,,0.060103997588157654,,,,,, +19,109199,,,,,,,,,,,,0.05474585294723511,,,,,, +19,109249,,,,,,,,,,,,0.05670185014605522,,,,,, +19,109299,,,,,,,,,,,,0.05442367121577263,,,,,, +19,109349,,,,,,,,,,,,0.06286079436540604,,,,,, +19,109399,,,,,,,,,,,,0.05355249345302582,,,,,, +19,109449,,,,,,,,,,,,0.06668958067893982,,,,,, +19,109499,,,,,,,,,,,,0.05986935645341873,,,,,, +19,109549,,,,,,,,,,,,0.05888921767473221,,,,,, +19,109599,,,,,,,,,,,,0.054366935044527054,,,,,, +19,109649,,,,,,,,,,,,0.06756564974784851,,,,,, +19,109699,,,,,,,,,,,,0.07014071941375732,,,,,, +19,109749,,,,,,,,,,,,0.06258691847324371,,,,,, +19,109799,,,,,,,,,,,,0.05937277525663376,,,,,, +19,109849,,,,,,,,,,,,0.0741635113954544,,,,,, +19,109899,,,,,,,,,,,,0.059705257415771484,,,,,, +19,109949,,,,,,,,,,,,0.05371284484863281,,,,,, +19,109999,,,,,,,,,,,,0.053459685295820236,,,,,, +19,110049,,,,,,,,,,,,0.06000296398997307,,,,,, +19,110099,,,,,,,,,,,,0.06994813680648804,,,,,, +19,110149,,,,,,,,,,,,0.05988524481654167,,,,,, +19,110199,,,,,,,,,,,,0.07410082221031189,,,,,, +19,110249,,,,,,,,,,,,0.06598478555679321,,,,,, +19,110299,,,,,,,,,,,,0.056948572397232056,,,,,, +19,110349,,,,,,,,,,,,0.05709986388683319,,,,,, +19,110399,,,,,,,,,,,,0.059566352516412735,,,,,, +19,110449,,,,,,,,,,,,0.06947693228721619,,,,,, +19,110499,,,,,,,,,,,,0.06296353787183762,,,,,, +19,110549,,,,,,,,,,,,0.06631801277399063,,,,,, +19,110599,,,,,,,,,,,,0.05676449090242386,,,,,, +19,110649,,,,,,,,,,,,0.06875424087047577,,,,,, +19,110699,,,,,,,,,,,,0.05859751999378204,,,,,, +19,110749,,,,,,,,,,,,0.0624057911336422,,,,,, +19,110799,,,,,,,,,,,,0.054621826857328415,,,,,, +19,110849,,,,,,,,,,,,0.07563634216785431,,,,,, +19,110899,,,,,,,,,,,,0.0667712539434433,,,,,, +19,110949,,,,,,,,,,,,0.06436096131801605,,,,,, +19,110999,,,,,,,,,,,,0.060742124915122986,,,,,, +19,111049,,,,,,,,,,,,0.05850863456726074,,,,,, +19,111099,,,,,,,,,,,,0.07136647403240204,,,,,, +19,111149,,,,,,,,,,,,0.05985639989376068,,,,,, +19,111199,,,,,,,,,,,,0.07409974187612534,,,,,, +19,111249,,,,,,,,,,,,0.06936076283454895,,,,,, +19,111299,,,,,,,,,,,,0.06758704781532288,,,,,, +19,111349,,,,,,,,,,,,0.0682917907834053,,,,,, +19,111399,,,,,,,,,,,,0.06210344284772873,,,,,, +19,111449,,,,,,,,,,,,0.056154511868953705,,,,,, +19,111499,,,,,,,,,,,,0.05726819485425949,,,,,, +19,111549,,,,,,,,,,,,0.05952983722090721,,,,,, +19,111599,,,,,,,,,,,,0.07086025923490524,,,,,, +19,111649,,,,,,,,,,,,0.06234349310398102,,,,,, +19,111699,,,,,,,,,,,,0.06385388225317001,,,,,, +19,111749,,,,,,,,,,,,0.05797009915113449,,,,,, +19,111799,,,,,,,,,,,,0.06723851710557938,,,,,, +19,111849,,,,,,,,,,,,0.06694777309894562,,,,,, +19,111899,,,,,,,,,,,,0.0681547224521637,,,,,, +19,111949,,,,,,,,,,,,0.054970476776361465,,,,,, +19,111999,,,,,,,,,,,,0.06420183926820755,,,,,, +19,112049,,,,,,,,,,,,0.06313054263591766,,,,,, +19,112099,,,,,,,,,,,,0.06304388493299484,,,,,, +19,112149,,,,,,,,,,,,0.05968803912401199,,,,,, +19,112199,,,,,,,,,,,,0.05201078578829765,,,,,, +19,112249,,,,,,,,,,,,0.05186152458190918,,,,,, +19,112299,,,,,,,,,,,,0.06118260696530342,,,,,, +19,112349,,,,,,,,,,,,0.0771171972155571,,,,,, +19,112399,,,,,,,,,,,,0.06553378701210022,,,,,, +19,112449,,,,,,,,,,,,0.060170307755470276,,,,,, +19,112499,,,,,,,,,,,,0.06988320499658585,,,,,, +19,112549,,,,,,,,,,,,0.05191211774945259,,,,,, +19,112599,,,,,,,,,,,,0.07119371742010117,,,,,, +19,112649,,,,,,,,,,,,0.07168368995189667,,,,,, +19,112699,,,,,,,,,,,,0.07343964278697968,,,,,, +19,112749,,,,,,,,,,,,0.057596661150455475,,,,,, +19,112799,,,,,,,,,,,,0.06825202703475952,,,,,, +19,112849,,,,,,,,,,,,0.05185595899820328,,,,,, +19,112899,,,,,,,,,,,,0.06602422893047333,,,,,, +19,112949,,,,,,,,,,,,0.05668289214372635,,,,,, +19,112999,,,,,,,,,,,,0.06207295507192612,,,,,, +19,113049,,,,,,,,,,,,0.06425769627094269,,,,,, +19,113099,,,,,,,,,,,,0.06365938484668732,,,,,, +19,113149,,,,,,,,,,,,0.06693680584430695,,,,,, +19,113199,,,,,,,,,,,,0.056614700704813004,,,,,, +19,113249,,,,,,,,,,,,0.058586236089468,,,,,, +19,113299,,,,,,,,,,,,0.045909520238637924,,,,,, +19,113349,,,,,,,,,,,,0.07809703797101974,,,,,, +19,113399,,,,,,,,,,,,0.06472919881343842,,,,,, +19,113449,,,,,,,,,,,,0.06388834118843079,,,,,, +19,113499,,,,,,,,,,,,0.06292954087257385,,,,,, +19,113549,,,,,,,,,,,,0.06554239988327026,,,,,, +19,113599,,,,,,,,,,,,0.07002272456884384,,,,,, +19,113649,,,,,,,,,,,,0.0616539791226387,,,,,, +19,113699,,,,,,,,,,,,0.05787132680416107,,,,,, +19,113749,,,,,,,,,,,,0.06320494413375854,,,,,, +19,113799,,,,,,,,,,,,0.07049711048603058,,,,,, +19,113849,,,,,,,,,,,,0.05923856422305107,,,,,, +19,113899,,,,,,,,,,,,0.07115466147661209,,,,,, +19,113949,,,,,,,,,,,,0.06589239090681076,,,,,, +19,113999,,,,,,,,,,,,0.06931164115667343,,,,,, +19,114049,,,,,,,,,,,,0.058255139738321304,,,,,, +19,114099,,,,,,,,,,,,0.06635843217372894,,,,,, +19,114149,,,,,,,,,,,,0.07101309299468994,,,,,, +19,114199,,,,,,,,,,,,0.0509798526763916,,,,,, +19,114249,,,,,,,,,,,,0.060895200818777084,,,,,, +19,114299,,,,,,,,,,,,0.05946257710456848,,,,,, +19,114349,,,,,,,,,,,,0.04976246505975723,,,,,, +19,114399,,,,,,,,,,,,0.057360995560884476,,,,,, +19,114449,,,,,,,,,,,,0.06031668186187744,,,,,, +19,114499,,,,,,,,,,,,0.06480506807565689,,,,,, +19,114549,,,,,,,,,,,,0.07103338837623596,,,,,, +19,114599,,,,,,,,,,,,0.07085298001766205,,,,,, +19,114649,,,,,,,,,,,,0.061607107520103455,,,,,, +19,114699,,,,,,,,,,,,0.07073710858821869,,,,,, +19,114719,,,,,,,,,,,,,0.24254481494426727,0.08266537636518478,0.20489627122879028,-0.0029664039611816406,0.2076316624879837,0.08266537636518478 +19,114719,,,,,,,0.20881694555282593,0.06274958699941635,0.4917469024658203,0.24179726839065552,0.4708907902240753,,,,,,, +20,114749,,,,,,,,,,,,0.0747704803943634,,,,,, +20,114799,,,,,,,,,,,,0.05570950359106064,,,,,, +20,114849,,,,,,,,,,,,0.07112865895032883,,,,,, +20,114899,,,,,,,,,,,,0.05996255949139595,,,,,, +20,114949,,,,,,,,,,,,0.07130955159664154,,,,,, +20,114999,,,,,,,,,,,,0.07372267544269562,,,,,, +20,115049,,,,,,,,,,,,0.062346506863832474,,,,,, +20,115099,,,,,,,,,,,,0.06400402635335922,,,,,, +20,115149,,,,,,,,,,,,0.05353451520204544,,,,,, +20,115199,,,,,,,,,,,,0.0614711195230484,,,,,, +20,115249,,,,,,,,,,,,0.06771236658096313,,,,,, +20,115299,,,,,,,,,,,,0.07061627507209778,,,,,, +20,115349,,,,,,,,,,,,0.059975363314151764,,,,,, +20,115399,,,,,,,,,,,,0.06343012303113937,,,,,, +20,115449,,,,,,,,,,,,0.07008866220712662,,,,,, +20,115499,,,,,,,,,,,,0.05345373600721359,,,,,, +20,115549,,,,,,,,,,,,0.05089140683412552,,,,,, +20,115599,,,,,,,,,,,,0.07263312488794327,,,,,, +20,115649,,,,,,,,,,,,0.06040036678314209,,,,,, +20,115699,,,,,,,,,,,,0.0633883848786354,,,,,, +20,115749,,,,,,,,,,,,0.07178495824337006,,,,,, +20,115799,,,,,,,,,,,,0.06271256506443024,,,,,, +20,115849,,,,,,,,,,,,0.06388384848833084,,,,,, +20,115899,,,,,,,,,,,,0.053941719233989716,,,,,, +20,115949,,,,,,,,,,,,0.05834808200597763,,,,,, +20,115999,,,,,,,,,,,,0.05900377780199051,,,,,, +20,116049,,,,,,,,,,,,0.07623344659805298,,,,,, +20,116099,,,,,,,,,,,,0.07062660157680511,,,,,, +20,116149,,,,,,,,,,,,0.06173773482441902,,,,,, +20,116199,,,,,,,,,,,,0.0672735869884491,,,,,, +20,116249,,,,,,,,,,,,0.06875480711460114,,,,,, +20,116299,,,,,,,,,,,,0.05271374434232712,,,,,, +20,116349,,,,,,,,,,,,0.059206265956163406,,,,,, +20,116399,,,,,,,,,,,,0.06592988967895508,,,,,, +20,116449,,,,,,,,,,,,0.05921817198395729,,,,,, +20,116499,,,,,,,,,,,,0.0595240443944931,,,,,, +20,116549,,,,,,,,,,,,0.06637584418058395,,,,,, +20,116599,,,,,,,,,,,,0.053977180272340775,,,,,, +20,116649,,,,,,,,,,,,0.06047750636935234,,,,,, +20,116699,,,,,,,,,,,,0.05517483130097389,,,,,, +20,116749,,,,,,,,,,,,0.04970467463135719,,,,,, +20,116799,,,,,,,,,,,,0.06608757376670837,,,,,, +20,116849,,,,,,,,,,,,0.06119570881128311,,,,,, +20,116899,,,,,,,,,,,,0.06002262234687805,,,,,, +20,116949,,,,,,,,,,,,0.07151912897825241,,,,,, +20,116999,,,,,,,,,,,,0.05544090270996094,,,,,, +20,117049,,,,,,,,,,,,0.0615663081407547,,,,,, +20,117099,,,,,,,,,,,,0.056306928396224976,,,,,, +20,117149,,,,,,,,,,,,0.06526444852352142,,,,,, +20,117199,,,,,,,,,,,,0.06806361675262451,,,,,, +20,117249,,,,,,,,,,,,0.05385561287403107,,,,,, +20,117299,,,,,,,,,,,,0.04820375144481659,,,,,, +20,117349,,,,,,,,,,,,0.07292678952217102,,,,,, +20,117399,,,,,,,,,,,,0.05022208392620087,,,,,, +20,117449,,,,,,,,,,,,0.061706386506557465,,,,,, +20,117499,,,,,,,,,,,,0.06810307502746582,,,,,, +20,117549,,,,,,,,,,,,0.07122182846069336,,,,,, +20,117599,,,,,,,,,,,,0.060853082686662674,,,,,, +20,117649,,,,,,,,,,,,0.07671502232551575,,,,,, +20,117699,,,,,,,,,,,,0.05859321728348732,,,,,, +20,117749,,,,,,,,,,,,0.06698042154312134,,,,,, +20,117799,,,,,,,,,,,,0.05752317234873772,,,,,, +20,117849,,,,,,,,,,,,0.04950855299830437,,,,,, +20,117899,,,,,,,,,,,,0.051387540996074677,,,,,, +20,117949,,,,,,,,,,,,0.07231125980615616,,,,,, +20,117999,,,,,,,,,,,,0.07679897546768188,,,,,, +20,118049,,,,,,,,,,,,0.05137912184000015,,,,,, +20,118099,,,,,,,,,,,,0.06599943339824677,,,,,, +20,118149,,,,,,,,,,,,0.06093014404177666,,,,,, +20,118199,,,,,,,,,,,,0.059235572814941406,,,,,, +20,118249,,,,,,,,,,,,0.08067550510168076,,,,,, +20,118299,,,,,,,,,,,,0.06573984026908875,,,,,, +20,118349,,,,,,,,,,,,0.06745746731758118,,,,,, +20,118399,,,,,,,,,,,,0.07090593874454498,,,,,, +20,118449,,,,,,,,,,,,0.061566270887851715,,,,,, +20,118499,,,,,,,,,,,,0.05282443016767502,,,,,, +20,118549,,,,,,,,,,,,0.07739847898483276,,,,,, +20,118599,,,,,,,,,,,,0.06079735606908798,,,,,, +20,118649,,,,,,,,,,,,0.05808800458908081,,,,,, +20,118699,,,,,,,,,,,,0.06374221295118332,,,,,, +20,118749,,,,,,,,,,,,0.06353536248207092,,,,,, +20,118799,,,,,,,,,,,,0.06633678078651428,,,,,, +20,118849,,,,,,,,,,,,0.06847751140594482,,,,,, +20,118899,,,,,,,,,,,,0.059912167489528656,,,,,, +20,118949,,,,,,,,,,,,0.06721378862857819,,,,,, +20,118999,,,,,,,,,,,,0.059627048671245575,,,,,, +20,119049,,,,,,,,,,,,0.06317685544490814,,,,,, +20,119099,,,,,,,,,,,,0.05694950371980667,,,,,, +20,119149,,,,,,,,,,,,0.07733971625566483,,,,,, +20,119199,,,,,,,,,,,,0.06109089404344559,,,,,, +20,119249,,,,,,,,,,,,0.06889724731445312,,,,,, +20,119299,,,,,,,,,,,,0.0600891187787056,,,,,, +20,119349,,,,,,,,,,,,0.05985742807388306,,,,,, +20,119399,,,,,,,,,,,,0.07316510379314423,,,,,, +20,119449,,,,,,,,,,,,0.060073088854551315,,,,,, +20,119499,,,,,,,,,,,,0.06485214829444885,,,,,, +20,119549,,,,,,,,,,,,0.060760386288166046,,,,,, +20,119599,,,,,,,,,,,,0.05790913105010986,,,,,, +20,119649,,,,,,,,,,,,0.062411800026893616,,,,,, +20,119699,,,,,,,,,,,,0.05825173482298851,,,,,, +20,119749,,,,,,,,,,,,0.055561698973178864,,,,,, +20,119799,,,,,,,,,,,,0.05476026237010956,,,,,, +20,119849,,,,,,,,,,,,0.06585296988487244,,,,,, +20,119899,,,,,,,,,,,,0.07558169215917587,,,,,, +20,119949,,,,,,,,,,,,0.06247132271528244,,,,,, +20,119999,,,,,,,,,,,,0.058748576790094376,,,,,, +20,120049,,,,,,,,,,,,0.060507215559482574,,,,,, +20,120099,,,,,,,,,,,,0.058181032538414,,,,,, +20,120149,,,,,,,,,,,,0.06899535655975342,,,,,, +20,120199,,,,,,,,,,,,0.05753757432103157,,,,,, +20,120249,,,,,,,,,,,,0.07058070600032806,,,,,, +20,120299,,,,,,,,,,,,0.055118314921855927,,,,,, +20,120349,,,,,,,,,,,,0.06793157756328583,,,,,, +20,120399,,,,,,,,,,,,0.05850398540496826,,,,,, +20,120449,,,,,,,,,,,,0.05807366967201233,,,,,, +20,120455,,,,,,,,,,,,,0.24137352406978607,0.08147699385881424,0.20749448239803314,0.011452138423919678,0.2098456174135208,0.08147699385881424 +20,120455,,,,,,,0.2083074152469635,0.06249189004302025,0.4949019253253937,0.2449253797531128,0.4738861918449402,,,,,,, +21,120499,,,,,,,,,,,,0.0685589462518692,,,,,, +21,120549,,,,,,,,,,,,0.05918404832482338,,,,,, +21,120599,,,,,,,,,,,,0.058449678122997284,,,,,, +21,120649,,,,,,,,,,,,0.0678277239203453,,,,,, +21,120699,,,,,,,,,,,,0.06543570011854172,,,,,, +21,120749,,,,,,,,,,,,0.06606730818748474,,,,,, +21,120799,,,,,,,,,,,,0.05484688654541969,,,,,, +21,120849,,,,,,,,,,,,0.06098748743534088,,,,,, +21,120899,,,,,,,,,,,,0.048087120056152344,,,,,, +21,120949,,,,,,,,,,,,0.0642341896891594,,,,,, +21,120999,,,,,,,,,,,,0.062084633857011795,,,,,, +21,121049,,,,,,,,,,,,0.06657317280769348,,,,,, +21,121099,,,,,,,,,,,,0.06604227423667908,,,,,, +21,121149,,,,,,,,,,,,0.06471653282642365,,,,,, +21,121199,,,,,,,,,,,,0.05883017182350159,,,,,, +21,121249,,,,,,,,,,,,0.05832459032535553,,,,,, +21,121299,,,,,,,,,,,,0.055704180151224136,,,,,, +21,121349,,,,,,,,,,,,0.06366431713104248,,,,,, +21,121399,,,,,,,,,,,,0.05323608219623566,,,,,, +21,121449,,,,,,,,,,,,0.05887500196695328,,,,,, +21,121499,,,,,,,,,,,,0.06821541488170624,,,,,, +21,121549,,,,,,,,,,,,0.0644824206829071,,,,,, +21,121599,,,,,,,,,,,,0.05757035315036774,,,,,, +21,121649,,,,,,,,,,,,0.05294078588485718,,,,,, +21,121699,,,,,,,,,,,,0.06345013529062271,,,,,, +21,121749,,,,,,,,,,,,0.06178578734397888,,,,,, +21,121799,,,,,,,,,,,,0.06596344709396362,,,,,, +21,121849,,,,,,,,,,,,0.06898419559001923,,,,,, +21,121899,,,,,,,,,,,,0.053922995924949646,,,,,, +21,121949,,,,,,,,,,,,0.07225075364112854,,,,,, +21,121999,,,,,,,,,,,,0.05613844096660614,,,,,, +21,122049,,,,,,,,,,,,0.06027846410870552,,,,,, +21,122099,,,,,,,,,,,,0.06087808310985565,,,,,, +21,122149,,,,,,,,,,,,0.07101865112781525,,,,,, +21,122199,,,,,,,,,,,,0.056966327130794525,,,,,, +21,122249,,,,,,,,,,,,0.060802921652793884,,,,,, +21,122299,,,,,,,,,,,,0.05304113030433655,,,,,, +21,122349,,,,,,,,,,,,0.06561847031116486,,,,,, +21,122399,,,,,,,,,,,,0.05313331261277199,,,,,, +21,122449,,,,,,,,,,,,0.06619513034820557,,,,,, +21,122499,,,,,,,,,,,,0.05962781980633736,,,,,, +21,122549,,,,,,,,,,,,0.06192391365766525,,,,,, +21,122599,,,,,,,,,,,,0.06029894948005676,,,,,, +21,122649,,,,,,,,,,,,0.054720234125852585,,,,,, +21,122699,,,,,,,,,,,,0.07113662362098694,,,,,, +21,122749,,,,,,,,,,,,0.05107545107603073,,,,,, +21,122799,,,,,,,,,,,,0.06149447709321976,,,,,, +21,122849,,,,,,,,,,,,0.06805067509412766,,,,,, +21,122899,,,,,,,,,,,,0.06320749223232269,,,,,, +21,122949,,,,,,,,,,,,0.07101845741271973,,,,,, +21,122999,,,,,,,,,,,,0.05687151849269867,,,,,, +21,123049,,,,,,,,,,,,0.06334890425205231,,,,,, +21,123099,,,,,,,,,,,,0.061877068132162094,,,,,, +21,123149,,,,,,,,,,,,0.06271937489509583,,,,,, +21,123199,,,,,,,,,,,,0.050070442259311676,,,,,, +21,123249,,,,,,,,,,,,0.05681147798895836,,,,,, +21,123299,,,,,,,,,,,,0.07025790214538574,,,,,, +21,123349,,,,,,,,,,,,0.07147173583507538,,,,,, +21,123399,,,,,,,,,,,,0.06810854375362396,,,,,, +21,123449,,,,,,,,,,,,0.06741763651371002,,,,,, +21,123499,,,,,,,,,,,,0.04374799504876137,,,,,, +21,123549,,,,,,,,,,,,0.05809823051095009,,,,,, +21,123599,,,,,,,,,,,,0.053962960839271545,,,,,, +21,123649,,,,,,,,,,,,0.06141497939825058,,,,,, +21,123699,,,,,,,,,,,,0.054061226546764374,,,,,, +21,123749,,,,,,,,,,,,0.06041973829269409,,,,,, +21,123799,,,,,,,,,,,,0.05281538516283035,,,,,, +21,123849,,,,,,,,,,,,0.07481122761964798,,,,,, +21,123899,,,,,,,,,,,,0.06629567593336105,,,,,, +21,123949,,,,,,,,,,,,0.05528549477458,,,,,, +21,123999,,,,,,,,,,,,0.06603819876909256,,,,,, +21,124049,,,,,,,,,,,,0.06035635620355606,,,,,, +21,124099,,,,,,,,,,,,0.06331666558980942,,,,,, +21,124149,,,,,,,,,,,,0.07389183342456818,,,,,, +21,124199,,,,,,,,,,,,0.0655013769865036,,,,,, +21,124249,,,,,,,,,,,,0.061501119285821915,,,,,, +21,124299,,,,,,,,,,,,0.0766977071762085,,,,,, +21,124349,,,,,,,,,,,,0.07694245874881744,,,,,, +21,124399,,,,,,,,,,,,0.0661596953868866,,,,,, +21,124449,,,,,,,,,,,,0.05486629903316498,,,,,, +21,124499,,,,,,,,,,,,0.06552079319953918,,,,,, +21,124549,,,,,,,,,,,,0.05663946270942688,,,,,, +21,124599,,,,,,,,,,,,0.0497429296374321,,,,,, +21,124649,,,,,,,,,,,,0.06211632117629051,,,,,, +21,124699,,,,,,,,,,,,0.06870494782924652,,,,,, +21,124749,,,,,,,,,,,,0.058838970959186554,,,,,, +21,124799,,,,,,,,,,,,0.06926083564758301,,,,,, +21,124849,,,,,,,,,,,,0.06521885842084885,,,,,, +21,124899,,,,,,,,,,,,0.06440909951925278,,,,,, +21,124949,,,,,,,,,,,,0.05271954834461212,,,,,, +21,124999,,,,,,,,,,,,0.06238554045557976,,,,,, +21,125049,,,,,,,,,,,,0.0589236281812191,,,,,, +21,125099,,,,,,,,,,,,0.05880344659090042,,,,,, +21,125149,,,,,,,,,,,,0.054571375250816345,,,,,, +21,125199,,,,,,,,,,,,0.05639703571796417,,,,,, +21,125249,,,,,,,,,,,,0.06160634756088257,,,,,, +21,125299,,,,,,,,,,,,0.06472838670015335,,,,,, +21,125349,,,,,,,,,,,,0.06158372759819031,,,,,, +21,125399,,,,,,,,,,,,0.05901148170232773,,,,,, +21,125449,,,,,,,,,,,,0.061903879046440125,,,,,, +21,125499,,,,,,,,,,,,0.06298339366912842,,,,,, +21,125549,,,,,,,,,,,,0.05962589383125305,,,,,, +21,125599,,,,,,,,,,,,0.054431334137916565,,,,,, +21,125649,,,,,,,,,,,,0.06098414957523346,,,,,, +21,125699,,,,,,,,,,,,0.062098272144794464,,,,,, +21,125749,,,,,,,,,,,,0.06045421585440636,,,,,, +21,125799,,,,,,,,,,,,0.06451177597045898,,,,,, +21,125849,,,,,,,,,,,,0.061249855905771255,,,,,, +21,125899,,,,,,,,,,,,0.06199870631098747,,,,,, +21,125949,,,,,,,,,,,,0.05520951747894287,,,,,, +21,125999,,,,,,,,,,,,0.06066739559173584,,,,,, +21,126049,,,,,,,,,,,,0.06778194010257721,,,,,, +21,126099,,,,,,,,,,,,0.060447342693805695,,,,,, +21,126149,,,,,,,,,,,,0.059143539518117905,,,,,, +21,126191,,,,,,,,,,,,,0.24082081019878387,0.08132973313331604,0.21604077517986298,0.013238787651062012,0.21879078447818756,0.08132973313331604 +21,126191,,,,,,,0.20645421743392944,0.061639562249183655,0.5051957964897156,0.2552186846733093,0.48419156670570374,,,,,,, +22,126199,,,,,,,,,,,,0.06677772849798203,,,,,, +22,126249,,,,,,,,,,,,0.061677537858486176,,,,,, +22,126299,,,,,,,,,,,,0.060036249458789825,,,,,, +22,126349,,,,,,,,,,,,0.06614018976688385,,,,,, +22,126399,,,,,,,,,,,,0.05779997259378433,,,,,, +22,126449,,,,,,,,,,,,0.06859290599822998,,,,,, +22,126499,,,,,,,,,,,,0.06376832723617554,,,,,, +22,126549,,,,,,,,,,,,0.0689554214477539,,,,,, +22,126599,,,,,,,,,,,,0.05559846758842468,,,,,, +22,126649,,,,,,,,,,,,0.06153646484017372,,,,,, +22,126699,,,,,,,,,,,,0.060923755168914795,,,,,, +22,126749,,,,,,,,,,,,0.061782363802194595,,,,,, +22,126799,,,,,,,,,,,,0.06748173385858536,,,,,, +22,126849,,,,,,,,,,,,0.06180647015571594,,,,,, +22,126899,,,,,,,,,,,,0.05867058038711548,,,,,, +22,126949,,,,,,,,,,,,0.06395072489976883,,,,,, +22,126999,,,,,,,,,,,,0.059227317571640015,,,,,, +22,127049,,,,,,,,,,,,0.06799976527690887,,,,,, +22,127099,,,,,,,,,,,,0.06565675884485245,,,,,, +22,127149,,,,,,,,,,,,0.06730878353118896,,,,,, +22,127199,,,,,,,,,,,,0.05773846432566643,,,,,, +22,127249,,,,,,,,,,,,0.06602749973535538,,,,,, +22,127299,,,,,,,,,,,,0.061720117926597595,,,,,, +22,127349,,,,,,,,,,,,0.05162626504898071,,,,,, +22,127399,,,,,,,,,,,,0.055985234677791595,,,,,, +22,127449,,,,,,,,,,,,0.05760089308023453,,,,,, +22,127499,,,,,,,,,,,,0.07673118263483047,,,,,, +22,127549,,,,,,,,,,,,0.055520348250865936,,,,,, +22,127599,,,,,,,,,,,,0.07220568507909775,,,,,, +22,127649,,,,,,,,,,,,0.06386691331863403,,,,,, +22,127699,,,,,,,,,,,,0.06202678009867668,,,,,, +22,127749,,,,,,,,,,,,0.056235503405332565,,,,,, +22,127799,,,,,,,,,,,,0.055427245795726776,,,,,, +22,127849,,,,,,,,,,,,0.05981732904911041,,,,,, +22,127899,,,,,,,,,,,,0.07204629480838776,,,,,, +22,127949,,,,,,,,,,,,0.06421220302581787,,,,,, +22,127999,,,,,,,,,,,,0.07320970296859741,,,,,, +22,128049,,,,,,,,,,,,0.055541928857564926,,,,,, +22,128099,,,,,,,,,,,,0.06498640030622482,,,,,, +22,128149,,,,,,,,,,,,0.05621109530329704,,,,,, +22,128199,,,,,,,,,,,,0.059205129742622375,,,,,, +22,128249,,,,,,,,,,,,0.0616421103477478,,,,,, +22,128299,,,,,,,,,,,,0.055095039308071136,,,,,, +22,128349,,,,,,,,,,,,0.059770725667476654,,,,,, +22,128399,,,,,,,,,,,,0.0697016641497612,,,,,, +22,128449,,,,,,,,,,,,0.057271555066108704,,,,,, +22,128499,,,,,,,,,,,,0.06464771926403046,,,,,, +22,128549,,,,,,,,,,,,0.0596928671002388,,,,,, +22,128599,,,,,,,,,,,,0.05101070553064346,,,,,, +22,128649,,,,,,,,,,,,0.05212279036641121,,,,,, +22,128699,,,,,,,,,,,,0.05942966789007187,,,,,, +22,128749,,,,,,,,,,,,0.0683196559548378,,,,,, +22,128799,,,,,,,,,,,,0.055106423795223236,,,,,, +22,128849,,,,,,,,,,,,0.06388739496469498,,,,,, +22,128899,,,,,,,,,,,,0.059741176664829254,,,,,, +22,128949,,,,,,,,,,,,0.06600124388933182,,,,,, +22,128999,,,,,,,,,,,,0.06231154873967171,,,,,, +22,129049,,,,,,,,,,,,0.05034352093935013,,,,,, +22,129099,,,,,,,,,,,,0.05992111191153526,,,,,, +22,129149,,,,,,,,,,,,0.05960141867399216,,,,,, +22,129199,,,,,,,,,,,,0.06565548479557037,,,,,, +22,129249,,,,,,,,,,,,0.07463210821151733,,,,,, +22,129299,,,,,,,,,,,,0.05917837843298912,,,,,, +22,129349,,,,,,,,,,,,0.06682337820529938,,,,,, +22,129399,,,,,,,,,,,,0.0648084282875061,,,,,, +22,129449,,,,,,,,,,,,0.07048309594392776,,,,,, +22,129499,,,,,,,,,,,,0.06940071284770966,,,,,, +22,129549,,,,,,,,,,,,0.06456981599330902,,,,,, +22,129599,,,,,,,,,,,,0.06015859171748161,,,,,, +22,129649,,,,,,,,,,,,0.06364433467388153,,,,,, +22,129699,,,,,,,,,,,,0.06068383529782295,,,,,, +22,129749,,,,,,,,,,,,0.0672486424446106,,,,,, +22,129799,,,,,,,,,,,,0.06057815998792648,,,,,, +22,129849,,,,,,,,,,,,0.06405890733003616,,,,,, +22,129899,,,,,,,,,,,,0.06663632392883301,,,,,, +22,129949,,,,,,,,,,,,0.06081223860383034,,,,,, +22,129999,,,,,,,,,,,,0.06807014346122742,,,,,, +22,130049,,,,,,,,,,,,0.06494680047035217,,,,,, +22,130099,,,,,,,,,,,,0.06690184772014618,,,,,, +22,130149,,,,,,,,,,,,0.0720578283071518,,,,,, +22,130199,,,,,,,,,,,,0.05827932804822922,,,,,, +22,130249,,,,,,,,,,,,0.06650646030902863,,,,,, +22,130299,,,,,,,,,,,,0.06160948425531387,,,,,, +22,130349,,,,,,,,,,,,0.05871637165546417,,,,,, +22,130399,,,,,,,,,,,,0.05562461167573929,,,,,, +22,130449,,,,,,,,,,,,0.06654726713895798,,,,,, +22,130499,,,,,,,,,,,,0.0621408149600029,,,,,, +22,130549,,,,,,,,,,,,0.05974746495485306,,,,,, +22,130599,,,,,,,,,,,,0.057710543274879456,,,,,, +22,130649,,,,,,,,,,,,0.06372806429862976,,,,,, +22,130699,,,,,,,,,,,,0.06305551528930664,,,,,, +22,130749,,,,,,,,,,,,0.05916598066687584,,,,,, +22,130799,,,,,,,,,,,,0.0558324009180069,,,,,, +22,130849,,,,,,,,,,,,0.07044539600610733,,,,,, +22,130899,,,,,,,,,,,,0.06494862586259842,,,,,, +22,130949,,,,,,,,,,,,0.07405813783407211,,,,,, +22,130999,,,,,,,,,,,,0.06435036659240723,,,,,, +22,131049,,,,,,,,,,,,0.053926337510347366,,,,,, +22,131099,,,,,,,,,,,,0.055452924221754074,,,,,, +22,131149,,,,,,,,,,,,0.062122538685798645,,,,,, +22,131199,,,,,,,,,,,,0.05173378437757492,,,,,, +22,131249,,,,,,,,,,,,0.06806015968322754,,,,,, +22,131299,,,,,,,,,,,,0.0605606734752655,,,,,, +22,131349,,,,,,,,,,,,0.06283043324947357,,,,,, +22,131399,,,,,,,,,,,,0.0664384514093399,,,,,, +22,131449,,,,,,,,,,,,0.06272095441818237,,,,,, +22,131499,,,,,,,,,,,,0.052488915622234344,,,,,, +22,131549,,,,,,,,,,,,0.05768303573131561,,,,,, +22,131599,,,,,,,,,,,,0.0532585009932518,,,,,, +22,131649,,,,,,,,,,,,0.0664551705121994,,,,,, +22,131699,,,,,,,,,,,,0.06119878962635994,,,,,, +22,131749,,,,,,,,,,,,0.06224244087934494,,,,,, +22,131799,,,,,,,,,,,,0.05810277909040451,,,,,, +22,131849,,,,,,,,,,,,0.06193549931049347,,,,,, +22,131899,,,,,,,,,,,,0.059601813554763794,,,,,, +22,131927,,,,,,,,,,,,,0.24359476566314697,0.08342858403921127,0.20098933577537537,-0.012226223945617676,0.2050735503435135,0.08342858403921127 +22,131927,,,,,,,0.20597968995571136,0.06141228601336479,0.5079041719436646,0.2579529881477356,0.4867497980594635,,,,,,, +23,131949,,,,,,,,,,,,0.06008251756429672,,,,,, +23,131999,,,,,,,,,,,,0.05019958317279816,,,,,, +23,132049,,,,,,,,,,,,0.05094766244292259,,,,,, +23,132099,,,,,,,,,,,,0.04859871044754982,,,,,, +23,132149,,,,,,,,,,,,0.06755443662405014,,,,,, +23,132199,,,,,,,,,,,,0.057186078280210495,,,,,, +23,132249,,,,,,,,,,,,0.07445567846298218,,,,,, +23,132299,,,,,,,,,,,,0.05840716511011124,,,,,, +23,132349,,,,,,,,,,,,0.060972340404987335,,,,,, +23,132399,,,,,,,,,,,,0.0622679628431797,,,,,, +23,132449,,,,,,,,,,,,0.06548526883125305,,,,,, +23,132499,,,,,,,,,,,,0.05584508925676346,,,,,, +23,132549,,,,,,,,,,,,0.04745013266801834,,,,,, +23,132599,,,,,,,,,,,,0.054204247891902924,,,,,, +23,132649,,,,,,,,,,,,0.054060786962509155,,,,,, +23,132699,,,,,,,,,,,,0.06722418963909149,,,,,, +23,132749,,,,,,,,,,,,0.06987572461366653,,,,,, +23,132799,,,,,,,,,,,,0.05583234131336212,,,,,, +23,132849,,,,,,,,,,,,0.06658682227134705,,,,,, +23,132899,,,,,,,,,,,,0.051730506122112274,,,,,, +23,132949,,,,,,,,,,,,0.06986751407384872,,,,,, +23,132999,,,,,,,,,,,,0.0479297935962677,,,,,, +23,133049,,,,,,,,,,,,0.06342979520559311,,,,,, +23,133099,,,,,,,,,,,,0.06055302172899246,,,,,, +23,133149,,,,,,,,,,,,0.06400950253009796,,,,,, +23,133199,,,,,,,,,,,,0.06023772433400154,,,,,, +23,133249,,,,,,,,,,,,0.06165695935487747,,,,,, +23,133299,,,,,,,,,,,,0.06514497846364975,,,,,, +23,133349,,,,,,,,,,,,0.07750920951366425,,,,,, +23,133399,,,,,,,,,,,,0.060423530638217926,,,,,, +23,133449,,,,,,,,,,,,0.0653153657913208,,,,,, +23,133499,,,,,,,,,,,,0.055173709988594055,,,,,, +23,133549,,,,,,,,,,,,0.06530125439167023,,,,,, +23,133599,,,,,,,,,,,,0.06231530383229256,,,,,, +23,133649,,,,,,,,,,,,0.057730115950107574,,,,,, +23,133699,,,,,,,,,,,,0.05532590299844742,,,,,, +23,133749,,,,,,,,,,,,0.054831430315971375,,,,,, +23,133799,,,,,,,,,,,,0.05990166962146759,,,,,, +23,133849,,,,,,,,,,,,0.0659082904458046,,,,,, +23,133899,,,,,,,,,,,,0.06430911272764206,,,,,, +23,133949,,,,,,,,,,,,0.06984058767557144,,,,,, +23,133999,,,,,,,,,,,,0.060574643313884735,,,,,, +23,134049,,,,,,,,,,,,0.05696718394756317,,,,,, +23,134099,,,,,,,,,,,,0.05958610773086548,,,,,, +23,134149,,,,,,,,,,,,0.061160944402217865,,,,,, +23,134199,,,,,,,,,,,,0.06013161689043045,,,,,, +23,134249,,,,,,,,,,,,0.05544481426477432,,,,,, +23,134299,,,,,,,,,,,,0.06259801983833313,,,,,, +23,134349,,,,,,,,,,,,0.0610470324754715,,,,,, +23,134399,,,,,,,,,,,,0.07090067863464355,,,,,, +23,134449,,,,,,,,,,,,0.0576680451631546,,,,,, +23,134499,,,,,,,,,,,,0.058758191764354706,,,,,, +23,134549,,,,,,,,,,,,0.07208773493766785,,,,,, +23,134599,,,,,,,,,,,,0.05503213405609131,,,,,, +23,134649,,,,,,,,,,,,0.06581311672925949,,,,,, +23,134699,,,,,,,,,,,,0.066834457218647,,,,,, +23,134749,,,,,,,,,,,,0.053107839077711105,,,,,, +23,134799,,,,,,,,,,,,0.06732309609651566,,,,,, +23,134849,,,,,,,,,,,,0.058626916259527206,,,,,, +23,134899,,,,,,,,,,,,0.06336847692728043,,,,,, +23,134949,,,,,,,,,,,,0.06183302402496338,,,,,, +23,134999,,,,,,,,,,,,0.06402023136615753,,,,,, +23,135049,,,,,,,,,,,,0.06652224063873291,,,,,, +23,135099,,,,,,,,,,,,0.05828725919127464,,,,,, +23,135149,,,,,,,,,,,,0.06130959838628769,,,,,, +23,135199,,,,,,,,,,,,0.05659088119864464,,,,,, +23,135249,,,,,,,,,,,,0.058009322732686996,,,,,, +23,135299,,,,,,,,,,,,0.0664498433470726,,,,,, +23,135349,,,,,,,,,,,,0.055532876402139664,,,,,, +23,135399,,,,,,,,,,,,0.056926243007183075,,,,,, +23,135449,,,,,,,,,,,,0.05296815559267998,,,,,, +23,135499,,,,,,,,,,,,0.05824509263038635,,,,,, +23,135549,,,,,,,,,,,,0.05645135045051575,,,,,, +23,135599,,,,,,,,,,,,0.05011799931526184,,,,,, +23,135649,,,,,,,,,,,,0.05057448148727417,,,,,, +23,135699,,,,,,,,,,,,0.049781180918216705,,,,,, +23,135749,,,,,,,,,,,,0.0690796971321106,,,,,, +23,135799,,,,,,,,,,,,0.051033563911914825,,,,,, +23,135849,,,,,,,,,,,,0.05911700800061226,,,,,, +23,135899,,,,,,,,,,,,0.059563346207141876,,,,,, +23,135949,,,,,,,,,,,,0.05813492834568024,,,,,, +23,135999,,,,,,,,,,,,0.0617845319211483,,,,,, +23,136049,,,,,,,,,,,,0.0708332359790802,,,,,, +23,136099,,,,,,,,,,,,0.06325803697109222,,,,,, +23,136149,,,,,,,,,,,,0.062459442764520645,,,,,, +23,136199,,,,,,,,,,,,0.06270609050989151,,,,,, +23,136249,,,,,,,,,,,,0.058197878301143646,,,,,, +23,136299,,,,,,,,,,,,0.05889221280813217,,,,,, +23,136349,,,,,,,,,,,,0.059422802180051804,,,,,, +23,136399,,,,,,,,,,,,0.054063938558101654,,,,,, +23,136449,,,,,,,,,,,,0.060717739164829254,,,,,, +23,136499,,,,,,,,,,,,0.07073038816452026,,,,,, +23,136549,,,,,,,,,,,,0.05847759544849396,,,,,, +23,136599,,,,,,,,,,,,0.06282991170883179,,,,,, +23,136649,,,,,,,,,,,,0.07031454145908356,,,,,, +23,136699,,,,,,,,,,,,0.05152462422847748,,,,,, +23,136749,,,,,,,,,,,,0.0593729130923748,,,,,, +23,136799,,,,,,,,,,,,0.05983597785234451,,,,,, +23,136849,,,,,,,,,,,,0.06227473169565201,,,,,, +23,136899,,,,,,,,,,,,0.076848104596138,,,,,, +23,136949,,,,,,,,,,,,0.06475979834794998,,,,,, +23,136999,,,,,,,,,,,,0.05557570606470108,,,,,, +23,137049,,,,,,,,,,,,0.06724923104047775,,,,,, +23,137099,,,,,,,,,,,,0.054825443774461746,,,,,, +23,137149,,,,,,,,,,,,0.06552056968212128,,,,,, +23,137199,,,,,,,,,,,,0.061556778848171234,,,,,, +23,137249,,,,,,,,,,,,0.059446532279253006,,,,,, +23,137299,,,,,,,,,,,,0.07108151912689209,,,,,, +23,137349,,,,,,,,,,,,0.062062934041023254,,,,,, +23,137399,,,,,,,,,,,,0.05136007070541382,,,,,, +23,137449,,,,,,,,,,,,0.06376554071903229,,,,,, +23,137499,,,,,,,,,,,,0.06200152635574341,,,,,, +23,137549,,,,,,,,,,,,0.05689101666212082,,,,,, +23,137599,,,,,,,,,,,,0.05797164887189865,,,,,, +23,137649,,,,,,,,,,,,0.05246804654598236,,,,,, +23,137663,,,,,,,,,,,,,0.24345505237579346,0.0828310027718544,0.202107235789299,-0.00497591495513916,0.20507179200649261,0.0828310027718544 +23,137663,,,,,,,0.20545051991939545,0.06116177514195442,0.5108776688575745,0.26098960638046265,0.4899529814720154,,,,,,, +24,137699,,,,,,,,,,,,0.05080901458859444,,,,,, +24,137749,,,,,,,,,,,,0.055097438395023346,,,,,, +24,137799,,,,,,,,,,,,0.05591904744505882,,,,,, +24,137849,,,,,,,,,,,,0.05767474323511124,,,,,, +24,137899,,,,,,,,,,,,0.06219908967614174,,,,,, +24,137949,,,,,,,,,,,,0.048590488731861115,,,,,, +24,137999,,,,,,,,,,,,0.0586853064596653,,,,,, +24,138049,,,,,,,,,,,,0.05826248973608017,,,,,, +24,138099,,,,,,,,,,,,0.07602403312921524,,,,,, +24,138149,,,,,,,,,,,,0.07248055934906006,,,,,, +24,138199,,,,,,,,,,,,0.07054977118968964,,,,,, +24,138249,,,,,,,,,,,,0.05887258052825928,,,,,, +24,138299,,,,,,,,,,,,0.053302373737096786,,,,,, +24,138349,,,,,,,,,,,,0.06025905907154083,,,,,, +24,138399,,,,,,,,,,,,0.05313568189740181,,,,,, +24,138449,,,,,,,,,,,,0.07057111710309982,,,,,, +24,138499,,,,,,,,,,,,0.06765078008174896,,,,,, +24,138549,,,,,,,,,,,,0.05864381045103073,,,,,, +24,138599,,,,,,,,,,,,0.06672897934913635,,,,,, +24,138649,,,,,,,,,,,,0.07264552265405655,,,,,, +24,138699,,,,,,,,,,,,0.05257600545883179,,,,,, +24,138749,,,,,,,,,,,,0.0582408532500267,,,,,, +24,138799,,,,,,,,,,,,0.06434397399425507,,,,,, +24,138849,,,,,,,,,,,,0.05816644802689552,,,,,, +24,138899,,,,,,,,,,,,0.05338095873594284,,,,,, +24,138949,,,,,,,,,,,,0.06557896733283997,,,,,, +24,138999,,,,,,,,,,,,0.05507100000977516,,,,,, +24,139049,,,,,,,,,,,,0.05883507430553436,,,,,, +24,139099,,,,,,,,,,,,0.054869428277015686,,,,,, +24,139149,,,,,,,,,,,,0.06318791210651398,,,,,, +24,139199,,,,,,,,,,,,0.05451066046953201,,,,,, +24,139249,,,,,,,,,,,,0.05140502750873566,,,,,, +24,139299,,,,,,,,,,,,0.06090924143791199,,,,,, +24,139349,,,,,,,,,,,,0.05948122590780258,,,,,, +24,139399,,,,,,,,,,,,0.07050022482872009,,,,,, +24,139449,,,,,,,,,,,,0.06541112810373306,,,,,, +24,139499,,,,,,,,,,,,0.06446805596351624,,,,,, +24,139549,,,,,,,,,,,,0.06192142516374588,,,,,, +24,139599,,,,,,,,,,,,0.06312127411365509,,,,,, +24,139649,,,,,,,,,,,,0.055948127061128616,,,,,, +24,139699,,,,,,,,,,,,0.05959127098321915,,,,,, +24,139749,,,,,,,,,,,,0.06313611567020416,,,,,, +24,139799,,,,,,,,,,,,0.06558343768119812,,,,,, +24,139849,,,,,,,,,,,,0.05958825349807739,,,,,, +24,139899,,,,,,,,,,,,0.06265121698379517,,,,,, +24,139949,,,,,,,,,,,,0.04881101846694946,,,,,, +24,139999,,,,,,,,,,,,0.047786206007003784,,,,,, +24,140049,,,,,,,,,,,,0.05976114422082901,,,,,, +24,140099,,,,,,,,,,,,0.06021248549222946,,,,,, +24,140149,,,,,,,,,,,,0.05915111303329468,,,,,, +24,140199,,,,,,,,,,,,0.06083706021308899,,,,,, +24,140249,,,,,,,,,,,,0.06188614293932915,,,,,, +24,140299,,,,,,,,,,,,0.06081072986125946,,,,,, +24,140349,,,,,,,,,,,,0.05436466634273529,,,,,, +24,140399,,,,,,,,,,,,0.06257796287536621,,,,,, +24,140449,,,,,,,,,,,,0.06594700366258621,,,,,, +24,140499,,,,,,,,,,,,0.07855670154094696,,,,,, +24,140549,,,,,,,,,,,,0.06808987259864807,,,,,, +24,140599,,,,,,,,,,,,0.06652645766735077,,,,,, +24,140649,,,,,,,,,,,,0.05749144405126572,,,,,, +24,140699,,,,,,,,,,,,0.05640251189470291,,,,,, +24,140749,,,,,,,,,,,,0.058665722608566284,,,,,, +24,140799,,,,,,,,,,,,0.06263801455497742,,,,,, +24,140849,,,,,,,,,,,,0.06363385915756226,,,,,, +24,140899,,,,,,,,,,,,0.0620279498398304,,,,,, +24,140949,,,,,,,,,,,,0.0632627010345459,,,,,, +24,140999,,,,,,,,,,,,0.07298646867275238,,,,,, +24,141049,,,,,,,,,,,,0.06221288815140724,,,,,, +24,141099,,,,,,,,,,,,0.06701585650444031,,,,,, +24,141149,,,,,,,,,,,,0.05471614748239517,,,,,, +24,141199,,,,,,,,,,,,0.05472572147846222,,,,,, +24,141249,,,,,,,,,,,,0.055308371782302856,,,,,, +24,141299,,,,,,,,,,,,0.07182818651199341,,,,,, +24,141349,,,,,,,,,,,,0.055319949984550476,,,,,, +24,141399,,,,,,,,,,,,0.06146988272666931,,,,,, +24,141449,,,,,,,,,,,,0.05754467099905014,,,,,, +24,141499,,,,,,,,,,,,0.06254971027374268,,,,,, +24,141549,,,,,,,,,,,,0.057696644216775894,,,,,, +24,141599,,,,,,,,,,,,0.06163613870739937,,,,,, +24,141649,,,,,,,,,,,,0.05750922113656998,,,,,, +24,141699,,,,,,,,,,,,0.0668259859085083,,,,,, +24,141749,,,,,,,,,,,,0.0603303387761116,,,,,, +24,141799,,,,,,,,,,,,0.060737647116184235,,,,,, +24,141849,,,,,,,,,,,,0.06104017794132233,,,,,, +24,141899,,,,,,,,,,,,0.061834074556827545,,,,,, +24,141949,,,,,,,,,,,,0.06393128633499146,,,,,, +24,141999,,,,,,,,,,,,0.056454818695783615,,,,,, +24,142049,,,,,,,,,,,,0.0673275887966156,,,,,, +24,142099,,,,,,,,,,,,0.056050997227430344,,,,,, +24,142149,,,,,,,,,,,,0.06614498049020767,,,,,, +24,142199,,,,,,,,,,,,0.052005667239427567,,,,,, +24,142249,,,,,,,,,,,,0.07067069411277771,,,,,, +24,142299,,,,,,,,,,,,0.05199533328413963,,,,,, +24,142349,,,,,,,,,,,,0.06136343255639076,,,,,, +24,142399,,,,,,,,,,,,0.06454742699861526,,,,,, +24,142449,,,,,,,,,,,,0.06548383831977844,,,,,, +24,142499,,,,,,,,,,,,0.06188742071390152,,,,,, +24,142549,,,,,,,,,,,,0.06532428413629532,,,,,, +24,142599,,,,,,,,,,,,0.07179772108793259,,,,,, +24,142649,,,,,,,,,,,,0.06378212571144104,,,,,, +24,142699,,,,,,,,,,,,0.055945027619600296,,,,,, +24,142749,,,,,,,,,,,,0.05728503316640854,,,,,, +24,142799,,,,,,,,,,,,0.058035556226968765,,,,,, +24,142849,,,,,,,,,,,,0.0630754828453064,,,,,, +24,142899,,,,,,,,,,,,0.057971566915512085,,,,,, +24,142949,,,,,,,,,,,,0.06441685557365417,,,,,, +24,142999,,,,,,,,,,,,0.05003216862678528,,,,,, +24,143049,,,,,,,,,,,,0.06396050751209259,,,,,, +24,143099,,,,,,,,,,,,0.05254415422677994,,,,,, +24,143149,,,,,,,,,,,,0.059391532093286514,,,,,, +24,143199,,,,,,,,,,,,0.0644943118095398,,,,,, +24,143249,,,,,,,,,,,,0.05414089560508728,,,,,, +24,143299,,,,,,,,,,,,0.05883065611124039,,,,,, +24,143349,,,,,,,,,,,,0.06767775863409042,,,,,, +24,143399,,,,,,,,,,,,0.07323043793439865,,,,,, +24,143399,,,,,,,,,,,,,0.24317370355129242,0.08336061239242554,0.20181164145469666,-0.011401534080505371,0.20335350930690765,0.08336061239242554 +24,143399,,,,,,,0.20514826476573944,0.06103093549609184,0.5124209523200989,0.26257091760635376,0.4915277659893036,,,,,,, +25,143449,,,,,,,,,,,,0.061365388333797455,,,,,, +25,143499,,,,,,,,,,,,0.055742133408784866,,,,,, +25,143549,,,,,,,,,,,,0.06085805222392082,,,,,, +25,143599,,,,,,,,,,,,0.06070488691329956,,,,,, +25,143649,,,,,,,,,,,,0.05893772095441818,,,,,, +25,143699,,,,,,,,,,,,0.05570491775870323,,,,,, +25,143749,,,,,,,,,,,,0.06717336177825928,,,,,, +25,143799,,,,,,,,,,,,0.06346847116947174,,,,,, +25,143849,,,,,,,,,,,,0.06792349368333817,,,,,, +25,143899,,,,,,,,,,,,0.06004461646080017,,,,,, +25,143949,,,,,,,,,,,,0.06454508006572723,,,,,, +25,143999,,,,,,,,,,,,0.0605061799287796,,,,,, +25,144049,,,,,,,,,,,,0.055249400436878204,,,,,, +25,144099,,,,,,,,,,,,0.06276291608810425,,,,,, +25,144149,,,,,,,,,,,,0.06491643190383911,,,,,, +25,144199,,,,,,,,,,,,0.05472929775714874,,,,,, +25,144249,,,,,,,,,,,,0.06278126686811447,,,,,, +25,144299,,,,,,,,,,,,0.0629500150680542,,,,,, +25,144349,,,,,,,,,,,,0.06936179846525192,,,,,, +25,144399,,,,,,,,,,,,0.07728453725576401,,,,,, +25,144449,,,,,,,,,,,,0.05731772258877754,,,,,, +25,144499,,,,,,,,,,,,0.05495426803827286,,,,,, +25,144549,,,,,,,,,,,,0.06020643189549446,,,,,, +25,144599,,,,,,,,,,,,0.04874090105295181,,,,,, +25,144649,,,,,,,,,,,,0.058888234198093414,,,,,, +25,144699,,,,,,,,,,,,0.05694033205509186,,,,,, +25,144749,,,,,,,,,,,,0.052619583904743195,,,,,, +25,144799,,,,,,,,,,,,0.06334106624126434,,,,,, +25,144849,,,,,,,,,,,,0.06947727501392365,,,,,, +25,144899,,,,,,,,,,,,0.07202806323766708,,,,,, +25,144949,,,,,,,,,,,,0.04681157320737839,,,,,, +25,144999,,,,,,,,,,,,0.05882164463400841,,,,,, +25,145049,,,,,,,,,,,,0.05161067843437195,,,,,, +25,145099,,,,,,,,,,,,0.0592929869890213,,,,,, +25,145149,,,,,,,,,,,,0.07261857390403748,,,,,, +25,145199,,,,,,,,,,,,0.07585232704877853,,,,,, +25,145249,,,,,,,,,,,,0.06129828840494156,,,,,, +25,145299,,,,,,,,,,,,0.05583643913269043,,,,,, +25,145349,,,,,,,,,,,,0.06511438637971878,,,,,, +25,145399,,,,,,,,,,,,0.050571657717227936,,,,,, +25,145449,,,,,,,,,,,,0.05846533924341202,,,,,, +25,145499,,,,,,,,,,,,0.057873740792274475,,,,,, +25,145549,,,,,,,,,,,,0.060422416776418686,,,,,, +25,145599,,,,,,,,,,,,0.05912679433822632,,,,,, +25,145649,,,,,,,,,,,,0.05971194803714752,,,,,, +25,145699,,,,,,,,,,,,0.06961854547262192,,,,,, +25,145749,,,,,,,,,,,,0.060315072536468506,,,,,, +25,145799,,,,,,,,,,,,0.06013305485248566,,,,,, +25,145849,,,,,,,,,,,,0.0593196377158165,,,,,, +25,145899,,,,,,,,,,,,0.05830591544508934,,,,,, +25,145949,,,,,,,,,,,,0.05269975960254669,,,,,, +25,145999,,,,,,,,,,,,0.06609112024307251,,,,,, +25,146049,,,,,,,,,,,,0.06598470360040665,,,,,, +25,146099,,,,,,,,,,,,0.058152638375759125,,,,,, +25,146149,,,,,,,,,,,,0.06222459673881531,,,,,, +25,146199,,,,,,,,,,,,0.06412055343389511,,,,,, +25,146249,,,,,,,,,,,,0.065204918384552,,,,,, +25,146299,,,,,,,,,,,,0.06557945907115936,,,,,, +25,146349,,,,,,,,,,,,0.05517927184700966,,,,,, +25,146399,,,,,,,,,,,,0.055937230587005615,,,,,, +25,146449,,,,,,,,,,,,0.07373926043510437,,,,,, +25,146499,,,,,,,,,,,,0.061207130551338196,,,,,, +25,146549,,,,,,,,,,,,0.058907635509967804,,,,,, +25,146599,,,,,,,,,,,,0.05960550159215927,,,,,, +25,146649,,,,,,,,,,,,0.060606688261032104,,,,,, +25,146699,,,,,,,,,,,,0.061652638018131256,,,,,, +25,146749,,,,,,,,,,,,0.050515420734882355,,,,,, +25,146799,,,,,,,,,,,,0.06386061012744904,,,,,, +25,146849,,,,,,,,,,,,0.06399784982204437,,,,,, +25,146899,,,,,,,,,,,,0.057191770523786545,,,,,, +25,146949,,,,,,,,,,,,0.0580020397901535,,,,,, +25,146999,,,,,,,,,,,,0.06568045914173126,,,,,, +25,147049,,,,,,,,,,,,0.05662862956523895,,,,,, +25,147099,,,,,,,,,,,,0.06043235957622528,,,,,, +25,147149,,,,,,,,,,,,0.06250317394733429,,,,,, +25,147199,,,,,,,,,,,,0.06033182889223099,,,,,, +25,147249,,,,,,,,,,,,0.05339638888835907,,,,,, +25,147299,,,,,,,,,,,,0.06668005138635635,,,,,, +25,147349,,,,,,,,,,,,0.06989842653274536,,,,,, +25,147399,,,,,,,,,,,,0.06281799077987671,,,,,, +25,147449,,,,,,,,,,,,0.06489449739456177,,,,,, +25,147499,,,,,,,,,,,,0.059984371066093445,,,,,, +25,147549,,,,,,,,,,,,0.07268103212118149,,,,,, +25,147599,,,,,,,,,,,,0.05416635051369667,,,,,, +25,147649,,,,,,,,,,,,0.06708511710166931,,,,,, +25,147699,,,,,,,,,,,,0.04692002013325691,,,,,, +25,147749,,,,,,,,,,,,0.06170661002397537,,,,,, +25,147799,,,,,,,,,,,,0.06367675960063934,,,,,, +25,147849,,,,,,,,,,,,0.05541647598147392,,,,,, +25,147899,,,,,,,,,,,,0.05654148757457733,,,,,, +25,147949,,,,,,,,,,,,0.0663081705570221,,,,,, +25,147999,,,,,,,,,,,,0.06210584193468094,,,,,, +25,148049,,,,,,,,,,,,0.053046878427267075,,,,,, +25,148099,,,,,,,,,,,,0.06679065525531769,,,,,, +25,148149,,,,,,,,,,,,0.06454044580459595,,,,,, +25,148199,,,,,,,,,,,,0.05641227215528488,,,,,, +25,148249,,,,,,,,,,,,0.06915806233882904,,,,,, +25,148299,,,,,,,,,,,,0.05698898434638977,,,,,, +25,148349,,,,,,,,,,,,0.0650947317481041,,,,,, +25,148399,,,,,,,,,,,,0.055991675704717636,,,,,, +25,148449,,,,,,,,,,,,0.06579248607158661,,,,,, +25,148499,,,,,,,,,,,,0.044864773750305176,,,,,, +25,148549,,,,,,,,,,,,0.05894527584314346,,,,,, +25,148599,,,,,,,,,,,,0.0710495337843895,,,,,, +25,148649,,,,,,,,,,,,0.06442824751138687,,,,,, +25,148699,,,,,,,,,,,,0.06951886415481567,,,,,, +25,148749,,,,,,,,,,,,0.05554389953613281,,,,,, +25,148799,,,,,,,,,,,,0.0665598139166832,,,,,, +25,148849,,,,,,,,,,,,0.06424009799957275,,,,,, +25,148899,,,,,,,,,,,,0.05758848786354065,,,,,, +25,148949,,,,,,,,,,,,0.06747108697891235,,,,,, +25,148999,,,,,,,,,,,,0.05805487185716629,,,,,, +25,149049,,,,,,,,,,,,0.07290317863225937,,,,,, +25,149099,,,,,,,,,,,,0.060791365802288055,,,,,, +25,149135,,,,,,,,,,,,,0.24351774156093597,0.08319175243377686,0.1948075145483017,-0.009352803230285645,0.1955224871635437,0.08319175243377686 +25,149135,,,,,,,0.20475846529006958,0.060819946229457855,0.5149016380310059,0.2651129364967346,0.4939782917499542,,,,,,, +26,149149,,,,,,,,,,,,0.058134526014328,,,,,, +26,149199,,,,,,,,,,,,0.06568899750709534,,,,,, +26,149249,,,,,,,,,,,,0.060583602637052536,,,,,, +26,149299,,,,,,,,,,,,0.07897478342056274,,,,,, +26,149349,,,,,,,,,,,,0.07161574065685272,,,,,, +26,149399,,,,,,,,,,,,0.06032547354698181,,,,,, +26,149449,,,,,,,,,,,,0.06676308065652847,,,,,, +26,149499,,,,,,,,,,,,0.059345684945583344,,,,,, +26,149549,,,,,,,,,,,,0.062271472066640854,,,,,, +26,149599,,,,,,,,,,,,0.05955164134502411,,,,,, +26,149649,,,,,,,,,,,,0.07249762117862701,,,,,, +26,149699,,,,,,,,,,,,0.05914062634110451,,,,,, +26,149749,,,,,,,,,,,,0.0736691802740097,,,,,, +26,149799,,,,,,,,,,,,0.04912470653653145,,,,,, +26,149849,,,,,,,,,,,,0.06528010964393616,,,,,, +26,149899,,,,,,,,,,,,0.06562814861536026,,,,,, +26,149949,,,,,,,,,,,,0.05589187145233154,,,,,, +26,149999,,,,,,,,,,,,0.06002486124634743,,,,,, +26,150049,,,,,,,,,,,,0.06841213256120682,,,,,, +26,150099,,,,,,,,,,,,0.052101656794548035,,,,,, +26,150149,,,,,,,,,,,,0.05613335594534874,,,,,, +26,150199,,,,,,,,,,,,0.06079186126589775,,,,,, +26,150249,,,,,,,,,,,,0.059869784861803055,,,,,, +26,150299,,,,,,,,,,,,0.06273770332336426,,,,,, +26,150349,,,,,,,,,,,,0.06223016232252121,,,,,, +26,150399,,,,,,,,,,,,0.061384737491607666,,,,,, +26,150449,,,,,,,,,,,,0.06370538473129272,,,,,, +26,150499,,,,,,,,,,,,0.054322414100170135,,,,,, +26,150549,,,,,,,,,,,,0.06345352530479431,,,,,, +26,150599,,,,,,,,,,,,0.05544762685894966,,,,,, +26,150649,,,,,,,,,,,,0.06625093519687653,,,,,, +26,150699,,,,,,,,,,,,0.060951925814151764,,,,,, +26,150749,,,,,,,,,,,,0.06054769456386566,,,,,, +26,150799,,,,,,,,,,,,0.06365452706813812,,,,,, +26,150849,,,,,,,,,,,,0.05406554788351059,,,,,, +26,150899,,,,,,,,,,,,0.049608323723077774,,,,,, +26,150949,,,,,,,,,,,,0.06552180647850037,,,,,, +26,150999,,,,,,,,,,,,0.06272877007722855,,,,,, +26,151049,,,,,,,,,,,,0.06718221306800842,,,,,, +26,151099,,,,,,,,,,,,0.06213267147541046,,,,,, +26,151149,,,,,,,,,,,,0.05780007690191269,,,,,, +26,151199,,,,,,,,,,,,0.05841159075498581,,,,,, +26,151249,,,,,,,,,,,,0.0679914802312851,,,,,, +26,151299,,,,,,,,,,,,0.06429275870323181,,,,,, +26,151349,,,,,,,,,,,,0.06611079722642899,,,,,, +26,151399,,,,,,,,,,,,0.06235836446285248,,,,,, +26,151449,,,,,,,,,,,,0.06677183508872986,,,,,, +26,151499,,,,,,,,,,,,0.05756518617272377,,,,,, +26,151549,,,,,,,,,,,,0.05151979252696037,,,,,, +26,151599,,,,,,,,,,,,0.056817516684532166,,,,,, +26,151649,,,,,,,,,,,,0.0610167533159256,,,,,, +26,151699,,,,,,,,,,,,0.07514806091785431,,,,,, +26,151749,,,,,,,,,,,,0.05311087891459465,,,,,, +26,151799,,,,,,,,,,,,0.07060853391885757,,,,,, +26,151849,,,,,,,,,,,,0.04814191162586212,,,,,, +26,151899,,,,,,,,,,,,0.059788718819618225,,,,,, +26,151949,,,,,,,,,,,,0.05591251701116562,,,,,, +26,151999,,,,,,,,,,,,0.0672125592827797,,,,,, +26,152049,,,,,,,,,,,,0.06463156640529633,,,,,, +26,152099,,,,,,,,,,,,0.04683506488800049,,,,,, +26,152149,,,,,,,,,,,,0.0622689463198185,,,,,, +26,152199,,,,,,,,,,,,0.052626632153987885,,,,,, +26,152249,,,,,,,,,,,,0.06573180854320526,,,,,, +26,152299,,,,,,,,,,,,0.060533538460731506,,,,,, +26,152349,,,,,,,,,,,,0.052917491644620895,,,,,, +26,152399,,,,,,,,,,,,0.05328851565718651,,,,,, +26,152449,,,,,,,,,,,,0.07457351684570312,,,,,, +26,152499,,,,,,,,,,,,0.06089562922716141,,,,,, +26,152549,,,,,,,,,,,,0.053715698421001434,,,,,, +26,152599,,,,,,,,,,,,0.05512203276157379,,,,,, +26,152649,,,,,,,,,,,,0.06520445644855499,,,,,, +26,152699,,,,,,,,,,,,0.07601898908615112,,,,,, +26,152749,,,,,,,,,,,,0.052767328917980194,,,,,, +26,152799,,,,,,,,,,,,0.07455357909202576,,,,,, +26,152849,,,,,,,,,,,,0.06834135949611664,,,,,, +26,152899,,,,,,,,,,,,0.0554770790040493,,,,,, +26,152949,,,,,,,,,,,,0.06474417448043823,,,,,, +26,152999,,,,,,,,,,,,0.058487419039011,,,,,, +26,153049,,,,,,,,,,,,0.05662913993000984,,,,,, +26,153099,,,,,,,,,,,,0.05345545709133148,,,,,, +26,153149,,,,,,,,,,,,0.06532330811023712,,,,,, +26,153199,,,,,,,,,,,,0.06816674768924713,,,,,, +26,153249,,,,,,,,,,,,0.07169008255004883,,,,,, +26,153299,,,,,,,,,,,,0.058080047369003296,,,,,, +26,153349,,,,,,,,,,,,0.06886298954486847,,,,,, +26,153399,,,,,,,,,,,,0.05536403879523277,,,,,, +26,153449,,,,,,,,,,,,0.06514806300401688,,,,,, +26,153499,,,,,,,,,,,,0.07436468452215195,,,,,, +26,153549,,,,,,,,,,,,0.06066935509443283,,,,,, +26,153599,,,,,,,,,,,,0.07315172255039215,,,,,, +26,153649,,,,,,,,,,,,0.0693989098072052,,,,,, +26,153699,,,,,,,,,,,,0.05987345427274704,,,,,, +26,153749,,,,,,,,,,,,0.07234108448028564,,,,,, +26,153799,,,,,,,,,,,,0.07623304426670074,,,,,, +26,153849,,,,,,,,,,,,0.07288279384374619,,,,,, +26,153899,,,,,,,,,,,,0.051807381212711334,,,,,, +26,153949,,,,,,,,,,,,0.05709252506494522,,,,,, +26,153999,,,,,,,,,,,,0.0560256764292717,,,,,, +26,154049,,,,,,,,,,,,0.06675615161657333,,,,,, +26,154099,,,,,,,,,,,,0.06722055375576019,,,,,, +26,154149,,,,,,,,,,,,0.05153081566095352,,,,,, +26,154199,,,,,,,,,,,,0.05689079314470291,,,,,, +26,154249,,,,,,,,,,,,0.06216331571340561,,,,,, +26,154299,,,,,,,,,,,,0.0635334700345993,,,,,, +26,154349,,,,,,,,,,,,0.0616535060107708,,,,,, +26,154399,,,,,,,,,,,,0.051520008593797684,,,,,, +26,154449,,,,,,,,,,,,0.060570161789655685,,,,,, +26,154499,,,,,,,,,,,,0.06052636355161667,,,,,, +26,154549,,,,,,,,,,,,0.07030931115150452,,,,,, +26,154599,,,,,,,,,,,,0.06575003266334534,,,,,, +26,154649,,,,,,,,,,,,0.06767521798610687,,,,,, +26,154699,,,,,,,,,,,,0.06168685480952263,,,,,, +26,154749,,,,,,,,,,,,0.059028394520282745,,,,,, +26,154799,,,,,,,,,,,,0.06875093281269073,,,,,, +26,154849,,,,,,,,,,,,0.062434181571006775,,,,,, +26,154871,,,,,,,,,,,,,0.24370425939559937,0.08413264155387878,0.20146672427654266,-0.02076852321624756,0.20264577865600586,0.08413264155387878 +26,154871,,,,,,,0.20454351603984833,0.060714446008205414,0.5161389708518982,0.2663901448249817,0.49496886134147644,,,,,,, +27,154899,,,,,,,,,,,,0.05200222134590149,,,,,, +27,154949,,,,,,,,,,,,0.0531906932592392,,,,,, +27,154999,,,,,,,,,,,,0.0665130466222763,,,,,, +27,155049,,,,,,,,,,,,0.06393266469240189,,,,,, +27,155099,,,,,,,,,,,,0.057975590229034424,,,,,, +27,155149,,,,,,,,,,,,0.06858836114406586,,,,,, +27,155199,,,,,,,,,,,,0.0574607253074646,,,,,, +27,155249,,,,,,,,,,,,0.06206510588526726,,,,,, +27,155299,,,,,,,,,,,,0.05482096970081329,,,,,, +27,155349,,,,,,,,,,,,0.06488840281963348,,,,,, +27,155399,,,,,,,,,,,,0.05374996364116669,,,,,, +27,155449,,,,,,,,,,,,0.057612545788288116,,,,,, +27,155499,,,,,,,,,,,,0.060219988226890564,,,,,, +27,155549,,,,,,,,,,,,0.060543179512023926,,,,,, +27,155599,,,,,,,,,,,,0.059743426740169525,,,,,, +27,155649,,,,,,,,,,,,0.057840317487716675,,,,,, +27,155699,,,,,,,,,,,,0.07084037363529205,,,,,, +27,155749,,,,,,,,,,,,0.05801314115524292,,,,,, +27,155799,,,,,,,,,,,,0.05816502869129181,,,,,, +27,155849,,,,,,,,,,,,0.06502493470907211,,,,,, +27,155899,,,,,,,,,,,,0.06213398650288582,,,,,, +27,155949,,,,,,,,,,,,0.060391999781131744,,,,,, +27,155999,,,,,,,,,,,,0.0714549571275711,,,,,, +27,156049,,,,,,,,,,,,0.06281427294015884,,,,,, +27,156099,,,,,,,,,,,,0.05586414784193039,,,,,, +27,156149,,,,,,,,,,,,0.055862829089164734,,,,,, +27,156199,,,,,,,,,,,,0.06516413390636444,,,,,, +27,156249,,,,,,,,,,,,0.0680931955575943,,,,,, +27,156299,,,,,,,,,,,,0.06273247301578522,,,,,, +27,156349,,,,,,,,,,,,0.06041097268462181,,,,,, +27,156399,,,,,,,,,,,,0.06075460463762283,,,,,, +27,156449,,,,,,,,,,,,0.06084681674838066,,,,,, +27,156499,,,,,,,,,,,,0.05464684218168259,,,,,, +27,156549,,,,,,,,,,,,0.05725161358714104,,,,,, +27,156599,,,,,,,,,,,,0.06703880429267883,,,,,, +27,156649,,,,,,,,,,,,0.0624551922082901,,,,,, +27,156699,,,,,,,,,,,,0.05586943030357361,,,,,, +27,156749,,,,,,,,,,,,0.06701980531215668,,,,,, +27,156799,,,,,,,,,,,,0.059871114790439606,,,,,, +27,156849,,,,,,,,,,,,0.06695625931024551,,,,,, +27,156899,,,,,,,,,,,,0.05341610684990883,,,,,, +27,156949,,,,,,,,,,,,0.06889073550701141,,,,,, +27,156999,,,,,,,,,,,,0.05984682962298393,,,,,, +27,157049,,,,,,,,,,,,0.05933493748307228,,,,,, +27,157099,,,,,,,,,,,,0.07056476175785065,,,,,, +27,157149,,,,,,,,,,,,0.06654663383960724,,,,,, +27,157199,,,,,,,,,,,,0.05533788353204727,,,,,, +27,157249,,,,,,,,,,,,0.06516405940055847,,,,,, +27,157299,,,,,,,,,,,,0.062369268387556076,,,,,, +27,157349,,,,,,,,,,,,0.05347682908177376,,,,,, +27,157399,,,,,,,,,,,,0.06556015461683273,,,,,, +27,157449,,,,,,,,,,,,0.0502389594912529,,,,,, +27,157499,,,,,,,,,,,,0.05544929951429367,,,,,, +27,157549,,,,,,,,,,,,0.05602787435054779,,,,,, +27,157599,,,,,,,,,,,,0.051438212394714355,,,,,, +27,157649,,,,,,,,,,,,0.053898315876722336,,,,,, +27,157699,,,,,,,,,,,,0.06825023144483566,,,,,, +27,157749,,,,,,,,,,,,0.05149853229522705,,,,,, +27,157799,,,,,,,,,,,,0.0628245621919632,,,,,, +27,157849,,,,,,,,,,,,0.06037299335002899,,,,,, +27,157899,,,,,,,,,,,,0.06081889942288399,,,,,, +27,157949,,,,,,,,,,,,0.057235170155763626,,,,,, +27,157999,,,,,,,,,,,,0.06648793816566467,,,,,, +27,158049,,,,,,,,,,,,0.05791977047920227,,,,,, +27,158099,,,,,,,,,,,,0.05739206820726395,,,,,, +27,158149,,,,,,,,,,,,0.06962467730045319,,,,,, +27,158199,,,,,,,,,,,,0.060306016355752945,,,,,, +27,158249,,,,,,,,,,,,0.05940581485629082,,,,,, +27,158299,,,,,,,,,,,,0.052644889801740646,,,,,, +27,158349,,,,,,,,,,,,0.060305096209049225,,,,,, +27,158399,,,,,,,,,,,,0.0635489672422409,,,,,, +27,158449,,,,,,,,,,,,0.06901652365922928,,,,,, +27,158499,,,,,,,,,,,,0.05965664982795715,,,,,, +27,158549,,,,,,,,,,,,0.05855255573987961,,,,,, +27,158599,,,,,,,,,,,,0.05895642191171646,,,,,, +27,158649,,,,,,,,,,,,0.05467521771788597,,,,,, +27,158699,,,,,,,,,,,,0.06563208997249603,,,,,, +27,158749,,,,,,,,,,,,0.06138073280453682,,,,,, +27,158799,,,,,,,,,,,,0.0635109394788742,,,,,, +27,158849,,,,,,,,,,,,0.05332166701555252,,,,,, +27,158899,,,,,,,,,,,,0.06489306688308716,,,,,, +27,158949,,,,,,,,,,,,0.055635564029216766,,,,,, +27,158999,,,,,,,,,,,,0.0484720841050148,,,,,, +27,159049,,,,,,,,,,,,0.0586140975356102,,,,,, +27,159099,,,,,,,,,,,,0.05565430223941803,,,,,, +27,159149,,,,,,,,,,,,0.05156579613685608,,,,,, +27,159199,,,,,,,,,,,,0.06857990473508835,,,,,, +27,159249,,,,,,,,,,,,0.06047968566417694,,,,,, +27,159299,,,,,,,,,,,,0.06428729742765427,,,,,, +27,159349,,,,,,,,,,,,0.06506174802780151,,,,,, +27,159399,,,,,,,,,,,,0.06800894439220428,,,,,, +27,159449,,,,,,,,,,,,0.058610204607248306,,,,,, +27,159499,,,,,,,,,,,,0.061576128005981445,,,,,, +27,159549,,,,,,,,,,,,0.06226266548037529,,,,,, +27,159599,,,,,,,,,,,,0.05349794030189514,,,,,, +27,159649,,,,,,,,,,,,0.05715073272585869,,,,,, +27,159699,,,,,,,,,,,,0.057882148772478104,,,,,, +27,159749,,,,,,,,,,,,0.053662482649087906,,,,,, +27,159799,,,,,,,,,,,,0.06094251573085785,,,,,, +27,159849,,,,,,,,,,,,0.05782707780599594,,,,,, +27,159899,,,,,,,,,,,,0.04789063334465027,,,,,, +27,159949,,,,,,,,,,,,0.07164376974105835,,,,,, +27,159999,,,,,,,,,,,,0.06667362153530121,,,,,, +27,160049,,,,,,,,,,,,0.06163107603788376,,,,,, +27,160099,,,,,,,,,,,,0.06514381617307663,,,,,, +27,160149,,,,,,,,,,,,0.05642212927341461,,,,,, +27,160199,,,,,,,,,,,,0.052699457854032516,,,,,, +27,160249,,,,,,,,,,,,0.0640995055437088,,,,,, +27,160299,,,,,,,,,,,,0.060983411967754364,,,,,, +27,160349,,,,,,,,,,,,0.04919162020087242,,,,,, +27,160399,,,,,,,,,,,,0.06511232256889343,,,,,, +27,160449,,,,,,,,,,,,0.06696826964616776,,,,,, +27,160499,,,,,,,,,,,,0.06494221091270447,,,,,, +27,160549,,,,,,,,,,,,0.058126211166381836,,,,,, +27,160599,,,,,,,,,,,,0.0671301782131195,,,,,, +27,160607,,,,,,,,,,,,,0.24367788434028625,0.08369811624288559,0.19832153618335724,-0.015496373176574707,0.19877712428569794,0.08369811624288559 +27,160607,,,,,,,0.20330451428890228,0.060156941413879395,0.5226222276687622,0.2731350064277649,0.501494824886322,,,,,,, +28,160649,,,,,,,,,,,,0.05606438219547272,,,,,, +28,160699,,,,,,,,,,,,0.0533754788339138,,,,,, +28,160749,,,,,,,,,,,,0.05958535894751549,,,,,, +28,160799,,,,,,,,,,,,0.062036070972681046,,,,,, +28,160849,,,,,,,,,,,,0.06996186077594757,,,,,, +28,160899,,,,,,,,,,,,0.06401260197162628,,,,,, +28,160949,,,,,,,,,,,,0.05072333291172981,,,,,, +28,160999,,,,,,,,,,,,0.053601376712322235,,,,,, +28,161049,,,,,,,,,,,,0.07310130447149277,,,,,, +28,161099,,,,,,,,,,,,0.06073814630508423,,,,,, +28,161149,,,,,,,,,,,,0.059860970824956894,,,,,, +28,161199,,,,,,,,,,,,0.06385455280542374,,,,,, +28,161249,,,,,,,,,,,,0.060921117663383484,,,,,, +28,161299,,,,,,,,,,,,0.06054026633501053,,,,,, +28,161349,,,,,,,,,,,,0.06366172432899475,,,,,, +28,161399,,,,,,,,,,,,0.059003494679927826,,,,,, +28,161449,,,,,,,,,,,,0.054232001304626465,,,,,, +28,161499,,,,,,,,,,,,0.06642405688762665,,,,,, +28,161549,,,,,,,,,,,,0.055686868727207184,,,,,, +28,161599,,,,,,,,,,,,0.06401686370372772,,,,,, +28,161649,,,,,,,,,,,,0.05234141647815704,,,,,, +28,161699,,,,,,,,,,,,0.06016290932893753,,,,,, +28,161749,,,,,,,,,,,,0.06610925495624542,,,,,, +28,161799,,,,,,,,,,,,0.05801781266927719,,,,,, +28,161849,,,,,,,,,,,,0.05977524071931839,,,,,, +28,161899,,,,,,,,,,,,0.054442327469587326,,,,,, +28,161949,,,,,,,,,,,,0.07136967033147812,,,,,, +28,161999,,,,,,,,,,,,0.06414777785539627,,,,,, +28,162049,,,,,,,,,,,,0.05743355676531792,,,,,, +28,162099,,,,,,,,,,,,0.06050959974527359,,,,,, +28,162149,,,,,,,,,,,,0.05014917999505997,,,,,, +28,162199,,,,,,,,,,,,0.055326126515865326,,,,,, +28,162249,,,,,,,,,,,,0.06439077109098434,,,,,, +28,162299,,,,,,,,,,,,0.06192141771316528,,,,,, +28,162349,,,,,,,,,,,,0.05297958850860596,,,,,, +28,162399,,,,,,,,,,,,0.06321458518505096,,,,,, +28,162449,,,,,,,,,,,,0.05606432259082794,,,,,, +28,162499,,,,,,,,,,,,0.054996319115161896,,,,,, +28,162549,,,,,,,,,,,,0.054028477519750595,,,,,, +28,162599,,,,,,,,,,,,0.0673682764172554,,,,,, +28,162649,,,,,,,,,,,,0.06847640126943588,,,,,, +28,162699,,,,,,,,,,,,0.06111405789852142,,,,,, +28,162749,,,,,,,,,,,,0.05403638631105423,,,,,, +28,162799,,,,,,,,,,,,0.05503543093800545,,,,,, +28,162849,,,,,,,,,,,,0.06850919872522354,,,,,, +28,162899,,,,,,,,,,,,0.06925492733716965,,,,,, +28,162949,,,,,,,,,,,,0.054176345467567444,,,,,, +28,162999,,,,,,,,,,,,0.057912714779376984,,,,,, +28,163049,,,,,,,,,,,,0.049663037061691284,,,,,, +28,163099,,,,,,,,,,,,0.06521989405155182,,,,,, +28,163149,,,,,,,,,,,,0.06035777926445007,,,,,, +28,163199,,,,,,,,,,,,0.06986703723669052,,,,,, +28,163249,,,,,,,,,,,,0.06056945398449898,,,,,, +28,163299,,,,,,,,,,,,0.055068641901016235,,,,,, +28,163349,,,,,,,,,,,,0.06613248586654663,,,,,, +28,163399,,,,,,,,,,,,0.05762898176908493,,,,,, +28,163449,,,,,,,,,,,,0.07446201890707016,,,,,, +28,163499,,,,,,,,,,,,0.056145425885915756,,,,,, +28,163549,,,,,,,,,,,,0.05632097274065018,,,,,, +28,163599,,,,,,,,,,,,0.06073006987571716,,,,,, +28,163649,,,,,,,,,,,,0.07064845412969589,,,,,, +28,163699,,,,,,,,,,,,0.06979954242706299,,,,,, +28,163749,,,,,,,,,,,,0.062403108924627304,,,,,, +28,163799,,,,,,,,,,,,0.06991859525442123,,,,,, +28,163849,,,,,,,,,,,,0.07136140018701553,,,,,, +28,163899,,,,,,,,,,,,0.06887342035770416,,,,,, +28,163949,,,,,,,,,,,,0.06770704686641693,,,,,, +28,163999,,,,,,,,,,,,0.059294942766427994,,,,,, +28,164049,,,,,,,,,,,,0.05306519567966461,,,,,, +28,164099,,,,,,,,,,,,0.06171265244483948,,,,,, +28,164149,,,,,,,,,,,,0.06704770028591156,,,,,, +28,164199,,,,,,,,,,,,0.055039286613464355,,,,,, +28,164249,,,,,,,,,,,,0.0540628656744957,,,,,, +28,164299,,,,,,,,,,,,0.057851746678352356,,,,,, +28,164349,,,,,,,,,,,,0.06196310371160507,,,,,, +28,164399,,,,,,,,,,,,0.0670410692691803,,,,,, +28,164449,,,,,,,,,,,,0.05950606241822243,,,,,, +28,164499,,,,,,,,,,,,0.04723881930112839,,,,,, +28,164549,,,,,,,,,,,,0.05334747955203056,,,,,, +28,164599,,,,,,,,,,,,0.05692721903324127,,,,,, +28,164649,,,,,,,,,,,,0.05346694216132164,,,,,, +28,164699,,,,,,,,,,,,0.0538184754550457,,,,,, +28,164749,,,,,,,,,,,,0.0637986958026886,,,,,, +28,164799,,,,,,,,,,,,0.05326400324702263,,,,,, +28,164849,,,,,,,,,,,,0.048457883298397064,,,,,, +28,164899,,,,,,,,,,,,0.05448762699961662,,,,,, +28,164949,,,,,,,,,,,,0.05175748094916344,,,,,, +28,164999,,,,,,,,,,,,0.05506347864866257,,,,,, +28,165049,,,,,,,,,,,,0.062014397233724594,,,,,, +28,165099,,,,,,,,,,,,0.06792907416820526,,,,,, +28,165149,,,,,,,,,,,,0.05796484649181366,,,,,, +28,165199,,,,,,,,,,,,0.06488145142793655,,,,,, +28,165249,,,,,,,,,,,,0.058704674243927,,,,,, +28,165299,,,,,,,,,,,,0.05322013050317764,,,,,, +28,165349,,,,,,,,,,,,0.06037250906229019,,,,,, +28,165399,,,,,,,,,,,,0.057166606187820435,,,,,, +28,165449,,,,,,,,,,,,0.06555315107107162,,,,,, +28,165499,,,,,,,,,,,,0.06929922103881836,,,,,, +28,165549,,,,,,,,,,,,0.076358363032341,,,,,, +28,165599,,,,,,,,,,,,0.06109560281038284,,,,,, +28,165649,,,,,,,,,,,,0.06161794811487198,,,,,, +28,165699,,,,,,,,,,,,0.06561839580535889,,,,,, +28,165749,,,,,,,,,,,,0.053857315331697464,,,,,, +28,165799,,,,,,,,,,,,0.049116723239421844,,,,,, +28,165849,,,,,,,,,,,,0.06969507038593292,,,,,, +28,165899,,,,,,,,,,,,0.06116604059934616,,,,,, +28,165949,,,,,,,,,,,,0.05670420825481415,,,,,, +28,165999,,,,,,,,,,,,0.04424932971596718,,,,,, +28,166049,,,,,,,,,,,,0.05939379334449768,,,,,, +28,166099,,,,,,,,,,,,0.06258107721805573,,,,,, +28,166149,,,,,,,,,,,,0.05623520165681839,,,,,, +28,166199,,,,,,,,,,,,0.05750192329287529,,,,,, +28,166249,,,,,,,,,,,,0.06342043727636337,,,,,, +28,166299,,,,,,,,,,,,0.05985375866293907,,,,,, +28,166343,,,,,,,,,,,,,0.24336710572242737,0.08352529257535934,0.19959697127342224,-0.013399600982666016,0.20084835588932037,0.08352529257535934 +28,166343,,,,,,,0.20305544137954712,0.06002584099769592,0.5241369009017944,0.2747117877006531,0.5030645132064819,,,,,,, +29,166349,,,,,,,,,,,,0.06090216711163521,,,,,, +29,166399,,,,,,,,,,,,0.055973537266254425,,,,,, +29,166449,,,,,,,,,,,,0.06457202881574631,,,,,, +29,166499,,,,,,,,,,,,0.05258897691965103,,,,,, +29,166549,,,,,,,,,,,,0.06792183220386505,,,,,, +29,166599,,,,,,,,,,,,0.06975530087947845,,,,,, +29,166649,,,,,,,,,,,,0.06749572604894638,,,,,, +29,166699,,,,,,,,,,,,0.061541929841041565,,,,,, +29,166749,,,,,,,,,,,,0.05489867180585861,,,,,, +29,166799,,,,,,,,,,,,0.0736197978258133,,,,,, +29,166849,,,,,,,,,,,,0.06243179738521576,,,,,, +29,166899,,,,,,,,,,,,0.062302637845277786,,,,,, +29,166949,,,,,,,,,,,,0.07077394425868988,,,,,, +29,166999,,,,,,,,,,,,0.057549603283405304,,,,,, +29,167049,,,,,,,,,,,,0.06530757993459702,,,,,, +29,167099,,,,,,,,,,,,0.06060506030917168,,,,,, +29,167149,,,,,,,,,,,,0.052178457379341125,,,,,, +29,167199,,,,,,,,,,,,0.06041650474071503,,,,,, +29,167249,,,,,,,,,,,,0.06693127006292343,,,,,, +29,167299,,,,,,,,,,,,0.07081329077482224,,,,,, +29,167349,,,,,,,,,,,,0.06860743463039398,,,,,, +29,167399,,,,,,,,,,,,0.06516899168491364,,,,,, +29,167449,,,,,,,,,,,,0.055016353726387024,,,,,, +29,167499,,,,,,,,,,,,0.059800244867801666,,,,,, +29,167549,,,,,,,,,,,,0.07338383048772812,,,,,, +29,167599,,,,,,,,,,,,0.06663525104522705,,,,,, +29,167649,,,,,,,,,,,,0.053112827241420746,,,,,, +29,167699,,,,,,,,,,,,0.06699548661708832,,,,,, +29,167749,,,,,,,,,,,,0.06195387244224548,,,,,, +29,167799,,,,,,,,,,,,0.0536813922226429,,,,,, +29,167849,,,,,,,,,,,,0.0641607791185379,,,,,, +29,167899,,,,,,,,,,,,0.06550091505050659,,,,,, +29,167949,,,,,,,,,,,,0.0611131526529789,,,,,, +29,167999,,,,,,,,,,,,0.06004498898983002,,,,,, +29,168049,,,,,,,,,,,,0.06171979010105133,,,,,, +29,168099,,,,,,,,,,,,0.06556578725576401,,,,,, +29,168149,,,,,,,,,,,,0.059653714299201965,,,,,, +29,168199,,,,,,,,,,,,0.05435054749250412,,,,,, +29,168249,,,,,,,,,,,,0.04687274247407913,,,,,, +29,168299,,,,,,,,,,,,0.057454660534858704,,,,,, +29,168349,,,,,,,,,,,,0.0742073580622673,,,,,, +29,168399,,,,,,,,,,,,0.06565401703119278,,,,,, +29,168449,,,,,,,,,,,,0.06101616844534874,,,,,, +29,168499,,,,,,,,,,,,0.060792818665504456,,,,,, +29,168549,,,,,,,,,,,,0.05615101754665375,,,,,, +29,168599,,,,,,,,,,,,0.05852591246366501,,,,,, +29,168649,,,,,,,,,,,,0.057412609457969666,,,,,, +29,168699,,,,,,,,,,,,0.06155894324183464,,,,,, +29,168749,,,,,,,,,,,,0.051151592284440994,,,,,, +29,168799,,,,,,,,,,,,0.05454477295279503,,,,,, +29,168849,,,,,,,,,,,,0.060757189989089966,,,,,, +29,168899,,,,,,,,,,,,0.0539756640791893,,,,,, +29,168949,,,,,,,,,,,,0.07012265920639038,,,,,, +29,168999,,,,,,,,,,,,0.062004074454307556,,,,,, +29,169049,,,,,,,,,,,,0.059360407292842865,,,,,, +29,169099,,,,,,,,,,,,0.06844928860664368,,,,,, +29,169149,,,,,,,,,,,,0.06188088282942772,,,,,, +29,169199,,,,,,,,,,,,0.05916779488325119,,,,,, +29,169249,,,,,,,,,,,,0.0651509091258049,,,,,, +29,169299,,,,,,,,,,,,0.04892314225435257,,,,,, +29,169349,,,,,,,,,,,,0.06039632856845856,,,,,, +29,169399,,,,,,,,,,,,0.06409142911434174,,,,,, +29,169449,,,,,,,,,,,,0.05801280215382576,,,,,, +29,169499,,,,,,,,,,,,0.05479868873953819,,,,,, +29,169549,,,,,,,,,,,,0.059200700372457504,,,,,, +29,169599,,,,,,,,,,,,0.061748653650283813,,,,,, +29,169649,,,,,,,,,,,,0.05904868617653847,,,,,, +29,169699,,,,,,,,,,,,0.06934870779514313,,,,,, +29,169749,,,,,,,,,,,,0.0656694769859314,,,,,, +29,169799,,,,,,,,,,,,0.056434936821460724,,,,,, +29,169849,,,,,,,,,,,,0.07179132848978043,,,,,, +29,169899,,,,,,,,,,,,0.060159679502248764,,,,,, +29,169949,,,,,,,,,,,,0.05980624258518219,,,,,, +29,169999,,,,,,,,,,,,0.04832693561911583,,,,,, +29,170049,,,,,,,,,,,,0.06021137535572052,,,,,, +29,170099,,,,,,,,,,,,0.04868797957897186,,,,,, +29,170149,,,,,,,,,,,,0.06319622695446014,,,,,, +29,170199,,,,,,,,,,,,0.0612143911421299,,,,,, +29,170249,,,,,,,,,,,,0.05480286478996277,,,,,, +29,170299,,,,,,,,,,,,0.059869468212127686,,,,,, +29,170349,,,,,,,,,,,,0.061061594635248184,,,,,, +29,170399,,,,,,,,,,,,0.06037822365760803,,,,,, +29,170449,,,,,,,,,,,,0.0642368346452713,,,,,, +29,170499,,,,,,,,,,,,0.05492972582578659,,,,,, +29,170549,,,,,,,,,,,,0.060075681656599045,,,,,, +29,170599,,,,,,,,,,,,0.061271198093891144,,,,,, +29,170649,,,,,,,,,,,,0.06161458045244217,,,,,, +29,170699,,,,,,,,,,,,0.05714172497391701,,,,,, +29,170749,,,,,,,,,,,,0.06570076942443848,,,,,, +29,170799,,,,,,,,,,,,0.05779111012816429,,,,,, +29,170849,,,,,,,,,,,,0.06402777135372162,,,,,, +29,170899,,,,,,,,,,,,0.05854663997888565,,,,,, +29,170949,,,,,,,,,,,,0.06069999188184738,,,,,, +29,170999,,,,,,,,,,,,0.0669432282447815,,,,,, +29,171049,,,,,,,,,,,,0.05340113490819931,,,,,, +29,171099,,,,,,,,,,,,0.06715014576911926,,,,,, +29,171149,,,,,,,,,,,,0.05410028249025345,,,,,, +29,171199,,,,,,,,,,,,0.05448854714632034,,,,,, +29,171249,,,,,,,,,,,,0.04663310945034027,,,,,, +29,171299,,,,,,,,,,,,0.05899353325366974,,,,,, +29,171349,,,,,,,,,,,,0.0696713998913765,,,,,, +29,171399,,,,,,,,,,,,0.05375930666923523,,,,,, +29,171449,,,,,,,,,,,,0.05879969149827957,,,,,, +29,171499,,,,,,,,,,,,0.06468193233013153,,,,,, +29,171549,,,,,,,,,,,,0.05727142468094826,,,,,, +29,171599,,,,,,,,,,,,0.06533965468406677,,,,,, +29,171649,,,,,,,,,,,,0.06296324729919434,,,,,, +29,171699,,,,,,,,,,,,0.05747617408633232,,,,,, +29,171749,,,,,,,,,,,,0.059898242354393005,,,,,, +29,171799,,,,,,,,,,,,0.057394467294216156,,,,,, +29,171849,,,,,,,,,,,,0.05107665807008743,,,,,, +29,171899,,,,,,,,,,,,0.05923301726579666,,,,,, +29,171949,,,,,,,,,,,,0.05542431399226189,,,,,, +29,171999,,,,,,,,,,,,0.05235324800014496,,,,,, +29,172049,,,,,,,,,,,,0.060451850295066833,,,,,, +29,172079,,,,,,,,,,,,,0.2431582808494568,0.08295340836048126,0.19411227107048035,-0.006461024284362793,0.19429686665534973,0.08295340836048126 +29,172079,,,,,,,0.202753946185112,0.059945572167634964,0.5250608921051025,0.275693416595459,0.5042179822921753,,,,,,, +30,172099,,,,,,,,,,,,0.04342316463589668,,,,,, +30,172149,,,,,,,,,,,,0.05552827939391136,,,,,, +30,172199,,,,,,,,,,,,0.06916686147451401,,,,,, +30,172249,,,,,,,,,,,,0.051790520548820496,,,,,, +30,172299,,,,,,,,,,,,0.05916619300842285,,,,,, +30,172349,,,,,,,,,,,,0.06424795091152191,,,,,, +30,172399,,,,,,,,,,,,0.0518985278904438,,,,,, +30,172449,,,,,,,,,,,,0.06941020488739014,,,,,, +30,172499,,,,,,,,,,,,0.06827890872955322,,,,,, +30,172549,,,,,,,,,,,,0.05906278267502785,,,,,, +30,172599,,,,,,,,,,,,0.05824173614382744,,,,,, +30,172649,,,,,,,,,,,,0.06082568317651749,,,,,, +30,172699,,,,,,,,,,,,0.05431193485856056,,,,,, +30,172749,,,,,,,,,,,,0.06506550312042236,,,,,, +30,172799,,,,,,,,,,,,0.05596216768026352,,,,,, +30,172849,,,,,,,,,,,,0.05466541647911072,,,,,, +30,172899,,,,,,,,,,,,0.05939802527427673,,,,,, +30,172949,,,,,,,,,,,,0.062352124601602554,,,,,, +30,172999,,,,,,,,,,,,0.054761968553066254,,,,,, +30,173049,,,,,,,,,,,,0.060155365616083145,,,,,, +30,173099,,,,,,,,,,,,0.04987972602248192,,,,,, +30,173149,,,,,,,,,,,,0.07063667476177216,,,,,, +30,173199,,,,,,,,,,,,0.05927180498838425,,,,,, +30,173249,,,,,,,,,,,,0.061264898627996445,,,,,, +30,173299,,,,,,,,,,,,0.06747259199619293,,,,,, +30,173349,,,,,,,,,,,,0.055633772164583206,,,,,, +30,173399,,,,,,,,,,,,0.056994516402482986,,,,,, +30,173449,,,,,,,,,,,,0.05675496533513069,,,,,, +30,173499,,,,,,,,,,,,0.049546729773283005,,,,,, +30,173549,,,,,,,,,,,,0.04893478751182556,,,,,, +30,173599,,,,,,,,,,,,0.05064629018306732,,,,,, +30,173649,,,,,,,,,,,,0.05669710785150528,,,,,, +30,173699,,,,,,,,,,,,0.055137813091278076,,,,,, +30,173749,,,,,,,,,,,,0.06603849679231644,,,,,, +30,173799,,,,,,,,,,,,0.06485801935195923,,,,,, +30,173849,,,,,,,,,,,,0.07714327424764633,,,,,, +30,173899,,,,,,,,,,,,0.06041862443089485,,,,,, +30,173949,,,,,,,,,,,,0.05507495254278183,,,,,, +30,173999,,,,,,,,,,,,0.05903680995106697,,,,,, +30,174049,,,,,,,,,,,,0.06080056354403496,,,,,, +30,174099,,,,,,,,,,,,0.06711657345294952,,,,,, +30,174149,,,,,,,,,,,,0.06658466160297394,,,,,, +30,174199,,,,,,,,,,,,0.052723228931427,,,,,, +30,174249,,,,,,,,,,,,0.051928482949733734,,,,,, +30,174299,,,,,,,,,,,,0.05824338272213936,,,,,, +30,174349,,,,,,,,,,,,0.05450500175356865,,,,,, +30,174399,,,,,,,,,,,,0.07274895161390305,,,,,, +30,174449,,,,,,,,,,,,0.06587003916501999,,,,,, +30,174499,,,,,,,,,,,,0.0591062530875206,,,,,, +30,174549,,,,,,,,,,,,0.060442306101322174,,,,,, +30,174599,,,,,,,,,,,,0.06863078474998474,,,,,, +30,174649,,,,,,,,,,,,0.05855917930603027,,,,,, +30,174699,,,,,,,,,,,,0.06790848076343536,,,,,, +30,174749,,,,,,,,,,,,0.05533645674586296,,,,,, +30,174799,,,,,,,,,,,,0.06230548769235611,,,,,, +30,174849,,,,,,,,,,,,0.05946660041809082,,,,,, +30,174899,,,,,,,,,,,,0.067376047372818,,,,,, +30,174949,,,,,,,,,,,,0.06756701320409775,,,,,, +30,174999,,,,,,,,,,,,0.06127755343914032,,,,,, +30,175049,,,,,,,,,,,,0.06272141635417938,,,,,, +30,175099,,,,,,,,,,,,0.05433165654540062,,,,,, +30,175149,,,,,,,,,,,,0.058909233659505844,,,,,, +30,175199,,,,,,,,,,,,0.04726438969373703,,,,,, +30,175249,,,,,,,,,,,,0.054178446531295776,,,,,, +30,175299,,,,,,,,,,,,0.06571748107671738,,,,,, +30,175349,,,,,,,,,,,,0.05503793805837631,,,,,, +30,175399,,,,,,,,,,,,0.06014098972082138,,,,,, +30,175449,,,,,,,,,,,,0.04986920952796936,,,,,, +30,175499,,,,,,,,,,,,0.06929980963468552,,,,,, +30,175549,,,,,,,,,,,,0.05757508799433708,,,,,, +30,175599,,,,,,,,,,,,0.06500916182994843,,,,,, +30,175649,,,,,,,,,,,,0.06033521145582199,,,,,, +30,175699,,,,,,,,,,,,0.062319085001945496,,,,,, +30,175749,,,,,,,,,,,,0.06293411552906036,,,,,, +30,175799,,,,,,,,,,,,0.05683250352740288,,,,,, +30,175849,,,,,,,,,,,,0.06306519359350204,,,,,, +30,175899,,,,,,,,,,,,0.06238330900669098,,,,,, +30,175949,,,,,,,,,,,,0.07529990375041962,,,,,, +30,175999,,,,,,,,,,,,0.057877782732248306,,,,,, +30,176049,,,,,,,,,,,,0.06312567740678787,,,,,, +30,176099,,,,,,,,,,,,0.05993391200900078,,,,,, +30,176149,,,,,,,,,,,,0.06278336048126221,,,,,, +30,176199,,,,,,,,,,,,0.06635361909866333,,,,,, +30,176249,,,,,,,,,,,,0.06257165968418121,,,,,, +30,176299,,,,,,,,,,,,0.06468133628368378,,,,,, +30,176349,,,,,,,,,,,,0.061488375067710876,,,,,, +30,176399,,,,,,,,,,,,0.0579347088932991,,,,,, +30,176449,,,,,,,,,,,,0.06947621703147888,,,,,, +30,176499,,,,,,,,,,,,0.058385178446769714,,,,,, +30,176549,,,,,,,,,,,,0.06388214975595474,,,,,, +30,176599,,,,,,,,,,,,0.05398140847682953,,,,,, +30,176649,,,,,,,,,,,,0.0496852733194828,,,,,, +30,176699,,,,,,,,,,,,0.07900156080722809,,,,,, +30,176749,,,,,,,,,,,,0.06987006962299347,,,,,, +30,176799,,,,,,,,,,,,0.07240539789199829,,,,,, +30,176849,,,,,,,,,,,,0.06681910157203674,,,,,, +30,176899,,,,,,,,,,,,0.06640541553497314,,,,,, +30,176949,,,,,,,,,,,,0.06678952276706696,,,,,, +30,176999,,,,,,,,,,,,0.06603671610355377,,,,,, +30,177049,,,,,,,,,,,,0.043302182108163834,,,,,, +30,177099,,,,,,,,,,,,0.0538468062877655,,,,,, +30,177149,,,,,,,,,,,,0.06688927114009857,,,,,, +30,177199,,,,,,,,,,,,0.055176880210638046,,,,,, +30,177249,,,,,,,,,,,,0.054674237966537476,,,,,, +30,177299,,,,,,,,,,,,0.047292545437812805,,,,,, +30,177349,,,,,,,,,,,,0.06106184795498848,,,,,, +30,177399,,,,,,,,,,,,0.06025933101773262,,,,,, +30,177449,,,,,,,,,,,,0.05561567842960358,,,,,, +30,177499,,,,,,,,,,,,0.06805357336997986,,,,,, +30,177549,,,,,,,,,,,,0.062110669910907745,,,,,, +30,177599,,,,,,,,,,,,0.05311230197548866,,,,,, +30,177649,,,,,,,,,,,,0.05269777029752731,,,,,, +30,177699,,,,,,,,,,,,0.06890629231929779,,,,,, +30,177749,,,,,,,,,,,,0.06122112274169922,,,,,, +30,177799,,,,,,,,,,,,0.052379123866558075,,,,,, +30,177815,,,,,,,,,,,,,0.2440575659275055,0.08428271114826202,0.19579631090164185,-0.02258920669555664,0.19527532160282135,0.08428271114826202 +30,177815,,,,,,,0.2025914341211319,0.059808891266584396,0.5266291499137878,0.27733951807022095,0.5056393146514893,,,,,,, +31,177849,,,,,,,,,,,,0.0598415769636631,,,,,, +31,177899,,,,,,,,,,,,0.05849099159240723,,,,,, +31,177949,,,,,,,,,,,,0.06917628645896912,,,,,, +31,177999,,,,,,,,,,,,0.06459783017635345,,,,,, +31,178049,,,,,,,,,,,,0.07371953129768372,,,,,, +31,178099,,,,,,,,,,,,0.05708103999495506,,,,,, +31,178149,,,,,,,,,,,,0.0627504512667656,,,,,, +31,178199,,,,,,,,,,,,0.058411166071891785,,,,,, +31,178249,,,,,,,,,,,,0.06124761328101158,,,,,, +31,178299,,,,,,,,,,,,0.05294977128505707,,,,,, +31,178349,,,,,,,,,,,,0.0585627518594265,,,,,, +31,178399,,,,,,,,,,,,0.05187476426362991,,,,,, +31,178449,,,,,,,,,,,,0.04889026656746864,,,,,, +31,178499,,,,,,,,,,,,0.05426423251628876,,,,,, +31,178549,,,,,,,,,,,,0.05779794603586197,,,,,, +31,178599,,,,,,,,,,,,0.06128755211830139,,,,,, +31,178649,,,,,,,,,,,,0.06317503750324249,,,,,, +31,178699,,,,,,,,,,,,0.05935460701584816,,,,,, +31,178749,,,,,,,,,,,,0.07685025781393051,,,,,, +31,178799,,,,,,,,,,,,0.05360092967748642,,,,,, +31,178849,,,,,,,,,,,,0.06399783492088318,,,,,, +31,178899,,,,,,,,,,,,0.05007866770029068,,,,,, +31,178949,,,,,,,,,,,,0.052077122032642365,,,,,, +31,178999,,,,,,,,,,,,0.06259329617023468,,,,,, +31,179049,,,,,,,,,,,,0.06317064166069031,,,,,, +31,179099,,,,,,,,,,,,0.060216013342142105,,,,,, +31,179149,,,,,,,,,,,,0.05203710496425629,,,,,, +31,179199,,,,,,,,,,,,0.057879962027072906,,,,,, +31,179249,,,,,,,,,,,,0.06322306394577026,,,,,, +31,179299,,,,,,,,,,,,0.056713398545980453,,,,,, +31,179349,,,,,,,,,,,,0.05033225193619728,,,,,, +31,179399,,,,,,,,,,,,0.058789342641830444,,,,,, +31,179449,,,,,,,,,,,,0.05527471378445625,,,,,, +31,179499,,,,,,,,,,,,0.06395630538463593,,,,,, +31,179549,,,,,,,,,,,,0.0698334351181984,,,,,, +31,179599,,,,,,,,,,,,0.06009076535701752,,,,,, +31,179649,,,,,,,,,,,,0.0705443024635315,,,,,, +31,179699,,,,,,,,,,,,0.053930360823869705,,,,,, +31,179749,,,,,,,,,,,,0.06152249872684479,,,,,, +31,179799,,,,,,,,,,,,0.05492466688156128,,,,,, +31,179849,,,,,,,,,,,,0.06385485827922821,,,,,, +31,179899,,,,,,,,,,,,0.06364696472883224,,,,,, +31,179949,,,,,,,,,,,,0.05513891205191612,,,,,, +31,179999,,,,,,,,,,,,0.06951981782913208,,,,,, +31,180049,,,,,,,,,,,,0.06077197566628456,,,,,, +31,180099,,,,,,,,,,,,0.05653417855501175,,,,,, +31,180149,,,,,,,,,,,,0.06100478395819664,,,,,, +31,180199,,,,,,,,,,,,0.057214923202991486,,,,,, +31,180249,,,,,,,,,,,,0.04850468039512634,,,,,, +31,180299,,,,,,,,,,,,0.06473678350448608,,,,,, +31,180349,,,,,,,,,,,,0.06322541832923889,,,,,, +31,180399,,,,,,,,,,,,0.05407741665840149,,,,,, +31,180449,,,,,,,,,,,,0.06084596365690231,,,,,, +31,180499,,,,,,,,,,,,0.05494236573576927,,,,,, +31,180549,,,,,,,,,,,,0.0556553415954113,,,,,, +31,180599,,,,,,,,,,,,0.05559840798377991,,,,,, +31,180649,,,,,,,,,,,,0.06698421388864517,,,,,, +31,180699,,,,,,,,,,,,0.05015880614519119,,,,,, +31,180749,,,,,,,,,,,,0.06483224034309387,,,,,, +31,180799,,,,,,,,,,,,0.05662364512681961,,,,,, +31,180849,,,,,,,,,,,,0.0566970594227314,,,,,, +31,180899,,,,,,,,,,,,0.07348772883415222,,,,,, +31,180949,,,,,,,,,,,,0.05662950873374939,,,,,, +31,180999,,,,,,,,,,,,0.05358550697565079,,,,,, +31,181049,,,,,,,,,,,,0.07240840047597885,,,,,, +31,181099,,,,,,,,,,,,0.06294052302837372,,,,,, +31,181149,,,,,,,,,,,,0.06255042552947998,,,,,, +31,181199,,,,,,,,,,,,0.050163015723228455,,,,,, +31,181249,,,,,,,,,,,,0.054379962384700775,,,,,, +31,181299,,,,,,,,,,,,0.06259042024612427,,,,,, +31,181349,,,,,,,,,,,,0.055876340717077255,,,,,, +31,181399,,,,,,,,,,,,0.053669750690460205,,,,,, +31,181449,,,,,,,,,,,,0.06621073186397552,,,,,, +31,181499,,,,,,,,,,,,0.0593448206782341,,,,,, +31,181549,,,,,,,,,,,,0.07036073505878448,,,,,, +31,181599,,,,,,,,,,,,0.061517566442489624,,,,,, +31,181649,,,,,,,,,,,,0.06011602282524109,,,,,, +31,181699,,,,,,,,,,,,0.04614704102277756,,,,,, +31,181749,,,,,,,,,,,,0.056592971086502075,,,,,, +31,181799,,,,,,,,,,,,0.055582281202077866,,,,,, +31,181849,,,,,,,,,,,,0.06681084632873535,,,,,, +31,181899,,,,,,,,,,,,0.06107804924249649,,,,,, +31,181949,,,,,,,,,,,,0.05745648592710495,,,,,, +31,181999,,,,,,,,,,,,0.07020094245672226,,,,,, +31,182049,,,,,,,,,,,,0.06110679358243942,,,,,, +31,182099,,,,,,,,,,,,0.05378881096839905,,,,,, +31,182149,,,,,,,,,,,,0.06492088735103607,,,,,, +31,182199,,,,,,,,,,,,0.05972599983215332,,,,,, +31,182249,,,,,,,,,,,,0.05523709952831268,,,,,, +31,182299,,,,,,,,,,,,0.06738117337226868,,,,,, +31,182349,,,,,,,,,,,,0.06366035342216492,,,,,, +31,182399,,,,,,,,,,,,0.0625147670507431,,,,,, +31,182449,,,,,,,,,,,,0.0673716813325882,,,,,, +31,182499,,,,,,,,,,,,0.06276029348373413,,,,,, +31,182549,,,,,,,,,,,,0.06923317909240723,,,,,, +31,182599,,,,,,,,,,,,0.0514991357922554,,,,,, +31,182649,,,,,,,,,,,,0.05763458460569382,,,,,, +31,182699,,,,,,,,,,,,0.05613293498754501,,,,,, +31,182749,,,,,,,,,,,,0.05699969828128815,,,,,, +31,182799,,,,,,,,,,,,0.04978315532207489,,,,,, +31,182849,,,,,,,,,,,,0.054463401436805725,,,,,, +31,182899,,,,,,,,,,,,0.06670576333999634,,,,,, +31,182949,,,,,,,,,,,,0.061221249401569366,,,,,, +31,182999,,,,,,,,,,,,0.05313670635223389,,,,,, +31,183049,,,,,,,,,,,,0.049175649881362915,,,,,, +31,183099,,,,,,,,,,,,0.05923055112361908,,,,,, +31,183149,,,,,,,,,,,,0.06356190145015717,,,,,, +31,183199,,,,,,,,,,,,0.06040389835834503,,,,,, +31,183249,,,,,,,,,,,,0.06298469752073288,,,,,, +31,183299,,,,,,,,,,,,0.06613010168075562,,,,,, +31,183349,,,,,,,,,,,,0.06830355525016785,,,,,, +31,183399,,,,,,,,,,,,0.06630047410726547,,,,,, +31,183449,,,,,,,,,,,,0.0583677813410759,,,,,, +31,183499,,,,,,,,,,,,0.061589621007442474,,,,,, +31,183549,,,,,,,,,,,,0.049432747066020966,,,,,, +31,183551,,,,,,,,,,,,,0.24369321763515472,0.0835791528224945,0.19346855580806732,-0.014053106307983398,0.19286055862903595,0.0835791528224945 +31,183551,,,,,,,0.20241685211658478,0.05975169688463211,0.5272842645645142,0.27801942825317383,0.506339430809021,,,,,,, +32,183599,,,,,,,,,,,,0.06556125730276108,,,,,, +32,183649,,,,,,,,,,,,0.06684000790119171,,,,,, +32,183699,,,,,,,,,,,,0.06424727290868759,,,,,, +32,183749,,,,,,,,,,,,0.07110867649316788,,,,,, +32,183799,,,,,,,,,,,,0.06175640970468521,,,,,, +32,183849,,,,,,,,,,,,0.052904095500707626,,,,,, +32,183899,,,,,,,,,,,,0.05058368295431137,,,,,, +32,183949,,,,,,,,,,,,0.05560010299086571,,,,,, +32,183999,,,,,,,,,,,,0.07111901044845581,,,,,, +32,184049,,,,,,,,,,,,0.06212709844112396,,,,,, +32,184099,,,,,,,,,,,,0.058388322591781616,,,,,, +32,184149,,,,,,,,,,,,0.05334614962339401,,,,,, +32,184199,,,,,,,,,,,,0.06314169615507126,,,,,, +32,184249,,,,,,,,,,,,0.06218534708023071,,,,,, +32,184299,,,,,,,,,,,,0.06426143646240234,,,,,, +32,184349,,,,,,,,,,,,0.06109142303466797,,,,,, +32,184399,,,,,,,,,,,,0.05551966279745102,,,,,, +32,184449,,,,,,,,,,,,0.07036203891038895,,,,,, +32,184499,,,,,,,,,,,,0.05566582456231117,,,,,, +32,184549,,,,,,,,,,,,0.07083016633987427,,,,,, +32,184599,,,,,,,,,,,,0.07260739803314209,,,,,, +32,184649,,,,,,,,,,,,0.06054680794477463,,,,,, +32,184699,,,,,,,,,,,,0.059921011328697205,,,,,, +32,184749,,,,,,,,,,,,0.06367233395576477,,,,,, +32,184799,,,,,,,,,,,,0.058714788407087326,,,,,, +32,184849,,,,,,,,,,,,0.054501086473464966,,,,,, +32,184899,,,,,,,,,,,,0.05748350918292999,,,,,, +32,184949,,,,,,,,,,,,0.05437138304114342,,,,,, +32,184999,,,,,,,,,,,,0.061950258910655975,,,,,, +32,185049,,,,,,,,,,,,0.061187032610177994,,,,,, +32,185099,,,,,,,,,,,,0.06684373319149017,,,,,, +32,185149,,,,,,,,,,,,0.05053295940160751,,,,,, +32,185199,,,,,,,,,,,,0.061244457960128784,,,,,, +32,185249,,,,,,,,,,,,0.0636100023984909,,,,,, +32,185299,,,,,,,,,,,,0.060140952467918396,,,,,, +32,185349,,,,,,,,,,,,0.06932836771011353,,,,,, +32,185399,,,,,,,,,,,,0.052361901849508286,,,,,, +32,185449,,,,,,,,,,,,0.06099279224872589,,,,,, +32,185499,,,,,,,,,,,,0.07352349162101746,,,,,, +32,185549,,,,,,,,,,,,0.06819377839565277,,,,,, +32,185599,,,,,,,,,,,,0.05050768330693245,,,,,, +32,185649,,,,,,,,,,,,0.06028158962726593,,,,,, +32,185699,,,,,,,,,,,,0.05908254161477089,,,,,, +32,185749,,,,,,,,,,,,0.05643400922417641,,,,,, +32,185799,,,,,,,,,,,,0.06400339305400848,,,,,, +32,185849,,,,,,,,,,,,0.06602884083986282,,,,,, +32,185899,,,,,,,,,,,,0.06031230837106705,,,,,, +32,185949,,,,,,,,,,,,0.0506109856069088,,,,,, +32,185999,,,,,,,,,,,,0.06794576346874237,,,,,, +32,186049,,,,,,,,,,,,0.05314496159553528,,,,,, +32,186099,,,,,,,,,,,,0.05279769375920296,,,,,, +32,186149,,,,,,,,,,,,0.06580949574708939,,,,,, +32,186199,,,,,,,,,,,,0.05433960631489754,,,,,, +32,186249,,,,,,,,,,,,0.07091165333986282,,,,,, +32,186299,,,,,,,,,,,,0.05076266825199127,,,,,, +32,186349,,,,,,,,,,,,0.06079499050974846,,,,,, +32,186399,,,,,,,,,,,,0.065116286277771,,,,,, +32,186449,,,,,,,,,,,,0.07103137671947479,,,,,, +32,186499,,,,,,,,,,,,0.05688973143696785,,,,,, +32,186549,,,,,,,,,,,,0.056191593408584595,,,,,, +32,186599,,,,,,,,,,,,0.06748687475919724,,,,,, +32,186649,,,,,,,,,,,,0.05528804287314415,,,,,, +32,186699,,,,,,,,,,,,0.05744826793670654,,,,,, +32,186749,,,,,,,,,,,,0.05356805771589279,,,,,, +32,186799,,,,,,,,,,,,0.05869266018271446,,,,,, +32,186849,,,,,,,,,,,,0.06984202563762665,,,,,, +32,186899,,,,,,,,,,,,0.05840067192912102,,,,,, +32,186949,,,,,,,,,,,,0.05883031338453293,,,,,, +32,186999,,,,,,,,,,,,0.060217712074518204,,,,,, +32,187049,,,,,,,,,,,,0.05481838062405586,,,,,, +32,187099,,,,,,,,,,,,0.05661613494157791,,,,,, +32,187149,,,,,,,,,,,,0.06143684312701225,,,,,, +32,187199,,,,,,,,,,,,0.04400043562054634,,,,,, +32,187249,,,,,,,,,,,,0.05668558180332184,,,,,, +32,187299,,,,,,,,,,,,0.06508045643568039,,,,,, +32,187349,,,,,,,,,,,,0.0696089044213295,,,,,, +32,187399,,,,,,,,,,,,0.06312400102615356,,,,,, +32,187449,,,,,,,,,,,,0.06309661269187927,,,,,, +32,187499,,,,,,,,,,,,0.06105528026819229,,,,,, +32,187549,,,,,,,,,,,,0.06415728479623795,,,,,, +32,187599,,,,,,,,,,,,0.06681700795888901,,,,,, +32,187649,,,,,,,,,,,,0.051399633288383484,,,,,, +32,187699,,,,,,,,,,,,0.054918378591537476,,,,,, +32,187749,,,,,,,,,,,,0.06718720495700836,,,,,, +32,187799,,,,,,,,,,,,0.062210410833358765,,,,,, +32,187849,,,,,,,,,,,,0.057247936725616455,,,,,, +32,187899,,,,,,,,,,,,0.053927890956401825,,,,,, +32,187949,,,,,,,,,,,,0.0724165141582489,,,,,, +32,187999,,,,,,,,,,,,0.05751919746398926,,,,,, +32,188049,,,,,,,,,,,,0.053201720118522644,,,,,, +32,188099,,,,,,,,,,,,0.05517435818910599,,,,,, +32,188149,,,,,,,,,,,,0.05688575655221939,,,,,, +32,188199,,,,,,,,,,,,0.051661938428878784,,,,,, +32,188249,,,,,,,,,,,,0.05442628636956215,,,,,, +32,188299,,,,,,,,,,,,0.06008515506982803,,,,,, +32,188349,,,,,,,,,,,,0.06042171269655228,,,,,, +32,188399,,,,,,,,,,,,0.0647757276892662,,,,,, +32,188449,,,,,,,,,,,,0.050806619226932526,,,,,, +32,188499,,,,,,,,,,,,0.05858767032623291,,,,,, +32,188549,,,,,,,,,,,,0.056626349687576294,,,,,, +32,188599,,,,,,,,,,,,0.05795922130346298,,,,,, +32,188649,,,,,,,,,,,,0.06342805176973343,,,,,, +32,188699,,,,,,,,,,,,0.054359711706638336,,,,,, +32,188749,,,,,,,,,,,,0.05540764331817627,,,,,, +32,188799,,,,,,,,,,,,0.06253792345523834,,,,,, +32,188849,,,,,,,,,,,,0.06364555656909943,,,,,, +32,188899,,,,,,,,,,,,0.05668317526578903,,,,,, +32,188949,,,,,,,,,,,,0.06694059073925018,,,,,, +32,188999,,,,,,,,,,,,0.03975825756788254,,,,,, +32,189049,,,,,,,,,,,,0.05473841354250908,,,,,, +32,189099,,,,,,,,,,,,0.07702536880970001,,,,,, +32,189149,,,,,,,,,,,,0.052824005484580994,,,,,, +32,189199,,,,,,,,,,,,0.06329216063022614,,,,,, +32,189249,,,,,,,,,,,,0.05007927119731903,,,,,, +32,189287,,,,,,,,,,,,,0.24428081512451172,0.08382923156023026,0.18571020662784576,-0.017087221145629883,0.18517352640628815,0.08382923156023026 +32,189287,,,,,,,0.20196111500263214,0.059534814208745956,0.5297636985778809,0.2806493043899536,0.508641242980957,,,,,,, +33,189299,,,,,,,,,,,,0.04962748661637306,,,,,, +33,189349,,,,,,,,,,,,0.05079847201704979,,,,,, +33,189399,,,,,,,,,,,,0.055702175945043564,,,,,, +33,189449,,,,,,,,,,,,0.05024223029613495,,,,,, +33,189499,,,,,,,,,,,,0.055039677768945694,,,,,, +33,189549,,,,,,,,,,,,0.05794407054781914,,,,,, +33,189599,,,,,,,,,,,,0.061019543558359146,,,,,, +33,189649,,,,,,,,,,,,0.060293007642030716,,,,,, +33,189699,,,,,,,,,,,,0.06261397898197174,,,,,, +33,189749,,,,,,,,,,,,0.05364133417606354,,,,,, +33,189799,,,,,,,,,,,,0.0586346797645092,,,,,, +33,189849,,,,,,,,,,,,0.07563520967960358,,,,,, +33,189899,,,,,,,,,,,,0.047120749950408936,,,,,, +33,189949,,,,,,,,,,,,0.054883211851119995,,,,,, +33,189999,,,,,,,,,,,,0.06483426690101624,,,,,, +33,190049,,,,,,,,,,,,0.05120682343840599,,,,,, +33,190099,,,,,,,,,,,,0.057619575411081314,,,,,, +33,190149,,,,,,,,,,,,0.053700774908065796,,,,,, +33,190199,,,,,,,,,,,,0.0650235190987587,,,,,, +33,190249,,,,,,,,,,,,0.058895520865917206,,,,,, +33,190299,,,,,,,,,,,,0.0624140240252018,,,,,, +33,190349,,,,,,,,,,,,0.050559043884277344,,,,,, +33,190399,,,,,,,,,,,,0.06404724717140198,,,,,, +33,190449,,,,,,,,,,,,0.05585256218910217,,,,,, +33,190499,,,,,,,,,,,,0.06534183770418167,,,,,, +33,190549,,,,,,,,,,,,0.05818331241607666,,,,,, +33,190599,,,,,,,,,,,,0.042809098958969116,,,,,, +33,190649,,,,,,,,,,,,0.06408543139696121,,,,,, +33,190699,,,,,,,,,,,,0.056898441165685654,,,,,, +33,190749,,,,,,,,,,,,0.07356752455234528,,,,,, +33,190799,,,,,,,,,,,,0.06457769125699997,,,,,, +33,190849,,,,,,,,,,,,0.06568627059459686,,,,,, +33,190899,,,,,,,,,,,,0.058825451880693436,,,,,, +33,190949,,,,,,,,,,,,0.06285448372364044,,,,,, +33,190999,,,,,,,,,,,,0.06524569541215897,,,,,, +33,191049,,,,,,,,,,,,0.06270602345466614,,,,,, +33,191099,,,,,,,,,,,,0.05801524966955185,,,,,, +33,191149,,,,,,,,,,,,0.054542817175388336,,,,,, +33,191199,,,,,,,,,,,,0.06407421082258224,,,,,, +33,191249,,,,,,,,,,,,0.04796310514211655,,,,,, +33,191299,,,,,,,,,,,,0.0638030618429184,,,,,, +33,191349,,,,,,,,,,,,0.06782756745815277,,,,,, +33,191399,,,,,,,,,,,,0.05455070734024048,,,,,, +33,191449,,,,,,,,,,,,0.06036369875073433,,,,,, +33,191499,,,,,,,,,,,,0.06402577459812164,,,,,, +33,191549,,,,,,,,,,,,0.05659319460391998,,,,,, +33,191599,,,,,,,,,,,,0.06112608686089516,,,,,, +33,191649,,,,,,,,,,,,0.05467889830470085,,,,,, +33,191699,,,,,,,,,,,,0.05944603681564331,,,,,, +33,191749,,,,,,,,,,,,0.06642551720142365,,,,,, +33,191799,,,,,,,,,,,,0.054154474288225174,,,,,, +33,191849,,,,,,,,,,,,0.05746638774871826,,,,,, +33,191899,,,,,,,,,,,,0.05722632259130478,,,,,, +33,191949,,,,,,,,,,,,0.06245062127709389,,,,,, +33,191999,,,,,,,,,,,,0.060690589249134064,,,,,, +33,192049,,,,,,,,,,,,0.06131120026111603,,,,,, +33,192099,,,,,,,,,,,,0.07155653834342957,,,,,, +33,192149,,,,,,,,,,,,0.051227420568466187,,,,,, +33,192199,,,,,,,,,,,,0.05894636735320091,,,,,, +33,192249,,,,,,,,,,,,0.054707348346710205,,,,,, +33,192299,,,,,,,,,,,,0.05567439645528793,,,,,, +33,192349,,,,,,,,,,,,0.04949743673205376,,,,,, +33,192399,,,,,,,,,,,,0.04858766496181488,,,,,, +33,192449,,,,,,,,,,,,0.061385221779346466,,,,,, +33,192499,,,,,,,,,,,,0.05804312974214554,,,,,, +33,192549,,,,,,,,,,,,0.05931663513183594,,,,,, +33,192599,,,,,,,,,,,,0.063975028693676,,,,,, +33,192649,,,,,,,,,,,,0.056850455701351166,,,,,, +33,192699,,,,,,,,,,,,0.058726467192173004,,,,,, +33,192749,,,,,,,,,,,,0.055231768637895584,,,,,, +33,192799,,,,,,,,,,,,0.06557992100715637,,,,,, +33,192849,,,,,,,,,,,,0.0661449134349823,,,,,, +33,192899,,,,,,,,,,,,0.060543980449438095,,,,,, +33,192949,,,,,,,,,,,,0.07074080407619476,,,,,, +33,192999,,,,,,,,,,,,0.0552251823246479,,,,,, +33,193049,,,,,,,,,,,,0.056996576488018036,,,,,, +33,193099,,,,,,,,,,,,0.05257902666926384,,,,,, +33,193149,,,,,,,,,,,,0.061297450214624405,,,,,, +33,193199,,,,,,,,,,,,0.059433989226818085,,,,,, +33,193249,,,,,,,,,,,,0.05847740173339844,,,,,, +33,193299,,,,,,,,,,,,0.061785295605659485,,,,,, +33,193349,,,,,,,,,,,,0.05679086223244667,,,,,, +33,193399,,,,,,,,,,,,0.05581875890493393,,,,,, +33,193449,,,,,,,,,,,,0.05663105845451355,,,,,, +33,193499,,,,,,,,,,,,0.05622832477092743,,,,,, +33,193549,,,,,,,,,,,,0.05570157617330551,,,,,, +33,193599,,,,,,,,,,,,0.06268410384654999,,,,,, +33,193649,,,,,,,,,,,,0.06637510657310486,,,,,, +33,193699,,,,,,,,,,,,0.05870743840932846,,,,,, +33,193749,,,,,,,,,,,,0.060458578169345856,,,,,, +33,193799,,,,,,,,,,,,0.06366206705570221,,,,,, +33,193849,,,,,,,,,,,,0.0675690770149231,,,,,, +33,193899,,,,,,,,,,,,0.051036011427640915,,,,,, +33,193949,,,,,,,,,,,,0.05241726338863373,,,,,, +33,193999,,,,,,,,,,,,0.06287691742181778,,,,,, +33,194049,,,,,,,,,,,,0.05462665855884552,,,,,, +33,194099,,,,,,,,,,,,0.05835839733481407,,,,,, +33,194149,,,,,,,,,,,,0.05914909392595291,,,,,, +33,194199,,,,,,,,,,,,0.05024159699678421,,,,,, +33,194249,,,,,,,,,,,,0.06023550033569336,,,,,, +33,194299,,,,,,,,,,,,0.06036395579576492,,,,,, +33,194349,,,,,,,,,,,,0.0687316283583641,,,,,, +33,194399,,,,,,,,,,,,0.05053079128265381,,,,,, +33,194449,,,,,,,,,,,,0.060434531420469284,,,,,, +33,194499,,,,,,,,,,,,0.056553419679403305,,,,,, +33,194549,,,,,,,,,,,,0.0477573499083519,,,,,, +33,194599,,,,,,,,,,,,0.053468599915504456,,,,,, +33,194649,,,,,,,,,,,,0.052952203899621964,,,,,, +33,194699,,,,,,,,,,,,0.06296708434820175,,,,,, +33,194749,,,,,,,,,,,,0.05029916763305664,,,,,, +33,194799,,,,,,,,,,,,0.05771910399198532,,,,,, +33,194849,,,,,,,,,,,,0.0747234970331192,,,,,, +33,194899,,,,,,,,,,,,0.06072913110256195,,,,,, +33,194949,,,,,,,,,,,,0.0680728405714035,,,,,, +33,194999,,,,,,,,,,,,0.05898500606417656,,,,,, +33,195023,,,,,,,,,,,,,0.2435350865125656,0.083555668592453,0.1938675343990326,-0.01376807689666748,0.19304928183555603,0.083555668592453 +33,195023,,,,,,,0.2016761302947998,0.05937918275594711,0.5315356850624084,0.2825242280960083,0.5105645060539246,,,,,,, +34,195049,,,,,,,,,,,,0.04608657956123352,,,,,, +34,195099,,,,,,,,,,,,0.06837576627731323,,,,,, +34,195149,,,,,,,,,,,,0.06335998326539993,,,,,, +34,195199,,,,,,,,,,,,0.06611116975545883,,,,,, +34,195249,,,,,,,,,,,,0.05002380907535553,,,,,, +34,195299,,,,,,,,,,,,0.04790708050131798,,,,,, +34,195349,,,,,,,,,,,,0.06546276062726974,,,,,, +34,195399,,,,,,,,,,,,0.06356537342071533,,,,,, +34,195449,,,,,,,,,,,,0.06348733603954315,,,,,, +34,195499,,,,,,,,,,,,0.06167171150445938,,,,,, +34,195549,,,,,,,,,,,,0.06159866973757744,,,,,, +34,195599,,,,,,,,,,,,0.05522861331701279,,,,,, +34,195649,,,,,,,,,,,,0.04978782683610916,,,,,, +34,195699,,,,,,,,,,,,0.05930168181657791,,,,,, +34,195749,,,,,,,,,,,,0.05992212891578674,,,,,, +34,195799,,,,,,,,,,,,0.051001086831092834,,,,,, +34,195849,,,,,,,,,,,,0.055958643555641174,,,,,, +34,195899,,,,,,,,,,,,0.05547525733709335,,,,,, +34,195949,,,,,,,,,,,,0.06091760843992233,,,,,, +34,195999,,,,,,,,,,,,0.05150632560253143,,,,,, +34,196049,,,,,,,,,,,,0.05862095579504967,,,,,, +34,196099,,,,,,,,,,,,0.05804663896560669,,,,,, +34,196149,,,,,,,,,,,,0.06682334840297699,,,,,, +34,196199,,,,,,,,,,,,0.06231136992573738,,,,,, +34,196249,,,,,,,,,,,,0.06028248369693756,,,,,, +34,196299,,,,,,,,,,,,0.05594027042388916,,,,,, +34,196349,,,,,,,,,,,,0.05663838982582092,,,,,, +34,196399,,,,,,,,,,,,0.05077536031603813,,,,,, +34,196449,,,,,,,,,,,,0.06358916312456131,,,,,, +34,196499,,,,,,,,,,,,0.0557398684322834,,,,,, +34,196549,,,,,,,,,,,,0.05456473305821419,,,,,, +34,196599,,,,,,,,,,,,0.05428936332464218,,,,,, +34,196649,,,,,,,,,,,,0.06321756541728973,,,,,, +34,196699,,,,,,,,,,,,0.06522175669670105,,,,,, +34,196749,,,,,,,,,,,,0.05280212312936783,,,,,, +34,196799,,,,,,,,,,,,0.0607462152838707,,,,,, +34,196849,,,,,,,,,,,,0.06049632281064987,,,,,, +34,196899,,,,,,,,,,,,0.0628928393125534,,,,,, +34,196949,,,,,,,,,,,,0.059927914291620255,,,,,, +34,196999,,,,,,,,,,,,0.06667464971542358,,,,,, +34,197049,,,,,,,,,,,,0.058028336614370346,,,,,, +34,197099,,,,,,,,,,,,0.05920485407114029,,,,,, +34,197149,,,,,,,,,,,,0.05893564224243164,,,,,, +34,197199,,,,,,,,,,,,0.054743774235248566,,,,,, +34,197249,,,,,,,,,,,,0.06511452049016953,,,,,, +34,197299,,,,,,,,,,,,0.05159053951501846,,,,,, +34,197349,,,,,,,,,,,,0.05708380416035652,,,,,, +34,197399,,,,,,,,,,,,0.06016238033771515,,,,,, +34,197449,,,,,,,,,,,,0.05565059185028076,,,,,, +34,197499,,,,,,,,,,,,0.046392202377319336,,,,,, +34,197549,,,,,,,,,,,,0.06250853836536407,,,,,, +34,197599,,,,,,,,,,,,0.06527719646692276,,,,,, +34,197649,,,,,,,,,,,,0.05900285392999649,,,,,, +34,197699,,,,,,,,,,,,0.04833585023880005,,,,,, +34,197749,,,,,,,,,,,,0.07426811009645462,,,,,, +34,197799,,,,,,,,,,,,0.058394141495227814,,,,,, +34,197849,,,,,,,,,,,,0.06712567061185837,,,,,, +34,197899,,,,,,,,,,,,0.05674446001648903,,,,,, +34,197949,,,,,,,,,,,,0.05148216336965561,,,,,, +34,197999,,,,,,,,,,,,0.08181144297122955,,,,,, +34,198049,,,,,,,,,,,,0.06885033845901489,,,,,, +34,198099,,,,,,,,,,,,0.0510961189866066,,,,,, +34,198149,,,,,,,,,,,,0.06151101738214493,,,,,, +34,198199,,,,,,,,,,,,0.058102965354919434,,,,,, +34,198249,,,,,,,,,,,,0.05921241641044617,,,,,, +34,198299,,,,,,,,,,,,0.05339276045560837,,,,,, +34,198349,,,,,,,,,,,,0.05047042667865753,,,,,, +34,198399,,,,,,,,,,,,0.05886330455541611,,,,,, +34,198449,,,,,,,,,,,,0.05580364167690277,,,,,, +34,198499,,,,,,,,,,,,0.05878463760018349,,,,,, +34,198549,,,,,,,,,,,,0.056035108864307404,,,,,, +34,198599,,,,,,,,,,,,0.05897320806980133,,,,,, +34,198649,,,,,,,,,,,,0.06104423478245735,,,,,, +34,198699,,,,,,,,,,,,0.05544999986886978,,,,,, +34,198749,,,,,,,,,,,,0.0583648607134819,,,,,, +34,198799,,,,,,,,,,,,0.05684220790863037,,,,,, +34,198849,,,,,,,,,,,,0.05588747560977936,,,,,, +34,198899,,,,,,,,,,,,0.05665319412946701,,,,,, +34,198949,,,,,,,,,,,,0.05556222051382065,,,,,, +34,198999,,,,,,,,,,,,0.0617874413728714,,,,,, +34,199049,,,,,,,,,,,,0.058929815888404846,,,,,, +34,199099,,,,,,,,,,,,0.062063731253147125,,,,,, +34,199149,,,,,,,,,,,,0.068990558385849,,,,,, +34,199199,,,,,,,,,,,,0.06398193538188934,,,,,, +34,199249,,,,,,,,,,,,0.055026568472385406,,,,,, +34,199299,,,,,,,,,,,,0.06631909310817719,,,,,, +34,199349,,,,,,,,,,,,0.05676533281803131,,,,,, +34,199399,,,,,,,,,,,,0.05628765746951103,,,,,, +34,199449,,,,,,,,,,,,0.07050474733114243,,,,,, +34,199499,,,,,,,,,,,,0.05712462589144707,,,,,, +34,199549,,,,,,,,,,,,0.059984929859638214,,,,,, +34,199599,,,,,,,,,,,,0.05601320415735245,,,,,, +34,199649,,,,,,,,,,,,0.06529977917671204,,,,,, +34,199699,,,,,,,,,,,,0.07482942938804626,,,,,, +34,199749,,,,,,,,,,,,0.055208414793014526,,,,,, +34,199799,,,,,,,,,,,,0.05428652837872505,,,,,, +34,199849,,,,,,,,,,,,0.07201001048088074,,,,,, +34,199899,,,,,,,,,,,,0.05179145559668541,,,,,, +34,199949,,,,,,,,,,,,0.05543632060289383,,,,,, +34,199999,,,,,,,,,,,,0.05246174335479736,,,,,, +34,200049,,,,,,,,,,,,0.05759499967098236,,,,,, +34,200099,,,,,,,,,,,,0.0648270696401596,,,,,, +34,200149,,,,,,,,,,,,0.05260472744703293,,,,,, +34,200199,,,,,,,,,,,,0.060072265565395355,,,,,, +34,200249,,,,,,,,,,,,0.05788489431142807,,,,,, +34,200299,,,,,,,,,,,,0.05275368690490723,,,,,, +34,200349,,,,,,,,,,,,0.06167067587375641,,,,,, +34,200399,,,,,,,,,,,,0.06479954719543457,,,,,, +34,200449,,,,,,,,,,,,0.05847480520606041,,,,,, +34,200499,,,,,,,,,,,,0.06623933464288712,,,,,, +34,200549,,,,,,,,,,,,0.05810512602329254,,,,,, +34,200599,,,,,,,,,,,,0.06754990667104721,,,,,, +34,200649,,,,,,,,,,,,0.05649014562368393,,,,,, +34,200699,,,,,,,,,,,,0.06629262864589691,,,,,, +34,200749,,,,,,,,,,,,0.048528462648391724,,,,,, +34,200759,,,,,,,,,,,,,0.24311134219169617,0.08336015045642853,0.20009039342403412,-0.011395931243896484,0.19959478080272675,0.08336015045642853 +34,200759,,,,,,,0.2014017254114151,0.05927329137921333,0.532738208770752,0.28380078077316284,0.5116631388664246,,,,,,, +35,200799,,,,,,,,,,,,0.06716318428516388,,,,,, +35,200849,,,,,,,,,,,,0.053049273788928986,,,,,, +35,200899,,,,,,,,,,,,0.05648743361234665,,,,,, +35,200949,,,,,,,,,,,,0.055155135691165924,,,,,, +35,200999,,,,,,,,,,,,0.0680486410856247,,,,,, +35,201049,,,,,,,,,,,,0.054248832166194916,,,,,, +35,201099,,,,,,,,,,,,0.06515587121248245,,,,,, +35,201149,,,,,,,,,,,,0.054374583065509796,,,,,, +35,201199,,,,,,,,,,,,0.06470638513565063,,,,,, +35,201249,,,,,,,,,,,,0.07421419024467468,,,,,, +35,201299,,,,,,,,,,,,0.059956662356853485,,,,,, +35,201349,,,,,,,,,,,,0.05776200443506241,,,,,, +35,201399,,,,,,,,,,,,0.0656181126832962,,,,,, +35,201449,,,,,,,,,,,,0.05875081941485405,,,,,, +35,201499,,,,,,,,,,,,0.05583133548498154,,,,,, +35,201549,,,,,,,,,,,,0.05476707965135574,,,,,, +35,201599,,,,,,,,,,,,0.07280346751213074,,,,,, +35,201649,,,,,,,,,,,,0.049395859241485596,,,,,, +35,201699,,,,,,,,,,,,0.06094779074192047,,,,,, +35,201749,,,,,,,,,,,,0.055893827229738235,,,,,, +35,201799,,,,,,,,,,,,0.05826020613312721,,,,,, +35,201849,,,,,,,,,,,,0.06258586049079895,,,,,, +35,201899,,,,,,,,,,,,0.06548143923282623,,,,,, +35,201949,,,,,,,,,,,,0.05778153985738754,,,,,, +35,201999,,,,,,,,,,,,0.05193798989057541,,,,,, +35,202049,,,,,,,,,,,,0.053880974650382996,,,,,, +35,202099,,,,,,,,,,,,0.05098756402730942,,,,,, +35,202149,,,,,,,,,,,,0.06039125472307205,,,,,, +35,202199,,,,,,,,,,,,0.05220164731144905,,,,,, +35,202249,,,,,,,,,,,,0.07083013653755188,,,,,, +35,202299,,,,,,,,,,,,0.04904848337173462,,,,,, +35,202349,,,,,,,,,,,,0.0695149153470993,,,,,, +35,202399,,,,,,,,,,,,0.06275597214698792,,,,,, +35,202449,,,,,,,,,,,,0.05457649379968643,,,,,, +35,202499,,,,,,,,,,,,0.06594184786081314,,,,,, +35,202549,,,,,,,,,,,,0.05117005854845047,,,,,, +35,202599,,,,,,,,,,,,0.05523579567670822,,,,,, +35,202649,,,,,,,,,,,,0.06163811311125755,,,,,, +35,202699,,,,,,,,,,,,0.06150631979107857,,,,,, +35,202749,,,,,,,,,,,,0.060630377382040024,,,,,, +35,202799,,,,,,,,,,,,0.055601052939891815,,,,,, +35,202849,,,,,,,,,,,,0.051302287727594376,,,,,, +35,202899,,,,,,,,,,,,0.05789314955472946,,,,,, +35,202949,,,,,,,,,,,,0.05855482071638107,,,,,, +35,202999,,,,,,,,,,,,0.05912437289953232,,,,,, +35,203049,,,,,,,,,,,,0.05315152928233147,,,,,, +35,203099,,,,,,,,,,,,0.06685803085565567,,,,,, +35,203149,,,,,,,,,,,,0.052329324185848236,,,,,, +35,203199,,,,,,,,,,,,0.06087256222963333,,,,,, +35,203249,,,,,,,,,,,,0.06387302279472351,,,,,, +35,203299,,,,,,,,,,,,0.06652933359146118,,,,,, +35,203349,,,,,,,,,,,,0.050921741873025894,,,,,, +35,203399,,,,,,,,,,,,0.05677788332104683,,,,,, +35,203449,,,,,,,,,,,,0.0672343373298645,,,,,, +35,203499,,,,,,,,,,,,0.04897838085889816,,,,,, +35,203549,,,,,,,,,,,,0.07153348624706268,,,,,, +35,203599,,,,,,,,,,,,0.057106196880340576,,,,,, +35,203649,,,,,,,,,,,,0.05323050543665886,,,,,, +35,203699,,,,,,,,,,,,0.05764835327863693,,,,,, +35,203749,,,,,,,,,,,,0.06680357456207275,,,,,, +35,203799,,,,,,,,,,,,0.05414794757962227,,,,,, +35,203849,,,,,,,,,,,,0.06082860752940178,,,,,, +35,203899,,,,,,,,,,,,0.056452780961990356,,,,,, +35,203949,,,,,,,,,,,,0.0579720139503479,,,,,, +35,203999,,,,,,,,,,,,0.05303717404603958,,,,,, +35,204049,,,,,,,,,,,,0.06434904783964157,,,,,, +35,204099,,,,,,,,,,,,0.0680251196026802,,,,,, +35,204149,,,,,,,,,,,,0.062406156212091446,,,,,, +35,204199,,,,,,,,,,,,0.06145348399877548,,,,,, +35,204249,,,,,,,,,,,,0.05181033909320831,,,,,, +35,204299,,,,,,,,,,,,0.0636923536658287,,,,,, +35,204349,,,,,,,,,,,,0.059010062366724014,,,,,, +35,204399,,,,,,,,,,,,0.05790647491812706,,,,,, +35,204449,,,,,,,,,,,,0.05396852642297745,,,,,, +35,204499,,,,,,,,,,,,0.05458272621035576,,,,,, +35,204549,,,,,,,,,,,,0.04810969531536102,,,,,, +35,204599,,,,,,,,,,,,0.06473639607429504,,,,,, +35,204649,,,,,,,,,,,,0.056196436285972595,,,,,, +35,204699,,,,,,,,,,,,0.05502770468592644,,,,,, +35,204749,,,,,,,,,,,,0.05945991724729538,,,,,, +35,204799,,,,,,,,,,,,0.05565100535750389,,,,,, +35,204849,,,,,,,,,,,,0.053774718195199966,,,,,, +35,204899,,,,,,,,,,,,0.06312450021505356,,,,,, +35,204949,,,,,,,,,,,,0.0629413053393364,,,,,, +35,204999,,,,,,,,,,,,0.053461410105228424,,,,,, +35,205049,,,,,,,,,,,,0.06197238340973854,,,,,, +35,205099,,,,,,,,,,,,0.055870767682790756,,,,,, +35,205149,,,,,,,,,,,,0.0648241937160492,,,,,, +35,205199,,,,,,,,,,,,0.06671424210071564,,,,,, +35,205249,,,,,,,,,,,,0.057180654257535934,,,,,, +35,205299,,,,,,,,,,,,0.05288229137659073,,,,,, +35,205349,,,,,,,,,,,,0.05970257893204689,,,,,, +35,205399,,,,,,,,,,,,0.058743059635162354,,,,,, +35,205449,,,,,,,,,,,,0.05915134772658348,,,,,, +35,205499,,,,,,,,,,,,0.06337644159793854,,,,,, +35,205549,,,,,,,,,,,,0.056458067148923874,,,,,, +35,205599,,,,,,,,,,,,0.056541476398706436,,,,,, +35,205649,,,,,,,,,,,,0.051360998302698135,,,,,, +35,205699,,,,,,,,,,,,0.05798451229929924,,,,,, +35,205749,,,,,,,,,,,,0.054466262459754944,,,,,, +35,205799,,,,,,,,,,,,0.05528685450553894,,,,,, +35,205849,,,,,,,,,,,,0.06494562327861786,,,,,, +35,205899,,,,,,,,,,,,0.06553997099399567,,,,,, +35,205949,,,,,,,,,,,,0.0633758157491684,,,,,, +35,205999,,,,,,,,,,,,0.05633432790637016,,,,,, +35,206049,,,,,,,,,,,,0.05906102806329727,,,,,, +35,206099,,,,,,,,,,,,0.045543819665908813,,,,,, +35,206149,,,,,,,,,,,,0.05893176421523094,,,,,, +35,206199,,,,,,,,,,,,0.060844726860523224,,,,,, +35,206249,,,,,,,,,,,,0.06193937733769417,,,,,, +35,206299,,,,,,,,,,,,0.05643744766712189,,,,,, +35,206349,,,,,,,,,,,,0.058997757732868195,,,,,, +35,206399,,,,,,,,,,,,0.054246604442596436,,,,,, +35,206449,,,,,,,,,,,,0.060305967926979065,,,,,, +35,206495,,,,,,,,,,,,,0.24262019991874695,0.08289114385843277,0.20334336161613464,-0.005705475807189941,0.20315131545066833,0.08289114385843277 +35,206495,,,,,,,0.20140857994556427,0.0592661090195179,0.5328217148780823,0.28389620780944824,0.511665940284729,,,,,,, +36,206499,,,,,,,,,,,,0.06887093186378479,,,,,, +36,206549,,,,,,,,,,,,0.05221810191869736,,,,,, +36,206599,,,,,,,,,,,,0.06229116767644882,,,,,, +36,206649,,,,,,,,,,,,0.07196506857872009,,,,,, +36,206699,,,,,,,,,,,,0.05816580727696419,,,,,, +36,206749,,,,,,,,,,,,0.05408409982919693,,,,,, +36,206799,,,,,,,,,,,,0.06433950364589691,,,,,, +36,206849,,,,,,,,,,,,0.06249643489718437,,,,,, +36,206899,,,,,,,,,,,,0.08318497985601425,,,,,, +36,206949,,,,,,,,,,,,0.05932748690247536,,,,,, +36,206999,,,,,,,,,,,,0.06069856882095337,,,,,, +36,207049,,,,,,,,,,,,0.05642857775092125,,,,,, +36,207099,,,,,,,,,,,,0.06412558257579803,,,,,, +36,207149,,,,,,,,,,,,0.06165769696235657,,,,,, +36,207199,,,,,,,,,,,,0.055111370980739594,,,,,, +36,207249,,,,,,,,,,,,0.056956805288791656,,,,,, +36,207299,,,,,,,,,,,,0.07136999815702438,,,,,, +36,207349,,,,,,,,,,,,0.055673424154520035,,,,,, +36,207399,,,,,,,,,,,,0.06954815983772278,,,,,, +36,207449,,,,,,,,,,,,0.0592222735285759,,,,,, +36,207499,,,,,,,,,,,,0.06008199602365494,,,,,, +36,207549,,,,,,,,,,,,0.06175902113318443,,,,,, +36,207599,,,,,,,,,,,,0.05316237732768059,,,,,, +36,207649,,,,,,,,,,,,0.06911008805036545,,,,,, +36,207699,,,,,,,,,,,,0.0694400817155838,,,,,, +36,207749,,,,,,,,,,,,0.06156805157661438,,,,,, +36,207799,,,,,,,,,,,,0.05575589835643768,,,,,, +36,207849,,,,,,,,,,,,0.05894430726766586,,,,,, +36,207899,,,,,,,,,,,,0.056949906051158905,,,,,, +36,207949,,,,,,,,,,,,0.055484794080257416,,,,,, +36,207999,,,,,,,,,,,,0.05129444971680641,,,,,, +36,208049,,,,,,,,,,,,0.0624709390103817,,,,,, +36,208099,,,,,,,,,,,,0.06351138651371002,,,,,, +36,208149,,,,,,,,,,,,0.06419961154460907,,,,,, +36,208199,,,,,,,,,,,,0.06554445624351501,,,,,, +36,208249,,,,,,,,,,,,0.05238707363605499,,,,,, +36,208299,,,,,,,,,,,,0.05706402659416199,,,,,, +36,208349,,,,,,,,,,,,0.0564696341753006,,,,,, +36,208399,,,,,,,,,,,,0.05120507627725601,,,,,, +36,208449,,,,,,,,,,,,0.051837146282196045,,,,,, +36,208499,,,,,,,,,,,,0.06305763125419617,,,,,, +36,208549,,,,,,,,,,,,0.05590035393834114,,,,,, +36,208599,,,,,,,,,,,,0.05912025272846222,,,,,, +36,208649,,,,,,,,,,,,0.048415496945381165,,,,,, +36,208699,,,,,,,,,,,,0.06175161898136139,,,,,, +36,208749,,,,,,,,,,,,0.06721805036067963,,,,,, +36,208799,,,,,,,,,,,,0.05782872065901756,,,,,, +36,208849,,,,,,,,,,,,0.05551939457654953,,,,,, +36,208899,,,,,,,,,,,,0.06408804655075073,,,,,, +36,208949,,,,,,,,,,,,0.06493235379457474,,,,,, +36,208999,,,,,,,,,,,,0.06289892643690109,,,,,, +36,209049,,,,,,,,,,,,0.053786806762218475,,,,,, +36,209099,,,,,,,,,,,,0.0473451241850853,,,,,, +36,209149,,,,,,,,,,,,0.06582123041152954,,,,,, +36,209199,,,,,,,,,,,,0.05455794185400009,,,,,, +36,209249,,,,,,,,,,,,0.05165816843509674,,,,,, +36,209299,,,,,,,,,,,,0.05338595435023308,,,,,, +36,209349,,,,,,,,,,,,0.06001174449920654,,,,,, +36,209399,,,,,,,,,,,,0.06202489882707596,,,,,, +36,209449,,,,,,,,,,,,0.04965183883905411,,,,,, +36,209499,,,,,,,,,,,,0.0502501055598259,,,,,, +36,209549,,,,,,,,,,,,0.059620682150125504,,,,,, +36,209599,,,,,,,,,,,,0.06330475211143494,,,,,, +36,209649,,,,,,,,,,,,0.056191250681877136,,,,,, +36,209699,,,,,,,,,,,,0.05344878137111664,,,,,, +36,209749,,,,,,,,,,,,0.05602039396762848,,,,,, +36,209799,,,,,,,,,,,,0.05942382290959358,,,,,, +36,209849,,,,,,,,,,,,0.06624311208724976,,,,,, +36,209899,,,,,,,,,,,,0.06677170097827911,,,,,, +36,209949,,,,,,,,,,,,0.06393808126449585,,,,,, +36,209999,,,,,,,,,,,,0.061582278460264206,,,,,, +36,210049,,,,,,,,,,,,0.057284608483314514,,,,,, +36,210099,,,,,,,,,,,,0.059293974190950394,,,,,, +36,210149,,,,,,,,,,,,0.0594039186835289,,,,,, +36,210199,,,,,,,,,,,,0.051074232906103134,,,,,, +36,210249,,,,,,,,,,,,0.0729743093252182,,,,,, +36,210299,,,,,,,,,,,,0.05421612039208412,,,,,, +36,210349,,,,,,,,,,,,0.06302781403064728,,,,,, +36,210399,,,,,,,,,,,,0.06795671582221985,,,,,, +36,210449,,,,,,,,,,,,0.04868708550930023,,,,,, +36,210499,,,,,,,,,,,,0.05865514278411865,,,,,, +36,210549,,,,,,,,,,,,0.060899268835783005,,,,,, +36,210599,,,,,,,,,,,,0.05832229182124138,,,,,, +36,210649,,,,,,,,,,,,0.06993310153484344,,,,,, +36,210699,,,,,,,,,,,,0.06810681521892548,,,,,, +36,210749,,,,,,,,,,,,0.07535818964242935,,,,,, +36,210799,,,,,,,,,,,,0.05473916232585907,,,,,, +36,210849,,,,,,,,,,,,0.05497264862060547,,,,,, +36,210899,,,,,,,,,,,,0.0615326389670372,,,,,, +36,210949,,,,,,,,,,,,0.06191873177886009,,,,,, +36,210999,,,,,,,,,,,,0.058992668986320496,,,,,, +36,211049,,,,,,,,,,,,0.05620362609624863,,,,,, +36,211099,,,,,,,,,,,,0.058558329939842224,,,,,, +36,211149,,,,,,,,,,,,0.06835050135850906,,,,,, +36,211199,,,,,,,,,,,,0.06408801674842834,,,,,, +36,211249,,,,,,,,,,,,0.04948948323726654,,,,,, +36,211299,,,,,,,,,,,,0.06690368056297302,,,,,, +36,211349,,,,,,,,,,,,0.05443577468395233,,,,,, +36,211399,,,,,,,,,,,,0.05849916860461235,,,,,, +36,211449,,,,,,,,,,,,0.0528770387172699,,,,,, +36,211499,,,,,,,,,,,,0.05989876389503479,,,,,, +36,211549,,,,,,,,,,,,0.06369883567094803,,,,,, +36,211599,,,,,,,,,,,,0.05246669054031372,,,,,, +36,211649,,,,,,,,,,,,0.05625182390213013,,,,,, +36,211699,,,,,,,,,,,,0.058319371193647385,,,,,, +36,211749,,,,,,,,,,,,0.06576497107744217,,,,,, +36,211799,,,,,,,,,,,,0.058738768100738525,,,,,, +36,211849,,,,,,,,,,,,0.0647798478603363,,,,,, +36,211899,,,,,,,,,,,,0.06741008162498474,,,,,, +36,211949,,,,,,,,,,,,0.05560445785522461,,,,,, +36,211999,,,,,,,,,,,,0.056461043655872345,,,,,, +36,212049,,,,,,,,,,,,0.05131260305643082,,,,,, +36,212099,,,,,,,,,,,,0.06337997317314148,,,,,, +36,212149,,,,,,,,,,,,0.0686669573187828,,,,,, +36,212199,,,,,,,,,,,,0.07819925248622894,,,,,, +36,212231,,,,,,,,,,,,,0.24338273704051971,0.08377288281917572,0.20239202678203583,-0.016403555870056152,0.2022762894630432,0.08377288281917572 +36,212231,,,,,,,0.20111487805843353,0.05916741490364075,0.5339370965957642,0.2850866913795471,0.5127753019332886,,,,,,, +37,212249,,,,,,,,,,,,0.06605876237154007,,,,,, +37,212299,,,,,,,,,,,,0.060875117778778076,,,,,, +37,212349,,,,,,,,,,,,0.0591592900454998,,,,,, +37,212399,,,,,,,,,,,,0.06433673948049545,,,,,, +37,212449,,,,,,,,,,,,0.05683891475200653,,,,,, +37,212499,,,,,,,,,,,,0.05432593822479248,,,,,, +37,212549,,,,,,,,,,,,0.0571308434009552,,,,,, +37,212599,,,,,,,,,,,,0.04954730346798897,,,,,, +37,212649,,,,,,,,,,,,0.044822610914707184,,,,,, +37,212699,,,,,,,,,,,,0.05274158716201782,,,,,, +37,212749,,,,,,,,,,,,0.06623014807701111,,,,,, +37,212799,,,,,,,,,,,,0.06503099203109741,,,,,, +37,212849,,,,,,,,,,,,0.057120516896247864,,,,,, +37,212899,,,,,,,,,,,,0.05999958515167236,,,,,, +37,212949,,,,,,,,,,,,0.052901506423950195,,,,,, +37,212999,,,,,,,,,,,,0.05717923492193222,,,,,, +37,213049,,,,,,,,,,,,0.05778581276535988,,,,,, +37,213099,,,,,,,,,,,,0.058923348784446716,,,,,, +37,213149,,,,,,,,,,,,0.058918800204992294,,,,,, +37,213199,,,,,,,,,,,,0.06126009672880173,,,,,, +37,213249,,,,,,,,,,,,0.0697624683380127,,,,,, +37,213299,,,,,,,,,,,,0.04912567511200905,,,,,, +37,213349,,,,,,,,,,,,0.060036756098270416,,,,,, +37,213399,,,,,,,,,,,,0.07354071736335754,,,,,, +37,213449,,,,,,,,,,,,0.05505979433655739,,,,,, +37,213499,,,,,,,,,,,,0.06240266561508179,,,,,, +37,213549,,,,,,,,,,,,0.05944792181253433,,,,,, +37,213599,,,,,,,,,,,,0.06565209478139877,,,,,, +37,213649,,,,,,,,,,,,0.0651463195681572,,,,,, +37,213699,,,,,,,,,,,,0.06450803577899933,,,,,, +37,213749,,,,,,,,,,,,0.06066444516181946,,,,,, +37,213799,,,,,,,,,,,,0.06707753986120224,,,,,, +37,213849,,,,,,,,,,,,0.0643959641456604,,,,,, +37,213899,,,,,,,,,,,,0.06298001110553741,,,,,, +37,213949,,,,,,,,,,,,0.0612824484705925,,,,,, +37,213999,,,,,,,,,,,,0.05837155133485794,,,,,, +37,214049,,,,,,,,,,,,0.04885751008987427,,,,,, +37,214099,,,,,,,,,,,,0.045379430055618286,,,,,, +37,214149,,,,,,,,,,,,0.05914855748414993,,,,,, +37,214199,,,,,,,,,,,,0.060957957059144974,,,,,, +37,214249,,,,,,,,,,,,0.06437657028436661,,,,,, +37,214299,,,,,,,,,,,,0.05403336510062218,,,,,, +37,214349,,,,,,,,,,,,0.057503536343574524,,,,,, +37,214399,,,,,,,,,,,,0.047295473515987396,,,,,, +37,214449,,,,,,,,,,,,0.07299019396305084,,,,,, +37,214499,,,,,,,,,,,,0.05008799582719803,,,,,, +37,214549,,,,,,,,,,,,0.04321795701980591,,,,,, +37,214599,,,,,,,,,,,,0.05960029363632202,,,,,, +37,214649,,,,,,,,,,,,0.07007986307144165,,,,,, +37,214699,,,,,,,,,,,,0.07034042477607727,,,,,, +37,214749,,,,,,,,,,,,0.07083074003458023,,,,,, +37,214799,,,,,,,,,,,,0.06455545872449875,,,,,, +37,214849,,,,,,,,,,,,0.06028188392519951,,,,,, +37,214899,,,,,,,,,,,,0.051225729286670685,,,,,, +37,214949,,,,,,,,,,,,0.06719423830509186,,,,,, +37,214999,,,,,,,,,,,,0.058761171996593475,,,,,, +37,215049,,,,,,,,,,,,0.0584857240319252,,,,,, +37,215099,,,,,,,,,,,,0.06005796045064926,,,,,, +37,215149,,,,,,,,,,,,0.05110173299908638,,,,,, +37,215199,,,,,,,,,,,,0.06008902192115784,,,,,, +37,215249,,,,,,,,,,,,0.061566710472106934,,,,,, +37,215299,,,,,,,,,,,,0.07000061124563217,,,,,, +37,215349,,,,,,,,,,,,0.04626169055700302,,,,,, +37,215399,,,,,,,,,,,,0.04960491135716438,,,,,, +37,215449,,,,,,,,,,,,0.06828221678733826,,,,,, +37,215499,,,,,,,,,,,,0.06807498633861542,,,,,, +37,215549,,,,,,,,,,,,0.06304110586643219,,,,,, +37,215599,,,,,,,,,,,,0.05407370626926422,,,,,, +37,215649,,,,,,,,,,,,0.04884849861264229,,,,,, +37,215699,,,,,,,,,,,,0.07363621890544891,,,,,, +37,215749,,,,,,,,,,,,0.06142466142773628,,,,,, +37,215799,,,,,,,,,,,,0.05626481771469116,,,,,, +37,215849,,,,,,,,,,,,0.06357532739639282,,,,,, +37,215899,,,,,,,,,,,,0.058866098523139954,,,,,, +37,215949,,,,,,,,,,,,0.0638735443353653,,,,,, +37,215999,,,,,,,,,,,,0.06043042242527008,,,,,, +37,216049,,,,,,,,,,,,0.05487646162509918,,,,,, +37,216099,,,,,,,,,,,,0.057314682751894,,,,,, +37,216149,,,,,,,,,,,,0.06167216598987579,,,,,, +37,216199,,,,,,,,,,,,0.056715227663517,,,,,, +37,216249,,,,,,,,,,,,0.05397257208824158,,,,,, +37,216299,,,,,,,,,,,,0.07036663591861725,,,,,, +37,216349,,,,,,,,,,,,0.06203295290470123,,,,,, +37,216399,,,,,,,,,,,,0.05344114452600479,,,,,, +37,216449,,,,,,,,,,,,0.050515733659267426,,,,,, +37,216499,,,,,,,,,,,,0.06377577781677246,,,,,, +37,216549,,,,,,,,,,,,0.05317457765340805,,,,,, +37,216599,,,,,,,,,,,,0.05665409192442894,,,,,, +37,216649,,,,,,,,,,,,0.06064603477716446,,,,,, +37,216699,,,,,,,,,,,,0.0667870044708252,,,,,, +37,216749,,,,,,,,,,,,0.05527370423078537,,,,,, +37,216799,,,,,,,,,,,,0.06174243241548538,,,,,, +37,216849,,,,,,,,,,,,0.056222908198833466,,,,,, +37,216899,,,,,,,,,,,,0.08071374893188477,,,,,, +37,216949,,,,,,,,,,,,0.04982902854681015,,,,,, +37,216999,,,,,,,,,,,,0.06227203086018562,,,,,, +37,217049,,,,,,,,,,,,0.060645490884780884,,,,,, +37,217099,,,,,,,,,,,,0.05980644375085831,,,,,, +37,217149,,,,,,,,,,,,0.049319345504045486,,,,,, +37,217199,,,,,,,,,,,,0.07356171309947968,,,,,, +37,217249,,,,,,,,,,,,0.05561215057969093,,,,,, +37,217299,,,,,,,,,,,,0.06852327287197113,,,,,, +37,217349,,,,,,,,,,,,0.04978553205728531,,,,,, +37,217399,,,,,,,,,,,,0.04971323162317276,,,,,, +37,217449,,,,,,,,,,,,0.06330588459968567,,,,,, +37,217499,,,,,,,,,,,,0.06129421666264534,,,,,, +37,217549,,,,,,,,,,,,0.05216505005955696,,,,,, +37,217599,,,,,,,,,,,,0.06341764330863953,,,,,, +37,217649,,,,,,,,,,,,0.060983557254076004,,,,,, +37,217699,,,,,,,,,,,,0.06948322802782059,,,,,, +37,217749,,,,,,,,,,,,0.06512285768985748,,,,,, +37,217799,,,,,,,,,,,,0.054558560252189636,,,,,, +37,217849,,,,,,,,,,,,0.043033771216869354,,,,,, +37,217899,,,,,,,,,,,,0.053510457277297974,,,,,, +37,217949,,,,,,,,,,,,0.05628574639558792,,,,,, +37,217967,,,,,,,,,,,,,0.24257893860340118,0.08302519470453262,0.20417027175426483,-0.007331967353820801,0.2041463404893875,0.08302519470453262 +37,217967,,,,,,,0.2009710669517517,0.05905997008085251,0.5351523756980896,0.2863805294036865,0.5139638185501099,,,,,,, +38,217999,,,,,,,,,,,,0.05076472833752632,,,,,, +38,218049,,,,,,,,,,,,0.05858622118830681,,,,,, +38,218099,,,,,,,,,,,,0.06982394307851791,,,,,, +38,218149,,,,,,,,,,,,0.05322705954313278,,,,,, +38,218199,,,,,,,,,,,,0.05348016321659088,,,,,, +38,218249,,,,,,,,,,,,0.05276418849825859,,,,,, +38,218299,,,,,,,,,,,,0.05575171113014221,,,,,, +38,218349,,,,,,,,,,,,0.05583181977272034,,,,,, +38,218399,,,,,,,,,,,,0.053135618567466736,,,,,, +38,218449,,,,,,,,,,,,0.0598633773624897,,,,,, +38,218499,,,,,,,,,,,,0.06457476317882538,,,,,, +38,218549,,,,,,,,,,,,0.051859159022569656,,,,,, +38,218599,,,,,,,,,,,,0.0562429316341877,,,,,, +38,218649,,,,,,,,,,,,0.06944157928228378,,,,,, +38,218699,,,,,,,,,,,,0.06404814124107361,,,,,, +38,218749,,,,,,,,,,,,0.05670807883143425,,,,,, +38,218799,,,,,,,,,,,,0.06437008082866669,,,,,, +38,218849,,,,,,,,,,,,0.05147950351238251,,,,,, +38,218899,,,,,,,,,,,,0.04945528507232666,,,,,, +38,218949,,,,,,,,,,,,0.057059578597545624,,,,,, +38,218999,,,,,,,,,,,,0.05212774872779846,,,,,, +38,219049,,,,,,,,,,,,0.07156061381101608,,,,,, +38,219099,,,,,,,,,,,,0.05133083462715149,,,,,, +38,219149,,,,,,,,,,,,0.051671117544174194,,,,,, +38,219199,,,,,,,,,,,,0.06344926357269287,,,,,, +38,219249,,,,,,,,,,,,0.05654646456241608,,,,,, +38,219299,,,,,,,,,,,,0.06931719183921814,,,,,, +38,219349,,,,,,,,,,,,0.06407720595598221,,,,,, +38,219399,,,,,,,,,,,,0.07525618374347687,,,,,, +38,219449,,,,,,,,,,,,0.059342533349990845,,,,,, +38,219499,,,,,,,,,,,,0.06314857304096222,,,,,, +38,219549,,,,,,,,,,,,0.05610201880335808,,,,,, +38,219599,,,,,,,,,,,,0.04911656677722931,,,,,, +38,219649,,,,,,,,,,,,0.05909622460603714,,,,,, +38,219699,,,,,,,,,,,,0.05807860195636749,,,,,, +38,219749,,,,,,,,,,,,0.056497134268283844,,,,,, +38,219799,,,,,,,,,,,,0.05724526196718216,,,,,, +38,219849,,,,,,,,,,,,0.06422364711761475,,,,,, +38,219899,,,,,,,,,,,,0.06373535841703415,,,,,, +38,219949,,,,,,,,,,,,0.05811017006635666,,,,,, +38,219999,,,,,,,,,,,,0.06218443438410759,,,,,, +38,220049,,,,,,,,,,,,0.05575919896364212,,,,,, +38,220099,,,,,,,,,,,,0.05584309622645378,,,,,, +38,220149,,,,,,,,,,,,0.0667637437582016,,,,,, +38,220199,,,,,,,,,,,,0.055324964225292206,,,,,, +38,220249,,,,,,,,,,,,0.06842565536499023,,,,,, +38,220299,,,,,,,,,,,,0.05846260488033295,,,,,, +38,220349,,,,,,,,,,,,0.0681975930929184,,,,,, +38,220399,,,,,,,,,,,,0.05248405039310455,,,,,, +38,220449,,,,,,,,,,,,0.06118538975715637,,,,,, +38,220499,,,,,,,,,,,,0.049612440168857574,,,,,, +38,220549,,,,,,,,,,,,0.059510186314582825,,,,,, +38,220599,,,,,,,,,,,,0.05867602303624153,,,,,, +38,220649,,,,,,,,,,,,0.06427931785583496,,,,,, +38,220699,,,,,,,,,,,,0.06255121529102325,,,,,, +38,220749,,,,,,,,,,,,0.06373703479766846,,,,,, +38,220799,,,,,,,,,,,,0.049704305827617645,,,,,, +38,220849,,,,,,,,,,,,0.07051271200180054,,,,,, +38,220899,,,,,,,,,,,,0.05581309646368027,,,,,, +38,220949,,,,,,,,,,,,0.06329482048749924,,,,,, +38,220999,,,,,,,,,,,,0.059166282415390015,,,,,, +38,221049,,,,,,,,,,,,0.05445961654186249,,,,,, +38,221099,,,,,,,,,,,,0.04899192601442337,,,,,, +38,221149,,,,,,,,,,,,0.062172889709472656,,,,,, +38,221199,,,,,,,,,,,,0.049451980739831924,,,,,, +38,221249,,,,,,,,,,,,0.05724887549877167,,,,,, +38,221299,,,,,,,,,,,,0.051366060972213745,,,,,, +38,221349,,,,,,,,,,,,0.05654660239815712,,,,,, +38,221399,,,,,,,,,,,,0.05488954484462738,,,,,, +38,221449,,,,,,,,,,,,0.05333375558257103,,,,,, +38,221499,,,,,,,,,,,,0.06296899914741516,,,,,, +38,221549,,,,,,,,,,,,0.057318754494190216,,,,,, +38,221599,,,,,,,,,,,,0.06611278653144836,,,,,, +38,221649,,,,,,,,,,,,0.0610685795545578,,,,,, +38,221699,,,,,,,,,,,,0.060181763023138046,,,,,, +38,221749,,,,,,,,,,,,0.05874430760741234,,,,,, +38,221799,,,,,,,,,,,,0.052713409066200256,,,,,, +38,221849,,,,,,,,,,,,0.05666691064834595,,,,,, +38,221899,,,,,,,,,,,,0.06160404160618782,,,,,, +38,221949,,,,,,,,,,,,0.055078573524951935,,,,,, +38,221999,,,,,,,,,,,,0.04818444326519966,,,,,, +38,222049,,,,,,,,,,,,0.06854109466075897,,,,,, +38,222099,,,,,,,,,,,,0.05529756844043732,,,,,, +38,222149,,,,,,,,,,,,0.049465157091617584,,,,,, +38,222199,,,,,,,,,,,,0.05509618669748306,,,,,, +38,222249,,,,,,,,,,,,0.05716384947299957,,,,,, +38,222299,,,,,,,,,,,,0.06746852397918701,,,,,, +38,222349,,,,,,,,,,,,0.052702222019433975,,,,,, +38,222399,,,,,,,,,,,,0.06467787176370621,,,,,, +38,222449,,,,,,,,,,,,0.055986352264881134,,,,,, +38,222499,,,,,,,,,,,,0.054335810244083405,,,,,, +38,222549,,,,,,,,,,,,0.06748582422733307,,,,,, +38,222599,,,,,,,,,,,,0.045644111931324005,,,,,, +38,222649,,,,,,,,,,,,0.056403014808893204,,,,,, +38,222699,,,,,,,,,,,,0.06566056609153748,,,,,, +38,222749,,,,,,,,,,,,0.06473210453987122,,,,,, +38,222799,,,,,,,,,,,,0.059492968022823334,,,,,, +38,222849,,,,,,,,,,,,0.055926114320755005,,,,,, +38,222899,,,,,,,,,,,,0.05374486744403839,,,,,, +38,222949,,,,,,,,,,,,0.057467762380838394,,,,,, +38,222999,,,,,,,,,,,,0.05057107284665108,,,,,, +38,223049,,,,,,,,,,,,0.05454915761947632,,,,,, +38,223099,,,,,,,,,,,,0.06526806950569153,,,,,, +38,223149,,,,,,,,,,,,0.06496983766555786,,,,,, +38,223199,,,,,,,,,,,,0.05463045835494995,,,,,, +38,223249,,,,,,,,,,,,0.06763908267021179,,,,,, +38,223299,,,,,,,,,,,,0.057968318462371826,,,,,, +38,223349,,,,,,,,,,,,0.0545613095164299,,,,,, +38,223399,,,,,,,,,,,,0.06000581383705139,,,,,, +38,223449,,,,,,,,,,,,0.055397313088178635,,,,,, +38,223499,,,,,,,,,,,,0.058949027210474014,,,,,, +38,223549,,,,,,,,,,,,0.04715931788086891,,,,,, +38,223599,,,,,,,,,,,,0.048291370272636414,,,,,, +38,223649,,,,,,,,,,,,0.056758396327495575,,,,,, +38,223699,,,,,,,,,,,,0.05998815596103668,,,,,, +38,223703,,,,,,,,,,,,,0.24332688748836517,0.08323134481906891,0.1976129412651062,-0.009833216667175293,0.1964763104915619,0.08323134481906891 +38,223703,,,,,,,0.20088523626327515,0.05903097242116928,0.5354782342910767,0.28673988580703735,0.5145949125289917,,,,,,, +39,223749,,,,,,,,,,,,0.06358274817466736,,,,,, +39,223799,,,,,,,,,,,,0.05831129476428032,,,,,, +39,223849,,,,,,,,,,,,0.055090293288230896,,,,,, +39,223899,,,,,,,,,,,,0.06543149054050446,,,,,, +39,223949,,,,,,,,,,,,0.06589396297931671,,,,,, +39,223999,,,,,,,,,,,,0.056653983891010284,,,,,, +39,224049,,,,,,,,,,,,0.07363386452198029,,,,,, +39,224099,,,,,,,,,,,,0.05965356528759003,,,,,, +39,224149,,,,,,,,,,,,0.06045825779438019,,,,,, +39,224199,,,,,,,,,,,,0.054386816918849945,,,,,, +39,224249,,,,,,,,,,,,0.05711290240287781,,,,,, +39,224299,,,,,,,,,,,,0.05581626668572426,,,,,, +39,224349,,,,,,,,,,,,0.06275102496147156,,,,,, +39,224399,,,,,,,,,,,,0.0667610615491867,,,,,, +39,224449,,,,,,,,,,,,0.04788194224238396,,,,,, +39,224499,,,,,,,,,,,,0.061410196125507355,,,,,, +39,224549,,,,,,,,,,,,0.05684724822640419,,,,,, +39,224599,,,,,,,,,,,,0.05768829584121704,,,,,, +39,224649,,,,,,,,,,,,0.0631512701511383,,,,,, +39,224699,,,,,,,,,,,,0.06211455538868904,,,,,, +39,224749,,,,,,,,,,,,0.05493205040693283,,,,,, +39,224799,,,,,,,,,,,,0.05267816781997681,,,,,, +39,224849,,,,,,,,,,,,0.06743080914020538,,,,,, +39,224899,,,,,,,,,,,,0.06477965414524078,,,,,, +39,224949,,,,,,,,,,,,0.061318375170230865,,,,,, +39,224999,,,,,,,,,,,,0.06803185492753983,,,,,, +39,225049,,,,,,,,,,,,0.062359556555747986,,,,,, +39,225099,,,,,,,,,,,,0.06371097266674042,,,,,, +39,225149,,,,,,,,,,,,0.062155090272426605,,,,,, +39,225199,,,,,,,,,,,,0.05388547107577324,,,,,, +39,225249,,,,,,,,,,,,0.06595933437347412,,,,,, +39,225299,,,,,,,,,,,,0.06396970897912979,,,,,, +39,225349,,,,,,,,,,,,0.07200755923986435,,,,,, +39,225399,,,,,,,,,,,,0.053002696484327316,,,,,, +39,225449,,,,,,,,,,,,0.05698668211698532,,,,,, +39,225499,,,,,,,,,,,,0.054905205965042114,,,,,, +39,225549,,,,,,,,,,,,0.05449704825878143,,,,,, +39,225599,,,,,,,,,,,,0.05247236043214798,,,,,, +39,225649,,,,,,,,,,,,0.06180015206336975,,,,,, +39,225699,,,,,,,,,,,,0.06307521462440491,,,,,, +39,225749,,,,,,,,,,,,0.060308389365673065,,,,,, +39,225799,,,,,,,,,,,,0.055082112550735474,,,,,, +39,225849,,,,,,,,,,,,0.06179171800613403,,,,,, +39,225899,,,,,,,,,,,,0.05522749572992325,,,,,, +39,225949,,,,,,,,,,,,0.04547939449548721,,,,,, +39,225999,,,,,,,,,,,,0.052390627562999725,,,,,, +39,226049,,,,,,,,,,,,0.0607379786670208,,,,,, +39,226099,,,,,,,,,,,,0.048008646816015244,,,,,, +39,226149,,,,,,,,,,,,0.057089664041996,,,,,, +39,226199,,,,,,,,,,,,0.04882175102829933,,,,,, +39,226249,,,,,,,,,,,,0.05642314255237579,,,,,, +39,226299,,,,,,,,,,,,0.06178959086537361,,,,,, +39,226349,,,,,,,,,,,,0.06871359795331955,,,,,, +39,226399,,,,,,,,,,,,0.046365223824977875,,,,,, +39,226449,,,,,,,,,,,,0.07318910956382751,,,,,, +39,226499,,,,,,,,,,,,0.05194295942783356,,,,,, +39,226549,,,,,,,,,,,,0.051678866147994995,,,,,, +39,226599,,,,,,,,,,,,0.05942673981189728,,,,,, +39,226649,,,,,,,,,,,,0.054497748613357544,,,,,, +39,226699,,,,,,,,,,,,0.05842102691531181,,,,,, +39,226749,,,,,,,,,,,,0.05936935544013977,,,,,, +39,226799,,,,,,,,,,,,0.054366253316402435,,,,,, +39,226849,,,,,,,,,,,,0.05546186864376068,,,,,, +39,226899,,,,,,,,,,,,0.05354706943035126,,,,,, +39,226949,,,,,,,,,,,,0.04507259279489517,,,,,, +39,226999,,,,,,,,,,,,0.05557683855295181,,,,,, +39,227049,,,,,,,,,,,,0.056894149631261826,,,,,, +39,227099,,,,,,,,,,,,0.045824889093637466,,,,,, +39,227149,,,,,,,,,,,,0.05141673982143402,,,,,, +39,227199,,,,,,,,,,,,0.05400043725967407,,,,,, +39,227249,,,,,,,,,,,,0.0612512081861496,,,,,, +39,227299,,,,,,,,,,,,0.05190768092870712,,,,,, +39,227349,,,,,,,,,,,,0.05953745171427727,,,,,, +39,227399,,,,,,,,,,,,0.06841340661048889,,,,,, +39,227449,,,,,,,,,,,,0.06083133816719055,,,,,, +39,227499,,,,,,,,,,,,0.061248693615198135,,,,,, +39,227549,,,,,,,,,,,,0.06073408201336861,,,,,, +39,227599,,,,,,,,,,,,0.051974982023239136,,,,,, +39,227649,,,,,,,,,,,,0.06846915185451508,,,,,, +39,227699,,,,,,,,,,,,0.04997718334197998,,,,,, +39,227749,,,,,,,,,,,,0.06020359694957733,,,,,, +39,227799,,,,,,,,,,,,0.05598901957273483,,,,,, +39,227849,,,,,,,,,,,,0.05554799363017082,,,,,, +39,227899,,,,,,,,,,,,0.06507569551467896,,,,,, +39,227949,,,,,,,,,,,,0.06565060466527939,,,,,, +39,227999,,,,,,,,,,,,0.05535139888525009,,,,,, +39,228049,,,,,,,,,,,,0.07224217057228088,,,,,, +39,228099,,,,,,,,,,,,0.05387894809246063,,,,,, +39,228149,,,,,,,,,,,,0.051613856106996536,,,,,, +39,228199,,,,,,,,,,,,0.05317522585391998,,,,,, +39,228249,,,,,,,,,,,,0.06263316422700882,,,,,, +39,228299,,,,,,,,,,,,0.050292808562517166,,,,,, +39,228349,,,,,,,,,,,,0.06247309222817421,,,,,, +39,228399,,,,,,,,,,,,0.05862145498394966,,,,,, +39,228449,,,,,,,,,,,,0.06207602471113205,,,,,, +39,228499,,,,,,,,,,,,0.0661027729511261,,,,,, +39,228549,,,,,,,,,,,,0.06695026159286499,,,,,, +39,228599,,,,,,,,,,,,0.05427944287657738,,,,,, +39,228649,,,,,,,,,,,,0.05252773314714432,,,,,, +39,228699,,,,,,,,,,,,0.06327217072248459,,,,,, +39,228749,,,,,,,,,,,,0.0634583979845047,,,,,, +39,228799,,,,,,,,,,,,0.06863203644752502,,,,,, +39,228849,,,,,,,,,,,,0.05518486350774765,,,,,, +39,228899,,,,,,,,,,,,0.05830372869968414,,,,,, +39,228949,,,,,,,,,,,,0.06377684324979782,,,,,, +39,228999,,,,,,,,,,,,0.06553984433412552,,,,,, +39,229049,,,,,,,,,,,,0.06028922647237778,,,,,, +39,229099,,,,,,,,,,,,0.060214877128601074,,,,,, +39,229149,,,,,,,,,,,,0.06202268600463867,,,,,, +39,229199,,,,,,,,,,,,0.06430594623088837,,,,,, +39,229249,,,,,,,,,,,,0.05467899516224861,,,,,, +39,229299,,,,,,,,,,,,0.05610175430774689,,,,,, +39,229349,,,,,,,,,,,,0.05814094468951225,,,,,, +39,229399,,,,,,,,,,,,0.06309138238430023,,,,,, +39,229439,,,,,,,,,,,,,0.24349148571491241,0.08376066386699677,0.20511384308338165,-0.01625525951385498,0.20505547523498535,0.08376066386699677 +39,229439,,,,,,,0.20068849623203278,0.058930542320013046,0.5366118550300598,0.28794461488723755,0.5157341361045837,,,,,,, +40,229449,,,,,,,,,,,,0.05448295921087265,,,,,, +40,229499,,,,,,,,,,,,0.06802910566329956,,,,,, +40,229549,,,,,,,,,,,,0.06278716772794724,,,,,, +40,229599,,,,,,,,,,,,0.05827544257044792,,,,,, +40,229649,,,,,,,,,,,,0.05825987458229065,,,,,, +40,229699,,,,,,,,,,,,0.05938463285565376,,,,,, +40,229749,,,,,,,,,,,,0.06298555433750153,,,,,, +40,229799,,,,,,,,,,,,0.06385338306427002,,,,,, +40,229849,,,,,,,,,,,,0.055034536868333817,,,,,, +40,229899,,,,,,,,,,,,0.05321522802114487,,,,,, +40,229949,,,,,,,,,,,,0.06192167475819588,,,,,, +40,229999,,,,,,,,,,,,0.06301039457321167,,,,,, +40,230049,,,,,,,,,,,,0.07772839814424515,,,,,, +40,230099,,,,,,,,,,,,0.059406980872154236,,,,,, +40,230149,,,,,,,,,,,,0.06294475495815277,,,,,, +40,230199,,,,,,,,,,,,0.06645502150058746,,,,,, +40,230249,,,,,,,,,,,,0.05997728556394577,,,,,, +40,230299,,,,,,,,,,,,0.05583548918366432,,,,,, +40,230349,,,,,,,,,,,,0.062368523329496384,,,,,, +40,230399,,,,,,,,,,,,0.05631274729967117,,,,,, +40,230449,,,,,,,,,,,,0.057542383670806885,,,,,, +40,230499,,,,,,,,,,,,0.05808171629905701,,,,,, +40,230549,,,,,,,,,,,,0.04841580241918564,,,,,, +40,230599,,,,,,,,,,,,0.05733809247612953,,,,,, +40,230649,,,,,,,,,,,,0.06225244700908661,,,,,, +40,230699,,,,,,,,,,,,0.061629459261894226,,,,,, +40,230749,,,,,,,,,,,,0.06815968453884125,,,,,, +40,230799,,,,,,,,,,,,0.06783503293991089,,,,,, +40,230849,,,,,,,,,,,,0.04825367033481598,,,,,, +40,230899,,,,,,,,,,,,0.05493737757205963,,,,,, +40,230949,,,,,,,,,,,,0.06229723244905472,,,,,, +40,230999,,,,,,,,,,,,0.06372138857841492,,,,,, +40,231049,,,,,,,,,,,,0.0595659464597702,,,,,, +40,231099,,,,,,,,,,,,0.057667702436447144,,,,,, +40,231149,,,,,,,,,,,,0.058724984526634216,,,,,, +40,231199,,,,,,,,,,,,0.05697114020586014,,,,,, +40,231249,,,,,,,,,,,,0.04850683733820915,,,,,, +40,231299,,,,,,,,,,,,0.05426595360040665,,,,,, +40,231349,,,,,,,,,,,,0.04761089012026787,,,,,, +40,231399,,,,,,,,,,,,0.06284783780574799,,,,,, +40,231449,,,,,,,,,,,,0.05822722613811493,,,,,, +40,231499,,,,,,,,,,,,0.045782022178173065,,,,,, +40,231549,,,,,,,,,,,,0.05872134864330292,,,,,, +40,231599,,,,,,,,,,,,0.06043189764022827,,,,,, +40,231649,,,,,,,,,,,,0.06489941477775574,,,,,, +40,231699,,,,,,,,,,,,0.06189272925257683,,,,,, +40,231749,,,,,,,,,,,,0.05629553273320198,,,,,, +40,231799,,,,,,,,,,,,0.05532412230968475,,,,,, +40,231849,,,,,,,,,,,,0.06426559388637543,,,,,, +40,231899,,,,,,,,,,,,0.06492500007152557,,,,,, +40,231949,,,,,,,,,,,,0.0487222857773304,,,,,, +40,231999,,,,,,,,,,,,0.06296326965093613,,,,,, +40,232049,,,,,,,,,,,,0.06120975315570831,,,,,, +40,232099,,,,,,,,,,,,0.05383647233247757,,,,,, +40,232149,,,,,,,,,,,,0.0483756884932518,,,,,, +40,232199,,,,,,,,,,,,0.05956254154443741,,,,,, +40,232249,,,,,,,,,,,,0.05817604809999466,,,,,, +40,232299,,,,,,,,,,,,0.05623195692896843,,,,,, +40,232349,,,,,,,,,,,,0.0582243949174881,,,,,, +40,232399,,,,,,,,,,,,0.06879135966300964,,,,,, +40,232449,,,,,,,,,,,,0.05209541693329811,,,,,, +40,232499,,,,,,,,,,,,0.05887627974152565,,,,,, +40,232549,,,,,,,,,,,,0.06487532705068588,,,,,, +40,232599,,,,,,,,,,,,0.06357651948928833,,,,,, +40,232649,,,,,,,,,,,,0.06730268150568008,,,,,, +40,232699,,,,,,,,,,,,0.06552691012620926,,,,,, +40,232749,,,,,,,,,,,,0.06473429501056671,,,,,, +40,232799,,,,,,,,,,,,0.05726499855518341,,,,,, +40,232849,,,,,,,,,,,,0.06152431666851044,,,,,, +40,232899,,,,,,,,,,,,0.06335078179836273,,,,,, +40,232949,,,,,,,,,,,,0.05739174783229828,,,,,, +40,232999,,,,,,,,,,,,0.03875092789530754,,,,,, +40,233049,,,,,,,,,,,,0.05521067976951599,,,,,, +40,233099,,,,,,,,,,,,0.053300321102142334,,,,,, +40,233149,,,,,,,,,,,,0.06071408465504646,,,,,, +40,233199,,,,,,,,,,,,0.06209588050842285,,,,,, +40,233249,,,,,,,,,,,,0.060398168861866,,,,,, +40,233299,,,,,,,,,,,,0.055520929396152496,,,,,, +40,233349,,,,,,,,,,,,0.04712757468223572,,,,,, +40,233399,,,,,,,,,,,,0.055085889995098114,,,,,, +40,233449,,,,,,,,,,,,0.054567135870456696,,,,,, +40,233499,,,,,,,,,,,,0.06092294678092003,,,,,, +40,233549,,,,,,,,,,,,0.06063571572303772,,,,,, +40,233599,,,,,,,,,,,,0.05816316604614258,,,,,, +40,233649,,,,,,,,,,,,0.05418427288532257,,,,,, +40,233699,,,,,,,,,,,,0.06186901032924652,,,,,, +40,233749,,,,,,,,,,,,0.05516212433576584,,,,,, +40,233799,,,,,,,,,,,,0.05618930608034134,,,,,, +40,233849,,,,,,,,,,,,0.049400169402360916,,,,,, +40,233899,,,,,,,,,,,,0.06526404619216919,,,,,, +40,233949,,,,,,,,,,,,0.06512673199176788,,,,,, +40,233999,,,,,,,,,,,,0.06538601219654083,,,,,, +40,234049,,,,,,,,,,,,0.06499169021844864,,,,,, +40,234099,,,,,,,,,,,,0.06568561494350433,,,,,, +40,234149,,,,,,,,,,,,0.06531580537557602,,,,,, +40,234199,,,,,,,,,,,,0.06333339214324951,,,,,, +40,234249,,,,,,,,,,,,0.06333900988101959,,,,,, +40,234299,,,,,,,,,,,,0.06496179103851318,,,,,, +40,234349,,,,,,,,,,,,0.052805181592702866,,,,,, +40,234399,,,,,,,,,,,,0.0548916794359684,,,,,, +40,234449,,,,,,,,,,,,0.0624835342168808,,,,,, +40,234499,,,,,,,,,,,,0.056261658668518066,,,,,, +40,234549,,,,,,,,,,,,0.04027579724788666,,,,,, +40,234599,,,,,,,,,,,,0.06527721136808395,,,,,, +40,234649,,,,,,,,,,,,0.06135499104857445,,,,,, +40,234699,,,,,,,,,,,,0.05753597989678383,,,,,, +40,234749,,,,,,,,,,,,0.060360535979270935,,,,,, +40,234799,,,,,,,,,,,,0.05828133225440979,,,,,, +40,234849,,,,,,,,,,,,0.06176023930311203,,,,,, +40,234899,,,,,,,,,,,,0.058497101068496704,,,,,, +40,234949,,,,,,,,,,,,0.057825278490781784,,,,,, +40,234999,,,,,,,,,,,,0.05154386907815933,,,,,, +40,235049,,,,,,,,,,,,0.0578981414437294,,,,,, +40,235099,,,,,,,,,,,,0.04884541779756546,,,,,, +40,235149,,,,,,,,,,,,0.058801159262657166,,,,,, +40,235175,,,,,,,,,,,,,0.24356888234615326,0.08344420045614243,0.19440822303295135,-0.012415647506713867,0.19450175762176514,0.08344420045614243 +40,235175,,,,,,,0.20063619315624237,0.05893327668309212,0.5365796089172363,0.28791648149490356,0.5154696702957153,,,,,,, +41,235199,,,,,,,,,,,,0.05728019401431084,,,,,, +41,235249,,,,,,,,,,,,0.06041927635669708,,,,,, +41,235299,,,,,,,,,,,,0.06265272200107574,,,,,, +41,235349,,,,,,,,,,,,0.049405355006456375,,,,,, +41,235399,,,,,,,,,,,,0.05949437990784645,,,,,, +41,235449,,,,,,,,,,,,0.053128644824028015,,,,,, +41,235499,,,,,,,,,,,,0.05579477548599243,,,,,, +41,235549,,,,,,,,,,,,0.05906752869486809,,,,,, +41,235599,,,,,,,,,,,,0.0454808808863163,,,,,, +41,235649,,,,,,,,,,,,0.061623912304639816,,,,,, +41,235699,,,,,,,,,,,,0.06858296692371368,,,,,, +41,235749,,,,,,,,,,,,0.06269097328186035,,,,,, +41,235799,,,,,,,,,,,,0.056589819490909576,,,,,, +41,235849,,,,,,,,,,,,0.04834986850619316,,,,,, +41,235899,,,,,,,,,,,,0.0632905662059784,,,,,, +41,235949,,,,,,,,,,,,0.05475665628910065,,,,,, +41,235999,,,,,,,,,,,,0.06453743577003479,,,,,, +41,236049,,,,,,,,,,,,0.0527200922369957,,,,,, +41,236099,,,,,,,,,,,,0.06256482005119324,,,,,, +41,236149,,,,,,,,,,,,0.0729677751660347,,,,,, +41,236199,,,,,,,,,,,,0.05197165161371231,,,,,, +41,236249,,,,,,,,,,,,0.05329591780900955,,,,,, +41,236299,,,,,,,,,,,,0.0595712848007679,,,,,, +41,236349,,,,,,,,,,,,0.06570299714803696,,,,,, +41,236399,,,,,,,,,,,,0.049466632306575775,,,,,, +41,236449,,,,,,,,,,,,0.06030260771512985,,,,,, +41,236499,,,,,,,,,,,,0.06048540771007538,,,,,, +41,236549,,,,,,,,,,,,0.07077161967754364,,,,,, +41,236599,,,,,,,,,,,,0.05754213035106659,,,,,, +41,236649,,,,,,,,,,,,0.053545184433460236,,,,,, +41,236699,,,,,,,,,,,,0.061229605227708817,,,,,, +41,236749,,,,,,,,,,,,0.05354192107915878,,,,,, +41,236799,,,,,,,,,,,,0.054670028388500214,,,,,, +41,236849,,,,,,,,,,,,0.05916072800755501,,,,,, +41,236899,,,,,,,,,,,,0.06370460242033005,,,,,, +41,236949,,,,,,,,,,,,0.05818469077348709,,,,,, +41,236999,,,,,,,,,,,,0.05540943890810013,,,,,, +41,237049,,,,,,,,,,,,0.05922604352235794,,,,,, +41,237099,,,,,,,,,,,,0.060298509895801544,,,,,, +41,237149,,,,,,,,,,,,0.0517752431333065,,,,,, +41,237199,,,,,,,,,,,,0.059721387922763824,,,,,, +41,237249,,,,,,,,,,,,0.04722665250301361,,,,,, +41,237299,,,,,,,,,,,,0.05538729205727577,,,,,, +41,237349,,,,,,,,,,,,0.07452649623155594,,,,,, +41,237399,,,,,,,,,,,,0.05395931005477905,,,,,, +41,237449,,,,,,,,,,,,0.05795305222272873,,,,,, +41,237499,,,,,,,,,,,,0.05952009931206703,,,,,, +41,237549,,,,,,,,,,,,0.055489469319581985,,,,,, +41,237599,,,,,,,,,,,,0.060653701424598694,,,,,, +41,237649,,,,,,,,,,,,0.05220417305827141,,,,,, +41,237699,,,,,,,,,,,,0.05028091371059418,,,,,, +41,237749,,,,,,,,,,,,0.046739362180233,,,,,, +41,237799,,,,,,,,,,,,0.05700952559709549,,,,,, +41,237849,,,,,,,,,,,,0.05753185600042343,,,,,, +41,237899,,,,,,,,,,,,0.06103168800473213,,,,,, +41,237949,,,,,,,,,,,,0.056224972009658813,,,,,, +41,237999,,,,,,,,,,,,0.06275150924921036,,,,,, +41,238049,,,,,,,,,,,,0.0672798603773117,,,,,, +41,238099,,,,,,,,,,,,0.06343330442905426,,,,,, +41,238149,,,,,,,,,,,,0.051011864095926285,,,,,, +41,238199,,,,,,,,,,,,0.058130115270614624,,,,,, +41,238249,,,,,,,,,,,,0.0514024943113327,,,,,, +41,238299,,,,,,,,,,,,0.06631375849246979,,,,,, +41,238349,,,,,,,,,,,,0.0576951839029789,,,,,, +41,238399,,,,,,,,,,,,0.058535486459732056,,,,,, +41,238449,,,,,,,,,,,,0.054603952914476395,,,,,, +41,238499,,,,,,,,,,,,0.051110416650772095,,,,,, +41,238549,,,,,,,,,,,,0.06481776386499405,,,,,, +41,238599,,,,,,,,,,,,0.04477982968091965,,,,,, +41,238649,,,,,,,,,,,,0.054186634719371796,,,,,, +41,238699,,,,,,,,,,,,0.05373898521065712,,,,,, +41,238749,,,,,,,,,,,,0.0631013810634613,,,,,, +41,238799,,,,,,,,,,,,0.06047474965453148,,,,,, +41,238849,,,,,,,,,,,,0.05612017586827278,,,,,, +41,238899,,,,,,,,,,,,0.06315702199935913,,,,,, +41,238949,,,,,,,,,,,,0.07004603743553162,,,,,, +41,238999,,,,,,,,,,,,0.05596594512462616,,,,,, +41,239049,,,,,,,,,,,,0.06719902157783508,,,,,, +41,239099,,,,,,,,,,,,0.05815098434686661,,,,,, +41,239149,,,,,,,,,,,,0.052909206598997116,,,,,, +41,239199,,,,,,,,,,,,0.055214643478393555,,,,,, +41,239249,,,,,,,,,,,,0.06684765219688416,,,,,, +41,239299,,,,,,,,,,,,0.05312708020210266,,,,,, +41,239349,,,,,,,,,,,,0.05362153425812721,,,,,, +41,239399,,,,,,,,,,,,0.062475111335515976,,,,,, +41,239449,,,,,,,,,,,,0.0520893856883049,,,,,, +41,239499,,,,,,,,,,,,0.052380383014678955,,,,,, +41,239549,,,,,,,,,,,,0.055872637778520584,,,,,, +41,239599,,,,,,,,,,,,0.05994061380624771,,,,,, +41,239649,,,,,,,,,,,,0.06229720264673233,,,,,, +41,239699,,,,,,,,,,,,0.0517638698220253,,,,,, +41,239749,,,,,,,,,,,,0.0564691424369812,,,,,, +41,239799,,,,,,,,,,,,0.06533097475767136,,,,,, +41,239849,,,,,,,,,,,,0.05953698605298996,,,,,, +41,239899,,,,,,,,,,,,0.06810669600963593,,,,,, +41,239949,,,,,,,,,,,,0.0628347098827362,,,,,, +41,239999,,,,,,,,,,,,0.050949279218912125,,,,,, +41,240049,,,,,,,,,,,,0.06698451191186905,,,,,, +41,240099,,,,,,,,,,,,0.0674000084400177,,,,,, +41,240149,,,,,,,,,,,,0.06821392476558685,,,,,, +41,240199,,,,,,,,,,,,0.07441310584545135,,,,,, +41,240249,,,,,,,,,,,,0.05456377565860748,,,,,, +41,240299,,,,,,,,,,,,0.052355095744132996,,,,,, +41,240349,,,,,,,,,,,,0.05919186398386955,,,,,, +41,240399,,,,,,,,,,,,0.05415251851081848,,,,,, +41,240449,,,,,,,,,,,,0.06109068542718887,,,,,, +41,240499,,,,,,,,,,,,0.059339769184589386,,,,,, +41,240549,,,,,,,,,,,,0.05048869177699089,,,,,, +41,240599,,,,,,,,,,,,0.05954428017139435,,,,,, +41,240649,,,,,,,,,,,,0.05904718488454819,,,,,, +41,240699,,,,,,,,,,,,0.06538000702857971,,,,,, +41,240749,,,,,,,,,,,,0.05196463316679001,,,,,, +41,240799,,,,,,,,,,,,0.06468484550714493,,,,,, +41,240849,,,,,,,,,,,,0.05712492763996124,,,,,, +41,240899,,,,,,,,,,,,0.06476078927516937,,,,,, +41,240911,,,,,,,,,,,,,0.243573859333992,0.08373632282018661,0.1975838840007782,-0.015959978103637695,0.19746242463588715,0.08373632282018661 +41,240911,,,,,,,0.20052966475486755,0.0588642880320549,0.5373560190200806,0.2887488007545471,0.5164503455162048,,,,,,, +42,240949,,,,,,,,,,,,0.06595339626073837,,,,,, +42,240999,,,,,,,,,,,,0.06479443609714508,,,,,, +42,241049,,,,,,,,,,,,0.05585255101323128,,,,,, +42,241099,,,,,,,,,,,,0.0503791868686676,,,,,, +42,241149,,,,,,,,,,,,0.05376620963215828,,,,,, +42,241199,,,,,,,,,,,,0.05727594345808029,,,,,, +42,241249,,,,,,,,,,,,0.0565364733338356,,,,,, +42,241299,,,,,,,,,,,,0.05728040635585785,,,,,, +42,241349,,,,,,,,,,,,0.05043139308691025,,,,,, +42,241399,,,,,,,,,,,,0.06729713827371597,,,,,, +42,241449,,,,,,,,,,,,0.05641552805900574,,,,,, +42,241499,,,,,,,,,,,,0.051362235099077225,,,,,, +42,241549,,,,,,,,,,,,0.06424902379512787,,,,,, +42,241599,,,,,,,,,,,,0.056242138147354126,,,,,, +42,241649,,,,,,,,,,,,0.056616272777318954,,,,,, +42,241699,,,,,,,,,,,,0.05442267283797264,,,,,, +42,241749,,,,,,,,,,,,0.06128080189228058,,,,,, +42,241799,,,,,,,,,,,,0.057098567485809326,,,,,, +42,241849,,,,,,,,,,,,0.05891452357172966,,,,,, +42,241899,,,,,,,,,,,,0.06310400366783142,,,,,, +42,241949,,,,,,,,,,,,0.06562872231006622,,,,,, +42,241999,,,,,,,,,,,,0.05466153845191002,,,,,, +42,242049,,,,,,,,,,,,0.04767674207687378,,,,,, +42,242099,,,,,,,,,,,,0.06435701251029968,,,,,, +42,242149,,,,,,,,,,,,0.05431416258215904,,,,,, +42,242199,,,,,,,,,,,,0.06270747631788254,,,,,, +42,242249,,,,,,,,,,,,0.05645890533924103,,,,,, +42,242299,,,,,,,,,,,,0.04627687484025955,,,,,, +42,242349,,,,,,,,,,,,0.0662195235490799,,,,,, +42,242399,,,,,,,,,,,,0.05809691548347473,,,,,, +42,242449,,,,,,,,,,,,0.04688011482357979,,,,,, +42,242499,,,,,,,,,,,,0.058493223041296005,,,,,, +42,242549,,,,,,,,,,,,0.07415372878313065,,,,,, +42,242599,,,,,,,,,,,,0.058628976345062256,,,,,, +42,242649,,,,,,,,,,,,0.05864366143941879,,,,,, +42,242699,,,,,,,,,,,,0.05718303099274635,,,,,, +42,242749,,,,,,,,,,,,0.05952632427215576,,,,,, +42,242799,,,,,,,,,,,,0.07515490055084229,,,,,, +42,242849,,,,,,,,,,,,0.06073596701025963,,,,,, +42,242899,,,,,,,,,,,,0.0630018413066864,,,,,, +42,242949,,,,,,,,,,,,0.0653839260339737,,,,,, +42,242999,,,,,,,,,,,,0.056254297494888306,,,,,, +42,243049,,,,,,,,,,,,0.056679293513298035,,,,,, +42,243099,,,,,,,,,,,,0.06347715109586716,,,,,, +42,243149,,,,,,,,,,,,0.06491818279027939,,,,,, +42,243199,,,,,,,,,,,,0.06060284748673439,,,,,, +42,243249,,,,,,,,,,,,0.07569453120231628,,,,,, +42,243299,,,,,,,,,,,,0.05060212314128876,,,,,, +42,243349,,,,,,,,,,,,0.0646902471780777,,,,,, +42,243399,,,,,,,,,,,,0.054294899106025696,,,,,, +42,243449,,,,,,,,,,,,0.05536012724041939,,,,,, +42,243499,,,,,,,,,,,,0.06256841123104095,,,,,, +42,243549,,,,,,,,,,,,0.062875896692276,,,,,, +42,243599,,,,,,,,,,,,0.052010323852300644,,,,,, +42,243649,,,,,,,,,,,,0.06095997244119644,,,,,, +42,243699,,,,,,,,,,,,0.06129986420273781,,,,,, +42,243749,,,,,,,,,,,,0.06553740799427032,,,,,, +42,243799,,,,,,,,,,,,0.051406536251306534,,,,,, +42,243849,,,,,,,,,,,,0.052822865545749664,,,,,, +42,243899,,,,,,,,,,,,0.07147855311632156,,,,,, +42,243949,,,,,,,,,,,,0.058930493891239166,,,,,, +42,243999,,,,,,,,,,,,0.05610023811459541,,,,,, +42,244049,,,,,,,,,,,,0.05505075305700302,,,,,, +42,244099,,,,,,,,,,,,0.05940971150994301,,,,,, +42,244149,,,,,,,,,,,,0.056951459497213364,,,,,, +42,244199,,,,,,,,,,,,0.059518247842788696,,,,,, +42,244249,,,,,,,,,,,,0.06464782357215881,,,,,, +42,244299,,,,,,,,,,,,0.05821996182203293,,,,,, +42,244349,,,,,,,,,,,,0.05510161817073822,,,,,, +42,244399,,,,,,,,,,,,0.05917159467935562,,,,,, +42,244449,,,,,,,,,,,,0.04836765676736832,,,,,, +42,244499,,,,,,,,,,,,0.055743258446455,,,,,, +42,244549,,,,,,,,,,,,0.05819108709692955,,,,,, +42,244599,,,,,,,,,,,,0.05487284064292908,,,,,, +42,244649,,,,,,,,,,,,0.0513736717402935,,,,,, +42,244699,,,,,,,,,,,,0.061675671488046646,,,,,, +42,244749,,,,,,,,,,,,0.07816636562347412,,,,,, +42,244799,,,,,,,,,,,,0.04584334045648575,,,,,, +42,244849,,,,,,,,,,,,0.0587768480181694,,,,,, +42,244899,,,,,,,,,,,,0.06160794943571091,,,,,, +42,244949,,,,,,,,,,,,0.05059108883142471,,,,,, +42,244999,,,,,,,,,,,,0.05246637016534805,,,,,, +42,245049,,,,,,,,,,,,0.05835216864943504,,,,,, +42,245099,,,,,,,,,,,,0.05760370194911957,,,,,, +42,245149,,,,,,,,,,,,0.06385182589292526,,,,,, +42,245199,,,,,,,,,,,,0.06195692718029022,,,,,, +42,245249,,,,,,,,,,,,0.059934113174676895,,,,,, +42,245299,,,,,,,,,,,,0.05396072566509247,,,,,, +42,245349,,,,,,,,,,,,0.05419837310910225,,,,,, +42,245399,,,,,,,,,,,,0.052646294236183167,,,,,, +42,245449,,,,,,,,,,,,0.06427005678415298,,,,,, +42,245499,,,,,,,,,,,,0.06058080866932869,,,,,, +42,245549,,,,,,,,,,,,0.052095696330070496,,,,,, +42,245599,,,,,,,,,,,,0.055683642625808716,,,,,, +42,245649,,,,,,,,,,,,0.07599768042564392,,,,,, +42,245699,,,,,,,,,,,,0.07145010679960251,,,,,, +42,245749,,,,,,,,,,,,0.06249561160802841,,,,,, +42,245799,,,,,,,,,,,,0.053454868495464325,,,,,, +42,245849,,,,,,,,,,,,0.0664558932185173,,,,,, +42,245899,,,,,,,,,,,,0.06300312280654907,,,,,, +42,245949,,,,,,,,,,,,0.0470830500125885,,,,,, +42,245999,,,,,,,,,,,,0.06489890068769455,,,,,, +42,246049,,,,,,,,,,,,0.0770072266459465,,,,,, +42,246099,,,,,,,,,,,,0.05727215111255646,,,,,, +42,246149,,,,,,,,,,,,0.06406533718109131,,,,,, +42,246199,,,,,,,,,,,,0.055169060826301575,,,,,, +42,246249,,,,,,,,,,,,0.05203506350517273,,,,,, +42,246299,,,,,,,,,,,,0.05863576382398605,,,,,, +42,246349,,,,,,,,,,,,0.05322118103504181,,,,,, +42,246399,,,,,,,,,,,,0.05207126587629318,,,,,, +42,246449,,,,,,,,,,,,0.06193162500858307,,,,,, +42,246499,,,,,,,,,,,,0.0541849248111248,,,,,, +42,246549,,,,,,,,,,,,0.055532798171043396,,,,,, +42,246599,,,,,,,,,,,,0.05329518765211105,,,,,, +42,246647,,,,,,,,,,,,,0.24437901377677917,0.0840003490447998,0.19185888767242432,-0.01916337013244629,0.19080692529678345,0.0840003490447998 +42,246647,,,,,,,0.20041820406913757,0.0588236041367054,0.5378108620643616,0.2892383337020874,0.5170828104019165,,,,,,, +43,246649,,,,,,,,,,,,0.05308021605014801,,,,,, +43,246699,,,,,,,,,,,,0.06595046073198318,,,,,, +43,246749,,,,,,,,,,,,0.05350743234157562,,,,,, +43,246799,,,,,,,,,,,,0.05488986894488335,,,,,, +43,246849,,,,,,,,,,,,0.06333452463150024,,,,,, +43,246899,,,,,,,,,,,,0.05212545767426491,,,,,, +43,246949,,,,,,,,,,,,0.05688511207699776,,,,,, +43,246999,,,,,,,,,,,,0.06212624907493591,,,,,, +43,247049,,,,,,,,,,,,0.05483454465866089,,,,,, +43,247099,,,,,,,,,,,,0.06799817830324173,,,,,, +43,247149,,,,,,,,,,,,0.054211702197790146,,,,,, +43,247199,,,,,,,,,,,,0.05619702488183975,,,,,, +43,247249,,,,,,,,,,,,0.05914290249347687,,,,,, +43,247299,,,,,,,,,,,,0.06677192449569702,,,,,, +43,247349,,,,,,,,,,,,0.06868138909339905,,,,,, +43,247399,,,,,,,,,,,,0.054509058594703674,,,,,, +43,247449,,,,,,,,,,,,0.055202383548021317,,,,,, +43,247499,,,,,,,,,,,,0.06383497267961502,,,,,, +43,247549,,,,,,,,,,,,0.057766541838645935,,,,,, +43,247599,,,,,,,,,,,,0.06585812568664551,,,,,, +43,247649,,,,,,,,,,,,0.06196153908967972,,,,,, +43,247699,,,,,,,,,,,,0.051838718354701996,,,,,, +43,247749,,,,,,,,,,,,0.050289928913116455,,,,,, +43,247799,,,,,,,,,,,,0.03849027678370476,,,,,, +43,247849,,,,,,,,,,,,0.058400049805641174,,,,,, +43,247899,,,,,,,,,,,,0.059144407510757446,,,,,, +43,247949,,,,,,,,,,,,0.060419030487537384,,,,,, +43,247999,,,,,,,,,,,,0.05653572827577591,,,,,, +43,248049,,,,,,,,,,,,0.06868608295917511,,,,,, +43,248099,,,,,,,,,,,,0.06170456111431122,,,,,, +43,248149,,,,,,,,,,,,0.08441416919231415,,,,,, +43,248199,,,,,,,,,,,,0.06463302671909332,,,,,, +43,248249,,,,,,,,,,,,0.054495155811309814,,,,,, +43,248299,,,,,,,,,,,,0.0448254756629467,,,,,, +43,248349,,,,,,,,,,,,0.06294204294681549,,,,,, +43,248399,,,,,,,,,,,,0.06107258051633835,,,,,, +43,248449,,,,,,,,,,,,0.0517820306122303,,,,,, +43,248499,,,,,,,,,,,,0.06231924518942833,,,,,, +43,248549,,,,,,,,,,,,0.04918850213289261,,,,,, +43,248599,,,,,,,,,,,,0.05449063330888748,,,,,, +43,248649,,,,,,,,,,,,0.04804960638284683,,,,,, +43,248699,,,,,,,,,,,,0.06480830907821655,,,,,, +43,248749,,,,,,,,,,,,0.05479145050048828,,,,,, +43,248799,,,,,,,,,,,,0.053530216217041016,,,,,, +43,248849,,,,,,,,,,,,0.0541713647544384,,,,,, +43,248899,,,,,,,,,,,,0.06423958390951157,,,,,, +43,248949,,,,,,,,,,,,0.061527468264102936,,,,,, +43,248999,,,,,,,,,,,,0.05323824658989906,,,,,, +43,249049,,,,,,,,,,,,0.051594216376543045,,,,,, +43,249099,,,,,,,,,,,,0.05937595292925835,,,,,, +43,249149,,,,,,,,,,,,0.057696327567100525,,,,,, +43,249199,,,,,,,,,,,,0.05576499551534653,,,,,, +43,249249,,,,,,,,,,,,0.06176126375794411,,,,,, +43,249299,,,,,,,,,,,,0.06466467678546906,,,,,, +43,249349,,,,,,,,,,,,0.05564940720796585,,,,,, +43,249399,,,,,,,,,,,,0.06608020514249802,,,,,, +43,249449,,,,,,,,,,,,0.062493160367012024,,,,,, +43,249499,,,,,,,,,,,,0.06141848489642143,,,,,, +43,249549,,,,,,,,,,,,0.05160991847515106,,,,,, +43,249599,,,,,,,,,,,,0.06239885091781616,,,,,, +43,249649,,,,,,,,,,,,0.057798825204372406,,,,,, +43,249699,,,,,,,,,,,,0.05373425781726837,,,,,, +43,249749,,,,,,,,,,,,0.0614142119884491,,,,,, +43,249799,,,,,,,,,,,,0.059590235352516174,,,,,, +43,249849,,,,,,,,,,,,0.06415843218564987,,,,,, +43,249899,,,,,,,,,,,,0.0536312572658062,,,,,, +43,249949,,,,,,,,,,,,0.061827048659324646,,,,,, +43,249999,,,,,,,,,,,,0.06023239344358444,,,,,, +43,250049,,,,,,,,,,,,0.04863832890987396,,,,,, +43,250099,,,,,,,,,,,,0.05310884490609169,,,,,, +43,250149,,,,,,,,,,,,0.07434992492198944,,,,,, +43,250199,,,,,,,,,,,,0.04462591931223869,,,,,, +43,250249,,,,,,,,,,,,0.06271832436323166,,,,,, +43,250299,,,,,,,,,,,,0.05889640748500824,,,,,, +43,250349,,,,,,,,,,,,0.05645924434065819,,,,,, +43,250399,,,,,,,,,,,,0.05885174125432968,,,,,, +43,250449,,,,,,,,,,,,0.06568126380443573,,,,,, +43,250499,,,,,,,,,,,,0.055244460701942444,,,,,, +43,250549,,,,,,,,,,,,0.05459076538681984,,,,,, +43,250599,,,,,,,,,,,,0.04401015117764473,,,,,, +43,250649,,,,,,,,,,,,0.05804605782032013,,,,,, +43,250699,,,,,,,,,,,,0.059697650372982025,,,,,, +43,250749,,,,,,,,,,,,0.05961272120475769,,,,,, +43,250799,,,,,,,,,,,,0.054745323956012726,,,,,, +43,250849,,,,,,,,,,,,0.05910731852054596,,,,,, +43,250899,,,,,,,,,,,,0.047750525176525116,,,,,, +43,250949,,,,,,,,,,,,0.05405506491661072,,,,,, +43,250999,,,,,,,,,,,,0.06688760221004486,,,,,, +43,251049,,,,,,,,,,,,0.062042467296123505,,,,,, +43,251099,,,,,,,,,,,,0.050461627542972565,,,,,, +43,251149,,,,,,,,,,,,0.049186863005161285,,,,,, +43,251199,,,,,,,,,,,,0.05123002827167511,,,,,, +43,251249,,,,,,,,,,,,0.06229470670223236,,,,,, +43,251299,,,,,,,,,,,,0.05130789428949356,,,,,, +43,251349,,,,,,,,,,,,0.05739670246839523,,,,,, +43,251399,,,,,,,,,,,,0.05455604940652847,,,,,, +43,251449,,,,,,,,,,,,0.057647619396448135,,,,,, +43,251499,,,,,,,,,,,,0.06897640228271484,,,,,, +43,251549,,,,,,,,,,,,0.059037622064352036,,,,,, +43,251599,,,,,,,,,,,,0.055580079555511475,,,,,, +43,251649,,,,,,,,,,,,0.04965191334486008,,,,,, +43,251699,,,,,,,,,,,,0.05792280659079552,,,,,, +43,251749,,,,,,,,,,,,0.04697713255882263,,,,,, +43,251799,,,,,,,,,,,,0.06263336539268494,,,,,, +43,251849,,,,,,,,,,,,0.06419388949871063,,,,,, +43,251899,,,,,,,,,,,,0.060868434607982635,,,,,, +43,251949,,,,,,,,,,,,0.05541551113128662,,,,,, +43,251999,,,,,,,,,,,,0.05446254834532738,,,,,, +43,252049,,,,,,,,,,,,0.07612113654613495,,,,,, +43,252099,,,,,,,,,,,,0.06134140491485596,,,,,, +43,252149,,,,,,,,,,,,0.07218499481678009,,,,,, +43,252199,,,,,,,,,,,,0.06798462569713593,,,,,, +43,252249,,,,,,,,,,,,0.06681282818317413,,,,,, +43,252299,,,,,,,,,,,,0.06322543323040009,,,,,, +43,252349,,,,,,,,,,,,0.05721554905176163,,,,,, +43,252383,,,,,,,,,,,,,0.24381743371486664,0.08375006169080734,0.1912609338760376,-0.016126632690429688,0.1903287172317505,0.08375006169080734 +43,252383,,,,,,,0.20040364563465118,0.05881360545754433,0.5379250049591064,0.28936445713043213,0.5167511105537415,,,,,,, +44,252399,,,,,,,,,,,,0.05762907862663269,,,,,, +44,252449,,,,,,,,,,,,0.06294286996126175,,,,,, +44,252499,,,,,,,,,,,,0.049699824303388596,,,,,, +44,252549,,,,,,,,,,,,0.056990329176187515,,,,,, +44,252599,,,,,,,,,,,,0.06411349773406982,,,,,, +44,252649,,,,,,,,,,,,0.06561459600925446,,,,,, +44,252699,,,,,,,,,,,,0.05176316201686859,,,,,, +44,252749,,,,,,,,,,,,0.05861479416489601,,,,,, +44,252799,,,,,,,,,,,,0.06680873036384583,,,,,, +44,252849,,,,,,,,,,,,0.051929108798503876,,,,,, +44,252899,,,,,,,,,,,,0.06202738732099533,,,,,, +44,252949,,,,,,,,,,,,0.06867000460624695,,,,,, +44,252999,,,,,,,,,,,,0.051735587418079376,,,,,, +44,253049,,,,,,,,,,,,0.05902139097452164,,,,,, +44,253099,,,,,,,,,,,,0.055380258709192276,,,,,, +44,253149,,,,,,,,,,,,0.05122522637248039,,,,,, +44,253199,,,,,,,,,,,,0.06165388599038124,,,,,, +44,253249,,,,,,,,,,,,0.05827602744102478,,,,,, +44,253299,,,,,,,,,,,,0.0568721741437912,,,,,, +44,253349,,,,,,,,,,,,0.06713010370731354,,,,,, +44,253399,,,,,,,,,,,,0.06248015910387039,,,,,, +44,253449,,,,,,,,,,,,0.06815298646688461,,,,,, +44,253499,,,,,,,,,,,,0.060248393565416336,,,,,, +44,253549,,,,,,,,,,,,0.05626280978322029,,,,,, +44,253599,,,,,,,,,,,,0.0686691552400589,,,,,, +44,253649,,,,,,,,,,,,0.05556569620966911,,,,,, +44,253699,,,,,,,,,,,,0.05587737634778023,,,,,, +44,253749,,,,,,,,,,,,0.053248971700668335,,,,,, +44,253799,,,,,,,,,,,,0.058821119368076324,,,,,, +44,253849,,,,,,,,,,,,0.06233225017786026,,,,,, +44,253899,,,,,,,,,,,,0.055322855710983276,,,,,, +44,253949,,,,,,,,,,,,0.07124046981334686,,,,,, +44,253999,,,,,,,,,,,,0.0579456090927124,,,,,, +44,254049,,,,,,,,,,,,0.05317051708698273,,,,,, +44,254099,,,,,,,,,,,,0.0723174512386322,,,,,, +44,254149,,,,,,,,,,,,0.06357446312904358,,,,,, +44,254199,,,,,,,,,,,,0.052530281245708466,,,,,, +44,254249,,,,,,,,,,,,0.06097188591957092,,,,,, +44,254299,,,,,,,,,,,,0.07475551962852478,,,,,, +44,254349,,,,,,,,,,,,0.048082027584314346,,,,,, +44,254399,,,,,,,,,,,,0.06388279795646667,,,,,, +44,254449,,,,,,,,,,,,0.05712168291211128,,,,,, +44,254499,,,,,,,,,,,,0.059144526720047,,,,,, +44,254549,,,,,,,,,,,,0.05750460550189018,,,,,, +44,254599,,,,,,,,,,,,0.06938502192497253,,,,,, +44,254649,,,,,,,,,,,,0.04775552451610565,,,,,, +44,254699,,,,,,,,,,,,0.07242877036333084,,,,,, +44,254749,,,,,,,,,,,,0.05991014093160629,,,,,, +44,254799,,,,,,,,,,,,0.0498042032122612,,,,,, +44,254849,,,,,,,,,,,,0.06628795713186264,,,,,, +44,254899,,,,,,,,,,,,0.06866206228733063,,,,,, +44,254949,,,,,,,,,,,,0.07130230218172073,,,,,, +44,254999,,,,,,,,,,,,0.05119309574365616,,,,,, +44,255049,,,,,,,,,,,,0.06034379079937935,,,,,, +44,255099,,,,,,,,,,,,0.0639907643198967,,,,,, +44,255149,,,,,,,,,,,,0.059125520288944244,,,,,, +44,255199,,,,,,,,,,,,0.05438351631164551,,,,,, +44,255249,,,,,,,,,,,,0.06960681080818176,,,,,, +44,255299,,,,,,,,,,,,0.0527939610183239,,,,,, +44,255349,,,,,,,,,,,,0.0581057071685791,,,,,, +44,255399,,,,,,,,,,,,0.05661167576909065,,,,,, +44,255449,,,,,,,,,,,,0.057019226253032684,,,,,, +44,255499,,,,,,,,,,,,0.04789324849843979,,,,,, +44,255549,,,,,,,,,,,,0.058837227523326874,,,,,, +44,255599,,,,,,,,,,,,0.06713802367448807,,,,,, +44,255649,,,,,,,,,,,,0.057059526443481445,,,,,, +44,255699,,,,,,,,,,,,0.05148167163133621,,,,,, +44,255749,,,,,,,,,,,,0.060462094843387604,,,,,, +44,255799,,,,,,,,,,,,0.06200303137302399,,,,,, +44,255849,,,,,,,,,,,,0.07033021748065948,,,,,, +44,255899,,,,,,,,,,,,0.05056672543287277,,,,,, +44,255949,,,,,,,,,,,,0.056805528700351715,,,,,, +44,255999,,,,,,,,,,,,0.05669208616018295,,,,,, +44,256049,,,,,,,,,,,,0.06284146755933762,,,,,, +44,256099,,,,,,,,,,,,0.053695738315582275,,,,,, +44,256149,,,,,,,,,,,,0.06656070798635483,,,,,, +44,256199,,,,,,,,,,,,0.057962819933891296,,,,,, +44,256249,,,,,,,,,,,,0.06200484558939934,,,,,, +44,256299,,,,,,,,,,,,0.05927331745624542,,,,,, +44,256349,,,,,,,,,,,,0.05467367544770241,,,,,, +44,256399,,,,,,,,,,,,0.06646712124347687,,,,,, +44,256449,,,,,,,,,,,,0.06101728975772858,,,,,, +44,256499,,,,,,,,,,,,0.05373029783368111,,,,,, +44,256549,,,,,,,,,,,,0.05663628131151199,,,,,, +44,256599,,,,,,,,,,,,0.061543308198451996,,,,,, +44,256649,,,,,,,,,,,,0.05838153511285782,,,,,, +44,256699,,,,,,,,,,,,0.05260156840085983,,,,,, +44,256749,,,,,,,,,,,,0.06615899503231049,,,,,, +44,256799,,,,,,,,,,,,0.04656454175710678,,,,,, +44,256849,,,,,,,,,,,,0.059986382722854614,,,,,, +44,256899,,,,,,,,,,,,0.05512743443250656,,,,,, +44,256949,,,,,,,,,,,,0.060799695551395416,,,,,, +44,256999,,,,,,,,,,,,0.06816602498292923,,,,,, +44,257049,,,,,,,,,,,,0.05694230645895004,,,,,, +44,257099,,,,,,,,,,,,0.05486312136054039,,,,,, +44,257149,,,,,,,,,,,,0.0562242791056633,,,,,, +44,257199,,,,,,,,,,,,0.0557413175702095,,,,,, +44,257249,,,,,,,,,,,,0.05948517471551895,,,,,, +44,257299,,,,,,,,,,,,0.07571191340684891,,,,,, +44,257349,,,,,,,,,,,,0.05947751924395561,,,,,, +44,257399,,,,,,,,,,,,0.05121887847781181,,,,,, +44,257449,,,,,,,,,,,,0.06397037208080292,,,,,, +44,257499,,,,,,,,,,,,0.05266754701733589,,,,,, +44,257549,,,,,,,,,,,,0.05755828320980072,,,,,, +44,257599,,,,,,,,,,,,0.0575961135327816,,,,,, +44,257649,,,,,,,,,,,,0.05914507061243057,,,,,, +44,257699,,,,,,,,,,,,0.057229943573474884,,,,,, +44,257749,,,,,,,,,,,,0.05692722275853157,,,,,, +44,257799,,,,,,,,,,,,0.058567844331264496,,,,,, +44,257849,,,,,,,,,,,,0.0652940422296524,,,,,, +44,257899,,,,,,,,,,,,0.06711071729660034,,,,,, +44,257949,,,,,,,,,,,,0.06296966969966888,,,,,, +44,257999,,,,,,,,,,,,0.05414986610412598,,,,,, +44,258049,,,,,,,,,,,,0.0664612203836441,,,,,, +44,258099,,,,,,,,,,,,0.060151733458042145,,,,,, +44,258119,,,,,,,,,,,,,0.24419841170310974,0.08430363982915878,0.19229494035243988,-0.022843122482299805,0.19026793539524078,0.08430363982915878 +44,258119,,,,,,,0.20043128728866577,0.058797623962163925,0.5381032824516296,0.2895619869232178,0.5171941518783569,,,,,,, +45,258149,,,,,,,,,,,,0.06091617792844772,,,,,, +45,258199,,,,,,,,,,,,0.058612897992134094,,,,,, +45,258249,,,,,,,,,,,,0.06277278810739517,,,,,, +45,258299,,,,,,,,,,,,0.05902339518070221,,,,,, +45,258349,,,,,,,,,,,,0.057794488966464996,,,,,, +45,258399,,,,,,,,,,,,0.05401979759335518,,,,,, +45,258449,,,,,,,,,,,,0.050949517637491226,,,,,, +45,258499,,,,,,,,,,,,0.05957977473735809,,,,,, +45,258549,,,,,,,,,,,,0.06294314563274384,,,,,, +45,258599,,,,,,,,,,,,0.05530565232038498,,,,,, +45,258649,,,,,,,,,,,,0.061383724212646484,,,,,, +45,258699,,,,,,,,,,,,0.04946160688996315,,,,,, +45,258749,,,,,,,,,,,,0.056399811059236526,,,,,, +45,258799,,,,,,,,,,,,0.06008441746234894,,,,,, +45,258849,,,,,,,,,,,,0.059845924377441406,,,,,, +45,258899,,,,,,,,,,,,0.05487971752882004,,,,,, +45,258949,,,,,,,,,,,,0.06090967357158661,,,,,, +45,258999,,,,,,,,,,,,0.05868835747241974,,,,,, +45,259049,,,,,,,,,,,,0.06570848822593689,,,,,, +45,259099,,,,,,,,,,,,0.05298800766468048,,,,,, +45,259149,,,,,,,,,,,,0.06661264598369598,,,,,, +45,259199,,,,,,,,,,,,0.05290338769555092,,,,,, +45,259249,,,,,,,,,,,,0.0696820467710495,,,,,, +45,259299,,,,,,,,,,,,0.06429588049650192,,,,,, +45,259349,,,,,,,,,,,,0.05841996520757675,,,,,, +45,259399,,,,,,,,,,,,0.06091177463531494,,,,,, +45,259449,,,,,,,,,,,,0.06558298319578171,,,,,, +45,259499,,,,,,,,,,,,0.05044154077768326,,,,,, +45,259549,,,,,,,,,,,,0.05986151099205017,,,,,, +45,259599,,,,,,,,,,,,0.06379477679729462,,,,,, +45,259649,,,,,,,,,,,,0.061608538031578064,,,,,, +45,259699,,,,,,,,,,,,0.051228612661361694,,,,,, +45,259749,,,,,,,,,,,,0.05572597309947014,,,,,, +45,259799,,,,,,,,,,,,0.06445857882499695,,,,,, +45,259849,,,,,,,,,,,,0.057858265936374664,,,,,, +45,259899,,,,,,,,,,,,0.063501738011837,,,,,, +45,259949,,,,,,,,,,,,0.06357823312282562,,,,,, +45,259999,,,,,,,,,,,,0.06279527395963669,,,,,, +45,260049,,,,,,,,,,,,0.06239737197756767,,,,,, +45,260099,,,,,,,,,,,,0.057289041578769684,,,,,, +45,260149,,,,,,,,,,,,0.0476115383207798,,,,,, +45,260199,,,,,,,,,,,,0.0572361946105957,,,,,, +45,260249,,,,,,,,,,,,0.05862125754356384,,,,,, +45,260299,,,,,,,,,,,,0.06372175365686417,,,,,, +45,260349,,,,,,,,,,,,0.0588090755045414,,,,,, +45,260399,,,,,,,,,,,,0.05577433854341507,,,,,, +45,260449,,,,,,,,,,,,0.059878502041101456,,,,,, +45,260499,,,,,,,,,,,,0.0665276050567627,,,,,, +45,260549,,,,,,,,,,,,0.05514594167470932,,,,,, +45,260599,,,,,,,,,,,,0.07327833026647568,,,,,, +45,260649,,,,,,,,,,,,0.06208693981170654,,,,,, +45,260699,,,,,,,,,,,,0.06334096193313599,,,,,, +45,260749,,,,,,,,,,,,0.056915175169706345,,,,,, +45,260799,,,,,,,,,,,,0.05192403495311737,,,,,, +45,260849,,,,,,,,,,,,0.05705633759498596,,,,,, +45,260899,,,,,,,,,,,,0.059687428176403046,,,,,, +45,260949,,,,,,,,,,,,0.05518078804016113,,,,,, +45,260999,,,,,,,,,,,,0.06399443000555038,,,,,, +45,261049,,,,,,,,,,,,0.052726954221725464,,,,,, +45,261099,,,,,,,,,,,,0.04666651412844658,,,,,, +45,261149,,,,,,,,,,,,0.056950751692056656,,,,,, +45,261199,,,,,,,,,,,,0.06805256009101868,,,,,, +45,261249,,,,,,,,,,,,0.05749478563666344,,,,,, +45,261299,,,,,,,,,,,,0.058525070548057556,,,,,, +45,261349,,,,,,,,,,,,0.049202919006347656,,,,,, +45,261399,,,,,,,,,,,,0.05990944802761078,,,,,, +45,261449,,,,,,,,,,,,0.05279207602143288,,,,,, +45,261499,,,,,,,,,,,,0.06078887730836868,,,,,, +45,261549,,,,,,,,,,,,0.06030341237783432,,,,,, +45,261599,,,,,,,,,,,,0.048288095742464066,,,,,, +45,261649,,,,,,,,,,,,0.05439092218875885,,,,,, +45,261699,,,,,,,,,,,,0.05532129853963852,,,,,, +45,261749,,,,,,,,,,,,0.05512227863073349,,,,,, +45,261799,,,,,,,,,,,,0.053621433675289154,,,,,, +45,261849,,,,,,,,,,,,0.05086600035429001,,,,,, +45,261899,,,,,,,,,,,,0.055969350039958954,,,,,, +45,261949,,,,,,,,,,,,0.05582549422979355,,,,,, +45,261999,,,,,,,,,,,,0.06179475411772728,,,,,, +45,262049,,,,,,,,,,,,0.05441794544458389,,,,,, +45,262099,,,,,,,,,,,,0.06015811488032341,,,,,, +45,262149,,,,,,,,,,,,0.06983315944671631,,,,,, +45,262199,,,,,,,,,,,,0.06131414696574211,,,,,, +45,262249,,,,,,,,,,,,0.05585109442472458,,,,,, +45,262299,,,,,,,,,,,,0.06603644788265228,,,,,, +45,262349,,,,,,,,,,,,0.056453101336956024,,,,,, +45,262399,,,,,,,,,,,,0.058479294180870056,,,,,, +45,262449,,,,,,,,,,,,0.04528620466589928,,,,,, +45,262499,,,,,,,,,,,,0.0639086589217186,,,,,, +45,262549,,,,,,,,,,,,0.04962881654500961,,,,,, +45,262599,,,,,,,,,,,,0.06227124482393265,,,,,, +45,262649,,,,,,,,,,,,0.059285394847393036,,,,,, +45,262699,,,,,,,,,,,,0.04638819396495819,,,,,, +45,262749,,,,,,,,,,,,0.06218687444925308,,,,,, +45,262799,,,,,,,,,,,,0.054494790732860565,,,,,, +45,262849,,,,,,,,,,,,0.062375154346227646,,,,,, +45,262899,,,,,,,,,,,,0.058796677738428116,,,,,, +45,262949,,,,,,,,,,,,0.0671602413058281,,,,,, +45,262999,,,,,,,,,,,,0.059004031121730804,,,,,, +45,263049,,,,,,,,,,,,0.060067109763622284,,,,,, +45,263099,,,,,,,,,,,,0.047873999923467636,,,,,, +45,263149,,,,,,,,,,,,0.05692567303776741,,,,,, +45,263199,,,,,,,,,,,,0.05628369003534317,,,,,, +45,263249,,,,,,,,,,,,0.05997192859649658,,,,,, +45,263299,,,,,,,,,,,,0.06006189063191414,,,,,, +45,263349,,,,,,,,,,,,0.05704304575920105,,,,,, +45,263399,,,,,,,,,,,,0.07218938320875168,,,,,, +45,263449,,,,,,,,,,,,0.06463775038719177,,,,,, +45,263499,,,,,,,,,,,,0.06910625100135803,,,,,, +45,263549,,,,,,,,,,,,0.05242570862174034,,,,,, +45,263599,,,,,,,,,,,,0.054653700441122055,,,,,, +45,263649,,,,,,,,,,,,0.05222642421722412,,,,,, +45,263699,,,,,,,,,,,,0.0673188716173172,,,,,, +45,263749,,,,,,,,,,,,0.0670919120311737,,,,,, +45,263799,,,,,,,,,,,,0.05716303735971451,,,,,, +45,263849,,,,,,,,,,,,0.0626448392868042,,,,,, +45,263855,,,,,,,,,,,,,0.24342238903045654,0.08347690850496292,0.19688844680786133,-0.012812495231628418,0.195072203874588,0.08347690850496292 +45,263855,,,,,,,0.2002820521593094,0.058733660727739334,0.5388219952583313,0.2903295159339905,0.5180906653404236,,,,,,, +46,263899,,,,,,,,,,,,0.05793953686952591,,,,,, +46,263949,,,,,,,,,,,,0.05781208723783493,,,,,, +46,263999,,,,,,,,,,,,0.05882019177079201,,,,,, +46,264049,,,,,,,,,,,,0.0500936359167099,,,,,, +46,264099,,,,,,,,,,,,0.06281410157680511,,,,,, +46,264149,,,,,,,,,,,,0.0558922104537487,,,,,, +46,264199,,,,,,,,,,,,0.05458689481019974,,,,,, +46,264249,,,,,,,,,,,,0.05151443928480148,,,,,, +46,264299,,,,,,,,,,,,0.057585351169109344,,,,,, +46,264349,,,,,,,,,,,,0.059148114174604416,,,,,, +46,264399,,,,,,,,,,,,0.05392753332853317,,,,,, +46,264449,,,,,,,,,,,,0.05573311075568199,,,,,, +46,264499,,,,,,,,,,,,0.0672779232263565,,,,,, +46,264549,,,,,,,,,,,,0.050532735884189606,,,,,, +46,264599,,,,,,,,,,,,0.05605538934469223,,,,,, +46,264649,,,,,,,,,,,,0.053890787065029144,,,,,, +46,264699,,,,,,,,,,,,0.056983545422554016,,,,,, +46,264749,,,,,,,,,,,,0.05593179911375046,,,,,, +46,264799,,,,,,,,,,,,0.05531463399529457,,,,,, +46,264849,,,,,,,,,,,,0.055264413356781006,,,,,, +46,264899,,,,,,,,,,,,0.053978331387043,,,,,, +46,264949,,,,,,,,,,,,0.07540241628885269,,,,,, +46,264999,,,,,,,,,,,,0.059631556272506714,,,,,, +46,265049,,,,,,,,,,,,0.05983390659093857,,,,,, +46,265099,,,,,,,,,,,,0.05454549565911293,,,,,, +46,265149,,,,,,,,,,,,0.06529053300619125,,,,,, +46,265199,,,,,,,,,,,,0.054665304720401764,,,,,, +46,265249,,,,,,,,,,,,0.058694325387477875,,,,,, +46,265299,,,,,,,,,,,,0.060903750360012054,,,,,, +46,265349,,,,,,,,,,,,0.0615730956196785,,,,,, +46,265399,,,,,,,,,,,,0.04984813928604126,,,,,, +46,265449,,,,,,,,,,,,0.058173250406980515,,,,,, +46,265499,,,,,,,,,,,,0.06221824884414673,,,,,, +46,265549,,,,,,,,,,,,0.0575200617313385,,,,,, +46,265599,,,,,,,,,,,,0.053041279315948486,,,,,, +46,265649,,,,,,,,,,,,0.05091480910778046,,,,,, +46,265699,,,,,,,,,,,,0.06358511000871658,,,,,, +46,265749,,,,,,,,,,,,0.060434624552726746,,,,,, +46,265799,,,,,,,,,,,,0.06374090909957886,,,,,, +46,265849,,,,,,,,,,,,0.06332685798406601,,,,,, +46,265899,,,,,,,,,,,,0.05935108661651611,,,,,, +46,265949,,,,,,,,,,,,0.05839806795120239,,,,,, +46,265999,,,,,,,,,,,,0.054330892860889435,,,,,, +46,266049,,,,,,,,,,,,0.06426218152046204,,,,,, +46,266099,,,,,,,,,,,,0.05507219582796097,,,,,, +46,266149,,,,,,,,,,,,0.065863698720932,,,,,, +46,266199,,,,,,,,,,,,0.05364111065864563,,,,,, +46,266249,,,,,,,,,,,,0.0706978365778923,,,,,, +46,266299,,,,,,,,,,,,0.05731874331831932,,,,,, +46,266349,,,,,,,,,,,,0.05183563381433487,,,,,, +46,266399,,,,,,,,,,,,0.05803487449884415,,,,,, +46,266449,,,,,,,,,,,,0.06355798244476318,,,,,, +46,266499,,,,,,,,,,,,0.05004482343792915,,,,,, +46,266549,,,,,,,,,,,,0.05568688362836838,,,,,, +46,266599,,,,,,,,,,,,0.04797928035259247,,,,,, +46,266649,,,,,,,,,,,,0.05622685328125954,,,,,, +46,266699,,,,,,,,,,,,0.05151480436325073,,,,,, +46,266749,,,,,,,,,,,,0.050033241510391235,,,,,, +46,266799,,,,,,,,,,,,0.07024575769901276,,,,,, +46,266849,,,,,,,,,,,,0.05186282843351364,,,,,, +46,266899,,,,,,,,,,,,0.05179211497306824,,,,,, +46,266949,,,,,,,,,,,,0.057752229273319244,,,,,, +46,266999,,,,,,,,,,,,0.060989610850811005,,,,,, +46,267049,,,,,,,,,,,,0.0671655684709549,,,,,, +46,267099,,,,,,,,,,,,0.0620284266769886,,,,,, +46,267149,,,,,,,,,,,,0.05271858721971512,,,,,, +46,267199,,,,,,,,,,,,0.055705904960632324,,,,,, +46,267249,,,,,,,,,,,,0.05776000767946243,,,,,, +46,267299,,,,,,,,,,,,0.05945170670747757,,,,,, +46,267349,,,,,,,,,,,,0.07313747704029083,,,,,, +46,267399,,,,,,,,,,,,0.06111110746860504,,,,,, +46,267449,,,,,,,,,,,,0.05718498304486275,,,,,, +46,267499,,,,,,,,,,,,0.060294706374406815,,,,,, +46,267549,,,,,,,,,,,,0.07521319389343262,,,,,, +46,267599,,,,,,,,,,,,0.067740797996521,,,,,, +46,267649,,,,,,,,,,,,0.05614512041211128,,,,,, +46,267699,,,,,,,,,,,,0.0636555552482605,,,,,, +46,267749,,,,,,,,,,,,0.05684000998735428,,,,,, +46,267799,,,,,,,,,,,,0.06205160170793533,,,,,, +46,267849,,,,,,,,,,,,0.04921536147594452,,,,,, +46,267899,,,,,,,,,,,,0.06469477713108063,,,,,, +46,267949,,,,,,,,,,,,0.06586448848247528,,,,,, +46,267999,,,,,,,,,,,,0.05882415175437927,,,,,, +46,268049,,,,,,,,,,,,0.05898747220635414,,,,,, +46,268099,,,,,,,,,,,,0.06132375821471214,,,,,, +46,268149,,,,,,,,,,,,0.0476757176220417,,,,,, +46,268199,,,,,,,,,,,,0.06271031498908997,,,,,, +46,268249,,,,,,,,,,,,0.059418462216854095,,,,,, +46,268299,,,,,,,,,,,,0.054774343967437744,,,,,, +46,268349,,,,,,,,,,,,0.05900619551539421,,,,,, +46,268399,,,,,,,,,,,,0.051886871457099915,,,,,, +46,268449,,,,,,,,,,,,0.059538837522268295,,,,,, +46,268499,,,,,,,,,,,,0.06521999090909958,,,,,, +46,268549,,,,,,,,,,,,0.0661487877368927,,,,,, +46,268599,,,,,,,,,,,,0.061628639698028564,,,,,, +46,268649,,,,,,,,,,,,0.056527089327573776,,,,,, +46,268699,,,,,,,,,,,,0.05804789438843727,,,,,, +46,268749,,,,,,,,,,,,0.06003781780600548,,,,,, +46,268799,,,,,,,,,,,,0.07785798609256744,,,,,, +46,268849,,,,,,,,,,,,0.0644506961107254,,,,,, +46,268899,,,,,,,,,,,,0.06367151439189911,,,,,, +46,268949,,,,,,,,,,,,0.06335002183914185,,,,,, +46,268999,,,,,,,,,,,,0.06429039686918259,,,,,, +46,269049,,,,,,,,,,,,0.05775129050016403,,,,,, +46,269099,,,,,,,,,,,,0.05563963204622269,,,,,, +46,269149,,,,,,,,,,,,0.05927608162164688,,,,,, +46,269199,,,,,,,,,,,,0.0627308040857315,,,,,, +46,269249,,,,,,,,,,,,0.06923850625753403,,,,,, +46,269299,,,,,,,,,,,,0.05645879730582237,,,,,, +46,269349,,,,,,,,,,,,0.06308631598949432,,,,,, +46,269399,,,,,,,,,,,,0.06398333609104156,,,,,, +46,269449,,,,,,,,,,,,0.06395000964403152,,,,,, +46,269499,,,,,,,,,,,,0.06428153812885284,,,,,, +46,269549,,,,,,,,,,,,0.062101446092128754,,,,,, +46,269591,,,,,,,,,,,,,0.24373342096805573,0.08400926738977432,0.1988944262266159,-0.019271492958068848,0.19834545254707336,0.08400926738977432 +46,269591,,,,,,,0.20026633143424988,0.05870972201228142,0.5390899181365967,0.2906169295310974,0.5183380842208862,,,,,,, +47,269599,,,,,,,,,,,,0.048617005348205566,,,,,, +47,269649,,,,,,,,,,,,0.05976755544543266,,,,,, +47,269699,,,,,,,,,,,,0.062256503850221634,,,,,, +47,269749,,,,,,,,,,,,0.060889832675457,,,,,, +47,269799,,,,,,,,,,,,0.054148849099874496,,,,,, +47,269849,,,,,,,,,,,,0.061356429010629654,,,,,, +47,269899,,,,,,,,,,,,0.06369756907224655,,,,,, +47,269949,,,,,,,,,,,,0.057681091129779816,,,,,, +47,269999,,,,,,,,,,,,0.05644858255982399,,,,,, +47,270049,,,,,,,,,,,,0.056253790855407715,,,,,, +47,270099,,,,,,,,,,,,0.06672247499227524,,,,,, +47,270149,,,,,,,,,,,,0.060573771595954895,,,,,, +47,270199,,,,,,,,,,,,0.06269924342632294,,,,,, +47,270249,,,,,,,,,,,,0.06353358924388885,,,,,, +47,270299,,,,,,,,,,,,0.055662818253040314,,,,,, +47,270349,,,,,,,,,,,,0.05592375248670578,,,,,, +47,270399,,,,,,,,,,,,0.05817106366157532,,,,,, +47,270449,,,,,,,,,,,,0.05026068165898323,,,,,, +47,270499,,,,,,,,,,,,0.05427895858883858,,,,,, +47,270549,,,,,,,,,,,,0.051516786217689514,,,,,, +47,270599,,,,,,,,,,,,0.06478596478700638,,,,,, +47,270649,,,,,,,,,,,,0.058655545115470886,,,,,, +47,270699,,,,,,,,,,,,0.05503083020448685,,,,,, +47,270749,,,,,,,,,,,,0.07206594944000244,,,,,, +47,270799,,,,,,,,,,,,0.06741726398468018,,,,,, +47,270849,,,,,,,,,,,,0.055650509893894196,,,,,, +47,270899,,,,,,,,,,,,0.04950331151485443,,,,,, +47,270949,,,,,,,,,,,,0.06490593403577805,,,,,, +47,270999,,,,,,,,,,,,0.05443807691335678,,,,,, +47,271049,,,,,,,,,,,,0.05455855280160904,,,,,, +47,271099,,,,,,,,,,,,0.05753530189394951,,,,,, +47,271149,,,,,,,,,,,,0.055312201380729675,,,,,, +47,271199,,,,,,,,,,,,0.07016132771968842,,,,,, +47,271249,,,,,,,,,,,,0.06732004135847092,,,,,, +47,271299,,,,,,,,,,,,0.05658561363816261,,,,,, +47,271349,,,,,,,,,,,,0.05884253978729248,,,,,, +47,271399,,,,,,,,,,,,0.05928167700767517,,,,,, +47,271449,,,,,,,,,,,,0.07360921800136566,,,,,, +47,271499,,,,,,,,,,,,0.06701240688562393,,,,,, +47,271549,,,,,,,,,,,,0.05369644612073898,,,,,, +47,271599,,,,,,,,,,,,0.061027348041534424,,,,,, +47,271649,,,,,,,,,,,,0.06987237930297852,,,,,, +47,271699,,,,,,,,,,,,0.06611532717943192,,,,,, +47,271749,,,,,,,,,,,,0.05270509049296379,,,,,, +47,271799,,,,,,,,,,,,0.06849391758441925,,,,,, +47,271849,,,,,,,,,,,,0.0595918633043766,,,,,, +47,271899,,,,,,,,,,,,0.0637146607041359,,,,,, +47,271949,,,,,,,,,,,,0.043298039585351944,,,,,, +47,271999,,,,,,,,,,,,0.059815868735313416,,,,,, +47,272049,,,,,,,,,,,,0.052559129893779755,,,,,, +47,272099,,,,,,,,,,,,0.05954286456108093,,,,,, +47,272149,,,,,,,,,,,,0.057911768555641174,,,,,, +47,272199,,,,,,,,,,,,0.06299705058336258,,,,,, +47,272249,,,,,,,,,,,,0.06422820687294006,,,,,, +47,272299,,,,,,,,,,,,0.05458155274391174,,,,,, +47,272349,,,,,,,,,,,,0.06784199178218842,,,,,, +47,272399,,,,,,,,,,,,0.05175454914569855,,,,,, +47,272449,,,,,,,,,,,,0.06684842705726624,,,,,, +47,272499,,,,,,,,,,,,0.061471257358789444,,,,,, +47,272549,,,,,,,,,,,,0.062035199254751205,,,,,, +47,272599,,,,,,,,,,,,0.057037077844142914,,,,,, +47,272649,,,,,,,,,,,,0.055627934634685516,,,,,, +47,272699,,,,,,,,,,,,0.04996645450592041,,,,,, +47,272749,,,,,,,,,,,,0.045376379042863846,,,,,, +47,272799,,,,,,,,,,,,0.05909702181816101,,,,,, +47,272849,,,,,,,,,,,,0.05747472494840622,,,,,, +47,272899,,,,,,,,,,,,0.04627014696598053,,,,,, +47,272949,,,,,,,,,,,,0.05172101780772209,,,,,, +47,272999,,,,,,,,,,,,0.06323914229869843,,,,,, +47,273049,,,,,,,,,,,,0.06121397018432617,,,,,, +47,273099,,,,,,,,,,,,0.049929775297641754,,,,,, +47,273149,,,,,,,,,,,,0.06378218531608582,,,,,, +47,273199,,,,,,,,,,,,0.056882306933403015,,,,,, +47,273249,,,,,,,,,,,,0.059182316064834595,,,,,, +47,273299,,,,,,,,,,,,0.05968164652585983,,,,,, +47,273349,,,,,,,,,,,,0.056982867419719696,,,,,, +47,273399,,,,,,,,,,,,0.055058591067790985,,,,,, +47,273449,,,,,,,,,,,,0.05381033197045326,,,,,, +47,273499,,,,,,,,,,,,0.0616503544151783,,,,,, +47,273549,,,,,,,,,,,,0.0651283860206604,,,,,, +47,273599,,,,,,,,,,,,0.05935715138912201,,,,,, +47,273649,,,,,,,,,,,,0.06220386177301407,,,,,, +47,273699,,,,,,,,,,,,0.056336477398872375,,,,,, +47,273749,,,,,,,,,,,,0.06380064785480499,,,,,, +47,273799,,,,,,,,,,,,0.06567183136940002,,,,,, +47,273849,,,,,,,,,,,,0.057510051876306534,,,,,, +47,273899,,,,,,,,,,,,0.0614110603928566,,,,,, +47,273949,,,,,,,,,,,,0.05663122236728668,,,,,, +47,273999,,,,,,,,,,,,0.05880255624651909,,,,,, +47,274049,,,,,,,,,,,,0.06118026375770569,,,,,, +47,274099,,,,,,,,,,,,0.05564001202583313,,,,,, +47,274149,,,,,,,,,,,,0.05983327329158783,,,,,, +47,274199,,,,,,,,,,,,0.06358826160430908,,,,,, +47,274249,,,,,,,,,,,,0.04918557405471802,,,,,, +47,274299,,,,,,,,,,,,0.05834805220365524,,,,,, +47,274349,,,,,,,,,,,,0.06394997984170914,,,,,, +47,274399,,,,,,,,,,,,0.06188208609819412,,,,,, +47,274449,,,,,,,,,,,,0.046464186161756516,,,,,, +47,274499,,,,,,,,,,,,0.06006315350532532,,,,,, +47,274549,,,,,,,,,,,,0.05141296982765198,,,,,, +47,274599,,,,,,,,,,,,0.05246405676007271,,,,,, +47,274649,,,,,,,,,,,,0.04937301576137543,,,,,, +47,274699,,,,,,,,,,,,0.061468757688999176,,,,,, +47,274749,,,,,,,,,,,,0.06917054951190948,,,,,, +47,274799,,,,,,,,,,,,0.05770674720406532,,,,,, +47,274849,,,,,,,,,,,,0.06891313195228577,,,,,, +47,274899,,,,,,,,,,,,0.05655979737639427,,,,,, +47,274949,,,,,,,,,,,,0.05645120143890381,,,,,, +47,274999,,,,,,,,,,,,0.05619027465581894,,,,,, +47,275049,,,,,,,,,,,,0.05540125072002411,,,,,, +47,275099,,,,,,,,,,,,0.06801093369722366,,,,,, +47,275149,,,,,,,,,,,,0.056238844990730286,,,,,, +47,275199,,,,,,,,,,,,0.056391939520835876,,,,,, +47,275249,,,,,,,,,,,,0.05670349299907684,,,,,, +47,275299,,,,,,,,,,,,0.0509079210460186,,,,,, +47,275327,,,,,,,,,,,,,0.2435380071401596,0.08386822789907455,0.20060034096240997,-0.017560362815856934,0.19968080520629883,0.08386822789907455 +47,275327,,,,,,,0.20010752975940704,0.05866395682096481,0.5396034121513367,0.2911646366119385,0.5187712907791138,,,,,,, +48,275349,,,,,,,,,,,,0.06273430585861206,,,,,, +48,275399,,,,,,,,,,,,0.05969449132680893,,,,,, +48,275449,,,,,,,,,,,,0.06034025922417641,,,,,, +48,275499,,,,,,,,,,,,0.0608036033809185,,,,,, +48,275549,,,,,,,,,,,,0.0490703359246254,,,,,, +48,275599,,,,,,,,,,,,0.04960658401250839,,,,,, +48,275649,,,,,,,,,,,,0.06715906411409378,,,,,, +48,275699,,,,,,,,,,,,0.06771492958068848,,,,,, +48,275749,,,,,,,,,,,,0.0657333955168724,,,,,, +48,275799,,,,,,,,,,,,0.056252412497997284,,,,,, +48,275849,,,,,,,,,,,,0.054371289908885956,,,,,, +48,275899,,,,,,,,,,,,0.054861120879650116,,,,,, +48,275949,,,,,,,,,,,,0.05107066035270691,,,,,, +48,275999,,,,,,,,,,,,0.05652789771556854,,,,,, +48,276049,,,,,,,,,,,,0.06202763319015503,,,,,, +48,276099,,,,,,,,,,,,0.052078090608119965,,,,,, +48,276149,,,,,,,,,,,,0.055431485176086426,,,,,, +48,276199,,,,,,,,,,,,0.06278902292251587,,,,,, +48,276249,,,,,,,,,,,,0.06666899472475052,,,,,, +48,276299,,,,,,,,,,,,0.05153696984052658,,,,,, +48,276349,,,,,,,,,,,,0.05688833072781563,,,,,, +48,276399,,,,,,,,,,,,0.05275207757949829,,,,,, +48,276449,,,,,,,,,,,,0.05334832891821861,,,,,, +48,276499,,,,,,,,,,,,0.05566289275884628,,,,,, +48,276549,,,,,,,,,,,,0.07319723069667816,,,,,, +48,276599,,,,,,,,,,,,0.05017102509737015,,,,,, +48,276649,,,,,,,,,,,,0.060661815106868744,,,,,, +48,276699,,,,,,,,,,,,0.05442887917160988,,,,,, +48,276749,,,,,,,,,,,,0.05344720929861069,,,,,, +48,276799,,,,,,,,,,,,0.06327805668115616,,,,,, +48,276849,,,,,,,,,,,,0.06578831374645233,,,,,, +48,276899,,,,,,,,,,,,0.06807559728622437,,,,,, +48,276949,,,,,,,,,,,,0.0749102383852005,,,,,, +48,276999,,,,,,,,,,,,0.05996311455965042,,,,,, +48,277049,,,,,,,,,,,,0.0590851753950119,,,,,, +48,277099,,,,,,,,,,,,0.069267138838768,,,,,, +48,277149,,,,,,,,,,,,0.06383617222309113,,,,,, +48,277199,,,,,,,,,,,,0.06140667200088501,,,,,, +48,277249,,,,,,,,,,,,0.06526754051446915,,,,,, +48,277299,,,,,,,,,,,,0.06409427523612976,,,,,, +48,277349,,,,,,,,,,,,0.057795386761426926,,,,,, +48,277399,,,,,,,,,,,,0.057351551949977875,,,,,, +48,277449,,,,,,,,,,,,0.06138521432876587,,,,,, +48,277499,,,,,,,,,,,,0.04966036230325699,,,,,, +48,277549,,,,,,,,,,,,0.04992124065756798,,,,,, +48,277599,,,,,,,,,,,,0.07126709818840027,,,,,, +48,277649,,,,,,,,,,,,0.05878743529319763,,,,,, +48,277699,,,,,,,,,,,,0.06275510787963867,,,,,, +48,277749,,,,,,,,,,,,0.048438869416713715,,,,,, +48,277799,,,,,,,,,,,,0.07852780073881149,,,,,, +48,277849,,,,,,,,,,,,0.056218989193439484,,,,,, +48,277899,,,,,,,,,,,,0.061030372977256775,,,,,, +48,277949,,,,,,,,,,,,0.06752067059278488,,,,,, +48,277999,,,,,,,,,,,,0.05612959712743759,,,,,, +48,278049,,,,,,,,,,,,0.06620307266712189,,,,,, +48,278099,,,,,,,,,,,,0.05953383445739746,,,,,, +48,278149,,,,,,,,,,,,0.05743579566478729,,,,,, +48,278199,,,,,,,,,,,,0.04715850576758385,,,,,, +48,278249,,,,,,,,,,,,0.05541149526834488,,,,,, +48,278299,,,,,,,,,,,,0.05054346099495888,,,,,, +48,278349,,,,,,,,,,,,0.04842108115553856,,,,,, +48,278399,,,,,,,,,,,,0.05730331689119339,,,,,, +48,278449,,,,,,,,,,,,0.05553756281733513,,,,,, +48,278499,,,,,,,,,,,,0.04969407245516777,,,,,, +48,278549,,,,,,,,,,,,0.06102945655584335,,,,,, +48,278599,,,,,,,,,,,,0.06753814965486526,,,,,, +48,278649,,,,,,,,,,,,0.05392400175333023,,,,,, +48,278699,,,,,,,,,,,,0.06367660313844681,,,,,, +48,278749,,,,,,,,,,,,0.053271129727363586,,,,,, +48,278799,,,,,,,,,,,,0.04934440553188324,,,,,, +48,278849,,,,,,,,,,,,0.05874574929475784,,,,,, +48,278899,,,,,,,,,,,,0.050938356667757034,,,,,, +48,278949,,,,,,,,,,,,0.06948184221982956,,,,,, +48,278999,,,,,,,,,,,,0.050144776701927185,,,,,, +48,279049,,,,,,,,,,,,0.060094282031059265,,,,,, +48,279099,,,,,,,,,,,,0.05852697417140007,,,,,, +48,279149,,,,,,,,,,,,0.05163423717021942,,,,,, +48,279199,,,,,,,,,,,,0.056998975574970245,,,,,, +48,279249,,,,,,,,,,,,0.05089399218559265,,,,,, +48,279299,,,,,,,,,,,,0.05798686295747757,,,,,, +48,279349,,,,,,,,,,,,0.06386465579271317,,,,,, +48,279399,,,,,,,,,,,,0.056886643171310425,,,,,, +48,279449,,,,,,,,,,,,0.059693749994039536,,,,,, +48,279499,,,,,,,,,,,,0.052067339420318604,,,,,, +48,279549,,,,,,,,,,,,0.056587062776088715,,,,,, +48,279599,,,,,,,,,,,,0.06066684424877167,,,,,, +48,279649,,,,,,,,,,,,0.05514035373926163,,,,,, +48,279699,,,,,,,,,,,,0.05951323360204697,,,,,, +48,279749,,,,,,,,,,,,0.04775566607713699,,,,,, +48,279799,,,,,,,,,,,,0.06036600470542908,,,,,, +48,279849,,,,,,,,,,,,0.05890089273452759,,,,,, +48,279899,,,,,,,,,,,,0.05666109174489975,,,,,, +48,279949,,,,,,,,,,,,0.05100635066628456,,,,,, +48,279999,,,,,,,,,,,,0.06284680962562561,,,,,, +48,280049,,,,,,,,,,,,0.06263554096221924,,,,,, +48,280099,,,,,,,,,,,,0.052187155932188034,,,,,, +48,280149,,,,,,,,,,,,0.04725274443626404,,,,,, +48,280199,,,,,,,,,,,,0.057155825197696686,,,,,, +48,280249,,,,,,,,,,,,0.06624934077262878,,,,,, +48,280299,,,,,,,,,,,,0.06081210821866989,,,,,, +48,280349,,,,,,,,,,,,0.07666613906621933,,,,,, +48,280399,,,,,,,,,,,,0.061026621609926224,,,,,, +48,280449,,,,,,,,,,,,0.0450608991086483,,,,,, +48,280499,,,,,,,,,,,,0.05397350341081619,,,,,, +48,280549,,,,,,,,,,,,0.06942404806613922,,,,,, +48,280599,,,,,,,,,,,,0.05857600271701813,,,,,, +48,280649,,,,,,,,,,,,0.07293432950973511,,,,,, +48,280699,,,,,,,,,,,,0.05846456065773964,,,,,, +48,280749,,,,,,,,,,,,0.060657355934381485,,,,,, +48,280799,,,,,,,,,,,,0.050377123057842255,,,,,, +48,280849,,,,,,,,,,,,0.06145258992910385,,,,,, +48,280899,,,,,,,,,,,,0.05656390264630318,,,,,, +48,280949,,,,,,,,,,,,0.045868366956710815,,,,,, +48,280999,,,,,,,,,,,,0.058729927986860275,,,,,, +48,281049,,,,,,,,,,,,0.05983899533748627,,,,,, +48,281063,,,,,,,,,,,,,0.24424079060554504,0.08420726656913757,0.19679227471351624,-0.02167379856109619,0.19570796191692352,0.08420726656913757 +48,281063,,,,,,,0.20008671283721924,0.05868595466017723,0.5393578410148621,0.2908991575241089,0.5184194445610046,,,,,,, +49,281099,,,,,,,,,,,,0.06603188067674637,,,,,, +49,281149,,,,,,,,,,,,0.06953166425228119,,,,,, +49,281199,,,,,,,,,,,,0.06944461166858673,,,,,, +49,281249,,,,,,,,,,,,0.06202801316976547,,,,,, +49,281299,,,,,,,,,,,,0.06945079565048218,,,,,, +49,281349,,,,,,,,,,,,0.04968199133872986,,,,,, +49,281399,,,,,,,,,,,,0.059728533029556274,,,,,, +49,281449,,,,,,,,,,,,0.06675724685192108,,,,,, +49,281499,,,,,,,,,,,,0.05357609689235687,,,,,, +49,281549,,,,,,,,,,,,0.06095588952302933,,,,,, +49,281599,,,,,,,,,,,,0.05859155207872391,,,,,, +49,281649,,,,,,,,,,,,0.05882962793111801,,,,,, +49,281699,,,,,,,,,,,,0.06044460088014603,,,,,, +49,281749,,,,,,,,,,,,0.07194514572620392,,,,,, +49,281799,,,,,,,,,,,,0.06156750023365021,,,,,, +49,281849,,,,,,,,,,,,0.06601235270500183,,,,,, +49,281899,,,,,,,,,,,,0.05456620082259178,,,,,, +49,281949,,,,,,,,,,,,0.04791264235973358,,,,,, +49,281999,,,,,,,,,,,,0.06165088340640068,,,,,, +49,282049,,,,,,,,,,,,0.06782358884811401,,,,,, +49,282099,,,,,,,,,,,,0.06266762316226959,,,,,, +49,282149,,,,,,,,,,,,0.0579647496342659,,,,,, +49,282199,,,,,,,,,,,,0.046338390558958054,,,,,, +49,282249,,,,,,,,,,,,0.0692213773727417,,,,,, +49,282299,,,,,,,,,,,,0.06708668172359467,,,,,, +49,282349,,,,,,,,,,,,0.05827200412750244,,,,,, +49,282399,,,,,,,,,,,,0.05439762771129608,,,,,, +49,282449,,,,,,,,,,,,0.06763991713523865,,,,,, +49,282499,,,,,,,,,,,,0.05146561935544014,,,,,, +49,282549,,,,,,,,,,,,0.054750144481658936,,,,,, +49,282599,,,,,,,,,,,,0.05715111643075943,,,,,, +49,282649,,,,,,,,,,,,0.07319597899913788,,,,,, +49,282699,,,,,,,,,,,,0.056166086345911026,,,,,, +49,282749,,,,,,,,,,,,0.06503581255674362,,,,,, +49,282799,,,,,,,,,,,,0.057698316872119904,,,,,, +49,282849,,,,,,,,,,,,0.050578825175762177,,,,,, +49,282899,,,,,,,,,,,,0.05440056324005127,,,,,, +49,282949,,,,,,,,,,,,0.052992597222328186,,,,,, +49,282999,,,,,,,,,,,,0.0562131442129612,,,,,, +49,283049,,,,,,,,,,,,0.05821604281663895,,,,,, +49,283099,,,,,,,,,,,,0.06201695650815964,,,,,, +49,283149,,,,,,,,,,,,0.05684482306241989,,,,,, +49,283199,,,,,,,,,,,,0.057783663272857666,,,,,, +49,283249,,,,,,,,,,,,0.05628175288438797,,,,,, +49,283299,,,,,,,,,,,,0.0630226582288742,,,,,, +49,283349,,,,,,,,,,,,0.06269499659538269,,,,,, +49,283399,,,,,,,,,,,,0.06769999861717224,,,,,, +49,283449,,,,,,,,,,,,0.04732464253902435,,,,,, +49,283499,,,,,,,,,,,,0.07199261337518692,,,,,, +49,283549,,,,,,,,,,,,0.06537061929702759,,,,,, +49,283599,,,,,,,,,,,,0.07170017063617706,,,,,, +49,283649,,,,,,,,,,,,0.07014507055282593,,,,,, +49,283699,,,,,,,,,,,,0.0641118735074997,,,,,, +49,283749,,,,,,,,,,,,0.05164322257041931,,,,,, +49,283799,,,,,,,,,,,,0.06319203972816467,,,,,, +49,283849,,,,,,,,,,,,0.056465692818164825,,,,,, +49,283899,,,,,,,,,,,,0.06428419053554535,,,,,, +49,283949,,,,,,,,,,,,0.06546615809202194,,,,,, +49,283999,,,,,,,,,,,,0.05555269867181778,,,,,, +49,284049,,,,,,,,,,,,0.07573886215686798,,,,,, +49,284099,,,,,,,,,,,,0.057993970811367035,,,,,, +49,284149,,,,,,,,,,,,0.049059733748435974,,,,,, +49,284199,,,,,,,,,,,,0.07306291908025742,,,,,, +49,284249,,,,,,,,,,,,0.05967835709452629,,,,,, +49,284299,,,,,,,,,,,,0.06763151288032532,,,,,, +49,284349,,,,,,,,,,,,0.05070076137781143,,,,,, +49,284399,,,,,,,,,,,,0.05450297147035599,,,,,, +49,284449,,,,,,,,,,,,0.06120065599679947,,,,,, +49,284499,,,,,,,,,,,,0.06846897304058075,,,,,, +49,284549,,,,,,,,,,,,0.05684947967529297,,,,,, +49,284599,,,,,,,,,,,,0.06045505404472351,,,,,, +49,284649,,,,,,,,,,,,0.059902288019657135,,,,,, +49,284699,,,,,,,,,,,,0.05682915821671486,,,,,, +49,284749,,,,,,,,,,,,0.06089895963668823,,,,,, +49,284799,,,,,,,,,,,,0.06610725820064545,,,,,, +49,284849,,,,,,,,,,,,0.05803658068180084,,,,,, +49,284899,,,,,,,,,,,,0.06779026985168457,,,,,, +49,284949,,,,,,,,,,,,0.059368886053562164,,,,,, +49,284999,,,,,,,,,,,,0.05732179060578346,,,,,, +49,285049,,,,,,,,,,,,0.05198262631893158,,,,,, +49,285099,,,,,,,,,,,,0.06135403364896774,,,,,, +49,285149,,,,,,,,,,,,0.0632900819182396,,,,,, +49,285199,,,,,,,,,,,,0.04979590326547623,,,,,, +49,285249,,,,,,,,,,,,0.05390454828739166,,,,,, +49,285299,,,,,,,,,,,,0.06502847373485565,,,,,, +49,285349,,,,,,,,,,,,0.053010325878858566,,,,,, +49,285399,,,,,,,,,,,,0.06162508204579353,,,,,, +49,285449,,,,,,,,,,,,0.051805607974529266,,,,,, +49,285499,,,,,,,,,,,,0.053701695054769516,,,,,, +49,285549,,,,,,,,,,,,0.06437557935714722,,,,,, +49,285599,,,,,,,,,,,,0.055554311722517014,,,,,, +49,285649,,,,,,,,,,,,0.060133058577775955,,,,,, +49,285699,,,,,,,,,,,,0.06762724369764328,,,,,, +49,285749,,,,,,,,,,,,0.054541222751140594,,,,,, +49,285799,,,,,,,,,,,,0.05857051908969879,,,,,, +49,285849,,,,,,,,,,,,0.05483267456293106,,,,,, +49,285899,,,,,,,,,,,,0.053669899702072144,,,,,, +49,285949,,,,,,,,,,,,0.0492815226316452,,,,,, +49,285999,,,,,,,,,,,,0.05954461544752121,,,,,, +49,286049,,,,,,,,,,,,0.050744615495204926,,,,,, +49,286099,,,,,,,,,,,,0.061882421374320984,,,,,, +49,286149,,,,,,,,,,,,0.05739040672779083,,,,,, +49,286199,,,,,,,,,,,,0.05800369381904602,,,,,, +49,286249,,,,,,,,,,,,0.053726740181446075,,,,,, +49,286299,,,,,,,,,,,,0.061369895935058594,,,,,, +49,286349,,,,,,,,,,,,0.06637995690107346,,,,,, +49,286399,,,,,,,,,,,,0.054548002779483795,,,,,, +49,286449,,,,,,,,,,,,0.055020108819007874,,,,,, +49,286499,,,,,,,,,,,,0.06868543475866318,,,,,, +49,286549,,,,,,,,,,,,0.060051754117012024,,,,,, +49,286599,,,,,,,,,,,,0.06525401026010513,,,,,, +49,286649,,,,,,,,,,,,0.056720901280641556,,,,,, +49,286699,,,,,,,,,,,,0.052026525139808655,,,,,, +49,286749,,,,,,,,,,,,0.058927737176418304,,,,,, +49,286799,,,,,,,,,,,,0.04150010645389557,,,,,, +49,286799,,,,,,,,,,,,,0.24351239204406738,0.08357883989810944,0.1993207037448883,-0.014049291610717773,0.19854450225830078,0.08357883989810944 +49,286799,,,,,,,0.20006661117076874,0.05864232778549194,0.5398450493812561,0.29144036769866943,0.5187963247299194,,,,,,, +50,286800,0.23960888385772705,0.07972735911607742,0.22666603326797485,0.035893023014068604,0.2204538881778717,0.07972735911607742,,,,,,,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a29f2f3575021653a9d106843dd9c07becd0f11b --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml @@ -0,0 +1,22 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: sweetnet + num_layers: 16 + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly +seed: 43 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..ba1403738c1f5c82b559bfa5f8ccb19d5918e0f0 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv @@ -0,0 +1,5838 @@ +epoch,step,test/MeanAbsoluteError,test/MeanSquaredError,test/PearsonCorrCoef,test/R2Score,test/SpearmanCorrCoef,test/loss,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +0,49,,,,,,,,,,,,0.08580975234508514,,,,,, +0,99,,,,,,,,,,,,0.0865742564201355,,,,,, +0,149,,,,,,,,,,,,0.08277498185634613,,,,,, +0,199,,,,,,,,,,,,0.07831317186355591,,,,,, +0,249,,,,,,,,,,,,0.08412470668554306,,,,,, +0,299,,,,,,,,,,,,0.07614336907863617,,,,,, +0,349,,,,,,,,,,,,0.08704472333192825,,,,,, +0,399,,,,,,,,,,,,0.08866694569587708,,,,,, +0,449,,,,,,,,,,,,0.09294465184211731,,,,,, +0,499,,,,,,,,,,,,0.0800577774643898,,,,,, +0,549,,,,,,,,,,,,0.07511471211910248,,,,,, +0,599,,,,,,,,,,,,0.09235646575689316,,,,,, +0,649,,,,,,,,,,,,0.08886007964611053,,,,,, +0,699,,,,,,,,,,,,0.081821009516716,,,,,, +0,749,,,,,,,,,,,,0.09014375507831573,,,,,, +0,799,,,,,,,,,,,,0.08129093796014786,,,,,, +0,849,,,,,,,,,,,,0.07768790423870087,,,,,, +0,899,,,,,,,,,,,,0.08186090737581253,,,,,, +0,949,,,,,,,,,,,,0.08253473043441772,,,,,, +0,999,,,,,,,,,,,,0.08693160116672516,,,,,, +0,1049,,,,,,,,,,,,0.07945992052555084,,,,,, +0,1099,,,,,,,,,,,,0.10268989205360413,,,,,, +0,1149,,,,,,,,,,,,0.07684272527694702,,,,,, +0,1199,,,,,,,,,,,,0.08223937451839447,,,,,, +0,1249,,,,,,,,,,,,0.071309894323349,,,,,, +0,1299,,,,,,,,,,,,0.08618707954883575,,,,,, +0,1349,,,,,,,,,,,,0.08490808308124542,,,,,, +0,1399,,,,,,,,,,,,0.09276431798934937,,,,,, +0,1449,,,,,,,,,,,,0.08279620110988617,,,,,, +0,1499,,,,,,,,,,,,0.08297087252140045,,,,,, +0,1549,,,,,,,,,,,,0.08212858438491821,,,,,, +0,1599,,,,,,,,,,,,0.07418148219585419,,,,,, +0,1649,,,,,,,,,,,,0.07990631461143494,,,,,, +0,1699,,,,,,,,,,,,0.09122902154922485,,,,,, +0,1749,,,,,,,,,,,,0.08609291911125183,,,,,, +0,1799,,,,,,,,,,,,0.08243834227323532,,,,,, +0,1849,,,,,,,,,,,,0.09063448011875153,,,,,, +0,1899,,,,,,,,,,,,0.0816660225391388,,,,,, +0,1949,,,,,,,,,,,,0.08214923739433289,,,,,, +0,1999,,,,,,,,,,,,0.08186234533786774,,,,,, +0,2049,,,,,,,,,,,,0.0852719247341156,,,,,, +0,2099,,,,,,,,,,,,0.09835760295391083,,,,,, +0,2149,,,,,,,,,,,,0.07133445143699646,,,,,, +0,2199,,,,,,,,,,,,0.07381471246480942,,,,,, +0,2249,,,,,,,,,,,,0.08589192479848862,,,,,, +0,2299,,,,,,,,,,,,0.07816831767559052,,,,,, +0,2349,,,,,,,,,,,,0.08139430731534958,,,,,, +0,2399,,,,,,,,,,,,0.08282202482223511,,,,,, +0,2449,,,,,,,,,,,,0.08450585603713989,,,,,, +0,2499,,,,,,,,,,,,0.09318490326404572,,,,,, +0,2549,,,,,,,,,,,,0.07279263436794281,,,,,, +0,2599,,,,,,,,,,,,0.08228711783885956,,,,,, +0,2649,,,,,,,,,,,,0.07410620152950287,,,,,, +0,2699,,,,,,,,,,,,0.07832898199558258,,,,,, +0,2749,,,,,,,,,,,,0.08865885436534882,,,,,, +0,2799,,,,,,,,,,,,0.09014072269201279,,,,,, +0,2849,,,,,,,,,,,,0.08831990510225296,,,,,, +0,2899,,,,,,,,,,,,0.07474406063556671,,,,,, +0,2949,,,,,,,,,,,,0.07307855039834976,,,,,, +0,2999,,,,,,,,,,,,0.08101397752761841,,,,,, +0,3049,,,,,,,,,,,,0.08105283230543137,,,,,, +0,3099,,,,,,,,,,,,0.07913433015346527,,,,,, +0,3149,,,,,,,,,,,,0.09141440689563751,,,,,, +0,3199,,,,,,,,,,,,0.07765214145183563,,,,,, +0,3249,,,,,,,,,,,,0.07313297688961029,,,,,, +0,3299,,,,,,,,,,,,0.07612308859825134,,,,,, +0,3349,,,,,,,,,,,,0.08218667656183243,,,,,, +0,3399,,,,,,,,,,,,0.0767599493265152,,,,,, +0,3449,,,,,,,,,,,,0.08876487612724304,,,,,, +0,3499,,,,,,,,,,,,0.08924684673547745,,,,,, +0,3549,,,,,,,,,,,,0.07754788547754288,,,,,, +0,3599,,,,,,,,,,,,0.07604189217090607,,,,,, +0,3649,,,,,,,,,,,,0.0759849101305008,,,,,, +0,3699,,,,,,,,,,,,0.0822094976902008,,,,,, +0,3749,,,,,,,,,,,,0.09394635260105133,,,,,, +0,3799,,,,,,,,,,,,0.08186846971511841,,,,,, +0,3849,,,,,,,,,,,,0.08441012352705002,,,,,, +0,3899,,,,,,,,,,,,0.07983755320310593,,,,,, +0,3949,,,,,,,,,,,,0.08198560029268265,,,,,, +0,3999,,,,,,,,,,,,0.08536016941070557,,,,,, +0,4049,,,,,,,,,,,,0.08112594485282898,,,,,, +0,4099,,,,,,,,,,,,0.10346872359514236,,,,,, +0,4149,,,,,,,,,,,,0.07580197602510452,,,,,, +0,4199,,,,,,,,,,,,0.083002008497715,,,,,, +0,4249,,,,,,,,,,,,0.08340749144554138,,,,,, +0,4299,,,,,,,,,,,,0.07719694077968597,,,,,, +0,4349,,,,,,,,,,,,0.09390930831432343,,,,,, +0,4399,,,,,,,,,,,,0.08296568691730499,,,,,, +0,4449,,,,,,,,,,,,0.07753463834524155,,,,,, +0,4499,,,,,,,,,,,,0.08855200558900833,,,,,, +0,4549,,,,,,,,,,,,0.08166321367025375,,,,,, +0,4599,,,,,,,,,,,,0.07687685638666153,,,,,, +0,4649,,,,,,,,,,,,0.08436915278434753,,,,,, +0,4699,,,,,,,,,,,,0.09248930215835571,,,,,, +0,4749,,,,,,,,,,,,0.08905898034572601,,,,,, +0,4799,,,,,,,,,,,,0.08372949808835983,,,,,, +0,4849,,,,,,,,,,,,0.09784062206745148,,,,,, +0,4899,,,,,,,,,,,,0.07618929445743561,,,,,, +0,4949,,,,,,,,,,,,0.07693201303482056,,,,,, +0,4999,,,,,,,,,,,,0.07785045355558395,,,,,, +0,5049,,,,,,,,,,,,0.08191724866628647,,,,,, +0,5099,,,,,,,,,,,,0.07947190850973129,,,,,, +0,5149,,,,,,,,,,,,0.08188550174236298,,,,,, +0,5199,,,,,,,,,,,,0.07992132008075714,,,,,, +0,5249,,,,,,,,,,,,0.09448248147964478,,,,,, +0,5299,,,,,,,,,,,,0.0755038857460022,,,,,, +0,5349,,,,,,,,,,,,0.08155886083841324,,,,,, +0,5399,,,,,,,,,,,,0.07024270296096802,,,,,, +0,5449,,,,,,,,,,,,0.07328243553638458,,,,,, +0,5499,,,,,,,,,,,,0.08187855780124664,,,,,, +0,5549,,,,,,,,,,,,0.07866936922073364,,,,,, +0,5599,,,,,,,,,,,,0.07586148381233215,,,,,, +0,5649,,,,,,,,,,,,0.08165936172008514,,,,,, +0,5699,,,,,,,,,,,,0.07531097531318665,,,,,, +0,5735,,,,,,,,,,,,,0.24598968029022217,0.08439577370882034,0.1606757938861847,-0.02396094799041748,0.1562248319387436,0.08439577370882034 +0,5735,,,,,,,0.24768884479999542,0.08313564956188202,0.09134826064109802,-0.004514932632446289,0.0888780802488327,,,,,,, +1,5749,,,,,,,,,,,,0.0798671767115593,,,,,, +1,5799,,,,,,,,,,,,0.07143732160329819,,,,,, +1,5849,,,,,,,,,,,,0.08420467376708984,,,,,, +1,5899,,,,,,,,,,,,0.07895352691411972,,,,,, +1,5949,,,,,,,,,,,,0.08448632806539536,,,,,, +1,5999,,,,,,,,,,,,0.08237256109714508,,,,,, +1,6049,,,,,,,,,,,,0.0793125256896019,,,,,, +1,6099,,,,,,,,,,,,0.09381768107414246,,,,,, +1,6149,,,,,,,,,,,,0.08375506103038788,,,,,, +1,6199,,,,,,,,,,,,0.07409307360649109,,,,,, +1,6249,,,,,,,,,,,,0.08350326120853424,,,,,, +1,6299,,,,,,,,,,,,0.08448164165019989,,,,,, +1,6349,,,,,,,,,,,,0.08611184358596802,,,,,, +1,6399,,,,,,,,,,,,0.09132737666368484,,,,,, +1,6449,,,,,,,,,,,,0.07859853655099869,,,,,, +1,6499,,,,,,,,,,,,0.09576472640037537,,,,,, +1,6549,,,,,,,,,,,,0.08654992282390594,,,,,, +1,6599,,,,,,,,,,,,0.08132164925336838,,,,,, +1,6649,,,,,,,,,,,,0.08492471277713776,,,,,, +1,6699,,,,,,,,,,,,0.0883462056517601,,,,,, +1,6749,,,,,,,,,,,,0.08495988696813583,,,,,, +1,6799,,,,,,,,,,,,0.07098232209682465,,,,,, +1,6849,,,,,,,,,,,,0.07915472984313965,,,,,, +1,6899,,,,,,,,,,,,0.08668359369039536,,,,,, +1,6949,,,,,,,,,,,,0.07050187140703201,,,,,, +1,6999,,,,,,,,,,,,0.09128344804048538,,,,,, +1,7049,,,,,,,,,,,,0.07982780039310455,,,,,, +1,7099,,,,,,,,,,,,0.09012377262115479,,,,,, +1,7149,,,,,,,,,,,,0.08772103488445282,,,,,, +1,7199,,,,,,,,,,,,0.08355877548456192,,,,,, +1,7249,,,,,,,,,,,,0.06971506029367447,,,,,, +1,7299,,,,,,,,,,,,0.06490092724561691,,,,,, +1,7349,,,,,,,,,,,,0.07696075737476349,,,,,, +1,7399,,,,,,,,,,,,0.0926467776298523,,,,,, +1,7449,,,,,,,,,,,,0.07279036194086075,,,,,, +1,7499,,,,,,,,,,,,0.07492222636938095,,,,,, +1,7549,,,,,,,,,,,,0.09106998890638351,,,,,, +1,7599,,,,,,,,,,,,0.0761076956987381,,,,,, +1,7649,,,,,,,,,,,,0.0788661390542984,,,,,, +1,7699,,,,,,,,,,,,0.07633581757545471,,,,,, +1,7749,,,,,,,,,,,,0.0782456174492836,,,,,, +1,7799,,,,,,,,,,,,0.0718236044049263,,,,,, +1,7849,,,,,,,,,,,,0.06775157153606415,,,,,, +1,7899,,,,,,,,,,,,0.091354139149189,,,,,, +1,7949,,,,,,,,,,,,0.07195383310317993,,,,,, +1,7999,,,,,,,,,,,,0.08147481083869934,,,,,, +1,8049,,,,,,,,,,,,0.08155448734760284,,,,,, +1,8099,,,,,,,,,,,,0.09070935845375061,,,,,, +1,8149,,,,,,,,,,,,0.08583500981330872,,,,,, +1,8199,,,,,,,,,,,,0.0686163678765297,,,,,, +1,8249,,,,,,,,,,,,0.07711303234100342,,,,,, +1,8299,,,,,,,,,,,,0.08081720769405365,,,,,, +1,8349,,,,,,,,,,,,0.08058111369609833,,,,,, +1,8399,,,,,,,,,,,,0.08430463075637817,,,,,, +1,8449,,,,,,,,,,,,0.08603458106517792,,,,,, +1,8499,,,,,,,,,,,,0.07902584969997406,,,,,, +1,8549,,,,,,,,,,,,0.07776779681444168,,,,,, +1,8599,,,,,,,,,,,,0.07340189814567566,,,,,, +1,8649,,,,,,,,,,,,0.08597806096076965,,,,,, +1,8699,,,,,,,,,,,,0.08104526996612549,,,,,, +1,8749,,,,,,,,,,,,0.08515475690364838,,,,,, +1,8799,,,,,,,,,,,,0.07897759974002838,,,,,, +1,8849,,,,,,,,,,,,0.0740574300289154,,,,,, +1,8899,,,,,,,,,,,,0.08284908533096313,,,,,, +1,8949,,,,,,,,,,,,0.0770706906914711,,,,,, +1,8999,,,,,,,,,,,,0.08367578685283661,,,,,, +1,9049,,,,,,,,,,,,0.0799122154712677,,,,,, +1,9099,,,,,,,,,,,,0.07915723323822021,,,,,, +1,9149,,,,,,,,,,,,0.08232385665178299,,,,,, +1,9199,,,,,,,,,,,,0.08918006718158722,,,,,, +1,9249,,,,,,,,,,,,0.09645269811153412,,,,,, +1,9299,,,,,,,,,,,,0.08185824751853943,,,,,, +1,9349,,,,,,,,,,,,0.08600311726331711,,,,,, +1,9399,,,,,,,,,,,,0.08670896291732788,,,,,, +1,9449,,,,,,,,,,,,0.06942819058895111,,,,,, +1,9499,,,,,,,,,,,,0.07873380184173584,,,,,, +1,9549,,,,,,,,,,,,0.08016033470630646,,,,,, +1,9599,,,,,,,,,,,,0.09265734255313873,,,,,, +1,9649,,,,,,,,,,,,0.0913558080792427,,,,,, +1,9699,,,,,,,,,,,,0.08245724439620972,,,,,, +1,9749,,,,,,,,,,,,0.07654149830341339,,,,,, +1,9799,,,,,,,,,,,,0.07485242187976837,,,,,, +1,9849,,,,,,,,,,,,0.06676408648490906,,,,,, +1,9899,,,,,,,,,,,,0.08204130828380585,,,,,, +1,9949,,,,,,,,,,,,0.07456330955028534,,,,,, +1,9999,,,,,,,,,,,,0.08142125606536865,,,,,, +1,10049,,,,,,,,,,,,0.08685693144798279,,,,,, +1,10099,,,,,,,,,,,,0.07490456104278564,,,,,, +1,10149,,,,,,,,,,,,0.0750647783279419,,,,,, +1,10199,,,,,,,,,,,,0.07757648825645447,,,,,, +1,10249,,,,,,,,,,,,0.07782728970050812,,,,,, +1,10299,,,,,,,,,,,,0.09014825522899628,,,,,, +1,10349,,,,,,,,,,,,0.08170808851718903,,,,,, +1,10399,,,,,,,,,,,,0.07957999408245087,,,,,, +1,10449,,,,,,,,,,,,0.08092909306287766,,,,,, +1,10499,,,,,,,,,,,,0.08264748752117157,,,,,, +1,10549,,,,,,,,,,,,0.07544633746147156,,,,,, +1,10599,,,,,,,,,,,,0.07556986808776855,,,,,, +1,10649,,,,,,,,,,,,0.08320403099060059,,,,,, +1,10699,,,,,,,,,,,,0.07593634724617004,,,,,, +1,10749,,,,,,,,,,,,0.06842193752527237,,,,,, +1,10799,,,,,,,,,,,,0.06540410220623016,,,,,, +1,10849,,,,,,,,,,,,0.08949300646781921,,,,,, +1,10899,,,,,,,,,,,,0.08248620480298996,,,,,, +1,10949,,,,,,,,,,,,0.07784761488437653,,,,,, +1,10999,,,,,,,,,,,,0.07780043035745621,,,,,, +1,11049,,,,,,,,,,,,0.0822930634021759,,,,,, +1,11099,,,,,,,,,,,,0.07522841542959213,,,,,, +1,11149,,,,,,,,,,,,0.0858532190322876,,,,,, +1,11199,,,,,,,,,,,,0.07039185613393784,,,,,, +1,11249,,,,,,,,,,,,0.07968135923147202,,,,,, +1,11299,,,,,,,,,,,,0.07700392603874207,,,,,, +1,11349,,,,,,,,,,,,0.059891536831855774,,,,,, +1,11399,,,,,,,,,,,,0.08526498079299927,,,,,, +1,11449,,,,,,,,,,,,0.08790314197540283,,,,,, +1,11471,,,,,,,,,,,,,0.24394822120666504,0.08115684986114502,0.16181080043315887,0.015336394309997559,0.15881383419036865,0.08115684986114502 +1,11471,,,,,,,0.2433740347623825,0.08006145805120468,0.18130089342594147,0.032618820667266846,0.1675451397895813,,,,,,, +2,11499,,,,,,,,,,,,0.07204703986644745,,,,,, +2,11549,,,,,,,,,,,,0.07885877788066864,,,,,, +2,11599,,,,,,,,,,,,0.08789423853158951,,,,,, +2,11649,,,,,,,,,,,,0.07640133053064346,,,,,, +2,11699,,,,,,,,,,,,0.08312328159809113,,,,,, +2,11749,,,,,,,,,,,,0.07336659729480743,,,,,, +2,11799,,,,,,,,,,,,0.07120859622955322,,,,,, +2,11849,,,,,,,,,,,,0.07444620877504349,,,,,, +2,11899,,,,,,,,,,,,0.08764435350894928,,,,,, +2,11949,,,,,,,,,,,,0.07808106392621994,,,,,, +2,11999,,,,,,,,,,,,0.06707243621349335,,,,,, +2,12049,,,,,,,,,,,,0.07843337953090668,,,,,, +2,12099,,,,,,,,,,,,0.08587503433227539,,,,,, +2,12149,,,,,,,,,,,,0.08164666593074799,,,,,, +2,12199,,,,,,,,,,,,0.08321487158536911,,,,,, +2,12249,,,,,,,,,,,,0.08268897235393524,,,,,, +2,12299,,,,,,,,,,,,0.0790160596370697,,,,,, +2,12349,,,,,,,,,,,,0.0792684257030487,,,,,, +2,12399,,,,,,,,,,,,0.0745508223772049,,,,,, +2,12449,,,,,,,,,,,,0.0830596461892128,,,,,, +2,12499,,,,,,,,,,,,0.08340182155370712,,,,,, +2,12549,,,,,,,,,,,,0.08672736585140228,,,,,, +2,12599,,,,,,,,,,,,0.073997363448143,,,,,, +2,12649,,,,,,,,,,,,0.07416946440935135,,,,,, +2,12699,,,,,,,,,,,,0.07202015817165375,,,,,, +2,12749,,,,,,,,,,,,0.06715920567512512,,,,,, +2,12799,,,,,,,,,,,,0.06718289852142334,,,,,, +2,12849,,,,,,,,,,,,0.07023343443870544,,,,,, +2,12899,,,,,,,,,,,,0.07840429991483688,,,,,, +2,12949,,,,,,,,,,,,0.09354999661445618,,,,,, +2,12999,,,,,,,,,,,,0.08341516554355621,,,,,, +2,13049,,,,,,,,,,,,0.0861927717924118,,,,,, +2,13099,,,,,,,,,,,,0.08491978794336319,,,,,, +2,13149,,,,,,,,,,,,0.08987633883953094,,,,,, +2,13199,,,,,,,,,,,,0.08146747946739197,,,,,, +2,13249,,,,,,,,,,,,0.0799313336610794,,,,,, +2,13299,,,,,,,,,,,,0.07607503235340118,,,,,, +2,13349,,,,,,,,,,,,0.08303643763065338,,,,,, +2,13399,,,,,,,,,,,,0.0820140689611435,,,,,, +2,13449,,,,,,,,,,,,0.09328225255012512,,,,,, +2,13499,,,,,,,,,,,,0.08138246834278107,,,,,, +2,13549,,,,,,,,,,,,0.09123177826404572,,,,,, +2,13599,,,,,,,,,,,,0.07363444566726685,,,,,, +2,13649,,,,,,,,,,,,0.08287270367145538,,,,,, +2,13699,,,,,,,,,,,,0.09581562876701355,,,,,, +2,13749,,,,,,,,,,,,0.08429448306560516,,,,,, +2,13799,,,,,,,,,,,,0.09301070123910904,,,,,, +2,13849,,,,,,,,,,,,0.08592423051595688,,,,,, +2,13899,,,,,,,,,,,,0.09361153095960617,,,,,, +2,13949,,,,,,,,,,,,0.07437971979379654,,,,,, +2,13999,,,,,,,,,,,,0.08544754236936569,,,,,, +2,14049,,,,,,,,,,,,0.08231326937675476,,,,,, +2,14099,,,,,,,,,,,,0.0705980509519577,,,,,, +2,14149,,,,,,,,,,,,0.09003135561943054,,,,,, +2,14199,,,,,,,,,,,,0.08703963458538055,,,,,, +2,14249,,,,,,,,,,,,0.0865008682012558,,,,,, +2,14299,,,,,,,,,,,,0.08631068468093872,,,,,, +2,14349,,,,,,,,,,,,0.09042560309171677,,,,,, +2,14399,,,,,,,,,,,,0.09079091995954514,,,,,, +2,14449,,,,,,,,,,,,0.06957072764635086,,,,,, +2,14499,,,,,,,,,,,,0.07809161394834518,,,,,, +2,14549,,,,,,,,,,,,0.09024231135845184,,,,,, +2,14599,,,,,,,,,,,,0.07498668879270554,,,,,, +2,14649,,,,,,,,,,,,0.08507773280143738,,,,,, +2,14699,,,,,,,,,,,,0.08429954946041107,,,,,, +2,14749,,,,,,,,,,,,0.09592278301715851,,,,,, +2,14799,,,,,,,,,,,,0.07792314141988754,,,,,, +2,14849,,,,,,,,,,,,0.0791693776845932,,,,,, +2,14899,,,,,,,,,,,,0.07166451960802078,,,,,, +2,14949,,,,,,,,,,,,0.0892946869134903,,,,,, +2,14999,,,,,,,,,,,,0.07970808446407318,,,,,, +2,15049,,,,,,,,,,,,0.08092092722654343,,,,,, +2,15099,,,,,,,,,,,,0.08646053820848465,,,,,, +2,15149,,,,,,,,,,,,0.08130451291799545,,,,,, +2,15199,,,,,,,,,,,,0.09343168139457703,,,,,, +2,15249,,,,,,,,,,,,0.08340364694595337,,,,,, +2,15299,,,,,,,,,,,,0.0808357447385788,,,,,, +2,15349,,,,,,,,,,,,0.0963856652379036,,,,,, +2,15399,,,,,,,,,,,,0.08757452666759491,,,,,, +2,15449,,,,,,,,,,,,0.08131580799818039,,,,,, +2,15499,,,,,,,,,,,,0.07900043576955795,,,,,, +2,15549,,,,,,,,,,,,0.07697518169879913,,,,,, +2,15599,,,,,,,,,,,,0.08053872734308243,,,,,, +2,15649,,,,,,,,,,,,0.07992395758628845,,,,,, +2,15699,,,,,,,,,,,,0.09601785242557526,,,,,, +2,15749,,,,,,,,,,,,0.0835433304309845,,,,,, +2,15799,,,,,,,,,,,,0.07625938951969147,,,,,, +2,15849,,,,,,,,,,,,0.08651016652584076,,,,,, +2,15899,,,,,,,,,,,,0.07768994569778442,,,,,, +2,15949,,,,,,,,,,,,0.07911263406276703,,,,,, +2,15999,,,,,,,,,,,,0.08952170610427856,,,,,, +2,16049,,,,,,,,,,,,0.08457794785499573,,,,,, +2,16099,,,,,,,,,,,,0.07716729491949081,,,,,, +2,16149,,,,,,,,,,,,0.09236063063144684,,,,,, +2,16199,,,,,,,,,,,,0.09673577547073364,,,,,, +2,16249,,,,,,,,,,,,0.08661249279975891,,,,,, +2,16299,,,,,,,,,,,,0.0796855241060257,,,,,, +2,16349,,,,,,,,,,,,0.0867634117603302,,,,,, +2,16399,,,,,,,,,,,,0.08083632588386536,,,,,, +2,16449,,,,,,,,,,,,0.08396969735622406,,,,,, +2,16499,,,,,,,,,,,,0.07536089420318604,,,,,, +2,16549,,,,,,,,,,,,0.08028421550989151,,,,,, +2,16599,,,,,,,,,,,,0.08839339017868042,,,,,, +2,16649,,,,,,,,,,,,0.07618032395839691,,,,,, +2,16699,,,,,,,,,,,,0.07989488542079926,,,,,, +2,16749,,,,,,,,,,,,0.08556758612394333,,,,,, +2,16799,,,,,,,,,,,,0.09031961858272552,,,,,, +2,16849,,,,,,,,,,,,0.0812363550066948,,,,,, +2,16899,,,,,,,,,,,,0.09495227038860321,,,,,, +2,16949,,,,,,,,,,,,0.08923308551311493,,,,,, +2,16999,,,,,,,,,,,,0.0838148295879364,,,,,, +2,17049,,,,,,,,,,,,0.07588563859462738,,,,,, +2,17099,,,,,,,,,,,,0.08642862737178802,,,,,, +2,17149,,,,,,,,,,,,0.07121974974870682,,,,,, +2,17199,,,,,,,,,,,,0.08797359466552734,,,,,, +2,17207,,,,,,,,,,,,,0.2491123527288437,0.08341646194458008,nan,-0.012079119682312012,0.023729320615530014,0.08341646194458008 +2,17207,,,,,,,0.24734939634799957,0.08241688460111618,0.08365468680858612,0.004169762134552002,0.06155623868107796,,,,,,, +3,17249,,,,,,,,,,,,0.09631159901618958,,,,,, +3,17299,,,,,,,,,,,,0.08537551760673523,,,,,, +3,17349,,,,,,,,,,,,0.08873657882213593,,,,,, +3,17399,,,,,,,,,,,,0.08577844500541687,,,,,, +3,17449,,,,,,,,,,,,0.08598382771015167,,,,,, +3,17499,,,,,,,,,,,,0.08904334902763367,,,,,, +3,17549,,,,,,,,,,,,0.08243609219789505,,,,,, +3,17599,,,,,,,,,,,,0.07640525698661804,,,,,, +3,17649,,,,,,,,,,,,0.07739228010177612,,,,,, +3,17699,,,,,,,,,,,,0.08755891025066376,,,,,, +3,17749,,,,,,,,,,,,0.07900649309158325,,,,,, +3,17799,,,,,,,,,,,,0.09090045094490051,,,,,, +3,17849,,,,,,,,,,,,0.07324156165122986,,,,,, +3,17899,,,,,,,,,,,,0.08804965019226074,,,,,, +3,17949,,,,,,,,,,,,0.0851813554763794,,,,,, +3,17999,,,,,,,,,,,,0.08512093126773834,,,,,, +3,18049,,,,,,,,,,,,0.08336298167705536,,,,,, +3,18099,,,,,,,,,,,,0.09247681498527527,,,,,, +3,18149,,,,,,,,,,,,0.08912694454193115,,,,,, +3,18199,,,,,,,,,,,,0.08625393360853195,,,,,, +3,18249,,,,,,,,,,,,0.07296253740787506,,,,,, +3,18299,,,,,,,,,,,,0.07914367318153381,,,,,, +3,18349,,,,,,,,,,,,0.09123386442661285,,,,,, +3,18399,,,,,,,,,,,,0.0852641761302948,,,,,, +3,18449,,,,,,,,,,,,0.07714588940143585,,,,,, +3,18499,,,,,,,,,,,,0.07936356961727142,,,,,, +3,18549,,,,,,,,,,,,0.08635218441486359,,,,,, +3,18599,,,,,,,,,,,,0.08868074417114258,,,,,, +3,18649,,,,,,,,,,,,0.0896693617105484,,,,,, +3,18699,,,,,,,,,,,,0.07702712714672089,,,,,, +3,18749,,,,,,,,,,,,0.08765770494937897,,,,,, +3,18799,,,,,,,,,,,,0.08091287314891815,,,,,, +3,18849,,,,,,,,,,,,0.08069419115781784,,,,,, +3,18899,,,,,,,,,,,,0.08218970149755478,,,,,, +3,18949,,,,,,,,,,,,0.08834223449230194,,,,,, +3,18999,,,,,,,,,,,,0.08633308112621307,,,,,, +3,19049,,,,,,,,,,,,0.08778352290391922,,,,,, +3,19099,,,,,,,,,,,,0.07649031281471252,,,,,, +3,19149,,,,,,,,,,,,0.08248339593410492,,,,,, +3,19199,,,,,,,,,,,,0.07183466851711273,,,,,, +3,19249,,,,,,,,,,,,0.0860898345708847,,,,,, +3,19299,,,,,,,,,,,,0.0924607366323471,,,,,, +3,19349,,,,,,,,,,,,0.07588094472885132,,,,,, +3,19399,,,,,,,,,,,,0.07925685495138168,,,,,, +3,19449,,,,,,,,,,,,0.08762426674365997,,,,,, +3,19499,,,,,,,,,,,,0.08468610048294067,,,,,, +3,19549,,,,,,,,,,,,0.08143363893032074,,,,,, +3,19599,,,,,,,,,,,,0.09268924593925476,,,,,, +3,19649,,,,,,,,,,,,0.08186116814613342,,,,,, +3,19699,,,,,,,,,,,,0.08073921501636505,,,,,, +3,19749,,,,,,,,,,,,0.08276793360710144,,,,,, +3,19799,,,,,,,,,,,,0.0777183324098587,,,,,, +3,19849,,,,,,,,,,,,0.07865928113460541,,,,,, +3,19899,,,,,,,,,,,,0.07701508700847626,,,,,, +3,19949,,,,,,,,,,,,0.07230329513549805,,,,,, +3,19999,,,,,,,,,,,,0.07738178968429565,,,,,, +3,20049,,,,,,,,,,,,0.07842324674129486,,,,,, +3,20099,,,,,,,,,,,,0.08592244982719421,,,,,, +3,20149,,,,,,,,,,,,0.07770650088787079,,,,,, +3,20199,,,,,,,,,,,,0.08809415251016617,,,,,, +3,20249,,,,,,,,,,,,0.08379004895687103,,,,,, +3,20299,,,,,,,,,,,,0.08849909901618958,,,,,, +3,20349,,,,,,,,,,,,0.08231760561466217,,,,,, +3,20399,,,,,,,,,,,,0.07862458378076553,,,,,, +3,20449,,,,,,,,,,,,0.0769985169172287,,,,,, +3,20499,,,,,,,,,,,,0.0802607387304306,,,,,, +3,20549,,,,,,,,,,,,0.08270454406738281,,,,,, +3,20599,,,,,,,,,,,,0.09145589172840118,,,,,, +3,20649,,,,,,,,,,,,0.08166526257991791,,,,,, +3,20699,,,,,,,,,,,,0.08040663599967957,,,,,, +3,20749,,,,,,,,,,,,0.0928073525428772,,,,,, +3,20799,,,,,,,,,,,,0.08247315883636475,,,,,, +3,20849,,,,,,,,,,,,0.08499165624380112,,,,,, +3,20899,,,,,,,,,,,,0.08354499191045761,,,,,, +3,20949,,,,,,,,,,,,0.08234502375125885,,,,,, +3,20999,,,,,,,,,,,,0.0777464359998703,,,,,, +3,21049,,,,,,,,,,,,0.07733918726444244,,,,,, +3,21099,,,,,,,,,,,,0.07952076196670532,,,,,, +3,21149,,,,,,,,,,,,0.08332663029432297,,,,,, +3,21199,,,,,,,,,,,,0.07610156387090683,,,,,, +3,21249,,,,,,,,,,,,0.08606413006782532,,,,,, +3,21299,,,,,,,,,,,,0.09438969194889069,,,,,, +3,21349,,,,,,,,,,,,0.08827970921993256,,,,,, +3,21399,,,,,,,,,,,,0.0668647363781929,,,,,, +3,21449,,,,,,,,,,,,0.08533775061368942,,,,,, +3,21499,,,,,,,,,,,,0.09492692351341248,,,,,, +3,21549,,,,,,,,,,,,0.08166208863258362,,,,,, +3,21599,,,,,,,,,,,,0.086277075111866,,,,,, +3,21649,,,,,,,,,,,,0.0731201097369194,,,,,, +3,21699,,,,,,,,,,,,0.08679342269897461,,,,,, +3,21749,,,,,,,,,,,,0.08212145417928696,,,,,, +3,21799,,,,,,,,,,,,0.08477621525526047,,,,,, +3,21849,,,,,,,,,,,,0.08466339856386185,,,,,, +3,21899,,,,,,,,,,,,0.0824555903673172,,,,,, +3,21949,,,,,,,,,,,,0.07839442789554596,,,,,, +3,21999,,,,,,,,,,,,0.08434472978115082,,,,,, +3,22049,,,,,,,,,,,,0.08455066382884979,,,,,, +3,22099,,,,,,,,,,,,0.07295748591423035,,,,,, +3,22149,,,,,,,,,,,,0.08783077448606491,,,,,, +3,22199,,,,,,,,,,,,0.06878329813480377,,,,,, +3,22249,,,,,,,,,,,,0.09340129792690277,,,,,, +3,22299,,,,,,,,,,,,0.08322238177061081,,,,,, +3,22349,,,,,,,,,,,,0.07458870112895966,,,,,, +3,22399,,,,,,,,,,,,0.07614226639270782,,,,,, +3,22449,,,,,,,,,,,,0.0852021723985672,,,,,, +3,22499,,,,,,,,,,,,0.07195521891117096,,,,,, +3,22549,,,,,,,,,,,,0.08760158717632294,,,,,, +3,22599,,,,,,,,,,,,0.0890461653470993,,,,,, +3,22649,,,,,,,,,,,,0.08333602547645569,,,,,, +3,22699,,,,,,,,,,,,0.08580881357192993,,,,,, +3,22749,,,,,,,,,,,,0.07694317400455475,,,,,, +3,22799,,,,,,,,,,,,0.08276400715112686,,,,,, +3,22849,,,,,,,,,,,,0.08509521186351776,,,,,, +3,22899,,,,,,,,,,,,0.09468309581279755,,,,,, +3,22943,,,,,,,,,,,,,0.2486223429441452,0.08279570192098618,nan,-0.004547595977783203,-0.0027431175112724304,0.08279570192098618 +3,22943,,,,,,,0.24889661371707916,0.08285333216190338,nan,-0.001106858253479004,0.00032872456358745694,,,,,,, +4,22949,,,,,,,,,,,,0.09014133363962173,,,,,, +4,22999,,,,,,,,,,,,0.08326780796051025,,,,,, +4,23049,,,,,,,,,,,,0.08374430984258652,,,,,, +4,23099,,,,,,,,,,,,0.07997021079063416,,,,,, +4,23149,,,,,,,,,,,,0.08609237521886826,,,,,, +4,23199,,,,,,,,,,,,0.09432649612426758,,,,,, +4,23249,,,,,,,,,,,,0.08415436744689941,,,,,, +4,23299,,,,,,,,,,,,0.07932355254888535,,,,,, +4,23349,,,,,,,,,,,,0.08611724525690079,,,,,, +4,23399,,,,,,,,,,,,0.07907197624444962,,,,,, +4,23449,,,,,,,,,,,,0.08510762453079224,,,,,, +4,23499,,,,,,,,,,,,0.08553583920001984,,,,,, +4,23549,,,,,,,,,,,,0.09566193073987961,,,,,, +4,23599,,,,,,,,,,,,0.07349196076393127,,,,,, +4,23649,,,,,,,,,,,,0.07019690424203873,,,,,, +4,23699,,,,,,,,,,,,0.08124440908432007,,,,,, +4,23749,,,,,,,,,,,,0.08684229850769043,,,,,, +4,23799,,,,,,,,,,,,0.0779491439461708,,,,,, +4,23849,,,,,,,,,,,,0.08849319070577621,,,,,, +4,23899,,,,,,,,,,,,0.08798985183238983,,,,,, +4,23949,,,,,,,,,,,,0.07845164835453033,,,,,, +4,23999,,,,,,,,,,,,0.08220025151968002,,,,,, +4,24049,,,,,,,,,,,,0.08976122736930847,,,,,, +4,24099,,,,,,,,,,,,0.08331673592329025,,,,,, +4,24149,,,,,,,,,,,,0.08239728957414627,,,,,, +4,24199,,,,,,,,,,,,0.07897710800170898,,,,,, +4,24249,,,,,,,,,,,,0.07801114022731781,,,,,, +4,24299,,,,,,,,,,,,0.08098001778125763,,,,,, +4,24349,,,,,,,,,,,,0.07593326270580292,,,,,, +4,24399,,,,,,,,,,,,0.08012989163398743,,,,,, +4,24449,,,,,,,,,,,,0.08644965291023254,,,,,, +4,24499,,,,,,,,,,,,0.08271591365337372,,,,,, +4,24549,,,,,,,,,,,,0.09550172835588455,,,,,, +4,24599,,,,,,,,,,,,0.08359138667583466,,,,,, +4,24649,,,,,,,,,,,,0.08561688661575317,,,,,, +4,24699,,,,,,,,,,,,0.0759880468249321,,,,,, +4,24749,,,,,,,,,,,,0.07715120166540146,,,,,, +4,24799,,,,,,,,,,,,0.08368390798568726,,,,,, +4,24849,,,,,,,,,,,,0.08387291431427002,,,,,, +4,24899,,,,,,,,,,,,0.08625450730323792,,,,,, +4,24949,,,,,,,,,,,,0.07818093150854111,,,,,, +4,24999,,,,,,,,,,,,0.09375172853469849,,,,,, +4,25049,,,,,,,,,,,,0.08463770151138306,,,,,, +4,25099,,,,,,,,,,,,0.07787220180034637,,,,,, +4,25149,,,,,,,,,,,,0.0825817808508873,,,,,, +4,25199,,,,,,,,,,,,0.07483114302158356,,,,,, +4,25249,,,,,,,,,,,,0.07006382197141647,,,,,, +4,25299,,,,,,,,,,,,0.0829174816608429,,,,,, +4,25349,,,,,,,,,,,,0.07324682921171188,,,,,, +4,25399,,,,,,,,,,,,0.08737663179636002,,,,,, +4,25449,,,,,,,,,,,,0.08289647102355957,,,,,, +4,25499,,,,,,,,,,,,0.07314913719892502,,,,,, +4,25549,,,,,,,,,,,,0.07701773941516876,,,,,, +4,25599,,,,,,,,,,,,0.08401687443256378,,,,,, +4,25649,,,,,,,,,,,,0.07983825355768204,,,,,, +4,25699,,,,,,,,,,,,0.08322092890739441,,,,,, +4,25749,,,,,,,,,,,,0.07597571611404419,,,,,, +4,25799,,,,,,,,,,,,0.09025591611862183,,,,,, +4,25849,,,,,,,,,,,,0.08707984536886215,,,,,, +4,25899,,,,,,,,,,,,0.07598911225795746,,,,,, +4,25949,,,,,,,,,,,,0.0860019400715828,,,,,, +4,25999,,,,,,,,,,,,0.08037159591913223,,,,,, +4,26049,,,,,,,,,,,,0.09146478772163391,,,,,, +4,26099,,,,,,,,,,,,0.07916215062141418,,,,,, +4,26149,,,,,,,,,,,,0.07627134770154953,,,,,, +4,26199,,,,,,,,,,,,0.08373338729143143,,,,,, +4,26249,,,,,,,,,,,,0.08586781471967697,,,,,, +4,26299,,,,,,,,,,,,0.07131214439868927,,,,,, +4,26349,,,,,,,,,,,,0.07951468974351883,,,,,, +4,26399,,,,,,,,,,,,0.08835624158382416,,,,,, +4,26449,,,,,,,,,,,,0.08367010205984116,,,,,, +4,26499,,,,,,,,,,,,0.08519405126571655,,,,,, +4,26549,,,,,,,,,,,,0.08674608916044235,,,,,, +4,26599,,,,,,,,,,,,0.08867309242486954,,,,,, +4,26649,,,,,,,,,,,,0.08699770271778107,,,,,, +4,26699,,,,,,,,,,,,0.09438522160053253,,,,,, +4,26749,,,,,,,,,,,,0.07582465559244156,,,,,, +4,26799,,,,,,,,,,,,0.07768769562244415,,,,,, +4,26849,,,,,,,,,,,,0.0862586572766304,,,,,, +4,26899,,,,,,,,,,,,0.08901811391115189,,,,,, +4,26949,,,,,,,,,,,,0.08644387871026993,,,,,, +4,26999,,,,,,,,,,,,0.08346271514892578,,,,,, +4,27049,,,,,,,,,,,,0.09982907772064209,,,,,, +4,27099,,,,,,,,,,,,0.07645444571971893,,,,,, +4,27149,,,,,,,,,,,,0.0792946070432663,,,,,, +4,27199,,,,,,,,,,,,0.08639595657587051,,,,,, +4,27249,,,,,,,,,,,,0.07940947264432907,,,,,, +4,27299,,,,,,,,,,,,0.08544941246509552,,,,,, +4,27349,,,,,,,,,,,,0.0892256647348404,,,,,, +4,27399,,,,,,,,,,,,0.08026586472988129,,,,,, +4,27449,,,,,,,,,,,,0.0789160430431366,,,,,, +4,27499,,,,,,,,,,,,0.07694491744041443,,,,,, +4,27549,,,,,,,,,,,,0.0778847187757492,,,,,, +4,27599,,,,,,,,,,,,0.08682301640510559,,,,,, +4,27649,,,,,,,,,,,,0.08482682704925537,,,,,, +4,27699,,,,,,,,,,,,0.07870282977819443,,,,,, +4,27749,,,,,,,,,,,,0.07839307934045792,,,,,, +4,27799,,,,,,,,,,,,0.07797212898731232,,,,,, +4,27849,,,,,,,,,,,,0.0838869959115982,,,,,, +4,27899,,,,,,,,,,,,0.07946926355361938,,,,,, +4,27949,,,,,,,,,,,,0.07302390038967133,,,,,, +4,27999,,,,,,,,,,,,0.09280280768871307,,,,,, +4,28049,,,,,,,,,,,,0.08420862257480621,,,,,, +4,28099,,,,,,,,,,,,0.07722492516040802,,,,,, +4,28149,,,,,,,,,,,,0.09284734725952148,,,,,, +4,28199,,,,,,,,,,,,0.0782669186592102,,,,,, +4,28249,,,,,,,,,,,,0.08773306012153625,,,,,, +4,28299,,,,,,,,,,,,0.08102624863386154,,,,,, +4,28349,,,,,,,,,,,,0.08930367976427078,,,,,, +4,28399,,,,,,,,,,,,0.0764121562242508,,,,,, +4,28449,,,,,,,,,,,,0.08132275938987732,,,,,, +4,28499,,,,,,,,,,,,0.07978881895542145,,,,,, +4,28549,,,,,,,,,,,,0.08076728135347366,,,,,, +4,28599,,,,,,,,,,,,0.08984375,,,,,, +4,28649,,,,,,,,,,,,0.08679497987031937,,,,,, +4,28679,,,,,,,,,,,,,0.24905191361904144,0.08336309343576431,nan,-0.011431574821472168,0.006386330351233482,0.08336309343576431 +4,28679,,,,,,,0.2491205930709839,0.08317885547876358,0.0012862642761319876,-0.005041718482971191,0.0005967858014628291,,,,,,, +5,28699,,,,,,,,,,,,0.07956106960773468,,,,,, +5,28749,,,,,,,,,,,,0.08427484333515167,,,,,, +5,28799,,,,,,,,,,,,0.07019741088151932,,,,,, +5,28849,,,,,,,,,,,,0.08140461146831512,,,,,, +5,28899,,,,,,,,,,,,0.07901090383529663,,,,,, +5,28949,,,,,,,,,,,,0.07445840537548065,,,,,, +5,28999,,,,,,,,,,,,0.09353651106357574,,,,,, +5,29049,,,,,,,,,,,,0.07328944653272629,,,,,, +5,29099,,,,,,,,,,,,0.08327627182006836,,,,,, +5,29149,,,,,,,,,,,,0.08769986033439636,,,,,, +5,29199,,,,,,,,,,,,0.08905406296253204,,,,,, +5,29249,,,,,,,,,,,,0.08717378973960876,,,,,, +5,29299,,,,,,,,,,,,0.0804654210805893,,,,,, +5,29349,,,,,,,,,,,,0.08764851093292236,,,,,, +5,29399,,,,,,,,,,,,0.08801194280385971,,,,,, +5,29449,,,,,,,,,,,,0.08022549748420715,,,,,, +5,29499,,,,,,,,,,,,0.09078850597143173,,,,,, +5,29549,,,,,,,,,,,,0.103055439889431,,,,,, +5,29599,,,,,,,,,,,,0.07867473363876343,,,,,, +5,29649,,,,,,,,,,,,0.09179633855819702,,,,,, +5,29699,,,,,,,,,,,,0.08074843883514404,,,,,, +5,29749,,,,,,,,,,,,0.07899904996156693,,,,,, +5,29799,,,,,,,,,,,,0.08041387796401978,,,,,, +5,29849,,,,,,,,,,,,0.07707226276397705,,,,,, +5,29899,,,,,,,,,,,,0.08492981642484665,,,,,, +5,29949,,,,,,,,,,,,0.08793400228023529,,,,,, +5,29999,,,,,,,,,,,,0.07300983369350433,,,,,, +5,30049,,,,,,,,,,,,0.08683902025222778,,,,,, +5,30099,,,,,,,,,,,,0.0759204775094986,,,,,, +5,30149,,,,,,,,,,,,0.08049383014440536,,,,,, +5,30199,,,,,,,,,,,,0.07033021748065948,,,,,, +5,30249,,,,,,,,,,,,0.0904255285859108,,,,,, +5,30299,,,,,,,,,,,,0.07799481600522995,,,,,, +5,30349,,,,,,,,,,,,0.08240426331758499,,,,,, +5,30399,,,,,,,,,,,,0.09815101325511932,,,,,, +5,30449,,,,,,,,,,,,0.07800933718681335,,,,,, +5,30499,,,,,,,,,,,,0.08592146635055542,,,,,, +5,30549,,,,,,,,,,,,0.08504149317741394,,,,,, +5,30599,,,,,,,,,,,,0.08930887281894684,,,,,, +5,30649,,,,,,,,,,,,0.08012513816356659,,,,,, +5,30699,,,,,,,,,,,,0.08044081926345825,,,,,, +5,30749,,,,,,,,,,,,0.08155722916126251,,,,,, +5,30799,,,,,,,,,,,,0.062059879302978516,,,,,, +5,30849,,,,,,,,,,,,0.07798494398593903,,,,,, +5,30899,,,,,,,,,,,,0.08173089474439621,,,,,, +5,30949,,,,,,,,,,,,0.08408686518669128,,,,,, +5,30999,,,,,,,,,,,,0.08504807204008102,,,,,, +5,31049,,,,,,,,,,,,0.08230768889188766,,,,,, +5,31099,,,,,,,,,,,,0.08131839334964752,,,,,, +5,31149,,,,,,,,,,,,0.08924957364797592,,,,,, +5,31199,,,,,,,,,,,,0.07538197934627533,,,,,, +5,31249,,,,,,,,,,,,0.08530119806528091,,,,,, +5,31299,,,,,,,,,,,,0.08331646025180817,,,,,, +5,31349,,,,,,,,,,,,0.08860258013010025,,,,,, +5,31399,,,,,,,,,,,,0.07963844388723373,,,,,, +5,31449,,,,,,,,,,,,0.07418741285800934,,,,,, +5,31499,,,,,,,,,,,,0.07755925506353378,,,,,, +5,31549,,,,,,,,,,,,0.09355596452951431,,,,,, +5,31599,,,,,,,,,,,,0.08085592836141586,,,,,, +5,31649,,,,,,,,,,,,0.07935658097267151,,,,,, +5,31699,,,,,,,,,,,,0.07873302698135376,,,,,, +5,31749,,,,,,,,,,,,0.07325004786252975,,,,,, +5,31799,,,,,,,,,,,,0.08438166975975037,,,,,, +5,31849,,,,,,,,,,,,0.08208818733692169,,,,,, +5,31899,,,,,,,,,,,,0.09643422067165375,,,,,, +5,31949,,,,,,,,,,,,0.08244803547859192,,,,,, +5,31999,,,,,,,,,,,,0.08608020097017288,,,,,, +5,32049,,,,,,,,,,,,0.07896184921264648,,,,,, +5,32099,,,,,,,,,,,,0.08270226418972015,,,,,, +5,32149,,,,,,,,,,,,0.0820164903998375,,,,,, +5,32199,,,,,,,,,,,,0.08174267411231995,,,,,, +5,32249,,,,,,,,,,,,0.09519214928150177,,,,,, +5,32299,,,,,,,,,,,,0.08691864460706711,,,,,, +5,32349,,,,,,,,,,,,0.08356080204248428,,,,,, +5,32399,,,,,,,,,,,,0.0822904035449028,,,,,, +5,32449,,,,,,,,,,,,0.08157502114772797,,,,,, +5,32499,,,,,,,,,,,,0.0907004177570343,,,,,, +5,32549,,,,,,,,,,,,0.09441731125116348,,,,,, +5,32599,,,,,,,,,,,,0.08828089386224747,,,,,, +5,32649,,,,,,,,,,,,0.08460188657045364,,,,,, +5,32699,,,,,,,,,,,,0.06881649792194366,,,,,, +5,32749,,,,,,,,,,,,0.08044642210006714,,,,,, +5,32799,,,,,,,,,,,,0.08485319465398788,,,,,, +5,32849,,,,,,,,,,,,0.07874102890491486,,,,,, +5,32899,,,,,,,,,,,,0.08323486894369125,,,,,, +5,32949,,,,,,,,,,,,0.07758945226669312,,,,,, +5,32999,,,,,,,,,,,,0.0681120753288269,,,,,, +5,33049,,,,,,,,,,,,0.07845208793878555,,,,,, +5,33099,,,,,,,,,,,,0.07292249798774719,,,,,, +5,33149,,,,,,,,,,,,0.08761753886938095,,,,,, +5,33199,,,,,,,,,,,,0.07773226499557495,,,,,, +5,33249,,,,,,,,,,,,0.08422604203224182,,,,,, +5,33299,,,,,,,,,,,,0.0718846321105957,,,,,, +5,33349,,,,,,,,,,,,0.07244821637868881,,,,,, +5,33399,,,,,,,,,,,,0.08746525645256042,,,,,, +5,33449,,,,,,,,,,,,0.06899505108594894,,,,,, +5,33499,,,,,,,,,,,,0.07533663511276245,,,,,, +5,33549,,,,,,,,,,,,0.08274255692958832,,,,,, +5,33599,,,,,,,,,,,,0.07331804931163788,,,,,, +5,33649,,,,,,,,,,,,0.07748803496360779,,,,,, +5,33699,,,,,,,,,,,,0.07933704555034637,,,,,, +5,33749,,,,,,,,,,,,0.08233380317687988,,,,,, +5,33799,,,,,,,,,,,,0.08409640192985535,,,,,, +5,33849,,,,,,,,,,,,0.08082148432731628,,,,,, +5,33899,,,,,,,,,,,,0.07516109943389893,,,,,, +5,33949,,,,,,,,,,,,0.09854631125926971,,,,,, +5,33999,,,,,,,,,,,,0.08798384666442871,,,,,, +5,34049,,,,,,,,,,,,0.07768687605857849,,,,,, +5,34099,,,,,,,,,,,,0.08916075527667999,,,,,, +5,34149,,,,,,,,,,,,0.08628417551517487,,,,,, +5,34199,,,,,,,,,,,,0.07890818268060684,,,,,, +5,34249,,,,,,,,,,,,0.09349869191646576,,,,,, +5,34299,,,,,,,,,,,,0.0888187363743782,,,,,, +5,34349,,,,,,,,,,,,0.08562786132097244,,,,,, +5,34399,,,,,,,,,,,,0.08679318428039551,,,,,, +5,34415,,,,,,,,,,,,,0.25285977125167847,0.08738227933645248,nan,-0.06019580364227295,0.020443785935640335,0.08738227933645248 +5,34415,,,,,,,0.24911920726299286,0.08311939984560013,-0.00014317594468593597,-0.004318118095397949,0.0006566269439645112,,,,,,, +6,34449,,,,,,,,,,,,0.08125121891498566,,,,,, +6,34499,,,,,,,,,,,,0.08438577502965927,,,,,, +6,34549,,,,,,,,,,,,0.07585039734840393,,,,,, +6,34599,,,,,,,,,,,,0.06919452548027039,,,,,, +6,34649,,,,,,,,,,,,0.09286621958017349,,,,,, +6,34699,,,,,,,,,,,,0.08158034086227417,,,,,, +6,34749,,,,,,,,,,,,0.09026113897562027,,,,,, +6,34799,,,,,,,,,,,,0.07367181777954102,,,,,, +6,34849,,,,,,,,,,,,0.08654820919036865,,,,,, +6,34899,,,,,,,,,,,,0.07215885818004608,,,,,, +6,34949,,,,,,,,,,,,0.08644519746303558,,,,,, +6,34999,,,,,,,,,,,,0.0945078581571579,,,,,, +6,35049,,,,,,,,,,,,0.08330647647380829,,,,,, +6,35099,,,,,,,,,,,,0.0689307451248169,,,,,, +6,35149,,,,,,,,,,,,0.07173027098178864,,,,,, +6,35199,,,,,,,,,,,,0.08863645792007446,,,,,, +6,35249,,,,,,,,,,,,0.08083994686603546,,,,,, +6,35299,,,,,,,,,,,,0.08846481889486313,,,,,, +6,35349,,,,,,,,,,,,0.08585531264543533,,,,,, +6,35399,,,,,,,,,,,,0.08632464706897736,,,,,, +6,35449,,,,,,,,,,,,0.07916933298110962,,,,,, +6,35499,,,,,,,,,,,,0.0826253592967987,,,,,, +6,35549,,,,,,,,,,,,0.07748086750507355,,,,,, +6,35599,,,,,,,,,,,,0.08746786415576935,,,,,, +6,35649,,,,,,,,,,,,0.08616939187049866,,,,,, +6,35699,,,,,,,,,,,,0.08460237830877304,,,,,, +6,35749,,,,,,,,,,,,0.08547866344451904,,,,,, +6,35799,,,,,,,,,,,,0.0990763008594513,,,,,, +6,35849,,,,,,,,,,,,0.07125793397426605,,,,,, +6,35899,,,,,,,,,,,,0.07859183847904205,,,,,, +6,35949,,,,,,,,,,,,0.07687946408987045,,,,,, +6,35999,,,,,,,,,,,,0.07022038102149963,,,,,, +6,36049,,,,,,,,,,,,0.08546191453933716,,,,,, +6,36099,,,,,,,,,,,,0.08385160565376282,,,,,, +6,36149,,,,,,,,,,,,0.07817569375038147,,,,,, +6,36199,,,,,,,,,,,,0.09523259103298187,,,,,, +6,36249,,,,,,,,,,,,0.09497956186532974,,,,,, +6,36299,,,,,,,,,,,,0.08209727704524994,,,,,, +6,36349,,,,,,,,,,,,0.08452530205249786,,,,,, +6,36399,,,,,,,,,,,,0.0887967050075531,,,,,, +6,36449,,,,,,,,,,,,0.07447494566440582,,,,,, +6,36499,,,,,,,,,,,,0.07137349992990494,,,,,, +6,36549,,,,,,,,,,,,0.0863180160522461,,,,,, +6,36599,,,,,,,,,,,,0.07842909544706345,,,,,, +6,36649,,,,,,,,,,,,0.09052275866270065,,,,,, +6,36699,,,,,,,,,,,,0.08356969803571701,,,,,, +6,36749,,,,,,,,,,,,0.0813741385936737,,,,,, +6,36799,,,,,,,,,,,,0.09043598175048828,,,,,, +6,36849,,,,,,,,,,,,0.08522600680589676,,,,,, +6,36899,,,,,,,,,,,,0.07950209081172943,,,,,, +6,36949,,,,,,,,,,,,0.08700088411569595,,,,,, +6,36999,,,,,,,,,,,,0.07256786525249481,,,,,, +6,37049,,,,,,,,,,,,0.08133982867002487,,,,,, +6,37099,,,,,,,,,,,,0.08648697286844254,,,,,, +6,37149,,,,,,,,,,,,0.0928829237818718,,,,,, +6,37199,,,,,,,,,,,,0.07744146883487701,,,,,, +6,37249,,,,,,,,,,,,0.08130571246147156,,,,,, +6,37299,,,,,,,,,,,,0.08634486794471741,,,,,, +6,37349,,,,,,,,,,,,0.08770463615655899,,,,,, +6,37399,,,,,,,,,,,,0.0917285680770874,,,,,, +6,37449,,,,,,,,,,,,0.07711441814899445,,,,,, +6,37499,,,,,,,,,,,,0.08800923824310303,,,,,, +6,37549,,,,,,,,,,,,0.08122557401657104,,,,,, +6,37599,,,,,,,,,,,,0.07970253378152847,,,,,, +6,37649,,,,,,,,,,,,0.07703505456447601,,,,,, +6,37699,,,,,,,,,,,,0.08909071981906891,,,,,, +6,37749,,,,,,,,,,,,0.08110836893320084,,,,,, +6,37799,,,,,,,,,,,,0.0774567574262619,,,,,, +6,37849,,,,,,,,,,,,0.08300932496786118,,,,,, +6,37899,,,,,,,,,,,,0.07736902683973312,,,,,, +6,37949,,,,,,,,,,,,0.08393215388059616,,,,,, +6,37999,,,,,,,,,,,,0.07682950794696808,,,,,, +6,38049,,,,,,,,,,,,0.08473877608776093,,,,,, +6,38099,,,,,,,,,,,,0.08461124449968338,,,,,, +6,38149,,,,,,,,,,,,0.09255599230527878,,,,,, +6,38199,,,,,,,,,,,,0.08144593238830566,,,,,, +6,38249,,,,,,,,,,,,0.08695784211158752,,,,,, +6,38299,,,,,,,,,,,,0.08879613876342773,,,,,, +6,38349,,,,,,,,,,,,0.07506721466779709,,,,,, +6,38399,,,,,,,,,,,,0.08787993341684341,,,,,, +6,38449,,,,,,,,,,,,0.07845651358366013,,,,,, +6,38499,,,,,,,,,,,,0.08697320520877838,,,,,, +6,38549,,,,,,,,,,,,0.08841951936483383,,,,,, +6,38599,,,,,,,,,,,,0.08171863853931427,,,,,, +6,38649,,,,,,,,,,,,0.09220073372125626,,,,,, +6,38699,,,,,,,,,,,,0.08284442126750946,,,,,, +6,38749,,,,,,,,,,,,0.07657839357852936,,,,,, +6,38799,,,,,,,,,,,,0.07700463384389877,,,,,, +6,38849,,,,,,,,,,,,0.08916345983743668,,,,,, +6,38899,,,,,,,,,,,,0.0899440124630928,,,,,, +6,38949,,,,,,,,,,,,0.08128465712070465,,,,,, +6,38999,,,,,,,,,,,,0.08653644472360611,,,,,, +6,39049,,,,,,,,,,,,0.08173190802335739,,,,,, +6,39099,,,,,,,,,,,,0.08603917062282562,,,,,, +6,39149,,,,,,,,,,,,0.07590063661336899,,,,,, +6,39199,,,,,,,,,,,,0.07767045497894287,,,,,, +6,39249,,,,,,,,,,,,0.07786718010902405,,,,,, +6,39299,,,,,,,,,,,,0.09689003229141235,,,,,, +6,39349,,,,,,,,,,,,0.07752346992492676,,,,,, +6,39399,,,,,,,,,,,,0.07578271627426147,,,,,, +6,39449,,,,,,,,,,,,0.07247689366340637,,,,,, +6,39499,,,,,,,,,,,,0.06956087052822113,,,,,, +6,39549,,,,,,,,,,,,0.07600292563438416,,,,,, +6,39599,,,,,,,,,,,,0.08642621338367462,,,,,, +6,39649,,,,,,,,,,,,0.082582026720047,,,,,, +6,39699,,,,,,,,,,,,0.08214039355516434,,,,,, +6,39749,,,,,,,,,,,,0.0772591382265091,,,,,, +6,39799,,,,,,,,,,,,0.08875267207622528,,,,,, +6,39849,,,,,,,,,,,,0.07803073525428772,,,,,, +6,39899,,,,,,,,,,,,0.07552385330200195,,,,,, +6,39949,,,,,,,,,,,,0.07827486097812653,,,,,, +6,39999,,,,,,,,,,,,0.08904628455638885,,,,,, +6,40049,,,,,,,,,,,,0.08400427550077438,,,,,, +6,40099,,,,,,,,,,,,0.0842786580324173,,,,,, +6,40149,,,,,,,,,,,,0.09155116975307465,,,,,, +6,40151,,,,,,,,,,,,,0.2487659454345703,0.08300743252038956,nan,-0.007116436958312988,-0.026439419016242027,0.08300743252038956 +6,40151,,,,,,,0.2489500641822815,0.08290448784828186,nan,-0.0017205476760864258,0.0014052997576072812,,,,,,, +7,40199,,,,,,,,,,,,0.08476442098617554,,,,,, +7,40249,,,,,,,,,,,,0.09197892993688583,,,,,, +7,40299,,,,,,,,,,,,0.08390248566865921,,,,,, +7,40349,,,,,,,,,,,,0.09131864458322525,,,,,, +7,40399,,,,,,,,,,,,0.07050894945859909,,,,,, +7,40449,,,,,,,,,,,,0.0851094052195549,,,,,, +7,40499,,,,,,,,,,,,0.0758688747882843,,,,,, +7,40549,,,,,,,,,,,,0.07582294940948486,,,,,, +7,40599,,,,,,,,,,,,0.09250058233737946,,,,,, +7,40649,,,,,,,,,,,,0.08438892662525177,,,,,, +7,40699,,,,,,,,,,,,0.08104144781827927,,,,,, +7,40749,,,,,,,,,,,,0.08368422091007233,,,,,, +7,40799,,,,,,,,,,,,0.10069842636585236,,,,,, +7,40849,,,,,,,,,,,,0.07393497228622437,,,,,, +7,40899,,,,,,,,,,,,0.09457047283649445,,,,,, +7,40949,,,,,,,,,,,,0.085267573595047,,,,,, +7,40999,,,,,,,,,,,,0.08270694315433502,,,,,, +7,41049,,,,,,,,,,,,0.07817244529724121,,,,,, +7,41099,,,,,,,,,,,,0.0842997133731842,,,,,, +7,41149,,,,,,,,,,,,0.07721097767353058,,,,,, +7,41199,,,,,,,,,,,,0.08793865144252777,,,,,, +7,41249,,,,,,,,,,,,0.08411591500043869,,,,,, +7,41299,,,,,,,,,,,,0.07848487794399261,,,,,, +7,41349,,,,,,,,,,,,0.086737722158432,,,,,, +7,41399,,,,,,,,,,,,0.0779920220375061,,,,,, +7,41449,,,,,,,,,,,,0.07909158617258072,,,,,, +7,41499,,,,,,,,,,,,0.08875051140785217,,,,,, +7,41549,,,,,,,,,,,,0.08220383524894714,,,,,, +7,41599,,,,,,,,,,,,0.06938061118125916,,,,,, +7,41649,,,,,,,,,,,,0.08771775662899017,,,,,, +7,41699,,,,,,,,,,,,0.09015977382659912,,,,,, +7,41749,,,,,,,,,,,,0.08303713798522949,,,,,, +7,41799,,,,,,,,,,,,0.07177355140447617,,,,,, +7,41849,,,,,,,,,,,,0.08842545747756958,,,,,, +7,41899,,,,,,,,,,,,0.07424868643283844,,,,,, +7,41949,,,,,,,,,,,,0.0851549282670021,,,,,, +7,41999,,,,,,,,,,,,0.0924280434846878,,,,,, +7,42049,,,,,,,,,,,,0.08342194557189941,,,,,, +7,42099,,,,,,,,,,,,0.08301308751106262,,,,,, +7,42149,,,,,,,,,,,,0.0881776288151741,,,,,, +7,42199,,,,,,,,,,,,0.0784287303686142,,,,,, +7,42249,,,,,,,,,,,,0.08208858966827393,,,,,, +7,42299,,,,,,,,,,,,0.07869340479373932,,,,,, +7,42349,,,,,,,,,,,,0.08886586129665375,,,,,, +7,42399,,,,,,,,,,,,0.08170874416828156,,,,,, +7,42449,,,,,,,,,,,,0.0789140984416008,,,,,, +7,42499,,,,,,,,,,,,0.08768365532159805,,,,,, +7,42549,,,,,,,,,,,,0.0821196436882019,,,,,, +7,42599,,,,,,,,,,,,0.08918330818414688,,,,,, +7,42649,,,,,,,,,,,,0.09304717183113098,,,,,, +7,42699,,,,,,,,,,,,0.08517353236675262,,,,,, +7,42749,,,,,,,,,,,,0.0704689621925354,,,,,, +7,42799,,,,,,,,,,,,0.083203986287117,,,,,, +7,42849,,,,,,,,,,,,0.08728960156440735,,,,,, +7,42899,,,,,,,,,,,,0.0768536627292633,,,,,, +7,42949,,,,,,,,,,,,0.07600261270999908,,,,,, +7,42999,,,,,,,,,,,,0.08084867894649506,,,,,, +7,43049,,,,,,,,,,,,0.07200992107391357,,,,,, +7,43099,,,,,,,,,,,,0.08700596541166306,,,,,, +7,43149,,,,,,,,,,,,0.08534766733646393,,,,,, +7,43199,,,,,,,,,,,,0.08371806889772415,,,,,, +7,43249,,,,,,,,,,,,0.08810091763734818,,,,,, +7,43299,,,,,,,,,,,,0.07847414910793304,,,,,, +7,43349,,,,,,,,,,,,0.08290095627307892,,,,,, +7,43399,,,,,,,,,,,,0.07879327982664108,,,,,, +7,43449,,,,,,,,,,,,0.08444356173276901,,,,,, +7,43499,,,,,,,,,,,,0.07288423925638199,,,,,, +7,43549,,,,,,,,,,,,0.08242782950401306,,,,,, +7,43599,,,,,,,,,,,,0.08964575827121735,,,,,, +7,43649,,,,,,,,,,,,0.07386834919452667,,,,,, +7,43699,,,,,,,,,,,,0.08447600901126862,,,,,, +7,43749,,,,,,,,,,,,0.08121342957019806,,,,,, +7,43799,,,,,,,,,,,,0.08372081816196442,,,,,, +7,43849,,,,,,,,,,,,0.08298428356647491,,,,,, +7,43899,,,,,,,,,,,,0.08566577732563019,,,,,, +7,43949,,,,,,,,,,,,0.09266161173582077,,,,,, +7,43999,,,,,,,,,,,,0.06996838748455048,,,,,, +7,44049,,,,,,,,,,,,0.08231622725725174,,,,,, +7,44099,,,,,,,,,,,,0.08582359552383423,,,,,, +7,44149,,,,,,,,,,,,0.0818043053150177,,,,,, +7,44199,,,,,,,,,,,,0.08301712572574615,,,,,, +7,44249,,,,,,,,,,,,0.08925557136535645,,,,,, +7,44299,,,,,,,,,,,,0.07995668798685074,,,,,, +7,44349,,,,,,,,,,,,0.07881627976894379,,,,,, +7,44399,,,,,,,,,,,,0.07962069660425186,,,,,, +7,44449,,,,,,,,,,,,0.07206954061985016,,,,,, +7,44499,,,,,,,,,,,,0.09335815906524658,,,,,, +7,44549,,,,,,,,,,,,0.09110143035650253,,,,,, +7,44599,,,,,,,,,,,,0.07631383836269379,,,,,, +7,44649,,,,,,,,,,,,0.09010785073041916,,,,,, +7,44699,,,,,,,,,,,,0.08586451411247253,,,,,, +7,44749,,,,,,,,,,,,0.08140455931425095,,,,,, +7,44799,,,,,,,,,,,,0.08080624788999557,,,,,, +7,44849,,,,,,,,,,,,0.08671349287033081,,,,,, +7,44899,,,,,,,,,,,,0.10147678852081299,,,,,, +7,44949,,,,,,,,,,,,0.07866013050079346,,,,,, +7,44999,,,,,,,,,,,,0.09228142350912094,,,,,, +7,45049,,,,,,,,,,,,0.07764770090579987,,,,,, +7,45099,,,,,,,,,,,,0.07171256840229034,,,,,, +7,45149,,,,,,,,,,,,0.0953236073255539,,,,,, +7,45199,,,,,,,,,,,,0.0764802023768425,,,,,, +7,45249,,,,,,,,,,,,0.09043488651514053,,,,,, +7,45299,,,,,,,,,,,,0.09005634486675262,,,,,, +7,45349,,,,,,,,,,,,0.0758572369813919,,,,,, +7,45399,,,,,,,,,,,,0.09007636457681656,,,,,, +7,45449,,,,,,,,,,,,0.08407692611217499,,,,,, +7,45499,,,,,,,,,,,,0.07225680351257324,,,,,, +7,45549,,,,,,,,,,,,0.08146294206380844,,,,,, +7,45599,,,,,,,,,,,,0.09193064272403717,,,,,, +7,45649,,,,,,,,,,,,0.09645020961761475,,,,,, +7,45699,,,,,,,,,,,,0.09895646572113037,,,,,, +7,45749,,,,,,,,,,,,0.09724490344524384,,,,,, +7,45799,,,,,,,,,,,,0.08498033881187439,,,,,, +7,45849,,,,,,,,,,,,0.08654941618442535,,,,,, +7,45887,,,,,,,,,,,,,0.24880357086658478,0.08308663219213486,nan,-0.008077383041381836,0.011321071535348892,0.08308663219213486 +7,45887,,,,,,,0.24895299971103668,0.0829046368598938,nan,-0.001708984375,-0.0006735440110787749,,,,,,, +8,45899,,,,,,,,,,,,0.09702171385288239,,,,,, +8,45949,,,,,,,,,,,,0.08729742467403412,,,,,, +8,45999,,,,,,,,,,,,0.08033286035060883,,,,,, +8,46049,,,,,,,,,,,,0.08560971915721893,,,,,, +8,46099,,,,,,,,,,,,0.08110491186380386,,,,,, +8,46149,,,,,,,,,,,,0.08618207275867462,,,,,, +8,46199,,,,,,,,,,,,0.08528939634561539,,,,,, +8,46249,,,,,,,,,,,,0.09238287806510925,,,,,, +8,46299,,,,,,,,,,,,0.07764550298452377,,,,,, +8,46349,,,,,,,,,,,,0.07859823852777481,,,,,, +8,46399,,,,,,,,,,,,0.08140824735164642,,,,,, +8,46449,,,,,,,,,,,,0.07905715703964233,,,,,, +8,46499,,,,,,,,,,,,0.07867899537086487,,,,,, +8,46549,,,,,,,,,,,,0.10097810626029968,,,,,, +8,46599,,,,,,,,,,,,0.08897951245307922,,,,,, +8,46649,,,,,,,,,,,,0.0806131660938263,,,,,, +8,46699,,,,,,,,,,,,0.07865544408559799,,,,,, +8,46749,,,,,,,,,,,,0.07746528089046478,,,,,, +8,46799,,,,,,,,,,,,0.08146907389163971,,,,,, +8,46849,,,,,,,,,,,,0.07737141847610474,,,,,, +8,46899,,,,,,,,,,,,0.09547077864408493,,,,,, +8,46949,,,,,,,,,,,,0.06899671256542206,,,,,, +8,46999,,,,,,,,,,,,0.08847033977508545,,,,,, +8,47049,,,,,,,,,,,,0.08488994091749191,,,,,, +8,47099,,,,,,,,,,,,0.0852784663438797,,,,,, +8,47149,,,,,,,,,,,,0.08101892471313477,,,,,, +8,47199,,,,,,,,,,,,0.08470650762319565,,,,,, +8,47249,,,,,,,,,,,,0.07758650183677673,,,,,, +8,47299,,,,,,,,,,,,0.08651170134544373,,,,,, +8,47349,,,,,,,,,,,,0.0868525430560112,,,,,, +8,47399,,,,,,,,,,,,0.06981997191905975,,,,,, +8,47449,,,,,,,,,,,,0.08085690438747406,,,,,, +8,47499,,,,,,,,,,,,0.07081517577171326,,,,,, +8,47549,,,,,,,,,,,,0.08919806778430939,,,,,, +8,47599,,,,,,,,,,,,0.07421984523534775,,,,,, +8,47649,,,,,,,,,,,,0.08315586298704147,,,,,, +8,47699,,,,,,,,,,,,0.08062820136547089,,,,,, +8,47749,,,,,,,,,,,,0.08142173290252686,,,,,, +8,47799,,,,,,,,,,,,0.09111198782920837,,,,,, +8,47849,,,,,,,,,,,,0.07979453355073929,,,,,, +8,47899,,,,,,,,,,,,0.08964568376541138,,,,,, +8,47949,,,,,,,,,,,,0.076525017619133,,,,,, +8,47999,,,,,,,,,,,,0.08619552850723267,,,,,, +8,48049,,,,,,,,,,,,0.08323264122009277,,,,,, +8,48099,,,,,,,,,,,,0.08005054295063019,,,,,, +8,48149,,,,,,,,,,,,0.0843837708234787,,,,,, +8,48199,,,,,,,,,,,,0.08530348539352417,,,,,, +8,48249,,,,,,,,,,,,0.08203284442424774,,,,,, +8,48299,,,,,,,,,,,,0.07888438552618027,,,,,, +8,48349,,,,,,,,,,,,0.08298890292644501,,,,,, +8,48399,,,,,,,,,,,,0.0985269770026207,,,,,, +8,48449,,,,,,,,,,,,0.08801089227199554,,,,,, +8,48499,,,,,,,,,,,,0.07467611134052277,,,,,, +8,48549,,,,,,,,,,,,0.09069552272558212,,,,,, +8,48599,,,,,,,,,,,,0.07807598263025284,,,,,, +8,48649,,,,,,,,,,,,0.08688287436962128,,,,,, +8,48699,,,,,,,,,,,,0.07466384768486023,,,,,, +8,48749,,,,,,,,,,,,0.08273561298847198,,,,,, +8,48799,,,,,,,,,,,,0.07597456127405167,,,,,, +8,48849,,,,,,,,,,,,0.08692990243434906,,,,,, +8,48899,,,,,,,,,,,,0.08563391864299774,,,,,, +8,48949,,,,,,,,,,,,0.09337025880813599,,,,,, +8,48999,,,,,,,,,,,,0.083828866481781,,,,,, +8,49049,,,,,,,,,,,,0.09168483316898346,,,,,, +8,49099,,,,,,,,,,,,0.08083632588386536,,,,,, +8,49149,,,,,,,,,,,,0.08545099943876266,,,,,, +8,49199,,,,,,,,,,,,0.08938854932785034,,,,,, +8,49249,,,,,,,,,,,,0.09163233637809753,,,,,, +8,49299,,,,,,,,,,,,0.09488259255886078,,,,,, +8,49349,,,,,,,,,,,,0.08948129415512085,,,,,, +8,49399,,,,,,,,,,,,0.08088403195142746,,,,,, +8,49449,,,,,,,,,,,,0.08435645699501038,,,,,, +8,49499,,,,,,,,,,,,0.08070777356624603,,,,,, +8,49549,,,,,,,,,,,,0.09001654386520386,,,,,, +8,49599,,,,,,,,,,,,0.08360932022333145,,,,,, +8,49649,,,,,,,,,,,,0.08360962569713593,,,,,, +8,49699,,,,,,,,,,,,0.0807851105928421,,,,,, +8,49749,,,,,,,,,,,,0.0829477608203888,,,,,, +8,49799,,,,,,,,,,,,0.08108983933925629,,,,,, +8,49849,,,,,,,,,,,,0.08525704592466354,,,,,, +8,49899,,,,,,,,,,,,0.09504202008247375,,,,,, +8,49949,,,,,,,,,,,,0.08381600677967072,,,,,, +8,49999,,,,,,,,,,,,0.07948809117078781,,,,,, +8,50049,,,,,,,,,,,,0.08670316636562347,,,,,, +8,50099,,,,,,,,,,,,0.09526048600673676,,,,,, +8,50149,,,,,,,,,,,,0.08218979835510254,,,,,, +8,50199,,,,,,,,,,,,0.07769341766834259,,,,,, +8,50249,,,,,,,,,,,,0.07572659105062485,,,,,, +8,50299,,,,,,,,,,,,0.09116984158754349,,,,,, +8,50349,,,,,,,,,,,,0.07431960105895996,,,,,, +8,50399,,,,,,,,,,,,0.0783582255244255,,,,,, +8,50449,,,,,,,,,,,,0.08380185067653656,,,,,, +8,50499,,,,,,,,,,,,0.09329995512962341,,,,,, +8,50549,,,,,,,,,,,,0.09155980497598648,,,,,, +8,50599,,,,,,,,,,,,0.08582814037799835,,,,,, +8,50649,,,,,,,,,,,,0.0748504102230072,,,,,, +8,50699,,,,,,,,,,,,0.0891958698630333,,,,,, +8,50749,,,,,,,,,,,,0.08565066009759903,,,,,, +8,50799,,,,,,,,,,,,0.08512246608734131,,,,,, +8,50849,,,,,,,,,,,,0.08821476995944977,,,,,, +8,50899,,,,,,,,,,,,0.08296270668506622,,,,,, +8,50949,,,,,,,,,,,,0.06983346492052078,,,,,, +8,50999,,,,,,,,,,,,0.08636479079723358,,,,,, +8,51049,,,,,,,,,,,,0.0884162187576294,,,,,, +8,51099,,,,,,,,,,,,0.07745397835969925,,,,,, +8,51149,,,,,,,,,,,,0.09167081117630005,,,,,, +8,51199,,,,,,,,,,,,0.08759982883930206,,,,,, +8,51249,,,,,,,,,,,,0.07896877825260162,,,,,, +8,51299,,,,,,,,,,,,0.07934263348579407,,,,,, +8,51349,,,,,,,,,,,,0.07260347902774811,,,,,, +8,51399,,,,,,,,,,,,0.08606423437595367,,,,,, +8,51449,,,,,,,,,,,,0.0689484030008316,,,,,, +8,51499,,,,,,,,,,,,0.09144063293933868,,,,,, +8,51549,,,,,,,,,,,,0.07604895532131195,,,,,, +8,51599,,,,,,,,,,,,0.08378526568412781,,,,,, +8,51623,,,,,,,,,,,,,0.24877527356147766,0.08303844183683395,nan,-0.007492661476135254,0.003950525540858507,0.08303844183683395 +8,51623,,,,,,,0.2488488107919693,0.0827997699379921,nan,-0.00046765804290771484,-0.0015542368637397885,,,,,,, +9,51649,,,,,,,,,,,,0.08375892043113708,,,,,, +9,51699,,,,,,,,,,,,0.06413355469703674,,,,,, +9,51749,,,,,,,,,,,,0.07414409518241882,,,,,, +9,51799,,,,,,,,,,,,0.07514380663633347,,,,,, +9,51849,,,,,,,,,,,,0.0954037755727768,,,,,, +9,51899,,,,,,,,,,,,0.08160440623760223,,,,,, +9,51949,,,,,,,,,,,,0.08942201733589172,,,,,, +9,51999,,,,,,,,,,,,0.07588794827461243,,,,,, +9,52049,,,,,,,,,,,,0.07651293277740479,,,,,, +9,52099,,,,,,,,,,,,0.09097570925951004,,,,,, +9,52149,,,,,,,,,,,,0.09245310723781586,,,,,, +9,52199,,,,,,,,,,,,0.06871993839740753,,,,,, +9,52249,,,,,,,,,,,,0.08097614347934723,,,,,, +9,52299,,,,,,,,,,,,0.08087556064128876,,,,,, +9,52349,,,,,,,,,,,,0.09223520755767822,,,,,, +9,52399,,,,,,,,,,,,0.0838661715388298,,,,,, +9,52449,,,,,,,,,,,,0.10020524263381958,,,,,, +9,52499,,,,,,,,,,,,0.08638456463813782,,,,,, +9,52549,,,,,,,,,,,,0.07978059351444244,,,,,, +9,52599,,,,,,,,,,,,0.08516855537891388,,,,,, +9,52649,,,,,,,,,,,,0.07914765179157257,,,,,, +9,52699,,,,,,,,,,,,0.08656004816293716,,,,,, +9,52749,,,,,,,,,,,,0.08805318176746368,,,,,, +9,52799,,,,,,,,,,,,0.09621205925941467,,,,,, +9,52849,,,,,,,,,,,,0.08605080842971802,,,,,, +9,52899,,,,,,,,,,,,0.0838271826505661,,,,,, +9,52949,,,,,,,,,,,,0.09048545360565186,,,,,, +9,52999,,,,,,,,,,,,0.09081220626831055,,,,,, +9,53049,,,,,,,,,,,,0.08516165614128113,,,,,, +9,53099,,,,,,,,,,,,0.08583053946495056,,,,,, +9,53149,,,,,,,,,,,,0.08687546849250793,,,,,, +9,53199,,,,,,,,,,,,0.0819040983915329,,,,,, +9,53249,,,,,,,,,,,,0.08217493444681168,,,,,, +9,53299,,,,,,,,,,,,0.08955799043178558,,,,,, +9,53349,,,,,,,,,,,,0.08642558008432388,,,,,, +9,53399,,,,,,,,,,,,0.08642398566007614,,,,,, +9,53449,,,,,,,,,,,,0.07938717305660248,,,,,, +9,53499,,,,,,,,,,,,0.07976772636175156,,,,,, +9,53549,,,,,,,,,,,,0.0843316912651062,,,,,, +9,53599,,,,,,,,,,,,0.07573191821575165,,,,,, +9,53649,,,,,,,,,,,,0.092959463596344,,,,,, +9,53699,,,,,,,,,,,,0.08752311766147614,,,,,, +9,53749,,,,,,,,,,,,0.0745261013507843,,,,,, +9,53799,,,,,,,,,,,,0.09378936141729355,,,,,, +9,53849,,,,,,,,,,,,0.07882644981145859,,,,,, +9,53899,,,,,,,,,,,,0.09167051315307617,,,,,, +9,53949,,,,,,,,,,,,0.0671975240111351,,,,,, +9,53999,,,,,,,,,,,,0.08075075596570969,,,,,, +9,54049,,,,,,,,,,,,0.07492677867412567,,,,,, +9,54099,,,,,,,,,,,,0.07526582479476929,,,,,, +9,54149,,,,,,,,,,,,0.09229765087366104,,,,,, +9,54199,,,,,,,,,,,,0.0770634263753891,,,,,, +9,54249,,,,,,,,,,,,0.07868699729442596,,,,,, +9,54299,,,,,,,,,,,,0.07768519222736359,,,,,, +9,54349,,,,,,,,,,,,0.08535425364971161,,,,,, +9,54399,,,,,,,,,,,,0.08871695399284363,,,,,, +9,54449,,,,,,,,,,,,0.07641644775867462,,,,,, +9,54499,,,,,,,,,,,,0.08697488158941269,,,,,, +9,54549,,,,,,,,,,,,0.08894099295139313,,,,,, +9,54599,,,,,,,,,,,,0.08137810230255127,,,,,, +9,54649,,,,,,,,,,,,0.07844586670398712,,,,,, +9,54699,,,,,,,,,,,,0.08082474768161774,,,,,, +9,54749,,,,,,,,,,,,0.0835934430360794,,,,,, +9,54799,,,,,,,,,,,,0.07675786316394806,,,,,, +9,54849,,,,,,,,,,,,0.0852668285369873,,,,,, +9,54899,,,,,,,,,,,,0.0870247334241867,,,,,, +9,54949,,,,,,,,,,,,0.09492528438568115,,,,,, +9,54999,,,,,,,,,,,,0.07986252009868622,,,,,, +9,55049,,,,,,,,,,,,0.08280682563781738,,,,,, +9,55099,,,,,,,,,,,,0.08746951818466187,,,,,, +9,55149,,,,,,,,,,,,0.09453195333480835,,,,,, +9,55199,,,,,,,,,,,,0.0608033761382103,,,,,, +9,55249,,,,,,,,,,,,0.07385104149580002,,,,,, +9,55299,,,,,,,,,,,,0.08382147550582886,,,,,, +9,55349,,,,,,,,,,,,0.08257235586643219,,,,,, +9,55399,,,,,,,,,,,,0.0864497497677803,,,,,, +9,55449,,,,,,,,,,,,0.09527178108692169,,,,,, +9,55499,,,,,,,,,,,,0.08723454177379608,,,,,, +9,55549,,,,,,,,,,,,0.08187264204025269,,,,,, +9,55599,,,,,,,,,,,,0.09433762729167938,,,,,, +9,55649,,,,,,,,,,,,0.07687098532915115,,,,,, +9,55699,,,,,,,,,,,,0.08262867480516434,,,,,, +9,55749,,,,,,,,,,,,0.07913948595523834,,,,,, +9,55799,,,,,,,,,,,,0.09378798305988312,,,,,, +9,55849,,,,,,,,,,,,0.0761440098285675,,,,,, +9,55899,,,,,,,,,,,,0.08924740552902222,,,,,, +9,55949,,,,,,,,,,,,0.0808270052075386,,,,,, +9,55999,,,,,,,,,,,,0.07852449268102646,,,,,, +9,56049,,,,,,,,,,,,0.07646097987890244,,,,,, +9,56099,,,,,,,,,,,,0.08623603731393814,,,,,, +9,56149,,,,,,,,,,,,0.09854653477668762,,,,,, +9,56199,,,,,,,,,,,,0.08092617243528366,,,,,, +9,56249,,,,,,,,,,,,0.06159244105219841,,,,,, +9,56299,,,,,,,,,,,,0.07105746865272522,,,,,, +9,56349,,,,,,,,,,,,0.08432033658027649,,,,,, +9,56399,,,,,,,,,,,,0.07803475856781006,,,,,, +9,56449,,,,,,,,,,,,0.09617600589990616,,,,,, +9,56499,,,,,,,,,,,,0.07988951355218887,,,,,, +9,56549,,,,,,,,,,,,0.08112066239118576,,,,,, +9,56599,,,,,,,,,,,,0.08508765697479248,,,,,, +9,56649,,,,,,,,,,,,0.09250777959823608,,,,,, +9,56699,,,,,,,,,,,,0.07516060024499893,,,,,, +9,56749,,,,,,,,,,,,0.07871328294277191,,,,,, +9,56799,,,,,,,,,,,,0.09029033780097961,,,,,, +9,56849,,,,,,,,,,,,0.08807387948036194,,,,,, +9,56899,,,,,,,,,,,,0.09302524477243423,,,,,, +9,56949,,,,,,,,,,,,0.08416961878538132,,,,,, +9,56999,,,,,,,,,,,,0.0866345465183258,,,,,, +9,57049,,,,,,,,,,,,0.07856951653957367,,,,,, +9,57099,,,,,,,,,,,,0.08627253770828247,,,,,, +9,57149,,,,,,,,,,,,0.0728251114487648,,,,,, +9,57199,,,,,,,,,,,,0.06686598062515259,,,,,, +9,57249,,,,,,,,,,,,0.07785029709339142,,,,,, +9,57299,,,,,,,,,,,,0.08169443905353546,,,,,, +9,57349,,,,,,,,,,,,0.08123675733804703,,,,,, +9,57359,,,,,,,,,,,,,0.2488754242658615,0.0832146629691124,nan,-0.009630680084228516,-0.005672925151884556,0.0832146629691124 +9,57359,,,,,,,0.2488458901643753,0.08279694616794586,nan,-0.0004322528839111328,0.0012751372996717691,,,,,,, +10,57399,,,,,,,,,,,,0.08209064602851868,,,,,, +10,57449,,,,,,,,,,,,0.06940057873725891,,,,,, +10,57499,,,,,,,,,,,,0.080320343375206,,,,,, +10,57549,,,,,,,,,,,,0.07432878017425537,,,,,, +10,57599,,,,,,,,,,,,0.08101344108581543,,,,,, +10,57649,,,,,,,,,,,,0.08886338770389557,,,,,, +10,57699,,,,,,,,,,,,0.07657527178525925,,,,,, +10,57749,,,,,,,,,,,,0.09458910673856735,,,,,, +10,57799,,,,,,,,,,,,0.07148333638906479,,,,,, +10,57849,,,,,,,,,,,,0.08546940982341766,,,,,, +10,57899,,,,,,,,,,,,0.07694423198699951,,,,,, +10,57949,,,,,,,,,,,,0.08200886845588684,,,,,, +10,57999,,,,,,,,,,,,0.07978390157222748,,,,,, +10,58049,,,,,,,,,,,,0.07208744436502457,,,,,, +10,58099,,,,,,,,,,,,0.0835830569267273,,,,,, +10,58149,,,,,,,,,,,,0.09013377875089645,,,,,, +10,58199,,,,,,,,,,,,0.08601880073547363,,,,,, +10,58249,,,,,,,,,,,,0.08420270681381226,,,,,, +10,58299,,,,,,,,,,,,0.08519703149795532,,,,,, +10,58349,,,,,,,,,,,,0.07122758030891418,,,,,, +10,58399,,,,,,,,,,,,0.0742914080619812,,,,,, +10,58449,,,,,,,,,,,,0.07328164577484131,,,,,, +10,58499,,,,,,,,,,,,0.07801872491836548,,,,,, +10,58549,,,,,,,,,,,,0.09159986674785614,,,,,, +10,58599,,,,,,,,,,,,0.08187609165906906,,,,,, +10,58649,,,,,,,,,,,,0.07531008124351501,,,,,, +10,58699,,,,,,,,,,,,0.08571378886699677,,,,,, +10,58749,,,,,,,,,,,,0.0862712413072586,,,,,, +10,58799,,,,,,,,,,,,0.08520597964525223,,,,,, +10,58849,,,,,,,,,,,,0.08346709609031677,,,,,, +10,58899,,,,,,,,,,,,0.0760158821940422,,,,,, +10,58949,,,,,,,,,,,,0.07678667455911636,,,,,, +10,58999,,,,,,,,,,,,0.08384549617767334,,,,,, +10,59049,,,,,,,,,,,,0.0810304656624794,,,,,, +10,59099,,,,,,,,,,,,0.09068158268928528,,,,,, +10,59149,,,,,,,,,,,,0.09362652897834778,,,,,, +10,59199,,,,,,,,,,,,0.08531021326780319,,,,,, +10,59249,,,,,,,,,,,,0.08143985271453857,,,,,, +10,59299,,,,,,,,,,,,0.06836523115634918,,,,,, +10,59349,,,,,,,,,,,,0.07959175109863281,,,,,, +10,59399,,,,,,,,,,,,0.08633880317211151,,,,,, +10,59449,,,,,,,,,,,,0.08228852599859238,,,,,, +10,59499,,,,,,,,,,,,0.07218298316001892,,,,,, +10,59549,,,,,,,,,,,,0.0829053446650505,,,,,, +10,59599,,,,,,,,,,,,0.08303235471248627,,,,,, +10,59649,,,,,,,,,,,,0.08804154396057129,,,,,, +10,59699,,,,,,,,,,,,0.08106587082147598,,,,,, +10,59749,,,,,,,,,,,,0.07503857463598251,,,,,, +10,59799,,,,,,,,,,,,0.08082900941371918,,,,,, +10,59849,,,,,,,,,,,,0.09524181485176086,,,,,, +10,59899,,,,,,,,,,,,0.08384765684604645,,,,,, +10,59949,,,,,,,,,,,,0.07192188501358032,,,,,, +10,59999,,,,,,,,,,,,0.09065398573875427,,,,,, +10,60049,,,,,,,,,,,,0.08160170912742615,,,,,, +10,60099,,,,,,,,,,,,0.07233539968729019,,,,,, +10,60149,,,,,,,,,,,,0.08576717227697372,,,,,, +10,60199,,,,,,,,,,,,0.0815056711435318,,,,,, +10,60249,,,,,,,,,,,,0.0811239629983902,,,,,, +10,60299,,,,,,,,,,,,0.08788330852985382,,,,,, +10,60349,,,,,,,,,,,,0.0838162899017334,,,,,, +10,60399,,,,,,,,,,,,0.0715455487370491,,,,,, +10,60449,,,,,,,,,,,,0.07853370904922485,,,,,, +10,60499,,,,,,,,,,,,0.08579889684915543,,,,,, +10,60549,,,,,,,,,,,,0.08217932283878326,,,,,, +10,60599,,,,,,,,,,,,0.09539452195167542,,,,,, +10,60649,,,,,,,,,,,,0.08214735239744186,,,,,, +10,60699,,,,,,,,,,,,0.08238998055458069,,,,,, +10,60749,,,,,,,,,,,,0.08233539760112762,,,,,, +10,60799,,,,,,,,,,,,0.07376560568809509,,,,,, +10,60849,,,,,,,,,,,,0.08856438100337982,,,,,, +10,60899,,,,,,,,,,,,0.08163896948099136,,,,,, +10,60949,,,,,,,,,,,,0.08170294016599655,,,,,, +10,60999,,,,,,,,,,,,0.07699795067310333,,,,,, +10,61049,,,,,,,,,,,,0.0812026858329773,,,,,, +10,61099,,,,,,,,,,,,0.0774698555469513,,,,,, +10,61149,,,,,,,,,,,,0.08211151510477066,,,,,, +10,61199,,,,,,,,,,,,0.088352270424366,,,,,, +10,61249,,,,,,,,,,,,0.0862061083316803,,,,,, +10,61299,,,,,,,,,,,,0.07413534820079803,,,,,, +10,61349,,,,,,,,,,,,0.08011874556541443,,,,,, +10,61399,,,,,,,,,,,,0.08268164098262787,,,,,, +10,61449,,,,,,,,,,,,0.0829167515039444,,,,,, +10,61499,,,,,,,,,,,,0.07904116809368134,,,,,, +10,61549,,,,,,,,,,,,0.08628052473068237,,,,,, +10,61599,,,,,,,,,,,,0.07544472813606262,,,,,, +10,61649,,,,,,,,,,,,0.08207397162914276,,,,,, +10,61699,,,,,,,,,,,,0.09311556816101074,,,,,, +10,61749,,,,,,,,,,,,0.09331246465444565,,,,,, +10,61799,,,,,,,,,,,,0.07310622930526733,,,,,, +10,61849,,,,,,,,,,,,0.08412271738052368,,,,,, +10,61899,,,,,,,,,,,,0.07203701138496399,,,,,, +10,61949,,,,,,,,,,,,0.08316785097122192,,,,,, +10,61999,,,,,,,,,,,,0.07825645059347153,,,,,, +10,62049,,,,,,,,,,,,0.07412312924861908,,,,,, +10,62099,,,,,,,,,,,,0.09178610146045685,,,,,, +10,62149,,,,,,,,,,,,0.08310240507125854,,,,,, +10,62199,,,,,,,,,,,,0.08258219063282013,,,,,, +10,62249,,,,,,,,,,,,0.08618706464767456,,,,,, +10,62299,,,,,,,,,,,,0.0904242992401123,,,,,, +10,62349,,,,,,,,,,,,0.07811688631772995,,,,,, +10,62399,,,,,,,,,,,,0.0777304619550705,,,,,, +10,62449,,,,,,,,,,,,0.08379209041595459,,,,,, +10,62499,,,,,,,,,,,,0.0876552015542984,,,,,, +10,62549,,,,,,,,,,,,0.08654236048460007,,,,,, +10,62599,,,,,,,,,,,,0.0902978777885437,,,,,, +10,62649,,,,,,,,,,,,0.07475507259368896,,,,,, +10,62699,,,,,,,,,,,,0.07714542746543884,,,,,, +10,62749,,,,,,,,,,,,0.09269469231367111,,,,,, +10,62799,,,,,,,,,,,,0.07391870021820068,,,,,, +10,62849,,,,,,,,,,,,0.07780720293521881,,,,,, +10,62899,,,,,,,,,,,,0.07567089051008224,,,,,, +10,62949,,,,,,,,,,,,0.08429497480392456,,,,,, +10,62999,,,,,,,,,,,,0.07959753274917603,,,,,, +10,63049,,,,,,,,,,,,0.06850159168243408,,,,,, +10,63095,,,,,,,,,,,,,0.24879617989063263,0.08307383209466934,nan,-0.007922053337097168,0.007061874959617853,0.08307383209466934 +10,63095,,,,,,,0.24884940683841705,0.08280178904533386,nan,-0.0004863739013671875,-0.00016263923316728324,,,,,,, +11,63099,,,,,,,,,,,,0.08851182460784912,,,,,, +11,63149,,,,,,,,,,,,0.09366276115179062,,,,,, +11,63199,,,,,,,,,,,,0.0844990536570549,,,,,, +11,63249,,,,,,,,,,,,0.09120675921440125,,,,,, +11,63299,,,,,,,,,,,,0.08155076205730438,,,,,, +11,63349,,,,,,,,,,,,0.08995663374662399,,,,,, +11,63399,,,,,,,,,,,,0.07880713045597076,,,,,, +11,63449,,,,,,,,,,,,0.0819876566529274,,,,,, +11,63499,,,,,,,,,,,,0.094170480966568,,,,,, +11,63549,,,,,,,,,,,,0.08348022401332855,,,,,, +11,63599,,,,,,,,,,,,0.08266891539096832,,,,,, +11,63649,,,,,,,,,,,,0.0806129202246666,,,,,, +11,63699,,,,,,,,,,,,0.08928823471069336,,,,,, +11,63749,,,,,,,,,,,,0.08857712149620056,,,,,, +11,63799,,,,,,,,,,,,0.07681432366371155,,,,,, +11,63849,,,,,,,,,,,,0.0789235532283783,,,,,, +11,63899,,,,,,,,,,,,0.08157065510749817,,,,,, +11,63949,,,,,,,,,,,,0.07865133881568909,,,,,, +11,63999,,,,,,,,,,,,0.08556054532527924,,,,,, +11,64049,,,,,,,,,,,,0.08022695034742355,,,,,, +11,64099,,,,,,,,,,,,0.09716610610485077,,,,,, +11,64149,,,,,,,,,,,,0.08724163472652435,,,,,, +11,64199,,,,,,,,,,,,0.08116000890731812,,,,,, +11,64249,,,,,,,,,,,,0.08263763040304184,,,,,, +11,64299,,,,,,,,,,,,0.07356768101453781,,,,,, +11,64349,,,,,,,,,,,,0.09080647677183151,,,,,, +11,64399,,,,,,,,,,,,0.07921965420246124,,,,,, +11,64449,,,,,,,,,,,,0.08125988394021988,,,,,, +11,64499,,,,,,,,,,,,0.09358330070972443,,,,,, +11,64549,,,,,,,,,,,,0.07915182411670685,,,,,, +11,64599,,,,,,,,,,,,0.08307961374521255,,,,,, +11,64649,,,,,,,,,,,,0.07130080461502075,,,,,, +11,64699,,,,,,,,,,,,0.08403278887271881,,,,,, +11,64749,,,,,,,,,,,,0.08200401812791824,,,,,, +11,64799,,,,,,,,,,,,0.08500142395496368,,,,,, +11,64849,,,,,,,,,,,,0.0832839086651802,,,,,, +11,64899,,,,,,,,,,,,0.07841100543737411,,,,,, +11,64949,,,,,,,,,,,,0.07725254446268082,,,,,, +11,64999,,,,,,,,,,,,0.09367270767688751,,,,,, +11,65049,,,,,,,,,,,,0.07521344721317291,,,,,, +11,65099,,,,,,,,,,,,0.07865078002214432,,,,,, +11,65149,,,,,,,,,,,,0.08671888709068298,,,,,, +11,65199,,,,,,,,,,,,0.08376378566026688,,,,,, +11,65249,,,,,,,,,,,,0.08117783069610596,,,,,, +11,65299,,,,,,,,,,,,0.08796042948961258,,,,,, +11,65349,,,,,,,,,,,,0.08164489269256592,,,,,, +11,65399,,,,,,,,,,,,0.07950001209974289,,,,,, +11,65449,,,,,,,,,,,,0.0781640112400055,,,,,, +11,65499,,,,,,,,,,,,0.08930452913045883,,,,,, +11,65549,,,,,,,,,,,,0.10450662672519684,,,,,, +11,65599,,,,,,,,,,,,0.08491107821464539,,,,,, +11,65649,,,,,,,,,,,,0.08589886873960495,,,,,, +11,65699,,,,,,,,,,,,0.09015393257141113,,,,,, +11,65749,,,,,,,,,,,,0.09108294546604156,,,,,, +11,65799,,,,,,,,,,,,0.08304449915885925,,,,,, +11,65849,,,,,,,,,,,,0.0833355113863945,,,,,, +11,65899,,,,,,,,,,,,0.09675838053226471,,,,,, +11,65949,,,,,,,,,,,,0.08899050951004028,,,,,, +11,65999,,,,,,,,,,,,0.08399549126625061,,,,,, +11,66049,,,,,,,,,,,,0.08903194218873978,,,,,, +11,66099,,,,,,,,,,,,0.07208454608917236,,,,,, +11,66149,,,,,,,,,,,,0.08485601842403412,,,,,, +11,66199,,,,,,,,,,,,0.07903949916362762,,,,,, +11,66249,,,,,,,,,,,,0.09061679989099503,,,,,, +11,66299,,,,,,,,,,,,0.08290654420852661,,,,,, +11,66349,,,,,,,,,,,,0.07848409563302994,,,,,, +11,66399,,,,,,,,,,,,0.08287493139505386,,,,,, +11,66449,,,,,,,,,,,,0.07735519111156464,,,,,, +11,66499,,,,,,,,,,,,0.07482567429542542,,,,,, +11,66549,,,,,,,,,,,,0.08758231997489929,,,,,, +11,66599,,,,,,,,,,,,0.08574029803276062,,,,,, +11,66649,,,,,,,,,,,,0.0771803930401802,,,,,, +11,66699,,,,,,,,,,,,0.08546188473701477,,,,,, +11,66749,,,,,,,,,,,,0.07847906649112701,,,,,, +11,66799,,,,,,,,,,,,0.09015464782714844,,,,,, +11,66849,,,,,,,,,,,,0.07493223994970322,,,,,, +11,66899,,,,,,,,,,,,0.082689568400383,,,,,, +11,66949,,,,,,,,,,,,0.07165246456861496,,,,,, +11,66999,,,,,,,,,,,,0.09631282091140747,,,,,, +11,67049,,,,,,,,,,,,0.0915212631225586,,,,,, +11,67099,,,,,,,,,,,,0.08948710560798645,,,,,, +11,67149,,,,,,,,,,,,0.06674765795469284,,,,,, +11,67199,,,,,,,,,,,,0.07819114625453949,,,,,, +11,67249,,,,,,,,,,,,0.07543699443340302,,,,,, +11,67299,,,,,,,,,,,,0.08145327866077423,,,,,, +11,67349,,,,,,,,,,,,0.08557666838169098,,,,,, +11,67399,,,,,,,,,,,,0.08113035559654236,,,,,, +11,67449,,,,,,,,,,,,0.0845186710357666,,,,,, +11,67499,,,,,,,,,,,,0.08373454958200455,,,,,, +11,67549,,,,,,,,,,,,0.08341872692108154,,,,,, +11,67599,,,,,,,,,,,,0.0710420161485672,,,,,, +11,67649,,,,,,,,,,,,0.07983507961034775,,,,,, +11,67699,,,,,,,,,,,,0.08158852905035019,,,,,, +11,67749,,,,,,,,,,,,0.10191832482814789,,,,,, +11,67799,,,,,,,,,,,,0.08461488038301468,,,,,, +11,67849,,,,,,,,,,,,0.08265437185764313,,,,,, +11,67899,,,,,,,,,,,,0.10051240026950836,,,,,, +11,67949,,,,,,,,,,,,0.08911922574043274,,,,,, +11,67999,,,,,,,,,,,,0.07119354605674744,,,,,, +11,68049,,,,,,,,,,,,0.08210985362529755,,,,,, +11,68099,,,,,,,,,,,,0.0856052041053772,,,,,, +11,68149,,,,,,,,,,,,0.08403133600950241,,,,,, +11,68199,,,,,,,,,,,,0.08570058643817902,,,,,, +11,68249,,,,,,,,,,,,0.08336623013019562,,,,,, +11,68299,,,,,,,,,,,,0.09143351018428802,,,,,, +11,68349,,,,,,,,,,,,0.09039919078350067,,,,,, +11,68399,,,,,,,,,,,,0.08391900360584259,,,,,, +11,68449,,,,,,,,,,,,0.08328545093536377,,,,,, +11,68499,,,,,,,,,,,,0.08824516087770462,,,,,, +11,68549,,,,,,,,,,,,0.07833611965179443,,,,,, +11,68599,,,,,,,,,,,,0.08291444182395935,,,,,, +11,68649,,,,,,,,,,,,0.07880976051092148,,,,,, +11,68699,,,,,,,,,,,,0.07791517674922943,,,,,, +11,68749,,,,,,,,,,,,0.07403574883937836,,,,,, +11,68799,,,,,,,,,,,,0.08545994758605957,,,,,, +11,68831,,,,,,,,,,,,,0.2488783597946167,0.08322097361087799,nan,-0.009707331657409668,0.005310324486345053,0.08322097361087799 +11,68831,,,,,,,0.24886293709278107,0.08280816674232483,nan,-0.0005459785461425781,0.00010016268061008304,,,,,,, +12,68849,,,,,,,,,,,,0.08220089972019196,,,,,, +12,68899,,,,,,,,,,,,0.08885947614908218,,,,,, +12,68949,,,,,,,,,,,,0.08625049144029617,,,,,, +12,68999,,,,,,,,,,,,0.08581352978944778,,,,,, +12,69049,,,,,,,,,,,,0.08485980331897736,,,,,, +12,69099,,,,,,,,,,,,0.08798867464065552,,,,,, +12,69149,,,,,,,,,,,,0.0832291841506958,,,,,, +12,69199,,,,,,,,,,,,0.08653932064771652,,,,,, +12,69249,,,,,,,,,,,,0.07863850891590118,,,,,, +12,69299,,,,,,,,,,,,0.09043839573860168,,,,,, +12,69349,,,,,,,,,,,,0.08759082853794098,,,,,, +12,69399,,,,,,,,,,,,0.07535456120967865,,,,,, +12,69449,,,,,,,,,,,,0.0765123963356018,,,,,, +12,69499,,,,,,,,,,,,0.08004306256771088,,,,,, +12,69549,,,,,,,,,,,,0.08385781943798065,,,,,, +12,69599,,,,,,,,,,,,0.08246661722660065,,,,,, +12,69649,,,,,,,,,,,,0.08373212069272995,,,,,, +12,69699,,,,,,,,,,,,0.08158080279827118,,,,,, +12,69749,,,,,,,,,,,,0.08196082711219788,,,,,, +12,69799,,,,,,,,,,,,0.08258459717035294,,,,,, +12,69849,,,,,,,,,,,,0.08159901201725006,,,,,, +12,69899,,,,,,,,,,,,0.0914243832230568,,,,,, +12,69949,,,,,,,,,,,,0.08541508764028549,,,,,, +12,69999,,,,,,,,,,,,0.07588037848472595,,,,,, +12,70049,,,,,,,,,,,,0.08879420161247253,,,,,, +12,70099,,,,,,,,,,,,0.08405760675668716,,,,,, +12,70149,,,,,,,,,,,,0.08144839853048325,,,,,, +12,70199,,,,,,,,,,,,0.07562708854675293,,,,,, +12,70249,,,,,,,,,,,,0.06896226108074188,,,,,, +12,70299,,,,,,,,,,,,0.07076318562030792,,,,,, +12,70349,,,,,,,,,,,,0.07718196511268616,,,,,, +12,70399,,,,,,,,,,,,0.07887081056833267,,,,,, +12,70449,,,,,,,,,,,,0.09910568594932556,,,,,, +12,70499,,,,,,,,,,,,0.07887487858533859,,,,,, +12,70549,,,,,,,,,,,,0.0656023621559143,,,,,, +12,70599,,,,,,,,,,,,0.08717696368694305,,,,,, +12,70649,,,,,,,,,,,,0.08383616805076599,,,,,, +12,70699,,,,,,,,,,,,0.0781363695859909,,,,,, +12,70749,,,,,,,,,,,,0.08360126614570618,,,,,, +12,70799,,,,,,,,,,,,0.09119747579097748,,,,,, +12,70849,,,,,,,,,,,,0.07778991758823395,,,,,, +12,70899,,,,,,,,,,,,0.07753384113311768,,,,,, +12,70949,,,,,,,,,,,,0.08327977359294891,,,,,, +12,70999,,,,,,,,,,,,0.08011879771947861,,,,,, +12,71049,,,,,,,,,,,,0.06761294603347778,,,,,, +12,71099,,,,,,,,,,,,0.07876428961753845,,,,,, +12,71149,,,,,,,,,,,,0.08073778450489044,,,,,, +12,71199,,,,,,,,,,,,0.07924868166446686,,,,,, +12,71249,,,,,,,,,,,,0.08219175785779953,,,,,, +12,71299,,,,,,,,,,,,0.08392635732889175,,,,,, +12,71349,,,,,,,,,,,,0.09508584439754486,,,,,, +12,71399,,,,,,,,,,,,0.082253098487854,,,,,, +12,71449,,,,,,,,,,,,0.07880672812461853,,,,,, +12,71499,,,,,,,,,,,,0.07732634246349335,,,,,, +12,71549,,,,,,,,,,,,0.08520159870386124,,,,,, +12,71599,,,,,,,,,,,,0.08452579379081726,,,,,, +12,71649,,,,,,,,,,,,0.09030045568943024,,,,,, +12,71699,,,,,,,,,,,,0.0825098380446434,,,,,, +12,71749,,,,,,,,,,,,0.06587174534797668,,,,,, +12,71799,,,,,,,,,,,,0.07629100978374481,,,,,, +12,71849,,,,,,,,,,,,0.08310001343488693,,,,,, +12,71899,,,,,,,,,,,,0.09118926525115967,,,,,, +12,71949,,,,,,,,,,,,0.08548703789710999,,,,,, +12,71999,,,,,,,,,,,,0.07689332962036133,,,,,, +12,72049,,,,,,,,,,,,0.08429024368524551,,,,,, +12,72099,,,,,,,,,,,,0.0851949155330658,,,,,, +12,72149,,,,,,,,,,,,0.08092249929904938,,,,,, +12,72199,,,,,,,,,,,,0.09031147509813309,,,,,, +12,72249,,,,,,,,,,,,0.08758778870105743,,,,,, +12,72299,,,,,,,,,,,,0.07983781397342682,,,,,, +12,72349,,,,,,,,,,,,0.07518675923347473,,,,,, +12,72399,,,,,,,,,,,,0.07898658514022827,,,,,, +12,72449,,,,,,,,,,,,0.07561589777469635,,,,,, +12,72499,,,,,,,,,,,,0.0816432386636734,,,,,, +12,72549,,,,,,,,,,,,0.08080019056797028,,,,,, +12,72599,,,,,,,,,,,,0.0816650390625,,,,,, +12,72649,,,,,,,,,,,,0.0831909030675888,,,,,, +12,72699,,,,,,,,,,,,0.07942067086696625,,,,,, +12,72749,,,,,,,,,,,,0.08236293494701385,,,,,, +12,72799,,,,,,,,,,,,0.07472827285528183,,,,,, +12,72849,,,,,,,,,,,,0.08226217329502106,,,,,, +12,72899,,,,,,,,,,,,0.09000929445028305,,,,,, +12,72949,,,,,,,,,,,,0.09451048821210861,,,,,, +12,72999,,,,,,,,,,,,0.07365407794713974,,,,,, +12,73049,,,,,,,,,,,,0.08337962627410889,,,,,, +12,73099,,,,,,,,,,,,0.08270159363746643,,,,,, +12,73149,,,,,,,,,,,,0.09569983184337616,,,,,, +12,73199,,,,,,,,,,,,0.0798126608133316,,,,,, +12,73249,,,,,,,,,,,,0.09632808715105057,,,,,, +12,73299,,,,,,,,,,,,0.09010778367519379,,,,,, +12,73349,,,,,,,,,,,,0.08289410173892975,,,,,, +12,73399,,,,,,,,,,,,0.08125066757202148,,,,,, +12,73449,,,,,,,,,,,,0.08047842979431152,,,,,, +12,73499,,,,,,,,,,,,0.07375934720039368,,,,,, +12,73549,,,,,,,,,,,,0.08043213188648224,,,,,, +12,73599,,,,,,,,,,,,0.08097834885120392,,,,,, +12,73649,,,,,,,,,,,,0.08320726454257965,,,,,, +12,73699,,,,,,,,,,,,0.09369544684886932,,,,,, +12,73749,,,,,,,,,,,,0.08672016113996506,,,,,, +12,73799,,,,,,,,,,,,0.0710345059633255,,,,,, +12,73849,,,,,,,,,,,,0.09392645955085754,,,,,, +12,73899,,,,,,,,,,,,0.08128110319375992,,,,,, +12,73949,,,,,,,,,,,,0.08171506226062775,,,,,, +12,73999,,,,,,,,,,,,0.07741626352071762,,,,,, +12,74049,,,,,,,,,,,,0.08316946029663086,,,,,, +12,74099,,,,,,,,,,,,0.08225619792938232,,,,,, +12,74149,,,,,,,,,,,,0.07711311429738998,,,,,, +12,74199,,,,,,,,,,,,0.08613432198762894,,,,,, +12,74249,,,,,,,,,,,,0.08119750767946243,,,,,, +12,74299,,,,,,,,,,,,0.08850106596946716,,,,,, +12,74349,,,,,,,,,,,,0.08793331682682037,,,,,, +12,74399,,,,,,,,,,,,0.08784164488315582,,,,,, +12,74449,,,,,,,,,,,,0.07879810780286789,,,,,, +12,74499,,,,,,,,,,,,0.08506372570991516,,,,,, +12,74549,,,,,,,,,,,,0.07875251024961472,,,,,, +12,74567,,,,,,,,,,,,,0.2487991899251938,0.0830787941813469,nan,-0.007982254028320312,0.003650638507679105,0.0830787941813469 +12,74567,,,,,,,0.24885956943035126,0.0828094556927681,nan,-0.0005830526351928711,-0.00147893070243299,,,,,,, +13,74599,,,,,,,,,,,,0.08332259953022003,,,,,, +13,74649,,,,,,,,,,,,0.08138218522071838,,,,,, +13,74699,,,,,,,,,,,,0.08477137237787247,,,,,, +13,74749,,,,,,,,,,,,0.0725875124335289,,,,,, +13,74799,,,,,,,,,,,,0.09511855989694595,,,,,, +13,74849,,,,,,,,,,,,0.07523120194673538,,,,,, +13,74899,,,,,,,,,,,,0.07506775856018066,,,,,, +13,74949,,,,,,,,,,,,0.08366362750530243,,,,,, +13,74999,,,,,,,,,,,,0.0858265608549118,,,,,, +13,75049,,,,,,,,,,,,0.08413547277450562,,,,,, +13,75099,,,,,,,,,,,,0.07756799459457397,,,,,, +13,75149,,,,,,,,,,,,0.0866619125008583,,,,,, +13,75199,,,,,,,,,,,,0.0944875180721283,,,,,, +13,75249,,,,,,,,,,,,0.07940420508384705,,,,,, +13,75299,,,,,,,,,,,,0.08480314910411835,,,,,, +13,75349,,,,,,,,,,,,0.08050306141376495,,,,,, +13,75399,,,,,,,,,,,,0.07894736528396606,,,,,, +13,75449,,,,,,,,,,,,0.08492617309093475,,,,,, +13,75499,,,,,,,,,,,,0.08427336812019348,,,,,, +13,75549,,,,,,,,,,,,0.08656259626150131,,,,,, +13,75599,,,,,,,,,,,,0.08233515173196793,,,,,, +13,75649,,,,,,,,,,,,0.07549133151769638,,,,,, +13,75699,,,,,,,,,,,,0.07839688658714294,,,,,, +13,75749,,,,,,,,,,,,0.0884396880865097,,,,,, +13,75799,,,,,,,,,,,,0.08382321894168854,,,,,, +13,75849,,,,,,,,,,,,0.08781038224697113,,,,,, +13,75899,,,,,,,,,,,,0.07480096817016602,,,,,, +13,75949,,,,,,,,,,,,0.0851263552904129,,,,,, +13,75999,,,,,,,,,,,,0.08234813809394836,,,,,, +13,76049,,,,,,,,,,,,0.07986856997013092,,,,,, +13,76099,,,,,,,,,,,,0.08218210190534592,,,,,, +13,76149,,,,,,,,,,,,0.09176377952098846,,,,,, +13,76199,,,,,,,,,,,,0.07785873860120773,,,,,, +13,76249,,,,,,,,,,,,0.0732392743229866,,,,,, +13,76299,,,,,,,,,,,,0.07873792946338654,,,,,, +13,76349,,,,,,,,,,,,0.08445072174072266,,,,,, +13,76399,,,,,,,,,,,,0.09012561291456223,,,,,, +13,76449,,,,,,,,,,,,0.07989662885665894,,,,,, +13,76499,,,,,,,,,,,,0.07773568481206894,,,,,, +13,76549,,,,,,,,,,,,0.07762843370437622,,,,,, +13,76599,,,,,,,,,,,,0.07666872441768646,,,,,, +13,76649,,,,,,,,,,,,0.08250081539154053,,,,,, +13,76699,,,,,,,,,,,,0.0815066397190094,,,,,, +13,76749,,,,,,,,,,,,0.09352511912584305,,,,,, +13,76799,,,,,,,,,,,,0.08343005180358887,,,,,, +13,76849,,,,,,,,,,,,0.08316519111394882,,,,,, +13,76899,,,,,,,,,,,,0.07354956120252609,,,,,, +13,76949,,,,,,,,,,,,0.09433434158563614,,,,,, +13,76999,,,,,,,,,,,,0.07663607597351074,,,,,, +13,77049,,,,,,,,,,,,0.08935632556676865,,,,,, +13,77099,,,,,,,,,,,,0.09230218827724457,,,,,, +13,77149,,,,,,,,,,,,0.07268241047859192,,,,,, +13,77199,,,,,,,,,,,,0.08397441357374191,,,,,, +13,77249,,,,,,,,,,,,0.07191294431686401,,,,,, +13,77299,,,,,,,,,,,,0.08288499712944031,,,,,, +13,77349,,,,,,,,,,,,0.07645045220851898,,,,,, +13,77399,,,,,,,,,,,,0.07819174230098724,,,,,, +13,77449,,,,,,,,,,,,0.08472665399312973,,,,,, +13,77499,,,,,,,,,,,,0.08878003060817719,,,,,, +13,77549,,,,,,,,,,,,0.08526620268821716,,,,,, +13,77599,,,,,,,,,,,,0.08179481327533722,,,,,, +13,77649,,,,,,,,,,,,0.08616773039102554,,,,,, +13,77699,,,,,,,,,,,,0.08537185192108154,,,,,, +13,77749,,,,,,,,,,,,0.0705762505531311,,,,,, +13,77799,,,,,,,,,,,,0.08758307993412018,,,,,, +13,77849,,,,,,,,,,,,0.08144547045230865,,,,,, +13,77899,,,,,,,,,,,,0.08424969762563705,,,,,, +13,77949,,,,,,,,,,,,0.08659892529249191,,,,,, +13,77999,,,,,,,,,,,,0.08960257470607758,,,,,, +13,78049,,,,,,,,,,,,0.07158651947975159,,,,,, +13,78099,,,,,,,,,,,,0.07869184762239456,,,,,, +13,78149,,,,,,,,,,,,0.0833541750907898,,,,,, +13,78199,,,,,,,,,,,,0.09195438772439957,,,,,, +13,78249,,,,,,,,,,,,0.0968952402472496,,,,,, +13,78299,,,,,,,,,,,,0.08180280774831772,,,,,, +13,78349,,,,,,,,,,,,0.09192690253257751,,,,,, +13,78399,,,,,,,,,,,,0.07687371969223022,,,,,, +13,78449,,,,,,,,,,,,0.07680679857730865,,,,,, +13,78499,,,,,,,,,,,,0.08523602783679962,,,,,, +13,78549,,,,,,,,,,,,0.07222888618707657,,,,,, +13,78599,,,,,,,,,,,,0.08833637833595276,,,,,, +13,78649,,,,,,,,,,,,0.08104313910007477,,,,,, +13,78699,,,,,,,,,,,,0.08697041124105453,,,,,, +13,78749,,,,,,,,,,,,0.08817128837108612,,,,,, +13,78799,,,,,,,,,,,,0.08001716434955597,,,,,, +13,78849,,,,,,,,,,,,0.09461621940135956,,,,,, +13,78899,,,,,,,,,,,,0.10293517261743546,,,,,, +13,78949,,,,,,,,,,,,0.08068323135375977,,,,,, +13,78999,,,,,,,,,,,,0.08920133858919144,,,,,, +13,79049,,,,,,,,,,,,0.0799161046743393,,,,,, +13,79099,,,,,,,,,,,,0.08380135893821716,,,,,, +13,79149,,,,,,,,,,,,0.09114201366901398,,,,,, +13,79199,,,,,,,,,,,,0.07639353722333908,,,,,, +13,79249,,,,,,,,,,,,0.07840185612440109,,,,,, +13,79299,,,,,,,,,,,,0.08312749862670898,,,,,, +13,79349,,,,,,,,,,,,0.0927506536245346,,,,,, +13,79399,,,,,,,,,,,,0.08077792823314667,,,,,, +13,79449,,,,,,,,,,,,0.08658382296562195,,,,,, +13,79499,,,,,,,,,,,,0.07920312881469727,,,,,, +13,79549,,,,,,,,,,,,0.0744461864233017,,,,,, +13,79599,,,,,,,,,,,,0.0865858644247055,,,,,, +13,79649,,,,,,,,,,,,0.0777331218123436,,,,,, +13,79699,,,,,,,,,,,,0.0754406601190567,,,,,, +13,79749,,,,,,,,,,,,0.07070907950401306,,,,,, +13,79799,,,,,,,,,,,,0.08744725584983826,,,,,, +13,79849,,,,,,,,,,,,0.09185867011547089,,,,,, +13,79899,,,,,,,,,,,,0.08639894425868988,,,,,, +13,79949,,,,,,,,,,,,0.07977086305618286,,,,,, +13,79999,,,,,,,,,,,,0.08995160460472107,,,,,, +13,80049,,,,,,,,,,,,0.0722942128777504,,,,,, +13,80099,,,,,,,,,,,,0.08610478043556213,,,,,, +13,80149,,,,,,,,,,,,0.08742736279964447,,,,,, +13,80199,,,,,,,,,,,,0.08671945333480835,,,,,, +13,80249,,,,,,,,,,,,0.08187031745910645,,,,,, +13,80299,,,,,,,,,,,,0.09404772520065308,,,,,, +13,80303,,,,,,,,,,,,,0.24859124422073364,0.08277258276939392,nan,-0.004266977310180664,0.001546898391097784,0.08277258276939392 +13,80303,,,,,,,0.24884802103042603,0.08279785513877869,nan,-0.0004445314407348633,0.0007858652388677001,,,,,,, +14,80349,,,,,,,,,,,,0.09569746255874634,,,,,, +14,80399,,,,,,,,,,,,0.0925527960062027,,,,,, +14,80449,,,,,,,,,,,,0.0843813344836235,,,,,, +14,80499,,,,,,,,,,,,0.08854484558105469,,,,,, +14,80549,,,,,,,,,,,,0.07785128057003021,,,,,, +14,80599,,,,,,,,,,,,0.0774449035525322,,,,,, +14,80649,,,,,,,,,,,,0.07622522860765457,,,,,, +14,80699,,,,,,,,,,,,0.07984036207199097,,,,,, +14,80749,,,,,,,,,,,,0.0876067727804184,,,,,, +14,80799,,,,,,,,,,,,0.08606086671352386,,,,,, +14,80849,,,,,,,,,,,,0.0797644853591919,,,,,, +14,80899,,,,,,,,,,,,0.08056153357028961,,,,,, +14,80949,,,,,,,,,,,,0.07585197687149048,,,,,, +14,80999,,,,,,,,,,,,0.08224783092737198,,,,,, +14,81049,,,,,,,,,,,,0.08166694641113281,,,,,, +14,81099,,,,,,,,,,,,0.08126069605350494,,,,,, +14,81149,,,,,,,,,,,,0.08291812986135483,,,,,, +14,81199,,,,,,,,,,,,0.0815168097615242,,,,,, +14,81249,,,,,,,,,,,,0.08647017180919647,,,,,, +14,81299,,,,,,,,,,,,0.07661639153957367,,,,,, +14,81349,,,,,,,,,,,,0.0875762403011322,,,,,, +14,81399,,,,,,,,,,,,0.07420172542333603,,,,,, +14,81449,,,,,,,,,,,,0.08011424541473389,,,,,, +14,81499,,,,,,,,,,,,0.08670124411582947,,,,,, +14,81549,,,,,,,,,,,,0.07811960577964783,,,,,, +14,81599,,,,,,,,,,,,0.07834549248218536,,,,,, +14,81649,,,,,,,,,,,,0.06985421478748322,,,,,, +14,81699,,,,,,,,,,,,0.09002010524272919,,,,,, +14,81749,,,,,,,,,,,,0.08412649482488632,,,,,, +14,81799,,,,,,,,,,,,0.08111530542373657,,,,,, +14,81849,,,,,,,,,,,,0.0821087658405304,,,,,, +14,81899,,,,,,,,,,,,0.0947847068309784,,,,,, +14,81949,,,,,,,,,,,,0.09411311149597168,,,,,, +14,81999,,,,,,,,,,,,0.09893743693828583,,,,,, +14,82049,,,,,,,,,,,,0.09237508475780487,,,,,, +14,82099,,,,,,,,,,,,0.08514369279146194,,,,,, +14,82149,,,,,,,,,,,,0.08357253670692444,,,,,, +14,82199,,,,,,,,,,,,0.07954942435026169,,,,,, +14,82249,,,,,,,,,,,,0.08648049831390381,,,,,, +14,82299,,,,,,,,,,,,0.08315596729516983,,,,,, +14,82349,,,,,,,,,,,,0.079122394323349,,,,,, +14,82399,,,,,,,,,,,,0.0838494673371315,,,,,, +14,82449,,,,,,,,,,,,0.09011013805866241,,,,,, +14,82499,,,,,,,,,,,,0.07364502549171448,,,,,, +14,82549,,,,,,,,,,,,0.076716348528862,,,,,, +14,82599,,,,,,,,,,,,0.08977685123682022,,,,,, +14,82649,,,,,,,,,,,,0.08310317248106003,,,,,, +14,82699,,,,,,,,,,,,0.07616804540157318,,,,,, +14,82749,,,,,,,,,,,,0.07778923213481903,,,,,, +14,82799,,,,,,,,,,,,0.07913564145565033,,,,,, +14,82849,,,,,,,,,,,,0.07402500510215759,,,,,, +14,82899,,,,,,,,,,,,0.08378198742866516,,,,,, +14,82949,,,,,,,,,,,,0.06638799607753754,,,,,, +14,82999,,,,,,,,,,,,0.07979706674814224,,,,,, +14,83049,,,,,,,,,,,,0.07589282095432281,,,,,, +14,83099,,,,,,,,,,,,0.07922927290201187,,,,,, +14,83149,,,,,,,,,,,,0.08005068451166153,,,,,, +14,83199,,,,,,,,,,,,0.09365230798721313,,,,,, +14,83249,,,,,,,,,,,,0.08393475413322449,,,,,, +14,83299,,,,,,,,,,,,0.07830994576215744,,,,,, +14,83349,,,,,,,,,,,,0.08451797813177109,,,,,, +14,83399,,,,,,,,,,,,0.07855071872472763,,,,,, +14,83449,,,,,,,,,,,,0.09088291227817535,,,,,, +14,83499,,,,,,,,,,,,0.07102897763252258,,,,,, +14,83549,,,,,,,,,,,,0.07721764594316483,,,,,, +14,83599,,,,,,,,,,,,0.09004977345466614,,,,,, +14,83649,,,,,,,,,,,,0.08137168735265732,,,,,, +14,83699,,,,,,,,,,,,0.08187058568000793,,,,,, +14,83749,,,,,,,,,,,,0.06949961185455322,,,,,, +14,83799,,,,,,,,,,,,0.07113266736268997,,,,,, +14,83849,,,,,,,,,,,,0.07804654538631439,,,,,, +14,83899,,,,,,,,,,,,0.08221201598644257,,,,,, +14,83949,,,,,,,,,,,,0.08163121342658997,,,,,, +14,83999,,,,,,,,,,,,0.07805183529853821,,,,,, +14,84049,,,,,,,,,,,,0.08029680699110031,,,,,, +14,84099,,,,,,,,,,,,0.08119518309831619,,,,,, +14,84149,,,,,,,,,,,,0.0853819027543068,,,,,, +14,84199,,,,,,,,,,,,0.09600051492452621,,,,,, +14,84249,,,,,,,,,,,,0.08879333734512329,,,,,, +14,84299,,,,,,,,,,,,0.09469765424728394,,,,,, +14,84349,,,,,,,,,,,,0.09512577950954437,,,,,, +14,84399,,,,,,,,,,,,0.07580742985010147,,,,,, +14,84449,,,,,,,,,,,,0.07854200154542923,,,,,, +14,84499,,,,,,,,,,,,0.085716113448143,,,,,, +14,84549,,,,,,,,,,,,0.06946900486946106,,,,,, +14,84599,,,,,,,,,,,,0.07237149775028229,,,,,, +14,84649,,,,,,,,,,,,0.07738079130649567,,,,,, +14,84699,,,,,,,,,,,,0.07866910099983215,,,,,, +14,84749,,,,,,,,,,,,0.08261527121067047,,,,,, +14,84799,,,,,,,,,,,,0.09460294246673584,,,,,, +14,84849,,,,,,,,,,,,0.08417321741580963,,,,,, +14,84899,,,,,,,,,,,,0.0745307132601738,,,,,, +14,84949,,,,,,,,,,,,0.07987745106220245,,,,,, +14,84999,,,,,,,,,,,,0.07717029750347137,,,,,, +14,85049,,,,,,,,,,,,0.09070286899805069,,,,,, +14,85099,,,,,,,,,,,,0.07201867550611496,,,,,, +14,85149,,,,,,,,,,,,0.08775198459625244,,,,,, +14,85199,,,,,,,,,,,,0.07173663377761841,,,,,, +14,85249,,,,,,,,,,,,0.0751720666885376,,,,,, +14,85299,,,,,,,,,,,,0.09435628354549408,,,,,, +14,85349,,,,,,,,,,,,0.08610299229621887,,,,,, +14,85399,,,,,,,,,,,,0.08416810631752014,,,,,, +14,85449,,,,,,,,,,,,0.08853965997695923,,,,,, +14,85499,,,,,,,,,,,,0.08036303520202637,,,,,, +14,85549,,,,,,,,,,,,0.08317074924707413,,,,,, +14,85599,,,,,,,,,,,,0.08225315809249878,,,,,, +14,85649,,,,,,,,,,,,0.09397129714488983,,,,,, +14,85699,,,,,,,,,,,,0.0844946950674057,,,,,, +14,85749,,,,,,,,,,,,0.09921833872795105,,,,,, +14,85799,,,,,,,,,,,,0.09652713686227798,,,,,, +14,85849,,,,,,,,,,,,0.08552005141973495,,,,,, +14,85899,,,,,,,,,,,,0.08053967356681824,,,,,, +14,85949,,,,,,,,,,,,0.08016081899404526,,,,,, +14,85999,,,,,,,,,,,,0.07820077985525131,,,,,, +14,86039,,,,,,,,,,,,,0.2484791874885559,0.08273976296186447,nan,-0.0038688182830810547,0.07139647006988525,0.08273976296186447 +14,86039,,,,,,,0.2488153874874115,0.08277450501918793,nan,-0.0001531839370727539,0.0027567597571760416,,,,,,, +15,86049,,,,,,,,,,,,0.08418479561805725,,,,,, +15,86099,,,,,,,,,,,,0.07526274770498276,,,,,, +15,86149,,,,,,,,,,,,0.07702620327472687,,,,,, +15,86199,,,,,,,,,,,,0.083173468708992,,,,,, +15,86249,,,,,,,,,,,,0.06900167465209961,,,,,, +15,86299,,,,,,,,,,,,0.07957345247268677,,,,,, +15,86349,,,,,,,,,,,,0.08294720947742462,,,,,, +15,86399,,,,,,,,,,,,0.0760020911693573,,,,,, +15,86449,,,,,,,,,,,,0.08324426412582397,,,,,, +15,86499,,,,,,,,,,,,0.08416140824556351,,,,,, +15,86549,,,,,,,,,,,,0.0843116044998169,,,,,, +15,86599,,,,,,,,,,,,0.08474455773830414,,,,,, +15,86649,,,,,,,,,,,,0.07167177647352219,,,,,, +15,86699,,,,,,,,,,,,0.0913974791765213,,,,,, +15,86749,,,,,,,,,,,,0.0817297101020813,,,,,, +15,86799,,,,,,,,,,,,0.07304155826568604,,,,,, +15,86849,,,,,,,,,,,,0.07160543650388718,,,,,, +15,86899,,,,,,,,,,,,0.07850564271211624,,,,,, +15,86949,,,,,,,,,,,,0.08871319890022278,,,,,, +15,86999,,,,,,,,,,,,0.07999484241008759,,,,,, +15,87049,,,,,,,,,,,,0.07694021612405777,,,,,, +15,87099,,,,,,,,,,,,0.09097877889871597,,,,,, +15,87149,,,,,,,,,,,,0.08296731114387512,,,,,, +15,87199,,,,,,,,,,,,0.09331105649471283,,,,,, +15,87249,,,,,,,,,,,,0.07394295930862427,,,,,, +15,87299,,,,,,,,,,,,0.0874253362417221,,,,,, +15,87349,,,,,,,,,,,,0.08619800209999084,,,,,, +15,87399,,,,,,,,,,,,0.0922299474477768,,,,,, +15,87449,,,,,,,,,,,,0.08127185702323914,,,,,, +15,87499,,,,,,,,,,,,0.0719425305724144,,,,,, +15,87549,,,,,,,,,,,,0.08637435734272003,,,,,, +15,87599,,,,,,,,,,,,0.08575655519962311,,,,,, +15,87649,,,,,,,,,,,,0.0854627937078476,,,,,, +15,87699,,,,,,,,,,,,0.07967351377010345,,,,,, +15,87749,,,,,,,,,,,,0.07972010970115662,,,,,, +15,87799,,,,,,,,,,,,0.07974866777658463,,,,,, +15,87849,,,,,,,,,,,,0.09255257248878479,,,,,, +15,87899,,,,,,,,,,,,0.08657671511173248,,,,,, +15,87949,,,,,,,,,,,,0.08690457791090012,,,,,, +15,87999,,,,,,,,,,,,0.08326710760593414,,,,,, +15,88049,,,,,,,,,,,,0.07643404603004456,,,,,, +15,88099,,,,,,,,,,,,0.08414468169212341,,,,,, +15,88149,,,,,,,,,,,,0.08485379815101624,,,,,, +15,88199,,,,,,,,,,,,0.07693502306938171,,,,,, +15,88249,,,,,,,,,,,,0.09077240526676178,,,,,, +15,88299,,,,,,,,,,,,0.07442644983530045,,,,,, +15,88349,,,,,,,,,,,,0.0775584727525711,,,,,, +15,88399,,,,,,,,,,,,0.0696619525551796,,,,,, +15,88449,,,,,,,,,,,,0.0817597284913063,,,,,, +15,88499,,,,,,,,,,,,0.07499025762081146,,,,,, +15,88549,,,,,,,,,,,,0.08280454576015472,,,,,, +15,88599,,,,,,,,,,,,0.07832349836826324,,,,,, +15,88649,,,,,,,,,,,,0.07431831955909729,,,,,, +15,88699,,,,,,,,,,,,0.07937632501125336,,,,,, +15,88749,,,,,,,,,,,,0.07683627307415009,,,,,, +15,88799,,,,,,,,,,,,0.08565619587898254,,,,,, +15,88849,,,,,,,,,,,,0.0870497077703476,,,,,, +15,88899,,,,,,,,,,,,0.09119478613138199,,,,,, +15,88949,,,,,,,,,,,,0.08253300189971924,,,,,, +15,88999,,,,,,,,,,,,0.09168809652328491,,,,,, +15,89049,,,,,,,,,,,,0.08118213713169098,,,,,, +15,89099,,,,,,,,,,,,0.0758599191904068,,,,,, +15,89149,,,,,,,,,,,,0.07537437975406647,,,,,, +15,89199,,,,,,,,,,,,0.08016793429851532,,,,,, +15,89249,,,,,,,,,,,,0.07819696515798569,,,,,, +15,89299,,,,,,,,,,,,0.06621646136045456,,,,,, +15,89349,,,,,,,,,,,,0.07986085116863251,,,,,, +15,89399,,,,,,,,,,,,0.08428393304347992,,,,,, +15,89449,,,,,,,,,,,,0.07448893785476685,,,,,, +15,89499,,,,,,,,,,,,0.07118730247020721,,,,,, +15,89549,,,,,,,,,,,,0.09136616438627243,,,,,, +15,89599,,,,,,,,,,,,0.08234532177448273,,,,,, +15,89649,,,,,,,,,,,,0.07566654682159424,,,,,, +15,89699,,,,,,,,,,,,0.2576022148132324,,,,,, +15,89749,,,,,,,,,,,,0.07904098927974701,,,,,, +15,89799,,,,,,,,,,,,0.09037306904792786,,,,,, +15,89849,,,,,,,,,,,,0.07867525517940521,,,,,, +15,89899,,,,,,,,,,,,0.08505470305681229,,,,,, +15,89949,,,,,,,,,,,,0.08478181064128876,,,,,, +15,89999,,,,,,,,,,,,0.07888326793909073,,,,,, +15,90049,,,,,,,,,,,,0.08653585612773895,,,,,, +15,90099,,,,,,,,,,,,0.08827611804008484,,,,,, +15,90149,,,,,,,,,,,,0.0751224011182785,,,,,, +15,90199,,,,,,,,,,,,0.0851183831691742,,,,,, +15,90249,,,,,,,,,,,,0.07833258807659149,,,,,, +15,90299,,,,,,,,,,,,0.0846644788980484,,,,,, +15,90349,,,,,,,,,,,,0.08146031200885773,,,,,, +15,90399,,,,,,,,,,,,0.0714619904756546,,,,,, +15,90449,,,,,,,,,,,,0.0787765383720398,,,,,, +15,90499,,,,,,,,,,,,0.08590351790189743,,,,,, +15,90549,,,,,,,,,,,,0.08235611021518707,,,,,, +15,90599,,,,,,,,,,,,0.08571420609951019,,,,,, +15,90649,,,,,,,,,,,,0.07772178202867508,,,,,, +15,90699,,,,,,,,,,,,0.0813552588224411,,,,,, +15,90749,,,,,,,,,,,,0.06094104424118996,,,,,, +15,90799,,,,,,,,,,,,0.07984910905361176,,,,,, +15,90849,,,,,,,,,,,,0.09473030269145966,,,,,, +15,90899,,,,,,,,,,,,0.09024979174137115,,,,,, +15,90949,,,,,,,,,,,,0.0806107446551323,,,,,, +15,90999,,,,,,,,,,,,0.08676579594612122,,,,,, +15,91049,,,,,,,,,,,,0.07223469018936157,,,,,, +15,91099,,,,,,,,,,,,0.07466147094964981,,,,,, +15,91149,,,,,,,,,,,,0.0827859491109848,,,,,, +15,91199,,,,,,,,,,,,0.07637359201908112,,,,,, +15,91249,,,,,,,,,,,,0.09370441734790802,,,,,, +15,91299,,,,,,,,,,,,0.07953505218029022,,,,,, +15,91349,,,,,,,,,,,,0.07311637699604034,,,,,, +15,91399,,,,,,,,,,,,0.07825766503810883,,,,,, +15,91449,,,,,,,,,,,,0.07286963611841202,,,,,, +15,91499,,,,,,,,,,,,0.08143211156129837,,,,,, +15,91549,,,,,,,,,,,,0.07707353681325912,,,,,, +15,91599,,,,,,,,,,,,0.07191815972328186,,,,,, +15,91649,,,,,,,,,,,,0.06365427374839783,,,,,, +15,91699,,,,,,,,,,,,0.08671462535858154,,,,,, +15,91749,,,,,,,,,,,,0.0810881108045578,,,,,, +15,91775,,,,,,,,,,,,,0.24489513039588928,0.0808960422873497,0.14174216985702515,0.01850074529647827,0.1282237470149994,0.0808960422873497 +15,91775,,,,,,,0.2466156780719757,0.08171647042036057,0.11303778737783432,0.012633800506591797,0.10677739977836609,,,,,,, +16,91799,,,,,,,,,,,,0.07673858106136322,,,,,, +16,91849,,,,,,,,,,,,0.08495865762233734,,,,,, +16,91899,,,,,,,,,,,,0.07825661450624466,,,,,, +16,91949,,,,,,,,,,,,0.08025804162025452,,,,,, +16,91999,,,,,,,,,,,,0.07546517252922058,,,,,, +16,92049,,,,,,,,,,,,0.08317378163337708,,,,,, +16,92099,,,,,,,,,,,,0.06741610169410706,,,,,, +16,92149,,,,,,,,,,,,0.08285631239414215,,,,,, +16,92199,,,,,,,,,,,,0.07773464918136597,,,,,, +16,92249,,,,,,,,,,,,0.08184272050857544,,,,,, +16,92299,,,,,,,,,,,,0.07872998714447021,,,,,, +16,92349,,,,,,,,,,,,0.08425992727279663,,,,,, +16,92399,,,,,,,,,,,,0.07129363715648651,,,,,, +16,92449,,,,,,,,,,,,0.07964268326759338,,,,,, +16,92499,,,,,,,,,,,,0.08542662858963013,,,,,, +16,92549,,,,,,,,,,,,0.09102267026901245,,,,,, +16,92599,,,,,,,,,,,,0.08146290481090546,,,,,, +16,92649,,,,,,,,,,,,0.08094649016857147,,,,,, +16,92699,,,,,,,,,,,,0.0782700702548027,,,,,, +16,92749,,,,,,,,,,,,0.07955477386713028,,,,,, +16,92799,,,,,,,,,,,,0.0868859812617302,,,,,, +16,92849,,,,,,,,,,,,0.07013572752475739,,,,,, +16,92899,,,,,,,,,,,,0.0756157711148262,,,,,, +16,92949,,,,,,,,,,,,0.0785273015499115,,,,,, +16,92999,,,,,,,,,,,,0.08041760325431824,,,,,, +16,93049,,,,,,,,,,,,0.08481012284755707,,,,,, +16,93099,,,,,,,,,,,,0.08279889822006226,,,,,, +16,93149,,,,,,,,,,,,0.07037591934204102,,,,,, +16,93199,,,,,,,,,,,,0.08574657142162323,,,,,, +16,93249,,,,,,,,,,,,0.08841702342033386,,,,,, +16,93299,,,,,,,,,,,,0.07945495843887329,,,,,, +16,93349,,,,,,,,,,,,0.07916528731584549,,,,,, +16,93399,,,,,,,,,,,,0.08036760240793228,,,,,, +16,93449,,,,,,,,,,,,0.07838024199008942,,,,,, +16,93499,,,,,,,,,,,,0.08081357181072235,,,,,, +16,93549,,,,,,,,,,,,0.06447817385196686,,,,,, +16,93599,,,,,,,,,,,,0.0772431343793869,,,,,, +16,93649,,,,,,,,,,,,0.07053855061531067,,,,,, +16,93699,,,,,,,,,,,,0.08511241525411606,,,,,, +16,93749,,,,,,,,,,,,0.07894892990589142,,,,,, +16,93799,,,,,,,,,,,,0.08505899459123611,,,,,, +16,93849,,,,,,,,,,,,0.07684765011072159,,,,,, +16,93899,,,,,,,,,,,,0.07774607837200165,,,,,, +16,93949,,,,,,,,,,,,0.07897964119911194,,,,,, +16,93999,,,,,,,,,,,,0.07359714806079865,,,,,, +16,94049,,,,,,,,,,,,0.07393291592597961,,,,,, +16,94099,,,,,,,,,,,,0.0849454253911972,,,,,, +16,94149,,,,,,,,,,,,0.07673439383506775,,,,,, +16,94199,,,,,,,,,,,,0.08292777836322784,,,,,, +16,94249,,,,,,,,,,,,0.07842831313610077,,,,,, +16,94299,,,,,,,,,,,,0.080967977643013,,,,,, +16,94349,,,,,,,,,,,,0.08354447782039642,,,,,, +16,94399,,,,,,,,,,,,0.09018070995807648,,,,,, +16,94449,,,,,,,,,,,,0.06737649440765381,,,,,, +16,94499,,,,,,,,,,,,0.07253827154636383,,,,,, +16,94549,,,,,,,,,,,,0.06822577118873596,,,,,, +16,94599,,,,,,,,,,,,0.08109894394874573,,,,,, +16,94649,,,,,,,,,,,,0.07776075601577759,,,,,, +16,94699,,,,,,,,,,,,0.08955490589141846,,,,,, +16,94749,,,,,,,,,,,,0.08624644577503204,,,,,, +16,94799,,,,,,,,,,,,0.0735410749912262,,,,,, +16,94849,,,,,,,,,,,,0.08348832279443741,,,,,, +16,94899,,,,,,,,,,,,0.07095974683761597,,,,,, +16,94949,,,,,,,,,,,,0.06775643676519394,,,,,, +16,94999,,,,,,,,,,,,0.08885573595762253,,,,,, +16,95049,,,,,,,,,,,,0.06797632575035095,,,,,, +16,95099,,,,,,,,,,,,0.06481635570526123,,,,,, +16,95149,,,,,,,,,,,,0.07934872806072235,,,,,, +16,95199,,,,,,,,,,,,0.07156519591808319,,,,,, +16,95249,,,,,,,,,,,,0.07994528114795685,,,,,, +16,95299,,,,,,,,,,,,0.0684850662946701,,,,,, +16,95349,,,,,,,,,,,,0.07692676782608032,,,,,, +16,95399,,,,,,,,,,,,0.08900652825832367,,,,,, +16,95449,,,,,,,,,,,,0.0868510901927948,,,,,, +16,95499,,,,,,,,,,,,0.0782468318939209,,,,,, +16,95549,,,,,,,,,,,,0.0724523589015007,,,,,, +16,95599,,,,,,,,,,,,0.0771610289812088,,,,,, +16,95649,,,,,,,,,,,,0.07051584869623184,,,,,, +16,95699,,,,,,,,,,,,0.08576656877994537,,,,,, +16,95749,,,,,,,,,,,,0.08053712546825409,,,,,, +16,95799,,,,,,,,,,,,0.07878826558589935,,,,,, +16,95849,,,,,,,,,,,,0.07725746929645538,,,,,, +16,95899,,,,,,,,,,,,0.06986214220523834,,,,,, +16,95949,,,,,,,,,,,,0.07493846863508224,,,,,, +16,95999,,,,,,,,,,,,0.0674060732126236,,,,,, +16,96049,,,,,,,,,,,,0.08000847697257996,,,,,, +16,96099,,,,,,,,,,,,0.06729245185852051,,,,,, +16,96149,,,,,,,,,,,,0.0787905901670456,,,,,, +16,96199,,,,,,,,,,,,0.07571563124656677,,,,,, +16,96249,,,,,,,,,,,,0.08066809177398682,,,,,, +16,96299,,,,,,,,,,,,0.08763217180967331,,,,,, +16,96349,,,,,,,,,,,,0.07629787921905518,,,,,, +16,96399,,,,,,,,,,,,0.0811525359749794,,,,,, +16,96449,,,,,,,,,,,,0.07056842744350433,,,,,, +16,96499,,,,,,,,,,,,0.07548010349273682,,,,,, +16,96549,,,,,,,,,,,,0.07670517265796661,,,,,, +16,96599,,,,,,,,,,,,0.07759129256010056,,,,,, +16,96649,,,,,,,,,,,,0.0840633362531662,,,,,, +16,96699,,,,,,,,,,,,0.08261384069919586,,,,,, +16,96749,,,,,,,,,,,,0.07392267882823944,,,,,, +16,96799,,,,,,,,,,,,0.07475841045379639,,,,,, +16,96849,,,,,,,,,,,,0.07211366295814514,,,,,, +16,96899,,,,,,,,,,,,0.07848244160413742,,,,,, +16,96949,,,,,,,,,,,,0.07488494366407394,,,,,, +16,96999,,,,,,,,,,,,0.0801452100276947,,,,,, +16,97049,,,,,,,,,,,,0.08056841790676117,,,,,, +16,97099,,,,,,,,,,,,0.07599800825119019,,,,,, +16,97149,,,,,,,,,,,,0.0865534096956253,,,,,, +16,97199,,,,,,,,,,,,0.07266741991043091,,,,,, +16,97249,,,,,,,,,,,,0.08133850991725922,,,,,, +16,97299,,,,,,,,,,,,0.08672477304935455,,,,,, +16,97349,,,,,,,,,,,,0.07638029754161835,,,,,, +16,97399,,,,,,,,,,,,0.07836040109395981,,,,,, +16,97449,,,,,,,,,,,,0.07598108798265457,,,,,, +16,97499,,,,,,,,,,,,0.0725453794002533,,,,,, +16,97511,,,,,,,,,,,,,0.2443373203277588,0.0813908651471138,0.15540973842144012,0.012497127056121826,0.15128451585769653,0.0813908651471138 +16,97511,,,,,,,0.24352800846099854,0.08011768758296967,0.17885611951351166,0.031944870948791504,0.16626574099063873,,,,,,, +17,97549,,,,,,,,,,,,0.0726616159081459,,,,,, +17,97599,,,,,,,,,,,,0.08650170266628265,,,,,, +17,97649,,,,,,,,,,,,0.0918799415230751,,,,,, +17,97699,,,,,,,,,,,,0.08389917016029358,,,,,, +17,97749,,,,,,,,,,,,0.079450324177742,,,,,, +17,97799,,,,,,,,,,,,0.0806315541267395,,,,,, +17,97849,,,,,,,,,,,,0.09035958349704742,,,,,, +17,97899,,,,,,,,,,,,0.0810810774564743,,,,,, +17,97949,,,,,,,,,,,,0.07412620633840561,,,,,, +17,97999,,,,,,,,,,,,0.0798044204711914,,,,,, +17,98049,,,,,,,,,,,,0.0731317400932312,,,,,, +17,98099,,,,,,,,,,,,0.0778236910700798,,,,,, +17,98149,,,,,,,,,,,,0.09055592119693756,,,,,, +17,98199,,,,,,,,,,,,0.08097082376480103,,,,,, +17,98249,,,,,,,,,,,,0.0674879401922226,,,,,, +17,98299,,,,,,,,,,,,0.08338998258113861,,,,,, +17,98349,,,,,,,,,,,,0.07358375191688538,,,,,, +17,98399,,,,,,,,,,,,0.07377329468727112,,,,,, +17,98449,,,,,,,,,,,,0.09074847400188446,,,,,, +17,98499,,,,,,,,,,,,0.09630411863327026,,,,,, +17,98549,,,,,,,,,,,,0.0685548186302185,,,,,, +17,98599,,,,,,,,,,,,0.06648823618888855,,,,,, +17,98649,,,,,,,,,,,,0.07998207211494446,,,,,, +17,98699,,,,,,,,,,,,0.08459039032459259,,,,,, +17,98749,,,,,,,,,,,,0.07909911870956421,,,,,, +17,98799,,,,,,,,,,,,0.07642427086830139,,,,,, +17,98849,,,,,,,,,,,,0.09872949123382568,,,,,, +17,98899,,,,,,,,,,,,0.07667651772499084,,,,,, +17,98949,,,,,,,,,,,,0.061564356088638306,,,,,, +17,98999,,,,,,,,,,,,0.08394743502140045,,,,,, +17,99049,,,,,,,,,,,,0.08008146286010742,,,,,, +17,99099,,,,,,,,,,,,0.06764854490756989,,,,,, +17,99149,,,,,,,,,,,,0.07816630601882935,,,,,, +17,99199,,,,,,,,,,,,0.07455092668533325,,,,,, +17,99249,,,,,,,,,,,,0.08136399835348129,,,,,, +17,99299,,,,,,,,,,,,0.0918370708823204,,,,,, +17,99349,,,,,,,,,,,,0.09467839449644089,,,,,, +17,99399,,,,,,,,,,,,0.08652517199516296,,,,,, +17,99449,,,,,,,,,,,,0.08304864913225174,,,,,, +17,99499,,,,,,,,,,,,0.08177274465560913,,,,,, +17,99549,,,,,,,,,,,,0.09379947185516357,,,,,, +17,99599,,,,,,,,,,,,0.07850443571805954,,,,,, +17,99649,,,,,,,,,,,,0.08240070939064026,,,,,, +17,99699,,,,,,,,,,,,0.0735984593629837,,,,,, +17,99749,,,,,,,,,,,,0.0787009745836258,,,,,, +17,99799,,,,,,,,,,,,0.07978495955467224,,,,,, +17,99849,,,,,,,,,,,,0.08153141289949417,,,,,, +17,99899,,,,,,,,,,,,0.09185059368610382,,,,,, +17,99949,,,,,,,,,,,,0.0735580325126648,,,,,, +17,99999,,,,,,,,,,,,0.08156535029411316,,,,,, +17,100049,,,,,,,,,,,,0.07736355066299438,,,,,, +17,100099,,,,,,,,,,,,0.08550380170345306,,,,,, +17,100149,,,,,,,,,,,,0.07683250308036804,,,,,, +17,100199,,,,,,,,,,,,0.08248881995677948,,,,,, +17,100249,,,,,,,,,,,,0.09153605997562408,,,,,, +17,100299,,,,,,,,,,,,0.07671631127595901,,,,,, +17,100349,,,,,,,,,,,,0.07703648507595062,,,,,, +17,100399,,,,,,,,,,,,0.09180139005184174,,,,,, +17,100449,,,,,,,,,,,,0.0741787701845169,,,,,, +17,100499,,,,,,,,,,,,0.07199771702289581,,,,,, +17,100549,,,,,,,,,,,,0.09187350422143936,,,,,, +17,100599,,,,,,,,,,,,0.07416997849941254,,,,,, +17,100649,,,,,,,,,,,,0.08687525987625122,,,,,, +17,100699,,,,,,,,,,,,0.07584892958402634,,,,,, +17,100749,,,,,,,,,,,,0.0731966495513916,,,,,, +17,100799,,,,,,,,,,,,0.08986113965511322,,,,,, +17,100849,,,,,,,,,,,,0.08409462124109268,,,,,, +17,100899,,,,,,,,,,,,0.07766979932785034,,,,,, +17,100949,,,,,,,,,,,,0.07894465327262878,,,,,, +17,100999,,,,,,,,,,,,0.0820416733622551,,,,,, +17,101049,,,,,,,,,,,,0.07206518948078156,,,,,, +17,101099,,,,,,,,,,,,0.08191309124231339,,,,,, +17,101149,,,,,,,,,,,,0.07510796934366226,,,,,, +17,101199,,,,,,,,,,,,0.0853099599480629,,,,,, +17,101249,,,,,,,,,,,,0.07925496995449066,,,,,, +17,101299,,,,,,,,,,,,0.07918260991573334,,,,,, +17,101349,,,,,,,,,,,,0.06957787275314331,,,,,, +17,101399,,,,,,,,,,,,0.09220650792121887,,,,,, +17,101449,,,,,,,,,,,,0.06919965147972107,,,,,, +17,101499,,,,,,,,,,,,0.08377949893474579,,,,,, +17,101549,,,,,,,,,,,,0.07367340475320816,,,,,, +17,101599,,,,,,,,,,,,0.07103316485881805,,,,,, +17,101649,,,,,,,,,,,,0.0767853856086731,,,,,, +17,101699,,,,,,,,,,,,0.0672137662768364,,,,,, +17,101749,,,,,,,,,,,,0.06745776534080505,,,,,, +17,101799,,,,,,,,,,,,0.08229835331439972,,,,,, +17,101849,,,,,,,,,,,,0.07308726012706757,,,,,, +17,101899,,,,,,,,,,,,0.07855749875307083,,,,,, +17,101949,,,,,,,,,,,,0.0898205041885376,,,,,, +17,101999,,,,,,,,,,,,0.08262047171592712,,,,,, +17,102049,,,,,,,,,,,,0.07492132484912872,,,,,, +17,102099,,,,,,,,,,,,0.07971367239952087,,,,,, +17,102149,,,,,,,,,,,,0.07329369336366653,,,,,, +17,102199,,,,,,,,,,,,0.07974645495414734,,,,,, +17,102249,,,,,,,,,,,,0.07831273972988129,,,,,, +17,102299,,,,,,,,,,,,0.07349097728729248,,,,,, +17,102349,,,,,,,,,,,,0.09586949646472931,,,,,, +17,102399,,,,,,,,,,,,0.08140449225902557,,,,,, +17,102449,,,,,,,,,,,,0.06491462141275406,,,,,, +17,102499,,,,,,,,,,,,0.07545779645442963,,,,,, +17,102549,,,,,,,,,,,,0.07702996581792831,,,,,, +17,102599,,,,,,,,,,,,0.08211372047662735,,,,,, +17,102649,,,,,,,,,,,,0.06301403045654297,,,,,, +17,102699,,,,,,,,,,,,0.06789834052324295,,,,,, +17,102749,,,,,,,,,,,,0.06948138773441315,,,,,, +17,102799,,,,,,,,,,,,0.07724340260028839,,,,,, +17,102849,,,,,,,,,,,,0.08358952403068542,,,,,, +17,102899,,,,,,,,,,,,0.07773725688457489,,,,,, +17,102949,,,,,,,,,,,,0.07659467309713364,,,,,, +17,102999,,,,,,,,,,,,0.08744189143180847,,,,,, +17,103049,,,,,,,,,,,,0.07716125249862671,,,,,, +17,103099,,,,,,,,,,,,0.08000625669956207,,,,,, +17,103149,,,,,,,,,,,,0.08244213461875916,,,,,, +17,103199,,,,,,,,,,,,0.07711540162563324,,,,,, +17,103247,,,,,,,,,,,,,0.24306832253932953,0.08031874895095825,0.16828961670398712,0.0255049467086792,0.1644032746553421,0.08031874895095825 +17,103247,,,,,,,0.24229338765144348,0.07945968955755234,0.19982153177261353,0.039896607398986816,0.18192075192928314,,,,,,, +18,103249,,,,,,,,,,,,0.08496930450201035,,,,,, +18,103299,,,,,,,,,,,,0.08648228645324707,,,,,, +18,103349,,,,,,,,,,,,0.07172828912734985,,,,,, +18,103399,,,,,,,,,,,,0.07863423228263855,,,,,, +18,103449,,,,,,,,,,,,0.08774401247501373,,,,,, +18,103499,,,,,,,,,,,,0.06978796422481537,,,,,, +18,103549,,,,,,,,,,,,0.07531589269638062,,,,,, +18,103599,,,,,,,,,,,,0.08172215521335602,,,,,, +18,103649,,,,,,,,,,,,0.07781589031219482,,,,,, +18,103699,,,,,,,,,,,,0.08028745651245117,,,,,, +18,103749,,,,,,,,,,,,0.0706145241856575,,,,,, +18,103799,,,,,,,,,,,,0.09059519320726395,,,,,, +18,103849,,,,,,,,,,,,0.07975079119205475,,,,,, +18,103899,,,,,,,,,,,,0.07824181765317917,,,,,, +18,103949,,,,,,,,,,,,0.07830813527107239,,,,,, +18,103999,,,,,,,,,,,,0.08455884456634521,,,,,, +18,104049,,,,,,,,,,,,0.08506797254085541,,,,,, +18,104099,,,,,,,,,,,,0.09178973734378815,,,,,, +18,104149,,,,,,,,,,,,0.08330515027046204,,,,,, +18,104199,,,,,,,,,,,,0.08146826922893524,,,,,, +18,104249,,,,,,,,,,,,0.06362524628639221,,,,,, +18,104299,,,,,,,,,,,,0.08702339231967926,,,,,, +18,104349,,,,,,,,,,,,0.0780419409275055,,,,,, +18,104399,,,,,,,,,,,,0.06930790841579437,,,,,, +18,104449,,,,,,,,,,,,0.09688124060630798,,,,,, +18,104499,,,,,,,,,,,,0.0745956301689148,,,,,, +18,104549,,,,,,,,,,,,0.07345711439847946,,,,,, +18,104599,,,,,,,,,,,,0.08582932502031326,,,,,, +18,104649,,,,,,,,,,,,0.08380727469921112,,,,,, +18,104699,,,,,,,,,,,,0.08112727105617523,,,,,, +18,104749,,,,,,,,,,,,0.08897038549184799,,,,,, +18,104799,,,,,,,,,,,,0.06902637332677841,,,,,, +18,104849,,,,,,,,,,,,0.08271796256303787,,,,,, +18,104899,,,,,,,,,,,,0.07825104892253876,,,,,, +18,104949,,,,,,,,,,,,0.07626132667064667,,,,,, +18,104999,,,,,,,,,,,,0.07975614815950394,,,,,, +18,105049,,,,,,,,,,,,0.08533570170402527,,,,,, +18,105099,,,,,,,,,,,,0.08830694854259491,,,,,, +18,105149,,,,,,,,,,,,0.06903334707021713,,,,,, +18,105199,,,,,,,,,,,,0.08436238765716553,,,,,, +18,105249,,,,,,,,,,,,0.06593507528305054,,,,,, +18,105299,,,,,,,,,,,,0.07500936090946198,,,,,, +18,105349,,,,,,,,,,,,0.07930205017328262,,,,,, +18,105399,,,,,,,,,,,,0.07291765511035919,,,,,, +18,105449,,,,,,,,,,,,0.08506074547767639,,,,,, +18,105499,,,,,,,,,,,,0.09198805689811707,,,,,, +18,105549,,,,,,,,,,,,0.07966657727956772,,,,,, +18,105599,,,,,,,,,,,,0.07334155589342117,,,,,, +18,105649,,,,,,,,,,,,0.06805086135864258,,,,,, +18,105699,,,,,,,,,,,,0.07691735029220581,,,,,, +18,105749,,,,,,,,,,,,0.0677427425980568,,,,,, +18,105799,,,,,,,,,,,,0.08019629120826721,,,,,, +18,105849,,,,,,,,,,,,0.07639848440885544,,,,,, +18,105899,,,,,,,,,,,,0.07815678417682648,,,,,, +18,105949,,,,,,,,,,,,0.07517825067043304,,,,,, +18,105999,,,,,,,,,,,,0.07294245064258575,,,,,, +18,106049,,,,,,,,,,,,0.07929462194442749,,,,,, +18,106099,,,,,,,,,,,,0.07596993446350098,,,,,, +18,106149,,,,,,,,,,,,0.07538531720638275,,,,,, +18,106199,,,,,,,,,,,,0.08161543309688568,,,,,, +18,106249,,,,,,,,,,,,0.09551940113306046,,,,,, +18,106299,,,,,,,,,,,,0.08568702638149261,,,,,, +18,106349,,,,,,,,,,,,0.0745820701122284,,,,,, +18,106399,,,,,,,,,,,,0.08252277970314026,,,,,, +18,106449,,,,,,,,,,,,0.08991213887929916,,,,,, +18,106499,,,,,,,,,,,,0.06387102603912354,,,,,, +18,106549,,,,,,,,,,,,0.07525333017110825,,,,,, +18,106599,,,,,,,,,,,,0.07432898133993149,,,,,, +18,106649,,,,,,,,,,,,0.09115464985370636,,,,,, +18,106699,,,,,,,,,,,,0.07860125601291656,,,,,, +18,106749,,,,,,,,,,,,0.08518912643194199,,,,,, +18,106799,,,,,,,,,,,,0.07634814828634262,,,,,, +18,106849,,,,,,,,,,,,0.08619023114442825,,,,,, +18,106899,,,,,,,,,,,,0.07885006070137024,,,,,, +18,106949,,,,,,,,,,,,0.10125938057899475,,,,,, +18,106999,,,,,,,,,,,,0.09985767304897308,,,,,, +18,107049,,,,,,,,,,,,0.08843395859003067,,,,,, +18,107099,,,,,,,,,,,,0.07704375684261322,,,,,, +18,107149,,,,,,,,,,,,0.08339427411556244,,,,,, +18,107199,,,,,,,,,,,,0.07808494567871094,,,,,, +18,107249,,,,,,,,,,,,0.07386864721775055,,,,,, +18,107299,,,,,,,,,,,,0.0733405351638794,,,,,, +18,107349,,,,,,,,,,,,0.07615281641483307,,,,,, +18,107399,,,,,,,,,,,,0.07103164494037628,,,,,, +18,107449,,,,,,,,,,,,0.0682748332619667,,,,,, +18,107499,,,,,,,,,,,,0.06103036180138588,,,,,, +18,107549,,,,,,,,,,,,0.07641412317752838,,,,,, +18,107599,,,,,,,,,,,,0.07157696783542633,,,,,, +18,107649,,,,,,,,,,,,0.08064403384923935,,,,,, +18,107699,,,,,,,,,,,,0.07333692908287048,,,,,, +18,107749,,,,,,,,,,,,0.06531786918640137,,,,,, +18,107799,,,,,,,,,,,,0.07625343650579453,,,,,, +18,107849,,,,,,,,,,,,0.08161690086126328,,,,,, +18,107899,,,,,,,,,,,,0.07590902596712112,,,,,, +18,107949,,,,,,,,,,,,0.08726055920124054,,,,,, +18,107999,,,,,,,,,,,,0.07214746624231339,,,,,, +18,108049,,,,,,,,,,,,0.07549940049648285,,,,,, +18,108099,,,,,,,,,,,,0.07157815992832184,,,,,, +18,108149,,,,,,,,,,,,0.07335907220840454,,,,,, +18,108199,,,,,,,,,,,,0.08389496803283691,,,,,, +18,108249,,,,,,,,,,,,0.08604452013969421,,,,,, +18,108299,,,,,,,,,,,,0.07303310185670853,,,,,, +18,108349,,,,,,,,,,,,0.0852595716714859,,,,,, +18,108399,,,,,,,,,,,,0.09585541486740112,,,,,, +18,108449,,,,,,,,,,,,0.08594763278961182,,,,,, +18,108499,,,,,,,,,,,,0.08209182322025299,,,,,, +18,108549,,,,,,,,,,,,0.07822154462337494,,,,,, +18,108599,,,,,,,,,,,,0.08589950203895569,,,,,, +18,108649,,,,,,,,,,,,0.07527755200862885,,,,,, +18,108699,,,,,,,,,,,,0.08618561923503876,,,,,, +18,108749,,,,,,,,,,,,0.07249432802200317,,,,,, +18,108799,,,,,,,,,,,,0.07621150463819504,,,,,, +18,108849,,,,,,,,,,,,0.07640829682350159,,,,,, +18,108899,,,,,,,,,,,,0.0733112096786499,,,,,, +18,108949,,,,,,,,,,,,0.07365372776985168,,,,,, +18,108983,,,,,,,,,,,,,0.24238431453704834,0.07957321405410767,0.18627077341079712,0.034550368785858154,0.18258914351463318,0.07957321405410767 +18,108983,,,,,,,0.24134013056755066,0.07901589572429657,0.21284428238868713,0.045256972312927246,0.19264879822731018,,,,,,, +19,108999,,,,,,,,,,,,0.08530101180076599,,,,,, +19,109049,,,,,,,,,,,,0.0800447165966034,,,,,, +19,109099,,,,,,,,,,,,0.07874362915754318,,,,,, +19,109149,,,,,,,,,,,,0.07572229206562042,,,,,, +19,109199,,,,,,,,,,,,0.07525357604026794,,,,,, +19,109249,,,,,,,,,,,,0.07723672688007355,,,,,, +19,109299,,,,,,,,,,,,0.08376595377922058,,,,,, +19,109349,,,,,,,,,,,,0.07098525762557983,,,,,, +19,109399,,,,,,,,,,,,0.0781971886754036,,,,,, +19,109449,,,,,,,,,,,,0.07191713154315948,,,,,, +19,109499,,,,,,,,,,,,0.0851789340376854,,,,,, +19,109549,,,,,,,,,,,,0.07280252128839493,,,,,, +19,109599,,,,,,,,,,,,0.08320410549640656,,,,,, +19,109649,,,,,,,,,,,,0.08160729706287384,,,,,, +19,109699,,,,,,,,,,,,0.07761084288358688,,,,,, +19,109749,,,,,,,,,,,,0.08474791795015335,,,,,, +19,109799,,,,,,,,,,,,0.0709926038980484,,,,,, +19,109849,,,,,,,,,,,,0.07903397083282471,,,,,, +19,109899,,,,,,,,,,,,0.07200935482978821,,,,,, +19,109949,,,,,,,,,,,,0.07996892929077148,,,,,, +19,109999,,,,,,,,,,,,0.0687878429889679,,,,,, +19,110049,,,,,,,,,,,,0.07958247512578964,,,,,, +19,110099,,,,,,,,,,,,0.08416667580604553,,,,,, +19,110149,,,,,,,,,,,,0.07670414447784424,,,,,, +19,110199,,,,,,,,,,,,0.07365260273218155,,,,,, +19,110249,,,,,,,,,,,,0.0686558336019516,,,,,, +19,110299,,,,,,,,,,,,0.07830929011106491,,,,,, +19,110349,,,,,,,,,,,,0.08923806250095367,,,,,, +19,110399,,,,,,,,,,,,0.07047505676746368,,,,,, +19,110449,,,,,,,,,,,,0.07926031947135925,,,,,, +19,110499,,,,,,,,,,,,0.06515148282051086,,,,,, +19,110549,,,,,,,,,,,,0.08559487760066986,,,,,, +19,110599,,,,,,,,,,,,0.08327873051166534,,,,,, +19,110649,,,,,,,,,,,,0.07451648265123367,,,,,, +19,110699,,,,,,,,,,,,0.07262885570526123,,,,,, +19,110749,,,,,,,,,,,,0.09309320151805878,,,,,, +19,110799,,,,,,,,,,,,0.07254788279533386,,,,,, +19,110849,,,,,,,,,,,,0.08066433668136597,,,,,, +19,110899,,,,,,,,,,,,0.07596805691719055,,,,,, +19,110949,,,,,,,,,,,,0.08323688060045242,,,,,, +19,110999,,,,,,,,,,,,0.07779134809970856,,,,,, +19,111049,,,,,,,,,,,,0.0837409645318985,,,,,, +19,111099,,,,,,,,,,,,0.07357552647590637,,,,,, +19,111149,,,,,,,,,,,,0.08329890668392181,,,,,, +19,111199,,,,,,,,,,,,0.07926879823207855,,,,,, +19,111249,,,,,,,,,,,,0.0896950215101242,,,,,, +19,111299,,,,,,,,,,,,0.08392727375030518,,,,,, +19,111349,,,,,,,,,,,,0.07725749909877777,,,,,, +19,111399,,,,,,,,,,,,0.07535231113433838,,,,,, +19,111449,,,,,,,,,,,,0.08997663110494614,,,,,, +19,111499,,,,,,,,,,,,0.08536683022975922,,,,,, +19,111549,,,,,,,,,,,,0.08844040334224701,,,,,, +19,111599,,,,,,,,,,,,0.07469445466995239,,,,,, +19,111649,,,,,,,,,,,,0.08422216027975082,,,,,, +19,111699,,,,,,,,,,,,0.08233240991830826,,,,,, +19,111749,,,,,,,,,,,,0.0903262197971344,,,,,, +19,111799,,,,,,,,,,,,0.07911437749862671,,,,,, +19,111849,,,,,,,,,,,,0.07726632058620453,,,,,, +19,111899,,,,,,,,,,,,0.08001532405614853,,,,,, +19,111949,,,,,,,,,,,,0.08603336662054062,,,,,, +19,111999,,,,,,,,,,,,0.07232362776994705,,,,,, +19,112049,,,,,,,,,,,,0.09325040876865387,,,,,, +19,112099,,,,,,,,,,,,0.08293229341506958,,,,,, +19,112149,,,,,,,,,,,,0.07726606726646423,,,,,, +19,112199,,,,,,,,,,,,0.08995851129293442,,,,,, +19,112249,,,,,,,,,,,,0.07435513287782669,,,,,, +19,112299,,,,,,,,,,,,0.0782814621925354,,,,,, +19,112349,,,,,,,,,,,,0.07964539527893066,,,,,, +19,112399,,,,,,,,,,,,0.07370948791503906,,,,,, +19,112449,,,,,,,,,,,,0.07963475584983826,,,,,, +19,112499,,,,,,,,,,,,0.08102808147668839,,,,,, +19,112549,,,,,,,,,,,,0.08401677012443542,,,,,, +19,112599,,,,,,,,,,,,0.07671841233968735,,,,,, +19,112649,,,,,,,,,,,,0.06564916670322418,,,,,, +19,112699,,,,,,,,,,,,0.0667375922203064,,,,,, +19,112749,,,,,,,,,,,,0.07516921311616898,,,,,, +19,112799,,,,,,,,,,,,0.08030332624912262,,,,,, +19,112849,,,,,,,,,,,,0.083112932741642,,,,,, +19,112899,,,,,,,,,,,,0.08231477439403534,,,,,, +19,112949,,,,,,,,,,,,0.06549239158630371,,,,,, +19,112999,,,,,,,,,,,,0.08177588880062103,,,,,, +19,113049,,,,,,,,,,,,0.07024243474006653,,,,,, +19,113099,,,,,,,,,,,,0.06859831511974335,,,,,, +19,113149,,,,,,,,,,,,0.09005600214004517,,,,,, +19,113199,,,,,,,,,,,,0.07502026110887527,,,,,, +19,113249,,,,,,,,,,,,0.081571564078331,,,,,, +19,113299,,,,,,,,,,,,0.0825924277305603,,,,,, +19,113349,,,,,,,,,,,,0.09328644722700119,,,,,, +19,113399,,,,,,,,,,,,0.08158634603023529,,,,,, +19,113449,,,,,,,,,,,,0.07918382436037064,,,,,, +19,113499,,,,,,,,,,,,0.06192397326231003,,,,,, +19,113549,,,,,,,,,,,,0.07643593847751617,,,,,, +19,113599,,,,,,,,,,,,0.07272413372993469,,,,,, +19,113649,,,,,,,,,,,,0.07436811923980713,,,,,, +19,113699,,,,,,,,,,,,0.08034294843673706,,,,,, +19,113749,,,,,,,,,,,,0.07948008179664612,,,,,, +19,113799,,,,,,,,,,,,0.08595037460327148,,,,,, +19,113849,,,,,,,,,,,,0.07844450324773788,,,,,, +19,113899,,,,,,,,,,,,0.07584307342767715,,,,,, +19,113949,,,,,,,,,,,,0.0700736939907074,,,,,, +19,113999,,,,,,,,,,,,0.07454276829957962,,,,,, +19,114049,,,,,,,,,,,,0.07117688655853271,,,,,, +19,114099,,,,,,,,,,,,0.07416434586048126,,,,,, +19,114149,,,,,,,,,,,,0.0749865397810936,,,,,, +19,114199,,,,,,,,,,,,0.07168088853359222,,,,,, +19,114249,,,,,,,,,,,,0.0735369622707367,,,,,, +19,114299,,,,,,,,,,,,0.09182572364807129,,,,,, +19,114349,,,,,,,,,,,,0.07655856013298035,,,,,, +19,114399,,,,,,,,,,,,0.08379778265953064,,,,,, +19,114449,,,,,,,,,,,,0.08967185020446777,,,,,, +19,114499,,,,,,,,,,,,0.09288837015628815,,,,,, +19,114549,,,,,,,,,,,,0.06124727427959442,,,,,, +19,114599,,,,,,,,,,,,0.08043267577886581,,,,,, +19,114649,,,,,,,,,,,,0.07353624701499939,,,,,, +19,114699,,,,,,,,,,,,0.08258074522018433,,,,,, +19,114719,,,,,,,,,,,,,0.24164755642414093,0.07989474385976791,0.2094232439994812,0.030649304389953613,0.209917813539505,0.07989474385976791 +19,114719,,,,,,,0.24137860536575317,0.07906865328550339,0.2113998532295227,0.04462766647338867,0.1919228434562683,,,,,,, +20,114749,,,,,,,,,,,,0.08559735119342804,,,,,, +20,114799,,,,,,,,,,,,0.060854680836200714,,,,,, +20,114849,,,,,,,,,,,,0.08023659884929657,,,,,, +20,114899,,,,,,,,,,,,0.07047538459300995,,,,,, +20,114949,,,,,,,,,,,,0.08044654130935669,,,,,, +20,114999,,,,,,,,,,,,0.08122671395540237,,,,,, +20,115049,,,,,,,,,,,,0.07841801643371582,,,,,, +20,115099,,,,,,,,,,,,0.06515301764011383,,,,,, +20,115149,,,,,,,,,,,,0.08205141127109528,,,,,, +20,115199,,,,,,,,,,,,0.07259111106395721,,,,,, +20,115249,,,,,,,,,,,,0.08119654655456543,,,,,, +20,115299,,,,,,,,,,,,0.07927746325731277,,,,,, +20,115349,,,,,,,,,,,,0.07006542384624481,,,,,, +20,115399,,,,,,,,,,,,0.07734069228172302,,,,,, +20,115449,,,,,,,,,,,,0.07534287869930267,,,,,, +20,115499,,,,,,,,,,,,0.07110978662967682,,,,,, +20,115549,,,,,,,,,,,,0.08299170434474945,,,,,, +20,115599,,,,,,,,,,,,0.08630602061748505,,,,,, +20,115649,,,,,,,,,,,,0.07673721015453339,,,,,, +20,115699,,,,,,,,,,,,0.08471310138702393,,,,,, +20,115749,,,,,,,,,,,,0.06938713043928146,,,,,, +20,115799,,,,,,,,,,,,0.07730395346879959,,,,,, +20,115849,,,,,,,,,,,,0.07205456495285034,,,,,, +20,115899,,,,,,,,,,,,0.07732976973056793,,,,,, +20,115949,,,,,,,,,,,,0.07541145384311676,,,,,, +20,115999,,,,,,,,,,,,0.0806984007358551,,,,,, +20,116049,,,,,,,,,,,,0.07686513662338257,,,,,, +20,116099,,,,,,,,,,,,0.08407259732484818,,,,,, +20,116149,,,,,,,,,,,,0.07739453762769699,,,,,, +20,116199,,,,,,,,,,,,0.08222202956676483,,,,,, +20,116249,,,,,,,,,,,,0.08014380186796188,,,,,, +20,116299,,,,,,,,,,,,0.07848692685365677,,,,,, +20,116349,,,,,,,,,,,,0.09145665168762207,,,,,, +20,116399,,,,,,,,,,,,0.08373874425888062,,,,,, +20,116449,,,,,,,,,,,,0.08142118155956268,,,,,, +20,116499,,,,,,,,,,,,0.08091533929109573,,,,,, +20,116549,,,,,,,,,,,,0.08225149661302567,,,,,, +20,116599,,,,,,,,,,,,0.09146048128604889,,,,,, +20,116649,,,,,,,,,,,,0.08445512503385544,,,,,, +20,116699,,,,,,,,,,,,0.07203438133001328,,,,,, +20,116749,,,,,,,,,,,,0.0707525759935379,,,,,, +20,116799,,,,,,,,,,,,0.0813056081533432,,,,,, +20,116849,,,,,,,,,,,,0.0822930783033371,,,,,, +20,116899,,,,,,,,,,,,0.07033146917819977,,,,,, +20,116949,,,,,,,,,,,,0.08173738420009613,,,,,, +20,116999,,,,,,,,,,,,0.0805584192276001,,,,,, +20,117049,,,,,,,,,,,,0.08626019209623337,,,,,, +20,117099,,,,,,,,,,,,0.06920752674341202,,,,,, +20,117149,,,,,,,,,,,,0.09486231207847595,,,,,, +20,117199,,,,,,,,,,,,0.08043192327022552,,,,,, +20,117249,,,,,,,,,,,,0.0821467861533165,,,,,, +20,117299,,,,,,,,,,,,0.07958398759365082,,,,,, +20,117349,,,,,,,,,,,,0.0882556289434433,,,,,, +20,117399,,,,,,,,,,,,0.07853654772043228,,,,,, +20,117449,,,,,,,,,,,,0.0776018276810646,,,,,, +20,117499,,,,,,,,,,,,0.07760432362556458,,,,,, +20,117549,,,,,,,,,,,,0.08091216534376144,,,,,, +20,117599,,,,,,,,,,,,0.06752212345600128,,,,,, +20,117649,,,,,,,,,,,,0.07768990844488144,,,,,, +20,117699,,,,,,,,,,,,0.08595704287290573,,,,,, +20,117749,,,,,,,,,,,,0.0750194638967514,,,,,, +20,117799,,,,,,,,,,,,0.07400157302618027,,,,,, +20,117849,,,,,,,,,,,,0.061401303857564926,,,,,, +20,117899,,,,,,,,,,,,0.08814401924610138,,,,,, +20,117949,,,,,,,,,,,,0.07899396866559982,,,,,, +20,117999,,,,,,,,,,,,0.08786538243293762,,,,,, +20,118049,,,,,,,,,,,,0.08337444067001343,,,,,, +20,118099,,,,,,,,,,,,0.07600712776184082,,,,,, +20,118149,,,,,,,,,,,,0.09118016064167023,,,,,, +20,118199,,,,,,,,,,,,0.08138013631105423,,,,,, +20,118249,,,,,,,,,,,,0.06361893564462662,,,,,, +20,118299,,,,,,,,,,,,0.08836259692907333,,,,,, +20,118349,,,,,,,,,,,,0.10008664429187775,,,,,, +20,118399,,,,,,,,,,,,0.0677199438214302,,,,,, +20,118449,,,,,,,,,,,,0.07091481983661652,,,,,, +20,118499,,,,,,,,,,,,0.07901639491319656,,,,,, +20,118549,,,,,,,,,,,,0.08241420984268188,,,,,, +20,118599,,,,,,,,,,,,0.06754405051469803,,,,,, +20,118649,,,,,,,,,,,,0.08695389330387115,,,,,, +20,118699,,,,,,,,,,,,0.07139486819505692,,,,,, +20,118749,,,,,,,,,,,,0.08153082430362701,,,,,, +20,118799,,,,,,,,,,,,0.07523048669099808,,,,,, +20,118849,,,,,,,,,,,,0.07177576422691345,,,,,, +20,118899,,,,,,,,,,,,0.06969840824604034,,,,,, +20,118949,,,,,,,,,,,,0.07121498882770538,,,,,, +20,118999,,,,,,,,,,,,0.07188748568296432,,,,,, +20,119049,,,,,,,,,,,,0.08737876266241074,,,,,, +20,119099,,,,,,,,,,,,0.09422959387302399,,,,,, +20,119149,,,,,,,,,,,,0.07424432039260864,,,,,, +20,119199,,,,,,,,,,,,0.0750105008482933,,,,,, +20,119249,,,,,,,,,,,,0.06949225813150406,,,,,, +20,119299,,,,,,,,,,,,0.08827456831932068,,,,,, +20,119349,,,,,,,,,,,,0.07755183428525925,,,,,, +20,119399,,,,,,,,,,,,0.07844673842191696,,,,,, +20,119449,,,,,,,,,,,,0.08476947247982025,,,,,, +20,119499,,,,,,,,,,,,0.08291274309158325,,,,,, +20,119549,,,,,,,,,,,,0.0694064125418663,,,,,, +20,119599,,,,,,,,,,,,0.08339126408100128,,,,,, +20,119649,,,,,,,,,,,,0.07948148250579834,,,,,, +20,119699,,,,,,,,,,,,0.06931233406066895,,,,,, +20,119749,,,,,,,,,,,,0.0836477279663086,,,,,, +20,119799,,,,,,,,,,,,0.08691748976707458,,,,,, +20,119849,,,,,,,,,,,,0.07607411593198776,,,,,, +20,119899,,,,,,,,,,,,0.08345799148082733,,,,,, +20,119949,,,,,,,,,,,,0.06997303664684296,,,,,, +20,119999,,,,,,,,,,,,0.07794979214668274,,,,,, +20,120049,,,,,,,,,,,,0.07873652130365372,,,,,, +20,120099,,,,,,,,,,,,0.07407118380069733,,,,,, +20,120149,,,,,,,,,,,,0.09174972772598267,,,,,, +20,120199,,,,,,,,,,,,0.07273759692907333,,,,,, +20,120249,,,,,,,,,,,,0.08723559975624084,,,,,, +20,120299,,,,,,,,,,,,0.07174909114837646,,,,,, +20,120349,,,,,,,,,,,,0.07715609669685364,,,,,, +20,120399,,,,,,,,,,,,0.07855725288391113,,,,,, +20,120449,,,,,,,,,,,,0.08292552828788757,,,,,, +20,120455,,,,,,,,,,,,,0.24092677235603333,0.08217661082744598,0.247745081782341,0.0029637813568115234,0.24527457356452942,0.08217661082744598 +20,120455,,,,,,,0.23996518552303314,0.07825884222984314,0.2332979440689087,0.054397404193878174,0.2110452800989151,,,,,,, +21,120499,,,,,,,,,,,,0.08094072341918945,,,,,, +21,120549,,,,,,,,,,,,0.08480136841535568,,,,,, +21,120599,,,,,,,,,,,,0.08621091395616531,,,,,, +21,120649,,,,,,,,,,,,0.0786280483007431,,,,,, +21,120699,,,,,,,,,,,,0.08647985756397247,,,,,, +21,120749,,,,,,,,,,,,0.08473540842533112,,,,,, +21,120799,,,,,,,,,,,,0.08197575807571411,,,,,, +21,120849,,,,,,,,,,,,0.08757327497005463,,,,,, +21,120899,,,,,,,,,,,,0.07641272246837616,,,,,, +21,120949,,,,,,,,,,,,0.08060461282730103,,,,,, +21,120999,,,,,,,,,,,,0.07470957189798355,,,,,, +21,121049,,,,,,,,,,,,0.07733023166656494,,,,,, +21,121099,,,,,,,,,,,,0.07727227360010147,,,,,, +21,121149,,,,,,,,,,,,0.07173046469688416,,,,,, +21,121199,,,,,,,,,,,,0.08097590506076813,,,,,, +21,121249,,,,,,,,,,,,0.08285631239414215,,,,,, +21,121299,,,,,,,,,,,,0.08410052955150604,,,,,, +21,121349,,,,,,,,,,,,0.07454454898834229,,,,,, +21,121399,,,,,,,,,,,,0.07112041860818863,,,,,, +21,121449,,,,,,,,,,,,0.07298638671636581,,,,,, +21,121499,,,,,,,,,,,,0.07649832218885422,,,,,, +21,121549,,,,,,,,,,,,0.07065068185329437,,,,,, +21,121599,,,,,,,,,,,,0.07629156112670898,,,,,, +21,121649,,,,,,,,,,,,0.0722886323928833,,,,,, +21,121699,,,,,,,,,,,,0.07430460304021835,,,,,, +21,121749,,,,,,,,,,,,0.08668331801891327,,,,,, +21,121799,,,,,,,,,,,,0.09256280213594437,,,,,, +21,121849,,,,,,,,,,,,0.08137884736061096,,,,,, +21,121899,,,,,,,,,,,,0.07877683639526367,,,,,, +21,121949,,,,,,,,,,,,0.07978764921426773,,,,,, +21,121999,,,,,,,,,,,,0.07600343227386475,,,,,, +21,122049,,,,,,,,,,,,0.08103403449058533,,,,,, +21,122099,,,,,,,,,,,,0.08176872134208679,,,,,, +21,122149,,,,,,,,,,,,0.08435970544815063,,,,,, +21,122199,,,,,,,,,,,,0.0799582302570343,,,,,, +21,122249,,,,,,,,,,,,0.06924966722726822,,,,,, +21,122299,,,,,,,,,,,,0.07262693345546722,,,,,, +21,122349,,,,,,,,,,,,0.08215155452489853,,,,,, +21,122399,,,,,,,,,,,,0.07056596875190735,,,,,, +21,122449,,,,,,,,,,,,0.0708095133304596,,,,,, +21,122499,,,,,,,,,,,,0.08610761165618896,,,,,, +21,122549,,,,,,,,,,,,0.08293046057224274,,,,,, +21,122599,,,,,,,,,,,,0.08073899149894714,,,,,, +21,122649,,,,,,,,,,,,0.08467740565538406,,,,,, +21,122699,,,,,,,,,,,,0.08061773329973221,,,,,, +21,122749,,,,,,,,,,,,0.07769833505153656,,,,,, +21,122799,,,,,,,,,,,,0.07712962478399277,,,,,, +21,122849,,,,,,,,,,,,0.06375159323215485,,,,,, +21,122899,,,,,,,,,,,,0.07778885960578918,,,,,, +21,122949,,,,,,,,,,,,0.0826994925737381,,,,,, +21,122999,,,,,,,,,,,,0.08086210489273071,,,,,, +21,123049,,,,,,,,,,,,0.08275815844535828,,,,,, +21,123099,,,,,,,,,,,,0.07651636004447937,,,,,, +21,123149,,,,,,,,,,,,0.070245161652565,,,,,, +21,123199,,,,,,,,,,,,0.07851966470479965,,,,,, +21,123249,,,,,,,,,,,,0.08069094270467758,,,,,, +21,123299,,,,,,,,,,,,0.07246308773756027,,,,,, +21,123349,,,,,,,,,,,,0.07325936108827591,,,,,, +21,123399,,,,,,,,,,,,0.0750344842672348,,,,,, +21,123449,,,,,,,,,,,,0.07627056539058685,,,,,, +21,123499,,,,,,,,,,,,0.07622456550598145,,,,,, +21,123549,,,,,,,,,,,,0.07485176622867584,,,,,, +21,123599,,,,,,,,,,,,0.08866466581821442,,,,,, +21,123649,,,,,,,,,,,,0.08574418723583221,,,,,, +21,123699,,,,,,,,,,,,0.08240136504173279,,,,,, +21,123749,,,,,,,,,,,,0.07458619773387909,,,,,, +21,123799,,,,,,,,,,,,0.07439183443784714,,,,,, +21,123849,,,,,,,,,,,,0.074046790599823,,,,,, +21,123899,,,,,,,,,,,,0.08273976296186447,,,,,, +21,123949,,,,,,,,,,,,0.08275195956230164,,,,,, +21,123999,,,,,,,,,,,,0.07554195821285248,,,,,, +21,124049,,,,,,,,,,,,0.07611417025327682,,,,,, +21,124099,,,,,,,,,,,,0.0780075341463089,,,,,, +21,124149,,,,,,,,,,,,0.07521560788154602,,,,,, +21,124199,,,,,,,,,,,,0.08261299133300781,,,,,, +21,124249,,,,,,,,,,,,0.08467316627502441,,,,,, +21,124299,,,,,,,,,,,,0.07489355653524399,,,,,, +21,124349,,,,,,,,,,,,0.08002299070358276,,,,,, +21,124399,,,,,,,,,,,,0.06931596249341965,,,,,, +21,124449,,,,,,,,,,,,0.07911905646324158,,,,,, +21,124499,,,,,,,,,,,,0.08533599972724915,,,,,, +21,124549,,,,,,,,,,,,0.07606714963912964,,,,,, +21,124599,,,,,,,,,,,,0.07044121623039246,,,,,, +21,124649,,,,,,,,,,,,0.09012416005134583,,,,,, +21,124699,,,,,,,,,,,,0.07594180107116699,,,,,, +21,124749,,,,,,,,,,,,0.07523326575756073,,,,,, +21,124799,,,,,,,,,,,,0.08483273535966873,,,,,, +21,124849,,,,,,,,,,,,0.07998116314411163,,,,,, +21,124899,,,,,,,,,,,,0.08644777536392212,,,,,, +21,124949,,,,,,,,,,,,0.08012505620718002,,,,,, +21,124999,,,,,,,,,,,,0.07721719145774841,,,,,, +21,125049,,,,,,,,,,,,0.06792712211608887,,,,,, +21,125099,,,,,,,,,,,,0.07496170699596405,,,,,, +21,125149,,,,,,,,,,,,0.08748985081911087,,,,,, +21,125199,,,,,,,,,,,,0.07238917797803879,,,,,, +21,125249,,,,,,,,,,,,0.09570387005805969,,,,,, +21,125299,,,,,,,,,,,,0.06925185024738312,,,,,, +21,125349,,,,,,,,,,,,0.08529672026634216,,,,,, +21,125399,,,,,,,,,,,,0.08110229671001434,,,,,, +21,125449,,,,,,,,,,,,0.07754957675933838,,,,,, +21,125499,,,,,,,,,,,,0.07795185595750809,,,,,, +21,125549,,,,,,,,,,,,0.07809141278266907,,,,,, +21,125599,,,,,,,,,,,,0.06734213978052139,,,,,, +21,125649,,,,,,,,,,,,0.07363671064376831,,,,,, +21,125699,,,,,,,,,,,,0.06546662747859955,,,,,, +21,125749,,,,,,,,,,,,0.08485381305217743,,,,,, +21,125799,,,,,,,,,,,,0.07351146638393402,,,,,, +21,125849,,,,,,,,,,,,0.07977502048015594,,,,,, +21,125899,,,,,,,,,,,,0.06605158746242523,,,,,, +21,125949,,,,,,,,,,,,0.07792094349861145,,,,,, +21,125999,,,,,,,,,,,,0.06322048604488373,,,,,, +21,126049,,,,,,,,,,,,0.09060732275247574,,,,,, +21,126099,,,,,,,,,,,,0.07469010353088379,,,,,, +21,126149,,,,,,,,,,,,0.07996100932359695,,,,,, +21,126191,,,,,,,,,,,,,0.2385261356830597,0.0781359151005745,0.24056462943553925,0.051988959312438965,0.2299167811870575,0.0781359151005745 +21,126191,,,,,,,0.23922640085220337,0.077889084815979,0.24269714951515198,0.05886876583099365,0.2203584909439087,,,,,,, +22,126199,,,,,,,,,,,,0.07082978636026382,,,,,, +22,126249,,,,,,,,,,,,0.09319216012954712,,,,,, +22,126299,,,,,,,,,,,,0.06990999728441238,,,,,, +22,126349,,,,,,,,,,,,0.07608203589916229,,,,,, +22,126399,,,,,,,,,,,,0.07216522097587585,,,,,, +22,126449,,,,,,,,,,,,0.0637587308883667,,,,,, +22,126499,,,,,,,,,,,,0.06904308497905731,,,,,, +22,126549,,,,,,,,,,,,0.08973534405231476,,,,,, +22,126599,,,,,,,,,,,,0.07894159853458405,,,,,, +22,126649,,,,,,,,,,,,0.08144474029541016,,,,,, +22,126699,,,,,,,,,,,,0.07933113723993301,,,,,, +22,126749,,,,,,,,,,,,0.08461794257164001,,,,,, +22,126799,,,,,,,,,,,,0.06842347234487534,,,,,, +22,126849,,,,,,,,,,,,0.0688713937997818,,,,,, +22,126899,,,,,,,,,,,,0.07858516275882721,,,,,, +22,126949,,,,,,,,,,,,0.0818684995174408,,,,,, +22,126999,,,,,,,,,,,,0.09143492579460144,,,,,, +22,127049,,,,,,,,,,,,0.08001596480607986,,,,,, +22,127099,,,,,,,,,,,,0.08119681477546692,,,,,, +22,127149,,,,,,,,,,,,0.08437276631593704,,,,,, +22,127199,,,,,,,,,,,,0.06965353339910507,,,,,, +22,127249,,,,,,,,,,,,0.08093641698360443,,,,,, +22,127299,,,,,,,,,,,,0.0754825547337532,,,,,, +22,127349,,,,,,,,,,,,0.0896030068397522,,,,,, +22,127399,,,,,,,,,,,,0.08142302185297012,,,,,, +22,127449,,,,,,,,,,,,0.08149741590023041,,,,,, +22,127499,,,,,,,,,,,,0.07550418376922607,,,,,, +22,127549,,,,,,,,,,,,0.08525495231151581,,,,,, +22,127599,,,,,,,,,,,,0.07845771312713623,,,,,, +22,127649,,,,,,,,,,,,0.07226721942424774,,,,,, +22,127699,,,,,,,,,,,,0.07851819694042206,,,,,, +22,127749,,,,,,,,,,,,0.07787933945655823,,,,,, +22,127799,,,,,,,,,,,,0.08642607182264328,,,,,, +22,127849,,,,,,,,,,,,0.08575545996427536,,,,,, +22,127899,,,,,,,,,,,,0.07932256162166595,,,,,, +22,127949,,,,,,,,,,,,0.08033480495214462,,,,,, +22,127999,,,,,,,,,,,,0.07227911055088043,,,,,, +22,128049,,,,,,,,,,,,0.06919676810503006,,,,,, +22,128099,,,,,,,,,,,,0.0793045312166214,,,,,, +22,128149,,,,,,,,,,,,0.0722612738609314,,,,,, +22,128199,,,,,,,,,,,,0.06671123206615448,,,,,, +22,128249,,,,,,,,,,,,0.08746547996997833,,,,,, +22,128299,,,,,,,,,,,,0.07839293032884598,,,,,, +22,128349,,,,,,,,,,,,0.07167874276638031,,,,,, +22,128399,,,,,,,,,,,,0.07321267575025558,,,,,, +22,128449,,,,,,,,,,,,0.066438689827919,,,,,, +22,128499,,,,,,,,,,,,0.08693515509366989,,,,,, +22,128549,,,,,,,,,,,,0.08099263906478882,,,,,, +22,128599,,,,,,,,,,,,0.06986342370510101,,,,,, +22,128649,,,,,,,,,,,,0.07861590385437012,,,,,, +22,128699,,,,,,,,,,,,0.07379713654518127,,,,,, +22,128749,,,,,,,,,,,,0.07133390754461288,,,,,, +22,128799,,,,,,,,,,,,0.06782861053943634,,,,,, +22,128849,,,,,,,,,,,,0.07214239239692688,,,,,, +22,128899,,,,,,,,,,,,0.0822233259677887,,,,,, +22,128949,,,,,,,,,,,,0.08482248336076736,,,,,, +22,128999,,,,,,,,,,,,0.08284907042980194,,,,,, +22,129049,,,,,,,,,,,,0.07583823800086975,,,,,, +22,129099,,,,,,,,,,,,0.07773271203041077,,,,,, +22,129149,,,,,,,,,,,,0.08673165738582611,,,,,, +22,129199,,,,,,,,,,,,0.07045477628707886,,,,,, +22,129249,,,,,,,,,,,,0.08530475199222565,,,,,, +22,129299,,,,,,,,,,,,0.07412073016166687,,,,,, +22,129349,,,,,,,,,,,,0.08062256127595901,,,,,, +22,129399,,,,,,,,,,,,0.08106489479541779,,,,,, +22,129449,,,,,,,,,,,,0.07751695811748505,,,,,, +22,129499,,,,,,,,,,,,0.07340854406356812,,,,,, +22,129549,,,,,,,,,,,,0.08380696177482605,,,,,, +22,129599,,,,,,,,,,,,0.08675506711006165,,,,,, +22,129649,,,,,,,,,,,,0.07042790949344635,,,,,, +22,129699,,,,,,,,,,,,0.07632115483283997,,,,,, +22,129749,,,,,,,,,,,,0.07100408524274826,,,,,, +22,129799,,,,,,,,,,,,0.07385565340518951,,,,,, +22,129849,,,,,,,,,,,,0.09031792730093002,,,,,, +22,129899,,,,,,,,,,,,0.06118576228618622,,,,,, +22,129949,,,,,,,,,,,,0.06998319923877716,,,,,, +22,129999,,,,,,,,,,,,0.08016195893287659,,,,,, +22,130049,,,,,,,,,,,,0.07027949392795563,,,,,, +22,130099,,,,,,,,,,,,0.06624175608158112,,,,,, +22,130149,,,,,,,,,,,,0.07947513461112976,,,,,, +22,130199,,,,,,,,,,,,0.07025948911905289,,,,,, +22,130249,,,,,,,,,,,,0.08413403481245041,,,,,, +22,130299,,,,,,,,,,,,0.08769115805625916,,,,,, +22,130349,,,,,,,,,,,,0.07644951343536377,,,,,, +22,130399,,,,,,,,,,,,0.07651195675134659,,,,,, +22,130449,,,,,,,,,,,,0.07845062762498856,,,,,, +22,130499,,,,,,,,,,,,0.07331115752458572,,,,,, +22,130549,,,,,,,,,,,,0.07419150322675705,,,,,, +22,130599,,,,,,,,,,,,0.0706881731748581,,,,,, +22,130649,,,,,,,,,,,,0.07639770209789276,,,,,, +22,130699,,,,,,,,,,,,0.07285764068365097,,,,,, +22,130749,,,,,,,,,,,,0.06319639831781387,,,,,, +22,130799,,,,,,,,,,,,0.08750931173563004,,,,,, +22,130849,,,,,,,,,,,,0.06768061220645905,,,,,, +22,130899,,,,,,,,,,,,0.07151501625776291,,,,,, +22,130949,,,,,,,,,,,,0.08101469278335571,,,,,, +22,130999,,,,,,,,,,,,0.08616343885660172,,,,,, +22,131049,,,,,,,,,,,,0.07220692932605743,,,,,, +22,131099,,,,,,,,,,,,0.08095207810401917,,,,,, +22,131149,,,,,,,,,,,,0.07729128003120422,,,,,, +22,131199,,,,,,,,,,,,0.07781580090522766,,,,,, +22,131249,,,,,,,,,,,,0.07078462839126587,,,,,, +22,131299,,,,,,,,,,,,0.08108757436275482,,,,,, +22,131349,,,,,,,,,,,,0.07602883875370026,,,,,, +22,131399,,,,,,,,,,,,0.08257390558719635,,,,,, +22,131449,,,,,,,,,,,,0.07681310176849365,,,,,, +22,131499,,,,,,,,,,,,0.06979411840438843,,,,,, +22,131549,,,,,,,,,,,,0.08098143339157104,,,,,, +22,131599,,,,,,,,,,,,0.0730111300945282,,,,,, +22,131649,,,,,,,,,,,,0.08356958627700806,,,,,, +22,131699,,,,,,,,,,,,0.0809490829706192,,,,,, +22,131749,,,,,,,,,,,,0.09231030941009521,,,,,, +22,131799,,,,,,,,,,,,0.07370784878730774,,,,,, +22,131849,,,,,,,,,,,,0.07612020522356033,,,,,, +22,131899,,,,,,,,,,,,0.07365776598453522,,,,,, +22,131927,,,,,,,,,,,,,0.24567000567913055,0.08394043147563934,0.1588733047246933,-0.018436431884765625,0.14956720173358917,0.08394043147563934 +22,131927,,,,,,,0.2383323758840561,0.07741991430521011,0.25410422682762146,0.06454664468765259,0.23353947699069977,,,,,,, +23,131949,,,,,,,,,,,,0.06452181935310364,,,,,, +23,131999,,,,,,,,,,,,0.08307863771915436,,,,,, +23,132049,,,,,,,,,,,,0.0708395391702652,,,,,, +23,132099,,,,,,,,,,,,0.08375030010938644,,,,,, +23,132149,,,,,,,,,,,,0.06628961861133575,,,,,, +23,132199,,,,,,,,,,,,0.07236990332603455,,,,,, +23,132249,,,,,,,,,,,,0.08755941689014435,,,,,, +23,132299,,,,,,,,,,,,0.07892133295536041,,,,,, +23,132349,,,,,,,,,,,,0.07717280089855194,,,,,, +23,132399,,,,,,,,,,,,0.06864535063505173,,,,,, +23,132449,,,,,,,,,,,,0.08743470907211304,,,,,, +23,132499,,,,,,,,,,,,0.06473346054553986,,,,,, +23,132549,,,,,,,,,,,,0.0725809782743454,,,,,, +23,132599,,,,,,,,,,,,0.08472125232219696,,,,,, +23,132649,,,,,,,,,,,,0.0797664001584053,,,,,, +23,132699,,,,,,,,,,,,0.08009273558855057,,,,,, +23,132749,,,,,,,,,,,,0.0739036276936531,,,,,, +23,132799,,,,,,,,,,,,0.07716012001037598,,,,,, +23,132849,,,,,,,,,,,,0.08029385656118393,,,,,, +23,132899,,,,,,,,,,,,0.07842569053173065,,,,,, +23,132949,,,,,,,,,,,,0.08537130057811737,,,,,, +23,132999,,,,,,,,,,,,0.084768146276474,,,,,, +23,133049,,,,,,,,,,,,0.09435160458087921,,,,,, +23,133099,,,,,,,,,,,,0.08389812707901001,,,,,, +23,133149,,,,,,,,,,,,0.07243122160434723,,,,,, +23,133199,,,,,,,,,,,,0.07003363966941833,,,,,, +23,133249,,,,,,,,,,,,0.06723608821630478,,,,,, +23,133299,,,,,,,,,,,,0.07021479308605194,,,,,, +23,133349,,,,,,,,,,,,0.0846816897392273,,,,,, +23,133399,,,,,,,,,,,,0.08763299882411957,,,,,, +23,133449,,,,,,,,,,,,0.09306338429450989,,,,,, +23,133499,,,,,,,,,,,,0.08596594631671906,,,,,, +23,133549,,,,,,,,,,,,0.06762000918388367,,,,,, +23,133599,,,,,,,,,,,,0.06998728215694427,,,,,, +23,133649,,,,,,,,,,,,0.07550256699323654,,,,,, +23,133699,,,,,,,,,,,,0.05755843222141266,,,,,, +23,133749,,,,,,,,,,,,0.06887912005186081,,,,,, +23,133799,,,,,,,,,,,,0.0871184840798378,,,,,, +23,133849,,,,,,,,,,,,0.06498590856790543,,,,,, +23,133899,,,,,,,,,,,,0.076203353703022,,,,,, +23,133949,,,,,,,,,,,,0.06738930940628052,,,,,, +23,133999,,,,,,,,,,,,0.07555453479290009,,,,,, +23,134049,,,,,,,,,,,,0.08485087752342224,,,,,, +23,134099,,,,,,,,,,,,0.08299792557954788,,,,,, +23,134149,,,,,,,,,,,,0.0692320242524147,,,,,, +23,134199,,,,,,,,,,,,0.0734335407614708,,,,,, +23,134249,,,,,,,,,,,,0.06716495007276535,,,,,, +23,134299,,,,,,,,,,,,0.07028964161872864,,,,,, +23,134349,,,,,,,,,,,,0.0753503143787384,,,,,, +23,134399,,,,,,,,,,,,0.08532024174928665,,,,,, +23,134449,,,,,,,,,,,,0.0761616975069046,,,,,, +23,134499,,,,,,,,,,,,0.07892584800720215,,,,,, +23,134549,,,,,,,,,,,,0.08024877309799194,,,,,, +23,134599,,,,,,,,,,,,0.0817897617816925,,,,,, +23,134649,,,,,,,,,,,,0.08450442552566528,,,,,, +23,134699,,,,,,,,,,,,0.07606721669435501,,,,,, +23,134749,,,,,,,,,,,,0.07796281576156616,,,,,, +23,134799,,,,,,,,,,,,0.07430948317050934,,,,,, +23,134849,,,,,,,,,,,,0.07119795680046082,,,,,, +23,134899,,,,,,,,,,,,0.0851813405752182,,,,,, +23,134949,,,,,,,,,,,,0.07888323068618774,,,,,, +23,134999,,,,,,,,,,,,0.08460542559623718,,,,,, +23,135049,,,,,,,,,,,,0.08308134973049164,,,,,, +23,135099,,,,,,,,,,,,0.07021018117666245,,,,,, +23,135149,,,,,,,,,,,,0.06519016623497009,,,,,, +23,135199,,,,,,,,,,,,0.06894293427467346,,,,,, +23,135249,,,,,,,,,,,,0.08642160147428513,,,,,, +23,135299,,,,,,,,,,,,0.07513323426246643,,,,,, +23,135349,,,,,,,,,,,,0.07303784787654877,,,,,, +23,135399,,,,,,,,,,,,0.07481074333190918,,,,,, +23,135449,,,,,,,,,,,,0.06819958239793777,,,,,, +23,135499,,,,,,,,,,,,0.06776046007871628,,,,,, +23,135549,,,,,,,,,,,,0.08966301381587982,,,,,, +23,135599,,,,,,,,,,,,0.07797656953334808,,,,,, +23,135649,,,,,,,,,,,,0.07533182948827744,,,,,, +23,135699,,,,,,,,,,,,0.08114490658044815,,,,,, +23,135749,,,,,,,,,,,,0.07612212002277374,,,,,, +23,135799,,,,,,,,,,,,0.087453693151474,,,,,, +23,135849,,,,,,,,,,,,0.07554077357053757,,,,,, +23,135899,,,,,,,,,,,,0.07894524186849594,,,,,, +23,135949,,,,,,,,,,,,0.08030864596366882,,,,,, +23,135999,,,,,,,,,,,,0.07470447570085526,,,,,, +23,136049,,,,,,,,,,,,0.06819567084312439,,,,,, +23,136099,,,,,,,,,,,,0.07162734866142273,,,,,, +23,136149,,,,,,,,,,,,0.06522221118211746,,,,,, +23,136199,,,,,,,,,,,,0.08360868692398071,,,,,, +23,136249,,,,,,,,,,,,0.069390669465065,,,,,, +23,136299,,,,,,,,,,,,0.06778745353221893,,,,,, +23,136349,,,,,,,,,,,,0.07628810405731201,,,,,, +23,136399,,,,,,,,,,,,0.08401757478713989,,,,,, +23,136449,,,,,,,,,,,,0.07211369276046753,,,,,, +23,136499,,,,,,,,,,,,0.07475060969591141,,,,,, +23,136549,,,,,,,,,,,,0.06483891606330872,,,,,, +23,136599,,,,,,,,,,,,0.07240056246519089,,,,,, +23,136649,,,,,,,,,,,,0.06815386563539505,,,,,, +23,136699,,,,,,,,,,,,0.0811396986246109,,,,,, +23,136749,,,,,,,,,,,,0.07116194814443588,,,,,, +23,136799,,,,,,,,,,,,0.08940797299146652,,,,,, +23,136849,,,,,,,,,,,,0.0837872251868248,,,,,, +23,136899,,,,,,,,,,,,0.08185887336730957,,,,,, +23,136949,,,,,,,,,,,,0.07308556139469147,,,,,, +23,136999,,,,,,,,,,,,0.07152210175991058,,,,,, +23,137049,,,,,,,,,,,,0.08678124845027924,,,,,, +23,137099,,,,,,,,,,,,0.06888341903686523,,,,,, +23,137149,,,,,,,,,,,,0.06884569674730301,,,,,, +23,137199,,,,,,,,,,,,0.06539758294820786,,,,,, +23,137249,,,,,,,,,,,,0.08474788069725037,,,,,, +23,137299,,,,,,,,,,,,0.07792893797159195,,,,,, +23,137349,,,,,,,,,,,,0.07506115734577179,,,,,, +23,137399,,,,,,,,,,,,0.08070581406354904,,,,,, +23,137449,,,,,,,,,,,,0.0713745653629303,,,,,, +23,137499,,,,,,,,,,,,0.07765748351812363,,,,,, +23,137549,,,,,,,,,,,,0.08310432732105255,,,,,, +23,137599,,,,,,,,,,,,0.06751514971256256,,,,,, +23,137649,,,,,,,,,,,,0.07937535643577576,,,,,, +23,137663,,,,,,,,,,,,,0.24154502153396606,0.08041441440582275,0.19688014686107635,0.024344265460968018,0.18144670128822327,0.08041441440582275 +23,137663,,,,,,,0.23768679797649384,0.0770852267742157,0.26194438338279724,0.06858557462692261,0.24051392078399658,,,,,,, +24,137699,,,,,,,,,,,,0.07188118994235992,,,,,, +24,137749,,,,,,,,,,,,0.07973982393741608,,,,,, +24,137799,,,,,,,,,,,,0.07205043733119965,,,,,, +24,137849,,,,,,,,,,,,0.08861683309078217,,,,,, +24,137899,,,,,,,,,,,,0.07934656739234924,,,,,, +24,137949,,,,,,,,,,,,0.07053517550230026,,,,,, +24,137999,,,,,,,,,,,,0.07431484013795853,,,,,, +24,138049,,,,,,,,,,,,0.07873377948999405,,,,,, +24,138099,,,,,,,,,,,,0.08194495737552643,,,,,, +24,138149,,,,,,,,,,,,0.08670392632484436,,,,,, +24,138199,,,,,,,,,,,,0.07739540934562683,,,,,, +24,138249,,,,,,,,,,,,0.08157273381948471,,,,,, +24,138299,,,,,,,,,,,,0.07922592759132385,,,,,, +24,138349,,,,,,,,,,,,0.0909096971154213,,,,,, +24,138399,,,,,,,,,,,,0.07672102749347687,,,,,, +24,138449,,,,,,,,,,,,0.06525903940200806,,,,,, +24,138499,,,,,,,,,,,,0.07820931822061539,,,,,, +24,138549,,,,,,,,,,,,0.08448543399572372,,,,,, +24,138599,,,,,,,,,,,,0.07629095017910004,,,,,, +24,138649,,,,,,,,,,,,0.076130710542202,,,,,, +24,138699,,,,,,,,,,,,0.07687395066022873,,,,,, +24,138749,,,,,,,,,,,,0.07410020381212234,,,,,, +24,138799,,,,,,,,,,,,0.08257265388965607,,,,,, +24,138849,,,,,,,,,,,,0.07401300966739655,,,,,, +24,138899,,,,,,,,,,,,0.07866296917200089,,,,,, +24,138949,,,,,,,,,,,,0.06863623857498169,,,,,, +24,138999,,,,,,,,,,,,0.07942453026771545,,,,,, +24,139049,,,,,,,,,,,,0.07512293756008148,,,,,, +24,139099,,,,,,,,,,,,0.08539015054702759,,,,,, +24,139149,,,,,,,,,,,,0.06660935282707214,,,,,, +24,139199,,,,,,,,,,,,0.0718335211277008,,,,,, +24,139249,,,,,,,,,,,,0.0864219143986702,,,,,, +24,139299,,,,,,,,,,,,0.07393576204776764,,,,,, +24,139349,,,,,,,,,,,,0.08315560221672058,,,,,, +24,139399,,,,,,,,,,,,0.0869545191526413,,,,,, +24,139449,,,,,,,,,,,,0.07819969207048416,,,,,, +24,139499,,,,,,,,,,,,0.07176117599010468,,,,,, +24,139549,,,,,,,,,,,,0.0794513151049614,,,,,, +24,139599,,,,,,,,,,,,0.07398401200771332,,,,,, +24,139649,,,,,,,,,,,,0.07561179995536804,,,,,, +24,139699,,,,,,,,,,,,0.08972199261188507,,,,,, +24,139749,,,,,,,,,,,,0.07112983614206314,,,,,, +24,139799,,,,,,,,,,,,0.06805188953876495,,,,,, +24,139849,,,,,,,,,,,,0.06873133778572083,,,,,, +24,139899,,,,,,,,,,,,0.07053647190332413,,,,,, +24,139949,,,,,,,,,,,,0.08835475891828537,,,,,, +24,139999,,,,,,,,,,,,0.07074175029993057,,,,,, +24,140049,,,,,,,,,,,,0.07738012075424194,,,,,, +24,140099,,,,,,,,,,,,0.07072402536869049,,,,,, +24,140149,,,,,,,,,,,,0.06903225183486938,,,,,, +24,140199,,,,,,,,,,,,0.06404411047697067,,,,,, +24,140249,,,,,,,,,,,,0.08160427212715149,,,,,, +24,140299,,,,,,,,,,,,0.07586880773305893,,,,,, +24,140349,,,,,,,,,,,,0.07570159435272217,,,,,, +24,140399,,,,,,,,,,,,0.07417676597833633,,,,,, +24,140449,,,,,,,,,,,,0.07028228044509888,,,,,, +24,140499,,,,,,,,,,,,0.077445387840271,,,,,, +24,140549,,,,,,,,,,,,0.08866002410650253,,,,,, +24,140599,,,,,,,,,,,,0.07720531523227692,,,,,, +24,140649,,,,,,,,,,,,0.08254747837781906,,,,,, +24,140699,,,,,,,,,,,,0.08704429864883423,,,,,, +24,140749,,,,,,,,,,,,0.08385944366455078,,,,,, +24,140799,,,,,,,,,,,,0.08246506005525589,,,,,, +24,140849,,,,,,,,,,,,0.07691465318202972,,,,,, +24,140899,,,,,,,,,,,,0.08410047739744186,,,,,, +24,140949,,,,,,,,,,,,0.0837811678647995,,,,,, +24,140999,,,,,,,,,,,,0.08322218060493469,,,,,, +24,141049,,,,,,,,,,,,0.07660575956106186,,,,,, +24,141099,,,,,,,,,,,,0.0803985744714737,,,,,, +24,141149,,,,,,,,,,,,0.07063864171504974,,,,,, +24,141199,,,,,,,,,,,,0.07752937078475952,,,,,, +24,141249,,,,,,,,,,,,0.07523012906312943,,,,,, +24,141299,,,,,,,,,,,,0.0889374315738678,,,,,, +24,141349,,,,,,,,,,,,0.06201238930225372,,,,,, +24,141399,,,,,,,,,,,,0.08261533081531525,,,,,, +24,141449,,,,,,,,,,,,0.09173613786697388,,,,,, +24,141499,,,,,,,,,,,,0.08514852821826935,,,,,, +24,141549,,,,,,,,,,,,0.08928065001964569,,,,,, +24,141599,,,,,,,,,,,,0.07264375686645508,,,,,, +24,141649,,,,,,,,,,,,0.07175005227327347,,,,,, +24,141699,,,,,,,,,,,,0.06575681269168854,,,,,, +24,141749,,,,,,,,,,,,0.08302212506532669,,,,,, +24,141799,,,,,,,,,,,,0.08166343718767166,,,,,, +24,141849,,,,,,,,,,,,0.06601335108280182,,,,,, +24,141899,,,,,,,,,,,,0.08315561711788177,,,,,, +24,141949,,,,,,,,,,,,0.07470004260540009,,,,,, +24,141999,,,,,,,,,,,,0.0828234851360321,,,,,, +24,142049,,,,,,,,,,,,0.08101611584424973,,,,,, +24,142099,,,,,,,,,,,,0.07872213423252106,,,,,, +24,142149,,,,,,,,,,,,0.09126096218824387,,,,,, +24,142199,,,,,,,,,,,,0.08067820966243744,,,,,, +24,142249,,,,,,,,,,,,0.07918228954076767,,,,,, +24,142299,,,,,,,,,,,,0.07806845754384995,,,,,, +24,142349,,,,,,,,,,,,0.08541137725114822,,,,,, +24,142399,,,,,,,,,,,,0.07144902646541595,,,,,, +24,142449,,,,,,,,,,,,0.06851769983768463,,,,,, +24,142499,,,,,,,,,,,,0.08449916541576385,,,,,, +24,142549,,,,,,,,,,,,0.06480509787797928,,,,,, +24,142599,,,,,,,,,,,,0.08134394139051437,,,,,, +24,142649,,,,,,,,,,,,0.07125122100114822,,,,,, +24,142699,,,,,,,,,,,,0.07845297455787659,,,,,, +24,142749,,,,,,,,,,,,0.08652940392494202,,,,,, +24,142799,,,,,,,,,,,,0.08661186695098877,,,,,, +24,142849,,,,,,,,,,,,0.07019232213497162,,,,,, +24,142899,,,,,,,,,,,,0.06716835498809814,,,,,, +24,142949,,,,,,,,,,,,0.07279139012098312,,,,,, +24,142999,,,,,,,,,,,,0.07102397829294205,,,,,, +24,143049,,,,,,,,,,,,0.07564006745815277,,,,,, +24,143099,,,,,,,,,,,,0.08354371786117554,,,,,, +24,143149,,,,,,,,,,,,0.07910327613353729,,,,,, +24,143199,,,,,,,,,,,,0.08263715356588364,,,,,, +24,143249,,,,,,,,,,,,0.0814891904592514,,,,,, +24,143299,,,,,,,,,,,,0.07827895879745483,,,,,, +24,143349,,,,,,,,,,,,0.07257119566202164,,,,,, +24,143399,,,,,,,,,,,,0.11260292679071426,,,,,, +24,143399,,,,,,,,,,,,,0.2420441061258316,0.08095211535692215,0.18928612768650055,0.017820358276367188,0.16766594350337982,0.08095211535692215 +24,143399,,,,,,,0.23736001551151276,0.07695533335208893,0.26495757699012756,0.07016891241073608,0.246342733502388,,,,,,, +25,143449,,,,,,,,,,,,0.07510145008563995,,,,,, +25,143499,,,,,,,,,,,,0.06771232187747955,,,,,, +25,143549,,,,,,,,,,,,0.07027223706245422,,,,,, +25,143599,,,,,,,,,,,,0.07825441658496857,,,,,, +25,143649,,,,,,,,,,,,0.08228519558906555,,,,,, +25,143699,,,,,,,,,,,,0.06791336834430695,,,,,, +25,143749,,,,,,,,,,,,0.08626921474933624,,,,,, +25,143799,,,,,,,,,,,,0.06800644844770432,,,,,, +25,143849,,,,,,,,,,,,0.08085426688194275,,,,,, +25,143899,,,,,,,,,,,,0.07421151548624039,,,,,, +25,143949,,,,,,,,,,,,0.06121370941400528,,,,,, +25,143999,,,,,,,,,,,,0.06633323431015015,,,,,, +25,144049,,,,,,,,,,,,0.07668284326791763,,,,,, +25,144099,,,,,,,,,,,,0.08059406280517578,,,,,, +25,144149,,,,,,,,,,,,0.07863213121891022,,,,,, +25,144199,,,,,,,,,,,,0.08615847676992416,,,,,, +25,144249,,,,,,,,,,,,0.07880833745002747,,,,,, +25,144299,,,,,,,,,,,,0.08724662661552429,,,,,, +25,144349,,,,,,,,,,,,0.07356567680835724,,,,,, +25,144399,,,,,,,,,,,,0.07133565843105316,,,,,, +25,144449,,,,,,,,,,,,0.09034384787082672,,,,,, +25,144499,,,,,,,,,,,,0.08004268258810043,,,,,, +25,144549,,,,,,,,,,,,0.07441665232181549,,,,,, +25,144599,,,,,,,,,,,,0.08711899071931839,,,,,, +25,144649,,,,,,,,,,,,0.07914592325687408,,,,,, +25,144699,,,,,,,,,,,,0.08297590911388397,,,,,, +25,144749,,,,,,,,,,,,0.0785992294549942,,,,,, +25,144799,,,,,,,,,,,,0.0813685804605484,,,,,, +25,144849,,,,,,,,,,,,0.07747708261013031,,,,,, +25,144899,,,,,,,,,,,,0.08134416490793228,,,,,, +25,144949,,,,,,,,,,,,0.08544937521219254,,,,,, +25,144999,,,,,,,,,,,,0.07597728073596954,,,,,, +25,145049,,,,,,,,,,,,0.08016975224018097,,,,,, +25,145099,,,,,,,,,,,,0.07221799343824387,,,,,, +25,145149,,,,,,,,,,,,0.07474951446056366,,,,,, +25,145199,,,,,,,,,,,,0.07191957533359528,,,,,, +25,145249,,,,,,,,,,,,0.08397696912288666,,,,,, +25,145299,,,,,,,,,,,,0.07674933224916458,,,,,, +25,145349,,,,,,,,,,,,0.0772114247083664,,,,,, +25,145399,,,,,,,,,,,,0.07391135394573212,,,,,, +25,145449,,,,,,,,,,,,0.07909663021564484,,,,,, +25,145499,,,,,,,,,,,,0.06326255947351456,,,,,, +25,145549,,,,,,,,,,,,0.07050681114196777,,,,,, +25,145599,,,,,,,,,,,,0.07765461504459381,,,,,, +25,145649,,,,,,,,,,,,0.07007832080125809,,,,,, +25,145699,,,,,,,,,,,,0.06720450520515442,,,,,, +25,145749,,,,,,,,,,,,0.07666602730751038,,,,,, +25,145799,,,,,,,,,,,,0.06917420029640198,,,,,, +25,145849,,,,,,,,,,,,0.08743619173765182,,,,,, +25,145899,,,,,,,,,,,,0.08053699135780334,,,,,, +25,145949,,,,,,,,,,,,0.06610172986984253,,,,,, +25,145999,,,,,,,,,,,,0.07941363751888275,,,,,, +25,146049,,,,,,,,,,,,0.08399949967861176,,,,,, +25,146099,,,,,,,,,,,,0.0812874436378479,,,,,, +25,146149,,,,,,,,,,,,0.07169322669506073,,,,,, +25,146199,,,,,,,,,,,,0.08778630942106247,,,,,, +25,146249,,,,,,,,,,,,0.08762846887111664,,,,,, +25,146299,,,,,,,,,,,,0.07655877619981766,,,,,, +25,146349,,,,,,,,,,,,0.08272778987884521,,,,,, +25,146399,,,,,,,,,,,,0.07214337587356567,,,,,, +25,146449,,,,,,,,,,,,0.0698496401309967,,,,,, +25,146499,,,,,,,,,,,,0.08030649274587631,,,,,, +25,146549,,,,,,,,,,,,0.08177441358566284,,,,,, +25,146599,,,,,,,,,,,,0.07387512922286987,,,,,, +25,146649,,,,,,,,,,,,0.088858962059021,,,,,, +25,146699,,,,,,,,,,,,0.06625920534133911,,,,,, +25,146749,,,,,,,,,,,,0.06948168575763702,,,,,, +25,146799,,,,,,,,,,,,0.07943466305732727,,,,,, +25,146849,,,,,,,,,,,,0.08118876069784164,,,,,, +25,146899,,,,,,,,,,,,0.06711838394403458,,,,,, +25,146949,,,,,,,,,,,,0.06704310327768326,,,,,, +25,146999,,,,,,,,,,,,0.07526373863220215,,,,,, +25,147049,,,,,,,,,,,,0.08306770026683807,,,,,, +25,147099,,,,,,,,,,,,0.07264553755521774,,,,,, +25,147149,,,,,,,,,,,,0.07904622703790665,,,,,, +25,147199,,,,,,,,,,,,0.07594425231218338,,,,,, +25,147249,,,,,,,,,,,,0.0823553279042244,,,,,, +25,147299,,,,,,,,,,,,0.08757002651691437,,,,,, +25,147349,,,,,,,,,,,,0.09041304886341095,,,,,, +25,147399,,,,,,,,,,,,0.08119414746761322,,,,,, +25,147449,,,,,,,,,,,,0.07478077709674835,,,,,, +25,147499,,,,,,,,,,,,0.07631425559520721,,,,,, +25,147549,,,,,,,,,,,,0.07049638032913208,,,,,, +25,147599,,,,,,,,,,,,0.07161508500576019,,,,,, +25,147649,,,,,,,,,,,,0.07420133799314499,,,,,, +25,147699,,,,,,,,,,,,0.0686260536313057,,,,,, +25,147749,,,,,,,,,,,,0.08167988806962967,,,,,, +25,147799,,,,,,,,,,,,0.07146256417036057,,,,,, +25,147849,,,,,,,,,,,,0.07407042384147644,,,,,, +25,147899,,,,,,,,,,,,0.07576899975538254,,,,,, +25,147949,,,,,,,,,,,,0.0847315788269043,,,,,, +25,147999,,,,,,,,,,,,0.07714994251728058,,,,,, +25,148049,,,,,,,,,,,,0.07999001443386078,,,,,, +25,148099,,,,,,,,,,,,0.07653491199016571,,,,,, +25,148149,,,,,,,,,,,,0.08852139860391617,,,,,, +25,148199,,,,,,,,,,,,0.07977499067783356,,,,,, +25,148249,,,,,,,,,,,,0.08385375142097473,,,,,, +25,148299,,,,,,,,,,,,0.08542473614215851,,,,,, +25,148349,,,,,,,,,,,,0.0788613110780716,,,,,, +25,148399,,,,,,,,,,,,0.0790322870016098,,,,,, +25,148449,,,,,,,,,,,,0.07957909256219864,,,,,, +25,148499,,,,,,,,,,,,0.07900608330965042,,,,,, +25,148549,,,,,,,,,,,,0.08614630997180939,,,,,, +25,148599,,,,,,,,,,,,0.08640898764133453,,,,,, +25,148649,,,,,,,,,,,,0.06875701248645782,,,,,, +25,148699,,,,,,,,,,,,0.07943671941757202,,,,,, +25,148749,,,,,,,,,,,,0.0782238021492958,,,,,, +25,148799,,,,,,,,,,,,0.07297389209270477,,,,,, +25,148849,,,,,,,,,,,,0.08151829242706299,,,,,, +25,148899,,,,,,,,,,,,0.0858982503414154,,,,,, +25,148949,,,,,,,,,,,,0.0687953531742096,,,,,, +25,148999,,,,,,,,,,,,0.07370053231716156,,,,,, +25,149049,,,,,,,,,,,,0.0824083536863327,,,,,, +25,149099,,,,,,,,,,,,0.06733734905719757,,,,,, +25,149135,,,,,,,,,,,,,0.23962856829166412,0.08133193850517273,0.2126864641904831,0.013212084770202637,0.23692487180233002,0.08133193850517273 +25,149135,,,,,,,0.2378472536802292,0.07987472414970398,0.21473155915737152,0.03488647937774658,0.238909050822258,,,,,,, +26,149149,,,,,,,,,,,,0.07561562955379486,,,,,, +26,149199,,,,,,,,,,,,0.06926117092370987,,,,,, +26,149249,,,,,,,,,,,,0.08274189382791519,,,,,, +26,149299,,,,,,,,,,,,0.07349573820829391,,,,,, +26,149349,,,,,,,,,,,,0.07990783452987671,,,,,, +26,149399,,,,,,,,,,,,0.05665513873100281,,,,,, +26,149449,,,,,,,,,,,,0.07151801884174347,,,,,, +26,149499,,,,,,,,,,,,0.0702676773071289,,,,,, +26,149549,,,,,,,,,,,,0.07839946448802948,,,,,, +26,149599,,,,,,,,,,,,0.07594379037618637,,,,,, +26,149649,,,,,,,,,,,,0.07757958769798279,,,,,, +26,149699,,,,,,,,,,,,0.0728365108370781,,,,,, +26,149749,,,,,,,,,,,,0.07647925615310669,,,,,, +26,149799,,,,,,,,,,,,0.07057815790176392,,,,,, +26,149849,,,,,,,,,,,,0.08181910961866379,,,,,, +26,149899,,,,,,,,,,,,0.07348745316267014,,,,,, +26,149949,,,,,,,,,,,,0.0769926980137825,,,,,, +26,149999,,,,,,,,,,,,0.08029968291521072,,,,,, +26,150049,,,,,,,,,,,,0.07738105952739716,,,,,, +26,150099,,,,,,,,,,,,0.08228188753128052,,,,,, +26,150149,,,,,,,,,,,,0.08248578011989594,,,,,, +26,150199,,,,,,,,,,,,0.08481647819280624,,,,,, +26,150249,,,,,,,,,,,,0.08380836248397827,,,,,, +26,150299,,,,,,,,,,,,0.06575319170951843,,,,,, +26,150349,,,,,,,,,,,,0.07725837826728821,,,,,, +26,150399,,,,,,,,,,,,0.07209315896034241,,,,,, +26,150449,,,,,,,,,,,,0.07926683127880096,,,,,, +26,150499,,,,,,,,,,,,0.07869792729616165,,,,,, +26,150549,,,,,,,,,,,,0.06831211596727371,,,,,, +26,150599,,,,,,,,,,,,0.06639042496681213,,,,,, +26,150649,,,,,,,,,,,,0.0688498467206955,,,,,, +26,150699,,,,,,,,,,,,0.08590196073055267,,,,,, +26,150749,,,,,,,,,,,,0.07488995045423508,,,,,, +26,150799,,,,,,,,,,,,0.0824674442410469,,,,,, +26,150849,,,,,,,,,,,,0.07336649298667908,,,,,, +26,150899,,,,,,,,,,,,0.07306993752717972,,,,,, +26,150949,,,,,,,,,,,,0.07784152030944824,,,,,, +26,150999,,,,,,,,,,,,0.07266364991664886,,,,,, +26,151049,,,,,,,,,,,,0.0660075694322586,,,,,, +26,151099,,,,,,,,,,,,0.09870686382055283,,,,,, +26,151149,,,,,,,,,,,,0.0707128569483757,,,,,, +26,151199,,,,,,,,,,,,0.07802142947912216,,,,,, +26,151249,,,,,,,,,,,,0.08417481184005737,,,,,, +26,151299,,,,,,,,,,,,0.07561558485031128,,,,,, +26,151349,,,,,,,,,,,,0.0825209766626358,,,,,, +26,151399,,,,,,,,,,,,0.06874996423721313,,,,,, +26,151449,,,,,,,,,,,,0.058629896491765976,,,,,, +26,151499,,,,,,,,,,,,0.0848870724439621,,,,,, +26,151549,,,,,,,,,,,,0.07811476290225983,,,,,, +26,151599,,,,,,,,,,,,0.07694108784198761,,,,,, +26,151649,,,,,,,,,,,,0.08080250024795532,,,,,, +26,151699,,,,,,,,,,,,0.08176661282777786,,,,,, +26,151749,,,,,,,,,,,,0.07702452689409256,,,,,, +26,151799,,,,,,,,,,,,0.07259349524974823,,,,,, +26,151849,,,,,,,,,,,,0.07573398947715759,,,,,, +26,151899,,,,,,,,,,,,0.08201472461223602,,,,,, +26,151949,,,,,,,,,,,,0.07227244228124619,,,,,, +26,151999,,,,,,,,,,,,0.061661384999752045,,,,,, +26,152049,,,,,,,,,,,,0.08064308017492294,,,,,, +26,152099,,,,,,,,,,,,0.07738776504993439,,,,,, +26,152149,,,,,,,,,,,,0.08085882663726807,,,,,, +26,152199,,,,,,,,,,,,0.08134505152702332,,,,,, +26,152249,,,,,,,,,,,,0.06668519973754883,,,,,, +26,152299,,,,,,,,,,,,0.07705043256282806,,,,,, +26,152349,,,,,,,,,,,,0.07488870620727539,,,,,, +26,152399,,,,,,,,,,,,0.07420589029788971,,,,,, +26,152449,,,,,,,,,,,,0.0691736564040184,,,,,, +26,152499,,,,,,,,,,,,0.07551311701536179,,,,,, +26,152549,,,,,,,,,,,,0.0901625007390976,,,,,, +26,152599,,,,,,,,,,,,0.08041249215602875,,,,,, +26,152649,,,,,,,,,,,,0.08068864047527313,,,,,, +26,152699,,,,,,,,,,,,0.08989796042442322,,,,,, +26,152749,,,,,,,,,,,,0.07601918280124664,,,,,, +26,152799,,,,,,,,,,,,0.07869517803192139,,,,,, +26,152849,,,,,,,,,,,,0.07104206085205078,,,,,, +26,152899,,,,,,,,,,,,0.08619530498981476,,,,,, +26,152949,,,,,,,,,,,,0.07585196197032928,,,,,, +26,152999,,,,,,,,,,,,0.0850885808467865,,,,,, +26,153049,,,,,,,,,,,,0.07682311534881592,,,,,, +26,153099,,,,,,,,,,,,0.0741003155708313,,,,,, +26,153149,,,,,,,,,,,,0.0812542587518692,,,,,, +26,153199,,,,,,,,,,,,0.06981716305017471,,,,,, +26,153249,,,,,,,,,,,,0.07873903214931488,,,,,, +26,153299,,,,,,,,,,,,0.06528697907924652,,,,,, +26,153349,,,,,,,,,,,,0.07415333390235901,,,,,, +26,153399,,,,,,,,,,,,0.07770133763551712,,,,,, +26,153449,,,,,,,,,,,,0.07473428547382355,,,,,, +26,153499,,,,,,,,,,,,0.0639258548617363,,,,,, +26,153549,,,,,,,,,,,,0.07423203438520432,,,,,, +26,153599,,,,,,,,,,,,0.07377108186483383,,,,,, +26,153649,,,,,,,,,,,,0.06454598903656006,,,,,, +26,153699,,,,,,,,,,,,0.08153742551803589,,,,,, +26,153749,,,,,,,,,,,,0.08157344907522202,,,,,, +26,153799,,,,,,,,,,,,0.0689191073179245,,,,,, +26,153849,,,,,,,,,,,,0.07402965426445007,,,,,, +26,153899,,,,,,,,,,,,0.08060818165540695,,,,,, +26,153949,,,,,,,,,,,,0.07310067117214203,,,,,, +26,153999,,,,,,,,,,,,0.07559821009635925,,,,,, +26,154049,,,,,,,,,,,,0.07347624748945236,,,,,, +26,154099,,,,,,,,,,,,0.06921111792325974,,,,,, +26,154149,,,,,,,,,,,,0.07609967887401581,,,,,, +26,154199,,,,,,,,,,,,0.07267270237207413,,,,,, +26,154249,,,,,,,,,,,,0.08078310638666153,,,,,, +26,154299,,,,,,,,,,,,0.07169900834560394,,,,,, +26,154349,,,,,,,,,,,,0.06868962943553925,,,,,, +26,154399,,,,,,,,,,,,0.07271762192249298,,,,,, +26,154449,,,,,,,,,,,,0.07402216643095016,,,,,, +26,154499,,,,,,,,,,,,0.08195476233959198,,,,,, +26,154549,,,,,,,,,,,,0.08240006864070892,,,,,, +26,154599,,,,,,,,,,,,0.07001931965351105,,,,,, +26,154649,,,,,,,,,,,,0.07302803546190262,,,,,, +26,154699,,,,,,,,,,,,0.07900214195251465,,,,,, +26,154749,,,,,,,,,,,,0.08443272113800049,,,,,, +26,154799,,,,,,,,,,,,0.07691283524036407,,,,,, +26,154849,,,,,,,,,,,,0.06133227050304413,,,,,, +26,154871,,,,,,,,,,,,,0.24940869212150574,0.1146397814154625,0.044596120715141296,-0.3909069299697876,0.13944709300994873,0.1146397814154625 +26,154871,,,,,,,0.23653510212898254,0.07653041183948517,0.27444586157798767,0.07528698444366455,0.25416189432144165,,,,,,, +27,154899,,,,,,,,,,,,0.0701587051153183,,,,,, +27,154949,,,,,,,,,,,,0.07160168886184692,,,,,, +27,154999,,,,,,,,,,,,0.07117308676242828,,,,,, +27,155049,,,,,,,,,,,,0.06575039029121399,,,,,, +27,155099,,,,,,,,,,,,0.070821613073349,,,,,, +27,155149,,,,,,,,,,,,0.07097943127155304,,,,,, +27,155199,,,,,,,,,,,,0.07091645896434784,,,,,, +27,155249,,,,,,,,,,,,0.0760679692029953,,,,,, +27,155299,,,,,,,,,,,,0.07924888283014297,,,,,, +27,155349,,,,,,,,,,,,0.09201906621456146,,,,,, +27,155399,,,,,,,,,,,,0.07544994354248047,,,,,, +27,155449,,,,,,,,,,,,0.07323715090751648,,,,,, +27,155499,,,,,,,,,,,,0.08149458467960358,,,,,, +27,155549,,,,,,,,,,,,0.07643939554691315,,,,,, +27,155599,,,,,,,,,,,,0.08828520029783249,,,,,, +27,155649,,,,,,,,,,,,0.08288522064685822,,,,,, +27,155699,,,,,,,,,,,,0.09069181978702545,,,,,, +27,155749,,,,,,,,,,,,0.0802375078201294,,,,,, +27,155799,,,,,,,,,,,,0.07651941478252411,,,,,, +27,155849,,,,,,,,,,,,0.07673169672489166,,,,,, +27,155899,,,,,,,,,,,,0.07333513349294662,,,,,, +27,155949,,,,,,,,,,,,0.06667729467153549,,,,,, +27,155999,,,,,,,,,,,,0.08144693821668625,,,,,, +27,156049,,,,,,,,,,,,0.09022925794124603,,,,,, +27,156099,,,,,,,,,,,,0.07628712058067322,,,,,, +27,156149,,,,,,,,,,,,0.06701891124248505,,,,,, +27,156199,,,,,,,,,,,,0.09206996113061905,,,,,, +27,156249,,,,,,,,,,,,0.07938894629478455,,,,,, +27,156299,,,,,,,,,,,,0.08245854079723358,,,,,, +27,156349,,,,,,,,,,,,0.07583138346672058,,,,,, +27,156399,,,,,,,,,,,,0.07284626364707947,,,,,, +27,156449,,,,,,,,,,,,0.08317818492650986,,,,,, +27,156499,,,,,,,,,,,,0.07873458415269852,,,,,, +27,156549,,,,,,,,,,,,0.06979098170995712,,,,,, +27,156599,,,,,,,,,,,,0.0852416530251503,,,,,, +27,156649,,,,,,,,,,,,0.0744427815079689,,,,,, +27,156699,,,,,,,,,,,,0.08507248759269714,,,,,, +27,156749,,,,,,,,,,,,0.08343572914600372,,,,,, +27,156799,,,,,,,,,,,,0.07615051418542862,,,,,, +27,156849,,,,,,,,,,,,0.07410647720098495,,,,,, +27,156899,,,,,,,,,,,,0.0698099285364151,,,,,, +27,156949,,,,,,,,,,,,0.0834767147898674,,,,,, +27,156999,,,,,,,,,,,,0.06806428730487823,,,,,, +27,157049,,,,,,,,,,,,0.06000540032982826,,,,,, +27,157099,,,,,,,,,,,,0.0820702612400055,,,,,, +27,157149,,,,,,,,,,,,0.07593898475170135,,,,,, +27,157199,,,,,,,,,,,,0.06447309255599976,,,,,, +27,157249,,,,,,,,,,,,0.08051883429288864,,,,,, +27,157299,,,,,,,,,,,,0.08461155742406845,,,,,, +27,157349,,,,,,,,,,,,0.07715491950511932,,,,,, +27,157399,,,,,,,,,,,,0.07834821194410324,,,,,, +27,157449,,,,,,,,,,,,0.08038360625505447,,,,,, +27,157499,,,,,,,,,,,,0.08408988267183304,,,,,, +27,157549,,,,,,,,,,,,0.07487912476062775,,,,,, +27,157599,,,,,,,,,,,,0.0660015270113945,,,,,, +27,157649,,,,,,,,,,,,0.06909158080816269,,,,,, +27,157699,,,,,,,,,,,,0.07124154269695282,,,,,, +27,157749,,,,,,,,,,,,0.07619301974773407,,,,,, +27,157799,,,,,,,,,,,,0.08186358958482742,,,,,, +27,157849,,,,,,,,,,,,0.06485813856124878,,,,,, +27,157899,,,,,,,,,,,,0.06567732989788055,,,,,, +27,157949,,,,,,,,,,,,0.07483898103237152,,,,,, +27,157999,,,,,,,,,,,,0.07401921600103378,,,,,, +27,158049,,,,,,,,,,,,0.0701763778924942,,,,,, +27,158099,,,,,,,,,,,,0.08531995117664337,,,,,, +27,158149,,,,,,,,,,,,0.0795537680387497,,,,,, +27,158199,,,,,,,,,,,,0.08279254287481308,,,,,, +27,158249,,,,,,,,,,,,0.06574384868144989,,,,,, +27,158299,,,,,,,,,,,,0.06751294434070587,,,,,, +27,158349,,,,,,,,,,,,0.07859814167022705,,,,,, +27,158399,,,,,,,,,,,,0.08005762845277786,,,,,, +27,158449,,,,,,,,,,,,0.06967008113861084,,,,,, +27,158499,,,,,,,,,,,,0.07286219298839569,,,,,, +27,158549,,,,,,,,,,,,0.07817412912845612,,,,,, +27,158599,,,,,,,,,,,,0.06803227216005325,,,,,, +27,158649,,,,,,,,,,,,0.05729575455188751,,,,,, +27,158699,,,,,,,,,,,,0.08329212665557861,,,,,, +27,158749,,,,,,,,,,,,0.07593391835689545,,,,,, +27,158799,,,,,,,,,,,,0.07144245505332947,,,,,, +27,158849,,,,,,,,,,,,0.0709669440984726,,,,,, +27,158899,,,,,,,,,,,,0.07724788039922714,,,,,, +27,158949,,,,,,,,,,,,0.06603754311800003,,,,,, +27,158999,,,,,,,,,,,,0.06986131519079208,,,,,, +27,159049,,,,,,,,,,,,0.06529349088668823,,,,,, +27,159099,,,,,,,,,,,,0.08263535797595978,,,,,, +27,159149,,,,,,,,,,,,0.0705396756529808,,,,,, +27,159199,,,,,,,,,,,,0.06818760186433792,,,,,, +27,159249,,,,,,,,,,,,0.08595938235521317,,,,,, +27,159299,,,,,,,,,,,,0.07371381670236588,,,,,, +27,159349,,,,,,,,,,,,0.056406788527965546,,,,,, +27,159399,,,,,,,,,,,,0.08321616053581238,,,,,, +27,159449,,,,,,,,,,,,0.08312912285327911,,,,,, +27,159499,,,,,,,,,,,,0.08349165320396423,,,,,, +27,159549,,,,,,,,,,,,0.08680957555770874,,,,,, +27,159599,,,,,,,,,,,,0.08917634189128876,,,,,, +27,159649,,,,,,,,,,,,0.06983199715614319,,,,,, +27,159699,,,,,,,,,,,,0.07665659487247467,,,,,, +27,159749,,,,,,,,,,,,0.07469888776540756,,,,,, +27,159799,,,,,,,,,,,,0.0793437734246254,,,,,, +27,159849,,,,,,,,,,,,0.06324054300785065,,,,,, +27,159899,,,,,,,,,,,,0.07909173518419266,,,,,, +27,159949,,,,,,,,,,,,0.07338462769985199,,,,,, +27,159999,,,,,,,,,,,,0.08128421008586884,,,,,, +27,160049,,,,,,,,,,,,0.07282991707324982,,,,,, +27,160099,,,,,,,,,,,,0.0721866711974144,,,,,, +27,160149,,,,,,,,,,,,0.08834054321050644,,,,,, +27,160199,,,,,,,,,,,,0.07636064291000366,,,,,, +27,160249,,,,,,,,,,,,0.07165160775184631,,,,,, +27,160299,,,,,,,,,,,,0.06752835214138031,,,,,, +27,160349,,,,,,,,,,,,0.07247121632099152,,,,,, +27,160399,,,,,,,,,,,,0.07119917869567871,,,,,, +27,160449,,,,,,,,,,,,0.09105908870697021,,,,,, +27,160499,,,,,,,,,,,,0.07298377901315689,,,,,, +27,160549,,,,,,,,,,,,0.07168259471654892,,,,,, +27,160599,,,,,,,,,,,,0.07601314783096313,,,,,, +27,160607,,,,,,,,,,,,,0.24013814330101013,0.07991703599691391,0.2243194580078125,0.030378878116607666,0.22791053354740143,0.07991703599691391 +27,160607,,,,,,,0.23594501614570618,0.07620176672935486,0.28157761693000793,0.0792648196220398,0.2616955041885376,,,,,,, +28,160649,,,,,,,,,,,,0.07823093235492706,,,,,, +28,160699,,,,,,,,,,,,0.0740773156285286,,,,,, +28,160749,,,,,,,,,,,,0.07376684248447418,,,,,, +28,160799,,,,,,,,,,,,0.07001928240060806,,,,,, +28,160849,,,,,,,,,,,,0.06822580099105835,,,,,, +28,160899,,,,,,,,,,,,0.07556019723415375,,,,,, +28,160949,,,,,,,,,,,,0.07794976234436035,,,,,, +28,160999,,,,,,,,,,,,0.07917167991399765,,,,,, +28,161049,,,,,,,,,,,,0.07690949738025665,,,,,, +28,161099,,,,,,,,,,,,0.06681230664253235,,,,,, +28,161149,,,,,,,,,,,,0.07342031598091125,,,,,, +28,161199,,,,,,,,,,,,0.07868344336748123,,,,,, +28,161249,,,,,,,,,,,,0.08241762220859528,,,,,, +28,161299,,,,,,,,,,,,0.08609120547771454,,,,,, +28,161349,,,,,,,,,,,,0.07964146882295609,,,,,, +28,161399,,,,,,,,,,,,0.08188945055007935,,,,,, +28,161449,,,,,,,,,,,,0.07061749696731567,,,,,, +28,161499,,,,,,,,,,,,0.08374127745628357,,,,,, +28,161549,,,,,,,,,,,,0.0800366997718811,,,,,, +28,161599,,,,,,,,,,,,0.07179661095142365,,,,,, +28,161649,,,,,,,,,,,,0.06482626497745514,,,,,, +28,161699,,,,,,,,,,,,0.06945774704217911,,,,,, +28,161749,,,,,,,,,,,,0.0888875424861908,,,,,, +28,161799,,,,,,,,,,,,0.08849592506885529,,,,,, +28,161849,,,,,,,,,,,,0.07136907428503036,,,,,, +28,161899,,,,,,,,,,,,0.08628952503204346,,,,,, +28,161949,,,,,,,,,,,,0.07727982848882675,,,,,, +28,161999,,,,,,,,,,,,0.06889747083187103,,,,,, +28,162049,,,,,,,,,,,,0.06691230088472366,,,,,, +28,162099,,,,,,,,,,,,0.07119129598140717,,,,,, +28,162149,,,,,,,,,,,,0.08590337634086609,,,,,, +28,162199,,,,,,,,,,,,0.06350444257259369,,,,,, +28,162249,,,,,,,,,,,,0.08109705150127411,,,,,, +28,162299,,,,,,,,,,,,0.07652163505554199,,,,,, +28,162349,,,,,,,,,,,,0.0759541243314743,,,,,, +28,162399,,,,,,,,,,,,0.09174037724733353,,,,,, +28,162449,,,,,,,,,,,,0.09201797842979431,,,,,, +28,162499,,,,,,,,,,,,0.07109740376472473,,,,,, +28,162549,,,,,,,,,,,,0.08391864597797394,,,,,, +28,162599,,,,,,,,,,,,0.08336623013019562,,,,,, +28,162649,,,,,,,,,,,,0.05966239795088768,,,,,, +28,162699,,,,,,,,,,,,0.07723783701658249,,,,,, +28,162749,,,,,,,,,,,,0.07117380201816559,,,,,, +28,162799,,,,,,,,,,,,0.07763375341892242,,,,,, +28,162849,,,,,,,,,,,,0.08196116238832474,,,,,, +28,162899,,,,,,,,,,,,0.06970526278018951,,,,,, +28,162949,,,,,,,,,,,,0.07617824524641037,,,,,, +28,162999,,,,,,,,,,,,0.0768892765045166,,,,,, +28,163049,,,,,,,,,,,,0.0786476731300354,,,,,, +28,163099,,,,,,,,,,,,0.08022607862949371,,,,,, +28,163149,,,,,,,,,,,,0.08347935974597931,,,,,, +28,163199,,,,,,,,,,,,0.07840630412101746,,,,,, +28,163249,,,,,,,,,,,,0.06597807258367538,,,,,, +28,163299,,,,,,,,,,,,0.06263424456119537,,,,,, +28,163349,,,,,,,,,,,,0.06919831037521362,,,,,, +28,163399,,,,,,,,,,,,0.07787688076496124,,,,,, +28,163449,,,,,,,,,,,,0.07947440445423126,,,,,, +28,163499,,,,,,,,,,,,0.07922656834125519,,,,,, +28,163549,,,,,,,,,,,,0.06390494108200073,,,,,, +28,163599,,,,,,,,,,,,0.08145376294851303,,,,,, +28,163649,,,,,,,,,,,,0.06940937042236328,,,,,, +28,163699,,,,,,,,,,,,0.06756694614887238,,,,,, +28,163749,,,,,,,,,,,,0.08620557188987732,,,,,, +28,163799,,,,,,,,,,,,0.07905963063240051,,,,,, +28,163849,,,,,,,,,,,,0.06608033925294876,,,,,, +28,163899,,,,,,,,,,,,0.07973706722259521,,,,,, +28,163949,,,,,,,,,,,,0.061448097229003906,,,,,, +28,163999,,,,,,,,,,,,0.06912502646446228,,,,,, +28,164049,,,,,,,,,,,,0.07212530076503754,,,,,, +28,164099,,,,,,,,,,,,0.06955904513597488,,,,,, +28,164149,,,,,,,,,,,,0.06148876994848251,,,,,, +28,164199,,,,,,,,,,,,0.0768483579158783,,,,,, +28,164249,,,,,,,,,,,,0.08500313758850098,,,,,, +28,164299,,,,,,,,,,,,0.07775086164474487,,,,,, +28,164349,,,,,,,,,,,,0.07576099038124084,,,,,, +28,164399,,,,,,,,,,,,0.08009195327758789,,,,,, +28,164449,,,,,,,,,,,,0.08030615746974945,,,,,, +28,164499,,,,,,,,,,,,0.0694369524717331,,,,,, +28,164549,,,,,,,,,,,,0.08320935070514679,,,,,, +28,164599,,,,,,,,,,,,0.07657530903816223,,,,,, +28,164649,,,,,,,,,,,,0.08453094214200974,,,,,, +28,164699,,,,,,,,,,,,0.07312072813510895,,,,,, +28,164749,,,,,,,,,,,,0.06962623447179794,,,,,, +28,164799,,,,,,,,,,,,0.07390810549259186,,,,,, +28,164849,,,,,,,,,,,,0.06747396290302277,,,,,, +28,164899,,,,,,,,,,,,0.07568192481994629,,,,,, +28,164949,,,,,,,,,,,,0.06773205101490021,,,,,, +28,164999,,,,,,,,,,,,0.07984775304794312,,,,,, +28,165049,,,,,,,,,,,,0.0787060409784317,,,,,, +28,165099,,,,,,,,,,,,0.08315161615610123,,,,,, +28,165149,,,,,,,,,,,,0.0892549604177475,,,,,, +28,165199,,,,,,,,,,,,0.08299843966960907,,,,,, +28,165249,,,,,,,,,,,,0.058072902262210846,,,,,, +28,165299,,,,,,,,,,,,0.08616076409816742,,,,,, +28,165349,,,,,,,,,,,,0.06494985520839691,,,,,, +28,165399,,,,,,,,,,,,0.07531599700450897,,,,,, +28,165449,,,,,,,,,,,,0.07427158951759338,,,,,, +28,165499,,,,,,,,,,,,0.0710296779870987,,,,,, +28,165549,,,,,,,,,,,,0.0754043459892273,,,,,, +28,165599,,,,,,,,,,,,0.07772521674633026,,,,,, +28,165649,,,,,,,,,,,,0.08095568418502808,,,,,, +28,165699,,,,,,,,,,,,0.09682207554578781,,,,,, +28,165749,,,,,,,,,,,,0.08658284693956375,,,,,, +28,165799,,,,,,,,,,,,0.07505393028259277,,,,,, +28,165849,,,,,,,,,,,,0.06802531331777573,,,,,, +28,165899,,,,,,,,,,,,0.07272135466337204,,,,,, +28,165949,,,,,,,,,,,,0.07797373086214066,,,,,, +28,165999,,,,,,,,,,,,0.07813581079244614,,,,,, +28,166049,,,,,,,,,,,,0.06549962610006332,,,,,, +28,166099,,,,,,,,,,,,0.0781349390745163,,,,,, +28,166149,,,,,,,,,,,,0.07802529633045197,,,,,, +28,166199,,,,,,,,,,,,0.07724812626838684,,,,,, +28,166249,,,,,,,,,,,,0.07848991453647614,,,,,, +28,166299,,,,,,,,,,,,0.07904449850320816,,,,,, +28,166343,,,,,,,,,,,,,0.24588552117347717,0.10475138574838638,0.14438028633594513,-0.2709324359893799,0.21814295649528503,0.10475138574838638 +28,166343,,,,,,,0.2347850352525711,0.07560230791568756,0.29413875937461853,0.08650267124176025,0.2740321159362793,,,,,,, +29,166349,,,,,,,,,,,,0.0768088549375534,,,,,, +29,166399,,,,,,,,,,,,0.09430454671382904,,,,,, +29,166449,,,,,,,,,,,,0.07118207216262817,,,,,, +29,166499,,,,,,,,,,,,0.0746065080165863,,,,,, +29,166549,,,,,,,,,,,,0.06927522271871567,,,,,, +29,166599,,,,,,,,,,,,0.07500520348548889,,,,,, +29,166649,,,,,,,,,,,,0.0728541687130928,,,,,, +29,166699,,,,,,,,,,,,0.08530113846063614,,,,,, +29,166749,,,,,,,,,,,,0.07612495124340057,,,,,, +29,166799,,,,,,,,,,,,0.06379145383834839,,,,,, +29,166849,,,,,,,,,,,,0.07226981222629547,,,,,, +29,166899,,,,,,,,,,,,0.07827828824520111,,,,,, +29,166949,,,,,,,,,,,,0.07918254286050797,,,,,, +29,166999,,,,,,,,,,,,0.06981396675109863,,,,,, +29,167049,,,,,,,,,,,,0.08044414967298508,,,,,, +29,167099,,,,,,,,,,,,0.06751439720392227,,,,,, +29,167149,,,,,,,,,,,,0.069593645632267,,,,,, +29,167199,,,,,,,,,,,,0.07970842719078064,,,,,, +29,167249,,,,,,,,,,,,0.06851594150066376,,,,,, +29,167299,,,,,,,,,,,,0.07373864203691483,,,,,, +29,167349,,,,,,,,,,,,0.07756848633289337,,,,,, +29,167399,,,,,,,,,,,,0.07956766337156296,,,,,, +29,167449,,,,,,,,,,,,0.07372933626174927,,,,,, +29,167499,,,,,,,,,,,,0.08717723935842514,,,,,, +29,167549,,,,,,,,,,,,0.09123985469341278,,,,,, +29,167599,,,,,,,,,,,,0.08171288669109344,,,,,, +29,167649,,,,,,,,,,,,0.07876262068748474,,,,,, +29,167699,,,,,,,,,,,,0.06779124587774277,,,,,, +29,167749,,,,,,,,,,,,0.08077122271060944,,,,,, +29,167799,,,,,,,,,,,,0.07457786053419113,,,,,, +29,167849,,,,,,,,,,,,0.07921607047319412,,,,,, +29,167899,,,,,,,,,,,,0.08461496233940125,,,,,, +29,167949,,,,,,,,,,,,0.08096887171268463,,,,,, +29,167999,,,,,,,,,,,,0.0665019303560257,,,,,, +29,168049,,,,,,,,,,,,0.06657113134860992,,,,,, +29,168099,,,,,,,,,,,,0.07912388443946838,,,,,, +29,168149,,,,,,,,,,,,0.0709787905216217,,,,,, +29,168199,,,,,,,,,,,,0.08177635818719864,,,,,, +29,168249,,,,,,,,,,,,0.07570848613977432,,,,,, +29,168299,,,,,,,,,,,,0.07679623365402222,,,,,, +29,168349,,,,,,,,,,,,0.06499474495649338,,,,,, +29,168399,,,,,,,,,,,,0.06511592119932175,,,,,, +29,168449,,,,,,,,,,,,0.07373416423797607,,,,,, +29,168499,,,,,,,,,,,,0.0670711025595665,,,,,, +29,168549,,,,,,,,,,,,0.07054927200078964,,,,,, +29,168599,,,,,,,,,,,,0.07588464021682739,,,,,, +29,168649,,,,,,,,,,,,0.07262007892131805,,,,,, +29,168699,,,,,,,,,,,,0.08441945910453796,,,,,, +29,168749,,,,,,,,,,,,0.07474309951066971,,,,,, +29,168799,,,,,,,,,,,,0.09000853449106216,,,,,, +29,168849,,,,,,,,,,,,0.08447572588920593,,,,,, +29,168899,,,,,,,,,,,,0.07629022747278214,,,,,, +29,168949,,,,,,,,,,,,0.08702271431684494,,,,,, +29,168999,,,,,,,,,,,,0.07384683936834335,,,,,, +29,169049,,,,,,,,,,,,0.06718561053276062,,,,,, +29,169099,,,,,,,,,,,,0.07853423058986664,,,,,, +29,169149,,,,,,,,,,,,0.07032011449337006,,,,,, +29,169199,,,,,,,,,,,,0.08150037378072739,,,,,, +29,169249,,,,,,,,,,,,0.08488298952579498,,,,,, +29,169299,,,,,,,,,,,,0.06728537380695343,,,,,, +29,169349,,,,,,,,,,,,0.07728031277656555,,,,,, +29,169399,,,,,,,,,,,,0.0838424563407898,,,,,, +29,169449,,,,,,,,,,,,0.06497225165367126,,,,,, +29,169499,,,,,,,,,,,,0.07825587689876556,,,,,, +29,169549,,,,,,,,,,,,0.08051104843616486,,,,,, +29,169599,,,,,,,,,,,,0.06956486403942108,,,,,, +29,169649,,,,,,,,,,,,0.07222168147563934,,,,,, +29,169699,,,,,,,,,,,,0.08589217066764832,,,,,, +29,169749,,,,,,,,,,,,0.07281166315078735,,,,,, +29,169799,,,,,,,,,,,,0.07849033176898956,,,,,, +29,169849,,,,,,,,,,,,0.07151231169700623,,,,,, +29,169899,,,,,,,,,,,,0.06874434649944305,,,,,, +29,169949,,,,,,,,,,,,0.08016927540302277,,,,,, +29,169999,,,,,,,,,,,,0.06676730513572693,,,,,, +29,170049,,,,,,,,,,,,0.06920850276947021,,,,,, +29,170099,,,,,,,,,,,,0.07300137728452682,,,,,, +29,170149,,,,,,,,,,,,0.07006514072418213,,,,,, +29,170199,,,,,,,,,,,,0.07543212175369263,,,,,, +29,170249,,,,,,,,,,,,0.08020347356796265,,,,,, +29,170299,,,,,,,,,,,,0.07833652198314667,,,,,, +29,170349,,,,,,,,,,,,0.06770108640193939,,,,,, +29,170399,,,,,,,,,,,,0.08412548154592514,,,,,, +29,170449,,,,,,,,,,,,0.0755728930234909,,,,,, +29,170499,,,,,,,,,,,,0.07980775088071823,,,,,, +29,170549,,,,,,,,,,,,0.07878294587135315,,,,,, +29,170599,,,,,,,,,,,,0.0858004093170166,,,,,, +29,170649,,,,,,,,,,,,0.07665276527404785,,,,,, +29,170699,,,,,,,,,,,,0.07498620450496674,,,,,, +29,170749,,,,,,,,,,,,0.0756387785077095,,,,,, +29,170799,,,,,,,,,,,,0.07387194037437439,,,,,, +29,170849,,,,,,,,,,,,0.06464390456676483,,,,,, +29,170899,,,,,,,,,,,,0.06382770091295242,,,,,, +29,170949,,,,,,,,,,,,0.08255794644355774,,,,,, +29,170999,,,,,,,,,,,,0.06821919977664948,,,,,, +29,171049,,,,,,,,,,,,0.08100292086601257,,,,,, +29,171099,,,,,,,,,,,,0.0763351321220398,,,,,, +29,171149,,,,,,,,,,,,0.07816082239151001,,,,,, +29,171199,,,,,,,,,,,,0.07020102441310883,,,,,, +29,171249,,,,,,,,,,,,0.06522619724273682,,,,,, +29,171299,,,,,,,,,,,,0.07717761397361755,,,,,, +29,171349,,,,,,,,,,,,0.07827979326248169,,,,,, +29,171399,,,,,,,,,,,,0.0770321935415268,,,,,, +29,171449,,,,,,,,,,,,0.07459235191345215,,,,,, +29,171499,,,,,,,,,,,,0.06079680845141411,,,,,, +29,171549,,,,,,,,,,,,0.06421908736228943,,,,,, +29,171599,,,,,,,,,,,,0.08125404268503189,,,,,, +29,171649,,,,,,,,,,,,0.08277107775211334,,,,,, +29,171699,,,,,,,,,,,,0.07489193975925446,,,,,, +29,171749,,,,,,,,,,,,0.078366219997406,,,,,, +29,171799,,,,,,,,,,,,0.07586722820997238,,,,,, +29,171849,,,,,,,,,,,,0.08964981138706207,,,,,, +29,171899,,,,,,,,,,,,0.07254841923713684,,,,,, +29,171949,,,,,,,,,,,,0.08227205276489258,,,,,, +29,171999,,,,,,,,,,,,0.07955645024776459,,,,,, +29,172049,,,,,,,,,,,,0.07196497917175293,,,,,, +29,172079,,,,,,,,,,,,,0.24019427597522736,0.07972019165754318,0.21449965238571167,0.03276711702346802,0.21230962872505188,0.07972019165754318 +29,172079,,,,,,,0.23433981835842133,0.07536184787750244,0.29903262853622437,0.08939516544342041,0.2788599729537964,,,,,,, +30,172099,,,,,,,,,,,,0.08377056568861008,,,,,, +30,172149,,,,,,,,,,,,0.06803937256336212,,,,,, +30,172199,,,,,,,,,,,,0.07503402233123779,,,,,, +30,172249,,,,,,,,,,,,0.07447194308042526,,,,,, +30,172299,,,,,,,,,,,,0.07727059721946716,,,,,, +30,172349,,,,,,,,,,,,0.07675307989120483,,,,,, +30,172399,,,,,,,,,,,,0.0801597312092781,,,,,, +30,172449,,,,,,,,,,,,0.07231800258159637,,,,,, +30,172499,,,,,,,,,,,,0.07319460064172745,,,,,, +30,172549,,,,,,,,,,,,0.07270011305809021,,,,,, +30,172599,,,,,,,,,,,,0.0742233395576477,,,,,, +30,172649,,,,,,,,,,,,0.07665632665157318,,,,,, +30,172699,,,,,,,,,,,,0.0806102454662323,,,,,, +30,172749,,,,,,,,,,,,0.07560214400291443,,,,,, +30,172799,,,,,,,,,,,,0.07194682955741882,,,,,, +30,172849,,,,,,,,,,,,0.07982003688812256,,,,,, +30,172899,,,,,,,,,,,,0.06870806217193604,,,,,, +30,172949,,,,,,,,,,,,0.06974402070045471,,,,,, +30,172999,,,,,,,,,,,,0.08484332263469696,,,,,, +30,173049,,,,,,,,,,,,0.07867702841758728,,,,,, +30,173099,,,,,,,,,,,,0.07467209547758102,,,,,, +30,173149,,,,,,,,,,,,0.06815013289451599,,,,,, +30,173199,,,,,,,,,,,,0.060838133096694946,,,,,, +30,173249,,,,,,,,,,,,0.0818023681640625,,,,,, +30,173299,,,,,,,,,,,,0.08603997528553009,,,,,, +30,173349,,,,,,,,,,,,0.06231577321887016,,,,,, +30,173399,,,,,,,,,,,,0.08087247610092163,,,,,, +30,173449,,,,,,,,,,,,0.07560401409864426,,,,,, +30,173499,,,,,,,,,,,,0.07900742441415787,,,,,, +30,173549,,,,,,,,,,,,0.0827241986989975,,,,,, +30,173599,,,,,,,,,,,,0.07866784930229187,,,,,, +30,173649,,,,,,,,,,,,0.07830819487571716,,,,,, +30,173699,,,,,,,,,,,,0.07216762006282806,,,,,, +30,173749,,,,,,,,,,,,0.0787675529718399,,,,,, +30,173799,,,,,,,,,,,,0.07833762466907501,,,,,, +30,173849,,,,,,,,,,,,0.07800271362066269,,,,,, +30,173899,,,,,,,,,,,,0.07468485832214355,,,,,, +30,173949,,,,,,,,,,,,0.07024313509464264,,,,,, +30,173999,,,,,,,,,,,,0.06521196663379669,,,,,, +30,174049,,,,,,,,,,,,0.08955363929271698,,,,,, +30,174099,,,,,,,,,,,,0.06914140284061432,,,,,, +30,174149,,,,,,,,,,,,0.073940709233284,,,,,, +30,174199,,,,,,,,,,,,0.0661696344614029,,,,,, +30,174249,,,,,,,,,,,,0.08045803010463715,,,,,, +30,174299,,,,,,,,,,,,0.0763029083609581,,,,,, +30,174349,,,,,,,,,,,,0.07667388021945953,,,,,, +30,174399,,,,,,,,,,,,0.07371288537979126,,,,,, +30,174449,,,,,,,,,,,,0.07733170688152313,,,,,, +30,174499,,,,,,,,,,,,0.07560914754867554,,,,,, +30,174549,,,,,,,,,,,,0.06990151852369308,,,,,, +30,174599,,,,,,,,,,,,0.07348306477069855,,,,,, +30,174649,,,,,,,,,,,,0.08580410480499268,,,,,, +30,174699,,,,,,,,,,,,0.07250186800956726,,,,,, +30,174749,,,,,,,,,,,,0.07053401321172714,,,,,, +30,174799,,,,,,,,,,,,0.07617047429084778,,,,,, +30,174849,,,,,,,,,,,,0.06699688732624054,,,,,, +30,174899,,,,,,,,,,,,0.06249639391899109,,,,,, +30,174949,,,,,,,,,,,,0.0738525539636612,,,,,, +30,174999,,,,,,,,,,,,0.07057981938123703,,,,,, +30,175049,,,,,,,,,,,,0.08397646248340607,,,,,, +30,175099,,,,,,,,,,,,0.06932126730680466,,,,,, +30,175149,,,,,,,,,,,,0.07339727878570557,,,,,, +30,175199,,,,,,,,,,,,0.06939924508333206,,,,,, +30,175249,,,,,,,,,,,,0.07615408301353455,,,,,, +30,175299,,,,,,,,,,,,0.07911363244056702,,,,,, +30,175349,,,,,,,,,,,,0.07848295569419861,,,,,, +30,175399,,,,,,,,,,,,0.07200868427753448,,,,,, +30,175449,,,,,,,,,,,,0.0766792893409729,,,,,, +30,175499,,,,,,,,,,,,0.08794568479061127,,,,,, +30,175549,,,,,,,,,,,,0.06925012171268463,,,,,, +30,175599,,,,,,,,,,,,0.07070405781269073,,,,,, +30,175649,,,,,,,,,,,,0.07938586920499802,,,,,, +30,175699,,,,,,,,,,,,0.06988967210054398,,,,,, +30,175749,,,,,,,,,,,,0.0735291987657547,,,,,, +30,175799,,,,,,,,,,,,0.06764766573905945,,,,,, +30,175849,,,,,,,,,,,,0.06696204841136932,,,,,, +30,175899,,,,,,,,,,,,0.07727623730897903,,,,,, +30,175949,,,,,,,,,,,,0.07250317931175232,,,,,, +30,175999,,,,,,,,,,,,0.06641863286495209,,,,,, +30,176049,,,,,,,,,,,,0.08108926564455032,,,,,, +30,176099,,,,,,,,,,,,0.07578969746828079,,,,,, +30,176149,,,,,,,,,,,,0.06401046365499496,,,,,, +30,176199,,,,,,,,,,,,0.07358290255069733,,,,,, +30,176249,,,,,,,,,,,,0.07391273975372314,,,,,, +30,176299,,,,,,,,,,,,0.08285000920295715,,,,,, +30,176349,,,,,,,,,,,,0.07661069929599762,,,,,, +30,176399,,,,,,,,,,,,0.07698455452919006,,,,,, +30,176449,,,,,,,,,,,,0.07913056761026382,,,,,, +30,176499,,,,,,,,,,,,0.07547954469919205,,,,,, +30,176549,,,,,,,,,,,,0.08492764830589294,,,,,, +30,176599,,,,,,,,,,,,0.07744394242763519,,,,,, +30,176649,,,,,,,,,,,,0.07889407873153687,,,,,, +30,176699,,,,,,,,,,,,0.06722009181976318,,,,,, +30,176749,,,,,,,,,,,,0.08119149506092072,,,,,, +30,176799,,,,,,,,,,,,0.07317240536212921,,,,,, +30,176849,,,,,,,,,,,,0.0788055956363678,,,,,, +30,176899,,,,,,,,,,,,0.06769618391990662,,,,,, +30,176949,,,,,,,,,,,,0.07276643067598343,,,,,, +30,176999,,,,,,,,,,,,0.07895718514919281,,,,,, +30,177049,,,,,,,,,,,,0.06450384110212326,,,,,, +30,177099,,,,,,,,,,,,0.07311022281646729,,,,,, +30,177149,,,,,,,,,,,,0.06431910395622253,,,,,, +30,177199,,,,,,,,,,,,0.07904474437236786,,,,,, +30,177249,,,,,,,,,,,,0.07826440036296844,,,,,, +30,177299,,,,,,,,,,,,0.07306230813264847,,,,,, +30,177349,,,,,,,,,,,,0.07322044670581818,,,,,, +30,177399,,,,,,,,,,,,0.07537533342838287,,,,,, +30,177449,,,,,,,,,,,,0.068243108689785,,,,,, +30,177499,,,,,,,,,,,,0.07186101377010345,,,,,, +30,177549,,,,,,,,,,,,0.07914566248655319,,,,,, +30,177599,,,,,,,,,,,,0.06383673846721649,,,,,, +30,177649,,,,,,,,,,,,0.09115688502788544,,,,,, +30,177699,,,,,,,,,,,,0.07183966040611267,,,,,, +30,177749,,,,,,,,,,,,0.07808773219585419,,,,,, +30,177799,,,,,,,,,,,,0.06967102736234665,,,,,, +30,177815,,,,,,,,,,,,,0.2415648102760315,0.08802162855863571,0.18724068999290466,-0.06795287132263184,0.24140092730522156,0.08802162855863571 +30,177815,,,,,,,0.23394693434238434,0.07513932883739471,0.3034897446632385,0.09209680557250977,0.2836565673351288,,,,,,, +31,177849,,,,,,,,,,,,0.07001297175884247,,,,,, +31,177899,,,,,,,,,,,,0.0724048912525177,,,,,, +31,177949,,,,,,,,,,,,0.07711775600910187,,,,,, +31,177999,,,,,,,,,,,,0.07653285562992096,,,,,, +31,178049,,,,,,,,,,,,0.06787720322608948,,,,,, +31,178099,,,,,,,,,,,,0.07794079184532166,,,,,, +31,178149,,,,,,,,,,,,0.07671323418617249,,,,,, +31,178199,,,,,,,,,,,,0.07316549122333527,,,,,, +31,178249,,,,,,,,,,,,0.08224305510520935,,,,,, +31,178299,,,,,,,,,,,,0.0700010135769844,,,,,, +31,178349,,,,,,,,,,,,0.07904259860515594,,,,,, +31,178399,,,,,,,,,,,,0.07622267305850983,,,,,, +31,178449,,,,,,,,,,,,0.06931236386299133,,,,,, +31,178499,,,,,,,,,,,,0.08044252544641495,,,,,, +31,178549,,,,,,,,,,,,0.07361505925655365,,,,,, +31,178599,,,,,,,,,,,,0.07976898550987244,,,,,, +31,178649,,,,,,,,,,,,0.07326595485210419,,,,,, +31,178699,,,,,,,,,,,,0.0680050253868103,,,,,, +31,178749,,,,,,,,,,,,0.07781442254781723,,,,,, +31,178799,,,,,,,,,,,,0.0800069272518158,,,,,, +31,178849,,,,,,,,,,,,0.0811876654624939,,,,,, +31,178899,,,,,,,,,,,,0.07082555443048477,,,,,, +31,178949,,,,,,,,,,,,0.08540213108062744,,,,,, +31,178999,,,,,,,,,,,,0.07842302322387695,,,,,, +31,179049,,,,,,,,,,,,0.07553423941135406,,,,,, +31,179099,,,,,,,,,,,,0.07731212675571442,,,,,, +31,179149,,,,,,,,,,,,0.07588939368724823,,,,,, +31,179199,,,,,,,,,,,,0.07038450986146927,,,,,, +31,179249,,,,,,,,,,,,0.07602331787347794,,,,,, +31,179299,,,,,,,,,,,,0.0785294771194458,,,,,, +31,179349,,,,,,,,,,,,0.0645328164100647,,,,,, +31,179399,,,,,,,,,,,,0.07728353887796402,,,,,, +31,179449,,,,,,,,,,,,0.07108944654464722,,,,,, +31,179499,,,,,,,,,,,,0.06952472776174545,,,,,, +31,179549,,,,,,,,,,,,0.06986691057682037,,,,,, +31,179599,,,,,,,,,,,,0.07827301323413849,,,,,, +31,179649,,,,,,,,,,,,0.07169366627931595,,,,,, +31,179699,,,,,,,,,,,,0.08518656343221664,,,,,, +31,179749,,,,,,,,,,,,0.06582414358854294,,,,,, +31,179799,,,,,,,,,,,,0.07819483429193497,,,,,, +31,179849,,,,,,,,,,,,0.09917355328798294,,,,,, +31,179899,,,,,,,,,,,,0.07280265539884567,,,,,, +31,179949,,,,,,,,,,,,0.0800633355975151,,,,,, +31,179999,,,,,,,,,,,,0.08986245095729828,,,,,, +31,180049,,,,,,,,,,,,0.07990114390850067,,,,,, +31,180099,,,,,,,,,,,,0.0787905901670456,,,,,, +31,180149,,,,,,,,,,,,0.07572527974843979,,,,,, +31,180199,,,,,,,,,,,,0.07942340523004532,,,,,, +31,180249,,,,,,,,,,,,0.0726257860660553,,,,,, +31,180299,,,,,,,,,,,,0.07177607715129852,,,,,, +31,180349,,,,,,,,,,,,0.07201933860778809,,,,,, +31,180399,,,,,,,,,,,,0.08172041177749634,,,,,, +31,180449,,,,,,,,,,,,0.08351912349462509,,,,,, +31,180499,,,,,,,,,,,,0.07308521121740341,,,,,, +31,180549,,,,,,,,,,,,0.07607710361480713,,,,,, +31,180599,,,,,,,,,,,,0.08841011673212051,,,,,, +31,180649,,,,,,,,,,,,0.07010252773761749,,,,,, +31,180699,,,,,,,,,,,,0.06920851767063141,,,,,, +31,180749,,,,,,,,,,,,0.07007910311222076,,,,,, +31,180799,,,,,,,,,,,,0.06655772775411606,,,,,, +31,180849,,,,,,,,,,,,0.08128035068511963,,,,,, +31,180899,,,,,,,,,,,,0.06984243541955948,,,,,, +31,180949,,,,,,,,,,,,0.07853098958730698,,,,,, +31,180999,,,,,,,,,,,,0.07571946084499359,,,,,, +31,181049,,,,,,,,,,,,0.08449813723564148,,,,,, +31,181099,,,,,,,,,,,,0.07185621559619904,,,,,, +31,181149,,,,,,,,,,,,0.07114952057600021,,,,,, +31,181199,,,,,,,,,,,,0.08158856630325317,,,,,, +31,181249,,,,,,,,,,,,0.07196220755577087,,,,,, +31,181299,,,,,,,,,,,,0.07663384079933167,,,,,, +31,181349,,,,,,,,,,,,0.07008679956197739,,,,,, +31,181399,,,,,,,,,,,,0.07205652445554733,,,,,, +31,181449,,,,,,,,,,,,0.06991341710090637,,,,,, +31,181499,,,,,,,,,,,,0.08108539134263992,,,,,, +31,181549,,,,,,,,,,,,0.07934819161891937,,,,,, +31,181599,,,,,,,,,,,,0.07453956454992294,,,,,, +31,181649,,,,,,,,,,,,0.07511734962463379,,,,,, +31,181699,,,,,,,,,,,,0.06857489794492722,,,,,, +31,181749,,,,,,,,,,,,0.0723147988319397,,,,,, +31,181799,,,,,,,,,,,,0.0798259973526001,,,,,, +31,181849,,,,,,,,,,,,0.07095644623041153,,,,,, +31,181899,,,,,,,,,,,,0.07655799388885498,,,,,, +31,181949,,,,,,,,,,,,0.0719277560710907,,,,,, +31,181999,,,,,,,,,,,,0.06926295161247253,,,,,, +31,182049,,,,,,,,,,,,0.0871577337384224,,,,,, +31,182099,,,,,,,,,,,,0.07796494662761688,,,,,, +31,182149,,,,,,,,,,,,0.0758695900440216,,,,,, +31,182199,,,,,,,,,,,,0.06790467351675034,,,,,, +31,182249,,,,,,,,,,,,0.06996479630470276,,,,,, +31,182299,,,,,,,,,,,,0.08078674972057343,,,,,, +31,182349,,,,,,,,,,,,0.0655611902475357,,,,,, +31,182399,,,,,,,,,,,,0.0687454491853714,,,,,, +31,182449,,,,,,,,,,,,0.08395376801490784,,,,,, +31,182499,,,,,,,,,,,,0.07806800305843353,,,,,, +31,182549,,,,,,,,,,,,0.08531758189201355,,,,,, +31,182599,,,,,,,,,,,,0.07001641392707825,,,,,, +31,182649,,,,,,,,,,,,0.07837744057178497,,,,,, +31,182699,,,,,,,,,,,,0.07881505787372589,,,,,, +31,182749,,,,,,,,,,,,0.06802718341350555,,,,,, +31,182799,,,,,,,,,,,,0.07628516852855682,,,,,, +31,182849,,,,,,,,,,,,0.062011249363422394,,,,,, +31,182899,,,,,,,,,,,,0.06404225528240204,,,,,, +31,182949,,,,,,,,,,,,0.09119301289319992,,,,,, +31,182999,,,,,,,,,,,,0.06831999123096466,,,,,, +31,183049,,,,,,,,,,,,0.07271545380353928,,,,,, +31,183099,,,,,,,,,,,,0.07127483934164047,,,,,, +31,183149,,,,,,,,,,,,0.07959263771772385,,,,,, +31,183199,,,,,,,,,,,,0.06843505799770355,,,,,, +31,183249,,,,,,,,,,,,0.07882772386074066,,,,,, +31,183299,,,,,,,,,,,,0.06852983683347702,,,,,, +31,183349,,,,,,,,,,,,0.07198881357908249,,,,,, +31,183399,,,,,,,,,,,,0.07694011926651001,,,,,, +31,183449,,,,,,,,,,,,0.08538807183504105,,,,,, +31,183499,,,,,,,,,,,,0.07224839925765991,,,,,, +31,183549,,,,,,,,,,,,0.06645220518112183,,,,,, +31,183551,,,,,,,,,,,,,0.24304158985614777,0.08243086189031601,0.19518864154815674,-0.00012099742889404297,0.17879249155521393,0.08243086189031601 +31,183551,,,,,,,0.23378843069076538,0.07507709413766861,0.3047323524951935,0.0928494930267334,0.2842833399772644,,,,,,, +32,183599,,,,,,,,,,,,0.06496356427669525,,,,,, +32,183649,,,,,,,,,,,,0.08042962849140167,,,,,, +32,183699,,,,,,,,,,,,0.06954938173294067,,,,,, +32,183749,,,,,,,,,,,,0.0835019052028656,,,,,, +32,183799,,,,,,,,,,,,0.06765436381101608,,,,,, +32,183849,,,,,,,,,,,,0.08324810117483139,,,,,, +32,183899,,,,,,,,,,,,0.08055789768695831,,,,,, +32,183949,,,,,,,,,,,,0.08186714351177216,,,,,, +32,183999,,,,,,,,,,,,0.08201001584529877,,,,,, +32,184049,,,,,,,,,,,,0.07824324071407318,,,,,, +32,184099,,,,,,,,,,,,0.08228588104248047,,,,,, +32,184149,,,,,,,,,,,,0.07126714289188385,,,,,, +32,184199,,,,,,,,,,,,0.0797908827662468,,,,,, +32,184249,,,,,,,,,,,,0.07073301076889038,,,,,, +32,184299,,,,,,,,,,,,0.06922563910484314,,,,,, +32,184349,,,,,,,,,,,,0.060711570084095,,,,,, +32,184399,,,,,,,,,,,,0.06793883442878723,,,,,, +32,184449,,,,,,,,,,,,0.08458289504051208,,,,,, +32,184499,,,,,,,,,,,,0.06419143825769424,,,,,, +32,184549,,,,,,,,,,,,0.07250748574733734,,,,,, +32,184599,,,,,,,,,,,,0.07315239310264587,,,,,, +32,184649,,,,,,,,,,,,0.07191818952560425,,,,,, +32,184699,,,,,,,,,,,,0.06912636756896973,,,,,, +32,184749,,,,,,,,,,,,0.08022387325763702,,,,,, +32,184799,,,,,,,,,,,,0.07654348760843277,,,,,, +32,184849,,,,,,,,,,,,0.07226566970348358,,,,,, +32,184899,,,,,,,,,,,,0.07631061226129532,,,,,, +32,184949,,,,,,,,,,,,0.07503491640090942,,,,,, +32,184999,,,,,,,,,,,,0.07085003703832626,,,,,, +32,185049,,,,,,,,,,,,0.07651875168085098,,,,,, +32,185099,,,,,,,,,,,,0.07544799149036407,,,,,, +32,185149,,,,,,,,,,,,0.08160775899887085,,,,,, +32,185199,,,,,,,,,,,,0.07176706194877625,,,,,, +32,185249,,,,,,,,,,,,0.0788194090127945,,,,,, +32,185299,,,,,,,,,,,,0.07912127673625946,,,,,, +32,185349,,,,,,,,,,,,0.08721138536930084,,,,,, +32,185399,,,,,,,,,,,,0.05674166977405548,,,,,, +32,185449,,,,,,,,,,,,0.07989439368247986,,,,,, +32,185499,,,,,,,,,,,,0.06685096770524979,,,,,, +32,185549,,,,,,,,,,,,0.07116301357746124,,,,,, +32,185599,,,,,,,,,,,,0.08384611457586288,,,,,, +32,185649,,,,,,,,,,,,0.07015637308359146,,,,,, +32,185699,,,,,,,,,,,,0.08696217834949493,,,,,, +32,185749,,,,,,,,,,,,0.08280284702777863,,,,,, +32,185799,,,,,,,,,,,,0.0644199475646019,,,,,, +32,185849,,,,,,,,,,,,0.08022467792034149,,,,,, +32,185899,,,,,,,,,,,,0.06940987706184387,,,,,, +32,185949,,,,,,,,,,,,0.07452557981014252,,,,,, +32,185999,,,,,,,,,,,,0.0769445076584816,,,,,, +32,186049,,,,,,,,,,,,0.08379238843917847,,,,,, +32,186099,,,,,,,,,,,,0.07797327637672424,,,,,, +32,186149,,,,,,,,,,,,0.08296529203653336,,,,,, +32,186199,,,,,,,,,,,,0.07742336392402649,,,,,, +32,186249,,,,,,,,,,,,0.06965384632349014,,,,,, +32,186299,,,,,,,,,,,,0.07531281560659409,,,,,, +32,186349,,,,,,,,,,,,0.07579171657562256,,,,,, +32,186399,,,,,,,,,,,,0.07518009096384048,,,,,, +32,186449,,,,,,,,,,,,0.07669001817703247,,,,,, +32,186499,,,,,,,,,,,,0.07736239582300186,,,,,, +32,186549,,,,,,,,,,,,0.07959625124931335,,,,,, +32,186599,,,,,,,,,,,,0.06713248044252396,,,,,, +32,186649,,,,,,,,,,,,0.09035854041576385,,,,,, +32,186699,,,,,,,,,,,,0.08791971206665039,,,,,, +32,186749,,,,,,,,,,,,0.07756025344133377,,,,,, +32,186799,,,,,,,,,,,,0.07136186957359314,,,,,, +32,186849,,,,,,,,,,,,0.07291725277900696,,,,,, +32,186899,,,,,,,,,,,,0.07224976271390915,,,,,, +32,186949,,,,,,,,,,,,0.0686548501253128,,,,,, +32,186999,,,,,,,,,,,,0.07747644931077957,,,,,, +32,187049,,,,,,,,,,,,0.07140854001045227,,,,,, +32,187099,,,,,,,,,,,,0.07662621140480042,,,,,, +32,187149,,,,,,,,,,,,0.07437694817781448,,,,,, +32,187199,,,,,,,,,,,,0.06747667491436005,,,,,, +32,187249,,,,,,,,,,,,0.06868491321802139,,,,,, +32,187299,,,,,,,,,,,,0.08811163157224655,,,,,, +32,187349,,,,,,,,,,,,0.07425065338611603,,,,,, +32,187399,,,,,,,,,,,,0.08103925734758377,,,,,, +32,187449,,,,,,,,,,,,0.06396728754043579,,,,,, +32,187499,,,,,,,,,,,,0.07668784260749817,,,,,, +32,187549,,,,,,,,,,,,0.07340793311595917,,,,,, +32,187599,,,,,,,,,,,,0.06813529878854752,,,,,, +32,187649,,,,,,,,,,,,0.0778881311416626,,,,,, +32,187699,,,,,,,,,,,,0.07896248996257782,,,,,, +32,187749,,,,,,,,,,,,0.07175925374031067,,,,,, +32,187799,,,,,,,,,,,,0.08287063986063004,,,,,, +32,187849,,,,,,,,,,,,0.0793599933385849,,,,,, +32,187899,,,,,,,,,,,,0.08443090319633484,,,,,, +32,187949,,,,,,,,,,,,0.06607984751462936,,,,,, +32,187999,,,,,,,,,,,,0.06991589069366455,,,,,, +32,188049,,,,,,,,,,,,0.07781027257442474,,,,,, +32,188099,,,,,,,,,,,,0.07662840187549591,,,,,, +32,188149,,,,,,,,,,,,0.07163367420434952,,,,,, +32,188199,,,,,,,,,,,,0.07502006739377975,,,,,, +32,188249,,,,,,,,,,,,0.0742657333612442,,,,,, +32,188299,,,,,,,,,,,,0.07685000449419022,,,,,, +32,188349,,,,,,,,,,,,0.07736807316541672,,,,,, +32,188399,,,,,,,,,,,,0.07740195095539093,,,,,, +32,188449,,,,,,,,,,,,0.09205210208892822,,,,,, +32,188499,,,,,,,,,,,,0.06393464654684067,,,,,, +32,188549,,,,,,,,,,,,0.07890893518924713,,,,,, +32,188599,,,,,,,,,,,,0.08763769268989563,,,,,, +32,188649,,,,,,,,,,,,0.07781606167554855,,,,,, +32,188699,,,,,,,,,,,,0.07443079352378845,,,,,, +32,188749,,,,,,,,,,,,0.07518065720796585,,,,,, +32,188799,,,,,,,,,,,,0.07606334984302521,,,,,, +32,188849,,,,,,,,,,,,0.07322955131530762,,,,,, +32,188899,,,,,,,,,,,,0.08070467412471771,,,,,, +32,188949,,,,,,,,,,,,0.08393923938274384,,,,,, +32,188999,,,,,,,,,,,,0.07332364469766617,,,,,, +32,189049,,,,,,,,,,,,0.06488503515720367,,,,,, +32,189099,,,,,,,,,,,,0.08038529753684998,,,,,, +32,189149,,,,,,,,,,,,0.08212403208017349,,,,,, +32,189199,,,,,,,,,,,,0.06918634474277496,,,,,, +32,189249,,,,,,,,,,,,0.07297498732805252,,,,,, +32,189287,,,,,,,,,,,,,0.24409787356853485,0.08391835540533066,0.21563228964805603,-0.01816856861114502,0.20761483907699585,0.08391835540533066 +32,189287,,,,,,,0.23345595598220825,0.07491205632686615,0.3079814910888672,0.0948525071144104,0.28874462842941284,,,,,,, +33,189299,,,,,,,,,,,,0.07992617785930634,,,,,, +33,189349,,,,,,,,,,,,0.06672370433807373,,,,,, +33,189399,,,,,,,,,,,,0.06938722729682922,,,,,, +33,189449,,,,,,,,,,,,0.08236193656921387,,,,,, +33,189499,,,,,,,,,,,,0.06817581504583359,,,,,, +33,189549,,,,,,,,,,,,0.08077184855937958,,,,,, +33,189599,,,,,,,,,,,,0.06677422672510147,,,,,, +33,189649,,,,,,,,,,,,0.07448334991931915,,,,,, +33,189699,,,,,,,,,,,,0.08132117986679077,,,,,, +33,189749,,,,,,,,,,,,0.07243890315294266,,,,,, +33,189799,,,,,,,,,,,,0.08470652252435684,,,,,, +33,189849,,,,,,,,,,,,0.08703204989433289,,,,,, +33,189899,,,,,,,,,,,,0.0793057382106781,,,,,, +33,189949,,,,,,,,,,,,0.07827708125114441,,,,,, +33,189999,,,,,,,,,,,,0.07940713316202164,,,,,, +33,190049,,,,,,,,,,,,0.07458975911140442,,,,,, +33,190099,,,,,,,,,,,,0.07515592873096466,,,,,, +33,190149,,,,,,,,,,,,0.06611885130405426,,,,,, +33,190199,,,,,,,,,,,,0.06988377869129181,,,,,, +33,190249,,,,,,,,,,,,0.0713253989815712,,,,,, +33,190299,,,,,,,,,,,,0.07533425092697144,,,,,, +33,190349,,,,,,,,,,,,0.07362297177314758,,,,,, +33,190399,,,,,,,,,,,,0.06178788095712662,,,,,, +33,190449,,,,,,,,,,,,0.08159871399402618,,,,,, +33,190499,,,,,,,,,,,,0.07638061046600342,,,,,, +33,190549,,,,,,,,,,,,0.06732227653265,,,,,, +33,190599,,,,,,,,,,,,0.08014082163572311,,,,,, +33,190649,,,,,,,,,,,,0.07881862670183182,,,,,, +33,190699,,,,,,,,,,,,0.0800001323223114,,,,,, +33,190749,,,,,,,,,,,,0.0789797306060791,,,,,, +33,190799,,,,,,,,,,,,0.07082973420619965,,,,,, +33,190849,,,,,,,,,,,,0.06868687272071838,,,,,, +33,190899,,,,,,,,,,,,0.07676200568675995,,,,,, +33,190949,,,,,,,,,,,,0.08649192005395889,,,,,, +33,190999,,,,,,,,,,,,0.07309846580028534,,,,,, +33,191049,,,,,,,,,,,,0.08279110491275787,,,,,, +33,191099,,,,,,,,,,,,0.07479573786258698,,,,,, +33,191149,,,,,,,,,,,,0.08819742500782013,,,,,, +33,191199,,,,,,,,,,,,0.07344193756580353,,,,,, +33,191249,,,,,,,,,,,,0.07535544037818909,,,,,, +33,191299,,,,,,,,,,,,0.07682117819786072,,,,,, +33,191349,,,,,,,,,,,,0.0803150087594986,,,,,, +33,191399,,,,,,,,,,,,0.06672461330890656,,,,,, +33,191449,,,,,,,,,,,,0.073643758893013,,,,,, +33,191499,,,,,,,,,,,,0.07219801843166351,,,,,, +33,191549,,,,,,,,,,,,0.058413662016391754,,,,,, +33,191599,,,,,,,,,,,,0.06542889773845673,,,,,, +33,191649,,,,,,,,,,,,0.07501097023487091,,,,,, +33,191699,,,,,,,,,,,,0.07231779396533966,,,,,, +33,191749,,,,,,,,,,,,0.07195322215557098,,,,,, +33,191799,,,,,,,,,,,,0.06909550726413727,,,,,, +33,191849,,,,,,,,,,,,0.07477360963821411,,,,,, +33,191899,,,,,,,,,,,,0.07184118032455444,,,,,, +33,191949,,,,,,,,,,,,0.07129885256290436,,,,,, +33,191999,,,,,,,,,,,,0.07373803853988647,,,,,, +33,192049,,,,,,,,,,,,0.0973803699016571,,,,,, +33,192099,,,,,,,,,,,,0.083380788564682,,,,,, +33,192149,,,,,,,,,,,,0.08066965639591217,,,,,, +33,192199,,,,,,,,,,,,0.0823417454957962,,,,,, +33,192249,,,,,,,,,,,,0.0587167963385582,,,,,, +33,192299,,,,,,,,,,,,0.0688735693693161,,,,,, +33,192349,,,,,,,,,,,,0.08741983771324158,,,,,, +33,192399,,,,,,,,,,,,0.07885978370904922,,,,,, +33,192449,,,,,,,,,,,,0.05800747126340866,,,,,, +33,192499,,,,,,,,,,,,0.07118412107229233,,,,,, +33,192549,,,,,,,,,,,,0.07461892068386078,,,,,, +33,192599,,,,,,,,,,,,0.07134415954351425,,,,,, +33,192649,,,,,,,,,,,,0.08308255672454834,,,,,, +33,192699,,,,,,,,,,,,0.07275041937828064,,,,,, +33,192749,,,,,,,,,,,,0.06400097906589508,,,,,, +33,192799,,,,,,,,,,,,0.07824429124593735,,,,,, +33,192849,,,,,,,,,,,,0.07343646883964539,,,,,, +33,192899,,,,,,,,,,,,0.08355008065700531,,,,,, +33,192949,,,,,,,,,,,,0.08450394868850708,,,,,, +33,192999,,,,,,,,,,,,0.07265665382146835,,,,,, +33,193049,,,,,,,,,,,,0.08304046839475632,,,,,, +33,193099,,,,,,,,,,,,0.08574672043323517,,,,,, +33,193149,,,,,,,,,,,,0.08371829986572266,,,,,, +33,193199,,,,,,,,,,,,0.07697132229804993,,,,,, +33,193249,,,,,,,,,,,,0.0701916292309761,,,,,, +33,193299,,,,,,,,,,,,0.06701774895191193,,,,,, +33,193349,,,,,,,,,,,,0.08130273222923279,,,,,, +33,193399,,,,,,,,,,,,0.07123615592718124,,,,,, +33,193449,,,,,,,,,,,,0.0631241500377655,,,,,, +33,193499,,,,,,,,,,,,0.08727818727493286,,,,,, +33,193549,,,,,,,,,,,,0.0796370804309845,,,,,, +33,193599,,,,,,,,,,,,0.08095744252204895,,,,,, +33,193649,,,,,,,,,,,,0.0795159786939621,,,,,, +33,193699,,,,,,,,,,,,0.06192421913146973,,,,,, +33,193749,,,,,,,,,,,,0.06659360975027084,,,,,, +33,193799,,,,,,,,,,,,0.06554935872554779,,,,,, +33,193849,,,,,,,,,,,,0.07770204544067383,,,,,, +33,193899,,,,,,,,,,,,0.0722714215517044,,,,,, +33,193949,,,,,,,,,,,,0.07767169177532196,,,,,, +33,193999,,,,,,,,,,,,0.07595759630203247,,,,,, +33,194049,,,,,,,,,,,,0.07752624899148941,,,,,, +33,194099,,,,,,,,,,,,0.07514803856611252,,,,,, +33,194149,,,,,,,,,,,,0.07691369205713272,,,,,, +33,194199,,,,,,,,,,,,0.0710713118314743,,,,,, +33,194249,,,,,,,,,,,,0.0891532376408577,,,,,, +33,194299,,,,,,,,,,,,0.07277904450893402,,,,,, +33,194349,,,,,,,,,,,,0.06093000993132591,,,,,, +33,194399,,,,,,,,,,,,0.07286083698272705,,,,,, +33,194449,,,,,,,,,,,,0.06902286410331726,,,,,, +33,194499,,,,,,,,,,,,0.07986606657505035,,,,,, +33,194549,,,,,,,,,,,,0.06994004547595978,,,,,, +33,194599,,,,,,,,,,,,0.065378338098526,,,,,, +33,194649,,,,,,,,,,,,0.07848149538040161,,,,,, +33,194699,,,,,,,,,,,,0.06906050443649292,,,,,, +33,194749,,,,,,,,,,,,0.08679825812578201,,,,,, +33,194799,,,,,,,,,,,,0.07136860489845276,,,,,, +33,194849,,,,,,,,,,,,0.0878034234046936,,,,,, +33,194899,,,,,,,,,,,,0.07272258400917053,,,,,, +33,194949,,,,,,,,,,,,0.06914684176445007,,,,,, +33,194999,,,,,,,,,,,,0.07736886292695999,,,,,, +33,195023,,,,,,,,,,,,,0.23913083970546722,0.07999434322118759,0.24701662361621857,0.02944093942642212,0.24434813857078552,0.07999434322118759 +33,195023,,,,,,,0.2331225723028183,0.07472683489322662,0.3115973174571991,0.09708136320114136,0.29114359617233276,,,,,,, +34,195049,,,,,,,,,,,,0.0715908631682396,,,,,, +34,195099,,,,,,,,,,,,0.08158673346042633,,,,,, +34,195149,,,,,,,,,,,,0.06869816780090332,,,,,, +34,195199,,,,,,,,,,,,0.07969073951244354,,,,,, +34,195249,,,,,,,,,,,,0.07336285710334778,,,,,, +34,195299,,,,,,,,,,,,0.08131344616413116,,,,,, +34,195349,,,,,,,,,,,,0.0664873868227005,,,,,, +34,195399,,,,,,,,,,,,0.08022118359804153,,,,,, +34,195449,,,,,,,,,,,,0.06911957263946533,,,,,, +34,195499,,,,,,,,,,,,0.0742616206407547,,,,,, +34,195549,,,,,,,,,,,,0.08073931932449341,,,,,, +34,195599,,,,,,,,,,,,0.07778632640838623,,,,,, +34,195649,,,,,,,,,,,,0.0719783678650856,,,,,, +34,195699,,,,,,,,,,,,0.09053976833820343,,,,,, +34,195749,,,,,,,,,,,,0.08461607992649078,,,,,, +34,195799,,,,,,,,,,,,0.08518607914447784,,,,,, +34,195849,,,,,,,,,,,,0.061816852539777756,,,,,, +34,195899,,,,,,,,,,,,0.08152176439762115,,,,,, +34,195949,,,,,,,,,,,,0.08073749393224716,,,,,, +34,195999,,,,,,,,,,,,0.07173207402229309,,,,,, +34,196049,,,,,,,,,,,,0.07159413397312164,,,,,, +34,196099,,,,,,,,,,,,0.07850831747055054,,,,,, +34,196149,,,,,,,,,,,,0.08160591125488281,,,,,, +34,196199,,,,,,,,,,,,0.08305478096008301,,,,,, +34,196249,,,,,,,,,,,,0.07440514117479324,,,,,, +34,196299,,,,,,,,,,,,0.06772911548614502,,,,,, +34,196349,,,,,,,,,,,,0.07949133962392807,,,,,, +34,196399,,,,,,,,,,,,0.07340355217456818,,,,,, +34,196449,,,,,,,,,,,,0.08327271789312363,,,,,, +34,196499,,,,,,,,,,,,0.0748821273446083,,,,,, +34,196549,,,,,,,,,,,,0.0710049420595169,,,,,, +34,196599,,,,,,,,,,,,0.08054724335670471,,,,,, +34,196649,,,,,,,,,,,,0.0679406002163887,,,,,, +34,196699,,,,,,,,,,,,0.079220250248909,,,,,, +34,196749,,,,,,,,,,,,0.06445489078760147,,,,,, +34,196799,,,,,,,,,,,,0.06994017958641052,,,,,, +34,196849,,,,,,,,,,,,0.059495579451322556,,,,,, +34,196899,,,,,,,,,,,,0.06895946711301804,,,,,, +34,196949,,,,,,,,,,,,0.08127199858427048,,,,,, +34,196999,,,,,,,,,,,,0.08650273829698563,,,,,, +34,197049,,,,,,,,,,,,0.06978068500757217,,,,,, +34,197099,,,,,,,,,,,,0.07698601484298706,,,,,, +34,197149,,,,,,,,,,,,0.07679200172424316,,,,,, +34,197199,,,,,,,,,,,,0.07300090789794922,,,,,, +34,197249,,,,,,,,,,,,0.0729314312338829,,,,,, +34,197299,,,,,,,,,,,,0.06892718374729156,,,,,, +34,197349,,,,,,,,,,,,0.05667993798851967,,,,,, +34,197399,,,,,,,,,,,,0.0764985978603363,,,,,, +34,197449,,,,,,,,,,,,0.07444728910923004,,,,,, +34,197499,,,,,,,,,,,,0.07925239205360413,,,,,, +34,197549,,,,,,,,,,,,0.08056284487247467,,,,,, +34,197599,,,,,,,,,,,,0.082222580909729,,,,,, +34,197649,,,,,,,,,,,,0.07317226380109787,,,,,, +34,197699,,,,,,,,,,,,0.07660836726427078,,,,,, +34,197749,,,,,,,,,,,,0.08504702150821686,,,,,, +34,197799,,,,,,,,,,,,0.07418744266033173,,,,,, +34,197849,,,,,,,,,,,,0.0864076241850853,,,,,, +34,197899,,,,,,,,,,,,0.05945206061005592,,,,,, +34,197949,,,,,,,,,,,,0.07960230112075806,,,,,, +34,197999,,,,,,,,,,,,0.06760348379611969,,,,,, +34,198049,,,,,,,,,,,,0.08473773300647736,,,,,, +34,198099,,,,,,,,,,,,0.0757192000746727,,,,,, +34,198149,,,,,,,,,,,,0.06535995006561279,,,,,, +34,198199,,,,,,,,,,,,0.06747253239154816,,,,,, +34,198249,,,,,,,,,,,,0.07174107432365417,,,,,, +34,198299,,,,,,,,,,,,0.07041202485561371,,,,,, +34,198349,,,,,,,,,,,,0.08203829079866409,,,,,, +34,198399,,,,,,,,,,,,0.07055017352104187,,,,,, +34,198449,,,,,,,,,,,,0.06903496384620667,,,,,, +34,198499,,,,,,,,,,,,0.07620123773813248,,,,,, +34,198549,,,,,,,,,,,,0.07111083716154099,,,,,, +34,198599,,,,,,,,,,,,0.0678960382938385,,,,,, +34,198649,,,,,,,,,,,,0.07338738441467285,,,,,, +34,198699,,,,,,,,,,,,0.07122848182916641,,,,,, +34,198749,,,,,,,,,,,,0.06890407204627991,,,,,, +34,198799,,,,,,,,,,,,0.06699801236391068,,,,,, +34,198849,,,,,,,,,,,,0.08336623758077621,,,,,, +34,198899,,,,,,,,,,,,0.06803014874458313,,,,,, +34,198949,,,,,,,,,,,,0.06287091970443726,,,,,, +34,198999,,,,,,,,,,,,0.07027421146631241,,,,,, +34,199049,,,,,,,,,,,,0.062450915575027466,,,,,, +34,199099,,,,,,,,,,,,0.07206954061985016,,,,,, +34,199149,,,,,,,,,,,,0.0682549923658371,,,,,, +34,199199,,,,,,,,,,,,0.07544796168804169,,,,,, +34,199249,,,,,,,,,,,,0.07985436916351318,,,,,, +34,199299,,,,,,,,,,,,0.09156794846057892,,,,,, +34,199349,,,,,,,,,,,,0.08205055445432663,,,,,, +34,199399,,,,,,,,,,,,0.0752655491232872,,,,,, +34,199449,,,,,,,,,,,,0.06952618807554245,,,,,, +34,199499,,,,,,,,,,,,0.07886813580989838,,,,,, +34,199549,,,,,,,,,,,,0.059362106025218964,,,,,, +34,199599,,,,,,,,,,,,0.07487751543521881,,,,,, +34,199649,,,,,,,,,,,,0.07790586352348328,,,,,, +34,199699,,,,,,,,,,,,0.07222016155719757,,,,,, +34,199749,,,,,,,,,,,,0.07855674624443054,,,,,, +34,199799,,,,,,,,,,,,0.05482790619134903,,,,,, +34,199849,,,,,,,,,,,,0.06951234489679337,,,,,, +34,199899,,,,,,,,,,,,0.08809457719326019,,,,,, +34,199949,,,,,,,,,,,,0.07077481597661972,,,,,, +34,199999,,,,,,,,,,,,0.07562205940485,,,,,, +34,200049,,,,,,,,,,,,0.0706573948264122,,,,,, +34,200099,,,,,,,,,,,,0.07224539667367935,,,,,, +34,200149,,,,,,,,,,,,0.07261569797992706,,,,,, +34,200199,,,,,,,,,,,,0.07856041193008423,,,,,, +34,200249,,,,,,,,,,,,0.080284982919693,,,,,, +34,200299,,,,,,,,,,,,0.05846887826919556,,,,,, +34,200349,,,,,,,,,,,,0.07538540661334991,,,,,, +34,200399,,,,,,,,,,,,0.08352325856685638,,,,,, +34,200449,,,,,,,,,,,,0.07538671791553497,,,,,, +34,200499,,,,,,,,,,,,0.08348731696605682,,,,,, +34,200549,,,,,,,,,,,,0.07059919834136963,,,,,, +34,200599,,,,,,,,,,,,0.07221046090126038,,,,,, +34,200649,,,,,,,,,,,,0.06470668315887451,,,,,, +34,200699,,,,,,,,,,,,0.06812848150730133,,,,,, +34,200749,,,,,,,,,,,,0.08481161296367645,,,,,, +34,200759,,,,,,,,,,,,,0.23958587646484375,0.08021043986082077,0.23716244101524353,0.026819050312042236,0.23273737728595734,0.08021043986082077 +34,200759,,,,,,,0.2322610467672348,0.07426472753286362,0.32042303681373596,0.10267126560211182,0.3003142476081848,,,,,,, +35,200799,,,,,,,,,,,,0.07284398376941681,,,,,, +35,200849,,,,,,,,,,,,0.07469162344932556,,,,,, +35,200899,,,,,,,,,,,,0.0600685253739357,,,,,, +35,200949,,,,,,,,,,,,0.06819548457860947,,,,,, +35,200999,,,,,,,,,,,,0.0746145248413086,,,,,, +35,201049,,,,,,,,,,,,0.0736321210861206,,,,,, +35,201099,,,,,,,,,,,,0.06860217452049255,,,,,, +35,201149,,,,,,,,,,,,0.08126027882099152,,,,,, +35,201199,,,,,,,,,,,,0.07642577588558197,,,,,, +35,201249,,,,,,,,,,,,0.08132132887840271,,,,,, +35,201299,,,,,,,,,,,,0.07763326168060303,,,,,, +35,201349,,,,,,,,,,,,0.07802069187164307,,,,,, +35,201399,,,,,,,,,,,,0.07059960067272186,,,,,, +35,201449,,,,,,,,,,,,0.0768352597951889,,,,,, +35,201499,,,,,,,,,,,,0.06101281940937042,,,,,, +35,201549,,,,,,,,,,,,0.07924547046422958,,,,,, +35,201599,,,,,,,,,,,,0.07539445906877518,,,,,, +35,201649,,,,,,,,,,,,0.0791139081120491,,,,,, +35,201699,,,,,,,,,,,,0.07588724792003632,,,,,, +35,201749,,,,,,,,,,,,0.05420701205730438,,,,,, +35,201799,,,,,,,,,,,,0.08678600192070007,,,,,, +35,201849,,,,,,,,,,,,0.0578872412443161,,,,,, +35,201899,,,,,,,,,,,,0.08835148811340332,,,,,, +35,201949,,,,,,,,,,,,0.07525287568569183,,,,,, +35,201999,,,,,,,,,,,,0.06449767202138901,,,,,, +35,202049,,,,,,,,,,,,0.08598098158836365,,,,,, +35,202099,,,,,,,,,,,,0.0729890763759613,,,,,, +35,202149,,,,,,,,,,,,0.07469157874584198,,,,,, +35,202199,,,,,,,,,,,,0.0627143383026123,,,,,, +35,202249,,,,,,,,,,,,0.0752827376127243,,,,,, +35,202299,,,,,,,,,,,,0.0787392109632492,,,,,, +35,202349,,,,,,,,,,,,0.07057791948318481,,,,,, +35,202399,,,,,,,,,,,,0.0716952532529831,,,,,, +35,202449,,,,,,,,,,,,0.07212304323911667,,,,,, +35,202499,,,,,,,,,,,,0.08133847266435623,,,,,, +35,202549,,,,,,,,,,,,0.07468186318874359,,,,,, +35,202599,,,,,,,,,,,,0.0870041474699974,,,,,, +35,202649,,,,,,,,,,,,0.07310755550861359,,,,,, +35,202699,,,,,,,,,,,,0.07756854593753815,,,,,, +35,202749,,,,,,,,,,,,0.07138039171695709,,,,,, +35,202799,,,,,,,,,,,,0.0877670869231224,,,,,, +35,202849,,,,,,,,,,,,0.07424373924732208,,,,,, +35,202899,,,,,,,,,,,,0.0729576051235199,,,,,, +35,202949,,,,,,,,,,,,0.08120721578598022,,,,,, +35,202999,,,,,,,,,,,,0.0805065780878067,,,,,, +35,203049,,,,,,,,,,,,0.07607182115316391,,,,,, +35,203099,,,,,,,,,,,,0.06554779410362244,,,,,, +35,203149,,,,,,,,,,,,0.06943196803331375,,,,,, +35,203199,,,,,,,,,,,,0.07130831480026245,,,,,, +35,203249,,,,,,,,,,,,0.06383506208658218,,,,,, +35,203299,,,,,,,,,,,,0.07394929230213165,,,,,, +35,203349,,,,,,,,,,,,0.08312082290649414,,,,,, +35,203399,,,,,,,,,,,,0.06720396876335144,,,,,, +35,203449,,,,,,,,,,,,0.06939567625522614,,,,,, +35,203499,,,,,,,,,,,,0.07587599009275436,,,,,, +35,203549,,,,,,,,,,,,0.0681220069527626,,,,,, +35,203599,,,,,,,,,,,,0.07684127986431122,,,,,, +35,203649,,,,,,,,,,,,0.07845510542392731,,,,,, +35,203699,,,,,,,,,,,,0.07504409551620483,,,,,, +35,203749,,,,,,,,,,,,0.07276072353124619,,,,,, +35,203799,,,,,,,,,,,,0.07336930930614471,,,,,, +35,203849,,,,,,,,,,,,0.061494238674640656,,,,,, +35,203899,,,,,,,,,,,,0.07450542598962784,,,,,, +35,203949,,,,,,,,,,,,0.07324114441871643,,,,,, +35,203999,,,,,,,,,,,,0.07457089424133301,,,,,, +35,204049,,,,,,,,,,,,0.08444802463054657,,,,,, +35,204099,,,,,,,,,,,,0.06698182970285416,,,,,, +35,204149,,,,,,,,,,,,0.07863021641969681,,,,,, +35,204199,,,,,,,,,,,,0.07382124662399292,,,,,, +35,204249,,,,,,,,,,,,0.0733981728553772,,,,,, +35,204299,,,,,,,,,,,,0.07124605774879456,,,,,, +35,204349,,,,,,,,,,,,0.06822703778743744,,,,,, +35,204399,,,,,,,,,,,,0.0809578150510788,,,,,, +35,204449,,,,,,,,,,,,0.08823385834693909,,,,,, +35,204499,,,,,,,,,,,,0.0776413232088089,,,,,, +35,204549,,,,,,,,,,,,0.07308497279882431,,,,,, +35,204599,,,,,,,,,,,,0.07526242733001709,,,,,, +35,204649,,,,,,,,,,,,0.07523845136165619,,,,,, +35,204699,,,,,,,,,,,,0.08694739639759064,,,,,, +35,204749,,,,,,,,,,,,0.0758051872253418,,,,,, +35,204799,,,,,,,,,,,,0.06824877858161926,,,,,, +35,204849,,,,,,,,,,,,0.09266480058431625,,,,,, +35,204899,,,,,,,,,,,,0.07871665060520172,,,,,, +35,204949,,,,,,,,,,,,0.07910104095935822,,,,,, +35,204999,,,,,,,,,,,,0.06880578398704529,,,,,, +35,205049,,,,,,,,,,,,0.08177029341459274,,,,,, +35,205099,,,,,,,,,,,,0.071734219789505,,,,,, +35,205149,,,,,,,,,,,,0.06847384572029114,,,,,, +35,205199,,,,,,,,,,,,0.07194012403488159,,,,,, +35,205249,,,,,,,,,,,,0.07152897119522095,,,,,, +35,205299,,,,,,,,,,,,0.0794500932097435,,,,,, +35,205349,,,,,,,,,,,,0.0817306637763977,,,,,, +35,205399,,,,,,,,,,,,0.0684937983751297,,,,,, +35,205449,,,,,,,,,,,,0.066499263048172,,,,,, +35,205499,,,,,,,,,,,,0.06512954831123352,,,,,, +35,205549,,,,,,,,,,,,0.07341702282428741,,,,,, +35,205599,,,,,,,,,,,,0.08783648163080215,,,,,, +35,205649,,,,,,,,,,,,0.06582563370466232,,,,,, +35,205699,,,,,,,,,,,,0.0722988024353981,,,,,, +35,205749,,,,,,,,,,,,0.06776969879865646,,,,,, +35,205799,,,,,,,,,,,,0.07544858008623123,,,,,, +35,205849,,,,,,,,,,,,0.07458203285932541,,,,,, +35,205899,,,,,,,,,,,,0.07479292899370193,,,,,, +35,205949,,,,,,,,,,,,0.07475216686725616,,,,,, +35,205999,,,,,,,,,,,,0.06186119094491005,,,,,, +35,206049,,,,,,,,,,,,0.05831769481301308,,,,,, +35,206099,,,,,,,,,,,,0.06932178139686584,,,,,, +35,206149,,,,,,,,,,,,0.06738331913948059,,,,,, +35,206199,,,,,,,,,,,,0.07503262162208557,,,,,, +35,206249,,,,,,,,,,,,0.07207760214805603,,,,,, +35,206299,,,,,,,,,,,,0.08681951463222504,,,,,, +35,206349,,,,,,,,,,,,0.074038565158844,,,,,, +35,206399,,,,,,,,,,,,0.07291411608457565,,,,,, +35,206449,,,,,,,,,,,,0.06643420457839966,,,,,, +35,206495,,,,,,,,,,,,,0.24167828261852264,0.08234890550374985,0.2059033215045929,0.0008733868598937988,0.2103763371706009,0.08234890550374985 +35,206495,,,,,,,0.2319994568824768,0.07415098696947098,0.3225593566894531,0.10403430461883545,0.3027786612510681,,,,,,, +36,206499,,,,,,,,,,,,0.06397689133882523,,,,,, +36,206549,,,,,,,,,,,,0.08129040151834488,,,,,, +36,206599,,,,,,,,,,,,0.07144368439912796,,,,,, +36,206649,,,,,,,,,,,,0.07961229979991913,,,,,, +36,206699,,,,,,,,,,,,0.06907376646995544,,,,,, +36,206749,,,,,,,,,,,,0.07302244007587433,,,,,, +36,206799,,,,,,,,,,,,0.07924328744411469,,,,,, +36,206849,,,,,,,,,,,,0.06684726476669312,,,,,, +36,206899,,,,,,,,,,,,0.08502011001110077,,,,,, +36,206949,,,,,,,,,,,,0.08248977363109589,,,,,, +36,206999,,,,,,,,,,,,0.08626018464565277,,,,,, +36,207049,,,,,,,,,,,,0.08599050343036652,,,,,, +36,207099,,,,,,,,,,,,0.0683676153421402,,,,,, +36,207149,,,,,,,,,,,,0.07569423317909241,,,,,, +36,207199,,,,,,,,,,,,0.07173386216163635,,,,,, +36,207249,,,,,,,,,,,,0.0774218812584877,,,,,, +36,207299,,,,,,,,,,,,0.079409658908844,,,,,, +36,207349,,,,,,,,,,,,0.06146848201751709,,,,,, +36,207399,,,,,,,,,,,,0.07871668040752411,,,,,, +36,207449,,,,,,,,,,,,0.07194815576076508,,,,,, +36,207499,,,,,,,,,,,,0.07130526006221771,,,,,, +36,207549,,,,,,,,,,,,0.06606122851371765,,,,,, +36,207599,,,,,,,,,,,,0.07825663685798645,,,,,, +36,207649,,,,,,,,,,,,0.08035255968570709,,,,,, +36,207699,,,,,,,,,,,,0.0810355544090271,,,,,, +36,207749,,,,,,,,,,,,0.07270301878452301,,,,,, +36,207799,,,,,,,,,,,,0.07850992679595947,,,,,, +36,207849,,,,,,,,,,,,0.07420025020837784,,,,,, +36,207899,,,,,,,,,,,,0.07120407372713089,,,,,, +36,207949,,,,,,,,,,,,0.07330639660358429,,,,,, +36,207999,,,,,,,,,,,,0.0875939130783081,,,,,, +36,208049,,,,,,,,,,,,0.08162561058998108,,,,,, +36,208099,,,,,,,,,,,,0.07055804133415222,,,,,, +36,208149,,,,,,,,,,,,0.07686298340559006,,,,,, +36,208199,,,,,,,,,,,,0.07609744369983673,,,,,, +36,208249,,,,,,,,,,,,0.07954171299934387,,,,,, +36,208299,,,,,,,,,,,,0.06168191507458687,,,,,, +36,208349,,,,,,,,,,,,0.073597252368927,,,,,, +36,208399,,,,,,,,,,,,0.07783707231283188,,,,,, +36,208449,,,,,,,,,,,,0.06782699376344681,,,,,, +36,208499,,,,,,,,,,,,0.06979631632566452,,,,,, +36,208549,,,,,,,,,,,,0.07816353440284729,,,,,, +36,208599,,,,,,,,,,,,0.07599183917045593,,,,,, +36,208649,,,,,,,,,,,,0.06702142208814621,,,,,, +36,208699,,,,,,,,,,,,0.062087222933769226,,,,,, +36,208749,,,,,,,,,,,,0.07448834180831909,,,,,, +36,208799,,,,,,,,,,,,0.07670733332633972,,,,,, +36,208849,,,,,,,,,,,,0.0750945582985878,,,,,, +36,208899,,,,,,,,,,,,0.0719270184636116,,,,,, +36,208949,,,,,,,,,,,,0.07390162348747253,,,,,, +36,208999,,,,,,,,,,,,0.0732245147228241,,,,,, +36,209049,,,,,,,,,,,,0.07228733599185944,,,,,, +36,209099,,,,,,,,,,,,0.06860314309597015,,,,,, +36,209149,,,,,,,,,,,,0.07486999034881592,,,,,, +36,209199,,,,,,,,,,,,0.07975681126117706,,,,,, +36,209249,,,,,,,,,,,,0.07425267994403839,,,,,, +36,209299,,,,,,,,,,,,0.07370591163635254,,,,,, +36,209349,,,,,,,,,,,,0.06715148687362671,,,,,, +36,209399,,,,,,,,,,,,0.07507625222206116,,,,,, +36,209449,,,,,,,,,,,,0.05739664286375046,,,,,, +36,209499,,,,,,,,,,,,0.07071450352668762,,,,,, +36,209549,,,,,,,,,,,,0.07573898136615753,,,,,, +36,209599,,,,,,,,,,,,0.07191657274961472,,,,,, +36,209649,,,,,,,,,,,,0.07468509674072266,,,,,, +36,209699,,,,,,,,,,,,0.08471277356147766,,,,,, +36,209749,,,,,,,,,,,,0.07210496068000793,,,,,, +36,209799,,,,,,,,,,,,0.08158037066459656,,,,,, +36,209849,,,,,,,,,,,,0.07259948551654816,,,,,, +36,209899,,,,,,,,,,,,0.08027690649032593,,,,,, +36,209949,,,,,,,,,,,,0.07018861919641495,,,,,, +36,209999,,,,,,,,,,,,0.07320249080657959,,,,,, +36,210049,,,,,,,,,,,,0.0927204042673111,,,,,, +36,210099,,,,,,,,,,,,0.06202796846628189,,,,,, +36,210149,,,,,,,,,,,,0.08612729609012604,,,,,, +36,210199,,,,,,,,,,,,0.07146817445755005,,,,,, +36,210249,,,,,,,,,,,,0.0822608694434166,,,,,, +36,210299,,,,,,,,,,,,0.07579514384269714,,,,,, +36,210349,,,,,,,,,,,,0.06709123402833939,,,,,, +36,210399,,,,,,,,,,,,0.06925119459629059,,,,,, +36,210449,,,,,,,,,,,,0.07030614465475082,,,,,, +36,210499,,,,,,,,,,,,0.07937750220298767,,,,,, +36,210549,,,,,,,,,,,,0.06254493445158005,,,,,, +36,210599,,,,,,,,,,,,0.08243760466575623,,,,,, +36,210649,,,,,,,,,,,,0.06841395795345306,,,,,, +36,210699,,,,,,,,,,,,0.06908716261386871,,,,,, +36,210749,,,,,,,,,,,,0.07220441102981567,,,,,, +36,210799,,,,,,,,,,,,0.0791134461760521,,,,,, +36,210849,,,,,,,,,,,,0.07271500676870346,,,,,, +36,210899,,,,,,,,,,,,0.08128587901592255,,,,,, +36,210949,,,,,,,,,,,,0.07413755357265472,,,,,, +36,210999,,,,,,,,,,,,0.07131664454936981,,,,,, +36,211049,,,,,,,,,,,,0.07103602588176727,,,,,, +36,211099,,,,,,,,,,,,0.0728330910205841,,,,,, +36,211149,,,,,,,,,,,,0.07690203934907913,,,,,, +36,211199,,,,,,,,,,,,0.07005299627780914,,,,,, +36,211249,,,,,,,,,,,,0.07227254658937454,,,,,, +36,211299,,,,,,,,,,,,0.08059465885162354,,,,,, +36,211349,,,,,,,,,,,,0.07639355957508087,,,,,, +36,211399,,,,,,,,,,,,0.06239158287644386,,,,,, +36,211449,,,,,,,,,,,,0.06669491529464722,,,,,, +36,211499,,,,,,,,,,,,0.06600604951381683,,,,,, +36,211549,,,,,,,,,,,,0.0812198594212532,,,,,, +36,211599,,,,,,,,,,,,0.08000163733959198,,,,,, +36,211649,,,,,,,,,,,,0.07192373275756836,,,,,, +36,211699,,,,,,,,,,,,0.07273557782173157,,,,,, +36,211749,,,,,,,,,,,,0.07228012382984161,,,,,, +36,211799,,,,,,,,,,,,0.0724795013666153,,,,,, +36,211849,,,,,,,,,,,,0.07995772361755371,,,,,, +36,211899,,,,,,,,,,,,0.07039161771535873,,,,,, +36,211949,,,,,,,,,,,,0.08001440018415451,,,,,, +36,211999,,,,,,,,,,,,0.0869474783539772,,,,,, +36,212049,,,,,,,,,,,,0.07457169890403748,,,,,, +36,212099,,,,,,,,,,,,0.06946051120758057,,,,,, +36,212149,,,,,,,,,,,,0.07279226183891296,,,,,, +36,212199,,,,,,,,,,,,0.07447662949562073,,,,,, +36,212231,,,,,,,,,,,,,0.2399393618106842,0.0807831659913063,0.2440331131219864,0.019870221614837646,0.2404988706111908,0.0807831659913063 +36,212231,,,,,,,0.23188970983028412,0.07409214973449707,0.3236667811870575,0.1047511100769043,0.3035370409488678,,,,,,, +37,212249,,,,,,,,,,,,0.06669913232326508,,,,,, +37,212299,,,,,,,,,,,,0.05639047548174858,,,,,, +37,212349,,,,,,,,,,,,0.06898663192987442,,,,,, +37,212399,,,,,,,,,,,,0.0789870172739029,,,,,, +37,212449,,,,,,,,,,,,0.06865029036998749,,,,,, +37,212499,,,,,,,,,,,,0.07082577049732208,,,,,, +37,212549,,,,,,,,,,,,0.07334592938423157,,,,,, +37,212599,,,,,,,,,,,,0.07981021702289581,,,,,, +37,212649,,,,,,,,,,,,0.0716058760881424,,,,,, +37,212699,,,,,,,,,,,,0.08389168232679367,,,,,, +37,212749,,,,,,,,,,,,0.06436258554458618,,,,,, +37,212799,,,,,,,,,,,,0.08422841131687164,,,,,, +37,212849,,,,,,,,,,,,0.07439326494932175,,,,,, +37,212899,,,,,,,,,,,,0.07078734040260315,,,,,, +37,212949,,,,,,,,,,,,0.07703804224729538,,,,,, +37,212999,,,,,,,,,,,,0.07446110993623734,,,,,, +37,213049,,,,,,,,,,,,0.07444767653942108,,,,,, +37,213099,,,,,,,,,,,,0.07026097178459167,,,,,, +37,213149,,,,,,,,,,,,0.06601538509130478,,,,,, +37,213199,,,,,,,,,,,,0.0776047557592392,,,,,, +37,213249,,,,,,,,,,,,0.07287061959505081,,,,,, +37,213299,,,,,,,,,,,,0.0771520733833313,,,,,, +37,213349,,,,,,,,,,,,0.08296597003936768,,,,,, +37,213399,,,,,,,,,,,,0.06778634339570999,,,,,, +37,213449,,,,,,,,,,,,0.07976794242858887,,,,,, +37,213499,,,,,,,,,,,,0.06893721222877502,,,,,, +37,213549,,,,,,,,,,,,0.06324414163827896,,,,,, +37,213599,,,,,,,,,,,,0.07268230617046356,,,,,, +37,213649,,,,,,,,,,,,0.06873121112585068,,,,,, +37,213699,,,,,,,,,,,,0.06644783914089203,,,,,, +37,213749,,,,,,,,,,,,0.07346450537443161,,,,,, +37,213799,,,,,,,,,,,,0.07580696046352386,,,,,, +37,213849,,,,,,,,,,,,0.07409127056598663,,,,,, +37,213899,,,,,,,,,,,,0.07187221944332123,,,,,, +37,213949,,,,,,,,,,,,0.07471781969070435,,,,,, +37,213999,,,,,,,,,,,,0.07693707942962646,,,,,, +37,214049,,,,,,,,,,,,0.06898370385169983,,,,,, +37,214099,,,,,,,,,,,,0.0756123960018158,,,,,, +37,214149,,,,,,,,,,,,0.07044006884098053,,,,,, +37,214199,,,,,,,,,,,,0.06859306991100311,,,,,, +37,214249,,,,,,,,,,,,0.07823587954044342,,,,,, +37,214299,,,,,,,,,,,,0.0762428343296051,,,,,, +37,214349,,,,,,,,,,,,0.08385145664215088,,,,,, +37,214399,,,,,,,,,,,,0.07030893862247467,,,,,, +37,214449,,,,,,,,,,,,0.09369619935750961,,,,,, +37,214499,,,,,,,,,,,,0.07016579806804657,,,,,, +37,214549,,,,,,,,,,,,0.07204534113407135,,,,,, +37,214599,,,,,,,,,,,,0.07009023427963257,,,,,, +37,214649,,,,,,,,,,,,0.07172977924346924,,,,,, +37,214699,,,,,,,,,,,,0.07420937716960907,,,,,, +37,214749,,,,,,,,,,,,0.08132052421569824,,,,,, +37,214799,,,,,,,,,,,,0.08498846739530563,,,,,, +37,214849,,,,,,,,,,,,0.07708703726530075,,,,,, +37,214899,,,,,,,,,,,,0.07106532156467438,,,,,, +37,214949,,,,,,,,,,,,0.07898512482643127,,,,,, +37,214999,,,,,,,,,,,,0.06782589852809906,,,,,, +37,215049,,,,,,,,,,,,0.06996060907840729,,,,,, +37,215099,,,,,,,,,,,,0.07872314006090164,,,,,, +37,215149,,,,,,,,,,,,0.08680841326713562,,,,,, +37,215199,,,,,,,,,,,,0.08700490742921829,,,,,, +37,215249,,,,,,,,,,,,0.06450054049491882,,,,,, +37,215299,,,,,,,,,,,,0.06892427802085876,,,,,, +37,215349,,,,,,,,,,,,0.07954761385917664,,,,,, +37,215399,,,,,,,,,,,,0.07315944135189056,,,,,, +37,215449,,,,,,,,,,,,0.07813307642936707,,,,,, +37,215499,,,,,,,,,,,,0.06779085099697113,,,,,, +37,215549,,,,,,,,,,,,0.07859909534454346,,,,,, +37,215599,,,,,,,,,,,,0.07362163066864014,,,,,, +37,215649,,,,,,,,,,,,0.07295523583889008,,,,,, +37,215699,,,,,,,,,,,,0.07773489505052567,,,,,, +37,215749,,,,,,,,,,,,0.06656289100646973,,,,,, +37,215799,,,,,,,,,,,,0.07226385921239853,,,,,, +37,215849,,,,,,,,,,,,0.06044982001185417,,,,,, +37,215899,,,,,,,,,,,,0.07347053289413452,,,,,, +37,215949,,,,,,,,,,,,0.0728728398680687,,,,,, +37,215999,,,,,,,,,,,,0.056453198194503784,,,,,, +37,216049,,,,,,,,,,,,0.07258008420467377,,,,,, +37,216099,,,,,,,,,,,,0.07604596763849258,,,,,, +37,216149,,,,,,,,,,,,0.08428455889225006,,,,,, +37,216199,,,,,,,,,,,,0.08861510455608368,,,,,, +37,216249,,,,,,,,,,,,0.0731339082121849,,,,,, +37,216299,,,,,,,,,,,,0.07660195231437683,,,,,, +37,216349,,,,,,,,,,,,0.07242272794246674,,,,,, +37,216399,,,,,,,,,,,,0.0728379413485527,,,,,, +37,216449,,,,,,,,,,,,0.07243186980485916,,,,,, +37,216499,,,,,,,,,,,,0.07097230851650238,,,,,, +37,216549,,,,,,,,,,,,0.06075514107942581,,,,,, +37,216599,,,,,,,,,,,,0.07066459208726883,,,,,, +37,216649,,,,,,,,,,,,0.08196056634187698,,,,,, +37,216699,,,,,,,,,,,,0.06756072491407394,,,,,, +37,216749,,,,,,,,,,,,0.06146240234375,,,,,, +37,216799,,,,,,,,,,,,0.06972280889749527,,,,,, +37,216849,,,,,,,,,,,,0.07485967129468918,,,,,, +37,216899,,,,,,,,,,,,0.07306914031505585,,,,,, +37,216949,,,,,,,,,,,,0.08269111812114716,,,,,, +37,216999,,,,,,,,,,,,0.07476125657558441,,,,,, +37,217049,,,,,,,,,,,,0.08261865377426147,,,,,, +37,217099,,,,,,,,,,,,0.07237578928470612,,,,,, +37,217149,,,,,,,,,,,,0.0821678414940834,,,,,, +37,217199,,,,,,,,,,,,0.07340078055858612,,,,,, +37,217249,,,,,,,,,,,,0.08022087812423706,,,,,, +37,217299,,,,,,,,,,,,0.07046832144260406,,,,,, +37,217349,,,,,,,,,,,,0.06874239444732666,,,,,, +37,217399,,,,,,,,,,,,0.06965184211730957,,,,,, +37,217449,,,,,,,,,,,,0.0782846063375473,,,,,, +37,217499,,,,,,,,,,,,0.07165094465017319,,,,,, +37,217549,,,,,,,,,,,,0.06983919441699982,,,,,, +37,217599,,,,,,,,,,,,0.08024246990680695,,,,,, +37,217649,,,,,,,,,,,,0.07298162579536438,,,,,, +37,217699,,,,,,,,,,,,0.06686606258153915,,,,,, +37,217749,,,,,,,,,,,,0.07459741830825806,,,,,, +37,217799,,,,,,,,,,,,0.07891441881656647,,,,,, +37,217849,,,,,,,,,,,,0.06618621945381165,,,,,, +37,217899,,,,,,,,,,,,0.07287268340587616,,,,,, +37,217949,,,,,,,,,,,,0.07861386984586716,,,,,, +37,217967,,,,,,,,,,,,,0.23986214399337769,0.08112014830112457,0.23570199310779572,0.015781641006469727,0.23711901903152466,0.08112014830112457 +37,217967,,,,,,,0.2317885160446167,0.0740126296877861,0.32514071464538574,0.10571849346160889,0.30478551983833313,,,,,,, +38,217999,,,,,,,,,,,,0.07646815478801727,,,,,, +38,218049,,,,,,,,,,,,0.06879760324954987,,,,,, +38,218099,,,,,,,,,,,,0.07994688302278519,,,,,, +38,218149,,,,,,,,,,,,0.07216799259185791,,,,,, +38,218199,,,,,,,,,,,,0.07541809976100922,,,,,, +38,218249,,,,,,,,,,,,0.07498376071453094,,,,,, +38,218299,,,,,,,,,,,,0.07452835142612457,,,,,, +38,218349,,,,,,,,,,,,0.07428575307130814,,,,,, +38,218399,,,,,,,,,,,,0.08755743503570557,,,,,, +38,218449,,,,,,,,,,,,0.07899340242147446,,,,,, +38,218499,,,,,,,,,,,,0.07939071208238602,,,,,, +38,218549,,,,,,,,,,,,0.07652057707309723,,,,,, +38,218599,,,,,,,,,,,,0.08008337765932083,,,,,, +38,218649,,,,,,,,,,,,0.08532778173685074,,,,,, +38,218699,,,,,,,,,,,,0.07824135571718216,,,,,, +38,218749,,,,,,,,,,,,0.06932597607374191,,,,,, +38,218799,,,,,,,,,,,,0.07133378088474274,,,,,, +38,218849,,,,,,,,,,,,0.07794563472270966,,,,,, +38,218899,,,,,,,,,,,,0.07085193693637848,,,,,, +38,218949,,,,,,,,,,,,0.06691615283489227,,,,,, +38,218999,,,,,,,,,,,,0.08031544089317322,,,,,, +38,219049,,,,,,,,,,,,0.06733772158622742,,,,,, +38,219099,,,,,,,,,,,,0.08590371161699295,,,,,, +38,219149,,,,,,,,,,,,0.07226499915122986,,,,,, +38,219199,,,,,,,,,,,,0.0722430869936943,,,,,, +38,219249,,,,,,,,,,,,0.06990611553192139,,,,,, +38,219299,,,,,,,,,,,,0.07550230622291565,,,,,, +38,219349,,,,,,,,,,,,0.0803527683019638,,,,,, +38,219399,,,,,,,,,,,,0.06542825698852539,,,,,, +38,219449,,,,,,,,,,,,0.07394012808799744,,,,,, +38,219499,,,,,,,,,,,,0.0685560405254364,,,,,, +38,219549,,,,,,,,,,,,0.07405075430870056,,,,,, +38,219599,,,,,,,,,,,,0.0778764933347702,,,,,, +38,219649,,,,,,,,,,,,0.08653026074171066,,,,,, +38,219699,,,,,,,,,,,,0.06364817917346954,,,,,, +38,219749,,,,,,,,,,,,0.07814782857894897,,,,,, +38,219799,,,,,,,,,,,,0.06482823938131332,,,,,, +38,219849,,,,,,,,,,,,0.0820724219083786,,,,,, +38,219899,,,,,,,,,,,,0.06932462751865387,,,,,, +38,219949,,,,,,,,,,,,0.0771828144788742,,,,,, +38,219999,,,,,,,,,,,,0.07565955817699432,,,,,, +38,220049,,,,,,,,,,,,0.07203103601932526,,,,,, +38,220099,,,,,,,,,,,,0.06944350898265839,,,,,, +38,220149,,,,,,,,,,,,0.07472941279411316,,,,,, +38,220199,,,,,,,,,,,,0.06753325462341309,,,,,, +38,220249,,,,,,,,,,,,0.07954074442386627,,,,,, +38,220299,,,,,,,,,,,,0.07031503319740295,,,,,, +38,220349,,,,,,,,,,,,0.07399558275938034,,,,,, +38,220399,,,,,,,,,,,,0.07644696533679962,,,,,, +38,220449,,,,,,,,,,,,0.0795377567410469,,,,,, +38,220499,,,,,,,,,,,,0.08227813988924026,,,,,, +38,220549,,,,,,,,,,,,0.07822847366333008,,,,,, +38,220599,,,,,,,,,,,,0.06629081815481186,,,,,, +38,220649,,,,,,,,,,,,0.07141898572444916,,,,,, +38,220699,,,,,,,,,,,,0.07756640762090683,,,,,, +38,220749,,,,,,,,,,,,0.07628583908081055,,,,,, +38,220799,,,,,,,,,,,,0.07824374735355377,,,,,, +38,220849,,,,,,,,,,,,0.0791083425283432,,,,,, +38,220899,,,,,,,,,,,,0.06987963616847992,,,,,, +38,220949,,,,,,,,,,,,0.07201648503541946,,,,,, +38,220999,,,,,,,,,,,,0.07201005518436432,,,,,, +38,221049,,,,,,,,,,,,0.0803845226764679,,,,,, +38,221099,,,,,,,,,,,,0.0791715681552887,,,,,, +38,221149,,,,,,,,,,,,0.07960333675146103,,,,,, +38,221199,,,,,,,,,,,,0.06942678987979889,,,,,, +38,221249,,,,,,,,,,,,0.06442946195602417,,,,,, +38,221299,,,,,,,,,,,,0.07578709721565247,,,,,, +38,221349,,,,,,,,,,,,0.07684461027383804,,,,,, +38,221399,,,,,,,,,,,,0.07763547450304031,,,,,, +38,221449,,,,,,,,,,,,0.07575294375419617,,,,,, +38,221499,,,,,,,,,,,,0.06104744225740433,,,,,, +38,221549,,,,,,,,,,,,0.07307818531990051,,,,,, +38,221599,,,,,,,,,,,,0.07296209037303925,,,,,, +38,221649,,,,,,,,,,,,0.08028341829776764,,,,,, +38,221699,,,,,,,,,,,,0.07223761081695557,,,,,, +38,221749,,,,,,,,,,,,0.08068351447582245,,,,,, +38,221799,,,,,,,,,,,,0.0734095573425293,,,,,, +38,221849,,,,,,,,,,,,0.06865404546260834,,,,,, +38,221899,,,,,,,,,,,,0.07514321804046631,,,,,, +38,221949,,,,,,,,,,,,0.06471662223339081,,,,,, +38,221999,,,,,,,,,,,,0.07308965921401978,,,,,, +38,222049,,,,,,,,,,,,0.07208748161792755,,,,,, +38,222099,,,,,,,,,,,,0.07813800871372223,,,,,, +38,222149,,,,,,,,,,,,0.07396707683801651,,,,,, +38,222199,,,,,,,,,,,,0.07234713435173035,,,,,, +38,222249,,,,,,,,,,,,0.06848154962062836,,,,,, +38,222299,,,,,,,,,,,,0.0642642006278038,,,,,, +38,222349,,,,,,,,,,,,0.07030218839645386,,,,,, +38,222399,,,,,,,,,,,,0.07102248072624207,,,,,, +38,222449,,,,,,,,,,,,0.06619703769683838,,,,,, +38,222499,,,,,,,,,,,,0.07086557149887085,,,,,, +38,222549,,,,,,,,,,,,0.07527534663677216,,,,,, +38,222599,,,,,,,,,,,,0.06704503297805786,,,,,, +38,222649,,,,,,,,,,,,0.06687009334564209,,,,,, +38,222699,,,,,,,,,,,,0.07480645179748535,,,,,, +38,222749,,,,,,,,,,,,0.07649154961109161,,,,,, +38,222799,,,,,,,,,,,,0.08232797682285309,,,,,, +38,222849,,,,,,,,,,,,0.07457028329372406,,,,,, +38,222899,,,,,,,,,,,,0.07659203559160233,,,,,, +38,222949,,,,,,,,,,,,0.08424130827188492,,,,,, +38,222999,,,,,,,,,,,,0.0656561627984047,,,,,, +38,223049,,,,,,,,,,,,0.07674739509820938,,,,,, +38,223099,,,,,,,,,,,,0.07626505196094513,,,,,, +38,223149,,,,,,,,,,,,0.06959760934114456,,,,,, +38,223199,,,,,,,,,,,,0.06818155944347382,,,,,, +38,223249,,,,,,,,,,,,0.07169418036937714,,,,,, +38,223299,,,,,,,,,,,,0.07588382065296173,,,,,, +38,223349,,,,,,,,,,,,0.08285636454820633,,,,,, +38,223399,,,,,,,,,,,,0.0817144364118576,,,,,, +38,223449,,,,,,,,,,,,0.07697071135044098,,,,,, +38,223499,,,,,,,,,,,,0.07470440119504929,,,,,, +38,223549,,,,,,,,,,,,0.08225871622562408,,,,,, +38,223599,,,,,,,,,,,,0.06383825838565826,,,,,, +38,223649,,,,,,,,,,,,0.0775364339351654,,,,,, +38,223699,,,,,,,,,,,,0.07178056985139847,,,,,, +38,223703,,,,,,,,,,,,,0.23982052505016327,0.0805116593837738,0.22623035311698914,0.02316439151763916,0.22533351182937622,0.0805116593837738 +38,223703,,,,,,,0.23133553564548492,0.0738050788640976,0.328975111246109,0.10822486877441406,0.30898788571357727,,,,,,, +39,223749,,,,,,,,,,,,0.06706468760967255,,,,,, +39,223799,,,,,,,,,,,,0.08312085270881653,,,,,, +39,223849,,,,,,,,,,,,0.08489145338535309,,,,,, +39,223899,,,,,,,,,,,,0.074212446808815,,,,,, +39,223949,,,,,,,,,,,,0.07739661633968353,,,,,, +39,223999,,,,,,,,,,,,0.06189204752445221,,,,,, +39,224049,,,,,,,,,,,,0.08934588730335236,,,,,, +39,224099,,,,,,,,,,,,0.07577108591794968,,,,,, +39,224149,,,,,,,,,,,,0.07409903407096863,,,,,, +39,224199,,,,,,,,,,,,0.06917085498571396,,,,,, +39,224249,,,,,,,,,,,,0.06965886056423187,,,,,, +39,224299,,,,,,,,,,,,0.06334313750267029,,,,,, +39,224349,,,,,,,,,,,,0.07929280400276184,,,,,, +39,224399,,,,,,,,,,,,0.06772085279226303,,,,,, +39,224449,,,,,,,,,,,,0.07574611902236938,,,,,, +39,224499,,,,,,,,,,,,0.0701964721083641,,,,,, +39,224549,,,,,,,,,,,,0.0744764432311058,,,,,, +39,224599,,,,,,,,,,,,0.06776183098554611,,,,,, +39,224649,,,,,,,,,,,,0.06874192506074905,,,,,, +39,224699,,,,,,,,,,,,0.07991979271173477,,,,,, +39,224749,,,,,,,,,,,,0.07203280180692673,,,,,, +39,224799,,,,,,,,,,,,0.08002780377864838,,,,,, +39,224849,,,,,,,,,,,,0.07400564104318619,,,,,, +39,224899,,,,,,,,,,,,0.0751284807920456,,,,,, +39,224949,,,,,,,,,,,,0.08129175007343292,,,,,, +39,224999,,,,,,,,,,,,0.07759638130664825,,,,,, +39,225049,,,,,,,,,,,,0.0682377889752388,,,,,, +39,225099,,,,,,,,,,,,0.07610710710287094,,,,,, +39,225149,,,,,,,,,,,,0.07883363962173462,,,,,, +39,225199,,,,,,,,,,,,0.08218419551849365,,,,,, +39,225249,,,,,,,,,,,,0.08848997205495834,,,,,, +39,225299,,,,,,,,,,,,0.0729670450091362,,,,,, +39,225349,,,,,,,,,,,,0.06665752083063126,,,,,, +39,225399,,,,,,,,,,,,0.05750056356191635,,,,,, +39,225449,,,,,,,,,,,,0.0696512907743454,,,,,, +39,225499,,,,,,,,,,,,0.07835105061531067,,,,,, +39,225549,,,,,,,,,,,,0.06480437517166138,,,,,, +39,225599,,,,,,,,,,,,0.07531902939081192,,,,,, +39,225649,,,,,,,,,,,,0.06424163281917572,,,,,, +39,225699,,,,,,,,,,,,0.06623651832342148,,,,,, +39,225749,,,,,,,,,,,,0.07930511236190796,,,,,, +39,225799,,,,,,,,,,,,0.06586997210979462,,,,,, +39,225849,,,,,,,,,,,,0.07457415759563446,,,,,, +39,225899,,,,,,,,,,,,0.07922709733247757,,,,,, +39,225949,,,,,,,,,,,,0.07789021730422974,,,,,, +39,225999,,,,,,,,,,,,0.077386774122715,,,,,, +39,226049,,,,,,,,,,,,0.077470563352108,,,,,, +39,226099,,,,,,,,,,,,0.07794743776321411,,,,,, +39,226149,,,,,,,,,,,,0.07317841053009033,,,,,, +39,226199,,,,,,,,,,,,0.07627138495445251,,,,,, +39,226249,,,,,,,,,,,,0.08341759443283081,,,,,, +39,226299,,,,,,,,,,,,0.07529672235250473,,,,,, +39,226349,,,,,,,,,,,,0.07058091461658478,,,,,, +39,226399,,,,,,,,,,,,0.07024088501930237,,,,,, +39,226449,,,,,,,,,,,,0.07392369210720062,,,,,, +39,226499,,,,,,,,,,,,0.08010859787464142,,,,,, +39,226549,,,,,,,,,,,,0.06582842022180557,,,,,, +39,226599,,,,,,,,,,,,0.07761798799037933,,,,,, +39,226649,,,,,,,,,,,,0.061884306371212006,,,,,, +39,226699,,,,,,,,,,,,0.07195951044559479,,,,,, +39,226749,,,,,,,,,,,,0.0697721615433693,,,,,, +39,226799,,,,,,,,,,,,0.07012873142957687,,,,,, +39,226849,,,,,,,,,,,,0.06530801951885223,,,,,, +39,226899,,,,,,,,,,,,0.07594403624534607,,,,,, +39,226949,,,,,,,,,,,,0.07444993406534195,,,,,, +39,226999,,,,,,,,,,,,0.07045076042413712,,,,,, +39,227049,,,,,,,,,,,,0.0793919637799263,,,,,, +39,227099,,,,,,,,,,,,0.07163749635219574,,,,,, +39,227149,,,,,,,,,,,,0.07704530656337738,,,,,, +39,227199,,,,,,,,,,,,0.07408210635185242,,,,,, +39,227249,,,,,,,,,,,,0.07534495741128922,,,,,, +39,227299,,,,,,,,,,,,0.08035003393888474,,,,,, +39,227349,,,,,,,,,,,,0.0684642642736435,,,,,, +39,227399,,,,,,,,,,,,0.07792378962039948,,,,,, +39,227449,,,,,,,,,,,,0.07445511966943741,,,,,, +39,227499,,,,,,,,,,,,0.06012493744492531,,,,,, +39,227549,,,,,,,,,,,,0.07168306410312653,,,,,, +39,227599,,,,,,,,,,,,0.0730990618467331,,,,,, +39,227649,,,,,,,,,,,,0.06844764947891235,,,,,, +39,227699,,,,,,,,,,,,0.07642491161823273,,,,,, +39,227749,,,,,,,,,,,,0.07265670597553253,,,,,, +39,227799,,,,,,,,,,,,0.0655369833111763,,,,,, +39,227849,,,,,,,,,,,,0.06914541125297546,,,,,, +39,227899,,,,,,,,,,,,0.06954219937324524,,,,,, +39,227949,,,,,,,,,,,,0.08152730017900467,,,,,, +39,227999,,,,,,,,,,,,0.07861365377902985,,,,,, +39,228049,,,,,,,,,,,,0.07854154706001282,,,,,, +39,228099,,,,,,,,,,,,0.07825872302055359,,,,,, +39,228149,,,,,,,,,,,,0.06480858474969864,,,,,, +39,228199,,,,,,,,,,,,0.07525914162397385,,,,,, +39,228249,,,,,,,,,,,,0.06784157454967499,,,,,, +39,228299,,,,,,,,,,,,0.06405723839998245,,,,,, +39,228349,,,,,,,,,,,,0.07054730504751205,,,,,, +39,228399,,,,,,,,,,,,0.08374866843223572,,,,,, +39,228449,,,,,,,,,,,,0.07259435206651688,,,,,, +39,228499,,,,,,,,,,,,0.07519173622131348,,,,,, +39,228549,,,,,,,,,,,,0.07191254198551178,,,,,, +39,228599,,,,,,,,,,,,0.07500311732292175,,,,,, +39,228649,,,,,,,,,,,,0.08243867754936218,,,,,, +39,228699,,,,,,,,,,,,0.07068426162004471,,,,,, +39,228749,,,,,,,,,,,,0.08294887840747833,,,,,, +39,228799,,,,,,,,,,,,0.06913547217845917,,,,,, +39,228849,,,,,,,,,,,,0.06515000760555267,,,,,, +39,228899,,,,,,,,,,,,0.08200700581073761,,,,,, +39,228949,,,,,,,,,,,,0.0670526921749115,,,,,, +39,228999,,,,,,,,,,,,0.07919390499591827,,,,,, +39,229049,,,,,,,,,,,,0.07941645383834839,,,,,, +39,229099,,,,,,,,,,,,0.08921512216329575,,,,,, +39,229149,,,,,,,,,,,,0.08303922414779663,,,,,, +39,229199,,,,,,,,,,,,0.07901642471551895,,,,,, +39,229249,,,,,,,,,,,,0.06988687068223953,,,,,, +39,229299,,,,,,,,,,,,0.08682647347450256,,,,,, +39,229349,,,,,,,,,,,,0.06225422024726868,,,,,, +39,229399,,,,,,,,,,,,0.07902857661247253,,,,,, +39,229439,,,,,,,,,,,,,0.2403521090745926,0.08138463646173477,0.2426975667476654,0.012572705745697021,0.2402922809123993,0.08138463646173477 +39,229439,,,,,,,0.23132021725177765,0.0737851932644844,0.3293404281139374,0.10847342014312744,0.3091336786746979,,,,,,, +40,229449,,,,,,,,,,,,0.08953823894262314,,,,,, +40,229499,,,,,,,,,,,,0.08323503285646439,,,,,, +40,229549,,,,,,,,,,,,0.07844703644514084,,,,,, +40,229599,,,,,,,,,,,,0.0650038868188858,,,,,, +40,229649,,,,,,,,,,,,0.07359573990106583,,,,,, +40,229699,,,,,,,,,,,,0.07373933494091034,,,,,, +40,229749,,,,,,,,,,,,0.08827125281095505,,,,,, +40,229799,,,,,,,,,,,,0.07476639747619629,,,,,, +40,229849,,,,,,,,,,,,0.06639979779720306,,,,,, +40,229899,,,,,,,,,,,,0.07478255033493042,,,,,, +40,229949,,,,,,,,,,,,0.07231547683477402,,,,,, +40,229999,,,,,,,,,,,,0.07718490809202194,,,,,, +40,230049,,,,,,,,,,,,0.07524675130844116,,,,,, +40,230099,,,,,,,,,,,,0.06719886511564255,,,,,, +40,230149,,,,,,,,,,,,0.07248672842979431,,,,,, +40,230199,,,,,,,,,,,,0.07520878314971924,,,,,, +40,230249,,,,,,,,,,,,0.08430233597755432,,,,,, +40,230299,,,,,,,,,,,,0.07051082700490952,,,,,, +40,230349,,,,,,,,,,,,0.07784517109394073,,,,,, +40,230399,,,,,,,,,,,,0.06666058301925659,,,,,, +40,230449,,,,,,,,,,,,0.07332174479961395,,,,,, +40,230499,,,,,,,,,,,,0.07377894222736359,,,,,, +40,230549,,,,,,,,,,,,0.07251796126365662,,,,,, +40,230599,,,,,,,,,,,,0.06780743598937988,,,,,, +40,230649,,,,,,,,,,,,0.07397811114788055,,,,,, +40,230699,,,,,,,,,,,,0.079013392329216,,,,,, +40,230749,,,,,,,,,,,,0.08680639415979385,,,,,, +40,230799,,,,,,,,,,,,0.0752653032541275,,,,,, +40,230849,,,,,,,,,,,,0.07868610322475433,,,,,, +40,230899,,,,,,,,,,,,0.07505566626787186,,,,,, +40,230949,,,,,,,,,,,,0.07859102636575699,,,,,, +40,230999,,,,,,,,,,,,0.08061482012271881,,,,,, +40,231049,,,,,,,,,,,,0.06336573511362076,,,,,, +40,231099,,,,,,,,,,,,0.06548614054918289,,,,,, +40,231149,,,,,,,,,,,,0.07554079592227936,,,,,, +40,231199,,,,,,,,,,,,0.06850498914718628,,,,,, +40,231249,,,,,,,,,,,,0.07767850160598755,,,,,, +40,231299,,,,,,,,,,,,0.07659114897251129,,,,,, +40,231349,,,,,,,,,,,,0.07113929092884064,,,,,, +40,231399,,,,,,,,,,,,0.07979916036128998,,,,,, +40,231449,,,,,,,,,,,,0.07250894606113434,,,,,, +40,231499,,,,,,,,,,,,0.08194372057914734,,,,,, +40,231549,,,,,,,,,,,,0.07528974115848541,,,,,, +40,231599,,,,,,,,,,,,0.07737071812152863,,,,,, +40,231649,,,,,,,,,,,,0.07014106214046478,,,,,, +40,231699,,,,,,,,,,,,0.07270848751068115,,,,,, +40,231749,,,,,,,,,,,,0.07882948219776154,,,,,, +40,231799,,,,,,,,,,,,0.07478921860456467,,,,,, +40,231849,,,,,,,,,,,,0.0655125230550766,,,,,, +40,231899,,,,,,,,,,,,0.0751180350780487,,,,,, +40,231949,,,,,,,,,,,,0.06891877949237823,,,,,, +40,231999,,,,,,,,,,,,0.06821358948945999,,,,,, +40,232049,,,,,,,,,,,,0.07113789021968842,,,,,, +40,232099,,,,,,,,,,,,0.06461183726787567,,,,,, +40,232149,,,,,,,,,,,,0.07686065882444382,,,,,, +40,232199,,,,,,,,,,,,0.08064354956150055,,,,,, +40,232249,,,,,,,,,,,,0.08399845659732819,,,,,, +40,232299,,,,,,,,,,,,0.0673135370016098,,,,,, +40,232349,,,,,,,,,,,,0.08303587138652802,,,,,, +40,232399,,,,,,,,,,,,0.0606374628841877,,,,,, +40,232449,,,,,,,,,,,,0.07681824266910553,,,,,, +40,232499,,,,,,,,,,,,0.07643227279186249,,,,,, +40,232549,,,,,,,,,,,,0.07798853516578674,,,,,, +40,232599,,,,,,,,,,,,0.06610029935836792,,,,,, +40,232649,,,,,,,,,,,,0.06751865148544312,,,,,, +40,232699,,,,,,,,,,,,0.08211289346218109,,,,,, +40,232749,,,,,,,,,,,,0.0655997171998024,,,,,, +40,232799,,,,,,,,,,,,0.06189221516251564,,,,,, +40,232849,,,,,,,,,,,,0.07505524158477783,,,,,, +40,232899,,,,,,,,,,,,0.07468780875205994,,,,,, +40,232949,,,,,,,,,,,,0.07193255424499512,,,,,, +40,232999,,,,,,,,,,,,0.06662794947624207,,,,,, +40,233049,,,,,,,,,,,,0.07015308737754822,,,,,, +40,233099,,,,,,,,,,,,0.06993492692708969,,,,,, +40,233149,,,,,,,,,,,,0.06828171759843826,,,,,, +40,233199,,,,,,,,,,,,0.07031255960464478,,,,,, +40,233249,,,,,,,,,,,,0.0670146495103836,,,,,, +40,233299,,,,,,,,,,,,0.07216653227806091,,,,,, +40,233349,,,,,,,,,,,,0.06806548684835434,,,,,, +40,233399,,,,,,,,,,,,0.07756662368774414,,,,,, +40,233449,,,,,,,,,,,,0.07313850522041321,,,,,, +40,233499,,,,,,,,,,,,0.0767548531293869,,,,,, +40,233549,,,,,,,,,,,,0.07133626937866211,,,,,, +40,233599,,,,,,,,,,,,0.07123647630214691,,,,,, +40,233649,,,,,,,,,,,,0.07667984068393707,,,,,, +40,233699,,,,,,,,,,,,0.08350405842065811,,,,,, +40,233749,,,,,,,,,,,,0.06714830547571182,,,,,, +40,233799,,,,,,,,,,,,0.08166174590587616,,,,,, +40,233849,,,,,,,,,,,,0.07193401455879211,,,,,, +40,233899,,,,,,,,,,,,0.06951940059661865,,,,,, +40,233949,,,,,,,,,,,,0.07286512851715088,,,,,, +40,233999,,,,,,,,,,,,0.06607967615127563,,,,,, +40,234049,,,,,,,,,,,,0.0719975158572197,,,,,, +40,234099,,,,,,,,,,,,0.08299113810062408,,,,,, +40,234149,,,,,,,,,,,,0.06868281215429306,,,,,, +40,234199,,,,,,,,,,,,0.07430057227611542,,,,,, +40,234249,,,,,,,,,,,,0.0719473659992218,,,,,, +40,234299,,,,,,,,,,,,0.07843529433012009,,,,,, +40,234349,,,,,,,,,,,,0.07582226395606995,,,,,, +40,234399,,,,,,,,,,,,0.07087401300668716,,,,,, +40,234449,,,,,,,,,,,,0.07291251420974731,,,,,, +40,234499,,,,,,,,,,,,0.06322282552719116,,,,,, +40,234549,,,,,,,,,,,,0.07521773874759674,,,,,, +40,234599,,,,,,,,,,,,0.06738956272602081,,,,,, +40,234649,,,,,,,,,,,,0.07573522627353668,,,,,, +40,234699,,,,,,,,,,,,0.08114390075206757,,,,,, +40,234749,,,,,,,,,,,,0.0766310840845108,,,,,, +40,234799,,,,,,,,,,,,0.07083458453416824,,,,,, +40,234849,,,,,,,,,,,,0.06633211672306061,,,,,, +40,234899,,,,,,,,,,,,0.06593520194292068,,,,,, +40,234949,,,,,,,,,,,,0.08732515573501587,,,,,, +40,234999,,,,,,,,,,,,0.08086445927619934,,,,,, +40,235049,,,,,,,,,,,,0.07793980836868286,,,,,, +40,235099,,,,,,,,,,,,0.07986001670360565,,,,,, +40,235149,,,,,,,,,,,,0.07173624634742737,,,,,, +40,235175,,,,,,,,,,,,,0.24221326410770416,0.08181577175855637,0.19959911704063416,0.007341742515563965,0.19259501993656158,0.08181577175855637 +40,235175,,,,,,,0.23082204163074493,0.07353480905294418,0.3339000642299652,0.11148065328598022,0.3134807348251343,,,,,,, +41,235199,,,,,,,,,,,,0.08515790849924088,,,,,, +41,235249,,,,,,,,,,,,0.07290280610322952,,,,,, +41,235299,,,,,,,,,,,,0.08311988413333893,,,,,, +41,235349,,,,,,,,,,,,0.06935630738735199,,,,,, +41,235399,,,,,,,,,,,,0.06191154941916466,,,,,, +41,235449,,,,,,,,,,,,0.08419673144817352,,,,,, +41,235499,,,,,,,,,,,,0.06784483045339584,,,,,, +41,235549,,,,,,,,,,,,0.07283677160739899,,,,,, +41,235599,,,,,,,,,,,,0.07725231349468231,,,,,, +41,235649,,,,,,,,,,,,0.067497618496418,,,,,, +41,235699,,,,,,,,,,,,0.06952621787786484,,,,,, +41,235749,,,,,,,,,,,,0.07533825933933258,,,,,, +41,235799,,,,,,,,,,,,0.08638684451580048,,,,,, +41,235849,,,,,,,,,,,,0.07273466140031815,,,,,, +41,235899,,,,,,,,,,,,0.08688779920339584,,,,,, +41,235949,,,,,,,,,,,,0.08500637114048004,,,,,, +41,235999,,,,,,,,,,,,0.07776762545108795,,,,,, +41,236049,,,,,,,,,,,,0.07992582023143768,,,,,, +41,236099,,,,,,,,,,,,0.06785237789154053,,,,,, +41,236149,,,,,,,,,,,,0.06856342405080795,,,,,, +41,236199,,,,,,,,,,,,0.07110763341188431,,,,,, +41,236249,,,,,,,,,,,,0.06963015347719193,,,,,, +41,236299,,,,,,,,,,,,0.07539547979831696,,,,,, +41,236349,,,,,,,,,,,,0.07096472382545471,,,,,, +41,236399,,,,,,,,,,,,0.07531936466693878,,,,,, +41,236449,,,,,,,,,,,,0.07405072450637817,,,,,, +41,236499,,,,,,,,,,,,0.07350492477416992,,,,,, +41,236549,,,,,,,,,,,,0.06739014387130737,,,,,, +41,236599,,,,,,,,,,,,0.07047152519226074,,,,,, +41,236649,,,,,,,,,,,,0.07047982513904572,,,,,, +41,236699,,,,,,,,,,,,0.06691965460777283,,,,,, +41,236749,,,,,,,,,,,,0.07755440473556519,,,,,, +41,236799,,,,,,,,,,,,0.07146570831537247,,,,,, +41,236849,,,,,,,,,,,,0.07654404640197754,,,,,, +41,236899,,,,,,,,,,,,0.08538856357336044,,,,,, +41,236949,,,,,,,,,,,,0.08131976425647736,,,,,, +41,236999,,,,,,,,,,,,0.0761379599571228,,,,,, +41,237049,,,,,,,,,,,,0.07650280743837357,,,,,, +41,237099,,,,,,,,,,,,0.07100004702806473,,,,,, +41,237149,,,,,,,,,,,,0.07777604460716248,,,,,, +41,237199,,,,,,,,,,,,0.06666985154151917,,,,,, +41,237249,,,,,,,,,,,,0.07493278384208679,,,,,, +41,237299,,,,,,,,,,,,0.06317854672670364,,,,,, +41,237349,,,,,,,,,,,,0.06907420605421066,,,,,, +41,237399,,,,,,,,,,,,0.09291663020849228,,,,,, +41,237449,,,,,,,,,,,,0.06981858611106873,,,,,, +41,237499,,,,,,,,,,,,0.0618269219994545,,,,,, +41,237549,,,,,,,,,,,,0.0739421620965004,,,,,, +41,237599,,,,,,,,,,,,0.06832380592823029,,,,,, +41,237649,,,,,,,,,,,,0.06739145517349243,,,,,, +41,237699,,,,,,,,,,,,0.06484551727771759,,,,,, +41,237749,,,,,,,,,,,,0.06956105679273605,,,,,, +41,237799,,,,,,,,,,,,0.06962493807077408,,,,,, +41,237849,,,,,,,,,,,,0.08367049694061279,,,,,, +41,237899,,,,,,,,,,,,0.07346226274967194,,,,,, +41,237949,,,,,,,,,,,,0.07315091788768768,,,,,, +41,237999,,,,,,,,,,,,0.07297532260417938,,,,,, +41,238049,,,,,,,,,,,,0.07814139127731323,,,,,, +41,238099,,,,,,,,,,,,0.08109787851572037,,,,,, +41,238149,,,,,,,,,,,,0.0732702910900116,,,,,, +41,238199,,,,,,,,,,,,0.06977646052837372,,,,,, +41,238249,,,,,,,,,,,,0.07609926164150238,,,,,, +41,238299,,,,,,,,,,,,0.07365809381008148,,,,,, +41,238349,,,,,,,,,,,,0.08939643204212189,,,,,, +41,238399,,,,,,,,,,,,0.07234182953834534,,,,,, +41,238449,,,,,,,,,,,,0.0744968056678772,,,,,, +41,238499,,,,,,,,,,,,0.07107199728488922,,,,,, +41,238549,,,,,,,,,,,,0.08397161960601807,,,,,, +41,238599,,,,,,,,,,,,0.07952387630939484,,,,,, +41,238649,,,,,,,,,,,,0.07749851047992706,,,,,, +41,238699,,,,,,,,,,,,0.07002235949039459,,,,,, +41,238749,,,,,,,,,,,,0.09135422110557556,,,,,, +41,238799,,,,,,,,,,,,0.07838724553585052,,,,,, +41,238849,,,,,,,,,,,,0.07469675689935684,,,,,, +41,238899,,,,,,,,,,,,0.07681449502706528,,,,,, +41,238949,,,,,,,,,,,,0.0754149854183197,,,,,, +41,238999,,,,,,,,,,,,0.062370046973228455,,,,,, +41,239049,,,,,,,,,,,,0.06745795905590057,,,,,, +41,239099,,,,,,,,,,,,0.0629252940416336,,,,,, +41,239149,,,,,,,,,,,,0.07666034996509552,,,,,, +41,239199,,,,,,,,,,,,0.07245434820652008,,,,,, +41,239249,,,,,,,,,,,,0.08085815608501434,,,,,, +41,239299,,,,,,,,,,,,0.07645180821418762,,,,,, +41,239349,,,,,,,,,,,,0.07176613062620163,,,,,, +41,239399,,,,,,,,,,,,0.07301679253578186,,,,,, +41,239449,,,,,,,,,,,,0.07000727951526642,,,,,, +41,239499,,,,,,,,,,,,0.05975468456745148,,,,,, +41,239549,,,,,,,,,,,,0.07204556465148926,,,,,, +41,239599,,,,,,,,,,,,0.07685919106006622,,,,,, +41,239649,,,,,,,,,,,,0.07227174937725067,,,,,, +41,239699,,,,,,,,,,,,0.07282454520463943,,,,,, +41,239749,,,,,,,,,,,,0.07750353217124939,,,,,, +41,239799,,,,,,,,,,,,0.06580065190792084,,,,,, +41,239849,,,,,,,,,,,,0.07762348651885986,,,,,, +41,239899,,,,,,,,,,,,0.0762844979763031,,,,,, +41,239949,,,,,,,,,,,,0.07061795890331268,,,,,, +41,239999,,,,,,,,,,,,0.07770593464374542,,,,,, +41,240049,,,,,,,,,,,,0.06331805884838104,,,,,, +41,240099,,,,,,,,,,,,0.0647670328617096,,,,,, +41,240149,,,,,,,,,,,,0.06611499190330505,,,,,, +41,240199,,,,,,,,,,,,0.07810729742050171,,,,,, +41,240249,,,,,,,,,,,,0.07798387110233307,,,,,, +41,240299,,,,,,,,,,,,0.06264467537403107,,,,,, +41,240349,,,,,,,,,,,,0.0750841498374939,,,,,, +41,240399,,,,,,,,,,,,0.07610784471035004,,,,,, +41,240449,,,,,,,,,,,,0.07417763769626617,,,,,, +41,240499,,,,,,,,,,,,0.06860969960689545,,,,,, +41,240549,,,,,,,,,,,,0.07848596572875977,,,,,, +41,240599,,,,,,,,,,,,0.07976951450109482,,,,,, +41,240649,,,,,,,,,,,,0.07862445712089539,,,,,, +41,240699,,,,,,,,,,,,0.06521084904670715,,,,,, +41,240749,,,,,,,,,,,,0.06972998380661011,,,,,, +41,240799,,,,,,,,,,,,0.0797191858291626,,,,,, +41,240849,,,,,,,,,,,,0.0781785175204277,,,,,, +41,240899,,,,,,,,,,,,0.083054319024086,,,,,, +41,240911,,,,,,,,,,,,,0.24249015748500824,0.08181549608707428,0.19526106119155884,0.0073451995849609375,0.1846742331981659,0.08181549608707428 +41,240911,,,,,,,0.23070013523101807,0.073457732796669,0.33529114723205566,0.11242139339447021,0.31549787521362305,,,,,,, +42,240949,,,,,,,,,,,,0.06447087973356247,,,,,, +42,240999,,,,,,,,,,,,0.06389650702476501,,,,,, +42,241049,,,,,,,,,,,,0.08365876972675323,,,,,, +42,241099,,,,,,,,,,,,0.0742286890745163,,,,,, +42,241149,,,,,,,,,,,,0.07646007835865021,,,,,, +42,241199,,,,,,,,,,,,0.05902685597538948,,,,,, +42,241249,,,,,,,,,,,,0.07812854647636414,,,,,, +42,241299,,,,,,,,,,,,0.06532377749681473,,,,,, +42,241349,,,,,,,,,,,,0.07704080641269684,,,,,, +42,241399,,,,,,,,,,,,0.07022855430841446,,,,,, +42,241449,,,,,,,,,,,,0.07681338489055634,,,,,, +42,241499,,,,,,,,,,,,0.07371296733617783,,,,,, +42,241549,,,,,,,,,,,,0.07827875763177872,,,,,, +42,241599,,,,,,,,,,,,0.07490625977516174,,,,,, +42,241649,,,,,,,,,,,,0.06181870028376579,,,,,, +42,241699,,,,,,,,,,,,0.0807039737701416,,,,,, +42,241749,,,,,,,,,,,,0.07403627783060074,,,,,, +42,241799,,,,,,,,,,,,0.06862983107566833,,,,,, +42,241849,,,,,,,,,,,,0.07857311517000198,,,,,, +42,241899,,,,,,,,,,,,0.07053956389427185,,,,,, +42,241949,,,,,,,,,,,,0.08306892216205597,,,,,, +42,241999,,,,,,,,,,,,0.07609634101390839,,,,,, +42,242049,,,,,,,,,,,,0.08358245342969894,,,,,, +42,242099,,,,,,,,,,,,0.07140444219112396,,,,,, +42,242149,,,,,,,,,,,,0.07724899053573608,,,,,, +42,242199,,,,,,,,,,,,0.0931098684668541,,,,,, +42,242249,,,,,,,,,,,,0.06928722560405731,,,,,, +42,242299,,,,,,,,,,,,0.05271684378385544,,,,,, +42,242349,,,,,,,,,,,,0.07369973510503769,,,,,, +42,242399,,,,,,,,,,,,0.07031773030757904,,,,,, +42,242449,,,,,,,,,,,,0.07687429338693619,,,,,, +42,242499,,,,,,,,,,,,0.07410788536071777,,,,,, +42,242549,,,,,,,,,,,,0.07501214742660522,,,,,, +42,242599,,,,,,,,,,,,0.06975865364074707,,,,,, +42,242649,,,,,,,,,,,,0.0752551406621933,,,,,, +42,242699,,,,,,,,,,,,0.08406917750835419,,,,,, +42,242749,,,,,,,,,,,,0.07238879054784775,,,,,, +42,242799,,,,,,,,,,,,0.08797146379947662,,,,,, +42,242849,,,,,,,,,,,,0.07035695016384125,,,,,, +42,242899,,,,,,,,,,,,0.08076868951320648,,,,,, +42,242949,,,,,,,,,,,,0.08404157310724258,,,,,, +42,242999,,,,,,,,,,,,0.09143775701522827,,,,,, +42,243049,,,,,,,,,,,,0.07155963778495789,,,,,, +42,243099,,,,,,,,,,,,0.07324659824371338,,,,,, +42,243149,,,,,,,,,,,,0.0776311606168747,,,,,, +42,243199,,,,,,,,,,,,0.06117534264922142,,,,,, +42,243249,,,,,,,,,,,,0.07500346750020981,,,,,, +42,243299,,,,,,,,,,,,0.07286196947097778,,,,,, +42,243349,,,,,,,,,,,,0.06636401265859604,,,,,, +42,243399,,,,,,,,,,,,0.07586370408535004,,,,,, +42,243449,,,,,,,,,,,,0.06667375564575195,,,,,, +42,243499,,,,,,,,,,,,0.08033920079469681,,,,,, +42,243549,,,,,,,,,,,,0.06718035787343979,,,,,, +42,243599,,,,,,,,,,,,0.07514861971139908,,,,,, +42,243649,,,,,,,,,,,,0.06846358627080917,,,,,, +42,243699,,,,,,,,,,,,0.07744579762220383,,,,,, +42,243749,,,,,,,,,,,,0.07404293864965439,,,,,, +42,243799,,,,,,,,,,,,0.07990670949220657,,,,,, +42,243849,,,,,,,,,,,,0.0785609781742096,,,,,, +42,243899,,,,,,,,,,,,0.07337767630815506,,,,,, +42,243949,,,,,,,,,,,,0.06331463158130646,,,,,, +42,243999,,,,,,,,,,,,0.07151045650243759,,,,,, +42,244049,,,,,,,,,,,,0.07879612594842911,,,,,, +42,244099,,,,,,,,,,,,0.07747959345579147,,,,,, +42,244149,,,,,,,,,,,,0.07507205009460449,,,,,, +42,244199,,,,,,,,,,,,0.06503063440322876,,,,,, +42,244249,,,,,,,,,,,,0.06822144985198975,,,,,, +42,244299,,,,,,,,,,,,0.07727119326591492,,,,,, +42,244349,,,,,,,,,,,,0.066287562251091,,,,,, +42,244399,,,,,,,,,,,,0.07634906470775604,,,,,, +42,244449,,,,,,,,,,,,0.07600827515125275,,,,,, +42,244499,,,,,,,,,,,,0.07870414853096008,,,,,, +42,244549,,,,,,,,,,,,0.07582041621208191,,,,,, +42,244599,,,,,,,,,,,,0.07433388382196426,,,,,, +42,244649,,,,,,,,,,,,0.06564460694789886,,,,,, +42,244699,,,,,,,,,,,,0.074037104845047,,,,,, +42,244749,,,,,,,,,,,,0.07366728037595749,,,,,, +42,244799,,,,,,,,,,,,0.07329833507537842,,,,,, +42,244849,,,,,,,,,,,,0.07660272717475891,,,,,, +42,244899,,,,,,,,,,,,0.06753989309072495,,,,,, +42,244949,,,,,,,,,,,,0.07129744440317154,,,,,, +42,244999,,,,,,,,,,,,0.07521180808544159,,,,,, +42,245049,,,,,,,,,,,,0.06908702105283737,,,,,, +42,245099,,,,,,,,,,,,0.0678391233086586,,,,,, +42,245149,,,,,,,,,,,,0.08203127980232239,,,,,, +42,245199,,,,,,,,,,,,0.07734203338623047,,,,,, +42,245249,,,,,,,,,,,,0.08296498656272888,,,,,, +42,245299,,,,,,,,,,,,0.07076254487037659,,,,,, +42,245349,,,,,,,,,,,,0.07098202407360077,,,,,, +42,245399,,,,,,,,,,,,0.06869334727525711,,,,,, +42,245449,,,,,,,,,,,,0.06770730018615723,,,,,, +42,245499,,,,,,,,,,,,0.06918297708034515,,,,,, +42,245549,,,,,,,,,,,,0.0786987692117691,,,,,, +42,245599,,,,,,,,,,,,0.07198349386453629,,,,,, +42,245649,,,,,,,,,,,,0.07112319767475128,,,,,, +42,245699,,,,,,,,,,,,0.07778936624526978,,,,,, +42,245749,,,,,,,,,,,,0.07421091198921204,,,,,, +42,245799,,,,,,,,,,,,0.07173296064138412,,,,,, +42,245849,,,,,,,,,,,,0.07278480380773544,,,,,, +42,245899,,,,,,,,,,,,0.07600004971027374,,,,,, +42,245949,,,,,,,,,,,,0.07750245928764343,,,,,, +42,245999,,,,,,,,,,,,0.07452830672264099,,,,,, +42,246049,,,,,,,,,,,,0.06198679655790329,,,,,, +42,246099,,,,,,,,,,,,0.07553283870220184,,,,,, +42,246149,,,,,,,,,,,,0.07737237215042114,,,,,, +42,246199,,,,,,,,,,,,0.07986488938331604,,,,,, +42,246249,,,,,,,,,,,,0.08036436885595322,,,,,, +42,246299,,,,,,,,,,,,0.07874281704425812,,,,,, +42,246349,,,,,,,,,,,,0.06972356885671616,,,,,, +42,246399,,,,,,,,,,,,0.06946058571338654,,,,,, +42,246449,,,,,,,,,,,,0.0718742236495018,,,,,, +42,246499,,,,,,,,,,,,0.07304807752370834,,,,,, +42,246549,,,,,,,,,,,,0.07305249571800232,,,,,, +42,246599,,,,,,,,,,,,0.08962976932525635,,,,,, +42,246647,,,,,,,,,,,,,0.24182634055614471,0.08262375742197037,0.22933846712112427,-0.0024614334106445312,0.22311164438724518,0.08262375742197037 +42,246647,,,,,,,0.23055420815944672,0.07338897138834,0.33653080463409424,0.11324465274810791,0.3156616687774658,,,,,,, +43,246649,,,,,,,,,,,,0.07292047142982483,,,,,, +43,246699,,,,,,,,,,,,0.07219254970550537,,,,,, +43,246749,,,,,,,,,,,,0.07083158195018768,,,,,, +43,246799,,,,,,,,,,,,0.07107612490653992,,,,,, +43,246849,,,,,,,,,,,,0.06823107600212097,,,,,, +43,246899,,,,,,,,,,,,0.07381262630224228,,,,,, +43,246949,,,,,,,,,,,,0.05903645604848862,,,,,, +43,246999,,,,,,,,,,,,0.07109217345714569,,,,,, +43,247049,,,,,,,,,,,,0.07055467367172241,,,,,, +43,247099,,,,,,,,,,,,0.0715622827410698,,,,,, +43,247149,,,,,,,,,,,,0.06778960675001144,,,,,, +43,247199,,,,,,,,,,,,0.0879325270652771,,,,,, +43,247249,,,,,,,,,,,,0.08623592555522919,,,,,, +43,247299,,,,,,,,,,,,0.07212964445352554,,,,,, +43,247349,,,,,,,,,,,,0.06856220960617065,,,,,, +43,247399,,,,,,,,,,,,0.06454692780971527,,,,,, +43,247449,,,,,,,,,,,,0.07332417368888855,,,,,, +43,247499,,,,,,,,,,,,0.06981770694255829,,,,,, +43,247549,,,,,,,,,,,,0.0726161077618599,,,,,, +43,247599,,,,,,,,,,,,0.08413861691951752,,,,,, +43,247649,,,,,,,,,,,,0.07690796256065369,,,,,, +43,247699,,,,,,,,,,,,0.0729139894247055,,,,,, +43,247749,,,,,,,,,,,,0.0809689611196518,,,,,, +43,247799,,,,,,,,,,,,0.06205936521291733,,,,,, +43,247849,,,,,,,,,,,,0.07822370529174805,,,,,, +43,247899,,,,,,,,,,,,0.07323627173900604,,,,,, +43,247949,,,,,,,,,,,,0.06723354756832123,,,,,, +43,247999,,,,,,,,,,,,0.08059227466583252,,,,,, +43,248049,,,,,,,,,,,,0.06175734102725983,,,,,, +43,248099,,,,,,,,,,,,0.07084131240844727,,,,,, +43,248149,,,,,,,,,,,,0.07092367112636566,,,,,, +43,248199,,,,,,,,,,,,0.0861082375049591,,,,,, +43,248249,,,,,,,,,,,,0.07618612796068192,,,,,, +43,248299,,,,,,,,,,,,0.07285317778587341,,,,,, +43,248349,,,,,,,,,,,,0.07865886390209198,,,,,, +43,248399,,,,,,,,,,,,0.0758947879076004,,,,,, +43,248449,,,,,,,,,,,,0.0725787952542305,,,,,, +43,248499,,,,,,,,,,,,0.07249237596988678,,,,,, +43,248549,,,,,,,,,,,,0.07358609884977341,,,,,, +43,248599,,,,,,,,,,,,0.06525822728872299,,,,,, +43,248649,,,,,,,,,,,,0.08435596525669098,,,,,, +43,248699,,,,,,,,,,,,0.07602876424789429,,,,,, +43,248749,,,,,,,,,,,,0.06259673833847046,,,,,, +43,248799,,,,,,,,,,,,0.07592688500881195,,,,,, +43,248849,,,,,,,,,,,,0.060676269233226776,,,,,, +43,248899,,,,,,,,,,,,0.0827799141407013,,,,,, +43,248949,,,,,,,,,,,,0.07556901127099991,,,,,, +43,248999,,,,,,,,,,,,0.0712624043226242,,,,,, +43,249049,,,,,,,,,,,,0.07753083109855652,,,,,, +43,249099,,,,,,,,,,,,0.08037224411964417,,,,,, +43,249149,,,,,,,,,,,,0.06747955083847046,,,,,, +43,249199,,,,,,,,,,,,0.08069144189357758,,,,,, +43,249249,,,,,,,,,,,,0.0779188871383667,,,,,, +43,249299,,,,,,,,,,,,0.06283421814441681,,,,,, +43,249349,,,,,,,,,,,,0.05978245288133621,,,,,, +43,249399,,,,,,,,,,,,0.07412324845790863,,,,,, +43,249449,,,,,,,,,,,,0.07841330766677856,,,,,, +43,249499,,,,,,,,,,,,0.06511636078357697,,,,,, +43,249549,,,,,,,,,,,,0.06644898653030396,,,,,, +43,249599,,,,,,,,,,,,0.07927922904491425,,,,,, +43,249649,,,,,,,,,,,,0.07790408283472061,,,,,, +43,249699,,,,,,,,,,,,0.07838884741067886,,,,,, +43,249749,,,,,,,,,,,,0.08399911224842072,,,,,, +43,249799,,,,,,,,,,,,0.0732802003622055,,,,,, +43,249849,,,,,,,,,,,,0.07699662446975708,,,,,, +43,249899,,,,,,,,,,,,0.07782040536403656,,,,,, +43,249949,,,,,,,,,,,,0.06200338900089264,,,,,, +43,249999,,,,,,,,,,,,0.06933195888996124,,,,,, +43,250049,,,,,,,,,,,,0.07591471076011658,,,,,, +43,250099,,,,,,,,,,,,0.08114311099052429,,,,,, +43,250149,,,,,,,,,,,,0.07651618123054504,,,,,, +43,250199,,,,,,,,,,,,0.07855922728776932,,,,,, +43,250249,,,,,,,,,,,,0.0692901611328125,,,,,, +43,250299,,,,,,,,,,,,0.08288495242595673,,,,,, +43,250349,,,,,,,,,,,,0.0620541125535965,,,,,, +43,250399,,,,,,,,,,,,0.06469646841287613,,,,,, +43,250449,,,,,,,,,,,,0.08373105525970459,,,,,, +43,250499,,,,,,,,,,,,0.07373694330453873,,,,,, +43,250549,,,,,,,,,,,,0.06277099996805191,,,,,, +43,250599,,,,,,,,,,,,0.06625590473413467,,,,,, +43,250649,,,,,,,,,,,,0.07337485253810883,,,,,, +43,250699,,,,,,,,,,,,0.07904674112796783,,,,,, +43,250749,,,,,,,,,,,,0.06762699037790298,,,,,, +43,250799,,,,,,,,,,,,0.09320999681949615,,,,,, +43,250849,,,,,,,,,,,,0.07095107436180115,,,,,, +43,250899,,,,,,,,,,,,0.07878454774618149,,,,,, +43,250949,,,,,,,,,,,,0.08148398995399475,,,,,, +43,250999,,,,,,,,,,,,0.07488875091075897,,,,,, +43,251049,,,,,,,,,,,,0.07591767609119415,,,,,, +43,251099,,,,,,,,,,,,0.05935223773121834,,,,,, +43,251149,,,,,,,,,,,,0.07856094092130661,,,,,, +43,251199,,,,,,,,,,,,0.06451646983623505,,,,,, +43,251249,,,,,,,,,,,,0.07778170704841614,,,,,, +43,251299,,,,,,,,,,,,0.0674804300069809,,,,,, +43,251349,,,,,,,,,,,,0.07208941876888275,,,,,, +43,251399,,,,,,,,,,,,0.05734378471970558,,,,,, +43,251449,,,,,,,,,,,,0.08669577538967133,,,,,, +43,251499,,,,,,,,,,,,0.08237096667289734,,,,,, +43,251549,,,,,,,,,,,,0.06248052045702934,,,,,, +43,251599,,,,,,,,,,,,0.07120151072740555,,,,,, +43,251649,,,,,,,,,,,,0.08556229621171951,,,,,, +43,251699,,,,,,,,,,,,0.07460524141788483,,,,,, +43,251749,,,,,,,,,,,,0.07442523539066315,,,,,, +43,251799,,,,,,,,,,,,0.07903451472520828,,,,,, +43,251849,,,,,,,,,,,,0.06995359063148499,,,,,, +43,251899,,,,,,,,,,,,0.08230513334274292,,,,,, +43,251949,,,,,,,,,,,,0.07864094525575638,,,,,, +43,251999,,,,,,,,,,,,0.063886359333992,,,,,, +43,252049,,,,,,,,,,,,0.08037140965461731,,,,,, +43,252099,,,,,,,,,,,,0.06698495149612427,,,,,, +43,252149,,,,,,,,,,,,0.07420676946640015,,,,,, +43,252199,,,,,,,,,,,,0.07877181470394135,,,,,, +43,252249,,,,,,,,,,,,0.07821203768253326,,,,,, +43,252299,,,,,,,,,,,,0.08343617618083954,,,,,, +43,252349,,,,,,,,,,,,0.0826616883277893,,,,,, +43,252383,,,,,,,,,,,,,0.24490290880203247,0.0844741091132164,0.16353659331798553,-0.02491140365600586,0.15896689891815186,0.0844741091132164 +43,252383,,,,,,,0.2304435521364212,0.07334555685520172,0.33730873465538025,0.11376988887786865,0.3170815110206604,,,,,,, +44,252399,,,,,,,,,,,,0.07518923282623291,,,,,, +44,252449,,,,,,,,,,,,0.07191456109285355,,,,,, +44,252499,,,,,,,,,,,,0.06899720430374146,,,,,, +44,252549,,,,,,,,,,,,0.0718650072813034,,,,,, +44,252599,,,,,,,,,,,,0.07898460328578949,,,,,, +44,252649,,,,,,,,,,,,0.06857705116271973,,,,,, +44,252699,,,,,,,,,,,,0.08167947828769684,,,,,, +44,252749,,,,,,,,,,,,0.08183664828538895,,,,,, +44,252799,,,,,,,,,,,,0.06407026946544647,,,,,, +44,252849,,,,,,,,,,,,0.06700257956981659,,,,,, +44,252899,,,,,,,,,,,,0.08058074861764908,,,,,, +44,252949,,,,,,,,,,,,0.06584383547306061,,,,,, +44,252999,,,,,,,,,,,,0.0758727565407753,,,,,, +44,253049,,,,,,,,,,,,0.07853353023529053,,,,,, +44,253099,,,,,,,,,,,,0.06714379787445068,,,,,, +44,253149,,,,,,,,,,,,0.07320598512887955,,,,,, +44,253199,,,,,,,,,,,,0.07819779217243195,,,,,, +44,253249,,,,,,,,,,,,0.07575497031211853,,,,,, +44,253299,,,,,,,,,,,,0.07585091888904572,,,,,, +44,253349,,,,,,,,,,,,0.07881298661231995,,,,,, +44,253399,,,,,,,,,,,,0.07733908295631409,,,,,, +44,253449,,,,,,,,,,,,0.07236555218696594,,,,,, +44,253499,,,,,,,,,,,,0.07255331426858902,,,,,, +44,253549,,,,,,,,,,,,0.07560591399669647,,,,,, +44,253599,,,,,,,,,,,,0.07694092392921448,,,,,, +44,253649,,,,,,,,,,,,0.07137027382850647,,,,,, +44,253699,,,,,,,,,,,,0.07438839226961136,,,,,, +44,253749,,,,,,,,,,,,0.07537166774272919,,,,,, +44,253799,,,,,,,,,,,,0.06895037740468979,,,,,, +44,253849,,,,,,,,,,,,0.07838480174541473,,,,,, +44,253899,,,,,,,,,,,,0.08546901494264603,,,,,, +44,253949,,,,,,,,,,,,0.06475766003131866,,,,,, +44,253999,,,,,,,,,,,,0.07796145230531693,,,,,, +44,254049,,,,,,,,,,,,0.07508812099695206,,,,,, +44,254099,,,,,,,,,,,,0.07528242468833923,,,,,, +44,254149,,,,,,,,,,,,0.07138131558895111,,,,,, +44,254199,,,,,,,,,,,,0.062342554330825806,,,,,, +44,254249,,,,,,,,,,,,0.05996096879243851,,,,,, +44,254299,,,,,,,,,,,,0.08188232779502869,,,,,, +44,254349,,,,,,,,,,,,0.06367171555757523,,,,,, +44,254399,,,,,,,,,,,,0.06653338670730591,,,,,, +44,254449,,,,,,,,,,,,0.08534641563892365,,,,,, +44,254499,,,,,,,,,,,,0.0777181014418602,,,,,, +44,254549,,,,,,,,,,,,0.07567624747753143,,,,,, +44,254599,,,,,,,,,,,,0.05818998068571091,,,,,, +44,254649,,,,,,,,,,,,0.07650462538003922,,,,,, +44,254699,,,,,,,,,,,,0.07739488780498505,,,,,, +44,254749,,,,,,,,,,,,0.06493347883224487,,,,,, +44,254799,,,,,,,,,,,,0.06655704975128174,,,,,, +44,254849,,,,,,,,,,,,0.08787417411804199,,,,,, +44,254899,,,,,,,,,,,,0.07366770505905151,,,,,, +44,254949,,,,,,,,,,,,0.0791017934679985,,,,,, +44,254999,,,,,,,,,,,,0.07149182260036469,,,,,, +44,255049,,,,,,,,,,,,0.07711394131183624,,,,,, +44,255099,,,,,,,,,,,,0.07310714572668076,,,,,, +44,255149,,,,,,,,,,,,0.0756930410861969,,,,,, +44,255199,,,,,,,,,,,,0.08539421856403351,,,,,, +44,255249,,,,,,,,,,,,0.06872391700744629,,,,,, +44,255299,,,,,,,,,,,,0.08009965717792511,,,,,, +44,255349,,,,,,,,,,,,0.07374176383018494,,,,,, +44,255399,,,,,,,,,,,,0.06361321359872818,,,,,, +44,255449,,,,,,,,,,,,0.0759541243314743,,,,,, +44,255499,,,,,,,,,,,,0.07992711663246155,,,,,, +44,255549,,,,,,,,,,,,0.06978872418403625,,,,,, +44,255599,,,,,,,,,,,,0.07988308370113373,,,,,, +44,255649,,,,,,,,,,,,0.07433103024959564,,,,,, +44,255699,,,,,,,,,,,,0.06843356788158417,,,,,, +44,255749,,,,,,,,,,,,0.06786040961742401,,,,,, +44,255799,,,,,,,,,,,,0.07208555936813354,,,,,, +44,255849,,,,,,,,,,,,0.08360838890075684,,,,,, +44,255899,,,,,,,,,,,,0.06438849866390228,,,,,, +44,255949,,,,,,,,,,,,0.0729224681854248,,,,,, +44,255999,,,,,,,,,,,,0.07197290658950806,,,,,, +44,256049,,,,,,,,,,,,0.06463946402072906,,,,,, +44,256099,,,,,,,,,,,,0.07534100860357285,,,,,, +44,256149,,,,,,,,,,,,0.07909096777439117,,,,,, +44,256199,,,,,,,,,,,,0.07508672773838043,,,,,, +44,256249,,,,,,,,,,,,0.0637710839509964,,,,,, +44,256299,,,,,,,,,,,,0.07570415735244751,,,,,, +44,256349,,,,,,,,,,,,0.06532685458660126,,,,,, +44,256399,,,,,,,,,,,,0.08507495373487473,,,,,, +44,256449,,,,,,,,,,,,0.08550713956356049,,,,,, +44,256499,,,,,,,,,,,,0.07462286949157715,,,,,, +44,256549,,,,,,,,,,,,0.06821127980947495,,,,,, +44,256599,,,,,,,,,,,,0.07151266187429428,,,,,, +44,256649,,,,,,,,,,,,0.06815552711486816,,,,,, +44,256699,,,,,,,,,,,,0.07770512998104095,,,,,, +44,256749,,,,,,,,,,,,0.06992608308792114,,,,,, +44,256799,,,,,,,,,,,,0.07841592282056808,,,,,, +44,256849,,,,,,,,,,,,0.07346208393573761,,,,,, +44,256899,,,,,,,,,,,,0.07122242450714111,,,,,, +44,256949,,,,,,,,,,,,0.07683204114437103,,,,,, +44,256999,,,,,,,,,,,,0.06803211569786072,,,,,, +44,257049,,,,,,,,,,,,0.08310183882713318,,,,,, +44,257099,,,,,,,,,,,,0.07447084784507751,,,,,, +44,257149,,,,,,,,,,,,0.07236288487911224,,,,,, +44,257199,,,,,,,,,,,,0.065437912940979,,,,,, +44,257249,,,,,,,,,,,,0.07409697026014328,,,,,, +44,257299,,,,,,,,,,,,0.0687633603811264,,,,,, +44,257349,,,,,,,,,,,,0.07680995762348175,,,,,, +44,257399,,,,,,,,,,,,0.07525864988565445,,,,,, +44,257449,,,,,,,,,,,,0.07684507966041565,,,,,, +44,257499,,,,,,,,,,,,0.0700094997882843,,,,,, +44,257549,,,,,,,,,,,,0.07768501341342926,,,,,, +44,257599,,,,,,,,,,,,0.08379463851451874,,,,,, +44,257649,,,,,,,,,,,,0.07065530121326447,,,,,, +44,257699,,,,,,,,,,,,0.07375849783420563,,,,,, +44,257749,,,,,,,,,,,,0.07077682018280029,,,,,, +44,257799,,,,,,,,,,,,0.0697312206029892,,,,,, +44,257849,,,,,,,,,,,,0.07783438265323639,,,,,, +44,257899,,,,,,,,,,,,0.08290010690689087,,,,,, +44,257949,,,,,,,,,,,,0.07179751992225647,,,,,, +44,257999,,,,,,,,,,,,0.07047906517982483,,,,,, +44,258049,,,,,,,,,,,,0.07147697359323502,,,,,, +44,258099,,,,,,,,,,,,0.0780244842171669,,,,,, +44,258119,,,,,,,,,,,,,0.24126893281936646,0.08136426657438278,0.21534405648708344,0.012819826602935791,0.20913539826869965,0.08136426657438278 +44,258119,,,,,,,0.23047171533107758,0.0733407512307167,0.3373948931694031,0.11383366584777832,0.31680452823638916,,,,,,, +45,258149,,,,,,,,,,,,0.07548075169324875,,,,,, +45,258199,,,,,,,,,,,,0.06956690549850464,,,,,, +45,258249,,,,,,,,,,,,0.06466774642467499,,,,,, +45,258299,,,,,,,,,,,,0.06813205033540726,,,,,, +45,258349,,,,,,,,,,,,0.06678526103496552,,,,,, +45,258399,,,,,,,,,,,,0.0711006447672844,,,,,, +45,258449,,,,,,,,,,,,0.07878822088241577,,,,,, +45,258499,,,,,,,,,,,,0.06052657216787338,,,,,, +45,258549,,,,,,,,,,,,0.08329722285270691,,,,,, +45,258599,,,,,,,,,,,,0.07891825586557388,,,,,, +45,258649,,,,,,,,,,,,0.08587495982646942,,,,,, +45,258699,,,,,,,,,,,,0.08119984716176987,,,,,, +45,258749,,,,,,,,,,,,0.07913273572921753,,,,,, +45,258799,,,,,,,,,,,,0.06863740086555481,,,,,, +45,258849,,,,,,,,,,,,0.0828157365322113,,,,,, +45,258899,,,,,,,,,,,,0.07760485261678696,,,,,, +45,258949,,,,,,,,,,,,0.07422662526369095,,,,,, +45,258999,,,,,,,,,,,,0.067405104637146,,,,,, +45,259049,,,,,,,,,,,,0.07837450504302979,,,,,, +45,259099,,,,,,,,,,,,0.06808676570653915,,,,,, +45,259149,,,,,,,,,,,,0.07737861573696136,,,,,, +45,259199,,,,,,,,,,,,0.06794305890798569,,,,,, +45,259249,,,,,,,,,,,,0.07362600415945053,,,,,, +45,259299,,,,,,,,,,,,0.07243730127811432,,,,,, +45,259349,,,,,,,,,,,,0.07614169269800186,,,,,, +45,259399,,,,,,,,,,,,0.06486452370882034,,,,,, +45,259449,,,,,,,,,,,,0.062295544892549515,,,,,, +45,259499,,,,,,,,,,,,0.07231241464614868,,,,,, +45,259549,,,,,,,,,,,,0.07127846777439117,,,,,, +45,259599,,,,,,,,,,,,0.07042762637138367,,,,,, +45,259649,,,,,,,,,,,,0.07597580552101135,,,,,, +45,259699,,,,,,,,,,,,0.06964445114135742,,,,,, +45,259749,,,,,,,,,,,,0.07163818180561066,,,,,, +45,259799,,,,,,,,,,,,0.08820384740829468,,,,,, +45,259849,,,,,,,,,,,,0.07544799894094467,,,,,, +45,259899,,,,,,,,,,,,0.05930618196725845,,,,,, +45,259949,,,,,,,,,,,,0.07082168757915497,,,,,, +45,259999,,,,,,,,,,,,0.08222134411334991,,,,,, +45,260049,,,,,,,,,,,,0.07184961438179016,,,,,, +45,260099,,,,,,,,,,,,0.0740700364112854,,,,,, +45,260149,,,,,,,,,,,,0.06540753692388535,,,,,, +45,260199,,,,,,,,,,,,0.07316035032272339,,,,,, +45,260249,,,,,,,,,,,,0.08216191828250885,,,,,, +45,260299,,,,,,,,,,,,0.07224897295236588,,,,,, +45,260349,,,,,,,,,,,,0.0701151043176651,,,,,, +45,260399,,,,,,,,,,,,0.07125911861658096,,,,,, +45,260449,,,,,,,,,,,,0.07053087651729584,,,,,, +45,260499,,,,,,,,,,,,0.07142698019742966,,,,,, +45,260549,,,,,,,,,,,,0.07711068540811539,,,,,, +45,260599,,,,,,,,,,,,0.0780709832906723,,,,,, +45,260649,,,,,,,,,,,,0.07715536653995514,,,,,, +45,260699,,,,,,,,,,,,0.06857641041278839,,,,,, +45,260749,,,,,,,,,,,,0.06647005677223206,,,,,, +45,260799,,,,,,,,,,,,0.06695370376110077,,,,,, +45,260849,,,,,,,,,,,,0.07812215387821198,,,,,, +45,260899,,,,,,,,,,,,0.08319690823554993,,,,,, +45,260949,,,,,,,,,,,,0.06437122076749802,,,,,, +45,260999,,,,,,,,,,,,0.07772013545036316,,,,,, +45,261049,,,,,,,,,,,,0.07453382760286331,,,,,, +45,261099,,,,,,,,,,,,0.0825745090842247,,,,,, +45,261149,,,,,,,,,,,,0.07684113830327988,,,,,, +45,261199,,,,,,,,,,,,0.07774053514003754,,,,,, +45,261249,,,,,,,,,,,,0.07634694874286652,,,,,, +45,261299,,,,,,,,,,,,0.0709209069609642,,,,,, +45,261349,,,,,,,,,,,,0.07175565510988235,,,,,, +45,261399,,,,,,,,,,,,0.08103234320878983,,,,,, +45,261449,,,,,,,,,,,,0.07293678820133209,,,,,, +45,261499,,,,,,,,,,,,0.07414966821670532,,,,,, +45,261549,,,,,,,,,,,,0.0745585709810257,,,,,, +45,261599,,,,,,,,,,,,0.07088086009025574,,,,,, +45,261649,,,,,,,,,,,,0.0741371363401413,,,,,, +45,261699,,,,,,,,,,,,0.08724100887775421,,,,,, +45,261749,,,,,,,,,,,,0.06667673587799072,,,,,, +45,261799,,,,,,,,,,,,0.07708267122507095,,,,,, +45,261849,,,,,,,,,,,,0.07251161336898804,,,,,, +45,261899,,,,,,,,,,,,0.06841973960399628,,,,,, +45,261949,,,,,,,,,,,,0.07025030255317688,,,,,, +45,261999,,,,,,,,,,,,0.0677720159292221,,,,,, +45,262049,,,,,,,,,,,,0.06245720386505127,,,,,, +45,262099,,,,,,,,,,,,0.07302840799093246,,,,,, +45,262149,,,,,,,,,,,,0.0750596895813942,,,,,, +45,262199,,,,,,,,,,,,0.07759036123752594,,,,,, +45,262249,,,,,,,,,,,,0.06912771612405777,,,,,, +45,262299,,,,,,,,,,,,0.07431739568710327,,,,,, +45,262349,,,,,,,,,,,,0.07808907330036163,,,,,, +45,262399,,,,,,,,,,,,0.060504671186208725,,,,,, +45,262449,,,,,,,,,,,,0.0636977106332779,,,,,, +45,262499,,,,,,,,,,,,0.07870617508888245,,,,,, +45,262549,,,,,,,,,,,,0.06983856856822968,,,,,, +45,262599,,,,,,,,,,,,0.06214754283428192,,,,,, +45,262649,,,,,,,,,,,,0.06929559260606766,,,,,, +45,262699,,,,,,,,,,,,0.07528990507125854,,,,,, +45,262749,,,,,,,,,,,,0.062266960740089417,,,,,, +45,262799,,,,,,,,,,,,0.07895404100418091,,,,,, +45,262849,,,,,,,,,,,,0.07045750319957733,,,,,, +45,262899,,,,,,,,,,,,0.07988710701465607,,,,,, +45,262949,,,,,,,,,,,,0.0722699761390686,,,,,, +45,262999,,,,,,,,,,,,0.06323482096195221,,,,,, +45,263049,,,,,,,,,,,,0.07557470351457596,,,,,, +45,263099,,,,,,,,,,,,0.06856714189052582,,,,,, +45,263149,,,,,,,,,,,,0.0791541039943695,,,,,, +45,263199,,,,,,,,,,,,0.06974479556083679,,,,,, +45,263249,,,,,,,,,,,,0.07291414588689804,,,,,, +45,263299,,,,,,,,,,,,0.08308009803295135,,,,,, +45,263349,,,,,,,,,,,,0.06300617754459381,,,,,, +45,263399,,,,,,,,,,,,0.08697685599327087,,,,,, +45,263449,,,,,,,,,,,,0.08224490284919739,,,,,, +45,263499,,,,,,,,,,,,0.08055107295513153,,,,,, +45,263549,,,,,,,,,,,,0.06712373346090317,,,,,, +45,263599,,,,,,,,,,,,0.060235485434532166,,,,,, +45,263649,,,,,,,,,,,,0.08306640386581421,,,,,, +45,263699,,,,,,,,,,,,0.06794889271259308,,,,,, +45,263749,,,,,,,,,,,,0.06090021878480911,,,,,, +45,263799,,,,,,,,,,,,0.08063298463821411,,,,,, +45,263849,,,,,,,,,,,,0.07693536579608917,,,,,, +45,263855,,,,,,,,,,,,,0.24134880304336548,0.08157191425561905,0.2244579792022705,0.01030045747756958,0.22165559232234955,0.08157191425561905 +45,263855,,,,,,,0.23029059171676636,0.07324444502592087,0.33911246061325073,0.11499184370040894,0.3184869885444641,,,,,,, +46,263899,,,,,,,,,,,,0.07050997763872147,,,,,, +46,263949,,,,,,,,,,,,0.08152315765619278,,,,,, +46,263999,,,,,,,,,,,,0.06306619942188263,,,,,, +46,264049,,,,,,,,,,,,0.08512552827596664,,,,,, +46,264099,,,,,,,,,,,,0.06411765515804291,,,,,, +46,264149,,,,,,,,,,,,0.07308346033096313,,,,,, +46,264199,,,,,,,,,,,,0.05967666208744049,,,,,, +46,264249,,,,,,,,,,,,0.06261948496103287,,,,,, +46,264299,,,,,,,,,,,,0.0772792249917984,,,,,, +46,264349,,,,,,,,,,,,0.07128594815731049,,,,,, +46,264399,,,,,,,,,,,,0.06604884564876556,,,,,, +46,264449,,,,,,,,,,,,0.06494245678186417,,,,,, +46,264499,,,,,,,,,,,,0.07727940380573273,,,,,, +46,264549,,,,,,,,,,,,0.06820642203092575,,,,,, +46,264599,,,,,,,,,,,,0.0775097906589508,,,,,, +46,264649,,,,,,,,,,,,0.07823337614536285,,,,,, +46,264699,,,,,,,,,,,,0.08822113275527954,,,,,, +46,264749,,,,,,,,,,,,0.07403828203678131,,,,,, +46,264799,,,,,,,,,,,,0.08332079648971558,,,,,, +46,264849,,,,,,,,,,,,0.07777523994445801,,,,,, +46,264899,,,,,,,,,,,,0.0712849497795105,,,,,, +46,264949,,,,,,,,,,,,0.06938046216964722,,,,,, +46,264999,,,,,,,,,,,,0.06255769729614258,,,,,, +46,265049,,,,,,,,,,,,0.08337543904781342,,,,,, +46,265099,,,,,,,,,,,,0.06848061829805374,,,,,, +46,265149,,,,,,,,,,,,0.07723001390695572,,,,,, +46,265199,,,,,,,,,,,,0.0706566572189331,,,,,, +46,265249,,,,,,,,,,,,0.08087468147277832,,,,,, +46,265299,,,,,,,,,,,,0.07973304390907288,,,,,, +46,265349,,,,,,,,,,,,0.06630590558052063,,,,,, +46,265399,,,,,,,,,,,,0.07000838220119476,,,,,, +46,265449,,,,,,,,,,,,0.07637283205986023,,,,,, +46,265499,,,,,,,,,,,,0.06543026864528656,,,,,, +46,265549,,,,,,,,,,,,0.07753842324018478,,,,,, +46,265599,,,,,,,,,,,,0.07536707073450089,,,,,, +46,265649,,,,,,,,,,,,0.07374556362628937,,,,,, +46,265699,,,,,,,,,,,,0.07008369266986847,,,,,, +46,265749,,,,,,,,,,,,0.08281099796295166,,,,,, +46,265799,,,,,,,,,,,,0.07720021158456802,,,,,, +46,265849,,,,,,,,,,,,0.07405045628547668,,,,,, +46,265899,,,,,,,,,,,,0.07135544717311859,,,,,, +46,265949,,,,,,,,,,,,0.08061899244785309,,,,,, +46,265999,,,,,,,,,,,,0.09026996046304703,,,,,, +46,266049,,,,,,,,,,,,0.07899416983127594,,,,,, +46,266099,,,,,,,,,,,,0.07695189118385315,,,,,, +46,266149,,,,,,,,,,,,0.06463563442230225,,,,,, +46,266199,,,,,,,,,,,,0.09107799828052521,,,,,, +46,266249,,,,,,,,,,,,0.06960956752300262,,,,,, +46,266299,,,,,,,,,,,,0.06481931358575821,,,,,, +46,266349,,,,,,,,,,,,0.0778629258275032,,,,,, +46,266399,,,,,,,,,,,,0.07797466963529587,,,,,, +46,266449,,,,,,,,,,,,0.07486379146575928,,,,,, +46,266499,,,,,,,,,,,,0.07845370471477509,,,,,, +46,266549,,,,,,,,,,,,0.08309940993785858,,,,,, +46,266599,,,,,,,,,,,,0.08547618985176086,,,,,, +46,266649,,,,,,,,,,,,0.07797691971063614,,,,,, +46,266699,,,,,,,,,,,,0.07521872222423553,,,,,, +46,266749,,,,,,,,,,,,0.08701638132333755,,,,,, +46,266799,,,,,,,,,,,,0.07453320920467377,,,,,, +46,266849,,,,,,,,,,,,0.06372150778770447,,,,,, +46,266899,,,,,,,,,,,,0.08393537253141403,,,,,, +46,266949,,,,,,,,,,,,0.07662709802389145,,,,,, +46,266999,,,,,,,,,,,,0.06619051098823547,,,,,, +46,267049,,,,,,,,,,,,0.0644373744726181,,,,,, +46,267099,,,,,,,,,,,,0.06747663766145706,,,,,, +46,267149,,,,,,,,,,,,0.07529638707637787,,,,,, +46,267199,,,,,,,,,,,,0.06474585086107254,,,,,, +46,267249,,,,,,,,,,,,0.07346591353416443,,,,,, +46,267299,,,,,,,,,,,,0.06800434738397598,,,,,, +46,267349,,,,,,,,,,,,0.072445347905159,,,,,, +46,267399,,,,,,,,,,,,0.07222707569599152,,,,,, +46,267449,,,,,,,,,,,,0.06869154423475266,,,,,, +46,267499,,,,,,,,,,,,0.07408303022384644,,,,,, +46,267549,,,,,,,,,,,,0.07511085271835327,,,,,, +46,267599,,,,,,,,,,,,0.07328899204730988,,,,,, +46,267649,,,,,,,,,,,,0.07472677528858185,,,,,, +46,267699,,,,,,,,,,,,0.07067348062992096,,,,,, +46,267749,,,,,,,,,,,,0.06846588104963303,,,,,, +46,267799,,,,,,,,,,,,0.07251276820898056,,,,,, +46,267849,,,,,,,,,,,,0.0822765976190567,,,,,, +46,267899,,,,,,,,,,,,0.061426445841789246,,,,,, +46,267949,,,,,,,,,,,,0.07165563106536865,,,,,, +46,267999,,,,,,,,,,,,0.08085566014051437,,,,,, +46,268049,,,,,,,,,,,,0.07403428107500076,,,,,, +46,268099,,,,,,,,,,,,0.06355888396501541,,,,,, +46,268149,,,,,,,,,,,,0.07411514222621918,,,,,, +46,268199,,,,,,,,,,,,0.07717373967170715,,,,,, +46,268249,,,,,,,,,,,,0.08621438592672348,,,,,, +46,268299,,,,,,,,,,,,0.07081302255392075,,,,,, +46,268349,,,,,,,,,,,,0.06606976687908173,,,,,, +46,268399,,,,,,,,,,,,0.06970926374197006,,,,,, +46,268449,,,,,,,,,,,,0.07654297351837158,,,,,, +46,268499,,,,,,,,,,,,0.07903981953859329,,,,,, +46,268549,,,,,,,,,,,,0.06510291993618011,,,,,, +46,268599,,,,,,,,,,,,0.07780562341213226,,,,,, +46,268649,,,,,,,,,,,,0.05561640113592148,,,,,, +46,268699,,,,,,,,,,,,0.06725028157234192,,,,,, +46,268749,,,,,,,,,,,,0.0677184909582138,,,,,, +46,268799,,,,,,,,,,,,0.08244766294956207,,,,,, +46,268849,,,,,,,,,,,,0.07971754670143127,,,,,, +46,268899,,,,,,,,,,,,0.07591953128576279,,,,,, +46,268949,,,,,,,,,,,,0.07061615586280823,,,,,, +46,268999,,,,,,,,,,,,0.07260848581790924,,,,,, +46,269049,,,,,,,,,,,,0.07147684693336487,,,,,, +46,269099,,,,,,,,,,,,0.0745629295706749,,,,,, +46,269149,,,,,,,,,,,,0.07611823827028275,,,,,, +46,269199,,,,,,,,,,,,0.07556763291358948,,,,,, +46,269249,,,,,,,,,,,,0.0771314948797226,,,,,, +46,269299,,,,,,,,,,,,0.08638136088848114,,,,,, +46,269349,,,,,,,,,,,,0.07405658811330795,,,,,, +46,269399,,,,,,,,,,,,0.06688123941421509,,,,,, +46,269449,,,,,,,,,,,,0.0720461755990982,,,,,, +46,269499,,,,,,,,,,,,0.07010526210069656,,,,,, +46,269549,,,,,,,,,,,,0.07280430942773819,,,,,, +46,269591,,,,,,,,,,,,,0.2401682734489441,0.08161225914955139,0.23098373413085938,0.009810984134674072,0.2357332408428192,0.08161225914955139 +46,269591,,,,,,,0.22998949885368347,0.07309514284133911,0.3417632281780243,0.11680543422698975,0.32076209783554077,,,,,,, +47,269599,,,,,,,,,,,,0.0793256089091301,,,,,, +47,269649,,,,,,,,,,,,0.07729513943195343,,,,,, +47,269699,,,,,,,,,,,,0.08122257143259048,,,,,, +47,269749,,,,,,,,,,,,0.0660003274679184,,,,,, +47,269799,,,,,,,,,,,,0.06911695748567581,,,,,, +47,269849,,,,,,,,,,,,0.06807627528905869,,,,,, +47,269899,,,,,,,,,,,,0.07569318264722824,,,,,, +47,269949,,,,,,,,,,,,0.07775416225194931,,,,,, +47,269999,,,,,,,,,,,,0.08196131885051727,,,,,, +47,270049,,,,,,,,,,,,0.0899176374077797,,,,,, +47,270099,,,,,,,,,,,,0.07046464085578918,,,,,, +47,270149,,,,,,,,,,,,0.07126253843307495,,,,,, +47,270199,,,,,,,,,,,,0.07476527988910675,,,,,, +47,270249,,,,,,,,,,,,0.06762208789587021,,,,,, +47,270299,,,,,,,,,,,,0.07499343156814575,,,,,, +47,270349,,,,,,,,,,,,0.07468479871749878,,,,,, +47,270399,,,,,,,,,,,,0.09083623439073563,,,,,, +47,270449,,,,,,,,,,,,0.07957218587398529,,,,,, +47,270499,,,,,,,,,,,,0.07641258835792542,,,,,, +47,270549,,,,,,,,,,,,0.07131323218345642,,,,,, +47,270599,,,,,,,,,,,,0.0780433714389801,,,,,, +47,270649,,,,,,,,,,,,0.06644021719694138,,,,,, +47,270699,,,,,,,,,,,,0.07206614315509796,,,,,, +47,270749,,,,,,,,,,,,0.0669967383146286,,,,,, +47,270799,,,,,,,,,,,,0.07581943273544312,,,,,, +47,270849,,,,,,,,,,,,0.07291574776172638,,,,,, +47,270899,,,,,,,,,,,,0.08086641877889633,,,,,, +47,270949,,,,,,,,,,,,0.06536312401294708,,,,,, +47,270999,,,,,,,,,,,,0.07906896620988846,,,,,, +47,271049,,,,,,,,,,,,0.08907441049814224,,,,,, +47,271099,,,,,,,,,,,,0.07458032667636871,,,,,, +47,271149,,,,,,,,,,,,0.07032798230648041,,,,,, +47,271199,,,,,,,,,,,,0.07653963565826416,,,,,, +47,271249,,,,,,,,,,,,0.06809644401073456,,,,,, +47,271299,,,,,,,,,,,,0.07583054155111313,,,,,, +47,271349,,,,,,,,,,,,0.06650844216346741,,,,,, +47,271399,,,,,,,,,,,,0.07190261036157608,,,,,, +47,271449,,,,,,,,,,,,0.06192054599523544,,,,,, +47,271499,,,,,,,,,,,,0.066538006067276,,,,,, +47,271549,,,,,,,,,,,,0.06757806241512299,,,,,, +47,271599,,,,,,,,,,,,0.08517326414585114,,,,,, +47,271649,,,,,,,,,,,,0.08264859765768051,,,,,, +47,271699,,,,,,,,,,,,0.0671876072883606,,,,,, +47,271749,,,,,,,,,,,,0.07391281425952911,,,,,, +47,271799,,,,,,,,,,,,0.0650777593255043,,,,,, +47,271849,,,,,,,,,,,,0.0787421315908432,,,,,, +47,271899,,,,,,,,,,,,0.08152399957180023,,,,,, +47,271949,,,,,,,,,,,,0.08239546418190002,,,,,, +47,271999,,,,,,,,,,,,0.07119099795818329,,,,,, +47,272049,,,,,,,,,,,,0.07992300391197205,,,,,, +47,272099,,,,,,,,,,,,0.06792832911014557,,,,,, +47,272149,,,,,,,,,,,,0.0675935372710228,,,,,, +47,272199,,,,,,,,,,,,0.07069030404090881,,,,,, +47,272249,,,,,,,,,,,,0.07574921101331711,,,,,, +47,272299,,,,,,,,,,,,0.08568543940782547,,,,,, +47,272349,,,,,,,,,,,,0.06404578685760498,,,,,, +47,272399,,,,,,,,,,,,0.08213256299495697,,,,,, +47,272449,,,,,,,,,,,,0.06758645921945572,,,,,, +47,272499,,,,,,,,,,,,0.0798676609992981,,,,,, +47,272549,,,,,,,,,,,,0.07485803961753845,,,,,, +47,272599,,,,,,,,,,,,0.08256924897432327,,,,,, +47,272649,,,,,,,,,,,,0.07507681846618652,,,,,, +47,272699,,,,,,,,,,,,0.07631169259548187,,,,,, +47,272749,,,,,,,,,,,,0.07704707980155945,,,,,, +47,272799,,,,,,,,,,,,0.07398246228694916,,,,,, +47,272849,,,,,,,,,,,,0.06714076548814774,,,,,, +47,272899,,,,,,,,,,,,0.06853961199522018,,,,,, +47,272949,,,,,,,,,,,,0.06915196776390076,,,,,, +47,272999,,,,,,,,,,,,0.06285139918327332,,,,,, +47,273049,,,,,,,,,,,,0.08399774879217148,,,,,, +47,273099,,,,,,,,,,,,0.07522596418857574,,,,,, +47,273149,,,,,,,,,,,,0.06843665987253189,,,,,, +47,273199,,,,,,,,,,,,0.08471158146858215,,,,,, +47,273249,,,,,,,,,,,,0.06832833588123322,,,,,, +47,273299,,,,,,,,,,,,0.07269762456417084,,,,,, +47,273349,,,,,,,,,,,,0.07184761762619019,,,,,, +47,273399,,,,,,,,,,,,0.07967646420001984,,,,,, +47,273449,,,,,,,,,,,,0.08599188923835754,,,,,, +47,273499,,,,,,,,,,,,0.09090316295623779,,,,,, +47,273549,,,,,,,,,,,,0.07008849084377289,,,,,, +47,273599,,,,,,,,,,,,0.07638204097747803,,,,,, +47,273649,,,,,,,,,,,,0.07578813284635544,,,,,, +47,273699,,,,,,,,,,,,0.06976863741874695,,,,,, +47,273749,,,,,,,,,,,,0.08313842117786407,,,,,, +47,273799,,,,,,,,,,,,0.07673078775405884,,,,,, +47,273849,,,,,,,,,,,,0.07537848502397537,,,,,, +47,273899,,,,,,,,,,,,0.06552459299564362,,,,,, +47,273949,,,,,,,,,,,,0.07146231830120087,,,,,, +47,273999,,,,,,,,,,,,0.07454250752925873,,,,,, +47,274049,,,,,,,,,,,,0.07405054569244385,,,,,, +47,274099,,,,,,,,,,,,0.06427726149559021,,,,,, +47,274149,,,,,,,,,,,,0.06970526278018951,,,,,, +47,274199,,,,,,,,,,,,0.06615215539932251,,,,,, +47,274249,,,,,,,,,,,,0.07853348553180695,,,,,, +47,274299,,,,,,,,,,,,0.07394304871559143,,,,,, +47,274349,,,,,,,,,,,,0.06862746924161911,,,,,, +47,274399,,,,,,,,,,,,0.0776173397898674,,,,,, +47,274449,,,,,,,,,,,,0.06386230140924454,,,,,, +47,274499,,,,,,,,,,,,0.08444929122924805,,,,,, +47,274549,,,,,,,,,,,,0.06324794888496399,,,,,, +47,274599,,,,,,,,,,,,0.06806604564189911,,,,,, +47,274649,,,,,,,,,,,,0.07845166325569153,,,,,, +47,274699,,,,,,,,,,,,0.06883874535560608,,,,,, +47,274749,,,,,,,,,,,,0.08032243698835373,,,,,, +47,274799,,,,,,,,,,,,0.07401123642921448,,,,,, +47,274849,,,,,,,,,,,,0.08197289705276489,,,,,, +47,274899,,,,,,,,,,,,0.07522047311067581,,,,,, +47,274949,,,,,,,,,,,,0.07240616530179977,,,,,, +47,274999,,,,,,,,,,,,0.0683910995721817,,,,,, +47,275049,,,,,,,,,,,,0.07786166667938232,,,,,, +47,275099,,,,,,,,,,,,0.061250314116477966,,,,,, +47,275149,,,,,,,,,,,,0.07175023853778839,,,,,, +47,275199,,,,,,,,,,,,0.08020700514316559,,,,,, +47,275249,,,,,,,,,,,,0.060294657945632935,,,,,, +47,275299,,,,,,,,,,,,0.06687810271978378,,,,,, +47,275327,,,,,,,,,,,,,0.24113444983959198,0.08138258010149002,0.2217836081981659,0.01259768009185791,0.21536855399608612,0.08138258010149002 +47,275327,,,,,,,0.22985167801380157,0.07305535674095154,0.3424689471721649,0.11727684736251831,0.321562796831131,,,,,,, +48,275349,,,,,,,,,,,,0.06253290176391602,,,,,, +48,275399,,,,,,,,,,,,0.07550925016403198,,,,,, +48,275449,,,,,,,,,,,,0.07531606405973434,,,,,, +48,275499,,,,,,,,,,,,0.07473292946815491,,,,,, +48,275549,,,,,,,,,,,,0.0783667266368866,,,,,, +48,275599,,,,,,,,,,,,0.08192729949951172,,,,,, +48,275649,,,,,,,,,,,,0.07842937856912613,,,,,, +48,275699,,,,,,,,,,,,0.06787902116775513,,,,,, +48,275749,,,,,,,,,,,,0.07931888103485107,,,,,, +48,275799,,,,,,,,,,,,0.06329447776079178,,,,,, +48,275849,,,,,,,,,,,,0.07425414025783539,,,,,, +48,275899,,,,,,,,,,,,0.07309158146381378,,,,,, +48,275949,,,,,,,,,,,,0.07214197516441345,,,,,, +48,275999,,,,,,,,,,,,0.06504002958536148,,,,,, +48,276049,,,,,,,,,,,,0.08642719686031342,,,,,, +48,276099,,,,,,,,,,,,0.0788041204214096,,,,,, +48,276149,,,,,,,,,,,,0.07874639332294464,,,,,, +48,276199,,,,,,,,,,,,0.0736570805311203,,,,,, +48,276249,,,,,,,,,,,,0.07863758504390717,,,,,, +48,276299,,,,,,,,,,,,0.07306556403636932,,,,,, +48,276349,,,,,,,,,,,,0.05901863053441048,,,,,, +48,276399,,,,,,,,,,,,0.08542290329933167,,,,,, +48,276449,,,,,,,,,,,,0.06533166766166687,,,,,, +48,276499,,,,,,,,,,,,0.06761479377746582,,,,,, +48,276549,,,,,,,,,,,,0.06646847724914551,,,,,, +48,276599,,,,,,,,,,,,0.08289185911417007,,,,,, +48,276649,,,,,,,,,,,,0.07882000505924225,,,,,, +48,276699,,,,,,,,,,,,0.07286386936903,,,,,, +48,276749,,,,,,,,,,,,0.06536278873682022,,,,,, +48,276799,,,,,,,,,,,,0.07530185580253601,,,,,, +48,276849,,,,,,,,,,,,0.07767412066459656,,,,,, +48,276899,,,,,,,,,,,,0.07331104576587677,,,,,, +48,276949,,,,,,,,,,,,0.08239464461803436,,,,,, +48,276999,,,,,,,,,,,,0.07666586339473724,,,,,, +48,277049,,,,,,,,,,,,0.0628756731748581,,,,,, +48,277099,,,,,,,,,,,,0.06686470657587051,,,,,, +48,277149,,,,,,,,,,,,0.0644700899720192,,,,,, +48,277199,,,,,,,,,,,,0.0817115530371666,,,,,, +48,277249,,,,,,,,,,,,0.07371962070465088,,,,,, +48,277299,,,,,,,,,,,,0.07091912627220154,,,,,, +48,277349,,,,,,,,,,,,0.07787507772445679,,,,,, +48,277399,,,,,,,,,,,,0.07813595235347748,,,,,, +48,277449,,,,,,,,,,,,0.07157829403877258,,,,,, +48,277499,,,,,,,,,,,,0.07612045109272003,,,,,, +48,277549,,,,,,,,,,,,0.07470561563968658,,,,,, +48,277599,,,,,,,,,,,,0.06661426275968552,,,,,, +48,277649,,,,,,,,,,,,0.07331094145774841,,,,,, +48,277699,,,,,,,,,,,,0.05836598947644234,,,,,, +48,277749,,,,,,,,,,,,0.06865090131759644,,,,,, +48,277799,,,,,,,,,,,,0.07686866819858551,,,,,, +48,277849,,,,,,,,,,,,0.06670025736093521,,,,,, +48,277899,,,,,,,,,,,,0.0773930698633194,,,,,, +48,277949,,,,,,,,,,,,0.06830471009016037,,,,,, +48,277999,,,,,,,,,,,,0.08007544279098511,,,,,, +48,278049,,,,,,,,,,,,0.07411850988864899,,,,,, +48,278099,,,,,,,,,,,,0.06943090260028839,,,,,, +48,278149,,,,,,,,,,,,0.08685237914323807,,,,,, +48,278199,,,,,,,,,,,,0.07152920961380005,,,,,, +48,278249,,,,,,,,,,,,0.0771029144525528,,,,,, +48,278299,,,,,,,,,,,,0.0689457505941391,,,,,, +48,278349,,,,,,,,,,,,0.07705400884151459,,,,,, +48,278399,,,,,,,,,,,,0.07864220440387726,,,,,, +48,278449,,,,,,,,,,,,0.06989371031522751,,,,,, +48,278499,,,,,,,,,,,,0.06853608787059784,,,,,, +48,278549,,,,,,,,,,,,0.06325243413448334,,,,,, +48,278599,,,,,,,,,,,,0.06605133414268494,,,,,, +48,278649,,,,,,,,,,,,0.06003357470035553,,,,,, +48,278699,,,,,,,,,,,,0.0713222548365593,,,,,, +48,278749,,,,,,,,,,,,0.0846584364771843,,,,,, +48,278799,,,,,,,,,,,,0.07285239547491074,,,,,, +48,278849,,,,,,,,,,,,0.07298002392053604,,,,,, +48,278899,,,,,,,,,,,,0.07765503972768784,,,,,, +48,278949,,,,,,,,,,,,0.07617123425006866,,,,,, +48,278999,,,,,,,,,,,,0.09291143715381622,,,,,, +48,279049,,,,,,,,,,,,0.07011808454990387,,,,,, +48,279099,,,,,,,,,,,,0.07452791929244995,,,,,, +48,279149,,,,,,,,,,,,0.06657995283603668,,,,,, +48,279199,,,,,,,,,,,,0.06949055194854736,,,,,, +48,279249,,,,,,,,,,,,0.0811142772436142,,,,,, +48,279299,,,,,,,,,,,,0.07237832993268967,,,,,, +48,279349,,,,,,,,,,,,0.07504169642925262,,,,,, +48,279399,,,,,,,,,,,,0.0724225640296936,,,,,, +48,279449,,,,,,,,,,,,0.07666200399398804,,,,,, +48,279499,,,,,,,,,,,,0.0754547268152237,,,,,, +48,279549,,,,,,,,,,,,0.06689675152301788,,,,,, +48,279599,,,,,,,,,,,,0.057161252945661545,,,,,, +48,279649,,,,,,,,,,,,0.07210774719715118,,,,,, +48,279699,,,,,,,,,,,,0.07845443487167358,,,,,, +48,279749,,,,,,,,,,,,0.07486362755298615,,,,,, +48,279799,,,,,,,,,,,,0.0781354308128357,,,,,, +48,279849,,,,,,,,,,,,0.0680316835641861,,,,,, +48,279899,,,,,,,,,,,,0.08535849303007126,,,,,, +48,279949,,,,,,,,,,,,0.08398011326789856,,,,,, +48,279999,,,,,,,,,,,,0.07564806193113327,,,,,, +48,280049,,,,,,,,,,,,0.07315286993980408,,,,,, +48,280099,,,,,,,,,,,,0.05994708091020584,,,,,, +48,280149,,,,,,,,,,,,0.06518404185771942,,,,,, +48,280199,,,,,,,,,,,,0.06074817106127739,,,,,, +48,280249,,,,,,,,,,,,0.07392548024654388,,,,,, +48,280299,,,,,,,,,,,,0.06528504192829132,,,,,, +48,280349,,,,,,,,,,,,0.07754970341920853,,,,,, +48,280399,,,,,,,,,,,,0.06613789498806,,,,,, +48,280449,,,,,,,,,,,,0.06218598783016205,,,,,, +48,280499,,,,,,,,,,,,0.059123776853084564,,,,,, +48,280549,,,,,,,,,,,,0.06993979215621948,,,,,, +48,280599,,,,,,,,,,,,0.07064960896968842,,,,,, +48,280649,,,,,,,,,,,,0.0737072229385376,,,,,, +48,280699,,,,,,,,,,,,0.058657001703977585,,,,,, +48,280749,,,,,,,,,,,,0.08663220703601837,,,,,, +48,280799,,,,,,,,,,,,0.07542183995246887,,,,,, +48,280849,,,,,,,,,,,,0.07036221027374268,,,,,, +48,280899,,,,,,,,,,,,0.06528030335903168,,,,,, +48,280949,,,,,,,,,,,,0.06944546103477478,,,,,, +48,280999,,,,,,,,,,,,0.0767163336277008,,,,,, +48,281049,,,,,,,,,,,,0.0723152607679367,,,,,, +48,281063,,,,,,,,,,,,,0.24152925610542297,0.08148309588432312,0.21352268755435944,0.011378049850463867,0.20726311206817627,0.08148309588432312 +48,281063,,,,,,,0.22979982197284698,0.07301970571279526,0.34309670329093933,0.11770963668823242,0.32237306237220764,,,,,,, +49,281099,,,,,,,,,,,,0.08522855490446091,,,,,, +49,281149,,,,,,,,,,,,0.05631180480122566,,,,,, +49,281199,,,,,,,,,,,,0.06719930469989777,,,,,, +49,281249,,,,,,,,,,,,0.060994043946266174,,,,,, +49,281299,,,,,,,,,,,,0.07557643949985504,,,,,, +49,281349,,,,,,,,,,,,0.07742634415626526,,,,,, +49,281399,,,,,,,,,,,,0.0797024518251419,,,,,, +49,281449,,,,,,,,,,,,0.07451069355010986,,,,,, +49,281499,,,,,,,,,,,,0.07121717929840088,,,,,, +49,281549,,,,,,,,,,,,0.0726289451122284,,,,,, +49,281599,,,,,,,,,,,,0.07527182251214981,,,,,, +49,281649,,,,,,,,,,,,0.06623945385217667,,,,,, +49,281699,,,,,,,,,,,,0.06522408127784729,,,,,, +49,281749,,,,,,,,,,,,0.060842279344797134,,,,,, +49,281799,,,,,,,,,,,,0.07583379745483398,,,,,, +49,281849,,,,,,,,,,,,0.0716238021850586,,,,,, +49,281899,,,,,,,,,,,,0.07864166796207428,,,,,, +49,281949,,,,,,,,,,,,0.0627211481332779,,,,,, +49,281999,,,,,,,,,,,,0.07700236886739731,,,,,, +49,282049,,,,,,,,,,,,0.076327383518219,,,,,, +49,282099,,,,,,,,,,,,0.07922318577766418,,,,,, +49,282149,,,,,,,,,,,,0.06533133238554001,,,,,, +49,282199,,,,,,,,,,,,0.07058455795049667,,,,,, +49,282249,,,,,,,,,,,,0.0660979375243187,,,,,, +49,282299,,,,,,,,,,,,0.06529758125543594,,,,,, +49,282349,,,,,,,,,,,,0.0828828364610672,,,,,, +49,282399,,,,,,,,,,,,0.06630350649356842,,,,,, +49,282449,,,,,,,,,,,,0.06710020452737808,,,,,, +49,282499,,,,,,,,,,,,0.07517381012439728,,,,,, +49,282549,,,,,,,,,,,,0.07230829447507858,,,,,, +49,282599,,,,,,,,,,,,0.07786532491445541,,,,,, +49,282649,,,,,,,,,,,,0.0643758699297905,,,,,, +49,282699,,,,,,,,,,,,0.07316155731678009,,,,,, +49,282749,,,,,,,,,,,,0.06848303973674774,,,,,, +49,282799,,,,,,,,,,,,0.06513280421495438,,,,,, +49,282849,,,,,,,,,,,,0.07070088386535645,,,,,, +49,282899,,,,,,,,,,,,0.06057567149400711,,,,,, +49,282949,,,,,,,,,,,,0.07137677818536758,,,,,, +49,282999,,,,,,,,,,,,0.06911375373601913,,,,,, +49,283049,,,,,,,,,,,,0.07673927396535873,,,,,, +49,283099,,,,,,,,,,,,0.07277888059616089,,,,,, +49,283149,,,,,,,,,,,,0.08464552462100983,,,,,, +49,283199,,,,,,,,,,,,0.0748697966337204,,,,,, +49,283249,,,,,,,,,,,,0.0732867419719696,,,,,, +49,283299,,,,,,,,,,,,0.0751400738954544,,,,,, +49,283349,,,,,,,,,,,,0.07745416462421417,,,,,, +49,283399,,,,,,,,,,,,0.08416036516427994,,,,,, +49,283449,,,,,,,,,,,,0.07072386145591736,,,,,, +49,283499,,,,,,,,,,,,0.06202073395252228,,,,,, +49,283549,,,,,,,,,,,,0.09083084762096405,,,,,, +49,283599,,,,,,,,,,,,0.068363718688488,,,,,, +49,283649,,,,,,,,,,,,0.06672435998916626,,,,,, +49,283699,,,,,,,,,,,,0.07814562320709229,,,,,, +49,283749,,,,,,,,,,,,0.0750071257352829,,,,,, +49,283799,,,,,,,,,,,,0.06445706635713577,,,,,, +49,283849,,,,,,,,,,,,0.08036781847476959,,,,,, +49,283899,,,,,,,,,,,,0.07312367111444473,,,,,, +49,283949,,,,,,,,,,,,0.0640246644616127,,,,,, +49,283999,,,,,,,,,,,,0.07793048024177551,,,,,, +49,284049,,,,,,,,,,,,0.0675753802061081,,,,,, +49,284099,,,,,,,,,,,,0.07763313502073288,,,,,, +49,284149,,,,,,,,,,,,0.06686927378177643,,,,,, +49,284199,,,,,,,,,,,,0.09796634316444397,,,,,, +49,284249,,,,,,,,,,,,0.07505962997674942,,,,,, +49,284299,,,,,,,,,,,,0.07842162251472473,,,,,, +49,284349,,,,,,,,,,,,0.08615315705537796,,,,,, +49,284399,,,,,,,,,,,,0.07409701496362686,,,,,, +49,284449,,,,,,,,,,,,0.051313064992427826,,,,,, +49,284499,,,,,,,,,,,,0.08857506513595581,,,,,, +49,284549,,,,,,,,,,,,0.06911054253578186,,,,,, +49,284599,,,,,,,,,,,,0.06748092919588089,,,,,, +49,284649,,,,,,,,,,,,0.0664418488740921,,,,,, +49,284699,,,,,,,,,,,,0.07675429433584213,,,,,, +49,284749,,,,,,,,,,,,0.08647586405277252,,,,,, +49,284799,,,,,,,,,,,,0.07095353305339813,,,,,, +49,284849,,,,,,,,,,,,0.08732285350561142,,,,,, +49,284899,,,,,,,,,,,,0.07532279193401337,,,,,, +49,284949,,,,,,,,,,,,0.0666322410106659,,,,,, +49,284999,,,,,,,,,,,,0.08653324097394943,,,,,, +49,285049,,,,,,,,,,,,0.07522284984588623,,,,,, +49,285099,,,,,,,,,,,,0.07552614063024521,,,,,, +49,285149,,,,,,,,,,,,0.07045960426330566,,,,,, +49,285199,,,,,,,,,,,,0.06225278973579407,,,,,, +49,285249,,,,,,,,,,,,0.06591007113456726,,,,,, +49,285299,,,,,,,,,,,,0.07955283671617508,,,,,, +49,285349,,,,,,,,,,,,0.08752583712339401,,,,,, +49,285399,,,,,,,,,,,,0.06840860098600388,,,,,, +49,285449,,,,,,,,,,,,0.08075420558452606,,,,,, +49,285499,,,,,,,,,,,,0.06824873387813568,,,,,, +49,285549,,,,,,,,,,,,0.058903999626636505,,,,,, +49,285599,,,,,,,,,,,,0.08376447856426239,,,,,, +49,285649,,,,,,,,,,,,0.0792660042643547,,,,,, +49,285699,,,,,,,,,,,,0.07389679551124573,,,,,, +49,285749,,,,,,,,,,,,0.08323273062705994,,,,,, +49,285799,,,,,,,,,,,,0.06801172345876694,,,,,, +49,285849,,,,,,,,,,,,0.06652499735355377,,,,,, +49,285899,,,,,,,,,,,,0.07577488571405411,,,,,, +49,285949,,,,,,,,,,,,0.07494746148586273,,,,,, +49,285999,,,,,,,,,,,,0.07023826241493225,,,,,, +49,286049,,,,,,,,,,,,0.08353970944881439,,,,,, +49,286099,,,,,,,,,,,,0.06619955599308014,,,,,, +49,286149,,,,,,,,,,,,0.07879973948001862,,,,,, +49,286199,,,,,,,,,,,,0.0743170976638794,,,,,, +49,286249,,,,,,,,,,,,0.06806325912475586,,,,,, +49,286299,,,,,,,,,,,,0.06646716594696045,,,,,, +49,286349,,,,,,,,,,,,0.07090780884027481,,,,,, +49,286399,,,,,,,,,,,,0.08551628887653351,,,,,, +49,286449,,,,,,,,,,,,0.07285494357347488,,,,,, +49,286499,,,,,,,,,,,,0.05770563334226608,,,,,, +49,286549,,,,,,,,,,,,0.05975034087896347,,,,,, +49,286599,,,,,,,,,,,,0.06942710280418396,,,,,, +49,286649,,,,,,,,,,,,0.07082759588956833,,,,,, +49,286699,,,,,,,,,,,,0.06575458496809006,,,,,, +49,286749,,,,,,,,,,,,0.07463879138231277,,,,,, +49,286799,,,,,,,,,,,,0.06200031936168671,,,,,, +49,286799,,,,,,,,,,,,,0.2418261170387268,0.08168443292379379,0.21128426492214203,0.008935332298278809,0.20601551234722137,0.08168443292379379 +49,286799,,,,,,,0.22987453639507294,0.07304269820451736,0.34268999099731445,0.11743903160095215,0.32222145795822144,,,,,,, +50,286800,0.23519288003444672,0.07617682218551636,0.2900708317756653,0.07882803678512573,0.27726849913597107,0.07617682218551636,,,,,,,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c9b75bb4ccab1a2e550c717ceb905561af8b7e8c --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml @@ -0,0 +1,23 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: gifflar + num_layers: 8 + pooling: global_mean + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly +seed: 44 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..4a132d5efd24cbd148129bf5bd324eddf5a9241e --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv @@ -0,0 +1,276 @@ +epoch,step,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +0,49,,,,,,0.07790382206439972,,,,,, +0,99,,,,,,0.09424226731061935,,,,,, +0,149,,,,,,0.10446707904338837,,,,,, +0,199,,,,,,0.09056481719017029,,,,,, +0,249,,,,,,0.09558609873056412,,,,,, +0,299,,,,,,0.08527802675962448,,,,,, +0,349,,,,,,0.08417049050331116,,,,,, +0,399,,,,,,0.08889802545309067,,,,,, +0,449,,,,,,0.08094783127307892,,,,,, +0,499,,,,,,0.08942040055990219,,,,,, +0,549,,,,,,0.08328883349895477,,,,,, +0,599,,,,,,0.07396189123392105,,,,,, +0,649,,,,,,0.07242509722709656,,,,,, +0,699,,,,,,0.07386443018913269,,,,,, +0,749,,,,,,0.09003129601478577,,,,,, +0,799,,,,,,0.08178240060806274,,,,,, +0,849,,,,,,0.07601164281368256,,,,,, +0,899,,,,,,0.08111964166164398,,,,,, +0,949,,,,,,0.08332440257072449,,,,,, +0,999,,,,,,0.0880989134311676,,,,,, +0,1049,,,,,,0.07906267046928406,,,,,, +0,1099,,,,,,0.0707767903804779,,,,,, +0,1149,,,,,,0.07277147471904755,,,,,, +0,1199,,,,,,0.07895873486995697,,,,,, +0,1249,,,,,,0.0761212483048439,,,,,, +0,1299,,,,,,0.08420522511005402,,,,,, +0,1349,,,,,,0.07332789152860641,,,,,, +0,1399,,,,,,0.07996276021003723,,,,,, +0,1449,,,,,,0.07850809395313263,,,,,, +0,1499,,,,,,0.08904536813497543,,,,,, +0,1549,,,,,,0.07732101529836655,,,,,, +0,1599,,,,,,0.08968669176101685,,,,,, +0,1649,,,,,,0.07249380648136139,,,,,, +0,1699,,,,,,0.08458072692155838,,,,,, +0,1749,,,,,,0.07357749342918396,,,,,, +0,1799,,,,,,0.08508479595184326,,,,,, +0,1849,,,,,,0.08481201529502869,,,,,, +0,1899,,,,,,0.07546663284301758,,,,,, +0,1949,,,,,,0.07904024422168732,,,,,, +0,1999,,,,,,0.07877698540687561,,,,,, +0,2049,,,,,,0.08018192648887634,,,,,, +0,2099,,,,,,0.0828724354505539,,,,,, +0,2149,,,,,,0.07775522768497467,,,,,, +0,2199,,,,,,0.08716051280498505,,,,,, +0,2249,,,,,,0.08228585124015808,,,,,, +0,2299,,,,,,0.08488009870052338,,,,,, +0,2349,,,,,,0.07460618019104004,,,,,, +0,2399,,,,,,0.07868096232414246,,,,,, +0,2449,,,,,,0.08776894211769104,,,,,, +0,2499,,,,,,0.07179893553256989,,,,,, +0,2549,,,,,,0.07937702536582947,,,,,, +0,2599,,,,,,0.07901250571012497,,,,,, +0,2649,,,,,,0.08345462381839752,,,,,, +0,2699,,,,,,0.07471785694360733,,,,,, +0,2749,,,,,,0.07444080710411072,,,,,, +0,2799,,,,,,0.06047844886779785,,,,,, +0,2849,,,,,,0.0925266221165657,,,,,, +0,2899,,,,,,0.08869567513465881,,,,,, +0,2949,,,,,,0.08102956414222717,,,,,, +0,2999,,,,,,0.06798050552606583,,,,,, +0,3049,,,,,,0.08111677318811417,,,,,, +0,3099,,,,,,0.07905969768762589,,,,,, +0,3149,,,,,,0.08421914279460907,,,,,, +0,3199,,,,,,0.07906500995159149,,,,,, +0,3249,,,,,,0.07691369950771332,,,,,, +0,3299,,,,,,0.07285372912883759,,,,,, +0,3349,,,,,,0.09080013632774353,,,,,, +0,3399,,,,,,0.07926687598228455,,,,,, +0,3449,,,,,,0.07711825519800186,,,,,, +0,3499,,,,,,0.07112783193588257,,,,,, +0,3549,,,,,,0.060063064098358154,,,,,, +0,3599,,,,,,0.08003148436546326,,,,,, +0,3649,,,,,,0.07476584613323212,,,,,, +0,3699,,,,,,0.06894120573997498,,,,,, +0,3749,,,,,,0.08554776757955551,,,,,, +0,3799,,,,,,0.08312509953975677,,,,,, +0,3849,,,,,,0.07600771635770798,,,,,, +0,3899,,,,,,0.0766836404800415,,,,,, +0,3949,,,,,,0.07958756387233734,,,,,, +0,3999,,,,,,0.08016538619995117,,,,,, +0,4049,,,,,,0.08011505007743835,,,,,, +0,4099,,,,,,0.07002652436494827,,,,,, +0,4149,,,,,,0.06919436156749725,,,,,, +0,4199,,,,,,0.08205226063728333,,,,,, +0,4249,,,,,,0.07919591665267944,,,,,, +0,4299,,,,,,0.0901440680027008,,,,,, +0,4349,,,,,,0.0883670449256897,,,,,, +0,4399,,,,,,0.07446710020303726,,,,,, +0,4449,,,,,,0.07834332436323166,,,,,, +0,4499,,,,,,0.08554947376251221,,,,,, +0,4549,,,,,,0.08550582081079483,,,,,, +0,4599,,,,,,0.07052560895681381,,,,,, +0,4649,,,,,,0.07255500555038452,,,,,, +0,4699,,,,,,0.07583771646022797,,,,,, +0,4749,,,,,,0.07407483458518982,,,,,, +0,4799,,,,,,0.07842773199081421,,,,,, +0,4849,,,,,,0.0728302150964737,,,,,, +0,4899,,,,,,0.0798627957701683,,,,,, +0,4949,,,,,,0.0786103904247284,,,,,, +0,4999,,,,,,0.06100286543369293,,,,,, +0,5049,,,,,,0.08863933384418488,,,,,, +0,5099,,,,,,0.08034344017505646,,,,,, +0,5149,,,,,,0.08287514746189117,,,,,, +0,5199,,,,,,0.0698174238204956,,,,,, +0,5249,,,,,,0.08807849138975143,,,,,, +0,5299,,,,,,0.07937359064817429,,,,,, +0,5349,,,,,,0.0735902190208435,,,,,, +0,5399,,,,,,0.06510685384273529,,,,,, +0,5449,,,,,,0.06429673731327057,,,,,, +0,5499,,,,,,0.07666970789432526,,,,,, +0,5549,,,,,,0.06644371151924133,,,,,, +0,5599,,,,,,0.07646960020065308,,,,,, +0,5649,,,,,,0.06160346046090126,,,,,, +0,5699,,,,,,0.08172823488712311,,,,,, +0,5735,,,,,,,0.2419443130493164,0.08014789968729019,0.18934018909931183,0.02757781744003296,0.17804734408855438,0.08014789968729019 +0,5735,0.24194851517677307,0.08000683039426804,0.19652755558490753,0.03328806161880493,0.1873418539762497,,,,,,, +1,5749,,,,,,0.0766361728310585,,,,,, +1,5799,,,,,,0.07229863107204437,,,,,, +1,5849,,,,,,0.0733114704489708,,,,,, +1,5899,,,,,,0.08748388290405273,,,,,, +1,5949,,,,,,0.07115127146244049,,,,,, +1,5999,,,,,,0.08684887737035751,,,,,, +1,6049,,,,,,0.0856359452009201,,,,,, +1,6099,,,,,,0.07322172820568085,,,,,, +1,6149,,,,,,0.06993117928504944,,,,,, +1,6199,,,,,,0.09327472746372223,,,,,, +1,6249,,,,,,0.07674551010131836,,,,,, +1,6299,,,,,,0.08632052689790726,,,,,, +1,6349,,,,,,0.06964485347270966,,,,,, +1,6399,,,,,,0.08487797528505325,,,,,, +1,6449,,,,,,0.08281749486923218,,,,,, +1,6499,,,,,,0.07918699085712433,,,,,, +1,6549,,,,,,0.07878774404525757,,,,,, +1,6599,,,,,,0.08022882044315338,,,,,, +1,6649,,,,,,0.0761406198143959,,,,,, +1,6699,,,,,,0.07189121842384338,,,,,, +1,6749,,,,,,0.0812508761882782,,,,,, +1,6799,,,,,,0.07691659033298492,,,,,, +1,6849,,,,,,0.07350210845470428,,,,,, +1,6899,,,,,,0.08302538096904755,,,,,, +1,6949,,,,,,0.07453560829162598,,,,,, +1,6999,,,,,,0.06776425242424011,,,,,, +1,7049,,,,,,0.07144264876842499,,,,,, +1,7099,,,,,,0.07237154245376587,,,,,, +1,7149,,,,,,0.0716688483953476,,,,,, +1,7199,,,,,,0.07623513787984848,,,,,, +1,7249,,,,,,0.0761435404419899,,,,,, +1,7299,,,,,,0.0756298080086708,,,,,, +1,7349,,,,,,0.08752252906560898,,,,,, +1,7399,,,,,,0.07146965712308884,,,,,, +1,7449,,,,,,0.07797402143478394,,,,,, +1,7499,,,,,,0.07474587857723236,,,,,, +1,7549,,,,,,0.0762815922498703,,,,,, +1,7599,,,,,,0.07086549699306488,,,,,, +1,7649,,,,,,0.07576196640729904,,,,,, +1,7699,,,,,,0.07976368069648743,,,,,, +1,7749,,,,,,0.060167569667100906,,,,,, +1,7799,,,,,,0.0722295269370079,,,,,, +1,7849,,,,,,0.07302621006965637,,,,,, +1,7899,,,,,,0.1147548109292984,,,,,, +1,7949,,,,,,0.08039602637290955,,,,,, +1,7999,,,,,,0.07708263397216797,,,,,, +1,8049,,,,,,0.06075665354728699,,,,,, +1,8099,,,,,,0.07503955811262131,,,,,, +1,8149,,,,,,0.07447504997253418,,,,,, +1,8199,,,,,,0.08862118422985077,,,,,, +1,8249,,,,,,0.07940621674060822,,,,,, +1,8299,,,,,,0.08109737932682037,,,,,, +1,8349,,,,,,0.0740865170955658,,,,,, +1,8399,,,,,,0.07515561580657959,,,,,, +1,8449,,,,,,0.06806106865406036,,,,,, +1,8499,,,,,,0.06762942671775818,,,,,, +1,8549,,,,,,0.07464014738798141,,,,,, +1,8599,,,,,,0.07971091568470001,,,,,, +1,8649,,,,,,0.07206127047538757,,,,,, +1,8699,,,,,,0.07904350757598877,,,,,, +1,8749,,,,,,0.07580108195543289,,,,,, +1,8799,,,,,,0.062417879700660706,,,,,, +1,8849,,,,,,0.0892132967710495,,,,,, +1,8899,,,,,,0.07906433194875717,,,,,, +1,8949,,,,,,0.06809665262699127,,,,,, +1,8999,,,,,,0.06875340640544891,,,,,, +1,9049,,,,,,0.076703742146492,,,,,, +1,9099,,,,,,0.08063337206840515,,,,,, +1,9149,,,,,,0.07393243163824081,,,,,, +1,9199,,,,,,0.07286565750837326,,,,,, +1,9249,,,,,,0.07488203793764114,,,,,, +1,9299,,,,,,0.0767192468047142,,,,,, +1,9349,,,,,,0.07859738171100616,,,,,, +1,9399,,,,,,0.08364765346050262,,,,,, +1,9449,,,,,,0.8686161041259766,,,,,, +1,9499,,,,,,0.0805748701095581,,,,,, +1,9549,,,,,,0.08373261243104935,,,,,, +1,9599,,,,,,0.0784197747707367,,,,,, +1,9649,,,,,,0.08171108365058899,,,,,, +1,9699,,,,,,0.09305591136217117,,,,,, +1,9749,,,,,,0.0851135179400444,,,,,, +1,9799,,,,,,0.0959131121635437,,,,,, +1,9849,,,,,,0.08519770205020905,,,,,, +1,9899,,,,,,0.08524122089147568,,,,,, +1,9949,,,,,,0.07994186133146286,,,,,, +1,9999,,,,,,0.07506194710731506,,,,,, +1,10049,,,,,,0.08047782629728317,,,,,, +1,10099,,,,,,0.08000688254833221,,,,,, +1,10149,,,,,,0.09008622914552689,,,,,, +1,10199,,,,,,0.08165659010410309,,,,,, +1,10249,,,,,,0.07871711254119873,,,,,, +1,10299,,,,,,0.08470675349235535,,,,,, +1,10349,,,,,,0.08019281178712845,,,,,, +1,10399,,,,,,0.07748603820800781,,,,,, +1,10449,,,,,,0.06892407685518265,,,,,, +1,10499,,,,,,0.07812134921550751,,,,,, +1,10549,,,,,,0.09329687058925629,,,,,, +1,10599,,,,,,0.0934494286775589,,,,,, +1,10649,,,,,,0.0843682736158371,,,,,, +1,10699,,,,,,0.07803942263126373,,,,,, +1,10749,,,,,,0.09040524065494537,,,,,, +1,10799,,,,,,0.08629345893859863,,,,,, +1,10849,,,,,,0.09568805247545242,,,,,, +1,10899,,,,,,0.08860069513320923,,,,,, +1,10949,,,,,,0.08989134430885315,,,,,, +1,10999,,,,,,0.07076942920684814,,,,,, +1,11049,,,,,,0.08262842148542404,,,,,, +1,11099,,,,,,0.08720291405916214,,,,,, +1,11149,,,,,,0.0921413004398346,,,,,, +1,11199,,,,,,0.0729917511343956,,,,,, +1,11249,,,,,,0.0753888338804245,,,,,, +1,11299,,,,,,0.07488669455051422,,,,,, +1,11349,,,,,,0.08177372068166733,,,,,, +1,11399,,,,,,0.07888656854629517,,,,,, +1,11449,,,,,,0.09360802918672562,,,,,, +1,11471,,,,,,,0.2493048906326294,0.08356218039989471,nan,-0.013847112655639648,-0.05018925666809082,0.08356218039989471 +1,11471,0.24510619044303894,0.6614968776702881,0.019136326387524605,-6.992745876312256,0.19289496541023254,,,,,,, +2,11499,,,,,,0.08945261687040329,,,,,, +2,11549,,,,,,0.07509467750787735,,,,,, +2,11599,,,,,,0.07724601030349731,,,,,, +2,11649,,,,,,0.09637896716594696,,,,,, +2,11699,,,,,,0.08155949413776398,,,,,, +2,11749,,,,,,0.0817471370100975,,,,,, +2,11799,,,,,,0.08495303988456726,,,,,, +2,11849,,,,,,0.066152423620224,,,,,, +2,11899,,,,,,0.07614073157310486,,,,,, +2,11949,,,,,,0.07786638289690018,,,,,, +2,11999,,,,,,0.07957716286182404,,,,,, +2,12049,,,,,,0.08301767706871033,,,,,, +2,12099,,,,,,0.07611444592475891,,,,,, +2,12149,,,,,,0.08702030777931213,,,,,, +2,12199,,,,,,0.06502265483140945,,,,,, +2,12249,,,,,,0.07425951212644577,,,,,, +2,12299,,,,,,0.08824396133422852,,,,,, +2,12349,,,,,,0.07133421301841736,,,,,, +2,12399,,,,,,0.09124624729156494,,,,,, +2,12449,,,,,,0.08319301903247833,,,,,, +2,12499,,,,,,0.07281570136547089,,,,,, +2,12549,,,,,,0.0843106135725975,,,,,, +2,12599,,,,,,0.08031978458166122,,,,,, +2,12649,,,,,,0.07749583572149277,,,,,, +2,12699,,,,,,0.08318957686424255,,,,,, +2,12749,,,,,,0.07601447403430939,,,,,, +2,12799,,,,,,0.08172904700040817,,,,,, +2,12849,,,,,,0.09042327105998993,,,,,, +2,12899,,,,,,0.08240079879760742,,,,,, +2,12949,,,,,,0.08636178076267242,,,,,, +2,12999,,,,,,0.08150589466094971,,,,,, +2,13049,,,,,,0.073806032538414,,,,,, +2,13099,,,,,,0.08930633962154388,,,,,, +2,13149,,,,,,0.09276346117258072,,,,,, +2,13199,,,,,,0.07049539685249329,,,,,, +2,13249,,,,,,0.07165120542049408,,,,,, +2,13299,,,,,,0.08426865935325623,,,,,, +2,13349,,,,,,0.08666817843914032,,,,,, +2,13399,,,,,,0.07773618400096893,,,,,, +2,13449,,,,,,0.08796385675668716,,,,,, +2,13499,,,,,,0.07347731292247772,,,,,, +2,13549,,,,,,0.0821983814239502,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c9b75bb4ccab1a2e550c717ceb905561af8b7e8c --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml @@ -0,0 +1,23 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: gifflar + num_layers: 8 + pooling: global_mean + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly +seed: 44 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..13088e29f930cdaf9dfb85441a9b7af9ef727045 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv @@ -0,0 +1,5605 @@ +epoch,step,test/MeanAbsoluteError,test/MeanSquaredError,test/PearsonCorrCoef,test/R2Score,test/SpearmanCorrCoef,test/loss,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +2,11499,,,,,,,,,,,,0.07957427203655243,,,,,, +2,11549,,,,,,,,,,,,0.08479368686676025,,,,,, +2,11599,,,,,,,,,,,,0.07464239001274109,,,,,, +2,11649,,,,,,,,,,,,0.08224469423294067,,,,,, +2,11699,,,,,,,,,,,,0.08693154156208038,,,,,, +2,11749,,,,,,,,,,,,0.09161832928657532,,,,,, +2,11799,,,,,,,,,,,,0.07951408624649048,,,,,, +2,11849,,,,,,,,,,,,0.08994446694850922,,,,,, +2,11899,,,,,,,,,,,,0.07040442526340485,,,,,, +2,11949,,,,,,,,,,,,0.08015863597393036,,,,,, +2,11999,,,,,,,,,,,,0.06846892088651657,,,,,, +2,12049,,,,,,,,,,,,0.08900907635688782,,,,,, +2,12099,,,,,,,,,,,,0.07728612422943115,,,,,, +2,12149,,,,,,,,,,,,0.0857195183634758,,,,,, +2,12199,,,,,,,,,,,,0.07802578806877136,,,,,, +2,12249,,,,,,,,,,,,0.08947184681892395,,,,,, +2,12299,,,,,,,,,,,,0.07850992679595947,,,,,, +2,12349,,,,,,,,,,,,0.07463866472244263,,,,,, +2,12399,,,,,,,,,,,,0.09768514335155487,,,,,, +2,12449,,,,,,,,,,,,0.08786322176456451,,,,,, +2,12499,,,,,,,,,,,,0.08182030916213989,,,,,, +2,12549,,,,,,,,,,,,0.07720279693603516,,,,,, +2,12599,,,,,,,,,,,,0.08512653410434723,,,,,, +2,12649,,,,,,,,,,,,0.0839219018816948,,,,,, +2,12699,,,,,,,,,,,,0.08276760578155518,,,,,, +2,12749,,,,,,,,,,,,0.08925779908895493,,,,,, +2,12799,,,,,,,,,,,,0.07955799251794815,,,,,, +2,12849,,,,,,,,,,,,0.06795690953731537,,,,,, +2,12899,,,,,,,,,,,,0.07425942271947861,,,,,, +2,12949,,,,,,,,,,,,0.09779703617095947,,,,,, +2,12999,,,,,,,,,,,,0.08615463972091675,,,,,, +2,13049,,,,,,,,,,,,0.07598649710416794,,,,,, +2,13099,,,,,,,,,,,,0.08589918911457062,,,,,, +2,13149,,,,,,,,,,,,0.08181756734848022,,,,,, +2,13199,,,,,,,,,,,,0.08011487871408463,,,,,, +2,13249,,,,,,,,,,,,0.07924525439739227,,,,,, +2,13299,,,,,,,,,,,,0.0857338085770607,,,,,, +2,13349,,,,,,,,,,,,0.08693619817495346,,,,,, +2,13399,,,,,,,,,,,,0.08101785182952881,,,,,, +2,13449,,,,,,,,,,,,0.08497199416160583,,,,,, +2,13499,,,,,,,,,,,,0.08917652815580368,,,,,, +2,13549,,,,,,,,,,,,0.08288116753101349,,,,,, +2,13599,,,,,,,,,,,,0.08429837226867676,,,,,, +2,13649,,,,,,,,,,,,0.08387995511293411,,,,,, +2,13699,,,,,,,,,,,,0.08331793546676636,,,,,, +2,13749,,,,,,,,,,,,0.07882606983184814,,,,,, +2,13799,,,,,,,,,,,,0.08207229524850845,,,,,, +2,13849,,,,,,,,,,,,0.07847855240106583,,,,,, +2,13899,,,,,,,,,,,,0.08010341227054596,,,,,, +2,13949,,,,,,,,,,,,0.08305291831493378,,,,,, +2,13999,,,,,,,,,,,,0.09258995950222015,,,,,, +2,14049,,,,,,,,,,,,0.09247256070375443,,,,,, +2,14099,,,,,,,,,,,,0.07693707197904587,,,,,, +2,14149,,,,,,,,,,,,0.08539462834596634,,,,,, +2,14199,,,,,,,,,,,,0.0858217254281044,,,,,, +2,14249,,,,,,,,,,,,0.07423663139343262,,,,,, +2,14299,,,,,,,,,,,,0.06834306567907333,,,,,, +2,14349,,,,,,,,,,,,0.08628769218921661,,,,,, +2,14399,,,,,,,,,,,,0.08901415765285492,,,,,, +2,14449,,,,,,,,,,,,0.0829533115029335,,,,,, +2,14499,,,,,,,,,,,,0.07220728695392609,,,,,, +2,14549,,,,,,,,,,,,0.09293267875909805,,,,,, +2,14599,,,,,,,,,,,,0.09021244198083878,,,,,, +2,14649,,,,,,,,,,,,0.08768057823181152,,,,,, +2,14699,,,,,,,,,,,,0.082212433218956,,,,,, +2,14749,,,,,,,,,,,,0.08219258487224579,,,,,, +2,14799,,,,,,,,,,,,0.08068737387657166,,,,,, +2,14849,,,,,,,,,,,,0.07050842046737671,,,,,, +2,14899,,,,,,,,,,,,0.0788094773888588,,,,,, +2,14949,,,,,,,,,,,,0.0800461694598198,,,,,, +2,14999,,,,,,,,,,,,0.08562714606523514,,,,,, +2,15049,,,,,,,,,,,,0.07905136048793793,,,,,, +2,15099,,,,,,,,,,,,0.09027775377035141,,,,,, +2,15149,,,,,,,,,,,,0.08228954672813416,,,,,, +2,15199,,,,,,,,,,,,0.08522697538137436,,,,,, +2,15249,,,,,,,,,,,,0.07892360538244247,,,,,, +2,15299,,,,,,,,,,,,0.08691229671239853,,,,,, +2,15349,,,,,,,,,,,,0.07811075448989868,,,,,, +2,15399,,,,,,,,,,,,0.07612085342407227,,,,,, +2,15449,,,,,,,,,,,,0.07557405531406403,,,,,, +2,15499,,,,,,,,,,,,0.10096867382526398,,,,,, +2,15549,,,,,,,,,,,,0.07644995301961899,,,,,, +2,15599,,,,,,,,,,,,0.08435086905956268,,,,,, +2,15649,,,,,,,,,,,,0.08011458814144135,,,,,, +2,15699,,,,,,,,,,,,0.09324372559785843,,,,,, +2,15749,,,,,,,,,,,,0.07675354182720184,,,,,, +2,15799,,,,,,,,,,,,0.08777512609958649,,,,,, +2,15849,,,,,,,,,,,,0.07306577265262604,,,,,, +2,15899,,,,,,,,,,,,0.08277799189090729,,,,,, +2,15949,,,,,,,,,,,,0.08862972259521484,,,,,, +2,15999,,,,,,,,,,,,0.08138801157474518,,,,,, +2,16049,,,,,,,,,,,,0.0825662612915039,,,,,, +2,16099,,,,,,,,,,,,0.07913422584533691,,,,,, +2,16149,,,,,,,,,,,,0.08959408104419708,,,,,, +2,16199,,,,,,,,,,,,0.07803259789943695,,,,,, +2,16249,,,,,,,,,,,,0.0690801590681076,,,,,, +2,16299,,,,,,,,,,,,0.08781830966472626,,,,,, +2,16349,,,,,,,,,,,,0.08163686841726303,,,,,, +2,16399,,,,,,,,,,,,0.08716336637735367,,,,,, +2,16449,,,,,,,,,,,,0.07706641405820847,,,,,, +2,16499,,,,,,,,,,,,0.0842360258102417,,,,,, +2,16549,,,,,,,,,,,,0.08871197700500488,,,,,, +2,16599,,,,,,,,,,,,0.08464427292346954,,,,,, +2,16649,,,,,,,,,,,,0.08241619914770126,,,,,, +2,16699,,,,,,,,,,,,0.0838727355003357,,,,,, +2,16749,,,,,,,,,,,,0.09385821968317032,,,,,, +2,16799,,,,,,,,,,,,0.07480310648679733,,,,,, +2,16849,,,,,,,,,,,,0.07967685163021088,,,,,, +2,16899,,,,,,,,,,,,0.08955611288547516,,,,,, +2,16949,,,,,,,,,,,,0.09074027836322784,,,,,, +2,16999,,,,,,,,,,,,0.06915569305419922,,,,,, +2,17049,,,,,,,,,,,,0.08752912282943726,,,,,, +2,17099,,,,,,,,,,,,0.07894295454025269,,,,,, +2,17149,,,,,,,,,,,,0.08470166474580765,,,,,, +2,17199,,,,,,,,,,,,0.07255260646343231,,,,,, +2,17207,,,,,,,,,,,,,0.2490619271993637,0.0830334797501564,nan,-0.007432460784912109,0.020326239988207817,0.0830334797501564 +2,17207,,,,,,,0.24867680668830872,0.08280482143163681,0.032267097383737564,-0.0005145072937011719,0.020577890798449516,,,,,,, +3,17249,,,,,,,,,,,,0.0803564265370369,,,,,, +3,17299,,,,,,,,,,,,0.08371387422084808,,,,,, +3,17349,,,,,,,,,,,,0.08102799952030182,,,,,, +3,17399,,,,,,,,,,,,0.07417728006839752,,,,,, +3,17449,,,,,,,,,,,,0.07711655646562576,,,,,, +3,17499,,,,,,,,,,,,0.0776742696762085,,,,,, +3,17549,,,,,,,,,,,,0.07746948301792145,,,,,, +3,17599,,,,,,,,,,,,0.08371526002883911,,,,,, +3,17649,,,,,,,,,,,,0.08518365770578384,,,,,, +3,17699,,,,,,,,,,,,0.07676081359386444,,,,,, +3,17749,,,,,,,,,,,,0.0835149809718132,,,,,, +3,17799,,,,,,,,,,,,0.08368410170078278,,,,,, +3,17849,,,,,,,,,,,,0.08074146509170532,,,,,, +3,17899,,,,,,,,,,,,0.08847242593765259,,,,,, +3,17949,,,,,,,,,,,,0.07465274631977081,,,,,, +3,17999,,,,,,,,,,,,0.08031241595745087,,,,,, +3,18049,,,,,,,,,,,,0.07783594727516174,,,,,, +3,18099,,,,,,,,,,,,0.0801883116364479,,,,,, +3,18149,,,,,,,,,,,,0.09274782985448837,,,,,, +3,18199,,,,,,,,,,,,0.07091990858316422,,,,,, +3,18249,,,,,,,,,,,,0.08610791712999344,,,,,, +3,18299,,,,,,,,,,,,0.0857606828212738,,,,,, +3,18349,,,,,,,,,,,,0.0731731429696083,,,,,, +3,18399,,,,,,,,,,,,0.09243553131818771,,,,,, +3,18449,,,,,,,,,,,,0.09278357028961182,,,,,, +3,18499,,,,,,,,,,,,0.09653324633836746,,,,,, +3,18549,,,,,,,,,,,,0.08296602964401245,,,,,, +3,18599,,,,,,,,,,,,0.0901055634021759,,,,,, +3,18649,,,,,,,,,,,,0.06191115826368332,,,,,, +3,18699,,,,,,,,,,,,0.09013248234987259,,,,,, +3,18749,,,,,,,,,,,,0.0928889811038971,,,,,, +3,18799,,,,,,,,,,,,0.09228941798210144,,,,,, +3,18849,,,,,,,,,,,,0.08054041117429733,,,,,, +3,18899,,,,,,,,,,,,0.07910628616809845,,,,,, +3,18949,,,,,,,,,,,,0.08112920820713043,,,,,, +3,18999,,,,,,,,,,,,0.08605420589447021,,,,,, +3,19049,,,,,,,,,,,,0.07982437312602997,,,,,, +3,19099,,,,,,,,,,,,0.08423031866550446,,,,,, +3,19149,,,,,,,,,,,,0.08291343599557877,,,,,, +3,19199,,,,,,,,,,,,0.08337339758872986,,,,,, +3,19249,,,,,,,,,,,,0.08807467669248581,,,,,, +3,19299,,,,,,,,,,,,0.08238130807876587,,,,,, +3,19349,,,,,,,,,,,,0.06555593758821487,,,,,, +3,19399,,,,,,,,,,,,0.08587822318077087,,,,,, +3,19449,,,,,,,,,,,,0.08499184250831604,,,,,, +3,19499,,,,,,,,,,,,0.07948390394449234,,,,,, +3,19549,,,,,,,,,,,,0.07637566328048706,,,,,, +3,19599,,,,,,,,,,,,0.07385876774787903,,,,,, +3,19649,,,,,,,,,,,,0.07435406744480133,,,,,, +3,19699,,,,,,,,,,,,0.06922101229429245,,,,,, +3,19749,,,,,,,,,,,,0.09131058305501938,,,,,, +3,19799,,,,,,,,,,,,0.06914855539798737,,,,,, +3,19849,,,,,,,,,,,,0.07900065928697586,,,,,, +3,19899,,,,,,,,,,,,0.07882629334926605,,,,,, +3,19949,,,,,,,,,,,,0.08462026715278625,,,,,, +3,19999,,,,,,,,,,,,0.0853818953037262,,,,,, +3,20049,,,,,,,,,,,,0.08335110545158386,,,,,, +3,20099,,,,,,,,,,,,0.07983080297708511,,,,,, +3,20149,,,,,,,,,,,,0.07301882654428482,,,,,, +3,20199,,,,,,,,,,,,0.07157643139362335,,,,,, +3,20249,,,,,,,,,,,,0.09259731322526932,,,,,, +3,20299,,,,,,,,,,,,0.07828110456466675,,,,,, +3,20349,,,,,,,,,,,,0.08846855163574219,,,,,, +3,20399,,,,,,,,,,,,0.09311680495738983,,,,,, +3,20449,,,,,,,,,,,,0.09357725828886032,,,,,, +3,20499,,,,,,,,,,,,0.07385166734457016,,,,,, +3,20549,,,,,,,,,,,,0.08428370952606201,,,,,, +3,20599,,,,,,,,,,,,0.07562459260225296,,,,,, +3,20649,,,,,,,,,,,,0.08308634161949158,,,,,, +3,20699,,,,,,,,,,,,0.07569269835948944,,,,,, +3,20749,,,,,,,,,,,,0.08268234878778458,,,,,, +3,20799,,,,,,,,,,,,0.0799352154135704,,,,,, +3,20849,,,,,,,,,,,,0.08016861975193024,,,,,, +3,20899,,,,,,,,,,,,0.08538675308227539,,,,,, +3,20949,,,,,,,,,,,,0.08488445729017258,,,,,, +3,20999,,,,,,,,,,,,0.08152387291193008,,,,,, +3,21049,,,,,,,,,,,,0.0793599933385849,,,,,, +3,21099,,,,,,,,,,,,0.06914253532886505,,,,,, +3,21149,,,,,,,,,,,,0.08197207748889923,,,,,, +3,21199,,,,,,,,,,,,0.07038845121860504,,,,,, +3,21249,,,,,,,,,,,,0.08599673211574554,,,,,, +3,21299,,,,,,,,,,,,0.07453816384077072,,,,,, +3,21349,,,,,,,,,,,,0.08739649504423141,,,,,, +3,21399,,,,,,,,,,,,0.0885138288140297,,,,,, +3,21449,,,,,,,,,,,,0.08019760251045227,,,,,, +3,21499,,,,,,,,,,,,0.09045597910881042,,,,,, +3,21549,,,,,,,,,,,,0.08217993378639221,,,,,, +3,21599,,,,,,,,,,,,0.07961808145046234,,,,,, +3,21649,,,,,,,,,,,,0.0772857740521431,,,,,, +3,21699,,,,,,,,,,,,0.08041112124919891,,,,,, +3,21749,,,,,,,,,,,,0.0782364010810852,,,,,, +3,21799,,,,,,,,,,,,0.0735926479101181,,,,,, +3,21849,,,,,,,,,,,,0.08447244763374329,,,,,, +3,21899,,,,,,,,,,,,0.07660230249166489,,,,,, +3,21949,,,,,,,,,,,,0.08628734201192856,,,,,, +3,21999,,,,,,,,,,,,0.07212954759597778,,,,,, +3,22049,,,,,,,,,,,,0.08103372156620026,,,,,, +3,22099,,,,,,,,,,,,0.07948975265026093,,,,,, +3,22149,,,,,,,,,,,,0.07426607608795166,,,,,, +3,22199,,,,,,,,,,,,0.09430751204490662,,,,,, +3,22249,,,,,,,,,,,,0.07638176530599594,,,,,, +3,22299,,,,,,,,,,,,0.07292770594358444,,,,,, +3,22349,,,,,,,,,,,,0.0962081179022789,,,,,, +3,22399,,,,,,,,,,,,0.06887516379356384,,,,,, +3,22449,,,,,,,,,,,,0.08629511296749115,,,,,, +3,22499,,,,,,,,,,,,0.07162713259458542,,,,,, +3,22549,,,,,,,,,,,,0.06972946226596832,,,,,, +3,22599,,,,,,,,,,,,0.0775957927107811,,,,,, +3,22649,,,,,,,,,,,,0.07166198641061783,,,,,, +3,22699,,,,,,,,,,,,0.07384590059518814,,,,,, +3,22749,,,,,,,,,,,,0.07248803228139877,,,,,, +3,22799,,,,,,,,,,,,0.0841485932469368,,,,,, +3,22849,,,,,,,,,,,,0.07759977877140045,,,,,, +3,22899,,,,,,,,,,,,0.0825856551527977,,,,,, +3,22943,,,,,,,,,,,,,0.24454370141029358,0.08148197829723358,0.1649274080991745,0.011391699314117432,0.16906331479549408,0.08148197829723358 +3,22943,,,,,,,0.24441534280776978,0.08070871233940125,0.16098299622535706,0.024793267250061035,0.14545482397079468,,,,,,, +4,22949,,,,,,,,,,,,0.08488211035728455,,,,,, +4,22999,,,,,,,,,,,,0.07708626985549927,,,,,, +4,23049,,,,,,,,,,,,0.07962565124034882,,,,,, +4,23099,,,,,,,,,,,,0.0758315920829773,,,,,, +4,23149,,,,,,,,,,,,0.08471187949180603,,,,,, +4,23199,,,,,,,,,,,,0.06832289695739746,,,,,, +4,23249,,,,,,,,,,,,0.0773766040802002,,,,,, +4,23299,,,,,,,,,,,,0.06673364341259003,,,,,, +4,23349,,,,,,,,,,,,0.07674871385097504,,,,,, +4,23399,,,,,,,,,,,,0.07452834397554398,,,,,, +4,23449,,,,,,,,,,,,0.07273977994918823,,,,,, +4,23499,,,,,,,,,,,,0.07305192947387695,,,,,, +4,23549,,,,,,,,,,,,0.07421605288982391,,,,,, +4,23599,,,,,,,,,,,,0.07199829071760178,,,,,, +4,23649,,,,,,,,,,,,0.06968212127685547,,,,,, +4,23699,,,,,,,,,,,,0.08081559836864471,,,,,, +4,23749,,,,,,,,,,,,0.07649002224206924,,,,,, +4,23799,,,,,,,,,,,,0.06655289232730865,,,,,, +4,23849,,,,,,,,,,,,0.07189883291721344,,,,,, +4,23899,,,,,,,,,,,,0.08005274832248688,,,,,, +4,23949,,,,,,,,,,,,0.062130894511938095,,,,,, +4,23999,,,,,,,,,,,,0.0804157555103302,,,,,, +4,24049,,,,,,,,,,,,0.08223739266395569,,,,,, +4,24099,,,,,,,,,,,,0.07503138482570648,,,,,, +4,24149,,,,,,,,,,,,0.07537931948900223,,,,,, +4,24199,,,,,,,,,,,,0.08252259343862534,,,,,, +4,24249,,,,,,,,,,,,0.0754384845495224,,,,,, +4,24299,,,,,,,,,,,,0.06782360374927521,,,,,, +4,24349,,,,,,,,,,,,0.08040472865104675,,,,,, +4,24399,,,,,,,,,,,,0.09178075194358826,,,,,, +4,24449,,,,,,,,,,,,0.09759566187858582,,,,,, +4,24499,,,,,,,,,,,,0.0878211110830307,,,,,, +4,24549,,,,,,,,,,,,0.08405759930610657,,,,,, +4,24599,,,,,,,,,,,,0.07636965811252594,,,,,, +4,24649,,,,,,,,,,,,0.07257629185914993,,,,,, +4,24699,,,,,,,,,,,,0.07929924130439758,,,,,, +4,24749,,,,,,,,,,,,0.0705668032169342,,,,,, +4,24799,,,,,,,,,,,,0.06842759251594543,,,,,, +4,24849,,,,,,,,,,,,0.08278209716081619,,,,,, +4,24899,,,,,,,,,,,,0.09527555108070374,,,,,, +4,24949,,,,,,,,,,,,0.08451510965824127,,,,,, +4,24999,,,,,,,,,,,,0.09046557545661926,,,,,, +4,25049,,,,,,,,,,,,0.08106695860624313,,,,,, +4,25099,,,,,,,,,,,,0.07899922132492065,,,,,, +4,25149,,,,,,,,,,,,0.08945231884717941,,,,,, +4,25199,,,,,,,,,,,,0.08963359892368317,,,,,, +4,25249,,,,,,,,,,,,0.09540587663650513,,,,,, +4,25299,,,,,,,,,,,,0.07875145971775055,,,,,, +4,25349,,,,,,,,,,,,0.0861356258392334,,,,,, +4,25399,,,,,,,,,,,,0.07968046516180038,,,,,, +4,25449,,,,,,,,,,,,0.07145539671182632,,,,,, +4,25499,,,,,,,,,,,,0.09069803357124329,,,,,, +4,25549,,,,,,,,,,,,0.08751784265041351,,,,,, +4,25599,,,,,,,,,,,,0.07193958759307861,,,,,, +4,25649,,,,,,,,,,,,0.08768104761838913,,,,,, +4,25699,,,,,,,,,,,,0.07701195776462555,,,,,, +4,25749,,,,,,,,,,,,0.07934233546257019,,,,,, +4,25799,,,,,,,,,,,,0.0837000235915184,,,,,, +4,25849,,,,,,,,,,,,0.08478061854839325,,,,,, +4,25899,,,,,,,,,,,,0.09482081234455109,,,,,, +4,25949,,,,,,,,,,,,0.08702393621206284,,,,,, +4,25999,,,,,,,,,,,,0.07301891595125198,,,,,, +4,26049,,,,,,,,,,,,0.07703737169504166,,,,,, +4,26099,,,,,,,,,,,,0.08906841278076172,,,,,, +4,26149,,,,,,,,,,,,0.07478417456150055,,,,,, +4,26199,,,,,,,,,,,,0.09260183572769165,,,,,, +4,26249,,,,,,,,,,,,0.0926140695810318,,,,,, +4,26299,,,,,,,,,,,,0.0846056267619133,,,,,, +4,26349,,,,,,,,,,,,0.08106286823749542,,,,,, +4,26399,,,,,,,,,,,,0.07598897814750671,,,,,, +4,26449,,,,,,,,,,,,0.08075930178165436,,,,,, +4,26499,,,,,,,,,,,,0.0784987062215805,,,,,, +4,26549,,,,,,,,,,,,0.08326060324907303,,,,,, +4,26599,,,,,,,,,,,,0.08679860830307007,,,,,, +4,26649,,,,,,,,,,,,0.0873376801609993,,,,,, +4,26699,,,,,,,,,,,,0.09106112271547318,,,,,, +4,26749,,,,,,,,,,,,0.08498938381671906,,,,,, +4,26799,,,,,,,,,,,,0.08344297111034393,,,,,, +4,26849,,,,,,,,,,,,0.07704292237758636,,,,,, +4,26899,,,,,,,,,,,,0.08388420939445496,,,,,, +4,26949,,,,,,,,,,,,0.08829422295093536,,,,,, +4,26999,,,,,,,,,,,,0.08386475592851639,,,,,, +4,27049,,,,,,,,,,,,0.08181048184633255,,,,,, +4,27099,,,,,,,,,,,,0.07923006266355515,,,,,, +4,27149,,,,,,,,,,,,0.08616462349891663,,,,,, +4,27199,,,,,,,,,,,,0.07378299534320831,,,,,, +4,27249,,,,,,,,,,,,0.0802844986319542,,,,,, +4,27299,,,,,,,,,,,,0.09224285930395126,,,,,, +4,27349,,,,,,,,,,,,0.08241382241249084,,,,,, +4,27399,,,,,,,,,,,,0.07129400968551636,,,,,, +4,27449,,,,,,,,,,,,0.08138582855463028,,,,,, +4,27499,,,,,,,,,,,,0.08793418109416962,,,,,, +4,27549,,,,,,,,,,,,0.0880744606256485,,,,,, +4,27599,,,,,,,,,,,,0.0872398242354393,,,,,, +4,27649,,,,,,,,,,,,0.07774841785430908,,,,,, +4,27699,,,,,,,,,,,,0.07806073129177094,,,,,, +4,27749,,,,,,,,,,,,0.0716293528676033,,,,,, +4,27799,,,,,,,,,,,,0.08493197709321976,,,,,, +4,27849,,,,,,,,,,,,0.09075269103050232,,,,,, +4,27899,,,,,,,,,,,,0.08946223556995392,,,,,, +4,27949,,,,,,,,,,,,0.08209672570228577,,,,,, +4,27999,,,,,,,,,,,,0.08944007754325867,,,,,, +4,28049,,,,,,,,,,,,0.08466830849647522,,,,,, +4,28099,,,,,,,,,,,,0.08575868606567383,,,,,, +4,28149,,,,,,,,,,,,0.08957906067371368,,,,,, +4,28199,,,,,,,,,,,,0.07861454784870148,,,,,, +4,28249,,,,,,,,,,,,0.08141224831342697,,,,,, +4,28299,,,,,,,,,,,,0.08887035399675369,,,,,, +4,28349,,,,,,,,,,,,0.08669345080852509,,,,,, +4,28399,,,,,,,,,,,,0.09289902448654175,,,,,, +4,28449,,,,,,,,,,,,0.08855269849300385,,,,,, +4,28499,,,,,,,,,,,,0.0807633101940155,,,,,, +4,28549,,,,,,,,,,,,0.07226075232028961,,,,,, +4,28599,,,,,,,,,,,,0.07737138122320175,,,,,, +4,28649,,,,,,,,,,,,0.0750705897808075,,,,,, +4,28679,,,,,,,,,,,,,0.24849851429462433,0.08264695107936859,nan,-0.002742767333984375,-0.03336181864142418,0.08264695107936859 +4,28679,,,,,,,0.24689753353595734,0.09867464005947113,0.04162292554974556,-0.19228661060333252,0.08639935404062271,,,,,,, +5,28699,,,,,,,,,,,,0.09374618530273438,,,,,, +5,28749,,,,,,,,,,,,0.09132084250450134,,,,,, +5,28799,,,,,,,,,,,,0.09684412181377411,,,,,, +5,28849,,,,,,,,,,,,0.08928126096725464,,,,,, +5,28899,,,,,,,,,,,,0.08873390406370163,,,,,, +5,28949,,,,,,,,,,,,0.08583629131317139,,,,,, +5,28999,,,,,,,,,,,,0.09470413625240326,,,,,, +5,29049,,,,,,,,,,,,0.09198854118585587,,,,,, +5,29099,,,,,,,,,,,,0.07323622703552246,,,,,, +5,29149,,,,,,,,,,,,0.07530322670936584,,,,,, +5,29199,,,,,,,,,,,,0.08451467752456665,,,,,, +5,29249,,,,,,,,,,,,0.08695720881223679,,,,,, +5,29299,,,,,,,,,,,,0.08096173405647278,,,,,, +5,29349,,,,,,,,,,,,0.09091036021709442,,,,,, +5,29399,,,,,,,,,,,,0.08312511444091797,,,,,, +5,29449,,,,,,,,,,,,0.0817769393324852,,,,,, +5,29499,,,,,,,,,,,,0.08863553404808044,,,,,, +5,29549,,,,,,,,,,,,0.08700308948755264,,,,,, +5,29599,,,,,,,,,,,,0.08281335234642029,,,,,, +5,29649,,,,,,,,,,,,0.08487004041671753,,,,,, +5,29699,,,,,,,,,,,,0.0679837316274643,,,,,, +5,29749,,,,,,,,,,,,0.09076616168022156,,,,,, +5,29799,,,,,,,,,,,,0.08891922235488892,,,,,, +5,29849,,,,,,,,,,,,0.09244154393672943,,,,,, +5,29899,,,,,,,,,,,,0.08492846041917801,,,,,, +5,29949,,,,,,,,,,,,0.0897049605846405,,,,,, +5,29999,,,,,,,,,,,,0.0843261331319809,,,,,, +5,30049,,,,,,,,,,,,0.09302733093500137,,,,,, +5,30099,,,,,,,,,,,,0.08519681543111801,,,,,, +5,30149,,,,,,,,,,,,0.10637828707695007,,,,,, +5,30199,,,,,,,,,,,,0.09838428348302841,,,,,, +5,30249,,,,,,,,,,,,0.06922644376754761,,,,,, +5,30299,,,,,,,,,,,,0.09014631807804108,,,,,, +5,30349,,,,,,,,,,,,0.08453203737735748,,,,,, +5,30399,,,,,,,,,,,,0.0933590680360794,,,,,, +5,30449,,,,,,,,,,,,0.09093788266181946,,,,,, +5,30499,,,,,,,,,,,,0.07448680698871613,,,,,, +5,30549,,,,,,,,,,,,0.08991460502147675,,,,,, +5,30599,,,,,,,,,,,,0.07918839156627655,,,,,, +5,30649,,,,,,,,,,,,0.09268146753311157,,,,,, +5,30699,,,,,,,,,,,,0.08373980224132538,,,,,, +5,30749,,,,,,,,,,,,0.08545045554637909,,,,,, +5,30799,,,,,,,,,,,,0.09450389444828033,,,,,, +5,30849,,,,,,,,,,,,0.08100342750549316,,,,,, +5,30899,,,,,,,,,,,,0.08556067198514938,,,,,, +5,30949,,,,,,,,,,,,0.07948023080825806,,,,,, +5,30999,,,,,,,,,,,,0.09393803775310516,,,,,, +5,31049,,,,,,,,,,,,0.06763380020856857,,,,,, +5,31099,,,,,,,,,,,,0.09207882732152939,,,,,, +5,31149,,,,,,,,,,,,0.08311006426811218,,,,,, +5,31199,,,,,,,,,,,,0.08800691366195679,,,,,, +5,31249,,,,,,,,,,,,0.08184937387704849,,,,,, +5,31299,,,,,,,,,,,,0.08588604629039764,,,,,, +5,31349,,,,,,,,,,,,0.07853522896766663,,,,,, +5,31399,,,,,,,,,,,,0.09258940815925598,,,,,, +5,31449,,,,,,,,,,,,0.08682224154472351,,,,,, +5,31499,,,,,,,,,,,,0.08320693671703339,,,,,, +5,31549,,,,,,,,,,,,0.0769021213054657,,,,,, +5,31599,,,,,,,,,,,,0.08912961930036545,,,,,, +5,31649,,,,,,,,,,,,0.06791894882917404,,,,,, +5,31699,,,,,,,,,,,,0.08168822526931763,,,,,, +5,31749,,,,,,,,,,,,0.07550006359815598,,,,,, +5,31799,,,,,,,,,,,,0.08758813142776489,,,,,, +5,31849,,,,,,,,,,,,0.08377037197351456,,,,,, +5,31899,,,,,,,,,,,,0.07915862649679184,,,,,, +5,31949,,,,,,,,,,,,0.08234992623329163,,,,,, +5,31999,,,,,,,,,,,,0.0790482610464096,,,,,, +5,32049,,,,,,,,,,,,0.09382899850606918,,,,,, +5,32099,,,,,,,,,,,,0.07839080691337585,,,,,, +5,32149,,,,,,,,,,,,0.08571869879961014,,,,,, +5,32199,,,,,,,,,,,,0.08961664140224457,,,,,, +5,32249,,,,,,,,,,,,0.09511783719062805,,,,,, +5,32299,,,,,,,,,,,,0.09112169593572617,,,,,, +5,32349,,,,,,,,,,,,0.07102334499359131,,,,,, +5,32399,,,,,,,,,,,,0.0800851583480835,,,,,, +5,32449,,,,,,,,,,,,0.08014477789402008,,,,,, +5,32499,,,,,,,,,,,,0.07740046083927155,,,,,, +5,32549,,,,,,,,,,,,0.07204484939575195,,,,,, +5,32599,,,,,,,,,,,,0.09084956347942352,,,,,, +5,32649,,,,,,,,,,,,0.08048766106367111,,,,,, +5,32699,,,,,,,,,,,,0.0878402441740036,,,,,, +5,32749,,,,,,,,,,,,0.07512764632701874,,,,,, +5,32799,,,,,,,,,,,,0.09534069895744324,,,,,, +5,32849,,,,,,,,,,,,0.08029092848300934,,,,,, +5,32899,,,,,,,,,,,,0.08268877863883972,,,,,, +5,32949,,,,,,,,,,,,0.06885413825511932,,,,,, +5,32999,,,,,,,,,,,,0.08797729015350342,,,,,, +5,33049,,,,,,,,,,,,0.08153880387544632,,,,,, +5,33099,,,,,,,,,,,,0.07904215902090073,,,,,, +5,33149,,,,,,,,,,,,0.08487800508737564,,,,,, +5,33199,,,,,,,,,,,,0.09047581255435944,,,,,, +5,33249,,,,,,,,,,,,0.086153045296669,,,,,, +5,33299,,,,,,,,,,,,0.08055222034454346,,,,,, +5,33349,,,,,,,,,,,,0.08538832515478134,,,,,, +5,33399,,,,,,,,,,,,0.09347308427095413,,,,,, +5,33449,,,,,,,,,,,,0.08428926020860672,,,,,, +5,33499,,,,,,,,,,,,0.08656381815671921,,,,,, +5,33549,,,,,,,,,,,,0.09016583859920502,,,,,, +5,33599,,,,,,,,,,,,0.0737408995628357,,,,,, +5,33649,,,,,,,,,,,,0.07995517551898956,,,,,, +5,33699,,,,,,,,,,,,0.0727090835571289,,,,,, +5,33749,,,,,,,,,,,,0.0828903466463089,,,,,, +5,33799,,,,,,,,,,,,0.0848160982131958,,,,,, +5,33849,,,,,,,,,,,,0.07715810835361481,,,,,, +5,33899,,,,,,,,,,,,0.08248560130596161,,,,,, +5,33949,,,,,,,,,,,,0.09031913429498672,,,,,, +5,33999,,,,,,,,,,,,0.07183706760406494,,,,,, +5,34049,,,,,,,,,,,,0.09257958084344864,,,,,, +5,34099,,,,,,,,,,,,0.0851997584104538,,,,,, +5,34149,,,,,,,,,,,,0.07357725501060486,,,,,, +5,34199,,,,,,,,,,,,0.07893824577331543,,,,,, +5,34249,,,,,,,,,,,,0.07808727025985718,,,,,, +5,34299,,,,,,,,,,,,0.08804843574762344,,,,,, +5,34349,,,,,,,,,,,,0.08612854033708572,,,,,, +5,34399,,,,,,,,,,,,0.07130032032728195,,,,,, +5,34415,,,,,,,,,,,,,0.24802646040916443,0.08232307434082031,nan,0.0011867880821228027,0.10425788909196854,0.08232307434082031 +5,34415,,,,,,,0.24956555664539337,0.08359288424253464,0.0004900041967630386,-0.010042786598205566,0.00039227993693202734,,,,,,, +6,34449,,,,,,,,,,,,0.08497625589370728,,,,,, +6,34499,,,,,,,,,,,,0.08024357259273529,,,,,, +6,34549,,,,,,,,,,,,0.08349737524986267,,,,,, +6,34599,,,,,,,,,,,,0.07921840250492096,,,,,, +6,34649,,,,,,,,,,,,0.08658044785261154,,,,,, +6,34699,,,,,,,,,,,,0.07373248785734177,,,,,, +6,34749,,,,,,,,,,,,0.08122237771749496,,,,,, +6,34799,,,,,,,,,,,,0.09298843145370483,,,,,, +6,34849,,,,,,,,,,,,0.07395634055137634,,,,,, +6,34899,,,,,,,,,,,,0.07229961454868317,,,,,, +6,34949,,,,,,,,,,,,0.08935577422380447,,,,,, +6,34999,,,,,,,,,,,,0.09370164573192596,,,,,, +6,35049,,,,,,,,,,,,0.09368108212947845,,,,,, +6,35099,,,,,,,,,,,,0.07548680901527405,,,,,, +6,35149,,,,,,,,,,,,0.0699739009141922,,,,,, +6,35199,,,,,,,,,,,,0.08276218175888062,,,,,, +6,35249,,,,,,,,,,,,0.08224642276763916,,,,,, +6,35299,,,,,,,,,,,,0.06937660276889801,,,,,, +6,35349,,,,,,,,,,,,0.0873456597328186,,,,,, +6,35399,,,,,,,,,,,,0.07676099985837936,,,,,, +6,35449,,,,,,,,,,,,0.09122374653816223,,,,,, +6,35499,,,,,,,,,,,,0.08398015797138214,,,,,, +6,35549,,,,,,,,,,,,0.08701347559690475,,,,,, +6,35599,,,,,,,,,,,,0.07864280045032501,,,,,, +6,35649,,,,,,,,,,,,0.07120872288942337,,,,,, +6,35699,,,,,,,,,,,,0.08403288573026657,,,,,, +6,35749,,,,,,,,,,,,0.08401460945606232,,,,,, +6,35799,,,,,,,,,,,,0.08161640912294388,,,,,, +6,35849,,,,,,,,,,,,0.08416320383548737,,,,,, +6,35899,,,,,,,,,,,,0.08243453502655029,,,,,, +6,35949,,,,,,,,,,,,0.07890492677688599,,,,,, +6,35999,,,,,,,,,,,,0.0871226117014885,,,,,, +6,36049,,,,,,,,,,,,0.08931027352809906,,,,,, +6,36099,,,,,,,,,,,,0.07343007624149323,,,,,, +6,36149,,,,,,,,,,,,0.08391526341438293,,,,,, +6,36199,,,,,,,,,,,,0.06870780885219574,,,,,, +6,36249,,,,,,,,,,,,0.09106262028217316,,,,,, +6,36299,,,,,,,,,,,,0.0892888531088829,,,,,, +6,36349,,,,,,,,,,,,0.08961473405361176,,,,,, +6,36399,,,,,,,,,,,,0.08128207921981812,,,,,, +6,36449,,,,,,,,,,,,0.08156777918338776,,,,,, +6,36499,,,,,,,,,,,,0.07526854425668716,,,,,, +6,36549,,,,,,,,,,,,0.08327288925647736,,,,,, +6,36599,,,,,,,,,,,,0.07906828820705414,,,,,, +6,36649,,,,,,,,,,,,0.0796094760298729,,,,,, +6,36699,,,,,,,,,,,,0.07527157664299011,,,,,, +6,36749,,,,,,,,,,,,0.08425040543079376,,,,,, +6,36799,,,,,,,,,,,,0.06686271727085114,,,,,, +6,36849,,,,,,,,,,,,0.07481038570404053,,,,,, +6,36899,,,,,,,,,,,,0.08717361092567444,,,,,, +6,36949,,,,,,,,,,,,0.07662639766931534,,,,,, +6,36999,,,,,,,,,,,,0.09258432686328888,,,,,, +6,37049,,,,,,,,,,,,0.07471074163913727,,,,,, +6,37099,,,,,,,,,,,,0.0829782783985138,,,,,, +6,37149,,,,,,,,,,,,0.06574125587940216,,,,,, +6,37199,,,,,,,,,,,,0.07209187746047974,,,,,, +6,37249,,,,,,,,,,,,0.08994363993406296,,,,,, +6,37299,,,,,,,,,,,,0.0783342719078064,,,,,, +6,37349,,,,,,,,,,,,0.09254048019647598,,,,,, +6,37399,,,,,,,,,,,,0.07264555990695953,,,,,, +6,37449,,,,,,,,,,,,0.08271923661231995,,,,,, +6,37499,,,,,,,,,,,,0.07751445472240448,,,,,, +6,37549,,,,,,,,,,,,0.07696283608675003,,,,,, +6,37599,,,,,,,,,,,,0.08898989856243134,,,,,, +6,37649,,,,,,,,,,,,0.08405083417892456,,,,,, +6,37699,,,,,,,,,,,,0.07509501278400421,,,,,, +6,37749,,,,,,,,,,,,0.07359173893928528,,,,,, +6,37799,,,,,,,,,,,,0.07134710252285004,,,,,, +6,37849,,,,,,,,,,,,0.0812729001045227,,,,,, +6,37899,,,,,,,,,,,,0.07540763914585114,,,,,, +6,37949,,,,,,,,,,,,0.08311603963375092,,,,,, +6,37999,,,,,,,,,,,,0.06901364028453827,,,,,, +6,38049,,,,,,,,,,,,0.08644767850637436,,,,,, +6,38099,,,,,,,,,,,,0.06971454620361328,,,,,, +6,38149,,,,,,,,,,,,0.08362232148647308,,,,,, +6,38199,,,,,,,,,,,,0.07135990262031555,,,,,, +6,38249,,,,,,,,,,,,0.08091777563095093,,,,,, +6,38299,,,,,,,,,,,,0.07618345320224762,,,,,, +6,38349,,,,,,,,,,,,0.07013217359781265,,,,,, +6,38399,,,,,,,,,,,,0.07924152165651321,,,,,, +6,38449,,,,,,,,,,,,0.06873638182878494,,,,,, +6,38499,,,,,,,,,,,,0.06664054840803146,,,,,, +6,38549,,,,,,,,,,,,0.08039270341396332,,,,,, +6,38599,,,,,,,,,,,,0.07483765482902527,,,,,, +6,38649,,,,,,,,,,,,0.07999880611896515,,,,,, +6,38699,,,,,,,,,,,,0.07687561959028244,,,,,, +6,38749,,,,,,,,,,,,0.0745752602815628,,,,,, +6,38799,,,,,,,,,,,,0.060642242431640625,,,,,, +6,38849,,,,,,,,,,,,0.08527325093746185,,,,,, +6,38899,,,,,,,,,,,,0.08145391941070557,,,,,, +6,38949,,,,,,,,,,,,0.07902403175830841,,,,,, +6,38999,,,,,,,,,,,,0.07149869203567505,,,,,, +6,39049,,,,,,,,,,,,0.06977663934230804,,,,,, +6,39099,,,,,,,,,,,,0.07587891817092896,,,,,, +6,39149,,,,,,,,,,,,0.07333055138587952,,,,,, +6,39199,,,,,,,,,,,,0.07941555976867676,,,,,, +6,39249,,,,,,,,,,,,0.0848395824432373,,,,,, +6,39299,,,,,,,,,,,,0.07395350933074951,,,,,, +6,39349,,,,,,,,,,,,0.07109608501195908,,,,,, +6,39399,,,,,,,,,,,,0.08754179626703262,,,,,, +6,39449,,,,,,,,,,,,0.09226305782794952,,,,,, +6,39499,,,,,,,,,,,,0.07558894157409668,,,,,, +6,39549,,,,,,,,,,,,0.07778577506542206,,,,,, +6,39599,,,,,,,,,,,,0.09358245879411697,,,,,, +6,39649,,,,,,,,,,,,0.0789797306060791,,,,,, +6,39699,,,,,,,,,,,,0.08241026103496552,,,,,, +6,39749,,,,,,,,,,,,0.08480921387672424,,,,,, +6,39799,,,,,,,,,,,,0.06990976631641388,,,,,, +6,39849,,,,,,,,,,,,0.0755552276968956,,,,,, +6,39899,,,,,,,,,,,,0.0786745473742485,,,,,, +6,39949,,,,,,,,,,,,0.08823710680007935,,,,,, +6,39999,,,,,,,,,,,,0.07406564801931381,,,,,, +6,40049,,,,,,,,,,,,0.09104898571968079,,,,,, +6,40099,,,,,,,,,,,,0.06889048218727112,,,,,, +6,40149,,,,,,,,,,,,0.07255129516124725,,,,,, +6,40151,,,,,,,,,,,,,0.24363110959529877,0.0804978460073471,0.16305358707904816,0.023331940174102783,0.1734832525253296,0.0804978460073471 +6,40151,,,,,,,0.24352127313613892,0.08045997470617294,0.17213548719882965,0.027826547622680664,0.16229917109012604,,,,,,, +7,40199,,,,,,,,,,,,0.07157750427722931,,,,,, +7,40249,,,,,,,,,,,,0.07037881016731262,,,,,, +7,40299,,,,,,,,,,,,0.08236449956893921,,,,,, +7,40349,,,,,,,,,,,,0.06575940549373627,,,,,, +7,40399,,,,,,,,,,,,0.07453221082687378,,,,,, +7,40449,,,,,,,,,,,,0.07201720029115677,,,,,, +7,40499,,,,,,,,,,,,0.08287286758422852,,,,,, +7,40549,,,,,,,,,,,,0.07988840341567993,,,,,, +7,40599,,,,,,,,,,,,0.08146980404853821,,,,,, +7,40649,,,,,,,,,,,,0.08049135655164719,,,,,, +7,40699,,,,,,,,,,,,0.07703559100627899,,,,,, +7,40749,,,,,,,,,,,,0.07303357124328613,,,,,, +7,40799,,,,,,,,,,,,0.07576393336057663,,,,,, +7,40849,,,,,,,,,,,,0.0740516185760498,,,,,, +7,40899,,,,,,,,,,,,0.08473563194274902,,,,,, +7,40949,,,,,,,,,,,,0.08566837757825851,,,,,, +7,40999,,,,,,,,,,,,0.06399901211261749,,,,,, +7,41049,,,,,,,,,,,,0.0876917913556099,,,,,, +7,41099,,,,,,,,,,,,0.07796017825603485,,,,,, +7,41149,,,,,,,,,,,,0.0895281732082367,,,,,, +7,41199,,,,,,,,,,,,0.07374809682369232,,,,,, +7,41249,,,,,,,,,,,,0.0781119093298912,,,,,, +7,41299,,,,,,,,,,,,0.07164841890335083,,,,,, +7,41349,,,,,,,,,,,,0.08652438968420029,,,,,, +7,41399,,,,,,,,,,,,0.07611839473247528,,,,,, +7,41449,,,,,,,,,,,,0.0716279149055481,,,,,, +7,41499,,,,,,,,,,,,0.07539869844913483,,,,,, +7,41549,,,,,,,,,,,,0.08438272774219513,,,,,, +7,41599,,,,,,,,,,,,0.08610531687736511,,,,,, +7,41649,,,,,,,,,,,,0.07213203608989716,,,,,, +7,41699,,,,,,,,,,,,0.07488244771957397,,,,,, +7,41749,,,,,,,,,,,,0.07689648121595383,,,,,, +7,41799,,,,,,,,,,,,0.07667079567909241,,,,,, +7,41849,,,,,,,,,,,,0.08789839595556259,,,,,, +7,41899,,,,,,,,,,,,0.07732835412025452,,,,,, +7,41949,,,,,,,,,,,,0.08194275200366974,,,,,, +7,41999,,,,,,,,,,,,0.08410488069057465,,,,,, +7,42049,,,,,,,,,,,,0.07989918440580368,,,,,, +7,42099,,,,,,,,,,,,0.09104301035404205,,,,,, +7,42149,,,,,,,,,,,,0.07638043910264969,,,,,, +7,42199,,,,,,,,,,,,0.07909853756427765,,,,,, +7,42249,,,,,,,,,,,,0.09029670059680939,,,,,, +7,42299,,,,,,,,,,,,0.08581757545471191,,,,,, +7,42349,,,,,,,,,,,,0.07151968032121658,,,,,, +7,42399,,,,,,,,,,,,0.07607560604810715,,,,,, +7,42449,,,,,,,,,,,,0.07246823608875275,,,,,, +7,42499,,,,,,,,,,,,0.07926779240369797,,,,,, +7,42549,,,,,,,,,,,,0.07327663898468018,,,,,, +7,42599,,,,,,,,,,,,0.08738888800144196,,,,,, +7,42649,,,,,,,,,,,,0.08616600930690765,,,,,, +7,42699,,,,,,,,,,,,0.09110863506793976,,,,,, +7,42749,,,,,,,,,,,,0.07169461250305176,,,,,, +7,42799,,,,,,,,,,,,0.08061002939939499,,,,,, +7,42849,,,,,,,,,,,,0.07414983212947845,,,,,, +7,42899,,,,,,,,,,,,0.0754559189081192,,,,,, +7,42949,,,,,,,,,,,,0.07322969287633896,,,,,, +7,42999,,,,,,,,,,,,0.07191464304924011,,,,,, +7,43049,,,,,,,,,,,,0.07735081762075424,,,,,, +7,43099,,,,,,,,,,,,0.07234769314527512,,,,,, +7,43149,,,,,,,,,,,,0.07538551837205887,,,,,, +7,43199,,,,,,,,,,,,0.07906050980091095,,,,,, +7,43249,,,,,,,,,,,,0.07217007875442505,,,,,, +7,43299,,,,,,,,,,,,0.07095210254192352,,,,,, +7,43349,,,,,,,,,,,,0.07008474320173264,,,,,, +7,43399,,,,,,,,,,,,0.0869615375995636,,,,,, +7,43449,,,,,,,,,,,,0.08009104430675507,,,,,, +7,43499,,,,,,,,,,,,0.07970309257507324,,,,,, +7,43549,,,,,,,,,,,,0.07340122759342194,,,,,, +7,43599,,,,,,,,,,,,0.07643165439367294,,,,,, +7,43649,,,,,,,,,,,,0.08202777057886124,,,,,, +7,43699,,,,,,,,,,,,0.07512900233268738,,,,,, +7,43749,,,,,,,,,,,,0.08359476923942566,,,,,, +7,43799,,,,,,,,,,,,0.06221454590559006,,,,,, +7,43849,,,,,,,,,,,,0.06713810563087463,,,,,, +7,43899,,,,,,,,,,,,0.10590796172618866,,,,,, +7,43949,,,,,,,,,,,,0.08332572877407074,,,,,, +7,43999,,,,,,,,,,,,0.08691377937793732,,,,,, +7,44049,,,,,,,,,,,,0.06224248558282852,,,,,, +7,44099,,,,,,,,,,,,0.07478080689907074,,,,,, +7,44149,,,,,,,,,,,,0.07914289087057114,,,,,, +7,44199,,,,,,,,,,,,0.08068560063838959,,,,,, +7,44249,,,,,,,,,,,,0.07831810414791107,,,,,, +7,44299,,,,,,,,,,,,0.07669146358966827,,,,,, +7,44349,,,,,,,,,,,,0.07082227617502213,,,,,, +7,44399,,,,,,,,,,,,0.085482656955719,,,,,, +7,44449,,,,,,,,,,,,0.07889781892299652,,,,,, +7,44499,,,,,,,,,,,,0.08055423200130463,,,,,, +7,44549,,,,,,,,,,,,0.07706843316555023,,,,,, +7,44599,,,,,,,,,,,,0.0741836279630661,,,,,, +7,44649,,,,,,,,,,,,0.08147100359201431,,,,,, +7,44699,,,,,,,,,,,,0.07709170132875443,,,,,, +7,44749,,,,,,,,,,,,0.07398606836795807,,,,,, +7,44799,,,,,,,,,,,,0.07919827103614807,,,,,, +7,44849,,,,,,,,,,,,0.07531467080116272,,,,,, +7,44899,,,,,,,,,,,,0.06517859548330307,,,,,, +7,44949,,,,,,,,,,,,0.08196990936994553,,,,,, +7,44999,,,,,,,,,,,,0.07523582130670547,,,,,, +7,45049,,,,,,,,,,,,0.08198820054531097,,,,,, +7,45099,,,,,,,,,,,,0.06538122892379761,,,,,, +7,45149,,,,,,,,,,,,0.08946963399648666,,,,,, +7,45199,,,,,,,,,,,,0.07987672090530396,,,,,, +7,45249,,,,,,,,,,,,0.08650730550289154,,,,,, +7,45299,,,,,,,,,,,,0.08507043123245239,,,,,, +7,45349,,,,,,,,,,,,0.08461637794971466,,,,,, +7,45399,,,,,,,,,,,,0.07001929730176926,,,,,, +7,45449,,,,,,,,,,,,0.07642485201358795,,,,,, +7,45499,,,,,,,,,,,,0.07017561793327332,,,,,, +7,45549,,,,,,,,,,,,0.07240808010101318,,,,,, +7,45599,,,,,,,,,,,,0.06610032916069031,,,,,, +7,45649,,,,,,,,,,,,0.0847247913479805,,,,,, +7,45699,,,,,,,,,,,,0.07944019883871078,,,,,, +7,45749,,,,,,,,,,,,0.07155050337314606,,,,,, +7,45799,,,,,,,,,,,,0.08240827172994614,,,,,, +7,45849,,,,,,,,,,,,0.0854145884513855,,,,,, +7,45887,,,,,,,,,,,,,0.2452361285686493,0.08281680941581726,0.16648347675800323,-0.004803657531738281,0.18703874945640564,0.08281680941581726 +7,45887,,,,,,,0.23913513123989105,0.07806585729122162,0.2394143044948578,0.0567326545715332,0.22402170300483704,,,,,,, +8,45899,,,,,,,,,,,,0.08058085292577744,,,,,, +8,45949,,,,,,,,,,,,0.0665794312953949,,,,,, +8,45999,,,,,,,,,,,,0.08070752024650574,,,,,, +8,46049,,,,,,,,,,,,0.07288774847984314,,,,,, +8,46099,,,,,,,,,,,,0.08075614273548126,,,,,, +8,46149,,,,,,,,,,,,0.08186739683151245,,,,,, +8,46199,,,,,,,,,,,,0.07533334195613861,,,,,, +8,46249,,,,,,,,,,,,0.07178773730993271,,,,,, +8,46299,,,,,,,,,,,,0.07226695120334625,,,,,, +8,46349,,,,,,,,,,,,0.08158960938453674,,,,,, +8,46399,,,,,,,,,,,,0.07044824957847595,,,,,, +8,46449,,,,,,,,,,,,0.08162945508956909,,,,,, +8,46499,,,,,,,,,,,,0.07560725510120392,,,,,, +8,46549,,,,,,,,,,,,0.08827213197946548,,,,,, +8,46599,,,,,,,,,,,,0.07631132006645203,,,,,, +8,46649,,,,,,,,,,,,0.08489982783794403,,,,,, +8,46699,,,,,,,,,,,,0.08705787360668182,,,,,, +8,46749,,,,,,,,,,,,0.07962284982204437,,,,,, +8,46799,,,,,,,,,,,,0.07299991697072983,,,,,, +8,46849,,,,,,,,,,,,0.08966180682182312,,,,,, +8,46899,,,,,,,,,,,,0.05911155045032501,,,,,, +8,46949,,,,,,,,,,,,0.079503633081913,,,,,, +8,46999,,,,,,,,,,,,0.08378654718399048,,,,,, +8,47049,,,,,,,,,,,,0.07551378011703491,,,,,, +8,47099,,,,,,,,,,,,0.06339173018932343,,,,,, +8,47149,,,,,,,,,,,,0.07064083218574524,,,,,, +8,47199,,,,,,,,,,,,0.07294785231351852,,,,,, +8,47249,,,,,,,,,,,,0.07311668246984482,,,,,, +8,47299,,,,,,,,,,,,0.08010043948888779,,,,,, +8,47349,,,,,,,,,,,,0.07780835777521133,,,,,, +8,47399,,,,,,,,,,,,0.08544544130563736,,,,,, +8,47449,,,,,,,,,,,,0.08065489679574966,,,,,, +8,47499,,,,,,,,,,,,0.07603257894515991,,,,,, +8,47549,,,,,,,,,,,,0.08271478116512299,,,,,, +8,47599,,,,,,,,,,,,0.06430906057357788,,,,,, +8,47649,,,,,,,,,,,,0.07193371653556824,,,,,, +8,47699,,,,,,,,,,,,0.08162404596805573,,,,,, +8,47749,,,,,,,,,,,,0.08932861685752869,,,,,, +8,47799,,,,,,,,,,,,0.07348579913377762,,,,,, +8,47849,,,,,,,,,,,,0.0841764509677887,,,,,, +8,47899,,,,,,,,,,,,0.07353875041007996,,,,,, +8,47949,,,,,,,,,,,,0.08411377668380737,,,,,, +8,47999,,,,,,,,,,,,0.08632737398147583,,,,,, +8,48049,,,,,,,,,,,,0.07692290842533112,,,,,, +8,48099,,,,,,,,,,,,0.07449783384799957,,,,,, +8,48149,,,,,,,,,,,,0.07553020119667053,,,,,, +8,48199,,,,,,,,,,,,0.07751458883285522,,,,,, +8,48249,,,,,,,,,,,,0.07807737588882446,,,,,, +8,48299,,,,,,,,,,,,0.06647095829248428,,,,,, +8,48349,,,,,,,,,,,,0.07860003411769867,,,,,, +8,48399,,,,,,,,,,,,0.08480207622051239,,,,,, +8,48449,,,,,,,,,,,,0.0763460025191307,,,,,, +8,48499,,,,,,,,,,,,0.06907384097576141,,,,,, +8,48549,,,,,,,,,,,,0.07343748211860657,,,,,, +8,48599,,,,,,,,,,,,0.07698242366313934,,,,,, +8,48649,,,,,,,,,,,,0.08180245757102966,,,,,, +8,48699,,,,,,,,,,,,0.08328450471162796,,,,,, +8,48749,,,,,,,,,,,,0.08621580898761749,,,,,, +8,48799,,,,,,,,,,,,0.07749393582344055,,,,,, +8,48849,,,,,,,,,,,,0.08248917758464813,,,,,, +8,48899,,,,,,,,,,,,0.07342127710580826,,,,,, +8,48949,,,,,,,,,,,,0.07811225950717926,,,,,, +8,48999,,,,,,,,,,,,0.078412264585495,,,,,, +8,49049,,,,,,,,,,,,0.07650323957204819,,,,,, +8,49099,,,,,,,,,,,,0.07506714016199112,,,,,, +8,49149,,,,,,,,,,,,0.08508564531803131,,,,,, +8,49199,,,,,,,,,,,,0.08908919990062714,,,,,, +8,49249,,,,,,,,,,,,0.06469283998012543,,,,,, +8,49299,,,,,,,,,,,,0.06170805171132088,,,,,, +8,49349,,,,,,,,,,,,0.06984387338161469,,,,,, +8,49399,,,,,,,,,,,,0.08690991997718811,,,,,, +8,49449,,,,,,,,,,,,0.06957162171602249,,,,,, +8,49499,,,,,,,,,,,,0.08059518039226532,,,,,, +8,49549,,,,,,,,,,,,0.06109393388032913,,,,,, +8,49599,,,,,,,,,,,,0.0814795047044754,,,,,, +8,49649,,,,,,,,,,,,0.07714849710464478,,,,,, +8,49699,,,,,,,,,,,,0.07473526895046234,,,,,, +8,49749,,,,,,,,,,,,0.07689271867275238,,,,,, +8,49799,,,,,,,,,,,,0.08578440546989441,,,,,, +8,49849,,,,,,,,,,,,0.07631780952215195,,,,,, +8,49899,,,,,,,,,,,,0.0742720514535904,,,,,, +8,49949,,,,,,,,,,,,0.07667036354541779,,,,,, +8,49999,,,,,,,,,,,,0.07266609370708466,,,,,, +8,50049,,,,,,,,,,,,0.0646519809961319,,,,,, +8,50099,,,,,,,,,,,,0.07426668703556061,,,,,, +8,50149,,,,,,,,,,,,0.07029165327548981,,,,,, +8,50199,,,,,,,,,,,,0.07733311504125595,,,,,, +8,50249,,,,,,,,,,,,0.08742108941078186,,,,,, +8,50299,,,,,,,,,,,,0.07178455591201782,,,,,, +8,50349,,,,,,,,,,,,0.06824954599142075,,,,,, +8,50399,,,,,,,,,,,,0.07851529121398926,,,,,, +8,50449,,,,,,,,,,,,0.07570919394493103,,,,,, +8,50499,,,,,,,,,,,,0.06393677741289139,,,,,, +8,50549,,,,,,,,,,,,0.07760517299175262,,,,,, +8,50599,,,,,,,,,,,,0.06755490601062775,,,,,, +8,50649,,,,,,,,,,,,0.08589015901088715,,,,,, +8,50699,,,,,,,,,,,,0.06963092088699341,,,,,, +8,50749,,,,,,,,,,,,0.06304706633090973,,,,,, +8,50799,,,,,,,,,,,,0.0670548528432846,,,,,, +8,50849,,,,,,,,,,,,0.07309109717607498,,,,,, +8,50899,,,,,,,,,,,,0.0701788067817688,,,,,, +8,50949,,,,,,,,,,,,0.08597630262374878,,,,,, +8,50999,,,,,,,,,,,,0.08216431736946106,,,,,, +8,51049,,,,,,,,,,,,0.08496400713920593,,,,,, +8,51099,,,,,,,,,,,,0.06611407548189163,,,,,, +8,51149,,,,,,,,,,,,0.07024453580379486,,,,,, +8,51199,,,,,,,,,,,,0.07089442014694214,,,,,, +8,51249,,,,,,,,,,,,0.07466107606887817,,,,,, +8,51299,,,,,,,,,,,,0.07027360796928406,,,,,, +8,51349,,,,,,,,,,,,0.06353137642145157,,,,,, +8,51399,,,,,,,,,,,,0.07865539938211441,,,,,, +8,51449,,,,,,,,,,,,0.07008696347475052,,,,,, +8,51499,,,,,,,,,,,,0.0697467252612114,,,,,, +8,51549,,,,,,,,,,,,0.0841599851846695,,,,,, +8,51599,,,,,,,,,,,,0.07368309795856476,,,,,, +8,51623,,,,,,,,,,,,,0.24568328261375427,0.08226504176855087,0.14463043212890625,0.0018908381462097168,0.15707515180110931,0.08226504176855087 +8,51623,,,,,,,0.23507727682590485,0.07590632885694504,0.28799086809158325,0.0828237533569336,0.270962655544281,,,,,,, +9,51649,,,,,,,,,,,,0.06649775058031082,,,,,, +9,51699,,,,,,,,,,,,0.06486213207244873,,,,,, +9,51749,,,,,,,,,,,,0.0671045333147049,,,,,, +9,51799,,,,,,,,,,,,0.0698787122964859,,,,,, +9,51849,,,,,,,,,,,,0.0694679468870163,,,,,, +9,51899,,,,,,,,,,,,0.07307833433151245,,,,,, +9,51949,,,,,,,,,,,,0.06583525240421295,,,,,, +9,51999,,,,,,,,,,,,0.07902151346206665,,,,,, +9,52049,,,,,,,,,,,,0.07566835731267929,,,,,, +9,52099,,,,,,,,,,,,0.07502064853906631,,,,,, +9,52149,,,,,,,,,,,,0.07264433801174164,,,,,, +9,52199,,,,,,,,,,,,0.07441198080778122,,,,,, +9,52249,,,,,,,,,,,,0.06834752857685089,,,,,, +9,52299,,,,,,,,,,,,0.08396655321121216,,,,,, +9,52349,,,,,,,,,,,,0.07852526009082794,,,,,, +9,52399,,,,,,,,,,,,0.0754193589091301,,,,,, +9,52449,,,,,,,,,,,,0.07051963359117508,,,,,, +9,52499,,,,,,,,,,,,0.087386354804039,,,,,, +9,52549,,,,,,,,,,,,0.061706554144620895,,,,,, +9,52599,,,,,,,,,,,,0.067904531955719,,,,,, +9,52649,,,,,,,,,,,,0.0862240195274353,,,,,, +9,52699,,,,,,,,,,,,0.07300569862127304,,,,,, +9,52749,,,,,,,,,,,,0.06747806072235107,,,,,, +9,52799,,,,,,,,,,,,0.07519702613353729,,,,,, +9,52849,,,,,,,,,,,,0.06375827640295029,,,,,, +9,52899,,,,,,,,,,,,0.08311063796281815,,,,,, +9,52949,,,,,,,,,,,,0.07807650417089462,,,,,, +9,52999,,,,,,,,,,,,0.08614388108253479,,,,,, +9,53049,,,,,,,,,,,,0.06887722760438919,,,,,, +9,53099,,,,,,,,,,,,0.07843425869941711,,,,,, +9,53149,,,,,,,,,,,,0.06969833374023438,,,,,, +9,53199,,,,,,,,,,,,0.06178010255098343,,,,,, +9,53249,,,,,,,,,,,,0.0760151818394661,,,,,, +9,53299,,,,,,,,,,,,0.0641690045595169,,,,,, +9,53349,,,,,,,,,,,,0.07503975927829742,,,,,, +9,53399,,,,,,,,,,,,0.08053585886955261,,,,,, +9,53449,,,,,,,,,,,,0.0695917010307312,,,,,, +9,53499,,,,,,,,,,,,0.08632214367389679,,,,,, +9,53549,,,,,,,,,,,,0.060061030089855194,,,,,, +9,53599,,,,,,,,,,,,0.08747577667236328,,,,,, +9,53649,,,,,,,,,,,,0.08516649901866913,,,,,, +9,53699,,,,,,,,,,,,0.08488182723522186,,,,,, +9,53749,,,,,,,,,,,,0.07345738261938095,,,,,, +9,53799,,,,,,,,,,,,0.07357265055179596,,,,,, +9,53849,,,,,,,,,,,,0.06930229067802429,,,,,, +9,53899,,,,,,,,,,,,0.07681678235530853,,,,,, +9,53949,,,,,,,,,,,,0.07031567394733429,,,,,, +9,53999,,,,,,,,,,,,0.09190389513969421,,,,,, +9,54049,,,,,,,,,,,,0.09628860652446747,,,,,, +9,54099,,,,,,,,,,,,0.06235892325639725,,,,,, +9,54149,,,,,,,,,,,,0.07119373977184296,,,,,, +9,54199,,,,,,,,,,,,0.07827839255332947,,,,,, +9,54249,,,,,,,,,,,,0.0873817428946495,,,,,, +9,54299,,,,,,,,,,,,0.07621094584465027,,,,,, +9,54349,,,,,,,,,,,,0.07865997403860092,,,,,, +9,54399,,,,,,,,,,,,0.0857701525092125,,,,,, +9,54449,,,,,,,,,,,,0.0783885195851326,,,,,, +9,54499,,,,,,,,,,,,0.06537513434886932,,,,,, +9,54549,,,,,,,,,,,,0.07837589830160141,,,,,, +9,54599,,,,,,,,,,,,0.08077836036682129,,,,,, +9,54649,,,,,,,,,,,,0.06355053186416626,,,,,, +9,54699,,,,,,,,,,,,0.08102479577064514,,,,,, +9,54749,,,,,,,,,,,,0.06775406002998352,,,,,, +9,54799,,,,,,,,,,,,0.07700152695178986,,,,,, +9,54849,,,,,,,,,,,,0.07271555066108704,,,,,, +9,54899,,,,,,,,,,,,0.08067048341035843,,,,,, +9,54949,,,,,,,,,,,,0.07317550480365753,,,,,, +9,54999,,,,,,,,,,,,0.0752267986536026,,,,,, +9,55049,,,,,,,,,,,,0.06518503278493881,,,,,, +9,55099,,,,,,,,,,,,0.06109914556145668,,,,,, +9,55149,,,,,,,,,,,,0.06313566863536835,,,,,, +9,55199,,,,,,,,,,,,0.06581337749958038,,,,,, +9,55249,,,,,,,,,,,,0.08741825073957443,,,,,, +9,55299,,,,,,,,,,,,0.07481414079666138,,,,,, +9,55349,,,,,,,,,,,,0.08023117482662201,,,,,, +9,55399,,,,,,,,,,,,0.07969346642494202,,,,,, +9,55449,,,,,,,,,,,,0.06993594765663147,,,,,, +9,55499,,,,,,,,,,,,0.081231988966465,,,,,, +9,55549,,,,,,,,,,,,0.08317433297634125,,,,,, +9,55599,,,,,,,,,,,,0.0774800032377243,,,,,, +9,55649,,,,,,,,,,,,0.06767167896032333,,,,,, +9,55699,,,,,,,,,,,,0.08364196121692657,,,,,, +9,55749,,,,,,,,,,,,0.07730851322412491,,,,,, +9,55799,,,,,,,,,,,,0.0764145702123642,,,,,, +9,55849,,,,,,,,,,,,0.07935848832130432,,,,,, +9,55899,,,,,,,,,,,,0.07665586471557617,,,,,, +9,55949,,,,,,,,,,,,0.06796318292617798,,,,,, +9,55999,,,,,,,,,,,,0.06805942952632904,,,,,, +9,56049,,,,,,,,,,,,0.06406061351299286,,,,,, +9,56099,,,,,,,,,,,,0.06768154352903366,,,,,, +9,56149,,,,,,,,,,,,0.0706753060221672,,,,,, +9,56199,,,,,,,,,,,,0.08333849906921387,,,,,, +9,56249,,,,,,,,,,,,0.07698071002960205,,,,,, +9,56299,,,,,,,,,,,,0.07904838770627975,,,,,, +9,56349,,,,,,,,,,,,0.0895129144191742,,,,,, +9,56399,,,,,,,,,,,,0.06455902755260468,,,,,, +9,56449,,,,,,,,,,,,0.07989920675754547,,,,,, +9,56499,,,,,,,,,,,,0.07492166757583618,,,,,, +9,56549,,,,,,,,,,,,0.06851646304130554,,,,,, +9,56599,,,,,,,,,,,,0.07261230051517487,,,,,, +9,56649,,,,,,,,,,,,0.06519344449043274,,,,,, +9,56699,,,,,,,,,,,,0.0739249438047409,,,,,, +9,56749,,,,,,,,,,,,0.08497566729784012,,,,,, +9,56799,,,,,,,,,,,,0.07944545149803162,,,,,, +9,56849,,,,,,,,,,,,0.06791029125452042,,,,,, +9,56899,,,,,,,,,,,,0.08082477748394012,,,,,, +9,56949,,,,,,,,,,,,0.06708591431379318,,,,,, +9,56999,,,,,,,,,,,,0.07137245684862137,,,,,, +9,57049,,,,,,,,,,,,0.07591676712036133,,,,,, +9,57099,,,,,,,,,,,,0.07605233788490295,,,,,, +9,57149,,,,,,,,,,,,0.06842424720525742,,,,,, +9,57199,,,,,,,,,,,,0.07799264043569565,,,,,, +9,57249,,,,,,,,,,,,0.06617331504821777,,,,,, +9,57299,,,,,,,,,,,,0.07252280414104462,,,,,, +9,57349,,,,,,,,,,,,0.07102256268262863,,,,,, +9,57359,,,,,,,,,,,,,0.243658646941185,0.0808405876159668,0.16827113926410675,0.01917356252670288,0.1738167405128479,0.0808405876159668 +9,57359,,,,,,,0.23389555513858795,0.07541313022375107,0.29840242862701416,0.08878916501998901,0.28313177824020386,,,,,,, +10,57399,,,,,,,,,,,,0.07540670037269592,,,,,, +10,57449,,,,,,,,,,,,0.07256585359573364,,,,,, +10,57499,,,,,,,,,,,,0.07712048292160034,,,,,, +10,57549,,,,,,,,,,,,0.0699683427810669,,,,,, +10,57599,,,,,,,,,,,,0.06751447170972824,,,,,, +10,57649,,,,,,,,,,,,0.08886373043060303,,,,,, +10,57699,,,,,,,,,,,,0.08334297686815262,,,,,, +10,57749,,,,,,,,,,,,0.0743597075343132,,,,,, +10,57799,,,,,,,,,,,,0.06283951550722122,,,,,, +10,57849,,,,,,,,,,,,0.07960283011198044,,,,,, +10,57899,,,,,,,,,,,,0.06831105053424835,,,,,, +10,57949,,,,,,,,,,,,0.06693518906831741,,,,,, +10,57999,,,,,,,,,,,,0.08178165555000305,,,,,, +10,58049,,,,,,,,,,,,0.0774192288517952,,,,,, +10,58099,,,,,,,,,,,,0.08333331346511841,,,,,, +10,58149,,,,,,,,,,,,0.07655239850282669,,,,,, +10,58199,,,,,,,,,,,,0.07978006452322006,,,,,, +10,58249,,,,,,,,,,,,0.07666213810443878,,,,,, +10,58299,,,,,,,,,,,,0.07627557963132858,,,,,, +10,58349,,,,,,,,,,,,0.0727178230881691,,,,,, +10,58399,,,,,,,,,,,,0.06756724417209625,,,,,, +10,58449,,,,,,,,,,,,0.0786154642701149,,,,,, +10,58499,,,,,,,,,,,,0.0838623195886612,,,,,, +10,58549,,,,,,,,,,,,0.08080509305000305,,,,,, +10,58599,,,,,,,,,,,,0.08717800676822662,,,,,, +10,58649,,,,,,,,,,,,0.06524413824081421,,,,,, +10,58699,,,,,,,,,,,,0.08315782248973846,,,,,, +10,58749,,,,,,,,,,,,0.07812037318944931,,,,,, +10,58799,,,,,,,,,,,,0.06922788918018341,,,,,, +10,58849,,,,,,,,,,,,0.06967206299304962,,,,,, +10,58899,,,,,,,,,,,,0.07259164750576019,,,,,, +10,58949,,,,,,,,,,,,0.074604332447052,,,,,, +10,58999,,,,,,,,,,,,0.07278945297002792,,,,,, +10,59049,,,,,,,,,,,,0.08106367290019989,,,,,, +10,59099,,,,,,,,,,,,0.07250373810529709,,,,,, +10,59149,,,,,,,,,,,,0.07093826681375504,,,,,, +10,59199,,,,,,,,,,,,0.07185246050357819,,,,,, +10,59249,,,,,,,,,,,,0.058764196932315826,,,,,, +10,59299,,,,,,,,,,,,0.08575290441513062,,,,,, +10,59349,,,,,,,,,,,,0.0708078071475029,,,,,, +10,59399,,,,,,,,,,,,0.07179570943117142,,,,,, +10,59449,,,,,,,,,,,,0.0714401826262474,,,,,, +10,59499,,,,,,,,,,,,0.07611331343650818,,,,,, +10,59549,,,,,,,,,,,,0.07788189500570297,,,,,, +10,59599,,,,,,,,,,,,0.08519300073385239,,,,,, +10,59649,,,,,,,,,,,,0.07644915580749512,,,,,, +10,59699,,,,,,,,,,,,0.08580067753791809,,,,,, +10,59749,,,,,,,,,,,,0.06751815974712372,,,,,, +10,59799,,,,,,,,,,,,0.06378014385700226,,,,,, +10,59849,,,,,,,,,,,,0.07594272494316101,,,,,, +10,59899,,,,,,,,,,,,0.08554387092590332,,,,,, +10,59949,,,,,,,,,,,,0.06219577044248581,,,,,, +10,59999,,,,,,,,,,,,0.06282832473516464,,,,,, +10,60049,,,,,,,,,,,,0.07971198856830597,,,,,, +10,60099,,,,,,,,,,,,0.06369379162788391,,,,,, +10,60149,,,,,,,,,,,,0.07068085670471191,,,,,, +10,60199,,,,,,,,,,,,0.07147818803787231,,,,,, +10,60249,,,,,,,,,,,,0.07317669689655304,,,,,, +10,60299,,,,,,,,,,,,0.07144446671009064,,,,,, +10,60349,,,,,,,,,,,,0.06872892379760742,,,,,, +10,60399,,,,,,,,,,,,0.0634097158908844,,,,,, +10,60449,,,,,,,,,,,,0.07772023975849152,,,,,, +10,60499,,,,,,,,,,,,0.07178568094968796,,,,,, +10,60549,,,,,,,,,,,,0.08102619647979736,,,,,, +10,60599,,,,,,,,,,,,0.07111899554729462,,,,,, +10,60649,,,,,,,,,,,,0.07144564390182495,,,,,, +10,60699,,,,,,,,,,,,0.0708126425743103,,,,,, +10,60749,,,,,,,,,,,,0.06848102807998657,,,,,, +10,60799,,,,,,,,,,,,0.07339800894260406,,,,,, +10,60849,,,,,,,,,,,,0.06233159452676773,,,,,, +10,60899,,,,,,,,,,,,0.07100038975477219,,,,,, +10,60949,,,,,,,,,,,,0.0685701072216034,,,,,, +10,60999,,,,,,,,,,,,0.06673809140920639,,,,,, +10,61049,,,,,,,,,,,,0.07385104149580002,,,,,, +10,61099,,,,,,,,,,,,0.07893192023038864,,,,,, +10,61149,,,,,,,,,,,,0.07859194278717041,,,,,, +10,61199,,,,,,,,,,,,0.07315924763679504,,,,,, +10,61249,,,,,,,,,,,,0.0765828937292099,,,,,, +10,61299,,,,,,,,,,,,0.06879879534244537,,,,,, +10,61349,,,,,,,,,,,,0.09150926768779755,,,,,, +10,61399,,,,,,,,,,,,0.06139025837182999,,,,,, +10,61449,,,,,,,,,,,,0.0822283923625946,,,,,, +10,61499,,,,,,,,,,,,0.0775938630104065,,,,,, +10,61549,,,,,,,,,,,,0.0821787565946579,,,,,, +10,61599,,,,,,,,,,,,0.07148934155702591,,,,,, +10,61649,,,,,,,,,,,,0.07193334400653839,,,,,, +10,61699,,,,,,,,,,,,0.07428714632987976,,,,,, +10,61749,,,,,,,,,,,,0.08167867362499237,,,,,, +10,61799,,,,,,,,,,,,0.0733698159456253,,,,,, +10,61849,,,,,,,,,,,,0.07558853179216385,,,,,, +10,61899,,,,,,,,,,,,0.07964946329593658,,,,,, +10,61949,,,,,,,,,,,,0.06986474245786667,,,,,, +10,61999,,,,,,,,,,,,0.07599924504756927,,,,,, +10,62049,,,,,,,,,,,,0.07952846586704254,,,,,, +10,62099,,,,,,,,,,,,0.07100243121385574,,,,,, +10,62149,,,,,,,,,,,,0.08351783454418182,,,,,, +10,62199,,,,,,,,,,,,0.07875931262969971,,,,,, +10,62249,,,,,,,,,,,,0.07759539783000946,,,,,, +10,62299,,,,,,,,,,,,0.07605532556772232,,,,,, +10,62349,,,,,,,,,,,,0.07799980789422989,,,,,, +10,62399,,,,,,,,,,,,0.0627991333603859,,,,,, +10,62449,,,,,,,,,,,,0.0848461240530014,,,,,, +10,62499,,,,,,,,,,,,0.074405238032341,,,,,, +10,62549,,,,,,,,,,,,0.08061238378286362,,,,,, +10,62599,,,,,,,,,,,,0.08037525415420532,,,,,, +10,62649,,,,,,,,,,,,0.07672835141420364,,,,,, +10,62699,,,,,,,,,,,,0.07314899563789368,,,,,, +10,62749,,,,,,,,,,,,0.07422283291816711,,,,,, +10,62799,,,,,,,,,,,,0.07139601558446884,,,,,, +10,62849,,,,,,,,,,,,0.0780438482761383,,,,,, +10,62899,,,,,,,,,,,,0.0742294192314148,,,,,, +10,62949,,,,,,,,,,,,0.06987651437520981,,,,,, +10,62999,,,,,,,,,,,,0.06860246509313583,,,,,, +10,63049,,,,,,,,,,,,0.08254414051771164,,,,,, +10,63095,,,,,,,,,,,,,0.24801725149154663,0.08381684124469757,0.11495169252157211,-0.016936898231506348,0.12441860884428024,0.08381684124469757 +10,63095,,,,,,,0.23230157792568207,0.07449696958065033,0.316200315952301,0.09985464811325073,0.2991477847099304,,,,,,, +11,63099,,,,,,,,,,,,0.06701269745826721,,,,,, +11,63149,,,,,,,,,,,,0.059876203536987305,,,,,, +11,63199,,,,,,,,,,,,0.07954275608062744,,,,,, +11,63249,,,,,,,,,,,,0.0817585289478302,,,,,, +11,63299,,,,,,,,,,,,0.08072511106729507,,,,,, +11,63349,,,,,,,,,,,,0.0864855945110321,,,,,, +11,63399,,,,,,,,,,,,0.07775174081325531,,,,,, +11,63449,,,,,,,,,,,,0.06849081814289093,,,,,, +11,63499,,,,,,,,,,,,0.07323431968688965,,,,,, +11,63549,,,,,,,,,,,,0.06945934891700745,,,,,, +11,63599,,,,,,,,,,,,0.06530575454235077,,,,,, +11,63649,,,,,,,,,,,,0.06891776621341705,,,,,, +11,63699,,,,,,,,,,,,0.06864744424819946,,,,,, +11,63749,,,,,,,,,,,,0.07690078020095825,,,,,, +11,63799,,,,,,,,,,,,0.06845512241125107,,,,,, +11,63849,,,,,,,,,,,,0.08568030595779419,,,,,, +11,63899,,,,,,,,,,,,0.06684108078479767,,,,,, +11,63949,,,,,,,,,,,,0.07184120267629623,,,,,, +11,63999,,,,,,,,,,,,0.07641704380512238,,,,,, +11,64049,,,,,,,,,,,,0.08285406231880188,,,,,, +11,64099,,,,,,,,,,,,0.0753304660320282,,,,,, +11,64149,,,,,,,,,,,,0.07546020299196243,,,,,, +11,64199,,,,,,,,,,,,0.09353600442409515,,,,,, +11,64249,,,,,,,,,,,,0.08566069602966309,,,,,, +11,64299,,,,,,,,,,,,0.08060594648122787,,,,,, +11,64349,,,,,,,,,,,,0.06286507844924927,,,,,, +11,64399,,,,,,,,,,,,0.07889403402805328,,,,,, +11,64449,,,,,,,,,,,,0.0644860565662384,,,,,, +11,64499,,,,,,,,,,,,0.0845828428864479,,,,,, +11,64549,,,,,,,,,,,,0.06969872862100601,,,,,, +11,64599,,,,,,,,,,,,0.06877798587083817,,,,,, +11,64649,,,,,,,,,,,,0.08390079438686371,,,,,, +11,64699,,,,,,,,,,,,0.08068376034498215,,,,,, +11,64749,,,,,,,,,,,,0.06707177311182022,,,,,, +11,64799,,,,,,,,,,,,0.06780221313238144,,,,,, +11,64849,,,,,,,,,,,,0.06784048676490784,,,,,, +11,64899,,,,,,,,,,,,0.07224856317043304,,,,,, +11,64949,,,,,,,,,,,,0.07506231963634491,,,,,, +11,64999,,,,,,,,,,,,0.07365341484546661,,,,,, +11,65049,,,,,,,,,,,,0.07623881846666336,,,,,, +11,65099,,,,,,,,,,,,0.07578878104686737,,,,,, +11,65149,,,,,,,,,,,,0.07837577909231186,,,,,, +11,65199,,,,,,,,,,,,0.0712323933839798,,,,,, +11,65249,,,,,,,,,,,,0.07717552781105042,,,,,, +11,65299,,,,,,,,,,,,0.07645990699529648,,,,,, +11,65349,,,,,,,,,,,,0.07276894152164459,,,,,, +11,65399,,,,,,,,,,,,0.0608535036444664,,,,,, +11,65449,,,,,,,,,,,,0.07694530487060547,,,,,, +11,65499,,,,,,,,,,,,0.07693378627300262,,,,,, +11,65549,,,,,,,,,,,,0.0778520405292511,,,,,, +11,65599,,,,,,,,,,,,0.07986931502819061,,,,,, +11,65649,,,,,,,,,,,,0.0651191920042038,,,,,, +11,65699,,,,,,,,,,,,0.06635528802871704,,,,,, +11,65749,,,,,,,,,,,,0.06337814778089523,,,,,, +11,65799,,,,,,,,,,,,0.0833454579114914,,,,,, +11,65849,,,,,,,,,,,,0.08085964620113373,,,,,, +11,65899,,,,,,,,,,,,0.07361394166946411,,,,,, +11,65949,,,,,,,,,,,,0.09252610802650452,,,,,, +11,65999,,,,,,,,,,,,0.06988467276096344,,,,,, +11,66049,,,,,,,,,,,,0.06990525126457214,,,,,, +11,66099,,,,,,,,,,,,0.06403683871030807,,,,,, +11,66149,,,,,,,,,,,,0.07560326159000397,,,,,, +11,66199,,,,,,,,,,,,0.06652222573757172,,,,,, +11,66249,,,,,,,,,,,,0.06762537360191345,,,,,, +11,66299,,,,,,,,,,,,0.07113146781921387,,,,,, +11,66349,,,,,,,,,,,,0.05852752923965454,,,,,, +11,66399,,,,,,,,,,,,0.06670097261667252,,,,,, +11,66449,,,,,,,,,,,,0.07772710919380188,,,,,, +11,66499,,,,,,,,,,,,0.0695551410317421,,,,,, +11,66549,,,,,,,,,,,,0.06902369856834412,,,,,, +11,66599,,,,,,,,,,,,0.06543396413326263,,,,,, +11,66649,,,,,,,,,,,,0.08116966485977173,,,,,, +11,66699,,,,,,,,,,,,0.06879566609859467,,,,,, +11,66749,,,,,,,,,,,,0.07577268779277802,,,,,, +11,66799,,,,,,,,,,,,0.07550495862960815,,,,,, +11,66849,,,,,,,,,,,,0.07021372020244598,,,,,, +11,66899,,,,,,,,,,,,0.05728946253657341,,,,,, +11,66949,,,,,,,,,,,,0.07360699772834778,,,,,, +11,66999,,,,,,,,,,,,0.0733865350484848,,,,,, +11,67049,,,,,,,,,,,,0.07271367311477661,,,,,, +11,67099,,,,,,,,,,,,0.06506899744272232,,,,,, +11,67149,,,,,,,,,,,,0.07875645160675049,,,,,, +11,67199,,,,,,,,,,,,0.06883612275123596,,,,,, +11,67249,,,,,,,,,,,,0.0680597573518753,,,,,, +11,67299,,,,,,,,,,,,0.07465860992670059,,,,,, +11,67349,,,,,,,,,,,,0.07816264033317566,,,,,, +11,67399,,,,,,,,,,,,0.06913924962282181,,,,,, +11,67449,,,,,,,,,,,,0.07418140769004822,,,,,, +11,67499,,,,,,,,,,,,0.0769064873456955,,,,,, +11,67549,,,,,,,,,,,,0.06635632365942001,,,,,, +11,67599,,,,,,,,,,,,0.06699199974536896,,,,,, +11,67649,,,,,,,,,,,,0.07725677639245987,,,,,, +11,67699,,,,,,,,,,,,0.07072928547859192,,,,,, +11,67749,,,,,,,,,,,,0.07813847810029984,,,,,, +11,67799,,,,,,,,,,,,0.06878639757633209,,,,,, +11,67849,,,,,,,,,,,,0.07948370277881622,,,,,, +11,67899,,,,,,,,,,,,0.07949477434158325,,,,,, +11,67949,,,,,,,,,,,,0.06710340827703476,,,,,, +11,67999,,,,,,,,,,,,0.06348040699958801,,,,,, +11,68049,,,,,,,,,,,,0.0764102041721344,,,,,, +11,68099,,,,,,,,,,,,0.06519664824008942,,,,,, +11,68149,,,,,,,,,,,,0.06893126666545868,,,,,, +11,68199,,,,,,,,,,,,0.07982267439365387,,,,,, +11,68249,,,,,,,,,,,,0.08109550178050995,,,,,, +11,68299,,,,,,,,,,,,0.0846572071313858,,,,,, +11,68349,,,,,,,,,,,,0.07787226140499115,,,,,, +11,68399,,,,,,,,,,,,0.06900632381439209,,,,,, +11,68449,,,,,,,,,,,,0.076955646276474,,,,,, +11,68499,,,,,,,,,,,,0.06769014149904251,,,,,, +11,68549,,,,,,,,,,,,0.06357752531766891,,,,,, +11,68599,,,,,,,,,,,,0.08108186721801758,,,,,, +11,68649,,,,,,,,,,,,0.07959014177322388,,,,,, +11,68699,,,,,,,,,,,,0.07332923263311386,,,,,, +11,68749,,,,,,,,,,,,0.06678426265716553,,,,,, +11,68799,,,,,,,,,,,,0.07377052307128906,,,,,, +11,68831,,,,,,,,,,,,,0.24354024231433868,0.08238794654607773,0.1862051635980606,0.00039964914321899414,0.1930132508277893,0.08238794654607773 +11,68831,,,,,,,0.23143936693668365,0.07401692867279053,0.32522618770599365,0.10566532611846924,0.3085714280605316,,,,,,, +12,68849,,,,,,,,,,,,0.06958848983049393,,,,,, +12,68899,,,,,,,,,,,,0.08232834935188293,,,,,, +12,68949,,,,,,,,,,,,0.07505521178245544,,,,,, +12,68999,,,,,,,,,,,,0.07046801596879959,,,,,, +12,69049,,,,,,,,,,,,0.08035321533679962,,,,,, +12,69099,,,,,,,,,,,,0.07351851463317871,,,,,, +12,69149,,,,,,,,,,,,0.07394687831401825,,,,,, +12,69199,,,,,,,,,,,,0.07187773287296295,,,,,, +12,69249,,,,,,,,,,,,0.0731668695807457,,,,,, +12,69299,,,,,,,,,,,,0.08100558072328568,,,,,, +12,69349,,,,,,,,,,,,0.0665859803557396,,,,,, +12,69399,,,,,,,,,,,,0.07098263502120972,,,,,, +12,69449,,,,,,,,,,,,0.06874363124370575,,,,,, +12,69499,,,,,,,,,,,,0.07106716185808182,,,,,, +12,69549,,,,,,,,,,,,0.07063640654087067,,,,,, +12,69599,,,,,,,,,,,,0.06521131098270416,,,,,, +12,69649,,,,,,,,,,,,0.08832571655511856,,,,,, +12,69699,,,,,,,,,,,,0.0831717997789383,,,,,, +12,69749,,,,,,,,,,,,0.06050169840455055,,,,,, +12,69799,,,,,,,,,,,,0.08255904167890549,,,,,, +12,69849,,,,,,,,,,,,0.08017455041408539,,,,,, +12,69899,,,,,,,,,,,,0.07467418164014816,,,,,, +12,69949,,,,,,,,,,,,0.08235109597444534,,,,,, +12,69999,,,,,,,,,,,,0.08094263076782227,,,,,, +12,70049,,,,,,,,,,,,0.073858842253685,,,,,, +12,70099,,,,,,,,,,,,0.08312912285327911,,,,,, +12,70149,,,,,,,,,,,,0.07782229781150818,,,,,, +12,70199,,,,,,,,,,,,0.08687607944011688,,,,,, +12,70249,,,,,,,,,,,,0.07855989038944244,,,,,, +12,70299,,,,,,,,,,,,0.08232346177101135,,,,,, +12,70349,,,,,,,,,,,,0.0742606669664383,,,,,, +12,70399,,,,,,,,,,,,0.06778939813375473,,,,,, +12,70449,,,,,,,,,,,,0.0719982162117958,,,,,, +12,70499,,,,,,,,,,,,0.08524869382381439,,,,,, +12,70549,,,,,,,,,,,,0.0883684903383255,,,,,, +12,70599,,,,,,,,,,,,0.07918316125869751,,,,,, +12,70649,,,,,,,,,,,,0.0822269544005394,,,,,, +12,70699,,,,,,,,,,,,0.06726504862308502,,,,,, +12,70749,,,,,,,,,,,,0.06755185127258301,,,,,, +12,70799,,,,,,,,,,,,0.08290848135948181,,,,,, +12,70849,,,,,,,,,,,,0.08196824789047241,,,,,, +12,70899,,,,,,,,,,,,0.08081504702568054,,,,,, +12,70949,,,,,,,,,,,,0.07426634430885315,,,,,, +12,70999,,,,,,,,,,,,0.08492626994848251,,,,,, +12,71049,,,,,,,,,,,,0.07418301701545715,,,,,, +12,71099,,,,,,,,,,,,0.08063241839408875,,,,,, +12,71149,,,,,,,,,,,,0.0710178017616272,,,,,, +12,71199,,,,,,,,,,,,0.08087557554244995,,,,,, +12,71249,,,,,,,,,,,,0.06833403557538986,,,,,, +12,71299,,,,,,,,,,,,0.0860954076051712,,,,,, +12,71349,,,,,,,,,,,,0.0685545951128006,,,,,, +12,71399,,,,,,,,,,,,0.06546570360660553,,,,,, +12,71449,,,,,,,,,,,,0.08605659753084183,,,,,, +12,71499,,,,,,,,,,,,0.07282091677188873,,,,,, +12,71549,,,,,,,,,,,,0.06505390256643295,,,,,, +12,71599,,,,,,,,,,,,0.06365897506475449,,,,,, +12,71649,,,,,,,,,,,,0.06833869963884354,,,,,, +12,71699,,,,,,,,,,,,0.06229467689990997,,,,,, +12,71749,,,,,,,,,,,,0.07716101408004761,,,,,, +12,71799,,,,,,,,,,,,0.07646550238132477,,,,,, +12,71849,,,,,,,,,,,,0.07174960523843765,,,,,, +12,71899,,,,,,,,,,,,0.07523876428604126,,,,,, +12,71949,,,,,,,,,,,,0.07761046290397644,,,,,, +12,71999,,,,,,,,,,,,0.0639001727104187,,,,,, +12,72049,,,,,,,,,,,,0.08273324370384216,,,,,, +12,72099,,,,,,,,,,,,0.07242701947689056,,,,,, +12,72149,,,,,,,,,,,,0.06736887991428375,,,,,, +12,72199,,,,,,,,,,,,0.07393339276313782,,,,,, +12,72249,,,,,,,,,,,,0.07483813166618347,,,,,, +12,72299,,,,,,,,,,,,0.0723457932472229,,,,,, +12,72349,,,,,,,,,,,,0.0743694081902504,,,,,, +12,72399,,,,,,,,,,,,0.0680418461561203,,,,,, +12,72449,,,,,,,,,,,,0.07020553946495056,,,,,, +12,72499,,,,,,,,,,,,0.06428861618041992,,,,,, +12,72549,,,,,,,,,,,,0.06918737292289734,,,,,, +12,72599,,,,,,,,,,,,0.07795114815235138,,,,,, +12,72649,,,,,,,,,,,,0.07428830116987228,,,,,, +12,72699,,,,,,,,,,,,0.07482444494962692,,,,,, +12,72749,,,,,,,,,,,,0.0798024833202362,,,,,, +12,72799,,,,,,,,,,,,0.07965214550495148,,,,,, +12,72849,,,,,,,,,,,,0.08780611306428909,,,,,, +12,72899,,,,,,,,,,,,0.07867899537086487,,,,,, +12,72949,,,,,,,,,,,,0.07006358355283737,,,,,, +12,72999,,,,,,,,,,,,0.07792218029499054,,,,,, +12,73049,,,,,,,,,,,,0.08445750176906586,,,,,, +12,73099,,,,,,,,,,,,0.0688687264919281,,,,,, +12,73149,,,,,,,,,,,,0.07067163288593292,,,,,, +12,73199,,,,,,,,,,,,0.0690167248249054,,,,,, +12,73249,,,,,,,,,,,,0.07785492390394211,,,,,, +12,73299,,,,,,,,,,,,0.07660216093063354,,,,,, +12,73349,,,,,,,,,,,,0.06987367570400238,,,,,, +12,73399,,,,,,,,,,,,0.07068423926830292,,,,,, +12,73449,,,,,,,,,,,,0.0874251127243042,,,,,, +12,73499,,,,,,,,,,,,0.0659167617559433,,,,,, +12,73549,,,,,,,,,,,,0.07952842116355896,,,,,, +12,73599,,,,,,,,,,,,0.06598442792892456,,,,,, +12,73649,,,,,,,,,,,,0.0701325386762619,,,,,, +12,73699,,,,,,,,,,,,0.07286138832569122,,,,,, +12,73749,,,,,,,,,,,,0.07242827117443085,,,,,, +12,73799,,,,,,,,,,,,0.07976949214935303,,,,,, +12,73849,,,,,,,,,,,,0.0685565322637558,,,,,, +12,73899,,,,,,,,,,,,0.062170613557100296,,,,,, +12,73949,,,,,,,,,,,,0.06709945946931839,,,,,, +12,73999,,,,,,,,,,,,0.07400991767644882,,,,,, +12,74049,,,,,,,,,,,,0.0827380120754242,,,,,, +12,74099,,,,,,,,,,,,0.07181807607412338,,,,,, +12,74149,,,,,,,,,,,,0.07384767383337021,,,,,, +12,74199,,,,,,,,,,,,0.06960123777389526,,,,,, +12,74249,,,,,,,,,,,,0.07353337854146957,,,,,, +12,74299,,,,,,,,,,,,0.06990481913089752,,,,,, +12,74349,,,,,,,,,,,,0.07545202970504761,,,,,, +12,74399,,,,,,,,,,,,0.07098939269781113,,,,,, +12,74449,,,,,,,,,,,,0.06213567405939102,,,,,, +12,74499,,,,,,,,,,,,0.05915483832359314,,,,,, +12,74549,,,,,,,,,,,,0.06519161909818649,,,,,, +12,74567,,,,,,,,,,,,,0.2469431310892105,0.08583422750234604,0.1691218912601471,-0.04141342639923096,0.1705915927886963,0.08583422750234604 +12,74567,,,,,,,0.23162366449832916,0.07438938319683075,0.3188389539718628,0.1011534333229065,0.30650594830513,,,,,,, +13,74599,,,,,,,,,,,,0.06509283185005188,,,,,, +13,74649,,,,,,,,,,,,0.0829901322722435,,,,,, +13,74699,,,,,,,,,,,,0.06821142137050629,,,,,, +13,74749,,,,,,,,,,,,0.07768455147743225,,,,,, +13,74799,,,,,,,,,,,,0.076413094997406,,,,,, +13,74849,,,,,,,,,,,,0.0797603502869606,,,,,, +13,74899,,,,,,,,,,,,0.07111313939094543,,,,,, +13,74949,,,,,,,,,,,,0.07290427386760712,,,,,, +13,74999,,,,,,,,,,,,0.09306346625089645,,,,,, +13,75049,,,,,,,,,,,,0.06281214952468872,,,,,, +13,75099,,,,,,,,,,,,0.06780460476875305,,,,,, +13,75149,,,,,,,,,,,,0.07403396815061569,,,,,, +13,75199,,,,,,,,,,,,0.06958046555519104,,,,,, +13,75249,,,,,,,,,,,,0.07004985958337784,,,,,, +13,75299,,,,,,,,,,,,0.08378975093364716,,,,,, +13,75349,,,,,,,,,,,,0.0677645355463028,,,,,, +13,75399,,,,,,,,,,,,0.08083312213420868,,,,,, +13,75449,,,,,,,,,,,,0.063656747341156,,,,,, +13,75499,,,,,,,,,,,,0.0731947124004364,,,,,, +13,75549,,,,,,,,,,,,0.06661906838417053,,,,,, +13,75599,,,,,,,,,,,,0.0798574686050415,,,,,, +13,75649,,,,,,,,,,,,0.07342854887247086,,,,,, +13,75699,,,,,,,,,,,,0.07885951548814774,,,,,, +13,75749,,,,,,,,,,,,0.06552164256572723,,,,,, +13,75799,,,,,,,,,,,,0.07664640247821808,,,,,, +13,75849,,,,,,,,,,,,0.08328983187675476,,,,,, +13,75899,,,,,,,,,,,,0.07952290773391724,,,,,, +13,75949,,,,,,,,,,,,0.07352802157402039,,,,,, +13,75999,,,,,,,,,,,,0.06779909133911133,,,,,, +13,76049,,,,,,,,,,,,0.07431762665510178,,,,,, +13,76099,,,,,,,,,,,,0.07627145946025848,,,,,, +13,76149,,,,,,,,,,,,0.0692182332277298,,,,,, +13,76199,,,,,,,,,,,,0.07585816085338593,,,,,, +13,76249,,,,,,,,,,,,0.07713572680950165,,,,,, +13,76299,,,,,,,,,,,,0.07429558038711548,,,,,, +13,76349,,,,,,,,,,,,0.0741630494594574,,,,,, +13,76399,,,,,,,,,,,,0.06729298830032349,,,,,, +13,76449,,,,,,,,,,,,0.06911931931972504,,,,,, +13,76499,,,,,,,,,,,,0.07293268293142319,,,,,, +13,76549,,,,,,,,,,,,0.08182965219020844,,,,,, +13,76599,,,,,,,,,,,,0.0748106986284256,,,,,, +13,76649,,,,,,,,,,,,0.07538563013076782,,,,,, +13,76699,,,,,,,,,,,,0.0830102413892746,,,,,, +13,76749,,,,,,,,,,,,0.07055006176233292,,,,,, +13,76799,,,,,,,,,,,,0.07444224506616592,,,,,, +13,76849,,,,,,,,,,,,0.06997616589069366,,,,,, +13,76899,,,,,,,,,,,,0.08383272588253021,,,,,, +13,76949,,,,,,,,,,,,0.07175162434577942,,,,,, +13,76999,,,,,,,,,,,,0.06958615034818649,,,,,, +13,77049,,,,,,,,,,,,0.09412910044193268,,,,,, +13,77099,,,,,,,,,,,,0.07470961660146713,,,,,, +13,77149,,,,,,,,,,,,0.06672520935535431,,,,,, +13,77199,,,,,,,,,,,,0.07446946203708649,,,,,, +13,77249,,,,,,,,,,,,0.06688714027404785,,,,,, +13,77299,,,,,,,,,,,,0.0769423171877861,,,,,, +13,77349,,,,,,,,,,,,0.07386782020330429,,,,,, +13,77399,,,,,,,,,,,,0.08160941302776337,,,,,, +13,77449,,,,,,,,,,,,0.07003648579120636,,,,,, +13,77499,,,,,,,,,,,,0.06765452027320862,,,,,, +13,77549,,,,,,,,,,,,0.07533122599124908,,,,,, +13,77599,,,,,,,,,,,,0.08055604994297028,,,,,, +13,77649,,,,,,,,,,,,0.08027852326631546,,,,,, +13,77699,,,,,,,,,,,,0.08676721900701523,,,,,, +13,77749,,,,,,,,,,,,0.06632137298583984,,,,,, +13,77799,,,,,,,,,,,,0.0822141021490097,,,,,, +13,77849,,,,,,,,,,,,0.06529703736305237,,,,,, +13,77899,,,,,,,,,,,,0.07008197158575058,,,,,, +13,77949,,,,,,,,,,,,0.06490129232406616,,,,,, +13,77999,,,,,,,,,,,,0.07401163130998611,,,,,, +13,78049,,,,,,,,,,,,0.07689309120178223,,,,,, +13,78099,,,,,,,,,,,,0.0745367705821991,,,,,, +13,78149,,,,,,,,,,,,0.08159615099430084,,,,,, +13,78199,,,,,,,,,,,,0.0714094266295433,,,,,, +13,78249,,,,,,,,,,,,0.06767557561397552,,,,,, +13,78299,,,,,,,,,,,,0.08099905401468277,,,,,, +13,78349,,,,,,,,,,,,0.0728413313627243,,,,,, +13,78399,,,,,,,,,,,,0.0761699229478836,,,,,, +13,78449,,,,,,,,,,,,0.07676933705806732,,,,,, +13,78499,,,,,,,,,,,,0.07196544110774994,,,,,, +13,78549,,,,,,,,,,,,0.07913026958703995,,,,,, +13,78599,,,,,,,,,,,,0.07219952344894409,,,,,, +13,78649,,,,,,,,,,,,0.07909649610519409,,,,,, +13,78699,,,,,,,,,,,,0.06474282592535019,,,,,, +13,78749,,,,,,,,,,,,0.08052262663841248,,,,,, +13,78799,,,,,,,,,,,,0.07676929235458374,,,,,, +13,78849,,,,,,,,,,,,0.06488350033760071,,,,,, +13,78899,,,,,,,,,,,,0.07110154628753662,,,,,, +13,78949,,,,,,,,,,,,0.07548125088214874,,,,,, +13,78999,,,,,,,,,,,,0.07804565131664276,,,,,, +13,79049,,,,,,,,,,,,0.07843931019306183,,,,,, +13,79099,,,,,,,,,,,,0.0680389255285263,,,,,, +13,79149,,,,,,,,,,,,0.07498630881309509,,,,,, +13,79199,,,,,,,,,,,,0.08059917390346527,,,,,, +13,79249,,,,,,,,,,,,0.0714777335524559,,,,,, +13,79299,,,,,,,,,,,,0.06498150527477264,,,,,, +13,79349,,,,,,,,,,,,0.05918231979012489,,,,,, +13,79399,,,,,,,,,,,,0.07333509624004364,,,,,, +13,79449,,,,,,,,,,,,0.08104433864355087,,,,,, +13,79499,,,,,,,,,,,,0.07319015264511108,,,,,, +13,79549,,,,,,,,,,,,0.07404032349586487,,,,,, +13,79599,,,,,,,,,,,,0.08062963932752609,,,,,, +13,79649,,,,,,,,,,,,0.06987583637237549,,,,,, +13,79699,,,,,,,,,,,,0.06821496039628983,,,,,, +13,79749,,,,,,,,,,,,0.0725938156247139,,,,,, +13,79799,,,,,,,,,,,,0.08101478219032288,,,,,, +13,79849,,,,,,,,,,,,0.06554874777793884,,,,,, +13,79899,,,,,,,,,,,,0.0857713520526886,,,,,, +13,79949,,,,,,,,,,,,0.07252363860607147,,,,,, +13,79999,,,,,,,,,,,,0.0690012276172638,,,,,, +13,80049,,,,,,,,,,,,0.07259305566549301,,,,,, +13,80099,,,,,,,,,,,,0.07513251900672913,,,,,, +13,80149,,,,,,,,,,,,0.0747298151254654,,,,,, +13,80199,,,,,,,,,,,,0.0746084526181221,,,,,, +13,80249,,,,,,,,,,,,0.06987786293029785,,,,,, +13,80299,,,,,,,,,,,,0.07066357135772705,,,,,, +13,80303,,,,,,,,,,,,,0.24208517372608185,0.08083149045705795,0.1937013417482376,0.01928389072418213,0.1978822648525238,0.08083149045705795 +13,80303,,,,,,,0.22915326058864594,0.07284358143806458,0.3463115692138672,0.11984115839004517,0.32866790890693665,,,,,,, +14,80349,,,,,,,,,,,,0.07344672083854675,,,,,, +14,80399,,,,,,,,,,,,0.06336868554353714,,,,,, +14,80449,,,,,,,,,,,,0.06875261664390564,,,,,, +14,80499,,,,,,,,,,,,0.07294051349163055,,,,,, +14,80549,,,,,,,,,,,,0.07000550627708435,,,,,, +14,80599,,,,,,,,,,,,0.07712383568286896,,,,,, +14,80649,,,,,,,,,,,,0.06632836163043976,,,,,, +14,80699,,,,,,,,,,,,0.07853218913078308,,,,,, +14,80749,,,,,,,,,,,,0.0779855027794838,,,,,, +14,80799,,,,,,,,,,,,0.08582624793052673,,,,,, +14,80849,,,,,,,,,,,,0.065117247402668,,,,,, +14,80899,,,,,,,,,,,,0.07017774879932404,,,,,, +14,80949,,,,,,,,,,,,0.06424248218536377,,,,,, +14,80999,,,,,,,,,,,,0.06178678199648857,,,,,, +14,81049,,,,,,,,,,,,0.06521672755479813,,,,,, +14,81099,,,,,,,,,,,,0.08046892285346985,,,,,, +14,81149,,,,,,,,,,,,0.06767892092466354,,,,,, +14,81199,,,,,,,,,,,,0.07785959541797638,,,,,, +14,81249,,,,,,,,,,,,0.08272386342287064,,,,,, +14,81299,,,,,,,,,,,,0.07714691758155823,,,,,, +14,81349,,,,,,,,,,,,0.06916849315166473,,,,,, +14,81399,,,,,,,,,,,,0.07538293302059174,,,,,, +14,81449,,,,,,,,,,,,0.06733089685440063,,,,,, +14,81499,,,,,,,,,,,,0.06759816408157349,,,,,, +14,81549,,,,,,,,,,,,0.06519150733947754,,,,,, +14,81599,,,,,,,,,,,,0.07100716233253479,,,,,, +14,81649,,,,,,,,,,,,0.06611603498458862,,,,,, +14,81699,,,,,,,,,,,,0.0586542971432209,,,,,, +14,81749,,,,,,,,,,,,0.07602494955062866,,,,,, +14,81799,,,,,,,,,,,,0.06667584925889969,,,,,, +14,81849,,,,,,,,,,,,0.06752245128154755,,,,,, +14,81899,,,,,,,,,,,,0.07522054761648178,,,,,, +14,81949,,,,,,,,,,,,0.06025329977273941,,,,,, +14,81999,,,,,,,,,,,,0.06950962543487549,,,,,, +14,82049,,,,,,,,,,,,0.06200910359621048,,,,,, +14,82099,,,,,,,,,,,,0.07063539326190948,,,,,, +14,82149,,,,,,,,,,,,0.07468563318252563,,,,,, +14,82199,,,,,,,,,,,,0.07000668346881866,,,,,, +14,82249,,,,,,,,,,,,0.06402704119682312,,,,,, +14,82299,,,,,,,,,,,,0.08075027167797089,,,,,, +14,82349,,,,,,,,,,,,0.06773117184638977,,,,,, +14,82399,,,,,,,,,,,,0.07995739579200745,,,,,, +14,82449,,,,,,,,,,,,0.06750944256782532,,,,,, +14,82499,,,,,,,,,,,,0.07257692515850067,,,,,, +14,82549,,,,,,,,,,,,0.06104542315006256,,,,,, +14,82599,,,,,,,,,,,,0.06978563219308853,,,,,, +14,82649,,,,,,,,,,,,0.06949654221534729,,,,,, +14,82699,,,,,,,,,,,,0.07523703575134277,,,,,, +14,82749,,,,,,,,,,,,0.07085149735212326,,,,,, +14,82799,,,,,,,,,,,,0.07066282629966736,,,,,, +14,82849,,,,,,,,,,,,0.07994192838668823,,,,,, +14,82899,,,,,,,,,,,,0.07017268240451813,,,,,, +14,82949,,,,,,,,,,,,0.07720473408699036,,,,,, +14,82999,,,,,,,,,,,,0.07095207273960114,,,,,, +14,83049,,,,,,,,,,,,0.07810264825820923,,,,,, +14,83099,,,,,,,,,,,,0.08163139224052429,,,,,, +14,83149,,,,,,,,,,,,0.07117821276187897,,,,,, +14,83199,,,,,,,,,,,,0.07164140790700912,,,,,, +14,83249,,,,,,,,,,,,0.07861080765724182,,,,,, +14,83299,,,,,,,,,,,,0.07858579605817795,,,,,, +14,83349,,,,,,,,,,,,0.06272947788238525,,,,,, +14,83399,,,,,,,,,,,,0.06924518942832947,,,,,, +14,83449,,,,,,,,,,,,0.07289716601371765,,,,,, +14,83499,,,,,,,,,,,,0.06591397523880005,,,,,, +14,83549,,,,,,,,,,,,0.07756150513887405,,,,,, +14,83599,,,,,,,,,,,,0.06462618708610535,,,,,, +14,83649,,,,,,,,,,,,0.07240812480449677,,,,,, +14,83699,,,,,,,,,,,,0.07398734986782074,,,,,, +14,83749,,,,,,,,,,,,0.07490473985671997,,,,,, +14,83799,,,,,,,,,,,,0.07114571332931519,,,,,, +14,83849,,,,,,,,,,,,0.06711012870073318,,,,,, +14,83899,,,,,,,,,,,,0.06459052860736847,,,,,, +14,83949,,,,,,,,,,,,0.07286804914474487,,,,,, +14,83999,,,,,,,,,,,,0.0808727964758873,,,,,, +14,84049,,,,,,,,,,,,0.07267417758703232,,,,,, +14,84099,,,,,,,,,,,,0.0660630464553833,,,,,, +14,84149,,,,,,,,,,,,0.06462739408016205,,,,,, +14,84199,,,,,,,,,,,,0.07275712490081787,,,,,, +14,84249,,,,,,,,,,,,0.06446116417646408,,,,,, +14,84299,,,,,,,,,,,,0.07085762917995453,,,,,, +14,84349,,,,,,,,,,,,0.061013780534267426,,,,,, +14,84399,,,,,,,,,,,,0.07931499183177948,,,,,, +14,84449,,,,,,,,,,,,0.08534352481365204,,,,,, +14,84499,,,,,,,,,,,,0.08172720670700073,,,,,, +14,84549,,,,,,,,,,,,0.06006583198904991,,,,,, +14,84599,,,,,,,,,,,,0.07434830069541931,,,,,, +14,84649,,,,,,,,,,,,0.06536529213190079,,,,,, +14,84699,,,,,,,,,,,,0.06186213344335556,,,,,, +14,84749,,,,,,,,,,,,0.0662611573934555,,,,,, +14,84799,,,,,,,,,,,,0.07117666304111481,,,,,, +14,84849,,,,,,,,,,,,0.06543543934822083,,,,,, +14,84899,,,,,,,,,,,,0.07349126040935516,,,,,, +14,84949,,,,,,,,,,,,0.06380636245012283,,,,,, +14,84999,,,,,,,,,,,,0.06339900940656662,,,,,, +14,85049,,,,,,,,,,,,0.06653110682964325,,,,,, +14,85099,,,,,,,,,,,,0.0685347467660904,,,,,, +14,85149,,,,,,,,,,,,0.07807089388370514,,,,,, +14,85199,,,,,,,,,,,,0.06306774169206619,,,,,, +14,85249,,,,,,,,,,,,0.07322674989700317,,,,,, +14,85299,,,,,,,,,,,,0.06761834770441055,,,,,, +14,85349,,,,,,,,,,,,0.058118656277656555,,,,,, +14,85399,,,,,,,,,,,,0.06814952194690704,,,,,, +14,85449,,,,,,,,,,,,0.07279635965824127,,,,,, +14,85499,,,,,,,,,,,,0.06436225771903992,,,,,, +14,85549,,,,,,,,,,,,0.06899134069681168,,,,,, +14,85599,,,,,,,,,,,,0.0636628195643425,,,,,, +14,85649,,,,,,,,,,,,0.07993683218955994,,,,,, +14,85699,,,,,,,,,,,,0.08176686614751816,,,,,, +14,85749,,,,,,,,,,,,0.06487461924552917,,,,,, +14,85799,,,,,,,,,,,,0.08286713063716888,,,,,, +14,85849,,,,,,,,,,,,0.07025457918643951,,,,,, +14,85899,,,,,,,,,,,,0.07319797575473785,,,,,, +14,85949,,,,,,,,,,,,0.06178764998912811,,,,,, +14,85999,,,,,,,,,,,,0.07790699601173401,,,,,, +14,86039,,,,,,,,,,,,,0.24346359074115753,0.08300391584634781,0.21040920913219452,-0.007073760032653809,0.2164294719696045,0.08300391584634781 +14,86039,,,,,,,0.22722557187080383,0.07187556475400925,0.36275574564933777,0.13154470920562744,0.3443335294723511,,,,,,, +15,86049,,,,,,,,,,,,0.06774219870567322,,,,,, +15,86099,,,,,,,,,,,,0.0718197226524353,,,,,, +15,86149,,,,,,,,,,,,0.07010849565267563,,,,,, +15,86199,,,,,,,,,,,,0.061375245451927185,,,,,, +15,86249,,,,,,,,,,,,0.07360789179801941,,,,,, +15,86299,,,,,,,,,,,,0.08539434522390366,,,,,, +15,86349,,,,,,,,,,,,0.0621323361992836,,,,,, +15,86399,,,,,,,,,,,,0.06117542088031769,,,,,, +15,86449,,,,,,,,,,,,0.08308850228786469,,,,,, +15,86499,,,,,,,,,,,,0.06756375730037689,,,,,, +15,86549,,,,,,,,,,,,0.06092750281095505,,,,,, +15,86599,,,,,,,,,,,,0.08414214849472046,,,,,, +15,86649,,,,,,,,,,,,0.0697181224822998,,,,,, +15,86699,,,,,,,,,,,,0.07089515030384064,,,,,, +15,86749,,,,,,,,,,,,0.06648780405521393,,,,,, +15,86799,,,,,,,,,,,,0.06931690871715546,,,,,, +15,86849,,,,,,,,,,,,0.06685616075992584,,,,,, +15,86899,,,,,,,,,,,,0.06380605697631836,,,,,, +15,86949,,,,,,,,,,,,0.06584522128105164,,,,,, +15,86999,,,,,,,,,,,,0.0719161257147789,,,,,, +15,87049,,,,,,,,,,,,0.07293307036161423,,,,,, +15,87099,,,,,,,,,,,,0.06680246442556381,,,,,, +15,87149,,,,,,,,,,,,0.06857603043317795,,,,,, +15,87199,,,,,,,,,,,,0.060904841870069504,,,,,, +15,87249,,,,,,,,,,,,0.06690242141485214,,,,,, +15,87299,,,,,,,,,,,,0.0718144029378891,,,,,, +15,87349,,,,,,,,,,,,0.08096528053283691,,,,,, +15,87399,,,,,,,,,,,,0.0640902891755104,,,,,, +15,87449,,,,,,,,,,,,0.07095476984977722,,,,,, +15,87499,,,,,,,,,,,,0.05841576308012009,,,,,, +15,87549,,,,,,,,,,,,0.07411672174930573,,,,,, +15,87599,,,,,,,,,,,,0.07589905709028244,,,,,, +15,87649,,,,,,,,,,,,0.07287188619375229,,,,,, +15,87699,,,,,,,,,,,,0.07954619824886322,,,,,, +15,87749,,,,,,,,,,,,0.07036009430885315,,,,,, +15,87799,,,,,,,,,,,,0.06526288390159607,,,,,, +15,87849,,,,,,,,,,,,0.06807379424571991,,,,,, +15,87899,,,,,,,,,,,,0.06550179421901703,,,,,, +15,87949,,,,,,,,,,,,0.06872003525495529,,,,,, +15,87999,,,,,,,,,,,,0.07173162698745728,,,,,, +15,88049,,,,,,,,,,,,0.061604566872119904,,,,,, +15,88099,,,,,,,,,,,,0.06784208118915558,,,,,, +15,88149,,,,,,,,,,,,0.0777558982372284,,,,,, +15,88199,,,,,,,,,,,,0.06895187497138977,,,,,, +15,88249,,,,,,,,,,,,0.06305550038814545,,,,,, +15,88299,,,,,,,,,,,,0.06976673007011414,,,,,, +15,88349,,,,,,,,,,,,0.05770975723862648,,,,,, +15,88399,,,,,,,,,,,,0.07049252092838287,,,,,, +15,88449,,,,,,,,,,,,0.059760332107543945,,,,,, +15,88499,,,,,,,,,,,,0.06425492465496063,,,,,, +15,88549,,,,,,,,,,,,0.06683076918125153,,,,,, +15,88599,,,,,,,,,,,,0.06602415442466736,,,,,, +15,88649,,,,,,,,,,,,0.06473976373672485,,,,,, +15,88699,,,,,,,,,,,,0.07925544679164886,,,,,, +15,88749,,,,,,,,,,,,0.06536465138196945,,,,,, +15,88799,,,,,,,,,,,,0.07391434907913208,,,,,, +15,88849,,,,,,,,,,,,0.07908311486244202,,,,,, +15,88899,,,,,,,,,,,,0.0650784894824028,,,,,, +15,88949,,,,,,,,,,,,0.07331232726573944,,,,,, +15,88999,,,,,,,,,,,,0.06607633084058762,,,,,, +15,89049,,,,,,,,,,,,0.06666506826877594,,,,,, +15,89099,,,,,,,,,,,,0.07560282945632935,,,,,, +15,89149,,,,,,,,,,,,0.07505258917808533,,,,,, +15,89199,,,,,,,,,,,,0.06962201744318008,,,,,, +15,89249,,,,,,,,,,,,0.07138408720493317,,,,,, +15,89299,,,,,,,,,,,,0.07236498594284058,,,,,, +15,89349,,,,,,,,,,,,0.07490870356559753,,,,,, +15,89399,,,,,,,,,,,,0.07493959367275238,,,,,, +15,89449,,,,,,,,,,,,0.06404988467693329,,,,,, +15,89499,,,,,,,,,,,,0.07237807661294937,,,,,, +15,89549,,,,,,,,,,,,0.06870681047439575,,,,,, +15,89599,,,,,,,,,,,,0.07978317141532898,,,,,, +15,89649,,,,,,,,,,,,0.06014180928468704,,,,,, +15,89699,,,,,,,,,,,,0.08022528886795044,,,,,, +15,89749,,,,,,,,,,,,0.06582553684711456,,,,,, +15,89799,,,,,,,,,,,,0.06011691316962242,,,,,, +15,89849,,,,,,,,,,,,0.07471568882465363,,,,,, +15,89899,,,,,,,,,,,,0.06967850029468536,,,,,, +15,89949,,,,,,,,,,,,0.07549118250608444,,,,,, +15,89999,,,,,,,,,,,,0.07496316730976105,,,,,, +15,90049,,,,,,,,,,,,0.0687091052532196,,,,,, +15,90099,,,,,,,,,,,,0.07629688084125519,,,,,, +15,90149,,,,,,,,,,,,0.06712065637111664,,,,,, +15,90199,,,,,,,,,,,,0.061943620443344116,,,,,, +15,90249,,,,,,,,,,,,0.07098611444234848,,,,,, +15,90299,,,,,,,,,,,,0.07343946397304535,,,,,, +15,90349,,,,,,,,,,,,0.07710437476634979,,,,,, +15,90399,,,,,,,,,,,,0.08036613464355469,,,,,, +15,90449,,,,,,,,,,,,0.06681451201438904,,,,,, +15,90499,,,,,,,,,,,,0.07538065314292908,,,,,, +15,90549,,,,,,,,,,,,0.07629094272851944,,,,,, +15,90599,,,,,,,,,,,,0.06385467946529388,,,,,, +15,90649,,,,,,,,,,,,0.08195468783378601,,,,,, +15,90699,,,,,,,,,,,,0.06852684915065765,,,,,, +15,90749,,,,,,,,,,,,0.07792280614376068,,,,,, +15,90799,,,,,,,,,,,,0.07404516637325287,,,,,, +15,90849,,,,,,,,,,,,0.07832588255405426,,,,,, +15,90899,,,,,,,,,,,,0.06779399514198303,,,,,, +15,90949,,,,,,,,,,,,0.061123110353946686,,,,,, +15,90999,,,,,,,,,,,,0.06450755894184113,,,,,, +15,91049,,,,,,,,,,,,0.07406057417392731,,,,,, +15,91099,,,,,,,,,,,,0.057087697088718414,,,,,, +15,91149,,,,,,,,,,,,0.07600684463977814,,,,,, +15,91199,,,,,,,,,,,,0.07604854553937912,,,,,, +15,91249,,,,,,,,,,,,0.06758905947208405,,,,,, +15,91299,,,,,,,,,,,,0.06800353527069092,,,,,, +15,91349,,,,,,,,,,,,0.07025577127933502,,,,,, +15,91399,,,,,,,,,,,,0.05818728357553482,,,,,, +15,91449,,,,,,,,,,,,0.06827184557914734,,,,,, +15,91499,,,,,,,,,,,,0.055091492831707,,,,,, +15,91549,,,,,,,,,,,,0.07433782517910004,,,,,, +15,91599,,,,,,,,,,,,0.07611404359340668,,,,,, +15,91649,,,,,,,,,,,,0.06763053685426712,,,,,, +15,91699,,,,,,,,,,,,0.07925616204738617,,,,,, +15,91749,,,,,,,,,,,,0.06558412313461304,,,,,, +15,91775,,,,,,,,,,,,,0.24459883570671082,0.08347846567630768,0.20625409483909607,-0.012831330299377441,0.20507271587848663,0.08347846567630768 +15,91775,,,,,,,0.22588595747947693,0.07120846211910248,0.37368154525756836,0.1395900845527649,0.3545253276824951,,,,,,, +16,91799,,,,,,,,,,,,0.06138264387845993,,,,,, +16,91849,,,,,,,,,,,,0.0654589831829071,,,,,, +16,91899,,,,,,,,,,,,0.07795175164937973,,,,,, +16,91949,,,,,,,,,,,,0.0729132890701294,,,,,, +16,91999,,,,,,,,,,,,0.07957164198160172,,,,,, +16,92049,,,,,,,,,,,,0.06998971104621887,,,,,, +16,92099,,,,,,,,,,,,0.07206341624259949,,,,,, +16,92149,,,,,,,,,,,,0.07140138745307922,,,,,, +16,92199,,,,,,,,,,,,0.06836585700511932,,,,,, +16,92249,,,,,,,,,,,,0.06648975610733032,,,,,, +16,92299,,,,,,,,,,,,0.06422310322523117,,,,,, +16,92349,,,,,,,,,,,,0.06929798424243927,,,,,, +16,92399,,,,,,,,,,,,0.07815408706665039,,,,,, +16,92449,,,,,,,,,,,,0.07668372988700867,,,,,, +16,92499,,,,,,,,,,,,0.07593771070241928,,,,,, +16,92549,,,,,,,,,,,,0.07430470734834671,,,,,, +16,92599,,,,,,,,,,,,0.07186079770326614,,,,,, +16,92649,,,,,,,,,,,,0.06122816354036331,,,,,, +16,92699,,,,,,,,,,,,0.07099968194961548,,,,,, +16,92749,,,,,,,,,,,,0.06490132957696915,,,,,, +16,92799,,,,,,,,,,,,0.06224086135625839,,,,,, +16,92849,,,,,,,,,,,,0.06637124717235565,,,,,, +16,92899,,,,,,,,,,,,0.07361362874507904,,,,,, +16,92949,,,,,,,,,,,,0.07967545092105865,,,,,, +16,92999,,,,,,,,,,,,0.06295162439346313,,,,,, +16,93049,,,,,,,,,,,,0.07805430144071579,,,,,, +16,93099,,,,,,,,,,,,0.0752093568444252,,,,,, +16,93149,,,,,,,,,,,,0.07595215737819672,,,,,, +16,93199,,,,,,,,,,,,0.07282231748104095,,,,,, +16,93249,,,,,,,,,,,,0.07631753385066986,,,,,, +16,93299,,,,,,,,,,,,0.07234632968902588,,,,,, +16,93349,,,,,,,,,,,,0.06681600213050842,,,,,, +16,93399,,,,,,,,,,,,0.05800857022404671,,,,,, +16,93449,,,,,,,,,,,,0.08671917021274567,,,,,, +16,93499,,,,,,,,,,,,0.08029349893331528,,,,,, +16,93549,,,,,,,,,,,,0.07577811181545258,,,,,, +16,93599,,,,,,,,,,,,0.06974944472312927,,,,,, +16,93649,,,,,,,,,,,,0.07216424494981766,,,,,, +16,93699,,,,,,,,,,,,0.07138853520154953,,,,,, +16,93749,,,,,,,,,,,,0.06323810666799545,,,,,, +16,93799,,,,,,,,,,,,0.06581521034240723,,,,,, +16,93849,,,,,,,,,,,,0.06387510895729065,,,,,, +16,93899,,,,,,,,,,,,0.07636860758066177,,,,,, +16,93949,,,,,,,,,,,,0.07838547229766846,,,,,, +16,93999,,,,,,,,,,,,0.06516315042972565,,,,,, +16,94049,,,,,,,,,,,,0.07409432530403137,,,,,, +16,94099,,,,,,,,,,,,0.07255057990550995,,,,,, +16,94149,,,,,,,,,,,,0.06845661997795105,,,,,, +16,94199,,,,,,,,,,,,0.0727580189704895,,,,,, +16,94249,,,,,,,,,,,,0.06339218467473984,,,,,, +16,94299,,,,,,,,,,,,0.07461842894554138,,,,,, +16,94349,,,,,,,,,,,,0.07010260969400406,,,,,, +16,94399,,,,,,,,,,,,0.08019468188285828,,,,,, +16,94449,,,,,,,,,,,,0.08320814371109009,,,,,, +16,94499,,,,,,,,,,,,0.06912378966808319,,,,,, +16,94549,,,,,,,,,,,,0.06732438504695892,,,,,, +16,94599,,,,,,,,,,,,0.0727112889289856,,,,,, +16,94649,,,,,,,,,,,,0.0800442099571228,,,,,, +16,94699,,,,,,,,,,,,0.07920613884925842,,,,,, +16,94749,,,,,,,,,,,,0.059095483273267746,,,,,, +16,94799,,,,,,,,,,,,0.06832164525985718,,,,,, +16,94849,,,,,,,,,,,,0.07016154378652573,,,,,, +16,94899,,,,,,,,,,,,0.07835176587104797,,,,,, +16,94949,,,,,,,,,,,,0.06471151113510132,,,,,, +16,94999,,,,,,,,,,,,0.0758611410856247,,,,,, +16,95049,,,,,,,,,,,,0.06895045936107635,,,,,, +16,95099,,,,,,,,,,,,0.0675247311592102,,,,,, +16,95149,,,,,,,,,,,,0.073204904794693,,,,,, +16,95199,,,,,,,,,,,,0.06382790952920914,,,,,, +16,95249,,,,,,,,,,,,0.07766301929950714,,,,,, +16,95299,,,,,,,,,,,,0.08000065386295319,,,,,, +16,95349,,,,,,,,,,,,0.07626961171627045,,,,,, +16,95399,,,,,,,,,,,,0.06896120309829712,,,,,, +16,95449,,,,,,,,,,,,0.07533758878707886,,,,,, +16,95499,,,,,,,,,,,,0.06403601914644241,,,,,, +16,95549,,,,,,,,,,,,0.06425248086452484,,,,,, +16,95599,,,,,,,,,,,,0.0604521781206131,,,,,, +16,95649,,,,,,,,,,,,0.06874518096446991,,,,,, +16,95699,,,,,,,,,,,,0.06354166567325592,,,,,, +16,95749,,,,,,,,,,,,0.07758161425590515,,,,,, +16,95799,,,,,,,,,,,,0.07577389478683472,,,,,, +16,95849,,,,,,,,,,,,0.07859157025814056,,,,,, +16,95899,,,,,,,,,,,,0.06606041640043259,,,,,, +16,95949,,,,,,,,,,,,0.06317359209060669,,,,,, +16,95999,,,,,,,,,,,,0.06353984028100967,,,,,, +16,96049,,,,,,,,,,,,0.07862143218517303,,,,,, +16,96099,,,,,,,,,,,,0.07258233428001404,,,,,, +16,96149,,,,,,,,,,,,0.06910793483257294,,,,,, +16,96199,,,,,,,,,,,,0.0568583607673645,,,,,, +16,96249,,,,,,,,,,,,0.07597564160823822,,,,,, +16,96299,,,,,,,,,,,,0.07745502889156342,,,,,, +16,96349,,,,,,,,,,,,0.06839476525783539,,,,,, +16,96399,,,,,,,,,,,,0.07632139325141907,,,,,, +16,96449,,,,,,,,,,,,0.08149879425764084,,,,,, +16,96499,,,,,,,,,,,,0.07250896096229553,,,,,, +16,96549,,,,,,,,,,,,0.07286331802606583,,,,,, +16,96599,,,,,,,,,,,,0.07059015333652496,,,,,, +16,96649,,,,,,,,,,,,0.07075653970241547,,,,,, +16,96699,,,,,,,,,,,,0.06795728206634521,,,,,, +16,96749,,,,,,,,,,,,0.07542777061462402,,,,,, +16,96799,,,,,,,,,,,,0.06103924289345741,,,,,, +16,96849,,,,,,,,,,,,0.07760684192180634,,,,,, +16,96899,,,,,,,,,,,,0.07356509566307068,,,,,, +16,96949,,,,,,,,,,,,0.06993700563907623,,,,,, +16,96999,,,,,,,,,,,,0.07651287317276001,,,,,, +16,97049,,,,,,,,,,,,0.07378765195608139,,,,,, +16,97099,,,,,,,,,,,,0.0688086748123169,,,,,, +16,97149,,,,,,,,,,,,0.07159733772277832,,,,,, +16,97199,,,,,,,,,,,,0.07871100306510925,,,,,, +16,97249,,,,,,,,,,,,0.0737164318561554,,,,,, +16,97299,,,,,,,,,,,,0.07402388751506805,,,,,, +16,97349,,,,,,,,,,,,0.0704491063952446,,,,,, +16,97399,,,,,,,,,,,,0.06934358179569244,,,,,, +16,97449,,,,,,,,,,,,0.0678318440914154,,,,,, +16,97499,,,,,,,,,,,,0.07552728056907654,,,,,, +16,97511,,,,,,,,,,,,,0.248576357960701,0.08638446778059006,0.16505122184753418,-0.04808950424194336,0.17468374967575073,0.08638446778059006 +16,97511,,,,,,,0.22512251138687134,0.07079967111349106,0.3802374005317688,0.1445295214653015,0.36125025153160095,,,,,,, +17,97549,,,,,,,,,,,,0.06662998348474503,,,,,, +17,97599,,,,,,,,,,,,0.07971363514661789,,,,,, +17,97649,,,,,,,,,,,,0.07128077745437622,,,,,, +17,97699,,,,,,,,,,,,0.07190889120101929,,,,,, +17,97749,,,,,,,,,,,,0.07486402988433838,,,,,, +17,97799,,,,,,,,,,,,0.0640970841050148,,,,,, +17,97849,,,,,,,,,,,,0.07726557552814484,,,,,, +17,97899,,,,,,,,,,,,0.06470030546188354,,,,,, +17,97949,,,,,,,,,,,,0.06716418266296387,,,,,, +17,97999,,,,,,,,,,,,0.06229565292596817,,,,,, +17,98049,,,,,,,,,,,,0.06476206332445145,,,,,, +17,98099,,,,,,,,,,,,0.06927330791950226,,,,,, +17,98149,,,,,,,,,,,,0.065955251455307,,,,,, +17,98199,,,,,,,,,,,,0.06829477846622467,,,,,, +17,98249,,,,,,,,,,,,0.07642797380685806,,,,,, +17,98299,,,,,,,,,,,,0.07132336497306824,,,,,, +17,98349,,,,,,,,,,,,0.059633731842041016,,,,,, +17,98399,,,,,,,,,,,,0.0620548352599144,,,,,, +17,98449,,,,,,,,,,,,0.07123333215713501,,,,,, +17,98499,,,,,,,,,,,,0.06987419724464417,,,,,, +17,98549,,,,,,,,,,,,0.07970239967107773,,,,,, +17,98599,,,,,,,,,,,,0.06493594497442245,,,,,, +17,98649,,,,,,,,,,,,0.0888141542673111,,,,,, +17,98699,,,,,,,,,,,,0.07676717638969421,,,,,, +17,98749,,,,,,,,,,,,0.076687753200531,,,,,, +17,98799,,,,,,,,,,,,0.07057803869247437,,,,,, +17,98849,,,,,,,,,,,,0.06976016610860825,,,,,, +17,98899,,,,,,,,,,,,0.0785578116774559,,,,,, +17,98949,,,,,,,,,,,,0.06485994160175323,,,,,, +17,98999,,,,,,,,,,,,0.055492009967565536,,,,,, +17,99049,,,,,,,,,,,,0.0579955168068409,,,,,, +17,99099,,,,,,,,,,,,0.07828864455223083,,,,,, +17,99149,,,,,,,,,,,,0.0728541910648346,,,,,, +17,99199,,,,,,,,,,,,0.06610849499702454,,,,,, +17,99249,,,,,,,,,,,,0.06955429166555405,,,,,, +17,99299,,,,,,,,,,,,0.07069899141788483,,,,,, +17,99349,,,,,,,,,,,,0.06398764252662659,,,,,, +17,99399,,,,,,,,,,,,0.08414244651794434,,,,,, +17,99449,,,,,,,,,,,,0.07588156312704086,,,,,, +17,99499,,,,,,,,,,,,0.07255791127681732,,,,,, +17,99549,,,,,,,,,,,,0.06660577654838562,,,,,, +17,99599,,,,,,,,,,,,0.06842157244682312,,,,,, +17,99649,,,,,,,,,,,,0.06181115657091141,,,,,, +17,99699,,,,,,,,,,,,0.0604676827788353,,,,,, +17,99749,,,,,,,,,,,,0.07031472027301788,,,,,, +17,99799,,,,,,,,,,,,0.07510212063789368,,,,,, +17,99849,,,,,,,,,,,,0.07178284227848053,,,,,, +17,99899,,,,,,,,,,,,0.06503680348396301,,,,,, +17,99949,,,,,,,,,,,,0.07329171895980835,,,,,, +17,99999,,,,,,,,,,,,0.0689413920044899,,,,,, +17,100049,,,,,,,,,,,,0.06055602803826332,,,,,, +17,100099,,,,,,,,,,,,0.06849206984043121,,,,,, +17,100149,,,,,,,,,,,,0.07580224424600601,,,,,, +17,100199,,,,,,,,,,,,0.06177005544304848,,,,,, +17,100249,,,,,,,,,,,,0.07222554832696915,,,,,, +17,100299,,,,,,,,,,,,0.06520260870456696,,,,,, +17,100349,,,,,,,,,,,,0.06900747865438461,,,,,, +17,100399,,,,,,,,,,,,0.07187823951244354,,,,,, +17,100449,,,,,,,,,,,,0.06528326869010925,,,,,, +17,100499,,,,,,,,,,,,0.0698905885219574,,,,,, +17,100549,,,,,,,,,,,,0.059920188039541245,,,,,, +17,100599,,,,,,,,,,,,0.06071033701300621,,,,,, +17,100649,,,,,,,,,,,,0.07052963972091675,,,,,, +17,100699,,,,,,,,,,,,0.06651334464550018,,,,,, +17,100749,,,,,,,,,,,,0.0784534141421318,,,,,, +17,100799,,,,,,,,,,,,0.07826302945613861,,,,,, +17,100849,,,,,,,,,,,,0.07061900198459625,,,,,, +17,100899,,,,,,,,,,,,0.07251313328742981,,,,,, +17,100949,,,,,,,,,,,,0.06535804271697998,,,,,, +17,100999,,,,,,,,,,,,0.05819607526063919,,,,,, +17,101049,,,,,,,,,,,,0.07235816866159439,,,,,, +17,101099,,,,,,,,,,,,0.06606779992580414,,,,,, +17,101149,,,,,,,,,,,,0.0795431137084961,,,,,, +17,101199,,,,,,,,,,,,0.06368768215179443,,,,,, +17,101249,,,,,,,,,,,,0.07028631865978241,,,,,, +17,101299,,,,,,,,,,,,0.0770520344376564,,,,,, +17,101349,,,,,,,,,,,,0.06740110367536545,,,,,, +17,101399,,,,,,,,,,,,0.06397032737731934,,,,,, +17,101449,,,,,,,,,,,,0.06829766929149628,,,,,, +17,101499,,,,,,,,,,,,0.0643623098731041,,,,,, +17,101549,,,,,,,,,,,,0.05881532281637192,,,,,, +17,101599,,,,,,,,,,,,0.06619174778461456,,,,,, +17,101649,,,,,,,,,,,,0.07292890548706055,,,,,, +17,101699,,,,,,,,,,,,0.07407371699810028,,,,,, +17,101749,,,,,,,,,,,,0.07161161303520203,,,,,, +17,101799,,,,,,,,,,,,0.08398178219795227,,,,,, +17,101849,,,,,,,,,,,,0.08704961836338043,,,,,, +17,101899,,,,,,,,,,,,0.06481197476387024,,,,,, +17,101949,,,,,,,,,,,,0.06601676344871521,,,,,, +17,101999,,,,,,,,,,,,0.07567854225635529,,,,,, +17,102049,,,,,,,,,,,,0.07270564138889313,,,,,, +17,102099,,,,,,,,,,,,0.073817677795887,,,,,, +17,102149,,,,,,,,,,,,0.07458007335662842,,,,,, +17,102199,,,,,,,,,,,,0.07348137348890305,,,,,, +17,102249,,,,,,,,,,,,0.07281135767698288,,,,,, +17,102299,,,,,,,,,,,,0.07673579454421997,,,,,, +17,102349,,,,,,,,,,,,0.07054416835308075,,,,,, +17,102399,,,,,,,,,,,,0.09557045996189117,,,,,, +17,102449,,,,,,,,,,,,0.08433455228805542,,,,,, +17,102499,,,,,,,,,,,,0.06326133757829666,,,,,, +17,102549,,,,,,,,,,,,0.07554057985544205,,,,,, +17,102599,,,,,,,,,,,,0.0680888444185257,,,,,, +17,102649,,,,,,,,,,,,0.06719039380550385,,,,,, +17,102699,,,,,,,,,,,,0.06855335831642151,,,,,, +17,102749,,,,,,,,,,,,0.06907834857702255,,,,,, +17,102799,,,,,,,,,,,,0.06852502375841141,,,,,, +17,102849,,,,,,,,,,,,0.07794192433357239,,,,,, +17,102899,,,,,,,,,,,,0.08463475853204727,,,,,, +17,102949,,,,,,,,,,,,0.0661630779504776,,,,,, +17,102999,,,,,,,,,,,,0.06482890248298645,,,,,, +17,103049,,,,,,,,,,,,0.06383734941482544,,,,,, +17,103099,,,,,,,,,,,,0.08339745551347733,,,,,, +17,103149,,,,,,,,,,,,0.06241603195667267,,,,,, +17,103199,,,,,,,,,,,,0.07609891891479492,,,,,, +17,103247,,,,,,,,,,,,,0.2458600550889969,0.0858052521944046,0.20968657732009888,-0.041061997413635254,0.21929723024368286,0.0858052521944046 +17,103247,,,,,,,0.225012868642807,0.07191073894500732,0.36451634764671326,0.13112908601760864,0.3625832796096802,,,,,,, +18,103249,,,,,,,,,,,,0.07029924541711807,,,,,, +18,103299,,,,,,,,,,,,0.07280810922384262,,,,,, +18,103349,,,,,,,,,,,,0.06909500062465668,,,,,, +18,103399,,,,,,,,,,,,0.07108616828918457,,,,,, +18,103449,,,,,,,,,,,,0.08018937706947327,,,,,, +18,103499,,,,,,,,,,,,0.06020436808466911,,,,,, +18,103549,,,,,,,,,,,,0.06214859336614609,,,,,, +18,103599,,,,,,,,,,,,0.0728621855378151,,,,,, +18,103649,,,,,,,,,,,,0.07303567230701447,,,,,, +18,103699,,,,,,,,,,,,0.07081050425767899,,,,,, +18,103749,,,,,,,,,,,,0.07287360727787018,,,,,, +18,103799,,,,,,,,,,,,0.06684412062168121,,,,,, +18,103849,,,,,,,,,,,,0.0703059732913971,,,,,, +18,103899,,,,,,,,,,,,0.07235859334468842,,,,,, +18,103949,,,,,,,,,,,,0.0643082857131958,,,,,, +18,103999,,,,,,,,,,,,0.08146609365940094,,,,,, +18,104049,,,,,,,,,,,,0.06122470647096634,,,,,, +18,104099,,,,,,,,,,,,0.0630204901099205,,,,,, +18,104149,,,,,,,,,,,,0.06470430642366409,,,,,, +18,104199,,,,,,,,,,,,0.0778244137763977,,,,,, +18,104249,,,,,,,,,,,,0.07580430060625076,,,,,, +18,104299,,,,,,,,,,,,0.061040520668029785,,,,,, +18,104349,,,,,,,,,,,,0.07786786556243896,,,,,, +18,104399,,,,,,,,,,,,0.059605881571769714,,,,,, +18,104449,,,,,,,,,,,,0.07501304149627686,,,,,, +18,104499,,,,,,,,,,,,0.055974844843149185,,,,,, +18,104549,,,,,,,,,,,,0.0708787590265274,,,,,, +18,104599,,,,,,,,,,,,0.08615481853485107,,,,,, +18,104649,,,,,,,,,,,,0.06528718769550323,,,,,, +18,104699,,,,,,,,,,,,0.07007778435945511,,,,,, +18,104749,,,,,,,,,,,,0.08410477638244629,,,,,, +18,104799,,,,,,,,,,,,0.06658485531806946,,,,,, +18,104849,,,,,,,,,,,,0.07713297754526138,,,,,, +18,104899,,,,,,,,,,,,0.06301002204418182,,,,,, +18,104949,,,,,,,,,,,,0.0743098258972168,,,,,, +18,104999,,,,,,,,,,,,0.07024884223937988,,,,,, +18,105049,,,,,,,,,,,,0.07518702745437622,,,,,, +18,105099,,,,,,,,,,,,0.07210423797369003,,,,,, +18,105149,,,,,,,,,,,,0.07424359768629074,,,,,, +18,105199,,,,,,,,,,,,0.0617048442363739,,,,,, +18,105249,,,,,,,,,,,,0.0782802626490593,,,,,, +18,105299,,,,,,,,,,,,0.07105745375156403,,,,,, +18,105349,,,,,,,,,,,,0.07360399514436722,,,,,, +18,105399,,,,,,,,,,,,0.07473105192184448,,,,,, +18,105449,,,,,,,,,,,,0.06612531840801239,,,,,, +18,105499,,,,,,,,,,,,0.06623750925064087,,,,,, +18,105549,,,,,,,,,,,,0.08064050227403641,,,,,, +18,105599,,,,,,,,,,,,0.0744365006685257,,,,,, +18,105649,,,,,,,,,,,,0.06817833334207535,,,,,, +18,105699,,,,,,,,,,,,0.0768192857503891,,,,,, +18,105749,,,,,,,,,,,,0.07283011078834534,,,,,, +18,105799,,,,,,,,,,,,0.06076767295598984,,,,,, +18,105849,,,,,,,,,,,,0.06593462824821472,,,,,, +18,105899,,,,,,,,,,,,0.058353882282972336,,,,,, +18,105949,,,,,,,,,,,,0.08130194246768951,,,,,, +18,105999,,,,,,,,,,,,0.06772369146347046,,,,,, +18,106049,,,,,,,,,,,,0.07154329121112823,,,,,, +18,106099,,,,,,,,,,,,0.07700060307979584,,,,,, +18,106149,,,,,,,,,,,,0.07271265983581543,,,,,, +18,106199,,,,,,,,,,,,0.0805739313364029,,,,,, +18,106249,,,,,,,,,,,,0.08191747963428497,,,,,, +18,106299,,,,,,,,,,,,0.07108794152736664,,,,,, +18,106349,,,,,,,,,,,,0.05866676941514015,,,,,, +18,106399,,,,,,,,,,,,0.06944020837545395,,,,,, +18,106449,,,,,,,,,,,,0.07015183568000793,,,,,, +18,106499,,,,,,,,,,,,0.07468192279338837,,,,,, +18,106549,,,,,,,,,,,,0.059864580631256104,,,,,, +18,106599,,,,,,,,,,,,0.07649964094161987,,,,,, +18,106649,,,,,,,,,,,,0.0674154981970787,,,,,, +18,106699,,,,,,,,,,,,0.07835929095745087,,,,,, +18,106749,,,,,,,,,,,,0.08951026201248169,,,,,, +18,106799,,,,,,,,,,,,0.06638410687446594,,,,,, +18,106849,,,,,,,,,,,,0.08386822789907455,,,,,, +18,106899,,,,,,,,,,,,0.06321167945861816,,,,,, +18,106949,,,,,,,,,,,,0.0636102631688118,,,,,, +18,106999,,,,,,,,,,,,0.0710819810628891,,,,,, +18,107049,,,,,,,,,,,,0.0844850242137909,,,,,, +18,107099,,,,,,,,,,,,0.06367138773202896,,,,,, +18,107149,,,,,,,,,,,,0.07196888327598572,,,,,, +18,107199,,,,,,,,,,,,0.08024021238088608,,,,,, +18,107249,,,,,,,,,,,,0.06995218992233276,,,,,, +18,107299,,,,,,,,,,,,0.06661592423915863,,,,,, +18,107349,,,,,,,,,,,,0.07195033133029938,,,,,, +18,107399,,,,,,,,,,,,0.08232058584690094,,,,,, +18,107449,,,,,,,,,,,,0.07190825045108795,,,,,, +18,107499,,,,,,,,,,,,0.07053028792142868,,,,,, +18,107549,,,,,,,,,,,,0.07916846126317978,,,,,, +18,107599,,,,,,,,,,,,0.07463932037353516,,,,,, +18,107649,,,,,,,,,,,,0.05777435004711151,,,,,, +18,107699,,,,,,,,,,,,0.07719133794307709,,,,,, +18,107749,,,,,,,,,,,,0.06491316854953766,,,,,, +18,107799,,,,,,,,,,,,0.06938457489013672,,,,,, +18,107849,,,,,,,,,,,,0.0641314759850502,,,,,, +18,107899,,,,,,,,,,,,0.07146375626325607,,,,,, +18,107949,,,,,,,,,,,,0.06288197636604309,,,,,, +18,107999,,,,,,,,,,,,0.07040933519601822,,,,,, +18,108049,,,,,,,,,,,,0.06661196798086166,,,,,, +18,108099,,,,,,,,,,,,0.06992089748382568,,,,,, +18,108149,,,,,,,,,,,,0.07596223056316376,,,,,, +18,108199,,,,,,,,,,,,0.08122072368860245,,,,,, +18,108249,,,,,,,,,,,,0.07099248468875885,,,,,, +18,108299,,,,,,,,,,,,0.07044950127601624,,,,,, +18,108349,,,,,,,,,,,,0.06331753730773926,,,,,, +18,108399,,,,,,,,,,,,0.07351550459861755,,,,,, +18,108449,,,,,,,,,,,,0.06792393326759338,,,,,, +18,108499,,,,,,,,,,,,0.06524665653705597,,,,,, +18,108549,,,,,,,,,,,,0.07524619996547699,,,,,, +18,108599,,,,,,,,,,,,0.0657891109585762,,,,,, +18,108649,,,,,,,,,,,,0.060191310942173004,,,,,, +18,108699,,,,,,,,,,,,0.07236860692501068,,,,,, +18,108749,,,,,,,,,,,,0.06785070896148682,,,,,, +18,108799,,,,,,,,,,,,0.0644058883190155,,,,,, +18,108849,,,,,,,,,,,,0.06619662791490555,,,,,, +18,108899,,,,,,,,,,,,0.07524086534976959,,,,,, +18,108949,,,,,,,,,,,,0.0730370283126831,,,,,, +18,108983,,,,,,,,,,,,,0.24503332376480103,0.08466777205467224,0.19306735694408417,-0.02726113796234131,0.19989021122455597,0.08466777205467224 +18,108983,,,,,,,0.22363461554050446,0.06999439001083374,0.392801433801651,0.15427625179290771,0.3729655146598816,,,,,,, +19,108999,,,,,,,,,,,,0.06288368254899979,,,,,, +19,109049,,,,,,,,,,,,0.06929822266101837,,,,,, +19,109099,,,,,,,,,,,,0.07560575008392334,,,,,, +19,109149,,,,,,,,,,,,0.06845671683549881,,,,,, +19,109199,,,,,,,,,,,,0.06486828625202179,,,,,, +19,109249,,,,,,,,,,,,0.0662185549736023,,,,,, +19,109299,,,,,,,,,,,,0.05961604416370392,,,,,, +19,109349,,,,,,,,,,,,0.08737179636955261,,,,,, +19,109399,,,,,,,,,,,,0.07232643663883209,,,,,, +19,109449,,,,,,,,,,,,0.05646862834692001,,,,,, +19,109499,,,,,,,,,,,,0.0711369588971138,,,,,, +19,109549,,,,,,,,,,,,0.06551288068294525,,,,,, +19,109599,,,,,,,,,,,,0.06503160297870636,,,,,, +19,109649,,,,,,,,,,,,0.06423669308423996,,,,,, +19,109699,,,,,,,,,,,,0.07398965209722519,,,,,, +19,109749,,,,,,,,,,,,0.0758812427520752,,,,,, +19,109799,,,,,,,,,,,,0.058292146772146225,,,,,, +19,109849,,,,,,,,,,,,0.07040244340896606,,,,,, +19,109899,,,,,,,,,,,,0.05883443355560303,,,,,, +19,109949,,,,,,,,,,,,0.07428392767906189,,,,,, +19,109999,,,,,,,,,,,,0.06287793815135956,,,,,, +19,110049,,,,,,,,,,,,0.06114889308810234,,,,,, +19,110099,,,,,,,,,,,,0.07186487317085266,,,,,, +19,110149,,,,,,,,,,,,0.06933309137821198,,,,,, +19,110199,,,,,,,,,,,,0.05961982160806656,,,,,, +19,110249,,,,,,,,,,,,0.06661441922187805,,,,,, +19,110299,,,,,,,,,,,,0.07430665194988251,,,,,, +19,110349,,,,,,,,,,,,0.07129769027233124,,,,,, +19,110399,,,,,,,,,,,,0.06786386668682098,,,,,, +19,110449,,,,,,,,,,,,0.05906146019697189,,,,,, +19,110499,,,,,,,,,,,,0.07286153733730316,,,,,, +19,110549,,,,,,,,,,,,0.08516082167625427,,,,,, +19,110599,,,,,,,,,,,,0.06191977858543396,,,,,, +19,110649,,,,,,,,,,,,0.06066668778657913,,,,,, +19,110699,,,,,,,,,,,,0.0752345472574234,,,,,, +19,110749,,,,,,,,,,,,0.07049331068992615,,,,,, +19,110799,,,,,,,,,,,,0.06588307023048401,,,,,, +19,110849,,,,,,,,,,,,0.06987813115119934,,,,,, +19,110899,,,,,,,,,,,,0.07392255961894989,,,,,, +19,110949,,,,,,,,,,,,0.06966762244701385,,,,,, +19,110999,,,,,,,,,,,,0.07476133108139038,,,,,, +19,111049,,,,,,,,,,,,0.06116271764039993,,,,,, +19,111099,,,,,,,,,,,,0.06921406090259552,,,,,, +19,111149,,,,,,,,,,,,0.07970130443572998,,,,,, +19,111199,,,,,,,,,,,,0.08502082526683807,,,,,, +19,111249,,,,,,,,,,,,0.0826391950249672,,,,,, +19,111299,,,,,,,,,,,,0.0627930611371994,,,,,, +19,111349,,,,,,,,,,,,0.0759071409702301,,,,,, +19,111399,,,,,,,,,,,,0.07545767724514008,,,,,, +19,111449,,,,,,,,,,,,0.06523001194000244,,,,,, +19,111499,,,,,,,,,,,,0.06914016604423523,,,,,, +19,111549,,,,,,,,,,,,0.07122908532619476,,,,,, +19,111599,,,,,,,,,,,,0.06518454104661942,,,,,, +19,111649,,,,,,,,,,,,0.07058712840080261,,,,,, +19,111699,,,,,,,,,,,,0.06658416986465454,,,,,, +19,111749,,,,,,,,,,,,0.06208260357379913,,,,,, +19,111799,,,,,,,,,,,,0.06524547934532166,,,,,, +19,111849,,,,,,,,,,,,0.07188574969768524,,,,,, +19,111899,,,,,,,,,,,,0.07837361097335815,,,,,, +19,111949,,,,,,,,,,,,0.07910557091236115,,,,,, +19,111999,,,,,,,,,,,,0.06731296330690384,,,,,, +19,112049,,,,,,,,,,,,0.06923151016235352,,,,,, +19,112099,,,,,,,,,,,,0.05508779361844063,,,,,, +19,112149,,,,,,,,,,,,0.07062055170536041,,,,,, +19,112199,,,,,,,,,,,,0.0670989453792572,,,,,, +19,112249,,,,,,,,,,,,0.05775342136621475,,,,,, +19,112299,,,,,,,,,,,,0.07184077799320221,,,,,, +19,112349,,,,,,,,,,,,0.06864519417285919,,,,,, +19,112399,,,,,,,,,,,,0.06370056420564651,,,,,, +19,112449,,,,,,,,,,,,0.06696547567844391,,,,,, +19,112499,,,,,,,,,,,,0.062290288507938385,,,,,, +19,112549,,,,,,,,,,,,0.08141246438026428,,,,,, +19,112599,,,,,,,,,,,,0.06493363529443741,,,,,, +19,112649,,,,,,,,,,,,0.07081299275159836,,,,,, +19,112699,,,,,,,,,,,,0.06138325855135918,,,,,, +19,112749,,,,,,,,,,,,0.07161268591880798,,,,,, +19,112799,,,,,,,,,,,,0.05960340052843094,,,,,, +19,112849,,,,,,,,,,,,0.05832333862781525,,,,,, +19,112899,,,,,,,,,,,,0.05837905779480934,,,,,, +19,112949,,,,,,,,,,,,0.07324302196502686,,,,,, +19,112999,,,,,,,,,,,,0.06618336588144302,,,,,, +19,113049,,,,,,,,,,,,0.06983926892280579,,,,,, +19,113099,,,,,,,,,,,,0.06386080384254456,,,,,, +19,113149,,,,,,,,,,,,0.07066459208726883,,,,,, +19,113199,,,,,,,,,,,,0.08025721460580826,,,,,, +19,113249,,,,,,,,,,,,0.07792341709136963,,,,,, +19,113299,,,,,,,,,,,,0.07342153787612915,,,,,, +19,113349,,,,,,,,,,,,0.07552027702331543,,,,,, +19,113399,,,,,,,,,,,,0.07678034901618958,,,,,, +19,113449,,,,,,,,,,,,0.07313002645969391,,,,,, +19,113499,,,,,,,,,,,,0.07096260786056519,,,,,, +19,113549,,,,,,,,,,,,0.07066557556390762,,,,,, +19,113599,,,,,,,,,,,,0.06772144138813019,,,,,, +19,113649,,,,,,,,,,,,0.06854120641946793,,,,,, +19,113699,,,,,,,,,,,,0.08430520445108414,,,,,, +19,113749,,,,,,,,,,,,0.0678899735212326,,,,,, +19,113799,,,,,,,,,,,,0.08150520920753479,,,,,, +19,113849,,,,,,,,,,,,0.06640162318944931,,,,,, +19,113899,,,,,,,,,,,,0.07737322151660919,,,,,, +19,113949,,,,,,,,,,,,0.06991040706634521,,,,,, +19,113999,,,,,,,,,,,,0.07016250491142273,,,,,, +19,114049,,,,,,,,,,,,0.06387656182050705,,,,,, +19,114099,,,,,,,,,,,,0.06943145394325256,,,,,, +19,114149,,,,,,,,,,,,0.07103432714939117,,,,,, +19,114199,,,,,,,,,,,,0.06677613407373428,,,,,, +19,114249,,,,,,,,,,,,0.08385233581066132,,,,,, +19,114299,,,,,,,,,,,,0.07350628077983856,,,,,, +19,114349,,,,,,,,,,,,0.0706050768494606,,,,,, +19,114399,,,,,,,,,,,,0.0764106810092926,,,,,, +19,114449,,,,,,,,,,,,0.07230571657419205,,,,,, +19,114499,,,,,,,,,,,,0.06519263982772827,,,,,, +19,114549,,,,,,,,,,,,0.07794269919395447,,,,,, +19,114599,,,,,,,,,,,,0.06938599050045013,,,,,, +19,114649,,,,,,,,,,,,0.07315506041049957,,,,,, +19,114699,,,,,,,,,,,,0.06490710377693176,,,,,, +19,114719,,,,,,,,,,,,,0.24824167788028717,0.08841544389724731,0.19313161075115204,-0.07273101806640625,0.20210407674312592,0.08841544389724731 +19,114719,,,,,,,0.22291134297847748,0.06969158351421356,0.3974361717700958,0.15791720151901245,0.37706685066223145,,,,,,, +20,114749,,,,,,,,,,,,0.06843529641628265,,,,,, +20,114799,,,,,,,,,,,,0.07117356359958649,,,,,, +20,114849,,,,,,,,,,,,0.07321177423000336,,,,,, +20,114899,,,,,,,,,,,,0.0713801309466362,,,,,, +20,114949,,,,,,,,,,,,0.07158629596233368,,,,,, +20,114999,,,,,,,,,,,,0.07221255451440811,,,,,, +20,115049,,,,,,,,,,,,0.07263267040252686,,,,,, +20,115099,,,,,,,,,,,,0.06837595999240875,,,,,, +20,115149,,,,,,,,,,,,0.07299406826496124,,,,,, +20,115199,,,,,,,,,,,,0.06369128078222275,,,,,, +20,115249,,,,,,,,,,,,0.07850699126720428,,,,,, +20,115299,,,,,,,,,,,,0.0714043378829956,,,,,, +20,115349,,,,,,,,,,,,0.07365657389163971,,,,,, +20,115399,,,,,,,,,,,,0.05535732954740524,,,,,, +20,115449,,,,,,,,,,,,0.0678948387503624,,,,,, +20,115499,,,,,,,,,,,,0.059969060122966766,,,,,, +20,115549,,,,,,,,,,,,0.08173500001430511,,,,,, +20,115599,,,,,,,,,,,,0.07861457765102386,,,,,, +20,115649,,,,,,,,,,,,0.07309558242559433,,,,,, +20,115699,,,,,,,,,,,,0.07767968624830246,,,,,, +20,115749,,,,,,,,,,,,0.07524317502975464,,,,,, +20,115799,,,,,,,,,,,,0.06847691535949707,,,,,, +20,115849,,,,,,,,,,,,0.07330173254013062,,,,,, +20,115899,,,,,,,,,,,,0.08311650902032852,,,,,, +20,115949,,,,,,,,,,,,0.07032549381256104,,,,,, +20,115999,,,,,,,,,,,,0.06602440774440765,,,,,, +20,116049,,,,,,,,,,,,0.06626380980014801,,,,,, +20,116099,,,,,,,,,,,,0.056218598037958145,,,,,, +20,116149,,,,,,,,,,,,0.0720537006855011,,,,,, +20,116199,,,,,,,,,,,,0.07341299951076508,,,,,, +20,116249,,,,,,,,,,,,0.061120063066482544,,,,,, +20,116299,,,,,,,,,,,,0.07169893383979797,,,,,, +20,116349,,,,,,,,,,,,0.06698869168758392,,,,,, +20,116399,,,,,,,,,,,,0.07834229618310928,,,,,, +20,116449,,,,,,,,,,,,0.07913016527891159,,,,,, +20,116499,,,,,,,,,,,,0.06778550893068314,,,,,, +20,116549,,,,,,,,,,,,0.07331910729408264,,,,,, +20,116599,,,,,,,,,,,,0.06439986824989319,,,,,, +20,116649,,,,,,,,,,,,0.06640883535146713,,,,,, +20,116699,,,,,,,,,,,,0.07244038581848145,,,,,, +20,116749,,,,,,,,,,,,0.07167533785104752,,,,,, +20,116799,,,,,,,,,,,,0.056584857404232025,,,,,, +20,116849,,,,,,,,,,,,0.0585593581199646,,,,,, +20,116899,,,,,,,,,,,,0.06229957193136215,,,,,, +20,116949,,,,,,,,,,,,0.06859870254993439,,,,,, +20,116999,,,,,,,,,,,,0.05972328037023544,,,,,, +20,117049,,,,,,,,,,,,0.0644679144024849,,,,,, +20,117099,,,,,,,,,,,,0.06750313192605972,,,,,, +20,117149,,,,,,,,,,,,0.058424610644578934,,,,,, +20,117199,,,,,,,,,,,,0.06504945456981659,,,,,, +20,117249,,,,,,,,,,,,0.06384846568107605,,,,,, +20,117299,,,,,,,,,,,,0.05892585963010788,,,,,, +20,117349,,,,,,,,,,,,0.06729261577129364,,,,,, +20,117399,,,,,,,,,,,,0.07058091461658478,,,,,, +20,117449,,,,,,,,,,,,0.06812824308872223,,,,,, +20,117499,,,,,,,,,,,,0.06541098654270172,,,,,, +20,117549,,,,,,,,,,,,0.07868217676877975,,,,,, +20,117599,,,,,,,,,,,,0.07008218765258789,,,,,, +20,117649,,,,,,,,,,,,0.06251358985900879,,,,,, +20,117699,,,,,,,,,,,,0.06820227205753326,,,,,, +20,117749,,,,,,,,,,,,0.05718427151441574,,,,,, +20,117799,,,,,,,,,,,,0.057388246059417725,,,,,, +20,117849,,,,,,,,,,,,0.07311398535966873,,,,,, +20,117899,,,,,,,,,,,,0.06691227108240128,,,,,, +20,117949,,,,,,,,,,,,0.08284738659858704,,,,,, +20,117999,,,,,,,,,,,,0.0691278949379921,,,,,, +20,118049,,,,,,,,,,,,0.06645720452070236,,,,,, +20,118099,,,,,,,,,,,,0.06703707575798035,,,,,, +20,118149,,,,,,,,,,,,0.06718342751264572,,,,,, +20,118199,,,,,,,,,,,,0.07237477600574493,,,,,, +20,118249,,,,,,,,,,,,0.06559351086616516,,,,,, +20,118299,,,,,,,,,,,,0.07484599947929382,,,,,, +20,118349,,,,,,,,,,,,0.07033400237560272,,,,,, +20,118399,,,,,,,,,,,,0.06614447385072708,,,,,, +20,118449,,,,,,,,,,,,0.0689808800816536,,,,,, +20,118499,,,,,,,,,,,,0.07127906382083893,,,,,, +20,118549,,,,,,,,,,,,0.06910300999879837,,,,,, +20,118599,,,,,,,,,,,,0.07379341125488281,,,,,, +20,118649,,,,,,,,,,,,0.0657566636800766,,,,,, +20,118699,,,,,,,,,,,,0.06857024878263474,,,,,, +20,118749,,,,,,,,,,,,0.06895424425601959,,,,,, +20,118799,,,,,,,,,,,,0.07404757291078568,,,,,, +20,118849,,,,,,,,,,,,0.0627518743276596,,,,,, +20,118899,,,,,,,,,,,,0.06134319305419922,,,,,, +20,118949,,,,,,,,,,,,0.06813664734363556,,,,,, +20,118999,,,,,,,,,,,,0.06410908699035645,,,,,, +20,119049,,,,,,,,,,,,0.06996922194957733,,,,,, +20,119099,,,,,,,,,,,,0.06761664897203445,,,,,, +20,119149,,,,,,,,,,,,0.06497761607170105,,,,,, +20,119199,,,,,,,,,,,,0.0710224136710167,,,,,, +20,119249,,,,,,,,,,,,0.06427096575498581,,,,,, +20,119299,,,,,,,,,,,,0.06889459490776062,,,,,, +20,119349,,,,,,,,,,,,0.06849820911884308,,,,,, +20,119399,,,,,,,,,,,,0.05369197949767113,,,,,, +20,119449,,,,,,,,,,,,0.07107598334550858,,,,,, +20,119499,,,,,,,,,,,,0.07886390388011932,,,,,, +20,119549,,,,,,,,,,,,0.06638915836811066,,,,,, +20,119599,,,,,,,,,,,,0.06793250143527985,,,,,, +20,119649,,,,,,,,,,,,0.07159948348999023,,,,,, +20,119699,,,,,,,,,,,,0.06294834613800049,,,,,, +20,119749,,,,,,,,,,,,0.07534143328666687,,,,,, +20,119799,,,,,,,,,,,,0.07484222948551178,,,,,, +20,119849,,,,,,,,,,,,0.0761629119515419,,,,,, +20,119899,,,,,,,,,,,,0.07547245919704437,,,,,, +20,119949,,,,,,,,,,,,0.06821224093437195,,,,,, +20,119999,,,,,,,,,,,,0.06618963181972504,,,,,, +20,120049,,,,,,,,,,,,0.07148268818855286,,,,,, +20,120099,,,,,,,,,,,,0.07420328259468079,,,,,, +20,120149,,,,,,,,,,,,0.05990108475089073,,,,,, +20,120199,,,,,,,,,,,,0.06845051795244217,,,,,, +20,120249,,,,,,,,,,,,0.06791938096284866,,,,,, +20,120299,,,,,,,,,,,,0.06962941586971283,,,,,, +20,120349,,,,,,,,,,,,0.0678386241197586,,,,,, +20,120399,,,,,,,,,,,,0.06600205600261688,,,,,, +20,120449,,,,,,,,,,,,0.06820664554834366,,,,,, +20,120455,,,,,,,,,,,,,0.24310898780822754,0.08345344662666321,0.2033843696117401,-0.012527823448181152,0.20976465940475464,0.08345344662666321 +20,120455,,,,,,,0.22138071060180664,0.068934865295887,0.40876367688179016,0.1670740842819214,0.3876931369304657,,,,,,, +21,120499,,,,,,,,,,,,0.07299398630857468,,,,,, +21,120549,,,,,,,,,,,,0.06922779977321625,,,,,, +21,120599,,,,,,,,,,,,0.06296736001968384,,,,,, +21,120649,,,,,,,,,,,,0.06832391768693924,,,,,, +21,120699,,,,,,,,,,,,0.07244959473609924,,,,,, +21,120749,,,,,,,,,,,,0.06338056176900864,,,,,, +21,120799,,,,,,,,,,,,0.06821340322494507,,,,,, +21,120849,,,,,,,,,,,,0.07245532423257828,,,,,, +21,120899,,,,,,,,,,,,0.07319749146699905,,,,,, +21,120949,,,,,,,,,,,,0.07180655002593994,,,,,, +21,120999,,,,,,,,,,,,0.060919106006622314,,,,,, +21,121049,,,,,,,,,,,,0.05930193141102791,,,,,, +21,121099,,,,,,,,,,,,0.07694642245769501,,,,,, +21,121149,,,,,,,,,,,,0.0648508220911026,,,,,, +21,121199,,,,,,,,,,,,0.05999356135725975,,,,,, +21,121249,,,,,,,,,,,,0.0748928114771843,,,,,, +21,121299,,,,,,,,,,,,0.08057156950235367,,,,,, +21,121349,,,,,,,,,,,,0.06840766966342926,,,,,, +21,121399,,,,,,,,,,,,0.06380164623260498,,,,,, +21,121449,,,,,,,,,,,,0.0668754056096077,,,,,, +21,121499,,,,,,,,,,,,0.07416801154613495,,,,,, +21,121549,,,,,,,,,,,,0.07418432831764221,,,,,, +21,121599,,,,,,,,,,,,0.06784315407276154,,,,,, +21,121649,,,,,,,,,,,,0.07255496829748154,,,,,, +21,121699,,,,,,,,,,,,0.06915473937988281,,,,,, +21,121749,,,,,,,,,,,,0.06484849750995636,,,,,, +21,121799,,,,,,,,,,,,0.07178370654582977,,,,,, +21,121849,,,,,,,,,,,,0.0634337067604065,,,,,, +21,121899,,,,,,,,,,,,0.06819476187229156,,,,,, +21,121949,,,,,,,,,,,,0.07092432677745819,,,,,, +21,121999,,,,,,,,,,,,0.0689820870757103,,,,,, +21,122049,,,,,,,,,,,,0.07369363307952881,,,,,, +21,122099,,,,,,,,,,,,0.06236075237393379,,,,,, +21,122149,,,,,,,,,,,,0.060246601700782776,,,,,, +21,122199,,,,,,,,,,,,0.0713232010602951,,,,,, +21,122249,,,,,,,,,,,,0.06428102403879166,,,,,, +21,122299,,,,,,,,,,,,0.07272280752658844,,,,,, +21,122349,,,,,,,,,,,,0.07976782321929932,,,,,, +21,122399,,,,,,,,,,,,0.0712985098361969,,,,,, +21,122449,,,,,,,,,,,,0.05670818313956261,,,,,, +21,122499,,,,,,,,,,,,0.06386581063270569,,,,,, +21,122549,,,,,,,,,,,,0.05903952568769455,,,,,, +21,122599,,,,,,,,,,,,0.059555843472480774,,,,,, +21,122649,,,,,,,,,,,,0.06612668186426163,,,,,, +21,122699,,,,,,,,,,,,0.06543311476707458,,,,,, +21,122749,,,,,,,,,,,,0.07038089632987976,,,,,, +21,122799,,,,,,,,,,,,0.06541681289672852,,,,,, +21,122849,,,,,,,,,,,,0.06130468100309372,,,,,, +21,122899,,,,,,,,,,,,0.06713999062776566,,,,,, +21,122949,,,,,,,,,,,,0.0649295225739479,,,,,, +21,122999,,,,,,,,,,,,0.06909693777561188,,,,,, +21,123049,,,,,,,,,,,,0.061329662799835205,,,,,, +21,123099,,,,,,,,,,,,0.07106298953294754,,,,,, +21,123149,,,,,,,,,,,,0.06614126265048981,,,,,, +21,123199,,,,,,,,,,,,0.06506582349538803,,,,,, +21,123249,,,,,,,,,,,,0.0777672529220581,,,,,, +21,123299,,,,,,,,,,,,0.06768771260976791,,,,,, +21,123349,,,,,,,,,,,,0.06585602462291718,,,,,, +21,123399,,,,,,,,,,,,0.06878246366977692,,,,,, +21,123449,,,,,,,,,,,,0.06768256425857544,,,,,, +21,123499,,,,,,,,,,,,0.059125207364559174,,,,,, +21,123549,,,,,,,,,,,,0.06511378288269043,,,,,, +21,123599,,,,,,,,,,,,0.06753682345151901,,,,,, +21,123649,,,,,,,,,,,,0.06511358171701431,,,,,, +21,123699,,,,,,,,,,,,0.05394109711050987,,,,,, +21,123749,,,,,,,,,,,,0.0704411044716835,,,,,, +21,123799,,,,,,,,,,,,0.07088684290647507,,,,,, +21,123849,,,,,,,,,,,,0.0759589821100235,,,,,, +21,123899,,,,,,,,,,,,0.06039629504084587,,,,,, +21,123949,,,,,,,,,,,,0.06450646370649338,,,,,, +21,123999,,,,,,,,,,,,0.06645689159631729,,,,,, +21,124049,,,,,,,,,,,,0.05901489034295082,,,,,, +21,124099,,,,,,,,,,,,0.06022432819008827,,,,,, +21,124149,,,,,,,,,,,,0.07202325016260147,,,,,, +21,124199,,,,,,,,,,,,0.07110662758350372,,,,,, +21,124249,,,,,,,,,,,,0.07391908764839172,,,,,, +21,124299,,,,,,,,,,,,0.06415936350822449,,,,,, +21,124349,,,,,,,,,,,,0.05554897338151932,,,,,, +21,124399,,,,,,,,,,,,0.06888476014137268,,,,,, +21,124449,,,,,,,,,,,,0.06914304941892624,,,,,, +21,124499,,,,,,,,,,,,0.06867921352386475,,,,,, +21,124549,,,,,,,,,,,,0.07528899610042572,,,,,, +21,124599,,,,,,,,,,,,0.07617675513029099,,,,,, +21,124649,,,,,,,,,,,,0.0819142758846283,,,,,, +21,124699,,,,,,,,,,,,0.0767374187707901,,,,,, +21,124749,,,,,,,,,,,,0.06723557412624359,,,,,, +21,124799,,,,,,,,,,,,0.061829306185245514,,,,,, +21,124849,,,,,,,,,,,,0.07383278757333755,,,,,, +21,124899,,,,,,,,,,,,0.0657150149345398,,,,,, +21,124949,,,,,,,,,,,,0.08179160952568054,,,,,, +21,124999,,,,,,,,,,,,0.05956200882792473,,,,,, +21,125049,,,,,,,,,,,,0.06988371163606644,,,,,, +21,125099,,,,,,,,,,,,0.0644797831773758,,,,,, +21,125149,,,,,,,,,,,,0.06245257332921028,,,,,, +21,125199,,,,,,,,,,,,0.06514056026935577,,,,,, +21,125249,,,,,,,,,,,,0.06421847641468048,,,,,, +21,125299,,,,,,,,,,,,0.06600716710090637,,,,,, +21,125349,,,,,,,,,,,,0.07852612435817719,,,,,, +21,125399,,,,,,,,,,,,0.06465215981006622,,,,,, +21,125449,,,,,,,,,,,,0.06682641804218292,,,,,, +21,125499,,,,,,,,,,,,0.07656525075435638,,,,,, +21,125549,,,,,,,,,,,,0.07380066812038422,,,,,, +21,125599,,,,,,,,,,,,0.07641763985157013,,,,,, +21,125649,,,,,,,,,,,,0.07626079767942429,,,,,, +21,125699,,,,,,,,,,,,0.06645665317773819,,,,,, +21,125749,,,,,,,,,,,,0.06727483868598938,,,,,, +21,125799,,,,,,,,,,,,0.07304611802101135,,,,,, +21,125849,,,,,,,,,,,,0.07061609625816345,,,,,, +21,125899,,,,,,,,,,,,0.07801081985235214,,,,,, +21,125949,,,,,,,,,,,,0.07065534591674805,,,,,, +21,125999,,,,,,,,,,,,0.0720096081495285,,,,,, +21,126049,,,,,,,,,,,,0.07397720962762833,,,,,, +21,126099,,,,,,,,,,,,0.07057756930589676,,,,,, +21,126149,,,,,,,,,,,,0.061978779733181,,,,,, +21,126191,,,,,,,,,,,,,0.24376562237739563,0.08413016051054001,0.20365403592586517,-0.02073836326599121,0.2100384384393692,0.08413016051054001 +21,126191,,,,,,,0.2207891196012497,0.06901966780424118,0.4078017473220825,0.16603124141693115,0.3926965296268463,,,,,,, +22,126199,,,,,,,,,,,,0.07251235842704773,,,,,, +22,126249,,,,,,,,,,,,0.058404695242643356,,,,,, +22,126299,,,,,,,,,,,,0.06770317256450653,,,,,, +22,126349,,,,,,,,,,,,0.06810777634382248,,,,,, +22,126399,,,,,,,,,,,,0.06523554772138596,,,,,, +22,126449,,,,,,,,,,,,0.06229603290557861,,,,,, +22,126499,,,,,,,,,,,,0.07158702611923218,,,,,, +22,126549,,,,,,,,,,,,0.0744495838880539,,,,,, +22,126599,,,,,,,,,,,,0.06961596012115479,,,,,, +22,126649,,,,,,,,,,,,0.06298711895942688,,,,,, +22,126699,,,,,,,,,,,,0.06736353039741516,,,,,, +22,126749,,,,,,,,,,,,0.07426051795482635,,,,,, +22,126799,,,,,,,,,,,,0.06035509333014488,,,,,, +22,126849,,,,,,,,,,,,0.0689043402671814,,,,,, +22,126899,,,,,,,,,,,,0.07107814401388168,,,,,, +22,126949,,,,,,,,,,,,0.07244513183832169,,,,,, +22,126999,,,,,,,,,,,,0.05858944356441498,,,,,, +22,127049,,,,,,,,,,,,0.06936237961053848,,,,,, +22,127099,,,,,,,,,,,,0.06129532307386398,,,,,, +22,127149,,,,,,,,,,,,0.06363417208194733,,,,,, +22,127199,,,,,,,,,,,,0.0719287171959877,,,,,, +22,127249,,,,,,,,,,,,0.07280886173248291,,,,,, +22,127299,,,,,,,,,,,,0.07543110847473145,,,,,, +22,127349,,,,,,,,,,,,0.05643715709447861,,,,,, +22,127399,,,,,,,,,,,,0.0723327100276947,,,,,, +22,127449,,,,,,,,,,,,0.06429439038038254,,,,,, +22,127499,,,,,,,,,,,,0.06942854076623917,,,,,, +22,127549,,,,,,,,,,,,0.06915760040283203,,,,,, +22,127599,,,,,,,,,,,,0.07056620717048645,,,,,, +22,127649,,,,,,,,,,,,0.07067751884460449,,,,,, +22,127699,,,,,,,,,,,,0.06177036464214325,,,,,, +22,127749,,,,,,,,,,,,0.07604493200778961,,,,,, +22,127799,,,,,,,,,,,,0.0743618905544281,,,,,, +22,127849,,,,,,,,,,,,0.07250511646270752,,,,,, +22,127899,,,,,,,,,,,,0.061490610241889954,,,,,, +22,127949,,,,,,,,,,,,0.06915393471717834,,,,,, +22,127999,,,,,,,,,,,,0.07929587364196777,,,,,, +22,128049,,,,,,,,,,,,0.07008872181177139,,,,,, +22,128099,,,,,,,,,,,,0.05991559475660324,,,,,, +22,128149,,,,,,,,,,,,0.06544165313243866,,,,,, +22,128199,,,,,,,,,,,,0.0834713950753212,,,,,, +22,128249,,,,,,,,,,,,0.060956183820962906,,,,,, +22,128299,,,,,,,,,,,,0.06852507591247559,,,,,, +22,128349,,,,,,,,,,,,0.0606989711523056,,,,,, +22,128399,,,,,,,,,,,,0.06947606801986694,,,,,, +22,128449,,,,,,,,,,,,0.07243038713932037,,,,,, +22,128499,,,,,,,,,,,,0.05722188949584961,,,,,, +22,128549,,,,,,,,,,,,0.06844623386859894,,,,,, +22,128599,,,,,,,,,,,,0.061709336936473846,,,,,, +22,128649,,,,,,,,,,,,0.07677862048149109,,,,,, +22,128699,,,,,,,,,,,,0.0771939754486084,,,,,, +22,128749,,,,,,,,,,,,0.06938893347978592,,,,,, +22,128799,,,,,,,,,,,,0.06272256374359131,,,,,, +22,128849,,,,,,,,,,,,0.06711360812187195,,,,,, +22,128899,,,,,,,,,,,,0.07977675646543503,,,,,, +22,128949,,,,,,,,,,,,0.05858531594276428,,,,,, +22,128999,,,,,,,,,,,,0.06262924522161484,,,,,, +22,129049,,,,,,,,,,,,0.05693027377128601,,,,,, +22,129099,,,,,,,,,,,,0.07576842606067657,,,,,, +22,129149,,,,,,,,,,,,0.07967817038297653,,,,,, +22,129199,,,,,,,,,,,,0.06989488750696182,,,,,, +22,129249,,,,,,,,,,,,0.07496418058872223,,,,,, +22,129299,,,,,,,,,,,,0.07803300023078918,,,,,, +22,129349,,,,,,,,,,,,0.07543360441923141,,,,,, +22,129399,,,,,,,,,,,,0.06357870995998383,,,,,, +22,129449,,,,,,,,,,,,0.08358385413885117,,,,,, +22,129499,,,,,,,,,,,,0.06851701438426971,,,,,, +22,129549,,,,,,,,,,,,0.06982028484344482,,,,,, +22,129599,,,,,,,,,,,,0.07412135601043701,,,,,, +22,129649,,,,,,,,,,,,0.06435142457485199,,,,,, +22,129699,,,,,,,,,,,,0.06856756657361984,,,,,, +22,129749,,,,,,,,,,,,0.07610839605331421,,,,,, +22,129799,,,,,,,,,,,,0.0613371767103672,,,,,, +22,129849,,,,,,,,,,,,0.06161205843091011,,,,,, +22,129899,,,,,,,,,,,,0.059712864458560944,,,,,, +22,129949,,,,,,,,,,,,0.07949711382389069,,,,,, +22,129999,,,,,,,,,,,,0.06820785999298096,,,,,, +22,130049,,,,,,,,,,,,0.06889460980892181,,,,,, +22,130099,,,,,,,,,,,,0.06609751284122467,,,,,, +22,130149,,,,,,,,,,,,0.07303723692893982,,,,,, +22,130199,,,,,,,,,,,,0.08117734640836716,,,,,, +22,130249,,,,,,,,,,,,0.07963744550943375,,,,,, +22,130299,,,,,,,,,,,,0.05848586559295654,,,,,, +22,130349,,,,,,,,,,,,0.06987614929676056,,,,,, +22,130399,,,,,,,,,,,,0.060592882335186005,,,,,, +22,130449,,,,,,,,,,,,0.07823555171489716,,,,,, +22,130499,,,,,,,,,,,,0.05974973738193512,,,,,, +22,130549,,,,,,,,,,,,0.07474777102470398,,,,,, +22,130599,,,,,,,,,,,,0.056900955736637115,,,,,, +22,130649,,,,,,,,,,,,0.052160993218421936,,,,,, +22,130699,,,,,,,,,,,,0.07013370096683502,,,,,, +22,130749,,,,,,,,,,,,0.06723372638225555,,,,,, +22,130799,,,,,,,,,,,,0.05935557186603546,,,,,, +22,130849,,,,,,,,,,,,0.05897519737482071,,,,,, +22,130899,,,,,,,,,,,,0.05882662162184715,,,,,, +22,130949,,,,,,,,,,,,0.07633037865161896,,,,,, +22,130999,,,,,,,,,,,,0.057398080825805664,,,,,, +22,131049,,,,,,,,,,,,0.06725138425827026,,,,,, +22,131099,,,,,,,,,,,,0.07781721651554108,,,,,, +22,131149,,,,,,,,,,,,0.0693306177854538,,,,,, +22,131199,,,,,,,,,,,,0.06554991751909256,,,,,, +22,131249,,,,,,,,,,,,0.07228463143110275,,,,,, +22,131299,,,,,,,,,,,,0.0824504867196083,,,,,, +22,131349,,,,,,,,,,,,0.06493878364562988,,,,,, +22,131399,,,,,,,,,,,,0.06591761112213135,,,,,, +22,131449,,,,,,,,,,,,0.06782545149326324,,,,,, +22,131499,,,,,,,,,,,,0.08216410875320435,,,,,, +22,131549,,,,,,,,,,,,0.06942752748727798,,,,,, +22,131599,,,,,,,,,,,,0.06500810384750366,,,,,, +22,131649,,,,,,,,,,,,0.06560853123664856,,,,,, +22,131699,,,,,,,,,,,,0.06844191253185272,,,,,, +22,131749,,,,,,,,,,,,0.07232874631881714,,,,,, +22,131799,,,,,,,,,,,,0.07091090083122253,,,,,, +22,131849,,,,,,,,,,,,0.059272319078445435,,,,,, +22,131899,,,,,,,,,,,,0.06814779341220856,,,,,, +22,131927,,,,,,,,,,,,,0.24262197315692902,0.08267266303300858,0.19915936887264252,-0.0030547380447387695,0.20745131373405457,0.08267266303300858 +22,131927,,,,,,,0.2201368659734726,0.06827330589294434,0.4184170365333557,0.1750618815422058,0.39633387327194214,,,,,,, +23,131949,,,,,,,,,,,,0.07275401055812836,,,,,, +23,131999,,,,,,,,,,,,0.06665007025003433,,,,,, +23,132049,,,,,,,,,,,,0.06663055717945099,,,,,, +23,132099,,,,,,,,,,,,0.07220298796892166,,,,,, +23,132149,,,,,,,,,,,,0.0653296411037445,,,,,, +23,132199,,,,,,,,,,,,0.0605747252702713,,,,,, +23,132249,,,,,,,,,,,,0.08165854215621948,,,,,, +23,132299,,,,,,,,,,,,0.06566453725099564,,,,,, +23,132349,,,,,,,,,,,,0.06967812776565552,,,,,, +23,132399,,,,,,,,,,,,0.07000671327114105,,,,,, +23,132449,,,,,,,,,,,,0.07480661571025848,,,,,, +23,132499,,,,,,,,,,,,0.07417561858892441,,,,,, +23,132549,,,,,,,,,,,,0.0652179941534996,,,,,, +23,132599,,,,,,,,,,,,0.0611717514693737,,,,,, +23,132649,,,,,,,,,,,,0.0803549736738205,,,,,, +23,132699,,,,,,,,,,,,0.06078158691525459,,,,,, +23,132749,,,,,,,,,,,,0.07270528376102448,,,,,, +23,132799,,,,,,,,,,,,0.07781665027141571,,,,,, +23,132849,,,,,,,,,,,,0.07412242889404297,,,,,, +23,132899,,,,,,,,,,,,0.06174720078706741,,,,,, +23,132949,,,,,,,,,,,,0.06744538247585297,,,,,, +23,132999,,,,,,,,,,,,0.06962813436985016,,,,,, +23,133049,,,,,,,,,,,,0.06372100859880447,,,,,, +23,133099,,,,,,,,,,,,0.07428169250488281,,,,,, +23,133149,,,,,,,,,,,,0.06492249667644501,,,,,, +23,133199,,,,,,,,,,,,0.06134721264243126,,,,,, +23,133249,,,,,,,,,,,,0.06532273441553116,,,,,, +23,133299,,,,,,,,,,,,0.05586206167936325,,,,,, +23,133349,,,,,,,,,,,,0.06899374723434448,,,,,, +23,133399,,,,,,,,,,,,0.0801156759262085,,,,,, +23,133449,,,,,,,,,,,,0.06666199117898941,,,,,, +23,133499,,,,,,,,,,,,0.06999420374631882,,,,,, +23,133549,,,,,,,,,,,,0.06965339183807373,,,,,, +23,133599,,,,,,,,,,,,0.06574543565511703,,,,,, +23,133649,,,,,,,,,,,,0.0680859312415123,,,,,, +23,133699,,,,,,,,,,,,0.07784061133861542,,,,,, +23,133749,,,,,,,,,,,,0.06799968332052231,,,,,, +23,133799,,,,,,,,,,,,0.07505349814891815,,,,,, +23,133849,,,,,,,,,,,,0.06593199074268341,,,,,, +23,133899,,,,,,,,,,,,0.06291564553976059,,,,,, +23,133949,,,,,,,,,,,,0.07234709709882736,,,,,, +23,133999,,,,,,,,,,,,0.06947720050811768,,,,,, +23,134049,,,,,,,,,,,,0.0692954957485199,,,,,, +23,134099,,,,,,,,,,,,0.06435532122850418,,,,,, +23,134149,,,,,,,,,,,,0.08137483894824982,,,,,, +23,134199,,,,,,,,,,,,0.06849229335784912,,,,,, +23,134249,,,,,,,,,,,,0.06141401827335358,,,,,, +23,134299,,,,,,,,,,,,0.06360455602407455,,,,,, +23,134349,,,,,,,,,,,,0.07375690340995789,,,,,, +23,134399,,,,,,,,,,,,0.06471474468708038,,,,,, +23,134449,,,,,,,,,,,,0.06419320404529572,,,,,, +23,134499,,,,,,,,,,,,0.07459776848554611,,,,,, +23,134549,,,,,,,,,,,,0.07181480526924133,,,,,, +23,134599,,,,,,,,,,,,0.06615999341011047,,,,,, +23,134649,,,,,,,,,,,,0.07353611290454865,,,,,, +23,134699,,,,,,,,,,,,0.06441278755664825,,,,,, +23,134749,,,,,,,,,,,,0.0702405646443367,,,,,, +23,134799,,,,,,,,,,,,0.06839115172624588,,,,,, +23,134849,,,,,,,,,,,,0.07681873440742493,,,,,, +23,134899,,,,,,,,,,,,0.07913988828659058,,,,,, +23,134949,,,,,,,,,,,,0.0653151422739029,,,,,, +23,134999,,,,,,,,,,,,0.07109710574150085,,,,,, +23,135049,,,,,,,,,,,,0.07021453976631165,,,,,, +23,135099,,,,,,,,,,,,0.06664340198040009,,,,,, +23,135149,,,,,,,,,,,,0.061538293957710266,,,,,, +23,135199,,,,,,,,,,,,0.0707923173904419,,,,,, +23,135249,,,,,,,,,,,,0.06917724013328552,,,,,, +23,135299,,,,,,,,,,,,0.08772946894168854,,,,,, +23,135349,,,,,,,,,,,,0.06731246411800385,,,,,, +23,135399,,,,,,,,,,,,0.06754454970359802,,,,,, +23,135449,,,,,,,,,,,,0.07206439971923828,,,,,, +23,135499,,,,,,,,,,,,0.06557916104793549,,,,,, +23,135549,,,,,,,,,,,,0.07175901532173157,,,,,, +23,135599,,,,,,,,,,,,0.07735744118690491,,,,,, +23,135649,,,,,,,,,,,,0.06665258854627609,,,,,, +23,135699,,,,,,,,,,,,0.06348035484552383,,,,,, +23,135749,,,,,,,,,,,,0.06291671097278595,,,,,, +23,135799,,,,,,,,,,,,0.07020452618598938,,,,,, +23,135849,,,,,,,,,,,,0.06640923023223877,,,,,, +23,135899,,,,,,,,,,,,0.07639367133378983,,,,,, +23,135949,,,,,,,,,,,,0.07954604923725128,,,,,, +23,135999,,,,,,,,,,,,0.06994451582431793,,,,,, +23,136049,,,,,,,,,,,,0.07861160486936569,,,,,, +23,136099,,,,,,,,,,,,0.0761980414390564,,,,,, +23,136149,,,,,,,,,,,,0.05722758173942566,,,,,, +23,136199,,,,,,,,,,,,0.05567897856235504,,,,,, +23,136249,,,,,,,,,,,,0.06916971504688263,,,,,, +23,136299,,,,,,,,,,,,0.0735774040222168,,,,,, +23,136349,,,,,,,,,,,,0.07509540021419525,,,,,, +23,136399,,,,,,,,,,,,0.06812720000743866,,,,,, +23,136449,,,,,,,,,,,,0.06410934031009674,,,,,, +23,136499,,,,,,,,,,,,0.07426382601261139,,,,,, +23,136549,,,,,,,,,,,,0.07281318306922913,,,,,, +23,136599,,,,,,,,,,,,0.06845472753047943,,,,,, +23,136649,,,,,,,,,,,,0.073036327958107,,,,,, +23,136699,,,,,,,,,,,,0.07318921387195587,,,,,, +23,136749,,,,,,,,,,,,0.06147509813308716,,,,,, +23,136799,,,,,,,,,,,,0.07361612468957901,,,,,, +23,136849,,,,,,,,,,,,0.07084346562623978,,,,,, +23,136899,,,,,,,,,,,,0.07403390109539032,,,,,, +23,136949,,,,,,,,,,,,0.07352383434772491,,,,,, +23,136999,,,,,,,,,,,,0.06672680377960205,,,,,, +23,137049,,,,,,,,,,,,0.0672118216753006,,,,,, +23,137099,,,,,,,,,,,,0.062387607991695404,,,,,, +23,137149,,,,,,,,,,,,0.06089725345373154,,,,,, +23,137199,,,,,,,,,,,,0.08295530080795288,,,,,, +23,137249,,,,,,,,,,,,0.06905107200145721,,,,,, +23,137299,,,,,,,,,,,,0.0598745197057724,,,,,, +23,137349,,,,,,,,,,,,0.06415054202079773,,,,,, +23,137399,,,,,,,,,,,,0.05977118760347366,,,,,, +23,137449,,,,,,,,,,,,0.06762151420116425,,,,,, +23,137499,,,,,,,,,,,,0.07158277928829193,,,,,, +23,137549,,,,,,,,,,,,0.05548864230513573,,,,,, +23,137599,,,,,,,,,,,,0.07361765950918198,,,,,, +23,137649,,,,,,,,,,,,0.05896613746881485,,,,,, +23,137663,,,,,,,,,,,,,0.24550339579582214,0.08595360815525055,0.20466290414333344,-0.0428619384765625,0.21419380605220795,0.08595360815525055 +23,137663,,,,,,,0.21966761350631714,0.06804399937391281,0.4217151999473572,0.17783844470977783,0.39980193972587585,,,,,,, +24,137699,,,,,,,,,,,,0.06090554594993591,,,,,, +24,137749,,,,,,,,,,,,0.06457509100437164,,,,,, +24,137799,,,,,,,,,,,,0.06329675018787384,,,,,, +24,137849,,,,,,,,,,,,0.07915826141834259,,,,,, +24,137899,,,,,,,,,,,,0.06700235605239868,,,,,, +24,137949,,,,,,,,,,,,0.048604026436805725,,,,,, +24,137999,,,,,,,,,,,,0.05869809910655022,,,,,, +24,138049,,,,,,,,,,,,0.06479831784963608,,,,,, +24,138099,,,,,,,,,,,,0.06705769151449203,,,,,, +24,138149,,,,,,,,,,,,0.07145445793867111,,,,,, +24,138199,,,,,,,,,,,,0.06089416518807411,,,,,, +24,138249,,,,,,,,,,,,0.06579457223415375,,,,,, +24,138299,,,,,,,,,,,,0.06286095082759857,,,,,, +24,138349,,,,,,,,,,,,0.07194732129573822,,,,,, +24,138399,,,,,,,,,,,,0.06489883363246918,,,,,, +24,138449,,,,,,,,,,,,0.07956808805465698,,,,,, +24,138499,,,,,,,,,,,,0.07223132252693176,,,,,, +24,138549,,,,,,,,,,,,0.06292138993740082,,,,,, +24,138599,,,,,,,,,,,,0.06949809938669205,,,,,, +24,138649,,,,,,,,,,,,0.0736602172255516,,,,,, +24,138699,,,,,,,,,,,,0.06769062578678131,,,,,, +24,138749,,,,,,,,,,,,0.07547444105148315,,,,,, +24,138799,,,,,,,,,,,,0.06613369286060333,,,,,, +24,138849,,,,,,,,,,,,0.06837691366672516,,,,,, +24,138899,,,,,,,,,,,,0.0689316838979721,,,,,, +24,138949,,,,,,,,,,,,0.0630532056093216,,,,,, +24,138999,,,,,,,,,,,,0.07176695764064789,,,,,, +24,139049,,,,,,,,,,,,0.06304958462715149,,,,,, +24,139099,,,,,,,,,,,,0.0704227089881897,,,,,, +24,139149,,,,,,,,,,,,0.06414757668972015,,,,,, +24,139199,,,,,,,,,,,,0.06422524899244308,,,,,, +24,139249,,,,,,,,,,,,0.06725993752479553,,,,,, +24,139299,,,,,,,,,,,,0.06762363761663437,,,,,, +24,139349,,,,,,,,,,,,0.0806937962770462,,,,,, +24,139399,,,,,,,,,,,,0.061214547604322433,,,,,, +24,139449,,,,,,,,,,,,0.0717133954167366,,,,,, +24,139499,,,,,,,,,,,,0.06391960382461548,,,,,, +24,139549,,,,,,,,,,,,0.07166235148906708,,,,,, +24,139599,,,,,,,,,,,,0.07458295673131943,,,,,, +24,139649,,,,,,,,,,,,0.06509803980588913,,,,,, +24,139699,,,,,,,,,,,,0.07180356234312057,,,,,, +24,139749,,,,,,,,,,,,0.07935943454504013,,,,,, +24,139799,,,,,,,,,,,,0.06582537293434143,,,,,, +24,139849,,,,,,,,,,,,0.07106872648000717,,,,,, +24,139899,,,,,,,,,,,,0.0667668879032135,,,,,, +24,139949,,,,,,,,,,,,0.06818151473999023,,,,,, +24,139999,,,,,,,,,,,,0.0711374431848526,,,,,, +24,140049,,,,,,,,,,,,0.06714524328708649,,,,,, +24,140099,,,,,,,,,,,,0.059473901987075806,,,,,, +24,140149,,,,,,,,,,,,0.0761084258556366,,,,,, +24,140199,,,,,,,,,,,,0.054965078830718994,,,,,, +24,140249,,,,,,,,,,,,0.06494869291782379,,,,,, +24,140299,,,,,,,,,,,,0.058768436312675476,,,,,, +24,140349,,,,,,,,,,,,0.06640665233135223,,,,,, +24,140399,,,,,,,,,,,,0.06621992588043213,,,,,, +24,140449,,,,,,,,,,,,0.05972746014595032,,,,,, +24,140499,,,,,,,,,,,,0.05581923574209213,,,,,, +24,140549,,,,,,,,,,,,0.06954370439052582,,,,,, +24,140599,,,,,,,,,,,,0.06404527276754379,,,,,, +24,140649,,,,,,,,,,,,0.06988557428121567,,,,,, +24,140699,,,,,,,,,,,,0.0685383528470993,,,,,, +24,140749,,,,,,,,,,,,0.06963980197906494,,,,,, +24,140799,,,,,,,,,,,,0.06595388799905777,,,,,, +24,140849,,,,,,,,,,,,0.05947195366024971,,,,,, +24,140899,,,,,,,,,,,,0.06628990173339844,,,,,, +24,140949,,,,,,,,,,,,0.06972482055425644,,,,,, +24,140999,,,,,,,,,,,,0.07466326653957367,,,,,, +24,141049,,,,,,,,,,,,0.07336610555648804,,,,,, +24,141099,,,,,,,,,,,,0.05315310135483742,,,,,, +24,141149,,,,,,,,,,,,0.07038494199514389,,,,,, +24,141199,,,,,,,,,,,,0.06363910436630249,,,,,, +24,141249,,,,,,,,,,,,0.06722763180732727,,,,,, +24,141299,,,,,,,,,,,,0.07771414518356323,,,,,, +24,141349,,,,,,,,,,,,0.07531389594078064,,,,,, +24,141399,,,,,,,,,,,,0.06199494004249573,,,,,, +24,141449,,,,,,,,,,,,0.0725337415933609,,,,,, +24,141499,,,,,,,,,,,,0.06879256665706635,,,,,, +24,141549,,,,,,,,,,,,0.0631442740559578,,,,,, +24,141599,,,,,,,,,,,,0.0606967955827713,,,,,, +24,141649,,,,,,,,,,,,0.05715818703174591,,,,,, +24,141699,,,,,,,,,,,,0.07672184705734253,,,,,, +24,141749,,,,,,,,,,,,0.06215977668762207,,,,,, +24,141799,,,,,,,,,,,,0.06054215133190155,,,,,, +24,141849,,,,,,,,,,,,0.06630557775497437,,,,,, +24,141899,,,,,,,,,,,,0.06799868494272232,,,,,, +24,141949,,,,,,,,,,,,0.07391779124736786,,,,,, +24,141999,,,,,,,,,,,,0.06607381254434586,,,,,, +24,142049,,,,,,,,,,,,0.06356169283390045,,,,,, +24,142099,,,,,,,,,,,,0.06485920399427414,,,,,, +24,142149,,,,,,,,,,,,0.05768788605928421,,,,,, +24,142199,,,,,,,,,,,,0.08126825094223022,,,,,, +24,142249,,,,,,,,,,,,0.07138679176568985,,,,,, +24,142299,,,,,,,,,,,,0.07451752573251724,,,,,, +24,142349,,,,,,,,,,,,0.06798047572374344,,,,,, +24,142399,,,,,,,,,,,,0.08177058398723602,,,,,, +24,142449,,,,,,,,,,,,0.058087050914764404,,,,,, +24,142499,,,,,,,,,,,,0.07111385464668274,,,,,, +24,142549,,,,,,,,,,,,0.06969413161277771,,,,,, +24,142599,,,,,,,,,,,,0.06493455916643143,,,,,, +24,142649,,,,,,,,,,,,0.06610633432865143,,,,,, +24,142699,,,,,,,,,,,,0.06982302665710449,,,,,, +24,142749,,,,,,,,,,,,0.07276435196399689,,,,,, +24,142799,,,,,,,,,,,,0.05823061242699623,,,,,, +24,142849,,,,,,,,,,,,0.07717253267765045,,,,,, +24,142899,,,,,,,,,,,,0.0636155977845192,,,,,, +24,142949,,,,,,,,,,,,0.07109320908784866,,,,,, +24,142999,,,,,,,,,,,,0.07386338710784912,,,,,, +24,143049,,,,,,,,,,,,0.06617783010005951,,,,,, +24,143099,,,,,,,,,,,,0.07085241377353668,,,,,, +24,143149,,,,,,,,,,,,0.055622585117816925,,,,,, +24,143199,,,,,,,,,,,,0.07011465728282928,,,,,, +24,143249,,,,,,,,,,,,0.060860153287649155,,,,,, +24,143299,,,,,,,,,,,,0.06889151781797409,,,,,, +24,143349,,,,,,,,,,,,0.0747629851102829,,,,,, +24,143399,,,,,,,,,,,,0.0661344900727272,,,,,, +24,143399,,,,,,,,,,,,,0.24867822229862213,0.08896288275718689,0.19637499749660492,-0.07937300205230713,0.20429158210754395,0.08896288275718689 +24,143399,,,,,,,0.21965810656547546,0.06815123558044434,0.4202253222465515,0.17653769254684448,0.40044793486595154,,,,,,, +25,143449,,,,,,,,,,,,0.07199380546808243,,,,,, +25,143499,,,,,,,,,,,,0.06509827077388763,,,,,, +25,143549,,,,,,,,,,,,0.06777185201644897,,,,,, +25,143599,,,,,,,,,,,,0.051202692091464996,,,,,, +25,143649,,,,,,,,,,,,0.07115183770656586,,,,,, +25,143699,,,,,,,,,,,,0.07593347132205963,,,,,, +25,143749,,,,,,,,,,,,0.07749499380588531,,,,,, +25,143799,,,,,,,,,,,,0.06736709177494049,,,,,, +25,143849,,,,,,,,,,,,0.06300808489322662,,,,,, +25,143899,,,,,,,,,,,,0.07202275097370148,,,,,, +25,143949,,,,,,,,,,,,0.07369859516620636,,,,,, +25,143999,,,,,,,,,,,,0.07384613156318665,,,,,, +25,144049,,,,,,,,,,,,0.06908508390188217,,,,,, +25,144099,,,,,,,,,,,,0.06999218463897705,,,,,, +25,144149,,,,,,,,,,,,0.0685967206954956,,,,,, +25,144199,,,,,,,,,,,,0.06250668317079544,,,,,, +25,144249,,,,,,,,,,,,0.06706017255783081,,,,,, +25,144299,,,,,,,,,,,,0.06693806499242783,,,,,, +25,144349,,,,,,,,,,,,0.0678856298327446,,,,,, +25,144399,,,,,,,,,,,,0.059145618230104446,,,,,, +25,144449,,,,,,,,,,,,0.08350040763616562,,,,,, +25,144499,,,,,,,,,,,,0.06323438882827759,,,,,, +25,144549,,,,,,,,,,,,0.055961769074201584,,,,,, +25,144599,,,,,,,,,,,,0.07017645984888077,,,,,, +25,144649,,,,,,,,,,,,0.07788531482219696,,,,,, +25,144699,,,,,,,,,,,,0.0620083212852478,,,,,, +25,144749,,,,,,,,,,,,0.07101240009069443,,,,,, +25,144799,,,,,,,,,,,,0.06193080544471741,,,,,, +25,144849,,,,,,,,,,,,0.06549637764692307,,,,,, +25,144899,,,,,,,,,,,,0.062048837542533875,,,,,, +25,144949,,,,,,,,,,,,0.07674621045589447,,,,,, +25,144999,,,,,,,,,,,,0.07639540731906891,,,,,, +25,145049,,,,,,,,,,,,0.06676035374403,,,,,, +25,145099,,,,,,,,,,,,0.07789191603660583,,,,,, +25,145149,,,,,,,,,,,,0.06485509872436523,,,,,, +25,145199,,,,,,,,,,,,0.06021067127585411,,,,,, +25,145249,,,,,,,,,,,,0.06982442736625671,,,,,, +25,145299,,,,,,,,,,,,0.08308567851781845,,,,,, +25,145349,,,,,,,,,,,,0.05954539775848389,,,,,, +25,145399,,,,,,,,,,,,0.07354863733053207,,,,,, +25,145449,,,,,,,,,,,,0.056864671409130096,,,,,, +25,145499,,,,,,,,,,,,0.06748707592487335,,,,,, +25,145549,,,,,,,,,,,,0.06525874882936478,,,,,, +25,145599,,,,,,,,,,,,0.055192988365888596,,,,,, +25,145649,,,,,,,,,,,,0.06827615201473236,,,,,, +25,145699,,,,,,,,,,,,0.06511501967906952,,,,,, +25,145749,,,,,,,,,,,,0.07208465039730072,,,,,, +25,145799,,,,,,,,,,,,0.057189926505088806,,,,,, +25,145849,,,,,,,,,,,,0.06045934930443764,,,,,, +25,145899,,,,,,,,,,,,0.07600350677967072,,,,,, +25,145949,,,,,,,,,,,,0.06985676288604736,,,,,, +25,145999,,,,,,,,,,,,0.062047459185123444,,,,,, +25,146049,,,,,,,,,,,,0.07252274453639984,,,,,, +25,146099,,,,,,,,,,,,0.06344573199748993,,,,,, +25,146149,,,,,,,,,,,,0.06113644689321518,,,,,, +25,146199,,,,,,,,,,,,0.06794282793998718,,,,,, +25,146249,,,,,,,,,,,,0.06775188446044922,,,,,, +25,146299,,,,,,,,,,,,0.07744258642196655,,,,,, +25,146349,,,,,,,,,,,,0.06449415534734726,,,,,, +25,146399,,,,,,,,,,,,0.06490421295166016,,,,,, +25,146449,,,,,,,,,,,,0.06786450743675232,,,,,, +25,146499,,,,,,,,,,,,0.05759534612298012,,,,,, +25,146549,,,,,,,,,,,,0.06567203998565674,,,,,, +25,146599,,,,,,,,,,,,0.07812996208667755,,,,,, +25,146649,,,,,,,,,,,,0.06742528080940247,,,,,, +25,146699,,,,,,,,,,,,0.07491889595985413,,,,,, +25,146749,,,,,,,,,,,,0.059941019862890244,,,,,, +25,146799,,,,,,,,,,,,0.06748371571302414,,,,,, +25,146849,,,,,,,,,,,,0.06419485062360764,,,,,, +25,146899,,,,,,,,,,,,0.055067695677280426,,,,,, +25,146949,,,,,,,,,,,,0.06480947881937027,,,,,, +25,146999,,,,,,,,,,,,0.06384426355361938,,,,,, +25,147049,,,,,,,,,,,,0.06290948390960693,,,,,, +25,147099,,,,,,,,,,,,0.05636503919959068,,,,,, +25,147149,,,,,,,,,,,,0.06947274506092072,,,,,, +25,147199,,,,,,,,,,,,0.06660306453704834,,,,,, +25,147249,,,,,,,,,,,,0.07353489845991135,,,,,, +25,147299,,,,,,,,,,,,0.06799402087926865,,,,,, +25,147349,,,,,,,,,,,,0.0619920939207077,,,,,, +25,147399,,,,,,,,,,,,0.06510287523269653,,,,,, +25,147449,,,,,,,,,,,,0.07069727778434753,,,,,, +25,147499,,,,,,,,,,,,0.06411890685558319,,,,,, +25,147549,,,,,,,,,,,,0.066059410572052,,,,,, +25,147599,,,,,,,,,,,,0.06467710435390472,,,,,, +25,147649,,,,,,,,,,,,0.06259485334157944,,,,,, +25,147699,,,,,,,,,,,,0.07186730206012726,,,,,, +25,147749,,,,,,,,,,,,0.07733314484357834,,,,,, +25,147799,,,,,,,,,,,,0.06629678606987,,,,,, +25,147849,,,,,,,,,,,,0.057299599051475525,,,,,, +25,147899,,,,,,,,,,,,0.06059608608484268,,,,,, +25,147949,,,,,,,,,,,,0.07375523447990417,,,,,, +25,147999,,,,,,,,,,,,0.0618198923766613,,,,,, +25,148049,,,,,,,,,,,,0.06764353811740875,,,,,, +25,148099,,,,,,,,,,,,0.07029140740633011,,,,,, +25,148149,,,,,,,,,,,,0.07038789987564087,,,,,, +25,148199,,,,,,,,,,,,0.061370428651571274,,,,,, +25,148249,,,,,,,,,,,,0.06649589538574219,,,,,, +25,148299,,,,,,,,,,,,0.07003247737884521,,,,,, +25,148349,,,,,,,,,,,,0.06197545677423477,,,,,, +25,148399,,,,,,,,,,,,0.0736161470413208,,,,,, +25,148449,,,,,,,,,,,,0.058073606342077255,,,,,, +25,148499,,,,,,,,,,,,0.08437521755695343,,,,,, +25,148549,,,,,,,,,,,,0.06444831192493439,,,,,, +25,148599,,,,,,,,,,,,0.058899689465761185,,,,,, +25,148649,,,,,,,,,,,,0.07123863697052002,,,,,, +25,148699,,,,,,,,,,,,0.06836698949337006,,,,,, +25,148749,,,,,,,,,,,,0.07023508846759796,,,,,, +25,148799,,,,,,,,,,,,0.06167873740196228,,,,,, +25,148849,,,,,,,,,,,,0.06440369784832001,,,,,, +25,148899,,,,,,,,,,,,0.06480619311332703,,,,,, +25,148949,,,,,,,,,,,,0.07458099722862244,,,,,, +25,148999,,,,,,,,,,,,0.06583238393068314,,,,,, +25,149049,,,,,,,,,,,,0.06049879640340805,,,,,, +25,149099,,,,,,,,,,,,0.07379059493541718,,,,,, +25,149135,,,,,,,,,,,,,0.24655897915363312,0.08645468205213547,0.20007263123989105,-0.04894137382507324,0.2075982540845871,0.08645468205213547 +25,149135,,,,,,,0.21901218593120575,0.06773039698600769,0.42619267106056213,0.18162065744400024,0.40440937876701355,,,,,,, +26,149149,,,,,,,,,,,,0.06303907930850983,,,,,, +26,149199,,,,,,,,,,,,0.07050016522407532,,,,,, +26,149249,,,,,,,,,,,,0.059635963290929794,,,,,, +26,149299,,,,,,,,,,,,0.06974564492702484,,,,,, +26,149349,,,,,,,,,,,,0.06950344145298004,,,,,, +26,149399,,,,,,,,,,,,0.06109455227851868,,,,,, +26,149449,,,,,,,,,,,,0.06998783349990845,,,,,, +26,149499,,,,,,,,,,,,0.06407706439495087,,,,,, +26,149549,,,,,,,,,,,,0.07724373787641525,,,,,, +26,149599,,,,,,,,,,,,0.06147467717528343,,,,,, +26,149649,,,,,,,,,,,,0.05343814566731453,,,,,, +26,149699,,,,,,,,,,,,0.06410107761621475,,,,,, +26,149749,,,,,,,,,,,,0.06349249184131622,,,,,, +26,149799,,,,,,,,,,,,0.056870996952056885,,,,,, +26,149849,,,,,,,,,,,,0.07555236667394638,,,,,, +26,149899,,,,,,,,,,,,0.06762249767780304,,,,,, +26,149949,,,,,,,,,,,,0.06701686233282089,,,,,, +26,149999,,,,,,,,,,,,0.06011848524212837,,,,,, +26,150049,,,,,,,,,,,,0.06276652216911316,,,,,, +26,150099,,,,,,,,,,,,0.06982697546482086,,,,,, +26,150149,,,,,,,,,,,,0.06209772825241089,,,,,, +26,150199,,,,,,,,,,,,0.07532361894845963,,,,,, +26,150249,,,,,,,,,,,,0.06447648257017136,,,,,, +26,150299,,,,,,,,,,,,0.06472940742969513,,,,,, +26,150349,,,,,,,,,,,,0.070320263504982,,,,,, +26,150399,,,,,,,,,,,,0.08020773530006409,,,,,, +26,150449,,,,,,,,,,,,0.06286416947841644,,,,,, +26,150499,,,,,,,,,,,,0.07177136838436127,,,,,, +26,150549,,,,,,,,,,,,0.07326480001211166,,,,,, +26,150599,,,,,,,,,,,,0.05571412295103073,,,,,, +26,150649,,,,,,,,,,,,0.060818836092948914,,,,,, +26,150699,,,,,,,,,,,,0.05683671310544014,,,,,, +26,150749,,,,,,,,,,,,0.07228560000658035,,,,,, +26,150799,,,,,,,,,,,,0.060883816331624985,,,,,, +26,150849,,,,,,,,,,,,0.07173576951026917,,,,,, +26,150899,,,,,,,,,,,,0.06840237230062485,,,,,, +26,150949,,,,,,,,,,,,0.071250319480896,,,,,, +26,150999,,,,,,,,,,,,0.06832800805568695,,,,,, +26,151049,,,,,,,,,,,,0.06742935627698898,,,,,, +26,151099,,,,,,,,,,,,0.07270727306604385,,,,,, +26,151149,,,,,,,,,,,,0.06785447895526886,,,,,, +26,151199,,,,,,,,,,,,0.07648153603076935,,,,,, +26,151249,,,,,,,,,,,,0.06747549772262573,,,,,, +26,151299,,,,,,,,,,,,0.07431682199239731,,,,,, +26,151349,,,,,,,,,,,,0.06865592300891876,,,,,, +26,151399,,,,,,,,,,,,0.0826638862490654,,,,,, +26,151449,,,,,,,,,,,,0.0663597509264946,,,,,, +26,151499,,,,,,,,,,,,0.07041539251804352,,,,,, +26,151549,,,,,,,,,,,,0.07489834725856781,,,,,, +26,151599,,,,,,,,,,,,0.05950893834233284,,,,,, +26,151649,,,,,,,,,,,,0.07668265700340271,,,,,, +26,151699,,,,,,,,,,,,0.0643642321228981,,,,,, +26,151749,,,,,,,,,,,,0.0693257749080658,,,,,, +26,151799,,,,,,,,,,,,0.06910999119281769,,,,,, +26,151849,,,,,,,,,,,,0.06962654739618301,,,,,, +26,151899,,,,,,,,,,,,0.07173168659210205,,,,,, +26,151949,,,,,,,,,,,,0.07492056488990784,,,,,, +26,151999,,,,,,,,,,,,0.0637412890791893,,,,,, +26,152049,,,,,,,,,,,,0.061616137623786926,,,,,, +26,152099,,,,,,,,,,,,0.05768129229545593,,,,,, +26,152149,,,,,,,,,,,,0.07196549326181412,,,,,, +26,152199,,,,,,,,,,,,0.07968412339687347,,,,,, +26,152249,,,,,,,,,,,,0.08093178272247314,,,,,, +26,152299,,,,,,,,,,,,0.06629878282546997,,,,,, +26,152349,,,,,,,,,,,,0.06985533237457275,,,,,, +26,152399,,,,,,,,,,,,0.07239942252635956,,,,,, +26,152449,,,,,,,,,,,,0.05102766305208206,,,,,, +26,152499,,,,,,,,,,,,0.05750177055597305,,,,,, +26,152549,,,,,,,,,,,,0.06754733622074127,,,,,, +26,152599,,,,,,,,,,,,0.05855735391378403,,,,,, +26,152649,,,,,,,,,,,,0.07778120785951614,,,,,, +26,152699,,,,,,,,,,,,0.05773720145225525,,,,,, +26,152749,,,,,,,,,,,,0.06564093381166458,,,,,, +26,152799,,,,,,,,,,,,0.07032495737075806,,,,,, +26,152849,,,,,,,,,,,,0.06380125135183334,,,,,, +26,152899,,,,,,,,,,,,0.07794922590255737,,,,,, +26,152949,,,,,,,,,,,,0.06319042295217514,,,,,, +26,152999,,,,,,,,,,,,0.08023116737604141,,,,,, +26,153049,,,,,,,,,,,,0.06175273284316063,,,,,, +26,153099,,,,,,,,,,,,0.06697652488946915,,,,,, +26,153149,,,,,,,,,,,,0.07784566283226013,,,,,, +26,153199,,,,,,,,,,,,0.0740150660276413,,,,,, +26,153249,,,,,,,,,,,,0.06399525701999664,,,,,, +26,153299,,,,,,,,,,,,0.057304009795188904,,,,,, +26,153349,,,,,,,,,,,,0.06022826209664345,,,,,, +26,153399,,,,,,,,,,,,0.06376206874847412,,,,,, +26,153449,,,,,,,,,,,,0.06206122040748596,,,,,, +26,153499,,,,,,,,,,,,0.06946660578250885,,,,,, +26,153549,,,,,,,,,,,,0.07013511657714844,,,,,, +26,153599,,,,,,,,,,,,0.07277914881706238,,,,,, +26,153649,,,,,,,,,,,,0.06675074994564056,,,,,, +26,153699,,,,,,,,,,,,0.08183357119560242,,,,,, +26,153749,,,,,,,,,,,,0.06005366891622543,,,,,, +26,153799,,,,,,,,,,,,0.054792825132608414,,,,,, +26,153849,,,,,,,,,,,,0.0701889842748642,,,,,, +26,153899,,,,,,,,,,,,0.0626196637749672,,,,,, +26,153949,,,,,,,,,,,,0.05707848072052002,,,,,, +26,153999,,,,,,,,,,,,0.06702905893325806,,,,,, +26,154049,,,,,,,,,,,,0.06718837469816208,,,,,, +26,154099,,,,,,,,,,,,0.06083952262997627,,,,,, +26,154149,,,,,,,,,,,,0.060731440782547,,,,,, +26,154199,,,,,,,,,,,,0.06289961189031601,,,,,, +26,154249,,,,,,,,,,,,0.06475809216499329,,,,,, +26,154299,,,,,,,,,,,,0.07139640301465988,,,,,, +26,154349,,,,,,,,,,,,0.06990967690944672,,,,,, +26,154399,,,,,,,,,,,,0.06728623062372208,,,,,, +26,154449,,,,,,,,,,,,0.06406183540821075,,,,,, +26,154499,,,,,,,,,,,,0.056991707533597946,,,,,, +26,154549,,,,,,,,,,,,0.07734145224094391,,,,,, +26,154599,,,,,,,,,,,,0.07632637023925781,,,,,, +26,154649,,,,,,,,,,,,0.07319758832454681,,,,,, +26,154699,,,,,,,,,,,,0.06929831951856613,,,,,, +26,154749,,,,,,,,,,,,0.07628896832466125,,,,,, +26,154799,,,,,,,,,,,,0.058316439390182495,,,,,, +26,154849,,,,,,,,,,,,0.06239175423979759,,,,,, +26,154871,,,,,,,,,,,,,0.24429863691329956,0.08500989526510239,0.21421870589256287,-0.03141200542449951,0.2212357521057129,0.08500989526510239 +26,154871,,,,,,,0.21793711185455322,0.06720156967639923,0.4336095154285431,0.1880117654800415,0.41117772459983826,,,,,,, +27,154899,,,,,,,,,,,,0.06179424002766609,,,,,, +27,154949,,,,,,,,,,,,0.06959114968776703,,,,,, +27,154999,,,,,,,,,,,,0.058550044894218445,,,,,, +27,155049,,,,,,,,,,,,0.06585128605365753,,,,,, +27,155099,,,,,,,,,,,,0.057441145181655884,,,,,, +27,155149,,,,,,,,,,,,0.05917081609368324,,,,,, +27,155199,,,,,,,,,,,,0.06349308788776398,,,,,, +27,155249,,,,,,,,,,,,0.06729952991008759,,,,,, +27,155299,,,,,,,,,,,,0.06050438433885574,,,,,, +27,155349,,,,,,,,,,,,0.06355898827314377,,,,,, +27,155399,,,,,,,,,,,,0.07649257779121399,,,,,, +27,155449,,,,,,,,,,,,0.06325744092464447,,,,,, +27,155499,,,,,,,,,,,,0.07420022040605545,,,,,, +27,155549,,,,,,,,,,,,0.060975831001996994,,,,,, +27,155599,,,,,,,,,,,,0.061066821217536926,,,,,, +27,155649,,,,,,,,,,,,0.06786887347698212,,,,,, +27,155699,,,,,,,,,,,,0.06671621650457382,,,,,, +27,155749,,,,,,,,,,,,0.07176458090543747,,,,,, +27,155799,,,,,,,,,,,,0.06292639672756195,,,,,, +27,155849,,,,,,,,,,,,0.065487340092659,,,,,, +27,155899,,,,,,,,,,,,0.06273171305656433,,,,,, +27,155949,,,,,,,,,,,,0.064799964427948,,,,,, +27,155999,,,,,,,,,,,,0.07215262949466705,,,,,, +27,156049,,,,,,,,,,,,0.06039902940392494,,,,,, +27,156099,,,,,,,,,,,,0.05873118340969086,,,,,, +27,156149,,,,,,,,,,,,0.07279133796691895,,,,,, +27,156199,,,,,,,,,,,,0.05859251692891121,,,,,, +27,156249,,,,,,,,,,,,0.06810422986745834,,,,,, +27,156299,,,,,,,,,,,,0.07872284948825836,,,,,, +27,156349,,,,,,,,,,,,0.07055062055587769,,,,,, +27,156399,,,,,,,,,,,,0.05360085517168045,,,,,, +27,156449,,,,,,,,,,,,0.06143060326576233,,,,,, +27,156499,,,,,,,,,,,,0.06833818554878235,,,,,, +27,156549,,,,,,,,,,,,0.06821746379137039,,,,,, +27,156599,,,,,,,,,,,,0.07593543827533722,,,,,, +27,156649,,,,,,,,,,,,0.06513389945030212,,,,,, +27,156699,,,,,,,,,,,,0.08082732558250427,,,,,, +27,156749,,,,,,,,,,,,0.05660934001207352,,,,,, +27,156799,,,,,,,,,,,,0.06968315690755844,,,,,, +27,156849,,,,,,,,,,,,0.059326689690351486,,,,,, +27,156899,,,,,,,,,,,,0.06373864412307739,,,,,, +27,156949,,,,,,,,,,,,0.06866542249917984,,,,,, +27,156999,,,,,,,,,,,,0.07488812506198883,,,,,, +27,157049,,,,,,,,,,,,0.07187756150960922,,,,,, +27,157099,,,,,,,,,,,,0.06256681680679321,,,,,, +27,157149,,,,,,,,,,,,0.061811260879039764,,,,,, +27,157199,,,,,,,,,,,,0.071955606341362,,,,,, +27,157249,,,,,,,,,,,,0.0650583878159523,,,,,, +27,157299,,,,,,,,,,,,0.051692064851522446,,,,,, +27,157349,,,,,,,,,,,,0.057552557438611984,,,,,, +27,157399,,,,,,,,,,,,0.06245793029665947,,,,,, +27,157449,,,,,,,,,,,,0.06231127306818962,,,,,, +27,157499,,,,,,,,,,,,0.0628637969493866,,,,,, +27,157549,,,,,,,,,,,,0.0863061249256134,,,,,, +27,157599,,,,,,,,,,,,0.06530049443244934,,,,,, +27,157649,,,,,,,,,,,,0.06139685586094856,,,,,, +27,157699,,,,,,,,,,,,0.060515135526657104,,,,,, +27,157749,,,,,,,,,,,,0.06616631150245667,,,,,, +27,157799,,,,,,,,,,,,0.0680055022239685,,,,,, +27,157849,,,,,,,,,,,,0.05972708761692047,,,,,, +27,157899,,,,,,,,,,,,0.06277763843536377,,,,,, +27,157949,,,,,,,,,,,,0.06895217299461365,,,,,, +27,157999,,,,,,,,,,,,0.06309621036052704,,,,,, +27,158049,,,,,,,,,,,,0.06530003249645233,,,,,, +27,158099,,,,,,,,,,,,0.05944743752479553,,,,,, +27,158149,,,,,,,,,,,,0.07030636072158813,,,,,, +27,158199,,,,,,,,,,,,0.07270614057779312,,,,,, +27,158249,,,,,,,,,,,,0.0582311674952507,,,,,, +27,158299,,,,,,,,,,,,0.06774821877479553,,,,,, +27,158349,,,,,,,,,,,,0.06722238659858704,,,,,, +27,158399,,,,,,,,,,,,0.05980900675058365,,,,,, +27,158449,,,,,,,,,,,,0.06259309500455856,,,,,, +27,158499,,,,,,,,,,,,0.07103603333234787,,,,,, +27,158549,,,,,,,,,,,,0.06591261923313141,,,,,, +27,158599,,,,,,,,,,,,0.06689055263996124,,,,,, +27,158649,,,,,,,,,,,,0.07507791370153427,,,,,, +27,158699,,,,,,,,,,,,0.0668373554944992,,,,,, +27,158749,,,,,,,,,,,,0.0716494545340538,,,,,, +27,158799,,,,,,,,,,,,0.06402826309204102,,,,,, +27,158849,,,,,,,,,,,,0.059834644198417664,,,,,, +27,158899,,,,,,,,,,,,0.06469117105007172,,,,,, +27,158949,,,,,,,,,,,,0.06743936240673065,,,,,, +27,158999,,,,,,,,,,,,0.06660448014736176,,,,,, +27,159049,,,,,,,,,,,,0.07387067377567291,,,,,, +27,159099,,,,,,,,,,,,0.0725053995847702,,,,,, +27,159149,,,,,,,,,,,,0.07310079783201218,,,,,, +27,159199,,,,,,,,,,,,0.06825375556945801,,,,,, +27,159249,,,,,,,,,,,,0.06801830977201462,,,,,, +27,159299,,,,,,,,,,,,0.062091100960969925,,,,,, +27,159349,,,,,,,,,,,,0.06435318291187286,,,,,, +27,159399,,,,,,,,,,,,0.060824915766716,,,,,, +27,159449,,,,,,,,,,,,0.07078100740909576,,,,,, +27,159499,,,,,,,,,,,,0.05323716998100281,,,,,, +27,159549,,,,,,,,,,,,0.07083196192979813,,,,,, +27,159599,,,,,,,,,,,,0.07681694626808167,,,,,, +27,159649,,,,,,,,,,,,0.08056633174419403,,,,,, +27,159699,,,,,,,,,,,,0.06921912729740143,,,,,, +27,159749,,,,,,,,,,,,0.06141028180718422,,,,,, +27,159799,,,,,,,,,,,,0.06967484951019287,,,,,, +27,159849,,,,,,,,,,,,0.05805739760398865,,,,,, +27,159899,,,,,,,,,,,,0.07267024368047714,,,,,, +27,159949,,,,,,,,,,,,0.05537371337413788,,,,,, +27,159999,,,,,,,,,,,,0.07288582623004913,,,,,, +27,160049,,,,,,,,,,,,0.06225300207734108,,,,,, +27,160099,,,,,,,,,,,,0.06255432963371277,,,,,, +27,160149,,,,,,,,,,,,0.06642723083496094,,,,,, +27,160199,,,,,,,,,,,,0.07241535186767578,,,,,, +27,160249,,,,,,,,,,,,0.0708850771188736,,,,,, +27,160299,,,,,,,,,,,,0.06831739842891693,,,,,, +27,160349,,,,,,,,,,,,0.06780634075403214,,,,,, +27,160399,,,,,,,,,,,,0.0619654655456543,,,,,, +27,160449,,,,,,,,,,,,0.06579539179801941,,,,,, +27,160499,,,,,,,,,,,,0.06935364753007889,,,,,, +27,160549,,,,,,,,,,,,0.08065776526927948,,,,,, +27,160599,,,,,,,,,,,,0.07264453172683716,,,,,, +27,160607,,,,,,,,,,,,,0.2466023862361908,0.0864846333861351,0.19364191591739655,-0.04930472373962402,0.20296260714530945,0.0864846333861351 +27,160607,,,,,,,0.21769678592681885,0.0671197697520256,0.43475791811943054,0.18899720907211304,0.4129122793674469,,,,,,, +28,160649,,,,,,,,,,,,0.06275748461484909,,,,,, +28,160699,,,,,,,,,,,,0.06723792105913162,,,,,, +28,160749,,,,,,,,,,,,0.05475277826189995,,,,,, +28,160799,,,,,,,,,,,,0.06771035492420197,,,,,, +28,160849,,,,,,,,,,,,0.061587926000356674,,,,,, +28,160899,,,,,,,,,,,,0.06192731857299805,,,,,, +28,160949,,,,,,,,,,,,0.06281998753547668,,,,,, +28,160999,,,,,,,,,,,,0.05958397686481476,,,,,, +28,161049,,,,,,,,,,,,0.0683302953839302,,,,,, +28,161099,,,,,,,,,,,,0.07719835638999939,,,,,, +28,161149,,,,,,,,,,,,0.0561085119843483,,,,,, +28,161199,,,,,,,,,,,,0.07015642523765564,,,,,, +28,161249,,,,,,,,,,,,0.06479529291391373,,,,,, +28,161299,,,,,,,,,,,,0.0706401914358139,,,,,, +28,161349,,,,,,,,,,,,0.07299606502056122,,,,,, +28,161399,,,,,,,,,,,,0.07367265224456787,,,,,, +28,161449,,,,,,,,,,,,0.05957212299108505,,,,,, +28,161499,,,,,,,,,,,,0.06262502074241638,,,,,, +28,161549,,,,,,,,,,,,0.05535338819026947,,,,,, +28,161599,,,,,,,,,,,,0.06847038120031357,,,,,, +28,161649,,,,,,,,,,,,0.062834233045578,,,,,, +28,161699,,,,,,,,,,,,0.0625118538737297,,,,,, +28,161749,,,,,,,,,,,,0.06619693338871002,,,,,, +28,161799,,,,,,,,,,,,0.06063198298215866,,,,,, +28,161849,,,,,,,,,,,,0.06086649000644684,,,,,, +28,161899,,,,,,,,,,,,0.07239518314599991,,,,,, +28,161949,,,,,,,,,,,,0.06867636740207672,,,,,, +28,161999,,,,,,,,,,,,0.06751031428575516,,,,,, +28,162049,,,,,,,,,,,,0.07047958672046661,,,,,, +28,162099,,,,,,,,,,,,0.06155134737491608,,,,,, +28,162149,,,,,,,,,,,,0.07503426820039749,,,,,, +28,162199,,,,,,,,,,,,0.06952305138111115,,,,,, +28,162249,,,,,,,,,,,,0.06803540885448456,,,,,, +28,162299,,,,,,,,,,,,0.07409277558326721,,,,,, +28,162349,,,,,,,,,,,,0.0636737197637558,,,,,, +28,162399,,,,,,,,,,,,0.06254421174526215,,,,,, +28,162449,,,,,,,,,,,,0.06293074041604996,,,,,, +28,162499,,,,,,,,,,,,0.07709500938653946,,,,,, +28,162549,,,,,,,,,,,,0.07224628329277039,,,,,, +28,162599,,,,,,,,,,,,0.07612879574298859,,,,,, +28,162649,,,,,,,,,,,,0.06751088052988052,,,,,, +28,162699,,,,,,,,,,,,0.06323489546775818,,,,,, +28,162749,,,,,,,,,,,,0.07201151549816132,,,,,, +28,162799,,,,,,,,,,,,0.06257785111665726,,,,,, +28,162849,,,,,,,,,,,,0.08178875595331192,,,,,, +28,162899,,,,,,,,,,,,0.07089103758335114,,,,,, +28,162949,,,,,,,,,,,,0.061257459223270416,,,,,, +28,162999,,,,,,,,,,,,0.07447098195552826,,,,,, +28,163049,,,,,,,,,,,,0.06235315650701523,,,,,, +28,163099,,,,,,,,,,,,0.07692611217498779,,,,,, +28,163149,,,,,,,,,,,,0.07810134440660477,,,,,, +28,163199,,,,,,,,,,,,0.07344307750463486,,,,,, +28,163249,,,,,,,,,,,,0.07661354541778564,,,,,, +28,163299,,,,,,,,,,,,0.05613427609205246,,,,,, +28,163349,,,,,,,,,,,,0.06803315132856369,,,,,, +28,163399,,,,,,,,,,,,0.06718648970127106,,,,,, +28,163449,,,,,,,,,,,,0.07004044204950333,,,,,, +28,163499,,,,,,,,,,,,0.0651850774884224,,,,,, +28,163549,,,,,,,,,,,,0.05779123678803444,,,,,, +28,163599,,,,,,,,,,,,0.08150836825370789,,,,,, +28,163649,,,,,,,,,,,,0.06171105429530144,,,,,, +28,163699,,,,,,,,,,,,0.06338275969028473,,,,,, +28,163749,,,,,,,,,,,,0.06302161514759064,,,,,, +28,163799,,,,,,,,,,,,0.08474903553724289,,,,,, +28,163849,,,,,,,,,,,,0.05922606959939003,,,,,, +28,163899,,,,,,,,,,,,0.08157534897327423,,,,,, +28,163949,,,,,,,,,,,,0.07521183788776398,,,,,, +28,163999,,,,,,,,,,,,0.07060910761356354,,,,,, +28,164049,,,,,,,,,,,,0.06792843341827393,,,,,, +28,164099,,,,,,,,,,,,0.06780343502759933,,,,,, +28,164149,,,,,,,,,,,,0.07005705684423447,,,,,, +28,164199,,,,,,,,,,,,0.0633435919880867,,,,,, +28,164249,,,,,,,,,,,,0.0813819169998169,,,,,, +28,164299,,,,,,,,,,,,0.07335127890110016,,,,,, +28,164349,,,,,,,,,,,,0.061185307800769806,,,,,, +28,164399,,,,,,,,,,,,0.07178295403718948,,,,,, +28,164449,,,,,,,,,,,,0.0728963166475296,,,,,, +28,164499,,,,,,,,,,,,0.06136511638760567,,,,,, +28,164549,,,,,,,,,,,,0.07071524858474731,,,,,, +28,164599,,,,,,,,,,,,0.06495679914951324,,,,,, +28,164649,,,,,,,,,,,,0.06956684589385986,,,,,, +28,164699,,,,,,,,,,,,0.051031045615673065,,,,,, +28,164749,,,,,,,,,,,,0.06952813267707825,,,,,, +28,164799,,,,,,,,,,,,0.06567075103521347,,,,,, +28,164849,,,,,,,,,,,,0.07219835370779037,,,,,, +28,164899,,,,,,,,,,,,0.06010664999485016,,,,,, +28,164949,,,,,,,,,,,,0.06126278266310692,,,,,, +28,164999,,,,,,,,,,,,0.07307502627372742,,,,,, +28,165049,,,,,,,,,,,,0.0665978267788887,,,,,, +28,165099,,,,,,,,,,,,0.05847751721739769,,,,,, +28,165149,,,,,,,,,,,,0.07391864061355591,,,,,, +28,165199,,,,,,,,,,,,0.05972001329064369,,,,,, +28,165249,,,,,,,,,,,,0.061295248568058014,,,,,, +28,165299,,,,,,,,,,,,0.0668235793709755,,,,,, +28,165349,,,,,,,,,,,,0.059796128422021866,,,,,, +28,165399,,,,,,,,,,,,0.06723738461732864,,,,,, +28,165449,,,,,,,,,,,,0.063156858086586,,,,,, +28,165499,,,,,,,,,,,,0.06001193821430206,,,,,, +28,165549,,,,,,,,,,,,0.06618691235780716,,,,,, +28,165599,,,,,,,,,,,,0.06399299204349518,,,,,, +28,165649,,,,,,,,,,,,0.061942581087350845,,,,,, +28,165699,,,,,,,,,,,,0.05266371741890907,,,,,, +28,165749,,,,,,,,,,,,0.06637904793024063,,,,,, +28,165799,,,,,,,,,,,,0.0680728331208229,,,,,, +28,165849,,,,,,,,,,,,0.0659957304596901,,,,,, +28,165899,,,,,,,,,,,,0.07095807790756226,,,,,, +28,165949,,,,,,,,,,,,0.07709255814552307,,,,,, +28,165999,,,,,,,,,,,,0.06407029926776886,,,,,, +28,166049,,,,,,,,,,,,0.064559206366539,,,,,, +28,166099,,,,,,,,,,,,0.06941317766904831,,,,,, +28,166149,,,,,,,,,,,,0.06769518554210663,,,,,, +28,166199,,,,,,,,,,,,0.06867504119873047,,,,,, +28,166249,,,,,,,,,,,,0.06586962938308716,,,,,, +28,166299,,,,,,,,,,,,0.0644589513540268,,,,,, +28,166343,,,,,,,,,,,,,0.24645069241523743,0.08664412051439285,0.19684399664402008,-0.051239848136901855,0.20477786660194397,0.08664412051439285 +28,166343,,,,,,,0.21725575625896454,0.06686670333147049,0.43825194239616394,0.19205433130264282,0.4156762957572937,,,,,,, +29,166349,,,,,,,,,,,,0.06224578991532326,,,,,, +29,166399,,,,,,,,,,,,0.06719110906124115,,,,,, +29,166449,,,,,,,,,,,,0.05428476631641388,,,,,, +29,166499,,,,,,,,,,,,0.06628045439720154,,,,,, +29,166549,,,,,,,,,,,,0.0472094863653183,,,,,, +29,166599,,,,,,,,,,,,0.07123320549726486,,,,,, +29,166649,,,,,,,,,,,,0.06421934813261032,,,,,, +29,166699,,,,,,,,,,,,0.06031401455402374,,,,,, +29,166749,,,,,,,,,,,,0.06334898620843887,,,,,, +29,166799,,,,,,,,,,,,0.08114475011825562,,,,,, +29,166849,,,,,,,,,,,,0.0608360692858696,,,,,, +29,166899,,,,,,,,,,,,0.06288287043571472,,,,,, +29,166949,,,,,,,,,,,,0.061123523861169815,,,,,, +29,166999,,,,,,,,,,,,0.0645769014954567,,,,,, +29,167049,,,,,,,,,,,,0.06868518888950348,,,,,, +29,167099,,,,,,,,,,,,0.07106314599514008,,,,,, +29,167149,,,,,,,,,,,,0.07801306247711182,,,,,, +29,167199,,,,,,,,,,,,0.05906034633517265,,,,,, +29,167249,,,,,,,,,,,,0.06047067791223526,,,,,, +29,167299,,,,,,,,,,,,0.08407928049564362,,,,,, +29,167349,,,,,,,,,,,,0.06232637166976929,,,,,, +29,167399,,,,,,,,,,,,0.060867972671985626,,,,,, +29,167449,,,,,,,,,,,,0.06501826643943787,,,,,, +29,167499,,,,,,,,,,,,0.07051409780979156,,,,,, +29,167549,,,,,,,,,,,,0.06491882354021072,,,,,, +29,167599,,,,,,,,,,,,0.0775204598903656,,,,,, +29,167649,,,,,,,,,,,,0.06891022622585297,,,,,, +29,167699,,,,,,,,,,,,0.06807176768779755,,,,,, +29,167749,,,,,,,,,,,,0.0838620513677597,,,,,, +29,167799,,,,,,,,,,,,0.06868498027324677,,,,,, +29,167849,,,,,,,,,,,,0.06521822512149811,,,,,, +29,167899,,,,,,,,,,,,0.0717911496758461,,,,,, +29,167949,,,,,,,,,,,,0.061937421560287476,,,,,, +29,167999,,,,,,,,,,,,0.06998421996831894,,,,,, +29,168049,,,,,,,,,,,,0.06419041752815247,,,,,, +29,168099,,,,,,,,,,,,0.06016154587268829,,,,,, +29,168149,,,,,,,,,,,,0.06942783296108246,,,,,, +29,168199,,,,,,,,,,,,0.06201885640621185,,,,,, +29,168249,,,,,,,,,,,,0.07612477242946625,,,,,, +29,168299,,,,,,,,,,,,0.07172797620296478,,,,,, +29,168349,,,,,,,,,,,,0.07476182281970978,,,,,, +29,168399,,,,,,,,,,,,0.06019815430045128,,,,,, +29,168449,,,,,,,,,,,,0.07372447848320007,,,,,, +29,168499,,,,,,,,,,,,0.06696072220802307,,,,,, +29,168549,,,,,,,,,,,,0.06479118764400482,,,,,, +29,168599,,,,,,,,,,,,0.07542674988508224,,,,,, +29,168649,,,,,,,,,,,,0.07179615646600723,,,,,, +29,168699,,,,,,,,,,,,0.07444900274276733,,,,,, +29,168749,,,,,,,,,,,,0.05673076957464218,,,,,, +29,168799,,,,,,,,,,,,0.06691139191389084,,,,,, +29,168849,,,,,,,,,,,,0.06298282742500305,,,,,, +29,168899,,,,,,,,,,,,0.06853093951940536,,,,,, +29,168949,,,,,,,,,,,,0.06643395125865936,,,,,, +29,168999,,,,,,,,,,,,0.07840684056282043,,,,,, +29,169049,,,,,,,,,,,,0.06867353618144989,,,,,, +29,169099,,,,,,,,,,,,0.06135321035981178,,,,,, +29,169149,,,,,,,,,,,,0.06909257173538208,,,,,, +29,169199,,,,,,,,,,,,0.07283319532871246,,,,,, +29,169249,,,,,,,,,,,,0.0659143328666687,,,,,, +29,169299,,,,,,,,,,,,0.07853690534830093,,,,,, +29,169349,,,,,,,,,,,,0.04942750930786133,,,,,, +29,169399,,,,,,,,,,,,0.07182681560516357,,,,,, +29,169449,,,,,,,,,,,,0.07977496832609177,,,,,, +29,169499,,,,,,,,,,,,0.07204073667526245,,,,,, +29,169549,,,,,,,,,,,,0.059021979570388794,,,,,, +29,169599,,,,,,,,,,,,0.06745053827762604,,,,,, +29,169649,,,,,,,,,,,,0.06799447536468506,,,,,, +29,169699,,,,,,,,,,,,0.05404460430145264,,,,,, +29,169749,,,,,,,,,,,,0.05827648192644119,,,,,, +29,169799,,,,,,,,,,,,0.06903339177370071,,,,,, +29,169849,,,,,,,,,,,,0.06981076300144196,,,,,, +29,169899,,,,,,,,,,,,0.06481309235095978,,,,,, +29,169949,,,,,,,,,,,,0.05783070623874664,,,,,, +29,169999,,,,,,,,,,,,0.06329404562711716,,,,,, +29,170049,,,,,,,,,,,,0.053262997418642044,,,,,, +29,170099,,,,,,,,,,,,0.06538685411214828,,,,,, +29,170149,,,,,,,,,,,,0.06560985743999481,,,,,, +29,170199,,,,,,,,,,,,0.07416530698537827,,,,,, +29,170249,,,,,,,,,,,,0.06342101097106934,,,,,, +29,170299,,,,,,,,,,,,0.06439818441867828,,,,,, +29,170349,,,,,,,,,,,,0.07940229028463364,,,,,, +29,170399,,,,,,,,,,,,0.06868351250886917,,,,,, +29,170449,,,,,,,,,,,,0.06482985615730286,,,,,, +29,170499,,,,,,,,,,,,0.0636950433254242,,,,,, +29,170549,,,,,,,,,,,,0.059265442192554474,,,,,, +29,170599,,,,,,,,,,,,0.0677976906299591,,,,,, +29,170649,,,,,,,,,,,,0.06356212496757507,,,,,, +29,170699,,,,,,,,,,,,0.06617507338523865,,,,,, +29,170749,,,,,,,,,,,,0.06454387307167053,,,,,, +29,170799,,,,,,,,,,,,0.06802919507026672,,,,,, +29,170849,,,,,,,,,,,,0.052317820489406586,,,,,, +29,170899,,,,,,,,,,,,0.07251965999603271,,,,,, +29,170949,,,,,,,,,,,,0.05777265876531601,,,,,, +29,170999,,,,,,,,,,,,0.05664919316768646,,,,,, +29,171049,,,,,,,,,,,,0.06243521720170975,,,,,, +29,171099,,,,,,,,,,,,0.0770120695233345,,,,,, +29,171149,,,,,,,,,,,,0.06570255756378174,,,,,, +29,171199,,,,,,,,,,,,0.06885631382465363,,,,,, +29,171249,,,,,,,,,,,,0.06510258466005325,,,,,, +29,171299,,,,,,,,,,,,0.07280290871858597,,,,,, +29,171349,,,,,,,,,,,,0.07051372528076172,,,,,, +29,171399,,,,,,,,,,,,0.06662239134311676,,,,,, +29,171449,,,,,,,,,,,,0.06392984092235565,,,,,, +29,171499,,,,,,,,,,,,0.0567808523774147,,,,,, +29,171549,,,,,,,,,,,,0.07097780704498291,,,,,, +29,171599,,,,,,,,,,,,0.07087576389312744,,,,,, +29,171649,,,,,,,,,,,,0.08250345289707184,,,,,, +29,171699,,,,,,,,,,,,0.05550542101264,,,,,, +29,171749,,,,,,,,,,,,0.06129823625087738,,,,,, +29,171799,,,,,,,,,,,,0.06258240342140198,,,,,, +29,171849,,,,,,,,,,,,0.06096837297081947,,,,,, +29,171899,,,,,,,,,,,,0.06734594702720642,,,,,, +29,171949,,,,,,,,,,,,0.0687011331319809,,,,,, +29,171999,,,,,,,,,,,,0.0572877861559391,,,,,, +29,172049,,,,,,,,,,,,0.07233995199203491,,,,,, +29,172079,,,,,,,,,,,,,0.24601183831691742,0.0859062522649765,0.1964385062456131,-0.042287349700927734,0.2042684257030487,0.0859062522649765 +29,172079,,,,,,,0.2169092446565628,0.06666973233222961,0.4409560263156891,0.19444221258163452,0.41848140954971313,,,,,,, +30,172099,,,,,,,,,,,,0.05965049937367439,,,,,, +30,172149,,,,,,,,,,,,0.0768912062048912,,,,,, +30,172199,,,,,,,,,,,,0.06367827206850052,,,,,, +30,172249,,,,,,,,,,,,0.05497300624847412,,,,,, +30,172299,,,,,,,,,,,,0.06514709442853928,,,,,, +30,172349,,,,,,,,,,,,0.06958900392055511,,,,,, +30,172399,,,,,,,,,,,,0.06852151453495026,,,,,, +30,172449,,,,,,,,,,,,0.0845201313495636,,,,,, +30,172499,,,,,,,,,,,,0.07490677386522293,,,,,, +30,172549,,,,,,,,,,,,0.0647006630897522,,,,,, +30,172599,,,,,,,,,,,,0.06548944860696793,,,,,, +30,172649,,,,,,,,,,,,0.0626821517944336,,,,,, +30,172699,,,,,,,,,,,,0.059721119701862335,,,,,, +30,172749,,,,,,,,,,,,0.06710369884967804,,,,,, +30,172799,,,,,,,,,,,,0.07088007777929306,,,,,, +30,172849,,,,,,,,,,,,0.07411384582519531,,,,,, +30,172899,,,,,,,,,,,,0.061740145087242126,,,,,, +30,172949,,,,,,,,,,,,0.06027040258049965,,,,,, +30,172999,,,,,,,,,,,,0.06739117205142975,,,,,, +30,173049,,,,,,,,,,,,0.061377860605716705,,,,,, +30,173099,,,,,,,,,,,,0.05925054848194122,,,,,, +30,173149,,,,,,,,,,,,0.05953815579414368,,,,,, +30,173199,,,,,,,,,,,,0.0803479552268982,,,,,, +30,173249,,,,,,,,,,,,0.06080745533108711,,,,,, +30,173299,,,,,,,,,,,,0.0770203024148941,,,,,, +30,173349,,,,,,,,,,,,0.07336358726024628,,,,,, +30,173399,,,,,,,,,,,,0.0792393684387207,,,,,, +30,173449,,,,,,,,,,,,0.06759640574455261,,,,,, +30,173499,,,,,,,,,,,,0.060924191027879715,,,,,, +30,173549,,,,,,,,,,,,0.06227104365825653,,,,,, +30,173599,,,,,,,,,,,,0.06569059193134308,,,,,, +30,173649,,,,,,,,,,,,0.0594756081700325,,,,,, +30,173699,,,,,,,,,,,,0.06323336064815521,,,,,, +30,173749,,,,,,,,,,,,0.07444107532501221,,,,,, +30,173799,,,,,,,,,,,,0.061283767223358154,,,,,, +30,173849,,,,,,,,,,,,0.057056836783885956,,,,,, +30,173899,,,,,,,,,,,,0.07992707192897797,,,,,, +30,173949,,,,,,,,,,,,0.06318473070859909,,,,,, +30,173999,,,,,,,,,,,,0.0710178092122078,,,,,, +30,174049,,,,,,,,,,,,0.07583681493997574,,,,,, +30,174099,,,,,,,,,,,,0.06251620501279831,,,,,, +30,174149,,,,,,,,,,,,0.0692596286535263,,,,,, +30,174199,,,,,,,,,,,,0.06243031844496727,,,,,, +30,174249,,,,,,,,,,,,0.07980415970087051,,,,,, +30,174299,,,,,,,,,,,,0.06507745385169983,,,,,, +30,174349,,,,,,,,,,,,0.06028900668025017,,,,,, +30,174399,,,,,,,,,,,,0.07649078965187073,,,,,, +30,174449,,,,,,,,,,,,0.050878703594207764,,,,,, +30,174499,,,,,,,,,,,,0.061435624957084656,,,,,, +30,174549,,,,,,,,,,,,0.058701105415821075,,,,,, +30,174599,,,,,,,,,,,,0.06408831477165222,,,,,, +30,174649,,,,,,,,,,,,0.05909140780568123,,,,,, +30,174699,,,,,,,,,,,,0.06626079231500626,,,,,, +30,174749,,,,,,,,,,,,0.06696457415819168,,,,,, +30,174799,,,,,,,,,,,,0.06784605234861374,,,,,, +30,174849,,,,,,,,,,,,0.061405375599861145,,,,,, +30,174899,,,,,,,,,,,,0.07540388405323029,,,,,, +30,174949,,,,,,,,,,,,0.0674576386809349,,,,,, +30,174999,,,,,,,,,,,,0.067325159907341,,,,,, +30,175049,,,,,,,,,,,,0.07044123113155365,,,,,, +30,175099,,,,,,,,,,,,0.061449937522411346,,,,,, +30,175149,,,,,,,,,,,,0.0668838694691658,,,,,, +30,175199,,,,,,,,,,,,0.06446981430053711,,,,,, +30,175249,,,,,,,,,,,,0.06765477359294891,,,,,, +30,175299,,,,,,,,,,,,0.06749758124351501,,,,,, +30,175349,,,,,,,,,,,,0.08776973187923431,,,,,, +30,175399,,,,,,,,,,,,0.0764542818069458,,,,,, +30,175449,,,,,,,,,,,,0.06635267287492752,,,,,, +30,175499,,,,,,,,,,,,0.07387346029281616,,,,,, +30,175549,,,,,,,,,,,,0.06259427219629288,,,,,, +30,175599,,,,,,,,,,,,0.07422078400850296,,,,,, +30,175649,,,,,,,,,,,,0.06840533763170242,,,,,, +30,175699,,,,,,,,,,,,0.057574354112148285,,,,,, +30,175749,,,,,,,,,,,,0.06655238568782806,,,,,, +30,175799,,,,,,,,,,,,0.06587935239076614,,,,,, +30,175849,,,,,,,,,,,,0.07261321693658829,,,,,, +30,175899,,,,,,,,,,,,0.06634199619293213,,,,,, +30,175949,,,,,,,,,,,,0.06212691217660904,,,,,, +30,175999,,,,,,,,,,,,0.06829451024532318,,,,,, +30,176049,,,,,,,,,,,,0.07920972257852554,,,,,, +30,176099,,,,,,,,,,,,0.061941053718328476,,,,,, +30,176149,,,,,,,,,,,,0.06883837282657623,,,,,, +30,176199,,,,,,,,,,,,0.06430979073047638,,,,,, +30,176249,,,,,,,,,,,,0.06249087303876877,,,,,, +30,176299,,,,,,,,,,,,0.058443740010261536,,,,,, +30,176349,,,,,,,,,,,,0.07263623178005219,,,,,, +30,176399,,,,,,,,,,,,0.06413725018501282,,,,,, +30,176449,,,,,,,,,,,,0.06969410181045532,,,,,, +30,176499,,,,,,,,,,,,0.07377167791128159,,,,,, +30,176549,,,,,,,,,,,,0.07047544419765472,,,,,, +30,176599,,,,,,,,,,,,0.07398110628128052,,,,,, +30,176649,,,,,,,,,,,,0.07530461996793747,,,,,, +30,176699,,,,,,,,,,,,0.07109511643648148,,,,,, +30,176749,,,,,,,,,,,,0.07030829787254333,,,,,, +30,176799,,,,,,,,,,,,0.06580062210559845,,,,,, +30,176849,,,,,,,,,,,,0.06021265685558319,,,,,, +30,176899,,,,,,,,,,,,0.08392921090126038,,,,,, +30,176949,,,,,,,,,,,,0.06919020414352417,,,,,, +30,176999,,,,,,,,,,,,0.06423931568861008,,,,,, +30,177049,,,,,,,,,,,,0.06334710121154785,,,,,, +30,177099,,,,,,,,,,,,0.07940153777599335,,,,,, +30,177149,,,,,,,,,,,,0.06961779296398163,,,,,, +30,177199,,,,,,,,,,,,0.06931844353675842,,,,,, +30,177249,,,,,,,,,,,,0.07090206444263458,,,,,, +30,177299,,,,,,,,,,,,0.07768839597702026,,,,,, +30,177349,,,,,,,,,,,,0.06299331039190292,,,,,, +30,177399,,,,,,,,,,,,0.0659475103020668,,,,,, +30,177449,,,,,,,,,,,,0.06928735226392746,,,,,, +30,177499,,,,,,,,,,,,0.05437783524394035,,,,,, +30,177549,,,,,,,,,,,,0.0526566207408905,,,,,, +30,177599,,,,,,,,,,,,0.060249581933021545,,,,,, +30,177649,,,,,,,,,,,,0.05975744128227234,,,,,, +30,177699,,,,,,,,,,,,0.07303379476070404,,,,,, +30,177749,,,,,,,,,,,,0.06094742566347122,,,,,, +30,177799,,,,,,,,,,,,0.06853470206260681,,,,,, +30,177815,,,,,,,,,,,,,0.24610793590545654,0.08623187988996506,0.19150997698307037,-0.04623818397521973,0.19977423548698425,0.08623187988996506 +30,177815,,,,,,,0.21682731807231903,0.06664182245731354,0.4413418769836426,0.1947638988494873,0.4187476933002472,,,,,,, +31,177849,,,,,,,,,,,,0.061287201941013336,,,,,, +31,177899,,,,,,,,,,,,0.06916780769824982,,,,,, +31,177949,,,,,,,,,,,,0.05562589317560196,,,,,, +31,177999,,,,,,,,,,,,0.06454800814390182,,,,,, +31,178049,,,,,,,,,,,,0.05491122230887413,,,,,, +31,178099,,,,,,,,,,,,0.06156189367175102,,,,,, +31,178149,,,,,,,,,,,,0.05852131173014641,,,,,, +31,178199,,,,,,,,,,,,0.06555476039648056,,,,,, +31,178249,,,,,,,,,,,,0.06602807343006134,,,,,, +31,178299,,,,,,,,,,,,0.07901326566934586,,,,,, +31,178349,,,,,,,,,,,,0.05280376225709915,,,,,, +31,178399,,,,,,,,,,,,0.07748673856258392,,,,,, +31,178449,,,,,,,,,,,,0.07044072449207306,,,,,, +31,178499,,,,,,,,,,,,0.06481964141130447,,,,,, +31,178549,,,,,,,,,,,,0.068975530564785,,,,,, +31,178599,,,,,,,,,,,,0.07418478280305862,,,,,, +31,178649,,,,,,,,,,,,0.06490980088710785,,,,,, +31,178699,,,,,,,,,,,,0.05693969130516052,,,,,, +31,178749,,,,,,,,,,,,0.06279003620147705,,,,,, +31,178799,,,,,,,,,,,,0.060622233897447586,,,,,, +31,178849,,,,,,,,,,,,0.07338389754295349,,,,,, +31,178899,,,,,,,,,,,,0.06252268701791763,,,,,, +31,178949,,,,,,,,,,,,0.06324392557144165,,,,,, +31,178999,,,,,,,,,,,,0.0711231604218483,,,,,, +31,179049,,,,,,,,,,,,0.07583806663751602,,,,,, +31,179099,,,,,,,,,,,,0.06597080826759338,,,,,, +31,179149,,,,,,,,,,,,0.07270573079586029,,,,,, +31,179199,,,,,,,,,,,,0.07110166549682617,,,,,, +31,179249,,,,,,,,,,,,0.07669517397880554,,,,,, +31,179299,,,,,,,,,,,,0.052697550505399704,,,,,, +31,179349,,,,,,,,,,,,0.07680557668209076,,,,,, +31,179399,,,,,,,,,,,,0.07317695021629333,,,,,, +31,179449,,,,,,,,,,,,0.059899892657995224,,,,,, +31,179499,,,,,,,,,,,,0.06725931167602539,,,,,, +31,179549,,,,,,,,,,,,0.06642099469900131,,,,,, +31,179599,,,,,,,,,,,,0.062261201441287994,,,,,, +31,179649,,,,,,,,,,,,0.05555997043848038,,,,,, +31,179699,,,,,,,,,,,,0.0623154416680336,,,,,, +31,179749,,,,,,,,,,,,0.07550114393234253,,,,,, +31,179799,,,,,,,,,,,,0.06174607574939728,,,,,, +31,179849,,,,,,,,,,,,0.06395194679498672,,,,,, +31,179899,,,,,,,,,,,,0.0706464946269989,,,,,, +31,179949,,,,,,,,,,,,0.0659978836774826,,,,,, +31,179999,,,,,,,,,,,,0.08884777128696442,,,,,, +31,180049,,,,,,,,,,,,0.06877128779888153,,,,,, +31,180099,,,,,,,,,,,,0.07932046055793762,,,,,, +31,180149,,,,,,,,,,,,0.0635044276714325,,,,,, +31,180199,,,,,,,,,,,,0.05810012295842171,,,,,, +31,180249,,,,,,,,,,,,0.0675789937376976,,,,,, +31,180299,,,,,,,,,,,,0.07170622050762177,,,,,, +31,180349,,,,,,,,,,,,0.06229236721992493,,,,,, +31,180399,,,,,,,,,,,,0.05726560577750206,,,,,, +31,180449,,,,,,,,,,,,0.05793261528015137,,,,,, +31,180499,,,,,,,,,,,,0.07170717418193817,,,,,, +31,180549,,,,,,,,,,,,0.07350984215736389,,,,,, +31,180599,,,,,,,,,,,,0.057990506291389465,,,,,, +31,180649,,,,,,,,,,,,0.06440518796443939,,,,,, +31,180699,,,,,,,,,,,,0.057546474039554596,,,,,, +31,180749,,,,,,,,,,,,0.0681648999452591,,,,,, +31,180799,,,,,,,,,,,,0.059698447585105896,,,,,, +31,180849,,,,,,,,,,,,0.05788729712367058,,,,,, +31,180899,,,,,,,,,,,,0.07202166318893433,,,,,, +31,180949,,,,,,,,,,,,0.060609325766563416,,,,,, +31,180999,,,,,,,,,,,,0.059169456362724304,,,,,, +31,181049,,,,,,,,,,,,0.06576402485370636,,,,,, +31,181099,,,,,,,,,,,,0.06661088019609451,,,,,, +31,181149,,,,,,,,,,,,0.061808355152606964,,,,,, +31,181199,,,,,,,,,,,,0.06446103751659393,,,,,, +31,181249,,,,,,,,,,,,0.060635291039943695,,,,,, +31,181299,,,,,,,,,,,,0.06623904407024384,,,,,, +31,181349,,,,,,,,,,,,0.06835327297449112,,,,,, +31,181399,,,,,,,,,,,,0.07325243949890137,,,,,, +31,181449,,,,,,,,,,,,0.06676419079303741,,,,,, +31,181499,,,,,,,,,,,,0.06749547272920609,,,,,, +31,181549,,,,,,,,,,,,0.06496074050664902,,,,,, +31,181599,,,,,,,,,,,,0.07406973838806152,,,,,, +31,181649,,,,,,,,,,,,0.07025617361068726,,,,,, +31,181699,,,,,,,,,,,,0.054878972470760345,,,,,, +31,181749,,,,,,,,,,,,0.1395958960056305,,,,,, +31,181799,,,,,,,,,,,,0.06199526786804199,,,,,, +31,181849,,,,,,,,,,,,0.062056705355644226,,,,,, +31,181899,,,,,,,,,,,,0.0684942975640297,,,,,, +31,181949,,,,,,,,,,,,0.066889189183712,,,,,, +31,181999,,,,,,,,,,,,0.07096010446548462,,,,,, +31,182049,,,,,,,,,,,,0.06614679843187332,,,,,, +31,182099,,,,,,,,,,,,0.07905012369155884,,,,,, +31,182149,,,,,,,,,,,,0.08322302252054214,,,,,, +31,182199,,,,,,,,,,,,0.058521807193756104,,,,,, +31,182249,,,,,,,,,,,,0.057875122874975204,,,,,, +31,182299,,,,,,,,,,,,0.06541335582733154,,,,,, +31,182349,,,,,,,,,,,,0.06332499533891678,,,,,, +31,182399,,,,,,,,,,,,0.05916464328765869,,,,,, +31,182449,,,,,,,,,,,,0.060786910355091095,,,,,, +31,182499,,,,,,,,,,,,0.06322436779737473,,,,,, +31,182549,,,,,,,,,,,,0.07594358921051025,,,,,, +31,182599,,,,,,,,,,,,0.05810409411787987,,,,,, +31,182649,,,,,,,,,,,,0.06926195323467255,,,,,, +31,182699,,,,,,,,,,,,0.06502445042133331,,,,,, +31,182749,,,,,,,,,,,,0.07011784613132477,,,,,, +31,182799,,,,,,,,,,,,0.06384947896003723,,,,,, +31,182849,,,,,,,,,,,,0.07207034528255463,,,,,, +31,182899,,,,,,,,,,,,0.08004659414291382,,,,,, +31,182949,,,,,,,,,,,,0.06332249194383621,,,,,, +31,182999,,,,,,,,,,,,0.07011514902114868,,,,,, +31,183049,,,,,,,,,,,,0.06640902161598206,,,,,, +31,183099,,,,,,,,,,,,0.08021331578493118,,,,,, +31,183149,,,,,,,,,,,,0.07385857403278351,,,,,, +31,183199,,,,,,,,,,,,0.07594648003578186,,,,,, +31,183249,,,,,,,,,,,,0.07088865339756012,,,,,, +31,183299,,,,,,,,,,,,0.05757642537355423,,,,,, +31,183349,,,,,,,,,,,,0.06276903301477432,,,,,, +31,183399,,,,,,,,,,,,0.06574533134698868,,,,,, +31,183449,,,,,,,,,,,,0.05467013269662857,,,,,, +31,183499,,,,,,,,,,,,0.06382182240486145,,,,,, +31,183549,,,,,,,,,,,,0.07696302235126495,,,,,, +31,183551,,,,,,,,,,,,,0.24585939943790436,0.08625057339668274,0.19938625395298004,-0.04646492004394531,0.20291413366794586,0.08625057339668274 +31,183551,,,,,,,0.21674062311649323,0.06667423248291016,0.4409170150756836,0.19438862800598145,0.4196746051311493,,,,,,, +32,183599,,,,,,,,,,,,0.07811304926872253,,,,,, +32,183649,,,,,,,,,,,,0.07929208874702454,,,,,, +32,183699,,,,,,,,,,,,0.06666441261768341,,,,,, +32,183749,,,,,,,,,,,,0.0765308290719986,,,,,, +32,183799,,,,,,,,,,,,0.05648742616176605,,,,,, +32,183849,,,,,,,,,,,,0.0663762092590332,,,,,, +32,183899,,,,,,,,,,,,0.06627871096134186,,,,,, +32,183949,,,,,,,,,,,,0.06310683488845825,,,,,, +32,183999,,,,,,,,,,,,0.06615954637527466,,,,,, +32,184049,,,,,,,,,,,,0.07344801723957062,,,,,, +32,184099,,,,,,,,,,,,0.06292995810508728,,,,,, +32,184149,,,,,,,,,,,,0.06984816491603851,,,,,, +32,184199,,,,,,,,,,,,0.0614117793738842,,,,,, +32,184249,,,,,,,,,,,,0.06568530946969986,,,,,, +32,184299,,,,,,,,,,,,0.06926721334457397,,,,,, +32,184349,,,,,,,,,,,,0.06251457333564758,,,,,, +32,184399,,,,,,,,,,,,0.07380276918411255,,,,,, +32,184449,,,,,,,,,,,,0.06837300956249237,,,,,, +32,184499,,,,,,,,,,,,0.06540505588054657,,,,,, +32,184549,,,,,,,,,,,,0.07645882666110992,,,,,, +32,184599,,,,,,,,,,,,0.058737777173519135,,,,,, +32,184649,,,,,,,,,,,,0.06059323251247406,,,,,, +32,184699,,,,,,,,,,,,0.0708073079586029,,,,,, +32,184749,,,,,,,,,,,,0.06391090154647827,,,,,, +32,184799,,,,,,,,,,,,0.06654293835163116,,,,,, +32,184849,,,,,,,,,,,,0.07091768085956573,,,,,, +32,184899,,,,,,,,,,,,0.06050845980644226,,,,,, +32,184949,,,,,,,,,,,,0.07210466265678406,,,,,, +32,184999,,,,,,,,,,,,0.07794010639190674,,,,,, +32,185049,,,,,,,,,,,,0.0610804408788681,,,,,, +32,185099,,,,,,,,,,,,0.07651045173406601,,,,,, +32,185149,,,,,,,,,,,,0.07339667528867722,,,,,, +32,185199,,,,,,,,,,,,0.05551183596253395,,,,,, +32,185249,,,,,,,,,,,,0.07630177587270737,,,,,, +32,185299,,,,,,,,,,,,0.060643523931503296,,,,,, +32,185349,,,,,,,,,,,,0.07725800573825836,,,,,, +32,185399,,,,,,,,,,,,0.06033046171069145,,,,,, +32,185449,,,,,,,,,,,,0.0713474303483963,,,,,, +32,185499,,,,,,,,,,,,0.06329767405986786,,,,,, +32,185549,,,,,,,,,,,,0.07240157574415207,,,,,, +32,185599,,,,,,,,,,,,0.07796397805213928,,,,,, +32,185649,,,,,,,,,,,,0.067009836435318,,,,,, +32,185699,,,,,,,,,,,,0.0639934092760086,,,,,, +32,185749,,,,,,,,,,,,0.05935433506965637,,,,,, +32,185799,,,,,,,,,,,,0.06814345717430115,,,,,, +32,185849,,,,,,,,,,,,0.0667438730597496,,,,,, +32,185899,,,,,,,,,,,,0.06901129335165024,,,,,, +32,185949,,,,,,,,,,,,0.07722809910774231,,,,,, +32,185999,,,,,,,,,,,,0.06971350312232971,,,,,, +32,186049,,,,,,,,,,,,0.058458112180233,,,,,, +32,186099,,,,,,,,,,,,0.057743582874536514,,,,,, +32,186149,,,,,,,,,,,,0.08117998391389847,,,,,, +32,186199,,,,,,,,,,,,0.0721030905842781,,,,,, +32,186249,,,,,,,,,,,,0.07616269588470459,,,,,, +32,186299,,,,,,,,,,,,0.06846090406179428,,,,,, +32,186349,,,,,,,,,,,,0.059489548206329346,,,,,, +32,186399,,,,,,,,,,,,0.06067134439945221,,,,,, +32,186449,,,,,,,,,,,,0.06041343882679939,,,,,, +32,186499,,,,,,,,,,,,0.06863497197628021,,,,,, +32,186549,,,,,,,,,,,,0.06415143609046936,,,,,, +32,186599,,,,,,,,,,,,0.0580621175467968,,,,,, +32,186649,,,,,,,,,,,,0.058070529252290726,,,,,, +32,186699,,,,,,,,,,,,0.06268593668937683,,,,,, +32,186749,,,,,,,,,,,,0.06765683740377426,,,,,, +32,186799,,,,,,,,,,,,0.058820027858018875,,,,,, +32,186849,,,,,,,,,,,,0.06383480876684189,,,,,, +32,186899,,,,,,,,,,,,0.06952444463968277,,,,,, +32,186949,,,,,,,,,,,,0.06613773852586746,,,,,, +32,186999,,,,,,,,,,,,0.079010009765625,,,,,, +32,187049,,,,,,,,,,,,0.07145470380783081,,,,,, +32,187099,,,,,,,,,,,,0.06356152892112732,,,,,, +32,187149,,,,,,,,,,,,0.07342478632926941,,,,,, +32,187199,,,,,,,,,,,,0.06892281770706177,,,,,, +32,187249,,,,,,,,,,,,0.06499332189559937,,,,,, +32,187299,,,,,,,,,,,,0.05921177566051483,,,,,, +32,187349,,,,,,,,,,,,0.07010030001401901,,,,,, +32,187399,,,,,,,,,,,,0.06427309662103653,,,,,, +32,187449,,,,,,,,,,,,0.08126836270093918,,,,,, +32,187499,,,,,,,,,,,,0.06362022459506989,,,,,, +32,187549,,,,,,,,,,,,0.061088308691978455,,,,,, +32,187599,,,,,,,,,,,,0.06513570249080658,,,,,, +32,187649,,,,,,,,,,,,0.06264698505401611,,,,,, +32,187699,,,,,,,,,,,,0.06829417496919632,,,,,, +32,187749,,,,,,,,,,,,0.06277969479560852,,,,,, +32,187799,,,,,,,,,,,,0.0640440508723259,,,,,, +32,187849,,,,,,,,,,,,0.06486766785383224,,,,,, +32,187899,,,,,,,,,,,,0.06049793213605881,,,,,, +32,187949,,,,,,,,,,,,0.06666919589042664,,,,,, +32,187999,,,,,,,,,,,,0.07081717997789383,,,,,, +32,188049,,,,,,,,,,,,0.06777340918779373,,,,,, +32,188099,,,,,,,,,,,,0.0595504455268383,,,,,, +32,188149,,,,,,,,,,,,0.06664963066577911,,,,,, +32,188199,,,,,,,,,,,,0.06646131724119186,,,,,, +32,188249,,,,,,,,,,,,0.07317588478326797,,,,,, +32,188299,,,,,,,,,,,,0.049780361354351044,,,,,, +32,188349,,,,,,,,,,,,0.06901166588068008,,,,,, +32,188399,,,,,,,,,,,,0.07473064959049225,,,,,, +32,188449,,,,,,,,,,,,0.07454504817724228,,,,,, +32,188499,,,,,,,,,,,,0.0696902722120285,,,,,, +32,188549,,,,,,,,,,,,0.06968085467815399,,,,,, +32,188599,,,,,,,,,,,,0.07118717581033707,,,,,, +32,188649,,,,,,,,,,,,0.06756196916103363,,,,,, +32,188699,,,,,,,,,,,,0.061112258583307266,,,,,, +32,188749,,,,,,,,,,,,0.0637122392654419,,,,,, +32,188799,,,,,,,,,,,,0.07137072831392288,,,,,, +32,188849,,,,,,,,,,,,0.07560260593891144,,,,,, +32,188899,,,,,,,,,,,,0.060596268624067307,,,,,, +32,188949,,,,,,,,,,,,0.06316320598125458,,,,,, +32,188999,,,,,,,,,,,,0.06068608909845352,,,,,, +32,189049,,,,,,,,,,,,0.07780459523200989,,,,,, +32,189099,,,,,,,,,,,,0.061414167284965515,,,,,, +32,189149,,,,,,,,,,,,0.06406688690185547,,,,,, +32,189199,,,,,,,,,,,,0.07263129949569702,,,,,, +32,189249,,,,,,,,,,,,0.068966805934906,,,,,, +32,189287,,,,,,,,,,,,,0.24566243588924408,0.08583737909793854,0.19582612812519073,-0.04145169258117676,0.20194461941719055,0.08583737909793854 +32,189287,,,,,,,0.2161371111869812,0.06630441546440125,0.4459310472011566,0.19884389638900757,0.42306455969810486,,,,,,, +33,189299,,,,,,,,,,,,0.06178814172744751,,,,,, +33,189349,,,,,,,,,,,,0.05603225901722908,,,,,, +33,189399,,,,,,,,,,,,0.06352974474430084,,,,,, +33,189449,,,,,,,,,,,,0.05495249480009079,,,,,, +33,189499,,,,,,,,,,,,0.06438271701335907,,,,,, +33,189549,,,,,,,,,,,,0.062002748250961304,,,,,, +33,189599,,,,,,,,,,,,0.056536320596933365,,,,,, +33,189649,,,,,,,,,,,,0.06620950251817703,,,,,, +33,189699,,,,,,,,,,,,0.06593427807092667,,,,,, +33,189749,,,,,,,,,,,,0.08298536390066147,,,,,, +33,189799,,,,,,,,,,,,0.05642542615532875,,,,,, +33,189849,,,,,,,,,,,,0.05968751013278961,,,,,, +33,189899,,,,,,,,,,,,0.08236515522003174,,,,,, +33,189949,,,,,,,,,,,,0.05819288641214371,,,,,, +33,189999,,,,,,,,,,,,0.06115563586354256,,,,,, +33,190049,,,,,,,,,,,,0.05830920487642288,,,,,, +33,190099,,,,,,,,,,,,0.07378143072128296,,,,,, +33,190149,,,,,,,,,,,,0.07179836183786392,,,,,, +33,190199,,,,,,,,,,,,0.06711706519126892,,,,,, +33,190249,,,,,,,,,,,,0.061910856515169144,,,,,, +33,190299,,,,,,,,,,,,0.05949127674102783,,,,,, +33,190349,,,,,,,,,,,,0.053839243948459625,,,,,, +33,190399,,,,,,,,,,,,0.06235311180353165,,,,,, +33,190449,,,,,,,,,,,,0.07469014823436737,,,,,, +33,190499,,,,,,,,,,,,0.06518515199422836,,,,,, +33,190549,,,,,,,,,,,,0.05620424076914787,,,,,, +33,190599,,,,,,,,,,,,0.057294175028800964,,,,,, +33,190649,,,,,,,,,,,,0.07109376788139343,,,,,, +33,190699,,,,,,,,,,,,0.07011795789003372,,,,,, +33,190749,,,,,,,,,,,,0.06113705784082413,,,,,, +33,190799,,,,,,,,,,,,0.08557933568954468,,,,,, +33,190849,,,,,,,,,,,,0.07415686547756195,,,,,, +33,190899,,,,,,,,,,,,0.07330945879220963,,,,,, +33,190949,,,,,,,,,,,,0.059696849435567856,,,,,, +33,190999,,,,,,,,,,,,0.05068691819906235,,,,,, +33,191049,,,,,,,,,,,,0.05736208334565163,,,,,, +33,191099,,,,,,,,,,,,0.06256190687417984,,,,,, +33,191149,,,,,,,,,,,,0.07242539525032043,,,,,, +33,191199,,,,,,,,,,,,0.07812367379665375,,,,,, +33,191249,,,,,,,,,,,,0.0687161237001419,,,,,, +33,191299,,,,,,,,,,,,0.06116963177919388,,,,,, +33,191349,,,,,,,,,,,,0.06929679960012436,,,,,, +33,191399,,,,,,,,,,,,0.055634163320064545,,,,,, +33,191449,,,,,,,,,,,,0.07038882374763489,,,,,, +33,191499,,,,,,,,,,,,0.063641756772995,,,,,, +33,191549,,,,,,,,,,,,0.06535974144935608,,,,,, +33,191599,,,,,,,,,,,,0.06704352796077728,,,,,, +33,191649,,,,,,,,,,,,0.06168053299188614,,,,,, +33,191699,,,,,,,,,,,,0.05836351960897446,,,,,, +33,191749,,,,,,,,,,,,0.06740546226501465,,,,,, +33,191799,,,,,,,,,,,,0.06202574446797371,,,,,, +33,191849,,,,,,,,,,,,0.060368653386831284,,,,,, +33,191899,,,,,,,,,,,,0.06677863001823425,,,,,, +33,191949,,,,,,,,,,,,0.06438679248094559,,,,,, +33,191999,,,,,,,,,,,,0.0615573525428772,,,,,, +33,192049,,,,,,,,,,,,0.07042156159877777,,,,,, +33,192099,,,,,,,,,,,,0.06727200746536255,,,,,, +33,192149,,,,,,,,,,,,0.07797770202159882,,,,,, +33,192199,,,,,,,,,,,,0.05987046658992767,,,,,, +33,192249,,,,,,,,,,,,0.06062934175133705,,,,,, +33,192299,,,,,,,,,,,,0.06785653531551361,,,,,, +33,192349,,,,,,,,,,,,0.058068957179784775,,,,,, +33,192399,,,,,,,,,,,,0.0521714985370636,,,,,, +33,192449,,,,,,,,,,,,0.06583122164011002,,,,,, +33,192499,,,,,,,,,,,,0.06861983239650726,,,,,, +33,192549,,,,,,,,,,,,0.062274955213069916,,,,,, +33,192599,,,,,,,,,,,,0.06688328087329865,,,,,, +33,192649,,,,,,,,,,,,0.06929630786180496,,,,,, +33,192699,,,,,,,,,,,,0.06634480506181717,,,,,, +33,192749,,,,,,,,,,,,0.0696219652891159,,,,,, +33,192799,,,,,,,,,,,,0.07247398793697357,,,,,, +33,192849,,,,,,,,,,,,0.05072718858718872,,,,,, +33,192899,,,,,,,,,,,,0.05235724151134491,,,,,, +33,192949,,,,,,,,,,,,0.06550579518079758,,,,,, +33,192999,,,,,,,,,,,,0.0670761838555336,,,,,, +33,193049,,,,,,,,,,,,0.0681777149438858,,,,,, +33,193099,,,,,,,,,,,,0.048825882375240326,,,,,, +33,193149,,,,,,,,,,,,0.06685251742601395,,,,,, +33,193199,,,,,,,,,,,,0.07940299808979034,,,,,, +33,193249,,,,,,,,,,,,0.08042944967746735,,,,,, +33,193299,,,,,,,,,,,,0.06995362043380737,,,,,, +33,193349,,,,,,,,,,,,0.06298761814832687,,,,,, +33,193399,,,,,,,,,,,,0.07308738678693771,,,,,, +33,193449,,,,,,,,,,,,0.06160891801118851,,,,,, +33,193499,,,,,,,,,,,,0.06627711653709412,,,,,, +33,193549,,,,,,,,,,,,0.06581475585699081,,,,,, +33,193599,,,,,,,,,,,,0.07115227729082108,,,,,, +33,193649,,,,,,,,,,,,0.06859944760799408,,,,,, +33,193699,,,,,,,,,,,,0.05965598672628403,,,,,, +33,193749,,,,,,,,,,,,0.05433779954910278,,,,,, +33,193799,,,,,,,,,,,,0.0593537911772728,,,,,, +33,193849,,,,,,,,,,,,0.06824249774217606,,,,,, +33,193899,,,,,,,,,,,,0.056441862136125565,,,,,, +33,193949,,,,,,,,,,,,0.06179220974445343,,,,,, +33,193999,,,,,,,,,,,,0.06546099483966827,,,,,, +33,194049,,,,,,,,,,,,0.05353637784719467,,,,,, +33,194099,,,,,,,,,,,,0.05560735613107681,,,,,, +33,194149,,,,,,,,,,,,0.07249879837036133,,,,,, +33,194199,,,,,,,,,,,,0.05702388286590576,,,,,, +33,194249,,,,,,,,,,,,0.06975360214710236,,,,,, +33,194299,,,,,,,,,,,,0.06373469531536102,,,,,, +33,194349,,,,,,,,,,,,0.05946189910173416,,,,,, +33,194399,,,,,,,,,,,,0.06595271825790405,,,,,, +33,194449,,,,,,,,,,,,0.054628483951091766,,,,,, +33,194499,,,,,,,,,,,,0.06729022413492203,,,,,, +33,194549,,,,,,,,,,,,0.05723636969923973,,,,,, +33,194599,,,,,,,,,,,,0.06580540537834167,,,,,, +33,194649,,,,,,,,,,,,0.05849885940551758,,,,,, +33,194699,,,,,,,,,,,,0.0658428817987442,,,,,, +33,194749,,,,,,,,,,,,0.07243070006370544,,,,,, +33,194799,,,,,,,,,,,,0.06606163829565048,,,,,, +33,194849,,,,,,,,,,,,0.07703159749507904,,,,,, +33,194899,,,,,,,,,,,,0.058936409652233124,,,,,, +33,194949,,,,,,,,,,,,0.06851500272750854,,,,,, +33,194999,,,,,,,,,,,,0.05679421126842499,,,,,, +33,195023,,,,,,,,,,,,,0.24392233788967133,0.08462510257959366,0.20942285656929016,-0.026743292808532715,0.21497943997383118,0.08462510257959366 +33,195023,,,,,,,0.21596765518188477,0.06630171835422516,0.4459848999977112,0.1988885998725891,0.4240685999393463,,,,,,, +34,195049,,,,,,,,,,,,0.06235193833708763,,,,,, +34,195099,,,,,,,,,,,,0.06886368244886398,,,,,, +34,195149,,,,,,,,,,,,0.07575863599777222,,,,,, +34,195199,,,,,,,,,,,,0.0590897873044014,,,,,, +34,195249,,,,,,,,,,,,0.0655660480260849,,,,,, +34,195299,,,,,,,,,,,,0.06591659784317017,,,,,, +34,195349,,,,,,,,,,,,0.06649556010961533,,,,,, +34,195399,,,,,,,,,,,,0.05020669847726822,,,,,, +34,195449,,,,,,,,,,,,0.06258035451173782,,,,,, +34,195499,,,,,,,,,,,,0.06292124837636948,,,,,, +34,195549,,,,,,,,,,,,0.07437421381473541,,,,,, +34,195599,,,,,,,,,,,,0.059706903994083405,,,,,, +34,195649,,,,,,,,,,,,0.06341494619846344,,,,,, +34,195699,,,,,,,,,,,,0.06820616126060486,,,,,, +34,195749,,,,,,,,,,,,0.07214348018169403,,,,,, +34,195799,,,,,,,,,,,,0.06213928759098053,,,,,, +34,195849,,,,,,,,,,,,0.057400573045015335,,,,,, +34,195899,,,,,,,,,,,,0.06205550581216812,,,,,, +34,195949,,,,,,,,,,,,0.07125434279441833,,,,,, +34,195999,,,,,,,,,,,,0.05576176568865776,,,,,, +34,196049,,,,,,,,,,,,0.07261323928833008,,,,,, +34,196099,,,,,,,,,,,,0.0714530348777771,,,,,, +34,196149,,,,,,,,,,,,0.07482520490884781,,,,,, +34,196199,,,,,,,,,,,,0.06901058554649353,,,,,, +34,196249,,,,,,,,,,,,0.056305017322301865,,,,,, +34,196299,,,,,,,,,,,,0.061605870723724365,,,,,, +34,196349,,,,,,,,,,,,0.07750127464532852,,,,,, +34,196399,,,,,,,,,,,,0.07792560756206512,,,,,, +34,196449,,,,,,,,,,,,0.07462325692176819,,,,,, +34,196499,,,,,,,,,,,,0.06021870672702789,,,,,, +34,196549,,,,,,,,,,,,0.06117396056652069,,,,,, +34,196599,,,,,,,,,,,,0.0629410445690155,,,,,, +34,196649,,,,,,,,,,,,0.07348379492759705,,,,,, +34,196699,,,,,,,,,,,,0.07191133499145508,,,,,, +34,196749,,,,,,,,,,,,0.056989334523677826,,,,,, +34,196799,,,,,,,,,,,,0.06695237755775452,,,,,, +34,196849,,,,,,,,,,,,0.06549948453903198,,,,,, +34,196899,,,,,,,,,,,,0.0650908499956131,,,,,, +34,196949,,,,,,,,,,,,0.06515024602413177,,,,,, +34,196999,,,,,,,,,,,,0.0675366073846817,,,,,, +34,197049,,,,,,,,,,,,0.0693349614739418,,,,,, +34,197099,,,,,,,,,,,,0.07004372030496597,,,,,, +34,197149,,,,,,,,,,,,0.06417384743690491,,,,,, +34,197199,,,,,,,,,,,,0.06423219293355942,,,,,, +34,197249,,,,,,,,,,,,0.06755483150482178,,,,,, +34,197299,,,,,,,,,,,,0.07381746172904968,,,,,, +34,197349,,,,,,,,,,,,0.0815897285938263,,,,,, +34,197399,,,,,,,,,,,,0.05588630959391594,,,,,, +34,197449,,,,,,,,,,,,0.07294802367687225,,,,,, +34,197499,,,,,,,,,,,,0.0571216344833374,,,,,, +34,197549,,,,,,,,,,,,0.06814420223236084,,,,,, +34,197599,,,,,,,,,,,,0.06099095940589905,,,,,, +34,197649,,,,,,,,,,,,0.06868434697389603,,,,,, +34,197699,,,,,,,,,,,,0.074112668633461,,,,,, +34,197749,,,,,,,,,,,,0.06802704930305481,,,,,, +34,197799,,,,,,,,,,,,0.07035328447818756,,,,,, +34,197849,,,,,,,,,,,,0.06178884208202362,,,,,, +34,197899,,,,,,,,,,,,0.06025902181863785,,,,,, +34,197949,,,,,,,,,,,,0.07429224997758865,,,,,, +34,197999,,,,,,,,,,,,0.05704649165272713,,,,,, +34,198049,,,,,,,,,,,,0.06533713638782501,,,,,, +34,198099,,,,,,,,,,,,0.059535589069128036,,,,,, +34,198149,,,,,,,,,,,,0.06958594173192978,,,,,, +34,198199,,,,,,,,,,,,0.06321697682142258,,,,,, +34,198249,,,,,,,,,,,,0.06271393597126007,,,,,, +34,198299,,,,,,,,,,,,0.06781765818595886,,,,,, +34,198349,,,,,,,,,,,,0.06868837028741837,,,,,, +34,198399,,,,,,,,,,,,0.06253193318843842,,,,,, +34,198449,,,,,,,,,,,,0.07152001559734344,,,,,, +34,198499,,,,,,,,,,,,0.08189895749092102,,,,,, +34,198549,,,,,,,,,,,,0.06725330650806427,,,,,, +34,198599,,,,,,,,,,,,0.07139018923044205,,,,,, +34,198649,,,,,,,,,,,,0.06930302083492279,,,,,, +34,198699,,,,,,,,,,,,0.07670820504426956,,,,,, +34,198749,,,,,,,,,,,,0.06586641073226929,,,,,, +34,198799,,,,,,,,,,,,0.07537952065467834,,,,,, +34,198849,,,,,,,,,,,,0.0682903453707695,,,,,, +34,198899,,,,,,,,,,,,0.06220315769314766,,,,,, +34,198949,,,,,,,,,,,,0.06290409713983536,,,,,, +34,198999,,,,,,,,,,,,0.06775226444005966,,,,,, +34,199049,,,,,,,,,,,,0.07144073396921158,,,,,, +34,199099,,,,,,,,,,,,0.06656438112258911,,,,,, +34,199149,,,,,,,,,,,,0.06402681767940521,,,,,, +34,199199,,,,,,,,,,,,0.06802032887935638,,,,,, +34,199249,,,,,,,,,,,,0.05991028621792793,,,,,, +34,199299,,,,,,,,,,,,0.0628548264503479,,,,,, +34,199349,,,,,,,,,,,,0.07073265314102173,,,,,, +34,199399,,,,,,,,,,,,0.06622475385665894,,,,,, +34,199449,,,,,,,,,,,,0.07289887964725494,,,,,, +34,199499,,,,,,,,,,,,0.08527637273073196,,,,,, +34,199549,,,,,,,,,,,,0.07213421165943146,,,,,, +34,199599,,,,,,,,,,,,0.07090073823928833,,,,,, +34,199649,,,,,,,,,,,,0.06725048273801804,,,,,, +34,199699,,,,,,,,,,,,0.06871721148490906,,,,,, +34,199749,,,,,,,,,,,,0.06689323484897614,,,,,, +34,199799,,,,,,,,,,,,0.0660131424665451,,,,,, +34,199849,,,,,,,,,,,,0.06672479212284088,,,,,, +34,199899,,,,,,,,,,,,0.07283077389001846,,,,,, +34,199949,,,,,,,,,,,,0.07068629562854767,,,,,, +34,199999,,,,,,,,,,,,0.0712677389383316,,,,,, +34,200049,,,,,,,,,,,,0.06932854652404785,,,,,, +34,200099,,,,,,,,,,,,0.061447616666555405,,,,,, +34,200149,,,,,,,,,,,,0.06118292361497879,,,,,, +34,200199,,,,,,,,,,,,0.057423606514930725,,,,,, +34,200249,,,,,,,,,,,,0.06900646537542343,,,,,, +34,200299,,,,,,,,,,,,0.06627772748470306,,,,,, +34,200349,,,,,,,,,,,,0.07084087282419205,,,,,, +34,200399,,,,,,,,,,,,0.059749167412519455,,,,,, +34,200449,,,,,,,,,,,,0.06305192410945892,,,,,, +34,200499,,,,,,,,,,,,0.07907837629318237,,,,,, +34,200549,,,,,,,,,,,,0.06678171455860138,,,,,, +34,200599,,,,,,,,,,,,0.06811605393886566,,,,,, +34,200649,,,,,,,,,,,,0.06639949977397919,,,,,, +34,200699,,,,,,,,,,,,0.06500822305679321,,,,,, +34,200749,,,,,,,,,,,,0.0712442547082901,,,,,, +34,200759,,,,,,,,,,,,,0.24664098024368286,0.08729042857885361,0.20421326160430908,-0.059081435203552246,0.21127401292324066,0.08729042857885361 +34,200759,,,,,,,0.21577304601669312,0.06610120087862015,0.4486750364303589,0.20130038261413574,0.4252234101295471,,,,,,, +35,200799,,,,,,,,,,,,0.0725676640868187,,,,,, +35,200849,,,,,,,,,,,,0.07021889090538025,,,,,, +35,200899,,,,,,,,,,,,0.06683042645454407,,,,,, +35,200949,,,,,,,,,,,,0.0847284197807312,,,,,, +35,200999,,,,,,,,,,,,0.07172875851392746,,,,,, +35,201049,,,,,,,,,,,,0.060936328023672104,,,,,, +35,201099,,,,,,,,,,,,0.06972947716712952,,,,,, +35,201149,,,,,,,,,,,,0.050270386040210724,,,,,, +35,201199,,,,,,,,,,,,0.06969179213047028,,,,,, +35,201249,,,,,,,,,,,,0.07994930446147919,,,,,, +35,201299,,,,,,,,,,,,0.06108855828642845,,,,,, +35,201349,,,,,,,,,,,,0.07709561288356781,,,,,, +35,201399,,,,,,,,,,,,0.07490675151348114,,,,,, +35,201449,,,,,,,,,,,,0.05349355563521385,,,,,, +35,201499,,,,,,,,,,,,0.06113022193312645,,,,,, +35,201549,,,,,,,,,,,,0.06589116901159286,,,,,, +35,201599,,,,,,,,,,,,0.06290833652019501,,,,,, +35,201649,,,,,,,,,,,,0.06578899174928665,,,,,, +35,201699,,,,,,,,,,,,0.06955377757549286,,,,,, +35,201749,,,,,,,,,,,,0.06653080880641937,,,,,, +35,201799,,,,,,,,,,,,0.06794305145740509,,,,,, +35,201849,,,,,,,,,,,,0.06974773108959198,,,,,, +35,201899,,,,,,,,,,,,0.06900105625391006,,,,,, +35,201949,,,,,,,,,,,,0.061347708106040955,,,,,, +35,201999,,,,,,,,,,,,0.07368268072605133,,,,,, +35,202049,,,,,,,,,,,,0.06000010296702385,,,,,, +35,202099,,,,,,,,,,,,0.06469035148620605,,,,,, +35,202149,,,,,,,,,,,,0.0684673935174942,,,,,, +35,202199,,,,,,,,,,,,0.07385656237602234,,,,,, +35,202249,,,,,,,,,,,,0.052367910742759705,,,,,, +35,202299,,,,,,,,,,,,0.06478370726108551,,,,,, +35,202349,,,,,,,,,,,,0.047725073993206024,,,,,, +35,202399,,,,,,,,,,,,0.05981045588850975,,,,,, +35,202449,,,,,,,,,,,,0.06805349886417389,,,,,, +35,202499,,,,,,,,,,,,0.06859855353832245,,,,,, +35,202549,,,,,,,,,,,,0.06052933633327484,,,,,, +35,202599,,,,,,,,,,,,0.06807436048984528,,,,,, +35,202649,,,,,,,,,,,,0.07233738899230957,,,,,, +35,202699,,,,,,,,,,,,0.06385765969753265,,,,,, +35,202749,,,,,,,,,,,,0.07336835563182831,,,,,, +35,202799,,,,,,,,,,,,0.06219685077667236,,,,,, +35,202849,,,,,,,,,,,,0.0753210186958313,,,,,, +35,202899,,,,,,,,,,,,0.07280783355236053,,,,,, +35,202949,,,,,,,,,,,,0.06114596128463745,,,,,, +35,202999,,,,,,,,,,,,0.060798823833465576,,,,,, +35,203049,,,,,,,,,,,,0.06552440673112869,,,,,, +35,203099,,,,,,,,,,,,0.06298162043094635,,,,,, +35,203149,,,,,,,,,,,,0.057511214166879654,,,,,, +35,203199,,,,,,,,,,,,0.06067811697721481,,,,,, +35,203249,,,,,,,,,,,,0.06272511184215546,,,,,, +35,203299,,,,,,,,,,,,0.06486956775188446,,,,,, +35,203349,,,,,,,,,,,,0.0661354809999466,,,,,, +35,203399,,,,,,,,,,,,0.06825943291187286,,,,,, +35,203449,,,,,,,,,,,,0.06935905665159225,,,,,, +35,203499,,,,,,,,,,,,0.06816020607948303,,,,,, +35,203549,,,,,,,,,,,,0.0673467293381691,,,,,, +35,203599,,,,,,,,,,,,0.06975311785936356,,,,,, +35,203649,,,,,,,,,,,,0.05620565637946129,,,,,, +35,203699,,,,,,,,,,,,0.06161731481552124,,,,,, +35,203749,,,,,,,,,,,,0.06520554423332214,,,,,, +35,203799,,,,,,,,,,,,0.062334489077329636,,,,,, +35,203849,,,,,,,,,,,,0.06762795150279999,,,,,, +35,203899,,,,,,,,,,,,0.06813608855009079,,,,,, +35,203949,,,,,,,,,,,,0.06990925967693329,,,,,, +35,203999,,,,,,,,,,,,0.06850768625736237,,,,,, +35,204049,,,,,,,,,,,,0.06703472137451172,,,,,, +35,204099,,,,,,,,,,,,0.06566952168941498,,,,,, +35,204149,,,,,,,,,,,,0.0707508772611618,,,,,, +35,204199,,,,,,,,,,,,0.06599640101194382,,,,,, +35,204249,,,,,,,,,,,,0.06849947571754456,,,,,, +35,204299,,,,,,,,,,,,0.06312093883752823,,,,,, +35,204349,,,,,,,,,,,,0.05907744914293289,,,,,, +35,204399,,,,,,,,,,,,0.0604570172727108,,,,,, +35,204449,,,,,,,,,,,,0.06955644488334656,,,,,, +35,204499,,,,,,,,,,,,0.06456831097602844,,,,,, +35,204549,,,,,,,,,,,,0.05887600779533386,,,,,, +35,204599,,,,,,,,,,,,0.0667089894413948,,,,,, +35,204649,,,,,,,,,,,,0.07025008648633957,,,,,, +35,204699,,,,,,,,,,,,0.06605005264282227,,,,,, +35,204749,,,,,,,,,,,,0.06672416627407074,,,,,, +35,204799,,,,,,,,,,,,0.08079442381858826,,,,,, +35,204849,,,,,,,,,,,,0.06221519783139229,,,,,, +35,204899,,,,,,,,,,,,0.061289265751838684,,,,,, +35,204949,,,,,,,,,,,,0.06924588978290558,,,,,, +35,204999,,,,,,,,,,,,0.08024702221155167,,,,,, +35,205049,,,,,,,,,,,,0.07019595801830292,,,,,, +35,205099,,,,,,,,,,,,0.0599285289645195,,,,,, +35,205149,,,,,,,,,,,,0.06250087916851044,,,,,, +35,205199,,,,,,,,,,,,0.066553495824337,,,,,, +35,205249,,,,,,,,,,,,0.06662513315677643,,,,,, +35,205299,,,,,,,,,,,,0.06544951349496841,,,,,, +35,205349,,,,,,,,,,,,0.0689469426870346,,,,,, +35,205399,,,,,,,,,,,,0.058958567678928375,,,,,, +35,205449,,,,,,,,,,,,0.06749318540096283,,,,,, +35,205499,,,,,,,,,,,,0.06275644898414612,,,,,, +35,205549,,,,,,,,,,,,0.0622277595102787,,,,,, +35,205599,,,,,,,,,,,,0.06452104449272156,,,,,, +35,205649,,,,,,,,,,,,0.06928546726703644,,,,,, +35,205699,,,,,,,,,,,,0.06658950448036194,,,,,, +35,205749,,,,,,,,,,,,0.07508460432291031,,,,,, +35,205799,,,,,,,,,,,,0.05898863077163696,,,,,, +35,205849,,,,,,,,,,,,0.060951463878154755,,,,,, +35,205899,,,,,,,,,,,,0.06907331198453903,,,,,, +35,205949,,,,,,,,,,,,0.05824068933725357,,,,,, +35,205999,,,,,,,,,,,,0.06822790205478668,,,,,, +35,206049,,,,,,,,,,,,0.07325276732444763,,,,,, +35,206099,,,,,,,,,,,,0.06600971519947052,,,,,, +35,206149,,,,,,,,,,,,0.06498207896947861,,,,,, +35,206199,,,,,,,,,,,,0.07063321769237518,,,,,, +35,206249,,,,,,,,,,,,0.07112129032611847,,,,,, +35,206299,,,,,,,,,,,,0.06517566740512848,,,,,, +35,206349,,,,,,,,,,,,0.06380069255828857,,,,,, +35,206399,,,,,,,,,,,,0.06239056587219238,,,,,, +35,206449,,,,,,,,,,,,0.052871111780405045,,,,,, +35,206495,,,,,,,,,,,,,0.24618445336818695,0.08711044490337372,0.21201092004776,-0.056897640228271484,0.21886591613292694,0.08711044490337372 +35,206495,,,,,,,0.21568039059638977,0.06608466804027557,0.4489031434059143,0.20149952173233032,0.4264450967311859,,,,,,, +36,206499,,,,,,,,,,,,0.07104764878749847,,,,,, +36,206549,,,,,,,,,,,,0.06818275898694992,,,,,, +36,206599,,,,,,,,,,,,0.06842951476573944,,,,,, +36,206649,,,,,,,,,,,,0.05843737721443176,,,,,, +36,206699,,,,,,,,,,,,0.0640682578086853,,,,,, +36,206749,,,,,,,,,,,,0.07786688208580017,,,,,, +36,206799,,,,,,,,,,,,0.05892569571733475,,,,,, +36,206849,,,,,,,,,,,,0.06983967870473862,,,,,, +36,206899,,,,,,,,,,,,0.07314905524253845,,,,,, +36,206949,,,,,,,,,,,,0.06196329742670059,,,,,, +36,206999,,,,,,,,,,,,0.06275530159473419,,,,,, +36,207049,,,,,,,,,,,,0.07432376593351364,,,,,, +36,207099,,,,,,,,,,,,0.05851919203996658,,,,,, +36,207149,,,,,,,,,,,,0.06777846813201904,,,,,, +36,207199,,,,,,,,,,,,0.059411607682704926,,,,,, +36,207249,,,,,,,,,,,,0.07625161856412888,,,,,, +36,207299,,,,,,,,,,,,0.06215353310108185,,,,,, +36,207349,,,,,,,,,,,,0.06062531843781471,,,,,, +36,207399,,,,,,,,,,,,0.07427388429641724,,,,,, +36,207449,,,,,,,,,,,,0.06083805859088898,,,,,, +36,207499,,,,,,,,,,,,0.0730002373456955,,,,,, +36,207549,,,,,,,,,,,,0.07498186826705933,,,,,, +36,207599,,,,,,,,,,,,0.06748528778553009,,,,,, +36,207649,,,,,,,,,,,,0.07633589953184128,,,,,, +36,207699,,,,,,,,,,,,0.060877975076436996,,,,,, +36,207749,,,,,,,,,,,,0.06566676497459412,,,,,, +36,207799,,,,,,,,,,,,0.06485690176486969,,,,,, +36,207849,,,,,,,,,,,,0.06199824810028076,,,,,, +36,207899,,,,,,,,,,,,0.06491276621818542,,,,,, +36,207949,,,,,,,,,,,,0.050530463457107544,,,,,, +36,207999,,,,,,,,,,,,0.06519709527492523,,,,,, +36,208049,,,,,,,,,,,,0.07178228348493576,,,,,, +36,208099,,,,,,,,,,,,0.07737065851688385,,,,,, +36,208149,,,,,,,,,,,,0.06538864225149155,,,,,, +36,208199,,,,,,,,,,,,0.05989879369735718,,,,,, +36,208249,,,,,,,,,,,,0.05228395387530327,,,,,, +36,208299,,,,,,,,,,,,0.05969308316707611,,,,,, +36,208349,,,,,,,,,,,,0.05708038806915283,,,,,, +36,208399,,,,,,,,,,,,0.05955730378627777,,,,,, +36,208449,,,,,,,,,,,,0.06267669051885605,,,,,, +36,208499,,,,,,,,,,,,0.0610477589070797,,,,,, +36,208549,,,,,,,,,,,,0.056888554245233536,,,,,, +36,208599,,,,,,,,,,,,0.06412164866924286,,,,,, +36,208649,,,,,,,,,,,,0.0765174925327301,,,,,, +36,208699,,,,,,,,,,,,0.06458866596221924,,,,,, +36,208749,,,,,,,,,,,,0.0709754228591919,,,,,, +36,208799,,,,,,,,,,,,0.06340115517377853,,,,,, +36,208849,,,,,,,,,,,,0.05950971320271492,,,,,, +36,208899,,,,,,,,,,,,0.0677199512720108,,,,,, +36,208949,,,,,,,,,,,,0.06449955701828003,,,,,, +36,208999,,,,,,,,,,,,0.07422403246164322,,,,,, +36,209049,,,,,,,,,,,,0.07260796427726746,,,,,, +36,209099,,,,,,,,,,,,0.05628237873315811,,,,,, +36,209149,,,,,,,,,,,,0.05976983532309532,,,,,, +36,209199,,,,,,,,,,,,0.06758908927440643,,,,,, +36,209249,,,,,,,,,,,,0.06311329454183578,,,,,, +36,209299,,,,,,,,,,,,0.07604440301656723,,,,,, +36,209349,,,,,,,,,,,,0.06438036262989044,,,,,, +36,209399,,,,,,,,,,,,0.06781494617462158,,,,,, +36,209449,,,,,,,,,,,,0.05900053679943085,,,,,, +36,209499,,,,,,,,,,,,0.06245868280529976,,,,,, +36,209549,,,,,,,,,,,,0.07075583934783936,,,,,, +36,209599,,,,,,,,,,,,0.06780488789081573,,,,,, +36,209649,,,,,,,,,,,,0.067427858710289,,,,,, +36,209699,,,,,,,,,,,,0.06893135607242584,,,,,, +36,209749,,,,,,,,,,,,0.062274396419525146,,,,,, +36,209799,,,,,,,,,,,,0.06377142667770386,,,,,, +36,209849,,,,,,,,,,,,0.060379303991794586,,,,,, +36,209899,,,,,,,,,,,,0.0690586268901825,,,,,, +36,209949,,,,,,,,,,,,0.06620784848928452,,,,,, +36,209999,,,,,,,,,,,,0.0664263665676117,,,,,, +36,210049,,,,,,,,,,,,0.05939161032438278,,,,,, +36,210099,,,,,,,,,,,,0.07894928753376007,,,,,, +36,210149,,,,,,,,,,,,0.068601593375206,,,,,, +36,210199,,,,,,,,,,,,0.07026523351669312,,,,,, +36,210249,,,,,,,,,,,,0.07123199105262756,,,,,, +36,210299,,,,,,,,,,,,0.07309680432081223,,,,,, +36,210349,,,,,,,,,,,,0.06813256442546844,,,,,, +36,210399,,,,,,,,,,,,0.07549954950809479,,,,,, +36,210449,,,,,,,,,,,,0.0633857324719429,,,,,, +36,210499,,,,,,,,,,,,0.07097742706537247,,,,,, +36,210549,,,,,,,,,,,,0.05606990307569504,,,,,, +36,210599,,,,,,,,,,,,0.07215442508459091,,,,,, +36,210649,,,,,,,,,,,,0.07515042275190353,,,,,, +36,210699,,,,,,,,,,,,0.06662309914827347,,,,,, +36,210749,,,,,,,,,,,,0.07159370183944702,,,,,, +36,210799,,,,,,,,,,,,0.07055694609880447,,,,,, +36,210849,,,,,,,,,,,,0.060552794486284256,,,,,, +36,210899,,,,,,,,,,,,0.05767820030450821,,,,,, +36,210949,,,,,,,,,,,,0.05542116239666939,,,,,, +36,210999,,,,,,,,,,,,0.06938190758228302,,,,,, +36,211049,,,,,,,,,,,,0.060272783041000366,,,,,, +36,211099,,,,,,,,,,,,0.0639965683221817,,,,,, +36,211149,,,,,,,,,,,,0.06708876043558121,,,,,, +36,211199,,,,,,,,,,,,0.07491757720708847,,,,,, +36,211249,,,,,,,,,,,,0.07423678040504456,,,,,, +36,211299,,,,,,,,,,,,0.06984633207321167,,,,,, +36,211349,,,,,,,,,,,,0.06425085663795471,,,,,, +36,211399,,,,,,,,,,,,0.07085755467414856,,,,,, +36,211449,,,,,,,,,,,,0.06912139058113098,,,,,, +36,211499,,,,,,,,,,,,0.06961689889431,,,,,, +36,211549,,,,,,,,,,,,0.062436945736408234,,,,,, +36,211599,,,,,,,,,,,,0.0698494166135788,,,,,, +36,211649,,,,,,,,,,,,0.06562785059213638,,,,,, +36,211699,,,,,,,,,,,,0.06603669375181198,,,,,, +36,211749,,,,,,,,,,,,0.06827494502067566,,,,,, +36,211799,,,,,,,,,,,,0.05524735897779465,,,,,, +36,211849,,,,,,,,,,,,0.06801348924636841,,,,,, +36,211899,,,,,,,,,,,,0.04844605177640915,,,,,, +36,211949,,,,,,,,,,,,0.0677105188369751,,,,,, +36,211999,,,,,,,,,,,,0.07531589269638062,,,,,, +36,212049,,,,,,,,,,,,0.0652063637971878,,,,,, +36,212099,,,,,,,,,,,,0.06218399479985237,,,,,, +36,212149,,,,,,,,,,,,0.06939616799354553,,,,,, +36,212199,,,,,,,,,,,,0.05281483754515648,,,,,, +36,212231,,,,,,,,,,,,,0.24323123693466187,0.08396804332733154,0.20688994228839874,-0.01877140998840332,0.21419090032577515,0.08396804332733154 +36,212231,,,,,,,0.21549944579601288,0.06600058823823929,0.4500308632850647,0.2025328278541565,0.4271358251571655,,,,,,, +37,212249,,,,,,,,,,,,0.06928941607475281,,,,,, +37,212299,,,,,,,,,,,,0.07050890475511551,,,,,, +37,212349,,,,,,,,,,,,0.05491231381893158,,,,,, +37,212399,,,,,,,,,,,,0.06753093004226685,,,,,, +37,212449,,,,,,,,,,,,0.06410358846187592,,,,,, +37,212499,,,,,,,,,,,,0.062450286000967026,,,,,, +37,212549,,,,,,,,,,,,0.0701441541314125,,,,,, +37,212599,,,,,,,,,,,,0.05650126188993454,,,,,, +37,212649,,,,,,,,,,,,0.06281496584415436,,,,,, +37,212699,,,,,,,,,,,,0.059219297021627426,,,,,, +37,212749,,,,,,,,,,,,0.06723007559776306,,,,,, +37,212799,,,,,,,,,,,,0.0724068209528923,,,,,, +37,212849,,,,,,,,,,,,0.07570014148950577,,,,,, +37,212899,,,,,,,,,,,,0.06406331062316895,,,,,, +37,212949,,,,,,,,,,,,0.07564593106508255,,,,,, +37,212999,,,,,,,,,,,,0.06965920329093933,,,,,, +37,213049,,,,,,,,,,,,0.05640944838523865,,,,,, +37,213099,,,,,,,,,,,,0.06150508299469948,,,,,, +37,213149,,,,,,,,,,,,0.05931035429239273,,,,,, +37,213199,,,,,,,,,,,,0.06595506519079208,,,,,, +37,213249,,,,,,,,,,,,0.06303492933511734,,,,,, +37,213299,,,,,,,,,,,,0.061306603252887726,,,,,, +37,213349,,,,,,,,,,,,0.06329347938299179,,,,,, +37,213399,,,,,,,,,,,,0.053593769669532776,,,,,, +37,213449,,,,,,,,,,,,0.07172530144453049,,,,,, +37,213499,,,,,,,,,,,,0.07779663056135178,,,,,, +37,213549,,,,,,,,,,,,0.06644085794687271,,,,,, +37,213599,,,,,,,,,,,,0.0660010501742363,,,,,, +37,213649,,,,,,,,,,,,0.06775852292776108,,,,,, +37,213699,,,,,,,,,,,,0.07020977139472961,,,,,, +37,213749,,,,,,,,,,,,0.05727443844079971,,,,,, +37,213799,,,,,,,,,,,,0.05919624865055084,,,,,, +37,213849,,,,,,,,,,,,0.06550876796245575,,,,,, +37,213899,,,,,,,,,,,,0.06311948597431183,,,,,, +37,213949,,,,,,,,,,,,0.07041528075933456,,,,,, +37,213999,,,,,,,,,,,,0.07154233753681183,,,,,, +37,214049,,,,,,,,,,,,0.06774802505970001,,,,,, +37,214099,,,,,,,,,,,,0.07122713327407837,,,,,, +37,214149,,,,,,,,,,,,0.06641252338886261,,,,,, +37,214199,,,,,,,,,,,,0.07531780004501343,,,,,, +37,214249,,,,,,,,,,,,0.06822752952575684,,,,,, +37,214299,,,,,,,,,,,,0.05908650904893875,,,,,, +37,214349,,,,,,,,,,,,0.0687280148267746,,,,,, +37,214399,,,,,,,,,,,,0.06808269023895264,,,,,, +37,214449,,,,,,,,,,,,0.04883784428238869,,,,,, +37,214499,,,,,,,,,,,,0.06878428161144257,,,,,, +37,214549,,,,,,,,,,,,0.06545430421829224,,,,,, +37,214599,,,,,,,,,,,,0.06900299340486526,,,,,, +37,214649,,,,,,,,,,,,0.06357593089342117,,,,,, +37,214699,,,,,,,,,,,,0.06526605784893036,,,,,, +37,214749,,,,,,,,,,,,0.057473938912153244,,,,,, +37,214799,,,,,,,,,,,,0.06999291479587555,,,,,, +37,214849,,,,,,,,,,,,0.08170753717422485,,,,,, +37,214899,,,,,,,,,,,,0.06955801695585251,,,,,, +37,214949,,,,,,,,,,,,0.0589287132024765,,,,,, +37,214999,,,,,,,,,,,,0.07368860393762589,,,,,, +37,215049,,,,,,,,,,,,0.06288248300552368,,,,,, +37,215099,,,,,,,,,,,,0.06952496618032455,,,,,, +37,215149,,,,,,,,,,,,0.07248428463935852,,,,,, +37,215199,,,,,,,,,,,,0.0687844380736351,,,,,, +37,215249,,,,,,,,,,,,0.06607406586408615,,,,,, +37,215299,,,,,,,,,,,,0.06473422050476074,,,,,, +37,215349,,,,,,,,,,,,0.06903627514839172,,,,,, +37,215399,,,,,,,,,,,,0.07756149023771286,,,,,, +37,215449,,,,,,,,,,,,0.052828554064035416,,,,,, +37,215499,,,,,,,,,,,,0.07181508094072342,,,,,, +37,215549,,,,,,,,,,,,0.08325660228729248,,,,,, +37,215599,,,,,,,,,,,,0.06593738496303558,,,,,, +37,215649,,,,,,,,,,,,0.07297784835100174,,,,,, +37,215699,,,,,,,,,,,,0.0697202980518341,,,,,, +37,215749,,,,,,,,,,,,0.06283329427242279,,,,,, +37,215799,,,,,,,,,,,,0.061341721564531326,,,,,, +37,215849,,,,,,,,,,,,0.08297383785247803,,,,,, +37,215899,,,,,,,,,,,,0.07697662711143494,,,,,, +37,215949,,,,,,,,,,,,0.0731719583272934,,,,,, +37,215999,,,,,,,,,,,,0.06751568615436554,,,,,, +37,216049,,,,,,,,,,,,0.06458060443401337,,,,,, +37,216099,,,,,,,,,,,,0.057474106550216675,,,,,, +37,216149,,,,,,,,,,,,0.07491026818752289,,,,,, +37,216199,,,,,,,,,,,,0.06842953711748123,,,,,, +37,216249,,,,,,,,,,,,0.06205179542303085,,,,,, +37,216299,,,,,,,,,,,,0.06764157116413116,,,,,, +37,216349,,,,,,,,,,,,0.06214112043380737,,,,,, +37,216399,,,,,,,,,,,,0.06564889848232269,,,,,, +37,216449,,,,,,,,,,,,0.06308566778898239,,,,,, +37,216499,,,,,,,,,,,,0.0717865377664566,,,,,, +37,216549,,,,,,,,,,,,0.07052735239267349,,,,,, +37,216599,,,,,,,,,,,,0.06241392716765404,,,,,, +37,216649,,,,,,,,,,,,0.07518471032381058,,,,,, +37,216699,,,,,,,,,,,,0.05577697604894638,,,,,, +37,216749,,,,,,,,,,,,0.05853454768657684,,,,,, +37,216799,,,,,,,,,,,,0.061065129935741425,,,,,, +37,216849,,,,,,,,,,,,0.07567816972732544,,,,,, +37,216899,,,,,,,,,,,,0.06859847903251648,,,,,, +37,216949,,,,,,,,,,,,0.059200726449489594,,,,,, +37,216999,,,,,,,,,,,,0.06641829013824463,,,,,, +37,217049,,,,,,,,,,,,0.06998483836650848,,,,,, +37,217099,,,,,,,,,,,,0.068976029753685,,,,,, +37,217149,,,,,,,,,,,,0.06561270356178284,,,,,, +37,217199,,,,,,,,,,,,0.07958458364009857,,,,,, +37,217249,,,,,,,,,,,,0.06671299040317535,,,,,, +37,217299,,,,,,,,,,,,0.06635148823261261,,,,,, +37,217349,,,,,,,,,,,,0.07175029069185257,,,,,, +37,217399,,,,,,,,,,,,0.08028224110603333,,,,,, +37,217449,,,,,,,,,,,,0.07738353312015533,,,,,, +37,217499,,,,,,,,,,,,0.052665483206510544,,,,,, +37,217549,,,,,,,,,,,,0.06167780980467796,,,,,, +37,217599,,,,,,,,,,,,0.06502597033977509,,,,,, +37,217649,,,,,,,,,,,,0.06476116180419922,,,,,, +37,217699,,,,,,,,,,,,0.07316894829273224,,,,,, +37,217749,,,,,,,,,,,,0.06120442599058151,,,,,, +37,217799,,,,,,,,,,,,0.08048389852046967,,,,,, +37,217849,,,,,,,,,,,,0.06375295668840408,,,,,, +37,217899,,,,,,,,,,,,0.062434934079647064,,,,,, +37,217949,,,,,,,,,,,,0.0568963885307312,,,,,, +37,217967,,,,,,,,,,,,,0.24703288078308105,0.08755555003881454,0.1996813416481018,-0.06229805946350098,0.20863667130470276,0.08755555003881454 +37,217967,,,,,,,0.215340256690979,0.0658889189362526,0.4515250623226166,0.20387595891952515,0.4283694922924042,,,,,,, +38,217999,,,,,,,,,,,,0.06779320538043976,,,,,, +38,218049,,,,,,,,,,,,0.0598769336938858,,,,,, +38,218099,,,,,,,,,,,,0.059497956186532974,,,,,, +38,218149,,,,,,,,,,,,0.06660044193267822,,,,,, +38,218199,,,,,,,,,,,,0.06241345405578613,,,,,, +38,218249,,,,,,,,,,,,0.06041891500353813,,,,,, +38,218299,,,,,,,,,,,,0.06342518329620361,,,,,, +38,218349,,,,,,,,,,,,0.07407350093126297,,,,,, +38,218399,,,,,,,,,,,,0.06098410487174988,,,,,, +38,218449,,,,,,,,,,,,0.06296470761299133,,,,,, +38,218499,,,,,,,,,,,,0.062024667859077454,,,,,, +38,218549,,,,,,,,,,,,0.05966495722532272,,,,,, +38,218599,,,,,,,,,,,,0.06297939270734787,,,,,, +38,218649,,,,,,,,,,,,0.06028222292661667,,,,,, +38,218699,,,,,,,,,,,,0.069756880402565,,,,,, +38,218749,,,,,,,,,,,,0.06705395132303238,,,,,, +38,218799,,,,,,,,,,,,0.0617542639374733,,,,,, +38,218849,,,,,,,,,,,,0.06689468026161194,,,,,, +38,218899,,,,,,,,,,,,0.07073492556810379,,,,,, +38,218949,,,,,,,,,,,,0.06713179498910904,,,,,, +38,218999,,,,,,,,,,,,0.06536063551902771,,,,,, +38,219049,,,,,,,,,,,,0.06699645519256592,,,,,, +38,219099,,,,,,,,,,,,0.06392698734998703,,,,,, +38,219149,,,,,,,,,,,,0.05936136096715927,,,,,, +38,219199,,,,,,,,,,,,0.07323132455348969,,,,,, +38,219249,,,,,,,,,,,,0.054237063974142075,,,,,, +38,219299,,,,,,,,,,,,0.05716217681765556,,,,,, +38,219349,,,,,,,,,,,,0.06651140004396439,,,,,, +38,219399,,,,,,,,,,,,0.08014212548732758,,,,,, +38,219449,,,,,,,,,,,,0.0724366307258606,,,,,, +38,219499,,,,,,,,,,,,0.06051831692457199,,,,,, +38,219549,,,,,,,,,,,,0.07351937890052795,,,,,, +38,219599,,,,,,,,,,,,0.06528347730636597,,,,,, +38,219649,,,,,,,,,,,,0.06684817373752594,,,,,, +38,219699,,,,,,,,,,,,0.058770887553691864,,,,,, +38,219749,,,,,,,,,,,,0.05957241356372833,,,,,, +38,219799,,,,,,,,,,,,0.07326754927635193,,,,,, +38,219849,,,,,,,,,,,,0.06324894726276398,,,,,, +38,219899,,,,,,,,,,,,0.06861512362957001,,,,,, +38,219949,,,,,,,,,,,,0.06086017191410065,,,,,, +38,219999,,,,,,,,,,,,0.05534711480140686,,,,,, +38,220049,,,,,,,,,,,,0.0627322569489479,,,,,, +38,220099,,,,,,,,,,,,0.06408168375492096,,,,,, +38,220149,,,,,,,,,,,,0.06027629226446152,,,,,, +38,220199,,,,,,,,,,,,0.06835119426250458,,,,,, +38,220249,,,,,,,,,,,,0.07271447032690048,,,,,, +38,220299,,,,,,,,,,,,0.06252927333116531,,,,,, +38,220349,,,,,,,,,,,,0.0766826719045639,,,,,, +38,220399,,,,,,,,,,,,0.07355070114135742,,,,,, +38,220449,,,,,,,,,,,,0.06524284929037094,,,,,, +38,220499,,,,,,,,,,,,0.06316684186458588,,,,,, +38,220549,,,,,,,,,,,,0.06366685777902603,,,,,, +38,220599,,,,,,,,,,,,0.07354478538036346,,,,,, +38,220649,,,,,,,,,,,,0.06072727590799332,,,,,, +38,220699,,,,,,,,,,,,0.06696966290473938,,,,,, +38,220749,,,,,,,,,,,,0.05239143595099449,,,,,, +38,220799,,,,,,,,,,,,0.05694900453090668,,,,,, +38,220849,,,,,,,,,,,,0.07050829380750656,,,,,, +38,220899,,,,,,,,,,,,0.06516765058040619,,,,,, +38,220949,,,,,,,,,,,,0.06430163234472275,,,,,, +38,220999,,,,,,,,,,,,0.07317589223384857,,,,,, +38,221049,,,,,,,,,,,,0.07393542677164078,,,,,, +38,221099,,,,,,,,,,,,0.0860055685043335,,,,,, +38,221149,,,,,,,,,,,,0.06010439991950989,,,,,, +38,221199,,,,,,,,,,,,0.06301786750555038,,,,,, +38,221249,,,,,,,,,,,,0.058201421052217484,,,,,, +38,221299,,,,,,,,,,,,0.06484586745500565,,,,,, +38,221349,,,,,,,,,,,,0.07071051746606827,,,,,, +38,221399,,,,,,,,,,,,0.06540337204933167,,,,,, +38,221449,,,,,,,,,,,,0.071747325360775,,,,,, +38,221499,,,,,,,,,,,,0.05906658619642258,,,,,, +38,221549,,,,,,,,,,,,0.06919321417808533,,,,,, +38,221599,,,,,,,,,,,,0.060406506061553955,,,,,, +38,221649,,,,,,,,,,,,0.08093307167291641,,,,,, +38,221699,,,,,,,,,,,,0.06179369240999222,,,,,, +38,221749,,,,,,,,,,,,0.062620609998703,,,,,, +38,221799,,,,,,,,,,,,0.07711680978536606,,,,,, +38,221849,,,,,,,,,,,,0.0661134272813797,,,,,, +38,221899,,,,,,,,,,,,0.05705206096172333,,,,,, +38,221949,,,,,,,,,,,,0.07071934640407562,,,,,, +38,221999,,,,,,,,,,,,0.05474879592657089,,,,,, +38,222049,,,,,,,,,,,,0.06881211698055267,,,,,, +38,222099,,,,,,,,,,,,0.06903718411922455,,,,,, +38,222149,,,,,,,,,,,,0.06086283177137375,,,,,, +38,222199,,,,,,,,,,,,0.071413055062294,,,,,, +38,222249,,,,,,,,,,,,0.06309205293655396,,,,,, +38,222299,,,,,,,,,,,,0.0653793066740036,,,,,, +38,222349,,,,,,,,,,,,0.06150820851325989,,,,,, +38,222399,,,,,,,,,,,,0.07437863945960999,,,,,, +38,222449,,,,,,,,,,,,0.06832139194011688,,,,,, +38,222499,,,,,,,,,,,,0.06856145709753036,,,,,, +38,222549,,,,,,,,,,,,0.05897946655750275,,,,,, +38,222599,,,,,,,,,,,,0.06781771779060364,,,,,, +38,222649,,,,,,,,,,,,0.06864947080612183,,,,,, +38,222699,,,,,,,,,,,,0.07168443500995636,,,,,, +38,222749,,,,,,,,,,,,0.07729525864124298,,,,,, +38,222799,,,,,,,,,,,,0.05275707319378853,,,,,, +38,222849,,,,,,,,,,,,0.06262695789337158,,,,,, +38,222899,,,,,,,,,,,,0.06084051355719566,,,,,, +38,222949,,,,,,,,,,,,0.07638970017433167,,,,,, +38,222999,,,,,,,,,,,,0.05906815081834793,,,,,, +38,223049,,,,,,,,,,,,0.0643153190612793,,,,,, +38,223099,,,,,,,,,,,,0.07493066787719727,,,,,, +38,223149,,,,,,,,,,,,0.08008842915296555,,,,,, +38,223199,,,,,,,,,,,,0.06656067073345184,,,,,, +38,223249,,,,,,,,,,,,0.071647509932518,,,,,, +38,223299,,,,,,,,,,,,0.08413580060005188,,,,,, +38,223349,,,,,,,,,,,,0.056059472262859344,,,,,, +38,223399,,,,,,,,,,,,0.06812476366758347,,,,,, +38,223449,,,,,,,,,,,,0.06628285348415375,,,,,, +38,223499,,,,,,,,,,,,0.0649913102388382,,,,,, +38,223549,,,,,,,,,,,,0.06477688997983932,,,,,, +38,223599,,,,,,,,,,,,0.07050219178199768,,,,,, +38,223649,,,,,,,,,,,,0.05783415585756302,,,,,, +38,223699,,,,,,,,,,,,0.07124967873096466,,,,,, +38,223703,,,,,,,,,,,,,0.24561189115047455,0.08638216555118561,0.2011028528213501,-0.048061490058898926,0.20861679315567017,0.08638216555118561 +38,223703,,,,,,,0.21496203541755676,0.06587139517068863,0.4517837166786194,0.20408236980438232,0.430626779794693,,,,,,, +39,223749,,,,,,,,,,,,0.06343469768762589,,,,,, +39,223799,,,,,,,,,,,,0.07602842152118683,,,,,, +39,223849,,,,,,,,,,,,0.05858194828033447,,,,,, +39,223899,,,,,,,,,,,,0.07477951794862747,,,,,, +39,223949,,,,,,,,,,,,0.07284830510616302,,,,,, +39,223999,,,,,,,,,,,,0.07224661111831665,,,,,, +39,224049,,,,,,,,,,,,0.07114468514919281,,,,,, +39,224099,,,,,,,,,,,,0.06676969677209854,,,,,, +39,224149,,,,,,,,,,,,0.06985285878181458,,,,,, +39,224199,,,,,,,,,,,,0.06909562647342682,,,,,, +39,224249,,,,,,,,,,,,0.06458954513072968,,,,,, +39,224299,,,,,,,,,,,,0.05639050528407097,,,,,, +39,224349,,,,,,,,,,,,0.059352122247219086,,,,,, +39,224399,,,,,,,,,,,,0.0652041956782341,,,,,, +39,224449,,,,,,,,,,,,0.0691399797797203,,,,,, +39,224499,,,,,,,,,,,,0.06894087046384811,,,,,, +39,224549,,,,,,,,,,,,0.06069508567452431,,,,,, +39,224599,,,,,,,,,,,,0.07269003242254257,,,,,, +39,224649,,,,,,,,,,,,0.0647306963801384,,,,,, +39,224699,,,,,,,,,,,,0.06698651611804962,,,,,, +39,224749,,,,,,,,,,,,0.060701265931129456,,,,,, +39,224799,,,,,,,,,,,,0.06806650757789612,,,,,, +39,224849,,,,,,,,,,,,0.07970194518566132,,,,,, +39,224899,,,,,,,,,,,,0.05727267265319824,,,,,, +39,224949,,,,,,,,,,,,0.06161937862634659,,,,,, +39,224999,,,,,,,,,,,,0.06529805809259415,,,,,, +39,225049,,,,,,,,,,,,0.06637556105852127,,,,,, +39,225099,,,,,,,,,,,,0.06591251492500305,,,,,, +39,225149,,,,,,,,,,,,0.06651964783668518,,,,,, +39,225199,,,,,,,,,,,,0.06704464554786682,,,,,, +39,225249,,,,,,,,,,,,0.06925566494464874,,,,,, +39,225299,,,,,,,,,,,,0.05960584059357643,,,,,, +39,225349,,,,,,,,,,,,0.06262174993753433,,,,,, +39,225399,,,,,,,,,,,,0.07330410182476044,,,,,, +39,225449,,,,,,,,,,,,0.06661386787891388,,,,,, +39,225499,,,,,,,,,,,,0.06688490509986877,,,,,, +39,225549,,,,,,,,,,,,0.06377419829368591,,,,,, +39,225599,,,,,,,,,,,,0.061067190021276474,,,,,, +39,225649,,,,,,,,,,,,0.06752333045005798,,,,,, +39,225699,,,,,,,,,,,,0.06448232382535934,,,,,, +39,225749,,,,,,,,,,,,0.07224313169717789,,,,,, +39,225799,,,,,,,,,,,,0.0776386708021164,,,,,, +39,225849,,,,,,,,,,,,0.054890137165784836,,,,,, +39,225899,,,,,,,,,,,,0.06816820800304413,,,,,, +39,225949,,,,,,,,,,,,0.07084311544895172,,,,,, +39,225999,,,,,,,,,,,,0.0700962096452713,,,,,, +39,226049,,,,,,,,,,,,0.06036870554089546,,,,,, +39,226099,,,,,,,,,,,,0.07034048438072205,,,,,, +39,226149,,,,,,,,,,,,0.07528278231620789,,,,,, +39,226199,,,,,,,,,,,,0.07121080160140991,,,,,, +39,226249,,,,,,,,,,,,0.06624578684568405,,,,,, +39,226299,,,,,,,,,,,,0.06834157556295395,,,,,, +39,226349,,,,,,,,,,,,0.07982365787029266,,,,,, +39,226399,,,,,,,,,,,,0.06648668646812439,,,,,, +39,226449,,,,,,,,,,,,0.06870561838150024,,,,,, +39,226499,,,,,,,,,,,,0.0654541477560997,,,,,, +39,226549,,,,,,,,,,,,0.062301382422447205,,,,,, +39,226599,,,,,,,,,,,,0.06062624976038933,,,,,, +39,226649,,,,,,,,,,,,0.07311734557151794,,,,,, +39,226699,,,,,,,,,,,,0.06533140689134598,,,,,, +39,226749,,,,,,,,,,,,0.07481861114501953,,,,,, +39,226799,,,,,,,,,,,,0.062088608741760254,,,,,, +39,226849,,,,,,,,,,,,0.0664888396859169,,,,,, +39,226899,,,,,,,,,,,,0.068772092461586,,,,,, +39,226949,,,,,,,,,,,,0.06066189706325531,,,,,, +39,226999,,,,,,,,,,,,0.07378070056438446,,,,,, +39,227049,,,,,,,,,,,,0.06915569305419922,,,,,, +39,227099,,,,,,,,,,,,0.0603121854364872,,,,,, +39,227149,,,,,,,,,,,,0.07235953211784363,,,,,, +39,227199,,,,,,,,,,,,0.05961661413311958,,,,,, +39,227249,,,,,,,,,,,,0.07153640687465668,,,,,, +39,227299,,,,,,,,,,,,0.06400050222873688,,,,,, +39,227349,,,,,,,,,,,,0.06935209780931473,,,,,, +39,227399,,,,,,,,,,,,0.06608385592699051,,,,,, +39,227449,,,,,,,,,,,,0.06435559689998627,,,,,, +39,227499,,,,,,,,,,,,0.068962462246418,,,,,, +39,227549,,,,,,,,,,,,0.07012396305799484,,,,,, +39,227599,,,,,,,,,,,,0.0625297948718071,,,,,, +39,227649,,,,,,,,,,,,0.06917820870876312,,,,,, +39,227699,,,,,,,,,,,,0.07238908112049103,,,,,, +39,227749,,,,,,,,,,,,0.06368037313222885,,,,,, +39,227799,,,,,,,,,,,,0.0664389431476593,,,,,, +39,227849,,,,,,,,,,,,0.06225431710481644,,,,,, +39,227899,,,,,,,,,,,,0.06432004272937775,,,,,, +39,227949,,,,,,,,,,,,0.06949911266565323,,,,,, +39,227999,,,,,,,,,,,,0.06574112176895142,,,,,, +39,228049,,,,,,,,,,,,0.06539686024188995,,,,,, +39,228099,,,,,,,,,,,,0.06642571091651917,,,,,, +39,228149,,,,,,,,,,,,0.05802026018500328,,,,,, +39,228199,,,,,,,,,,,,0.06391151249408722,,,,,, +39,228249,,,,,,,,,,,,0.0676812082529068,,,,,, +39,228299,,,,,,,,,,,,0.06124061718583107,,,,,, +39,228349,,,,,,,,,,,,0.052784040570259094,,,,,, +39,228399,,,,,,,,,,,,0.06632133573293686,,,,,, +39,228449,,,,,,,,,,,,0.05794806033372879,,,,,, +39,228499,,,,,,,,,,,,0.06727421283721924,,,,,, +39,228549,,,,,,,,,,,,0.06423386931419373,,,,,, +39,228599,,,,,,,,,,,,0.08181624114513397,,,,,, +39,228649,,,,,,,,,,,,0.06686700135469437,,,,,, +39,228699,,,,,,,,,,,,0.07118773460388184,,,,,, +39,228749,,,,,,,,,,,,0.08375118672847748,,,,,, +39,228799,,,,,,,,,,,,0.07255503535270691,,,,,, +39,228849,,,,,,,,,,,,0.0646791011095047,,,,,, +39,228899,,,,,,,,,,,,0.06711706519126892,,,,,, +39,228949,,,,,,,,,,,,0.06659473478794098,,,,,, +39,228999,,,,,,,,,,,,0.06766650080680847,,,,,, +39,229049,,,,,,,,,,,,0.06365536153316498,,,,,, +39,229099,,,,,,,,,,,,0.05874878913164139,,,,,, +39,229149,,,,,,,,,,,,0.07050837576389313,,,,,, +39,229199,,,,,,,,,,,,0.06430808454751968,,,,,, +39,229249,,,,,,,,,,,,0.07267196476459503,,,,,, +39,229299,,,,,,,,,,,,0.06931249797344208,,,,,, +39,229349,,,,,,,,,,,,0.07171425223350525,,,,,, +39,229399,,,,,,,,,,,,0.06659678369760513,,,,,, +39,229439,,,,,,,,,,,,,0.24830485880374908,0.0887497216463089,0.20029373466968536,-0.07678675651550293,0.207816481590271,0.0887497216463089 +39,229439,,,,,,,0.2149486392736435,0.06571456044912338,0.45385071635246277,0.2059725522994995,0.43060049414634705,,,,,,, +40,229449,,,,,,,,,,,,0.07828890532255173,,,,,, +40,229499,,,,,,,,,,,,0.06194140762090683,,,,,, +40,229549,,,,,,,,,,,,0.070736363530159,,,,,, +40,229599,,,,,,,,,,,,0.07383019477128983,,,,,, +40,229649,,,,,,,,,,,,0.07556509971618652,,,,,, +40,229699,,,,,,,,,,,,0.06282766163349152,,,,,, +40,229749,,,,,,,,,,,,0.0554371252655983,,,,,, +40,229799,,,,,,,,,,,,0.07426930963993073,,,,,, +40,229849,,,,,,,,,,,,0.07501015067100525,,,,,, +40,229899,,,,,,,,,,,,0.06293438374996185,,,,,, +40,229949,,,,,,,,,,,,0.06499825417995453,,,,,, +40,229999,,,,,,,,,,,,0.056085363030433655,,,,,, +40,230049,,,,,,,,,,,,0.07242435216903687,,,,,, +40,230099,,,,,,,,,,,,0.05692538991570473,,,,,, +40,230149,,,,,,,,,,,,0.07100461423397064,,,,,, +40,230199,,,,,,,,,,,,0.0632285624742508,,,,,, +40,230249,,,,,,,,,,,,0.06790801882743835,,,,,, +40,230299,,,,,,,,,,,,0.05768664926290512,,,,,, +40,230349,,,,,,,,,,,,0.07983401417732239,,,,,, +40,230399,,,,,,,,,,,,0.06543971598148346,,,,,, +40,230449,,,,,,,,,,,,0.04983675107359886,,,,,, +40,230499,,,,,,,,,,,,0.07412799447774887,,,,,, +40,230549,,,,,,,,,,,,0.06925521045923233,,,,,, +40,230599,,,,,,,,,,,,0.059534721076488495,,,,,, +40,230649,,,,,,,,,,,,0.0714622437953949,,,,,, +40,230699,,,,,,,,,,,,0.07293204218149185,,,,,, +40,230749,,,,,,,,,,,,0.06680005043745041,,,,,, +40,230799,,,,,,,,,,,,0.06842895597219467,,,,,, +40,230849,,,,,,,,,,,,0.058166518807411194,,,,,, +40,230899,,,,,,,,,,,,0.06616690009832382,,,,,, +40,230949,,,,,,,,,,,,0.06569623202085495,,,,,, +40,230999,,,,,,,,,,,,0.06698067486286163,,,,,, +40,231049,,,,,,,,,,,,0.05458835884928703,,,,,, +40,231099,,,,,,,,,,,,0.05850937217473984,,,,,, +40,231149,,,,,,,,,,,,0.07222536206245422,,,,,, +40,231199,,,,,,,,,,,,0.06446173787117004,,,,,, +40,231249,,,,,,,,,,,,0.07167857885360718,,,,,, +40,231299,,,,,,,,,,,,0.06632375717163086,,,,,, +40,231349,,,,,,,,,,,,0.06607121229171753,,,,,, +40,231399,,,,,,,,,,,,0.07382716238498688,,,,,, +40,231449,,,,,,,,,,,,0.06265175342559814,,,,,, +40,231499,,,,,,,,,,,,0.06727349013090134,,,,,, +40,231549,,,,,,,,,,,,0.05868334695696831,,,,,, +40,231599,,,,,,,,,,,,0.07147862017154694,,,,,, +40,231649,,,,,,,,,,,,0.05808038264513016,,,,,, +40,231699,,,,,,,,,,,,0.06165804713964462,,,,,, +40,231749,,,,,,,,,,,,0.06539216637611389,,,,,, +40,231799,,,,,,,,,,,,0.06680165231227875,,,,,, +40,231849,,,,,,,,,,,,0.061277199536561966,,,,,, +40,231899,,,,,,,,,,,,0.07028285413980484,,,,,, +40,231949,,,,,,,,,,,,0.07324007153511047,,,,,, +40,231999,,,,,,,,,,,,0.07202191650867462,,,,,, +40,232049,,,,,,,,,,,,0.0609062984585762,,,,,, +40,232099,,,,,,,,,,,,0.07033079117536545,,,,,, +40,232149,,,,,,,,,,,,0.060218699276447296,,,,,, +40,232199,,,,,,,,,,,,0.06287450343370438,,,,,, +40,232249,,,,,,,,,,,,0.06536602973937988,,,,,, +40,232299,,,,,,,,,,,,0.06778949499130249,,,,,, +40,232349,,,,,,,,,,,,0.06840860098600388,,,,,, +40,232399,,,,,,,,,,,,0.06846502423286438,,,,,, +40,232449,,,,,,,,,,,,0.07198284566402435,,,,,, +40,232499,,,,,,,,,,,,0.05895330756902695,,,,,, +40,232549,,,,,,,,,,,,0.07592682540416718,,,,,, +40,232599,,,,,,,,,,,,0.06985631585121155,,,,,, +40,232649,,,,,,,,,,,,0.0788530707359314,,,,,, +40,232699,,,,,,,,,,,,0.06065041571855545,,,,,, +40,232749,,,,,,,,,,,,0.07278790324926376,,,,,, +40,232799,,,,,,,,,,,,0.06515124440193176,,,,,, +40,232849,,,,,,,,,,,,0.07070602476596832,,,,,, +40,232899,,,,,,,,,,,,0.05808123201131821,,,,,, +40,232949,,,,,,,,,,,,0.05922195315361023,,,,,, +40,232999,,,,,,,,,,,,0.06058920919895172,,,,,, +40,233049,,,,,,,,,,,,0.0685528814792633,,,,,, +40,233099,,,,,,,,,,,,0.07071179896593094,,,,,, +40,233149,,,,,,,,,,,,0.06553304195404053,,,,,, +40,233199,,,,,,,,,,,,0.057289622724056244,,,,,, +40,233249,,,,,,,,,,,,0.06082630157470703,,,,,, +40,233299,,,,,,,,,,,,0.05929463729262352,,,,,, +40,233349,,,,,,,,,,,,0.06613964587450027,,,,,, +40,233399,,,,,,,,,,,,0.06323257833719254,,,,,, +40,233449,,,,,,,,,,,,0.05793270468711853,,,,,, +40,233499,,,,,,,,,,,,0.05597798898816109,,,,,, +40,233549,,,,,,,,,,,,0.060129471123218536,,,,,, +40,233599,,,,,,,,,,,,0.06545870006084442,,,,,, +40,233649,,,,,,,,,,,,0.07814700901508331,,,,,, +40,233699,,,,,,,,,,,,0.06093543767929077,,,,,, +40,233749,,,,,,,,,,,,0.0703045055270195,,,,,, +40,233799,,,,,,,,,,,,0.06498825550079346,,,,,, +40,233849,,,,,,,,,,,,0.0640367940068245,,,,,, +40,233899,,,,,,,,,,,,0.07386581599712372,,,,,, +40,233949,,,,,,,,,,,,0.06762155890464783,,,,,, +40,233999,,,,,,,,,,,,0.060335393995046616,,,,,, +40,234049,,,,,,,,,,,,0.07980868965387344,,,,,, +40,234099,,,,,,,,,,,,0.08136944472789764,,,,,, +40,234149,,,,,,,,,,,,0.060421690344810486,,,,,, +40,234199,,,,,,,,,,,,0.06524733453989029,,,,,, +40,234249,,,,,,,,,,,,0.07218539714813232,,,,,, +40,234299,,,,,,,,,,,,0.06549490243196487,,,,,, +40,234349,,,,,,,,,,,,0.06131657958030701,,,,,, +40,234399,,,,,,,,,,,,0.059003155678510666,,,,,, +40,234449,,,,,,,,,,,,0.06241011992096901,,,,,, +40,234499,,,,,,,,,,,,0.07340510189533234,,,,,, +40,234549,,,,,,,,,,,,0.07345227152109146,,,,,, +40,234599,,,,,,,,,,,,0.06258468329906464,,,,,, +40,234649,,,,,,,,,,,,0.057566702365875244,,,,,, +40,234699,,,,,,,,,,,,0.059101402759552,,,,,, +40,234749,,,,,,,,,,,,0.07046213001012802,,,,,, +40,234799,,,,,,,,,,,,0.06430844962596893,,,,,, +40,234849,,,,,,,,,,,,0.06919991225004196,,,,,, +40,234899,,,,,,,,,,,,0.06373470276594162,,,,,, +40,234949,,,,,,,,,,,,0.06011178717017174,,,,,, +40,234999,,,,,,,,,,,,0.07535006105899811,,,,,, +40,235049,,,,,,,,,,,,0.06397934257984161,,,,,, +40,235099,,,,,,,,,,,,0.07915811240673065,,,,,, +40,235149,,,,,,,,,,,,0.06424108147621155,,,,,, +40,235175,,,,,,,,,,,,,0.24737584590911865,0.08781929314136505,0.19891981780529022,-0.0654979944229126,0.20613710582256317,0.08781929314136505 +40,235175,,,,,,,0.2148355394601822,0.06584617495536804,0.4521285593509674,0.20439207553863525,0.4312748610973358,,,,,,, +41,235199,,,,,,,,,,,,0.078101247549057,,,,,, +41,235249,,,,,,,,,,,,0.06841304153203964,,,,,, +41,235299,,,,,,,,,,,,0.06212526559829712,,,,,, +41,235349,,,,,,,,,,,,0.06413146108388901,,,,,, +41,235399,,,,,,,,,,,,0.06009381264448166,,,,,, +41,235449,,,,,,,,,,,,0.07182878255844116,,,,,, +41,235499,,,,,,,,,,,,0.05708809942007065,,,,,, +41,235549,,,,,,,,,,,,0.0649329125881195,,,,,, +41,235599,,,,,,,,,,,,0.0662805438041687,,,,,, +41,235649,,,,,,,,,,,,0.07310289889574051,,,,,, +41,235699,,,,,,,,,,,,0.06314820051193237,,,,,, +41,235749,,,,,,,,,,,,0.06816834211349487,,,,,, +41,235799,,,,,,,,,,,,0.07471855729818344,,,,,, +41,235849,,,,,,,,,,,,0.05998235568404198,,,,,, +41,235899,,,,,,,,,,,,0.08101058006286621,,,,,, +41,235949,,,,,,,,,,,,0.06184519827365875,,,,,, +41,235999,,,,,,,,,,,,0.06611251085996628,,,,,, +41,236049,,,,,,,,,,,,0.06783078610897064,,,,,, +41,236099,,,,,,,,,,,,0.06351713836193085,,,,,, +41,236149,,,,,,,,,,,,0.047745637595653534,,,,,, +41,236199,,,,,,,,,,,,0.07288980484008789,,,,,, +41,236249,,,,,,,,,,,,0.06146673113107681,,,,,, +41,236299,,,,,,,,,,,,0.0866260677576065,,,,,, +41,236349,,,,,,,,,,,,0.04833348095417023,,,,,, +41,236399,,,,,,,,,,,,0.06709670275449753,,,,,, +41,236449,,,,,,,,,,,,0.07389642298221588,,,,,, +41,236499,,,,,,,,,,,,0.0614253468811512,,,,,, +41,236549,,,,,,,,,,,,0.07490584999322891,,,,,, +41,236599,,,,,,,,,,,,0.06116408109664917,,,,,, +41,236649,,,,,,,,,,,,0.06261458992958069,,,,,, +41,236699,,,,,,,,,,,,0.06434598565101624,,,,,, +41,236749,,,,,,,,,,,,0.06986694782972336,,,,,, +41,236799,,,,,,,,,,,,0.0577612966299057,,,,,, +41,236849,,,,,,,,,,,,0.06375766545534134,,,,,, +41,236899,,,,,,,,,,,,0.06393811851739883,,,,,, +41,236949,,,,,,,,,,,,0.08139801770448685,,,,,, +41,236999,,,,,,,,,,,,0.07616770267486572,,,,,, +41,237049,,,,,,,,,,,,0.07067108154296875,,,,,, +41,237099,,,,,,,,,,,,0.07374194264411926,,,,,, +41,237149,,,,,,,,,,,,0.05857771635055542,,,,,, +41,237199,,,,,,,,,,,,0.0726301446557045,,,,,, +41,237249,,,,,,,,,,,,0.059974804520606995,,,,,, +41,237299,,,,,,,,,,,,0.0626833587884903,,,,,, +41,237349,,,,,,,,,,,,0.0773911327123642,,,,,, +41,237399,,,,,,,,,,,,0.05946265533566475,,,,,, +41,237449,,,,,,,,,,,,0.06566262990236282,,,,,, +41,237499,,,,,,,,,,,,0.06342031061649323,,,,,, +41,237549,,,,,,,,,,,,0.0682445615530014,,,,,, +41,237599,,,,,,,,,,,,0.06944918632507324,,,,,, +41,237649,,,,,,,,,,,,0.05511853098869324,,,,,, +41,237699,,,,,,,,,,,,0.06209324672818184,,,,,, +41,237749,,,,,,,,,,,,0.06456027179956436,,,,,, +41,237799,,,,,,,,,,,,0.07125601917505264,,,,,, +41,237849,,,,,,,,,,,,0.08119216561317444,,,,,, +41,237899,,,,,,,,,,,,0.06443092226982117,,,,,, +41,237949,,,,,,,,,,,,0.05296538770198822,,,,,, +41,237999,,,,,,,,,,,,0.06388640403747559,,,,,, +41,238049,,,,,,,,,,,,0.0654388964176178,,,,,, +41,238099,,,,,,,,,,,,0.06913619488477707,,,,,, +41,238149,,,,,,,,,,,,0.06412054598331451,,,,,, +41,238199,,,,,,,,,,,,0.0659811943769455,,,,,, +41,238249,,,,,,,,,,,,0.05830526724457741,,,,,, +41,238299,,,,,,,,,,,,0.07905125617980957,,,,,, +41,238349,,,,,,,,,,,,0.06208135932683945,,,,,, +41,238399,,,,,,,,,,,,0.06219048053026199,,,,,, +41,238449,,,,,,,,,,,,0.05824541300535202,,,,,, +41,238499,,,,,,,,,,,,0.06549737602472305,,,,,, +41,238549,,,,,,,,,,,,0.06994236260652542,,,,,, +41,238599,,,,,,,,,,,,0.05986279994249344,,,,,, +41,238649,,,,,,,,,,,,0.06340295076370239,,,,,, +41,238699,,,,,,,,,,,,0.06272017955780029,,,,,, +41,238749,,,,,,,,,,,,0.05862601846456528,,,,,, +41,238799,,,,,,,,,,,,0.07412044703960419,,,,,, +41,238849,,,,,,,,,,,,0.05961731821298599,,,,,, +41,238899,,,,,,,,,,,,0.07458670437335968,,,,,, +41,238949,,,,,,,,,,,,0.06861680746078491,,,,,, +41,238999,,,,,,,,,,,,0.06340163946151733,,,,,, +41,239049,,,,,,,,,,,,0.07076345384120941,,,,,, +41,239099,,,,,,,,,,,,0.0587414987385273,,,,,, +41,239149,,,,,,,,,,,,0.06717109680175781,,,,,, +41,239199,,,,,,,,,,,,0.06450430303812027,,,,,, +41,239249,,,,,,,,,,,,0.0785549134016037,,,,,, +41,239299,,,,,,,,,,,,0.06068755313754082,,,,,, +41,239349,,,,,,,,,,,,0.06283729523420334,,,,,, +41,239399,,,,,,,,,,,,0.06542909890413284,,,,,, +41,239449,,,,,,,,,,,,0.05200575292110443,,,,,, +41,239499,,,,,,,,,,,,0.06461513787508011,,,,,, +41,239549,,,,,,,,,,,,0.0636502131819725,,,,,, +41,239599,,,,,,,,,,,,0.06834237277507782,,,,,, +41,239649,,,,,,,,,,,,0.0607813224196434,,,,,, +41,239699,,,,,,,,,,,,0.07084882259368896,,,,,, +41,239749,,,,,,,,,,,,0.048320792615413666,,,,,, +41,239799,,,,,,,,,,,,0.06951442360877991,,,,,, +41,239849,,,,,,,,,,,,0.06335248053073883,,,,,, +41,239899,,,,,,,,,,,,0.0655917078256607,,,,,, +41,239949,,,,,,,,,,,,0.07837796211242676,,,,,, +41,239999,,,,,,,,,,,,0.07903096079826355,,,,,, +41,240049,,,,,,,,,,,,0.058771807700395584,,,,,, +41,240099,,,,,,,,,,,,0.06344227492809296,,,,,, +41,240149,,,,,,,,,,,,0.059287168085575104,,,,,, +41,240199,,,,,,,,,,,,0.08554328233003616,,,,,, +41,240249,,,,,,,,,,,,0.08031736314296722,,,,,, +41,240299,,,,,,,,,,,,0.06786956638097763,,,,,, +41,240349,,,,,,,,,,,,0.06753362715244293,,,,,, +41,240399,,,,,,,,,,,,0.07637201994657516,,,,,, +41,240449,,,,,,,,,,,,0.0638345405459404,,,,,, +41,240499,,,,,,,,,,,,0.06974664330482483,,,,,, +41,240549,,,,,,,,,,,,0.06793595105409622,,,,,, +41,240599,,,,,,,,,,,,0.06637202203273773,,,,,, +41,240649,,,,,,,,,,,,0.057095129042863846,,,,,, +41,240699,,,,,,,,,,,,0.06336741894483566,,,,,, +41,240749,,,,,,,,,,,,0.06237652152776718,,,,,, +41,240799,,,,,,,,,,,,0.06145220994949341,,,,,, +41,240849,,,,,,,,,,,,0.06241067498922348,,,,,, +41,240899,,,,,,,,,,,,0.0590149387717247,,,,,, +41,240911,,,,,,,,,,,,,0.24619358777999878,0.08679460734128952,0.19965142011642456,-0.05306565761566162,0.20759980380535126,0.08679460734128952 +41,240911,,,,,,,0.21480628848075867,0.06563322991132736,0.4549301862716675,0.20695996284484863,0.4315235912799835,,,,,,, +42,240949,,,,,,,,,,,,0.06719745695590973,,,,,, +42,240999,,,,,,,,,,,,0.06966843456029892,,,,,, +42,241049,,,,,,,,,,,,0.0635431781411171,,,,,, +42,241099,,,,,,,,,,,,0.06511977314949036,,,,,, +42,241149,,,,,,,,,,,,0.06190367788076401,,,,,, +42,241199,,,,,,,,,,,,0.07164445519447327,,,,,, +42,241249,,,,,,,,,,,,0.06869995594024658,,,,,, +42,241299,,,,,,,,,,,,0.07883845269680023,,,,,, +42,241349,,,,,,,,,,,,0.07642246782779694,,,,,, +42,241399,,,,,,,,,,,,0.059541646391153336,,,,,, +42,241449,,,,,,,,,,,,0.06178893893957138,,,,,, +42,241499,,,,,,,,,,,,0.05217072367668152,,,,,, +42,241549,,,,,,,,,,,,0.06520159542560577,,,,,, +42,241599,,,,,,,,,,,,0.06544531881809235,,,,,, +42,241649,,,,,,,,,,,,0.07109907269477844,,,,,, +42,241699,,,,,,,,,,,,0.0704353079199791,,,,,, +42,241749,,,,,,,,,,,,0.06374901533126831,,,,,, +42,241799,,,,,,,,,,,,0.07121625542640686,,,,,, +42,241849,,,,,,,,,,,,0.054690759629011154,,,,,, +42,241899,,,,,,,,,,,,0.07499965280294418,,,,,, +42,241949,,,,,,,,,,,,0.06336545944213867,,,,,, +42,241999,,,,,,,,,,,,0.06377541273832321,,,,,, +42,242049,,,,,,,,,,,,0.06693781912326813,,,,,, +42,242099,,,,,,,,,,,,0.07023253291845322,,,,,, +42,242149,,,,,,,,,,,,0.06933513283729553,,,,,, +42,242199,,,,,,,,,,,,0.06825833767652512,,,,,, +42,242249,,,,,,,,,,,,0.06707605719566345,,,,,, +42,242299,,,,,,,,,,,,0.06398148834705353,,,,,, +42,242349,,,,,,,,,,,,0.07208551466464996,,,,,, +42,242399,,,,,,,,,,,,0.05850733444094658,,,,,, +42,242449,,,,,,,,,,,,0.06340283900499344,,,,,, +42,242499,,,,,,,,,,,,0.06662186980247498,,,,,, +42,242549,,,,,,,,,,,,0.0576968714594841,,,,,, +42,242599,,,,,,,,,,,,0.061997465789318085,,,,,, +42,242649,,,,,,,,,,,,0.06907939910888672,,,,,, +42,242699,,,,,,,,,,,,0.06407110393047333,,,,,, +42,242749,,,,,,,,,,,,0.0697242021560669,,,,,, +42,242799,,,,,,,,,,,,0.05925276130437851,,,,,, +42,242849,,,,,,,,,,,,0.056476324796676636,,,,,, +42,242899,,,,,,,,,,,,0.0599738173186779,,,,,, +42,242949,,,,,,,,,,,,0.05598307400941849,,,,,, +42,242999,,,,,,,,,,,,0.05357189476490021,,,,,, +42,243049,,,,,,,,,,,,0.0626881867647171,,,,,, +42,243099,,,,,,,,,,,,0.06766007095575333,,,,,, +42,243149,,,,,,,,,,,,0.06644485890865326,,,,,, +42,243199,,,,,,,,,,,,0.06721467524766922,,,,,, +42,243249,,,,,,,,,,,,0.05822179839015007,,,,,, +42,243299,,,,,,,,,,,,0.06611400842666626,,,,,, +42,243349,,,,,,,,,,,,0.059694159775972366,,,,,, +42,243399,,,,,,,,,,,,0.06927941739559174,,,,,, +42,243449,,,,,,,,,,,,0.07266855239868164,,,,,, +42,243499,,,,,,,,,,,,0.052700795233249664,,,,,, +42,243549,,,,,,,,,,,,0.05671381950378418,,,,,, +42,243599,,,,,,,,,,,,0.06188836693763733,,,,,, +42,243649,,,,,,,,,,,,0.06523489952087402,,,,,, +42,243699,,,,,,,,,,,,0.058615803718566895,,,,,, +42,243749,,,,,,,,,,,,0.06572160869836807,,,,,, +42,243799,,,,,,,,,,,,0.06642349064350128,,,,,, +42,243849,,,,,,,,,,,,0.05851389467716217,,,,,, +42,243899,,,,,,,,,,,,0.06959325075149536,,,,,, +42,243949,,,,,,,,,,,,0.07010559737682343,,,,,, +42,243999,,,,,,,,,,,,0.06752835214138031,,,,,, +42,244049,,,,,,,,,,,,0.06617023050785065,,,,,, +42,244099,,,,,,,,,,,,0.07087832689285278,,,,,, +42,244149,,,,,,,,,,,,0.0506669357419014,,,,,, +42,244199,,,,,,,,,,,,0.05913820490241051,,,,,, +42,244249,,,,,,,,,,,,0.06498246639966965,,,,,, +42,244299,,,,,,,,,,,,0.07230733335018158,,,,,, +42,244349,,,,,,,,,,,,0.0620904266834259,,,,,, +42,244399,,,,,,,,,,,,0.06617963314056396,,,,,, +42,244449,,,,,,,,,,,,0.06791016459465027,,,,,, +42,244499,,,,,,,,,,,,0.06677468121051788,,,,,, +42,244549,,,,,,,,,,,,0.06780944764614105,,,,,, +42,244599,,,,,,,,,,,,0.060656528919935226,,,,,, +42,244649,,,,,,,,,,,,0.06869709491729736,,,,,, +42,244699,,,,,,,,,,,,0.07003378123044968,,,,,, +42,244749,,,,,,,,,,,,0.05957917496562004,,,,,, +42,244799,,,,,,,,,,,,0.05806506797671318,,,,,, +42,244849,,,,,,,,,,,,0.05889126658439636,,,,,, +42,244899,,,,,,,,,,,,0.06105446815490723,,,,,, +42,244949,,,,,,,,,,,,0.07682338356971741,,,,,, +42,244999,,,,,,,,,,,,0.0616910383105278,,,,,, +42,245049,,,,,,,,,,,,0.08035095036029816,,,,,, +42,245099,,,,,,,,,,,,0.07233992964029312,,,,,, +42,245149,,,,,,,,,,,,0.06972047686576843,,,,,, +42,245199,,,,,,,,,,,,0.06687319278717041,,,,,, +42,245249,,,,,,,,,,,,0.06070617586374283,,,,,, +42,245299,,,,,,,,,,,,0.06495523452758789,,,,,, +42,245349,,,,,,,,,,,,0.07436184585094452,,,,,, +42,245399,,,,,,,,,,,,0.06371365487575531,,,,,, +42,245449,,,,,,,,,,,,0.06211445480585098,,,,,, +42,245499,,,,,,,,,,,,0.06400362402200699,,,,,, +42,245549,,,,,,,,,,,,0.0603230781853199,,,,,, +42,245599,,,,,,,,,,,,0.057676635682582855,,,,,, +42,245649,,,,,,,,,,,,0.06835199892520905,,,,,, +42,245699,,,,,,,,,,,,0.0680672898888588,,,,,, +42,245749,,,,,,,,,,,,0.06749864667654037,,,,,, +42,245799,,,,,,,,,,,,0.0586823932826519,,,,,, +42,245849,,,,,,,,,,,,0.06987190991640091,,,,,, +42,245899,,,,,,,,,,,,0.07494580745697021,,,,,, +42,245949,,,,,,,,,,,,0.07691146433353424,,,,,, +42,245999,,,,,,,,,,,,0.06464740633964539,,,,,, +42,246049,,,,,,,,,,,,0.06707657128572464,,,,,, +42,246099,,,,,,,,,,,,0.06336742639541626,,,,,, +42,246149,,,,,,,,,,,,0.07110393792390823,,,,,, +42,246199,,,,,,,,,,,,0.05855856090784073,,,,,, +42,246249,,,,,,,,,,,,0.054959531873464584,,,,,, +42,246299,,,,,,,,,,,,0.07062728703022003,,,,,, +42,246349,,,,,,,,,,,,0.06629660725593567,,,,,, +42,246399,,,,,,,,,,,,0.0663195550441742,,,,,, +42,246449,,,,,,,,,,,,0.06657026708126068,,,,,, +42,246499,,,,,,,,,,,,0.06313920766115189,,,,,, +42,246549,,,,,,,,,,,,0.06566101312637329,,,,,, +42,246599,,,,,,,,,,,,0.06192301586270332,,,,,, +42,246647,,,,,,,,,,,,,0.2467009723186493,0.08728551864624023,0.20522931218147278,-0.059021830558776855,0.21168260276317596,0.08728551864624023 +42,246647,,,,,,,0.21467506885528564,0.06559979170560837,0.4553776681423187,0.2073712944984436,0.43231716752052307,,,,,,, +43,246649,,,,,,,,,,,,0.08065509796142578,,,,,, +43,246699,,,,,,,,,,,,0.07116182148456573,,,,,, +43,246749,,,,,,,,,,,,0.06732779741287231,,,,,, +43,246799,,,,,,,,,,,,0.0604831725358963,,,,,, +43,246849,,,,,,,,,,,,0.055137503892183304,,,,,, +43,246899,,,,,,,,,,,,0.07064861804246902,,,,,, +43,246949,,,,,,,,,,,,0.0624576061964035,,,,,, +43,246999,,,,,,,,,,,,0.06347869336605072,,,,,, +43,247049,,,,,,,,,,,,0.0646410584449768,,,,,, +43,247099,,,,,,,,,,,,0.059415094554424286,,,,,, +43,247149,,,,,,,,,,,,0.06863995641469955,,,,,, +43,247199,,,,,,,,,,,,0.0680270716547966,,,,,, +43,247249,,,,,,,,,,,,0.07197262346744537,,,,,, +43,247299,,,,,,,,,,,,0.05962512642145157,,,,,, +43,247349,,,,,,,,,,,,0.06617513298988342,,,,,, +43,247399,,,,,,,,,,,,0.06444037705659866,,,,,, +43,247449,,,,,,,,,,,,0.06576992571353912,,,,,, +43,247499,,,,,,,,,,,,0.0627385750412941,,,,,, +43,247549,,,,,,,,,,,,0.06679241359233856,,,,,, +43,247599,,,,,,,,,,,,0.061463724821805954,,,,,, +43,247649,,,,,,,,,,,,0.06532364338636398,,,,,, +43,247699,,,,,,,,,,,,0.06323995441198349,,,,,, +43,247749,,,,,,,,,,,,0.06123538687825203,,,,,, +43,247799,,,,,,,,,,,,0.06903623044490814,,,,,, +43,247849,,,,,,,,,,,,0.07345506548881531,,,,,, +43,247899,,,,,,,,,,,,0.06080299988389015,,,,,, +43,247949,,,,,,,,,,,,0.05899154022336006,,,,,, +43,247999,,,,,,,,,,,,0.07139073312282562,,,,,, +43,248049,,,,,,,,,,,,0.06703739613294601,,,,,, +43,248099,,,,,,,,,,,,0.062180373817682266,,,,,, +43,248149,,,,,,,,,,,,0.0531347431242466,,,,,, +43,248199,,,,,,,,,,,,0.06176123023033142,,,,,, +43,248249,,,,,,,,,,,,0.07792714983224869,,,,,, +43,248299,,,,,,,,,,,,0.06964410841464996,,,,,, +43,248349,,,,,,,,,,,,0.0662083700299263,,,,,, +43,248399,,,,,,,,,,,,0.0572056770324707,,,,,, +43,248449,,,,,,,,,,,,0.0674763023853302,,,,,, +43,248499,,,,,,,,,,,,0.06439849734306335,,,,,, +43,248549,,,,,,,,,,,,0.05578435957431793,,,,,, +43,248599,,,,,,,,,,,,0.06902854144573212,,,,,, +43,248649,,,,,,,,,,,,0.07838952541351318,,,,,, +43,248699,,,,,,,,,,,,0.06933296471834183,,,,,, +43,248749,,,,,,,,,,,,0.06752796471118927,,,,,, +43,248799,,,,,,,,,,,,0.06067138910293579,,,,,, +43,248849,,,,,,,,,,,,0.052029646933078766,,,,,, +43,248899,,,,,,,,,,,,0.07650268822908401,,,,,, +43,248949,,,,,,,,,,,,0.07256346940994263,,,,,, +43,248999,,,,,,,,,,,,0.0662064403295517,,,,,, +43,249049,,,,,,,,,,,,0.05732708424329758,,,,,, +43,249099,,,,,,,,,,,,0.05695633590221405,,,,,, +43,249149,,,,,,,,,,,,0.0571649894118309,,,,,, +43,249199,,,,,,,,,,,,0.06299234926700592,,,,,, +43,249249,,,,,,,,,,,,0.06998968124389648,,,,,, +43,249299,,,,,,,,,,,,0.06836606562137604,,,,,, +43,249349,,,,,,,,,,,,0.06418651342391968,,,,,, +43,249399,,,,,,,,,,,,0.0616619735956192,,,,,, +43,249449,,,,,,,,,,,,0.06006167083978653,,,,,, +43,249499,,,,,,,,,,,,0.05772757530212402,,,,,, +43,249549,,,,,,,,,,,,0.053945694118738174,,,,,, +43,249599,,,,,,,,,,,,0.07238584011793137,,,,,, +43,249649,,,,,,,,,,,,0.05922998860478401,,,,,, +43,249699,,,,,,,,,,,,0.058099955320358276,,,,,, +43,249749,,,,,,,,,,,,0.0661604031920433,,,,,, +43,249799,,,,,,,,,,,,0.06039686128497124,,,,,, +43,249849,,,,,,,,,,,,0.06918458640575409,,,,,, +43,249899,,,,,,,,,,,,0.06788811832666397,,,,,, +43,249949,,,,,,,,,,,,0.06608172506093979,,,,,, +43,249999,,,,,,,,,,,,0.06752752512693405,,,,,, +43,250049,,,,,,,,,,,,0.06467259675264359,,,,,, +43,250099,,,,,,,,,,,,0.07126118242740631,,,,,, +43,250149,,,,,,,,,,,,0.06876540929079056,,,,,, +43,250199,,,,,,,,,,,,0.06191213056445122,,,,,, +43,250249,,,,,,,,,,,,0.059051841497421265,,,,,, +43,250299,,,,,,,,,,,,0.06384600698947906,,,,,, +43,250349,,,,,,,,,,,,0.06834252178668976,,,,,, +43,250399,,,,,,,,,,,,0.06406936049461365,,,,,, +43,250449,,,,,,,,,,,,0.05728445202112198,,,,,, +43,250499,,,,,,,,,,,,0.058112695813179016,,,,,, +43,250549,,,,,,,,,,,,0.06375274062156677,,,,,, +43,250599,,,,,,,,,,,,0.06960301101207733,,,,,, +43,250649,,,,,,,,,,,,0.072550930082798,,,,,, +43,250699,,,,,,,,,,,,0.06029324233531952,,,,,, +43,250749,,,,,,,,,,,,0.07222527265548706,,,,,, +43,250799,,,,,,,,,,,,0.05908527225255966,,,,,, +43,250849,,,,,,,,,,,,0.06698930263519287,,,,,, +43,250899,,,,,,,,,,,,0.06889675557613373,,,,,, +43,250949,,,,,,,,,,,,0.07506947964429855,,,,,, +43,250999,,,,,,,,,,,,0.062132976949214935,,,,,, +43,251049,,,,,,,,,,,,0.06630916893482208,,,,,, +43,251099,,,,,,,,,,,,0.060994863510131836,,,,,, +43,251149,,,,,,,,,,,,0.06799493730068207,,,,,, +43,251199,,,,,,,,,,,,0.06831890344619751,,,,,, +43,251249,,,,,,,,,,,,0.05353986471891403,,,,,, +43,251299,,,,,,,,,,,,0.05910121649503708,,,,,, +43,251349,,,,,,,,,,,,0.06794579327106476,,,,,, +43,251399,,,,,,,,,,,,0.06681174039840698,,,,,, +43,251449,,,,,,,,,,,,0.06623756140470505,,,,,, +43,251499,,,,,,,,,,,,0.04906130209565163,,,,,, +43,251549,,,,,,,,,,,,0.06392374634742737,,,,,, +43,251599,,,,,,,,,,,,0.0580890029668808,,,,,, +43,251649,,,,,,,,,,,,0.07662804424762726,,,,,, +43,251699,,,,,,,,,,,,0.06362524628639221,,,,,, +43,251749,,,,,,,,,,,,0.06036388874053955,,,,,, +43,251799,,,,,,,,,,,,0.06251299381256104,,,,,, +43,251849,,,,,,,,,,,,0.06931081414222717,,,,,, +43,251899,,,,,,,,,,,,0.05762943997979164,,,,,, +43,251949,,,,,,,,,,,,0.07230230420827866,,,,,, +43,251999,,,,,,,,,,,,0.07004152983427048,,,,,, +43,252049,,,,,,,,,,,,0.05734353885054588,,,,,, +43,252099,,,,,,,,,,,,0.0625888854265213,,,,,, +43,252149,,,,,,,,,,,,0.08488878607749939,,,,,, +43,252199,,,,,,,,,,,,0.06998829543590546,,,,,, +43,252249,,,,,,,,,,,,0.07182910293340683,,,,,, +43,252299,,,,,,,,,,,,0.07093235850334167,,,,,, +43,252349,,,,,,,,,,,,0.06256077438592911,,,,,, +43,252383,,,,,,,,,,,,,0.24746960401535034,0.0882643312215805,0.1972997486591339,-0.07089757919311523,0.20354032516479492,0.0882643312215805 +43,252383,,,,,,,0.21458639204502106,0.06559886783361435,0.4553981423377991,0.20738166570663452,0.43285879492759705,,,,,,, +44,252399,,,,,,,,,,,,0.05495431274175644,,,,,, +44,252449,,,,,,,,,,,,0.06563246250152588,,,,,, +44,252499,,,,,,,,,,,,0.07048410177230835,,,,,, +44,252549,,,,,,,,,,,,0.057283446192741394,,,,,, +44,252599,,,,,,,,,,,,0.06819954514503479,,,,,, +44,252649,,,,,,,,,,,,0.06170543283224106,,,,,, +44,252699,,,,,,,,,,,,0.0720822662115097,,,,,, +44,252749,,,,,,,,,,,,0.05921215936541557,,,,,, +44,252799,,,,,,,,,,,,0.06422428786754608,,,,,, +44,252849,,,,,,,,,,,,0.05316166579723358,,,,,, +44,252899,,,,,,,,,,,,0.0477980300784111,,,,,, +44,252949,,,,,,,,,,,,0.06889429688453674,,,,,, +44,252999,,,,,,,,,,,,0.06588505953550339,,,,,, +44,253049,,,,,,,,,,,,0.06479644775390625,,,,,, +44,253099,,,,,,,,,,,,0.059829097241163254,,,,,, +44,253149,,,,,,,,,,,,0.05712112784385681,,,,,, +44,253199,,,,,,,,,,,,0.06443672627210617,,,,,, +44,253249,,,,,,,,,,,,0.0687045082449913,,,,,, +44,253299,,,,,,,,,,,,0.056879691779613495,,,,,, +44,253349,,,,,,,,,,,,0.0573401004076004,,,,,, +44,253399,,,,,,,,,,,,0.06722952425479889,,,,,, +44,253449,,,,,,,,,,,,0.06732091307640076,,,,,, +44,253499,,,,,,,,,,,,0.06660279631614685,,,,,, +44,253549,,,,,,,,,,,,0.05680284649133682,,,,,, +44,253599,,,,,,,,,,,,0.06414264440536499,,,,,, +44,253649,,,,,,,,,,,,0.07498376071453094,,,,,, +44,253699,,,,,,,,,,,,0.05980425328016281,,,,,, +44,253749,,,,,,,,,,,,0.08446924388408661,,,,,, +44,253799,,,,,,,,,,,,0.065170519053936,,,,,, +44,253849,,,,,,,,,,,,0.06728801876306534,,,,,, +44,253899,,,,,,,,,,,,0.06727306544780731,,,,,, +44,253949,,,,,,,,,,,,0.07157289981842041,,,,,, +44,253999,,,,,,,,,,,,0.07612597197294235,,,,,, +44,254049,,,,,,,,,,,,0.06377899646759033,,,,,, +44,254099,,,,,,,,,,,,0.06647638231515884,,,,,, +44,254149,,,,,,,,,,,,0.05522143840789795,,,,,, +44,254199,,,,,,,,,,,,0.07034482061862946,,,,,, +44,254249,,,,,,,,,,,,0.0595536045730114,,,,,, +44,254299,,,,,,,,,,,,0.05908816680312157,,,,,, +44,254349,,,,,,,,,,,,0.0650486946105957,,,,,, +44,254399,,,,,,,,,,,,0.053220149129629135,,,,,, +44,254449,,,,,,,,,,,,0.06310112774372101,,,,,, +44,254499,,,,,,,,,,,,0.05852926895022392,,,,,, +44,254549,,,,,,,,,,,,0.06666840612888336,,,,,, +44,254599,,,,,,,,,,,,0.06147501990199089,,,,,, +44,254649,,,,,,,,,,,,0.06546975672245026,,,,,, +44,254699,,,,,,,,,,,,0.0639638900756836,,,,,, +44,254749,,,,,,,,,,,,0.06687426567077637,,,,,, +44,254799,,,,,,,,,,,,0.06884988397359848,,,,,, +44,254849,,,,,,,,,,,,0.06068029999732971,,,,,, +44,254899,,,,,,,,,,,,0.05020587146282196,,,,,, +44,254949,,,,,,,,,,,,0.06852208077907562,,,,,, +44,254999,,,,,,,,,,,,0.06359836459159851,,,,,, +44,255049,,,,,,,,,,,,0.07248226553201675,,,,,, +44,255099,,,,,,,,,,,,0.0697389543056488,,,,,, +44,255149,,,,,,,,,,,,0.0645502582192421,,,,,, +44,255199,,,,,,,,,,,,0.06355666369199753,,,,,, +44,255249,,,,,,,,,,,,0.07262563705444336,,,,,, +44,255299,,,,,,,,,,,,0.06864875555038452,,,,,, +44,255349,,,,,,,,,,,,0.05760037899017334,,,,,, +44,255399,,,,,,,,,,,,0.06660912930965424,,,,,, +44,255449,,,,,,,,,,,,0.056845370680093765,,,,,, +44,255499,,,,,,,,,,,,0.054924774914979935,,,,,, +44,255549,,,,,,,,,,,,0.06154999881982803,,,,,, +44,255599,,,,,,,,,,,,0.06038366258144379,,,,,, +44,255649,,,,,,,,,,,,0.07135160267353058,,,,,, +44,255699,,,,,,,,,,,,0.05499279499053955,,,,,, +44,255749,,,,,,,,,,,,0.06329472362995148,,,,,, +44,255799,,,,,,,,,,,,0.06986261904239655,,,,,, +44,255849,,,,,,,,,,,,0.05862677842378616,,,,,, +44,255899,,,,,,,,,,,,0.06873869150876999,,,,,, +44,255949,,,,,,,,,,,,0.07953643798828125,,,,,, +44,255999,,,,,,,,,,,,0.06086224317550659,,,,,, +44,256049,,,,,,,,,,,,0.07104720175266266,,,,,, +44,256099,,,,,,,,,,,,0.06052953377366066,,,,,, +44,256149,,,,,,,,,,,,0.06498605757951736,,,,,, +44,256199,,,,,,,,,,,,0.07895873486995697,,,,,, +44,256249,,,,,,,,,,,,0.07967163622379303,,,,,, +44,256299,,,,,,,,,,,,0.0726490467786789,,,,,, +44,256349,,,,,,,,,,,,0.06709173321723938,,,,,, +44,256399,,,,,,,,,,,,0.06927164644002914,,,,,, +44,256449,,,,,,,,,,,,0.06723891198635101,,,,,, +44,256499,,,,,,,,,,,,0.060763247311115265,,,,,, +44,256549,,,,,,,,,,,,0.06801749765872955,,,,,, +44,256599,,,,,,,,,,,,0.05164622515439987,,,,,, +44,256649,,,,,,,,,,,,0.062016427516937256,,,,,, +44,256699,,,,,,,,,,,,0.057875752449035645,,,,,, +44,256749,,,,,,,,,,,,0.060301460325717926,,,,,, +44,256799,,,,,,,,,,,,0.057485733181238174,,,,,, +44,256849,,,,,,,,,,,,0.05831701308488846,,,,,, +44,256899,,,,,,,,,,,,0.06417703628540039,,,,,, +44,256949,,,,,,,,,,,,0.05469803512096405,,,,,, +44,256999,,,,,,,,,,,,0.061067793518304825,,,,,, +44,257049,,,,,,,,,,,,0.06884701550006866,,,,,, +44,257099,,,,,,,,,,,,0.0650249496102333,,,,,, +44,257149,,,,,,,,,,,,0.06375789642333984,,,,,, +44,257199,,,,,,,,,,,,0.07015261054039001,,,,,, +44,257249,,,,,,,,,,,,0.07060465216636658,,,,,, +44,257299,,,,,,,,,,,,0.06324949115514755,,,,,, +44,257349,,,,,,,,,,,,0.05577850341796875,,,,,, +44,257399,,,,,,,,,,,,0.05895023047924042,,,,,, +44,257449,,,,,,,,,,,,0.06940362602472305,,,,,, +44,257499,,,,,,,,,,,,0.06249953433871269,,,,,, +44,257549,,,,,,,,,,,,0.06502601504325867,,,,,, +44,257599,,,,,,,,,,,,0.06521771848201752,,,,,, +44,257649,,,,,,,,,,,,0.06094910576939583,,,,,, +44,257699,,,,,,,,,,,,0.06802526861429214,,,,,, +44,257749,,,,,,,,,,,,0.07472015917301178,,,,,, +44,257799,,,,,,,,,,,,0.049770206212997437,,,,,, +44,257849,,,,,,,,,,,,0.05984057858586311,,,,,, +44,257899,,,,,,,,,,,,0.05762706324458122,,,,,, +44,257949,,,,,,,,,,,,0.04674018174409866,,,,,, +44,257999,,,,,,,,,,,,0.06982675194740295,,,,,, +44,258049,,,,,,,,,,,,0.06925010681152344,,,,,, +44,258099,,,,,,,,,,,,0.059202469885349274,,,,,, +44,258119,,,,,,,,,,,,,0.2468772977590561,0.08707477897405624,0.19242848455905914,-0.05646491050720215,0.19904670119285583,0.08707477897405624 +44,258119,,,,,,,0.21456100046634674,0.06556472927331924,0.4558499753475189,0.2077884078025818,0.4331267178058624,,,,,,, +45,258149,,,,,,,,,,,,0.0711272731423378,,,,,, +45,258199,,,,,,,,,,,,0.06418119370937347,,,,,, +45,258249,,,,,,,,,,,,0.06574288010597229,,,,,, +45,258299,,,,,,,,,,,,0.06012420356273651,,,,,, +45,258349,,,,,,,,,,,,0.05822069197893143,,,,,, +45,258399,,,,,,,,,,,,0.07195809483528137,,,,,, +45,258449,,,,,,,,,,,,0.06397876143455505,,,,,, +45,258499,,,,,,,,,,,,0.07645169645547867,,,,,, +45,258549,,,,,,,,,,,,0.06153415888547897,,,,,, +45,258599,,,,,,,,,,,,0.06785303354263306,,,,,, +45,258649,,,,,,,,,,,,0.06295224279165268,,,,,, +45,258699,,,,,,,,,,,,0.05839598551392555,,,,,, +45,258749,,,,,,,,,,,,0.0640229731798172,,,,,, +45,258799,,,,,,,,,,,,0.07198598980903625,,,,,, +45,258849,,,,,,,,,,,,0.06514468044042587,,,,,, +45,258899,,,,,,,,,,,,0.06874601542949677,,,,,, +45,258949,,,,,,,,,,,,0.06292101740837097,,,,,, +45,258999,,,,,,,,,,,,0.06752930581569672,,,,,, +45,259049,,,,,,,,,,,,0.050647370517253876,,,,,, +45,259099,,,,,,,,,,,,0.05896797031164169,,,,,, +45,259149,,,,,,,,,,,,0.05694079399108887,,,,,, +45,259199,,,,,,,,,,,,0.0795905590057373,,,,,, +45,259249,,,,,,,,,,,,0.06589333713054657,,,,,, +45,259299,,,,,,,,,,,,0.059363994747400284,,,,,, +45,259349,,,,,,,,,,,,0.069971963763237,,,,,, +45,259399,,,,,,,,,,,,0.05809742212295532,,,,,, +45,259449,,,,,,,,,,,,0.0683441311120987,,,,,, +45,259499,,,,,,,,,,,,0.06876549869775772,,,,,, +45,259549,,,,,,,,,,,,0.052130326628685,,,,,, +45,259599,,,,,,,,,,,,0.05421498417854309,,,,,, +45,259649,,,,,,,,,,,,0.06314902007579803,,,,,, +45,259699,,,,,,,,,,,,0.06061539426445961,,,,,, +45,259749,,,,,,,,,,,,0.060466546565294266,,,,,, +45,259799,,,,,,,,,,,,0.06687020510435104,,,,,, +45,259849,,,,,,,,,,,,0.06909379363059998,,,,,, +45,259899,,,,,,,,,,,,0.06526344269514084,,,,,, +45,259949,,,,,,,,,,,,0.06649858504533768,,,,,, +45,259999,,,,,,,,,,,,0.07623733580112457,,,,,, +45,260049,,,,,,,,,,,,0.06907561421394348,,,,,, +45,260099,,,,,,,,,,,,0.0536397248506546,,,,,, +45,260149,,,,,,,,,,,,0.056548383086919785,,,,,, +45,260199,,,,,,,,,,,,0.07227195799350739,,,,,, +45,260249,,,,,,,,,,,,0.06550533324480057,,,,,, +45,260299,,,,,,,,,,,,0.07091622054576874,,,,,, +45,260349,,,,,,,,,,,,0.062161896377801895,,,,,, +45,260399,,,,,,,,,,,,0.05530156195163727,,,,,, +45,260449,,,,,,,,,,,,0.05928102880716324,,,,,, +45,260499,,,,,,,,,,,,0.05918792635202408,,,,,, +45,260549,,,,,,,,,,,,0.058995068073272705,,,,,, +45,260599,,,,,,,,,,,,0.06280065327882767,,,,,, +45,260649,,,,,,,,,,,,0.06733716279268265,,,,,, +45,260699,,,,,,,,,,,,0.06309707462787628,,,,,, +45,260749,,,,,,,,,,,,0.0543852224946022,,,,,, +45,260799,,,,,,,,,,,,0.054506298154592514,,,,,, +45,260849,,,,,,,,,,,,0.06725406646728516,,,,,, +45,260899,,,,,,,,,,,,0.0682966560125351,,,,,, +45,260949,,,,,,,,,,,,0.07752379029989243,,,,,, +45,260999,,,,,,,,,,,,0.07197996228933334,,,,,, +45,261049,,,,,,,,,,,,0.06885015219449997,,,,,, +45,261099,,,,,,,,,,,,0.06163666024804115,,,,,, +45,261149,,,,,,,,,,,,0.07247373461723328,,,,,, +45,261199,,,,,,,,,,,,0.05826636403799057,,,,,, +45,261249,,,,,,,,,,,,0.06255928426980972,,,,,, +45,261299,,,,,,,,,,,,0.06983649730682373,,,,,, +45,261349,,,,,,,,,,,,0.06005430221557617,,,,,, +45,261399,,,,,,,,,,,,0.05144594609737396,,,,,, +45,261449,,,,,,,,,,,,0.08110449463129044,,,,,, +45,261499,,,,,,,,,,,,0.05464387685060501,,,,,, +45,261549,,,,,,,,,,,,0.061439793556928635,,,,,, +45,261599,,,,,,,,,,,,0.07861106842756271,,,,,, +45,261649,,,,,,,,,,,,0.05526793375611305,,,,,, +45,261699,,,,,,,,,,,,0.058137692511081696,,,,,, +45,261749,,,,,,,,,,,,0.07666514068841934,,,,,, +45,261799,,,,,,,,,,,,0.07110807299613953,,,,,, +45,261849,,,,,,,,,,,,0.07104519009590149,,,,,, +45,261899,,,,,,,,,,,,0.061270784586668015,,,,,, +45,261949,,,,,,,,,,,,0.06118682399392128,,,,,, +45,261999,,,,,,,,,,,,0.06505696475505829,,,,,, +45,262049,,,,,,,,,,,,0.07063040137290955,,,,,, +45,262099,,,,,,,,,,,,0.06760260462760925,,,,,, +45,262149,,,,,,,,,,,,0.054354965686798096,,,,,, +45,262199,,,,,,,,,,,,0.058856651186943054,,,,,, +45,262249,,,,,,,,,,,,0.05929182097315788,,,,,, +45,262299,,,,,,,,,,,,0.0647462010383606,,,,,, +45,262349,,,,,,,,,,,,0.06893397867679596,,,,,, +45,262399,,,,,,,,,,,,0.06893206387758255,,,,,, +45,262449,,,,,,,,,,,,0.07469253242015839,,,,,, +45,262499,,,,,,,,,,,,0.06444807350635529,,,,,, +45,262549,,,,,,,,,,,,0.055947139859199524,,,,,, +45,262599,,,,,,,,,,,,0.07854633033275604,,,,,, +45,262649,,,,,,,,,,,,0.07067769020795822,,,,,, +45,262699,,,,,,,,,,,,0.06246982514858246,,,,,, +45,262749,,,,,,,,,,,,0.06358889490365982,,,,,, +45,262799,,,,,,,,,,,,0.06541991233825684,,,,,, +45,262849,,,,,,,,,,,,0.07455389946699142,,,,,, +45,262899,,,,,,,,,,,,0.06526096165180206,,,,,, +45,262949,,,,,,,,,,,,0.06804913282394409,,,,,, +45,262999,,,,,,,,,,,,0.0735006183385849,,,,,, +45,263049,,,,,,,,,,,,0.06807004660367966,,,,,, +45,263099,,,,,,,,,,,,0.06860378384590149,,,,,, +45,263149,,,,,,,,,,,,0.06882041692733765,,,,,, +45,263199,,,,,,,,,,,,0.06254751980304718,,,,,, +45,263249,,,,,,,,,,,,0.06148027256131172,,,,,, +45,263299,,,,,,,,,,,,0.06956388056278229,,,,,, +45,263349,,,,,,,,,,,,0.07462503015995026,,,,,, +45,263399,,,,,,,,,,,,0.06361950933933258,,,,,, +45,263449,,,,,,,,,,,,0.06542322784662247,,,,,, +45,263499,,,,,,,,,,,,0.055114634335041046,,,,,, +45,263549,,,,,,,,,,,,0.0657559335231781,,,,,, +45,263599,,,,,,,,,,,,0.07085193693637848,,,,,, +45,263649,,,,,,,,,,,,0.05101919546723366,,,,,, +45,263699,,,,,,,,,,,,0.06640823185443878,,,,,, +45,263749,,,,,,,,,,,,0.07416285574436188,,,,,, +45,263799,,,,,,,,,,,,0.06473091244697571,,,,,, +45,263849,,,,,,,,,,,,0.06022593379020691,,,,,, +45,263855,,,,,,,,,,,,,0.2447201907634735,0.08569152653217316,0.20528408885002136,-0.03968214988708496,0.21235433220863342,0.08569152653217316 +45,263855,,,,,,,0.2144213318824768,0.06543546915054321,0.457550972700119,0.2093496322631836,0.4337656795978546,,,,,,, +46,263899,,,,,,,,,,,,0.07321175187826157,,,,,, +46,263949,,,,,,,,,,,,0.06194532290101051,,,,,, +46,263999,,,,,,,,,,,,0.058432966470718384,,,,,, +46,264049,,,,,,,,,,,,0.06836777925491333,,,,,, +46,264099,,,,,,,,,,,,0.0666581243276596,,,,,, +46,264149,,,,,,,,,,,,0.0672900378704071,,,,,, +46,264199,,,,,,,,,,,,0.054722800850868225,,,,,, +46,264249,,,,,,,,,,,,0.06061316281557083,,,,,, +46,264299,,,,,,,,,,,,0.05987939611077309,,,,,, +46,264349,,,,,,,,,,,,0.06860523670911789,,,,,, +46,264399,,,,,,,,,,,,0.06664401292800903,,,,,, +46,264449,,,,,,,,,,,,0.06665241718292236,,,,,, +46,264499,,,,,,,,,,,,0.07335758954286575,,,,,, +46,264549,,,,,,,,,,,,0.05981745570898056,,,,,, +46,264599,,,,,,,,,,,,0.06195627897977829,,,,,, +46,264649,,,,,,,,,,,,0.07104252278804779,,,,,, +46,264699,,,,,,,,,,,,0.06608134508132935,,,,,, +46,264749,,,,,,,,,,,,0.06850746273994446,,,,,, +46,264799,,,,,,,,,,,,0.06837970018386841,,,,,, +46,264849,,,,,,,,,,,,0.06577611714601517,,,,,, +46,264899,,,,,,,,,,,,0.0615762434899807,,,,,, +46,264949,,,,,,,,,,,,0.07579221576452255,,,,,, +46,264999,,,,,,,,,,,,0.0676848515868187,,,,,, +46,265049,,,,,,,,,,,,0.07200638949871063,,,,,, +46,265099,,,,,,,,,,,,0.06186238303780556,,,,,, +46,265149,,,,,,,,,,,,0.06326837837696075,,,,,, +46,265199,,,,,,,,,,,,0.07627031207084656,,,,,, +46,265249,,,,,,,,,,,,0.07787291705608368,,,,,, +46,265299,,,,,,,,,,,,0.06377893686294556,,,,,, +46,265349,,,,,,,,,,,,0.06192479282617569,,,,,, +46,265399,,,,,,,,,,,,0.07114065438508987,,,,,, +46,265449,,,,,,,,,,,,0.0667232945561409,,,,,, +46,265499,,,,,,,,,,,,0.067766934633255,,,,,, +46,265549,,,,,,,,,,,,0.08010083436965942,,,,,, +46,265599,,,,,,,,,,,,0.07193665951490402,,,,,, +46,265649,,,,,,,,,,,,0.06548596918582916,,,,,, +46,265699,,,,,,,,,,,,0.07448193430900574,,,,,, +46,265749,,,,,,,,,,,,0.06649184226989746,,,,,, +46,265799,,,,,,,,,,,,0.06799504905939102,,,,,, +46,265849,,,,,,,,,,,,0.06753981113433838,,,,,, +46,265899,,,,,,,,,,,,0.07268980890512466,,,,,, +46,265949,,,,,,,,,,,,0.06074391305446625,,,,,, +46,265999,,,,,,,,,,,,0.06160435080528259,,,,,, +46,266049,,,,,,,,,,,,0.07048773020505905,,,,,, +46,266099,,,,,,,,,,,,0.06356862187385559,,,,,, +46,266149,,,,,,,,,,,,0.06263655424118042,,,,,, +46,266199,,,,,,,,,,,,0.46140071749687195,,,,,, +46,266249,,,,,,,,,,,,0.07887344062328339,,,,,, +46,266299,,,,,,,,,,,,0.05648745968937874,,,,,, +46,266349,,,,,,,,,,,,0.07572443038225174,,,,,, +46,266399,,,,,,,,,,,,0.06179690733551979,,,,,, +46,266449,,,,,,,,,,,,0.07227421551942825,,,,,, +46,266499,,,,,,,,,,,,0.0594373494386673,,,,,, +46,266549,,,,,,,,,,,,0.0654003769159317,,,,,, +46,266599,,,,,,,,,,,,0.06933008134365082,,,,,, +46,266649,,,,,,,,,,,,0.06415049731731415,,,,,, +46,266699,,,,,,,,,,,,0.06240026280283928,,,,,, +46,266749,,,,,,,,,,,,0.06306721270084381,,,,,, +46,266799,,,,,,,,,,,,0.06709299236536026,,,,,, +46,266849,,,,,,,,,,,,0.06366391479969025,,,,,, +46,266899,,,,,,,,,,,,0.06266510486602783,,,,,, +46,266949,,,,,,,,,,,,0.0654829889535904,,,,,, +46,266999,,,,,,,,,,,,0.06662964820861816,,,,,, +46,267049,,,,,,,,,,,,0.06386038661003113,,,,,, +46,267099,,,,,,,,,,,,0.05931970104575157,,,,,, +46,267149,,,,,,,,,,,,0.06714820861816406,,,,,, +46,267199,,,,,,,,,,,,0.06919033825397491,,,,,, +46,267249,,,,,,,,,,,,0.0611373670399189,,,,,, +46,267299,,,,,,,,,,,,0.06771710515022278,,,,,, +46,267349,,,,,,,,,,,,0.06652019917964935,,,,,, +46,267399,,,,,,,,,,,,0.05927830934524536,,,,,, +46,267449,,,,,,,,,,,,0.0545770600438118,,,,,, +46,267499,,,,,,,,,,,,0.0732668861746788,,,,,, +46,267549,,,,,,,,,,,,0.06919576972723007,,,,,, +46,267599,,,,,,,,,,,,0.06735128164291382,,,,,, +46,267649,,,,,,,,,,,,0.06590212881565094,,,,,, +46,267699,,,,,,,,,,,,0.056701213121414185,,,,,, +46,267749,,,,,,,,,,,,0.0727175921201706,,,,,, +46,267799,,,,,,,,,,,,0.0658896267414093,,,,,, +46,267849,,,,,,,,,,,,0.07165630906820297,,,,,, +46,267899,,,,,,,,,,,,0.06716295331716537,,,,,, +46,267949,,,,,,,,,,,,0.056801848113536835,,,,,, +46,267999,,,,,,,,,,,,0.051460739225149155,,,,,, +46,268049,,,,,,,,,,,,0.048490010201931,,,,,, +46,268099,,,,,,,,,,,,0.0598728209733963,,,,,, +46,268149,,,,,,,,,,,,0.062209539115428925,,,,,, +46,268199,,,,,,,,,,,,0.07694931328296661,,,,,, +46,268249,,,,,,,,,,,,0.07247544080018997,,,,,, +46,268299,,,,,,,,,,,,0.06006695702672005,,,,,, +46,268349,,,,,,,,,,,,0.0484820120036602,,,,,, +46,268399,,,,,,,,,,,,0.06409019231796265,,,,,, +46,268449,,,,,,,,,,,,0.07732947170734406,,,,,, +46,268499,,,,,,,,,,,,0.0755971297621727,,,,,, +46,268549,,,,,,,,,,,,0.08026061952114105,,,,,, +46,268599,,,,,,,,,,,,0.06064685806632042,,,,,, +46,268649,,,,,,,,,,,,0.0697624534368515,,,,,, +46,268699,,,,,,,,,,,,0.06986787915229797,,,,,, +46,268749,,,,,,,,,,,,0.07281707227230072,,,,,, +46,268799,,,,,,,,,,,,0.07614997774362564,,,,,, +46,268849,,,,,,,,,,,,0.06602179259061813,,,,,, +46,268899,,,,,,,,,,,,0.06371749937534332,,,,,, +46,268949,,,,,,,,,,,,0.06301470100879669,,,,,, +46,268999,,,,,,,,,,,,0.07037210464477539,,,,,, +46,269049,,,,,,,,,,,,0.05664637312293053,,,,,, +46,269099,,,,,,,,,,,,0.07147254794836044,,,,,, +46,269149,,,,,,,,,,,,0.06736521422863007,,,,,, +46,269199,,,,,,,,,,,,0.06132083013653755,,,,,, +46,269249,,,,,,,,,,,,0.07096116989850998,,,,,, +46,269299,,,,,,,,,,,,0.07238556444644928,,,,,, +46,269349,,,,,,,,,,,,0.06044390797615051,,,,,, +46,269399,,,,,,,,,,,,0.07053788751363754,,,,,, +46,269449,,,,,,,,,,,,0.06240572780370712,,,,,, +46,269499,,,,,,,,,,,,0.06396131217479706,,,,,, +46,269549,,,,,,,,,,,,0.06648565828800201,,,,,, +46,269591,,,,,,,,,,,,,0.24753005802631378,0.08782440423965454,0.19401970505714417,-0.065559983253479,0.20285552740097046,0.08782440423965454 +46,269591,,,,,,,0.2143188863992691,0.06547518819570541,0.45703354477882385,0.20888620615005493,0.43449971079826355,,,,,,, +47,269599,,,,,,,,,,,,0.06615281105041504,,,,,, +47,269649,,,,,,,,,,,,0.057637691497802734,,,,,, +47,269699,,,,,,,,,,,,0.07119271159172058,,,,,, +47,269749,,,,,,,,,,,,0.07208435237407684,,,,,, +47,269799,,,,,,,,,,,,0.06606385111808777,,,,,, +47,269849,,,,,,,,,,,,0.060770001262426376,,,,,, +47,269899,,,,,,,,,,,,0.08112913370132446,,,,,, +47,269949,,,,,,,,,,,,0.055968813598155975,,,,,, +47,269999,,,,,,,,,,,,0.06617216765880585,,,,,, +47,270049,,,,,,,,,,,,0.07732271403074265,,,,,, +47,270099,,,,,,,,,,,,0.061497025191783905,,,,,, +47,270149,,,,,,,,,,,,0.05541712045669556,,,,,, +47,270199,,,,,,,,,,,,0.0581044964492321,,,,,, +47,270249,,,,,,,,,,,,0.06670087575912476,,,,,, +47,270299,,,,,,,,,,,,0.06054583936929703,,,,,, +47,270349,,,,,,,,,,,,0.07052929699420929,,,,,, +47,270399,,,,,,,,,,,,0.05846384912729263,,,,,, +47,270449,,,,,,,,,,,,0.06627203524112701,,,,,, +47,270499,,,,,,,,,,,,0.07060664147138596,,,,,, +47,270549,,,,,,,,,,,,0.05902202054858208,,,,,, +47,270599,,,,,,,,,,,,0.06241758167743683,,,,,, +47,270649,,,,,,,,,,,,0.07712326943874359,,,,,, +47,270699,,,,,,,,,,,,0.0642552301287651,,,,,, +47,270749,,,,,,,,,,,,0.06418685615062714,,,,,, +47,270799,,,,,,,,,,,,0.0668245330452919,,,,,, +47,270849,,,,,,,,,,,,0.05880343168973923,,,,,, +47,270899,,,,,,,,,,,,0.05765364319086075,,,,,, +47,270949,,,,,,,,,,,,0.052426211535930634,,,,,, +47,270999,,,,,,,,,,,,0.0624295137822628,,,,,, +47,271049,,,,,,,,,,,,0.06872425228357315,,,,,, +47,271099,,,,,,,,,,,,0.06555008143186569,,,,,, +47,271149,,,,,,,,,,,,0.06303083896636963,,,,,, +47,271199,,,,,,,,,,,,0.06848318129777908,,,,,, +47,271249,,,,,,,,,,,,0.06513110548257828,,,,,, +47,271299,,,,,,,,,,,,0.05964311584830284,,,,,, +47,271349,,,,,,,,,,,,0.06552557647228241,,,,,, +47,271399,,,,,,,,,,,,0.06252244114875793,,,,,, +47,271449,,,,,,,,,,,,0.069833904504776,,,,,, +47,271499,,,,,,,,,,,,0.06971638649702072,,,,,, +47,271549,,,,,,,,,,,,0.06889091432094574,,,,,, +47,271599,,,,,,,,,,,,0.054750945419073105,,,,,, +47,271649,,,,,,,,,,,,0.06007252633571625,,,,,, +47,271699,,,,,,,,,,,,0.06337346136569977,,,,,, +47,271749,,,,,,,,,,,,0.06376396119594574,,,,,, +47,271799,,,,,,,,,,,,0.06479199975728989,,,,,, +47,271849,,,,,,,,,,,,0.0708964467048645,,,,,, +47,271899,,,,,,,,,,,,0.06383107602596283,,,,,, +47,271949,,,,,,,,,,,,0.06381016969680786,,,,,, +47,271999,,,,,,,,,,,,0.06155233457684517,,,,,, +47,272049,,,,,,,,,,,,0.05920428782701492,,,,,, +47,272099,,,,,,,,,,,,0.07341967523097992,,,,,, +47,272149,,,,,,,,,,,,0.0658055990934372,,,,,, +47,272199,,,,,,,,,,,,0.0630023330450058,,,,,, +47,272249,,,,,,,,,,,,0.06420393288135529,,,,,, +47,272299,,,,,,,,,,,,0.06345981359481812,,,,,, +47,272349,,,,,,,,,,,,0.06286588311195374,,,,,, +47,272399,,,,,,,,,,,,0.06802153587341309,,,,,, +47,272449,,,,,,,,,,,,0.07482106238603592,,,,,, +47,272499,,,,,,,,,,,,0.06198880076408386,,,,,, +47,272549,,,,,,,,,,,,0.0645996481180191,,,,,, +47,272599,,,,,,,,,,,,0.07117915153503418,,,,,, +47,272649,,,,,,,,,,,,0.06586989760398865,,,,,, +47,272699,,,,,,,,,,,,0.07152000069618225,,,,,, +47,272749,,,,,,,,,,,,0.0636875182390213,,,,,, +47,272799,,,,,,,,,,,,0.0799291580915451,,,,,, +47,272849,,,,,,,,,,,,0.06635083258152008,,,,,, +47,272899,,,,,,,,,,,,0.0626467913389206,,,,,, +47,272949,,,,,,,,,,,,0.07276644557714462,,,,,, +47,272999,,,,,,,,,,,,0.05024397373199463,,,,,, +47,273049,,,,,,,,,,,,0.06686725467443466,,,,,, +47,273099,,,,,,,,,,,,0.06754939258098602,,,,,, +47,273149,,,,,,,,,,,,0.07128465920686722,,,,,, +47,273199,,,,,,,,,,,,0.06481563299894333,,,,,, +47,273249,,,,,,,,,,,,0.06214871257543564,,,,,, +47,273299,,,,,,,,,,,,0.06816521286964417,,,,,, +47,273349,,,,,,,,,,,,0.07194940745830536,,,,,, +47,273399,,,,,,,,,,,,0.06328797340393066,,,,,, +47,273449,,,,,,,,,,,,0.05898136645555496,,,,,, +47,273499,,,,,,,,,,,,0.0668950080871582,,,,,, +47,273549,,,,,,,,,,,,0.06679780781269073,,,,,, +47,273599,,,,,,,,,,,,0.06998946517705917,,,,,, +47,273649,,,,,,,,,,,,0.05753141641616821,,,,,, +47,273699,,,,,,,,,,,,0.059379756450653076,,,,,, +47,273749,,,,,,,,,,,,0.06311266869306564,,,,,, +47,273799,,,,,,,,,,,,0.061816804111003876,,,,,, +47,273849,,,,,,,,,,,,0.06838401407003403,,,,,, +47,273899,,,,,,,,,,,,0.06544487923383713,,,,,, +47,273949,,,,,,,,,,,,0.061001889407634735,,,,,, +47,273999,,,,,,,,,,,,0.06396885216236115,,,,,, +47,274049,,,,,,,,,,,,0.059612203389406204,,,,,, +47,274099,,,,,,,,,,,,0.061888258904218674,,,,,, +47,274149,,,,,,,,,,,,0.07083576917648315,,,,,, +47,274199,,,,,,,,,,,,0.06942310929298401,,,,,, +47,274249,,,,,,,,,,,,0.06444808840751648,,,,,, +47,274299,,,,,,,,,,,,0.07201562821865082,,,,,, +47,274349,,,,,,,,,,,,0.05960262939333916,,,,,, +47,274399,,,,,,,,,,,,0.06787408888339996,,,,,, +47,274449,,,,,,,,,,,,0.06300745159387589,,,,,, +47,274499,,,,,,,,,,,,0.05549777299165726,,,,,, +47,274549,,,,,,,,,,,,0.05891721695661545,,,,,, +47,274599,,,,,,,,,,,,0.07854708284139633,,,,,, +47,274649,,,,,,,,,,,,0.06547020375728607,,,,,, +47,274699,,,,,,,,,,,,0.0684656947851181,,,,,, +47,274749,,,,,,,,,,,,0.0718364492058754,,,,,, +47,274799,,,,,,,,,,,,0.05438930168747902,,,,,, +47,274849,,,,,,,,,,,,0.05925162136554718,,,,,, +47,274899,,,,,,,,,,,,0.06326055526733398,,,,,, +47,274949,,,,,,,,,,,,0.0663108378648758,,,,,, +47,274999,,,,,,,,,,,,0.06398789584636688,,,,,, +47,275049,,,,,,,,,,,,0.06748202443122864,,,,,, +47,275099,,,,,,,,,,,,0.07111001014709473,,,,,, +47,275149,,,,,,,,,,,,0.06361956894397736,,,,,, +47,275199,,,,,,,,,,,,0.061724722385406494,,,,,, +47,275249,,,,,,,,,,,,0.057381272315979004,,,,,, +47,275299,,,,,,,,,,,,0.06624564528465271,,,,,, +47,275327,,,,,,,,,,,,,0.24731408059597015,0.08782719820737839,0.20016507804393768,-0.06559395790100098,0.2083219736814499,0.08782719820737839 +47,275327,,,,,,,0.21425843238830566,0.06538201123476028,0.4582583010196686,0.2099921703338623,0.43500399589538574,,,,,,, +48,275349,,,,,,,,,,,,0.07562445104122162,,,,,, +48,275399,,,,,,,,,,,,0.06330172717571259,,,,,, +48,275449,,,,,,,,,,,,0.06256042420864105,,,,,, +48,275499,,,,,,,,,,,,0.06757214665412903,,,,,, +48,275549,,,,,,,,,,,,0.07535985112190247,,,,,, +48,275599,,,,,,,,,,,,0.06056290119886398,,,,,, +48,275649,,,,,,,,,,,,0.060460373759269714,,,,,, +48,275699,,,,,,,,,,,,0.06704430282115936,,,,,, +48,275749,,,,,,,,,,,,0.05955882370471954,,,,,, +48,275799,,,,,,,,,,,,0.07485547661781311,,,,,, +48,275849,,,,,,,,,,,,0.06759013235569,,,,,, +48,275899,,,,,,,,,,,,0.06624968349933624,,,,,, +48,275949,,,,,,,,,,,,0.06588158011436462,,,,,, +48,275999,,,,,,,,,,,,0.06242724508047104,,,,,, +48,276049,,,,,,,,,,,,0.05845559388399124,,,,,, +48,276099,,,,,,,,,,,,0.06450401991605759,,,,,, +48,276149,,,,,,,,,,,,0.06556491553783417,,,,,, +48,276199,,,,,,,,,,,,0.06969063729047775,,,,,, +48,276249,,,,,,,,,,,,0.07602427899837494,,,,,, +48,276299,,,,,,,,,,,,0.06723281741142273,,,,,, +48,276349,,,,,,,,,,,,0.06304723769426346,,,,,, +48,276399,,,,,,,,,,,,0.06799767911434174,,,,,, +48,276449,,,,,,,,,,,,0.06936168670654297,,,,,, +48,276499,,,,,,,,,,,,0.07372886687517166,,,,,, +48,276549,,,,,,,,,,,,0.06603636592626572,,,,,, +48,276599,,,,,,,,,,,,0.060705751180648804,,,,,, +48,276649,,,,,,,,,,,,0.07702217996120453,,,,,, +48,276699,,,,,,,,,,,,0.05537385120987892,,,,,, +48,276749,,,,,,,,,,,,0.06391845643520355,,,,,, +48,276799,,,,,,,,,,,,0.062329500913619995,,,,,, +48,276849,,,,,,,,,,,,0.07507945597171783,,,,,, +48,276899,,,,,,,,,,,,0.06799690425395966,,,,,, +48,276949,,,,,,,,,,,,0.07317474484443665,,,,,, +48,276999,,,,,,,,,,,,0.07091470062732697,,,,,, +48,277049,,,,,,,,,,,,0.06984234601259232,,,,,, +48,277099,,,,,,,,,,,,0.05982616916298866,,,,,, +48,277149,,,,,,,,,,,,0.0691928118467331,,,,,, +48,277199,,,,,,,,,,,,0.07216404378414154,,,,,, +48,277249,,,,,,,,,,,,0.06637495011091232,,,,,, +48,277299,,,,,,,,,,,,0.08266757428646088,,,,,, +48,277349,,,,,,,,,,,,0.07066944241523743,,,,,, +48,277399,,,,,,,,,,,,0.07943488657474518,,,,,, +48,277449,,,,,,,,,,,,0.05946199595928192,,,,,, +48,277499,,,,,,,,,,,,0.06022731587290764,,,,,, +48,277549,,,,,,,,,,,,0.055947091430425644,,,,,, +48,277599,,,,,,,,,,,,0.05704783648252487,,,,,, +48,277649,,,,,,,,,,,,0.06093200296163559,,,,,, +48,277699,,,,,,,,,,,,0.0715036690235138,,,,,, +48,277749,,,,,,,,,,,,0.06241290643811226,,,,,, +48,277799,,,,,,,,,,,,0.07281536608934402,,,,,, +48,277849,,,,,,,,,,,,0.07176259905099869,,,,,, +48,277899,,,,,,,,,,,,0.07091114670038223,,,,,, +48,277949,,,,,,,,,,,,0.061569564044475555,,,,,, +48,277999,,,,,,,,,,,,0.060143448412418365,,,,,, +48,278049,,,,,,,,,,,,0.06848409026861191,,,,,, +48,278099,,,,,,,,,,,,0.08333009481430054,,,,,, +48,278149,,,,,,,,,,,,0.06728531420230865,,,,,, +48,278199,,,,,,,,,,,,0.06477472186088562,,,,,, +48,278249,,,,,,,,,,,,0.0643799677491188,,,,,, +48,278299,,,,,,,,,,,,0.07155850529670715,,,,,, +48,278349,,,,,,,,,,,,0.05873554199934006,,,,,, +48,278399,,,,,,,,,,,,0.07219033688306808,,,,,, +48,278449,,,,,,,,,,,,0.06544192135334015,,,,,, +48,278499,,,,,,,,,,,,0.0660194456577301,,,,,, +48,278549,,,,,,,,,,,,0.06053610518574715,,,,,, +48,278599,,,,,,,,,,,,0.06470231711864471,,,,,, +48,278649,,,,,,,,,,,,0.06631650775671005,,,,,, +48,278699,,,,,,,,,,,,0.06188112869858742,,,,,, +48,278749,,,,,,,,,,,,0.06707999855279922,,,,,, +48,278799,,,,,,,,,,,,0.06064879149198532,,,,,, +48,278849,,,,,,,,,,,,0.060889869928359985,,,,,, +48,278899,,,,,,,,,,,,0.05933369696140289,,,,,, +48,278949,,,,,,,,,,,,0.06271648406982422,,,,,, +48,278999,,,,,,,,,,,,0.06867510080337524,,,,,, +48,279049,,,,,,,,,,,,0.06370145827531815,,,,,, +48,279099,,,,,,,,,,,,0.06534165889024734,,,,,, +48,279149,,,,,,,,,,,,0.06804442405700684,,,,,, +48,279199,,,,,,,,,,,,0.08518921583890915,,,,,, +48,279249,,,,,,,,,,,,0.06619462370872498,,,,,, +48,279299,,,,,,,,,,,,0.06329886615276337,,,,,, +48,279349,,,,,,,,,,,,0.06337140500545502,,,,,, +48,279399,,,,,,,,,,,,0.07434551417827606,,,,,, +48,279449,,,,,,,,,,,,0.06724020838737488,,,,,, +48,279499,,,,,,,,,,,,0.0688788890838623,,,,,, +48,279549,,,,,,,,,,,,0.06458988785743713,,,,,, +48,279599,,,,,,,,,,,,0.06455861032009125,,,,,, +48,279649,,,,,,,,,,,,0.06296263635158539,,,,,, +48,279699,,,,,,,,,,,,0.06765858829021454,,,,,, +48,279749,,,,,,,,,,,,0.06511513143777847,,,,,, +48,279799,,,,,,,,,,,,0.060495756566524506,,,,,, +48,279849,,,,,,,,,,,,0.058027107268571854,,,,,, +48,279899,,,,,,,,,,,,0.06314597278833389,,,,,, +48,279949,,,,,,,,,,,,0.06722061336040497,,,,,, +48,279999,,,,,,,,,,,,0.057500455528497696,,,,,, +48,280049,,,,,,,,,,,,0.06284847110509872,,,,,, +48,280099,,,,,,,,,,,,0.06828171014785767,,,,,, +48,280149,,,,,,,,,,,,0.07102327048778534,,,,,, +48,280199,,,,,,,,,,,,0.07307951152324677,,,,,, +48,280249,,,,,,,,,,,,0.07381665706634521,,,,,, +48,280299,,,,,,,,,,,,0.06739722192287445,,,,,, +48,280349,,,,,,,,,,,,0.058364421129226685,,,,,, +48,280399,,,,,,,,,,,,0.0676058679819107,,,,,, +48,280449,,,,,,,,,,,,0.0630212128162384,,,,,, +48,280499,,,,,,,,,,,,0.06684517115354538,,,,,, +48,280549,,,,,,,,,,,,0.07458139210939407,,,,,, +48,280599,,,,,,,,,,,,0.07407227903604507,,,,,, +48,280649,,,,,,,,,,,,0.07508201897144318,,,,,, +48,280699,,,,,,,,,,,,0.05744008719921112,,,,,, +48,280749,,,,,,,,,,,,0.06542078405618668,,,,,, +48,280799,,,,,,,,,,,,0.06498900055885315,,,,,, +48,280849,,,,,,,,,,,,0.05913042277097702,,,,,, +48,280899,,,,,,,,,,,,0.07236623764038086,,,,,, +48,280949,,,,,,,,,,,,0.05787736922502518,,,,,, +48,280999,,,,,,,,,,,,0.07227680832147598,,,,,, +48,281049,,,,,,,,,,,,0.06387506425380707,,,,,, +48,281063,,,,,,,,,,,,,0.24736125767230988,0.08761817961931229,0.19540591537952423,-0.06305789947509766,0.2031969577074051,0.08761817961931229 +48,281063,,,,,,,0.21425724029541016,0.06535004079341888,0.45867881178855896,0.2103884220123291,0.43514078855514526,,,,,,, +49,281099,,,,,,,,,,,,0.054894037544727325,,,,,, +49,281149,,,,,,,,,,,,0.06563803553581238,,,,,, +49,281199,,,,,,,,,,,,0.06947697699069977,,,,,, +49,281249,,,,,,,,,,,,0.06522771716117859,,,,,, +49,281299,,,,,,,,,,,,0.06086784228682518,,,,,, +49,281349,,,,,,,,,,,,0.06748241931200027,,,,,, +49,281399,,,,,,,,,,,,0.07562385499477386,,,,,, +49,281449,,,,,,,,,,,,0.06675320863723755,,,,,, +49,281499,,,,,,,,,,,,0.05830766260623932,,,,,, +49,281549,,,,,,,,,,,,0.06849893927574158,,,,,, +49,281599,,,,,,,,,,,,0.06774511933326721,,,,,, +49,281649,,,,,,,,,,,,0.0702562928199768,,,,,, +49,281699,,,,,,,,,,,,0.06664514541625977,,,,,, +49,281749,,,,,,,,,,,,0.0708875060081482,,,,,, +49,281799,,,,,,,,,,,,0.06546381860971451,,,,,, +49,281849,,,,,,,,,,,,0.07385390996932983,,,,,, +49,281899,,,,,,,,,,,,0.06572289764881134,,,,,, +49,281949,,,,,,,,,,,,0.06265931576490402,,,,,, +49,281999,,,,,,,,,,,,0.05858146399259567,,,,,, +49,282049,,,,,,,,,,,,0.056824229657649994,,,,,, +49,282099,,,,,,,,,,,,0.05991654843091965,,,,,, +49,282149,,,,,,,,,,,,0.07108455151319504,,,,,, +49,282199,,,,,,,,,,,,0.06339144706726074,,,,,, +49,282249,,,,,,,,,,,,0.06584955006837845,,,,,, +49,282299,,,,,,,,,,,,0.05950465425848961,,,,,, +49,282349,,,,,,,,,,,,0.061884716153144836,,,,,, +49,282399,,,,,,,,,,,,0.06701088696718216,,,,,, +49,282449,,,,,,,,,,,,0.05930662900209427,,,,,, +49,282499,,,,,,,,,,,,0.06256645172834396,,,,,, +49,282549,,,,,,,,,,,,0.04800271615386009,,,,,, +49,282599,,,,,,,,,,,,0.06749963015317917,,,,,, +49,282649,,,,,,,,,,,,0.07474835216999054,,,,,, +49,282699,,,,,,,,,,,,0.056924887001514435,,,,,, +49,282749,,,,,,,,,,,,0.06649035215377808,,,,,, +49,282799,,,,,,,,,,,,0.06141766905784607,,,,,, +49,282849,,,,,,,,,,,,0.060185082256793976,,,,,, +49,282899,,,,,,,,,,,,0.07364697009325027,,,,,, +49,282949,,,,,,,,,,,,0.06229260191321373,,,,,, +49,282999,,,,,,,,,,,,0.06615307927131653,,,,,, +49,283049,,,,,,,,,,,,0.06486283242702484,,,,,, +49,283099,,,,,,,,,,,,0.07494636625051498,,,,,, +49,283149,,,,,,,,,,,,0.07642124593257904,,,,,, +49,283199,,,,,,,,,,,,0.0579792857170105,,,,,, +49,283249,,,,,,,,,,,,0.06026024743914604,,,,,, +49,283299,,,,,,,,,,,,0.05773531645536423,,,,,, +49,283349,,,,,,,,,,,,0.07242324203252792,,,,,, +49,283399,,,,,,,,,,,,0.06526756286621094,,,,,, +49,283449,,,,,,,,,,,,0.07117410004138947,,,,,, +49,283499,,,,,,,,,,,,0.06306581199169159,,,,,, +49,283549,,,,,,,,,,,,0.05517057701945305,,,,,, +49,283599,,,,,,,,,,,,0.061490632593631744,,,,,, +49,283649,,,,,,,,,,,,0.06095871329307556,,,,,, +49,283699,,,,,,,,,,,,0.05922283977270126,,,,,, +49,283749,,,,,,,,,,,,0.06162067502737045,,,,,, +49,283799,,,,,,,,,,,,0.07502090930938721,,,,,, +49,283849,,,,,,,,,,,,0.06834230571985245,,,,,, +49,283899,,,,,,,,,,,,0.06528531759977341,,,,,, +49,283949,,,,,,,,,,,,0.060060855001211166,,,,,, +49,283999,,,,,,,,,,,,0.0603693351149559,,,,,, +49,284049,,,,,,,,,,,,0.0691620409488678,,,,,, +49,284099,,,,,,,,,,,,0.06422737240791321,,,,,, +49,284149,,,,,,,,,,,,0.0750860944390297,,,,,, +49,284199,,,,,,,,,,,,0.07852575927972794,,,,,, +49,284249,,,,,,,,,,,,0.05941084027290344,,,,,, +49,284299,,,,,,,,,,,,0.06749050319194794,,,,,, +49,284349,,,,,,,,,,,,0.0627504363656044,,,,,, +49,284399,,,,,,,,,,,,0.056418854743242264,,,,,, +49,284449,,,,,,,,,,,,0.05929715558886528,,,,,, +49,284499,,,,,,,,,,,,0.06180070713162422,,,,,, +49,284549,,,,,,,,,,,,0.06295802444219589,,,,,, +49,284599,,,,,,,,,,,,0.07367488741874695,,,,,, +49,284649,,,,,,,,,,,,0.06000521034002304,,,,,, +49,284699,,,,,,,,,,,,0.05889737978577614,,,,,, +49,284749,,,,,,,,,,,,0.0627734363079071,,,,,, +49,284799,,,,,,,,,,,,0.0612882599234581,,,,,, +49,284849,,,,,,,,,,,,0.06794895231723785,,,,,, +49,284899,,,,,,,,,,,,0.07669448852539062,,,,,, +49,284949,,,,,,,,,,,,0.07390111684799194,,,,,, +49,284999,,,,,,,,,,,,0.06853961199522018,,,,,, +49,285049,,,,,,,,,,,,0.06591474264860153,,,,,, +49,285099,,,,,,,,,,,,0.0683857873082161,,,,,, +49,285149,,,,,,,,,,,,0.0601157620549202,,,,,, +49,285199,,,,,,,,,,,,0.06972578167915344,,,,,, +49,285249,,,,,,,,,,,,0.07543579488992691,,,,,, +49,285299,,,,,,,,,,,,0.0700942873954773,,,,,, +49,285349,,,,,,,,,,,,0.07115446031093597,,,,,, +49,285399,,,,,,,,,,,,0.07100158929824829,,,,,, +49,285449,,,,,,,,,,,,0.06372621655464172,,,,,, +49,285499,,,,,,,,,,,,0.07017114013433456,,,,,, +49,285549,,,,,,,,,,,,0.06561991572380066,,,,,, +49,285599,,,,,,,,,,,,0.07164132595062256,,,,,, +49,285649,,,,,,,,,,,,0.0703844279050827,,,,,, +49,285699,,,,,,,,,,,,0.06882071495056152,,,,,, +49,285749,,,,,,,,,,,,0.0681922659277916,,,,,, +49,285799,,,,,,,,,,,,0.06596503406763077,,,,,, +49,285849,,,,,,,,,,,,0.062355175614356995,,,,,, +49,285899,,,,,,,,,,,,0.06847967207431793,,,,,, +49,285949,,,,,,,,,,,,0.06758543848991394,,,,,, +49,285999,,,,,,,,,,,,0.06398846209049225,,,,,, +49,286049,,,,,,,,,,,,0.06496382504701614,,,,,, +49,286099,,,,,,,,,,,,0.06560006737709045,,,,,, +49,286149,,,,,,,,,,,,0.054436273872852325,,,,,, +49,286199,,,,,,,,,,,,0.05795396491885185,,,,,, +49,286249,,,,,,,,,,,,0.06444519758224487,,,,,, +49,286299,,,,,,,,,,,,0.07604381442070007,,,,,, +49,286349,,,,,,,,,,,,0.06455207616090775,,,,,, +49,286399,,,,,,,,,,,,0.07643350958824158,,,,,, +49,286449,,,,,,,,,,,,0.07014337182044983,,,,,, +49,286499,,,,,,,,,,,,0.05429738759994507,,,,,, +49,286549,,,,,,,,,,,,0.05825401470065117,,,,,, +49,286599,,,,,,,,,,,,0.058463890105485916,,,,,, +49,286649,,,,,,,,,,,,0.06576545536518097,,,,,, +49,286699,,,,,,,,,,,,0.06280138343572617,,,,,, +49,286749,,,,,,,,,,,,0.08255741000175476,,,,,, +49,286799,,,,,,,,,,,,0.11866714060306549,,,,,, +49,286799,,,,,,,,,,,,,0.24592432379722595,0.086664117872715,0.20528562366962433,-0.051482439041137695,0.21276222169399261,0.086664117872715 +49,286799,,,,,,,0.21422220766544342,0.06537223607301712,0.45838698744773865,0.21011465787887573,0.4353110194206238,,,,,,, +50,286800,0.23896783590316772,0.07788914442062378,0.24284584820270538,0.05812174081802368,0.25745221972465515,0.07788914442062378,,,,,,,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1bfd752ab5dd2eef76bbd2437e4461817cf9604e --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml @@ -0,0 +1,22 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: sweetnet + num_layers: 16 + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly +seed: 44 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..7c5d34037b08ab7e706e35c9def7c8c4f9490801 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv @@ -0,0 +1,781 @@ +epoch,step,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +0,49,,,,,,0.07811558991670609,,,,,, +0,99,,,,,,0.07837015390396118,,,,,, +0,149,,,,,,0.07882598042488098,,,,,, +0,199,,,,,,0.07783704251050949,,,,,, +0,249,,,,,,0.09082143008708954,,,,,, +0,299,,,,,,0.09601463377475739,,,,,, +0,349,,,,,,0.08546002209186554,,,,,, +0,399,,,,,,0.10232475399971008,,,,,, +0,449,,,,,,0.08530102670192719,,,,,, +0,499,,,,,,0.09442990273237228,,,,,, +0,549,,,,,,0.08863208442926407,,,,,, +0,599,,,,,,0.08276236057281494,,,,,, +0,649,,,,,,0.08492408692836761,,,,,, +0,699,,,,,,0.09670647978782654,,,,,, +0,749,,,,,,0.07577475905418396,,,,,, +0,799,,,,,,0.08208747208118439,,,,,, +0,849,,,,,,0.08431809395551682,,,,,, +0,899,,,,,,0.07676301896572113,,,,,, +0,949,,,,,,0.07869276404380798,,,,,, +0,999,,,,,,0.08199672400951385,,,,,, +0,1049,,,,,,0.08440235257148743,,,,,, +0,1099,,,,,,0.07708219438791275,,,,,, +0,1149,,,,,,0.07772642374038696,,,,,, +0,1199,,,,,,0.0880901888012886,,,,,, +0,1249,,,,,,0.07541598379611969,,,,,, +0,1299,,,,,,0.0879611000418663,,,,,, +0,1349,,,,,,0.08085120469331741,,,,,, +0,1399,,,,,,0.07884678244590759,,,,,, +0,1449,,,,,,0.09208939969539642,,,,,, +0,1499,,,,,,0.08166688680648804,,,,,, +0,1549,,,,,,0.07803484797477722,,,,,, +0,1599,,,,,,0.06791338324546814,,,,,, +0,1649,,,,,,0.07944397628307343,,,,,, +0,1699,,,,,,0.0673367828130722,,,,,, +0,1749,,,,,,0.08339886367321014,,,,,, +0,1799,,,,,,0.08085991442203522,,,,,, +0,1849,,,,,,0.07142699509859085,,,,,, +0,1899,,,,,,0.08317957818508148,,,,,, +0,1949,,,,,,0.09239502251148224,,,,,, +0,1999,,,,,,0.0881720781326294,,,,,, +0,2049,,,,,,0.09347299486398697,,,,,, +0,2099,,,,,,0.09153014421463013,,,,,, +0,2149,,,,,,0.08376334607601166,,,,,, +0,2199,,,,,,0.09054563194513321,,,,,, +0,2249,,,,,,0.09764149785041809,,,,,, +0,2299,,,,,,0.09049380570650101,,,,,, +0,2349,,,,,,0.09105198830366135,,,,,, +0,2399,,,,,,0.08332842588424683,,,,,, +0,2449,,,,,,0.08534832298755646,,,,,, +0,2499,,,,,,0.07363065332174301,,,,,, +0,2549,,,,,,0.07534852623939514,,,,,, +0,2599,,,,,,0.07453012466430664,,,,,, +0,2649,,,,,,0.08958075195550919,,,,,, +0,2699,,,,,,0.07775477319955826,,,,,, +0,2749,,,,,,0.08651252090930939,,,,,, +0,2799,,,,,,0.0744125247001648,,,,,, +0,2849,,,,,,0.08832389116287231,,,,,, +0,2899,,,,,,0.08412287384271622,,,,,, +0,2949,,,,,,0.0790419802069664,,,,,, +0,2999,,,,,,0.08076754212379456,,,,,, +0,3049,,,,,,0.08754080533981323,,,,,, +0,3099,,,,,,0.08497416228055954,,,,,, +0,3149,,,,,,0.09659571200609207,,,,,, +0,3199,,,,,,0.08984699100255966,,,,,, +0,3249,,,,,,0.08221855759620667,,,,,, +0,3299,,,,,,0.09185542166233063,,,,,, +0,3349,,,,,,0.07360746711492538,,,,,, +0,3399,,,,,,0.08144323527812958,,,,,, +0,3449,,,,,,0.07477235794067383,,,,,, +0,3499,,,,,,0.069693423807621,,,,,, +0,3549,,,,,,0.07244805991649628,,,,,, +0,3599,,,,,,0.08453653752803802,,,,,, +0,3649,,,,,,0.07275073975324631,,,,,, +0,3699,,,,,,0.07994452118873596,,,,,, +0,3749,,,,,,0.0774010419845581,,,,,, +0,3799,,,,,,0.08282420039176941,,,,,, +0,3849,,,,,,0.09238399565219879,,,,,, +0,3899,,,,,,0.07982782274484634,,,,,, +0,3949,,,,,,0.07944963872432709,,,,,, +0,3999,,,,,,0.09439684450626373,,,,,, +0,4049,,,,,,0.09401357173919678,,,,,, +0,4099,,,,,,0.08633211255073547,,,,,, +0,4149,,,,,,0.07849226891994476,,,,,, +0,4199,,,,,,0.09335044771432877,,,,,, +0,4249,,,,,,0.07674786448478699,,,,,, +0,4299,,,,,,0.08605408668518066,,,,,, +0,4349,,,,,,0.08011232316493988,,,,,, +0,4399,,,,,,0.08927960693836212,,,,,, +0,4449,,,,,,0.08016937226057053,,,,,, +0,4499,,,,,,0.07365493476390839,,,,,, +0,4549,,,,,,0.08648383617401123,,,,,, +0,4599,,,,,,0.08821980655193329,,,,,, +0,4649,,,,,,0.07069005072116852,,,,,, +0,4699,,,,,,0.07069283723831177,,,,,, +0,4749,,,,,,0.08886653184890747,,,,,, +0,4799,,,,,,0.07975473999977112,,,,,, +0,4849,,,,,,0.08006416261196136,,,,,, +0,4899,,,,,,0.07328099012374878,,,,,, +0,4949,,,,,,0.07605010271072388,,,,,, +0,4999,,,,,,0.08335575461387634,,,,,, +0,5049,,,,,,0.08585190773010254,,,,,, +0,5099,,,,,,0.0984349399805069,,,,,, +0,5149,,,,,,0.07609815150499344,,,,,, +0,5199,,,,,,0.08194395154714584,,,,,, +0,5249,,,,,,0.08602271974086761,,,,,, +0,5299,,,,,,0.07379322499036789,,,,,, +0,5349,,,,,,0.0788770392537117,,,,,, +0,5399,,,,,,0.07607034593820572,,,,,, +0,5449,,,,,,0.08014878630638123,,,,,, +0,5499,,,,,,0.09381867945194244,,,,,, +0,5549,,,,,,0.08259209990501404,,,,,, +0,5599,,,,,,0.07127746939659119,,,,,, +0,5649,,,,,,0.08541826903820038,,,,,, +0,5699,,,,,,0.0884055644273758,,,,,, +0,5735,,,,,,,0.24300244450569153,0.07963331043720245,0.20164485275745392,0.033821284770965576,0.18855039775371552,0.07963331043720245 +0,5735,0.2488621473312378,0.08408326655626297,0.059731997549533844,-0.015969514846801758,0.06450241059064865,,,,,,, +1,5749,,,,,,0.08082428574562073,,,,,, +1,5799,,,,,,0.08047309517860413,,,,,, +1,5849,,,,,,0.09375285357236862,,,,,, +1,5899,,,,,,0.07843799889087677,,,,,, +1,5949,,,,,,0.08398663997650146,,,,,, +1,5999,,,,,,0.08626590669155121,,,,,, +1,6049,,,,,,0.07784934341907501,,,,,, +1,6099,,,,,,0.07560662925243378,,,,,, +1,6149,,,,,,0.07647207379341125,,,,,, +1,6199,,,,,,0.08896644413471222,,,,,, +1,6249,,,,,,0.0783519595861435,,,,,, +1,6299,,,,,,0.08195050805807114,,,,,, +1,6349,,,,,,0.070168137550354,,,,,, +1,6399,,,,,,0.0727352648973465,,,,,, +1,6449,,,,,,0.07964780926704407,,,,,, +1,6499,,,,,,0.0906280055642128,,,,,, +1,6549,,,,,,0.08335456252098083,,,,,, +1,6599,,,,,,0.07915884256362915,,,,,, +1,6649,,,,,,0.08944104611873627,,,,,, +1,6699,,,,,,0.08035878837108612,,,,,, +1,6749,,,,,,0.08392151445150375,,,,,, +1,6799,,,,,,0.07848047465085983,,,,,, +1,6849,,,,,,0.09091486036777496,,,,,, +1,6899,,,,,,0.08566305786371231,,,,,, +1,6949,,,,,,0.0734916627407074,,,,,, +1,6999,,,,,,0.0868121087551117,,,,,, +1,7049,,,,,,0.094868965446949,,,,,, +1,7099,,,,,,0.07785914093255997,,,,,, +1,7149,,,,,,0.07054434716701508,,,,,, +1,7199,,,,,,0.07543275505304337,,,,,, +1,7249,,,,,,0.06917091459035873,,,,,, +1,7299,,,,,,0.09026339650154114,,,,,, +1,7349,,,,,,0.08331165462732315,,,,,, +1,7399,,,,,,0.0742083340883255,,,,,, +1,7449,,,,,,0.07645168900489807,,,,,, +1,7499,,,,,,0.08600344508886337,,,,,, +1,7549,,,,,,0.07388858497142792,,,,,, +1,7599,,,,,,0.08050724864006042,,,,,, +1,7649,,,,,,0.0955313891172409,,,,,, +1,7699,,,,,,0.08178511261940002,,,,,, +1,7749,,,,,,0.07060720026493073,,,,,, +1,7799,,,,,,0.06840063631534576,,,,,, +1,7849,,,,,,0.07334169745445251,,,,,, +1,7899,,,,,,0.0761839896440506,,,,,, +1,7949,,,,,,0.07557905465364456,,,,,, +1,7999,,,,,,0.08365269750356674,,,,,, +1,8049,,,,,,0.07485175132751465,,,,,, +1,8099,,,,,,0.08051030337810516,,,,,, +1,8149,,,,,,0.07708011567592621,,,,,, +1,8199,,,,,,0.08170589059591293,,,,,, +1,8249,,,,,,0.07782438397407532,,,,,, +1,8299,,,,,,0.08536501228809357,,,,,, +1,8349,,,,,,0.07572582364082336,,,,,, +1,8399,,,,,,0.08253023773431778,,,,,, +1,8449,,,,,,0.08881299197673798,,,,,, +1,8499,,,,,,0.08323141932487488,,,,,, +1,8549,,,,,,0.08319686353206635,,,,,, +1,8599,,,,,,0.0814354196190834,,,,,, +1,8649,,,,,,0.07365203648805618,,,,,, +1,8699,,,,,,0.0751170665025711,,,,,, +1,8749,,,,,,0.07271379232406616,,,,,, +1,8799,,,,,,0.08207154273986816,,,,,, +1,8849,,,,,,0.07106387615203857,,,,,, +1,8899,,,,,,0.0770392119884491,,,,,, +1,8949,,,,,,0.08490508794784546,,,,,, +1,8999,,,,,,0.08738110959529877,,,,,, +1,9049,,,,,,0.08689804375171661,,,,,, +1,9099,,,,,,0.08339664340019226,,,,,, +1,9149,,,,,,0.07671813666820526,,,,,, +1,9199,,,,,,0.07509027421474457,,,,,, +1,9249,,,,,,0.07948018610477448,,,,,, +1,9299,,,,,,0.09362997859716415,,,,,, +1,9349,,,,,,0.0831972137093544,,,,,, +1,9399,,,,,,0.08371913433074951,,,,,, +1,9449,,,,,,0.10285114496946335,,,,,, +1,9499,,,,,,0.08150836825370789,,,,,, +1,9549,,,,,,0.09379696100950241,,,,,, +1,9599,,,,,,0.0823514387011528,,,,,, +1,9649,,,,,,0.07627027481794357,,,,,, +1,9699,,,,,,0.07142181694507599,,,,,, +1,9749,,,,,,0.08048632740974426,,,,,, +1,9799,,,,,,0.08332935720682144,,,,,, +1,9849,,,,,,0.08692370355129242,,,,,, +1,9899,,,,,,0.07960265874862671,,,,,, +1,9949,,,,,,0.07538828253746033,,,,,, +1,9999,,,,,,0.08106210827827454,,,,,, +1,10049,,,,,,0.07505445182323456,,,,,, +1,10099,,,,,,0.07860881090164185,,,,,, +1,10149,,,,,,0.07426847517490387,,,,,, +1,10199,,,,,,0.07951021194458008,,,,,, +1,10249,,,,,,0.06540794670581818,,,,,, +1,10299,,,,,,0.07818032801151276,,,,,, +1,10349,,,,,,0.07039546966552734,,,,,, +1,10399,,,,,,0.0818791389465332,,,,,, +1,10449,,,,,,0.0755007416009903,,,,,, +1,10499,,,,,,0.08136767148971558,,,,,, +1,10549,,,,,,0.07739511877298355,,,,,, +1,10599,,,,,,0.090574249625206,,,,,, +1,10649,,,,,,0.07745339721441269,,,,,, +1,10699,,,,,,0.07074147462844849,,,,,, +1,10749,,,,,,0.08424249291419983,,,,,, +1,10799,,,,,,0.09598013013601303,,,,,, +1,10849,,,,,,0.08489851653575897,,,,,, +1,10899,,,,,,0.08553033322095871,,,,,, +1,10949,,,,,,0.08854199945926666,,,,,, +1,10999,,,,,,0.06725001335144043,,,,,, +1,11049,,,,,,0.0775994062423706,,,,,, +1,11099,,,,,,0.07496374845504761,,,,,, +1,11149,,,,,,0.09024403989315033,,,,,, +1,11199,,,,,,0.08334030210971832,,,,,, +1,11249,,,,,,0.07547236233949661,,,,,, +1,11299,,,,,,0.08636466413736343,,,,,, +1,11349,,,,,,0.08050687611103058,,,,,, +1,11399,,,,,,0.07435967773199081,,,,,, +1,11449,,,,,,0.07406923919916153,,,,,, +1,11471,,,,,,,0.24706237018108368,0.08219688385725021,0.09231418371200562,0.0027177929878234863,0.12848412990570068,0.08219688385725021 +1,11471,0.24450214207172394,0.0806635171175003,0.15971709787845612,0.025352120399475098,0.14163005352020264,,,,,,, +2,11499,,,,,,0.07927721738815308,,,,,, +2,11549,,,,,,0.08109351247549057,,,,,, +2,11599,,,,,,0.07832710444927216,,,,,, +2,11649,,,,,,0.07269687205553055,,,,,, +2,11699,,,,,,0.07074221968650818,,,,,, +2,11749,,,,,,0.07812052965164185,,,,,, +2,11799,,,,,,0.07993759214878082,,,,,, +2,11849,,,,,,0.08114247024059296,,,,,, +2,11899,,,,,,0.08584657311439514,,,,,, +2,11949,,,,,,0.08060969412326813,,,,,, +2,11999,,,,,,0.06827713549137115,,,,,, +2,12049,,,,,,0.08215713500976562,,,,,, +2,12099,,,,,,0.07142838090658188,,,,,, +2,12149,,,,,,0.0728859230875969,,,,,, +2,12199,,,,,,0.07797074317932129,,,,,, +2,12249,,,,,,0.07363244891166687,,,,,, +2,12299,,,,,,0.0644313395023346,,,,,, +2,12349,,,,,,0.09275670349597931,,,,,, +2,12399,,,,,,0.060493338853120804,,,,,, +2,12449,,,,,,0.0808647871017456,,,,,, +2,12499,,,,,,0.08753043413162231,,,,,, +2,12549,,,,,,0.07969220727682114,,,,,, +2,12599,,,,,,0.0882302075624466,,,,,, +2,12649,,,,,,0.0816318690776825,,,,,, +2,12699,,,,,,0.09430770576000214,,,,,, +2,12749,,,,,,0.07526914030313492,,,,,, +2,12799,,,,,,0.08667101711034775,,,,,, +2,12849,,,,,,0.07420062273740768,,,,,, +2,12899,,,,,,0.07532617449760437,,,,,, +2,12949,,,,,,0.08285535126924515,,,,,, +2,12999,,,,,,0.07590582221746445,,,,,, +2,13049,,,,,,0.08680015802383423,,,,,, +2,13099,,,,,,0.08163855969905853,,,,,, +2,13149,,,,,,0.07603541016578674,,,,,, +2,13199,,,,,,0.07976874709129333,,,,,, +2,13249,,,,,,0.08063922077417374,,,,,, +2,13299,,,,,,0.07457075268030167,,,,,, +2,13349,,,,,,0.07902256399393082,,,,,, +2,13399,,,,,,0.08314619213342667,,,,,, +2,13449,,,,,,0.09482883661985397,,,,,, +2,13499,,,,,,0.07988153398036957,,,,,, +2,13549,,,,,,0.08486925065517426,,,,,, +2,13599,,,,,,0.07873871177434921,,,,,, +2,13649,,,,,,0.08138590306043625,,,,,, +2,13699,,,,,,0.08566311746835709,,,,,, +2,13749,,,,,,0.08201573044061661,,,,,, +2,13799,,,,,,0.06749385595321655,,,,,, +2,13849,,,,,,0.10609821230173111,,,,,, +2,13899,,,,,,0.08744934946298599,,,,,, +2,13949,,,,,,0.08257941901683807,,,,,, +2,13999,,,,,,0.08485929667949677,,,,,, +2,14049,,,,,,0.0793643593788147,,,,,, +2,14099,,,,,,0.08074027299880981,,,,,, +2,14149,,,,,,0.08651528507471085,,,,,, +2,14199,,,,,,0.08197185397148132,,,,,, +2,14249,,,,,,0.08599834144115448,,,,,, +2,14299,,,,,,0.0779590755701065,,,,,, +2,14349,,,,,,0.07236465066671371,,,,,, +2,14399,,,,,,0.08328667283058167,,,,,, +2,14449,,,,,,0.09001810848712921,,,,,, +2,14499,,,,,,0.06680575013160706,,,,,, +2,14549,,,,,,0.09166574478149414,,,,,, +2,14599,,,,,,0.08095603436231613,,,,,, +2,14649,,,,,,0.09692457318305969,,,,,, +2,14699,,,,,,0.07543638348579407,,,,,, +2,14749,,,,,,0.09099367260932922,,,,,, +2,14799,,,,,,0.08221082389354706,,,,,, +2,14849,,,,,,0.07627974450588226,,,,,, +2,14899,,,,,,0.08407537639141083,,,,,, +2,14949,,,,,,0.09089334309101105,,,,,, +2,14999,,,,,,0.0680840015411377,,,,,, +2,15049,,,,,,0.08455533534288406,,,,,, +2,15099,,,,,,0.09546537697315216,,,,,, +2,15149,,,,,,0.08514855057001114,,,,,, +2,15199,,,,,,0.07843241095542908,,,,,, +2,15249,,,,,,0.08624038845300674,,,,,, +2,15299,,,,,,0.07425015419721603,,,,,, +2,15349,,,,,,0.08525526523590088,,,,,, +2,15399,,,,,,0.08803190290927887,,,,,, +2,15449,,,,,,0.08115457743406296,,,,,, +2,15499,,,,,,0.09017767012119293,,,,,, +2,15549,,,,,,0.09105247259140015,,,,,, +2,15599,,,,,,0.08550570905208588,,,,,, +2,15649,,,,,,0.07987397909164429,,,,,, +2,15699,,,,,,0.08115050941705704,,,,,, +2,15749,,,,,,0.08308129012584686,,,,,, +2,15799,,,,,,0.07356799393892288,,,,,, +2,15849,,,,,,0.08543896675109863,,,,,, +2,15899,,,,,,0.07666109502315521,,,,,, +2,15949,,,,,,0.08099348843097687,,,,,, +2,15999,,,,,,0.0729854553937912,,,,,, +2,16049,,,,,,0.08066873252391815,,,,,, +2,16099,,,,,,0.08276238292455673,,,,,, +2,16149,,,,,,0.07817365229129791,,,,,, +2,16199,,,,,,0.07728266716003418,,,,,, +2,16249,,,,,,0.08215776085853577,,,,,, +2,16299,,,,,,0.08096004277467728,,,,,, +2,16349,,,,,,0.07789093255996704,,,,,, +2,16399,,,,,,0.09409011155366898,,,,,, +2,16449,,,,,,0.08446371555328369,,,,,, +2,16499,,,,,,0.0790051743388176,,,,,, +2,16549,,,,,,0.07734091579914093,,,,,, +2,16599,,,,,,0.09313637018203735,,,,,, +2,16649,,,,,,0.08871938288211823,,,,,, +2,16699,,,,,,0.07554103434085846,,,,,, +2,16749,,,,,,0.09193740785121918,,,,,, +2,16799,,,,,,0.08415356278419495,,,,,, +2,16849,,,,,,0.06632515788078308,,,,,, +2,16899,,,,,,0.07643502950668335,,,,,, +2,16949,,,,,,0.07574871182441711,,,,,, +2,16999,,,,,,0.07683323323726654,,,,,, +2,17049,,,,,,0.07649993896484375,,,,,, +2,17099,,,,,,0.08869766443967819,,,,,, +2,17149,,,,,,0.08920789510011673,,,,,, +2,17199,,,,,,0.09139969944953918,,,,,, +2,17207,,,,,,,0.24491220712661743,0.08109848201274872,0.1364440768957138,0.016044557094573975,0.14838601648807526,0.08109848201274872 +2,17207,0.24562934041023254,0.08139155805110931,0.13308198750019073,0.0165712833404541,0.11882930248975754,,,,,,, +3,17249,,,,,,0.08131358027458191,,,,,, +3,17299,,,,,,0.08688215911388397,,,,,, +3,17349,,,,,,0.08583030849695206,,,,,, +3,17399,,,,,,0.07659699022769928,,,,,, +3,17449,,,,,,0.08264567703008652,,,,,, +3,17499,,,,,,0.08185452222824097,,,,,, +3,17549,,,,,,0.08472701907157898,,,,,, +3,17599,,,,,,0.07538409531116486,,,,,, +3,17649,,,,,,0.07690313458442688,,,,,, +3,17699,,,,,,0.09020719677209854,,,,,, +3,17749,,,,,,0.08714649081230164,,,,,, +3,17799,,,,,,0.07937686145305634,,,,,, +3,17849,,,,,,0.09893198311328888,,,,,, +3,17899,,,,,,0.07747699320316315,,,,,, +3,17949,,,,,,0.08390945941209793,,,,,, +3,17999,,,,,,0.08081414550542831,,,,,, +3,18049,,,,,,0.08811663836240768,,,,,, +3,18099,,,,,,0.07944541424512863,,,,,, +3,18149,,,,,,0.07644594460725784,,,,,, +3,18199,,,,,,0.0768793448805809,,,,,, +3,18249,,,,,,0.07951687276363373,,,,,, +3,18299,,,,,,0.07880375534296036,,,,,, +3,18349,,,,,,0.07379026710987091,,,,,, +3,18399,,,,,,0.08421169966459274,,,,,, +3,18449,,,,,,0.07256034016609192,,,,,, +3,18499,,,,,,0.07420416176319122,,,,,, +3,18549,,,,,,0.07938337326049805,,,,,, +3,18599,,,,,,0.06980107724666595,,,,,, +3,18649,,,,,,0.0787905603647232,,,,,, +3,18699,,,,,,0.07467027008533478,,,,,, +3,18749,,,,,,0.06353924423456192,,,,,, +3,18799,,,,,,0.07956644892692566,,,,,, +3,18849,,,,,,0.08577734231948853,,,,,, +3,18899,,,,,,0.07354636490345001,,,,,, +3,18949,,,,,,0.0814422070980072,,,,,, +3,18999,,,,,,0.08684822916984558,,,,,, +3,19049,,,,,,0.06507037580013275,,,,,, +3,19099,,,,,,0.08570601046085358,,,,,, +3,19149,,,,,,0.0774274468421936,,,,,, +3,19199,,,,,,0.07471491396427155,,,,,, +3,19249,,,,,,0.08428939431905746,,,,,, +3,19299,,,,,,0.07350918650627136,,,,,, +3,19349,,,,,,0.08457686007022858,,,,,, +3,19399,,,,,,0.07250654697418213,,,,,, +3,19449,,,,,,0.06851744651794434,,,,,, +3,19499,,,,,,0.0811857134103775,,,,,, +3,19549,,,,,,0.07328204810619354,,,,,, +3,19599,,,,,,0.08239386230707169,,,,,, +3,19649,,,,,,0.08873394131660461,,,,,, +3,19699,,,,,,0.08971504867076874,,,,,, +3,19749,,,,,,0.07576959580183029,,,,,, +3,19799,,,,,,0.09495311230421066,,,,,, +3,19849,,,,,,0.08353761583566666,,,,,, +3,19899,,,,,,0.0868791937828064,,,,,, +3,19949,,,,,,0.0967879593372345,,,,,, +3,19999,,,,,,0.08064953982830048,,,,,, +3,20049,,,,,,0.08745433390140533,,,,,, +3,20099,,,,,,0.07556656748056412,,,,,, +3,20149,,,,,,0.08315570652484894,,,,,, +3,20199,,,,,,0.07732275873422623,,,,,, +3,20249,,,,,,0.0845407098531723,,,,,, +3,20299,,,,,,0.08683033287525177,,,,,, +3,20349,,,,,,0.06797466427087784,,,,,, +3,20399,,,,,,0.08466590195894241,,,,,, +3,20449,,,,,,0.08128240704536438,,,,,, +3,20499,,,,,,0.08166519552469254,,,,,, +3,20549,,,,,,0.08043478429317474,,,,,, +3,20599,,,,,,0.07501710951328278,,,,,, +3,20649,,,,,,0.08321702480316162,,,,,, +3,20699,,,,,,0.06992842257022858,,,,,, +3,20749,,,,,,0.08814898878335953,,,,,, +3,20799,,,,,,0.08310408890247345,,,,,, +3,20849,,,,,,0.07816380262374878,,,,,, +3,20899,,,,,,0.08142712712287903,,,,,, +3,20949,,,,,,0.07908640801906586,,,,,, +3,20999,,,,,,0.07844819873571396,,,,,, +3,21049,,,,,,0.07829609513282776,,,,,, +3,21099,,,,,,0.09055477380752563,,,,,, +3,21149,,,,,,0.09177699685096741,,,,,, +3,21199,,,,,,0.07765533030033112,,,,,, +3,21249,,,,,,0.09469522535800934,,,,,, +3,21299,,,,,,0.08434096723794937,,,,,, +3,21349,,,,,,0.08078907430171967,,,,,, +3,21399,,,,,,0.07140176743268967,,,,,, +3,21449,,,,,,0.09374122321605682,,,,,, +3,21499,,,,,,0.07850661873817444,,,,,, +3,21549,,,,,,0.07635367661714554,,,,,, +3,21599,,,,,,0.10497395694255829,,,,,, +3,21649,,,,,,0.08730731904506683,,,,,, +3,21699,,,,,,0.07820354402065277,,,,,, +3,21749,,,,,,0.08724836260080338,,,,,, +3,21799,,,,,,0.06541574001312256,,,,,, +3,21849,,,,,,0.07962864637374878,,,,,, +3,21899,,,,,,0.07911086827516556,,,,,, +3,21949,,,,,,0.0816267654299736,,,,,, +3,21999,,,,,,0.08280821144580841,,,,,, +3,22049,,,,,,0.08314619213342667,,,,,, +3,22099,,,,,,0.07494744658470154,,,,,, +3,22149,,,,,,0.07503742724657059,,,,,, +3,22199,,,,,,0.08418810367584229,,,,,, +3,22249,,,,,,0.08081748336553574,,,,,, +3,22299,,,,,,0.07213705778121948,,,,,, +3,22349,,,,,,0.07664737105369568,,,,,, +3,22399,,,,,,0.0691823810338974,,,,,, +3,22449,,,,,,0.09036868810653687,,,,,, +3,22499,,,,,,0.07725696265697479,,,,,, +3,22549,,,,,,0.07203231751918793,,,,,, +3,22599,,,,,,0.08980946242809296,,,,,, +3,22649,,,,,,0.08792953193187714,,,,,, +3,22699,,,,,,0.08239468932151794,,,,,, +3,22749,,,,,,0.08359850943088531,,,,,, +3,22799,,,,,,0.07838334888219833,,,,,, +3,22849,,,,,,0.0839771032333374,,,,,, +3,22899,,,,,,0.08225516229867935,,,,,, +3,22943,,,,,,,0.2437599003314972,0.0802064910531044,0.21221385896205902,0.026866912841796875,0.21866357326507568,0.0802064910531044 +3,22943,0.24567954242229462,0.08148135244846344,0.1297287493944168,0.015473127365112305,0.12118189036846161,,,,,,, +4,22949,,,,,,0.08875715732574463,,,,,, +4,22999,,,,,,0.07922899723052979,,,,,, +4,23049,,,,,,0.0881662517786026,,,,,, +4,23099,,,,,,0.08310877531766891,,,,,, +4,23149,,,,,,0.08415871858596802,,,,,, +4,23199,,,,,,0.08232558518648148,,,,,, +4,23249,,,,,,0.07909456640481949,,,,,, +4,23299,,,,,,0.0807371661067009,,,,,, +4,23349,,,,,,0.07853062450885773,,,,,, +4,23399,,,,,,0.078415647149086,,,,,, +4,23449,,,,,,0.0832129418849945,,,,,, +4,23499,,,,,,0.07807599008083344,,,,,, +4,23549,,,,,,0.09035775065422058,,,,,, +4,23599,,,,,,0.08420869708061218,,,,,, +4,23649,,,,,,0.07546745985746384,,,,,, +4,23699,,,,,,0.08612602949142456,,,,,, +4,23749,,,,,,0.08642970025539398,,,,,, +4,23799,,,,,,0.09292775392532349,,,,,, +4,23849,,,,,,0.09220805019140244,,,,,, +4,23899,,,,,,0.08620862662792206,,,,,, +4,23949,,,,,,0.07843510061502457,,,,,, +4,23999,,,,,,0.08241672813892365,,,,,, +4,24049,,,,,,0.08420489728450775,,,,,, +4,24099,,,,,,0.08032618463039398,,,,,, +4,24149,,,,,,0.082538902759552,,,,,, +4,24199,,,,,,0.08541752398014069,,,,,, +4,24249,,,,,,0.06933590769767761,,,,,, +4,24299,,,,,,0.07661720365285873,,,,,, +4,24349,,,,,,0.07530897855758667,,,,,, +4,24399,,,,,,0.08550100028514862,,,,,, +4,24449,,,,,,0.07736945152282715,,,,,, +4,24499,,,,,,0.09228022396564484,,,,,, +4,24549,,,,,,0.08080761879682541,,,,,, +4,24599,,,,,,0.08496026694774628,,,,,, +4,24649,,,,,,0.07905970513820648,,,,,, +4,24699,,,,,,0.09461122751235962,,,,,, +4,24749,,,,,,0.08387698978185654,,,,,, +4,24799,,,,,,0.0816638320684433,,,,,, +4,24849,,,,,,0.08235660940408707,,,,,, +4,24899,,,,,,0.08569648116827011,,,,,, +4,24949,,,,,,0.07835686206817627,,,,,, +4,24999,,,,,,0.08255551010370255,,,,,, +4,25049,,,,,,0.0827195942401886,,,,,, +4,25099,,,,,,0.08920200169086456,,,,,, +4,25149,,,,,,0.08761845529079437,,,,,, +4,25199,,,,,,0.0831742137670517,,,,,, +4,25249,,,,,,0.07191866636276245,,,,,, +4,25299,,,,,,0.0758308470249176,,,,,, +4,25349,,,,,,0.07510614395141602,,,,,, +4,25399,,,,,,0.08960574865341187,,,,,, +4,25449,,,,,,0.07314306497573853,,,,,, +4,25499,,,,,,0.08919012546539307,,,,,, +4,25549,,,,,,0.07986447215080261,,,,,, +4,25599,,,,,,0.07459820806980133,,,,,, +4,25649,,,,,,0.08411630243062973,,,,,, +4,25699,,,,,,0.09178677201271057,,,,,, +4,25749,,,,,,0.09122952818870544,,,,,, +4,25799,,,,,,0.07906261086463928,,,,,, +4,25849,,,,,,0.07739327102899551,,,,,, +4,25899,,,,,,0.08335994184017181,,,,,, +4,25949,,,,,,0.0875077098608017,,,,,, +4,25999,,,,,,0.0810324177145958,,,,,, +4,26049,,,,,,0.08484163880348206,,,,,, +4,26099,,,,,,0.08120526373386383,,,,,, +4,26149,,,,,,0.07823112607002258,,,,,, +4,26199,,,,,,0.0773434191942215,,,,,, +4,26249,,,,,,0.08069068938493729,,,,,, +4,26299,,,,,,0.08941657841205597,,,,,, +4,26349,,,,,,0.07164283841848373,,,,,, +4,26399,,,,,,0.07880467176437378,,,,,, +4,26449,,,,,,0.0850086510181427,,,,,, +4,26499,,,,,,0.09127996861934662,,,,,, +4,26549,,,,,,0.08253757655620575,,,,,, +4,26599,,,,,,0.09152218699455261,,,,,, +4,26649,,,,,,0.07972870022058487,,,,,, +4,26699,,,,,,0.07809215039014816,,,,,, +4,26749,,,,,,0.07150781154632568,,,,,, +4,26799,,,,,,0.07683639228343964,,,,,, +4,26849,,,,,,0.08034198731184006,,,,,, +4,26899,,,,,,0.07726114243268967,,,,,, +4,26949,,,,,,0.09333979338407516,,,,,, +4,26999,,,,,,0.08351060748100281,,,,,, +4,27049,,,,,,0.07762698829174042,,,,,, +4,27099,,,,,,0.07475213706493378,,,,,, +4,27149,,,,,,0.07779340445995331,,,,,, +4,27199,,,,,,0.08285766839981079,,,,,, +4,27249,,,,,,0.0785195529460907,,,,,, +4,27299,,,,,,0.08982980251312256,,,,,, +4,27349,,,,,,0.08757618814706802,,,,,, +4,27399,,,,,,0.10193181037902832,,,,,, +4,27449,,,,,,0.09300707280635834,,,,,, +4,27499,,,,,,0.08722745627164841,,,,,, +4,27549,,,,,,0.07710311561822891,,,,,, +4,27599,,,,,,0.07673545181751251,,,,,, +4,27649,,,,,,0.09146957099437714,,,,,, +4,27699,,,,,,0.07239100337028503,,,,,, +4,27749,,,,,,0.07985253632068634,,,,,, +4,27799,,,,,,0.07923921197652817,,,,,, +4,27849,,,,,,0.07944057881832123,,,,,, +4,27899,,,,,,0.08141472935676575,,,,,, +4,27949,,,,,,0.07615305483341217,,,,,, +4,27999,,,,,,0.08140446245670319,,,,,, +4,28049,,,,,,0.08048055320978165,,,,,, +4,28099,,,,,,0.09378646314144135,,,,,, +4,28149,,,,,,0.08908016979694366,,,,,, +4,28199,,,,,,0.07685291022062302,,,,,, +4,28249,,,,,,0.0752062201499939,,,,,, +4,28299,,,,,,0.07002536952495575,,,,,, +4,28349,,,,,,0.09423588216304779,,,,,, +4,28399,,,,,,0.0681673213839531,,,,,, +4,28449,,,,,,0.08492203056812286,,,,,, +4,28499,,,,,,0.08506564050912857,,,,,, +4,28549,,,,,,0.0770997703075409,,,,,, +4,28599,,,,,,0.08407995104789734,,,,,, +4,28649,,,,,,0.08684290200471878,,,,,, +4,28679,,,,,,,0.2466125190258026,0.08138234168291092,nan,0.012600541114807129,0.14815275371074677,0.08138234168291092 +4,28679,0.24613085389137268,0.08157911151647568,0.12310036271810532,0.014291942119598389,0.1099121943116188,,,,,,, +5,28699,,,,,,0.07548750936985016,,,,,, +5,28749,,,,,,0.07438448071479797,,,,,, +5,28799,,,,,,0.07777439057826996,,,,,, +5,28849,,,,,,0.08632374554872513,,,,,, +5,28899,,,,,,0.08795797824859619,,,,,, +5,28949,,,,,,0.07681781053543091,,,,,, +5,28999,,,,,,0.07697879523038864,,,,,, +5,29049,,,,,,0.08026555180549622,,,,,, +5,29099,,,,,,0.07396385073661804,,,,,, +5,29149,,,,,,0.07984361052513123,,,,,, +5,29199,,,,,,0.07325369119644165,,,,,, +5,29249,,,,,,0.06884579360485077,,,,,, +5,29299,,,,,,0.08332999795675278,,,,,, +5,29349,,,,,,0.07390698790550232,,,,,, +5,29399,,,,,,0.07876667380332947,,,,,, +5,29449,,,,,,0.08662749081850052,,,,,, +5,29499,,,,,,0.09469327330589294,,,,,, +5,29549,,,,,,0.08101716637611389,,,,,, +5,29599,,,,,,0.07494655251502991,,,,,, +5,29649,,,,,,0.09201318025588989,,,,,, +5,29699,,,,,,0.084353506565094,,,,,, +5,29749,,,,,,0.07357434183359146,,,,,, +5,29799,,,,,,0.08424431085586548,,,,,, +5,29849,,,,,,0.0764806792140007,,,,,, +5,29899,,,,,,0.0804864913225174,,,,,, +5,29949,,,,,,0.08972123265266418,,,,,, +5,29999,,,,,,0.07639871537685394,,,,,, +5,30049,,,,,,0.0763254314661026,,,,,, +5,30099,,,,,,0.0726500153541565,,,,,, +5,30149,,,,,,0.08566851913928986,,,,,, +5,30199,,,,,,0.07211752235889435,,,,,, +5,30249,,,,,,0.08507387340068817,,,,,, +5,30299,,,,,,0.07933962345123291,,,,,, +5,30349,,,,,,0.07809555530548096,,,,,, +5,30399,,,,,,0.08467987179756165,,,,,, +5,30449,,,,,,0.08659128844738007,,,,,, +5,30499,,,,,,0.0807785838842392,,,,,, +5,30549,,,,,,0.0774594098329544,,,,,, +5,30599,,,,,,0.08137767016887665,,,,,, +5,30649,,,,,,0.08127478510141373,,,,,, +5,30699,,,,,,0.0772101879119873,,,,,, +5,30749,,,,,,0.07798641920089722,,,,,, +5,30799,,,,,,0.08396580815315247,,,,,, +5,30849,,,,,,0.07873788475990295,,,,,, +5,30899,,,,,,0.08210697025060654,,,,,, +5,30949,,,,,,0.09231502562761307,,,,,, +5,30999,,,,,,0.0894460529088974,,,,,, +5,31049,,,,,,0.08968762308359146,,,,,, +5,31099,,,,,,0.09630954265594482,,,,,, +5,31149,,,,,,0.07945183664560318,,,,,, +5,31199,,,,,,0.08897766470909119,,,,,, +5,31249,,,,,,0.07601246237754822,,,,,, +5,31299,,,,,,0.07521486282348633,,,,,, +5,31349,,,,,,0.0840645581483841,,,,,, +5,31399,,,,,,0.08378327637910843,,,,,, +5,31449,,,,,,0.08335274457931519,,,,,, +5,31499,,,,,,0.08377035707235336,,,,,, +5,31549,,,,,,0.07617241144180298,,,,,, +5,31599,,,,,,0.0825352594256401,,,,,, +5,31649,,,,,,0.07841427624225616,,,,,, +5,31699,,,,,,0.09142450988292694,,,,,, +5,31749,,,,,,0.07606346905231476,,,,,, +5,31799,,,,,,0.07797643542289734,,,,,, +5,31849,,,,,,0.08587798476219177,,,,,, +5,31899,,,,,,0.08495718240737915,,,,,, +5,31949,,,,,,0.0765785276889801,,,,,, +5,31999,,,,,,0.07640093564987183,,,,,, +5,32049,,,,,,0.0766824334859848,,,,,, +5,32099,,,,,,0.0884818434715271,,,,,, +5,32149,,,,,,0.07300692051649094,,,,,, +5,32199,,,,,,0.08420753479003906,,,,,, +5,32249,,,,,,0.09078562259674072,,,,,, +5,32299,,,,,,0.08157892525196075,,,,,, +5,32349,,,,,,0.08110705018043518,,,,,, +5,32399,,,,,,0.08436764031648636,,,,,, +5,32449,,,,,,0.08898201584815979,,,,,, +5,32499,,,,,,0.0754377692937851,,,,,, +5,32549,,,,,,0.07824677228927612,,,,,, +5,32599,,,,,,0.08304261416196823,,,,,, +5,32649,,,,,,0.07190457731485367,,,,,, +5,32699,,,,,,0.08435477316379547,,,,,, +5,32749,,,,,,0.06825552135705948,,,,,, +5,32799,,,,,,0.09105990082025528,,,,,, +5,32849,,,,,,0.08574418723583221,,,,,, +5,32899,,,,,,0.08537528663873672,,,,,, +5,32949,,,,,,0.08456280082464218,,,,,, +5,32999,,,,,,0.09868459403514862,,,,,, +5,33049,,,,,,0.08928224444389343,,,,,, +5,33099,,,,,,0.09203778207302094,,,,,, +5,33149,,,,,,0.07394968718290329,,,,,, +5,33199,,,,,,0.09233324229717255,,,,,, +5,33249,,,,,,0.08430019021034241,,,,,, +5,33299,,,,,,0.07754023373126984,,,,,, +5,33349,,,,,,0.07696574181318283,,,,,, +5,33399,,,,,,0.08496668189764023,,,,,, +5,33449,,,,,,0.08093659579753876,,,,,, +5,33499,,,,,,0.08666622638702393,,,,,, +5,33549,,,,,,0.07804100960493088,,,,,, +5,33599,,,,,,0.08319559693336487,,,,,, +5,33649,,,,,,0.06653183698654175,,,,,, +5,33699,,,,,,0.08379603922367096,,,,,, +5,33749,,,,,,0.08565032482147217,,,,,, +5,33799,,,,,,0.0876293033361435,,,,,, +5,33849,,,,,,0.07562197744846344,,,,,, +5,33899,,,,,,0.08583632856607437,,,,,, +5,33949,,,,,,0.08163335174322128,,,,,, +5,33999,,,,,,0.07707443833351135,,,,,, +5,34049,,,,,,0.07337870448827744,,,,,, +5,34099,,,,,,0.0753735899925232,,,,,, +5,34149,,,,,,0.0956234484910965,,,,,, +5,34199,,,,,,0.07079677283763885,,,,,, +5,34249,,,,,,0.07897986471652985,,,,,, +5,34299,,,,,,0.07850857824087143,,,,,, +5,34349,,,,,,0.07327909767627716,,,,,, +5,34399,,,,,,0.07855407893657684,,,,,, +5,34415,,,,,,,0.24406275153160095,0.08054009824991226,0.15335170924663544,0.022819340229034424,0.17193500697612762,0.08054009824991226 +5,34415,0.24658407270908356,0.08182763308286667,0.11178593337535858,0.011301040649414062,0.10918600857257843,,,,,,, +6,34449,,,,,,0.08035121858119965,,,,,, +6,34499,,,,,,0.06422427296638489,,,,,, +6,34549,,,,,,0.09037207067012787,,,,,, +6,34599,,,,,,0.07902464270591736,,,,,, +6,34649,,,,,,0.08736483007669449,,,,,, +6,34699,,,,,,0.08583099395036697,,,,,, +6,34749,,,,,,0.0851411372423172,,,,,, +6,34799,,,,,,0.08604569733142853,,,,,, +6,34849,,,,,,0.07216296344995499,,,,,, +6,34899,,,,,,0.08935698866844177,,,,,, +6,34949,,,,,,0.06761597096920013,,,,,, +6,34999,,,,,,0.07749001681804657,,,,,, +6,35049,,,,,,0.07946494221687317,,,,,, +6,35099,,,,,,0.06726466119289398,,,,,, +6,35149,,,,,,0.08502721786499023,,,,,, +6,35199,,,,,,0.07480676472187042,,,,,, +6,35249,,,,,,0.08448854833841324,,,,,, +6,35299,,,,,,0.0810907706618309,,,,,, +6,35349,,,,,,0.0844283327460289,,,,,, +6,35399,,,,,,0.07153786718845367,,,,,, +6,35449,,,,,,0.06926845014095306,,,,,, +6,35499,,,,,,0.07630449533462524,,,,,, +6,35549,,,,,,0.06631302833557129,,,,,, +6,35599,,,,,,0.08514067530632019,,,,,, +6,35649,,,,,,0.07213427871465683,,,,,, +6,35699,,,,,,0.07052026689052582,,,,,, +6,35749,,,,,,0.0862160474061966,,,,,, +6,35799,,,,,,0.0735597088932991,,,,,, +6,35849,,,,,,0.08677180856466293,,,,,, +6,35899,,,,,,0.08425912261009216,,,,,, +6,35949,,,,,,0.08331431448459625,,,,,, +6,35999,,,,,,0.08232400566339493,,,,,, +6,36049,,,,,,0.07458660006523132,,,,,, +6,36099,,,,,,0.08040565252304077,,,,,, +6,36149,,,,,,0.08156123757362366,,,,,, +6,36199,,,,,,0.072473905980587,,,,,, +6,36249,,,,,,0.07566704601049423,,,,,, +6,36299,,,,,,0.07281807065010071,,,,,, +6,36349,,,,,,0.07974781095981598,,,,,, +6,36399,,,,,,0.08210525661706924,,,,,, +6,36449,,,,,,0.07675766944885254,,,,,, +6,36499,,,,,,0.09238670021295547,,,,,, +6,36549,,,,,,0.07970509678125381,,,,,, +6,36599,,,,,,0.0826258659362793,,,,,, +6,36649,,,,,,0.06938942521810532,,,,,, +6,36699,,,,,,0.07560092210769653,,,,,, +6,36749,,,,,,0.0903622955083847,,,,,, +6,36799,,,,,,0.09479770064353943,,,,,, +6,36849,,,,,,0.07553131878376007,,,,,, +6,36899,,,,,,0.09023214131593704,,,,,, +6,36949,,,,,,0.08396157622337341,,,,,, +6,36999,,,,,,0.08396996557712555,,,,,, +6,37049,,,,,,0.07679450511932373,,,,,, +6,37099,,,,,,0.06789602339267731,,,,,, +6,37149,,,,,,0.0693332627415657,,,,,, +6,37199,,,,,,0.09382151067256927,,,,,, +6,37249,,,,,,0.08639569580554962,,,,,, +6,37299,,,,,,0.08403670787811279,,,,,, +6,37349,,,,,,0.07377855479717255,,,,,, +6,37399,,,,,,0.08759734779596329,,,,,, +6,37449,,,,,,0.09222523123025894,,,,,, +6,37499,,,,,,0.08481337130069733,,,,,, +6,37549,,,,,,0.07755935192108154,,,,,, +6,37599,,,,,,0.08681005239486694,,,,,, +6,37649,,,,,,0.0876423567533493,,,,,, +6,37699,,,,,,0.07630595564842224,,,,,, +6,37749,,,,,,0.09033548831939697,,,,,, +6,37799,,,,,,0.0758429765701294,,,,,, +6,37849,,,,,,0.08578774333000183,,,,,, +6,37899,,,,,,0.07610177248716354,,,,,, +6,37949,,,,,,0.08785739541053772,,,,,, +6,37999,,,,,,0.07358784228563309,,,,,, +6,38049,,,,,,0.08727729320526123,,,,,, +6,38099,,,,,,0.08756519854068756,,,,,, +6,38149,,,,,,0.08510854840278625,,,,,, +6,38199,,,,,,0.08285017311573029,,,,,, +6,38249,,,,,,0.0792454183101654,,,,,, +6,38299,,,,,,0.08462195843458176,,,,,, +6,38349,,,,,,0.08492448180913925,,,,,, +6,38399,,,,,,0.0761987566947937,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1bfd752ab5dd2eef76bbd2437e4461817cf9604e --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml @@ -0,0 +1,22 @@ +add_valid: [] +hash: 8b34af2a +logs_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet +model: + batch_size: 128 + epochs: 50 + glycan_encoder: + feat_dim: 128 + hidden_dim: 1024 + name: sweetnet + num_layers: 16 + learning_rate: 0.001 + lectin_encoder: + layer_num: 33 + name: ESM + optimizer: Adam +origin: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/interaction_benchmark.pkl +pre-transforms: + GIFFLARTransform: '' + SweetNetTransform: '' +root_dir: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly +seed: 44 diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..4bed91a7f6c02d0fa695312efba97b114033a04c --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv @@ -0,0 +1,5138 @@ +epoch,step,test/MeanAbsoluteError,test/MeanSquaredError,test/PearsonCorrCoef,test/R2Score,test/SpearmanCorrCoef,test/loss,train/MeanAbsoluteError,train/MeanSquaredError,train/PearsonCorrCoef,train/R2Score,train/SpearmanCorrCoef,train/loss,val/MeanAbsoluteError,val/MeanSquaredError,val/PearsonCorrCoef,val/R2Score,val/SpearmanCorrCoef,val/loss +6,34449,,,,,,,,,,,,0.08650874346494675,,,,,, +6,34499,,,,,,,,,,,,0.08368736505508423,,,,,, +6,34549,,,,,,,,,,,,0.08990439027547836,,,,,, +6,34599,,,,,,,,,,,,0.07308007776737213,,,,,, +6,34649,,,,,,,,,,,,0.07110974937677383,,,,,, +6,34699,,,,,,,,,,,,0.08873677253723145,,,,,, +6,34749,,,,,,,,,,,,0.07554452866315842,,,,,, +6,34799,,,,,,,,,,,,0.07210348546504974,,,,,, +6,34849,,,,,,,,,,,,0.08375079929828644,,,,,, +6,34899,,,,,,,,,,,,0.07469616830348969,,,,,, +6,34949,,,,,,,,,,,,0.08099261671304703,,,,,, +6,34999,,,,,,,,,,,,0.07690653949975967,,,,,, +6,35049,,,,,,,,,,,,0.08390332758426666,,,,,, +6,35099,,,,,,,,,,,,0.08613444864749908,,,,,, +6,35149,,,,,,,,,,,,0.0796637088060379,,,,,, +6,35199,,,,,,,,,,,,0.09211462736129761,,,,,, +6,35249,,,,,,,,,,,,0.08609209954738617,,,,,, +6,35299,,,,,,,,,,,,0.08836717158555984,,,,,, +6,35349,,,,,,,,,,,,0.07680492848157883,,,,,, +6,35399,,,,,,,,,,,,0.08670732378959656,,,,,, +6,35449,,,,,,,,,,,,0.0799621045589447,,,,,, +6,35499,,,,,,,,,,,,0.09056055545806885,,,,,, +6,35549,,,,,,,,,,,,0.08429474383592606,,,,,, +6,35599,,,,,,,,,,,,0.07844363898038864,,,,,, +6,35649,,,,,,,,,,,,0.08960049599409103,,,,,, +6,35699,,,,,,,,,,,,0.08323398232460022,,,,,, +6,35749,,,,,,,,,,,,0.08576227724552155,,,,,, +6,35799,,,,,,,,,,,,0.0673617273569107,,,,,, +6,35849,,,,,,,,,,,,0.09300309419631958,,,,,, +6,35899,,,,,,,,,,,,0.08206910640001297,,,,,, +6,35949,,,,,,,,,,,,0.07654577493667603,,,,,, +6,35999,,,,,,,,,,,,0.07614615559577942,,,,,, +6,36049,,,,,,,,,,,,0.09307683259248734,,,,,, +6,36099,,,,,,,,,,,,0.07905375957489014,,,,,, +6,36149,,,,,,,,,,,,0.07689109444618225,,,,,, +6,36199,,,,,,,,,,,,0.07632441073656082,,,,,, +6,36249,,,,,,,,,,,,0.07777279615402222,,,,,, +6,36299,,,,,,,,,,,,0.0777057334780693,,,,,, +6,36349,,,,,,,,,,,,0.09186696261167526,,,,,, +6,36399,,,,,,,,,,,,0.08131495118141174,,,,,, +6,36449,,,,,,,,,,,,0.09228560328483582,,,,,, +6,36499,,,,,,,,,,,,0.08038324117660522,,,,,, +6,36549,,,,,,,,,,,,0.0739840418100357,,,,,, +6,36599,,,,,,,,,,,,0.07806023210287094,,,,,, +6,36649,,,,,,,,,,,,0.08361329138278961,,,,,, +6,36699,,,,,,,,,,,,0.07338504493236542,,,,,, +6,36749,,,,,,,,,,,,0.08729373663663864,,,,,, +6,36799,,,,,,,,,,,,0.08707347512245178,,,,,, +6,36849,,,,,,,,,,,,0.0784718319773674,,,,,, +6,36899,,,,,,,,,,,,0.06770090758800507,,,,,, +6,36949,,,,,,,,,,,,0.08568126708269119,,,,,, +6,36999,,,,,,,,,,,,0.08113832026720047,,,,,, +6,37049,,,,,,,,,,,,0.07526065409183502,,,,,, +6,37099,,,,,,,,,,,,0.07929237186908722,,,,,, +6,37149,,,,,,,,,,,,0.08742421865463257,,,,,, +6,37199,,,,,,,,,,,,0.07243487238883972,,,,,, +6,37249,,,,,,,,,,,,0.09854146838188171,,,,,, +6,37299,,,,,,,,,,,,0.09440646320581436,,,,,, +6,37349,,,,,,,,,,,,0.07516809552907944,,,,,, +6,37399,,,,,,,,,,,,0.08605553954839706,,,,,, +6,37449,,,,,,,,,,,,0.08015649020671844,,,,,, +6,37499,,,,,,,,,,,,0.09115242213010788,,,,,, +6,37549,,,,,,,,,,,,0.07686913758516312,,,,,, +6,37599,,,,,,,,,,,,0.07617616653442383,,,,,, +6,37649,,,,,,,,,,,,0.08247429877519608,,,,,, +6,37699,,,,,,,,,,,,0.08843101561069489,,,,,, +6,37749,,,,,,,,,,,,0.07494845986366272,,,,,, +6,37799,,,,,,,,,,,,0.08540774136781693,,,,,, +6,37849,,,,,,,,,,,,0.08309394121170044,,,,,, +6,37899,,,,,,,,,,,,0.08150461316108704,,,,,, +6,37949,,,,,,,,,,,,0.08635146915912628,,,,,, +6,37999,,,,,,,,,,,,0.07020854949951172,,,,,, +6,38049,,,,,,,,,,,,0.07770668715238571,,,,,, +6,38099,,,,,,,,,,,,0.08729524165391922,,,,,, +6,38149,,,,,,,,,,,,0.07812811434268951,,,,,, +6,38199,,,,,,,,,,,,0.07790578901767731,,,,,, +6,38249,,,,,,,,,,,,0.07381904125213623,,,,,, +6,38299,,,,,,,,,,,,0.08554039895534515,,,,,, +6,38349,,,,,,,,,,,,0.0789840817451477,,,,,, +6,38399,,,,,,,,,,,,0.08384214341640472,,,,,, +6,38449,,,,,,,,,,,,0.08123037219047546,,,,,, +6,38499,,,,,,,,,,,,0.08457207679748535,,,,,, +6,38549,,,,,,,,,,,,0.07397568225860596,,,,,, +6,38599,,,,,,,,,,,,0.09639747440814972,,,,,, +6,38649,,,,,,,,,,,,0.08168213814496994,,,,,, +6,38699,,,,,,,,,,,,0.09486544132232666,,,,,, +6,38749,,,,,,,,,,,,0.07726802676916122,,,,,, +6,38799,,,,,,,,,,,,0.0816677063703537,,,,,, +6,38849,,,,,,,,,,,,0.09022649377584457,,,,,, +6,38899,,,,,,,,,,,,0.07568959891796112,,,,,, +6,38949,,,,,,,,,,,,0.09002336859703064,,,,,, +6,38999,,,,,,,,,,,,0.07097680121660233,,,,,, +6,39049,,,,,,,,,,,,0.07831902801990509,,,,,, +6,39099,,,,,,,,,,,,0.08453045785427094,,,,,, +6,39149,,,,,,,,,,,,0.0835161805152893,,,,,, +6,39199,,,,,,,,,,,,0.08636590838432312,,,,,, +6,39249,,,,,,,,,,,,0.0783599242568016,,,,,, +6,39299,,,,,,,,,,,,0.08173423260450363,,,,,, +6,39349,,,,,,,,,,,,0.07940751314163208,,,,,, +6,39399,,,,,,,,,,,,0.08538445830345154,,,,,, +6,39449,,,,,,,,,,,,0.09308438748121262,,,,,, +6,39499,,,,,,,,,,,,0.07580015808343887,,,,,, +6,39549,,,,,,,,,,,,0.08067445456981659,,,,,, +6,39599,,,,,,,,,,,,0.07656626403331757,,,,,, +6,39649,,,,,,,,,,,,0.0803985446691513,,,,,, +6,39699,,,,,,,,,,,,0.07318553328514099,,,,,, +6,39749,,,,,,,,,,,,0.07949219644069672,,,,,, +6,39799,,,,,,,,,,,,0.0779191181063652,,,,,, +6,39849,,,,,,,,,,,,0.08387987315654755,,,,,, +6,39899,,,,,,,,,,,,0.0768403559923172,,,,,, +6,39949,,,,,,,,,,,,0.07096932828426361,,,,,, +6,39999,,,,,,,,,,,,0.09680914878845215,,,,,, +6,40049,,,,,,,,,,,,0.07939713448286057,,,,,, +6,40099,,,,,,,,,,,,0.08071732521057129,,,,,, +6,40149,,,,,,,,,,,,0.08203758299350739,,,,,, +6,40151,,,,,,,,,,,,,0.2454749196767807,0.08133789896965027,0.13162089884281158,0.013139784336090088,0.13706499338150024,0.08133789896965027 +6,40151,,,,,,,0.24434486031532288,0.08063340187072754,0.16224072873592377,0.025709569454193115,0.14859554171562195,,,,,,, +7,40199,,,,,,,,,,,,0.10126261413097382,,,,,, +7,40249,,,,,,,,,,,,0.08256857097148895,,,,,, +7,40299,,,,,,,,,,,,0.07832913100719452,,,,,, +7,40349,,,,,,,,,,,,0.08515454828739166,,,,,, +7,40399,,,,,,,,,,,,0.08165429532527924,,,,,, +7,40449,,,,,,,,,,,,0.06907983124256134,,,,,, +7,40499,,,,,,,,,,,,0.07848888635635376,,,,,, +7,40549,,,,,,,,,,,,0.06977932900190353,,,,,, +7,40599,,,,,,,,,,,,0.08209340274333954,,,,,, +7,40649,,,,,,,,,,,,0.07465347647666931,,,,,, +7,40699,,,,,,,,,,,,0.07856540381908417,,,,,, +7,40749,,,,,,,,,,,,0.07116924226284027,,,,,, +7,40799,,,,,,,,,,,,0.08264202624559402,,,,,, +7,40849,,,,,,,,,,,,0.08251283317804337,,,,,, +7,40899,,,,,,,,,,,,0.07790014147758484,,,,,, +7,40949,,,,,,,,,,,,0.0773526281118393,,,,,, +7,40999,,,,,,,,,,,,0.07541564106941223,,,,,, +7,41049,,,,,,,,,,,,0.08818628638982773,,,,,, +7,41099,,,,,,,,,,,,0.07259678840637207,,,,,, +7,41149,,,,,,,,,,,,0.07602152228355408,,,,,, +7,41199,,,,,,,,,,,,0.08378086239099503,,,,,, +7,41249,,,,,,,,,,,,0.0899069532752037,,,,,, +7,41299,,,,,,,,,,,,0.08828726410865784,,,,,, +7,41349,,,,,,,,,,,,0.09110497683286667,,,,,, +7,41399,,,,,,,,,,,,0.08388875424861908,,,,,, +7,41449,,,,,,,,,,,,0.08518476784229279,,,,,, +7,41499,,,,,,,,,,,,0.07389228045940399,,,,,, +7,41549,,,,,,,,,,,,0.08715559542179108,,,,,, +7,41599,,,,,,,,,,,,0.07207509875297546,,,,,, +7,41649,,,,,,,,,,,,0.0814765989780426,,,,,, +7,41699,,,,,,,,,,,,0.07497285306453705,,,,,, +7,41749,,,,,,,,,,,,0.08096402138471603,,,,,, +7,41799,,,,,,,,,,,,0.07115809619426727,,,,,, +7,41849,,,,,,,,,,,,0.0790363997220993,,,,,, +7,41899,,,,,,,,,,,,0.08584708720445633,,,,,, +7,41949,,,,,,,,,,,,0.09073108434677124,,,,,, +7,41999,,,,,,,,,,,,0.07841663062572479,,,,,, +7,42049,,,,,,,,,,,,0.07643246650695801,,,,,, +7,42099,,,,,,,,,,,,0.07474617660045624,,,,,, +7,42149,,,,,,,,,,,,0.07222308218479156,,,,,, +7,42199,,,,,,,,,,,,0.08214832842350006,,,,,, +7,42249,,,,,,,,,,,,0.08038280159235,,,,,, +7,42299,,,,,,,,,,,,0.08558003604412079,,,,,, +7,42349,,,,,,,,,,,,0.08197572827339172,,,,,, +7,42399,,,,,,,,,,,,0.08045342564582825,,,,,, +7,42449,,,,,,,,,,,,0.09908434748649597,,,,,, +7,42499,,,,,,,,,,,,0.06502294540405273,,,,,, +7,42549,,,,,,,,,,,,0.07243403792381287,,,,,, +7,42599,,,,,,,,,,,,0.07674909383058548,,,,,, +7,42649,,,,,,,,,,,,0.08025066554546356,,,,,, +7,42699,,,,,,,,,,,,0.07087144255638123,,,,,, +7,42749,,,,,,,,,,,,0.07687202841043472,,,,,, +7,42799,,,,,,,,,,,,0.08008934557437897,,,,,, +7,42849,,,,,,,,,,,,0.07922365516424179,,,,,, +7,42899,,,,,,,,,,,,0.07823605835437775,,,,,, +7,42949,,,,,,,,,,,,0.08429373800754547,,,,,, +7,42999,,,,,,,,,,,,0.08172538131475449,,,,,, +7,43049,,,,,,,,,,,,0.07616113126277924,,,,,, +7,43099,,,,,,,,,,,,0.08073250949382782,,,,,, +7,43149,,,,,,,,,,,,0.07834199070930481,,,,,, +7,43199,,,,,,,,,,,,0.09214752912521362,,,,,, +7,43249,,,,,,,,,,,,0.07363095879554749,,,,,, +7,43299,,,,,,,,,,,,0.08746255934238434,,,,,, +7,43349,,,,,,,,,,,,0.07651068270206451,,,,,, +7,43399,,,,,,,,,,,,0.08733011782169342,,,,,, +7,43449,,,,,,,,,,,,0.08027780055999756,,,,,, +7,43499,,,,,,,,,,,,0.08614355325698853,,,,,, +7,43549,,,,,,,,,,,,0.09072591364383698,,,,,, +7,43599,,,,,,,,,,,,0.08342507481575012,,,,,, +7,43649,,,,,,,,,,,,0.08438944071531296,,,,,, +7,43699,,,,,,,,,,,,0.07359848916530609,,,,,, +7,43749,,,,,,,,,,,,0.0788978636264801,,,,,, +7,43799,,,,,,,,,,,,0.08656032383441925,,,,,, +7,43849,,,,,,,,,,,,0.07248207181692123,,,,,, +7,43899,,,,,,,,,,,,0.07783982157707214,,,,,, +7,43949,,,,,,,,,,,,0.08075373619794846,,,,,, +7,43999,,,,,,,,,,,,0.07708821445703506,,,,,, +7,44049,,,,,,,,,,,,0.08568784594535828,,,,,, +7,44099,,,,,,,,,,,,0.0810750424861908,,,,,, +7,44149,,,,,,,,,,,,0.07260837405920029,,,,,, +7,44199,,,,,,,,,,,,0.08332239836454391,,,,,, +7,44249,,,,,,,,,,,,0.06689254939556122,,,,,, +7,44299,,,,,,,,,,,,0.0788792073726654,,,,,, +7,44349,,,,,,,,,,,,0.08191979676485062,,,,,, +7,44399,,,,,,,,,,,,0.09168969094753265,,,,,, +7,44449,,,,,,,,,,,,0.07406284660100937,,,,,, +7,44499,,,,,,,,,,,,0.08350501209497452,,,,,, +7,44549,,,,,,,,,,,,0.09096866101026535,,,,,, +7,44599,,,,,,,,,,,,0.0891384407877922,,,,,, +7,44649,,,,,,,,,,,,0.07942311465740204,,,,,, +7,44699,,,,,,,,,,,,0.08264043927192688,,,,,, +7,44749,,,,,,,,,,,,0.07589086890220642,,,,,, +7,44799,,,,,,,,,,,,0.08464133739471436,,,,,, +7,44849,,,,,,,,,,,,0.08576260507106781,,,,,, +7,44899,,,,,,,,,,,,0.08117155730724335,,,,,, +7,44949,,,,,,,,,,,,0.07022698223590851,,,,,, +7,44999,,,,,,,,,,,,0.08553443849086761,,,,,, +7,45049,,,,,,,,,,,,0.07947033643722534,,,,,, +7,45099,,,,,,,,,,,,0.07972770184278488,,,,,, +7,45149,,,,,,,,,,,,0.07727956771850586,,,,,, +7,45199,,,,,,,,,,,,0.07928797602653503,,,,,, +7,45249,,,,,,,,,,,,0.09329204261302948,,,,,, +7,45299,,,,,,,,,,,,0.07730375230312347,,,,,, +7,45349,,,,,,,,,,,,0.08026674389839172,,,,,, +7,45399,,,,,,,,,,,,0.08276884257793427,,,,,, +7,45449,,,,,,,,,,,,0.07788914442062378,,,,,, +7,45499,,,,,,,,,,,,0.0833519846200943,,,,,, +7,45549,,,,,,,,,,,,0.07931797951459885,,,,,, +7,45599,,,,,,,,,,,,0.07659868896007538,,,,,, +7,45649,,,,,,,,,,,,0.0805116519331932,,,,,, +7,45699,,,,,,,,,,,,0.07924559712409973,,,,,, +7,45749,,,,,,,,,,,,0.07948406040668488,,,,,, +7,45799,,,,,,,,,,,,0.07097422331571579,,,,,, +7,45849,,,,,,,,,,,,0.07728725671768188,,,,,, +7,45887,,,,,,,,,,,,,0.24667078256607056,0.08181143552064896,0.13103289902210236,0.007394373416900635,0.14692874252796173,0.08181143552064896 +7,45887,,,,,,,0.24424505233764648,0.08058833330869675,0.16383208334445953,0.02625185251235962,0.1500738561153412,,,,,,, +8,45899,,,,,,,,,,,,0.08285802602767944,,,,,, +8,45949,,,,,,,,,,,,0.0752539113163948,,,,,, +8,45999,,,,,,,,,,,,0.08472760021686554,,,,,, +8,46049,,,,,,,,,,,,0.08124897629022598,,,,,, +8,46099,,,,,,,,,,,,0.06771046668291092,,,,,, +8,46149,,,,,,,,,,,,0.07373350858688354,,,,,, +8,46199,,,,,,,,,,,,0.07771707326173782,,,,,, +8,46249,,,,,,,,,,,,0.07866467535495758,,,,,, +8,46299,,,,,,,,,,,,0.07553968578577042,,,,,, +8,46349,,,,,,,,,,,,0.08726297318935394,,,,,, +8,46399,,,,,,,,,,,,0.08888697624206543,,,,,, +8,46449,,,,,,,,,,,,0.08121812343597412,,,,,, +8,46499,,,,,,,,,,,,0.08007819950580597,,,,,, +8,46549,,,,,,,,,,,,0.06987932324409485,,,,,, +8,46599,,,,,,,,,,,,0.09068135917186737,,,,,, +8,46649,,,,,,,,,,,,0.07206882536411285,,,,,, +8,46699,,,,,,,,,,,,0.08953847736120224,,,,,, +8,46749,,,,,,,,,,,,0.06991942226886749,,,,,, +8,46799,,,,,,,,,,,,0.0801403820514679,,,,,, +8,46849,,,,,,,,,,,,0.08517841249704361,,,,,, +8,46899,,,,,,,,,,,,0.08210308849811554,,,,,, +8,46949,,,,,,,,,,,,0.09078598022460938,,,,,, +8,46999,,,,,,,,,,,,0.07256622612476349,,,,,, +8,47049,,,,,,,,,,,,0.083234503865242,,,,,, +8,47099,,,,,,,,,,,,0.08368958532810211,,,,,, +8,47149,,,,,,,,,,,,0.07465268671512604,,,,,, +8,47199,,,,,,,,,,,,0.07962650805711746,,,,,, +8,47249,,,,,,,,,,,,0.07616846263408661,,,,,, +8,47299,,,,,,,,,,,,0.08676964789628983,,,,,, +8,47349,,,,,,,,,,,,0.08672986924648285,,,,,, +8,47399,,,,,,,,,,,,0.08030533790588379,,,,,, +8,47449,,,,,,,,,,,,0.07336058467626572,,,,,, +8,47499,,,,,,,,,,,,0.08887643367052078,,,,,, +8,47549,,,,,,,,,,,,0.08180448412895203,,,,,, +8,47599,,,,,,,,,,,,0.08231069147586823,,,,,, +8,47649,,,,,,,,,,,,0.07345417141914368,,,,,, +8,47699,,,,,,,,,,,,0.0803905576467514,,,,,, +8,47749,,,,,,,,,,,,0.08365477621555328,,,,,, +8,47799,,,,,,,,,,,,0.0874273031949997,,,,,, +8,47849,,,,,,,,,,,,0.07454310357570648,,,,,, +8,47899,,,,,,,,,,,,0.07817159593105316,,,,,, +8,47949,,,,,,,,,,,,0.07384751737117767,,,,,, +8,47999,,,,,,,,,,,,0.06604654341936111,,,,,, +8,48049,,,,,,,,,,,,0.07218992710113525,,,,,, +8,48099,,,,,,,,,,,,0.07560382783412933,,,,,, +8,48149,,,,,,,,,,,,0.07941871136426926,,,,,, +8,48199,,,,,,,,,,,,0.07629277557134628,,,,,, +8,48249,,,,,,,,,,,,0.0719788670539856,,,,,, +8,48299,,,,,,,,,,,,0.08150488138198853,,,,,, +8,48349,,,,,,,,,,,,0.07654830813407898,,,,,, +8,48399,,,,,,,,,,,,0.08744693547487259,,,,,, +8,48449,,,,,,,,,,,,0.08741673827171326,,,,,, +8,48499,,,,,,,,,,,,0.0845336765050888,,,,,, +8,48549,,,,,,,,,,,,0.09019966423511505,,,,,, +8,48599,,,,,,,,,,,,0.07713009417057037,,,,,, +8,48649,,,,,,,,,,,,0.08087699860334396,,,,,, +8,48699,,,,,,,,,,,,0.08511780202388763,,,,,, +8,48749,,,,,,,,,,,,0.07713600993156433,,,,,, +8,48799,,,,,,,,,,,,0.08261674642562866,,,,,, +8,48849,,,,,,,,,,,,0.07166951894760132,,,,,, +8,48899,,,,,,,,,,,,0.06971089541912079,,,,,, +8,48949,,,,,,,,,,,,0.08346957713365555,,,,,, +8,48999,,,,,,,,,,,,0.09781192988157272,,,,,, +8,49049,,,,,,,,,,,,0.07311701774597168,,,,,, +8,49099,,,,,,,,,,,,0.07680761069059372,,,,,, +8,49149,,,,,,,,,,,,0.08826006203889847,,,,,, +8,49199,,,,,,,,,,,,0.08991776406764984,,,,,, +8,49249,,,,,,,,,,,,0.09063062071800232,,,,,, +8,49299,,,,,,,,,,,,0.07741034030914307,,,,,, +8,49349,,,,,,,,,,,,0.08396555483341217,,,,,, +8,49399,,,,,,,,,,,,0.0770949199795723,,,,,, +8,49449,,,,,,,,,,,,0.08874307572841644,,,,,, +8,49499,,,,,,,,,,,,0.08482480049133301,,,,,, +8,49549,,,,,,,,,,,,0.07215575873851776,,,,,, +8,49599,,,,,,,,,,,,0.06716878712177277,,,,,, +8,49649,,,,,,,,,,,,0.08261191844940186,,,,,, +8,49699,,,,,,,,,,,,0.07199656963348389,,,,,, +8,49749,,,,,,,,,,,,0.07873640954494476,,,,,, +8,49799,,,,,,,,,,,,0.08100780844688416,,,,,, +8,49849,,,,,,,,,,,,0.08102734386920929,,,,,, +8,49899,,,,,,,,,,,,0.0773993656039238,,,,,, +8,49949,,,,,,,,,,,,0.08374742418527603,,,,,, +8,49999,,,,,,,,,,,,0.07250458002090454,,,,,, +8,50049,,,,,,,,,,,,0.09118883311748505,,,,,, +8,50099,,,,,,,,,,,,0.09335286170244217,,,,,, +8,50149,,,,,,,,,,,,0.08670076727867126,,,,,, +8,50199,,,,,,,,,,,,0.08457313477993011,,,,,, +8,50249,,,,,,,,,,,,0.08359232544898987,,,,,, +8,50299,,,,,,,,,,,,0.0703214779496193,,,,,, +8,50349,,,,,,,,,,,,0.07212929427623749,,,,,, +8,50399,,,,,,,,,,,,0.0803689956665039,,,,,, +8,50449,,,,,,,,,,,,0.07352184504270554,,,,,, +8,50499,,,,,,,,,,,,0.07096488773822784,,,,,, +8,50549,,,,,,,,,,,,0.07777059078216553,,,,,, +8,50599,,,,,,,,,,,,0.09042909741401672,,,,,, +8,50649,,,,,,,,,,,,0.07756185531616211,,,,,, +8,50699,,,,,,,,,,,,0.07376705855131149,,,,,, +8,50749,,,,,,,,,,,,0.07591947168111801,,,,,, +8,50799,,,,,,,,,,,,0.07598844915628433,,,,,, +8,50849,,,,,,,,,,,,0.08413244038820267,,,,,, +8,50899,,,,,,,,,,,,0.08746528625488281,,,,,, +8,50949,,,,,,,,,,,,0.07747021317481995,,,,,, +8,50999,,,,,,,,,,,,0.0743284523487091,,,,,, +8,51049,,,,,,,,,,,,0.0737222358584404,,,,,, +8,51099,,,,,,,,,,,,0.07931261509656906,,,,,, +8,51149,,,,,,,,,,,,0.0893891304731369,,,,,, +8,51199,,,,,,,,,,,,0.07168743014335632,,,,,, +8,51249,,,,,,,,,,,,0.08052550256252289,,,,,, +8,51299,,,,,,,,,,,,0.08518491685390472,,,,,, +8,51349,,,,,,,,,,,,0.07500015199184418,,,,,, +8,51399,,,,,,,,,,,,0.06378988176584244,,,,,, +8,51449,,,,,,,,,,,,0.07432402670383453,,,,,, +8,51499,,,,,,,,,,,,0.09127755463123322,,,,,, +8,51549,,,,,,,,,,,,0.08191195875406265,,,,,, +8,51599,,,,,,,,,,,,0.08499415218830109,,,,,, +8,51623,,,,,,,,,,,,,0.24625176191329956,0.08258535712957382,0.12616904079914093,-0.001995563507080078,0.1454981416463852,0.08258535712957382 +8,51623,,,,,,,0.24234871566295624,0.07953105121850967,0.19800658524036407,0.03903615474700928,0.1822797656059265,,,,,,, +9,51649,,,,,,,,,,,,0.07311546802520752,,,,,, +9,51699,,,,,,,,,,,,0.08264518529176712,,,,,, +9,51749,,,,,,,,,,,,0.07586933672428131,,,,,, +9,51799,,,,,,,,,,,,0.07324571907520294,,,,,, +9,51849,,,,,,,,,,,,0.08262962847948074,,,,,, +9,51899,,,,,,,,,,,,0.10031262040138245,,,,,, +9,51949,,,,,,,,,,,,0.07905326783657074,,,,,, +9,51999,,,,,,,,,,,,0.08208301663398743,,,,,, +9,52049,,,,,,,,,,,,0.0793406069278717,,,,,, +9,52099,,,,,,,,,,,,0.08391861617565155,,,,,, +9,52149,,,,,,,,,,,,0.07538820803165436,,,,,, +9,52199,,,,,,,,,,,,0.07864651083946228,,,,,, +9,52249,,,,,,,,,,,,0.09201385080814362,,,,,, +9,52299,,,,,,,,,,,,0.0787578672170639,,,,,, +9,52349,,,,,,,,,,,,0.07891561836004257,,,,,, +9,52399,,,,,,,,,,,,0.0722212865948677,,,,,, +9,52449,,,,,,,,,,,,0.08701042830944061,,,,,, +9,52499,,,,,,,,,,,,0.08105874806642532,,,,,, +9,52549,,,,,,,,,,,,0.08402737230062485,,,,,, +9,52599,,,,,,,,,,,,0.0783066675066948,,,,,, +9,52649,,,,,,,,,,,,0.07856190204620361,,,,,, +9,52699,,,,,,,,,,,,0.09223859012126923,,,,,, +9,52749,,,,,,,,,,,,0.07886681705713272,,,,,, +9,52799,,,,,,,,,,,,0.07771322131156921,,,,,, +9,52849,,,,,,,,,,,,0.08848230540752411,,,,,, +9,52899,,,,,,,,,,,,0.08072833716869354,,,,,, +9,52949,,,,,,,,,,,,0.08158724009990692,,,,,, +9,52999,,,,,,,,,,,,0.08022881299257278,,,,,, +9,53049,,,,,,,,,,,,0.08458410948514938,,,,,, +9,53099,,,,,,,,,,,,0.09379242360591888,,,,,, +9,53149,,,,,,,,,,,,0.08052884042263031,,,,,, +9,53199,,,,,,,,,,,,0.08052868396043777,,,,,, +9,53249,,,,,,,,,,,,0.08270560204982758,,,,,, +9,53299,,,,,,,,,,,,0.0938226729631424,,,,,, +9,53349,,,,,,,,,,,,0.07834038138389587,,,,,, +9,53399,,,,,,,,,,,,0.07866925001144409,,,,,, +9,53449,,,,,,,,,,,,0.062375348061323166,,,,,, +9,53499,,,,,,,,,,,,0.07944904267787933,,,,,, +9,53549,,,,,,,,,,,,0.09398554265499115,,,,,, +9,53599,,,,,,,,,,,,0.08163424581289291,,,,,, +9,53649,,,,,,,,,,,,0.0830606073141098,,,,,, +9,53699,,,,,,,,,,,,0.0739627331495285,,,,,, +9,53749,,,,,,,,,,,,0.08936552703380585,,,,,, +9,53799,,,,,,,,,,,,0.07622744143009186,,,,,, +9,53849,,,,,,,,,,,,0.07044563442468643,,,,,, +9,53899,,,,,,,,,,,,0.0840253084897995,,,,,, +9,53949,,,,,,,,,,,,0.08533097803592682,,,,,, +9,53999,,,,,,,,,,,,0.07591132074594498,,,,,, +9,54049,,,,,,,,,,,,0.06765856593847275,,,,,, +9,54099,,,,,,,,,,,,0.08380335569381714,,,,,, +9,54149,,,,,,,,,,,,0.08762671798467636,,,,,, +9,54199,,,,,,,,,,,,0.07735518366098404,,,,,, +9,54249,,,,,,,,,,,,0.07942511886358261,,,,,, +9,54299,,,,,,,,,,,,0.08183763176202774,,,,,, +9,54349,,,,,,,,,,,,0.07832756638526917,,,,,, +9,54399,,,,,,,,,,,,0.07308121025562286,,,,,, +9,54449,,,,,,,,,,,,0.06932353228330612,,,,,, +9,54499,,,,,,,,,,,,0.07904012501239777,,,,,, +9,54549,,,,,,,,,,,,0.0824638158082962,,,,,, +9,54599,,,,,,,,,,,,0.07600970566272736,,,,,, +9,54649,,,,,,,,,,,,0.08629295229911804,,,,,, +9,54699,,,,,,,,,,,,0.07356590032577515,,,,,, +9,54749,,,,,,,,,,,,0.06920715421438217,,,,,, +9,54799,,,,,,,,,,,,0.07990990579128265,,,,,, +9,54849,,,,,,,,,,,,0.07282990217208862,,,,,, +9,54899,,,,,,,,,,,,0.07906638830900192,,,,,, +9,54949,,,,,,,,,,,,0.0831231102347374,,,,,, +9,54999,,,,,,,,,,,,0.0892583578824997,,,,,, +9,55049,,,,,,,,,,,,0.08109693229198456,,,,,, +9,55099,,,,,,,,,,,,0.08124858140945435,,,,,, +9,55149,,,,,,,,,,,,0.08310586214065552,,,,,, +9,55199,,,,,,,,,,,,0.08085659146308899,,,,,, +9,55249,,,,,,,,,,,,0.08054598420858383,,,,,, +9,55299,,,,,,,,,,,,0.07843048125505447,,,,,, +9,55349,,,,,,,,,,,,0.07445574551820755,,,,,, +9,55399,,,,,,,,,,,,0.072052001953125,,,,,, +9,55449,,,,,,,,,,,,0.0696549117565155,,,,,, +9,55499,,,,,,,,,,,,0.07755490392446518,,,,,, +9,55549,,,,,,,,,,,,0.06915070116519928,,,,,, +9,55599,,,,,,,,,,,,0.0809670239686966,,,,,, +9,55649,,,,,,,,,,,,0.07748599350452423,,,,,, +9,55699,,,,,,,,,,,,0.07631217688322067,,,,,, +9,55749,,,,,,,,,,,,0.07289797067642212,,,,,, +9,55799,,,,,,,,,,,,0.0788421556353569,,,,,, +9,55849,,,,,,,,,,,,0.08533760905265808,,,,,, +9,55899,,,,,,,,,,,,0.07615537941455841,,,,,, +9,55949,,,,,,,,,,,,0.07877463847398758,,,,,, +9,55999,,,,,,,,,,,,0.08082105219364166,,,,,, +9,56049,,,,,,,,,,,,0.08220083266496658,,,,,, +9,56099,,,,,,,,,,,,0.08294433355331421,,,,,, +9,56149,,,,,,,,,,,,0.0819253921508789,,,,,, +9,56199,,,,,,,,,,,,0.08340219408273697,,,,,, +9,56249,,,,,,,,,,,,0.08131472021341324,,,,,, +9,56299,,,,,,,,,,,,0.0722651481628418,,,,,, +9,56349,,,,,,,,,,,,0.08029429614543915,,,,,, +9,56399,,,,,,,,,,,,0.08527770638465881,,,,,, +9,56449,,,,,,,,,,,,0.07078087329864502,,,,,, +9,56499,,,,,,,,,,,,0.07871320843696594,,,,,, +9,56549,,,,,,,,,,,,0.07653561234474182,,,,,, +9,56599,,,,,,,,,,,,0.07852760702371597,,,,,, +9,56649,,,,,,,,,,,,0.08142358064651489,,,,,, +9,56699,,,,,,,,,,,,0.07697949558496475,,,,,, +9,56749,,,,,,,,,,,,0.07329510152339935,,,,,, +9,56799,,,,,,,,,,,,0.0786406397819519,,,,,, +9,56849,,,,,,,,,,,,0.08480179309844971,,,,,, +9,56899,,,,,,,,,,,,0.07446795701980591,,,,,, +9,56949,,,,,,,,,,,,0.0800078958272934,,,,,, +9,56999,,,,,,,,,,,,0.07645964622497559,,,,,, +9,57049,,,,,,,,,,,,0.0785326212644577,,,,,, +9,57099,,,,,,,,,,,,0.08700842410326004,,,,,, +9,57149,,,,,,,,,,,,0.08695842325687408,,,,,, +9,57199,,,,,,,,,,,,0.07542144507169724,,,,,, +9,57249,,,,,,,,,,,,0.08440666645765305,,,,,, +9,57299,,,,,,,,,,,,0.07915297150611877,,,,,, +9,57349,,,,,,,,,,,,0.08026217669248581,,,,,, +9,57359,,,,,,,,,,,,,0.2455461472272873,0.0820707380771637,0.1356932669878006,0.004248380661010742,0.15583860874176025,0.0820707380771637 +9,57359,,,,,,,0.2418370246887207,0.07927829027175903,0.20559614896774292,0.042090654373168945,0.18782539665699005,,,,,,, +10,57399,,,,,,,,,,,,0.07785727083683014,,,,,, +10,57449,,,,,,,,,,,,0.08644542098045349,,,,,, +10,57499,,,,,,,,,,,,0.08443635702133179,,,,,, +10,57549,,,,,,,,,,,,0.0915815457701683,,,,,, +10,57599,,,,,,,,,,,,0.08877981454133987,,,,,, +10,57649,,,,,,,,,,,,0.08742451667785645,,,,,, +10,57699,,,,,,,,,,,,0.0781334638595581,,,,,, +10,57749,,,,,,,,,,,,0.06962606310844421,,,,,, +10,57799,,,,,,,,,,,,0.09507513791322708,,,,,, +10,57849,,,,,,,,,,,,0.0930587574839592,,,,,, +10,57899,,,,,,,,,,,,0.08551335334777832,,,,,, +10,57949,,,,,,,,,,,,0.08660605549812317,,,,,, +10,57999,,,,,,,,,,,,0.06947670131921768,,,,,, +10,58049,,,,,,,,,,,,0.08954960107803345,,,,,, +10,58099,,,,,,,,,,,,0.08073972165584564,,,,,, +10,58149,,,,,,,,,,,,0.06705322861671448,,,,,, +10,58199,,,,,,,,,,,,0.0749107077717781,,,,,, +10,58249,,,,,,,,,,,,0.08583657443523407,,,,,, +10,58299,,,,,,,,,,,,0.08123407512903214,,,,,, +10,58349,,,,,,,,,,,,0.07667876780033112,,,,,, +10,58399,,,,,,,,,,,,0.08315007388591766,,,,,, +10,58449,,,,,,,,,,,,0.07121793925762177,,,,,, +10,58499,,,,,,,,,,,,0.07839401066303253,,,,,, +10,58549,,,,,,,,,,,,0.0815114751458168,,,,,, +10,58599,,,,,,,,,,,,0.07052961736917496,,,,,, +10,58649,,,,,,,,,,,,0.07974749803543091,,,,,, +10,58699,,,,,,,,,,,,0.07349392771720886,,,,,, +10,58749,,,,,,,,,,,,0.07998687028884888,,,,,, +10,58799,,,,,,,,,,,,0.07937566190958023,,,,,, +10,58849,,,,,,,,,,,,0.0783664882183075,,,,,, +10,58899,,,,,,,,,,,,0.078252412378788,,,,,, +10,58949,,,,,,,,,,,,0.07034341990947723,,,,,, +10,58999,,,,,,,,,,,,0.09811544418334961,,,,,, +10,59049,,,,,,,,,,,,0.07864513993263245,,,,,, +10,59099,,,,,,,,,,,,0.08310258388519287,,,,,, +10,59149,,,,,,,,,,,,0.07634293287992477,,,,,, +10,59199,,,,,,,,,,,,0.07884253561496735,,,,,, +10,59249,,,,,,,,,,,,0.08514560759067535,,,,,, +10,59299,,,,,,,,,,,,0.0839790478348732,,,,,, +10,59349,,,,,,,,,,,,0.07779765129089355,,,,,, +10,59399,,,,,,,,,,,,0.09185536205768585,,,,,, +10,59449,,,,,,,,,,,,0.08813698589801788,,,,,, +10,59499,,,,,,,,,,,,0.06834659725427628,,,,,, +10,59549,,,,,,,,,,,,0.08140414208173752,,,,,, +10,59599,,,,,,,,,,,,0.08283906430006027,,,,,, +10,59649,,,,,,,,,,,,0.08299733698368073,,,,,, +10,59699,,,,,,,,,,,,0.06740264594554901,,,,,, +10,59749,,,,,,,,,,,,0.08790751546621323,,,,,, +10,59799,,,,,,,,,,,,0.07936441898345947,,,,,, +10,59849,,,,,,,,,,,,0.08650761097669601,,,,,, +10,59899,,,,,,,,,,,,0.0867556631565094,,,,,, +10,59949,,,,,,,,,,,,0.08834486454725266,,,,,, +10,59999,,,,,,,,,,,,0.07533756643533707,,,,,, +10,60049,,,,,,,,,,,,0.06923513114452362,,,,,, +10,60099,,,,,,,,,,,,0.07607809454202652,,,,,, +10,60149,,,,,,,,,,,,0.08690905570983887,,,,,, +10,60199,,,,,,,,,,,,0.06963586807250977,,,,,, +10,60249,,,,,,,,,,,,0.07714182883501053,,,,,, +10,60299,,,,,,,,,,,,0.07160806655883789,,,,,, +10,60349,,,,,,,,,,,,0.07984678447246552,,,,,, +10,60399,,,,,,,,,,,,0.08779039978981018,,,,,, +10,60449,,,,,,,,,,,,0.06669338047504425,,,,,, +10,60499,,,,,,,,,,,,0.08331183344125748,,,,,, +10,60549,,,,,,,,,,,,0.07157151401042938,,,,,, +10,60599,,,,,,,,,,,,0.07189461588859558,,,,,, +10,60649,,,,,,,,,,,,0.07667506486177444,,,,,, +10,60699,,,,,,,,,,,,0.09072626382112503,,,,,, +10,60749,,,,,,,,,,,,0.07513754814863205,,,,,, +10,60799,,,,,,,,,,,,0.07843796908855438,,,,,, +10,60849,,,,,,,,,,,,0.08139027655124664,,,,,, +10,60899,,,,,,,,,,,,0.08120737224817276,,,,,, +10,60949,,,,,,,,,,,,0.07286405563354492,,,,,, +10,60999,,,,,,,,,,,,0.08450876921415329,,,,,, +10,61049,,,,,,,,,,,,0.07658582925796509,,,,,, +10,61099,,,,,,,,,,,,0.0755947008728981,,,,,, +10,61149,,,,,,,,,,,,0.09310637414455414,,,,,, +10,61199,,,,,,,,,,,,0.07706527411937714,,,,,, +10,61249,,,,,,,,,,,,0.07963426411151886,,,,,, +10,61299,,,,,,,,,,,,0.07445552945137024,,,,,, +10,61349,,,,,,,,,,,,0.08927664905786514,,,,,, +10,61399,,,,,,,,,,,,0.07404643297195435,,,,,, +10,61449,,,,,,,,,,,,0.07619974762201309,,,,,, +10,61499,,,,,,,,,,,,0.08155761659145355,,,,,, +10,61549,,,,,,,,,,,,0.08360044658184052,,,,,, +10,61599,,,,,,,,,,,,0.07448183745145798,,,,,, +10,61649,,,,,,,,,,,,0.08286367356777191,,,,,, +10,61699,,,,,,,,,,,,0.07731324434280396,,,,,, +10,61749,,,,,,,,,,,,0.09240469336509705,,,,,, +10,61799,,,,,,,,,,,,0.06643085181713104,,,,,, +10,61849,,,,,,,,,,,,0.07495369017124176,,,,,, +10,61899,,,,,,,,,,,,0.07326927781105042,,,,,, +10,61949,,,,,,,,,,,,0.08280367404222488,,,,,, +10,61999,,,,,,,,,,,,0.0680909976363182,,,,,, +10,62049,,,,,,,,,,,,0.08172817528247833,,,,,, +10,62099,,,,,,,,,,,,0.08056461811065674,,,,,, +10,62149,,,,,,,,,,,,0.07569489628076553,,,,,, +10,62199,,,,,,,,,,,,0.08501735329627991,,,,,, +10,62249,,,,,,,,,,,,0.07702701538801193,,,,,, +10,62299,,,,,,,,,,,,0.08094150573015213,,,,,, +10,62349,,,,,,,,,,,,0.08003420382738113,,,,,, +10,62399,,,,,,,,,,,,0.08211592584848404,,,,,, +10,62449,,,,,,,,,,,,0.07484637200832367,,,,,, +10,62499,,,,,,,,,,,,0.07894489169120789,,,,,, +10,62549,,,,,,,,,,,,0.08465656638145447,,,,,, +10,62599,,,,,,,,,,,,0.07909400016069412,,,,,, +10,62649,,,,,,,,,,,,0.07564646005630493,,,,,, +10,62699,,,,,,,,,,,,0.08386881649494171,,,,,, +10,62749,,,,,,,,,,,,0.0705469474196434,,,,,, +10,62799,,,,,,,,,,,,0.0813622921705246,,,,,, +10,62849,,,,,,,,,,,,0.07772770524024963,,,,,, +10,62899,,,,,,,,,,,,0.09305940568447113,,,,,, +10,62949,,,,,,,,,,,,0.09438404440879822,,,,,, +10,62999,,,,,,,,,,,,0.07569009065628052,,,,,, +10,63049,,,,,,,,,,,,0.08777447044849396,,,,,, +10,63095,,,,,,,,,,,,,0.2462955266237259,0.08275260031223297,0.11834481358528137,-0.004024624824523926,0.13775961101055145,0.08275260031223297 +10,63095,,,,,,,0.24152784049510956,0.0791591927409172,0.20913051068782806,0.043528735637664795,0.19246158003807068,,,,,,, +11,63099,,,,,,,,,,,,0.07661176472902298,,,,,, +11,63149,,,,,,,,,,,,0.07634051889181137,,,,,, +11,63199,,,,,,,,,,,,0.07916024327278137,,,,,, +11,63249,,,,,,,,,,,,0.08117586374282837,,,,,, +11,63299,,,,,,,,,,,,0.07505179196596146,,,,,, +11,63349,,,,,,,,,,,,0.08439719676971436,,,,,, +11,63399,,,,,,,,,,,,0.08158407360315323,,,,,, +11,63449,,,,,,,,,,,,0.07683883607387543,,,,,, +11,63499,,,,,,,,,,,,0.08527733385562897,,,,,, +11,63549,,,,,,,,,,,,0.07508006691932678,,,,,, +11,63599,,,,,,,,,,,,0.08650057017803192,,,,,, +11,63649,,,,,,,,,,,,0.08672794699668884,,,,,, +11,63699,,,,,,,,,,,,0.07630385458469391,,,,,, +11,63749,,,,,,,,,,,,0.08038957417011261,,,,,, +11,63799,,,,,,,,,,,,0.09787007421255112,,,,,, +11,63849,,,,,,,,,,,,0.08673082292079926,,,,,, +11,63899,,,,,,,,,,,,0.08817809820175171,,,,,, +11,63949,,,,,,,,,,,,0.08304210007190704,,,,,, +11,63999,,,,,,,,,,,,0.07587659358978271,,,,,, +11,64049,,,,,,,,,,,,0.08335607498884201,,,,,, +11,64099,,,,,,,,,,,,0.07605049759149551,,,,,, +11,64149,,,,,,,,,,,,0.07572771608829498,,,,,, +11,64199,,,,,,,,,,,,0.07412949204444885,,,,,, +11,64249,,,,,,,,,,,,0.06868593394756317,,,,,, +11,64299,,,,,,,,,,,,0.08615702390670776,,,,,, +11,64349,,,,,,,,,,,,0.07640275359153748,,,,,, +11,64399,,,,,,,,,,,,0.06672964245080948,,,,,, +11,64449,,,,,,,,,,,,0.07298104465007782,,,,,, +11,64499,,,,,,,,,,,,0.07809165120124817,,,,,, +11,64549,,,,,,,,,,,,0.08271507918834686,,,,,, +11,64599,,,,,,,,,,,,0.07502129673957825,,,,,, +11,64649,,,,,,,,,,,,0.0805710107088089,,,,,, +11,64699,,,,,,,,,,,,0.09372903406620026,,,,,, +11,64749,,,,,,,,,,,,0.07389894127845764,,,,,, +11,64799,,,,,,,,,,,,0.07551036030054092,,,,,, +11,64849,,,,,,,,,,,,0.06768589466810226,,,,,, +11,64899,,,,,,,,,,,,0.08044840395450592,,,,,, +11,64949,,,,,,,,,,,,0.08369886130094528,,,,,, +11,64999,,,,,,,,,,,,0.08832821249961853,,,,,, +11,65049,,,,,,,,,,,,0.08367489278316498,,,,,, +11,65099,,,,,,,,,,,,0.08614501357078552,,,,,, +11,65149,,,,,,,,,,,,0.08695224672555923,,,,,, +11,65199,,,,,,,,,,,,0.07801146805286407,,,,,, +11,65249,,,,,,,,,,,,0.09476426243782043,,,,,, +11,65299,,,,,,,,,,,,0.08300946652889252,,,,,, +11,65349,,,,,,,,,,,,0.07254467904567719,,,,,, +11,65399,,,,,,,,,,,,0.07483048737049103,,,,,, +11,65449,,,,,,,,,,,,0.06507634371519089,,,,,, +11,65499,,,,,,,,,,,,0.07600432634353638,,,,,, +11,65549,,,,,,,,,,,,0.06874409317970276,,,,,, +11,65599,,,,,,,,,,,,0.0716102123260498,,,,,, +11,65649,,,,,,,,,,,,0.07852449268102646,,,,,, +11,65699,,,,,,,,,,,,0.08094099909067154,,,,,, +11,65749,,,,,,,,,,,,0.09428757429122925,,,,,, +11,65799,,,,,,,,,,,,0.0694703608751297,,,,,, +11,65849,,,,,,,,,,,,0.07536321878433228,,,,,, +11,65899,,,,,,,,,,,,0.08750831335783005,,,,,, +11,65949,,,,,,,,,,,,0.06925090402364731,,,,,, +11,65999,,,,,,,,,,,,0.0818944200873375,,,,,, +11,66049,,,,,,,,,,,,0.08429170399904251,,,,,, +11,66099,,,,,,,,,,,,0.0783301517367363,,,,,, +11,66149,,,,,,,,,,,,0.08073630928993225,,,,,, +11,66199,,,,,,,,,,,,0.08020734786987305,,,,,, +11,66249,,,,,,,,,,,,0.07859638333320618,,,,,, +11,66299,,,,,,,,,,,,0.0817917138338089,,,,,, +11,66349,,,,,,,,,,,,0.08110122382640839,,,,,, +11,66399,,,,,,,,,,,,0.07972340285778046,,,,,, +11,66449,,,,,,,,,,,,0.07447369396686554,,,,,, +11,66499,,,,,,,,,,,,0.08106937259435654,,,,,, +11,66549,,,,,,,,,,,,0.07836145162582397,,,,,, +11,66599,,,,,,,,,,,,0.0838182121515274,,,,,, +11,66649,,,,,,,,,,,,0.07490505278110504,,,,,, +11,66699,,,,,,,,,,,,0.0779690071940422,,,,,, +11,66749,,,,,,,,,,,,0.08550788462162018,,,,,, +11,66799,,,,,,,,,,,,0.07454141229391098,,,,,, +11,66849,,,,,,,,,,,,0.07781791687011719,,,,,, +11,66899,,,,,,,,,,,,0.08102564513683319,,,,,, +11,66949,,,,,,,,,,,,0.07450810074806213,,,,,, +11,66999,,,,,,,,,,,,0.07385068386793137,,,,,, +11,67049,,,,,,,,,,,,0.08173563331365585,,,,,, +11,67099,,,,,,,,,,,,0.0810154527425766,,,,,, +11,67149,,,,,,,,,,,,0.08140095323324203,,,,,, +11,67199,,,,,,,,,,,,0.08224357664585114,,,,,, +11,67249,,,,,,,,,,,,0.07045257836580276,,,,,, +11,67299,,,,,,,,,,,,0.09163433313369751,,,,,, +11,67349,,,,,,,,,,,,0.0723547711968422,,,,,, +11,67399,,,,,,,,,,,,0.07587746530771255,,,,,, +11,67449,,,,,,,,,,,,0.07887519150972366,,,,,, +11,67499,,,,,,,,,,,,0.09511031955480576,,,,,, +11,67549,,,,,,,,,,,,0.07589259743690491,,,,,, +11,67599,,,,,,,,,,,,0.08338095247745514,,,,,, +11,67649,,,,,,,,,,,,0.0813109278678894,,,,,, +11,67699,,,,,,,,,,,,0.0707135945558548,,,,,, +11,67749,,,,,,,,,,,,0.07051432132720947,,,,,, +11,67799,,,,,,,,,,,,0.08154311031103134,,,,,, +11,67849,,,,,,,,,,,,0.09172891825437546,,,,,, +11,67899,,,,,,,,,,,,0.0826648697257042,,,,,, +11,67949,,,,,,,,,,,,0.08415234833955765,,,,,, +11,67999,,,,,,,,,,,,0.08285261690616608,,,,,, +11,68049,,,,,,,,,,,,0.08904119580984116,,,,,, +11,68099,,,,,,,,,,,,0.08912228047847748,,,,,, +11,68149,,,,,,,,,,,,0.08720774948596954,,,,,, +11,68199,,,,,,,,,,,,0.08262377232313156,,,,,, +11,68249,,,,,,,,,,,,0.08987293392419815,,,,,, +11,68299,,,,,,,,,,,,0.08547137677669525,,,,,, +11,68349,,,,,,,,,,,,0.09150633960962296,,,,,, +11,68399,,,,,,,,,,,,0.06746171414852142,,,,,, +11,68449,,,,,,,,,,,,0.09001839905977249,,,,,, +11,68499,,,,,,,,,,,,0.07865962386131287,,,,,, +11,68549,,,,,,,,,,,,0.08819536864757538,,,,,, +11,68599,,,,,,,,,,,,0.06538818776607513,,,,,, +11,68649,,,,,,,,,,,,0.08188982307910919,,,,,, +11,68699,,,,,,,,,,,,0.07277964055538177,,,,,, +11,68749,,,,,,,,,,,,0.07757119834423065,,,,,, +11,68799,,,,,,,,,,,,0.0792708769440651,,,,,, +11,68831,,,,,,,,,,,,,0.2455308884382248,0.08145815134048462,0.1227816492319107,0.011680781841278076,0.1372278779745102,0.08145815134048462 +11,68831,,,,,,,0.2416502833366394,0.0792214572429657,0.20760302245616913,0.04277145862579346,0.19384433329105377,,,,,,, +12,68849,,,,,,,,,,,,0.07910580188035965,,,,,, +12,68899,,,,,,,,,,,,0.09570490568876266,,,,,, +12,68949,,,,,,,,,,,,0.08192948251962662,,,,,, +12,68999,,,,,,,,,,,,0.07289209961891174,,,,,, +12,69049,,,,,,,,,,,,0.07997770607471466,,,,,, +12,69099,,,,,,,,,,,,0.06407392024993896,,,,,, +12,69149,,,,,,,,,,,,0.07398375868797302,,,,,, +12,69199,,,,,,,,,,,,0.0736742839217186,,,,,, +12,69249,,,,,,,,,,,,0.0749652087688446,,,,,, +12,69299,,,,,,,,,,,,0.06456996500492096,,,,,, +12,69349,,,,,,,,,,,,0.06719683855772018,,,,,, +12,69399,,,,,,,,,,,,0.07840874046087265,,,,,, +12,69449,,,,,,,,,,,,0.08313104510307312,,,,,, +12,69499,,,,,,,,,,,,0.0772809237241745,,,,,, +12,69549,,,,,,,,,,,,0.07532843947410583,,,,,, +12,69599,,,,,,,,,,,,0.07718504965305328,,,,,, +12,69649,,,,,,,,,,,,0.08117658644914627,,,,,, +12,69699,,,,,,,,,,,,0.07260977476835251,,,,,, +12,69749,,,,,,,,,,,,0.08254188299179077,,,,,, +12,69799,,,,,,,,,,,,0.07774123549461365,,,,,, +12,69849,,,,,,,,,,,,0.076685331761837,,,,,, +12,69899,,,,,,,,,,,,0.06648360192775726,,,,,, +12,69949,,,,,,,,,,,,0.09365276247262955,,,,,, +12,69999,,,,,,,,,,,,0.08546782284975052,,,,,, +12,70049,,,,,,,,,,,,0.07890599220991135,,,,,, +12,70099,,,,,,,,,,,,0.08397939801216125,,,,,, +12,70149,,,,,,,,,,,,0.07190395891666412,,,,,, +12,70199,,,,,,,,,,,,0.08003043383359909,,,,,, +12,70249,,,,,,,,,,,,0.07710527628660202,,,,,, +12,70299,,,,,,,,,,,,0.07423870265483856,,,,,, +12,70349,,,,,,,,,,,,0.07814618200063705,,,,,, +12,70399,,,,,,,,,,,,0.07885502278804779,,,,,, +12,70449,,,,,,,,,,,,0.07652156054973602,,,,,, +12,70499,,,,,,,,,,,,0.07420555502176285,,,,,, +12,70549,,,,,,,,,,,,0.08643820136785507,,,,,, +12,70599,,,,,,,,,,,,0.07499304413795471,,,,,, +12,70649,,,,,,,,,,,,0.07323520630598068,,,,,, +12,70699,,,,,,,,,,,,0.07944095134735107,,,,,, +12,70749,,,,,,,,,,,,0.07313910126686096,,,,,, +12,70799,,,,,,,,,,,,0.07687520235776901,,,,,, +12,70849,,,,,,,,,,,,0.07799531519412994,,,,,, +12,70899,,,,,,,,,,,,0.07516008615493774,,,,,, +12,70949,,,,,,,,,,,,0.07883142679929733,,,,,, +12,70999,,,,,,,,,,,,0.07330029457807541,,,,,, +12,71049,,,,,,,,,,,,0.07424081116914749,,,,,, +12,71099,,,,,,,,,,,,0.07555624097585678,,,,,, +12,71149,,,,,,,,,,,,0.10415351390838623,,,,,, +12,71199,,,,,,,,,,,,0.08202260732650757,,,,,, +12,71249,,,,,,,,,,,,0.08109351992607117,,,,,, +12,71299,,,,,,,,,,,,0.06818065792322159,,,,,, +12,71349,,,,,,,,,,,,0.07646991312503815,,,,,, +12,71399,,,,,,,,,,,,0.08101622015237808,,,,,, +12,71449,,,,,,,,,,,,0.06559036672115326,,,,,, +12,71499,,,,,,,,,,,,0.07454976439476013,,,,,, +12,71549,,,,,,,,,,,,0.06483951210975647,,,,,, +12,71599,,,,,,,,,,,,0.08226695656776428,,,,,, +12,71649,,,,,,,,,,,,0.07493242621421814,,,,,, +12,71699,,,,,,,,,,,,0.07426151633262634,,,,,, +12,71749,,,,,,,,,,,,0.07667452096939087,,,,,, +12,71799,,,,,,,,,,,,0.07245462387800217,,,,,, +12,71849,,,,,,,,,,,,0.07429063320159912,,,,,, +12,71899,,,,,,,,,,,,0.07525300979614258,,,,,, +12,71949,,,,,,,,,,,,0.07595136761665344,,,,,, +12,71999,,,,,,,,,,,,0.08184418827295303,,,,,, +12,72049,,,,,,,,,,,,0.07652106881141663,,,,,, +12,72099,,,,,,,,,,,,0.08290188759565353,,,,,, +12,72149,,,,,,,,,,,,0.08106483519077301,,,,,, +12,72199,,,,,,,,,,,,0.08223691582679749,,,,,, +12,72249,,,,,,,,,,,,0.07114303112030029,,,,,, +12,72299,,,,,,,,,,,,0.08875082433223724,,,,,, +12,72349,,,,,,,,,,,,0.07705610990524292,,,,,, +12,72399,,,,,,,,,,,,0.0747489184141159,,,,,, +12,72449,,,,,,,,,,,,0.08496904373168945,,,,,, +12,72499,,,,,,,,,,,,0.08600874245166779,,,,,, +12,72549,,,,,,,,,,,,0.07800214737653732,,,,,, +12,72599,,,,,,,,,,,,0.07158535718917847,,,,,, +12,72649,,,,,,,,,,,,0.07641267776489258,,,,,, +12,72699,,,,,,,,,,,,0.09265671670436859,,,,,, +12,72749,,,,,,,,,,,,0.09472212195396423,,,,,, +12,72799,,,,,,,,,,,,0.08026158064603806,,,,,, +12,72849,,,,,,,,,,,,0.07683172821998596,,,,,, +12,72899,,,,,,,,,,,,0.08850059658288956,,,,,, +12,72949,,,,,,,,,,,,0.08405645191669464,,,,,, +12,72999,,,,,,,,,,,,0.08312194049358368,,,,,, +12,73049,,,,,,,,,,,,0.07795397192239761,,,,,, +12,73099,,,,,,,,,,,,0.08412005752325058,,,,,, +12,73149,,,,,,,,,,,,0.07942799478769302,,,,,, +12,73199,,,,,,,,,,,,0.07535000145435333,,,,,, +12,73249,,,,,,,,,,,,0.07645846903324127,,,,,, +12,73299,,,,,,,,,,,,0.07674684375524521,,,,,, +12,73349,,,,,,,,,,,,0.07531533390283585,,,,,, +12,73399,,,,,,,,,,,,0.08886541426181793,,,,,, +12,73449,,,,,,,,,,,,0.07432590425014496,,,,,, +12,73499,,,,,,,,,,,,0.07592654228210449,,,,,, +12,73549,,,,,,,,,,,,0.07148626446723938,,,,,, +12,73599,,,,,,,,,,,,0.08362853527069092,,,,,, +12,73649,,,,,,,,,,,,0.07852809876203537,,,,,, +12,73699,,,,,,,,,,,,0.06986388564109802,,,,,, +12,73749,,,,,,,,,,,,0.07503169775009155,,,,,, +12,73799,,,,,,,,,,,,0.08001656830310822,,,,,, +12,73849,,,,,,,,,,,,0.06997889280319214,,,,,, +12,73899,,,,,,,,,,,,0.0854969322681427,,,,,, +12,73949,,,,,,,,,,,,0.07369156181812286,,,,,, +12,73999,,,,,,,,,,,,0.07309354096651077,,,,,, +12,74049,,,,,,,,,,,,0.07967275381088257,,,,,, +12,74099,,,,,,,,,,,,0.07410472631454468,,,,,, +12,74149,,,,,,,,,,,,0.0879574865102768,,,,,, +12,74199,,,,,,,,,,,,0.0641462579369545,,,,,, +12,74249,,,,,,,,,,,,0.08877743780612946,,,,,, +12,74299,,,,,,,,,,,,0.09356478601694107,,,,,, +12,74349,,,,,,,,,,,,0.07777248322963715,,,,,, +12,74399,,,,,,,,,,,,0.08192738890647888,,,,,, +12,74449,,,,,,,,,,,,0.08343879878520966,,,,,, +12,74499,,,,,,,,,,,,0.07988536357879639,,,,,, +12,74549,,,,,,,,,,,,0.0959157645702362,,,,,, +12,74567,,,,,,,,,,,,,0.24641968309879303,0.08297952264547348,0.12120271474123001,-0.006777763366699219,0.12788358330726624,0.08297952264547348 +12,74567,,,,,,,0.24167928099632263,0.07925854623317719,0.20643632113933563,0.04233193397521973,0.1925514042377472,,,,,,, +13,74599,,,,,,,,,,,,0.08478203415870667,,,,,, +13,74649,,,,,,,,,,,,0.08487478643655777,,,,,, +13,74699,,,,,,,,,,,,0.08827145397663116,,,,,, +13,74749,,,,,,,,,,,,0.07458071410655975,,,,,, +13,74799,,,,,,,,,,,,0.07724812626838684,,,,,, +13,74849,,,,,,,,,,,,0.06945107877254486,,,,,, +13,74899,,,,,,,,,,,,0.08809733390808105,,,,,, +13,74949,,,,,,,,,,,,0.07846443355083466,,,,,, +13,74999,,,,,,,,,,,,0.08447162806987762,,,,,, +13,75049,,,,,,,,,,,,0.10018397867679596,,,,,, +13,75099,,,,,,,,,,,,0.08719925582408905,,,,,, +13,75149,,,,,,,,,,,,0.07482773810625076,,,,,, +13,75199,,,,,,,,,,,,0.07869330048561096,,,,,, +13,75249,,,,,,,,,,,,0.07519689202308655,,,,,, +13,75299,,,,,,,,,,,,0.08906030654907227,,,,,, +13,75349,,,,,,,,,,,,0.09110889583826065,,,,,, +13,75399,,,,,,,,,,,,0.0804087445139885,,,,,, +13,75449,,,,,,,,,,,,0.06109099090099335,,,,,, +13,75499,,,,,,,,,,,,0.08082340657711029,,,,,, +13,75549,,,,,,,,,,,,0.07657460868358612,,,,,, +13,75599,,,,,,,,,,,,0.074964240193367,,,,,, +13,75649,,,,,,,,,,,,0.0806715190410614,,,,,, +13,75699,,,,,,,,,,,,0.07601479440927505,,,,,, +13,75749,,,,,,,,,,,,0.0819745808839798,,,,,, +13,75799,,,,,,,,,,,,0.06874353438615799,,,,,, +13,75849,,,,,,,,,,,,0.0751538947224617,,,,,, +13,75899,,,,,,,,,,,,0.07907625287771225,,,,,, +13,75949,,,,,,,,,,,,0.073954276740551,,,,,, +13,75999,,,,,,,,,,,,0.09900303930044174,,,,,, +13,76049,,,,,,,,,,,,0.0930829644203186,,,,,, +13,76099,,,,,,,,,,,,0.08326756954193115,,,,,, +13,76149,,,,,,,,,,,,0.07754555344581604,,,,,, +13,76199,,,,,,,,,,,,0.07475029677152634,,,,,, +13,76249,,,,,,,,,,,,0.09533669054508209,,,,,, +13,76299,,,,,,,,,,,,0.08115874230861664,,,,,, +13,76349,,,,,,,,,,,,0.08094003796577454,,,,,, +13,76399,,,,,,,,,,,,0.07901184260845184,,,,,, +13,76449,,,,,,,,,,,,0.08636614680290222,,,,,, +13,76499,,,,,,,,,,,,0.07701761275529861,,,,,, +13,76549,,,,,,,,,,,,0.08726631104946136,,,,,, +13,76599,,,,,,,,,,,,0.07939571142196655,,,,,, +13,76649,,,,,,,,,,,,0.08402998000383377,,,,,, +13,76699,,,,,,,,,,,,0.07450337707996368,,,,,, +13,76749,,,,,,,,,,,,0.06653039902448654,,,,,, +13,76799,,,,,,,,,,,,0.08023005723953247,,,,,, +13,76849,,,,,,,,,,,,0.08248569071292877,,,,,, +13,76899,,,,,,,,,,,,0.08664710819721222,,,,,, +13,76949,,,,,,,,,,,,0.07588129490613937,,,,,, +13,76999,,,,,,,,,,,,0.0793013721704483,,,,,, +13,77049,,,,,,,,,,,,0.07514314353466034,,,,,, +13,77099,,,,,,,,,,,,0.08379136025905609,,,,,, +13,77149,,,,,,,,,,,,0.07939165830612183,,,,,, +13,77199,,,,,,,,,,,,0.07851845026016235,,,,,, +13,77249,,,,,,,,,,,,0.08993229269981384,,,,,, +13,77299,,,,,,,,,,,,0.07816819846630096,,,,,, +13,77349,,,,,,,,,,,,0.07795176655054092,,,,,, +13,77399,,,,,,,,,,,,0.06781752407550812,,,,,, +13,77449,,,,,,,,,,,,0.0909014642238617,,,,,, +13,77499,,,,,,,,,,,,0.07386334985494614,,,,,, +13,77549,,,,,,,,,,,,0.0763603001832962,,,,,, +13,77599,,,,,,,,,,,,0.08198197185993195,,,,,, +13,77649,,,,,,,,,,,,0.07994736731052399,,,,,, +13,77699,,,,,,,,,,,,0.06710943579673767,,,,,, +13,77749,,,,,,,,,,,,0.07397234439849854,,,,,, +13,77799,,,,,,,,,,,,0.08297178149223328,,,,,, +13,77849,,,,,,,,,,,,0.08372555673122406,,,,,, +13,77899,,,,,,,,,,,,0.07049614191055298,,,,,, +13,77949,,,,,,,,,,,,0.07864263653755188,,,,,, +13,77999,,,,,,,,,,,,0.08754032850265503,,,,,, +13,78049,,,,,,,,,,,,0.08645041286945343,,,,,, +13,78099,,,,,,,,,,,,0.07686419039964676,,,,,, +13,78149,,,,,,,,,,,,0.08353476226329803,,,,,, +13,78199,,,,,,,,,,,,0.0800180658698082,,,,,, +13,78249,,,,,,,,,,,,0.08534227311611176,,,,,, +13,78299,,,,,,,,,,,,0.08096596598625183,,,,,, +13,78349,,,,,,,,,,,,0.08485288918018341,,,,,, +13,78399,,,,,,,,,,,,0.07376745343208313,,,,,, +13,78449,,,,,,,,,,,,0.08898761868476868,,,,,, +13,78499,,,,,,,,,,,,0.0740298330783844,,,,,, +13,78549,,,,,,,,,,,,0.07516966015100479,,,,,, +13,78599,,,,,,,,,,,,0.0805879533290863,,,,,, +13,78649,,,,,,,,,,,,0.07729164510965347,,,,,, +13,78699,,,,,,,,,,,,0.08458033204078674,,,,,, +13,78749,,,,,,,,,,,,0.09675560891628265,,,,,, +13,78799,,,,,,,,,,,,0.06833454966545105,,,,,, +13,78849,,,,,,,,,,,,0.06519006937742233,,,,,, +13,78899,,,,,,,,,,,,0.07704748213291168,,,,,, +13,78949,,,,,,,,,,,,0.07418540120124817,,,,,, +13,78999,,,,,,,,,,,,0.07980433106422424,,,,,, +13,79049,,,,,,,,,,,,0.06793534010648727,,,,,, +13,79099,,,,,,,,,,,,0.06910312175750732,,,,,, +13,79149,,,,,,,,,,,,0.09563921391963959,,,,,, +13,79199,,,,,,,,,,,,0.08805736899375916,,,,,, +13,79249,,,,,,,,,,,,0.08144465833902359,,,,,, +13,79299,,,,,,,,,,,,0.08098176121711731,,,,,, +13,79349,,,,,,,,,,,,0.08677215874195099,,,,,, +13,79399,,,,,,,,,,,,0.08174137026071548,,,,,, +13,79449,,,,,,,,,,,,0.08037232607603073,,,,,, +13,79499,,,,,,,,,,,,0.06859999895095825,,,,,, +13,79549,,,,,,,,,,,,0.09095025807619095,,,,,, +13,79599,,,,,,,,,,,,0.09316396713256836,,,,,, +13,79649,,,,,,,,,,,,0.0758652538061142,,,,,, +13,79699,,,,,,,,,,,,0.08321907371282578,,,,,, +13,79749,,,,,,,,,,,,0.07493195682764053,,,,,, +13,79799,,,,,,,,,,,,0.06842299550771713,,,,,, +13,79849,,,,,,,,,,,,0.0811893418431282,,,,,, +13,79899,,,,,,,,,,,,0.08332215994596481,,,,,, +13,79949,,,,,,,,,,,,0.06968358159065247,,,,,, +13,79999,,,,,,,,,,,,0.07650884985923767,,,,,, +13,80049,,,,,,,,,,,,0.07985837757587433,,,,,, +13,80099,,,,,,,,,,,,0.08663474023342133,,,,,, +13,80149,,,,,,,,,,,,0.08134111762046814,,,,,, +13,80199,,,,,,,,,,,,0.0838625505566597,,,,,, +13,80249,,,,,,,,,,,,0.09330210834741592,,,,,, +13,80299,,,,,,,,,,,,0.06683415919542313,,,,,, +13,80303,,,,,,,,,,,,,0.24556411802768707,0.08150167018175125,0.122878797352314,0.01115274429321289,0.12997056543827057,0.08150167018175125 +13,80303,,,,,,,0.2412041574716568,0.07900331914424896,0.21374568343162537,0.04542124271392822,0.19908812642097473,,,,,,, +14,80349,,,,,,,,,,,,0.07028794288635254,,,,,, +14,80399,,,,,,,,,,,,0.0741315633058548,,,,,, +14,80449,,,,,,,,,,,,0.08130038529634476,,,,,, +14,80499,,,,,,,,,,,,0.08486838638782501,,,,,, +14,80549,,,,,,,,,,,,0.07690063118934631,,,,,, +14,80599,,,,,,,,,,,,0.07300795614719391,,,,,, +14,80649,,,,,,,,,,,,0.07820263504981995,,,,,, +14,80699,,,,,,,,,,,,0.05942867696285248,,,,,, +14,80749,,,,,,,,,,,,0.08243782818317413,,,,,, +14,80799,,,,,,,,,,,,0.07906034588813782,,,,,, +14,80849,,,,,,,,,,,,0.08158636093139648,,,,,, +14,80899,,,,,,,,,,,,0.07983864843845367,,,,,, +14,80949,,,,,,,,,,,,0.08301157504320145,,,,,, +14,80999,,,,,,,,,,,,0.08149956911802292,,,,,, +14,81049,,,,,,,,,,,,0.07014153152704239,,,,,, +14,81099,,,,,,,,,,,,0.08162747323513031,,,,,, +14,81149,,,,,,,,,,,,0.08350837230682373,,,,,, +14,81199,,,,,,,,,,,,0.08146113902330399,,,,,, +14,81249,,,,,,,,,,,,0.07847291231155396,,,,,, +14,81299,,,,,,,,,,,,0.09081560373306274,,,,,, +14,81349,,,,,,,,,,,,0.09119932353496552,,,,,, +14,81399,,,,,,,,,,,,0.07361827045679092,,,,,, +14,81449,,,,,,,,,,,,0.0770752876996994,,,,,, +14,81499,,,,,,,,,,,,0.08667710423469543,,,,,, +14,81549,,,,,,,,,,,,0.09166835248470306,,,,,, +14,81599,,,,,,,,,,,,0.08006489276885986,,,,,, +14,81649,,,,,,,,,,,,0.08741692453622818,,,,,, +14,81699,,,,,,,,,,,,0.08990608155727386,,,,,, +14,81749,,,,,,,,,,,,0.06858675926923752,,,,,, +14,81799,,,,,,,,,,,,0.08320975303649902,,,,,, +14,81849,,,,,,,,,,,,0.08454939723014832,,,,,, +14,81899,,,,,,,,,,,,0.08100941777229309,,,,,, +14,81949,,,,,,,,,,,,0.07342084497213364,,,,,, +14,81999,,,,,,,,,,,,0.07082812488079071,,,,,, +14,82049,,,,,,,,,,,,0.08219222724437714,,,,,, +14,82099,,,,,,,,,,,,0.0815485268831253,,,,,, +14,82149,,,,,,,,,,,,0.0838889554142952,,,,,, +14,82199,,,,,,,,,,,,0.06934791803359985,,,,,, +14,82249,,,,,,,,,,,,0.0909716859459877,,,,,, +14,82299,,,,,,,,,,,,0.08383549749851227,,,,,, +14,82349,,,,,,,,,,,,0.083281010389328,,,,,, +14,82399,,,,,,,,,,,,0.07860881090164185,,,,,, +14,82449,,,,,,,,,,,,0.0754237174987793,,,,,, +14,82499,,,,,,,,,,,,0.07901638746261597,,,,,, +14,82549,,,,,,,,,,,,0.08521807193756104,,,,,, +14,82599,,,,,,,,,,,,0.07515868544578552,,,,,, +14,82649,,,,,,,,,,,,0.08007342368364334,,,,,, +14,82699,,,,,,,,,,,,0.07076118886470795,,,,,, +14,82749,,,,,,,,,,,,0.08099351823329926,,,,,, +14,82799,,,,,,,,,,,,0.08083705604076385,,,,,, +14,82849,,,,,,,,,,,,0.07540925592184067,,,,,, +14,82899,,,,,,,,,,,,0.08104699850082397,,,,,, +14,82949,,,,,,,,,,,,0.07968421280384064,,,,,, +14,82999,,,,,,,,,,,,0.08636417239904404,,,,,, +14,83049,,,,,,,,,,,,0.08501550555229187,,,,,, +14,83099,,,,,,,,,,,,0.07948708534240723,,,,,, +14,83149,,,,,,,,,,,,0.08314259350299835,,,,,, +14,83199,,,,,,,,,,,,0.08555760979652405,,,,,, +14,83249,,,,,,,,,,,,0.07846863567829132,,,,,, +14,83299,,,,,,,,,,,,0.07620057463645935,,,,,, +14,83349,,,,,,,,,,,,0.08138001710176468,,,,,, +14,83399,,,,,,,,,,,,0.08344671130180359,,,,,, +14,83449,,,,,,,,,,,,0.07912324368953705,,,,,, +14,83499,,,,,,,,,,,,0.07105123996734619,,,,,, +14,83549,,,,,,,,,,,,0.07232095301151276,,,,,, +14,83599,,,,,,,,,,,,0.07752151787281036,,,,,, +14,83649,,,,,,,,,,,,0.08735497295856476,,,,,, +14,83699,,,,,,,,,,,,0.08317624032497406,,,,,, +14,83749,,,,,,,,,,,,0.07831503450870514,,,,,, +14,83799,,,,,,,,,,,,0.07654748857021332,,,,,, +14,83849,,,,,,,,,,,,0.07509998977184296,,,,,, +14,83899,,,,,,,,,,,,0.07388388365507126,,,,,, +14,83949,,,,,,,,,,,,0.09049975126981735,,,,,, +14,83999,,,,,,,,,,,,0.06568904221057892,,,,,, +14,84049,,,,,,,,,,,,0.07815706729888916,,,,,, +14,84099,,,,,,,,,,,,0.07674631476402283,,,,,, +14,84149,,,,,,,,,,,,0.07138846814632416,,,,,, +14,84199,,,,,,,,,,,,0.06710505485534668,,,,,, +14,84249,,,,,,,,,,,,0.0768585205078125,,,,,, +14,84299,,,,,,,,,,,,0.08793354779481888,,,,,, +14,84349,,,,,,,,,,,,0.0653160959482193,,,,,, +14,84399,,,,,,,,,,,,0.08061470091342926,,,,,, +14,84449,,,,,,,,,,,,0.07374686002731323,,,,,, +14,84499,,,,,,,,,,,,0.08190478384494781,,,,,, +14,84549,,,,,,,,,,,,0.07949984073638916,,,,,, +14,84599,,,,,,,,,,,,0.07581861317157745,,,,,, +14,84649,,,,,,,,,,,,0.08476527035236359,,,,,, +14,84699,,,,,,,,,,,,0.08103302121162415,,,,,, +14,84749,,,,,,,,,,,,0.0657002180814743,,,,,, +14,84799,,,,,,,,,,,,0.06973569095134735,,,,,, +14,84849,,,,,,,,,,,,0.08475179970264435,,,,,, +14,84899,,,,,,,,,,,,0.07645466923713684,,,,,, +14,84949,,,,,,,,,,,,0.0734468400478363,,,,,, +14,84999,,,,,,,,,,,,0.08248229324817657,,,,,, +14,85049,,,,,,,,,,,,0.09381168335676193,,,,,, +14,85099,,,,,,,,,,,,0.07653506100177765,,,,,, +14,85149,,,,,,,,,,,,0.07479986548423767,,,,,, +14,85199,,,,,,,,,,,,0.07986757159233093,,,,,, +14,85249,,,,,,,,,,,,0.08427636325359344,,,,,, +14,85299,,,,,,,,,,,,0.07572788745164871,,,,,, +14,85349,,,,,,,,,,,,0.07783602178096771,,,,,, +14,85399,,,,,,,,,,,,0.07843930274248123,,,,,, +14,85449,,,,,,,,,,,,0.07878164201974869,,,,,, +14,85499,,,,,,,,,,,,0.07228908687829971,,,,,, +14,85549,,,,,,,,,,,,0.07518567144870758,,,,,, +14,85599,,,,,,,,,,,,0.07827527821063995,,,,,, +14,85649,,,,,,,,,,,,0.07179689407348633,,,,,, +14,85699,,,,,,,,,,,,0.07719632983207703,,,,,, +14,85749,,,,,,,,,,,,0.07445970922708511,,,,,, +14,85799,,,,,,,,,,,,0.07160180062055588,,,,,, +14,85849,,,,,,,,,,,,0.07631723582744598,,,,,, +14,85899,,,,,,,,,,,,0.08757632225751877,,,,,, +14,85949,,,,,,,,,,,,0.081340491771698,,,,,, +14,85999,,,,,,,,,,,,0.07554790377616882,,,,,, +14,86039,,,,,,,,,,,,,0.24690070748329163,0.0840008333325386,0.13640160858631134,-0.019169211387634277,0.14434625208377838,0.0840008333325386 +14,86039,,,,,,,0.24082471430301666,0.07870800793170929,0.22148464620113373,0.04897916316986084,0.20905369520187378,,,,,,, +15,86049,,,,,,,,,,,,0.07409624755382538,,,,,, +15,86099,,,,,,,,,,,,0.07515310496091843,,,,,, +15,86149,,,,,,,,,,,,0.07577164471149445,,,,,, +15,86199,,,,,,,,,,,,0.07425706833600998,,,,,, +15,86249,,,,,,,,,,,,0.07145733386278152,,,,,, +15,86299,,,,,,,,,,,,0.08110364526510239,,,,,, +15,86349,,,,,,,,,,,,0.06979264318943024,,,,,, +15,86399,,,,,,,,,,,,0.06748339533805847,,,,,, +15,86449,,,,,,,,,,,,0.07007308304309845,,,,,, +15,86499,,,,,,,,,,,,0.07746152579784393,,,,,, +15,86549,,,,,,,,,,,,0.07917192578315735,,,,,, +15,86599,,,,,,,,,,,,0.07119344174861908,,,,,, +15,86649,,,,,,,,,,,,0.07486841827630997,,,,,, +15,86699,,,,,,,,,,,,0.07842730730772018,,,,,, +15,86749,,,,,,,,,,,,0.09013921767473221,,,,,, +15,86799,,,,,,,,,,,,0.0766599252820015,,,,,, +15,86849,,,,,,,,,,,,0.07559875398874283,,,,,, +15,86899,,,,,,,,,,,,0.07287140190601349,,,,,, +15,86949,,,,,,,,,,,,0.0754486471414566,,,,,, +15,86999,,,,,,,,,,,,0.0841570794582367,,,,,, +15,87049,,,,,,,,,,,,0.06826066225767136,,,,,, +15,87099,,,,,,,,,,,,0.07211022078990936,,,,,, +15,87149,,,,,,,,,,,,0.07723762094974518,,,,,, +15,87199,,,,,,,,,,,,0.06893140077590942,,,,,, +15,87249,,,,,,,,,,,,0.0720633938908577,,,,,, +15,87299,,,,,,,,,,,,0.09089533239603043,,,,,, +15,87349,,,,,,,,,,,,0.07183445990085602,,,,,, +15,87399,,,,,,,,,,,,0.06833425164222717,,,,,, +15,87449,,,,,,,,,,,,0.0888114795088768,,,,,, +15,87499,,,,,,,,,,,,0.07802842557430267,,,,,, +15,87549,,,,,,,,,,,,0.08397139608860016,,,,,, +15,87599,,,,,,,,,,,,0.06816528737545013,,,,,, +15,87649,,,,,,,,,,,,0.08452752977609634,,,,,, +15,87699,,,,,,,,,,,,0.06880208104848862,,,,,, +15,87749,,,,,,,,,,,,0.07059004157781601,,,,,, +15,87799,,,,,,,,,,,,0.0706244632601738,,,,,, +15,87849,,,,,,,,,,,,0.08012180030345917,,,,,, +15,87899,,,,,,,,,,,,0.0865928903222084,,,,,, +15,87949,,,,,,,,,,,,0.08385205268859863,,,,,, +15,87999,,,,,,,,,,,,0.07641923427581787,,,,,, +15,88049,,,,,,,,,,,,0.07707768678665161,,,,,, +15,88099,,,,,,,,,,,,0.08089731633663177,,,,,, +15,88149,,,,,,,,,,,,0.07477296888828278,,,,,, +15,88199,,,,,,,,,,,,0.08431315422058105,,,,,, +15,88249,,,,,,,,,,,,0.08222335577011108,,,,,, +15,88299,,,,,,,,,,,,0.11647967249155045,,,,,, +15,88349,,,,,,,,,,,,0.07785607129335403,,,,,, +15,88399,,,,,,,,,,,,0.0855751782655716,,,,,, +15,88449,,,,,,,,,,,,0.08607485145330429,,,,,, +15,88499,,,,,,,,,,,,0.07853641360998154,,,,,, +15,88549,,,,,,,,,,,,0.06904109567403793,,,,,, +15,88599,,,,,,,,,,,,0.0852789580821991,,,,,, +15,88649,,,,,,,,,,,,0.07698816061019897,,,,,, +15,88699,,,,,,,,,,,,0.08391464501619339,,,,,, +15,88749,,,,,,,,,,,,0.07987381517887115,,,,,, +15,88799,,,,,,,,,,,,0.07233607769012451,,,,,, +15,88849,,,,,,,,,,,,0.07094588130712509,,,,,, +15,88899,,,,,,,,,,,,0.08030349016189575,,,,,, +15,88949,,,,,,,,,,,,0.07403960824012756,,,,,, +15,88999,,,,,,,,,,,,0.08660557866096497,,,,,, +15,89049,,,,,,,,,,,,0.07368911057710648,,,,,, +15,89099,,,,,,,,,,,,0.08831136673688889,,,,,, +15,89149,,,,,,,,,,,,0.06828998029232025,,,,,, +15,89199,,,,,,,,,,,,0.08325418829917908,,,,,, +15,89249,,,,,,,,,,,,0.0736490935087204,,,,,, +15,89299,,,,,,,,,,,,0.0844101756811142,,,,,, +15,89349,,,,,,,,,,,,0.08012492954730988,,,,,, +15,89399,,,,,,,,,,,,0.08040299266576767,,,,,, +15,89449,,,,,,,,,,,,0.0724567174911499,,,,,, +15,89499,,,,,,,,,,,,0.0865432471036911,,,,,, +15,89549,,,,,,,,,,,,0.0745508223772049,,,,,, +15,89599,,,,,,,,,,,,0.06740029156208038,,,,,, +15,89649,,,,,,,,,,,,0.07449375838041306,,,,,, +15,89699,,,,,,,,,,,,0.08524659276008606,,,,,, +15,89749,,,,,,,,,,,,0.07822152972221375,,,,,, +15,89799,,,,,,,,,,,,0.07211099565029144,,,,,, +15,89849,,,,,,,,,,,,0.08107297122478485,,,,,, +15,89899,,,,,,,,,,,,0.08366814255714417,,,,,, +15,89949,,,,,,,,,,,,0.07915586978197098,,,,,, +15,89999,,,,,,,,,,,,0.08124104887247086,,,,,, +15,90049,,,,,,,,,,,,0.07585594058036804,,,,,, +15,90099,,,,,,,,,,,,0.07577104866504669,,,,,, +15,90149,,,,,,,,,,,,0.0795878916978836,,,,,, +15,90199,,,,,,,,,,,,0.08969304710626602,,,,,, +15,90249,,,,,,,,,,,,0.08178819715976715,,,,,, +15,90299,,,,,,,,,,,,0.06564608216285706,,,,,, +15,90349,,,,,,,,,,,,0.07971134781837463,,,,,, +15,90399,,,,,,,,,,,,0.08236140012741089,,,,,, +15,90449,,,,,,,,,,,,0.08254668116569519,,,,,, +15,90499,,,,,,,,,,,,0.08208923041820526,,,,,, +15,90549,,,,,,,,,,,,0.0752607062458992,,,,,, +15,90599,,,,,,,,,,,,0.0803578719496727,,,,,, +15,90649,,,,,,,,,,,,0.07483877241611481,,,,,, +15,90699,,,,,,,,,,,,0.07777479290962219,,,,,, +15,90749,,,,,,,,,,,,0.07905103266239166,,,,,, +15,90799,,,,,,,,,,,,0.08598605543375015,,,,,, +15,90849,,,,,,,,,,,,0.08877325057983398,,,,,, +15,90899,,,,,,,,,,,,0.07137200236320496,,,,,, +15,90949,,,,,,,,,,,,0.0808420181274414,,,,,, +15,90999,,,,,,,,,,,,0.07549874484539032,,,,,, +15,91049,,,,,,,,,,,,0.07925030589103699,,,,,, +15,91099,,,,,,,,,,,,0.08892783522605896,,,,,, +15,91149,,,,,,,,,,,,0.08917199820280075,,,,,, +15,91199,,,,,,,,,,,,0.07753872871398926,,,,,, +15,91249,,,,,,,,,,,,0.06634184718132019,,,,,, +15,91299,,,,,,,,,,,,0.0763222947716713,,,,,, +15,91349,,,,,,,,,,,,0.08951446413993835,,,,,, +15,91399,,,,,,,,,,,,0.08210354298353195,,,,,, +15,91449,,,,,,,,,,,,0.08440646529197693,,,,,, +15,91499,,,,,,,,,,,,0.0646791160106659,,,,,, +15,91549,,,,,,,,,,,,0.08915778994560242,,,,,, +15,91599,,,,,,,,,,,,0.07758612185716629,,,,,, +15,91649,,,,,,,,,,,,0.07488487660884857,,,,,, +15,91699,,,,,,,,,,,,0.08188218623399734,,,,,, +15,91749,,,,,,,,,,,,0.07910783588886261,,,,,, +15,91775,,,,,,,,,,,,,0.24684634804725647,0.08414817601442337,0.13365089893341064,-0.020956873893737793,0.13977989554405212,0.08414817601442337 +15,91775,,,,,,,0.2397502213716507,0.07816734164953232,0.23578064143657684,0.05553525686264038,0.22055931389331818,,,,,,, +16,91799,,,,,,,,,,,,0.07795225083827972,,,,,, +16,91849,,,,,,,,,,,,0.07868088781833649,,,,,, +16,91899,,,,,,,,,,,,0.07311481237411499,,,,,, +16,91949,,,,,,,,,,,,0.08560401201248169,,,,,, +16,91999,,,,,,,,,,,,0.08003994077444077,,,,,, +16,92049,,,,,,,,,,,,0.0903688594698906,,,,,, +16,92099,,,,,,,,,,,,0.07947281002998352,,,,,, +16,92149,,,,,,,,,,,,0.08119712769985199,,,,,, +16,92199,,,,,,,,,,,,0.06544743478298187,,,,,, +16,92249,,,,,,,,,,,,0.07784345746040344,,,,,, +16,92299,,,,,,,,,,,,0.08398160338401794,,,,,, +16,92349,,,,,,,,,,,,0.06758061051368713,,,,,, +16,92399,,,,,,,,,,,,0.066367506980896,,,,,, +16,92449,,,,,,,,,,,,0.0779549777507782,,,,,, +16,92499,,,,,,,,,,,,0.0814119428396225,,,,,, +16,92549,,,,,,,,,,,,0.07104243338108063,,,,,, +16,92599,,,,,,,,,,,,0.08292876929044724,,,,,, +16,92649,,,,,,,,,,,,0.07548202574253082,,,,,, +16,92699,,,,,,,,,,,,0.07910260558128357,,,,,, +16,92749,,,,,,,,,,,,0.08101727813482285,,,,,, +16,92799,,,,,,,,,,,,0.07106193900108337,,,,,, +16,92849,,,,,,,,,,,,0.0717148408293724,,,,,, +16,92899,,,,,,,,,,,,0.08469316363334656,,,,,, +16,92949,,,,,,,,,,,,0.07404603064060211,,,,,, +16,92999,,,,,,,,,,,,0.07544315606355667,,,,,, +16,93049,,,,,,,,,,,,0.07426882535219193,,,,,, +16,93099,,,,,,,,,,,,0.07710716128349304,,,,,, +16,93149,,,,,,,,,,,,0.0749586895108223,,,,,, +16,93199,,,,,,,,,,,,0.07649560272693634,,,,,, +16,93249,,,,,,,,,,,,0.0721946507692337,,,,,, +16,93299,,,,,,,,,,,,0.08231499046087265,,,,,, +16,93349,,,,,,,,,,,,0.0855143815279007,,,,,, +16,93399,,,,,,,,,,,,0.0861329585313797,,,,,, +16,93449,,,,,,,,,,,,0.060055945068597794,,,,,, +16,93499,,,,,,,,,,,,0.07243186235427856,,,,,, +16,93549,,,,,,,,,,,,0.08996298909187317,,,,,, +16,93599,,,,,,,,,,,,0.07323530316352844,,,,,, +16,93649,,,,,,,,,,,,0.07554777711629868,,,,,, +16,93699,,,,,,,,,,,,0.08147323876619339,,,,,, +16,93749,,,,,,,,,,,,0.07956607639789581,,,,,, +16,93799,,,,,,,,,,,,0.07409276068210602,,,,,, +16,93849,,,,,,,,,,,,0.0776090994477272,,,,,, +16,93899,,,,,,,,,,,,0.07917797565460205,,,,,, +16,93949,,,,,,,,,,,,0.08792245388031006,,,,,, +16,93999,,,,,,,,,,,,0.08236009627580643,,,,,, +16,94049,,,,,,,,,,,,0.08371520787477493,,,,,, +16,94099,,,,,,,,,,,,0.07981610298156738,,,,,, +16,94149,,,,,,,,,,,,0.06674642860889435,,,,,, +16,94199,,,,,,,,,,,,0.0693911537528038,,,,,, +16,94249,,,,,,,,,,,,0.07789602875709534,,,,,, +16,94299,,,,,,,,,,,,0.07800634205341339,,,,,, +16,94349,,,,,,,,,,,,0.08674903213977814,,,,,, +16,94399,,,,,,,,,,,,0.07632564008235931,,,,,, +16,94449,,,,,,,,,,,,0.08463340252637863,,,,,, +16,94499,,,,,,,,,,,,0.08570559322834015,,,,,, +16,94549,,,,,,,,,,,,0.06851810216903687,,,,,, +16,94599,,,,,,,,,,,,0.06035368889570236,,,,,, +16,94649,,,,,,,,,,,,0.07350833714008331,,,,,, +16,94699,,,,,,,,,,,,0.08690965175628662,,,,,, +16,94749,,,,,,,,,,,,0.08088222146034241,,,,,, +16,94799,,,,,,,,,,,,0.06887872517108917,,,,,, +16,94849,,,,,,,,,,,,0.06712735444307327,,,,,, +16,94899,,,,,,,,,,,,0.09537658095359802,,,,,, +16,94949,,,,,,,,,,,,0.07528652250766754,,,,,, +16,94999,,,,,,,,,,,,0.07028797268867493,,,,,, +16,95049,,,,,,,,,,,,0.07555744796991348,,,,,, +16,95099,,,,,,,,,,,,0.08362626284360886,,,,,, +16,95149,,,,,,,,,,,,0.07666757702827454,,,,,, +16,95199,,,,,,,,,,,,0.07831955701112747,,,,,, +16,95249,,,,,,,,,,,,0.07577124238014221,,,,,, +16,95299,,,,,,,,,,,,0.08004443347454071,,,,,, +16,95349,,,,,,,,,,,,0.06562536209821701,,,,,, +16,95399,,,,,,,,,,,,0.09212147444486618,,,,,, +16,95449,,,,,,,,,,,,0.0778668075799942,,,,,, +16,95499,,,,,,,,,,,,0.07951514422893524,,,,,, +16,95549,,,,,,,,,,,,0.07225136458873749,,,,,, +16,95599,,,,,,,,,,,,0.07761307060718536,,,,,, +16,95649,,,,,,,,,,,,0.08247734606266022,,,,,, +16,95699,,,,,,,,,,,,0.06879085302352905,,,,,, +16,95749,,,,,,,,,,,,0.07833912968635559,,,,,, +16,95799,,,,,,,,,,,,0.0653405636548996,,,,,, +16,95849,,,,,,,,,,,,0.0897802859544754,,,,,, +16,95899,,,,,,,,,,,,0.0812080055475235,,,,,, +16,95949,,,,,,,,,,,,0.07758678495883942,,,,,, +16,95999,,,,,,,,,,,,0.08329007029533386,,,,,, +16,96049,,,,,,,,,,,,0.07851289957761765,,,,,, +16,96099,,,,,,,,,,,,0.07456358522176743,,,,,, +16,96149,,,,,,,,,,,,0.06980279088020325,,,,,, +16,96199,,,,,,,,,,,,0.07557274401187897,,,,,, +16,96249,,,,,,,,,,,,0.07951827347278595,,,,,, +16,96299,,,,,,,,,,,,0.07741088420152664,,,,,, +16,96349,,,,,,,,,,,,0.08404113352298737,,,,,, +16,96399,,,,,,,,,,,,0.07981701195240021,,,,,, +16,96449,,,,,,,,,,,,0.08486588299274445,,,,,, +16,96499,,,,,,,,,,,,0.07309320569038391,,,,,, +16,96549,,,,,,,,,,,,0.06660864502191544,,,,,, +16,96599,,,,,,,,,,,,0.07857011258602142,,,,,, +16,96649,,,,,,,,,,,,0.08313938975334167,,,,,, +16,96699,,,,,,,,,,,,0.06748880445957184,,,,,, +16,96749,,,,,,,,,,,,0.07539540529251099,,,,,, +16,96799,,,,,,,,,,,,0.0796256810426712,,,,,, +16,96849,,,,,,,,,,,,0.07570986449718475,,,,,, +16,96899,,,,,,,,,,,,0.08964268118143082,,,,,, +16,96949,,,,,,,,,,,,0.07436470687389374,,,,,, +16,96999,,,,,,,,,,,,0.07956744730472565,,,,,, +16,97049,,,,,,,,,,,,0.07204637676477432,,,,,, +16,97099,,,,,,,,,,,,0.0759708508849144,,,,,, +16,97149,,,,,,,,,,,,0.0778651311993599,,,,,, +16,97199,,,,,,,,,,,,0.0714573860168457,,,,,, +16,97249,,,,,,,,,,,,0.07937872409820557,,,,,, +16,97299,,,,,,,,,,,,0.07670989632606506,,,,,, +16,97349,,,,,,,,,,,,0.07612666487693787,,,,,, +16,97399,,,,,,,,,,,,0.08961527794599533,,,,,, +16,97449,,,,,,,,,,,,0.08232604712247849,,,,,, +16,97499,,,,,,,,,,,,0.07388895750045776,,,,,, +16,97511,,,,,,,,,,,,,0.24626712501049042,0.08366372436285019,0.1419678032398224,-0.015079140663146973,0.15644603967666626,0.08366372436285019 +16,97511,,,,,,,0.2394265979528427,0.07797981053590775,0.24048775434494019,0.057772040367126465,0.22411151230335236,,,,,,, +17,97549,,,,,,,,,,,,0.07944772392511368,,,,,, +17,97599,,,,,,,,,,,,0.07110783457756042,,,,,, +17,97649,,,,,,,,,,,,0.08783751726150513,,,,,, +17,97699,,,,,,,,,,,,0.08399049937725067,,,,,, +17,97749,,,,,,,,,,,,0.08455707877874374,,,,,, +17,97799,,,,,,,,,,,,0.07178203761577606,,,,,, +17,97849,,,,,,,,,,,,0.07564064860343933,,,,,, +17,97899,,,,,,,,,,,,0.07689248025417328,,,,,, +17,97949,,,,,,,,,,,,0.07423655688762665,,,,,, +17,97999,,,,,,,,,,,,0.07609537243843079,,,,,, +17,98049,,,,,,,,,,,,0.08838589489459991,,,,,, +17,98099,,,,,,,,,,,,0.08503174781799316,,,,,, +17,98149,,,,,,,,,,,,0.07526308298110962,,,,,, +17,98199,,,,,,,,,,,,0.07834771275520325,,,,,, +17,98249,,,,,,,,,,,,0.08531659841537476,,,,,, +17,98299,,,,,,,,,,,,0.07913786172866821,,,,,, +17,98349,,,,,,,,,,,,0.09495855867862701,,,,,, +17,98399,,,,,,,,,,,,0.07579514384269714,,,,,, +17,98449,,,,,,,,,,,,0.08538741618394852,,,,,, +17,98499,,,,,,,,,,,,0.06770820915699005,,,,,, +17,98549,,,,,,,,,,,,0.07005137205123901,,,,,, +17,98599,,,,,,,,,,,,0.07432638108730316,,,,,, +17,98649,,,,,,,,,,,,0.07947734743356705,,,,,, +17,98699,,,,,,,,,,,,0.07349853962659836,,,,,, +17,98749,,,,,,,,,,,,0.08472754061222076,,,,,, +17,98799,,,,,,,,,,,,0.07613161206245422,,,,,, +17,98849,,,,,,,,,,,,0.0751839131116867,,,,,, +17,98899,,,,,,,,,,,,0.077989861369133,,,,,, +17,98949,,,,,,,,,,,,0.07524117827415466,,,,,, +17,98999,,,,,,,,,,,,0.07590082287788391,,,,,, +17,99049,,,,,,,,,,,,0.08813831210136414,,,,,, +17,99099,,,,,,,,,,,,0.0820893868803978,,,,,, +17,99149,,,,,,,,,,,,0.06552533805370331,,,,,, +17,99199,,,,,,,,,,,,0.07064404338598251,,,,,, +17,99249,,,,,,,,,,,,0.07170420140028,,,,,, +17,99299,,,,,,,,,,,,0.08845245093107224,,,,,, +17,99349,,,,,,,,,,,,0.06648989021778107,,,,,, +17,99399,,,,,,,,,,,,0.07473286986351013,,,,,, +17,99449,,,,,,,,,,,,0.08757564425468445,,,,,, +17,99499,,,,,,,,,,,,0.07826261967420578,,,,,, +17,99549,,,,,,,,,,,,0.0822371244430542,,,,,, +17,99599,,,,,,,,,,,,0.07305237650871277,,,,,, +17,99649,,,,,,,,,,,,0.07002122700214386,,,,,, +17,99699,,,,,,,,,,,,0.0788671001791954,,,,,, +17,99749,,,,,,,,,,,,0.08755442500114441,,,,,, +17,99799,,,,,,,,,,,,0.07830598950386047,,,,,, +17,99849,,,,,,,,,,,,0.08468788862228394,,,,,, +17,99899,,,,,,,,,,,,0.07375713437795639,,,,,, +17,99949,,,,,,,,,,,,0.07152076810598373,,,,,, +17,99999,,,,,,,,,,,,0.07433991134166718,,,,,, +17,100049,,,,,,,,,,,,0.08019326627254486,,,,,, +17,100099,,,,,,,,,,,,0.07766199111938477,,,,,, +17,100149,,,,,,,,,,,,0.06795880943536758,,,,,, +17,100199,,,,,,,,,,,,0.0738031417131424,,,,,, +17,100249,,,,,,,,,,,,0.06816389411687851,,,,,, +17,100299,,,,,,,,,,,,0.07796958088874817,,,,,, +17,100349,,,,,,,,,,,,0.07387533783912659,,,,,, +17,100399,,,,,,,,,,,,0.08780919015407562,,,,,, +17,100449,,,,,,,,,,,,0.09064283967018127,,,,,, +17,100499,,,,,,,,,,,,0.06706981360912323,,,,,, +17,100549,,,,,,,,,,,,0.08060305565595627,,,,,, +17,100599,,,,,,,,,,,,0.08140669018030167,,,,,, +17,100649,,,,,,,,,,,,0.07180224359035492,,,,,, +17,100699,,,,,,,,,,,,0.09152133762836456,,,,,, +17,100749,,,,,,,,,,,,0.06914937496185303,,,,,, +17,100799,,,,,,,,,,,,0.07854188978672028,,,,,, +17,100849,,,,,,,,,,,,0.08657289296388626,,,,,, +17,100899,,,,,,,,,,,,0.0675775408744812,,,,,, +17,100949,,,,,,,,,,,,0.07167379558086395,,,,,, +17,100999,,,,,,,,,,,,0.09217947721481323,,,,,, +17,101049,,,,,,,,,,,,0.07213251292705536,,,,,, +17,101099,,,,,,,,,,,,0.07196018844842911,,,,,, +17,101149,,,,,,,,,,,,0.08372403681278229,,,,,, +17,101199,,,,,,,,,,,,0.07399439066648483,,,,,, +17,101249,,,,,,,,,,,,0.08230170607566833,,,,,, +17,101299,,,,,,,,,,,,0.08039912581443787,,,,,, +17,101349,,,,,,,,,,,,0.08766254782676697,,,,,, +17,101399,,,,,,,,,,,,0.08425647765398026,,,,,, +17,101449,,,,,,,,,,,,0.07769414037466049,,,,,, +17,101499,,,,,,,,,,,,0.07762258499860764,,,,,, +17,101549,,,,,,,,,,,,0.08487355709075928,,,,,, +17,101599,,,,,,,,,,,,0.07620087265968323,,,,,, +17,101649,,,,,,,,,,,,0.06056099757552147,,,,,, +17,101699,,,,,,,,,,,,0.07599502801895142,,,,,, +17,101749,,,,,,,,,,,,0.07493993639945984,,,,,, +17,101799,,,,,,,,,,,,0.06560811400413513,,,,,, +17,101849,,,,,,,,,,,,0.09085279703140259,,,,,, +17,101899,,,,,,,,,,,,0.07708387076854706,,,,,, +17,101949,,,,,,,,,,,,0.06707131862640381,,,,,, +17,101999,,,,,,,,,,,,0.07347823679447174,,,,,, +17,102049,,,,,,,,,,,,0.06967295706272125,,,,,, +17,102099,,,,,,,,,,,,0.075923852622509,,,,,, +17,102149,,,,,,,,,,,,0.07028569281101227,,,,,, +17,102199,,,,,,,,,,,,0.07661731541156769,,,,,, +17,102249,,,,,,,,,,,,0.0705125480890274,,,,,, +17,102299,,,,,,,,,,,,0.09219492971897125,,,,,, +17,102349,,,,,,,,,,,,0.06538715958595276,,,,,, +17,102399,,,,,,,,,,,,0.06581837683916092,,,,,, +17,102449,,,,,,,,,,,,0.07682058215141296,,,,,, +17,102499,,,,,,,,,,,,0.07950983196496964,,,,,, +17,102549,,,,,,,,,,,,0.07329607009887695,,,,,, +17,102599,,,,,,,,,,,,0.08257339894771576,,,,,, +17,102649,,,,,,,,,,,,0.06005662679672241,,,,,, +17,102699,,,,,,,,,,,,0.07690945267677307,,,,,, +17,102749,,,,,,,,,,,,0.08605177700519562,,,,,, +17,102799,,,,,,,,,,,,0.07570399343967438,,,,,, +17,102849,,,,,,,,,,,,0.07469046860933304,,,,,, +17,102899,,,,,,,,,,,,0.07802309095859528,,,,,, +17,102949,,,,,,,,,,,,0.0757208913564682,,,,,, +17,102999,,,,,,,,,,,,0.07661792635917664,,,,,, +17,103049,,,,,,,,,,,,0.07238350063562393,,,,,, +17,103099,,,,,,,,,,,,0.08038298040628433,,,,,, +17,103149,,,,,,,,,,,,0.075452521443367,,,,,, +17,103199,,,,,,,,,,,,0.07103309035301208,,,,,, +17,103247,,,,,,,,,,,,,0.24549484252929688,0.08327409625053406,0.15704400837421417,-0.010351896286010742,0.16319264471530914,0.08327409625053406 +17,103247,,,,,,,0.2390458881855011,0.07780591398477554,0.2448214441537857,0.059892117977142334,0.22798298299312592,,,,,,, +18,103249,,,,,,,,,,,,0.07899894565343857,,,,,, +18,103299,,,,,,,,,,,,0.07523119449615479,,,,,, +18,103349,,,,,,,,,,,,0.07159273326396942,,,,,, +18,103399,,,,,,,,,,,,0.07124093174934387,,,,,, +18,103449,,,,,,,,,,,,0.07538051158189774,,,,,, +18,103499,,,,,,,,,,,,0.07534727454185486,,,,,, +18,103549,,,,,,,,,,,,0.08148866891860962,,,,,, +18,103599,,,,,,,,,,,,0.06942417472600937,,,,,, +18,103649,,,,,,,,,,,,0.08471350371837616,,,,,, +18,103699,,,,,,,,,,,,0.08042746037244797,,,,,, +18,103749,,,,,,,,,,,,0.06851515173912048,,,,,, +18,103799,,,,,,,,,,,,0.07521160691976547,,,,,, +18,103849,,,,,,,,,,,,0.07901959866285324,,,,,, +18,103899,,,,,,,,,,,,0.08308205008506775,,,,,, +18,103949,,,,,,,,,,,,0.07625734061002731,,,,,, +18,103999,,,,,,,,,,,,0.0762874186038971,,,,,, +18,104049,,,,,,,,,,,,0.0781535729765892,,,,,, +18,104099,,,,,,,,,,,,0.07093167304992676,,,,,, +18,104149,,,,,,,,,,,,0.08373768627643585,,,,,, +18,104199,,,,,,,,,,,,0.07976476848125458,,,,,, +18,104249,,,,,,,,,,,,0.06718343496322632,,,,,, +18,104299,,,,,,,,,,,,0.07854151725769043,,,,,, +18,104349,,,,,,,,,,,,0.06627252697944641,,,,,, +18,104399,,,,,,,,,,,,0.41509130597114563,,,,,, +18,104449,,,,,,,,,,,,0.07446849346160889,,,,,, +18,104499,,,,,,,,,,,,0.06799405813217163,,,,,, +18,104549,,,,,,,,,,,,0.08272336423397064,,,,,, +18,104599,,,,,,,,,,,,0.07505965977907181,,,,,, +18,104649,,,,,,,,,,,,0.07897891104221344,,,,,, +18,104699,,,,,,,,,,,,0.08582504093647003,,,,,, +18,104749,,,,,,,,,,,,0.0722443163394928,,,,,, +18,104799,,,,,,,,,,,,0.06741572916507721,,,,,, +18,104849,,,,,,,,,,,,0.08008488267660141,,,,,, +18,104899,,,,,,,,,,,,0.08444063365459442,,,,,, +18,104949,,,,,,,,,,,,0.08806271851062775,,,,,, +18,104999,,,,,,,,,,,,0.07915382087230682,,,,,, +18,105049,,,,,,,,,,,,0.06908897310495377,,,,,, +18,105099,,,,,,,,,,,,0.08315417170524597,,,,,, +18,105149,,,,,,,,,,,,0.07954798638820648,,,,,, +18,105199,,,,,,,,,,,,0.08623021841049194,,,,,, +18,105249,,,,,,,,,,,,0.07385589927434921,,,,,, +18,105299,,,,,,,,,,,,0.38263264298439026,,,,,, +18,105349,,,,,,,,,,,,0.0655689537525177,,,,,, +18,105399,,,,,,,,,,,,0.08097967505455017,,,,,, +18,105449,,,,,,,,,,,,0.08462029695510864,,,,,, +18,105499,,,,,,,,,,,,0.07092776894569397,,,,,, +18,105549,,,,,,,,,,,,0.08199239522218704,,,,,, +18,105599,,,,,,,,,,,,0.07793288677930832,,,,,, +18,105649,,,,,,,,,,,,0.0742712914943695,,,,,, +18,105699,,,,,,,,,,,,0.08117185533046722,,,,,, +18,105749,,,,,,,,,,,,0.08437909930944443,,,,,, +18,105799,,,,,,,,,,,,0.06937418133020401,,,,,, +18,105849,,,,,,,,,,,,0.08925130218267441,,,,,, +18,105899,,,,,,,,,,,,0.06340958178043365,,,,,, +18,105949,,,,,,,,,,,,0.07265739142894745,,,,,, +18,105999,,,,,,,,,,,,0.07174557447433472,,,,,, +18,106049,,,,,,,,,,,,0.07884658873081207,,,,,, +18,106099,,,,,,,,,,,,0.08206204324960709,,,,,, +18,106149,,,,,,,,,,,,0.08546723425388336,,,,,, +18,106199,,,,,,,,,,,,0.0808175653219223,,,,,, +18,106249,,,,,,,,,,,,0.06860743463039398,,,,,, +18,106299,,,,,,,,,,,,0.06775462627410889,,,,,, +18,106349,,,,,,,,,,,,0.08895224332809448,,,,,, +18,106399,,,,,,,,,,,,0.06867591291666031,,,,,, +18,106449,,,,,,,,,,,,0.08130441606044769,,,,,, +18,106499,,,,,,,,,,,,0.08495987951755524,,,,,, +18,106549,,,,,,,,,,,,0.0736035630106926,,,,,, +18,106599,,,,,,,,,,,,0.07540926337242126,,,,,, +18,106649,,,,,,,,,,,,0.08478212356567383,,,,,, +18,106699,,,,,,,,,,,,0.06126292049884796,,,,,, +18,106749,,,,,,,,,,,,0.07933901995420456,,,,,, +18,106799,,,,,,,,,,,,0.08211018145084381,,,,,, +18,106849,,,,,,,,,,,,0.07925675809383392,,,,,, +18,106899,,,,,,,,,,,,0.07696200907230377,,,,,, +18,106949,,,,,,,,,,,,0.07777208089828491,,,,,, +18,106999,,,,,,,,,,,,0.07505795359611511,,,,,, +18,107049,,,,,,,,,,,,0.08770930767059326,,,,,, +18,107099,,,,,,,,,,,,0.08338837325572968,,,,,, +18,107149,,,,,,,,,,,,0.0784168690443039,,,,,, +18,107199,,,,,,,,,,,,0.07538622617721558,,,,,, +18,107249,,,,,,,,,,,,0.07551628351211548,,,,,, +18,107299,,,,,,,,,,,,0.07966090738773346,,,,,, +18,107349,,,,,,,,,,,,0.08321983367204666,,,,,, +18,107399,,,,,,,,,,,,0.08384540677070618,,,,,, +18,107449,,,,,,,,,,,,0.06854903697967529,,,,,, +18,107499,,,,,,,,,,,,0.07529745995998383,,,,,, +18,107549,,,,,,,,,,,,0.07683371007442474,,,,,, +18,107599,,,,,,,,,,,,0.06004370376467705,,,,,, +18,107649,,,,,,,,,,,,0.08334620296955109,,,,,, +18,107699,,,,,,,,,,,,0.06965833902359009,,,,,, +18,107749,,,,,,,,,,,,0.07171447575092316,,,,,, +18,107799,,,,,,,,,,,,0.07138283550739288,,,,,, +18,107849,,,,,,,,,,,,0.06762135028839111,,,,,, +18,107899,,,,,,,,,,,,0.07881148159503937,,,,,, +18,107949,,,,,,,,,,,,0.08198700845241547,,,,,, +18,107999,,,,,,,,,,,,0.08621729165315628,,,,,, +18,108049,,,,,,,,,,,,0.06980341672897339,,,,,, +18,108099,,,,,,,,,,,,0.07292040437459946,,,,,, +18,108149,,,,,,,,,,,,0.0773840844631195,,,,,, +18,108199,,,,,,,,,,,,0.07654121518135071,,,,,, +18,108249,,,,,,,,,,,,0.07323402911424637,,,,,, +18,108299,,,,,,,,,,,,0.07800166308879852,,,,,, +18,108349,,,,,,,,,,,,0.08149328082799911,,,,,, +18,108399,,,,,,,,,,,,0.0774398148059845,,,,,, +18,108449,,,,,,,,,,,,0.06747590005397797,,,,,, +18,108499,,,,,,,,,,,,0.0685502141714096,,,,,, +18,108549,,,,,,,,,,,,0.0796196460723877,,,,,, +18,108599,,,,,,,,,,,,0.07313679903745651,,,,,, +18,108649,,,,,,,,,,,,0.08113007247447968,,,,,, +18,108699,,,,,,,,,,,,0.10093899071216583,,,,,, +18,108749,,,,,,,,,,,,0.08345609903335571,,,,,, +18,108799,,,,,,,,,,,,0.07416141778230667,,,,,, +18,108849,,,,,,,,,,,,0.07762623578310013,,,,,, +18,108899,,,,,,,,,,,,0.07047344744205475,,,,,, +18,108949,,,,,,,,,,,,0.08585181087255478,,,,,, +18,108983,,,,,,,,,,,,,0.24608327448368073,0.08280113339424133,0.1369432657957077,-0.004613518714904785,0.15206673741340637,0.08280113339424133 +18,108983,,,,,,,0.23918747901916504,0.07794136554002762,0.2416331022977829,0.05824989080429077,0.22660014033317566,,,,,,, +19,108999,,,,,,,,,,,,0.09300188720226288,,,,,, +19,109049,,,,,,,,,,,,0.07430632412433624,,,,,, +19,109099,,,,,,,,,,,,0.0657656341791153,,,,,, +19,109149,,,,,,,,,,,,0.07775987684726715,,,,,, +19,109199,,,,,,,,,,,,0.08630400896072388,,,,,, +19,109249,,,,,,,,,,,,0.07508818060159683,,,,,, +19,109299,,,,,,,,,,,,0.07919338345527649,,,,,, +19,109349,,,,,,,,,,,,0.07541971653699875,,,,,, +19,109399,,,,,,,,,,,,0.09174095094203949,,,,,, +19,109449,,,,,,,,,,,,0.08692777156829834,,,,,, +19,109499,,,,,,,,,,,,0.07071833312511444,,,,,, +19,109549,,,,,,,,,,,,0.0722595602273941,,,,,, +19,109599,,,,,,,,,,,,0.06483045220375061,,,,,, +19,109649,,,,,,,,,,,,0.08194439113140106,,,,,, +19,109699,,,,,,,,,,,,0.07461497187614441,,,,,, +19,109749,,,,,,,,,,,,0.07312774658203125,,,,,, +19,109799,,,,,,,,,,,,0.08587966859340668,,,,,, +19,109849,,,,,,,,,,,,0.06342875957489014,,,,,, +19,109899,,,,,,,,,,,,0.08507224917411804,,,,,, +19,109949,,,,,,,,,,,,0.07156491279602051,,,,,, +19,109999,,,,,,,,,,,,0.08138839155435562,,,,,, +19,110049,,,,,,,,,,,,0.09234128147363663,,,,,, +19,110099,,,,,,,,,,,,0.07161645591259003,,,,,, +19,110149,,,,,,,,,,,,0.08094119280576706,,,,,, +19,110199,,,,,,,,,,,,0.07334282994270325,,,,,, +19,110249,,,,,,,,,,,,0.0807962715625763,,,,,, +19,110299,,,,,,,,,,,,0.08320845663547516,,,,,, +19,110349,,,,,,,,,,,,0.09041085839271545,,,,,, +19,110399,,,,,,,,,,,,0.07127375900745392,,,,,, +19,110449,,,,,,,,,,,,0.07816284149885178,,,,,, +19,110499,,,,,,,,,,,,0.08577236533164978,,,,,, +19,110549,,,,,,,,,,,,0.07630468904972076,,,,,, +19,110599,,,,,,,,,,,,0.07935839891433716,,,,,, +19,110649,,,,,,,,,,,,0.07958845049142838,,,,,, +19,110699,,,,,,,,,,,,0.08245198428630829,,,,,, +19,110749,,,,,,,,,,,,0.06512460112571716,,,,,, +19,110799,,,,,,,,,,,,0.0798819437623024,,,,,, +19,110849,,,,,,,,,,,,0.07650765031576157,,,,,, +19,110899,,,,,,,,,,,,0.07515175640583038,,,,,, +19,110949,,,,,,,,,,,,0.07917614281177521,,,,,, +19,110999,,,,,,,,,,,,0.07323624938726425,,,,,, +19,111049,,,,,,,,,,,,0.0782337635755539,,,,,, +19,111099,,,,,,,,,,,,0.0593038871884346,,,,,, +19,111149,,,,,,,,,,,,0.07181086391210556,,,,,, +19,111199,,,,,,,,,,,,0.07713674008846283,,,,,, +19,111249,,,,,,,,,,,,0.07848431915044785,,,,,, +19,111299,,,,,,,,,,,,0.07325181365013123,,,,,, +19,111349,,,,,,,,,,,,0.08177666366100311,,,,,, +19,111399,,,,,,,,,,,,0.08444255590438843,,,,,, +19,111449,,,,,,,,,,,,0.07599323987960815,,,,,, +19,111499,,,,,,,,,,,,0.08387748897075653,,,,,, +19,111549,,,,,,,,,,,,0.07504347711801529,,,,,, +19,111599,,,,,,,,,,,,0.0679628998041153,,,,,, +19,111649,,,,,,,,,,,,0.07077359408140182,,,,,, +19,111699,,,,,,,,,,,,0.07010597735643387,,,,,, +19,111749,,,,,,,,,,,,0.08154329657554626,,,,,, +19,111799,,,,,,,,,,,,0.0840005874633789,,,,,, +19,111849,,,,,,,,,,,,0.07099102437496185,,,,,, +19,111899,,,,,,,,,,,,0.06424450874328613,,,,,, +19,111949,,,,,,,,,,,,0.07212288677692413,,,,,, +19,111999,,,,,,,,,,,,0.07340264320373535,,,,,, +19,112049,,,,,,,,,,,,0.07612395286560059,,,,,, +19,112099,,,,,,,,,,,,0.0748162716627121,,,,,, +19,112149,,,,,,,,,,,,0.0747264102101326,,,,,, +19,112199,,,,,,,,,,,,0.07472217082977295,,,,,, +19,112249,,,,,,,,,,,,0.0796930193901062,,,,,, +19,112299,,,,,,,,,,,,0.07392516732215881,,,,,, +19,112349,,,,,,,,,,,,0.08348074555397034,,,,,, +19,112399,,,,,,,,,,,,0.08149465918540955,,,,,, +19,112449,,,,,,,,,,,,0.07756073027849197,,,,,, +19,112499,,,,,,,,,,,,0.08112397789955139,,,,,, +19,112549,,,,,,,,,,,,0.06932349503040314,,,,,, +19,112599,,,,,,,,,,,,0.07168431580066681,,,,,, +19,112649,,,,,,,,,,,,0.06651636213064194,,,,,, +19,112699,,,,,,,,,,,,0.07124824821949005,,,,,, +19,112749,,,,,,,,,,,,0.08395090699195862,,,,,, +19,112799,,,,,,,,,,,,0.0849180668592453,,,,,, +19,112849,,,,,,,,,,,,0.08151599764823914,,,,,, +19,112899,,,,,,,,,,,,0.08543411642313004,,,,,, +19,112949,,,,,,,,,,,,0.06752417981624603,,,,,, +19,112999,,,,,,,,,,,,0.08277879655361176,,,,,, +19,113049,,,,,,,,,,,,0.07995698601007462,,,,,, +19,113099,,,,,,,,,,,,0.07727004587650299,,,,,, +19,113149,,,,,,,,,,,,0.0914628729224205,,,,,, +19,113199,,,,,,,,,,,,0.07593783736228943,,,,,, +19,113249,,,,,,,,,,,,0.08275751769542694,,,,,, +19,113299,,,,,,,,,,,,0.08174905925989151,,,,,, +19,113349,,,,,,,,,,,,0.07295330613851547,,,,,, +19,113399,,,,,,,,,,,,0.07453103363513947,,,,,, +19,113449,,,,,,,,,,,,0.0644775778055191,,,,,, +19,113499,,,,,,,,,,,,0.07422418147325516,,,,,, +19,113549,,,,,,,,,,,,0.07309422641992569,,,,,, +19,113599,,,,,,,,,,,,0.08341729640960693,,,,,, +19,113649,,,,,,,,,,,,0.07455470412969589,,,,,, +19,113699,,,,,,,,,,,,0.0750516802072525,,,,,, +19,113749,,,,,,,,,,,,0.08173255622386932,,,,,, +19,113799,,,,,,,,,,,,0.06763548403978348,,,,,, +19,113849,,,,,,,,,,,,0.07381699234247208,,,,,, +19,113899,,,,,,,,,,,,0.0699801817536354,,,,,, +19,113949,,,,,,,,,,,,0.08956559002399445,,,,,, +19,113999,,,,,,,,,,,,0.07909812778234482,,,,,, +19,114049,,,,,,,,,,,,0.08135279268026352,,,,,, +19,114099,,,,,,,,,,,,0.07919725775718689,,,,,, +19,114149,,,,,,,,,,,,0.08143825829029083,,,,,, +19,114199,,,,,,,,,,,,0.08212034404277802,,,,,, +19,114249,,,,,,,,,,,,0.07656155526638031,,,,,, +19,114299,,,,,,,,,,,,0.07213032245635986,,,,,, +19,114349,,,,,,,,,,,,0.08569499850273132,,,,,, +19,114399,,,,,,,,,,,,0.06156984344124794,,,,,, +19,114449,,,,,,,,,,,,0.07201507687568665,,,,,, +19,114499,,,,,,,,,,,,0.08726252615451813,,,,,, +19,114549,,,,,,,,,,,,0.05850288271903992,,,,,, +19,114599,,,,,,,,,,,,0.0715203806757927,,,,,, +19,114649,,,,,,,,,,,,0.07561542093753815,,,,,, +19,114699,,,,,,,,,,,,0.07928255200386047,,,,,, +19,114719,,,,,,,,,,,,,0.2463303655385971,0.08264393359422684,0.12590070068836212,-0.002706170082092285,0.13041353225708008,0.08264393359422684 +19,114719,,,,,,,0.23876214027404785,0.07763471454381943,0.24901294708251953,0.061949312686920166,0.23186540603637695,,,,,,, +20,114749,,,,,,,,,,,,0.07251061499118805,,,,,, +20,114799,,,,,,,,,,,,0.074336476624012,,,,,, +20,114849,,,,,,,,,,,,0.07527008652687073,,,,,, +20,114899,,,,,,,,,,,,0.06060245633125305,,,,,, +20,114949,,,,,,,,,,,,0.0881829559803009,,,,,, +20,114999,,,,,,,,,,,,0.07572159171104431,,,,,, +20,115049,,,,,,,,,,,,0.0904332771897316,,,,,, +20,115099,,,,,,,,,,,,0.07603146880865097,,,,,, +20,115149,,,,,,,,,,,,0.08711040019989014,,,,,, +20,115199,,,,,,,,,,,,0.08013871312141418,,,,,, +20,115249,,,,,,,,,,,,0.07398994266986847,,,,,, +20,115299,,,,,,,,,,,,0.07467348873615265,,,,,, +20,115349,,,,,,,,,,,,0.07762773334980011,,,,,, +20,115399,,,,,,,,,,,,0.082970529794693,,,,,, +20,115449,,,,,,,,,,,,0.07545118033885956,,,,,, +20,115499,,,,,,,,,,,,0.07768098264932632,,,,,, +20,115549,,,,,,,,,,,,0.08588128536939621,,,,,, +20,115599,,,,,,,,,,,,0.07464133203029633,,,,,, +20,115649,,,,,,,,,,,,0.09171292185783386,,,,,, +20,115699,,,,,,,,,,,,0.07773983478546143,,,,,, +20,115749,,,,,,,,,,,,0.07767690718173981,,,,,, +20,115799,,,,,,,,,,,,0.07488186657428741,,,,,, +20,115849,,,,,,,,,,,,0.07253453135490417,,,,,, +20,115899,,,,,,,,,,,,0.07939788699150085,,,,,, +20,115949,,,,,,,,,,,,0.08575324714183807,,,,,, +20,115999,,,,,,,,,,,,0.07807157933712006,,,,,, +20,116049,,,,,,,,,,,,0.07095959782600403,,,,,, +20,116099,,,,,,,,,,,,0.06506414711475372,,,,,, +20,116149,,,,,,,,,,,,0.07118551433086395,,,,,, +20,116199,,,,,,,,,,,,0.08270899206399918,,,,,, +20,116249,,,,,,,,,,,,0.0771295428276062,,,,,, +20,116299,,,,,,,,,,,,0.07681821286678314,,,,,, +20,116349,,,,,,,,,,,,0.07081544399261475,,,,,, +20,116399,,,,,,,,,,,,0.07310830056667328,,,,,, +20,116449,,,,,,,,,,,,0.08105520904064178,,,,,, +20,116499,,,,,,,,,,,,0.08079765737056732,,,,,, +20,116549,,,,,,,,,,,,0.08526057004928589,,,,,, +20,116599,,,,,,,,,,,,0.07563568651676178,,,,,, +20,116649,,,,,,,,,,,,0.08898138254880905,,,,,, +20,116699,,,,,,,,,,,,0.08003220707178116,,,,,, +20,116749,,,,,,,,,,,,0.0825253576040268,,,,,, +20,116799,,,,,,,,,,,,0.0735568180680275,,,,,, +20,116849,,,,,,,,,,,,0.08824354410171509,,,,,, +20,116899,,,,,,,,,,,,0.08800023794174194,,,,,, +20,116949,,,,,,,,,,,,0.06968466192483902,,,,,, +20,116999,,,,,,,,,,,,0.07017099857330322,,,,,, +20,117049,,,,,,,,,,,,0.07034848630428314,,,,,, +20,117099,,,,,,,,,,,,0.07917716354131699,,,,,, +20,117149,,,,,,,,,,,,0.07628235220909119,,,,,, +20,117199,,,,,,,,,,,,0.06634309887886047,,,,,, +20,117249,,,,,,,,,,,,0.08060634881258011,,,,,, +20,117299,,,,,,,,,,,,0.06875142455101013,,,,,, +20,117349,,,,,,,,,,,,0.0776352733373642,,,,,, +20,117399,,,,,,,,,,,,0.0724605917930603,,,,,, +20,117449,,,,,,,,,,,,0.07488958537578583,,,,,, +20,117499,,,,,,,,,,,,0.08730893582105637,,,,,, +20,117549,,,,,,,,,,,,0.08004105091094971,,,,,, +20,117599,,,,,,,,,,,,0.08019766211509705,,,,,, +20,117649,,,,,,,,,,,,0.07276150584220886,,,,,, +20,117699,,,,,,,,,,,,0.07868104428052902,,,,,, +20,117749,,,,,,,,,,,,0.07851329445838928,,,,,, +20,117799,,,,,,,,,,,,0.07248952239751816,,,,,, +20,117849,,,,,,,,,,,,0.07257821410894394,,,,,, +20,117899,,,,,,,,,,,,0.07902933657169342,,,,,, +20,117949,,,,,,,,,,,,0.07579267770051956,,,,,, +20,117999,,,,,,,,,,,,0.07350566983222961,,,,,, +20,118049,,,,,,,,,,,,0.08453302085399628,,,,,, +20,118099,,,,,,,,,,,,0.07512223720550537,,,,,, +20,118149,,,,,,,,,,,,0.07406724989414215,,,,,, +20,118199,,,,,,,,,,,,0.0717441514134407,,,,,, +20,118249,,,,,,,,,,,,0.08824363350868225,,,,,, +20,118299,,,,,,,,,,,,0.07855512946844101,,,,,, +20,118349,,,,,,,,,,,,0.06865480542182922,,,,,, +20,118399,,,,,,,,,,,,0.0761166661977768,,,,,, +20,118449,,,,,,,,,,,,0.07731364667415619,,,,,, +20,118499,,,,,,,,,,,,0.07214315980672836,,,,,, +20,118549,,,,,,,,,,,,0.07134018838405609,,,,,, +20,118599,,,,,,,,,,,,0.08022403717041016,,,,,, +20,118649,,,,,,,,,,,,0.07220438867807388,,,,,, +20,118699,,,,,,,,,,,,0.0951278954744339,,,,,, +20,118749,,,,,,,,,,,,0.08757204562425613,,,,,, +20,118799,,,,,,,,,,,,0.08103208243846893,,,,,, +20,118849,,,,,,,,,,,,0.07477983087301254,,,,,, +20,118899,,,,,,,,,,,,0.07303671538829803,,,,,, +20,118949,,,,,,,,,,,,0.07330295443534851,,,,,, +20,118999,,,,,,,,,,,,0.0693468376994133,,,,,, +20,119049,,,,,,,,,,,,0.06284455955028534,,,,,, +20,119099,,,,,,,,,,,,0.07246698439121246,,,,,, +20,119149,,,,,,,,,,,,0.06850941479206085,,,,,, +20,119199,,,,,,,,,,,,0.06250220537185669,,,,,, +20,119249,,,,,,,,,,,,0.06785574555397034,,,,,, +20,119299,,,,,,,,,,,,0.07357116043567657,,,,,, +20,119349,,,,,,,,,,,,0.06901983916759491,,,,,, +20,119399,,,,,,,,,,,,0.08108064532279968,,,,,, +20,119449,,,,,,,,,,,,0.0801507830619812,,,,,, +20,119499,,,,,,,,,,,,0.0856008529663086,,,,,, +20,119549,,,,,,,,,,,,0.09070418030023575,,,,,, +20,119599,,,,,,,,,,,,0.08418111503124237,,,,,, +20,119649,,,,,,,,,,,,0.0780395120382309,,,,,, +20,119699,,,,,,,,,,,,0.07487115263938904,,,,,, +20,119749,,,,,,,,,,,,0.0822090357542038,,,,,, +20,119799,,,,,,,,,,,,0.07916322350502014,,,,,, +20,119849,,,,,,,,,,,,0.06658978015184402,,,,,, +20,119899,,,,,,,,,,,,0.0721663236618042,,,,,, +20,119949,,,,,,,,,,,,0.07125671207904816,,,,,, +20,119999,,,,,,,,,,,,0.07481144368648529,,,,,, +20,120049,,,,,,,,,,,,0.07608271390199661,,,,,, +20,120099,,,,,,,,,,,,0.0804528072476387,,,,,, +20,120149,,,,,,,,,,,,0.07918210327625275,,,,,, +20,120199,,,,,,,,,,,,0.07140417397022247,,,,,, +20,120249,,,,,,,,,,,,0.07290318608283997,,,,,, +20,120299,,,,,,,,,,,,0.06241912394762039,,,,,, +20,120349,,,,,,,,,,,,0.07357020676136017,,,,,, +20,120399,,,,,,,,,,,,0.06038716435432434,,,,,, +20,120449,,,,,,,,,,,,0.08534755557775497,,,,,, +20,120455,,,,,,,,,,,,,0.2464069128036499,0.08357205986976624,0.13963572680950165,-0.013966917991638184,0.14149273931980133,0.08357205986976624 +20,120455,,,,,,,0.2377093881368637,0.07706944644451141,0.26229169964790344,0.0687829852104187,0.2443542778491974,,,,,,, +21,120499,,,,,,,,,,,,0.08355351537466049,,,,,, +21,120549,,,,,,,,,,,,0.06973735243082047,,,,,, +21,120599,,,,,,,,,,,,0.08016989380121231,,,,,, +21,120649,,,,,,,,,,,,0.08002296090126038,,,,,, +21,120699,,,,,,,,,,,,0.07887517660856247,,,,,, +21,120749,,,,,,,,,,,,0.07942352443933487,,,,,, +21,120799,,,,,,,,,,,,0.07064718008041382,,,,,, +21,120849,,,,,,,,,,,,0.07455207407474518,,,,,, +21,120899,,,,,,,,,,,,0.07188307493925095,,,,,, +21,120949,,,,,,,,,,,,0.07557331025600433,,,,,, +21,120999,,,,,,,,,,,,0.07459069043397903,,,,,, +21,121049,,,,,,,,,,,,0.07514156401157379,,,,,, +21,121099,,,,,,,,,,,,0.08096572011709213,,,,,, +21,121149,,,,,,,,,,,,0.07764821499586105,,,,,, +21,121199,,,,,,,,,,,,0.07971377670764923,,,,,, +21,121249,,,,,,,,,,,,0.07939499616622925,,,,,, +21,121299,,,,,,,,,,,,0.07589741051197052,,,,,, +21,121349,,,,,,,,,,,,0.08092302829027176,,,,,, +21,121399,,,,,,,,,,,,0.07219357788562775,,,,,, +21,121449,,,,,,,,,,,,0.07166966050863266,,,,,, +21,121499,,,,,,,,,,,,0.07888838648796082,,,,,, +21,121549,,,,,,,,,,,,0.07601409405469894,,,,,, +21,121599,,,,,,,,,,,,0.08663083612918854,,,,,, +21,121649,,,,,,,,,,,,0.0893389880657196,,,,,, +21,121699,,,,,,,,,,,,0.07349160313606262,,,,,, +21,121749,,,,,,,,,,,,0.08534838259220123,,,,,, +21,121799,,,,,,,,,,,,0.0803016722202301,,,,,, +21,121849,,,,,,,,,,,,0.05903121829032898,,,,,, +21,121899,,,,,,,,,,,,0.0817829817533493,,,,,, +21,121949,,,,,,,,,,,,0.07859385013580322,,,,,, +21,121999,,,,,,,,,,,,0.06396175920963287,,,,,, +21,122049,,,,,,,,,,,,0.07570016384124756,,,,,, +21,122099,,,,,,,,,,,,0.07244810461997986,,,,,, +21,122149,,,,,,,,,,,,0.06838048994541168,,,,,, +21,122199,,,,,,,,,,,,0.07414865493774414,,,,,, +21,122249,,,,,,,,,,,,0.08102481067180634,,,,,, +21,122299,,,,,,,,,,,,0.07825621217489243,,,,,, +21,122349,,,,,,,,,,,,0.08025812357664108,,,,,, +21,122399,,,,,,,,,,,,0.0824698805809021,,,,,, +21,122449,,,,,,,,,,,,0.07085929065942764,,,,,, +21,122499,,,,,,,,,,,,0.07436908781528473,,,,,, +21,122549,,,,,,,,,,,,0.07345037162303925,,,,,, +21,122599,,,,,,,,,,,,0.08164981007575989,,,,,, +21,122649,,,,,,,,,,,,0.0691271722316742,,,,,, +21,122699,,,,,,,,,,,,0.0767718181014061,,,,,, +21,122749,,,,,,,,,,,,0.07569602131843567,,,,,, +21,122799,,,,,,,,,,,,0.08142104744911194,,,,,, +21,122849,,,,,,,,,,,,0.07713644951581955,,,,,, +21,122899,,,,,,,,,,,,0.07314750552177429,,,,,, +21,122949,,,,,,,,,,,,0.07556315511465073,,,,,, +21,122999,,,,,,,,,,,,0.08295532315969467,,,,,, +21,123049,,,,,,,,,,,,0.0915539488196373,,,,,, +21,123099,,,,,,,,,,,,0.07440228015184402,,,,,, +21,123149,,,,,,,,,,,,0.0885307639837265,,,,,, +21,123199,,,,,,,,,,,,0.07573431730270386,,,,,, +21,123249,,,,,,,,,,,,0.0828142985701561,,,,,, +21,123299,,,,,,,,,,,,0.07551851123571396,,,,,, +21,123349,,,,,,,,,,,,0.0725710466504097,,,,,, +21,123399,,,,,,,,,,,,0.07578622549772263,,,,,, +21,123449,,,,,,,,,,,,0.07046301662921906,,,,,, +21,123499,,,,,,,,,,,,0.07844579219818115,,,,,, +21,123549,,,,,,,,,,,,0.07747675478458405,,,,,, +21,123599,,,,,,,,,,,,0.07046590000391006,,,,,, +21,123649,,,,,,,,,,,,0.0869402065873146,,,,,, +21,123699,,,,,,,,,,,,0.07285109907388687,,,,,, +21,123749,,,,,,,,,,,,0.06331314146518707,,,,,, +21,123799,,,,,,,,,,,,0.07343165576457977,,,,,, +21,123849,,,,,,,,,,,,0.0791345089673996,,,,,, +21,123899,,,,,,,,,,,,0.06977041810750961,,,,,, +21,123949,,,,,,,,,,,,0.07568574696779251,,,,,, +21,123999,,,,,,,,,,,,0.07505463808774948,,,,,, +21,124049,,,,,,,,,,,,0.07900600135326385,,,,,, +21,124099,,,,,,,,,,,,0.08331158012151718,,,,,, +21,124149,,,,,,,,,,,,0.08706679195165634,,,,,, +21,124199,,,,,,,,,,,,0.0792011171579361,,,,,, +21,124249,,,,,,,,,,,,0.07300145924091339,,,,,, +21,124299,,,,,,,,,,,,0.07711025327444077,,,,,, +21,124349,,,,,,,,,,,,0.07143102586269379,,,,,, +21,124399,,,,,,,,,,,,0.058863360434770584,,,,,, +21,124449,,,,,,,,,,,,0.09107857197523117,,,,,, +21,124499,,,,,,,,,,,,0.08084167540073395,,,,,, +21,124549,,,,,,,,,,,,0.07151740789413452,,,,,, +21,124599,,,,,,,,,,,,0.07044626772403717,,,,,, +21,124649,,,,,,,,,,,,0.07841561734676361,,,,,, +21,124699,,,,,,,,,,,,0.08472754061222076,,,,,, +21,124749,,,,,,,,,,,,0.07487450540065765,,,,,, +21,124799,,,,,,,,,,,,0.08007889986038208,,,,,, +21,124849,,,,,,,,,,,,0.07605312764644623,,,,,, +21,124899,,,,,,,,,,,,0.08151154220104218,,,,,, +21,124949,,,,,,,,,,,,0.08970576524734497,,,,,, +21,124999,,,,,,,,,,,,0.08377410471439362,,,,,, +21,125049,,,,,,,,,,,,0.08159797638654709,,,,,, +21,125099,,,,,,,,,,,,0.07148534059524536,,,,,, +21,125149,,,,,,,,,,,,0.06977729499340057,,,,,, +21,125199,,,,,,,,,,,,0.07527650892734528,,,,,, +21,125249,,,,,,,,,,,,0.0647885650396347,,,,,, +21,125299,,,,,,,,,,,,0.07108452171087265,,,,,, +21,125349,,,,,,,,,,,,0.07315438985824585,,,,,, +21,125399,,,,,,,,,,,,0.08003933727741241,,,,,, +21,125449,,,,,,,,,,,,0.06810739636421204,,,,,, +21,125499,,,,,,,,,,,,0.07710357010364532,,,,,, +21,125549,,,,,,,,,,,,0.07088498026132584,,,,,, +21,125599,,,,,,,,,,,,0.06574715673923492,,,,,, +21,125649,,,,,,,,,,,,0.0757620632648468,,,,,, +21,125699,,,,,,,,,,,,0.0765189379453659,,,,,, +21,125749,,,,,,,,,,,,0.08374905586242676,,,,,, +21,125799,,,,,,,,,,,,0.08225002884864807,,,,,, +21,125849,,,,,,,,,,,,0.08572152256965637,,,,,, +21,125899,,,,,,,,,,,,0.0731111615896225,,,,,, +21,125949,,,,,,,,,,,,0.06777988374233246,,,,,, +21,125999,,,,,,,,,,,,0.07540392875671387,,,,,, +21,126049,,,,,,,,,,,,0.08544988185167313,,,,,, +21,126099,,,,,,,,,,,,0.07549697160720825,,,,,, +21,126149,,,,,,,,,,,,0.07298635691404343,,,,,, +21,126191,,,,,,,,,,,,,0.24665416777133942,0.08518469333648682,0.16242742538452148,-0.03353285789489746,0.16479000449180603,0.08518469333648682 +21,126191,,,,,,,0.23740224540233612,0.07699921727180481,0.26399341225624084,0.06964260339736938,0.24719767272472382,,,,,,, +22,126199,,,,,,,,,,,,0.07539167255163193,,,,,, +22,126249,,,,,,,,,,,,0.0795087218284607,,,,,, +22,126299,,,,,,,,,,,,0.07465770840644836,,,,,, +22,126349,,,,,,,,,,,,0.08228176087141037,,,,,, +22,126399,,,,,,,,,,,,0.07130564749240875,,,,,, +22,126449,,,,,,,,,,,,0.07928498834371567,,,,,, +22,126499,,,,,,,,,,,,0.07622620463371277,,,,,, +22,126549,,,,,,,,,,,,0.07548443228006363,,,,,, +22,126599,,,,,,,,,,,,0.07344309240579605,,,,,, +22,126649,,,,,,,,,,,,0.08008274435997009,,,,,, +22,126699,,,,,,,,,,,,0.07305483520030975,,,,,, +22,126749,,,,,,,,,,,,0.07899075746536255,,,,,, +22,126799,,,,,,,,,,,,0.08163592964410782,,,,,, +22,126849,,,,,,,,,,,,0.0863117128610611,,,,,, +22,126899,,,,,,,,,,,,0.06282924115657806,,,,,, +22,126949,,,,,,,,,,,,0.07161986827850342,,,,,, +22,126999,,,,,,,,,,,,0.0677523985505104,,,,,, +22,127049,,,,,,,,,,,,0.07592430710792542,,,,,, +22,127099,,,,,,,,,,,,0.06578534841537476,,,,,, +22,127149,,,,,,,,,,,,0.08120686560869217,,,,,, +22,127199,,,,,,,,,,,,0.08075103163719177,,,,,, +22,127249,,,,,,,,,,,,0.07209432125091553,,,,,, +22,127299,,,,,,,,,,,,0.0715993121266365,,,,,, +22,127349,,,,,,,,,,,,0.07094794511795044,,,,,, +22,127399,,,,,,,,,,,,0.08328218013048172,,,,,, +22,127449,,,,,,,,,,,,0.07243548333644867,,,,,, +22,127499,,,,,,,,,,,,0.08191142976284027,,,,,, +22,127549,,,,,,,,,,,,0.08122381567955017,,,,,, +22,127599,,,,,,,,,,,,0.08727043122053146,,,,,, +22,127649,,,,,,,,,,,,0.0857352614402771,,,,,, +22,127699,,,,,,,,,,,,0.08021733909845352,,,,,, +22,127749,,,,,,,,,,,,0.07733254134654999,,,,,, +22,127799,,,,,,,,,,,,0.07016374170780182,,,,,, +22,127849,,,,,,,,,,,,0.07164078950881958,,,,,, +22,127899,,,,,,,,,,,,0.06998132169246674,,,,,, +22,127949,,,,,,,,,,,,0.058395396918058395,,,,,, +22,127999,,,,,,,,,,,,0.07806600630283356,,,,,, +22,128049,,,,,,,,,,,,0.06940706819295883,,,,,, +22,128099,,,,,,,,,,,,0.07690504193305969,,,,,, +22,128149,,,,,,,,,,,,0.0728854238986969,,,,,, +22,128199,,,,,,,,,,,,0.07692825794219971,,,,,, +22,128249,,,,,,,,,,,,0.08124853670597076,,,,,, +22,128299,,,,,,,,,,,,0.08782237768173218,,,,,, +22,128349,,,,,,,,,,,,0.06844720244407654,,,,,, +22,128399,,,,,,,,,,,,0.07350354641675949,,,,,, +22,128449,,,,,,,,,,,,0.0746622085571289,,,,,, +22,128499,,,,,,,,,,,,0.07456956803798676,,,,,, +22,128549,,,,,,,,,,,,0.07855180650949478,,,,,, +22,128599,,,,,,,,,,,,0.07887963950634003,,,,,, +22,128649,,,,,,,,,,,,0.08033809065818787,,,,,, +22,128699,,,,,,,,,,,,0.06721101701259613,,,,,, +22,128749,,,,,,,,,,,,0.07405215501785278,,,,,, +22,128799,,,,,,,,,,,,0.0771898627281189,,,,,, +22,128849,,,,,,,,,,,,0.07645897567272186,,,,,, +22,128899,,,,,,,,,,,,0.07392985373735428,,,,,, +22,128949,,,,,,,,,,,,0.08707097172737122,,,,,, +22,128999,,,,,,,,,,,,0.07704567164182663,,,,,, +22,129049,,,,,,,,,,,,0.08231421560049057,,,,,, +22,129099,,,,,,,,,,,,0.06580790877342224,,,,,, +22,129149,,,,,,,,,,,,0.07851094752550125,,,,,, +22,129199,,,,,,,,,,,,0.06680838018655777,,,,,, +22,129249,,,,,,,,,,,,0.07805775851011276,,,,,, +22,129299,,,,,,,,,,,,0.06460967659950256,,,,,, +22,129349,,,,,,,,,,,,0.08186494559049606,,,,,, +22,129399,,,,,,,,,,,,0.08414362370967865,,,,,, +22,129449,,,,,,,,,,,,0.06806610524654388,,,,,, +22,129499,,,,,,,,,,,,0.07842612266540527,,,,,, +22,129549,,,,,,,,,,,,0.06991998851299286,,,,,, +22,129599,,,,,,,,,,,,0.07403311878442764,,,,,, +22,129649,,,,,,,,,,,,0.06795468926429749,,,,,, +22,129699,,,,,,,,,,,,0.08349679410457611,,,,,, +22,129749,,,,,,,,,,,,0.07011470198631287,,,,,, +22,129799,,,,,,,,,,,,0.07816129922866821,,,,,, +22,129849,,,,,,,,,,,,0.06943929195404053,,,,,, +22,129899,,,,,,,,,,,,0.06858746707439423,,,,,, +22,129949,,,,,,,,,,,,0.07802184671163559,,,,,, +22,129999,,,,,,,,,,,,0.0711841732263565,,,,,, +22,130049,,,,,,,,,,,,0.09091942012310028,,,,,, +22,130099,,,,,,,,,,,,0.07359564304351807,,,,,, +22,130149,,,,,,,,,,,,0.0793469250202179,,,,,, +22,130199,,,,,,,,,,,,0.08613772690296173,,,,,, +22,130249,,,,,,,,,,,,0.06992153823375702,,,,,, +22,130299,,,,,,,,,,,,0.07752574980258942,,,,,, +22,130349,,,,,,,,,,,,0.07824648171663284,,,,,, +22,130399,,,,,,,,,,,,0.07384178042411804,,,,,, +22,130449,,,,,,,,,,,,0.09283849596977234,,,,,, +22,130499,,,,,,,,,,,,0.07828788459300995,,,,,, +22,130549,,,,,,,,,,,,0.07104943692684174,,,,,, +22,130599,,,,,,,,,,,,0.07383318990468979,,,,,, +22,130649,,,,,,,,,,,,0.07121418416500092,,,,,, +22,130699,,,,,,,,,,,,0.08412279188632965,,,,,, +22,130749,,,,,,,,,,,,0.07487700879573822,,,,,, +22,130799,,,,,,,,,,,,0.07603757083415985,,,,,, +22,130849,,,,,,,,,,,,0.07458516955375671,,,,,, +22,130899,,,,,,,,,,,,0.06831014156341553,,,,,, +22,130949,,,,,,,,,,,,0.07330360263586044,,,,,, +22,130999,,,,,,,,,,,,0.08380097150802612,,,,,, +22,131049,,,,,,,,,,,,0.07792025804519653,,,,,, +22,131099,,,,,,,,,,,,0.07367689907550812,,,,,, +22,131149,,,,,,,,,,,,0.0782032385468483,,,,,, +22,131199,,,,,,,,,,,,0.07523047924041748,,,,,, +22,131249,,,,,,,,,,,,0.08652699738740921,,,,,, +22,131299,,,,,,,,,,,,0.07452945411205292,,,,,, +22,131349,,,,,,,,,,,,0.08232241868972778,,,,,, +22,131399,,,,,,,,,,,,0.0722888708114624,,,,,, +22,131449,,,,,,,,,,,,0.0653439462184906,,,,,, +22,131499,,,,,,,,,,,,0.07161109149456024,,,,,, +22,131549,,,,,,,,,,,,0.08533915132284164,,,,,, +22,131599,,,,,,,,,,,,0.0790521651506424,,,,,, +22,131649,,,,,,,,,,,,0.08115795254707336,,,,,, +22,131699,,,,,,,,,,,,0.07216250896453857,,,,,, +22,131749,,,,,,,,,,,,0.08689239621162415,,,,,, +22,131799,,,,,,,,,,,,0.06489990651607513,,,,,, +22,131849,,,,,,,,,,,,0.07927685976028442,,,,,, +22,131899,,,,,,,,,,,,0.07288952171802521,,,,,, +22,131927,,,,,,,,,,,,,0.24693065881729126,0.08430920541286469,0.14462170004844666,-0.022910594940185547,0.14767985045909882,0.08430920541286469 +22,131927,,,,,,,0.23743869364261627,0.07707243412733078,0.26237186789512634,0.06874662637710571,0.24658747017383575,,,,,,, +23,131949,,,,,,,,,,,,0.08431275188922882,,,,,, +23,131999,,,,,,,,,,,,0.08328452706336975,,,,,, +23,132049,,,,,,,,,,,,0.07443395256996155,,,,,, +23,132099,,,,,,,,,,,,0.07010984420776367,,,,,, +23,132149,,,,,,,,,,,,0.06675674021244049,,,,,, +23,132199,,,,,,,,,,,,0.07104846835136414,,,,,, +23,132249,,,,,,,,,,,,0.0890301764011383,,,,,, +23,132299,,,,,,,,,,,,0.0795544758439064,,,,,, +23,132349,,,,,,,,,,,,0.08865274488925934,,,,,, +23,132399,,,,,,,,,,,,0.07887865602970123,,,,,, +23,132449,,,,,,,,,,,,0.07341744750738144,,,,,, +23,132499,,,,,,,,,,,,0.07445839047431946,,,,,, +23,132549,,,,,,,,,,,,0.07383856177330017,,,,,, +23,132599,,,,,,,,,,,,0.07434402406215668,,,,,, +23,132649,,,,,,,,,,,,0.058535974472761154,,,,,, +23,132699,,,,,,,,,,,,0.07768023759126663,,,,,, +23,132749,,,,,,,,,,,,0.07520589977502823,,,,,, +23,132799,,,,,,,,,,,,0.08106327056884766,,,,,, +23,132849,,,,,,,,,,,,0.07582059502601624,,,,,, +23,132899,,,,,,,,,,,,0.0668659508228302,,,,,, +23,132949,,,,,,,,,,,,0.07421630620956421,,,,,, +23,132999,,,,,,,,,,,,0.06459051370620728,,,,,, +23,133049,,,,,,,,,,,,0.07470202445983887,,,,,, +23,133099,,,,,,,,,,,,0.07946894317865372,,,,,, +23,133149,,,,,,,,,,,,0.07748845964670181,,,,,, +23,133199,,,,,,,,,,,,0.0673278272151947,,,,,, +23,133249,,,,,,,,,,,,0.08380168676376343,,,,,, +23,133299,,,,,,,,,,,,0.09976622462272644,,,,,, +23,133349,,,,,,,,,,,,0.0754886269569397,,,,,, +23,133399,,,,,,,,,,,,0.0716133564710617,,,,,, +23,133449,,,,,,,,,,,,0.08541381359100342,,,,,, +23,133499,,,,,,,,,,,,0.07914397120475769,,,,,, +23,133549,,,,,,,,,,,,0.08406946808099747,,,,,, +23,133599,,,,,,,,,,,,0.08152160048484802,,,,,, +23,133649,,,,,,,,,,,,0.08720128238201141,,,,,, +23,133699,,,,,,,,,,,,0.07306630164384842,,,,,, +23,133749,,,,,,,,,,,,0.07884591817855835,,,,,, +23,133799,,,,,,,,,,,,0.07815303653478622,,,,,, +23,133849,,,,,,,,,,,,0.075731560587883,,,,,, +23,133899,,,,,,,,,,,,0.07971979677677155,,,,,, +23,133949,,,,,,,,,,,,0.07187290489673615,,,,,, +23,133999,,,,,,,,,,,,0.06600065529346466,,,,,, +23,134049,,,,,,,,,,,,0.08086537569761276,,,,,, +23,134099,,,,,,,,,,,,0.05828907713294029,,,,,, +23,134149,,,,,,,,,,,,0.07665935903787613,,,,,, +23,134199,,,,,,,,,,,,0.06771879643201828,,,,,, +23,134249,,,,,,,,,,,,0.0776500552892685,,,,,, +23,134299,,,,,,,,,,,,0.06608574092388153,,,,,, +23,134349,,,,,,,,,,,,0.07671573758125305,,,,,, +23,134399,,,,,,,,,,,,0.0764358639717102,,,,,, +23,134449,,,,,,,,,,,,0.07618053257465363,,,,,, +23,134499,,,,,,,,,,,,0.09162649512290955,,,,,, +23,134549,,,,,,,,,,,,0.07817481458187103,,,,,, +23,134599,,,,,,,,,,,,0.07708711922168732,,,,,, +23,134649,,,,,,,,,,,,0.09417488425970078,,,,,, +23,134699,,,,,,,,,,,,0.07030633091926575,,,,,, +23,134749,,,,,,,,,,,,0.08125714957714081,,,,,, +23,134799,,,,,,,,,,,,0.07326073199510574,,,,,, +23,134849,,,,,,,,,,,,0.07739856839179993,,,,,, +23,134899,,,,,,,,,,,,0.08618159592151642,,,,,, +23,134949,,,,,,,,,,,,0.08127523958683014,,,,,, +23,134999,,,,,,,,,,,,0.06744013726711273,,,,,, +23,135049,,,,,,,,,,,,0.08081606030464172,,,,,, +23,135099,,,,,,,,,,,,0.06634543836116791,,,,,, +23,135149,,,,,,,,,,,,0.0717044398188591,,,,,, +23,135199,,,,,,,,,,,,0.07523250579833984,,,,,, +23,135249,,,,,,,,,,,,0.0790712907910347,,,,,, +23,135299,,,,,,,,,,,,0.08224184811115265,,,,,, +23,135349,,,,,,,,,,,,0.08370339870452881,,,,,, +23,135399,,,,,,,,,,,,0.07575155794620514,,,,,, +23,135449,,,,,,,,,,,,0.07112953066825867,,,,,, +23,135499,,,,,,,,,,,,0.07139088213443756,,,,,, +23,135549,,,,,,,,,,,,0.08297199010848999,,,,,, +23,135599,,,,,,,,,,,,0.07334968447685242,,,,,, +23,135649,,,,,,,,,,,,0.07701390981674194,,,,,, +23,135699,,,,,,,,,,,,0.08130504190921783,,,,,, +23,135749,,,,,,,,,,,,0.08108824491500854,,,,,, +23,135799,,,,,,,,,,,,0.07823705673217773,,,,,, +23,135849,,,,,,,,,,,,0.06195806339383125,,,,,, +23,135899,,,,,,,,,,,,0.08127206563949585,,,,,, +23,135949,,,,,,,,,,,,0.06540098041296005,,,,,, +23,135999,,,,,,,,,,,,0.08504985272884369,,,,,, +23,136049,,,,,,,,,,,,0.0759657472372055,,,,,, +23,136099,,,,,,,,,,,,0.07880966365337372,,,,,, +23,136149,,,,,,,,,,,,0.06282775104045868,,,,,, +23,136199,,,,,,,,,,,,0.0742219090461731,,,,,, +23,136249,,,,,,,,,,,,0.07236043363809586,,,,,, +23,136299,,,,,,,,,,,,0.0767105370759964,,,,,, +23,136349,,,,,,,,,,,,0.07966454327106476,,,,,, +23,136399,,,,,,,,,,,,0.07793893665075302,,,,,, +23,136449,,,,,,,,,,,,0.08224254101514816,,,,,, +23,136499,,,,,,,,,,,,0.08205707371234894,,,,,, +23,136549,,,,,,,,,,,,0.07884645462036133,,,,,, +23,136599,,,,,,,,,,,,0.06624434143304825,,,,,, +23,136649,,,,,,,,,,,,0.07327961921691895,,,,,, +23,136699,,,,,,,,,,,,0.08030804991722107,,,,,, +23,136749,,,,,,,,,,,,0.08751774579286575,,,,,, +23,136799,,,,,,,,,,,,0.08619053661823273,,,,,, +23,136849,,,,,,,,,,,,0.08414747565984726,,,,,, +23,136899,,,,,,,,,,,,0.07547008991241455,,,,,, +23,136949,,,,,,,,,,,,0.08169646561145782,,,,,, +23,136999,,,,,,,,,,,,0.07478896528482437,,,,,, +23,137049,,,,,,,,,,,,0.07058283686637878,,,,,, +23,137099,,,,,,,,,,,,0.07710689306259155,,,,,, +23,137149,,,,,,,,,,,,0.07356345653533936,,,,,, +23,137199,,,,,,,,,,,,0.07881477475166321,,,,,, +23,137249,,,,,,,,,,,,0.07497766613960266,,,,,, +23,137299,,,,,,,,,,,,0.08999429643154144,,,,,, +23,137349,,,,,,,,,,,,0.0819355696439743,,,,,, +23,137399,,,,,,,,,,,,0.07908250391483307,,,,,, +23,137449,,,,,,,,,,,,0.07256761938333511,,,,,, +23,137499,,,,,,,,,,,,0.08135846257209778,,,,,, +23,137549,,,,,,,,,,,,0.07277856767177582,,,,,, +23,137599,,,,,,,,,,,,0.07514098286628723,,,,,, +23,137649,,,,,,,,,,,,0.08397285640239716,,,,,, +23,137663,,,,,,,,,,,,,0.24621643126010895,0.08390751481056213,0.15589995682239532,-0.018036961555480957,0.15295332670211792,0.08390751481056213 +23,137663,,,,,,,0.23716604709625244,0.07680830359458923,0.2682443857192993,0.07192802429199219,0.2494916319847107,,,,,,, +24,137699,,,,,,,,,,,,0.08150216192007065,,,,,, +24,137749,,,,,,,,,,,,0.08154744654893875,,,,,, +24,137799,,,,,,,,,,,,0.08050228655338287,,,,,, +24,137849,,,,,,,,,,,,0.07600469887256622,,,,,, +24,137899,,,,,,,,,,,,0.06948841363191605,,,,,, +24,137949,,,,,,,,,,,,0.08131696283817291,,,,,, +24,137999,,,,,,,,,,,,0.07140333950519562,,,,,, +24,138049,,,,,,,,,,,,0.07943829894065857,,,,,, +24,138099,,,,,,,,,,,,0.08046199381351471,,,,,, +24,138149,,,,,,,,,,,,0.0674695074558258,,,,,, +24,138199,,,,,,,,,,,,0.07135927677154541,,,,,, +24,138249,,,,,,,,,,,,0.08161698281764984,,,,,, +24,138299,,,,,,,,,,,,0.06198272481560707,,,,,, +24,138349,,,,,,,,,,,,0.076610267162323,,,,,, +24,138399,,,,,,,,,,,,0.08034481108188629,,,,,, +24,138449,,,,,,,,,,,,0.08426637202501297,,,,,, +24,138499,,,,,,,,,,,,0.0724758505821228,,,,,, +24,138549,,,,,,,,,,,,0.08092118799686432,,,,,, +24,138599,,,,,,,,,,,,0.06517601013183594,,,,,, +24,138649,,,,,,,,,,,,0.07456565648317337,,,,,, +24,138699,,,,,,,,,,,,0.0964353010058403,,,,,, +24,138749,,,,,,,,,,,,0.07932080328464508,,,,,, +24,138799,,,,,,,,,,,,0.07141874730587006,,,,,, +24,138849,,,,,,,,,,,,0.08529055118560791,,,,,, +24,138899,,,,,,,,,,,,0.0769299566745758,,,,,, +24,138949,,,,,,,,,,,,0.08610552549362183,,,,,, +24,138999,,,,,,,,,,,,0.07814586162567139,,,,,, +24,139049,,,,,,,,,,,,0.0735737606883049,,,,,, +24,139099,,,,,,,,,,,,0.06348305195569992,,,,,, +24,139149,,,,,,,,,,,,0.07404924929141998,,,,,, +24,139199,,,,,,,,,,,,0.06828612834215164,,,,,, +24,139249,,,,,,,,,,,,0.07684111595153809,,,,,, +24,139299,,,,,,,,,,,,0.08506841957569122,,,,,, +24,139349,,,,,,,,,,,,0.06746964901685715,,,,,, +24,139399,,,,,,,,,,,,0.07647478580474854,,,,,, +24,139449,,,,,,,,,,,,0.07462768256664276,,,,,, +24,139499,,,,,,,,,,,,0.07774989306926727,,,,,, +24,139549,,,,,,,,,,,,0.07933230698108673,,,,,, +24,139599,,,,,,,,,,,,0.09028499573469162,,,,,, +24,139649,,,,,,,,,,,,0.0774458795785904,,,,,, +24,139699,,,,,,,,,,,,0.06971301138401031,,,,,, +24,139749,,,,,,,,,,,,0.08651368319988251,,,,,, +24,139799,,,,,,,,,,,,0.077376589179039,,,,,, +24,139849,,,,,,,,,,,,0.06996224820613861,,,,,, +24,139899,,,,,,,,,,,,0.08490842580795288,,,,,, +24,139949,,,,,,,,,,,,0.07922028005123138,,,,,, +24,139999,,,,,,,,,,,,0.06939315795898438,,,,,, +24,140049,,,,,,,,,,,,0.07011698186397552,,,,,, +24,140099,,,,,,,,,,,,0.07358919084072113,,,,,, +24,140149,,,,,,,,,,,,0.0744306743144989,,,,,, +24,140199,,,,,,,,,,,,0.08316732943058014,,,,,, +24,140249,,,,,,,,,,,,0.08251404762268066,,,,,, +24,140299,,,,,,,,,,,,0.07342603802680969,,,,,, +24,140349,,,,,,,,,,,,0.07524712383747101,,,,,, +24,140399,,,,,,,,,,,,0.07145529985427856,,,,,, +24,140449,,,,,,,,,,,,0.0780399739742279,,,,,, +24,140499,,,,,,,,,,,,0.07215128093957901,,,,,, +24,140549,,,,,,,,,,,,0.07638616859912872,,,,,, +24,140599,,,,,,,,,,,,0.07805243134498596,,,,,, +24,140649,,,,,,,,,,,,0.07576024532318115,,,,,, +24,140699,,,,,,,,,,,,0.09130308777093887,,,,,, +24,140749,,,,,,,,,,,,0.073258176445961,,,,,, +24,140799,,,,,,,,,,,,0.07326164841651917,,,,,, +24,140849,,,,,,,,,,,,0.07812201976776123,,,,,, +24,140899,,,,,,,,,,,,0.07978497445583344,,,,,, +24,140949,,,,,,,,,,,,0.09519898891448975,,,,,, +24,140999,,,,,,,,,,,,0.0808500349521637,,,,,, +24,141049,,,,,,,,,,,,0.07302387058734894,,,,,, +24,141099,,,,,,,,,,,,0.07463667541742325,,,,,, +24,141149,,,,,,,,,,,,0.07950818538665771,,,,,, +24,141199,,,,,,,,,,,,0.08318117260932922,,,,,, +24,141249,,,,,,,,,,,,0.08649935573339462,,,,,, +24,141299,,,,,,,,,,,,0.06211277097463608,,,,,, +24,141349,,,,,,,,,,,,0.09130881726741791,,,,,, +24,141399,,,,,,,,,,,,0.08066429197788239,,,,,, +24,141449,,,,,,,,,,,,0.0842888355255127,,,,,, +24,141499,,,,,,,,,,,,0.06809354573488235,,,,,, +24,141549,,,,,,,,,,,,0.07721779495477676,,,,,, +24,141599,,,,,,,,,,,,0.08093447983264923,,,,,, +24,141649,,,,,,,,,,,,0.06201343610882759,,,,,, +24,141699,,,,,,,,,,,,0.08351079374551773,,,,,, +24,141749,,,,,,,,,,,,0.0677882581949234,,,,,, +24,141799,,,,,,,,,,,,0.07231730222702026,,,,,, +24,141849,,,,,,,,,,,,0.07447634637355804,,,,,, +24,141899,,,,,,,,,,,,0.0765274167060852,,,,,, +24,141949,,,,,,,,,,,,0.07751373946666718,,,,,, +24,141999,,,,,,,,,,,,0.08729536086320877,,,,,, +24,142049,,,,,,,,,,,,0.07950398325920105,,,,,, +24,142099,,,,,,,,,,,,0.08375836163759232,,,,,, +24,142149,,,,,,,,,,,,0.08320750296115875,,,,,, +24,142199,,,,,,,,,,,,0.08220642805099487,,,,,, +24,142249,,,,,,,,,,,,0.079189732670784,,,,,, +24,142299,,,,,,,,,,,,0.07691022753715515,,,,,, +24,142349,,,,,,,,,,,,0.07485693693161011,,,,,, +24,142399,,,,,,,,,,,,0.08156567811965942,,,,,, +24,142449,,,,,,,,,,,,0.09076768159866333,,,,,, +24,142499,,,,,,,,,,,,0.07882519066333771,,,,,, +24,142549,,,,,,,,,,,,0.07885701954364777,,,,,, +24,142599,,,,,,,,,,,,0.08187812566757202,,,,,, +24,142649,,,,,,,,,,,,0.07493546605110168,,,,,, +24,142699,,,,,,,,,,,,0.08470694720745087,,,,,, +24,142749,,,,,,,,,,,,0.07718341797590256,,,,,, +24,142799,,,,,,,,,,,,0.07492592930793762,,,,,, +24,142849,,,,,,,,,,,,0.0735790953040123,,,,,, +24,142899,,,,,,,,,,,,0.0748148113489151,,,,,, +24,142949,,,,,,,,,,,,0.0863426923751831,,,,,, +24,142999,,,,,,,,,,,,0.08311589062213898,,,,,, +24,143049,,,,,,,,,,,,0.07601393759250641,,,,,, +24,143099,,,,,,,,,,,,0.08078715205192566,,,,,, +24,143149,,,,,,,,,,,,0.08067141473293304,,,,,, +24,143199,,,,,,,,,,,,0.0828375369310379,,,,,, +24,143249,,,,,,,,,,,,0.06712411344051361,,,,,, +24,143299,,,,,,,,,,,,0.07358603179454803,,,,,, +24,143349,,,,,,,,,,,,0.06040259450674057,,,,,, +24,143399,,,,,,,,,,,,0.1053292527794838,,,,,, +24,143399,,,,,,,,,,,,,0.24739223718643188,0.08506125211715698,0.14342312514781952,-0.032035112380981445,0.14306551218032837,0.08506125211715698 +24,143399,,,,,,,0.23709017038345337,0.07675529271364212,0.2694322466850281,0.07257306575775146,0.25086477398872375,,,,,,, +25,143449,,,,,,,,,,,,0.0845041275024414,,,,,, +25,143499,,,,,,,,,,,,0.0698346495628357,,,,,, +25,143549,,,,,,,,,,,,0.08211560547351837,,,,,, +25,143599,,,,,,,,,,,,0.07236339151859283,,,,,, +25,143649,,,,,,,,,,,,0.07672475278377533,,,,,, +25,143699,,,,,,,,,,,,0.0718093067407608,,,,,, +25,143749,,,,,,,,,,,,0.08328266441822052,,,,,, +25,143799,,,,,,,,,,,,0.07807405292987823,,,,,, +25,143849,,,,,,,,,,,,0.08889087289571762,,,,,, +25,143899,,,,,,,,,,,,0.07786045968532562,,,,,, +25,143949,,,,,,,,,,,,0.07735472917556763,,,,,, +25,143999,,,,,,,,,,,,0.0825863927602768,,,,,, +25,144049,,,,,,,,,,,,0.08904477953910828,,,,,, +25,144099,,,,,,,,,,,,0.06604824215173721,,,,,, +25,144149,,,,,,,,,,,,0.07462659478187561,,,,,, +25,144199,,,,,,,,,,,,0.08169818669557571,,,,,, +25,144249,,,,,,,,,,,,0.07646823674440384,,,,,, +25,144299,,,,,,,,,,,,0.07285965979099274,,,,,, +25,144349,,,,,,,,,,,,0.0693257600069046,,,,,, +25,144399,,,,,,,,,,,,0.07794704288244247,,,,,, +25,144449,,,,,,,,,,,,0.0708298608660698,,,,,, +25,144499,,,,,,,,,,,,0.0732574462890625,,,,,, +25,144549,,,,,,,,,,,,0.08250896632671356,,,,,, +25,144599,,,,,,,,,,,,0.07724214345216751,,,,,, +25,144649,,,,,,,,,,,,0.079351045191288,,,,,, +25,144699,,,,,,,,,,,,0.07557915151119232,,,,,, +25,144749,,,,,,,,,,,,0.07540237158536911,,,,,, +25,144799,,,,,,,,,,,,0.07782506197690964,,,,,, +25,144849,,,,,,,,,,,,0.08221698552370071,,,,,, +25,144899,,,,,,,,,,,,0.07929565012454987,,,,,, +25,144949,,,,,,,,,,,,0.08608696609735489,,,,,, +25,144999,,,,,,,,,,,,0.058260321617126465,,,,,, +25,145049,,,,,,,,,,,,0.07177580147981644,,,,,, +25,145099,,,,,,,,,,,,0.080442413687706,,,,,, +25,145149,,,,,,,,,,,,0.08954088389873505,,,,,, +25,145199,,,,,,,,,,,,0.08448508381843567,,,,,, +25,145249,,,,,,,,,,,,0.06576650589704514,,,,,, +25,145299,,,,,,,,,,,,0.07306984066963196,,,,,, +25,145349,,,,,,,,,,,,0.08403003215789795,,,,,, +25,145399,,,,,,,,,,,,0.07455717027187347,,,,,, +25,145449,,,,,,,,,,,,0.06966133415699005,,,,,, +25,145499,,,,,,,,,,,,0.08531398326158524,,,,,, +25,145549,,,,,,,,,,,,0.07502791285514832,,,,,, +25,145599,,,,,,,,,,,,0.09200817346572876,,,,,, +25,145649,,,,,,,,,,,,0.08066247403621674,,,,,, +25,145699,,,,,,,,,,,,0.07625338435173035,,,,,, +25,145749,,,,,,,,,,,,0.06407861411571503,,,,,, +25,145799,,,,,,,,,,,,0.07730240374803543,,,,,, +25,145849,,,,,,,,,,,,0.07127036154270172,,,,,, +25,145899,,,,,,,,,,,,0.0723889023065567,,,,,, +25,145949,,,,,,,,,,,,0.08686508983373642,,,,,, +25,145999,,,,,,,,,,,,0.07824122160673141,,,,,, +25,146049,,,,,,,,,,,,0.07284103333950043,,,,,, +25,146099,,,,,,,,,,,,0.07261976599693298,,,,,, +25,146149,,,,,,,,,,,,0.07175929844379425,,,,,, +25,146199,,,,,,,,,,,,0.08107058703899384,,,,,, +25,146249,,,,,,,,,,,,0.07763046026229858,,,,,, +25,146299,,,,,,,,,,,,0.0795971155166626,,,,,, +25,146349,,,,,,,,,,,,0.0767345130443573,,,,,, +25,146399,,,,,,,,,,,,0.0836324542760849,,,,,, +25,146449,,,,,,,,,,,,0.07788319885730743,,,,,, +25,146499,,,,,,,,,,,,0.06752941012382507,,,,,, +25,146549,,,,,,,,,,,,0.08031313866376877,,,,,, +25,146599,,,,,,,,,,,,0.060683783143758774,,,,,, +25,146649,,,,,,,,,,,,0.07989534735679626,,,,,, +25,146699,,,,,,,,,,,,0.07029794156551361,,,,,, +25,146749,,,,,,,,,,,,0.07050877809524536,,,,,, +25,146799,,,,,,,,,,,,0.07024016976356506,,,,,, +25,146849,,,,,,,,,,,,0.08773212134838104,,,,,, +25,146899,,,,,,,,,,,,0.0705438107252121,,,,,, +25,146949,,,,,,,,,,,,0.07878363132476807,,,,,, +25,146999,,,,,,,,,,,,0.07581774890422821,,,,,, +25,147049,,,,,,,,,,,,0.07994991540908813,,,,,, +25,147099,,,,,,,,,,,,0.07717537134885788,,,,,, +25,147149,,,,,,,,,,,,0.07613080739974976,,,,,, +25,147199,,,,,,,,,,,,0.09100516140460968,,,,,, +25,147249,,,,,,,,,,,,0.08222073316574097,,,,,, +25,147299,,,,,,,,,,,,0.0706024318933487,,,,,, +25,147349,,,,,,,,,,,,0.07892420887947083,,,,,, +25,147399,,,,,,,,,,,,0.07415471225976944,,,,,, +25,147449,,,,,,,,,,,,0.07779541611671448,,,,,, +25,147499,,,,,,,,,,,,0.0710269957780838,,,,,, +25,147549,,,,,,,,,,,,0.07390519976615906,,,,,, +25,147599,,,,,,,,,,,,0.06777770817279816,,,,,, +25,147649,,,,,,,,,,,,0.0774916484951973,,,,,, +25,147699,,,,,,,,,,,,0.07273972034454346,,,,,, +25,147749,,,,,,,,,,,,0.07773016393184662,,,,,, +25,147799,,,,,,,,,,,,0.07591962069272995,,,,,, +25,147849,,,,,,,,,,,,0.07312179356813431,,,,,, +25,147899,,,,,,,,,,,,0.07382479310035706,,,,,, +25,147949,,,,,,,,,,,,0.07178827375173569,,,,,, +25,147999,,,,,,,,,,,,0.0754728689789772,,,,,, +25,148049,,,,,,,,,,,,0.07410190254449844,,,,,, +25,148099,,,,,,,,,,,,0.08214561641216278,,,,,, +25,148149,,,,,,,,,,,,0.060441963374614716,,,,,, +25,148199,,,,,,,,,,,,0.07583675533533096,,,,,, +25,148249,,,,,,,,,,,,0.0753074362874031,,,,,, +25,148299,,,,,,,,,,,,0.07503245025873184,,,,,, +25,148349,,,,,,,,,,,,0.08827350288629532,,,,,, +25,148399,,,,,,,,,,,,0.08753836154937744,,,,,, +25,148449,,,,,,,,,,,,0.083958700299263,,,,,, +25,148499,,,,,,,,,,,,0.07666711509227753,,,,,, +25,148549,,,,,,,,,,,,0.08250072598457336,,,,,, +25,148599,,,,,,,,,,,,0.07097147405147552,,,,,, +25,148649,,,,,,,,,,,,0.06719155609607697,,,,,, +25,148699,,,,,,,,,,,,0.07715573906898499,,,,,, +25,148749,,,,,,,,,,,,0.07712769508361816,,,,,, +25,148799,,,,,,,,,,,,0.07535147666931152,,,,,, +25,148849,,,,,,,,,,,,0.08267933875322342,,,,,, +25,148899,,,,,,,,,,,,0.07159780710935593,,,,,, +25,148949,,,,,,,,,,,,0.08352639526128769,,,,,, +25,148999,,,,,,,,,,,,0.07100657373666763,,,,,, +25,149049,,,,,,,,,,,,0.07990273088216782,,,,,, +25,149099,,,,,,,,,,,,0.07512632757425308,,,,,, +25,149135,,,,,,,,,,,,,0.2457900494337082,0.08385694026947021,0.1585749089717865,-0.017423391342163086,0.15687130391597748,0.08385694026947021 +25,149135,,,,,,,0.2367350310087204,0.07657622545957565,0.2734208106994629,0.0747327208518982,0.2540293037891388,,,,,,, +26,149149,,,,,,,,,,,,0.06606721878051758,,,,,, +26,149199,,,,,,,,,,,,0.07725346088409424,,,,,, +26,149249,,,,,,,,,,,,0.07049769163131714,,,,,, +26,149299,,,,,,,,,,,,0.08506108820438385,,,,,, +26,149349,,,,,,,,,,,,0.08311423659324646,,,,,, +26,149399,,,,,,,,,,,,0.078403040766716,,,,,, +26,149449,,,,,,,,,,,,0.08489950746297836,,,,,, +26,149499,,,,,,,,,,,,0.06919565796852112,,,,,, +26,149549,,,,,,,,,,,,0.07384178042411804,,,,,, +26,149599,,,,,,,,,,,,0.08000864088535309,,,,,, +26,149649,,,,,,,,,,,,0.0736638680100441,,,,,, +26,149699,,,,,,,,,,,,0.08088284730911255,,,,,, +26,149749,,,,,,,,,,,,0.07142124325037003,,,,,, +26,149799,,,,,,,,,,,,0.08367260545492172,,,,,, +26,149849,,,,,,,,,,,,0.08758082985877991,,,,,, +26,149899,,,,,,,,,,,,0.075359046459198,,,,,, +26,149949,,,,,,,,,,,,0.08252563327550888,,,,,, +26,149999,,,,,,,,,,,,0.06616827845573425,,,,,, +26,150049,,,,,,,,,,,,0.07847204059362411,,,,,, +26,150099,,,,,,,,,,,,0.08253715932369232,,,,,, +26,150149,,,,,,,,,,,,0.07079260051250458,,,,,, +26,150199,,,,,,,,,,,,0.07928233593702316,,,,,, +26,150249,,,,,,,,,,,,0.08738724887371063,,,,,, +26,150299,,,,,,,,,,,,0.06997126340866089,,,,,, +26,150349,,,,,,,,,,,,0.07528221607208252,,,,,, +26,150399,,,,,,,,,,,,0.076325923204422,,,,,, +26,150449,,,,,,,,,,,,0.08065933734178543,,,,,, +26,150499,,,,,,,,,,,,0.07788276672363281,,,,,, +26,150549,,,,,,,,,,,,0.07130561769008636,,,,,, +26,150599,,,,,,,,,,,,0.08317892253398895,,,,,, +26,150649,,,,,,,,,,,,0.09330801665782928,,,,,, +26,150699,,,,,,,,,,,,0.07137381285429001,,,,,, +26,150749,,,,,,,,,,,,0.07161520421504974,,,,,, +26,150799,,,,,,,,,,,,0.07309655100107193,,,,,, +26,150849,,,,,,,,,,,,0.07244895398616791,,,,,, +26,150899,,,,,,,,,,,,0.07529950141906738,,,,,, +26,150949,,,,,,,,,,,,0.07219462841749191,,,,,, +26,150999,,,,,,,,,,,,0.07492560148239136,,,,,, +26,151049,,,,,,,,,,,,0.06712661683559418,,,,,, +26,151099,,,,,,,,,,,,0.07610544562339783,,,,,, +26,151149,,,,,,,,,,,,0.07106511294841766,,,,,, +26,151199,,,,,,,,,,,,0.06881324201822281,,,,,, +26,151249,,,,,,,,,,,,0.06295321881771088,,,,,, +26,151299,,,,,,,,,,,,0.07951664924621582,,,,,, +26,151349,,,,,,,,,,,,0.06738241016864777,,,,,, +26,151399,,,,,,,,,,,,0.08235057443380356,,,,,, +26,151449,,,,,,,,,,,,0.08251648396253586,,,,,, +26,151499,,,,,,,,,,,,0.0742577537894249,,,,,, +26,151549,,,,,,,,,,,,0.07598307728767395,,,,,, +26,151599,,,,,,,,,,,,0.07118864357471466,,,,,, +26,151649,,,,,,,,,,,,0.06843052804470062,,,,,, +26,151699,,,,,,,,,,,,0.07683253288269043,,,,,, +26,151749,,,,,,,,,,,,0.0783625990152359,,,,,, +26,151799,,,,,,,,,,,,0.07956299930810928,,,,,, +26,151849,,,,,,,,,,,,0.08230030536651611,,,,,, +26,151899,,,,,,,,,,,,0.07532598078250885,,,,,, +26,151949,,,,,,,,,,,,0.08149963617324829,,,,,, +26,151999,,,,,,,,,,,,0.07532352209091187,,,,,, +26,152049,,,,,,,,,,,,0.07595258206129074,,,,,, +26,152099,,,,,,,,,,,,0.07461539655923843,,,,,, +26,152149,,,,,,,,,,,,0.06867164373397827,,,,,, +26,152199,,,,,,,,,,,,0.07233449816703796,,,,,, +26,152249,,,,,,,,,,,,0.07750705629587173,,,,,, +26,152299,,,,,,,,,,,,0.07451682537794113,,,,,, +26,152349,,,,,,,,,,,,0.0739242434501648,,,,,, +26,152399,,,,,,,,,,,,0.0783531665802002,,,,,, +26,152449,,,,,,,,,,,,0.09136202931404114,,,,,, +26,152499,,,,,,,,,,,,0.08173353970050812,,,,,, +26,152549,,,,,,,,,,,,0.06568131595849991,,,,,, +26,152599,,,,,,,,,,,,0.08777882158756256,,,,,, +26,152649,,,,,,,,,,,,0.07653892040252686,,,,,, +26,152699,,,,,,,,,,,,0.07403486967086792,,,,,, +26,152749,,,,,,,,,,,,0.07154424488544464,,,,,, +26,152799,,,,,,,,,,,,0.07479321956634521,,,,,, +26,152849,,,,,,,,,,,,0.07616560906171799,,,,,, +26,152899,,,,,,,,,,,,0.06753800809383392,,,,,, +26,152949,,,,,,,,,,,,0.07161714136600494,,,,,, +26,152999,,,,,,,,,,,,0.07421388477087021,,,,,, +26,153049,,,,,,,,,,,,0.07796622812747955,,,,,, +26,153099,,,,,,,,,,,,0.08194667100906372,,,,,, +26,153149,,,,,,,,,,,,0.07712027430534363,,,,,, +26,153199,,,,,,,,,,,,0.06856918334960938,,,,,, +26,153249,,,,,,,,,,,,0.07342103123664856,,,,,, +26,153299,,,,,,,,,,,,0.07490286231040955,,,,,, +26,153349,,,,,,,,,,,,0.0768398642539978,,,,,, +26,153399,,,,,,,,,,,,0.07518836855888367,,,,,, +26,153449,,,,,,,,,,,,0.0926361232995987,,,,,, +26,153499,,,,,,,,,,,,0.0735459178686142,,,,,, +26,153549,,,,,,,,,,,,0.07472123950719833,,,,,, +26,153599,,,,,,,,,,,,0.07890186458826065,,,,,, +26,153649,,,,,,,,,,,,0.08080773055553436,,,,,, +26,153699,,,,,,,,,,,,0.07403488457202911,,,,,, +26,153749,,,,,,,,,,,,0.08249248564243317,,,,,, +26,153799,,,,,,,,,,,,0.0831150934100151,,,,,, +26,153849,,,,,,,,,,,,0.07086504250764847,,,,,, +26,153899,,,,,,,,,,,,0.08701944351196289,,,,,, +26,153949,,,,,,,,,,,,0.06745745241641998,,,,,, +26,153999,,,,,,,,,,,,0.07852193713188171,,,,,, +26,154049,,,,,,,,,,,,0.07597500830888748,,,,,, +26,154099,,,,,,,,,,,,0.07403995096683502,,,,,, +26,154149,,,,,,,,,,,,0.07341960072517395,,,,,, +26,154199,,,,,,,,,,,,0.07124456018209457,,,,,, +26,154249,,,,,,,,,,,,0.07852870225906372,,,,,, +26,154299,,,,,,,,,,,,0.08012136816978455,,,,,, +26,154349,,,,,,,,,,,,0.07113942503929138,,,,,, +26,154399,,,,,,,,,,,,0.07641300559043884,,,,,, +26,154449,,,,,,,,,,,,0.071372389793396,,,,,, +26,154499,,,,,,,,,,,,0.07149336487054825,,,,,, +26,154549,,,,,,,,,,,,0.06464789062738419,,,,,, +26,154599,,,,,,,,,,,,0.07354575395584106,,,,,, +26,154649,,,,,,,,,,,,0.07954389601945877,,,,,, +26,154699,,,,,,,,,,,,0.07508709281682968,,,,,, +26,154749,,,,,,,,,,,,0.08191624283790588,,,,,, +26,154799,,,,,,,,,,,,0.08090840280056,,,,,, +26,154849,,,,,,,,,,,,0.07669785618782043,,,,,, +26,154871,,,,,,,,,,,,,0.24665570259094238,0.0845039114356041,0.14552828669548035,-0.02527296543121338,0.1424115002155304,0.0845039114356041 +26,154871,,,,,,,0.2362612634897232,0.07642517983913422,0.2768114507198334,0.07656514644622803,0.2589656114578247,,,,,,, +27,154899,,,,,,,,,,,,0.05476004257798195,,,,,, +27,154949,,,,,,,,,,,,0.08353835344314575,,,,,, +27,154999,,,,,,,,,,,,0.07042241841554642,,,,,, +27,155049,,,,,,,,,,,,0.08058368414640427,,,,,, +27,155099,,,,,,,,,,,,0.06950069963932037,,,,,, +27,155149,,,,,,,,,,,,0.06519733369350433,,,,,, +27,155199,,,,,,,,,,,,0.07473860681056976,,,,,, +27,155249,,,,,,,,,,,,0.07638591527938843,,,,,, +27,155299,,,,,,,,,,,,0.06866133213043213,,,,,, +27,155349,,,,,,,,,,,,0.0662076473236084,,,,,, +27,155399,,,,,,,,,,,,0.06132004037499428,,,,,, +27,155449,,,,,,,,,,,,0.07690452039241791,,,,,, +27,155499,,,,,,,,,,,,0.07283894717693329,,,,,, +27,155549,,,,,,,,,,,,0.08133823424577713,,,,,, +27,155599,,,,,,,,,,,,0.08092984557151794,,,,,, +27,155649,,,,,,,,,,,,0.07194388657808304,,,,,, +27,155699,,,,,,,,,,,,0.07306540757417679,,,,,, +27,155749,,,,,,,,,,,,0.07265657186508179,,,,,, +27,155799,,,,,,,,,,,,0.06387065351009369,,,,,, +27,155849,,,,,,,,,,,,0.0747646912932396,,,,,, +27,155899,,,,,,,,,,,,0.07876551896333694,,,,,, +27,155949,,,,,,,,,,,,0.08349931240081787,,,,,, +27,155999,,,,,,,,,,,,0.08906257152557373,,,,,, +27,156049,,,,,,,,,,,,0.07997111231088638,,,,,, +27,156099,,,,,,,,,,,,0.06864345818758011,,,,,, +27,156149,,,,,,,,,,,,0.07564324885606766,,,,,, +27,156199,,,,,,,,,,,,0.07066082954406738,,,,,, +27,156249,,,,,,,,,,,,0.07682578265666962,,,,,, +27,156299,,,,,,,,,,,,0.07492890954017639,,,,,, +27,156349,,,,,,,,,,,,0.06842052936553955,,,,,, +27,156399,,,,,,,,,,,,0.08220243453979492,,,,,, +27,156449,,,,,,,,,,,,0.07042919844388962,,,,,, +27,156499,,,,,,,,,,,,0.08075977861881256,,,,,, +27,156549,,,,,,,,,,,,0.07131911814212799,,,,,, +27,156599,,,,,,,,,,,,0.07704533636569977,,,,,, +27,156649,,,,,,,,,,,,0.07031066715717316,,,,,, +27,156699,,,,,,,,,,,,0.07450120151042938,,,,,, +27,156749,,,,,,,,,,,,0.07521067559719086,,,,,, +27,156799,,,,,,,,,,,,0.0818101167678833,,,,,, +27,156849,,,,,,,,,,,,0.06443063914775848,,,,,, +27,156899,,,,,,,,,,,,0.0822238177061081,,,,,, +27,156949,,,,,,,,,,,,0.07280540466308594,,,,,, +27,156999,,,,,,,,,,,,0.07119515538215637,,,,,, +27,157049,,,,,,,,,,,,0.07730844616889954,,,,,, +27,157099,,,,,,,,,,,,0.08039142191410065,,,,,, +27,157149,,,,,,,,,,,,0.0706389769911766,,,,,, +27,157199,,,,,,,,,,,,0.08249931037425995,,,,,, +27,157249,,,,,,,,,,,,0.07608109712600708,,,,,, +27,157299,,,,,,,,,,,,0.07914599031209946,,,,,, +27,157349,,,,,,,,,,,,0.07263664156198502,,,,,, +27,157399,,,,,,,,,,,,0.07871992886066437,,,,,, +27,157449,,,,,,,,,,,,0.07112470269203186,,,,,, +27,157499,,,,,,,,,,,,0.06872614473104477,,,,,, +27,157549,,,,,,,,,,,,0.0711546242237091,,,,,, +27,157599,,,,,,,,,,,,0.07255996018648148,,,,,, +27,157649,,,,,,,,,,,,0.06653674691915512,,,,,, +27,157699,,,,,,,,,,,,0.07784759998321533,,,,,, +27,157749,,,,,,,,,,,,0.08442942798137665,,,,,, +27,157799,,,,,,,,,,,,0.07640757411718369,,,,,, +27,157849,,,,,,,,,,,,0.08136624097824097,,,,,, +27,157899,,,,,,,,,,,,0.06868869066238403,,,,,, +27,157949,,,,,,,,,,,,0.07824695110321045,,,,,, +27,157999,,,,,,,,,,,,0.07074033468961716,,,,,, +27,158049,,,,,,,,,,,,0.07573442906141281,,,,,, +27,158099,,,,,,,,,,,,0.0739939957857132,,,,,, +27,158149,,,,,,,,,,,,0.07297447323799133,,,,,, +27,158199,,,,,,,,,,,,0.05566570162773132,,,,,, +27,158249,,,,,,,,,,,,0.06576734781265259,,,,,, +27,158299,,,,,,,,,,,,0.07990508526563644,,,,,, +27,158349,,,,,,,,,,,,0.08754140138626099,,,,,, +27,158399,,,,,,,,,,,,0.07579130679368973,,,,,, +27,158449,,,,,,,,,,,,0.07540785521268845,,,,,, +27,158499,,,,,,,,,,,,0.08214955776929855,,,,,, +27,158549,,,,,,,,,,,,0.062271181493997574,,,,,, +27,158599,,,,,,,,,,,,0.07646696269512177,,,,,, +27,158649,,,,,,,,,,,,0.07392629981040955,,,,,, +27,158699,,,,,,,,,,,,0.06299501657485962,,,,,, +27,158749,,,,,,,,,,,,0.06149599701166153,,,,,, +27,158799,,,,,,,,,,,,0.06422407925128937,,,,,, +27,158849,,,,,,,,,,,,0.09120284020900726,,,,,, +27,158899,,,,,,,,,,,,0.074581578373909,,,,,, +27,158949,,,,,,,,,,,,0.08237549662590027,,,,,, +27,158999,,,,,,,,,,,,0.07320581376552582,,,,,, +27,159049,,,,,,,,,,,,0.08576688915491104,,,,,, +27,159099,,,,,,,,,,,,0.080047607421875,,,,,, +27,159149,,,,,,,,,,,,0.06987175345420837,,,,,, +27,159199,,,,,,,,,,,,0.11164768785238266,,,,,, +27,159249,,,,,,,,,,,,0.07189664989709854,,,,,, +27,159299,,,,,,,,,,,,0.08059851825237274,,,,,, +27,159349,,,,,,,,,,,,0.07642649859189987,,,,,, +27,159399,,,,,,,,,,,,0.07588067650794983,,,,,, +27,159449,,,,,,,,,,,,0.0762614980340004,,,,,, +27,159499,,,,,,,,,,,,0.06621704995632172,,,,,, +27,159549,,,,,,,,,,,,0.08010709285736084,,,,,, +27,159599,,,,,,,,,,,,0.08011724799871445,,,,,, +27,159649,,,,,,,,,,,,0.06855535507202148,,,,,, +27,159699,,,,,,,,,,,,0.07022656500339508,,,,,, +27,159749,,,,,,,,,,,,0.07112821936607361,,,,,, +27,159799,,,,,,,,,,,,0.08888287842273712,,,,,, +27,159849,,,,,,,,,,,,0.07385414838790894,,,,,, +27,159899,,,,,,,,,,,,0.08124689757823944,,,,,, +27,159949,,,,,,,,,,,,0.07242736965417862,,,,,, +27,159999,,,,,,,,,,,,0.08750030398368835,,,,,, +27,160049,,,,,,,,,,,,0.07886204123497009,,,,,, +27,160099,,,,,,,,,,,,0.07784134149551392,,,,,, +27,160149,,,,,,,,,,,,0.06856118887662888,,,,,, +27,160199,,,,,,,,,,,,0.0782397985458374,,,,,, +27,160249,,,,,,,,,,,,0.07696748524904251,,,,,, +27,160299,,,,,,,,,,,,0.0796540305018425,,,,,, +27,160349,,,,,,,,,,,,0.07713361084461212,,,,,, +27,160399,,,,,,,,,,,,0.07186944037675858,,,,,, +27,160449,,,,,,,,,,,,0.08377528190612793,,,,,, +27,160499,,,,,,,,,,,,0.07994188368320465,,,,,, +27,160549,,,,,,,,,,,,0.08615601807832718,,,,,, +27,160599,,,,,,,,,,,,0.07271412014961243,,,,,, +27,160607,,,,,,,,,,,,,0.2470978945493698,0.08467820286750793,0.14917069673538208,-0.027387619018554688,0.14322935044765472,0.08467820286750793 +27,160607,,,,,,,0.23600780963897705,0.07617411017417908,0.2821405529975891,0.07959717512130737,0.26181885600090027,,,,,,, +28,160649,,,,,,,,,,,,0.06953613460063934,,,,,, +28,160699,,,,,,,,,,,,0.07194658368825912,,,,,, +28,160749,,,,,,,,,,,,0.061685118824243546,,,,,, +28,160799,,,,,,,,,,,,0.07483254373073578,,,,,, +28,160849,,,,,,,,,,,,0.0770096555352211,,,,,, +28,160899,,,,,,,,,,,,0.07943752408027649,,,,,, +28,160949,,,,,,,,,,,,0.06757724285125732,,,,,, +28,160999,,,,,,,,,,,,0.07076835632324219,,,,,, +28,161049,,,,,,,,,,,,0.07429244369268417,,,,,, +28,161099,,,,,,,,,,,,0.07789169996976852,,,,,, +28,161149,,,,,,,,,,,,0.08321787416934967,,,,,, +28,161199,,,,,,,,,,,,0.07395797967910767,,,,,, +28,161249,,,,,,,,,,,,0.08502335846424103,,,,,, +28,161299,,,,,,,,,,,,0.08368659019470215,,,,,, +28,161349,,,,,,,,,,,,0.07218965888023376,,,,,, +28,161399,,,,,,,,,,,,0.07437513768672943,,,,,, +28,161449,,,,,,,,,,,,0.06273913383483887,,,,,, +28,161499,,,,,,,,,,,,0.06625160574913025,,,,,, +28,161549,,,,,,,,,,,,0.08391512930393219,,,,,, +28,161599,,,,,,,,,,,,0.07803063094615936,,,,,, +28,161649,,,,,,,,,,,,0.06659786403179169,,,,,, +28,161699,,,,,,,,,,,,0.07589641213417053,,,,,, +28,161749,,,,,,,,,,,,0.08266952633857727,,,,,, +28,161799,,,,,,,,,,,,0.06924378871917725,,,,,, +28,161849,,,,,,,,,,,,0.06886852532625198,,,,,, +28,161899,,,,,,,,,,,,0.07946845889091492,,,,,, +28,161949,,,,,,,,,,,,0.0753379613161087,,,,,, +28,161999,,,,,,,,,,,,0.07073669135570526,,,,,, +28,162049,,,,,,,,,,,,0.0864078551530838,,,,,, +28,162099,,,,,,,,,,,,0.07974294573068619,,,,,, +28,162149,,,,,,,,,,,,0.07532868534326553,,,,,, +28,162199,,,,,,,,,,,,0.07652859389781952,,,,,, +28,162249,,,,,,,,,,,,0.08570967614650726,,,,,, +28,162299,,,,,,,,,,,,0.07823659479618073,,,,,, +28,162349,,,,,,,,,,,,0.08301366865634918,,,,,, +28,162399,,,,,,,,,,,,0.08571283519268036,,,,,, +28,162449,,,,,,,,,,,,0.06878654658794403,,,,,, +28,162499,,,,,,,,,,,,0.06587715446949005,,,,,, +28,162549,,,,,,,,,,,,0.07629372179508209,,,,,, +28,162599,,,,,,,,,,,,0.08903340995311737,,,,,, +28,162649,,,,,,,,,,,,0.07146599888801575,,,,,, +28,162699,,,,,,,,,,,,0.08484777808189392,,,,,, +28,162749,,,,,,,,,,,,0.08084045350551605,,,,,, +28,162799,,,,,,,,,,,,0.07128351181745529,,,,,, +28,162849,,,,,,,,,,,,0.06913206726312637,,,,,, +28,162899,,,,,,,,,,,,0.07358498126268387,,,,,, +28,162949,,,,,,,,,,,,0.07014256715774536,,,,,, +28,162999,,,,,,,,,,,,0.08070823550224304,,,,,, +28,163049,,,,,,,,,,,,0.06882894039154053,,,,,, +28,163099,,,,,,,,,,,,0.07490167021751404,,,,,, +28,163149,,,,,,,,,,,,0.07227249443531036,,,,,, +28,163199,,,,,,,,,,,,0.07178768515586853,,,,,, +28,163249,,,,,,,,,,,,0.07659320533275604,,,,,, +28,163299,,,,,,,,,,,,0.0752943754196167,,,,,, +28,163349,,,,,,,,,,,,0.0734921246767044,,,,,, +28,163399,,,,,,,,,,,,0.08101518452167511,,,,,, +28,163449,,,,,,,,,,,,0.07655243575572968,,,,,, +28,163499,,,,,,,,,,,,0.08810748904943466,,,,,, +28,163549,,,,,,,,,,,,0.0855494812130928,,,,,, +28,163599,,,,,,,,,,,,0.07829247415065765,,,,,, +28,163649,,,,,,,,,,,,0.07467973977327347,,,,,, +28,163699,,,,,,,,,,,,0.07945626974105835,,,,,, +28,163749,,,,,,,,,,,,0.0707879513502121,,,,,, +28,163799,,,,,,,,,,,,0.07678598165512085,,,,,, +28,163849,,,,,,,,,,,,0.06563238799571991,,,,,, +28,163899,,,,,,,,,,,,0.0777805894613266,,,,,, +28,163949,,,,,,,,,,,,0.0731477364897728,,,,,, +28,163999,,,,,,,,,,,,0.07002716511487961,,,,,, +28,164049,,,,,,,,,,,,0.06902140378952026,,,,,, +28,164099,,,,,,,,,,,,0.08822838962078094,,,,,, +28,164149,,,,,,,,,,,,0.06379453837871552,,,,,, +28,164199,,,,,,,,,,,,0.06622151285409927,,,,,, +28,164249,,,,,,,,,,,,0.07058346271514893,,,,,, +28,164299,,,,,,,,,,,,0.0774739608168602,,,,,, +28,164349,,,,,,,,,,,,0.07746734470129013,,,,,, +28,164399,,,,,,,,,,,,0.09674286842346191,,,,,, +28,164449,,,,,,,,,,,,0.08684754371643066,,,,,, +28,164499,,,,,,,,,,,,0.06251487135887146,,,,,, +28,164549,,,,,,,,,,,,0.07127682864665985,,,,,, +28,164599,,,,,,,,,,,,0.08239193260669708,,,,,, +28,164649,,,,,,,,,,,,0.06913195550441742,,,,,, +28,164699,,,,,,,,,,,,0.07512371987104416,,,,,, +28,164749,,,,,,,,,,,,0.07145129144191742,,,,,, +28,164799,,,,,,,,,,,,0.07347193360328674,,,,,, +28,164849,,,,,,,,,,,,0.08105631917715073,,,,,, +28,164899,,,,,,,,,,,,0.07329914718866348,,,,,, +28,164949,,,,,,,,,,,,0.07784022390842438,,,,,, +28,164999,,,,,,,,,,,,0.07842491567134857,,,,,, +28,165049,,,,,,,,,,,,0.07536636292934418,,,,,, +28,165099,,,,,,,,,,,,0.08594518899917603,,,,,, +28,165149,,,,,,,,,,,,0.0746544897556305,,,,,, +28,165199,,,,,,,,,,,,0.07629039883613586,,,,,, +28,165249,,,,,,,,,,,,0.07341782003641129,,,,,, +28,165299,,,,,,,,,,,,0.07044112682342529,,,,,, +28,165349,,,,,,,,,,,,0.0744895488023758,,,,,, +28,165399,,,,,,,,,,,,0.09062241017818451,,,,,, +28,165449,,,,,,,,,,,,0.06553596258163452,,,,,, +28,165499,,,,,,,,,,,,0.06827983260154724,,,,,, +28,165549,,,,,,,,,,,,0.06891275942325592,,,,,, +28,165599,,,,,,,,,,,,0.08077780902385712,,,,,, +28,165649,,,,,,,,,,,,0.06307107955217361,,,,,, +28,165699,,,,,,,,,,,,0.0748690813779831,,,,,, +28,165749,,,,,,,,,,,,0.06907059997320175,,,,,, +28,165799,,,,,,,,,,,,0.061756037175655365,,,,,, +28,165849,,,,,,,,,,,,0.07873503863811493,,,,,, +28,165899,,,,,,,,,,,,0.07110602408647537,,,,,, +28,165949,,,,,,,,,,,,0.08717387914657593,,,,,, +28,165999,,,,,,,,,,,,0.08677460998296738,,,,,, +28,166049,,,,,,,,,,,,0.0757143497467041,,,,,, +28,166099,,,,,,,,,,,,0.0748894214630127,,,,,, +28,166149,,,,,,,,,,,,0.08411561697721481,,,,,, +28,166199,,,,,,,,,,,,0.08598212897777557,,,,,, +28,166249,,,,,,,,,,,,0.07455644011497498,,,,,, +28,166299,,,,,,,,,,,,0.0829658955335617,,,,,, +28,166343,,,,,,,,,,,,,0.24627406895160675,0.08404865860939026,0.154311403632164,-0.01974952220916748,0.14720043540000916,0.08404865860939026 +28,166343,,,,,,,0.2358708381652832,0.07615504413843155,0.28256142139434814,0.07984292507171631,0.2629043459892273,,,,,,, +29,166349,,,,,,,,,,,,0.07203876227140427,,,,,, +29,166399,,,,,,,,,,,,0.08363918960094452,,,,,, +29,166449,,,,,,,,,,,,0.07875709235668182,,,,,, +29,166499,,,,,,,,,,,,0.0831851065158844,,,,,, +29,166549,,,,,,,,,,,,0.07607470452785492,,,,,, +29,166599,,,,,,,,,,,,0.08029159903526306,,,,,, +29,166649,,,,,,,,,,,,0.07960720360279083,,,,,, +29,166699,,,,,,,,,,,,0.07246650755405426,,,,,, +29,166749,,,,,,,,,,,,0.08832906931638718,,,,,, +29,166799,,,,,,,,,,,,0.08842572569847107,,,,,, +29,166849,,,,,,,,,,,,0.07164750248193741,,,,,, +29,166899,,,,,,,,,,,,0.07247934490442276,,,,,, +29,166949,,,,,,,,,,,,0.08949564397335052,,,,,, +29,166999,,,,,,,,,,,,0.07563114166259766,,,,,, +29,167049,,,,,,,,,,,,0.07809728384017944,,,,,, +29,167099,,,,,,,,,,,,0.06378630548715591,,,,,, +29,167149,,,,,,,,,,,,0.07657260447740555,,,,,, +29,167199,,,,,,,,,,,,0.08413379639387131,,,,,, +29,167249,,,,,,,,,,,,0.07473405450582504,,,,,, +29,167299,,,,,,,,,,,,0.08025883138179779,,,,,, +29,167349,,,,,,,,,,,,0.07205972075462341,,,,,, +29,167399,,,,,,,,,,,,0.07715019583702087,,,,,, +29,167449,,,,,,,,,,,,0.07765316963195801,,,,,, +29,167499,,,,,,,,,,,,0.07759277522563934,,,,,, +29,167549,,,,,,,,,,,,0.08008994162082672,,,,,, +29,167599,,,,,,,,,,,,0.0735650360584259,,,,,, +29,167649,,,,,,,,,,,,0.0709376335144043,,,,,, +29,167699,,,,,,,,,,,,0.062445785850286484,,,,,, +29,167749,,,,,,,,,,,,0.07660677284002304,,,,,, +29,167799,,,,,,,,,,,,0.07195474207401276,,,,,, +29,167849,,,,,,,,,,,,0.07685473561286926,,,,,, +29,167899,,,,,,,,,,,,0.07058175653219223,,,,,, +29,167949,,,,,,,,,,,,0.07700866460800171,,,,,, +29,167999,,,,,,,,,,,,0.08980211615562439,,,,,, +29,168049,,,,,,,,,,,,0.05566159635782242,,,,,, +29,168099,,,,,,,,,,,,0.07629571855068207,,,,,, +29,168149,,,,,,,,,,,,0.08140566945075989,,,,,, +29,168199,,,,,,,,,,,,0.07406480610370636,,,,,, +29,168249,,,,,,,,,,,,0.07403399050235748,,,,,, +29,168299,,,,,,,,,,,,0.07324063032865524,,,,,, +29,168349,,,,,,,,,,,,0.09189808368682861,,,,,, +29,168399,,,,,,,,,,,,0.08013919740915298,,,,,, +29,168449,,,,,,,,,,,,0.07101364433765411,,,,,, +29,168499,,,,,,,,,,,,0.07658350467681885,,,,,, +29,168549,,,,,,,,,,,,0.08309401571750641,,,,,, +29,168599,,,,,,,,,,,,0.07690437138080597,,,,,, +29,168649,,,,,,,,,,,,0.08834227174520493,,,,,, +29,168699,,,,,,,,,,,,0.07310730218887329,,,,,, +29,168749,,,,,,,,,,,,0.06728251278400421,,,,,, +29,168799,,,,,,,,,,,,0.07269452512264252,,,,,, +29,168849,,,,,,,,,,,,0.06365300714969635,,,,,, +29,168899,,,,,,,,,,,,0.06981204450130463,,,,,, +29,168949,,,,,,,,,,,,0.07937365770339966,,,,,, +29,168999,,,,,,,,,,,,0.07662323117256165,,,,,, +29,169049,,,,,,,,,,,,0.07625382393598557,,,,,, +29,169099,,,,,,,,,,,,0.07019367814064026,,,,,, +29,169149,,,,,,,,,,,,0.07995542883872986,,,,,, +29,169199,,,,,,,,,,,,0.07348063588142395,,,,,, +29,169249,,,,,,,,,,,,0.07223129272460938,,,,,, +29,169299,,,,,,,,,,,,0.07193668931722641,,,,,, +29,169349,,,,,,,,,,,,0.07854260504245758,,,,,, +29,169399,,,,,,,,,,,,0.06631118804216385,,,,,, +29,169449,,,,,,,,,,,,0.08057516068220139,,,,,, +29,169499,,,,,,,,,,,,0.07594835758209229,,,,,, +29,169549,,,,,,,,,,,,0.07939057052135468,,,,,, +29,169599,,,,,,,,,,,,0.08063012361526489,,,,,, +29,169649,,,,,,,,,,,,0.07586313784122467,,,,,, +29,169699,,,,,,,,,,,,0.08408617973327637,,,,,, +29,169749,,,,,,,,,,,,0.08518636226654053,,,,,, +29,169799,,,,,,,,,,,,0.06786464154720306,,,,,, +29,169849,,,,,,,,,,,,0.062263403087854385,,,,,, +29,169899,,,,,,,,,,,,0.0886085033416748,,,,,, +29,169949,,,,,,,,,,,,0.06627523899078369,,,,,, +29,169999,,,,,,,,,,,,0.07424726337194443,,,,,, +29,170049,,,,,,,,,,,,0.07727617770433426,,,,,, +29,170099,,,,,,,,,,,,0.08629966527223587,,,,,, +29,170149,,,,,,,,,,,,0.07928037643432617,,,,,, +29,170199,,,,,,,,,,,,0.0837404802441597,,,,,, +29,170249,,,,,,,,,,,,0.06453657150268555,,,,,, +29,170299,,,,,,,,,,,,0.08247299492359161,,,,,, +29,170349,,,,,,,,,,,,0.07039888203144073,,,,,, +29,170399,,,,,,,,,,,,0.07003153860569,,,,,, +29,170449,,,,,,,,,,,,0.06944668292999268,,,,,, +29,170499,,,,,,,,,,,,0.08122149109840393,,,,,, +29,170549,,,,,,,,,,,,0.06982368230819702,,,,,, +29,170599,,,,,,,,,,,,0.07075835019350052,,,,,, +29,170649,,,,,,,,,,,,0.09952154755592346,,,,,, +29,170699,,,,,,,,,,,,0.0783463716506958,,,,,, +29,170749,,,,,,,,,,,,0.07793061435222626,,,,,, +29,170799,,,,,,,,,,,,0.07695019990205765,,,,,, +29,170849,,,,,,,,,,,,0.08155231177806854,,,,,, +29,170899,,,,,,,,,,,,0.07820168882608414,,,,,, +29,170949,,,,,,,,,,,,0.07098168134689331,,,,,, +29,170999,,,,,,,,,,,,0.08040881156921387,,,,,, +29,171049,,,,,,,,,,,,0.07969070971012115,,,,,, +29,171099,,,,,,,,,,,,0.07505872845649719,,,,,, +29,171149,,,,,,,,,,,,0.08486949652433395,,,,,, +29,171199,,,,,,,,,,,,0.07449909299612045,,,,,, +29,171249,,,,,,,,,,,,0.06951749324798584,,,,,, +29,171299,,,,,,,,,,,,0.07799225300550461,,,,,, +29,171349,,,,,,,,,,,,0.08845493197441101,,,,,, +29,171399,,,,,,,,,,,,0.07326898723840714,,,,,, +29,171449,,,,,,,,,,,,0.08013860881328583,,,,,, +29,171499,,,,,,,,,,,,0.06848584115505219,,,,,, +29,171549,,,,,,,,,,,,0.07694901525974274,,,,,, +29,171599,,,,,,,,,,,,0.08154237270355225,,,,,, +29,171649,,,,,,,,,,,,0.06702719628810883,,,,,, +29,171699,,,,,,,,,,,,0.0723964124917984,,,,,, +29,171749,,,,,,,,,,,,0.07882922887802124,,,,,, +29,171799,,,,,,,,,,,,0.08781572431325912,,,,,, +29,171849,,,,,,,,,,,,0.07299654185771942,,,,,, +29,171899,,,,,,,,,,,,0.07779556512832642,,,,,, +29,171949,,,,,,,,,,,,0.07644939422607422,,,,,, +29,171999,,,,,,,,,,,,0.07076036930084229,,,,,, +29,172049,,,,,,,,,,,,0.061603058129549026,,,,,, +29,172079,,,,,,,,,,,,,0.2457605004310608,0.08418840169906616,0.16646037995815277,-0.02144491672515869,0.1597411334514618,0.08418840169906616 +29,172079,,,,,,,0.2357553243637085,0.0760713517665863,0.2843361794948578,0.08083897829055786,0.2648555338382721,,,,,,, +30,172099,,,,,,,,,,,,0.07364428043365479,,,,,, +30,172149,,,,,,,,,,,,0.07280155271291733,,,,,, +30,172199,,,,,,,,,,,,0.09723304957151413,,,,,, +30,172249,,,,,,,,,,,,0.07715972512960434,,,,,, +30,172299,,,,,,,,,,,,0.0673530101776123,,,,,, +30,172349,,,,,,,,,,,,0.07181056588888168,,,,,, +30,172399,,,,,,,,,,,,0.08117439597845078,,,,,, +30,172449,,,,,,,,,,,,0.07497980445623398,,,,,, +30,172499,,,,,,,,,,,,0.07734113931655884,,,,,, +30,172549,,,,,,,,,,,,0.07954506576061249,,,,,, +30,172599,,,,,,,,,,,,0.07467257976531982,,,,,, +30,172649,,,,,,,,,,,,0.06764097511768341,,,,,, +30,172699,,,,,,,,,,,,0.07214857637882233,,,,,, +30,172749,,,,,,,,,,,,0.06944956630468369,,,,,, +30,172799,,,,,,,,,,,,0.07613854110240936,,,,,, +30,172849,,,,,,,,,,,,0.07396114617586136,,,,,, +30,172899,,,,,,,,,,,,0.07250015437602997,,,,,, +30,172949,,,,,,,,,,,,0.079224593937397,,,,,, +30,172999,,,,,,,,,,,,0.0699000358581543,,,,,, +30,173049,,,,,,,,,,,,0.084766685962677,,,,,, +30,173099,,,,,,,,,,,,0.075905442237854,,,,,, +30,173149,,,,,,,,,,,,0.0742836445569992,,,,,, +30,173199,,,,,,,,,,,,0.07741926610469818,,,,,, +30,173249,,,,,,,,,,,,0.08541348576545715,,,,,, +30,173299,,,,,,,,,,,,0.07130526006221771,,,,,, +30,173349,,,,,,,,,,,,0.0680033415555954,,,,,, +30,173399,,,,,,,,,,,,0.07686877995729446,,,,,, +30,173449,,,,,,,,,,,,0.07463614642620087,,,,,, +30,173499,,,,,,,,,,,,0.06775690615177155,,,,,, +30,173549,,,,,,,,,,,,0.07438329607248306,,,,,, +30,173599,,,,,,,,,,,,0.07704506814479828,,,,,, +30,173649,,,,,,,,,,,,0.07143034040927887,,,,,, +30,173699,,,,,,,,,,,,0.06876733899116516,,,,,, +30,173749,,,,,,,,,,,,0.07089720666408539,,,,,, +30,173799,,,,,,,,,,,,0.0865754559636116,,,,,, +30,173849,,,,,,,,,,,,0.07279300689697266,,,,,, +30,173899,,,,,,,,,,,,0.07861623167991638,,,,,, +30,173949,,,,,,,,,,,,0.07535664737224579,,,,,, +30,173999,,,,,,,,,,,,0.07362900674343109,,,,,, +30,174049,,,,,,,,,,,,0.08417341113090515,,,,,, +30,174099,,,,,,,,,,,,0.06057237833738327,,,,,, +30,174149,,,,,,,,,,,,0.0680282786488533,,,,,, +30,174199,,,,,,,,,,,,0.07067294418811798,,,,,, +30,174249,,,,,,,,,,,,0.08428868651390076,,,,,, +30,174299,,,,,,,,,,,,0.08537723124027252,,,,,, +30,174349,,,,,,,,,,,,0.08195610344409943,,,,,, +30,174399,,,,,,,,,,,,0.08395731449127197,,,,,, +30,174449,,,,,,,,,,,,0.06759708374738693,,,,,, +30,174499,,,,,,,,,,,,0.07810229063034058,,,,,, +30,174549,,,,,,,,,,,,0.07891228795051575,,,,,, +30,174599,,,,,,,,,,,,0.07623086869716644,,,,,, +30,174649,,,,,,,,,,,,0.07250736653804779,,,,,, +30,174699,,,,,,,,,,,,0.07607895135879517,,,,,, +30,174749,,,,,,,,,,,,0.06815718859434128,,,,,, +30,174799,,,,,,,,,,,,0.06484650075435638,,,,,, +30,174849,,,,,,,,,,,,0.0739843100309372,,,,,, +30,174899,,,,,,,,,,,,0.07127603888511658,,,,,, +30,174949,,,,,,,,,,,,0.06709733605384827,,,,,, +30,174999,,,,,,,,,,,,0.07763257622718811,,,,,, +30,175049,,,,,,,,,,,,0.08562234789133072,,,,,, +30,175099,,,,,,,,,,,,0.0739271268248558,,,,,, +30,175149,,,,,,,,,,,,0.07748033106327057,,,,,, +30,175199,,,,,,,,,,,,0.07985666394233704,,,,,, +30,175249,,,,,,,,,,,,0.06958923488855362,,,,,, +30,175299,,,,,,,,,,,,0.07903502881526947,,,,,, +30,175349,,,,,,,,,,,,0.07092820107936859,,,,,, +30,175399,,,,,,,,,,,,0.07909104973077774,,,,,, +30,175449,,,,,,,,,,,,0.09512042999267578,,,,,, +30,175499,,,,,,,,,,,,0.0867680013179779,,,,,, +30,175549,,,,,,,,,,,,0.07188495993614197,,,,,, +30,175599,,,,,,,,,,,,0.07898034155368805,,,,,, +30,175649,,,,,,,,,,,,0.07573927193880081,,,,,, +30,175699,,,,,,,,,,,,0.07867345958948135,,,,,, +30,175749,,,,,,,,,,,,0.0725526213645935,,,,,, +30,175799,,,,,,,,,,,,0.07376095652580261,,,,,, +30,175849,,,,,,,,,,,,0.07723300158977509,,,,,, +30,175899,,,,,,,,,,,,0.07877686619758606,,,,,, +30,175949,,,,,,,,,,,,0.08365660160779953,,,,,, +30,175999,,,,,,,,,,,,0.08017022162675858,,,,,, +30,176049,,,,,,,,,,,,0.09089086949825287,,,,,, +30,176099,,,,,,,,,,,,0.07825033366680145,,,,,, +30,176149,,,,,,,,,,,,0.09154880791902542,,,,,, +30,176199,,,,,,,,,,,,0.08915527164936066,,,,,, +30,176249,,,,,,,,,,,,0.06821131706237793,,,,,, +30,176299,,,,,,,,,,,,0.08227436244487762,,,,,, +30,176349,,,,,,,,,,,,0.07783021032810211,,,,,, +30,176399,,,,,,,,,,,,0.0797458067536354,,,,,, +30,176449,,,,,,,,,,,,0.08396728336811066,,,,,, +30,176499,,,,,,,,,,,,0.08131540566682816,,,,,, +30,176549,,,,,,,,,,,,0.07358530163764954,,,,,, +30,176599,,,,,,,,,,,,0.07473435997962952,,,,,, +30,176649,,,,,,,,,,,,0.07708357274532318,,,,,, +30,176699,,,,,,,,,,,,0.07320147752761841,,,,,, +30,176749,,,,,,,,,,,,0.06630834937095642,,,,,, +30,176799,,,,,,,,,,,,0.08176775276660919,,,,,, +30,176849,,,,,,,,,,,,0.07897968590259552,,,,,, +30,176899,,,,,,,,,,,,0.08575562387704849,,,,,, +30,176949,,,,,,,,,,,,0.07510321587324142,,,,,, +30,176999,,,,,,,,,,,,0.06490419805049896,,,,,, +30,177049,,,,,,,,,,,,0.08268486708402634,,,,,, +30,177099,,,,,,,,,,,,0.06954140216112137,,,,,, +30,177149,,,,,,,,,,,,0.06542447209358215,,,,,, +30,177199,,,,,,,,,,,,0.0896313488483429,,,,,, +30,177249,,,,,,,,,,,,0.08859368413686752,,,,,, +30,177299,,,,,,,,,,,,0.07318389415740967,,,,,, +30,177349,,,,,,,,,,,,0.06959305703639984,,,,,, +30,177399,,,,,,,,,,,,0.07637637108564377,,,,,, +30,177449,,,,,,,,,,,,0.07776699215173721,,,,,, +30,177499,,,,,,,,,,,,0.06823359429836273,,,,,, +30,177549,,,,,,,,,,,,0.06282003223896027,,,,,, +30,177599,,,,,,,,,,,,0.08153152465820312,,,,,, +30,177649,,,,,,,,,,,,0.08434590697288513,,,,,, +30,177699,,,,,,,,,,,,0.0699581727385521,,,,,, +30,177749,,,,,,,,,,,,0.08223960548639297,,,,,, +30,177799,,,,,,,,,,,,0.07980611175298691,,,,,, +30,177815,,,,,,,,,,,,,0.24617765843868256,0.08426367491483688,0.15856105089187622,-0.022358179092407227,0.1530609279870987,0.08426367491483688 +30,177815,,,,,,,0.23558409512043,0.07599528878927231,0.2859540581703186,0.08175212144851685,0.26693615317344666,,,,,,, +31,177849,,,,,,,,,,,,0.07630407810211182,,,,,, +31,177899,,,,,,,,,,,,0.07326341420412064,,,,,, +31,177949,,,,,,,,,,,,0.07737848162651062,,,,,, +31,177999,,,,,,,,,,,,0.07081779837608337,,,,,, +31,178049,,,,,,,,,,,,0.07194969058036804,,,,,, +31,178099,,,,,,,,,,,,0.08267079293727875,,,,,, +31,178149,,,,,,,,,,,,0.0775393471121788,,,,,, +31,178199,,,,,,,,,,,,0.07107489556074142,,,,,, +31,178249,,,,,,,,,,,,0.07624460011720657,,,,,, +31,178299,,,,,,,,,,,,0.08569950610399246,,,,,, +31,178349,,,,,,,,,,,,0.07943765819072723,,,,,, +31,178399,,,,,,,,,,,,0.0728936642408371,,,,,, +31,178449,,,,,,,,,,,,0.0730217844247818,,,,,, +31,178499,,,,,,,,,,,,0.08007268607616425,,,,,, +31,178549,,,,,,,,,,,,0.0764855444431305,,,,,, +31,178599,,,,,,,,,,,,0.07280364632606506,,,,,, +31,178649,,,,,,,,,,,,0.08361322432756424,,,,,, +31,178699,,,,,,,,,,,,0.07644633948802948,,,,,, +31,178749,,,,,,,,,,,,0.07899003475904465,,,,,, +31,178799,,,,,,,,,,,,0.07946394383907318,,,,,, +31,178849,,,,,,,,,,,,0.06960074603557587,,,,,, +31,178899,,,,,,,,,,,,0.07538612931966782,,,,,, +31,178949,,,,,,,,,,,,0.08190266788005829,,,,,, +31,178999,,,,,,,,,,,,0.0705639123916626,,,,,, +31,179049,,,,,,,,,,,,0.07033740729093552,,,,,, +31,179099,,,,,,,,,,,,0.07406772673130035,,,,,, +31,179149,,,,,,,,,,,,0.0802597925066948,,,,,, +31,179199,,,,,,,,,,,,0.05924580991268158,,,,,, +31,179249,,,,,,,,,,,,0.0789959505200386,,,,,, +31,179299,,,,,,,,,,,,0.0702756941318512,,,,,, +31,179349,,,,,,,,,,,,0.07419081777334213,,,,,, +31,179399,,,,,,,,,,,,0.08304286003112793,,,,,, +31,179449,,,,,,,,,,,,0.07072171568870544,,,,,, +31,179499,,,,,,,,,,,,0.07375947386026382,,,,,, +31,179549,,,,,,,,,,,,0.06329190731048584,,,,,, +31,179599,,,,,,,,,,,,0.07474444806575775,,,,,, +31,179649,,,,,,,,,,,,0.056319139897823334,,,,,, +31,179699,,,,,,,,,,,,0.07440543919801712,,,,,, +31,179749,,,,,,,,,,,,0.07984188944101334,,,,,, +31,179799,,,,,,,,,,,,0.06932328641414642,,,,,, +31,179849,,,,,,,,,,,,0.06943650543689728,,,,,, +31,179899,,,,,,,,,,,,0.07279229164123535,,,,,, +31,179949,,,,,,,,,,,,0.0743589997291565,,,,,, +31,179999,,,,,,,,,,,,0.0748622864484787,,,,,, +31,180049,,,,,,,,,,,,0.06393621116876602,,,,,, +31,180099,,,,,,,,,,,,0.07727211713790894,,,,,, +31,180149,,,,,,,,,,,,0.0751427412033081,,,,,, +31,180199,,,,,,,,,,,,0.07183241099119186,,,,,, +31,180249,,,,,,,,,,,,0.08767548948526382,,,,,, +31,180299,,,,,,,,,,,,0.07187788188457489,,,,,, +31,180349,,,,,,,,,,,,0.07862941920757294,,,,,, +31,180399,,,,,,,,,,,,0.0833289623260498,,,,,, +31,180449,,,,,,,,,,,,0.07508078217506409,,,,,, +31,180499,,,,,,,,,,,,0.08303006738424301,,,,,, +31,180549,,,,,,,,,,,,0.07428896427154541,,,,,, +31,180599,,,,,,,,,,,,0.08579035103321075,,,,,, +31,180649,,,,,,,,,,,,0.07383406907320023,,,,,, +31,180699,,,,,,,,,,,,0.07857583463191986,,,,,, +31,180749,,,,,,,,,,,,0.07898373901844025,,,,,, +31,180799,,,,,,,,,,,,0.08245849609375,,,,,, +31,180849,,,,,,,,,,,,0.08205746114253998,,,,,, +31,180899,,,,,,,,,,,,0.07680800557136536,,,,,, +31,180949,,,,,,,,,,,,0.08041208982467651,,,,,, +31,180999,,,,,,,,,,,,0.06556138396263123,,,,,, +31,181049,,,,,,,,,,,,0.0774710550904274,,,,,, +31,181099,,,,,,,,,,,,0.08939601480960846,,,,,, +31,181149,,,,,,,,,,,,0.06650695204734802,,,,,, +31,181199,,,,,,,,,,,,0.07874827086925507,,,,,, +31,181249,,,,,,,,,,,,0.07906877994537354,,,,,, +31,181299,,,,,,,,,,,,0.07584528625011444,,,,,, +31,181349,,,,,,,,,,,,0.07598929107189178,,,,,, +31,181399,,,,,,,,,,,,0.07699820399284363,,,,,, +31,181449,,,,,,,,,,,,0.08599100261926651,,,,,, +31,181499,,,,,,,,,,,,0.06528086215257645,,,,,, +31,181549,,,,,,,,,,,,0.07521440088748932,,,,,, +31,181599,,,,,,,,,,,,0.0886472836136818,,,,,, +31,181649,,,,,,,,,,,,0.08478717505931854,,,,,, +31,181699,,,,,,,,,,,,0.07507215440273285,,,,,, +31,181749,,,,,,,,,,,,0.06738100945949554,,,,,, +31,181799,,,,,,,,,,,,0.07589466869831085,,,,,, +31,181849,,,,,,,,,,,,0.07507730275392532,,,,,, +31,181899,,,,,,,,,,,,0.07392853498458862,,,,,, +31,181949,,,,,,,,,,,,0.0685446560382843,,,,,, +31,181999,,,,,,,,,,,,0.0878392681479454,,,,,, +31,182049,,,,,,,,,,,,0.07871852815151215,,,,,, +31,182099,,,,,,,,,,,,0.07719658315181732,,,,,, +31,182149,,,,,,,,,,,,0.06927457451820374,,,,,, +31,182199,,,,,,,,,,,,0.0728287324309349,,,,,, +31,182249,,,,,,,,,,,,0.07919768989086151,,,,,, +31,182299,,,,,,,,,,,,0.07135339081287384,,,,,, +31,182349,,,,,,,,,,,,0.07485232502222061,,,,,, +31,182399,,,,,,,,,,,,0.07106338441371918,,,,,, +31,182449,,,,,,,,,,,,0.07989071309566498,,,,,, +31,182499,,,,,,,,,,,,0.07100970298051834,,,,,, +31,182549,,,,,,,,,,,,0.08634422719478607,,,,,, +31,182599,,,,,,,,,,,,0.08361418545246124,,,,,, +31,182649,,,,,,,,,,,,0.07600130140781403,,,,,, +31,182699,,,,,,,,,,,,0.08524476736783981,,,,,, +31,182749,,,,,,,,,,,,0.07967241108417511,,,,,, +31,182799,,,,,,,,,,,,0.0794537365436554,,,,,, +31,182849,,,,,,,,,,,,0.07718659192323685,,,,,, +31,182899,,,,,,,,,,,,0.07465115189552307,,,,,, +31,182949,,,,,,,,,,,,0.07797490060329437,,,,,, +31,182999,,,,,,,,,,,,0.0699431374669075,,,,,, +31,183049,,,,,,,,,,,,0.06553838402032852,,,,,, +31,183099,,,,,,,,,,,,0.0695568174123764,,,,,, +31,183149,,,,,,,,,,,,0.08413200080394745,,,,,, +31,183199,,,,,,,,,,,,0.07431557029485703,,,,,, +31,183249,,,,,,,,,,,,0.06464920192956924,,,,,, +31,183299,,,,,,,,,,,,0.07660970091819763,,,,,, +31,183349,,,,,,,,,,,,0.08477690815925598,,,,,, +31,183399,,,,,,,,,,,,0.08521031588315964,,,,,, +31,183449,,,,,,,,,,,,0.08277905732393265,,,,,, +31,183499,,,,,,,,,,,,0.0653345137834549,,,,,, +31,183549,,,,,,,,,,,,0.06851776689291,,,,,, +31,183551,,,,,,,,,,,,,0.24647359549999237,0.08418579399585724,0.15484341979026794,-0.021413326263427734,0.15113812685012817,0.08418579399585724 +31,183551,,,,,,,0.23555956780910492,0.07597993314266205,0.2862842381000519,0.08195775747299194,0.26690933108329773,,,,,,, +32,183599,,,,,,,,,,,,0.07759419083595276,,,,,, +32,183649,,,,,,,,,,,,0.08721386641263962,,,,,, +32,183699,,,,,,,,,,,,0.07087820023298264,,,,,, +32,183749,,,,,,,,,,,,0.08316607773303986,,,,,, +32,183799,,,,,,,,,,,,0.06703060120344162,,,,,, +32,183849,,,,,,,,,,,,0.07949023693799973,,,,,, +32,183899,,,,,,,,,,,,0.09012097120285034,,,,,, +32,183949,,,,,,,,,,,,0.0674600601196289,,,,,, +32,183999,,,,,,,,,,,,0.08016562461853027,,,,,, +32,184049,,,,,,,,,,,,0.07891182601451874,,,,,, +32,184099,,,,,,,,,,,,0.08759292960166931,,,,,, +32,184149,,,,,,,,,,,,0.06821344047784805,,,,,, +32,184199,,,,,,,,,,,,0.07695974409580231,,,,,, +32,184249,,,,,,,,,,,,0.07908853888511658,,,,,, +32,184299,,,,,,,,,,,,0.08560386300086975,,,,,, +32,184349,,,,,,,,,,,,0.07441015541553497,,,,,, +32,184399,,,,,,,,,,,,0.07235077768564224,,,,,, +32,184449,,,,,,,,,,,,0.07860103249549866,,,,,, +32,184499,,,,,,,,,,,,0.06899452954530716,,,,,, +32,184549,,,,,,,,,,,,0.08825951814651489,,,,,, +32,184599,,,,,,,,,,,,0.07169466465711594,,,,,, +32,184649,,,,,,,,,,,,0.07089638710021973,,,,,, +32,184699,,,,,,,,,,,,0.08015631139278412,,,,,, +32,184749,,,,,,,,,,,,0.07932043075561523,,,,,, +32,184799,,,,,,,,,,,,0.07734625041484833,,,,,, +32,184849,,,,,,,,,,,,0.07233601808547974,,,,,, +32,184899,,,,,,,,,,,,0.08678627014160156,,,,,, +32,184949,,,,,,,,,,,,0.07903734594583511,,,,,, +32,184999,,,,,,,,,,,,0.07719709724187851,,,,,, +32,185049,,,,,,,,,,,,0.0637686625123024,,,,,, +32,185099,,,,,,,,,,,,0.08106526732444763,,,,,, +32,185149,,,,,,,,,,,,0.0660213977098465,,,,,, +32,185199,,,,,,,,,,,,0.09030672907829285,,,,,, +32,185249,,,,,,,,,,,,0.07975754886865616,,,,,, +32,185299,,,,,,,,,,,,0.07135426998138428,,,,,, +32,185349,,,,,,,,,,,,0.0716014951467514,,,,,, +32,185399,,,,,,,,,,,,0.06837331503629684,,,,,, +32,185449,,,,,,,,,,,,0.07749693840742111,,,,,, +32,185499,,,,,,,,,,,,0.07765497267246246,,,,,, +32,185549,,,,,,,,,,,,0.07541150599718094,,,,,, +32,185599,,,,,,,,,,,,0.08157522231340408,,,,,, +32,185649,,,,,,,,,,,,0.07259690761566162,,,,,, +32,185699,,,,,,,,,,,,0.07375191152095795,,,,,, +32,185749,,,,,,,,,,,,0.06547237932682037,,,,,, +32,185799,,,,,,,,,,,,0.07470209896564484,,,,,, +32,185849,,,,,,,,,,,,0.06925676763057709,,,,,, +32,185899,,,,,,,,,,,,0.0777207612991333,,,,,, +32,185949,,,,,,,,,,,,0.08231815695762634,,,,,, +32,185999,,,,,,,,,,,,0.07935003191232681,,,,,, +32,186049,,,,,,,,,,,,0.07860098034143448,,,,,, +32,186099,,,,,,,,,,,,0.07998847961425781,,,,,, +32,186149,,,,,,,,,,,,0.06997266411781311,,,,,, +32,186199,,,,,,,,,,,,0.0761938989162445,,,,,, +32,186249,,,,,,,,,,,,0.07102452218532562,,,,,, +32,186299,,,,,,,,,,,,0.06616261601448059,,,,,, +32,186349,,,,,,,,,,,,0.06858143210411072,,,,,, +32,186399,,,,,,,,,,,,0.07375715672969818,,,,,, +32,186449,,,,,,,,,,,,0.08781310170888901,,,,,, +32,186499,,,,,,,,,,,,0.07747229933738708,,,,,, +32,186549,,,,,,,,,,,,0.0755266547203064,,,,,, +32,186599,,,,,,,,,,,,0.0723356157541275,,,,,, +32,186649,,,,,,,,,,,,0.07822351157665253,,,,,, +32,186699,,,,,,,,,,,,0.06997248530387878,,,,,, +32,186749,,,,,,,,,,,,0.07484154403209686,,,,,, +32,186799,,,,,,,,,,,,0.08177569508552551,,,,,, +32,186849,,,,,,,,,,,,0.07077768445014954,,,,,, +32,186899,,,,,,,,,,,,0.066049724817276,,,,,, +32,186949,,,,,,,,,,,,0.08472272008657455,,,,,, +32,186999,,,,,,,,,,,,0.07382091879844666,,,,,, +32,187049,,,,,,,,,,,,0.07360231131315231,,,,,, +32,187099,,,,,,,,,,,,0.07858946919441223,,,,,, +32,187149,,,,,,,,,,,,0.07940389215946198,,,,,, +32,187199,,,,,,,,,,,,0.06785795837640762,,,,,, +32,187249,,,,,,,,,,,,0.0875781774520874,,,,,, +32,187299,,,,,,,,,,,,0.07836301624774933,,,,,, +32,187349,,,,,,,,,,,,0.08261825889348984,,,,,, +32,187399,,,,,,,,,,,,0.06486465781927109,,,,,, +32,187449,,,,,,,,,,,,0.08349111676216125,,,,,, +32,187499,,,,,,,,,,,,0.07363839447498322,,,,,, +32,187549,,,,,,,,,,,,0.07733809947967529,,,,,, +32,187599,,,,,,,,,,,,0.07722102105617523,,,,,, +32,187649,,,,,,,,,,,,0.0696590319275856,,,,,, +32,187699,,,,,,,,,,,,0.08062703907489777,,,,,, +32,187749,,,,,,,,,,,,0.06263498961925507,,,,,, +32,187799,,,,,,,,,,,,0.0731254518032074,,,,,, +32,187849,,,,,,,,,,,,0.07051044702529907,,,,,, +32,187899,,,,,,,,,,,,0.07688722759485245,,,,,, +32,187949,,,,,,,,,,,,0.07218469679355621,,,,,, +32,187999,,,,,,,,,,,,0.08729540556669235,,,,,, +32,188049,,,,,,,,,,,,0.0810975581407547,,,,,, +32,188099,,,,,,,,,,,,0.07095722109079361,,,,,, +32,188149,,,,,,,,,,,,0.09059282392263412,,,,,, +32,188199,,,,,,,,,,,,0.07149256765842438,,,,,, +32,188249,,,,,,,,,,,,0.08100815117359161,,,,,, +32,188299,,,,,,,,,,,,0.07522966712713242,,,,,, +32,188349,,,,,,,,,,,,0.06437607109546661,,,,,, +32,188399,,,,,,,,,,,,0.06459914147853851,,,,,, +32,188449,,,,,,,,,,,,0.08306647837162018,,,,,, +32,188499,,,,,,,,,,,,0.07641641795635223,,,,,, +32,188549,,,,,,,,,,,,0.08464226871728897,,,,,, +32,188599,,,,,,,,,,,,0.08059896528720856,,,,,, +32,188649,,,,,,,,,,,,0.07982268184423447,,,,,, +32,188699,,,,,,,,,,,,0.07134899497032166,,,,,, +32,188749,,,,,,,,,,,,0.08258984982967377,,,,,, +32,188799,,,,,,,,,,,,0.07795331627130508,,,,,, +32,188849,,,,,,,,,,,,0.0766475722193718,,,,,, +32,188899,,,,,,,,,,,,0.07597562670707703,,,,,, +32,188949,,,,,,,,,,,,0.07135456055402756,,,,,, +32,188999,,,,,,,,,,,,0.06546908617019653,,,,,, +32,189049,,,,,,,,,,,,0.06507499516010284,,,,,, +32,189099,,,,,,,,,,,,0.07508695125579834,,,,,, +32,189149,,,,,,,,,,,,0.06615720689296722,,,,,, +32,189199,,,,,,,,,,,,0.08004912734031677,,,,,, +32,189249,,,,,,,,,,,,0.07193635404109955,,,,,, +32,189287,,,,,,,,,,,,,0.24685873091220856,0.08487781137228012,0.15414245426654816,-0.02980947494506836,0.14769858121871948,0.08487781137228012 +32,189287,,,,,,,0.2352185845375061,0.0758276954293251,0.2894722521305084,0.08378756046295166,0.2703109681606293,,,,,,, +33,189299,,,,,,,,,,,,0.09166915714740753,,,,,, +33,189349,,,,,,,,,,,,0.06585683673620224,,,,,, +33,189399,,,,,,,,,,,,0.07551496475934982,,,,,, +33,189449,,,,,,,,,,,,0.08279198408126831,,,,,, +33,189499,,,,,,,,,,,,0.06539097428321838,,,,,, +33,189549,,,,,,,,,,,,0.0818604901432991,,,,,, +33,189599,,,,,,,,,,,,0.0630938708782196,,,,,, +33,189649,,,,,,,,,,,,0.07975392788648605,,,,,, +33,189699,,,,,,,,,,,,0.08292633295059204,,,,,, +33,189749,,,,,,,,,,,,0.07204191386699677,,,,,, +33,189799,,,,,,,,,,,,0.07760673761367798,,,,,, +33,189849,,,,,,,,,,,,0.07132311165332794,,,,,, +33,189899,,,,,,,,,,,,0.07705569267272949,,,,,, +33,189949,,,,,,,,,,,,0.07720895111560822,,,,,, +33,189999,,,,,,,,,,,,0.08227868378162384,,,,,, +33,190049,,,,,,,,,,,,0.0767098218202591,,,,,, +33,190099,,,,,,,,,,,,0.08280599117279053,,,,,, +33,190149,,,,,,,,,,,,0.07491287589073181,,,,,, +33,190199,,,,,,,,,,,,0.06967981904745102,,,,,, +33,190249,,,,,,,,,,,,0.07399778813123703,,,,,, +33,190299,,,,,,,,,,,,0.07531426101922989,,,,,, +33,190349,,,,,,,,,,,,0.08978734165430069,,,,,, +33,190399,,,,,,,,,,,,0.08880198001861572,,,,,, +33,190449,,,,,,,,,,,,0.07689599692821503,,,,,, +33,190499,,,,,,,,,,,,0.07415741682052612,,,,,, +33,190549,,,,,,,,,,,,0.07886770367622375,,,,,, +33,190599,,,,,,,,,,,,0.08108560740947723,,,,,, +33,190649,,,,,,,,,,,,0.07607956230640411,,,,,, +33,190699,,,,,,,,,,,,0.07615746557712555,,,,,, +33,190749,,,,,,,,,,,,0.0726621001958847,,,,,, +33,190799,,,,,,,,,,,,0.08953986316919327,,,,,, +33,190849,,,,,,,,,,,,0.07299754023551941,,,,,, +33,190899,,,,,,,,,,,,0.07065519690513611,,,,,, +33,190949,,,,,,,,,,,,0.07506483793258667,,,,,, +33,190999,,,,,,,,,,,,0.07753156125545502,,,,,, +33,191049,,,,,,,,,,,,0.07746712863445282,,,,,, +33,191099,,,,,,,,,,,,0.07880952954292297,,,,,, +33,191149,,,,,,,,,,,,0.07685409486293793,,,,,, +33,191199,,,,,,,,,,,,0.0817050188779831,,,,,, +33,191249,,,,,,,,,,,,0.07441308349370956,,,,,, +33,191299,,,,,,,,,,,,0.06954948604106903,,,,,, +33,191349,,,,,,,,,,,,0.07192059606313705,,,,,, +33,191399,,,,,,,,,,,,0.07570264488458633,,,,,, +33,191449,,,,,,,,,,,,0.0843309536576271,,,,,, +33,191499,,,,,,,,,,,,0.0816233679652214,,,,,, +33,191549,,,,,,,,,,,,0.07347194105386734,,,,,, +33,191599,,,,,,,,,,,,0.08143393695354462,,,,,, +33,191649,,,,,,,,,,,,0.08375854790210724,,,,,, +33,191699,,,,,,,,,,,,0.08010794967412949,,,,,, +33,191749,,,,,,,,,,,,0.07544608414173126,,,,,, +33,191799,,,,,,,,,,,,0.06456787884235382,,,,,, +33,191849,,,,,,,,,,,,0.07571595907211304,,,,,, +33,191899,,,,,,,,,,,,0.07629068195819855,,,,,, +33,191949,,,,,,,,,,,,0.07368811219930649,,,,,, +33,191999,,,,,,,,,,,,0.08294613659381866,,,,,, +33,192049,,,,,,,,,,,,0.0781688392162323,,,,,, +33,192099,,,,,,,,,,,,0.09359202533960342,,,,,, +33,192149,,,,,,,,,,,,0.0687604770064354,,,,,, +33,192199,,,,,,,,,,,,0.08842529356479645,,,,,, +33,192249,,,,,,,,,,,,0.07585258781909943,,,,,, +33,192299,,,,,,,,,,,,0.07869512587785721,,,,,, +33,192349,,,,,,,,,,,,0.06936203688383102,,,,,, +33,192399,,,,,,,,,,,,0.07457977533340454,,,,,, +33,192449,,,,,,,,,,,,0.07260684669017792,,,,,, +33,192499,,,,,,,,,,,,0.07926125824451447,,,,,, +33,192549,,,,,,,,,,,,0.07591520994901657,,,,,, +33,192599,,,,,,,,,,,,0.0721256285905838,,,,,, +33,192649,,,,,,,,,,,,0.07864946126937866,,,,,, +33,192699,,,,,,,,,,,,0.07952828705310822,,,,,, +33,192749,,,,,,,,,,,,0.0715082585811615,,,,,, +33,192799,,,,,,,,,,,,0.07609308511018753,,,,,, +33,192849,,,,,,,,,,,,0.07704544067382812,,,,,, +33,192899,,,,,,,,,,,,0.07612675428390503,,,,,, +33,192949,,,,,,,,,,,,0.07794692367315292,,,,,, +33,192999,,,,,,,,,,,,0.0817539393901825,,,,,, +33,193049,,,,,,,,,,,,0.06383902579545975,,,,,, +33,193099,,,,,,,,,,,,0.07328493893146515,,,,,, +33,193149,,,,,,,,,,,,0.07232654094696045,,,,,, +33,193199,,,,,,,,,,,,0.07660773396492004,,,,,, +33,193249,,,,,,,,,,,,0.07927855849266052,,,,,, +33,193299,,,,,,,,,,,,0.07951513677835464,,,,,, +33,193349,,,,,,,,,,,,0.06833825260400772,,,,,, +33,193399,,,,,,,,,,,,0.07303743809461594,,,,,, +33,193449,,,,,,,,,,,,0.07798928767442703,,,,,, +33,193499,,,,,,,,,,,,0.0684383437037468,,,,,, +33,193549,,,,,,,,,,,,0.0625910758972168,,,,,, +33,193599,,,,,,,,,,,,0.07063771039247513,,,,,, +33,193649,,,,,,,,,,,,0.08158136904239655,,,,,, +33,193699,,,,,,,,,,,,0.0773644894361496,,,,,, +33,193749,,,,,,,,,,,,0.08357560634613037,,,,,, +33,193799,,,,,,,,,,,,0.08417367935180664,,,,,, +33,193849,,,,,,,,,,,,0.07837414741516113,,,,,, +33,193899,,,,,,,,,,,,0.07902011275291443,,,,,, +33,193949,,,,,,,,,,,,0.0716324895620346,,,,,, +33,193999,,,,,,,,,,,,0.07542221248149872,,,,,, +33,194049,,,,,,,,,,,,0.07482294738292694,,,,,, +33,194099,,,,,,,,,,,,0.07905638217926025,,,,,, +33,194149,,,,,,,,,,,,0.0754423588514328,,,,,, +33,194199,,,,,,,,,,,,0.06795789301395416,,,,,, +33,194249,,,,,,,,,,,,0.08171763271093369,,,,,, +33,194299,,,,,,,,,,,,0.08082886040210724,,,,,, +33,194349,,,,,,,,,,,,0.0750034749507904,,,,,, +33,194399,,,,,,,,,,,,0.0839608907699585,,,,,, +33,194449,,,,,,,,,,,,0.08345447480678558,,,,,, +33,194499,,,,,,,,,,,,0.06967239826917648,,,,,, +33,194549,,,,,,,,,,,,0.07283429801464081,,,,,, +33,194599,,,,,,,,,,,,0.06781738996505737,,,,,, +33,194649,,,,,,,,,,,,0.08294721692800522,,,,,, +33,194699,,,,,,,,,,,,0.08646956831216812,,,,,, +33,194749,,,,,,,,,,,,0.0688110888004303,,,,,, +33,194799,,,,,,,,,,,,0.07882288098335266,,,,,, +33,194849,,,,,,,,,,,,0.07537217438220978,,,,,, +33,194899,,,,,,,,,,,,0.07670849561691284,,,,,, +33,194949,,,,,,,,,,,,0.06643647700548172,,,,,, +33,194999,,,,,,,,,,,,0.08205890655517578,,,,,, +33,195023,,,,,,,,,,,,,0.24587687849998474,0.08433495461940765,0.17071308195590973,-0.023223042488098145,0.16385437548160553,0.08433495461940765 +33,195023,,,,,,,0.23499645292758942,0.075674869120121,0.29263636469841003,0.08563971519470215,0.27185457944869995,,,,,,, +34,195049,,,,,,,,,,,,0.06992626190185547,,,,,, +34,195099,,,,,,,,,,,,0.07890313863754272,,,,,, +34,195149,,,,,,,,,,,,0.07681535929441452,,,,,, +34,195199,,,,,,,,,,,,0.08215921372175217,,,,,, +34,195249,,,,,,,,,,,,0.07530082762241364,,,,,, +34,195299,,,,,,,,,,,,0.08642462641000748,,,,,, +34,195349,,,,,,,,,,,,0.07118972390890121,,,,,, +34,195399,,,,,,,,,,,,0.06532816588878632,,,,,, +34,195449,,,,,,,,,,,,0.06629424542188644,,,,,, +34,195499,,,,,,,,,,,,0.08245598524808884,,,,,, +34,195549,,,,,,,,,,,,0.07955119758844376,,,,,, +34,195599,,,,,,,,,,,,0.0700322687625885,,,,,, +34,195649,,,,,,,,,,,,0.0698745921254158,,,,,, +34,195699,,,,,,,,,,,,0.0728013813495636,,,,,, +34,195749,,,,,,,,,,,,0.07813577353954315,,,,,, +34,195799,,,,,,,,,,,,0.07603363692760468,,,,,, +34,195849,,,,,,,,,,,,0.061498917639255524,,,,,, +34,195899,,,,,,,,,,,,0.08261404931545258,,,,,, +34,195949,,,,,,,,,,,,0.07361098378896713,,,,,, +34,195999,,,,,,,,,,,,0.07047680020332336,,,,,, +34,196049,,,,,,,,,,,,0.070685014128685,,,,,, +34,196099,,,,,,,,,,,,0.07450666278600693,,,,,, +34,196149,,,,,,,,,,,,0.06651700288057327,,,,,, +34,196199,,,,,,,,,,,,0.06836254894733429,,,,,, +34,196249,,,,,,,,,,,,0.07247095555067062,,,,,, +34,196299,,,,,,,,,,,,0.07542146742343903,,,,,, +34,196349,,,,,,,,,,,,0.06564410030841827,,,,,, +34,196399,,,,,,,,,,,,0.07968871295452118,,,,,, +34,196449,,,,,,,,,,,,0.0702347606420517,,,,,, +34,196499,,,,,,,,,,,,0.07061897218227386,,,,,, +34,196549,,,,,,,,,,,,0.07836814224720001,,,,,, +34,196599,,,,,,,,,,,,0.07103141397237778,,,,,, +34,196649,,,,,,,,,,,,0.07182226330041885,,,,,, +34,196699,,,,,,,,,,,,0.07781553268432617,,,,,, +34,196749,,,,,,,,,,,,0.07153993844985962,,,,,, +34,196799,,,,,,,,,,,,0.0750943198800087,,,,,, +34,196849,,,,,,,,,,,,0.07492183148860931,,,,,, +34,196899,,,,,,,,,,,,0.06734359264373779,,,,,, +34,196949,,,,,,,,,,,,0.06478749215602875,,,,,, +34,196999,,,,,,,,,,,,0.08510755747556686,,,,,, +34,197049,,,,,,,,,,,,0.08003593236207962,,,,,, +34,197099,,,,,,,,,,,,0.08158425986766815,,,,,, +34,197149,,,,,,,,,,,,0.0808916911482811,,,,,, +34,197199,,,,,,,,,,,,0.06808186322450638,,,,,, +34,197249,,,,,,,,,,,,0.08082139492034912,,,,,, +34,197299,,,,,,,,,,,,0.07857540994882584,,,,,, +34,197349,,,,,,,,,,,,0.08924932777881622,,,,,, +34,197399,,,,,,,,,,,,0.0803157389163971,,,,,, +34,197449,,,,,,,,,,,,0.0771961659193039,,,,,, +34,197499,,,,,,,,,,,,0.07268504798412323,,,,,, +34,197549,,,,,,,,,,,,0.07294328510761261,,,,,, +34,197599,,,,,,,,,,,,0.07843662798404694,,,,,, +34,197649,,,,,,,,,,,,0.07740140706300735,,,,,, +34,197699,,,,,,,,,,,,0.07935012876987457,,,,,, +34,197749,,,,,,,,,,,,0.09147128462791443,,,,,, +34,197799,,,,,,,,,,,,0.0724109336733818,,,,,, +34,197849,,,,,,,,,,,,0.07039573788642883,,,,,, +34,197899,,,,,,,,,,,,0.08494514971971512,,,,,, +34,197949,,,,,,,,,,,,0.07204069942235947,,,,,, +34,197999,,,,,,,,,,,,0.07344259321689606,,,,,, +34,198049,,,,,,,,,,,,0.07179592549800873,,,,,, +34,198099,,,,,,,,,,,,0.07032479345798492,,,,,, +34,198149,,,,,,,,,,,,0.08014694601297379,,,,,, +34,198199,,,,,,,,,,,,0.07857763767242432,,,,,, +34,198249,,,,,,,,,,,,0.08194797486066818,,,,,, +34,198299,,,,,,,,,,,,0.07346412539482117,,,,,, +34,198349,,,,,,,,,,,,0.07544852793216705,,,,,, +34,198399,,,,,,,,,,,,0.08419188857078552,,,,,, +34,198449,,,,,,,,,,,,0.07873930037021637,,,,,, +34,198499,,,,,,,,,,,,0.07785448431968689,,,,,, +34,198549,,,,,,,,,,,,0.06846344470977783,,,,,, +34,198599,,,,,,,,,,,,0.08561553061008453,,,,,, +34,198649,,,,,,,,,,,,0.07483197748661041,,,,,, +34,198699,,,,,,,,,,,,0.08223728835582733,,,,,, +34,198749,,,,,,,,,,,,0.08457492291927338,,,,,, +34,198799,,,,,,,,,,,,0.0688217431306839,,,,,, +34,198849,,,,,,,,,,,,0.07860168069601059,,,,,, +34,198899,,,,,,,,,,,,0.0637965127825737,,,,,, +34,198949,,,,,,,,,,,,0.08562847226858139,,,,,, +34,198999,,,,,,,,,,,,0.07105177640914917,,,,,, +34,199049,,,,,,,,,,,,0.07739332318305969,,,,,, +34,199099,,,,,,,,,,,,0.07182949781417847,,,,,, +34,199149,,,,,,,,,,,,0.07335635274648666,,,,,, +34,199199,,,,,,,,,,,,0.09388028085231781,,,,,, +34,199249,,,,,,,,,,,,0.09044510126113892,,,,,, +34,199299,,,,,,,,,,,,0.08591815084218979,,,,,, +34,199349,,,,,,,,,,,,0.06915858387947083,,,,,, +34,199399,,,,,,,,,,,,0.08354035019874573,,,,,, +34,199449,,,,,,,,,,,,0.0766126736998558,,,,,, +34,199499,,,,,,,,,,,,0.07632537186145782,,,,,, +34,199549,,,,,,,,,,,,0.06850986927747726,,,,,, +34,199599,,,,,,,,,,,,0.0774768516421318,,,,,, +34,199649,,,,,,,,,,,,0.0764823630452156,,,,,, +34,199699,,,,,,,,,,,,0.08538255095481873,,,,,, +34,199749,,,,,,,,,,,,0.07750020921230316,,,,,, +34,199799,,,,,,,,,,,,0.06409946084022522,,,,,, +34,199849,,,,,,,,,,,,0.08412608504295349,,,,,, +34,199899,,,,,,,,,,,,0.07018700987100601,,,,,, +34,199949,,,,,,,,,,,,0.07199694216251373,,,,,, +34,199999,,,,,,,,,,,,0.06982804834842682,,,,,, +34,200049,,,,,,,,,,,,0.07093019038438797,,,,,, +34,200099,,,,,,,,,,,,0.07302597165107727,,,,,, +34,200149,,,,,,,,,,,,0.08909060060977936,,,,,, +34,200199,,,,,,,,,,,,0.06985422968864441,,,,,, +34,200249,,,,,,,,,,,,0.07559210062026978,,,,,, +34,200299,,,,,,,,,,,,0.07892705500125885,,,,,, +34,200349,,,,,,,,,,,,0.08677171915769577,,,,,, +34,200399,,,,,,,,,,,,0.07102160900831223,,,,,, +34,200449,,,,,,,,,,,,0.08030755817890167,,,,,, +34,200499,,,,,,,,,,,,0.07686756551265717,,,,,, +34,200549,,,,,,,,,,,,0.0733996331691742,,,,,, +34,200599,,,,,,,,,,,,0.0778665840625763,,,,,, +34,200649,,,,,,,,,,,,0.08428645133972168,,,,,, +34,200699,,,,,,,,,,,,0.07856439054012299,,,,,, +34,200749,,,,,,,,,,,,0.06804175674915314,,,,,, +34,200759,,,,,,,,,,,,,0.2467862367630005,0.08521782606840134,0.16436387598514557,-0.033934831619262695,0.15912756323814392,0.08521782606840134 +34,200759,,,,,,,0.2348337322473526,0.07559061795473099,0.2943658232688904,0.08662724494934082,0.27373653650283813,,,,,,, +35,200799,,,,,,,,,,,,0.07809195667505264,,,,,, +35,200849,,,,,,,,,,,,0.06999657303094864,,,,,, +35,200899,,,,,,,,,,,,0.07429400086402893,,,,,, +35,200949,,,,,,,,,,,,0.07219022512435913,,,,,, +35,200999,,,,,,,,,,,,0.07079033553600311,,,,,, +35,201049,,,,,,,,,,,,0.07532612234354019,,,,,, +35,201099,,,,,,,,,,,,0.07726956903934479,,,,,, +35,201149,,,,,,,,,,,,0.06828033924102783,,,,,, +35,201199,,,,,,,,,,,,0.06955549120903015,,,,,, +35,201249,,,,,,,,,,,,0.08375158905982971,,,,,, +35,201299,,,,,,,,,,,,0.07217341661453247,,,,,, +35,201349,,,,,,,,,,,,0.08578383922576904,,,,,, +35,201399,,,,,,,,,,,,0.07739906013011932,,,,,, +35,201449,,,,,,,,,,,,0.06622540950775146,,,,,, +35,201499,,,,,,,,,,,,0.07070598751306534,,,,,, +35,201549,,,,,,,,,,,,0.0744471624493599,,,,,, +35,201599,,,,,,,,,,,,0.068514883518219,,,,,, +35,201649,,,,,,,,,,,,0.06512478739023209,,,,,, +35,201699,,,,,,,,,,,,0.07559137046337128,,,,,, +35,201749,,,,,,,,,,,,0.0755905881524086,,,,,, +35,201799,,,,,,,,,,,,0.08307662606239319,,,,,, +35,201849,,,,,,,,,,,,0.07000882178544998,,,,,, +35,201899,,,,,,,,,,,,0.08442907780408859,,,,,, +35,201949,,,,,,,,,,,,0.06973706185817719,,,,,, +35,201999,,,,,,,,,,,,0.07444813847541809,,,,,, +35,202049,,,,,,,,,,,,0.07765190303325653,,,,,, +35,202099,,,,,,,,,,,,0.0809539258480072,,,,,, +35,202149,,,,,,,,,,,,0.0794287621974945,,,,,, +35,202199,,,,,,,,,,,,0.07599949836730957,,,,,, +35,202249,,,,,,,,,,,,0.07067296653985977,,,,,, +35,202299,,,,,,,,,,,,0.08476928621530533,,,,,, +35,202349,,,,,,,,,,,,0.07091978192329407,,,,,, +35,202399,,,,,,,,,,,,0.08175738155841827,,,,,, +35,202449,,,,,,,,,,,,0.07692556083202362,,,,,, +35,202499,,,,,,,,,,,,0.07839389145374298,,,,,, +35,202549,,,,,,,,,,,,0.07211455702781677,,,,,, +35,202599,,,,,,,,,,,,0.07784511148929596,,,,,, +35,202649,,,,,,,,,,,,0.06665334850549698,,,,,, +35,202699,,,,,,,,,,,,0.07369263470172882,,,,,, +35,202749,,,,,,,,,,,,0.06630495190620422,,,,,, +35,202799,,,,,,,,,,,,0.07710081338882446,,,,,, +35,202849,,,,,,,,,,,,0.08374703675508499,,,,,, +35,202899,,,,,,,,,,,,0.06536079943180084,,,,,, +35,202949,,,,,,,,,,,,0.07348594814538956,,,,,, +35,202999,,,,,,,,,,,,0.073127880692482,,,,,, +35,203049,,,,,,,,,,,,0.07633394002914429,,,,,, +35,203099,,,,,,,,,,,,0.08343750238418579,,,,,, +35,203149,,,,,,,,,,,,0.07539090514183044,,,,,, +35,203199,,,,,,,,,,,,0.09473862498998642,,,,,, +35,203249,,,,,,,,,,,,0.09154053032398224,,,,,, +35,203299,,,,,,,,,,,,0.08784778416156769,,,,,, +35,203349,,,,,,,,,,,,0.08416536450386047,,,,,, +35,203399,,,,,,,,,,,,0.08734066784381866,,,,,, +35,203449,,,,,,,,,,,,0.07494289427995682,,,,,, +35,203499,,,,,,,,,,,,0.07766906917095184,,,,,, +35,203549,,,,,,,,,,,,0.07785152643918991,,,,,, +35,203599,,,,,,,,,,,,0.08146506547927856,,,,,, +35,203649,,,,,,,,,,,,0.07031098753213882,,,,,, +35,203699,,,,,,,,,,,,0.07321237027645111,,,,,, +35,203749,,,,,,,,,,,,0.06888889521360397,,,,,, +35,203799,,,,,,,,,,,,0.08387869596481323,,,,,, +35,203849,,,,,,,,,,,,0.08419638872146606,,,,,, +35,203899,,,,,,,,,,,,0.07671211659908295,,,,,, +35,203949,,,,,,,,,,,,0.07035539299249649,,,,,, +35,203999,,,,,,,,,,,,0.08174943178892136,,,,,, +35,204049,,,,,,,,,,,,0.08003348112106323,,,,,, +35,204099,,,,,,,,,,,,0.07591613382101059,,,,,, +35,204149,,,,,,,,,,,,0.06781552731990814,,,,,, +35,204199,,,,,,,,,,,,0.08820877224206924,,,,,, +35,204249,,,,,,,,,,,,0.07337205111980438,,,,,, +35,204299,,,,,,,,,,,,0.07429400086402893,,,,,, +35,204349,,,,,,,,,,,,0.07952709496021271,,,,,, +35,204399,,,,,,,,,,,,0.07204588502645493,,,,,, +35,204449,,,,,,,,,,,,0.0776931419968605,,,,,, +35,204499,,,,,,,,,,,,0.08368302881717682,,,,,, +35,204549,,,,,,,,,,,,0.07678627967834473,,,,,, +35,204599,,,,,,,,,,,,0.08132931590080261,,,,,, +35,204649,,,,,,,,,,,,0.07163268327713013,,,,,, +35,204699,,,,,,,,,,,,0.08995184302330017,,,,,, +35,204749,,,,,,,,,,,,0.07393936067819595,,,,,, +35,204799,,,,,,,,,,,,0.06756620854139328,,,,,, +35,204849,,,,,,,,,,,,0.07348018884658813,,,,,, +35,204899,,,,,,,,,,,,0.06723704934120178,,,,,, +35,204949,,,,,,,,,,,,0.06630496680736542,,,,,, +35,204999,,,,,,,,,,,,0.07170655578374863,,,,,, +35,205049,,,,,,,,,,,,0.08396726846694946,,,,,, +35,205099,,,,,,,,,,,,0.07480916380882263,,,,,, +35,205149,,,,,,,,,,,,0.06686503440141678,,,,,, +35,205199,,,,,,,,,,,,0.07091371715068817,,,,,, +35,205249,,,,,,,,,,,,0.06578150391578674,,,,,, +35,205299,,,,,,,,,,,,0.0738021656870842,,,,,, +35,205349,,,,,,,,,,,,0.07911321520805359,,,,,, +35,205399,,,,,,,,,,,,0.07702305912971497,,,,,, +35,205449,,,,,,,,,,,,0.07349582016468048,,,,,, +35,205499,,,,,,,,,,,,0.06646260619163513,,,,,, +35,205549,,,,,,,,,,,,0.07862992584705353,,,,,, +35,205599,,,,,,,,,,,,0.07353509962558746,,,,,, +35,205649,,,,,,,,,,,,0.08753915876150131,,,,,, +35,205699,,,,,,,,,,,,0.08002080023288727,,,,,, +35,205749,,,,,,,,,,,,0.07470251619815826,,,,,, +35,205799,,,,,,,,,,,,0.06964409351348877,,,,,, +35,205849,,,,,,,,,,,,0.07555410265922546,,,,,, +35,205899,,,,,,,,,,,,0.07645922899246216,,,,,, +35,205949,,,,,,,,,,,,0.0683518722653389,,,,,, +35,205999,,,,,,,,,,,,0.06937664747238159,,,,,, +35,206049,,,,,,,,,,,,0.08661302924156189,,,,,, +35,206099,,,,,,,,,,,,0.08272762596607208,,,,,, +35,206149,,,,,,,,,,,,0.06922546029090881,,,,,, +35,206199,,,,,,,,,,,,0.06919785588979721,,,,,, +35,206249,,,,,,,,,,,,0.08171644061803818,,,,,, +35,206299,,,,,,,,,,,,0.07781587541103363,,,,,, +35,206349,,,,,,,,,,,,0.08489404618740082,,,,,, +35,206399,,,,,,,,,,,,0.07821960747241974,,,,,, +35,206449,,,,,,,,,,,,0.08204388618469238,,,,,, +35,206495,,,,,,,,,,,,,0.24603882431983948,0.08423902839422226,0.153649240732193,-0.022059202194213867,0.14721772074699402,0.08423902839422226 +35,206495,,,,,,,0.23479492962360382,0.07560716569423676,0.294035404920578,0.08645075559616089,0.2735612988471985,,,,,,, +36,206499,,,,,,,,,,,,0.06895675510168076,,,,,, +36,206549,,,,,,,,,,,,0.06353885680437088,,,,,, +36,206599,,,,,,,,,,,,0.08204498142004013,,,,,, +36,206649,,,,,,,,,,,,0.07226284593343735,,,,,, +36,206699,,,,,,,,,,,,0.07265584170818329,,,,,, +36,206749,,,,,,,,,,,,0.06944243609905243,,,,,, +36,206799,,,,,,,,,,,,0.07036591321229935,,,,,, +36,206849,,,,,,,,,,,,0.0795590803027153,,,,,, +36,206899,,,,,,,,,,,,0.07589587569236755,,,,,, +36,206949,,,,,,,,,,,,0.08052580058574677,,,,,, +36,206999,,,,,,,,,,,,0.09278692305088043,,,,,, +36,207049,,,,,,,,,,,,0.061405740678310394,,,,,, +36,207099,,,,,,,,,,,,0.06490983068943024,,,,,, +36,207149,,,,,,,,,,,,0.07722654938697815,,,,,, +36,207199,,,,,,,,,,,,0.08192084729671478,,,,,, +36,207249,,,,,,,,,,,,0.07813305407762527,,,,,, +36,207299,,,,,,,,,,,,0.08085393905639648,,,,,, +36,207349,,,,,,,,,,,,0.06645533442497253,,,,,, +36,207399,,,,,,,,,,,,0.08743451535701752,,,,,, +36,207449,,,,,,,,,,,,0.07558254897594452,,,,,, +36,207499,,,,,,,,,,,,0.07664228975772858,,,,,, +36,207549,,,,,,,,,,,,0.07798174768686295,,,,,, +36,207599,,,,,,,,,,,,0.07456228882074356,,,,,, +36,207649,,,,,,,,,,,,0.07922759652137756,,,,,, +36,207699,,,,,,,,,,,,0.07848057895898819,,,,,, +36,207749,,,,,,,,,,,,0.0792887806892395,,,,,, +36,207799,,,,,,,,,,,,0.07236349582672119,,,,,, +36,207849,,,,,,,,,,,,0.08594723790884018,,,,,, +36,207899,,,,,,,,,,,,0.0723704993724823,,,,,, +36,207949,,,,,,,,,,,,0.07728858292102814,,,,,, +36,207999,,,,,,,,,,,,0.06944738328456879,,,,,, +36,208049,,,,,,,,,,,,0.07312840968370438,,,,,, +36,208099,,,,,,,,,,,,0.07062087208032608,,,,,, +36,208149,,,,,,,,,,,,0.07889361679553986,,,,,, +36,208199,,,,,,,,,,,,0.09551500529050827,,,,,, +36,208249,,,,,,,,,,,,0.07848910987377167,,,,,, +36,208299,,,,,,,,,,,,0.07367844879627228,,,,,, +36,208349,,,,,,,,,,,,0.054292723536491394,,,,,, +36,208399,,,,,,,,,,,,0.07487278431653976,,,,,, +36,208449,,,,,,,,,,,,0.07424886524677277,,,,,, +36,208499,,,,,,,,,,,,0.08061356842517853,,,,,, +36,208549,,,,,,,,,,,,0.0825158879160881,,,,,, +36,208599,,,,,,,,,,,,0.0757770836353302,,,,,, +36,208649,,,,,,,,,,,,0.07284428179264069,,,,,, +36,208699,,,,,,,,,,,,0.06931394338607788,,,,,, +36,208749,,,,,,,,,,,,0.08128329366445541,,,,,, +36,208799,,,,,,,,,,,,0.0834118202328682,,,,,, +36,208849,,,,,,,,,,,,0.07411853969097137,,,,,, +36,208899,,,,,,,,,,,,0.07039079815149307,,,,,, +36,208949,,,,,,,,,,,,0.0685386210680008,,,,,, +36,208999,,,,,,,,,,,,0.08991196751594543,,,,,, +36,209049,,,,,,,,,,,,0.08291658759117126,,,,,, +36,209099,,,,,,,,,,,,0.06575426459312439,,,,,, +36,209149,,,,,,,,,,,,0.06927970796823502,,,,,, +36,209199,,,,,,,,,,,,0.07283329218626022,,,,,, +36,209249,,,,,,,,,,,,0.08816266059875488,,,,,, +36,209299,,,,,,,,,,,,0.06259787082672119,,,,,, +36,209349,,,,,,,,,,,,0.07954728603363037,,,,,, +36,209399,,,,,,,,,,,,0.08194050937891006,,,,,, +36,209449,,,,,,,,,,,,0.07877761125564575,,,,,, +36,209499,,,,,,,,,,,,0.07698728144168854,,,,,, +36,209549,,,,,,,,,,,,0.07665125280618668,,,,,, +36,209599,,,,,,,,,,,,0.07566587626934052,,,,,, +36,209649,,,,,,,,,,,,0.0736033171415329,,,,,, +36,209699,,,,,,,,,,,,0.07033008337020874,,,,,, +36,209749,,,,,,,,,,,,0.07877315580844879,,,,,, +36,209799,,,,,,,,,,,,0.07149754464626312,,,,,, +36,209849,,,,,,,,,,,,0.07075230032205582,,,,,, +36,209899,,,,,,,,,,,,0.07749795913696289,,,,,, +36,209949,,,,,,,,,,,,0.07935747504234314,,,,,, +36,209999,,,,,,,,,,,,0.0797719657421112,,,,,, +36,210049,,,,,,,,,,,,0.06511245667934418,,,,,, +36,210099,,,,,,,,,,,,0.06956090033054352,,,,,, +36,210149,,,,,,,,,,,,0.08141355216503143,,,,,, +36,210199,,,,,,,,,,,,0.0746457576751709,,,,,, +36,210249,,,,,,,,,,,,0.08152421563863754,,,,,, +36,210299,,,,,,,,,,,,0.07516252249479294,,,,,, +36,210349,,,,,,,,,,,,0.0715450793504715,,,,,, +36,210399,,,,,,,,,,,,0.06957635283470154,,,,,, +36,210449,,,,,,,,,,,,0.06640604138374329,,,,,, +36,210499,,,,,,,,,,,,0.07665205001831055,,,,,, +36,210549,,,,,,,,,,,,0.08781920373439789,,,,,, +36,210599,,,,,,,,,,,,0.07348006218671799,,,,,, +36,210649,,,,,,,,,,,,0.06129079312086105,,,,,, +36,210699,,,,,,,,,,,,0.07010461390018463,,,,,, +36,210749,,,,,,,,,,,,0.0762709528207779,,,,,, +36,210799,,,,,,,,,,,,0.06499405205249786,,,,,, +36,210849,,,,,,,,,,,,0.08136247098445892,,,,,, +36,210899,,,,,,,,,,,,0.08742372691631317,,,,,, +36,210949,,,,,,,,,,,,0.07111027091741562,,,,,, +36,210999,,,,,,,,,,,,0.07535389810800552,,,,,, +36,211049,,,,,,,,,,,,0.06905423104763031,,,,,, +36,211099,,,,,,,,,,,,0.07976409792900085,,,,,, +36,211149,,,,,,,,,,,,0.06371952593326569,,,,,, +36,211199,,,,,,,,,,,,0.08617831021547318,,,,,, +36,211249,,,,,,,,,,,,0.0678117573261261,,,,,, +36,211299,,,,,,,,,,,,0.08567774295806885,,,,,, +36,211349,,,,,,,,,,,,0.07225579023361206,,,,,, +36,211399,,,,,,,,,,,,0.07733665406703949,,,,,, +36,211449,,,,,,,,,,,,0.07341859489679337,,,,,, +36,211499,,,,,,,,,,,,0.07046715170145035,,,,,, +36,211549,,,,,,,,,,,,0.07757560908794403,,,,,, +36,211599,,,,,,,,,,,,0.08224175870418549,,,,,, +36,211649,,,,,,,,,,,,0.0725744366645813,,,,,, +36,211699,,,,,,,,,,,,0.07509659975767136,,,,,, +36,211749,,,,,,,,,,,,0.07636472582817078,,,,,, +36,211799,,,,,,,,,,,,0.07662181556224823,,,,,, +36,211849,,,,,,,,,,,,0.08466775715351105,,,,,, +36,211899,,,,,,,,,,,,0.0765710175037384,,,,,, +36,211949,,,,,,,,,,,,0.07788340747356415,,,,,, +36,211999,,,,,,,,,,,,0.07397932559251785,,,,,, +36,212049,,,,,,,,,,,,0.07896071672439575,,,,,, +36,212099,,,,,,,,,,,,0.08195409178733826,,,,,, +36,212149,,,,,,,,,,,,0.07944752275943756,,,,,, +36,212199,,,,,,,,,,,,0.06797690689563751,,,,,, +36,212231,,,,,,,,,,,,,0.24605825543403625,0.08429925888776779,0.1630220115184784,-0.022789955139160156,0.15566688776016235,0.08429925888776779 +36,212231,,,,,,,0.23476091027259827,0.07556147873401642,0.29496827721595764,0.0869913101196289,0.2744240462779999,,,,,,, +37,212249,,,,,,,,,,,,0.05926970764994621,,,,,, +37,212299,,,,,,,,,,,,0.067270427942276,,,,,, +37,212349,,,,,,,,,,,,0.0708731859922409,,,,,, +37,212399,,,,,,,,,,,,0.06983575224876404,,,,,, +37,212449,,,,,,,,,,,,0.09059831500053406,,,,,, +37,212499,,,,,,,,,,,,0.0721779614686966,,,,,, +37,212549,,,,,,,,,,,,0.07519656419754028,,,,,, +37,212599,,,,,,,,,,,,0.07109464704990387,,,,,, +37,212649,,,,,,,,,,,,0.08102051168680191,,,,,, +37,212699,,,,,,,,,,,,0.07023538649082184,,,,,, +37,212749,,,,,,,,,,,,0.08396394550800323,,,,,, +37,212799,,,,,,,,,,,,0.07976313680410385,,,,,, +37,212849,,,,,,,,,,,,0.07424260675907135,,,,,, +37,212899,,,,,,,,,,,,0.07225558161735535,,,,,, +37,212949,,,,,,,,,,,,0.09236884862184525,,,,,, +37,212999,,,,,,,,,,,,0.07661959528923035,,,,,, +37,213049,,,,,,,,,,,,0.08560165017843246,,,,,, +37,213099,,,,,,,,,,,,0.06690698862075806,,,,,, +37,213149,,,,,,,,,,,,0.07466351985931396,,,,,, +37,213199,,,,,,,,,,,,0.07002870738506317,,,,,, +37,213249,,,,,,,,,,,,0.08524024486541748,,,,,, +37,213299,,,,,,,,,,,,0.07680293172597885,,,,,, +37,213349,,,,,,,,,,,,0.08310101926326752,,,,,, +37,213399,,,,,,,,,,,,0.06893377006053925,,,,,, +37,213449,,,,,,,,,,,,0.08319547772407532,,,,,, +37,213499,,,,,,,,,,,,0.06768369674682617,,,,,, +37,213549,,,,,,,,,,,,0.07270041108131409,,,,,, +37,213599,,,,,,,,,,,,0.08913484215736389,,,,,, +37,213649,,,,,,,,,,,,0.07374728471040726,,,,,, +37,213699,,,,,,,,,,,,0.07369665801525116,,,,,, +37,213749,,,,,,,,,,,,0.06321436166763306,,,,,, +37,213799,,,,,,,,,,,,0.07212015986442566,,,,,, +37,213849,,,,,,,,,,,,0.0761132538318634,,,,,, +37,213899,,,,,,,,,,,,0.0688747763633728,,,,,, +37,213949,,,,,,,,,,,,0.06645696610212326,,,,,, +37,213999,,,,,,,,,,,,0.08158555626869202,,,,,, +37,214049,,,,,,,,,,,,0.06560064107179642,,,,,, +37,214099,,,,,,,,,,,,0.08296337723731995,,,,,, +37,214149,,,,,,,,,,,,0.07055078446865082,,,,,, +37,214199,,,,,,,,,,,,0.07417294383049011,,,,,, +37,214249,,,,,,,,,,,,0.060365937650203705,,,,,, +37,214299,,,,,,,,,,,,0.06785763055086136,,,,,, +37,214349,,,,,,,,,,,,0.06783679127693176,,,,,, +37,214399,,,,,,,,,,,,0.08240589499473572,,,,,, +37,214449,,,,,,,,,,,,0.06860925257205963,,,,,, +37,214499,,,,,,,,,,,,0.07977432012557983,,,,,, +37,214549,,,,,,,,,,,,0.07428313791751862,,,,,, +37,214599,,,,,,,,,,,,0.07671033591032028,,,,,, +37,214649,,,,,,,,,,,,0.06925296783447266,,,,,, +37,214699,,,,,,,,,,,,0.07013066112995148,,,,,, +37,214749,,,,,,,,,,,,0.06663551926612854,,,,,, +37,214799,,,,,,,,,,,,0.07775712758302689,,,,,, +37,214849,,,,,,,,,,,,0.07850965857505798,,,,,, +37,214899,,,,,,,,,,,,0.08403337001800537,,,,,, +37,214949,,,,,,,,,,,,0.08487285673618317,,,,,, +37,214999,,,,,,,,,,,,0.06711111962795258,,,,,, +37,215049,,,,,,,,,,,,0.077015221118927,,,,,, +37,215099,,,,,,,,,,,,0.06834238022565842,,,,,, +37,215149,,,,,,,,,,,,0.08034124970436096,,,,,, +37,215199,,,,,,,,,,,,0.08324240148067474,,,,,, +37,215249,,,,,,,,,,,,0.07183778285980225,,,,,, +37,215299,,,,,,,,,,,,0.07272721081972122,,,,,, +37,215349,,,,,,,,,,,,0.08423355221748352,,,,,, +37,215399,,,,,,,,,,,,0.06210590526461601,,,,,, +37,215449,,,,,,,,,,,,0.06892101466655731,,,,,, +37,215499,,,,,,,,,,,,0.07546097040176392,,,,,, +37,215549,,,,,,,,,,,,0.06357370316982269,,,,,, +37,215599,,,,,,,,,,,,0.06742174923419952,,,,,, +37,215649,,,,,,,,,,,,0.07390128076076508,,,,,, +37,215699,,,,,,,,,,,,0.08287826180458069,,,,,, +37,215749,,,,,,,,,,,,0.07538720965385437,,,,,, +37,215799,,,,,,,,,,,,0.08546845614910126,,,,,, +37,215849,,,,,,,,,,,,0.08547025173902512,,,,,, +37,215899,,,,,,,,,,,,0.08331212401390076,,,,,, +37,215949,,,,,,,,,,,,0.0787225216627121,,,,,, +37,215999,,,,,,,,,,,,0.08102861791849136,,,,,, +37,216049,,,,,,,,,,,,0.0842500627040863,,,,,, +37,216099,,,,,,,,,,,,0.07281043380498886,,,,,, +37,216149,,,,,,,,,,,,0.0710330531001091,,,,,, +37,216199,,,,,,,,,,,,0.08545655012130737,,,,,, +37,216249,,,,,,,,,,,,0.06410461664199829,,,,,, +37,216299,,,,,,,,,,,,0.08842497318983078,,,,,, +37,216349,,,,,,,,,,,,0.06652282923460007,,,,,, +37,216399,,,,,,,,,,,,0.08721253275871277,,,,,, +37,216449,,,,,,,,,,,,0.08417965471744537,,,,,, +37,216499,,,,,,,,,,,,0.07974406331777573,,,,,, +37,216549,,,,,,,,,,,,0.0906749814748764,,,,,, +37,216599,,,,,,,,,,,,0.07765460014343262,,,,,, +37,216649,,,,,,,,,,,,0.06256768107414246,,,,,, +37,216699,,,,,,,,,,,,0.07767760753631592,,,,,, +37,216749,,,,,,,,,,,,0.07438809424638748,,,,,, +37,216799,,,,,,,,,,,,0.07776986807584763,,,,,, +37,216849,,,,,,,,,,,,0.07891370356082916,,,,,, +37,216899,,,,,,,,,,,,0.07236698269844055,,,,,, +37,216949,,,,,,,,,,,,0.08454809337854385,,,,,, +37,216999,,,,,,,,,,,,0.07598386704921722,,,,,, +37,217049,,,,,,,,,,,,0.08058235794305801,,,,,, +37,217099,,,,,,,,,,,,0.06476785987615585,,,,,, +37,217149,,,,,,,,,,,,0.07464703917503357,,,,,, +37,217199,,,,,,,,,,,,0.06665157526731491,,,,,, +37,217249,,,,,,,,,,,,0.07357951998710632,,,,,, +37,217299,,,,,,,,,,,,0.07490895688533783,,,,,, +37,217349,,,,,,,,,,,,0.08994662761688232,,,,,, +37,217399,,,,,,,,,,,,0.07261110097169876,,,,,, +37,217449,,,,,,,,,,,,0.06938505172729492,,,,,, +37,217499,,,,,,,,,,,,0.06966785341501236,,,,,, +37,217549,,,,,,,,,,,,0.06997282803058624,,,,,, +37,217599,,,,,,,,,,,,0.0831976979970932,,,,,, +37,217649,,,,,,,,,,,,0.07623618841171265,,,,,, +37,217699,,,,,,,,,,,,0.06017196178436279,,,,,, +37,217749,,,,,,,,,,,,0.07824394851922989,,,,,, +37,217799,,,,,,,,,,,,0.05650048330426216,,,,,, +37,217849,,,,,,,,,,,,0.0705169066786766,,,,,, +37,217899,,,,,,,,,,,,0.07812711596488953,,,,,, +37,217949,,,,,,,,,,,,0.07652438431978226,,,,,, +37,217967,,,,,,,,,,,,,0.2466127574443817,0.08505239337682724,0.16726741194725037,-0.03192770481109619,0.16097533702850342,0.08505239337682724 +37,217967,,,,,,,0.23464855551719666,0.07548851519823074,0.2964521050453186,0.0878785252571106,0.27578604221343994,,,,,,, +38,217999,,,,,,,,,,,,0.08559965342283249,,,,,, +38,218049,,,,,,,,,,,,0.07655651122331619,,,,,, +38,218099,,,,,,,,,,,,0.08121013641357422,,,,,, +38,218149,,,,,,,,,,,,0.07255827635526657,,,,,, +38,218199,,,,,,,,,,,,0.08117492496967316,,,,,, +38,218249,,,,,,,,,,,,0.07426378130912781,,,,,, +38,218299,,,,,,,,,,,,0.07788145542144775,,,,,, +38,218349,,,,,,,,,,,,0.08058526366949081,,,,,, +38,218399,,,,,,,,,,,,0.07363316416740417,,,,,, +38,218449,,,,,,,,,,,,0.06418322026729584,,,,,, +38,218499,,,,,,,,,,,,0.07976645231246948,,,,,, +38,218549,,,,,,,,,,,,0.07069125771522522,,,,,, +38,218599,,,,,,,,,,,,0.06470955908298492,,,,,, +38,218649,,,,,,,,,,,,0.0788346454501152,,,,,, +38,218699,,,,,,,,,,,,0.08136776834726334,,,,,, +38,218749,,,,,,,,,,,,0.08094118535518646,,,,,, +38,218799,,,,,,,,,,,,0.09568056464195251,,,,,, +38,218849,,,,,,,,,,,,0.07329080253839493,,,,,, +38,218899,,,,,,,,,,,,0.07147882133722305,,,,,, +38,218949,,,,,,,,,,,,0.0736599713563919,,,,,, +38,218999,,,,,,,,,,,,0.06979350745677948,,,,,, +38,219049,,,,,,,,,,,,0.08625424653291702,,,,,, +38,219099,,,,,,,,,,,,0.07444939017295837,,,,,, +38,219149,,,,,,,,,,,,0.07550492882728577,,,,,, +38,219199,,,,,,,,,,,,0.0737728476524353,,,,,, +38,219249,,,,,,,,,,,,0.08022863417863846,,,,,, +38,219299,,,,,,,,,,,,0.07942323386669159,,,,,, +38,219349,,,,,,,,,,,,0.07166248559951782,,,,,, +38,219399,,,,,,,,,,,,0.07946093380451202,,,,,, +38,219449,,,,,,,,,,,,0.06371307373046875,,,,,, +38,219499,,,,,,,,,,,,0.07882626354694366,,,,,, +38,219549,,,,,,,,,,,,0.07665543258190155,,,,,, +38,219599,,,,,,,,,,,,0.09002785384654999,,,,,, +38,219649,,,,,,,,,,,,0.07371063530445099,,,,,, +38,219699,,,,,,,,,,,,0.08479580283164978,,,,,, +38,219749,,,,,,,,,,,,0.08415780961513519,,,,,, +38,219799,,,,,,,,,,,,0.07026846706867218,,,,,, +38,219849,,,,,,,,,,,,0.07071568071842194,,,,,, +38,219899,,,,,,,,,,,,0.06943759322166443,,,,,, +38,219949,,,,,,,,,,,,0.07609260827302933,,,,,, +38,219999,,,,,,,,,,,,0.07925926148891449,,,,,, +38,220049,,,,,,,,,,,,0.07176979631185532,,,,,, +38,220099,,,,,,,,,,,,0.09233372658491135,,,,,, +38,220149,,,,,,,,,,,,0.07863841950893402,,,,,, +38,220199,,,,,,,,,,,,0.07770980894565582,,,,,, +38,220249,,,,,,,,,,,,0.06927718222141266,,,,,, +38,220299,,,,,,,,,,,,0.0699576884508133,,,,,, +38,220349,,,,,,,,,,,,0.07507568597793579,,,,,, +38,220399,,,,,,,,,,,,0.08568111062049866,,,,,, +38,220449,,,,,,,,,,,,0.07524125277996063,,,,,, +38,220499,,,,,,,,,,,,0.07359790802001953,,,,,, +38,220549,,,,,,,,,,,,0.08070610463619232,,,,,, +38,220599,,,,,,,,,,,,0.07746408134698868,,,,,, +38,220649,,,,,,,,,,,,0.08083196729421616,,,,,, +38,220699,,,,,,,,,,,,0.07173824310302734,,,,,, +38,220749,,,,,,,,,,,,0.07929602265357971,,,,,, +38,220799,,,,,,,,,,,,0.07626104354858398,,,,,, +38,220849,,,,,,,,,,,,0.06898675858974457,,,,,, +38,220899,,,,,,,,,,,,0.08158065378665924,,,,,, +38,220949,,,,,,,,,,,,0.0810302346944809,,,,,, +38,220999,,,,,,,,,,,,0.0757129043340683,,,,,, +38,221049,,,,,,,,,,,,0.07031024992465973,,,,,, +38,221099,,,,,,,,,,,,0.07279704511165619,,,,,, +38,221149,,,,,,,,,,,,0.06972319632768631,,,,,, +38,221199,,,,,,,,,,,,0.08181683719158173,,,,,, +38,221249,,,,,,,,,,,,0.07712551206350327,,,,,, +38,221299,,,,,,,,,,,,0.0765923261642456,,,,,, +38,221349,,,,,,,,,,,,0.07245955616235733,,,,,, +38,221399,,,,,,,,,,,,0.0865640640258789,,,,,, +38,221449,,,,,,,,,,,,0.08087214827537537,,,,,, +38,221499,,,,,,,,,,,,0.071932353079319,,,,,, +38,221549,,,,,,,,,,,,0.08037449419498444,,,,,, +38,221599,,,,,,,,,,,,0.06496655941009521,,,,,, +38,221649,,,,,,,,,,,,0.09281964600086212,,,,,, +38,221699,,,,,,,,,,,,0.07557468116283417,,,,,, +38,221749,,,,,,,,,,,,0.08126076310873032,,,,,, +38,221799,,,,,,,,,,,,0.07601965963840485,,,,,, +38,221849,,,,,,,,,,,,0.08314242959022522,,,,,, +38,221899,,,,,,,,,,,,0.07619646191596985,,,,,, +38,221949,,,,,,,,,,,,0.07524219155311584,,,,,, +38,221999,,,,,,,,,,,,0.06219057738780975,,,,,, +38,222049,,,,,,,,,,,,0.07456830888986588,,,,,, +38,222099,,,,,,,,,,,,0.062247928231954575,,,,,, +38,222149,,,,,,,,,,,,0.07539793103933334,,,,,, +38,222199,,,,,,,,,,,,0.0770753026008606,,,,,, +38,222249,,,,,,,,,,,,0.0841955617070198,,,,,, +38,222299,,,,,,,,,,,,0.08516184985637665,,,,,, +38,222349,,,,,,,,,,,,0.07671913504600525,,,,,, +38,222399,,,,,,,,,,,,0.07748180627822876,,,,,, +38,222449,,,,,,,,,,,,0.06581750512123108,,,,,, +38,222499,,,,,,,,,,,,0.07964293658733368,,,,,, +38,222549,,,,,,,,,,,,0.06783831119537354,,,,,, +38,222599,,,,,,,,,,,,0.07468368858098984,,,,,, +38,222649,,,,,,,,,,,,0.07665768265724182,,,,,, +38,222699,,,,,,,,,,,,0.07725584506988525,,,,,, +38,222749,,,,,,,,,,,,0.07417003810405731,,,,,, +38,222799,,,,,,,,,,,,0.06621433794498444,,,,,, +38,222849,,,,,,,,,,,,0.06571583449840546,,,,,, +38,222899,,,,,,,,,,,,0.07027745246887207,,,,,, +38,222949,,,,,,,,,,,,0.0800744891166687,,,,,, +38,222999,,,,,,,,,,,,0.07352974265813828,,,,,, +38,223049,,,,,,,,,,,,0.07370391488075256,,,,,, +38,223099,,,,,,,,,,,,0.08324535936117172,,,,,, +38,223149,,,,,,,,,,,,0.06529644876718521,,,,,, +38,223199,,,,,,,,,,,,0.07425479590892792,,,,,, +38,223249,,,,,,,,,,,,0.0754178985953331,,,,,, +38,223299,,,,,,,,,,,,0.061157628893852234,,,,,, +38,223349,,,,,,,,,,,,0.05850993096828461,,,,,, +38,223399,,,,,,,,,,,,0.0957522988319397,,,,,, +38,223449,,,,,,,,,,,,0.07232217490673065,,,,,, +38,223499,,,,,,,,,,,,0.07870188355445862,,,,,, +38,223549,,,,,,,,,,,,0.07247556000947952,,,,,, +38,223599,,,,,,,,,,,,0.07229441404342651,,,,,, +38,223649,,,,,,,,,,,,0.06659626960754395,,,,,, +38,223699,,,,,,,,,,,,0.07405371963977814,,,,,, +38,223703,,,,,,,,,,,,,0.24576309323310852,0.08426970988512039,0.17080840468406677,-0.022431492805480957,0.16360589861869812,0.08426970988512039 +38,223703,,,,,,,0.23440390825271606,0.07542245090007782,0.2978123128414154,0.08868873119354248,0.27756187319755554,,,,,,, +39,223749,,,,,,,,,,,,0.06838294863700867,,,,,, +39,223799,,,,,,,,,,,,0.07869629561901093,,,,,, +39,223849,,,,,,,,,,,,0.08751998841762543,,,,,, +39,223899,,,,,,,,,,,,0.0853561982512474,,,,,, +39,223949,,,,,,,,,,,,0.08413121104240417,,,,,, +39,223999,,,,,,,,,,,,0.06705384701490402,,,,,, +39,224049,,,,,,,,,,,,0.06165745109319687,,,,,, +39,224099,,,,,,,,,,,,0.07492892444133759,,,,,, +39,224149,,,,,,,,,,,,0.08987326920032501,,,,,, +39,224199,,,,,,,,,,,,0.0855347141623497,,,,,, +39,224249,,,,,,,,,,,,0.07718165218830109,,,,,, +39,224299,,,,,,,,,,,,0.07477685809135437,,,,,, +39,224349,,,,,,,,,,,,0.06833591312170029,,,,,, +39,224399,,,,,,,,,,,,0.06907635927200317,,,,,, +39,224449,,,,,,,,,,,,0.08344166725873947,,,,,, +39,224499,,,,,,,,,,,,0.08590087294578552,,,,,, +39,224549,,,,,,,,,,,,0.07030047476291656,,,,,, +39,224599,,,,,,,,,,,,0.08106431365013123,,,,,, +39,224649,,,,,,,,,,,,0.07211904227733612,,,,,, +39,224699,,,,,,,,,,,,0.06673416495323181,,,,,, +39,224749,,,,,,,,,,,,0.0681813433766365,,,,,, +39,224799,,,,,,,,,,,,0.07375844568014145,,,,,, +39,224849,,,,,,,,,,,,0.06446989625692368,,,,,, +39,224899,,,,,,,,,,,,0.08167729526758194,,,,,, +39,224949,,,,,,,,,,,,0.0819220319390297,,,,,, +39,224999,,,,,,,,,,,,0.07569055259227753,,,,,, +39,225049,,,,,,,,,,,,0.08260110020637512,,,,,, +39,225099,,,,,,,,,,,,0.06818018853664398,,,,,, +39,225149,,,,,,,,,,,,0.07583075761795044,,,,,, +39,225199,,,,,,,,,,,,0.0651378184556961,,,,,, +39,225249,,,,,,,,,,,,0.07338081300258636,,,,,, +39,225299,,,,,,,,,,,,0.05351274833083153,,,,,, +39,225349,,,,,,,,,,,,0.07205076515674591,,,,,, +39,225399,,,,,,,,,,,,0.07309450209140778,,,,,, +39,225449,,,,,,,,,,,,0.08878576755523682,,,,,, +39,225499,,,,,,,,,,,,0.06491893529891968,,,,,, +39,225549,,,,,,,,,,,,0.06226923316717148,,,,,, +39,225599,,,,,,,,,,,,0.0677097737789154,,,,,, +39,225649,,,,,,,,,,,,0.07135461270809174,,,,,, +39,225699,,,,,,,,,,,,0.06289663165807724,,,,,, +39,225749,,,,,,,,,,,,0.06916216015815735,,,,,, +39,225799,,,,,,,,,,,,0.06839923560619354,,,,,, +39,225849,,,,,,,,,,,,0.07797560095787048,,,,,, +39,225899,,,,,,,,,,,,0.07606889307498932,,,,,, +39,225949,,,,,,,,,,,,0.06853622943162918,,,,,, +39,225999,,,,,,,,,,,,0.0641876608133316,,,,,, +39,226049,,,,,,,,,,,,0.06550848484039307,,,,,, +39,226099,,,,,,,,,,,,0.07575710117816925,,,,,, +39,226149,,,,,,,,,,,,0.06885258853435516,,,,,, +39,226199,,,,,,,,,,,,0.07220078259706497,,,,,, +39,226249,,,,,,,,,,,,0.08386072516441345,,,,,, +39,226299,,,,,,,,,,,,0.07156754285097122,,,,,, +39,226349,,,,,,,,,,,,0.07577090710401535,,,,,, +39,226399,,,,,,,,,,,,0.07046208530664444,,,,,, +39,226449,,,,,,,,,,,,0.07107328623533249,,,,,, +39,226499,,,,,,,,,,,,0.06817442178726196,,,,,, +39,226549,,,,,,,,,,,,0.08009780943393707,,,,,, +39,226599,,,,,,,,,,,,0.07844206690788269,,,,,, +39,226649,,,,,,,,,,,,0.08343987911939621,,,,,, +39,226699,,,,,,,,,,,,0.08473827689886093,,,,,, +39,226749,,,,,,,,,,,,0.07895633578300476,,,,,, +39,226799,,,,,,,,,,,,0.0860593318939209,,,,,, +39,226849,,,,,,,,,,,,0.08741746097803116,,,,,, +39,226899,,,,,,,,,,,,0.07219594717025757,,,,,, +39,226949,,,,,,,,,,,,0.06862746179103851,,,,,, +39,226999,,,,,,,,,,,,0.07533209025859833,,,,,, +39,227049,,,,,,,,,,,,0.06354696303606033,,,,,, +39,227099,,,,,,,,,,,,0.06923018395900726,,,,,, +39,227149,,,,,,,,,,,,0.08312725275754929,,,,,, +39,227199,,,,,,,,,,,,0.07584632188081741,,,,,, +39,227249,,,,,,,,,,,,0.07609133422374725,,,,,, +39,227299,,,,,,,,,,,,0.07903032749891281,,,,,, +39,227349,,,,,,,,,,,,0.07242900133132935,,,,,, +39,227399,,,,,,,,,,,,0.08154836297035217,,,,,, +39,227449,,,,,,,,,,,,0.07591355592012405,,,,,, +39,227499,,,,,,,,,,,,0.07658568024635315,,,,,, +39,227549,,,,,,,,,,,,0.06724146008491516,,,,,, +39,227599,,,,,,,,,,,,0.07419615238904953,,,,,, +39,227649,,,,,,,,,,,,0.0921969786286354,,,,,, +39,227699,,,,,,,,,,,,0.07273958623409271,,,,,, +39,227749,,,,,,,,,,,,0.07253387570381165,,,,,, +39,227799,,,,,,,,,,,,0.08101247251033783,,,,,, +39,227849,,,,,,,,,,,,0.06934121996164322,,,,,, +39,227899,,,,,,,,,,,,0.06744396686553955,,,,,, +39,227949,,,,,,,,,,,,0.07323169708251953,,,,,, +39,227999,,,,,,,,,,,,0.07119196653366089,,,,,, +39,228049,,,,,,,,,,,,0.08130586892366409,,,,,, +39,228099,,,,,,,,,,,,0.08861178159713745,,,,,, +39,228149,,,,,,,,,,,,0.07828451693058014,,,,,, +39,228199,,,,,,,,,,,,0.07353059947490692,,,,,, +39,228249,,,,,,,,,,,,0.07789961993694305,,,,,, +39,228299,,,,,,,,,,,,0.07016007602214813,,,,,, +39,228349,,,,,,,,,,,,0.07296687364578247,,,,,, +39,228399,,,,,,,,,,,,0.06622764468193054,,,,,, +39,228449,,,,,,,,,,,,0.07053017616271973,,,,,, +39,228499,,,,,,,,,,,,0.06126268580555916,,,,,, +39,228549,,,,,,,,,,,,0.07459615170955658,,,,,, +39,228599,,,,,,,,,,,,0.07404159009456635,,,,,, +39,228649,,,,,,,,,,,,0.09183192253112793,,,,,, +39,228699,,,,,,,,,,,,0.07711051404476166,,,,,, +39,228749,,,,,,,,,,,,0.06677775084972382,,,,,, +39,228799,,,,,,,,,,,,0.06817875802516937,,,,,, +39,228849,,,,,,,,,,,,0.08064082264900208,,,,,, +39,228899,,,,,,,,,,,,0.07898826897144318,,,,,, +39,228949,,,,,,,,,,,,0.08271759748458862,,,,,, +39,228999,,,,,,,,,,,,0.06426693499088287,,,,,, +39,229049,,,,,,,,,,,,0.08356683701276779,,,,,, +39,229099,,,,,,,,,,,,0.07483692467212677,,,,,, +39,229149,,,,,,,,,,,,0.07789401710033417,,,,,, +39,229199,,,,,,,,,,,,0.07329118251800537,,,,,, +39,229249,,,,,,,,,,,,0.08225191384553909,,,,,, +39,229299,,,,,,,,,,,,0.07758811861276627,,,,,, +39,229349,,,,,,,,,,,,0.07232051342725754,,,,,, +39,229399,,,,,,,,,,,,0.07299961149692535,,,,,, +39,229439,,,,,,,,,,,,,0.24679405987262726,0.08485442399978638,0.1518036276102066,-0.0295257568359375,0.1439092606306076,0.08485442399978638 +39,229439,,,,,,,0.23438945412635803,0.07559210062026978,0.2945202589035034,0.08663821220397949,0.2780809998512268,,,,,,, +40,229449,,,,,,,,,,,,0.08271424472332001,,,,,, +40,229499,,,,,,,,,,,,0.0678798258304596,,,,,, +40,229549,,,,,,,,,,,,0.07721035927534103,,,,,, +40,229599,,,,,,,,,,,,0.08121026307344437,,,,,, +40,229649,,,,,,,,,,,,0.0795893520116806,,,,,, +40,229699,,,,,,,,,,,,0.08312048763036728,,,,,, +40,229749,,,,,,,,,,,,0.07415781915187836,,,,,, +40,229799,,,,,,,,,,,,0.07294338196516037,,,,,, +40,229849,,,,,,,,,,,,0.08513103425502777,,,,,, +40,229899,,,,,,,,,,,,0.07643480598926544,,,,,, +40,229949,,,,,,,,,,,,0.08033376932144165,,,,,, +40,229999,,,,,,,,,,,,0.08199666440486908,,,,,, +40,230049,,,,,,,,,,,,0.0786934345960617,,,,,, +40,230099,,,,,,,,,,,,0.07860591262578964,,,,,, +40,230149,,,,,,,,,,,,0.07724501192569733,,,,,, +40,230199,,,,,,,,,,,,0.07979456335306168,,,,,, +40,230249,,,,,,,,,,,,0.07816536724567413,,,,,, +40,230299,,,,,,,,,,,,0.08403710275888443,,,,,, +40,230349,,,,,,,,,,,,0.06928963959217072,,,,,, +40,230399,,,,,,,,,,,,0.07689869403839111,,,,,, +40,230449,,,,,,,,,,,,0.07567152380943298,,,,,, +40,230499,,,,,,,,,,,,0.07001100480556488,,,,,, +40,230549,,,,,,,,,,,,0.07473652064800262,,,,,, +40,230599,,,,,,,,,,,,0.07446566969156265,,,,,, +40,230649,,,,,,,,,,,,0.09172895550727844,,,,,, +40,230699,,,,,,,,,,,,0.06706763058900833,,,,,, +40,230749,,,,,,,,,,,,0.07603985071182251,,,,,, +40,230799,,,,,,,,,,,,0.06957698613405228,,,,,, +40,230849,,,,,,,,,,,,0.07454763352870941,,,,,, +40,230899,,,,,,,,,,,,0.07733848690986633,,,,,, +40,230949,,,,,,,,,,,,0.08343897014856339,,,,,, +40,230999,,,,,,,,,,,,0.08560749888420105,,,,,, +40,231049,,,,,,,,,,,,0.07515941560268402,,,,,, +40,231099,,,,,,,,,,,,0.07925595343112946,,,,,, +40,231149,,,,,,,,,,,,0.07250376045703888,,,,,, +40,231199,,,,,,,,,,,,0.08114518225193024,,,,,, +40,231249,,,,,,,,,,,,0.07209215313196182,,,,,, +40,231299,,,,,,,,,,,,0.06630457192659378,,,,,, +40,231349,,,,,,,,,,,,0.0784962847828865,,,,,, +40,231399,,,,,,,,,,,,0.07873255014419556,,,,,, +40,231449,,,,,,,,,,,,0.07651626318693161,,,,,, +40,231499,,,,,,,,,,,,0.06842934340238571,,,,,, +40,231549,,,,,,,,,,,,0.08490149676799774,,,,,, +40,231599,,,,,,,,,,,,0.05784076079726219,,,,,, +40,231649,,,,,,,,,,,,0.09506452083587646,,,,,, +40,231699,,,,,,,,,,,,0.07254093885421753,,,,,, +40,231749,,,,,,,,,,,,0.06911242753267288,,,,,, +40,231799,,,,,,,,,,,,0.07993209362030029,,,,,, +40,231849,,,,,,,,,,,,0.08041857928037643,,,,,, +40,231899,,,,,,,,,,,,0.07484029233455658,,,,,, +40,231949,,,,,,,,,,,,0.07952103018760681,,,,,, +40,231999,,,,,,,,,,,,0.07737597823143005,,,,,, +40,232049,,,,,,,,,,,,0.07758565992116928,,,,,, +40,232099,,,,,,,,,,,,0.06720764935016632,,,,,, +40,232149,,,,,,,,,,,,0.06647869199514389,,,,,, +40,232199,,,,,,,,,,,,0.07551327347755432,,,,,, +40,232249,,,,,,,,,,,,0.077065110206604,,,,,, +40,232299,,,,,,,,,,,,0.06895856559276581,,,,,, +40,232349,,,,,,,,,,,,0.07151629775762558,,,,,, +40,232399,,,,,,,,,,,,0.07406331598758698,,,,,, +40,232449,,,,,,,,,,,,0.07840704172849655,,,,,, +40,232499,,,,,,,,,,,,0.07599294185638428,,,,,, +40,232549,,,,,,,,,,,,0.08056299388408661,,,,,, +40,232599,,,,,,,,,,,,0.06615389883518219,,,,,, +40,232649,,,,,,,,,,,,0.07837247848510742,,,,,, +40,232699,,,,,,,,,,,,0.0725206583738327,,,,,, +40,232749,,,,,,,,,,,,0.07211259752511978,,,,,, +40,232799,,,,,,,,,,,,0.07845834642648697,,,,,, +40,232849,,,,,,,,,,,,0.08252377063035965,,,,,, +40,232899,,,,,,,,,,,,0.0687279999256134,,,,,, +40,232949,,,,,,,,,,,,0.06469494849443436,,,,,, +40,232999,,,,,,,,,,,,0.07497924566268921,,,,,, +40,233049,,,,,,,,,,,,0.06085386127233505,,,,,, +40,233099,,,,,,,,,,,,0.09077872335910797,,,,,, +40,233149,,,,,,,,,,,,0.07242324948310852,,,,,, +40,233199,,,,,,,,,,,,0.07167565822601318,,,,,, +40,233249,,,,,,,,,,,,0.08135905116796494,,,,,, +40,233299,,,,,,,,,,,,0.07724516838788986,,,,,, +40,233349,,,,,,,,,,,,0.08362337946891785,,,,,, +40,233399,,,,,,,,,,,,0.08323277533054352,,,,,, +40,233449,,,,,,,,,,,,0.07264670729637146,,,,,, +40,233499,,,,,,,,,,,,0.08605870604515076,,,,,, +40,233549,,,,,,,,,,,,0.0763644278049469,,,,,, +40,233599,,,,,,,,,,,,0.07154679298400879,,,,,, +40,233649,,,,,,,,,,,,0.07444798946380615,,,,,, +40,233699,,,,,,,,,,,,0.08615509420633316,,,,,, +40,233749,,,,,,,,,,,,0.07830125093460083,,,,,, +40,233799,,,,,,,,,,,,0.06222767382860184,,,,,, +40,233849,,,,,,,,,,,,0.07489714026451111,,,,,, +40,233899,,,,,,,,,,,,0.07914358377456665,,,,,, +40,233949,,,,,,,,,,,,0.07045752555131912,,,,,, +40,233999,,,,,,,,,,,,0.07721460610628128,,,,,, +40,234049,,,,,,,,,,,,0.07701457291841507,,,,,, +40,234099,,,,,,,,,,,,0.08091040700674057,,,,,, +40,234149,,,,,,,,,,,,0.07384781539440155,,,,,, +40,234199,,,,,,,,,,,,0.08107613027095795,,,,,, +40,234249,,,,,,,,,,,,0.06474624574184418,,,,,, +40,234299,,,,,,,,,,,,0.08921833336353302,,,,,, +40,234349,,,,,,,,,,,,0.06705610454082489,,,,,, +40,234399,,,,,,,,,,,,0.07485800236463547,,,,,, +40,234449,,,,,,,,,,,,0.06942176073789597,,,,,, +40,234499,,,,,,,,,,,,0.07401307672262192,,,,,, +40,234549,,,,,,,,,,,,0.08787760138511658,,,,,, +40,234599,,,,,,,,,,,,0.0699876919388771,,,,,, +40,234649,,,,,,,,,,,,0.06427838653326035,,,,,, +40,234699,,,,,,,,,,,,0.068002849817276,,,,,, +40,234749,,,,,,,,,,,,0.070418581366539,,,,,, +40,234799,,,,,,,,,,,,0.07480616867542267,,,,,, +40,234849,,,,,,,,,,,,0.06901822984218597,,,,,, +40,234899,,,,,,,,,,,,0.08071289211511612,,,,,, +40,234949,,,,,,,,,,,,0.07746774703264236,,,,,, +40,234999,,,,,,,,,,,,0.07089930772781372,,,,,, +40,235049,,,,,,,,,,,,0.08190266788005829,,,,,, +40,235099,,,,,,,,,,,,0.06529773771762848,,,,,, +40,235149,,,,,,,,,,,,0.07616723328828812,,,,,, +40,235175,,,,,,,,,,,,,0.24662625789642334,0.08530104160308838,0.16661660373210907,-0.03494441509246826,0.16005241870880127,0.08530104160308838 +40,235175,,,,,,,0.23430582880973816,0.07530286908149719,0.3002116084098816,0.09012705087661743,0.27948594093322754,,,,,,, +41,235199,,,,,,,,,,,,0.07759259641170502,,,,,, +41,235249,,,,,,,,,,,,0.0850023627281189,,,,,, +41,235299,,,,,,,,,,,,0.06433930993080139,,,,,, +41,235349,,,,,,,,,,,,0.07589054107666016,,,,,, +41,235399,,,,,,,,,,,,0.08062736690044403,,,,,, +41,235449,,,,,,,,,,,,0.07140110433101654,,,,,, +41,235499,,,,,,,,,,,,0.07566453516483307,,,,,, +41,235549,,,,,,,,,,,,0.07870329916477203,,,,,, +41,235599,,,,,,,,,,,,0.0780164897441864,,,,,, +41,235649,,,,,,,,,,,,0.07602166384458542,,,,,, +41,235699,,,,,,,,,,,,0.07794348895549774,,,,,, +41,235749,,,,,,,,,,,,0.07892162352800369,,,,,, +41,235799,,,,,,,,,,,,0.07118761539459229,,,,,, +41,235849,,,,,,,,,,,,0.08194233477115631,,,,,, +41,235899,,,,,,,,,,,,0.06864776462316513,,,,,, +41,235949,,,,,,,,,,,,0.07304831594228745,,,,,, +41,235999,,,,,,,,,,,,0.07391306757926941,,,,,, +41,236049,,,,,,,,,,,,0.07908764481544495,,,,,, +41,236099,,,,,,,,,,,,0.0798492282629013,,,,,, +41,236149,,,,,,,,,,,,0.07514572888612747,,,,,, +41,236199,,,,,,,,,,,,0.07639776170253754,,,,,, +41,236249,,,,,,,,,,,,0.08968809992074966,,,,,, +41,236299,,,,,,,,,,,,0.07238449156284332,,,,,, +41,236349,,,,,,,,,,,,0.07042375206947327,,,,,, +41,236399,,,,,,,,,,,,0.08527882397174835,,,,,, +41,236449,,,,,,,,,,,,0.08075672388076782,,,,,, +41,236499,,,,,,,,,,,,0.07365301251411438,,,,,, +41,236549,,,,,,,,,,,,0.07028083503246307,,,,,, +41,236599,,,,,,,,,,,,0.06874173879623413,,,,,, +41,236649,,,,,,,,,,,,0.07041618973016739,,,,,, +41,236699,,,,,,,,,,,,0.07939893007278442,,,,,, +41,236749,,,,,,,,,,,,0.07683099806308746,,,,,, +41,236799,,,,,,,,,,,,0.06930110603570938,,,,,, +41,236849,,,,,,,,,,,,0.07463616132736206,,,,,, +41,236899,,,,,,,,,,,,0.0698537528514862,,,,,, +41,236949,,,,,,,,,,,,0.07384111732244492,,,,,, +41,236999,,,,,,,,,,,,0.0686374306678772,,,,,, +41,237049,,,,,,,,,,,,0.0794455036520958,,,,,, +41,237099,,,,,,,,,,,,0.0665266215801239,,,,,, +41,237149,,,,,,,,,,,,0.09308046102523804,,,,,, +41,237199,,,,,,,,,,,,0.07954433560371399,,,,,, +41,237249,,,,,,,,,,,,0.07675707340240479,,,,,, +41,237299,,,,,,,,,,,,0.06805252283811569,,,,,, +41,237349,,,,,,,,,,,,0.07738321274518967,,,,,, +41,237399,,,,,,,,,,,,0.0764017105102539,,,,,, +41,237449,,,,,,,,,,,,0.07293929159641266,,,,,, +41,237499,,,,,,,,,,,,0.0661451667547226,,,,,, +41,237549,,,,,,,,,,,,0.07528891414403915,,,,,, +41,237599,,,,,,,,,,,,0.06027263402938843,,,,,, +41,237649,,,,,,,,,,,,0.06851087510585785,,,,,, +41,237699,,,,,,,,,,,,0.06497576087713242,,,,,, +41,237749,,,,,,,,,,,,0.07159677147865295,,,,,, +41,237799,,,,,,,,,,,,0.06844288110733032,,,,,, +41,237849,,,,,,,,,,,,0.08391183614730835,,,,,, +41,237899,,,,,,,,,,,,0.061957042664289474,,,,,, +41,237949,,,,,,,,,,,,0.08601994812488556,,,,,, +41,237999,,,,,,,,,,,,0.07922980934381485,,,,,, +41,238049,,,,,,,,,,,,0.08010940998792648,,,,,, +41,238099,,,,,,,,,,,,0.07308059930801392,,,,,, +41,238149,,,,,,,,,,,,0.0725608617067337,,,,,, +41,238199,,,,,,,,,,,,0.07167845964431763,,,,,, +41,238249,,,,,,,,,,,,0.06971654295921326,,,,,, +41,238299,,,,,,,,,,,,0.07258340716362,,,,,, +41,238349,,,,,,,,,,,,0.06567433476448059,,,,,, +41,238399,,,,,,,,,,,,0.07063928246498108,,,,,, +41,238449,,,,,,,,,,,,0.07568083703517914,,,,,, +41,238499,,,,,,,,,,,,0.07931546866893768,,,,,, +41,238549,,,,,,,,,,,,0.08627106994390488,,,,,, +41,238599,,,,,,,,,,,,0.0713491290807724,,,,,, +41,238649,,,,,,,,,,,,0.06914782524108887,,,,,, +41,238699,,,,,,,,,,,,0.08480718731880188,,,,,, +41,238749,,,,,,,,,,,,0.08396860957145691,,,,,, +41,238799,,,,,,,,,,,,0.0737123116850853,,,,,, +41,238849,,,,,,,,,,,,0.07576623558998108,,,,,, +41,238899,,,,,,,,,,,,0.0827372595667839,,,,,, +41,238949,,,,,,,,,,,,0.08119586110115051,,,,,, +41,238999,,,,,,,,,,,,0.07526370882987976,,,,,, +41,239049,,,,,,,,,,,,0.0791734978556633,,,,,, +41,239099,,,,,,,,,,,,0.08839575201272964,,,,,, +41,239149,,,,,,,,,,,,0.0777788907289505,,,,,, +41,239199,,,,,,,,,,,,0.08969972282648087,,,,,, +41,239249,,,,,,,,,,,,0.06797036528587341,,,,,, +41,239299,,,,,,,,,,,,0.0633891150355339,,,,,, +41,239349,,,,,,,,,,,,0.07976435124874115,,,,,, +41,239399,,,,,,,,,,,,0.08131486177444458,,,,,, +41,239449,,,,,,,,,,,,0.06480233371257782,,,,,, +41,239499,,,,,,,,,,,,0.08701260387897491,,,,,, +41,239549,,,,,,,,,,,,0.07345300167798996,,,,,, +41,239599,,,,,,,,,,,,0.06746919453144073,,,,,, +41,239649,,,,,,,,,,,,0.07982206344604492,,,,,, +41,239699,,,,,,,,,,,,0.0778903216123581,,,,,, +41,239749,,,,,,,,,,,,0.07506318390369415,,,,,, +41,239799,,,,,,,,,,,,0.0735226422548294,,,,,, +41,239849,,,,,,,,,,,,0.07918596267700195,,,,,, +41,239899,,,,,,,,,,,,0.07154423743486404,,,,,, +41,239949,,,,,,,,,,,,0.08001739531755447,,,,,, +41,239999,,,,,,,,,,,,0.0789327546954155,,,,,, +41,240049,,,,,,,,,,,,0.07334786653518677,,,,,, +41,240099,,,,,,,,,,,,0.07330430299043655,,,,,, +41,240149,,,,,,,,,,,,0.07440657913684845,,,,,, +41,240199,,,,,,,,,,,,0.07884465157985687,,,,,, +41,240249,,,,,,,,,,,,0.09209725260734558,,,,,, +41,240299,,,,,,,,,,,,0.07299907505512238,,,,,, +41,240349,,,,,,,,,,,,0.07824405282735825,,,,,, +41,240399,,,,,,,,,,,,0.07614578306674957,,,,,, +41,240449,,,,,,,,,,,,0.0802091509103775,,,,,, +41,240499,,,,,,,,,,,,0.08301527798175812,,,,,, +41,240549,,,,,,,,,,,,0.07327660173177719,,,,,, +41,240599,,,,,,,,,,,,0.06847085803747177,,,,,, +41,240649,,,,,,,,,,,,0.0720595121383667,,,,,, +41,240699,,,,,,,,,,,,0.07713992893695831,,,,,, +41,240749,,,,,,,,,,,,0.0746658444404602,,,,,, +41,240799,,,,,,,,,,,,0.06917193531990051,,,,,, +41,240849,,,,,,,,,,,,0.07568622380495071,,,,,, +41,240899,,,,,,,,,,,,0.08419825881719589,,,,,, +41,240911,,,,,,,,,,,,,0.24692955613136292,0.08501758426427841,0.1542970836162567,-0.03150534629821777,0.14603297412395477,0.08501758426427841 +41,240911,,,,,,,0.23433293402194977,0.07535884529352188,0.29909130930900574,0.08944720029830933,0.27928492426872253,,,,,,, +42,240949,,,,,,,,,,,,0.0718856230378151,,,,,, +42,240999,,,,,,,,,,,,0.08141320943832397,,,,,, +42,241049,,,,,,,,,,,,0.0754861831665039,,,,,, +42,241099,,,,,,,,,,,,0.08538050949573517,,,,,, +42,241149,,,,,,,,,,,,0.07219301909208298,,,,,, +42,241199,,,,,,,,,,,,0.07526405155658722,,,,,, +42,241249,,,,,,,,,,,,0.07114305347204208,,,,,, +42,241299,,,,,,,,,,,,0.0742209255695343,,,,,, +42,241349,,,,,,,,,,,,0.08118493854999542,,,,,, +42,241399,,,,,,,,,,,,0.08606456220149994,,,,,, +42,241449,,,,,,,,,,,,0.0755409300327301,,,,,, +42,241499,,,,,,,,,,,,0.08758505433797836,,,,,, +42,241549,,,,,,,,,,,,0.07536359131336212,,,,,, +42,241599,,,,,,,,,,,,0.07630300521850586,,,,,, +42,241649,,,,,,,,,,,,0.06998772919178009,,,,,, +42,241699,,,,,,,,,,,,0.0785764753818512,,,,,, +42,241749,,,,,,,,,,,,0.07166850566864014,,,,,, +42,241799,,,,,,,,,,,,0.08020228147506714,,,,,, +42,241849,,,,,,,,,,,,0.06967737525701523,,,,,, +42,241899,,,,,,,,,,,,0.06988021731376648,,,,,, +42,241949,,,,,,,,,,,,0.07844872772693634,,,,,, +42,241999,,,,,,,,,,,,0.07770496606826782,,,,,, +42,242049,,,,,,,,,,,,0.065445676445961,,,,,, +42,242099,,,,,,,,,,,,0.07162025570869446,,,,,, +42,242149,,,,,,,,,,,,0.06962113082408905,,,,,, +42,242199,,,,,,,,,,,,0.08044731616973877,,,,,, +42,242249,,,,,,,,,,,,0.08152516186237335,,,,,, +42,242299,,,,,,,,,,,,0.09385727345943451,,,,,, +42,242349,,,,,,,,,,,,0.08034239709377289,,,,,, +42,242399,,,,,,,,,,,,0.07322260737419128,,,,,, +42,242449,,,,,,,,,,,,0.08123478293418884,,,,,, +42,242499,,,,,,,,,,,,0.07864278554916382,,,,,, +42,242549,,,,,,,,,,,,0.07804074883460999,,,,,, +42,242599,,,,,,,,,,,,0.07467332482337952,,,,,, +42,242649,,,,,,,,,,,,0.0735267847776413,,,,,, +42,242699,,,,,,,,,,,,0.07177802920341492,,,,,, +42,242749,,,,,,,,,,,,0.0698806494474411,,,,,, +42,242799,,,,,,,,,,,,0.07818932831287384,,,,,, +42,242849,,,,,,,,,,,,0.09292468428611755,,,,,, +42,242899,,,,,,,,,,,,0.08172955363988876,,,,,, +42,242949,,,,,,,,,,,,0.0835275799036026,,,,,, +42,242999,,,,,,,,,,,,0.07700291275978088,,,,,, +42,243049,,,,,,,,,,,,0.07325494289398193,,,,,, +42,243099,,,,,,,,,,,,0.08803820610046387,,,,,, +42,243149,,,,,,,,,,,,0.07836349308490753,,,,,, +42,243199,,,,,,,,,,,,0.06371641159057617,,,,,, +42,243249,,,,,,,,,,,,0.08529937267303467,,,,,, +42,243299,,,,,,,,,,,,0.07000130414962769,,,,,, +42,243349,,,,,,,,,,,,0.06793474406003952,,,,,, +42,243399,,,,,,,,,,,,0.07190762460231781,,,,,, +42,243449,,,,,,,,,,,,0.07704595476388931,,,,,, +42,243499,,,,,,,,,,,,0.07057366520166397,,,,,, +42,243549,,,,,,,,,,,,0.07773886620998383,,,,,, +42,243599,,,,,,,,,,,,0.06770959496498108,,,,,, +42,243649,,,,,,,,,,,,0.08067305386066437,,,,,, +42,243699,,,,,,,,,,,,0.06384105235338211,,,,,, +42,243749,,,,,,,,,,,,0.07671919465065002,,,,,, +42,243799,,,,,,,,,,,,0.08029099553823471,,,,,, +42,243849,,,,,,,,,,,,0.07396890968084335,,,,,, +42,243899,,,,,,,,,,,,0.07455037534236908,,,,,, +42,243949,,,,,,,,,,,,0.07343357801437378,,,,,, +42,243999,,,,,,,,,,,,0.07812783122062683,,,,,, +42,244049,,,,,,,,,,,,0.0762253999710083,,,,,, +42,244099,,,,,,,,,,,,0.07813534140586853,,,,,, +42,244149,,,,,,,,,,,,0.07837028801441193,,,,,, +42,244199,,,,,,,,,,,,0.08079425990581512,,,,,, +42,244249,,,,,,,,,,,,0.07877819240093231,,,,,, +42,244299,,,,,,,,,,,,0.08396036177873611,,,,,, +42,244349,,,,,,,,,,,,0.07273773103952408,,,,,, +42,244399,,,,,,,,,,,,0.07423083484172821,,,,,, +42,244449,,,,,,,,,,,,0.07805471122264862,,,,,, +42,244499,,,,,,,,,,,,0.07292387634515762,,,,,, +42,244549,,,,,,,,,,,,0.07501126825809479,,,,,, +42,244599,,,,,,,,,,,,0.07928039133548737,,,,,, +42,244649,,,,,,,,,,,,0.07940416783094406,,,,,, +42,244699,,,,,,,,,,,,0.08721775561571121,,,,,, +42,244749,,,,,,,,,,,,0.07915028929710388,,,,,, +42,244799,,,,,,,,,,,,0.06735465675592422,,,,,, +42,244849,,,,,,,,,,,,0.08798977732658386,,,,,, +42,244899,,,,,,,,,,,,0.07324057072401047,,,,,, +42,244949,,,,,,,,,,,,0.08965922147035599,,,,,, +42,244999,,,,,,,,,,,,0.06459903717041016,,,,,, +42,245049,,,,,,,,,,,,0.07827028632164001,,,,,, +42,245099,,,,,,,,,,,,0.07553297281265259,,,,,, +42,245149,,,,,,,,,,,,0.07935486733913422,,,,,, +42,245199,,,,,,,,,,,,0.0641615092754364,,,,,, +42,245249,,,,,,,,,,,,0.07231061905622482,,,,,, +42,245299,,,,,,,,,,,,0.06870777904987335,,,,,, +42,245349,,,,,,,,,,,,0.07861173152923584,,,,,, +42,245399,,,,,,,,,,,,0.08795692026615143,,,,,, +42,245449,,,,,,,,,,,,0.08289100229740143,,,,,, +42,245499,,,,,,,,,,,,0.07284139096736908,,,,,, +42,245549,,,,,,,,,,,,0.07150392234325409,,,,,, +42,245599,,,,,,,,,,,,0.08086483925580978,,,,,, +42,245649,,,,,,,,,,,,0.06601213663816452,,,,,, +42,245699,,,,,,,,,,,,0.07606574892997742,,,,,, +42,245749,,,,,,,,,,,,0.07405916601419449,,,,,, +42,245799,,,,,,,,,,,,0.08826147764921188,,,,,, +42,245849,,,,,,,,,,,,0.0761222094297409,,,,,, +42,245899,,,,,,,,,,,,0.06979116052389145,,,,,, +42,245949,,,,,,,,,,,,0.06821106374263763,,,,,, +42,245999,,,,,,,,,,,,0.07820801436901093,,,,,, +42,246049,,,,,,,,,,,,0.07944609224796295,,,,,, +42,246099,,,,,,,,,,,,0.08410732448101044,,,,,, +42,246149,,,,,,,,,,,,0.07823432236909866,,,,,, +42,246199,,,,,,,,,,,,0.08403030037879944,,,,,, +42,246249,,,,,,,,,,,,0.07269853353500366,,,,,, +42,246299,,,,,,,,,,,,0.0677129477262497,,,,,, +42,246349,,,,,,,,,,,,0.06894691288471222,,,,,, +42,246399,,,,,,,,,,,,0.07048732042312622,,,,,, +42,246449,,,,,,,,,,,,0.08031207323074341,,,,,, +42,246499,,,,,,,,,,,,0.07349656522274017,,,,,, +42,246549,,,,,,,,,,,,0.07517765462398529,,,,,, +42,246599,,,,,,,,,,,,0.07230821251869202,,,,,, +42,246647,,,,,,,,,,,,,0.2471790909767151,0.0853896364569664,0.1518961638212204,-0.036019325256347656,0.14447970688343048,0.0853896364569664 +42,246647,,,,,,,0.23424020409584045,0.07528159767389297,0.30063918232917786,0.09038245677947998,0.27986225485801697,,,,,,, +43,246649,,,,,,,,,,,,0.0793304294347763,,,,,, +43,246699,,,,,,,,,,,,0.07806673645973206,,,,,, +43,246749,,,,,,,,,,,,0.07687482237815857,,,,,, +43,246799,,,,,,,,,,,,0.06902293115854263,,,,,, +43,246849,,,,,,,,,,,,0.07857076823711395,,,,,, +43,246899,,,,,,,,,,,,0.09074938297271729,,,,,, +43,246949,,,,,,,,,,,,0.07559995353221893,,,,,, +43,246999,,,,,,,,,,,,0.06253887712955475,,,,,, +43,247049,,,,,,,,,,,,0.059730321168899536,,,,,, +43,247099,,,,,,,,,,,,0.07497763633728027,,,,,, +43,247149,,,,,,,,,,,,0.08275540173053741,,,,,, +43,247199,,,,,,,,,,,,0.09134065359830856,,,,,, +43,247249,,,,,,,,,,,,0.08924533426761627,,,,,, +43,247299,,,,,,,,,,,,0.09029732644557953,,,,,, +43,247349,,,,,,,,,,,,0.06734604388475418,,,,,, +43,247399,,,,,,,,,,,,0.07239450514316559,,,,,, +43,247449,,,,,,,,,,,,0.06998059153556824,,,,,, +43,247499,,,,,,,,,,,,0.06703537702560425,,,,,, +43,247549,,,,,,,,,,,,0.07776305079460144,,,,,, +43,247599,,,,,,,,,,,,0.058987945318222046,,,,,, +43,247649,,,,,,,,,,,,0.07113049179315567,,,,,, +43,247699,,,,,,,,,,,,0.07541544735431671,,,,,, +43,247749,,,,,,,,,,,,0.07877038419246674,,,,,, +43,247799,,,,,,,,,,,,0.0639193058013916,,,,,, +43,247849,,,,,,,,,,,,0.07629022002220154,,,,,, +43,247899,,,,,,,,,,,,0.07063798606395721,,,,,, +43,247949,,,,,,,,,,,,0.07530888170003891,,,,,, +43,247999,,,,,,,,,,,,0.07946722209453583,,,,,, +43,248049,,,,,,,,,,,,0.07042086869478226,,,,,, +43,248099,,,,,,,,,,,,0.0799417793750763,,,,,, +43,248149,,,,,,,,,,,,0.07708165794610977,,,,,, +43,248199,,,,,,,,,,,,0.07668960839509964,,,,,, +43,248249,,,,,,,,,,,,0.07541657984256744,,,,,, +43,248299,,,,,,,,,,,,0.06779878586530685,,,,,, +43,248349,,,,,,,,,,,,0.08815398812294006,,,,,, +43,248399,,,,,,,,,,,,0.07787679135799408,,,,,, +43,248449,,,,,,,,,,,,0.08304781466722488,,,,,, +43,248499,,,,,,,,,,,,0.06230185180902481,,,,,, +43,248549,,,,,,,,,,,,0.07854380458593369,,,,,, +43,248599,,,,,,,,,,,,0.07063859701156616,,,,,, +43,248649,,,,,,,,,,,,0.07223866879940033,,,,,, +43,248699,,,,,,,,,,,,0.06924073398113251,,,,,, +43,248749,,,,,,,,,,,,0.0752025693655014,,,,,, +43,248799,,,,,,,,,,,,0.08269629627466202,,,,,, +43,248849,,,,,,,,,,,,0.07210128009319305,,,,,, +43,248899,,,,,,,,,,,,0.07376380264759064,,,,,, +43,248949,,,,,,,,,,,,0.07501813769340515,,,,,, +43,248999,,,,,,,,,,,,0.08245128393173218,,,,,, +43,249049,,,,,,,,,,,,0.08096857368946075,,,,,, +43,249099,,,,,,,,,,,,0.08388322591781616,,,,,, +43,249149,,,,,,,,,,,,0.061678413301706314,,,,,, +43,249199,,,,,,,,,,,,0.077077716588974,,,,,, +43,249249,,,,,,,,,,,,0.07182732224464417,,,,,, +43,249299,,,,,,,,,,,,0.07620507478713989,,,,,, +43,249349,,,,,,,,,,,,0.06261379271745682,,,,,, +43,249399,,,,,,,,,,,,0.08050546050071716,,,,,, +43,249449,,,,,,,,,,,,0.07283154129981995,,,,,, +43,249499,,,,,,,,,,,,0.07511851191520691,,,,,, +43,249549,,,,,,,,,,,,0.079457126557827,,,,,, +43,249599,,,,,,,,,,,,0.06981870532035828,,,,,, +43,249649,,,,,,,,,,,,0.07865641266107559,,,,,, +43,249699,,,,,,,,,,,,0.07510225474834442,,,,,, +43,249749,,,,,,,,,,,,0.07344374060630798,,,,,, +43,249799,,,,,,,,,,,,0.08030445128679276,,,,,, +43,249849,,,,,,,,,,,,0.07402186095714569,,,,,, +43,249899,,,,,,,,,,,,0.07632529735565186,,,,,, +43,249949,,,,,,,,,,,,0.07419170439243317,,,,,, +43,249999,,,,,,,,,,,,0.07690820097923279,,,,,, +43,250049,,,,,,,,,,,,0.07129305601119995,,,,,, +43,250099,,,,,,,,,,,,0.078739695250988,,,,,, +43,250149,,,,,,,,,,,,0.07590452581644058,,,,,, +43,250199,,,,,,,,,,,,0.08122821152210236,,,,,, +43,250249,,,,,,,,,,,,0.07436317950487137,,,,,, +43,250299,,,,,,,,,,,,0.06326846778392792,,,,,, +43,250349,,,,,,,,,,,,0.07084241509437561,,,,,, +43,250399,,,,,,,,,,,,0.07967066764831543,,,,,, +43,250449,,,,,,,,,,,,0.0770457535982132,,,,,, +43,250499,,,,,,,,,,,,0.06468251347541809,,,,,, +43,250549,,,,,,,,,,,,0.07576519250869751,,,,,, +43,250599,,,,,,,,,,,,0.07568241655826569,,,,,, +43,250649,,,,,,,,,,,,0.08113650977611542,,,,,, +43,250699,,,,,,,,,,,,0.0711878091096878,,,,,, +43,250749,,,,,,,,,,,,0.0749216377735138,,,,,, +43,250799,,,,,,,,,,,,0.08083491772413254,,,,,, +43,250849,,,,,,,,,,,,0.07659238576889038,,,,,, +43,250899,,,,,,,,,,,,0.0647931694984436,,,,,, +43,250949,,,,,,,,,,,,0.07330425083637238,,,,,, +43,250999,,,,,,,,,,,,0.06267677247524261,,,,,, +43,251049,,,,,,,,,,,,0.06972023844718933,,,,,, +43,251099,,,,,,,,,,,,0.07509647309780121,,,,,, +43,251149,,,,,,,,,,,,0.06901153177022934,,,,,, +43,251199,,,,,,,,,,,,0.06604769825935364,,,,,, +43,251249,,,,,,,,,,,,0.07188786566257477,,,,,, +43,251299,,,,,,,,,,,,0.0794772207736969,,,,,, +43,251349,,,,,,,,,,,,0.06700068712234497,,,,,, +43,251399,,,,,,,,,,,,0.08061274886131287,,,,,, +43,251449,,,,,,,,,,,,0.08689986914396286,,,,,, +43,251499,,,,,,,,,,,,0.08075135946273804,,,,,, +43,251549,,,,,,,,,,,,0.0763510912656784,,,,,, +43,251599,,,,,,,,,,,,0.089424729347229,,,,,, +43,251649,,,,,,,,,,,,0.07895036041736603,,,,,, +43,251699,,,,,,,,,,,,0.07140828669071198,,,,,, +43,251749,,,,,,,,,,,,0.08139257878065109,,,,,, +43,251799,,,,,,,,,,,,0.0778796523809433,,,,,, +43,251849,,,,,,,,,,,,0.06885001063346863,,,,,, +43,251899,,,,,,,,,,,,0.06175199896097183,,,,,, +43,251949,,,,,,,,,,,,0.08124181628227234,,,,,, +43,251999,,,,,,,,,,,,0.08348512649536133,,,,,, +43,252049,,,,,,,,,,,,0.07558226585388184,,,,,, +43,252099,,,,,,,,,,,,0.08327953517436981,,,,,, +43,252149,,,,,,,,,,,,0.06127963960170746,,,,,, +43,252199,,,,,,,,,,,,0.07559994608163834,,,,,, +43,252249,,,,,,,,,,,,0.07042457163333893,,,,,, +43,252299,,,,,,,,,,,,0.07309906929731369,,,,,, +43,252349,,,,,,,,,,,,0.08153866231441498,,,,,, +43,252383,,,,,,,,,,,,,0.24610622227191925,0.0846596285700798,0.1726711243391037,-0.02716231346130371,0.16435150802135468,0.0846596285700798 +43,252383,,,,,,,0.23421600461006165,0.07529108226299286,0.3004530668258667,0.09026157855987549,0.2798561155796051,,,,,,, +44,252399,,,,,,,,,,,,0.07695313543081284,,,,,, +44,252449,,,,,,,,,,,,0.07822722941637039,,,,,, +44,252499,,,,,,,,,,,,0.060913216322660446,,,,,, +44,252549,,,,,,,,,,,,0.06895854324102402,,,,,, +44,252599,,,,,,,,,,,,0.08363375067710876,,,,,, +44,252649,,,,,,,,,,,,0.0641813576221466,,,,,, +44,252699,,,,,,,,,,,,0.07792223989963531,,,,,, +44,252749,,,,,,,,,,,,0.07778888940811157,,,,,, +44,252799,,,,,,,,,,,,0.06924325972795486,,,,,, +44,252849,,,,,,,,,,,,0.06419509649276733,,,,,, +44,252899,,,,,,,,,,,,0.06668172031641006,,,,,, +44,252949,,,,,,,,,,,,0.07564994692802429,,,,,, +44,252999,,,,,,,,,,,,0.07519029080867767,,,,,, +44,253049,,,,,,,,,,,,0.06945516169071198,,,,,, +44,253099,,,,,,,,,,,,0.061034586280584335,,,,,, +44,253149,,,,,,,,,,,,0.0731787234544754,,,,,, +44,253199,,,,,,,,,,,,0.07001262158155441,,,,,, +44,253249,,,,,,,,,,,,0.07940268516540527,,,,,, +44,253299,,,,,,,,,,,,0.07375279068946838,,,,,, +44,253349,,,,,,,,,,,,0.08339986205101013,,,,,, +44,253399,,,,,,,,,,,,0.0807446762919426,,,,,, +44,253449,,,,,,,,,,,,0.08068179339170456,,,,,, +44,253499,,,,,,,,,,,,0.07419843971729279,,,,,, +44,253549,,,,,,,,,,,,0.07676387578248978,,,,,, +44,253599,,,,,,,,,,,,0.07766944915056229,,,,,, +44,253649,,,,,,,,,,,,0.06861507892608643,,,,,, +44,253699,,,,,,,,,,,,0.08035460114479065,,,,,, +44,253749,,,,,,,,,,,,0.07522924244403839,,,,,, +44,253799,,,,,,,,,,,,0.0751328393816948,,,,,, +44,253849,,,,,,,,,,,,0.07572457939386368,,,,,, +44,253899,,,,,,,,,,,,0.07658518850803375,,,,,, +44,253949,,,,,,,,,,,,0.06413164734840393,,,,,, +44,253999,,,,,,,,,,,,0.07399526983499527,,,,,, +44,254049,,,,,,,,,,,,0.07285018265247345,,,,,, +44,254099,,,,,,,,,,,,0.05951113998889923,,,,,, +44,254149,,,,,,,,,,,,0.08147212862968445,,,,,, +44,254199,,,,,,,,,,,,0.06470988690853119,,,,,, +44,254249,,,,,,,,,,,,0.08058346062898636,,,,,, +44,254299,,,,,,,,,,,,0.08045695722103119,,,,,, +44,254349,,,,,,,,,,,,0.09257357567548752,,,,,, +44,254399,,,,,,,,,,,,0.08052866160869598,,,,,, +44,254449,,,,,,,,,,,,0.08687065541744232,,,,,, +44,254499,,,,,,,,,,,,0.08230163156986237,,,,,, +44,254549,,,,,,,,,,,,0.07995530962944031,,,,,, +44,254599,,,,,,,,,,,,0.06429476290941238,,,,,, +44,254649,,,,,,,,,,,,0.0861259251832962,,,,,, +44,254699,,,,,,,,,,,,0.07877615094184875,,,,,, +44,254749,,,,,,,,,,,,0.0716436356306076,,,,,, +44,254799,,,,,,,,,,,,0.07484635710716248,,,,,, +44,254849,,,,,,,,,,,,0.06423060595989227,,,,,, +44,254899,,,,,,,,,,,,0.08408963680267334,,,,,, +44,254949,,,,,,,,,,,,0.07304226607084274,,,,,, +44,254999,,,,,,,,,,,,0.08206305652856827,,,,,, +44,255049,,,,,,,,,,,,0.0759543627500534,,,,,, +44,255099,,,,,,,,,,,,0.07541292905807495,,,,,, +44,255149,,,,,,,,,,,,0.07451538741588593,,,,,, +44,255199,,,,,,,,,,,,0.08186528086662292,,,,,, +44,255249,,,,,,,,,,,,0.06890751421451569,,,,,, +44,255299,,,,,,,,,,,,0.07875003665685654,,,,,, +44,255349,,,,,,,,,,,,0.07316870987415314,,,,,, +44,255399,,,,,,,,,,,,0.07080894708633423,,,,,, +44,255449,,,,,,,,,,,,0.086732417345047,,,,,, +44,255499,,,,,,,,,,,,0.05963846296072006,,,,,, +44,255549,,,,,,,,,,,,0.06283165514469147,,,,,, +44,255599,,,,,,,,,,,,0.061469633132219315,,,,,, +44,255649,,,,,,,,,,,,0.06835200637578964,,,,,, +44,255699,,,,,,,,,,,,0.0703265517950058,,,,,, +44,255749,,,,,,,,,,,,0.07627284526824951,,,,,, +44,255799,,,,,,,,,,,,0.0826457291841507,,,,,, +44,255849,,,,,,,,,,,,0.06920337677001953,,,,,, +44,255899,,,,,,,,,,,,0.07039308547973633,,,,,, +44,255949,,,,,,,,,,,,0.07323016226291656,,,,,, +44,255999,,,,,,,,,,,,0.08644211292266846,,,,,, +44,256049,,,,,,,,,,,,0.07631908357143402,,,,,, +44,256099,,,,,,,,,,,,0.06957674771547318,,,,,, +44,256149,,,,,,,,,,,,0.07384175062179565,,,,,, +44,256199,,,,,,,,,,,,0.061285052448511124,,,,,, +44,256249,,,,,,,,,,,,0.07855311036109924,,,,,, +44,256299,,,,,,,,,,,,0.08026233315467834,,,,,, +44,256349,,,,,,,,,,,,0.0852007269859314,,,,,, +44,256399,,,,,,,,,,,,0.08031647652387619,,,,,, +44,256449,,,,,,,,,,,,0.07419656962156296,,,,,, +44,256499,,,,,,,,,,,,0.08294208347797394,,,,,, +44,256549,,,,,,,,,,,,0.08100008964538574,,,,,, +44,256599,,,,,,,,,,,,0.07343737781047821,,,,,, +44,256649,,,,,,,,,,,,0.06280140578746796,,,,,, +44,256699,,,,,,,,,,,,0.06696507334709167,,,,,, +44,256749,,,,,,,,,,,,0.07618705928325653,,,,,, +44,256799,,,,,,,,,,,,0.08245395123958588,,,,,, +44,256849,,,,,,,,,,,,0.06262901425361633,,,,,, +44,256899,,,,,,,,,,,,0.07716043293476105,,,,,, +44,256949,,,,,,,,,,,,0.06459832191467285,,,,,, +44,256999,,,,,,,,,,,,0.06948424875736237,,,,,, +44,257049,,,,,,,,,,,,0.06956362724304199,,,,,, +44,257099,,,,,,,,,,,,0.08169004321098328,,,,,, +44,257149,,,,,,,,,,,,0.09882229566574097,,,,,, +44,257199,,,,,,,,,,,,0.08023601770401001,,,,,, +44,257249,,,,,,,,,,,,0.07310676574707031,,,,,, +44,257299,,,,,,,,,,,,0.07189380377531052,,,,,, +44,257349,,,,,,,,,,,,0.07629746198654175,,,,,, +44,257399,,,,,,,,,,,,0.08052399754524231,,,,,, +44,257449,,,,,,,,,,,,0.07056296616792679,,,,,, +44,257499,,,,,,,,,,,,0.07867571711540222,,,,,, +44,257549,,,,,,,,,,,,0.0761069804430008,,,,,, +44,257599,,,,,,,,,,,,0.08087293058633804,,,,,, +44,257649,,,,,,,,,,,,0.0761575847864151,,,,,, +44,257699,,,,,,,,,,,,0.0679008811712265,,,,,, +44,257749,,,,,,,,,,,,0.08196493983268738,,,,,, +44,257799,,,,,,,,,,,,0.08444847166538239,,,,,, +44,257849,,,,,,,,,,,,0.07944987714290619,,,,,, +44,257899,,,,,,,,,,,,0.06891925632953644,,,,,, +44,257949,,,,,,,,,,,,0.07241637259721756,,,,,, +44,257999,,,,,,,,,,,,0.07585287094116211,,,,,, +44,258049,,,,,,,,,,,,0.07412746548652649,,,,,, +44,258099,,,,,,,,,,,,0.07707442343235016,,,,,, +44,258119,,,,,,,,,,,,,0.24652203917503357,0.08471553027629852,0.15764114260673523,-0.027840495109558105,0.15049000084400177,0.08471553027629852 +44,258119,,,,,,,0.23414044082164764,0.07522838562726974,0.3017076849937439,0.0910300612449646,0.28087520599365234,,,,,,, +45,258149,,,,,,,,,,,,0.07125064730644226,,,,,, +45,258199,,,,,,,,,,,,0.07686270773410797,,,,,, +45,258249,,,,,,,,,,,,0.07293000817298889,,,,,, +45,258299,,,,,,,,,,,,0.08045486360788345,,,,,, +45,258349,,,,,,,,,,,,0.0797056034207344,,,,,, +45,258399,,,,,,,,,,,,0.06717977672815323,,,,,, +45,258449,,,,,,,,,,,,0.07470197975635529,,,,,, +45,258499,,,,,,,,,,,,0.08274739235639572,,,,,, +45,258549,,,,,,,,,,,,0.07529556006193161,,,,,, +45,258599,,,,,,,,,,,,0.07645237445831299,,,,,, +45,258649,,,,,,,,,,,,0.0748458057641983,,,,,, +45,258699,,,,,,,,,,,,0.07025840878486633,,,,,, +45,258749,,,,,,,,,,,,0.07407771050930023,,,,,, +45,258799,,,,,,,,,,,,0.07086686789989471,,,,,, +45,258849,,,,,,,,,,,,0.08965745568275452,,,,,, +45,258899,,,,,,,,,,,,0.08016727864742279,,,,,, +45,258949,,,,,,,,,,,,0.08968858420848846,,,,,, +45,258999,,,,,,,,,,,,0.08387628197669983,,,,,, +45,259049,,,,,,,,,,,,0.08305848389863968,,,,,, +45,259099,,,,,,,,,,,,0.08420582860708237,,,,,, +45,259149,,,,,,,,,,,,0.07263612747192383,,,,,, +45,259199,,,,,,,,,,,,0.07253105938434601,,,,,, +45,259249,,,,,,,,,,,,0.07177415490150452,,,,,, +45,259299,,,,,,,,,,,,0.07268894463777542,,,,,, +45,259349,,,,,,,,,,,,0.06666023284196854,,,,,, +45,259399,,,,,,,,,,,,0.08036527782678604,,,,,, +45,259449,,,,,,,,,,,,0.0745425894856453,,,,,, +45,259499,,,,,,,,,,,,0.07238170504570007,,,,,, +45,259549,,,,,,,,,,,,0.0690576583147049,,,,,, +45,259599,,,,,,,,,,,,0.0713147446513176,,,,,, +45,259649,,,,,,,,,,,,0.07749927043914795,,,,,, +45,259699,,,,,,,,,,,,0.07192624360322952,,,,,, +45,259749,,,,,,,,,,,,0.07627400010824203,,,,,, +45,259799,,,,,,,,,,,,0.07557804882526398,,,,,, +45,259849,,,,,,,,,,,,0.07804491370916367,,,,,, +45,259899,,,,,,,,,,,,0.08411096781492233,,,,,, +45,259949,,,,,,,,,,,,0.07885367423295975,,,,,, +45,259999,,,,,,,,,,,,0.0638730451464653,,,,,, +45,260049,,,,,,,,,,,,0.06582064926624298,,,,,, +45,260099,,,,,,,,,,,,0.07499338686466217,,,,,, +45,260149,,,,,,,,,,,,0.07123731076717377,,,,,, +45,260199,,,,,,,,,,,,0.07621091604232788,,,,,, +45,260249,,,,,,,,,,,,0.0652541071176529,,,,,, +45,260299,,,,,,,,,,,,0.060798436403274536,,,,,, +45,260349,,,,,,,,,,,,0.06716518104076385,,,,,, +45,260399,,,,,,,,,,,,0.0738176703453064,,,,,, +45,260449,,,,,,,,,,,,0.06281699240207672,,,,,, +45,260499,,,,,,,,,,,,0.0878736600279808,,,,,, +45,260549,,,,,,,,,,,,0.08160918205976486,,,,,, +45,260599,,,,,,,,,,,,0.06283298879861832,,,,,, +45,260649,,,,,,,,,,,,0.07609079778194427,,,,,, +45,260699,,,,,,,,,,,,0.07724541425704956,,,,,, +45,260749,,,,,,,,,,,,0.07116968184709549,,,,,, +45,260799,,,,,,,,,,,,0.07223641872406006,,,,,, +45,260849,,,,,,,,,,,,0.07923442125320435,,,,,, +45,260899,,,,,,,,,,,,0.06843684613704681,,,,,, +45,260949,,,,,,,,,,,,0.07739316672086716,,,,,, +45,260999,,,,,,,,,,,,0.07947459071874619,,,,,, +45,261049,,,,,,,,,,,,0.07270211726427078,,,,,, +45,261099,,,,,,,,,,,,0.06699652224779129,,,,,, +45,261149,,,,,,,,,,,,0.07756860554218292,,,,,, +45,261199,,,,,,,,,,,,0.07190415263175964,,,,,, +45,261249,,,,,,,,,,,,0.06970764696598053,,,,,, +45,261299,,,,,,,,,,,,0.07755377888679504,,,,,, +45,261349,,,,,,,,,,,,0.06926676630973816,,,,,, +45,261399,,,,,,,,,,,,0.08702877163887024,,,,,, +45,261449,,,,,,,,,,,,0.0753721296787262,,,,,, +45,261499,,,,,,,,,,,,0.08749771118164062,,,,,, +45,261549,,,,,,,,,,,,0.07537771016359329,,,,,, +45,261599,,,,,,,,,,,,0.085523322224617,,,,,, +45,261649,,,,,,,,,,,,0.07511717081069946,,,,,, +45,261699,,,,,,,,,,,,0.08282074332237244,,,,,, +45,261749,,,,,,,,,,,,0.07243843376636505,,,,,, +45,261799,,,,,,,,,,,,0.07309029251337051,,,,,, +45,261849,,,,,,,,,,,,0.08885946869850159,,,,,, +45,261899,,,,,,,,,,,,0.06494906544685364,,,,,, +45,261949,,,,,,,,,,,,0.07847117632627487,,,,,, +45,261999,,,,,,,,,,,,0.08597736805677414,,,,,, +45,262049,,,,,,,,,,,,0.08703333884477615,,,,,, +45,262099,,,,,,,,,,,,0.07652665674686432,,,,,, +45,262149,,,,,,,,,,,,0.0693080872297287,,,,,, +45,262199,,,,,,,,,,,,0.07802442461252213,,,,,, +45,262249,,,,,,,,,,,,0.08135528862476349,,,,,, +45,262299,,,,,,,,,,,,0.08081701397895813,,,,,, +45,262349,,,,,,,,,,,,0.0778542160987854,,,,,, +45,262399,,,,,,,,,,,,0.06494425982236862,,,,,, +45,262449,,,,,,,,,,,,0.06707805395126343,,,,,, +45,262499,,,,,,,,,,,,0.06916150450706482,,,,,, +45,262549,,,,,,,,,,,,0.07260800898075104,,,,,, +45,262599,,,,,,,,,,,,0.07318247854709625,,,,,, +45,262649,,,,,,,,,,,,0.07131247222423553,,,,,, +45,262699,,,,,,,,,,,,0.08684433996677399,,,,,, +45,262749,,,,,,,,,,,,0.08034569025039673,,,,,, +45,262799,,,,,,,,,,,,0.06988340616226196,,,,,, +45,262849,,,,,,,,,,,,0.0802154466509819,,,,,, +45,262899,,,,,,,,,,,,0.07651500403881073,,,,,, +45,262949,,,,,,,,,,,,0.07249516248703003,,,,,, +45,262999,,,,,,,,,,,,0.07925890386104584,,,,,, +45,263049,,,,,,,,,,,,0.07495556771755219,,,,,, +45,263099,,,,,,,,,,,,0.06629873812198639,,,,,, +45,263149,,,,,,,,,,,,0.06405410170555115,,,,,, +45,263199,,,,,,,,,,,,0.08114093542098999,,,,,, +45,263249,,,,,,,,,,,,0.07189755141735077,,,,,, +45,263299,,,,,,,,,,,,0.06555260717868805,,,,,, +45,263349,,,,,,,,,,,,0.08077394217252731,,,,,, +45,263399,,,,,,,,,,,,0.0882236659526825,,,,,, +45,263449,,,,,,,,,,,,0.06689725071191788,,,,,, +45,263499,,,,,,,,,,,,0.0794074535369873,,,,,, +45,263549,,,,,,,,,,,,0.07383614033460617,,,,,, +45,263599,,,,,,,,,,,,0.08088375627994537,,,,,, +45,263649,,,,,,,,,,,,0.083218514919281,,,,,, +45,263699,,,,,,,,,,,,0.08670270442962646,,,,,, +45,263749,,,,,,,,,,,,0.08636943250894547,,,,,, +45,263799,,,,,,,,,,,,0.0760059729218483,,,,,, +45,263849,,,,,,,,,,,,0.0729852244257927,,,,,, +45,263855,,,,,,,,,,,,,0.24662072956562042,0.08481825143098831,0.15909986197948456,-0.029086828231811523,0.1515737920999527,0.08481825143098831 +45,263855,,,,,,,0.23423008620738983,0.07533912360668182,0.2995045483112335,0.08967238664627075,0.28025147318840027,,,,,,, +46,263899,,,,,,,,,,,,0.06939021497964859,,,,,, +46,263949,,,,,,,,,,,,0.07612601667642593,,,,,, +46,263999,,,,,,,,,,,,0.08285538107156754,,,,,, +46,264049,,,,,,,,,,,,0.07397338002920151,,,,,, +46,264099,,,,,,,,,,,,0.0760878324508667,,,,,, +46,264149,,,,,,,,,,,,0.08461126685142517,,,,,, +46,264199,,,,,,,,,,,,0.07513021677732468,,,,,, +46,264249,,,,,,,,,,,,0.07784423232078552,,,,,, +46,264299,,,,,,,,,,,,0.07734392583370209,,,,,, +46,264349,,,,,,,,,,,,0.07621157169342041,,,,,, +46,264399,,,,,,,,,,,,0.0670589953660965,,,,,, +46,264449,,,,,,,,,,,,0.06596019864082336,,,,,, +46,264499,,,,,,,,,,,,0.06528905034065247,,,,,, +46,264549,,,,,,,,,,,,0.07379157841205597,,,,,, +46,264599,,,,,,,,,,,,0.07790680229663849,,,,,, +46,264649,,,,,,,,,,,,0.07548519968986511,,,,,, +46,264699,,,,,,,,,,,,0.06959149241447449,,,,,, +46,264749,,,,,,,,,,,,0.08340969681739807,,,,,, +46,264799,,,,,,,,,,,,0.07405436784029007,,,,,, +46,264849,,,,,,,,,,,,0.06669177114963531,,,,,, +46,264899,,,,,,,,,,,,0.07411038875579834,,,,,, +46,264949,,,,,,,,,,,,0.08028348535299301,,,,,, +46,264999,,,,,,,,,,,,0.07634111493825912,,,,,, +46,265049,,,,,,,,,,,,0.07063239812850952,,,,,, +46,265099,,,,,,,,,,,,0.07420297712087631,,,,,, +46,265149,,,,,,,,,,,,0.06634025275707245,,,,,, +46,265199,,,,,,,,,,,,0.07876365631818771,,,,,, +46,265249,,,,,,,,,,,,0.0721500962972641,,,,,, +46,265299,,,,,,,,,,,,0.07803456485271454,,,,,, +46,265349,,,,,,,,,,,,0.08662013709545135,,,,,, +46,265399,,,,,,,,,,,,0.07817254960536957,,,,,, +46,265449,,,,,,,,,,,,0.07000015676021576,,,,,, +46,265499,,,,,,,,,,,,0.07187747955322266,,,,,, +46,265549,,,,,,,,,,,,0.08135004341602325,,,,,, +46,265599,,,,,,,,,,,,0.07845281809568405,,,,,, +46,265649,,,,,,,,,,,,0.08054178953170776,,,,,, +46,265699,,,,,,,,,,,,0.07927971333265305,,,,,, +46,265749,,,,,,,,,,,,0.08372433483600616,,,,,, +46,265799,,,,,,,,,,,,0.08008665591478348,,,,,, +46,265849,,,,,,,,,,,,0.08753734827041626,,,,,, +46,265899,,,,,,,,,,,,0.09001011401414871,,,,,, +46,265949,,,,,,,,,,,,0.08278091251850128,,,,,, +46,265999,,,,,,,,,,,,0.07143840193748474,,,,,, +46,266049,,,,,,,,,,,,0.08140929043292999,,,,,, +46,266099,,,,,,,,,,,,0.08084262907505035,,,,,, +46,266149,,,,,,,,,,,,0.06200810521841049,,,,,, +46,266199,,,,,,,,,,,,0.07653117179870605,,,,,, +46,266249,,,,,,,,,,,,0.07661771774291992,,,,,, +46,266299,,,,,,,,,,,,0.07129048556089401,,,,,, +46,266349,,,,,,,,,,,,0.0686977207660675,,,,,, +46,266399,,,,,,,,,,,,0.06747168302536011,,,,,, +46,266449,,,,,,,,,,,,0.07789048552513123,,,,,, +46,266499,,,,,,,,,,,,0.0720788836479187,,,,,, +46,266549,,,,,,,,,,,,0.0771317109465599,,,,,, +46,266599,,,,,,,,,,,,0.07736924290657043,,,,,, +46,266649,,,,,,,,,,,,0.0674157366156578,,,,,, +46,266699,,,,,,,,,,,,0.06583809107542038,,,,,, +46,266749,,,,,,,,,,,,0.06636932492256165,,,,,, +46,266799,,,,,,,,,,,,0.06832531839609146,,,,,, +46,266849,,,,,,,,,,,,0.08220922946929932,,,,,, +46,266899,,,,,,,,,,,,0.07057065516710281,,,,,, +46,266949,,,,,,,,,,,,0.07370321452617645,,,,,, +46,266999,,,,,,,,,,,,0.06826359033584595,,,,,, +46,267049,,,,,,,,,,,,0.06924077868461609,,,,,, +46,267099,,,,,,,,,,,,0.08051781356334686,,,,,, +46,267149,,,,,,,,,,,,0.07493487745523453,,,,,, +46,267199,,,,,,,,,,,,0.08195219188928604,,,,,, +46,267249,,,,,,,,,,,,0.08143637329339981,,,,,, +46,267299,,,,,,,,,,,,0.07262386381626129,,,,,, +46,267349,,,,,,,,,,,,0.08199076354503632,,,,,, +46,267399,,,,,,,,,,,,0.08330422639846802,,,,,, +46,267449,,,,,,,,,,,,0.0636884868144989,,,,,, +46,267499,,,,,,,,,,,,0.07357989251613617,,,,,, +46,267549,,,,,,,,,,,,0.07230482995510101,,,,,, +46,267599,,,,,,,,,,,,0.07679304480552673,,,,,, +46,267649,,,,,,,,,,,,0.07186594605445862,,,,,, +46,267699,,,,,,,,,,,,0.06969190388917923,,,,,, +46,267749,,,,,,,,,,,,0.07266728579998016,,,,,, +46,267799,,,,,,,,,,,,0.07636282593011856,,,,,, +46,267849,,,,,,,,,,,,0.08222939819097519,,,,,, +46,267899,,,,,,,,,,,,0.07257740944623947,,,,,, +46,267949,,,,,,,,,,,,0.0914951041340828,,,,,, +46,267999,,,,,,,,,,,,0.08369265496730804,,,,,, +46,268049,,,,,,,,,,,,0.08532693982124329,,,,,, +46,268099,,,,,,,,,,,,0.07007546722888947,,,,,, +46,268149,,,,,,,,,,,,0.07561169564723969,,,,,, +46,268199,,,,,,,,,,,,0.08093026280403137,,,,,, +46,268249,,,,,,,,,,,,0.07190613448619843,,,,,, +46,268299,,,,,,,,,,,,0.06698789447546005,,,,,, +46,268349,,,,,,,,,,,,0.08331028372049332,,,,,, +46,268399,,,,,,,,,,,,0.07361744344234467,,,,,, +46,268449,,,,,,,,,,,,0.07034900039434433,,,,,, +46,268499,,,,,,,,,,,,0.07683858275413513,,,,,, +46,268549,,,,,,,,,,,,0.08038695156574249,,,,,, +46,268599,,,,,,,,,,,,0.07896942645311356,,,,,, +46,268649,,,,,,,,,,,,0.07327215373516083,,,,,, +46,268699,,,,,,,,,,,,0.07174913585186005,,,,,, +46,268749,,,,,,,,,,,,0.06971955299377441,,,,,, +46,268799,,,,,,,,,,,,0.08162345737218857,,,,,, +46,268849,,,,,,,,,,,,0.07592809200286865,,,,,, +46,268899,,,,,,,,,,,,0.06453152000904083,,,,,, +46,268949,,,,,,,,,,,,0.07832750678062439,,,,,, +46,268999,,,,,,,,,,,,0.07958967238664627,,,,,, +46,269049,,,,,,,,,,,,0.0683324858546257,,,,,, +46,269099,,,,,,,,,,,,0.07254879176616669,,,,,, +46,269149,,,,,,,,,,,,0.08447347581386566,,,,,, +46,269199,,,,,,,,,,,,0.07156547904014587,,,,,, +46,269249,,,,,,,,,,,,0.0795878991484642,,,,,, +46,269299,,,,,,,,,,,,0.0680101290345192,,,,,, +46,269349,,,,,,,,,,,,0.08430338650941849,,,,,, +46,269399,,,,,,,,,,,,0.07168997079133987,,,,,, +46,269449,,,,,,,,,,,,0.08170874416828156,,,,,, +46,269499,,,,,,,,,,,,0.07226213812828064,,,,,, +46,269549,,,,,,,,,,,,0.07601864635944366,,,,,, +46,269591,,,,,,,,,,,,,0.24650387465953827,0.08472953736782074,0.1580650508403778,-0.02801048755645752,0.14949561655521393,0.08472953736782074 +46,269591,,,,,,,0.2340959906578064,0.0752202719449997,0.30186977982521057,0.09112530946731567,0.2812579572200775,,,,,,, +47,269599,,,,,,,,,,,,0.08668103814125061,,,,,, +47,269649,,,,,,,,,,,,0.07424312084913254,,,,,, +47,269699,,,,,,,,,,,,0.06493713706731796,,,,,, +47,269749,,,,,,,,,,,,0.08479833602905273,,,,,, +47,269799,,,,,,,,,,,,0.0869220644235611,,,,,, +47,269849,,,,,,,,,,,,0.08750949054956436,,,,,, +47,269899,,,,,,,,,,,,0.09460156410932541,,,,,, +47,269949,,,,,,,,,,,,0.08176514506340027,,,,,, +47,269999,,,,,,,,,,,,0.07362140715122223,,,,,, +47,270049,,,,,,,,,,,,0.06714644283056259,,,,,, +47,270099,,,,,,,,,,,,0.07342404872179031,,,,,, +47,270149,,,,,,,,,,,,0.07434020936489105,,,,,, +47,270199,,,,,,,,,,,,0.06485477834939957,,,,,, +47,270249,,,,,,,,,,,,0.0767403393983841,,,,,, +47,270299,,,,,,,,,,,,0.07291598618030548,,,,,, +47,270349,,,,,,,,,,,,0.07681508362293243,,,,,, +47,270399,,,,,,,,,,,,0.0797174796462059,,,,,, +47,270449,,,,,,,,,,,,0.06976324319839478,,,,,, +47,270499,,,,,,,,,,,,0.06470336019992828,,,,,, +47,270549,,,,,,,,,,,,0.08036592602729797,,,,,, +47,270599,,,,,,,,,,,,0.08007745444774628,,,,,, +47,270649,,,,,,,,,,,,0.0693313255906105,,,,,, +47,270699,,,,,,,,,,,,0.07322213053703308,,,,,, +47,270749,,,,,,,,,,,,0.06208115071058273,,,,,, +47,270799,,,,,,,,,,,,0.07159092277288437,,,,,, +47,270849,,,,,,,,,,,,0.06542642414569855,,,,,, +47,270899,,,,,,,,,,,,0.07625988125801086,,,,,, +47,270949,,,,,,,,,,,,0.07641413807868958,,,,,, +47,270999,,,,,,,,,,,,0.07721105217933655,,,,,, +47,271049,,,,,,,,,,,,0.06891307979822159,,,,,, +47,271099,,,,,,,,,,,,0.07461052387952805,,,,,, +47,271149,,,,,,,,,,,,0.061446838080883026,,,,,, +47,271199,,,,,,,,,,,,0.07497577369213104,,,,,, +47,271249,,,,,,,,,,,,0.0780743658542633,,,,,, +47,271299,,,,,,,,,,,,0.08173470199108124,,,,,, +47,271349,,,,,,,,,,,,0.08666263520717621,,,,,, +47,271399,,,,,,,,,,,,0.0691797211766243,,,,,, +47,271449,,,,,,,,,,,,0.07229837775230408,,,,,, +47,271499,,,,,,,,,,,,0.07672286033630371,,,,,, +47,271549,,,,,,,,,,,,0.059846557676792145,,,,,, +47,271599,,,,,,,,,,,,0.08267639577388763,,,,,, +47,271649,,,,,,,,,,,,0.07205134630203247,,,,,, +47,271699,,,,,,,,,,,,0.07408823072910309,,,,,, +47,271749,,,,,,,,,,,,0.07319990545511246,,,,,, +47,271799,,,,,,,,,,,,0.06537792086601257,,,,,, +47,271849,,,,,,,,,,,,0.07826796174049377,,,,,, +47,271899,,,,,,,,,,,,0.07873749732971191,,,,,, +47,271949,,,,,,,,,,,,0.0726705864071846,,,,,, +47,271999,,,,,,,,,,,,0.07703377306461334,,,,,, +47,272049,,,,,,,,,,,,0.06412895768880844,,,,,, +47,272099,,,,,,,,,,,,0.07261411845684052,,,,,, +47,272149,,,,,,,,,,,,0.062190089374780655,,,,,, +47,272199,,,,,,,,,,,,0.07510672509670258,,,,,, +47,272249,,,,,,,,,,,,0.07093465328216553,,,,,, +47,272299,,,,,,,,,,,,0.06884810328483582,,,,,, +47,272349,,,,,,,,,,,,0.08215843141078949,,,,,, +47,272399,,,,,,,,,,,,0.07763828337192535,,,,,, +47,272449,,,,,,,,,,,,0.07585584372282028,,,,,, +47,272499,,,,,,,,,,,,0.07365794479846954,,,,,, +47,272549,,,,,,,,,,,,0.07157212495803833,,,,,, +47,272599,,,,,,,,,,,,0.07232406735420227,,,,,, +47,272649,,,,,,,,,,,,0.08002404868602753,,,,,, +47,272699,,,,,,,,,,,,0.06885192543268204,,,,,, +47,272749,,,,,,,,,,,,0.0834876149892807,,,,,, +47,272799,,,,,,,,,,,,0.07920870184898376,,,,,, +47,272849,,,,,,,,,,,,0.08593633770942688,,,,,, +47,272899,,,,,,,,,,,,0.0754166916012764,,,,,, +47,272949,,,,,,,,,,,,0.06768006086349487,,,,,, +47,272999,,,,,,,,,,,,0.07314559817314148,,,,,, +47,273049,,,,,,,,,,,,0.06786462664604187,,,,,, +47,273099,,,,,,,,,,,,0.07533589005470276,,,,,, +47,273149,,,,,,,,,,,,0.07644645869731903,,,,,, +47,273199,,,,,,,,,,,,0.0746292695403099,,,,,, +47,273249,,,,,,,,,,,,0.07375942170619965,,,,,, +47,273299,,,,,,,,,,,,0.08077125251293182,,,,,, +47,273349,,,,,,,,,,,,0.07171908020973206,,,,,, +47,273399,,,,,,,,,,,,0.07304438948631287,,,,,, +47,273449,,,,,,,,,,,,0.0653509572148323,,,,,, +47,273499,,,,,,,,,,,,0.08498577773571014,,,,,, +47,273549,,,,,,,,,,,,0.0709061399102211,,,,,, +47,273599,,,,,,,,,,,,0.07295724749565125,,,,,, +47,273649,,,,,,,,,,,,0.07079072296619415,,,,,, +47,273699,,,,,,,,,,,,0.0781078040599823,,,,,, +47,273749,,,,,,,,,,,,0.06972864270210266,,,,,, +47,273799,,,,,,,,,,,,0.07296864688396454,,,,,, +47,273849,,,,,,,,,,,,0.08966788649559021,,,,,, +47,273899,,,,,,,,,,,,0.06340624392032623,,,,,, +47,273949,,,,,,,,,,,,0.07798215746879578,,,,,, +47,273999,,,,,,,,,,,,0.06625284254550934,,,,,, +47,274049,,,,,,,,,,,,0.06266989558935165,,,,,, +47,274099,,,,,,,,,,,,0.07078663259744644,,,,,, +47,274149,,,,,,,,,,,,0.07545381784439087,,,,,, +47,274199,,,,,,,,,,,,0.07775072753429413,,,,,, +47,274249,,,,,,,,,,,,0.07190690189599991,,,,,, +47,274299,,,,,,,,,,,,0.0823097825050354,,,,,, +47,274349,,,,,,,,,,,,0.07696805149316788,,,,,, +47,274399,,,,,,,,,,,,0.07790372520685196,,,,,, +47,274449,,,,,,,,,,,,0.06720154732465744,,,,,, +47,274499,,,,,,,,,,,,0.06623222678899765,,,,,, +47,274549,,,,,,,,,,,,0.07211977243423462,,,,,, +47,274599,,,,,,,,,,,,0.06729105114936829,,,,,, +47,274649,,,,,,,,,,,,0.07272686064243317,,,,,, +47,274699,,,,,,,,,,,,0.07746566087007523,,,,,, +47,274749,,,,,,,,,,,,0.07678549736738205,,,,,, +47,274799,,,,,,,,,,,,0.08538082987070084,,,,,, +47,274849,,,,,,,,,,,,0.07937245070934296,,,,,, +47,274899,,,,,,,,,,,,0.07758887112140656,,,,,, +47,274949,,,,,,,,,,,,0.0811481699347496,,,,,, +47,274999,,,,,,,,,,,,0.0842951089143753,,,,,, +47,275049,,,,,,,,,,,,0.07991889119148254,,,,,, +47,275099,,,,,,,,,,,,0.07659175992012024,,,,,, +47,275149,,,,,,,,,,,,0.07778922468423843,,,,,, +47,275199,,,,,,,,,,,,0.0715966522693634,,,,,, +47,275249,,,,,,,,,,,,0.08017370849847794,,,,,, +47,275299,,,,,,,,,,,,0.07448789477348328,,,,,, +47,275327,,,,,,,,,,,,,0.24724920094013214,0.08545611798763275,0.15700878202915192,-0.03682601451873779,0.1491025686264038,0.08545611798763275 +47,275327,,,,,,,0.23396991193294525,0.0751456469297409,0.30335676670074463,0.0920223593711853,0.28228724002838135,,,,,,, +48,275349,,,,,,,,,,,,0.08707689493894577,,,,,, +48,275399,,,,,,,,,,,,0.07238611578941345,,,,,, +48,275449,,,,,,,,,,,,0.07861916720867157,,,,,, +48,275499,,,,,,,,,,,,0.07724368572235107,,,,,, +48,275549,,,,,,,,,,,,0.07573233544826508,,,,,, +48,275599,,,,,,,,,,,,0.06947675347328186,,,,,, +48,275649,,,,,,,,,,,,0.09107904136180878,,,,,, +48,275699,,,,,,,,,,,,0.07540304958820343,,,,,, +48,275749,,,,,,,,,,,,0.07570420205593109,,,,,, +48,275799,,,,,,,,,,,,0.08253508061170578,,,,,, +48,275849,,,,,,,,,,,,0.07470966130495071,,,,,, +48,275899,,,,,,,,,,,,0.07621107995510101,,,,,, +48,275949,,,,,,,,,,,,0.06694906204938889,,,,,, +48,275999,,,,,,,,,,,,0.08973383903503418,,,,,, +48,276049,,,,,,,,,,,,0.05966661497950554,,,,,, +48,276099,,,,,,,,,,,,0.07347244769334793,,,,,, +48,276149,,,,,,,,,,,,0.07333774864673615,,,,,, +48,276199,,,,,,,,,,,,0.08852218836545944,,,,,, +48,276249,,,,,,,,,,,,0.07118779420852661,,,,,, +48,276299,,,,,,,,,,,,0.06681030988693237,,,,,, +48,276349,,,,,,,,,,,,0.08162225782871246,,,,,, +48,276399,,,,,,,,,,,,0.07203343510627747,,,,,, +48,276449,,,,,,,,,,,,0.07910957932472229,,,,,, +48,276499,,,,,,,,,,,,0.07788566499948502,,,,,, +48,276549,,,,,,,,,,,,0.08440011739730835,,,,,, +48,276599,,,,,,,,,,,,0.08500401675701141,,,,,, +48,276649,,,,,,,,,,,,0.0817335769534111,,,,,, +48,276699,,,,,,,,,,,,0.07603703439235687,,,,,, +48,276749,,,,,,,,,,,,0.07613944262266159,,,,,, +48,276799,,,,,,,,,,,,0.08068416267633438,,,,,, +48,276849,,,,,,,,,,,,0.07659672200679779,,,,,, +48,276899,,,,,,,,,,,,0.07753309607505798,,,,,, +48,276949,,,,,,,,,,,,0.0779610276222229,,,,,, +48,276999,,,,,,,,,,,,0.08121701329946518,,,,,, +48,277049,,,,,,,,,,,,0.07313354313373566,,,,,, +48,277099,,,,,,,,,,,,0.0696064904332161,,,,,, +48,277149,,,,,,,,,,,,0.0759095847606659,,,,,, +48,277199,,,,,,,,,,,,0.09585118293762207,,,,,, +48,277249,,,,,,,,,,,,0.07429872453212738,,,,,, +48,277299,,,,,,,,,,,,0.07676604390144348,,,,,, +48,277349,,,,,,,,,,,,0.07319028675556183,,,,,, +48,277399,,,,,,,,,,,,0.07256965339183807,,,,,, +48,277449,,,,,,,,,,,,0.09091632068157196,,,,,, +48,277499,,,,,,,,,,,,0.07181982696056366,,,,,, +48,277549,,,,,,,,,,,,0.07598066329956055,,,,,, +48,277599,,,,,,,,,,,,0.06912177801132202,,,,,, +48,277649,,,,,,,,,,,,0.07108873873949051,,,,,, +48,277699,,,,,,,,,,,,0.06413345783948898,,,,,, +48,277749,,,,,,,,,,,,0.08008359372615814,,,,,, +48,277799,,,,,,,,,,,,0.06778514385223389,,,,,, +48,277849,,,,,,,,,,,,0.07716509699821472,,,,,, +48,277899,,,,,,,,,,,,0.08836546540260315,,,,,, +48,277949,,,,,,,,,,,,0.073980912566185,,,,,, +48,277999,,,,,,,,,,,,0.06718934327363968,,,,,, +48,278049,,,,,,,,,,,,0.08290597796440125,,,,,, +48,278099,,,,,,,,,,,,0.072119802236557,,,,,, +48,278149,,,,,,,,,,,,0.07233445346355438,,,,,, +48,278199,,,,,,,,,,,,0.0695239007472992,,,,,, +48,278249,,,,,,,,,,,,0.08581800758838654,,,,,, +48,278299,,,,,,,,,,,,0.07219536602497101,,,,,, +48,278349,,,,,,,,,,,,0.08627882599830627,,,,,, +48,278399,,,,,,,,,,,,0.07429136335849762,,,,,, +48,278449,,,,,,,,,,,,0.08282604068517685,,,,,, +48,278499,,,,,,,,,,,,0.08588232100009918,,,,,, +48,278549,,,,,,,,,,,,0.07814151048660278,,,,,, +48,278599,,,,,,,,,,,,0.07342882454395294,,,,,, +48,278649,,,,,,,,,,,,0.07900606840848923,,,,,, +48,278699,,,,,,,,,,,,0.07398650050163269,,,,,, +48,278749,,,,,,,,,,,,0.06493476033210754,,,,,, +48,278799,,,,,,,,,,,,0.08793145418167114,,,,,, +48,278849,,,,,,,,,,,,0.07225467264652252,,,,,, +48,278899,,,,,,,,,,,,0.06525448709726334,,,,,, +48,278949,,,,,,,,,,,,0.0843886137008667,,,,,, +48,278999,,,,,,,,,,,,0.07504532486200333,,,,,, +48,279049,,,,,,,,,,,,0.07611054182052612,,,,,, +48,279099,,,,,,,,,,,,0.0749177634716034,,,,,, +48,279149,,,,,,,,,,,,0.07577972859144211,,,,,, +48,279199,,,,,,,,,,,,0.07856724411249161,,,,,, +48,279249,,,,,,,,,,,,0.08345406502485275,,,,,, +48,279299,,,,,,,,,,,,0.06995239853858948,,,,,, +48,279349,,,,,,,,,,,,0.06444220244884491,,,,,, +48,279399,,,,,,,,,,,,0.07778476178646088,,,,,, +48,279449,,,,,,,,,,,,0.08530545979738235,,,,,, +48,279499,,,,,,,,,,,,0.07875724881887436,,,,,, +48,279549,,,,,,,,,,,,0.08521249890327454,,,,,, +48,279599,,,,,,,,,,,,0.08193977177143097,,,,,, +48,279649,,,,,,,,,,,,0.07079648226499557,,,,,, +48,279699,,,,,,,,,,,,0.0748501792550087,,,,,, +48,279749,,,,,,,,,,,,0.08839590847492218,,,,,, +48,279799,,,,,,,,,,,,0.0808975100517273,,,,,, +48,279849,,,,,,,,,,,,0.07571665197610855,,,,,, +48,279899,,,,,,,,,,,,0.07054711878299713,,,,,, +48,279949,,,,,,,,,,,,0.06438523530960083,,,,,, +48,279999,,,,,,,,,,,,0.0788988471031189,,,,,, +48,280049,,,,,,,,,,,,0.07156477868556976,,,,,, +48,280099,,,,,,,,,,,,0.08261187374591827,,,,,, +48,280149,,,,,,,,,,,,0.0656699687242508,,,,,, +48,280199,,,,,,,,,,,,0.07332522422075272,,,,,, +48,280249,,,,,,,,,,,,0.0650847926735878,,,,,, +48,280299,,,,,,,,,,,,0.07799148559570312,,,,,, +48,280349,,,,,,,,,,,,0.07615496218204498,,,,,, +48,280399,,,,,,,,,,,,0.08036114275455475,,,,,, +48,280449,,,,,,,,,,,,0.07572007179260254,,,,,, +48,280499,,,,,,,,,,,,0.07778443396091461,,,,,, +48,280549,,,,,,,,,,,,0.07430659979581833,,,,,, +48,280599,,,,,,,,,,,,0.06520019471645355,,,,,, +48,280649,,,,,,,,,,,,0.06500915437936783,,,,,, +48,280699,,,,,,,,,,,,0.07424300909042358,,,,,, +48,280749,,,,,,,,,,,,0.07497996091842651,,,,,, +48,280799,,,,,,,,,,,,0.07354686409235,,,,,, +48,280849,,,,,,,,,,,,0.07454320788383484,,,,,, +48,280899,,,,,,,,,,,,0.09256085753440857,,,,,, +48,280949,,,,,,,,,,,,0.07360279560089111,,,,,, +48,280999,,,,,,,,,,,,0.07751418650150299,,,,,, +48,281049,,,,,,,,,,,,0.06821399927139282,,,,,, +48,281063,,,,,,,,,,,,,0.24633239209651947,0.08479386568069458,0.16585321724414825,-0.028790950775146484,0.1581123322248459,0.08479386568069458 +48,281063,,,,,,,0.23396511375904083,0.07518486678600311,0.3025866448879242,0.0915493369102478,0.28241991996765137,,,,,,, +49,281099,,,,,,,,,,,,0.0759325623512268,,,,,, +49,281149,,,,,,,,,,,,0.07244817912578583,,,,,, +49,281199,,,,,,,,,,,,0.07592572271823883,,,,,, +49,281249,,,,,,,,,,,,0.06988844275474548,,,,,, +49,281299,,,,,,,,,,,,0.06877338141202927,,,,,, +49,281349,,,,,,,,,,,,0.06425420939922333,,,,,, +49,281399,,,,,,,,,,,,0.06924605369567871,,,,,, +49,281449,,,,,,,,,,,,0.07395705580711365,,,,,, +49,281499,,,,,,,,,,,,0.07557611912488937,,,,,, +49,281549,,,,,,,,,,,,0.07451416552066803,,,,,, +49,281599,,,,,,,,,,,,0.07575812935829163,,,,,, +49,281649,,,,,,,,,,,,0.07972588390111923,,,,,, +49,281699,,,,,,,,,,,,0.07364807277917862,,,,,, +49,281749,,,,,,,,,,,,0.07657031714916229,,,,,, +49,281799,,,,,,,,,,,,0.07717951387166977,,,,,, +49,281849,,,,,,,,,,,,0.07152687013149261,,,,,, +49,281899,,,,,,,,,,,,0.06870968639850616,,,,,, +49,281949,,,,,,,,,,,,0.06940878927707672,,,,,, +49,281999,,,,,,,,,,,,0.07594835013151169,,,,,, +49,282049,,,,,,,,,,,,0.08136577904224396,,,,,, +49,282099,,,,,,,,,,,,0.08077364414930344,,,,,, +49,282149,,,,,,,,,,,,0.08173239231109619,,,,,, +49,282199,,,,,,,,,,,,0.07668363302946091,,,,,, +49,282249,,,,,,,,,,,,0.07299920916557312,,,,,, +49,282299,,,,,,,,,,,,0.07284363359212875,,,,,, +49,282349,,,,,,,,,,,,0.06861385703086853,,,,,, +49,282399,,,,,,,,,,,,0.07923130691051483,,,,,, +49,282449,,,,,,,,,,,,0.06518660485744476,,,,,, +49,282499,,,,,,,,,,,,0.08264699578285217,,,,,, +49,282549,,,,,,,,,,,,0.07449916750192642,,,,,, +49,282599,,,,,,,,,,,,0.06684967875480652,,,,,, +49,282649,,,,,,,,,,,,0.07775542140007019,,,,,, +49,282699,,,,,,,,,,,,0.06700325757265091,,,,,, +49,282749,,,,,,,,,,,,0.06807228922843933,,,,,, +49,282799,,,,,,,,,,,,0.07290646433830261,,,,,, +49,282849,,,,,,,,,,,,0.07141542434692383,,,,,, +49,282899,,,,,,,,,,,,0.07658034563064575,,,,,, +49,282949,,,,,,,,,,,,0.07389090955257416,,,,,, +49,282999,,,,,,,,,,,,0.07997995615005493,,,,,, +49,283049,,,,,,,,,,,,0.07603754848241806,,,,,, +49,283099,,,,,,,,,,,,0.06802414357662201,,,,,, +49,283149,,,,,,,,,,,,0.08279494196176529,,,,,, +49,283199,,,,,,,,,,,,0.07504886388778687,,,,,, +49,283249,,,,,,,,,,,,0.07918278127908707,,,,,, +49,283299,,,,,,,,,,,,0.06579989194869995,,,,,, +49,283349,,,,,,,,,,,,0.0693180188536644,,,,,, +49,283399,,,,,,,,,,,,0.07195970416069031,,,,,, +49,283449,,,,,,,,,,,,0.06887629628181458,,,,,, +49,283499,,,,,,,,,,,,0.08575223386287689,,,,,, +49,283549,,,,,,,,,,,,0.08030177652835846,,,,,, +49,283599,,,,,,,,,,,,0.08232200890779495,,,,,, +49,283649,,,,,,,,,,,,0.07650928199291229,,,,,, +49,283699,,,,,,,,,,,,0.06996773183345795,,,,,, +49,283749,,,,,,,,,,,,0.07722266018390656,,,,,, +49,283799,,,,,,,,,,,,0.0684967115521431,,,,,, +49,283849,,,,,,,,,,,,0.07683201134204865,,,,,, +49,283899,,,,,,,,,,,,0.07197242975234985,,,,,, +49,283949,,,,,,,,,,,,0.0692836344242096,,,,,, +49,283999,,,,,,,,,,,,0.08329083770513535,,,,,, +49,284049,,,,,,,,,,,,0.08930885791778564,,,,,, +49,284099,,,,,,,,,,,,0.08595752716064453,,,,,, +49,284149,,,,,,,,,,,,0.0771050825715065,,,,,, +49,284199,,,,,,,,,,,,0.08708301186561584,,,,,, +49,284249,,,,,,,,,,,,0.07594501227140427,,,,,, +49,284299,,,,,,,,,,,,0.06934468448162079,,,,,, +49,284349,,,,,,,,,,,,0.07337651401758194,,,,,, +49,284399,,,,,,,,,,,,0.072874516248703,,,,,, +49,284449,,,,,,,,,,,,0.08100849390029907,,,,,, +49,284499,,,,,,,,,,,,0.07243235409259796,,,,,, +49,284549,,,,,,,,,,,,0.0745973289012909,,,,,, +49,284599,,,,,,,,,,,,0.06952808052301407,,,,,, +49,284649,,,,,,,,,,,,0.08203700184822083,,,,,, +49,284699,,,,,,,,,,,,0.07139702886343002,,,,,, +49,284749,,,,,,,,,,,,0.0813598781824112,,,,,, +49,284799,,,,,,,,,,,,0.06251318007707596,,,,,, +49,284849,,,,,,,,,,,,0.07929033041000366,,,,,, +49,284899,,,,,,,,,,,,0.07926370203495026,,,,,, +49,284949,,,,,,,,,,,,0.07060903310775757,,,,,, +49,284999,,,,,,,,,,,,0.07474065572023392,,,,,, +49,285049,,,,,,,,,,,,0.07232873141765594,,,,,, +49,285099,,,,,,,,,,,,0.06577334553003311,,,,,, +49,285149,,,,,,,,,,,,0.0672023743391037,,,,,, +49,285199,,,,,,,,,,,,0.0749581903219223,,,,,, +49,285249,,,,,,,,,,,,0.0832836851477623,,,,,, +49,285299,,,,,,,,,,,,0.06357422471046448,,,,,, +49,285349,,,,,,,,,,,,0.0736580491065979,,,,,, +49,285399,,,,,,,,,,,,0.08150716125965118,,,,,, +49,285449,,,,,,,,,,,,0.06515269726514816,,,,,, +49,285499,,,,,,,,,,,,0.06375537812709808,,,,,, +49,285549,,,,,,,,,,,,0.0902247279882431,,,,,, +49,285599,,,,,,,,,,,,0.08147614449262619,,,,,, +49,285649,,,,,,,,,,,,0.07794733345508575,,,,,, +49,285699,,,,,,,,,,,,0.07617945969104767,,,,,, +49,285749,,,,,,,,,,,,0.08263380080461502,,,,,, +49,285799,,,,,,,,,,,,0.07553986459970474,,,,,, +49,285849,,,,,,,,,,,,0.08616401255130768,,,,,, +49,285899,,,,,,,,,,,,0.06787972897291183,,,,,, +49,285949,,,,,,,,,,,,0.07017242908477783,,,,,, +49,285999,,,,,,,,,,,,0.07554681599140167,,,,,, +49,286049,,,,,,,,,,,,0.07624387741088867,,,,,, +49,286099,,,,,,,,,,,,0.06400466710329056,,,,,, +49,286149,,,,,,,,,,,,0.08031051605939865,,,,,, +49,286199,,,,,,,,,,,,0.0754333958029747,,,,,, +49,286249,,,,,,,,,,,,0.06885318458080292,,,,,, +49,286299,,,,,,,,,,,,0.07249635457992554,,,,,, +49,286349,,,,,,,,,,,,0.07091066986322403,,,,,, +49,286399,,,,,,,,,,,,0.08592791855335236,,,,,, +49,286449,,,,,,,,,,,,0.07410521805286407,,,,,, +49,286499,,,,,,,,,,,,0.07295380532741547,,,,,, +49,286549,,,,,,,,,,,,0.07901272177696228,,,,,, +49,286599,,,,,,,,,,,,0.0704696774482727,,,,,, +49,286649,,,,,,,,,,,,0.07670425623655319,,,,,, +49,286699,,,,,,,,,,,,0.0747760683298111,,,,,, +49,286749,,,,,,,,,,,,0.0664048045873642,,,,,, +49,286799,,,,,,,,,,,,0.05052993446588516,,,,,, +49,286799,,,,,,,,,,,,,0.24679316580295563,0.08509352058172226,0.1560870260000229,-0.03242671489715576,0.14836812019348145,0.08509352058172226 +49,286799,,,,,,,0.2339835911989212,0.07516740262508392,0.3029268682003021,0.09176689386367798,0.2820756733417511,,,,,,, +50,286800,0.24156196415424347,0.07841714471578598,0.2589475214481354,0.05173689126968384,0.25301650166511536,0.07841714471578598,,,,,,,,,,,, diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_score_macro.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_score_macro.py new file mode 100644 index 0000000000000000000000000000000000000000..2ec76d6c278f2187a8317410301c3cc122509c69 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_score_macro.py @@ -0,0 +1,288 @@ +#!/usr/bin/env python3 +"""Equal-assay MACRO Spearman for a trained GIFFLAR LGI run. + +WHY. GIFFLAR reports only a GLOBAL Spearman over all test rows. Our primary metric is the +equal-assay macro: Spearman computed INSIDE each exp_id, then averaged equally over assays. +Without this, GIFFLAR can appear in the pooled table but never the primary one. + +⛔ TRAPS THIS SCRIPT AVOIDS (all verified in the Nova tree, 2026-09-08/09): + +1. `LGI_Model.predict_step` (experiments/lgi_model.py:146) passes 4 args into a 1-arg `forward`. + It has NEVER executed. We call `model(batch)` directly and never touch a Lightning loop. +2. `on_validation_epoch_end` (:173) calls `lectin_embeddings.close()`, which PICKLES the ESM cache + back to disk. Entering any Lightning validate/test loop would rewrite a shared artifact. +3. `LectinStorage.__init__` (gifflar/model/utils.py:58,68) accepts `path` and never forwards it, so + the ESM cache resolves to `data/ESM_33.pkl` RELATIVE TO CWD. `gifflar_launch.py:91` does + `os.chdir(G)`, so the real cache is /data/ESM_33.pkl. We chdir identically. + ⛔ Run from anywhere else and every query misses, hits the broken + `self.encoder(q).mean(dim=1)` path on a 1-D [1280] tensor, and silently yields ZERO protein + vectors. Gate G_ZERO below refuses that. +4. No `save_hyperparameters` anywhere in the repo, so `load_from_checkpoint` cannot rebuild the + model. We construct it from the run's own hparams.yaml. +5. The converter's maps are NOT the ones LectinOracle uses: + seq_of = protein_full_sha256 -> protein_seq (NOT model_input_sha256) + w2i = affinose_wurcs_to_iupac_EXPANDED.json (NOT ..._usable.json) + Replicated exactly here; approximating them silently misaligns the join. + +JOIN DIRECTION. We map FORWARD, from our rows into GIFFLAR's key space: + (protein_id, glycan_wurcs) --seq_of/w2i--> (aa_seq, iupac) --> prediction +and broadcast that prediction to every one of our rows sharing the pair. GIFFLAR's prediction is a +deterministic function of (aa_seq, iupac), so broadcasting DESCRIBES the model rather than imputing. +⛔ Never merge GIFFLAR's rows onto ours by (aa_seq, iupac) -- that is the one-to-many direction and +pandas will duplicate rows with no error. + +METRIC. Eligibility is frozen on DATA ONLY (len >= MIN_ROWS and y has >= 2 distinct values); a model +whose predictions are CONSTANT on an eligible assay scores rho = 0 rather than having that assay +dropped from its own denominator. This is the same correction applied to LectinOracle. +""" +import argparse +import json +import os +import sys +from pathlib import Path + +import numpy as np +import pandas as pd +import torch +from scipy.stats import spearmanr + +B = "/work/ratul1/supantha/Bertint" +ART = os.path.join(B, "v2_artifacts") +GIF_ROOT = ("/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/" + "bench/models/GIFFLAR") +OWN = {"A_glycan": "test_glycan_cold", "B_protein": "test_protein_cold", + "C_doubly": "test_doubly_cold"} +MIN_ROWS, MIN_DISTINCT = 5, 2 + +ap = argparse.ArgumentParser() +ap.add_argument("--arm", required=True, choices=list(OWN)) +ap.add_argument("--variant", required=True, choices=["gifflarESM", "sweetnetESM"]) +ap.add_argument("--version", default=None, help="version_N; default = newest COMPLETE one") +ap.add_argument("--ckpt", default="best", choices=["best", "last"]) +ap.add_argument("--out", default=None) +A = ap.parse_args() + +STRAT = OWN[A.arm] +ARMDIR = os.path.join(B, "gifflar_lgi_%s" % A.arm) +LOGDIR = os.path.join(ARMDIR, "logs", "LGI_%s" % A.variant) +OUT = A.out or os.path.join(B, "affinose_gifflar_macro_%s_%s.json" % (A.arm, A.variant)) + +# ── pick the version dir ────────────────────────────────────────────────────────────────── +def is_complete(vd): + m = os.path.join(vd, "metrics.csv") + if not os.path.exists(m): + return False + try: + df = pd.read_csv(m) + except Exception: + return False + return "test/SpearmanCorrCoef" in df.columns and df["test/SpearmanCorrCoef"].notna().any() + +vers = sorted([d for d in os.listdir(LOGDIR) if d.startswith("version_")], + key=lambda d: int(d.split("_")[1])) +if A.version: + chosen = os.path.join(LOGDIR, A.version) +else: + done = [os.path.join(LOGDIR, v) for v in vers if is_complete(os.path.join(LOGDIR, v))] + if not done: + sys.exit("FATAL: no COMPLETE version dir under %s (versions seen: %s)" % (LOGDIR, vers)) + chosen = done[-1] +print("[ver] versions on disk: %s -> using %s" % (vers, os.path.basename(chosen)), flush=True) + +mdf = pd.read_csv(os.path.join(chosen, "metrics.csv")) +gif_reported = float(mdf["test/SpearmanCorrCoef"].dropna().iloc[-1]) +print("[ver] GIFFLAR's own reported test Spearman: %.6f" % gif_reported, flush=True) + +wdir = os.path.join(chosen, "weights") +cks = sorted(os.listdir(wdir)) +best = [c for c in cks if c != "last.ckpt"] +if A.ckpt == "best": + if len(best) != 1: + sys.exit("FATAL: expected exactly one monitored checkpoint, found %s" % best) + CKPT = os.path.join(wdir, best[0]) +else: + CKPT = os.path.join(wdir, "last.ckpt") +print("[ckpt] %s" % CKPT, flush=True) + +# ── ESM cache location depends on CWD (trap 3) ─────────────────────────────────────────── +os.chdir(GIF_ROOT) +CACHE = os.path.join(GIF_ROOT, "data", "ESM_33.pkl") +if not os.path.exists(CACHE): + sys.exit("FATAL: ESM cache absent at %s -- every protein would become a ZERO vector" % CACHE) +print("[esm] cache %s (%d bytes)" % (CACHE, os.path.getsize(CACHE)), flush=True) + +# ⛔ TRAP 6: `datasets` must be resolved BEFORE GIFFLAR joins sys.path. GIFFLAR ships a DATA +# directory at GIFFLAR/datasets/, and HuggingFace `datasets` is NOT installed in the gifflar env +# (it is absent from GIFFLAR's own requirements.txt), so `gifflar/train_lm.py:7` fails on import +# and takes the whole module tree with it. This mirrors gifflar_launch.py:45-84 exactly. +import types # noqa: E402 +import importlib.machinery # noqa: E402 +try: + import datasets # noqa: F401 + if not getattr(datasets, "__file__", None) or "site-packages" not in datasets.__file__: + raise ImportError("resolved to %r, not an installed library" + % getattr(datasets, "__file__", None)) + from datasets import load_dataset # noqa: F401 + print("[stub] datasets: REAL -> %s" % datasets.__file__, flush=True) +except (ImportError, ModuleNotFoundError) as _e: + _stub = types.ModuleType("datasets") + _stub.__file__ = "" + _stub.__affinose_stub__ = True + # A bare ModuleType has no __spec__, and transformers probes optional deps with + # importlib.util.find_spec("datasets"), which then raises ValueError. Give it a real spec. + _stub.__spec__ = importlib.machinery.ModuleSpec("datasets", loader=None) + _stub.__spec__.origin = "" + + def _load_dataset(*a, **k): + raise RuntimeError("GIFFLAR reached datasets.load_dataset -- the glylm path is live, " + "which is not part of this benchmark. Refusing to continue.") + + _stub.load_dataset = _load_dataset + sys.modules["datasets"] = _stub + print("[stub] datasets: ABSENT (%s) -> loud stub registered" % _e, flush=True) + +sys.path.insert(0, GIF_ROOT) + +from gifflar.utils import read_yaml_config # noqa: E402 +from gifflar.data.modules import LGI_GDM # noqa: E402 +from gifflar.pretransforms import get_pretransforms # noqa: E402 +from experiments.lgi_model import LGI_Model # noqa: E402 + +cfg = read_yaml_config(os.path.join(chosen, "hparams.yaml")) +ge = cfg["model"]["glycan_encoder"]["name"] +le = cfg["model"]["lectin_encoder"]["name"] +if ge + le != A.variant: + sys.exit("FATAL: hparams say variant %s%s but --variant is %s" % (ge, le, A.variant)) + +model = LGI_Model( + glycan_encoder_name=ge, glycan_encoder_args=cfg["model"]["glycan_encoder"], + lectin_encoder=le, le_layer_num=cfg["model"]["lectin_encoder"]["layer_num"], + add_tasks=[], **cfg) +sd = torch.load(CKPT, map_location="cpu")["state_dict"] +model.load_state_dict(sd, strict=True) # ⛔ STRICT. non-strict hides missing tensors +dev = "cuda" if torch.cuda.is_available() else "cpu" +model.to(dev) # class OVERRIDES .to(); do not use .cuda() +model.eval() +print("[model] %s loaded strict, on %s" % (A.variant, dev), flush=True) + +dm = LGI_GDM(root=cfg["root_dir"], filename=cfg["origin"], hash_code=cfg["hash"], + batch_size=cfg["model"].get("batch_size", 128), transform=None, num_workers=0, + pre_transform=get_pretransforms("", **(cfg.get("pre-transforms") or {}))) +dl = dm.test_dataloader() + +ids, iup, seqs, ys, ps = [], [], [], [], [] +with torch.no_grad(): + for batch in dl: + batch = batch.to(dev) + bi, bu, bs = list(batch["ID"]), list(batch["IUPAC"]), list(batch["aa_seq"]) + y = batch["y"].reshape(-1).float().cpu().numpy() + p = model(batch)["preds"].reshape(-1).float().cpu().numpy() + if not (len(bi) == len(bu) == len(bs) == len(y) == len(p)): + sys.exit("FATAL: batch field lengths disagree -- hetero_collate dropped a key") + ids += bi; iup += bu; seqs += bs; ys += list(y); ps += list(p) +print("[infer] %d rows returned by GIFFLAR" % len(ps), flush=True) + +gy, gp = np.asarray(ys, float), np.asarray(ps, float) +pooled_gif = float(spearmanr(gp, gy).correlation) +print("[check] pooled Spearman over GIFFLAR's OWN rows: %.6f (its metrics.csv: %.6f, diff %.6f)" + % (pooled_gif, gif_reported, pooled_gif - gif_reported), flush=True) + +# ⛔ G_ZERO: a dead protein tower gives identical predictions for one glycan across proteins. +gdf = pd.DataFrame({"aa": seqs, "iupac": iup, "p": gp}) +byg = gdf.groupby("iupac")["p"].nunique() +multi = gdf.groupby("iupac")["aa"].nunique() +shared = byg[multi > 1] +frac_const = float((shared <= 1).mean()) if len(shared) else float("nan") +print("[gate] glycans seen with >1 protein: %d; fraction with a CONSTANT prediction: %.4f" + % (len(shared), frac_const), flush=True) +if len(shared) and frac_const > 0.5: + sys.exit("FATAL G_ZERO: most glycans predict identically across different proteins -- the " + "protein tower is not contributing. Refusing to emit a number.") + +# ── our rows, using the CONVERTER'S EXACT maps ──────────────────────────────────────────── +csv = pd.read_csv(os.path.join(ART, "review_affinose_%s_binding.csv" % A.arm)) +roles = pd.read_csv(os.path.join(ART, "review_affinose_%s_roles.tsv.gz" % A.arm), + sep="\t", compression="gzip") +prot = pd.read_csv(os.path.join(ART, "affinose_v2_proteins.tsv.gz"), sep="\t", compression="gzip") +w2i = json.load(open(os.path.join(B, "affinose_wurcs_to_iupac_expanded.json"))) +seq_of = dict(zip(prot["protein_full_sha256"].astype(str), prot["protein_seq"].astype(str))) + +m = csv[["protein_id", "glycan_wurcs"]].merge( + roles[["protein_id", "glycan_wurcs", "evaluation_stratum"]], + on=["protein_id", "glycan_wurcs"], how="left", validate="many_to_one") +csv["stratum"] = m["evaluation_stratum"].values +te = csv[csv["stratum"] == STRAT].copy() +n_stratum = len(te) +te["aa"] = te["protein_id"].astype(str).map(seq_of) +te["iupac"] = te["glycan_wurcs"].map(w2i) +te = te[te["aa"].notna() & te["iupac"].notna()] +print("[ours] stratum %s: %d rows, %d after requiring aa+iupac (GIFFLAR-scorable)" + % (STRAT, n_stratum, len(te)), flush=True) + +pred_by_key, spread = {}, 0.0 +for k, g in gdf.groupby(["aa", "iupac"])["p"]: + v = g.to_numpy() + spread = max(spread, float(v.max() - v.min())) + pred_by_key[k] = float(v.mean()) +print("[join] %d distinct (aa,iupac) keys; max within-key spread %.3e" % (len(pred_by_key), spread), + flush=True) +if spread > 1e-3: + sys.exit("FATAL: predictions disagree within a single (aa,iupac) key by %.3e" % spread) + +te["p"] = [pred_by_key.get((a, i), np.nan) for a, i in zip(te["aa"], te["iupac"])] +n_unmapped = int(te["p"].isna().sum()) +te = te[te["p"].notna()] +print("[join] joined %d rows (%d of our GIFFLAR-scorable rows had no prediction)" + % (len(te), n_unmapped), flush=True) + + +def macro(df, denom_assays): + """Equal-assay macro. Eligibility on DATA ONLY; constant predictions score rho = 0.""" + vals, n_const = [], 0 + for _e, sub in df.groupby("exp_id"): + if len(sub) < MIN_ROWS: + continue + y = sub["target_rank"].to_numpy(float) + if len(np.unique(y)) < MIN_DISTINCT: + continue + p = sub["p"].to_numpy(float) + if len(np.unique(p)) < MIN_DISTINCT: + vals.append(0.0); n_const += 1; continue + r = spearmanr(p, y).correlation + if np.isfinite(r): + vals.append(float(r)) + scored = len(vals) + if denom_assays and denom_assays > scored: + vals = vals + [0.0] * (denom_assays - scored) # assays GIFFLAR cannot score -> rho 0 + return (float(np.mean(vals)) if vals else float("nan")), scored, n_const + + +# data-only eligible assay set over the FULL stratum (model-independent denominator) +full = csv[csv["stratum"] == STRAT] +elig = 0 +for _e, sub in full.groupby("exp_id"): + if len(sub) >= MIN_ROWS and sub["target_rank"].nunique() >= MIN_DISTINCT: + elig += 1 + +m_scored, n_sc, n_const = macro(te, 0) +m_corr, _, _ = macro(te, elig) +pooled_ours = float(spearmanr(te["p"].to_numpy(float), + te["target_rank"].to_numpy(float)).correlation) + +res = {"arm": A.arm, "variant": A.variant, "stratum": STRAT, + "version_dir": chosen, "checkpoint": CKPT, + "gifflar_reported_test_spearman": round(gif_reported, 6), + "pooled_over_gifflar_rows": round(pooled_gif, 6), + "pooled_reproduces_gifflar": bool(abs(pooled_gif - gif_reported) < 5e-3), + "rows_stratum_total": int(n_stratum), "rows_scored": int(len(te)), + "assays_eligible_data_only": int(elig), "assays_scored": int(n_sc), + "assays_constant_pred_scored_zero": int(n_const), + "macro_over_scored_assays": round(m_scored, 6), + "macro_eligibility_corrected": round(m_corr, 6), + "pooled_over_our_rows": round(pooled_ours, 6), + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score " + "count as rho=0 against the data-only eligible denominator, matching the correction " + "applied to LectinOracle."} +json.dump(res, open(OUT, "w"), indent=1) +print(json.dumps(res, indent=1), flush=True) +print("[done] wrote %s" % OUT, flush=True) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_score_macro_seeds.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_score_macro_seeds.py new file mode 100644 index 0000000000000000000000000000000000000000..95306bd2b6188da543a6360c21556d0361f299aa --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_score_macro_seeds.py @@ -0,0 +1,295 @@ +#!/usr/bin/env python3 +"""Equal-assay MACRO Spearman for a trained GIFFLAR LGI run. + +WHY. GIFFLAR reports only a GLOBAL Spearman over all test rows. Our primary metric is the +equal-assay macro: Spearman computed INSIDE each exp_id, then averaged equally over assays. +Without this, GIFFLAR can appear in the pooled table but never the primary one. + +⛔ TRAPS THIS SCRIPT AVOIDS (all verified in the Nova tree, 2026-09-08/09): + +1. `LGI_Model.predict_step` (experiments/lgi_model.py:146) passes 4 args into a 1-arg `forward`. + It has NEVER executed. We call `model(batch)` directly and never touch a Lightning loop. +2. `on_validation_epoch_end` (:173) calls `lectin_embeddings.close()`, which PICKLES the ESM cache + back to disk. Entering any Lightning validate/test loop would rewrite a shared artifact. +3. `LectinStorage.__init__` (gifflar/model/utils.py:58,68) accepts `path` and never forwards it, so + the ESM cache resolves to `data/ESM_33.pkl` RELATIVE TO CWD. `gifflar_launch.py:91` does + `os.chdir(G)`, so the real cache is /data/ESM_33.pkl. We chdir identically. + ⛔ Run from anywhere else and every query misses, hits the broken + `self.encoder(q).mean(dim=1)` path on a 1-D [1280] tensor, and silently yields ZERO protein + vectors. Gate G_ZERO below refuses that. +4. No `save_hyperparameters` anywhere in the repo, so `load_from_checkpoint` cannot rebuild the + model. We construct it from the run's own hparams.yaml. +5. The converter's maps are NOT the ones LectinOracle uses: + seq_of = protein_full_sha256 -> protein_seq (NOT model_input_sha256) + w2i = affinose_wurcs_to_iupac_EXPANDED.json (NOT ..._usable.json) + Replicated exactly here; approximating them silently misaligns the join. + +JOIN DIRECTION. We map FORWARD, from our rows into GIFFLAR's key space: + (protein_id, glycan_wurcs) --seq_of/w2i--> (aa_seq, iupac) --> prediction +and broadcast that prediction to every one of our rows sharing the pair. GIFFLAR's prediction is a +deterministic function of (aa_seq, iupac), so broadcasting DESCRIBES the model rather than imputing. +⛔ Never merge GIFFLAR's rows onto ours by (aa_seq, iupac) -- that is the one-to-many direction and +pandas will duplicate rows with no error. + +METRIC. Eligibility is frozen on DATA ONLY (len >= MIN_ROWS and y has >= 2 distinct values); a model +whose predictions are CONSTANT on an eligible assay scores rho = 0 rather than having that assay +dropped from its own denominator. This is the same correction applied to LectinOracle. +""" +import argparse +import json +import os +import sys +from pathlib import Path + +import numpy as np +import pandas as pd +import torch +from scipy.stats import spearmanr + +B = "/work/ratul1/supantha/Bertint" +ART = os.path.join(B, "v2_artifacts") +GIF_ROOT = ("/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/" + "bench/models/GIFFLAR") +OWN = {"A_glycan": "test_glycan_cold", "B_protein": "test_protein_cold", + "C_doubly": "test_doubly_cold"} +MIN_ROWS, MIN_DISTINCT = 5, 2 + +ap = argparse.ArgumentParser() +ap.add_argument("--arm", required=True, choices=list(OWN)) +ap.add_argument("--variant", required=True, choices=["gifflarESM", "sweetnetESM"]) +ap.add_argument("--version", default=None, help="version_N; default = newest COMPLETE one") +ap.add_argument("--ckpt", default="best", choices=["best", "last"]) +ap.add_argument("--out", default=None) +# seeds copy (2026-09-26): the ONLY two changes vs gifflar_score_macro.py. Defaults reproduce the +# original exactly; seed runs pass --logs_dir logs_s_ and --tag s. +ap.add_argument("--logs_dir", default="logs", help="log dir under the arm dir (seed runs: logs_s_)") +ap.add_argument("--tag", default="", help="appended to the output name so seed 42 results are never overwritten") +A = ap.parse_args() + +STRAT = OWN[A.arm] +ARMDIR = os.path.join(B, "gifflar_lgi_%s" % A.arm) +LOGDIR = os.path.join(ARMDIR, A.logs_dir, "LGI_%s" % A.variant) +OUT = A.out or os.path.join(B, "affinose_gifflar_macro_%s_%s%s.json" + % (A.arm, A.variant, ("_" + A.tag) if A.tag else "")) +if os.path.exists(OUT): + sys.exit("FATAL: %s exists -- refusing to overwrite" % OUT) + +# ── pick the version dir ────────────────────────────────────────────────────────────────── +def is_complete(vd): + m = os.path.join(vd, "metrics.csv") + if not os.path.exists(m): + return False + try: + df = pd.read_csv(m) + except Exception: + return False + return "test/SpearmanCorrCoef" in df.columns and df["test/SpearmanCorrCoef"].notna().any() + +vers = sorted([d for d in os.listdir(LOGDIR) if d.startswith("version_")], + key=lambda d: int(d.split("_")[1])) +if A.version: + chosen = os.path.join(LOGDIR, A.version) +else: + done = [os.path.join(LOGDIR, v) for v in vers if is_complete(os.path.join(LOGDIR, v))] + if not done: + sys.exit("FATAL: no COMPLETE version dir under %s (versions seen: %s)" % (LOGDIR, vers)) + chosen = done[-1] +print("[ver] versions on disk: %s -> using %s" % (vers, os.path.basename(chosen)), flush=True) + +mdf = pd.read_csv(os.path.join(chosen, "metrics.csv")) +gif_reported = float(mdf["test/SpearmanCorrCoef"].dropna().iloc[-1]) +print("[ver] GIFFLAR's own reported test Spearman: %.6f" % gif_reported, flush=True) + +wdir = os.path.join(chosen, "weights") +cks = sorted(os.listdir(wdir)) +best = [c for c in cks if c != "last.ckpt"] +if A.ckpt == "best": + if len(best) != 1: + sys.exit("FATAL: expected exactly one monitored checkpoint, found %s" % best) + CKPT = os.path.join(wdir, best[0]) +else: + CKPT = os.path.join(wdir, "last.ckpt") +print("[ckpt] %s" % CKPT, flush=True) + +# ── ESM cache location depends on CWD (trap 3) ─────────────────────────────────────────── +os.chdir(GIF_ROOT) +CACHE = os.path.join(GIF_ROOT, "data", "ESM_33.pkl") +if not os.path.exists(CACHE): + sys.exit("FATAL: ESM cache absent at %s -- every protein would become a ZERO vector" % CACHE) +print("[esm] cache %s (%d bytes)" % (CACHE, os.path.getsize(CACHE)), flush=True) + +# ⛔ TRAP 6: `datasets` must be resolved BEFORE GIFFLAR joins sys.path. GIFFLAR ships a DATA +# directory at GIFFLAR/datasets/, and HuggingFace `datasets` is NOT installed in the gifflar env +# (it is absent from GIFFLAR's own requirements.txt), so `gifflar/train_lm.py:7` fails on import +# and takes the whole module tree with it. This mirrors gifflar_launch.py:45-84 exactly. +import types # noqa: E402 +import importlib.machinery # noqa: E402 +try: + import datasets # noqa: F401 + if not getattr(datasets, "__file__", None) or "site-packages" not in datasets.__file__: + raise ImportError("resolved to %r, not an installed library" + % getattr(datasets, "__file__", None)) + from datasets import load_dataset # noqa: F401 + print("[stub] datasets: REAL -> %s" % datasets.__file__, flush=True) +except (ImportError, ModuleNotFoundError) as _e: + _stub = types.ModuleType("datasets") + _stub.__file__ = "" + _stub.__affinose_stub__ = True + # A bare ModuleType has no __spec__, and transformers probes optional deps with + # importlib.util.find_spec("datasets"), which then raises ValueError. Give it a real spec. + _stub.__spec__ = importlib.machinery.ModuleSpec("datasets", loader=None) + _stub.__spec__.origin = "" + + def _load_dataset(*a, **k): + raise RuntimeError("GIFFLAR reached datasets.load_dataset -- the glylm path is live, " + "which is not part of this benchmark. Refusing to continue.") + + _stub.load_dataset = _load_dataset + sys.modules["datasets"] = _stub + print("[stub] datasets: ABSENT (%s) -> loud stub registered" % _e, flush=True) + +sys.path.insert(0, GIF_ROOT) + +from gifflar.utils import read_yaml_config # noqa: E402 +from gifflar.data.modules import LGI_GDM # noqa: E402 +from gifflar.pretransforms import get_pretransforms # noqa: E402 +from experiments.lgi_model import LGI_Model # noqa: E402 + +cfg = read_yaml_config(os.path.join(chosen, "hparams.yaml")) +ge = cfg["model"]["glycan_encoder"]["name"] +le = cfg["model"]["lectin_encoder"]["name"] +if ge + le != A.variant: + sys.exit("FATAL: hparams say variant %s%s but --variant is %s" % (ge, le, A.variant)) + +model = LGI_Model( + glycan_encoder_name=ge, glycan_encoder_args=cfg["model"]["glycan_encoder"], + lectin_encoder=le, le_layer_num=cfg["model"]["lectin_encoder"]["layer_num"], + add_tasks=[], **cfg) +sd = torch.load(CKPT, map_location="cpu")["state_dict"] +model.load_state_dict(sd, strict=True) # ⛔ STRICT. non-strict hides missing tensors +dev = "cuda" if torch.cuda.is_available() else "cpu" +model.to(dev) # class OVERRIDES .to(); do not use .cuda() +model.eval() +print("[model] %s loaded strict, on %s" % (A.variant, dev), flush=True) + +dm = LGI_GDM(root=cfg["root_dir"], filename=cfg["origin"], hash_code=cfg["hash"], + batch_size=cfg["model"].get("batch_size", 128), transform=None, num_workers=0, + pre_transform=get_pretransforms("", **(cfg.get("pre-transforms") or {}))) +dl = dm.test_dataloader() + +ids, iup, seqs, ys, ps = [], [], [], [], [] +with torch.no_grad(): + for batch in dl: + batch = batch.to(dev) + bi, bu, bs = list(batch["ID"]), list(batch["IUPAC"]), list(batch["aa_seq"]) + y = batch["y"].reshape(-1).float().cpu().numpy() + p = model(batch)["preds"].reshape(-1).float().cpu().numpy() + if not (len(bi) == len(bu) == len(bs) == len(y) == len(p)): + sys.exit("FATAL: batch field lengths disagree -- hetero_collate dropped a key") + ids += bi; iup += bu; seqs += bs; ys += list(y); ps += list(p) +print("[infer] %d rows returned by GIFFLAR" % len(ps), flush=True) + +gy, gp = np.asarray(ys, float), np.asarray(ps, float) +pooled_gif = float(spearmanr(gp, gy).correlation) +print("[check] pooled Spearman over GIFFLAR's OWN rows: %.6f (its metrics.csv: %.6f, diff %.6f)" + % (pooled_gif, gif_reported, pooled_gif - gif_reported), flush=True) + +# ⛔ G_ZERO: a dead protein tower gives identical predictions for one glycan across proteins. +gdf = pd.DataFrame({"aa": seqs, "iupac": iup, "p": gp}) +byg = gdf.groupby("iupac")["p"].nunique() +multi = gdf.groupby("iupac")["aa"].nunique() +shared = byg[multi > 1] +frac_const = float((shared <= 1).mean()) if len(shared) else float("nan") +print("[gate] glycans seen with >1 protein: %d; fraction with a CONSTANT prediction: %.4f" + % (len(shared), frac_const), flush=True) +if len(shared) and frac_const > 0.5: + sys.exit("FATAL G_ZERO: most glycans predict identically across different proteins -- the " + "protein tower is not contributing. Refusing to emit a number.") + +# ── our rows, using the CONVERTER'S EXACT maps ──────────────────────────────────────────── +csv = pd.read_csv(os.path.join(ART, "review_affinose_%s_binding.csv" % A.arm)) +roles = pd.read_csv(os.path.join(ART, "review_affinose_%s_roles.tsv.gz" % A.arm), + sep="\t", compression="gzip") +prot = pd.read_csv(os.path.join(ART, "affinose_v2_proteins.tsv.gz"), sep="\t", compression="gzip") +w2i = json.load(open(os.path.join(B, "affinose_wurcs_to_iupac_expanded.json"))) +seq_of = dict(zip(prot["protein_full_sha256"].astype(str), prot["protein_seq"].astype(str))) + +m = csv[["protein_id", "glycan_wurcs"]].merge( + roles[["protein_id", "glycan_wurcs", "evaluation_stratum"]], + on=["protein_id", "glycan_wurcs"], how="left", validate="many_to_one") +csv["stratum"] = m["evaluation_stratum"].values +te = csv[csv["stratum"] == STRAT].copy() +n_stratum = len(te) +te["aa"] = te["protein_id"].astype(str).map(seq_of) +te["iupac"] = te["glycan_wurcs"].map(w2i) +te = te[te["aa"].notna() & te["iupac"].notna()] +print("[ours] stratum %s: %d rows, %d after requiring aa+iupac (GIFFLAR-scorable)" + % (STRAT, n_stratum, len(te)), flush=True) + +pred_by_key, spread = {}, 0.0 +for k, g in gdf.groupby(["aa", "iupac"])["p"]: + v = g.to_numpy() + spread = max(spread, float(v.max() - v.min())) + pred_by_key[k] = float(v.mean()) +print("[join] %d distinct (aa,iupac) keys; max within-key spread %.3e" % (len(pred_by_key), spread), + flush=True) +if spread > 1e-3: + sys.exit("FATAL: predictions disagree within a single (aa,iupac) key by %.3e" % spread) + +te["p"] = [pred_by_key.get((a, i), np.nan) for a, i in zip(te["aa"], te["iupac"])] +n_unmapped = int(te["p"].isna().sum()) +te = te[te["p"].notna()] +print("[join] joined %d rows (%d of our GIFFLAR-scorable rows had no prediction)" + % (len(te), n_unmapped), flush=True) + + +def macro(df, denom_assays): + """Equal-assay macro. Eligibility on DATA ONLY; constant predictions score rho = 0.""" + vals, n_const = [], 0 + for _e, sub in df.groupby("exp_id"): + if len(sub) < MIN_ROWS: + continue + y = sub["target_rank"].to_numpy(float) + if len(np.unique(y)) < MIN_DISTINCT: + continue + p = sub["p"].to_numpy(float) + if len(np.unique(p)) < MIN_DISTINCT: + vals.append(0.0); n_const += 1; continue + r = spearmanr(p, y).correlation + if np.isfinite(r): + vals.append(float(r)) + scored = len(vals) + if denom_assays and denom_assays > scored: + vals = vals + [0.0] * (denom_assays - scored) # assays GIFFLAR cannot score -> rho 0 + return (float(np.mean(vals)) if vals else float("nan")), scored, n_const + + +# data-only eligible assay set over the FULL stratum (model-independent denominator) +full = csv[csv["stratum"] == STRAT] +elig = 0 +for _e, sub in full.groupby("exp_id"): + if len(sub) >= MIN_ROWS and sub["target_rank"].nunique() >= MIN_DISTINCT: + elig += 1 + +m_scored, n_sc, n_const = macro(te, 0) +m_corr, _, _ = macro(te, elig) +pooled_ours = float(spearmanr(te["p"].to_numpy(float), + te["target_rank"].to_numpy(float)).correlation) + +res = {"arm": A.arm, "variant": A.variant, "stratum": STRAT, + "version_dir": chosen, "checkpoint": CKPT, + "gifflar_reported_test_spearman": round(gif_reported, 6), + "pooled_over_gifflar_rows": round(pooled_gif, 6), + "pooled_reproduces_gifflar": bool(abs(pooled_gif - gif_reported) < 5e-3), + "rows_stratum_total": int(n_stratum), "rows_scored": int(len(te)), + "assays_eligible_data_only": int(elig), "assays_scored": int(n_sc), + "assays_constant_pred_scored_zero": int(n_const), + "macro_over_scored_assays": round(m_scored, 6), + "macro_eligibility_corrected": round(m_corr, 6), + "pooled_over_our_rows": round(pooled_ours, 6), + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score " + "count as rho=0 against the data-only eligible denominator, matching the correction " + "applied to LectinOracle."} +json.dump(res, open(OUT, "w"), indent=1) +print(json.dumps(res, indent=1), flush=True) +print("[done] wrote %s" % OUT, flush=True) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_score_perrow.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_score_perrow.py new file mode 100644 index 0000000000000000000000000000000000000000..bac26b764f2499df7ad301bc85b99de175914046 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/gifflar_score_perrow.py @@ -0,0 +1,316 @@ +#!/usr/bin/env python3 +"""Equal-assay MACRO Spearman for a trained GIFFLAR LGI run. + +WHY. GIFFLAR reports only a GLOBAL Spearman over all test rows. Our primary metric is the +equal-assay macro: Spearman computed INSIDE each exp_id, then averaged equally over assays. +Without this, GIFFLAR can appear in the pooled table but never the primary one. + +⛔ TRAPS THIS SCRIPT AVOIDS (all verified in the Nova tree, 2026-09-08/09): + +1. `LGI_Model.predict_step` (experiments/lgi_model.py:146) passes 4 args into a 1-arg `forward`. + It has NEVER executed. We call `model(batch)` directly and never touch a Lightning loop. +2. `on_validation_epoch_end` (:173) calls `lectin_embeddings.close()`, which PICKLES the ESM cache + back to disk. Entering any Lightning validate/test loop would rewrite a shared artifact. +3. `LectinStorage.__init__` (gifflar/model/utils.py:58,68) accepts `path` and never forwards it, so + the ESM cache resolves to `data/ESM_33.pkl` RELATIVE TO CWD. `gifflar_launch.py:91` does + `os.chdir(G)`, so the real cache is /data/ESM_33.pkl. We chdir identically. + ⛔ Run from anywhere else and every query misses, hits the broken + `self.encoder(q).mean(dim=1)` path on a 1-D [1280] tensor, and silently yields ZERO protein + vectors. Gate G_ZERO below refuses that. +4. No `save_hyperparameters` anywhere in the repo, so `load_from_checkpoint` cannot rebuild the + model. We construct it from the run's own hparams.yaml. +5. The converter's maps are NOT the ones LectinOracle uses: + seq_of = protein_full_sha256 -> protein_seq (NOT model_input_sha256) + w2i = affinose_wurcs_to_iupac_EXPANDED.json (NOT ..._usable.json) + Replicated exactly here; approximating them silently misaligns the join. + +JOIN DIRECTION. We map FORWARD, from our rows into GIFFLAR's key space: + (protein_id, glycan_wurcs) --seq_of/w2i--> (aa_seq, iupac) --> prediction +and broadcast that prediction to every one of our rows sharing the pair. GIFFLAR's prediction is a +deterministic function of (aa_seq, iupac), so broadcasting DESCRIBES the model rather than imputing. +⛔ Never merge GIFFLAR's rows onto ours by (aa_seq, iupac) -- that is the one-to-many direction and +pandas will duplicate rows with no error. + +METRIC. Eligibility is frozen on DATA ONLY (len >= MIN_ROWS and y has >= 2 distinct values); a model +whose predictions are CONSTANT on an eligible assay scores rho = 0 rather than having that assay +dropped from its own denominator. This is the same correction applied to LectinOracle. +""" +import argparse +import json +import os +import sys +from pathlib import Path + +import numpy as np +import pandas as pd +import torch +from scipy.stats import spearmanr + +B = "/work/ratul1/supantha/Bertint" +ART = os.path.join(B, "v2_artifacts") +GIF_ROOT = ("/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/" + "bench/models/GIFFLAR") +OWN = {"A_glycan": "test_glycan_cold", "B_protein": "test_protein_cold", + "C_doubly": "test_doubly_cold"} +MIN_ROWS, MIN_DISTINCT = 5, 2 + +ap = argparse.ArgumentParser() +ap.add_argument("--arm", required=True, choices=list(OWN)) +ap.add_argument("--variant", required=True, choices=["gifflarESM", "sweetnetESM"]) +ap.add_argument("--version", default=None, help="version_N; default = newest COMPLETE one") +ap.add_argument("--ckpt", default="best", choices=["best", "last"]) +ap.add_argument("--out", default=None) +# seeds copy (2026-09-26): the ONLY two changes vs gifflar_score_macro.py. Defaults reproduce the +# original exactly; seed runs pass --logs_dir logs_s_ and --tag s. +ap.add_argument("--logs_dir", default="logs", help="log dir under the arm dir (seed runs: logs_s_)") +ap.add_argument("--tag", default="", help="appended to the output name so seed 42 results are never overwritten") +# #4 per-row copy (2026-09-26): two more arguments. --from_receipt reuses the EXACT version dir and +# checkpoint an existing result file recorded, so nothing is re-chosen; --perrow dumps the aligned rows. +ap.add_argument("--from_receipt", default=None, help="existing result JSON whose version_dir+checkpoint to reuse") +ap.add_argument("--perrow", default=None, help="write per-row (exp_id, protein, glycan, target, pred) here") +A = ap.parse_args() + +STRAT = OWN[A.arm] +ARMDIR = os.path.join(B, "gifflar_lgi_%s" % A.arm) +LOGDIR = os.path.join(ARMDIR, A.logs_dir, "LGI_%s" % A.variant) +OUT = A.out or os.path.join(B, "affinose_gifflar_macro_%s_%s%s.json" + % (A.arm, A.variant, ("_" + A.tag) if A.tag else "")) +if os.path.exists(OUT): + sys.exit("FATAL: %s exists -- refusing to overwrite" % OUT) + +# ── pick the version dir ────────────────────────────────────────────────────────────────── +def is_complete(vd): + m = os.path.join(vd, "metrics.csv") + if not os.path.exists(m): + return False + try: + df = pd.read_csv(m) + except Exception: + return False + return "test/SpearmanCorrCoef" in df.columns and df["test/SpearmanCorrCoef"].notna().any() + +vers = sorted([d for d in os.listdir(LOGDIR) if d.startswith("version_")], + key=lambda d: int(d.split("_")[1])) +if A.version: + chosen = os.path.join(LOGDIR, A.version) +else: + done = [os.path.join(LOGDIR, v) for v in vers if is_complete(os.path.join(LOGDIR, v))] + if not done: + sys.exit("FATAL: no COMPLETE version dir under %s (versions seen: %s)" % (LOGDIR, vers)) + chosen = done[-1] +print("[ver] versions on disk: %s -> using %s" % (vers, os.path.basename(chosen)), flush=True) +_RC = None +if A.from_receipt: + _RC = json.load(open(A.from_receipt)) + chosen = _RC["version_dir"] + print("[ver] OVERRIDE from receipt %s -> %s" % (A.from_receipt, chosen), flush=True) + +mdf = pd.read_csv(os.path.join(chosen, "metrics.csv")) +gif_reported = float(mdf["test/SpearmanCorrCoef"].dropna().iloc[-1]) +print("[ver] GIFFLAR's own reported test Spearman: %.6f" % gif_reported, flush=True) + +wdir = os.path.join(chosen, "weights") +cks = sorted(os.listdir(wdir)) +best = [c for c in cks if c != "last.ckpt"] +if A.ckpt == "best": + if len(best) != 1: + sys.exit("FATAL: expected exactly one monitored checkpoint, found %s" % best) + CKPT = os.path.join(wdir, best[0]) +else: + CKPT = os.path.join(wdir, "last.ckpt") +if _RC is not None: + CKPT = _RC["checkpoint"] +print("[ckpt] %s" % CKPT, flush=True) + +# ── ESM cache location depends on CWD (trap 3) ─────────────────────────────────────────── +os.chdir(GIF_ROOT) +CACHE = os.path.join(GIF_ROOT, "data", "ESM_33.pkl") +if not os.path.exists(CACHE): + sys.exit("FATAL: ESM cache absent at %s -- every protein would become a ZERO vector" % CACHE) +print("[esm] cache %s (%d bytes)" % (CACHE, os.path.getsize(CACHE)), flush=True) + +# ⛔ TRAP 6: `datasets` must be resolved BEFORE GIFFLAR joins sys.path. GIFFLAR ships a DATA +# directory at GIFFLAR/datasets/, and HuggingFace `datasets` is NOT installed in the gifflar env +# (it is absent from GIFFLAR's own requirements.txt), so `gifflar/train_lm.py:7` fails on import +# and takes the whole module tree with it. This mirrors gifflar_launch.py:45-84 exactly. +import types # noqa: E402 +import importlib.machinery # noqa: E402 +try: + import datasets # noqa: F401 + if not getattr(datasets, "__file__", None) or "site-packages" not in datasets.__file__: + raise ImportError("resolved to %r, not an installed library" + % getattr(datasets, "__file__", None)) + from datasets import load_dataset # noqa: F401 + print("[stub] datasets: REAL -> %s" % datasets.__file__, flush=True) +except (ImportError, ModuleNotFoundError) as _e: + _stub = types.ModuleType("datasets") + _stub.__file__ = "" + _stub.__affinose_stub__ = True + # A bare ModuleType has no __spec__, and transformers probes optional deps with + # importlib.util.find_spec("datasets"), which then raises ValueError. Give it a real spec. + _stub.__spec__ = importlib.machinery.ModuleSpec("datasets", loader=None) + _stub.__spec__.origin = "" + + def _load_dataset(*a, **k): + raise RuntimeError("GIFFLAR reached datasets.load_dataset -- the glylm path is live, " + "which is not part of this benchmark. Refusing to continue.") + + _stub.load_dataset = _load_dataset + sys.modules["datasets"] = _stub + print("[stub] datasets: ABSENT (%s) -> loud stub registered" % _e, flush=True) + +sys.path.insert(0, GIF_ROOT) + +from gifflar.utils import read_yaml_config # noqa: E402 +from gifflar.data.modules import LGI_GDM # noqa: E402 +from gifflar.pretransforms import get_pretransforms # noqa: E402 +from experiments.lgi_model import LGI_Model # noqa: E402 + +cfg = read_yaml_config(os.path.join(chosen, "hparams.yaml")) +ge = cfg["model"]["glycan_encoder"]["name"] +le = cfg["model"]["lectin_encoder"]["name"] +if ge + le != A.variant: + sys.exit("FATAL: hparams say variant %s%s but --variant is %s" % (ge, le, A.variant)) + +model = LGI_Model( + glycan_encoder_name=ge, glycan_encoder_args=cfg["model"]["glycan_encoder"], + lectin_encoder=le, le_layer_num=cfg["model"]["lectin_encoder"]["layer_num"], + add_tasks=[], **cfg) +sd = torch.load(CKPT, map_location="cpu")["state_dict"] +model.load_state_dict(sd, strict=True) # ⛔ STRICT. non-strict hides missing tensors +dev = "cuda" if torch.cuda.is_available() else "cpu" +model.to(dev) # class OVERRIDES .to(); do not use .cuda() +model.eval() +print("[model] %s loaded strict, on %s" % (A.variant, dev), flush=True) + +dm = LGI_GDM(root=cfg["root_dir"], filename=cfg["origin"], hash_code=cfg["hash"], + batch_size=cfg["model"].get("batch_size", 128), transform=None, num_workers=0, + pre_transform=get_pretransforms("", **(cfg.get("pre-transforms") or {}))) +dl = dm.test_dataloader() + +ids, iup, seqs, ys, ps = [], [], [], [], [] +with torch.no_grad(): + for batch in dl: + batch = batch.to(dev) + bi, bu, bs = list(batch["ID"]), list(batch["IUPAC"]), list(batch["aa_seq"]) + y = batch["y"].reshape(-1).float().cpu().numpy() + p = model(batch)["preds"].reshape(-1).float().cpu().numpy() + if not (len(bi) == len(bu) == len(bs) == len(y) == len(p)): + sys.exit("FATAL: batch field lengths disagree -- hetero_collate dropped a key") + ids += bi; iup += bu; seqs += bs; ys += list(y); ps += list(p) +print("[infer] %d rows returned by GIFFLAR" % len(ps), flush=True) + +gy, gp = np.asarray(ys, float), np.asarray(ps, float) +pooled_gif = float(spearmanr(gp, gy).correlation) +print("[check] pooled Spearman over GIFFLAR's OWN rows: %.6f (its metrics.csv: %.6f, diff %.6f)" + % (pooled_gif, gif_reported, pooled_gif - gif_reported), flush=True) + +# ⛔ G_ZERO: a dead protein tower gives identical predictions for one glycan across proteins. +gdf = pd.DataFrame({"aa": seqs, "iupac": iup, "p": gp}) +byg = gdf.groupby("iupac")["p"].nunique() +multi = gdf.groupby("iupac")["aa"].nunique() +shared = byg[multi > 1] +frac_const = float((shared <= 1).mean()) if len(shared) else float("nan") +print("[gate] glycans seen with >1 protein: %d; fraction with a CONSTANT prediction: %.4f" + % (len(shared), frac_const), flush=True) +if len(shared) and frac_const > 0.5: + sys.exit("FATAL G_ZERO: most glycans predict identically across different proteins -- the " + "protein tower is not contributing. Refusing to emit a number.") + +# ── our rows, using the CONVERTER'S EXACT maps ──────────────────────────────────────────── +csv = pd.read_csv(os.path.join(ART, "review_affinose_%s_binding.csv" % A.arm)) +roles = pd.read_csv(os.path.join(ART, "review_affinose_%s_roles.tsv.gz" % A.arm), + sep="\t", compression="gzip") +prot = pd.read_csv(os.path.join(ART, "affinose_v2_proteins.tsv.gz"), sep="\t", compression="gzip") +w2i = json.load(open(os.path.join(B, "affinose_wurcs_to_iupac_expanded.json"))) +seq_of = dict(zip(prot["protein_full_sha256"].astype(str), prot["protein_seq"].astype(str))) + +m = csv[["protein_id", "glycan_wurcs"]].merge( + roles[["protein_id", "glycan_wurcs", "evaluation_stratum"]], + on=["protein_id", "glycan_wurcs"], how="left", validate="many_to_one") +csv["stratum"] = m["evaluation_stratum"].values +te = csv[csv["stratum"] == STRAT].copy() +n_stratum = len(te) +te["aa"] = te["protein_id"].astype(str).map(seq_of) +te["iupac"] = te["glycan_wurcs"].map(w2i) +te = te[te["aa"].notna() & te["iupac"].notna()] +print("[ours] stratum %s: %d rows, %d after requiring aa+iupac (GIFFLAR-scorable)" + % (STRAT, n_stratum, len(te)), flush=True) + +pred_by_key, spread = {}, 0.0 +for k, g in gdf.groupby(["aa", "iupac"])["p"]: + v = g.to_numpy() + spread = max(spread, float(v.max() - v.min())) + pred_by_key[k] = float(v.mean()) +print("[join] %d distinct (aa,iupac) keys; max within-key spread %.3e" % (len(pred_by_key), spread), + flush=True) +if spread > 1e-3: + sys.exit("FATAL: predictions disagree within a single (aa,iupac) key by %.3e" % spread) + +te["p"] = [pred_by_key.get((a, i), np.nan) for a, i in zip(te["aa"], te["iupac"])] +n_unmapped = int(te["p"].isna().sum()) +te = te[te["p"].notna()] +print("[join] joined %d rows (%d of our GIFFLAR-scorable rows had no prediction)" + % (len(te), n_unmapped), flush=True) +if A.perrow: + if os.path.exists(A.perrow): + sys.exit("FATAL: %s exists -- refusing to overwrite" % A.perrow) + np.savez_compressed(A.perrow, + exp_id=te["exp_id"].astype(str).to_numpy().astype(object), + protein_id=te["protein_id"].astype(str).to_numpy().astype(object), + glycan=te["glycan_wurcs"].astype(str).to_numpy().astype(object), + target=te["target_rank"].to_numpy(float), + prediction=te["p"].to_numpy(float)) + print("[perrow] wrote %s (%d rows)" % (A.perrow, len(te)), flush=True) + + +def macro(df, denom_assays): + """Equal-assay macro. Eligibility on DATA ONLY; constant predictions score rho = 0.""" + vals, n_const = [], 0 + for _e, sub in df.groupby("exp_id"): + if len(sub) < MIN_ROWS: + continue + y = sub["target_rank"].to_numpy(float) + if len(np.unique(y)) < MIN_DISTINCT: + continue + p = sub["p"].to_numpy(float) + if len(np.unique(p)) < MIN_DISTINCT: + vals.append(0.0); n_const += 1; continue + r = spearmanr(p, y).correlation + if np.isfinite(r): + vals.append(float(r)) + scored = len(vals) + if denom_assays and denom_assays > scored: + vals = vals + [0.0] * (denom_assays - scored) # assays GIFFLAR cannot score -> rho 0 + return (float(np.mean(vals)) if vals else float("nan")), scored, n_const + + +# data-only eligible assay set over the FULL stratum (model-independent denominator) +full = csv[csv["stratum"] == STRAT] +elig = 0 +for _e, sub in full.groupby("exp_id"): + if len(sub) >= MIN_ROWS and sub["target_rank"].nunique() >= MIN_DISTINCT: + elig += 1 + +m_scored, n_sc, n_const = macro(te, 0) +m_corr, _, _ = macro(te, elig) +pooled_ours = float(spearmanr(te["p"].to_numpy(float), + te["target_rank"].to_numpy(float)).correlation) + +res = {"arm": A.arm, "variant": A.variant, "stratum": STRAT, + "version_dir": chosen, "checkpoint": CKPT, + "gifflar_reported_test_spearman": round(gif_reported, 6), + "pooled_over_gifflar_rows": round(pooled_gif, 6), + "pooled_reproduces_gifflar": bool(abs(pooled_gif - gif_reported) < 5e-3), + "rows_stratum_total": int(n_stratum), "rows_scored": int(len(te)), + "assays_eligible_data_only": int(elig), "assays_scored": int(n_sc), + "assays_constant_pred_scored_zero": int(n_const), + "macro_over_scored_assays": round(m_scored, 6), + "macro_eligibility_corrected": round(m_corr, 6), + "pooled_over_our_rows": round(pooled_ours, 6), + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score " + "count as rho=0 against the data-only eligible denominator, matching the correction " + "applied to LectinOracle."} +json.dump(res, open(OUT, "w"), indent=1) +print(json.dumps(res, indent=1), flush=True) +print("[done] wrote %s" % OUT, flush=True) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_attr_motif_16596807.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_attr_motif_16596807.out new file mode 100644 index 0000000000000000000000000000000000000000..b9442ca043c3dfcf9011b3f0a20571bc3d29edbb --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_attr_motif_16596807.out @@ -0,0 +1,137 @@ +nova21-gpu-15 +NVIDIA A100-SXM4-80GB + +================ affinose_mo_20260908_mo_A_glycan_s42 -> test_glycan_cold ================ +✅ Enabled Convolutional Front-End (Kernel=3) + [A1111] strict-loaded 209/209 encoder tensors (vocab 2114, branch 203, linkage 10) + Architecture config: + cross_attention=True + pooling_mode=mean + interaction_mode=concat + [ENCFIX] restored 17+192 pretrained encoder tensors after init +BertintV8: 100,209,318 total, 66,330,534 trainable +tripwires: 200/200 sampled rows got a different protein embedding; glycan+motif unchanged + intact macro=0.3341 pooled=0.3519 ref=0.3341 diff=0.00000 OK + reassigned macro=0.1580 pooled=0.1836 delta=-0.1760 agree_with_intact=0.4658 + meanprot macro=0.2595 pooled=0.3008 delta=-0.0746 agree_with_intact=0.6210 + +================ affinose_sa_20260908_moc_A_glycan_s43 -> test_glycan_cold ================ +✅ Enabled Convolutional Front-End (Kernel=3) + [A1111] strict-loaded 209/209 encoder tensors (vocab 2114, branch 203, linkage 10) + Architecture config: + cross_attention=True + pooling_mode=mean + interaction_mode=concat + [ENCFIX] restored 17+192 pretrained encoder tensors after init +BertintV8: 100,209,318 total, 66,330,534 trainable +tripwires: 200/200 sampled rows got a different protein embedding; glycan+motif unchanged + intact macro=0.3184 pooled=0.3491 ref=0.3184 diff=0.00000 OK + reassigned macro=0.1277 pooled=0.1598 delta=-0.1907 agree_with_intact=0.3865 + meanprot macro=0.2461 pooled=0.2954 delta=-0.0723 agree_with_intact=0.5512 + +================ affinose_sa_20260908_moc_A_glycan_s44 -> test_glycan_cold ================ +✅ Enabled Convolutional Front-End (Kernel=3) + [A1111] strict-loaded 209/209 encoder tensors (vocab 2114, branch 203, linkage 10) + Architecture config: + cross_attention=True + pooling_mode=mean + interaction_mode=concat + [ENCFIX] restored 17+192 pretrained encoder tensors after init +BertintV8: 100,209,318 total, 66,330,534 trainable +tripwires: 200/200 sampled rows got a different protein embedding; glycan+motif unchanged + intact macro=0.3355 pooled=0.3563 ref=0.3355 diff=0.00000 OK + reassigned macro=0.1857 pooled=0.2063 delta=-0.1498 agree_with_intact=0.5503 + meanprot macro=0.2544 pooled=0.2878 delta=-0.0811 agree_with_intact=0.6941 + +================ affinose_sa_20260908_mo_B_protein_s42 -> test_protein_cold ================ +✅ Enabled Convolutional Front-End (Kernel=3) + [A1111] strict-loaded 209/209 encoder tensors (vocab 2114, branch 203, linkage 10) + Architecture config: + cross_attention=True + pooling_mode=mean + interaction_mode=concat + [ENCFIX] restored 17+192 pretrained encoder tensors after init +BertintV8: 100,209,318 total, 66,330,534 trainable +tripwires: 200/200 sampled rows got a different protein embedding; glycan+motif unchanged + intact macro=0.2326 pooled=0.2688 ref=0.2326 diff=0.00000 OK + reassigned macro=0.1801 pooled=0.2233 delta=-0.0525 agree_with_intact=0.7352 + meanprot macro=0.2009 pooled=0.2452 delta=-0.0317 agree_with_intact=0.8216 + +================ affinose_mof_20260909_mof_B_protein_s43 -> test_protein_cold ================ +✅ Enabled Convolutional Front-End (Kernel=3) + [A1111] strict-loaded 209/209 encoder tensors (vocab 2114, branch 203, linkage 10) + Architecture config: + cross_attention=True + pooling_mode=mean + interaction_mode=concat + [ENCFIX] restored 17+192 pretrained encoder tensors after init +BertintV8: 100,209,318 total, 66,330,534 trainable +tripwires: 200/200 sampled rows got a different protein embedding; glycan+motif unchanged + intact macro=0.2451 pooled=0.2699 ref=0.2451 diff=0.00000 OK + reassigned macro=0.1722 pooled=0.2097 delta=-0.0729 agree_with_intact=0.6188 + meanprot macro=0.2067 pooled=0.2505 delta=-0.0384 agree_with_intact=0.7334 + +================ affinose_mof_20260909_mof_B_protein_s44 -> test_protein_cold ================ +✅ Enabled Convolutional Front-End (Kernel=3) + [A1111] strict-loaded 209/209 encoder tensors (vocab 2114, branch 203, linkage 10) + Architecture config: + cross_attention=True + pooling_mode=mean + interaction_mode=concat + [ENCFIX] restored 17+192 pretrained encoder tensors after init +BertintV8: 100,209,318 total, 66,330,534 trainable +tripwires: 200/200 sampled rows got a different protein embedding; glycan+motif unchanged + intact macro=0.2449 pooled=0.2548 ref=0.2449 diff=0.00000 OK + reassigned macro=0.1632 pooled=0.2005 delta=-0.0817 agree_with_intact=0.5737 + meanprot macro=0.2092 pooled=0.2516 delta=-0.0357 agree_with_intact=0.6887 + +================ affinose_mo_20260908_mo_C_doubly_s42 -> test_doubly_cold ================ +✅ Enabled Convolutional Front-End (Kernel=3) + [A1111] strict-loaded 209/209 encoder tensors (vocab 2114, branch 203, linkage 10) + Architecture config: + cross_attention=True + pooling_mode=mean + interaction_mode=concat + [ENCFIX] restored 17+192 pretrained encoder tensors after init +BertintV8: 100,209,318 total, 66,330,534 trainable +tripwires: 200/200 sampled rows got a different protein embedding; glycan+motif unchanged + intact macro=0.1773 pooled=0.1964 ref=0.1773 diff=0.00000 OK + reassigned macro=0.1552 pooled=0.1673 delta=-0.0221 agree_with_intact=0.7223 + meanprot macro=0.2097 pooled=0.2354 delta=+0.0324 agree_with_intact=0.7969 + +================ affinose_mof_20260909_mof_C_doubly_s43 -> test_doubly_cold ================ +✅ Enabled Convolutional Front-End (Kernel=3) + [A1111] strict-loaded 209/209 encoder tensors (vocab 2114, branch 203, linkage 10) + Architecture config: + cross_attention=True + pooling_mode=mean + interaction_mode=concat + [ENCFIX] restored 17+192 pretrained encoder tensors after init +BertintV8: 100,209,318 total, 66,330,534 trainable +tripwires: 200/200 sampled rows got a different protein embedding; glycan+motif unchanged + intact macro=0.1840 pooled=0.2208 ref=0.1840 diff=0.00000 OK + reassigned macro=0.1931 pooled=0.2118 delta=+0.0091 agree_with_intact=0.7779 + meanprot macro=0.1770 pooled=0.1960 delta=-0.0070 agree_with_intact=0.8193 + +================ affinose_mof_20260909_mof_C_doubly_s44 -> test_doubly_cold ================ +✅ Enabled Convolutional Front-End (Kernel=3) + [A1111] strict-loaded 209/209 encoder tensors (vocab 2114, branch 203, linkage 10) + Architecture config: + cross_attention=True + pooling_mode=mean + interaction_mode=concat + [ENCFIX] restored 17+192 pretrained encoder tensors after init +BertintV8: 100,209,318 total, 66,330,534 trainable +tripwires: 200/200 sampled rows got a different protein embedding; glycan+motif unchanged + intact macro=0.1743 pooled=0.1918 ref=0.1743 diff=0.00000 OK + reassigned macro=0.1690 pooled=0.1775 delta=-0.0053 agree_with_intact=0.7555 + meanprot macro=0.1727 pooled=0.1936 delta=-0.0016 agree_with_intact=0.8423 + +================ SUMMARY ================ +gate_passed: True + test_glycan_cold intact=0.3293 wrong-protein drop=0.1722 (sd 0.0207) mean-protein drop=0.0760 wrong>=mean on 3/3 seeds agree=0.468 + test_protein_cold intact=0.2409 wrong-protein drop=0.0691 (sd 0.0150) mean-protein drop=0.0353 wrong>=mean on 3/3 seeds agree=0.643 + test_doubly_cold intact=0.1785 wrong-protein drop=0.0061 (sd 0.0156) mean-protein drop=-0.0079 wrong>=mean on 2/3 seeds agree=0.752 +VERDICT: SUPPORTED: the reported model uses the protein partner +wrote /work/ratul1/supantha/Bertint/affinose_attribution_motif_20260925.json +===== done ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_b4_grep_16604967.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_b4_grep_16604967.out new file mode 100644 index 0000000000000000000000000000000000000000..7c1b2de838ac34719b04bcec8af137b342064bec --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_b4_grep_16604967.out @@ -0,0 +1,37 @@ +nova20-amp-1 +NVIDIA A100-PCIE-40GB +=== B_protein gifflarESM s42 repeat 1 === +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +=== B_protein gifflarESM s42 repeat 2 === +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +=== B_protein gifflarESM s44 repeat 1 === +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +=== B_protein gifflarESM s44 repeat 2 === +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +=== B_protein sweetnetESM s44 repeat 1 === +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +=== B_protein sweetnetESM s44 repeat 2 === +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +B_protein_gifflarESM_s42 {"row_keys_identical": true, "predictions_bit_identical": false, "max_abs_prediction_diff": 1.7881393432617188e-07, "macros_step2_r1_r2": [0.210711, 0.21068, 0.210736], "macro_spread": 5.6000000000000494e-05} +B_protein_gifflarESM_s44 {"row_keys_identical": true, "predictions_bit_identical": false, "max_abs_prediction_diff": 1.1920928955078125e-07, "macros_step2_r1_r2": [0.207363, 0.207415, 0.20736], "macro_spread": 5.4999999999999494e-05} +B_protein_sweetnetESM_s44 {"row_keys_identical": true, "predictions_bit_identical": false, "max_abs_prediction_diff": 1.8477439880371094e-06, "macros_step2_r1_r2": [0.17515, 0.175183, 0.17517], "macro_spread": 3.300000000000525e-05} +wrote /work/ratul1/supantha/Bertint/diagnostics/affinose_b4_gif_repeat_20260927.json +===== done ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_b4_s3_16604914.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_b4_s3_16604914.out new file mode 100644 index 0000000000000000000000000000000000000000..001eb4be9935a81d347c65d1039fae323114f026 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_b4_s3_16604914.out @@ -0,0 +1,24 @@ +[ + { + "source": "GIFFLAR gifflarESM s42", + "recomputed": 0.210711, + "recorded": 0.21041, + "pass": false, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM s44", + "recomputed": 0.207363, + "recorded": 0.207397, + "pass": false, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM s44", + "recomputed": 0.17515, + "recorded": 0.175171, + "pass": false, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + } +] +GATE FAIL: 3 source(s) do not reproduce their recorded value diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_b4_s3r2_16605803.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_b4_s3r2_16605803.out new file mode 100644 index 0000000000000000000000000000000000000000..8742550155bd289c492c02e99c8ccbbdeb97ecd9 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_b4_s3r2_16605803.out @@ -0,0 +1,70 @@ +all 64 gates pass + glycan_cold: 250/2000 replicates + glycan_cold: 500/2000 replicates + glycan_cold: 750/2000 replicates + glycan_cold: 1000/2000 replicates + glycan_cold: 1250/2000 replicates + glycan_cold: 1500/2000 replicates + glycan_cold: 1750/2000 replicates + glycan_cold: 2000/2000 replicates + +=== glycan_cold === + BERToseBind 0.3293 rank 1.0 [1,8] + LectinOracle ESM-C (primary) 0.2853 rank 5.0 [3,9] delta +0.0440 [-0.0318, +0.0890] P(btb better)=0.834 + LectinOracle _flex 0.2837 rank 5.0 [2,10] delta +0.0456 [-0.0264, +0.0888] P(btb better)=0.863 + LectinOracle ESM-1b 0.2978 rank 3.0 [1,7] delta +0.0315 [-0.0447, +0.0789] P(btb better)=0.733 + LectinOracle matched tuning 0.2949 rank 3.0 [1,8] delta +0.0344 [-0.0427, +0.0792] P(btb better)=0.727 + GIFFLAR gifflarESM 0.2551 rank 7.0 [2,10] delta +0.0743 [-0.0170, +0.1152] P(btb better)=0.920 + GIFFLAR sweetnetESM 0.2658 rank 7.0 [2,11] delta +0.0635 [-0.0254, +0.1080] P(btb better)=0.912 + composition ridge 0.2675 rank 7.0 [1,10] delta +0.0618 [-0.0427, +0.1271] P(btb better)=0.838 + char 3-5-gram ridge 0.2135 rank 10.0 [3,12] delta +0.1158 [-0.0080, +0.1775] P(btb better)=0.967 + nearest-neighbour glycan 0.1586 rank 12.0 [10,12] delta +0.1707 [+0.0674, +0.2711] P(btb better)=1.000 + motif ridge (p44) 0.2230 rank 10.0 [6,12] delta +0.1063 [+0.0117, +0.1666] P(btb better)=0.986 + glycan-size rule (BPE tokens) 0.2449 rank 9.0 [1,12] delta +0.0844 [-0.0246, +0.1546] P(btb better)=0.920 + protein_cold: 250/2000 replicates + protein_cold: 500/2000 replicates + protein_cold: 750/2000 replicates + protein_cold: 1000/2000 replicates + protein_cold: 1250/2000 replicates + protein_cold: 1500/2000 replicates + protein_cold: 1750/2000 replicates + protein_cold: 2000/2000 replicates + +=== protein_cold === + BERToseBind 0.2409 rank 1.0 [1,3] + LectinOracle ESM-C (primary) 0.2164 rank 4.0 [2,6] delta +0.0245 [-0.0033, +0.0490] P(btb better)=0.960 + LectinOracle _flex 0.1843 rank 7.0 [5,9] delta +0.0566 [+0.0230, +0.0887] P(btb better)=1.000 + LectinOracle ESM-1b 0.2238 rank 2.0 [1,5] delta +0.0170 [-0.0111, +0.0429] P(btb better)=0.904 + LectinOracle matched tuning 0.2167 rank 4.0 [2,5] delta +0.0241 [-0.0006, +0.0477] P(btb better)=0.973 + GIFFLAR gifflarESM 0.2075 rank 5.0 [2,7] delta +0.0333 [+0.0082, +0.0594] P(btb better)=0.995 + GIFFLAR sweetnetESM 0.1765 rank 8.0 [6,9] delta +0.0644 [+0.0336, +0.0937] P(btb better)=1.000 + composition ridge 0.1266 rank 11.0 [10,12] delta +0.1143 [+0.0711, +0.1606] P(btb better)=1.000 + char 3-5-gram ridge 0.1610 rank 9.0 [7,11] delta +0.0799 [+0.0419, +0.1153] P(btb better)=1.000 + nearest-neighbour glycan 0.1886 rank 7.0 [3,9] delta +0.0523 [+0.0187, +0.0908] P(btb better)=0.998 + protein-family nearest 0.1511 rank 10.0 [6,11] delta +0.0898 [+0.0488, +0.1332] P(btb better)=1.000 + motif ridge (p44) 0.0741 rank 12.0 [11,12] delta +0.1668 [+0.1184, +0.2179] P(btb better)=1.000 + glycan-size rule (BPE tokens) -0.0147 rank 13.0 [13,13] delta +0.2556 [+0.2003, +0.3186] P(btb better)=1.000 + doubly_cold: 250/2000 replicates + doubly_cold: 500/2000 replicates + doubly_cold: 750/2000 replicates + doubly_cold: 1000/2000 replicates + doubly_cold: 1250/2000 replicates + doubly_cold: 1500/2000 replicates + doubly_cold: 1750/2000 replicates + doubly_cold: 2000/2000 replicates + +=== doubly_cold === + BERToseBind 0.1785 rank 8.0 [1,12] + LectinOracle ESM-C (primary) 0.1889 rank 8.0 [1,11] delta -0.0104 [-0.1154, +0.1057] P(btb better)=0.454 + LectinOracle _flex 0.1659 rank 10.0 [5,12] delta +0.0126 [-0.0724, +0.1158] P(btb better)=0.647 + LectinOracle ESM-1b 0.2063 rank 6.0 [2,9] delta -0.0278 [-0.1182, +0.0722] P(btb better)=0.308 + LectinOracle matched tuning 0.1944 rank 7.0 [1,10] delta -0.0158 [-0.1085, +0.0793] P(btb better)=0.372 + GIFFLAR gifflarESM 0.1645 rank 9.0 [3,12] delta +0.0140 [-0.1021, +0.1194] P(btb better)=0.598 + GIFFLAR sweetnetESM 0.2221 rank 5.0 [2,11] delta -0.0436 [-0.1361, +0.0672] P(btb better)=0.221 + composition ridge 0.2421 rank 2.0 [1,10] delta -0.0636 [-0.2047, +0.0616] P(btb better)=0.142 + char 3-5-gram ridge 0.2496 rank 2.0 [1,10] delta -0.0710 [-0.2080, +0.0587] P(btb better)=0.135 + nearest-neighbour glycan 0.0963 rank 12.0 [3,12] delta +0.0822 [-0.0816, +0.2910] P(btb better)=0.852 + motif ridge (p44) 0.2290 rank 4.0 [1,11] delta -0.0504 [-0.1613, +0.0660] P(btb better)=0.211 + glycan-size rule (BPE tokens) 0.2242 rank 4.0 [1,12] delta -0.0457 [-0.1839, +0.0948] P(btb better)=0.259 +wrote /work/ratul1/supantha/Bertint/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json +===== done ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_0.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_0.err new file mode 100644 index 0000000000000000000000000000000000000000..8bd5914f214e8959dc5abf27036ce61d189e7c7b --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_0.err @@ -0,0 +1,24 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +Trainer already configured with model summary callbacks: []. Skipping setting a default `ModelSummary` callback. +GPU available: True (cuda), used: True +TPU available: False, using: 0 TPU cores +HPU available: False, using: 0 HPUs +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +You are using a CUDA device ('NVIDIA A100-SXM4-80GB') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +SLURM auto-requeueing enabled. Setting signal handlers. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: The variance of predictions or target is close to zero. This can cause instability in Pearson correlationcoefficient, leading to wrong results. Consider re-scaling the input if possible or computing using alarger dtype (currently using torch.float32). Setting the correlation coefficient to nan. + warnings.warn(*args, **kwargs) +`Trainer.fit` stopped: `max_epochs=50` reached. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Loaded model weights from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_0.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_0.out new file mode 100644 index 0000000000000000000000000000000000000000..fb95ae67fdda84e4cb96624917f4410c002ae4fe --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_0.out @@ -0,0 +1,40 @@ +nova21-gpu-2 +NVIDIA A100-SXM4-80GB, 81920 MiB +config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml +[launch] datasets: ABSENT (No module named 'datasets') -> loud stub registered; glylm path is now fail-closed +[launch] lectin encoders: ['AMPLIFY', 'Ankh', 'ESM', 'ESMC300', 'ProstT5', 'ProtBert'] +[launch] glycan encoders: ['gifflar', 'glylm', 'gnngly', 'sweetnet'] +[launch] GATE PASS: GIFFLAR's own ESM-2 650M lectin encoder, both glycan encoders registered, config does not select glylm +[launch] config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml +[launch] config declares 1 glycan variant(s); 0 variant dir(s) on disk; 0 complete, 0 resumable +[launch] no resumable checkpoint under /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar -- starting fresh +┏━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓ +┃ ┃ Name ┃ Type ┃ Params ┃ Mode ┃ +┡━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩ +│ 0 │ glycan_encoder │ DownstreamGGIN │ 34.9 M │ train │ +│ 1 │ head │ Sequential │ 4.6 M │ train │ +│ 2 │ loss │ MSELoss │ 0 │ train │ +└───┴────────────────┴────────────────┴────────┴───────┘ +Trainable params: 39.2 M +Non-trainable params: 330 K +Total params: 39.5 M +Total estimated model params size (MB): 158 +Modules in train mode: 315 +Modules in eval mode: 0 +Epoch 49/49 ━━━━━━━━━━━━━━━━━━ 3442/3442 0:08:06 • 0:00:00 6.91it/s v_num: 0.000 + +=== Running Test Evaluation === +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Test metric ┃ DataLoader 0 ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ +│ test/MeanAbsoluteError │ 0.23191417753696442 │ +│ test/MeanSquaredError │ 0.07438244670629501 │ +│ test/PearsonCorrCoef │ 0.3267481327056885 │ +│ test/R2Score │ 0.1055254340171814 │ +│ test/SpearmanCorrCoef │ 0.3208155333995819 │ +│ test/loss │ 0.07438244670629501 │ +└───────────────────────────┴───────────────────────────┘ +Testing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 287/287 0:00:40 • 0:00:00 7.21it/s +Test Results: [{'test/loss': 0.07438244670629501, 'test/MeanSquaredError': 0.07438244670629501, 'test/MeanAbsoluteError': 0.23191417753696442, 'test/R2Score': 0.1055254340171814, 'test/SpearmanCorrCoef': 0.3208155333995819, 'test/PearsonCorrCoef': 0.3267481327056885}] +Training took 27405.716252565384 s +===== done: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_1.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_1.err new file mode 100644 index 0000000000000000000000000000000000000000..c673d9dc4db05aa2d4f9415d5fe390ba92f9a237 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_1.err @@ -0,0 +1,24 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +Trainer already configured with model summary callbacks: []. Skipping setting a default `ModelSummary` callback. +GPU available: True (cuda), used: True +TPU available: False, using: 0 TPU cores +HPU available: False, using: 0 HPUs +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +You are using a CUDA device ('NVIDIA A100-SXM4-80GB') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +SLURM auto-requeueing enabled. Setting signal handlers. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: The variance of predictions or target is close to zero. This can cause instability in Pearson correlationcoefficient, leading to wrong results. Consider re-scaling the input if possible or computing using alarger dtype (currently using torch.float32). Setting the correlation coefficient to nan. + warnings.warn(*args, **kwargs) +`Trainer.fit` stopped: `max_epochs=50` reached. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Loaded model weights from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_1.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_1.out new file mode 100644 index 0000000000000000000000000000000000000000..f42d91e3cf3785a946aa227ec1421d5697250917 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_1.out @@ -0,0 +1,40 @@ +nova21-gpu-3 +NVIDIA A100-SXM4-80GB, 81920 MiB +config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml +[launch] datasets: ABSENT (No module named 'datasets') -> loud stub registered; glylm path is now fail-closed +[launch] lectin encoders: ['AMPLIFY', 'Ankh', 'ESM', 'ESMC300', 'ProstT5', 'ProtBert'] +[launch] glycan encoders: ['gifflar', 'glylm', 'gnngly', 'sweetnet'] +[launch] GATE PASS: GIFFLAR's own ESM-2 650M lectin encoder, both glycan encoders registered, config does not select glylm +[launch] config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml +[launch] config declares 1 glycan variant(s); 0 variant dir(s) on disk; 0 complete, 0 resumable +[launch] no resumable checkpoint under /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar -- starting fresh +┏━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓ +┃ ┃ Name ┃ Type ┃ Params ┃ Mode ┃ +┡━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩ +│ 0 │ glycan_encoder │ DownstreamGGIN │ 34.9 M │ train │ +│ 1 │ head │ Sequential │ 4.6 M │ train │ +│ 2 │ loss │ MSELoss │ 0 │ train │ +└───┴────────────────┴────────────────┴────────┴───────┘ +Trainable params: 39.2 M +Non-trainable params: 330 K +Total params: 39.5 M +Total estimated model params size (MB): 158 +Modules in train mode: 315 +Modules in eval mode: 0 +Epoch 49/49 ━━━━━━━━━━━━━━━━━━ 3442/3442 0:08:04 • 0:00:00 7.02it/s v_num: 0.000 + +=== Running Test Evaluation === +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Test metric ┃ DataLoader 0 ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ +│ test/MeanAbsoluteError │ 0.22761252522468567 │ +│ test/MeanSquaredError │ 0.07245638966560364 │ +│ test/PearsonCorrCoef │ 0.35964441299438477 │ +│ test/R2Score │ 0.12868690490722656 │ +│ test/SpearmanCorrCoef │ 0.3501887321472168 │ +│ test/loss │ 0.07245638966560364 │ +└───────────────────────────┴───────────────────────────┘ +Testing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 287/287 0:00:38 • 0:00:00 7.31it/s +Test Results: [{'test/loss': 0.07245638966560364, 'test/MeanSquaredError': 0.07245638966560364, 'test/MeanAbsoluteError': 0.22761252522468567, 'test/R2Score': 0.12868690490722656, 'test/SpearmanCorrCoef': 0.3501887321472168, 'test/PearsonCorrCoef': 0.35964441299438477}] +Training took 27004.625848531723 s +===== done: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_10.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_10.err new file mode 100644 index 0000000000000000000000000000000000000000..f47fa29e3cf0a214a64c6a1b1d7c7665b7b27809 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_10.err @@ -0,0 +1,24 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +Trainer already configured with model summary callbacks: []. Skipping setting a default `ModelSummary` callback. +GPU available: True (cuda), used: True +TPU available: False, using: 0 TPU cores +HPU available: False, using: 0 HPUs +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +You are using a CUDA device ('NVIDIA A100-PCIE-40GB') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +SLURM auto-requeueing enabled. Setting signal handlers. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: The variance of predictions or target is close to zero. This can cause instability in Pearson correlationcoefficient, leading to wrong results. Consider re-scaling the input if possible or computing using alarger dtype (currently using torch.float32). Setting the correlation coefficient to nan. + warnings.warn(*args, **kwargs) +`Trainer.fit` stopped: `max_epochs=50` reached. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=21-step=126192.ckpt +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Loaded model weights from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=21-step=126192.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_10.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_10.out new file mode 100644 index 0000000000000000000000000000000000000000..afeb46f5888bf9ca1054fdf1c78860033f244b30 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_10.out @@ -0,0 +1,40 @@ +nova22-amp-4 +NVIDIA A100-PCIE-40GB, 40960 MiB +config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml +[launch] datasets: ABSENT (No module named 'datasets') -> loud stub registered; glylm path is now fail-closed +[launch] lectin encoders: ['AMPLIFY', 'Ankh', 'ESM', 'ESMC300', 'ProstT5', 'ProtBert'] +[launch] glycan encoders: ['gifflar', 'glylm', 'gnngly', 'sweetnet'] +[launch] GATE PASS: GIFFLAR's own ESM-2 650M lectin encoder, both glycan encoders registered, config does not select glylm +[launch] config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml +[launch] config declares 1 glycan variant(s); 0 variant dir(s) on disk; 0 complete, 0 resumable +[launch] no resumable checkpoint under /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet -- starting fresh +┏━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓ +┃ ┃ Name ┃ Type ┃ Params ┃ Mode ┃ +┡━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩ +│ 0 │ glycan_encoder │ SweetNetLightning │ 36.6 M │ train │ +│ 1 │ head │ Sequential │ 4.6 M │ train │ +│ 2 │ loss │ MSELoss │ 0 │ train │ +└───┴────────────────┴───────────────────┴────────┴───────┘ +Trainable params: 40.9 M +Non-trainable params: 330 K +Total params: 41.2 M +Total estimated model params size (MB): 164 +Modules in train mode: 116 +Modules in eval mode: 0 +Epoch 49/49 ━━━━━━━━━━━━━━━━━ 5736/5736 0:08:36 • 0:00:00 10.56it/s v_num: 0.000 + +=== Running Test Evaluation === +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Test metric ┃ DataLoader 0 ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ +│ test/MeanAbsoluteError │ 0.23519288003444672 │ +│ test/MeanSquaredError │ 0.07617682218551636 │ +│ test/PearsonCorrCoef │ 0.2900708317756653 │ +│ test/R2Score │ 0.07882803678512573 │ +│ test/SpearmanCorrCoef │ 0.27726849913597107 │ +│ test/loss │ 0.07617682218551636 │ +└───────────────────────────┴───────────────────────────┘ +Testing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 28/28 0:00:01 • 0:00:00 14.23it/s +Test Results: [{'test/loss': 0.07617682218551636, 'test/MeanSquaredError': 0.07617682218551636, 'test/MeanAbsoluteError': 0.23519288003444672, 'test/R2Score': 0.07882803678512573, 'test/SpearmanCorrCoef': 0.27726849913597107, 'test/PearsonCorrCoef': 0.2900708317756653}] +Training took 26497.73883986473 s +===== done: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_11.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_11.err new file mode 100644 index 0000000000000000000000000000000000000000..30f011a39054fa99fb04cda2bef8be251cc73033 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_11.err @@ -0,0 +1,25 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +Trainer already configured with model summary callbacks: []. Skipping setting a default `ModelSummary` callback. +GPU available: True (cuda), used: True +TPU available: False, using: 0 TPU cores +HPU available: False, using: 0 HPUs +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +You are using a CUDA device ('NVIDIA A100-PCIE-40GB') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/weights/last.ckpt +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/pytorch_lightning/callbacks/model_checkpoint.py:362: The dirpath has changed from '/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/weights' to '/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/weights', therefore `best_model_score`, `kth_best_model_path`, `kth_value`, `last_model_path` and `best_k_models` won't be reloaded. Only `best_model_path` will be reloaded. +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Restored all states from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/weights/last.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. +`Trainer.fit` stopped: `max_epochs=50` reached. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/weights/epoch=6-step=40152.ckpt +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Loaded model weights from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/weights/epoch=6-step=40152.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_11.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_11.out new file mode 100644 index 0000000000000000000000000000000000000000..d968a288e1c6ee96d210221a7c30fea299052f33 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_11.out @@ -0,0 +1,41 @@ +nova21-amp-2 +NVIDIA A100-PCIE-40GB, 40960 MiB +config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml +[launch] datasets: ABSENT (No module named 'datasets') -> loud stub registered; glylm path is now fail-closed +[launch] lectin encoders: ['AMPLIFY', 'Ankh', 'ESM', 'ESMC300', 'ProstT5', 'ProtBert'] +[launch] glycan encoders: ['gifflar', 'glylm', 'gnngly', 'sweetnet'] +[launch] GATE PASS: GIFFLAR's own ESM-2 650M lectin encoder, both glycan encoders registered, config does not select glylm +[launch] config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml +[launch] config declares 1 glycan variant(s); 1 variant dir(s) on disk; 0 complete, 1 resumable +[launch] RESUMING incomplete variant: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0 (epoch 6 of 50) +[launch] ⚠ resume reads hparams.yaml from that directory, NOT /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml +┏━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓ +┃ ┃ Name ┃ Type ┃ Params ┃ Mode ┃ +┡━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩ +│ 0 │ glycan_encoder │ SweetNetLightning │ 36.6 M │ train │ +│ 1 │ head │ Sequential │ 4.6 M │ train │ +│ 2 │ loss │ MSELoss │ 0 │ train │ +└───┴────────────────┴───────────────────┴────────┴───────┘ +Trainable params: 40.9 M +Non-trainable params: 330 K +Total params: 41.2 M +Total estimated model params size (MB): 164 +Modules in train mode: 116 +Modules in eval mode: 0 +Epoch 49/49 ━━━━━━━━━━━━━━━━━━ 5736/5736 0:10:51 • 0:00:00 8.17it/s v_num: 1.000 + +=== Running Test Evaluation === +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Test metric ┃ DataLoader 0 ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ +│ test/MeanAbsoluteError │ 0.24156196415424347 │ +│ test/MeanSquaredError │ 0.07841714471578598 │ +│ test/PearsonCorrCoef │ 0.2589475214481354 │ +│ test/R2Score │ 0.05173689126968384 │ +│ test/SpearmanCorrCoef │ 0.25301650166511536 │ +│ test/loss │ 0.07841714471578598 │ +└───────────────────────────┴───────────────────────────┘ +Testing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 28/28 0:00:02 • 0:00:00 9.52it/s +Test Results: [{'test/loss': 0.07841714471578598, 'test/MeanSquaredError': 0.07841714471578598, 'test/MeanAbsoluteError': 0.24156196415424347, 'test/R2Score': 0.05173689126968384, 'test/SpearmanCorrCoef': 0.25301650166511536, 'test/PearsonCorrCoef': 0.2589475214481354}] +Training took 29814.030357837677 s +===== done: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_2.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_2.err new file mode 100644 index 0000000000000000000000000000000000000000..8bbd6881c84091c0da37ed0715b5e0924a233a51 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_2.err @@ -0,0 +1,24 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +Trainer already configured with model summary callbacks: []. Skipping setting a default `ModelSummary` callback. +GPU available: True (cuda), used: True +TPU available: False, using: 0 TPU cores +HPU available: False, using: 0 HPUs +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +You are using a CUDA device ('NVIDIA A100-SXM4-80GB') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +SLURM auto-requeueing enabled. Setting signal handlers. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: The variance of predictions or target is close to zero. This can cause instability in Pearson correlationcoefficient, leading to wrong results. Consider re-scaling the input if possible or computing using alarger dtype (currently using torch.float32). Setting the correlation coefficient to nan. + warnings.warn(*args, **kwargs) +`Trainer.fit` stopped: `max_epochs=50` reached. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=38-step=134238.ckpt +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Loaded model weights from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=38-step=134238.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_2.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_2.out new file mode 100644 index 0000000000000000000000000000000000000000..7c228f9567868d1717a398402cded7d12c48ad7b --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_2.out @@ -0,0 +1,40 @@ +nova21-gpu-4 +NVIDIA A100-SXM4-80GB, 81920 MiB +config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml +[launch] datasets: ABSENT (No module named 'datasets') -> loud stub registered; glylm path is now fail-closed +[launch] lectin encoders: ['AMPLIFY', 'Ankh', 'ESM', 'ESMC300', 'ProstT5', 'ProtBert'] +[launch] glycan encoders: ['gifflar', 'glylm', 'gnngly', 'sweetnet'] +[launch] GATE PASS: GIFFLAR's own ESM-2 650M lectin encoder, both glycan encoders registered, config does not select glylm +[launch] config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml +[launch] config declares 1 glycan variant(s); 0 variant dir(s) on disk; 0 complete, 0 resumable +[launch] no resumable checkpoint under /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet -- starting fresh +┏━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓ +┃ ┃ Name ┃ Type ┃ Params ┃ Mode ┃ +┡━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩ +│ 0 │ glycan_encoder │ SweetNetLightning │ 36.6 M │ train │ +│ 1 │ head │ Sequential │ 4.6 M │ train │ +│ 2 │ loss │ MSELoss │ 0 │ train │ +└───┴────────────────┴───────────────────┴────────┴───────┘ +Trainable params: 40.9 M +Non-trainable params: 330 K +Total params: 41.2 M +Total estimated model params size (MB): 164 +Modules in train mode: 116 +Modules in eval mode: 0 +Epoch 49/49 ━━━━━━━━━━━━━━━━━ 3442/3442 0:04:57 • 0:00:00 10.66it/s v_num: 0.000 + +=== Running Test Evaluation === +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Test metric ┃ DataLoader 0 ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ +│ test/MeanAbsoluteError │ 0.2280169576406479 │ +│ test/MeanSquaredError │ 0.0730397179722786 │ +│ test/PearsonCorrCoef │ 0.35300204157829285 │ +│ test/R2Score │ 0.12167227268218994 │ +│ test/SpearmanCorrCoef │ 0.3359033763408661 │ +│ test/loss │ 0.0730397179722786 │ +└───────────────────────────┴───────────────────────────┘ +Testing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 287/287 0:00:24 • 0:00:00 11.85it/s +Test Results: [{'test/loss': 0.0730397179722786, 'test/MeanSquaredError': 0.0730397179722786, 'test/MeanAbsoluteError': 0.2280169576406479, 'test/R2Score': 0.12167227268218994, 'test/SpearmanCorrCoef': 0.3359033763408661, 'test/PearsonCorrCoef': 0.35300204157829285}] +Training took 16938.554691314697 s +===== done: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_3.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_3.err new file mode 100644 index 0000000000000000000000000000000000000000..784c1efbd52e93012d5e2df7eba6cefb184db13e --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_3.err @@ -0,0 +1,24 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +Trainer already configured with model summary callbacks: []. Skipping setting a default `ModelSummary` callback. +GPU available: True (cuda), used: True +TPU available: False, using: 0 TPU cores +HPU available: False, using: 0 HPUs +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +You are using a CUDA device ('NVIDIA A100-PCIE-40GB') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +SLURM auto-requeueing enabled. Setting signal handlers. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: The variance of predictions or target is close to zero. This can cause instability in Pearson correlationcoefficient, leading to wrong results. Consider re-scaling the input if possible or computing using alarger dtype (currently using torch.float32). Setting the correlation coefficient to nan. + warnings.warn(*args, **kwargs) +`Trainer.fit` stopped: `max_epochs=50` reached. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=37-step=130796.ckpt +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Loaded model weights from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=37-step=130796.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_3.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_3.out new file mode 100644 index 0000000000000000000000000000000000000000..fe36f243b4c70cfd30d9eaa247f6175acf77d1e0 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_3.out @@ -0,0 +1,40 @@ +nova20-amp-1 +NVIDIA A100-PCIE-40GB, 40960 MiB +config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml +[launch] datasets: ABSENT (No module named 'datasets') -> loud stub registered; glylm path is now fail-closed +[launch] lectin encoders: ['AMPLIFY', 'Ankh', 'ESM', 'ESMC300', 'ProstT5', 'ProtBert'] +[launch] glycan encoders: ['gifflar', 'glylm', 'gnngly', 'sweetnet'] +[launch] GATE PASS: GIFFLAR's own ESM-2 650M lectin encoder, both glycan encoders registered, config does not select glylm +[launch] config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml +[launch] config declares 1 glycan variant(s); 0 variant dir(s) on disk; 0 complete, 0 resumable +[launch] no resumable checkpoint under /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet -- starting fresh +┏━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓ +┃ ┃ Name ┃ Type ┃ Params ┃ Mode ┃ +┡━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩ +│ 0 │ glycan_encoder │ SweetNetLightning │ 36.6 M │ train │ +│ 1 │ head │ Sequential │ 4.6 M │ train │ +│ 2 │ loss │ MSELoss │ 0 │ train │ +└───┴────────────────┴───────────────────┴────────┴───────┘ +Trainable params: 40.9 M +Non-trainable params: 330 K +Total params: 41.2 M +Total estimated model params size (MB): 164 +Modules in train mode: 116 +Modules in eval mode: 0 +Epoch 49/49 ━━━━━━━━━━━━━━━━━━ 3442/3442 0:06:11 • 0:00:00 8.14it/s v_num: 0.000 + +=== Running Test Evaluation === +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Test metric ┃ DataLoader 0 ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ +│ test/MeanAbsoluteError │ 0.23340749740600586 │ +│ test/MeanSquaredError │ 0.07512389868497849 │ +│ test/PearsonCorrCoef │ 0.3112040162086487 │ +│ test/R2Score │ 0.09660923480987549 │ +│ test/SpearmanCorrCoef │ 0.3092760145664215 │ +│ test/loss │ 0.07512389868497849 │ +└───────────────────────────┴───────────────────────────┘ +Testing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 287/287 0:00:32 • 0:00:00 9.14it/s +Test Results: [{'test/loss': 0.07512389868497849, 'test/MeanSquaredError': 0.07512389868497849, 'test/MeanAbsoluteError': 0.23340749740600586, 'test/R2Score': 0.09660923480987549, 'test/SpearmanCorrCoef': 0.3092760145664215, 'test/PearsonCorrCoef': 0.3112040162086487}] +Training took 21331.80910873413 s +===== done: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_4.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_4.err new file mode 100644 index 0000000000000000000000000000000000000000..a5b1d622927c4195a8a5db2899b76856b69d48a9 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_4.err @@ -0,0 +1,25 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +Trainer already configured with model summary callbacks: []. Skipping setting a default `ModelSummary` callback. +GPU available: True (cuda), used: True +TPU available: False, using: 0 TPU cores +HPU available: False, using: 0 HPUs +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +You are using a CUDA device ('NVIDIA A100-SXM4-80GB') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/weights/last.ckpt +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/pytorch_lightning/callbacks/model_checkpoint.py:362: The dirpath has changed from '/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/weights' to '/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/weights', therefore `best_model_score`, `kth_best_model_path`, `kth_value`, `last_model_path` and `best_k_models` won't be reloaded. Only `best_model_path` will be reloaded. +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Restored all states from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/weights/last.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. +`Trainer.fit` stopped: `max_epochs=50` reached. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/weights/epoch=48-step=168756.ckpt +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Loaded model weights from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/weights/epoch=48-step=168756.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_4.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_4.out new file mode 100644 index 0000000000000000000000000000000000000000..15637adf1dc1d6cd3e5eeed7de772aeec7665a04 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_4.out @@ -0,0 +1,41 @@ +nova21-gpu-3 +NVIDIA A100-SXM4-80GB, 81920 MiB +config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml +[launch] datasets: ABSENT (No module named 'datasets') -> loud stub registered; glylm path is now fail-closed +[launch] lectin encoders: ['AMPLIFY', 'Ankh', 'ESM', 'ESMC300', 'ProstT5', 'ProtBert'] +[launch] glycan encoders: ['gifflar', 'glylm', 'gnngly', 'sweetnet'] +[launch] GATE PASS: GIFFLAR's own ESM-2 650M lectin encoder, both glycan encoders registered, config does not select glylm +[launch] config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml +[launch] config declares 1 glycan variant(s); 1 variant dir(s) on disk; 0 complete, 1 resumable +[launch] RESUMING incomplete variant: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0 (epoch 5 of 50) +[launch] ⚠ resume reads hparams.yaml from that directory, NOT /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml +┏━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓ +┃ ┃ Name ┃ Type ┃ Params ┃ Mode ┃ +┡━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩ +│ 0 │ glycan_encoder │ DownstreamGGIN │ 34.9 M │ train │ +│ 1 │ head │ Sequential │ 4.6 M │ train │ +│ 2 │ loss │ MSELoss │ 0 │ train │ +└───┴────────────────┴────────────────┴────────┴───────┘ +Trainable params: 39.2 M +Non-trainable params: 330 K +Total params: 39.5 M +Total estimated model params size (MB): 158 +Modules in train mode: 315 +Modules in eval mode: 0 +Epoch 49/49 ━━━━━━━━━━━━━━━━━━ 3444/3444 0:09:41 • 0:00:00 5.90it/s v_num: 2.000 + +=== Running Test Evaluation === +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Test metric ┃ DataLoader 0 ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ +│ test/MeanAbsoluteError │ 0.2370331734418869 │ +│ test/MeanSquaredError │ 0.07688800990581512 │ +│ test/PearsonCorrCoef │ 0.2661176919937134 │ +│ test/R2Score │ 0.07041490077972412 │ +│ test/SpearmanCorrCoef │ 0.24108551442623138 │ +│ test/loss │ 0.07688800990581512 │ +└───────────────────────────┴───────────────────────────┘ +Testing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 289/289 0:00:24 • 0:00:00 11.82it/s +Test Results: [{'test/loss': 0.07688800990581512, 'test/MeanSquaredError': 0.07688800990581512, 'test/MeanAbsoluteError': 0.2370331734418869, 'test/R2Score': 0.07041490077972412, 'test/SpearmanCorrCoef': 0.24108551442623138, 'test/PearsonCorrCoef': 0.2661176919937134}] +Training took 27188.147183656693 s +===== done: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_5.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_5.err new file mode 100644 index 0000000000000000000000000000000000000000..085b56813af3c0e6dee81d31d2b127740cc5d38b --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_5.err @@ -0,0 +1,24 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +Trainer already configured with model summary callbacks: []. Skipping setting a default `ModelSummary` callback. +GPU available: True (cuda), used: True +TPU available: False, using: 0 TPU cores +HPU available: False, using: 0 HPUs +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +You are using a CUDA device ('NVIDIA A100-SXM4-80GB') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +SLURM auto-requeueing enabled. Setting signal handlers. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: The variance of predictions or target is close to zero. This can cause instability in Pearson correlationcoefficient, leading to wrong results. Consider re-scaling the input if possible or computing using alarger dtype (currently using torch.float32). Setting the correlation coefficient to nan. + warnings.warn(*args, **kwargs) +`Trainer.fit` stopped: `max_epochs=50` reached. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/weights/epoch=37-step=130872.ckpt +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Loaded model weights from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/weights/epoch=37-step=130872.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_5.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_5.out new file mode 100644 index 0000000000000000000000000000000000000000..d0d8786cdfc77023f35fd16554a8e44ff6a5ad9a --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_5.out @@ -0,0 +1,40 @@ +nova21-gpu-2 +NVIDIA A100-SXM4-80GB, 81920 MiB +config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml +[launch] datasets: ABSENT (No module named 'datasets') -> loud stub registered; glylm path is now fail-closed +[launch] lectin encoders: ['AMPLIFY', 'Ankh', 'ESM', 'ESMC300', 'ProstT5', 'ProtBert'] +[launch] glycan encoders: ['gifflar', 'glylm', 'gnngly', 'sweetnet'] +[launch] GATE PASS: GIFFLAR's own ESM-2 650M lectin encoder, both glycan encoders registered, config does not select glylm +[launch] config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml +[launch] config declares 1 glycan variant(s); 1 variant dir(s) on disk; 0 complete, 0 resumable +[launch] no resumable checkpoint under /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar -- starting fresh +┏━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓ +┃ ┃ Name ┃ Type ┃ Params ┃ Mode ┃ +┡━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩ +│ 0 │ glycan_encoder │ DownstreamGGIN │ 34.9 M │ train │ +│ 1 │ head │ Sequential │ 4.6 M │ train │ +│ 2 │ loss │ MSELoss │ 0 │ train │ +└───┴────────────────┴────────────────┴────────┴───────┘ +Trainable params: 39.2 M +Non-trainable params: 330 K +Total params: 39.5 M +Total estimated model params size (MB): 158 +Modules in train mode: 315 +Modules in eval mode: 0 +Epoch 49/49 ━━━━━━━━━━━━━━━━━━ 3444/3444 0:09:26 • 0:00:00 6.11it/s v_num: 2.000 + +=== Running Test Evaluation === +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Test metric ┃ DataLoader 0 ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ +│ test/MeanAbsoluteError │ 0.23736673593521118 │ +│ test/MeanSquaredError │ 0.07654805481433868 │ +│ test/PearsonCorrCoef │ 0.2768315076828003 │ +│ test/R2Score │ 0.07452493906021118 │ +│ test/SpearmanCorrCoef │ 0.2505037784576416 │ +│ test/loss │ 0.07654805481433868 │ +└───────────────────────────┴───────────────────────────┘ +Testing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 289/289 0:00:25 • 0:00:00 11.48it/s +Test Results: [{'test/loss': 0.07654805481433868, 'test/MeanSquaredError': 0.07654805481433868, 'test/MeanAbsoluteError': 0.23736673593521118, 'test/R2Score': 0.07452493906021118, 'test/SpearmanCorrCoef': 0.2505037784576416, 'test/PearsonCorrCoef': 0.2768315076828003}] +Training took 30433.47913956642 s +===== done: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_6.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_6.err new file mode 100644 index 0000000000000000000000000000000000000000..402d8ff0e4d28a99a727f0972e0673b0658713ba --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_6.err @@ -0,0 +1,25 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +Trainer already configured with model summary callbacks: []. Skipping setting a default `ModelSummary` callback. +GPU available: True (cuda), used: True +TPU available: False, using: 0 TPU cores +HPU available: False, using: 0 HPUs +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +You are using a CUDA device ('NVIDIA A100-PCIE-40GB') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/weights/last.ckpt +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/pytorch_lightning/callbacks/model_checkpoint.py:362: The dirpath has changed from '/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/weights' to '/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/weights', therefore `best_model_score`, `kth_best_model_path`, `kth_value`, `last_model_path` and `best_k_models` won't be reloaded. Only `best_model_path` will be reloaded. +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Restored all states from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/weights/last.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. +`Trainer.fit` stopped: `max_epochs=50` reached. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=42-step=148092.ckpt +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Loaded model weights from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=42-step=148092.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_6.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_6.out new file mode 100644 index 0000000000000000000000000000000000000000..ab1519de41e00b97e6b3eba74115e1d4fc5f0683 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_6.out @@ -0,0 +1,41 @@ +nova21-amp-2 +NVIDIA A100-PCIE-40GB, 40960 MiB +config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml +[launch] datasets: ABSENT (No module named 'datasets') -> loud stub registered; glylm path is now fail-closed +[launch] lectin encoders: ['AMPLIFY', 'Ankh', 'ESM', 'ESMC300', 'ProstT5', 'ProtBert'] +[launch] glycan encoders: ['gifflar', 'glylm', 'gnngly', 'sweetnet'] +[launch] GATE PASS: GIFFLAR's own ESM-2 650M lectin encoder, both glycan encoders registered, config does not select glylm +[launch] config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml +[launch] config declares 1 glycan variant(s); 1 variant dir(s) on disk; 0 complete, 3 resumable +[launch] RESUMING incomplete variant: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2 (epoch 22 of 50) +[launch] ⚠ resume reads hparams.yaml from that directory, NOT /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml +┏━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓ +┃ ┃ Name ┃ Type ┃ Params ┃ Mode ┃ +┡━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩ +│ 0 │ glycan_encoder │ SweetNetLightning │ 36.6 M │ train │ +│ 1 │ head │ Sequential │ 4.6 M │ train │ +│ 2 │ loss │ MSELoss │ 0 │ train │ +└───┴────────────────┴───────────────────┴────────┴───────┘ +Trainable params: 40.9 M +Non-trainable params: 330 K +Total params: 41.2 M +Total estimated model params size (MB): 164 +Modules in train mode: 116 +Modules in eval mode: 0 +Epoch 49/49 ━━━━━━━━━━━━━━━━━━ 3444/3444 0:07:03 • 0:00:00 7.37it/s v_num: 3.000 + +=== Running Test Evaluation === +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Test metric ┃ DataLoader 0 ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ +│ test/MeanAbsoluteError │ 0.241166353225708 │ +│ test/MeanSquaredError │ 0.07910767197608948 │ +│ test/PearsonCorrCoef │ 0.2128688246011734 │ +│ test/R2Score │ 0.0435788631439209 │ +│ test/SpearmanCorrCoef │ 0.18263666331768036 │ +│ test/loss │ 0.07910767197608948 │ +└───────────────────────────┴───────────────────────────┘ +Testing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 289/289 0:00:19 • 0:00:00 14.78it/s +Test Results: [{'test/loss': 0.07910767197608948, 'test/MeanSquaredError': 0.07910767197608948, 'test/MeanAbsoluteError': 0.241166353225708, 'test/R2Score': 0.0435788631439209, 'test/SpearmanCorrCoef': 0.18263666331768036, 'test/PearsonCorrCoef': 0.2128688246011734}] +Training took 12861.435148000717 s +===== done: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_7.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_7.err new file mode 100644 index 0000000000000000000000000000000000000000..3edeab26d351852628cc1b9fa0eaf6a2665fb170 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_7.err @@ -0,0 +1,25 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +Trainer already configured with model summary callbacks: []. Skipping setting a default `ModelSummary` callback. +GPU available: True (cuda), used: True +TPU available: False, using: 0 TPU cores +HPU available: False, using: 0 HPUs +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +You are using a CUDA device ('NVIDIA A100-PCIE-40GB') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/weights/last.ckpt +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/pytorch_lightning/callbacks/model_checkpoint.py:362: The dirpath has changed from '/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/weights' to '/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/weights', therefore `best_model_score`, `kth_best_model_path`, `kth_value`, `last_model_path` and `best_k_models` won't be reloaded. Only `best_model_path` will be reloaded. +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Restored all states from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/weights/last.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. +`Trainer.fit` stopped: `max_epochs=50` reached. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=48-step=168756.ckpt +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Loaded model weights from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=48-step=168756.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_7.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_7.out new file mode 100644 index 0000000000000000000000000000000000000000..5ea6d4f7146d328d6d4057a4d9265b94a06ea6ef --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_7.out @@ -0,0 +1,41 @@ +nova21-amp-2 +NVIDIA A100-PCIE-40GB, 40960 MiB +config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml +[launch] datasets: ABSENT (No module named 'datasets') -> loud stub registered; glylm path is now fail-closed +[launch] lectin encoders: ['AMPLIFY', 'Ankh', 'ESM', 'ESMC300', 'ProstT5', 'ProtBert'] +[launch] glycan encoders: ['gifflar', 'glylm', 'gnngly', 'sweetnet'] +[launch] GATE PASS: GIFFLAR's own ESM-2 650M lectin encoder, both glycan encoders registered, config does not select glylm +[launch] config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml +[launch] config declares 1 glycan variant(s); 1 variant dir(s) on disk; 0 complete, 3 resumable +[launch] RESUMING incomplete variant: /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2 (epoch 42 of 50) +[launch] ⚠ resume reads hparams.yaml from that directory, NOT /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml +┏━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓ +┃ ┃ Name ┃ Type ┃ Params ┃ Mode ┃ +┡━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩ +│ 0 │ glycan_encoder │ SweetNetLightning │ 36.6 M │ train │ +│ 1 │ head │ Sequential │ 4.6 M │ train │ +│ 2 │ loss │ MSELoss │ 0 │ train │ +└───┴────────────────┴───────────────────┴────────┴───────┘ +Trainable params: 40.9 M +Non-trainable params: 330 K +Total params: 41.2 M +Total estimated model params size (MB): 164 +Modules in train mode: 116 +Modules in eval mode: 0 +Epoch 49/49 ━━━━━━━━━━━━━━━━━━ 3444/3444 0:07:06 • 0:00:00 8.34it/s v_num: 3.000 + +=== Running Test Evaluation === +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Test metric ┃ DataLoader 0 ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ +│ test/MeanAbsoluteError │ 0.23973548412322998 │ +│ test/MeanSquaredError │ 0.07874315977096558 │ +│ test/PearsonCorrCoef │ 0.2273501306772232 │ +│ test/R2Score │ 0.047985851764678955 │ +│ test/SpearmanCorrCoef │ 0.1989615112543106 │ +│ test/loss │ 0.07874315977096558 │ +└───────────────────────────┴───────────────────────────┘ +Testing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 289/289 0:00:19 • 0:00:00 14.42it/s +Test Results: [{'test/loss': 0.07874315977096558, 'test/MeanSquaredError': 0.07874315977096558, 'test/MeanAbsoluteError': 0.23973548412322998, 'test/R2Score': 0.047985851764678955, 'test/SpearmanCorrCoef': 0.1989615112543106, 'test/PearsonCorrCoef': 0.2273501306772232}] +Training took 3957.3007502555847 s +===== done: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_8.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_8.err new file mode 100644 index 0000000000000000000000000000000000000000..673fda69bfe3acb3fd853c2a0498c5f5ebdb41ed --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_8.err @@ -0,0 +1,25 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +Trainer already configured with model summary callbacks: []. Skipping setting a default `ModelSummary` callback. +GPU available: True (cuda), used: True +TPU available: False, using: 0 TPU cores +HPU available: False, using: 0 HPUs +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +You are using a CUDA device ('NVIDIA A100-SXM4-80GB') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/weights/last.ckpt +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/pytorch_lightning/callbacks/model_checkpoint.py:362: The dirpath has changed from '/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/weights' to '/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/weights', therefore `best_model_score`, `kth_best_model_path`, `kth_value`, `last_model_path` and `best_k_models` won't be reloaded. Only `best_model_path` will be reloaded. +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Restored all states from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/weights/last.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. +`Trainer.fit` stopped: `max_epochs=50` reached. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/weights/epoch=8-step=51624.ckpt +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Loaded model weights from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/weights/epoch=8-step=51624.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_8.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_8.out new file mode 100644 index 0000000000000000000000000000000000000000..3abbbd0a57018c95510ab9903d5cc1e0b02359eb --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_8.out @@ -0,0 +1,41 @@ +nova21-gpu-6 +NVIDIA A100-SXM4-80GB, 81920 MiB +config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml +[launch] datasets: ABSENT (No module named 'datasets') -> loud stub registered; glylm path is now fail-closed +[launch] lectin encoders: ['AMPLIFY', 'Ankh', 'ESM', 'ESMC300', 'ProstT5', 'ProtBert'] +[launch] glycan encoders: ['gifflar', 'glylm', 'gnngly', 'sweetnet'] +[launch] GATE PASS: GIFFLAR's own ESM-2 650M lectin encoder, both glycan encoders registered, config does not select glylm +[launch] config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml +[launch] config declares 1 glycan variant(s); 1 variant dir(s) on disk; 0 complete, 1 resumable +[launch] RESUMING incomplete variant: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0 (epoch 2 of 50) +[launch] ⚠ resume reads hparams.yaml from that directory, NOT /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml +┏━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓ +┃ ┃ Name ┃ Type ┃ Params ┃ Mode ┃ +┡━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩ +│ 0 │ glycan_encoder │ DownstreamGGIN │ 34.9 M │ train │ +│ 1 │ head │ Sequential │ 4.6 M │ train │ +│ 2 │ loss │ MSELoss │ 0 │ train │ +└───┴────────────────┴────────────────┴────────┴───────┘ +Trainable params: 39.2 M +Non-trainable params: 330 K +Total params: 39.5 M +Total estimated model params size (MB): 158 +Modules in train mode: 315 +Modules in eval mode: 0 +Epoch 49/49 ━━━━━━━━━━━━━━━━━━ 5736/5736 0:13:11 • 0:00:00 7.34it/s v_num: 1.000 + +=== Running Test Evaluation === +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Test metric ┃ DataLoader 0 ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ +│ test/MeanAbsoluteError │ 0.23960888385772705 │ +│ test/MeanSquaredError │ 0.07972735911607742 │ +│ test/PearsonCorrCoef │ 0.22666603326797485 │ +│ test/R2Score │ 0.035893023014068604 │ +│ test/SpearmanCorrCoef │ 0.2204538881778717 │ +│ test/loss │ 0.07972735911607742 │ +└───────────────────────────┴───────────────────────────┘ +Testing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 28/28 0:00:03 • 0:00:00 9.24it/s +Test Results: [{'test/loss': 0.07972735911607742, 'test/MeanSquaredError': 0.07972735911607742, 'test/MeanAbsoluteError': 0.23960888385772705, 'test/R2Score': 0.035893023014068604, 'test/SpearmanCorrCoef': 0.2204538881778717, 'test/PearsonCorrCoef': 0.22666603326797485}] +Training took 40920.55039024353 s +===== done: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_9.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_9.err new file mode 100644 index 0000000000000000000000000000000000000000..5d18062ed5a513491caf59a14a5c9af44ed76c46 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_9.err @@ -0,0 +1,27 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) +Trainer already configured with model summary callbacks: []. Skipping setting a default `ModelSummary` callback. +GPU available: True (cuda), used: True +TPU available: False, using: 0 TPU cores +HPU available: False, using: 0 HPUs +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +You are using a CUDA device ('NVIDIA A100-SXM4-80GB') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/weights/last.ckpt +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/pytorch_lightning/callbacks/model_checkpoint.py:362: The dirpath has changed from '/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/weights' to '/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/weights', therefore `best_model_score`, `kth_best_model_path`, `kth_value`, `last_model_path` and `best_k_models` won't be reloaded. Only `best_model_path` will be reloaded. +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Restored all states from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/weights/last.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: The variance of predictions or target is close to zero. This can cause instability in Pearson correlationcoefficient, leading to wrong results. Consider re-scaling the input if possible or computing using alarger dtype (currently using torch.float32). Setting the correlation coefficient to nan. + warnings.warn(*args, **kwargs) +`Trainer.fit` stopped: `max_epochs=50` reached. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 12 worker processes in total. Our suggested max number of worker in current system is 8, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn(_create_warning_msg( +Restoring states from the checkpoint path at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/weights/epoch=6-step=40152.ckpt +LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] +Loaded model weights from the checkpoint at /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/weights/epoch=6-step=40152.ckpt +SLURM auto-requeueing enabled. Setting signal handlers. diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_9.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_9.out new file mode 100644 index 0000000000000000000000000000000000000000..1a731ac080dcb427997b6dce3403c27a32ff6fdd --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_9.out @@ -0,0 +1,41 @@ +nova21-gpu-9 +NVIDIA A100-SXM4-80GB, 81920 MiB +config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml +[launch] datasets: ABSENT (No module named 'datasets') -> loud stub registered; glylm path is now fail-closed +[launch] lectin encoders: ['AMPLIFY', 'Ankh', 'ESM', 'ESMC300', 'ProstT5', 'ProtBert'] +[launch] glycan encoders: ['gifflar', 'glylm', 'gnngly', 'sweetnet'] +[launch] GATE PASS: GIFFLAR's own ESM-2 650M lectin encoder, both glycan encoders registered, config does not select glylm +[launch] config: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml +[launch] config declares 1 glycan variant(s); 1 variant dir(s) on disk; 0 complete, 1 resumable +[launch] RESUMING incomplete variant: /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0 (epoch 2 of 50) +[launch] ⚠ resume reads hparams.yaml from that directory, NOT /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml +┏━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓ +┃ ┃ Name ┃ Type ┃ Params ┃ Mode ┃ +┡━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩ +│ 0 │ glycan_encoder │ DownstreamGGIN │ 34.9 M │ train │ +│ 1 │ head │ Sequential │ 4.6 M │ train │ +│ 2 │ loss │ MSELoss │ 0 │ train │ +└───┴────────────────┴────────────────┴────────┴───────┘ +Trainable params: 39.2 M +Non-trainable params: 330 K +Total params: 39.5 M +Total estimated model params size (MB): 158 +Modules in train mode: 315 +Modules in eval mode: 0 +Epoch 49/49 ━━━━━━━━━━━━━━━━━━ 5736/5736 0:13:46 • 0:00:00 6.90it/s v_num: 1.000 + +=== Running Test Evaluation === +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Test metric ┃ DataLoader 0 ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ +│ test/MeanAbsoluteError │ 0.23896783590316772 │ +│ test/MeanSquaredError │ 0.07788914442062378 │ +│ test/PearsonCorrCoef │ 0.24284584820270538 │ +│ test/R2Score │ 0.05812174081802368 │ +│ test/SpearmanCorrCoef │ 0.25745221972465515 │ +│ test/loss │ 0.07788914442062378 │ +└───────────────────────────┴───────────────────────────┘ +Testing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 28/28 0:00:03 • 0:00:00 7.17it/s +Test Results: [{'test/loss': 0.07788914442062378, 'test/MeanSquaredError': 0.07788914442062378, 'test/MeanAbsoluteError': 0.23896783590316772, 'test/R2Score': 0.05812174081802368, 'test/SpearmanCorrCoef': 0.25745221972465515, 'test/PearsonCorrCoef': 0.24284584820270538}] +Training took 40680.44737935066 s +===== done: /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_0.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_0.err new file mode 100644 index 0000000000000000000000000000000000000000..50737927e0d5c5c1e72001e70754edc5f31b2cf4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_0.err @@ -0,0 +1,4 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_0.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_0.out new file mode 100644 index 0000000000000000000000000000000000000000..df9b9f86cb82964956f142ff3e0852e7ee48f463 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_0.out @@ -0,0 +1,36 @@ +nova18-gpu-4 +Tesla V100-PCIE-32GB +arm=A_glycan variant=gifflarESM seed=43 logs_dir=logs_s43_gifflar +[ver] versions on disk: ['version_0'] -> using version_0 +[ver] GIFFLAR's own reported test Spearman: 0.320816 +[ckpt] /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt +[esm] cache /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/data/ESM_33.pkl (9339085 bytes) +[stub] datasets: ABSENT (No module named 'datasets') -> loud stub registered +[model] gifflarESM loaded strict, on cuda +[infer] 36635 rows returned by GIFFLAR +[check] pooled Spearman over GIFFLAR's OWN rows: 0.320815 (its metrics.csv: 0.320816, diff -0.000000) +[gate] glycans seen with >1 protein: 312; fraction with a CONSTANT prediction: 0.0000 +[ours] stratum test_glycan_cold: 37315 rows, 36649 after requiring aa+iupac (GIFFLAR-scorable) +[join] 24140 distinct (aa,iupac) keys; max within-key spread 5.960e-08 +[join] joined 36635 rows (14 of our GIFFLAR-scorable rows had no prediction) +{ + "arm": "A_glycan", + "variant": "gifflarESM", + "stratum": "test_glycan_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt", + "gifflar_reported_test_spearman": 0.320816, + "pooled_over_gifflar_rows": 0.320815, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 37315, + "rows_scored": 36635, + "assays_eligible_data_only": 1767, + "assays_scored": 1687, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.264031, + "macro_eligibility_corrected": 0.252077, + "pooled_over_our_rows": 0.320815, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} +[done] wrote /work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_gifflarESM_s43.json +===== done (A_glycan/gifflarESM/s43) ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_1.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_1.err new file mode 100644 index 0000000000000000000000000000000000000000..50737927e0d5c5c1e72001e70754edc5f31b2cf4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_1.err @@ -0,0 +1,4 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_1.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_1.out new file mode 100644 index 0000000000000000000000000000000000000000..dd92a7c254177c61fa8d682016ca815e46ee2aab --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_1.out @@ -0,0 +1,36 @@ +nova18-gpu-5 +Tesla V100-PCIE-16GB +arm=A_glycan variant=gifflarESM seed=44 logs_dir=logs_s44_gifflar +[ver] versions on disk: ['version_0'] -> using version_0 +[ver] GIFFLAR's own reported test Spearman: 0.350189 +[ckpt] /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt +[esm] cache /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/data/ESM_33.pkl (9339085 bytes) +[stub] datasets: ABSENT (No module named 'datasets') -> loud stub registered +[model] gifflarESM loaded strict, on cuda +[infer] 36635 rows returned by GIFFLAR +[check] pooled Spearman over GIFFLAR's OWN rows: 0.350189 (its metrics.csv: 0.350189, diff 0.000000) +[gate] glycans seen with >1 protein: 312; fraction with a CONSTANT prediction: 0.0000 +[ours] stratum test_glycan_cold: 37315 rows, 36649 after requiring aa+iupac (GIFFLAR-scorable) +[join] 24140 distinct (aa,iupac) keys; max within-key spread 1.192e-07 +[join] joined 36635 rows (14 of our GIFFLAR-scorable rows had no prediction) +{ + "arm": "A_glycan", + "variant": "gifflarESM", + "stratum": "test_glycan_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt", + "gifflar_reported_test_spearman": 0.350189, + "pooled_over_gifflar_rows": 0.350189, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 37315, + "rows_scored": 36635, + "assays_eligible_data_only": 1767, + "assays_scored": 1687, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.288499, + "macro_eligibility_corrected": 0.275437, + "pooled_over_our_rows": 0.350189, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} +[done] wrote /work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_gifflarESM_s44.json +===== done (A_glycan/gifflarESM/s44) ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_10.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_10.err new file mode 100644 index 0000000000000000000000000000000000000000..50737927e0d5c5c1e72001e70754edc5f31b2cf4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_10.err @@ -0,0 +1,4 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_10.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_10.out new file mode 100644 index 0000000000000000000000000000000000000000..e3cd2956f32a0ba226ea2c4ca51a25d38816f335 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_10.out @@ -0,0 +1,36 @@ +nova21-gpu-3 +NVIDIA A100-SXM4-80GB +arm=C_doubly variant=sweetnetESM seed=43 logs_dir=logs_s43_sweetnet +[ver] versions on disk: ['version_0'] -> using version_0 +[ver] GIFFLAR's own reported test Spearman: 0.277268 +[ckpt] /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=21-step=126192.ckpt +[esm] cache /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/data/ESM_33.pkl (9339085 bytes) +[stub] datasets: ABSENT (No module named 'datasets') -> loud stub registered +[model] sweetnetESM loaded strict, on cuda +[infer] 3533 rows returned by GIFFLAR +[check] pooled Spearman over GIFFLAR's OWN rows: 0.277269 (its metrics.csv: 0.277268, diff 0.000000) +[gate] glycans seen with >1 protein: 69; fraction with a CONSTANT prediction: 0.0000 +[ours] stratum test_doubly_cold: 3691 rows, 3533 after requiring aa+iupac (GIFFLAR-scorable) +[join] 3533 distinct (aa,iupac) keys; max within-key spread 0.000e+00 +[join] joined 3533 rows (0 of our GIFFLAR-scorable rows had no prediction) +{ + "arm": "C_doubly", + "variant": "sweetnetESM", + "stratum": "test_doubly_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=21-step=126192.ckpt", + "gifflar_reported_test_spearman": 0.277268, + "pooled_over_gifflar_rows": 0.277269, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 3691, + "rows_scored": 3533, + "assays_eligible_data_only": 212, + "assays_scored": 201, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.240414, + "macro_eligibility_corrected": 0.227939, + "pooled_over_our_rows": 0.277269, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} +[done] wrote /work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json +===== done (C_doubly/sweetnetESM/s43) ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_11.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_11.err new file mode 100644 index 0000000000000000000000000000000000000000..50737927e0d5c5c1e72001e70754edc5f31b2cf4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_11.err @@ -0,0 +1,4 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_11.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_11.out new file mode 100644 index 0000000000000000000000000000000000000000..1595c4208aaf21fc8f00062c7270071702014e24 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_11.out @@ -0,0 +1,36 @@ +nova18-gpu-4 +Tesla V100-PCIE-32GB +arm=C_doubly variant=sweetnetESM seed=44 logs_dir=logs_s44_sweetnet +[ver] versions on disk: ['version_0', 'version_1'] -> using version_1 +[ver] GIFFLAR's own reported test Spearman: 0.253017 +[ckpt] /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/weights/epoch=6-step=40152.ckpt +[esm] cache /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/data/ESM_33.pkl (9339085 bytes) +[stub] datasets: ABSENT (No module named 'datasets') -> loud stub registered +[model] sweetnetESM loaded strict, on cuda +[infer] 3533 rows returned by GIFFLAR +[check] pooled Spearman over GIFFLAR's OWN rows: 0.253016 (its metrics.csv: 0.253017, diff -0.000000) +[gate] glycans seen with >1 protein: 69; fraction with a CONSTANT prediction: 0.0000 +[ours] stratum test_doubly_cold: 3691 rows, 3533 after requiring aa+iupac (GIFFLAR-scorable) +[join] 3533 distinct (aa,iupac) keys; max within-key spread 0.000e+00 +[join] joined 3533 rows (0 of our GIFFLAR-scorable rows had no prediction) +{ + "arm": "C_doubly", + "variant": "sweetnetESM", + "stratum": "test_doubly_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/weights/epoch=6-step=40152.ckpt", + "gifflar_reported_test_spearman": 0.253017, + "pooled_over_gifflar_rows": 0.253016, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 3691, + "rows_scored": 3533, + "assays_eligible_data_only": 212, + "assays_scored": 201, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.225259, + "macro_eligibility_corrected": 0.213571, + "pooled_over_our_rows": 0.253016, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} +[done] wrote /work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json +===== done (C_doubly/sweetnetESM/s44) ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_2.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_2.err new file mode 100644 index 0000000000000000000000000000000000000000..50737927e0d5c5c1e72001e70754edc5f31b2cf4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_2.err @@ -0,0 +1,4 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_2.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_2.out new file mode 100644 index 0000000000000000000000000000000000000000..11e6a3ed1e182b4f429326ad316b4538cc84720f --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_2.out @@ -0,0 +1,36 @@ +nova21-gpu-3 +NVIDIA A100-SXM4-80GB +arm=A_glycan variant=sweetnetESM seed=43 logs_dir=logs_s43_sweetnet +[ver] versions on disk: ['version_0'] -> using version_0 +[ver] GIFFLAR's own reported test Spearman: 0.335903 +[ckpt] /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=38-step=134238.ckpt +[esm] cache /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/data/ESM_33.pkl (9339085 bytes) +[stub] datasets: ABSENT (No module named 'datasets') -> loud stub registered +[model] sweetnetESM loaded strict, on cuda +[infer] 36635 rows returned by GIFFLAR +[check] pooled Spearman over GIFFLAR's OWN rows: 0.335903 (its metrics.csv: 0.335903, diff 0.000000) +[gate] glycans seen with >1 protein: 312; fraction with a CONSTANT prediction: 0.0000 +[ours] stratum test_glycan_cold: 37315 rows, 36649 after requiring aa+iupac (GIFFLAR-scorable) +[join] 24140 distinct (aa,iupac) keys; max within-key spread 3.576e-07 +[join] joined 36635 rows (14 of our GIFFLAR-scorable rows had no prediction) +{ + "arm": "A_glycan", + "variant": "sweetnetESM", + "stratum": "test_glycan_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=38-step=134238.ckpt", + "gifflar_reported_test_spearman": 0.335903, + "pooled_over_gifflar_rows": 0.335903, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 37315, + "rows_scored": 36635, + "assays_eligible_data_only": 1767, + "assays_scored": 1687, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.306588, + "macro_eligibility_corrected": 0.292708, + "pooled_over_our_rows": 0.335903, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} +[done] wrote /work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json +===== done (A_glycan/sweetnetESM/s43) ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_3.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_3.err new file mode 100644 index 0000000000000000000000000000000000000000..50737927e0d5c5c1e72001e70754edc5f31b2cf4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_3.err @@ -0,0 +1,4 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_3.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_3.out new file mode 100644 index 0000000000000000000000000000000000000000..eed1b1853ef4017b92e64eac5d479585b62f80df --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_3.out @@ -0,0 +1,36 @@ +nova21-gpu-3 +NVIDIA A100-SXM4-80GB +arm=A_glycan variant=sweetnetESM seed=44 logs_dir=logs_s44_sweetnet +[ver] versions on disk: ['version_0'] -> using version_0 +[ver] GIFFLAR's own reported test Spearman: 0.309276 +[ckpt] /work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=37-step=130796.ckpt +[esm] cache /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/data/ESM_33.pkl (9339085 bytes) +[stub] datasets: ABSENT (No module named 'datasets') -> loud stub registered +[model] sweetnetESM loaded strict, on cuda +[infer] 36635 rows returned by GIFFLAR +[check] pooled Spearman over GIFFLAR's OWN rows: 0.309276 (its metrics.csv: 0.309276, diff 0.000000) +[gate] glycans seen with >1 protein: 312; fraction with a CONSTANT prediction: 0.0000 +[ours] stratum test_glycan_cold: 37315 rows, 36649 after requiring aa+iupac (GIFFLAR-scorable) +[join] 24140 distinct (aa,iupac) keys; max within-key spread 1.192e-07 +[join] joined 36635 rows (14 of our GIFFLAR-scorable rows had no prediction) +{ + "arm": "A_glycan", + "variant": "sweetnetESM", + "stratum": "test_glycan_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=37-step=130796.ckpt", + "gifflar_reported_test_spearman": 0.309276, + "pooled_over_gifflar_rows": 0.309276, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 37315, + "rows_scored": 36635, + "assays_eligible_data_only": 1767, + "assays_scored": 1687, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.273407, + "macro_eligibility_corrected": 0.261029, + "pooled_over_our_rows": 0.309276, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} +[done] wrote /work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json +===== done (A_glycan/sweetnetESM/s44) ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_4.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_4.err new file mode 100644 index 0000000000000000000000000000000000000000..50737927e0d5c5c1e72001e70754edc5f31b2cf4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_4.err @@ -0,0 +1,4 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_4.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_4.out new file mode 100644 index 0000000000000000000000000000000000000000..41d580fbd5ab3306b45fbdbd96ea7b781fdd75bc --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_4.out @@ -0,0 +1,36 @@ +nova18-gpu-4 +Tesla V100-PCIE-32GB +arm=B_protein variant=gifflarESM seed=43 logs_dir=logs_s43_gifflar +[ver] versions on disk: ['version_0', 'version_1', 'version_2'] -> using version_2 +[ver] GIFFLAR's own reported test Spearman: 0.241086 +[ckpt] /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/weights/epoch=48-step=168756.ckpt +[esm] cache /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/data/ESM_33.pkl (9339085 bytes) +[stub] datasets: ABSENT (No module named 'datasets') -> loud stub registered +[model] gifflarESM loaded strict, on cuda +[infer] 36957 rows returned by GIFFLAR +[check] pooled Spearman over GIFFLAR's OWN rows: 0.241086 (its metrics.csv: 0.241086, diff 0.000000) +[gate] glycans seen with >1 protein: 444; fraction with a CONSTANT prediction: 0.0000 +[ours] stratum test_protein_cold: 38556 rows, 36957 after requiring aa+iupac (GIFFLAR-scorable) +[join] 36763 distinct (aa,iupac) keys; max within-key spread 5.960e-08 +[join] joined 36957 rows (0 of our GIFFLAR-scorable rows had no prediction) +{ + "arm": "B_protein", + "variant": "gifflarESM", + "stratum": "test_protein_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/weights/epoch=48-step=168756.ckpt", + "gifflar_reported_test_spearman": 0.241086, + "pooled_over_gifflar_rows": 0.241086, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 38556, + "rows_scored": 36957, + "assays_eligible_data_only": 246, + "assays_scored": 233, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.215931, + "macro_eligibility_corrected": 0.20452, + "pooled_over_our_rows": 0.241086, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} +[done] wrote /work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_gifflarESM_s43.json +===== done (B_protein/gifflarESM/s43) ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_5.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_5.err new file mode 100644 index 0000000000000000000000000000000000000000..50737927e0d5c5c1e72001e70754edc5f31b2cf4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_5.err @@ -0,0 +1,4 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_5.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_5.out new file mode 100644 index 0000000000000000000000000000000000000000..28ffa2416df2152c2b0d1a55c3b61a1b9a7223fa --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_5.out @@ -0,0 +1,36 @@ +nova18-gpu-5 +Tesla V100-PCIE-16GB +arm=B_protein variant=gifflarESM seed=44 logs_dir=logs_s44_gifflar +[ver] versions on disk: ['version_0', 'version_1', 'version_2'] -> using version_2 +[ver] GIFFLAR's own reported test Spearman: 0.250504 +[ckpt] /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/weights/epoch=37-step=130872.ckpt +[esm] cache /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/data/ESM_33.pkl (9339085 bytes) +[stub] datasets: ABSENT (No module named 'datasets') -> loud stub registered +[model] gifflarESM loaded strict, on cuda +[infer] 36957 rows returned by GIFFLAR +[check] pooled Spearman over GIFFLAR's OWN rows: 0.250504 (its metrics.csv: 0.250504, diff 0.000000) +[gate] glycans seen with >1 protein: 444; fraction with a CONSTANT prediction: 0.0000 +[ours] stratum test_protein_cold: 38556 rows, 36957 after requiring aa+iupac (GIFFLAR-scorable) +[join] 36763 distinct (aa,iupac) keys; max within-key spread 5.960e-08 +[join] joined 36957 rows (0 of our GIFFLAR-scorable rows had no prediction) +{ + "arm": "B_protein", + "variant": "gifflarESM", + "stratum": "test_protein_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/weights/epoch=37-step=130872.ckpt", + "gifflar_reported_test_spearman": 0.250504, + "pooled_over_gifflar_rows": 0.250504, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 38556, + "rows_scored": 36957, + "assays_eligible_data_only": 246, + "assays_scored": 233, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.218968, + "macro_eligibility_corrected": 0.207397, + "pooled_over_our_rows": 0.250504, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} +[done] wrote /work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_gifflarESM_s44.json +===== done (B_protein/gifflarESM/s44) ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_6.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_6.err new file mode 100644 index 0000000000000000000000000000000000000000..50737927e0d5c5c1e72001e70754edc5f31b2cf4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_6.err @@ -0,0 +1,4 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_6.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_6.out new file mode 100644 index 0000000000000000000000000000000000000000..acb5dde1ac4e86f7c7ef5ee54ec0ca738f6e33a4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_6.out @@ -0,0 +1,36 @@ +nova21-gpu-3 +NVIDIA A100-SXM4-80GB +arm=B_protein variant=sweetnetESM seed=43 logs_dir=logs_s43_sweetnet +[ver] versions on disk: ['version_0', 'version_1', 'version_2', 'version_3'] -> using version_3 +[ver] GIFFLAR's own reported test Spearman: 0.182637 +[ckpt] /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=42-step=148092.ckpt +[esm] cache /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/data/ESM_33.pkl (9339085 bytes) +[stub] datasets: ABSENT (No module named 'datasets') -> loud stub registered +[model] sweetnetESM loaded strict, on cuda +[infer] 36957 rows returned by GIFFLAR +[check] pooled Spearman over GIFFLAR's OWN rows: 0.182637 (its metrics.csv: 0.182637, diff 0.000000) +[gate] glycans seen with >1 protein: 444; fraction with a CONSTANT prediction: 0.0000 +[ours] stratum test_protein_cold: 38556 rows, 36957 after requiring aa+iupac (GIFFLAR-scorable) +[join] 36763 distinct (aa,iupac) keys; max within-key spread 6.557e-07 +[join] joined 36957 rows (0 of our GIFFLAR-scorable rows had no prediction) +{ + "arm": "B_protein", + "variant": "sweetnetESM", + "stratum": "test_protein_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=42-step=148092.ckpt", + "gifflar_reported_test_spearman": 0.182637, + "pooled_over_gifflar_rows": 0.182637, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 38556, + "rows_scored": 36957, + "assays_eligible_data_only": 246, + "assays_scored": 233, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.188834, + "macro_eligibility_corrected": 0.178855, + "pooled_over_our_rows": 0.182637, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} +[done] wrote /work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_sweetnetESM_s43.json +===== done (B_protein/sweetnetESM/s43) ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_7.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_7.err new file mode 100644 index 0000000000000000000000000000000000000000..50737927e0d5c5c1e72001e70754edc5f31b2cf4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_7.err @@ -0,0 +1,4 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_7.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_7.out new file mode 100644 index 0000000000000000000000000000000000000000..bba3d57f4b58f36573be32169c9ef0f6dd06c3bf --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_7.out @@ -0,0 +1,36 @@ +nova18-gpu-1 +Tesla V100-PCIE-32GB +arm=B_protein variant=sweetnetESM seed=44 logs_dir=logs_s44_sweetnet +[ver] versions on disk: ['version_0', 'version_1', 'version_2', 'version_3'] -> using version_3 +[ver] GIFFLAR's own reported test Spearman: 0.198962 +[ckpt] /work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=48-step=168756.ckpt +[esm] cache /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/data/ESM_33.pkl (9339085 bytes) +[stub] datasets: ABSENT (No module named 'datasets') -> loud stub registered +[model] sweetnetESM loaded strict, on cuda +[infer] 36957 rows returned by GIFFLAR +[check] pooled Spearman over GIFFLAR's OWN rows: 0.198962 (its metrics.csv: 0.198962, diff 0.000000) +[gate] glycans seen with >1 protein: 444; fraction with a CONSTANT prediction: 0.0000 +[ours] stratum test_protein_cold: 38556 rows, 36957 after requiring aa+iupac (GIFFLAR-scorable) +[join] 36763 distinct (aa,iupac) keys; max within-key spread 7.749e-07 +[join] joined 36957 rows (0 of our GIFFLAR-scorable rows had no prediction) +{ + "arm": "B_protein", + "variant": "sweetnetESM", + "stratum": "test_protein_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=48-step=168756.ckpt", + "gifflar_reported_test_spearman": 0.198962, + "pooled_over_gifflar_rows": 0.198962, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 38556, + "rows_scored": 36957, + "assays_eligible_data_only": 246, + "assays_scored": 233, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.184944, + "macro_eligibility_corrected": 0.175171, + "pooled_over_our_rows": 0.198962, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} +[done] wrote /work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_sweetnetESM_s44.json +===== done (B_protein/sweetnetESM/s44) ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_8.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_8.err new file mode 100644 index 0000000000000000000000000000000000000000..50737927e0d5c5c1e72001e70754edc5f31b2cf4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_8.err @@ -0,0 +1,4 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_8.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_8.out new file mode 100644 index 0000000000000000000000000000000000000000..44e6e92ecc7efe8445de85a439b444ded626bbd5 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_8.out @@ -0,0 +1,36 @@ +nova18-gpu-4 +Tesla V100-PCIE-32GB +arm=C_doubly variant=gifflarESM seed=43 logs_dir=logs_s43_gifflar +[ver] versions on disk: ['version_0', 'version_1'] -> using version_1 +[ver] GIFFLAR's own reported test Spearman: 0.220454 +[ckpt] /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/weights/epoch=8-step=51624.ckpt +[esm] cache /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/data/ESM_33.pkl (9339085 bytes) +[stub] datasets: ABSENT (No module named 'datasets') -> loud stub registered +[model] gifflarESM loaded strict, on cuda +[infer] 3533 rows returned by GIFFLAR +[check] pooled Spearman over GIFFLAR's OWN rows: 0.220454 (its metrics.csv: 0.220454, diff 0.000000) +[gate] glycans seen with >1 protein: 69; fraction with a CONSTANT prediction: 0.0000 +[ours] stratum test_doubly_cold: 3691 rows, 3533 after requiring aa+iupac (GIFFLAR-scorable) +[join] 3533 distinct (aa,iupac) keys; max within-key spread 0.000e+00 +[join] joined 3533 rows (0 of our GIFFLAR-scorable rows had no prediction) +{ + "arm": "C_doubly", + "variant": "gifflarESM", + "stratum": "test_doubly_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/weights/epoch=8-step=51624.ckpt", + "gifflar_reported_test_spearman": 0.220454, + "pooled_over_gifflar_rows": 0.220454, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 3691, + "rows_scored": 3533, + "assays_eligible_data_only": 212, + "assays_scored": 201, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.197657, + "macro_eligibility_corrected": 0.187401, + "pooled_over_our_rows": 0.220454, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} +[done] wrote /work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_gifflarESM_s43.json +===== done (C_doubly/gifflarESM/s43) ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_9.err b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_9.err new file mode 100644 index 0000000000000000000000000000000000000000..50737927e0d5c5c1e72001e70754edc5f31b2cf4 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_9.err @@ -0,0 +1,4 @@ +Some weights of EsmModel were not initialized from the model checkpoint at facebook/esm2_t33_650M_UR50D and are newly initialized: ['pooler.dense.bias', 'pooler.dense.weight'] +You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. +/work/ratul1/supantha/conda/gifflar/lib/python3.11/site-packages/torchmetrics/utilities/prints.py:43: UserWarning: Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer. For large datasets, this may lead to large memory footprint. + warnings.warn(*args, **kwargs) diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_9.out b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_9.out new file mode 100644 index 0000000000000000000000000000000000000000..4b11bd2f20abd4deb2ad13c518e29140836af35e --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_9.out @@ -0,0 +1,36 @@ +nova18-gpu-5 +Tesla V100-PCIE-16GB +arm=C_doubly variant=gifflarESM seed=44 logs_dir=logs_s44_gifflar +[ver] versions on disk: ['version_0', 'version_1'] -> using version_1 +[ver] GIFFLAR's own reported test Spearman: 0.257452 +[ckpt] /work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/weights/epoch=6-step=40152.ckpt +[esm] cache /work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/data/ESM_33.pkl (9339085 bytes) +[stub] datasets: ABSENT (No module named 'datasets') -> loud stub registered +[model] gifflarESM loaded strict, on cuda +[infer] 3533 rows returned by GIFFLAR +[check] pooled Spearman over GIFFLAR's OWN rows: 0.257452 (its metrics.csv: 0.257452, diff 0.000000) +[gate] glycans seen with >1 protein: 69; fraction with a CONSTANT prediction: 0.0000 +[ours] stratum test_doubly_cold: 3691 rows, 3533 after requiring aa+iupac (GIFFLAR-scorable) +[join] 3533 distinct (aa,iupac) keys; max within-key spread 0.000e+00 +[join] joined 3533 rows (0 of our GIFFLAR-scorable rows had no prediction) +{ + "arm": "C_doubly", + "variant": "gifflarESM", + "stratum": "test_doubly_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/weights/epoch=6-step=40152.ckpt", + "gifflar_reported_test_spearman": 0.257452, + "pooled_over_gifflar_rows": 0.257452, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 3691, + "rows_scored": 3533, + "assays_eligible_data_only": 212, + "assays_scored": 201, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.197237, + "macro_eligibility_corrected": 0.187003, + "pooled_over_our_rows": 0.257452, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} +[done] wrote /work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_gifflarESM_s44.json +===== done (C_doubly/gifflarESM/s44) ===== diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/manifest.json b/releases/2026-10-02/bertosebind_new_runs/executed/remote/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..afed681b2b36a73b702a3eb593666d7d642f345d --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/manifest.json @@ -0,0 +1,1740 @@ +{ + "job_id": "16608615", + "node": "nova23-7", + "files": [ + { + "source": "/work/ratul1/supantha/Bertint/aff_attribution_motif.py", + "relative_path": "aff_attribution_motif.py", + "bytes": 14866, + "sha256": "33d41f680cf7a5ae3b98fef4d1ef604f6e12a6a856ec6e90df8bb5a88f336bbe", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/aff_attribution_motif.sbatch", + "relative_path": "aff_attribution_motif.sbatch", + "bytes": 1616, + "sha256": "2b89020895eebac8c99366036eebb07dd43c687fe47274dcd1de47d1017548ff", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gif_seeds.sbatch", + "relative_path": "gif_seeds.sbatch", + "bytes": 2790, + "sha256": "56bf1e5b11a386d0920b9f50da6288eff222ee1b7f25d772a8a666a2387b2a9d", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_score_macro_seeds.py", + "relative_path": "gifflar_score_macro_seeds.py", + "bytes": 15417, + "sha256": "578635213e1a3eddd61438a6249f14e1a5d2487267286fc459eb77972808e225", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_score_macro.py", + "relative_path": "gifflar_score_macro.py", + "bytes": 14847, + "sha256": "ef833104d5eecd273df7d9f7c39bae4a216b015bde15978ea716f1f864874de4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_score_perrow.py", + "relative_path": "gifflar_score_perrow.py", + "bytes": 16705, + "sha256": "f88bcf303685ea6a075747a12eafa7df041909b9b455d80ea98c2b536aed0de8", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/b4_step1_structure.py", + "relative_path": "b4_step1_structure.py", + "bytes": 9872, + "sha256": "c82d7fe71d178d78d52ee47d809cd12d0286c48b1375c0c7b8b80fa222858e61", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/b4_step3_bootstrap_r2.py", + "relative_path": "b4_step3_bootstrap_r2.py", + "bytes": 19828, + "sha256": "6dbbbeb14bb860f6344a93bb65754f540dee8da4ceb3fdc526133c7133dd426c", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/b4_step3_bootstrap.py", + "relative_path": "b4_step3_bootstrap.py", + "bytes": 19304, + "sha256": "ab7560abe237da435464a984a4e23925e7ec48d802949f57ef9600b829e6b37d", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/b4_gif_repeat_compare.py", + "relative_path": "b4_gif_repeat_compare.py", + "bytes": 1977, + "sha256": "7fe6a80de1e7662a916e84b0a679c5579ab7fdcaaace70e1855f7d8face51ca3", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/b4_gif_repeat.sbatch", + "relative_path": "b4_gif_repeat.sbatch", + "bytes": 1648, + "sha256": "a381978d36492bb21cdb7c2a3007c51414b7630dd88016c7a74eb19c48080925", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/b4_baselines_perrow.py", + "relative_path": "b4_baselines_perrow.py", + "bytes": 7176, + "sha256": "61a5ef32482365e37e58bd4aee49ff5dabc2fafa04f4e063f3a0be7c294c84c7", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/b4_lo_perrow_ckpt.py", + "relative_path": "b4_lo_perrow_ckpt.py", + "bytes": 7705, + "sha256": "1d0433763d7ad49088e396b435a42f2a12141436db05592778a79938c88a953b", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/affinose_glycan_cold_contamination.json", + "relative_path": "affinose_glycan_cold_contamination.json", + "bytes": 1818, + "sha256": "0d4458462cd10dae219a9f15eb6dc8129d200a09891bd0b6bf0297cd85c4dae2", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_step3_bootstrap_20260926.json", + "relative_path": "diagnostics/affinose_b4_step3_bootstrap_20260926.json", + "bytes": 10624, + "sha256": "17ab513ec2d9dec6f1e8c9445dfd7500190f99f0e8758b21fbb435b026324f3b", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_gif_repeat_20260927.json", + "relative_path": "diagnostics/affinose_b4_gif_repeat_20260927.json", + "bytes": 796, + "sha256": "50049bf5658f27700205e91d07f40512b8d297a7af11f51fcfbd514df9b59478", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json", + "relative_path": "diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json", + "bytes": 48191, + "sha256": "6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_step1_structure_20260926.json", + "relative_path": "diagnostics/affinose_b4_step1_structure_20260926.json", + "bytes": 16214, + "sha256": "7f9edc64528d5b43d2c464f8f5d4db91c2a133f54364993c7798a2a606bd3427", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_attr_motif_16596807.out", + "relative_path": "logs/aff_attr_motif_16596807.out", + "bytes": 7511, + "sha256": "e65e21b8c9c9bd0291a034852f7ab47f826e1f51448d9ea8439b5eb23ed8eb98", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_gifflarESM.json", + "relative_path": "affinose_gifflar_macro_A_glycan_gifflarESM.json", + "bytes": 903, + "sha256": "d7f21b8037172e6d42fb65c8169d37b19c385d68dc9cbebadbafe9e930843074", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_sweetnetESM.json", + "relative_path": "affinose_gifflar_macro_A_glycan_sweetnetESM.json", + "bytes": 906, + "sha256": "eca94bfbe82bfba95c2086c9c4ffe14091d442017356394ec2e75173cb66810f", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_gifflarESM.json", + "relative_path": "affinose_gifflar_macro_B_protein_gifflarESM.json", + "bytes": 905, + "sha256": "529296c1388651b4451f35829d0caa63e692a96fc88b74ee9b8dc8c1d09136da", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_sweetnetESM.json", + "relative_path": "affinose_gifflar_macro_B_protein_sweetnetESM.json", + "bytes": 908, + "sha256": "6f0098947aa4c962f991d1e17acc17707d7cb2eb5e9d6338182d6cfa65d28a2d", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_gifflarESM.json", + "relative_path": "affinose_gifflar_macro_C_doubly_gifflarESM.json", + "bytes": 900, + "sha256": "bf720edacbad09cd04c42df7cf347dd1fe9846a22f307f7be1c38f06e89faa44", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_sweetnetESM.json", + "relative_path": "affinose_gifflar_macro_C_doubly_sweetnetESM.json", + "bytes": 900, + "sha256": "1884d744232b56c5edc76e655cf9bd117e43d8d749c98300b528ea6a5e55b75d", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_0.err", + "relative_path": "logs/aff_gseed_16597159_0.err", + "bytes": 3771, + "sha256": "6c486b37a642549a8dcf924eabd52e2660d88a6ada53ba05aecb91937fd98626", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_0.out", + "relative_path": "logs/aff_gseed_16597159_0.out", + "bytes": 3954, + "sha256": "7832596dfd62832aadeed39c1acca59643f00ec8dbe812730b49bd1b2ca5150b", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_1.err", + "relative_path": "logs/aff_gseed_16597159_1.err", + "bytes": 3771, + "sha256": "bf5e3ff79c6b942dca7f35dcb85d0f32081b03875cb4640022fab29dff833b11", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_1.out", + "relative_path": "logs/aff_gseed_16597159_1.out", + "bytes": 3956, + "sha256": "134b045efbf1f560d0d41fa702ff53b6369fd38235fcef55ca8aaa4615698fed", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_2.err", + "relative_path": "logs/aff_gseed_16597159_2.err", + "bytes": 3777, + "sha256": "d9383fa7e0469a436e08d24f4f9af31c1a6fb9ebb5e115843b53e2b2ded612f1", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_2.out", + "relative_path": "logs/aff_gseed_16597159_2.out", + "bytes": 3992, + "sha256": "0bbeab27824eeffbbfe5cf04317d1795b1f8f02d4c5ad9b7dbc23e159a823940", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_3.err", + "relative_path": "logs/aff_gseed_16597159_3.err", + "bytes": 3777, + "sha256": "735f42f273046b3af0374283927429fa75a1b7a8b66d6b205a20e4e1cfd59eed", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_3.out", + "relative_path": "logs/aff_gseed_16597159_3.out", + "bytes": 3997, + "sha256": "dcdbc088e7945d0f63803ac95aed81f3f8c8d25c97dd760df269921a08bacae7", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_4.err", + "relative_path": "logs/aff_gseed_16597159_4.err", + "bytes": 4166, + "sha256": "98912251710582e65eaed2ba01ee184d957d177ec31e30969939b4ef0962a2bf", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_4.out", + "relative_path": "logs/aff_gseed_16597159_4.out", + "bytes": 4182, + "sha256": "b1febe3591a887bd63d7bb607536ce17bdab51eb9db9a8b8c3d9d5ff77aca1c2", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_5.err", + "relative_path": "logs/aff_gseed_16597159_5.err", + "bytes": 3775, + "sha256": "cbb38c7fc50100cfa44cdf9b64de3df9a002613c62d8489b9d3db301406712c7", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_5.out", + "relative_path": "logs/aff_gseed_16597159_5.out", + "bytes": 3956, + "sha256": "a1b8f17ba63285c54d42ad49ce61bf8356ac4dfe279de8b65f687304783bdf55", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_6.err", + "relative_path": "logs/aff_gseed_16597159_6.err", + "bytes": 4178, + "sha256": "8ec18cd103ee2f80b2bacc8660a53588ed6313dbdc2455fe87fb5cdac6d30ef1", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_6.out", + "relative_path": "logs/aff_gseed_16597159_6.out", + "bytes": 4226, + "sha256": "18050c22347d3a2900b0d15cd7f2b97c1f6028ff27e5e060fc33c8308851b358", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_7.err", + "relative_path": "logs/aff_gseed_16597159_7.err", + "bytes": 4178, + "sha256": "1a1baefb3f9d8bae9c38975310f96004470e75bed27b32b5273b31a9baca05f5", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_7.out", + "relative_path": "logs/aff_gseed_16597159_7.out", + "bytes": 4229, + "sha256": "8869a90d89089a6f26c7d88b1a389630930c35adff10016a015bc5bb331308b7", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_8.err", + "relative_path": "logs/aff_gseed_16597159_8.err", + "bytes": 4156, + "sha256": "01b633582a3ed13728f688fde16693926778896ba0952506cce66072f600f354", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_8.out", + "relative_path": "logs/aff_gseed_16597159_8.out", + "bytes": 4184, + "sha256": "8f468cb20588f01bc0794c43ea69d5fa78627f4e35ef7ecdb7ffbcd3266c78c3", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_9.err", + "relative_path": "logs/aff_gseed_16597159_9.err", + "bytes": 4600, + "sha256": "a3ea46d3bd9191b9bbd49627cbfdac0dee312230e5e1ed93016f98f8786b94ba", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_9.out", + "relative_path": "logs/aff_gseed_16597159_9.out", + "bytes": 4184, + "sha256": "313f8c5e3999dfa75ae508fd57d0d033a00b40cdf2b794cb4c32fb0a901b53bb", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_10.err", + "relative_path": "logs/aff_gseed_16597159_10.err", + "bytes": 3777, + "sha256": "d911a9619dee68a9fc982bb3db253b8e72f12dc1c06d2bc434556211909b2719", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_10.out", + "relative_path": "logs/aff_gseed_16597159_10.out", + "bytes": 3998, + "sha256": "c079926adcc0d2bce5b591f870208dcd2bef2ea3029aee8950bf0ce44c1105ea", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_11.err", + "relative_path": "logs/aff_gseed_16597159_11.err", + "bytes": 4168, + "sha256": "5024c4160aeeccd212930b0d959ed0bab4dd7bf593b61b26decd78c7513aa638", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_11.out", + "relative_path": "logs/aff_gseed_16597159_11.out", + "bytes": 4229, + "sha256": "4d110e939761ff4d8c7938c754e182d2c09ede84c8360d10ce18a04280dafea6", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_0.err", + "relative_path": "logs/aff_gsmac_16602170_0.err", + "bytes": 575, + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_0.out", + "relative_path": "logs/aff_gsmac_16602170_0.out", + "bytes": 2138, + "sha256": "19bb18892da4f9174e308bd42908a6e6d383001edd75c9ad482eef111b5bbb31", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_1.err", + "relative_path": "logs/aff_gsmac_16602170_1.err", + "bytes": 575, + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_1.out", + "relative_path": "logs/aff_gsmac_16602170_1.out", + "bytes": 2137, + "sha256": "152af1228aa39534d68470023321d4350bb2ea4b997bfd0bf38efbbeb92bad8b", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_10.err", + "relative_path": "logs/aff_gsmac_16602170_10.err", + "bytes": 575, + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_10.out", + "relative_path": "logs/aff_gsmac_16602170_10.out", + "bytes": 2141, + "sha256": "d842f047adc16782a9724406ecab07aa67fe3ad853f5d0c8bee73cb63d129782", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_11.err", + "relative_path": "logs/aff_gsmac_16602170_11.err", + "bytes": 575, + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_11.out", + "relative_path": "logs/aff_gsmac_16602170_11.out", + "bytes": 2150, + "sha256": "922dfe72fd457b50a6c468db266827346ab1173381458ad61e21ceb5a0c8736c", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_2.err", + "relative_path": "logs/aff_gsmac_16602170_2.err", + "bytes": 575, + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_2.out", + "relative_path": "logs/aff_gsmac_16602170_2.out", + "bytes": 2152, + "sha256": "2b008f6ae0f5554b9841582ded12a01558218558d8b7748899e94a0499d8caaf", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_3.err", + "relative_path": "logs/aff_gsmac_16602170_3.err", + "bytes": 575, + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_3.out", + "relative_path": "logs/aff_gsmac_16602170_3.out", + "bytes": 2152, + "sha256": "c1d325125ee0463b230e5ac347c45a117ebc1a1686393d9d7bd63dd7c9a8a8d4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_4.err", + "relative_path": "logs/aff_gsmac_16602170_4.err", + "bytes": 575, + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_4.out", + "relative_path": "logs/aff_gsmac_16602170_4.out", + "bytes": 2170, + "sha256": "939f30920d3d4a772d8736c945f6e39dc949cde64cc7b9b9e0116e7b45f4f895", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_5.err", + "relative_path": "logs/aff_gsmac_16602170_5.err", + "bytes": 575, + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_5.out", + "relative_path": "logs/aff_gsmac_16602170_5.out", + "bytes": 2171, + "sha256": "7817d9b5c087d542f2c0659726a66532091a24c9b05edb04196a756291dd5784", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_6.err", + "relative_path": "logs/aff_gsmac_16602170_6.err", + "bytes": 575, + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_6.out", + "relative_path": "logs/aff_gsmac_16602170_6.out", + "bytes": 2197, + "sha256": "4283aa1d699582d4766ca394cf2d9c4b046ce8247b5cef0f8250c424329138a2", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_7.err", + "relative_path": "logs/aff_gsmac_16602170_7.err", + "bytes": 575, + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_7.out", + "relative_path": "logs/aff_gsmac_16602170_7.out", + "bytes": 2196, + "sha256": "eb0257132cbd79d1a3a84bec543183b7bbdaceaaaefc85c988368d70d4146322", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_8.err", + "relative_path": "logs/aff_gsmac_16602170_8.err", + "bytes": 575, + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_8.out", + "relative_path": "logs/aff_gsmac_16602170_8.out", + "bytes": 2137, + "sha256": "523b5ac11259832265dab5c4e08d837f3fe7e4780048a5a4af1f513f6b8c3d4a", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_9.err", + "relative_path": "logs/aff_gsmac_16602170_9.err", + "bytes": 575, + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_9.out", + "relative_path": "logs/aff_gsmac_16602170_9.out", + "bytes": 2137, + "sha256": "40ef3d8f12ba723cfe0e845ec72a960dbd32c8bc5baa3013f570e1c27a6431b6", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_b4_s3_16604914.out", + "relative_path": "logs/aff_b4_s3_16604914.out", + "bytes": 609, + "sha256": "79eb29df46c44942a2a6ac4313789ebc29e1672bec4512c4f965be5ebb739cc9", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_b4_grep_16604967.out", + "relative_path": "logs/aff_b4_grep_16604967.out", + "bytes": 4542, + "sha256": "dadfe2c408938645b4138bb011719affdaebe7098060f66354df56da71d0a146", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/logs/aff_b4_s3r2_16605803.out", + "relative_path": "logs/aff_b4_s3r2_16605803.out", + "bytes": 5103, + "sha256": "5d93f96fb6e537c9b802fd1b2d9fe25df41a19800f85ea860246274d2e897d71", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "relative_path": "gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "bytes": 175381, + "sha256": "35d0ef06a1b9725233ed1e58c74101b7e6a555da48165ed57c9bd71bb5e77315", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "relative_path": "gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "bytes": 572, + "sha256": "e391584ec821c1e86916c6f8c14a6571a550034fd246e1dc0e7d7b3b6d4dbd7e", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "relative_path": "gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "bytes": 175505, + "sha256": "1d9e1b8c6fff12f8603ce8f7e58189da0ae8580e72d3c5bf5ff3893a4f9bce2f", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "relative_path": "gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "bytes": 572, + "sha256": "fb07ac7cfcb63c4dd77c7493f4a518e11d268fd5e8d4cf6a849c31552e48369a", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "relative_path": "gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "bytes": 175252, + "sha256": "fd6f39dd3bef9326bc1f583bf07a1f9b8f02f846630a0c58c66c7bae70456d59", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "relative_path": "gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "bytes": 550, + "sha256": "0dae829566b87d0dd00613343bc5a0c49fb1107c0f4834327d8cca71b8932389", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "relative_path": "gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "bytes": 175410, + "sha256": "b911e06e11968f9d8655ab69619f33a8878759e497eb44498432c341dc6fbdd1", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "relative_path": "gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "bytes": 550, + "sha256": "4902e83edaa137f55f5fe4f32f32068e94a3f4832630b284048c22b8a099dca6", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "bytes": 15294, + "sha256": "346d480fa44e31a5a486bfa99c136cc5ddfee27a197194b7fac289de9ba55665", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "bytes": 575, + "sha256": "75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "bytes": 1062, + "sha256": "6a42d5cf20bf64a7b027660beca902ec84a80a1beb73e8aec1e4eb26fbb7c913", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "bytes": 575, + "sha256": "75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "bytes": 158739, + "sha256": "a71483c34b9d9cd904a6fe241f88af3e30bb3e100a15d666def5b06e4a5c0431", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/hparams.yaml", + "bytes": 575, + "sha256": "75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "bytes": 1418, + "sha256": "47b51d96993782f3c9e6117722176941bd2c6d571200d160e28aa654c97c6356", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "bytes": 575, + "sha256": "0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "bytes": 1474, + "sha256": "89d056126636c1fd1fa44d27ecfd57040a9bfc9eec2a76104da0ae07d01680b3", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "bytes": 575, + "sha256": "0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "bytes": 175499, + "sha256": "c066cdbf7827bdec2f87c15bf95a42e0a23b511bf03338482e4d2b20c149336b", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/hparams.yaml", + "bytes": 575, + "sha256": "0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "bytes": 4108, + "sha256": "faee86ceadc7e1dbe6835d44aef8c5d4f810a2cbe224e13202154b52dab92be3", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "bytes": 553, + "sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "bytes": 9534, + "sha256": "ed66bf0654eeaabf3b4f5f92e1295abc53a0155095160092ffb47826ff385d1a", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "bytes": 553, + "sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "bytes": 57261, + "sha256": "127b095cc67faf26378a247dc7345de56d331537dad375990ed319f684fbde27", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml", + "bytes": 553, + "sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "bytes": 99720, + "sha256": "eee99377078178660db1f12c2700b0c46c9d8120db5f445a8d71d3f584cc9fcd", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml", + "bytes": 553, + "sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "bytes": 4381, + "sha256": "fe5d987579ac234e8f21bb70e642177e9eccb69493564b7c5895e6abd51f4dc2", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "bytes": 553, + "sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "bytes": 87583, + "sha256": "0ecfee6421a63cee0f0537fdb311e44b87227421f637816a0a3ccfd132763d16", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "bytes": 553, + "sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "bytes": 41685, + "sha256": "0d313e8557cb13577b34c8e94e0f2c887c11cfa6da6ca36ab2aa5f9d1cc10f22", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml", + "bytes": 553, + "sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "relative_path": "gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "bytes": 29032, + "sha256": "5ef2b9552f452e4218b9728c0ed57f7a14ec5068d065c7223e2c6e566e5dafd2", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml", + "relative_path": "gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml", + "bytes": 553, + "sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "relative_path": "gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "bytes": 12411, + "sha256": "e92266239d6445a0de886e5081e433632c6719719f6d536ad31e98045160fcea", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "relative_path": "gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "bytes": 572, + "sha256": "781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "relative_path": "gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "bytes": 275117, + "sha256": "929a3396f429527836db8368e7908024bf69766e0567636b1f24df8c1c06ea42", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "relative_path": "gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "bytes": 572, + "sha256": "781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "relative_path": "gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "bytes": 11292, + "sha256": "e937607ecc6a7058664faab71728c58ef7a9bba8f6985082bca5d565aef6ec7e", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "relative_path": "gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "bytes": 572, + "sha256": "987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "relative_path": "gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "bytes": 274338, + "sha256": "eb420f0ea03bce2075ad4eac9237862ccbecb2c37c02d162d860516f4739b280", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "relative_path": "gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "bytes": 572, + "sha256": "987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "relative_path": "gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "bytes": 284563, + "sha256": "1e68c5af1f9c7fe0f1c85d9f3d49fa1104bf3d4c768014154316ee27b94a3cc3", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "relative_path": "gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "bytes": 550, + "sha256": "f7852d23330d3b55e46eec193b3fe411306ea59349de6fa53273294d893dce1c", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "relative_path": "gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "bytes": 32118, + "sha256": "30f0105da3f2c579a8261a30ed6c3fcc8308cf9ebc2068f0e71168567e919922", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "relative_path": "gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "bytes": 550, + "sha256": "22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "relative_path": "gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "bytes": 251993, + "sha256": "168da3dcbf6ca795bb75ec67b9fc567788637c25875b766cc76b441825e6020c", + "copied": true + }, + { + "source": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "relative_path": "gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "bytes": 550, + "sha256": "22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml", + "bytes": 1122, + "sha256": "1ab7793ddb0daa247dc1f75b53356663d2c99e2e279a33207c9dd82f24288d17", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml", + "bytes": 1159, + "sha256": "cda3d3e0df11dcbffff287c985039a4abe486a39bb97fe1554851992cbca127e", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml", + "bytes": 1136, + "sha256": "d11d6ca73935a664a9afe9330d07e51b7e95e89e044a1012065ef1780d820381", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml", + "bytes": 1159, + "sha256": "dab891f502cb328f8313a9d2971e5d8134472b059fa776409f97f5f59e5d470b", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml", + "bytes": 1136, + "sha256": "875883d0ec38fca1a4995ea76c00db81ba84357fb2ed9a7c0921dbb6c7cf6492", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml", + "bytes": 1126, + "sha256": "529c3940cfce81ab3d135f25b722d7c302cd83e8540646f041a5d6ba36baebf3", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml", + "bytes": 1164, + "sha256": "908379483dc5b2d0655aa7b0a13b33c8b70ba0379852ffc2d848e354ebd9945e", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml", + "bytes": 1141, + "sha256": "57cbf88ddf620ffbec7c4a8167a271ec38da0f94b1d3a4e9fe9769a9a19b8eea", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml", + "bytes": 1164, + "sha256": "5e518f2db88c03663eb263a5e4a44e93a3bc43e51c4af6c626cd0da416a18d81", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml", + "bytes": 1141, + "sha256": "50c68416d3d4d72445e61811474179cb552e60d9f8a87f6cc0ed1da32d8b55e8", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml", + "bytes": 1122, + "sha256": "034ba8bdefc3410b987d7bc380bd24a469a01c912349fef1e35436df2a24c36e", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml", + "bytes": 1159, + "sha256": "ed244565f2f81e6c554613718398af97683ad375eb4debb5a61d25855c444368", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml", + "bytes": 1136, + "sha256": "d8ba3e8d83871cdd92548bc8bab1493225cdcbd536c0004ff6b40b48e4e62e40", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml", + "bytes": 1159, + "sha256": "2faa1986c043cf5d8b869d316afa0a043d071400c4f2018ba83551332a143f25", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml", + "bytes": 1136, + "sha256": "5fd2cdec3ee4d49f7d7441a037e0a2fbe428b1c0586de88beaf17a2ab67580f1", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_sweetonly.yaml", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_sweetonly.yaml", + "bytes": 1592, + "sha256": "e8fafb98627685ededa4392c5310e149a7dbbe907e37b43da7d20d228961b181", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/train.py", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/train.py", + "bytes": 10058, + "sha256": "ab79451e7b51e27d985904a4445fc09b756d759413bb2ebaf8755d177bb3e8ad", + "copied": true + }, + { + "source": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/data/utils.py", + "relative_path": "external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/data/utils.py", + "bytes": 6186, + "sha256": "ab257b93c23a522dcd99f37b2b802e67c8e3b4ba46b938db6229a6311a77cd39", + "copied": true + } + ], + "missing": [], + "training_runs": [ + { + "arm": "A_glycan", + "variant": "gifflarESM", + "seed": 43, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0", + "versions": [ + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "max_epoch": 50.0, + "row_count": 3543, + "last_row": { + "epoch": "50", + "step": "172100", + "test/MeanAbsoluteError": "0.23191417753696442", + "test/MeanSquaredError": "0.07438244670629501", + "test/PearsonCorrCoef": "0.3267481327056885", + "test/R2Score": "0.1055254340171814", + "test/SpearmanCorrCoef": "0.3208155333995819", + "test/loss": "0.07438244670629501", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + } + ] + }, + { + "arm": "A_glycan", + "variant": "gifflarESM", + "seed": 44, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0", + "versions": [ + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "max_epoch": 50.0, + "row_count": 3543, + "last_row": { + "epoch": "50", + "step": "172100", + "test/MeanAbsoluteError": "0.22761252522468567", + "test/MeanSquaredError": "0.07245638966560364", + "test/PearsonCorrCoef": "0.35964441299438477", + "test/R2Score": "0.12868690490722656", + "test/SpearmanCorrCoef": "0.3501887321472168", + "test/loss": "0.07245638966560364", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + } + ] + }, + { + "arm": "A_glycan", + "variant": "sweetnetESM", + "seed": 43, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0", + "versions": [ + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "max_epoch": 50.0, + "row_count": 3543, + "last_row": { + "epoch": "50", + "step": "172100", + "test/MeanAbsoluteError": "0.2280169576406479", + "test/MeanSquaredError": "0.0730397179722786", + "test/PearsonCorrCoef": "0.35300204157829285", + "test/R2Score": "0.12167227268218994", + "test/SpearmanCorrCoef": "0.3359033763408661", + "test/loss": "0.0730397179722786", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + } + ] + }, + { + "arm": "A_glycan", + "variant": "sweetnetESM", + "seed": 44, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0", + "versions": [ + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "max_epoch": 50.0, + "row_count": 3543, + "last_row": { + "epoch": "50", + "step": "172100", + "test/MeanAbsoluteError": "0.23340749740600586", + "test/MeanSquaredError": "0.07512389868497849", + "test/PearsonCorrCoef": "0.3112040162086487", + "test/R2Score": "0.09660923480987549", + "test/SpearmanCorrCoef": "0.3092760145664215", + "test/loss": "0.07512389868497849", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + } + ] + }, + { + "arm": "B_protein", + "variant": "gifflarESM", + "seed": 43, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2", + "versions": [ + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "max_epoch": 5.0, + "row_count": 362, + "last_row": { + "epoch": "5", + "step": "17599", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "0.08523336797952652", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + }, + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "max_epoch": 5.0, + "row_count": 36, + "last_row": { + "epoch": "5", + "step": "18999", + "train/loss": "0.07533453404903412" + } + }, + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "max_epoch": 50.0, + "row_count": 3191, + "last_row": { + "epoch": "50", + "step": "172200", + "test/MeanAbsoluteError": "0.2370331734418869", + "test/MeanSquaredError": "0.07688800990581512", + "test/PearsonCorrCoef": "0.2661176919937134", + "test/R2Score": "0.07041490077972412", + "test/SpearmanCorrCoef": "0.24108551442623138", + "test/loss": "0.07688800990581512", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + } + ] + }, + { + "arm": "B_protein", + "variant": "gifflarESM", + "seed": 44, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2", + "versions": [ + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "max_epoch": 0.0, + "row_count": 51, + "last_row": { + "epoch": "0", + "step": "2549", + "train/loss": "0.07524104416370392" + } + }, + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "max_epoch": 0.0, + "row_count": 53, + "last_row": { + "epoch": "0", + "step": "2649", + "train/loss": "0.07286062091588974" + } + }, + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "max_epoch": 50.0, + "row_count": 3545, + "last_row": { + "epoch": "50", + "step": "172200", + "test/MeanAbsoluteError": "0.23736673593521118", + "test/MeanSquaredError": "0.07654805481433868", + "test/PearsonCorrCoef": "0.2768315076828003", + "test/R2Score": "0.07452493906021118", + "test/SpearmanCorrCoef": "0.2505037784576416", + "test/loss": "0.07654805481433868", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + } + ] + }, + { + "arm": "B_protein", + "variant": "sweetnetESM", + "seed": 43, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3", + "versions": [ + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "max_epoch": 1.0, + "row_count": 96, + "last_row": { + "epoch": "1", + "step": "4699", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "0.07825014740228653", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + }, + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "max_epoch": 4.0, + "row_count": 224, + "last_row": { + "epoch": "4", + "step": "14299", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "0.0628974661231041", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + }, + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "max_epoch": 22.0, + "row_count": 1333, + "last_row": { + "epoch": "22", + "step": "78599", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "0.07224465906620026", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + }, + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "max_epoch": 50.0, + "row_count": 1986, + "last_row": { + "epoch": "50", + "step": "172200", + "test/MeanAbsoluteError": "0.241166353225708", + "test/MeanSquaredError": "0.07910767197608948", + "test/PearsonCorrCoef": "0.2128688246011734", + "test/R2Score": "0.0435788631439209", + "test/SpearmanCorrCoef": "0.18263666331768036", + "test/loss": "0.07910767197608948", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + } + ] + }, + { + "arm": "B_protein", + "variant": "sweetnetESM", + "seed": 44, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3", + "versions": [ + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "max_epoch": 1.0, + "row_count": 103, + "last_row": { + "epoch": "1", + "step": "5049", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "0.0763932317495346", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + }, + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "max_epoch": 29.0, + "row_count": 2041, + "last_row": { + "epoch": "29", + "step": "102649", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "0.07645171135663986", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + }, + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "max_epoch": 42.0, + "row_count": 938, + "last_row": { + "epoch": "42", + "step": "145449", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "0.09036950021982193", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + }, + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "max_epoch": 50.0, + "row_count": 569, + "last_row": { + "epoch": "50", + "step": "172200", + "test/MeanAbsoluteError": "0.23973548412322998", + "test/MeanSquaredError": "0.07874315977096558", + "test/PearsonCorrCoef": "0.2273501306772232", + "test/R2Score": "0.047985851764678955", + "test/SpearmanCorrCoef": "0.1989615112543106", + "test/loss": "0.07874315977096558", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + } + ] + }, + { + "arm": "C_doubly", + "variant": "gifflarESM", + "seed": 43, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1", + "versions": [ + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "max_epoch": 2.0, + "row_count": 303, + "last_row": { + "epoch": "2", + "step": "14949", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "0.07338188588619232", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + }, + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "max_epoch": 50.0, + "row_count": 5604, + "last_row": { + "epoch": "50", + "step": "286800", + "test/MeanAbsoluteError": "0.23960888385772705", + "test/MeanSquaredError": "0.07972735911607742", + "test/PearsonCorrCoef": "0.22666603326797485", + "test/R2Score": "0.035893023014068604", + "test/SpearmanCorrCoef": "0.2204538881778717", + "test/loss": "0.07972735911607742", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + } + ] + }, + { + "arm": "C_doubly", + "variant": "gifflarESM", + "seed": 44, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1", + "versions": [ + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "max_epoch": 2.0, + "row_count": 275, + "last_row": { + "epoch": "2", + "step": "13549", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "0.0821983814239502", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + }, + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "max_epoch": 50.0, + "row_count": 5604, + "last_row": { + "epoch": "50", + "step": "286800", + "test/MeanAbsoluteError": "0.23896783590316772", + "test/MeanSquaredError": "0.07788914442062378", + "test/PearsonCorrCoef": "0.24284584820270538", + "test/R2Score": "0.05812174081802368", + "test/SpearmanCorrCoef": "0.25745221972465515", + "test/loss": "0.07788914442062378", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + } + ] + }, + { + "arm": "C_doubly", + "variant": "sweetnetESM", + "seed": 43, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0", + "versions": [ + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "max_epoch": 50.0, + "row_count": 5837, + "last_row": { + "epoch": "50", + "step": "286800", + "test/MeanAbsoluteError": "0.23519288003444672", + "test/MeanSquaredError": "0.07617682218551636", + "test/PearsonCorrCoef": "0.2900708317756653", + "test/R2Score": "0.07882803678512573", + "test/SpearmanCorrCoef": "0.27726849913597107", + "test/loss": "0.07617682218551636", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + } + ] + }, + { + "arm": "C_doubly", + "variant": "sweetnetESM", + "seed": 44, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1", + "versions": [ + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "max_epoch": 6.0, + "row_count": 780, + "last_row": { + "epoch": "6", + "step": "38399", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "0.0761987566947937", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + }, + { + "metrics": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "max_epoch": 50.0, + "row_count": 5137, + "last_row": { + "epoch": "50", + "step": "286800", + "test/MeanAbsoluteError": "0.24156196415424347", + "test/MeanSquaredError": "0.07841714471578598", + "test/PearsonCorrCoef": "0.2589475214481354", + "test/R2Score": "0.05173689126968384", + "test/SpearmanCorrCoef": "0.25301650166511536", + "test/loss": "0.07841714471578598", + "train/MeanAbsoluteError": "", + "train/MeanSquaredError": "", + "train/PearsonCorrCoef": "", + "train/R2Score": "", + "train/SpearmanCorrCoef": "", + "train/loss": "", + "val/MeanAbsoluteError": "", + "val/MeanSquaredError": "", + "val/PearsonCorrCoef": "", + "val/R2Score": "", + "val/SpearmanCorrCoef": "", + "val/loss": "" + } + } + ] + } + ], + "errors": [], + "dimension_out_of_range": [ + { + "task": 0, + "path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_0.err", + "count": 0 + }, + { + "task": 1, + "path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_1.err", + "count": 0 + }, + { + "task": 2, + "path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_2.err", + "count": 0 + }, + { + "task": 3, + "path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_3.err", + "count": 0 + }, + { + "task": 4, + "path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_4.err", + "count": 0 + }, + { + "task": 5, + "path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_5.err", + "count": 0 + }, + { + "task": 6, + "path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_6.err", + "count": 0 + }, + { + "task": 7, + "path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_7.err", + "count": 0 + }, + { + "task": 8, + "path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_8.err", + "count": 0 + }, + { + "task": 9, + "path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_9.err", + "count": 0 + }, + { + "task": 10, + "path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_10.err", + "count": 0 + }, + { + "task": 11, + "path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_11.err", + "count": 0 + } + ] +} diff --git a/releases/2026-10-02/bertosebind_new_runs/executed/remote/train_lgi.py b/releases/2026-10-02/bertosebind_new_runs/executed/remote/train_lgi.py new file mode 100644 index 0000000000000000000000000000000000000000..0cb338fe2257f2a7522fe90bcacf93cb4dd74e77 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/executed/remote/train_lgi.py @@ -0,0 +1,163 @@ +import os +# os.environ["CUDA_VISIBLE_DEVICES"] = "1" + +from argparse import ArgumentParser +import time +import copy +from pathlib import Path + +import pandas as pd +from pytorch_lightning import Trainer +from pytorch_lightning.callbacks import RichProgressBar, RichModelSummary, ModelCheckpoint +from pytorch_lightning.loggers import CSVLogger +from torch_geometric import seed_everything + +from gifflar.data.modules import LGI_GDM, ConstrastiveGDM +from gifflar.model.baselines.sweetnet import SweetNetLightning +from gifflar.model.downstream import DownstreamGGIN +from gifflar.model.glylm import GlycanLM +from gifflar.pretransforms import get_pretransforms +from gifflar.utils import read_yaml_config, hash_dict +from experiments.lgi_model import LGI_Model +from experiments.contrastive_model import ContrastLGIModel + + +def collect_metrics(path: Path): + this = pd.read_csv(path / "metrics.csv") + if (path / "resuming.txt").exists(): + with open(path / "resuming.txt") as f: + parent = f.readlines()[0].strip().split(" ")[-1] + df = collect_metrics(Path(parent)) + return pd.concat([df, this], ignore_index=True) + return this + + +def unfold_config(config: dict): + if isinstance(config["model"]["glycan_encoder"], dict): + ges = [config["model"]["glycan_encoder"]] + else: + ges = config["model"]["glycan_encoder"] + del config["model"]["glycan_encoder"] + + if isinstance(config["model"]["lectin_encoder"], dict): + les = [config["model"]["lectin_encoder"]] + else: + les = config["model"]["lectin_encoder"] + del config["model"]["lectin_encoder"] + + for le in les: + for ge in ges: + tmp_config = copy.deepcopy(config) + tmp_config["model"]["lectin_encoder"] = le + tmp_config["model"]["glycan_encoder"] = ge + yield tmp_config + + +def train(contrastive: bool = False, ckpt_file: Path | None = None, **kwargs): + # Use config pre-transforms if provided, else default to GIFFLAR + SweetNet + if "pre-transforms" not in kwargs or not kwargs["pre-transforms"]: + kwargs["pre-transforms"] = {"GIFFLARTransform": "", "SweetNetTransform": ""} + kwargs["hash"] = hash_dict(kwargs["pre-transforms"]) + seed_everything(kwargs["seed"]) + + if contrastive: + GDM = ConstrastiveGDM + MODEL = ContrastLGIModel + LOG_SUFFIX = "CLGI_" + else: + GDM = LGI_GDM + MODEL = LGI_Model + LOG_SUFFIX = "LGI_" + + datamodule = GDM( + root=kwargs["root_dir"], filename=kwargs["origin"], hash_code=kwargs["hash"], + batch_size=kwargs["model"].get("batch_size", 1), transform=None, num_workers=12, + pre_transform=get_pretransforms(**kwargs['pre-transforms']), # Apply GIFFLAR transforms + ) + add_validation = [] + add_tasks = [] + for entry in kwargs["add_valid"]: + add_validation.append(LGI_GDM( + root=kwargs["root_dir"], filename=entry["path"], hash_code=kwargs["hash"], + batch_size=kwargs["model"].get("batch_size", 1), transform=None, num_workers=12, + pre_transform=get_pretransforms(**kwargs['pre-transforms']), # Apply GIFFLAR transforms + )) + add_tasks.append((entry["name"], entry["task"])) + + # set up the logger + glycan_model_name = kwargs["model"]["glycan_encoder"]["name"] + ( + kwargs["model"]["glycan_encoder"].get("suffix", None) or "") + lectin_model_name = kwargs["model"]["lectin_encoder"]["name"] + ( + kwargs["model"]["lectin_encoder"].get("suffix", None) or "") + logger = CSVLogger(kwargs["logs_dir"], name=LOG_SUFFIX + glycan_model_name + lectin_model_name) + logger.log_hyperparams(kwargs) + + model = MODEL( + glycan_encoder_name=kwargs["model"]["glycan_encoder"]["name"], + glycan_encoder_args=kwargs["model"]["glycan_encoder"], + lectin_encoder=kwargs["model"]["lectin_encoder"]["name"], + le_layer_num=kwargs["model"]["lectin_encoder"]["layer_num"], + add_tasks = add_tasks, + **kwargs, + ) + model.to("cuda") + + if ckpt_file is not None: + with open(Path(logger.log_dir) / "resuming.txt", "w") as f: + print(f"Resuming from {ckpt_file.parent.parent}", file=f) + + trainer = Trainer( + callbacks=[ + ModelCheckpoint( + dirpath=Path(logger.log_dir) / "weights", + monitor="val/loss", + mode="min", + save_last=True, + save_top_k=1, + save_weights_only=False, + ), + RichProgressBar(), + RichModelSummary(), + ], + logger=logger, + max_epochs=kwargs["model"]["epochs"], + accelerator="gpu", + ) + start = time.time() + trainer.fit( + model, + train_dataloaders=datamodule.train_dataloader(), + val_dataloaders=[datamodule.val_dataloader()] + [add_val.val_dataloader() for add_val in add_validation], + ckpt_path=ckpt_file, + ) + + # Run test evaluation + print("\n=== Running Test Evaluation ===") + test_results = trainer.test( + model, + dataloaders=datamodule.test_dataloader(), + ckpt_path="best", + ) + print(f"Test Results: {test_results}") + print("Training took", time.time() - start, "s") + collect_metrics(Path(logger.log_dir)).to_csv(Path(logger.log_dir) / "comb_metrics.csv", index=False) + + +def main(mode, config): + if (c := Path(config)).is_file(): + custom_args = read_yaml_config(config) + for args in unfold_config(custom_args): + train(contrastive=mode == "contrastive", **args) + elif c.is_dir(): + if not ((c / "hparams.yaml").exists() and (c / "metrics.csv").exists() and (c / "weights" / "last.ckpt").exists()): + raise FileNotFoundError("One or multiple of hparams.yaml, metrics.csv, or weights/last.ckpt are missing. No training can be resumed.") + custom_args = read_yaml_config(c / "hparams.yaml") + train(contrastive=mode == "contrastive", ckpt_file=c / "weights" / "last.ckpt", **custom_args) + + +if __name__ == '__main__': + parser = ArgumentParser() + parser.add_argument("mode", type=str, help="Run classical DTI training or contrastive training", choices=["classical", "contrastive"]) + parser.add_argument("config", type=str, help="Path to YAML config file") + args = parser.parse_args() + main(args.mode, args.config) diff --git a/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/doubly_cold_exposure_join.csv b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/doubly_cold_exposure_join.csv new file mode 100644 index 0000000000000000000000000000000000000000..1d5961a08b2743a14e382ae4d2e69e383b9435f0 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/doubly_cold_exposure_join.csv @@ -0,0 +1,174 @@ +canonical_wurcs,scored_rows,in_bpe_fit_partition,in_encoder_sequence_training +"WURCS=2.0/1,9,8/[a1122h-1a_1-5]/1-1-1-1-1-1-1-1-1/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1_e6-h1_f2-g1_h2-i1",1,False,False +"WURCS=2.0/2,12,11/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2-2-2-2/a4-b1_b4-c1_c4-d1_d4-e1_e4-f1_f4-g1_g4-h1_h4-i1_i4-j1_j4-k1_k4-l1",4,False,False +"WURCS=2.0/2,12,11/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1_e2-f1_f2-g1_g2-h1_h2-i1_i2-j1_j2-k1_k2-l1",2,False,False +"WURCS=2.0/2,12,11/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1_g3-h1_h3-i1_i3-j1_j3-k1_k3-l1",4,False,False +"WURCS=2.0/2,13,12/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1_g6-h1_h6-i1_i6-j1_j6-k1_k6-l1_l6-m1",4,False,False +"WURCS=2.0/2,15,14/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1_g6-h1_h6-i1_i6-j1_j6-k1_k6-l1_l6-m1_m6-n1_n6-o1",2,False,False +"WURCS=2.0/2,2,1/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2/a3-b1",1,True,True +"WURCS=2.0/2,2,1/[axx2xh-1d_1-5_2*OC(CCCCCC$4)/3=O_3*OC(CCCCCC$4)/3=O_4*OC(CCCCCC$4)/3=O][axx2xh-1u_1-5_2*OC(CCCCCC$4)_3*OC(CCCCCC$4)_4*OC(CCCCCC$4)_6*OC(CCCCCC$4)]/1-2/a6-b1",4,False,False +"WURCS=2.0/2,2,1/[u122xh_2*OC_3*OC_6*OC][a122xh-1u_1-5_2*OC_3*OC_4*OC_6*OC]/1-2/a4-b1",4,False,False +"WURCS=2.0/2,3,2/[a1122h-1b_1-5_2*OCC/3=O_4*OCC/3=O][a1122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1-2-2/a3-b1_a6-c1",1,False,False +"WURCS=2.0/2,3,2/[a2112h-1a_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2/a3-b2_a6-c2",1,True,True +"WURCS=2.0/2,3,2/[u2122h][a2122h-1b_1-5]/1-2-2/a6-b1_b6-c1",4,False,False +"WURCS=2.0/2,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-1-2/a4-b1_b3-c1_c4-d1",1,False,False +"WURCS=2.0/2,4,3/[u2122h][a2122h-1a_1-5]/1-2-2-2/a4-b1_b4-c1_c4-d1",128,False,False +"WURCS=2.0/2,4,3/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2-2/a4-b1_b3-c1_b6-d1",14,False,False +"WURCS=2.0/2,5,4/[u2122h][a2122h-1a_1-5]/1-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1",2,False,False +"WURCS=2.0/2,5,4/[u2122h][a2122h-1a_1-5]/1-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1",2,False,False +"WURCS=2.0/2,6,5/[AUd21122h_5*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-2-2-2/a8-b2_b8-c2_c8-d2_d8-e2_e8-f2",6,False,False +"WURCS=2.0/2,7,6/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1",8,False,False +"WURCS=2.0/2,8,7/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1_g3-h1",2,False,False +"WURCS=2.0/2,9,8/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1_e2-f1_f2-g1_g2-h1_h2-i1",2,False,False +"WURCS=2.0/3,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-1-2-3-1-2-3-2/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f3-g1_g3-h1_g4-i1_i2-j1",1,True,True +"WURCS=2.0/3,12,11/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_d6-k1_e4-f1_f3-g1_f6-i1_g4-h1_i4-j1_k4-l1",3,False,False +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*N][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b3-c1",1,False,False +"WURCS=2.0/3,3,2/[h2112h_2*NCC/3=O][a2112h-1b_1-5_4*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_a6-c2",1,False,False +"WURCS=2.0/3,3,2/[u2112h][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b2_a4-c1",1,False,False +"WURCS=2.0/3,3,2/[u2112h][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b3-c1",106,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_b3-c2",1,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b3-c1",1,False,False +"WURCS=2.0/3,3,2/[u2112h_2*OCC/3=O][a2112h-1a_1-5][a2112h-1b_1-4_2*OCC/3=O]/1-2-3/a3-b1_b3-c1",1,False,False +"WURCS=2.0/3,3,2/[u2122A][a2122h-1a_1-5_2*NCC/3=O][a2122A-1b_1-5]/1-2-3/a4-b1_b4-c1",1,True,True +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5_3*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O_3*OSO/3=O/3=O]/1-2-3/a4-b1_b4-c1",3,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3/a3-b1_b3-c2",196,False,False +"WURCS=2.0/3,3,2/[u222h][a2112h-1a_1-5_2*NCC/3=O][a222h-1b_1-4]/1-2-3/a2-b1_b3-c1",1,False,False +"WURCS=2.0/3,4,3/[a1122h-1a_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-1-2-3/a3-b1_b3-c1_c3-d1",4,False,False +"WURCS=2.0/3,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_a6-c1_c3-d1",1,True,True +"WURCS=2.0/3,4,3/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-3/a4-b1_b4-c1_c6-d2",1,True,True +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*N]/1-2-2-3/a4-b1_b3-c1_c4-d1",2,True,True +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3/a4-b1_b3-c2_c8-d2",105,False,False +"WURCS=2.0/3,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-2-3-3/a4-b1_b3-c1_c4-d1_d3-e1",1,False,False +"WURCS=2.0/3,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][a2212h-1b_1-5]/1-2-2-2-3/a6-b1_b6-c1_c6-d1_d6-e1",105,False,False +"WURCS=2.0/3,5,4/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3/a3-b1_a6-c1_c4-d1_d3-e1",105,False,False +"WURCS=2.0/3,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2-3/a6-b1_b4-c1_c6-d1_d4-e1",54,False,False +"WURCS=2.0/3,9,8/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-3-3/a4-b1_b3-c1_c4-d1_d3-e1_d6-i1_e4-f1_f3-g1_f6-h1",3,False,False +"WURCS=2.0/4,10,9/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1a_1-5]/1-2-3-3-3-4-4-3-3-3/a4-b1_b3-c1_b6-h1_c2-d1_d2-e1_e3-f1_f3-g1_h3-i1_h6-j1",2,False,False +"WURCS=2.0/4,11,10/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-4-2-3-2-3-4/a3-b1_a6-g1_b4-c1_c3-d1_d4-e1_e3-f2_g4-h1_h3-i1_i4-j1_j3-k2",105,False,False +"WURCS=2.0/4,17,16/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-3-2-4-2-4-3-2-4-2-4-2-4-2-4/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g4-h1_i2-j1_i6-n1_j4-k1_k3-l1_l4-m1_n4-o1_o3-p1_p4-q1",1,False,False +"WURCS=2.0/4,23,22/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-1-4-1-4-1-4-1-3-1-4-1-4-1-4-1-4-1/a4-b1_b4-c1_c3-d1_c6-n1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_n2-o1_o4-p1_p3-q1_q4-r1_r3-s1_s4-t1_t3-u1_u4-v1_v3-w1",1,False,False +"WURCS=2.0/4,4,3/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a6-b1_b4-c1_c3-d2",2,True,True +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*OCC/3=O_3*OCC/3=O_6*OCC/3=O][a2122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_6*OCC/3=O][a2122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O][a2122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1-2-3-4/a4-b1_b4-c1_c6-d1",1,False,False +"WURCS=2.0/4,4,3/[u2112h][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-4/a2-b1_a3-c1_c4-d1",3,False,False +"WURCS=2.0/4,4,3/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4/a3-b1_b3-c1_b4-d1",2,False,False +"WURCS=2.0/4,4,3/[u2122h][a2122h-1b_1-5_2*NCC/3=O][a1112m-1a_1-5_2*OCC/3=O][a2122h-1b_1-5]/1-2-3-4/a2-b1_b3-c1_c3-d1",1,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-4/a6-b1_b3-c1_c3-d1",1,False,False +"WURCS=2.0/4,5,4/[a2112h-1x_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-2-3-4/a3-b1_a6-c1_c4-d1_d3-e1",4,False,False +"WURCS=2.0/4,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-4/a3-b1_a6-e1_b2-c1_b4-d1",2,False,False +"WURCS=2.0/4,5,4/[u1221m_3*OCC/3=O_4*OCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5_3*OCC/3=O_4*OCC/3=O]/1-2-2-3-4/a2-b1_b3-c1_c3-d1_d2-e1",1,False,False +"WURCS=2.0/4,5,4/[u2112h][a2112h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5][a2112h-1a_1-5]/1-2-2-3-4/a3-b1_a4-c1_c3-d1_d6-e1",1,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b4-c1_c3-d1_c6-e2",17,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*N]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e2",6,False,False +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d3-e2",54,False,False +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b3-c2_b4-d1_d3-e1_e3-f2",2,False,False +"WURCS=2.0/4,6,5/[u2122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2122h-1a_1-5]/1-2-3-2-4-4/a2-b1_b3-c1_c3-d1_c4-e1_e6-f1",1,False,False +"WURCS=2.0/4,6,5/[u2211m][a2122h-1a_1-5_2*NCC/3=O_6*OCC/3=O][a2122h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-4-4/a2-b1_b3-c1_c2-d1_d2-e1_e2-f1",1,False,False +"WURCS=2.0/4,6,5/[u2211m][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-2-3-2-4/a3-b1_b2-c1_c2-d1_d3-e1_d4-f1",1,False,False +"WURCS=2.0/4,6,5/[u222h][a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a222h-1b_1-4]/1-2-3-2-3-4/a2-b1_b3-c1_c4-d1_d4-e1_e4-f1",1,False,False +"WURCS=2.0/4,7,6/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-4/a3-b1_a6-c1_c4-d1_d3-e1_e4-f1_f3-g2",1,False,False +"WURCS=2.0/4,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-3-3-4/a4-b1_b3-c2_b4-g1_c8-d2_d8-e2_e8-f2",1,False,False +"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-3-4/a3-b1_a6-e1_b4-c1_c3-d2_e4-f1_f3-g2",110,False,False +"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-3-4/a3-b1_a6-e1_b3-c1_c2-d1_e3-f1_f2-g1",110,False,False +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-3-2-3/a4-b1_b2-c1_b3-d1_d3-e1_d4-f1_f2-g1",3,False,False +"WURCS=2.0/4,7,6/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-2/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f2-g1",17,False,False +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-3-2-4/a4-b1_b3-c1_c3-d1_c4-e1_e3-f1_f3-g1_f4-h1",3,False,False +"WURCS=2.0/4,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-e1_e3-f1_e6-h1_f2-g1",3,False,False +"WURCS=2.0/4,9,8/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-4-2-3/a3-b1_a4-c1_c4-d1_d3-e1_d4-f1_f4-g1_g3-h1_g4-i1",104,False,False +"WURCS=2.0/5,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1_i6-j2",1,True,True +"WURCS=2.0/5,11,10/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1a_1-5]/1-2-3-2-2-3-2-4-3-2-5/a4-b1_b3-c1_c4-d1_d3-e1_d6-i1_e3-f1_f4-g1_g3-h2_i4-j1_j3-k1",2,False,False +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f4-g1_h2-i1_i4-j1_j4-k1",1,False,False +"WURCS=2.0/5,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-5-4-2-5-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g1_h2-i1_i4-j1_j3-k1",47,False,False +"WURCS=2.0/5,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-4-5-5/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",1,False,False +"WURCS=2.0/5,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-4-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g3-h1_i2-j1_j4-k1_k3-l1_l3-m1",105,False,False +"WURCS=2.0/5,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1a_1-5]/1-2-3-4-4-4-5-5-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e2-f1_f3-g1_g3-h1_i3-j1_i6-l1_j2-k1_l2-m1",1,False,False +"WURCS=2.0/5,14,13/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-4-2-5-2-2-5-2/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g1_h2-i1_h6-l1_i4-j1_j3-k1_l4-m1_m3-n1",1,False,False +"WURCS=2.0/5,14,13/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-4-2-5-2-5/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_d4-g1_e4-f1_g4-h1_j2-k1_j6-m1_k4-l1_m4-n1",1,True,True +"WURCS=2.0/5,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-1-4-5-3-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o2",1,False,False +"WURCS=2.0/5,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-5-3-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h2-i1_j2-k1_k4-l1_l3-m1_m4-n1_n2-o1",1,False,False +"WURCS=2.0/5,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4-2-5-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_g6-j1_h4-i1_j4-k1_k3-l1_l4-m1_m3-n1_n4-o1",1,False,False +"WURCS=2.0/5,16,15/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-3-1-4-1-4-1-5/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1",1,False,False +"WURCS=2.0/5,17,16/[u2112h_2*NCC/3=O][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-4-3-4-5-2-3-4-3-4-3-4-5/a3-b1_a6-j1_b2-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1_o4-p1_p3-q2",103,False,False +"WURCS=2.0/5,17,16/[u2112h_2*NCC/3=O][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-4-3-4-5-2-3-4-3-4-3-4-5/a3-b1_a6-j1_b2-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h6-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1_o4-p1_p6-q2",103,False,False +"WURCS=2.0/5,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-5-4-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_k2-l1_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1",105,False,False +"WURCS=2.0/5,19,18/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-1-4-1-4-5-3-1-4-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s2",1,False,False +"WURCS=2.0/5,22,21/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-1-4-3-1-4-1-4-1-4-1-4-5/a4-b1_a6-v1_b4-c1_c3-d1_c6-m1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_m2-n1_n4-o1_o3-p1_p4-q1_q3-r1_r4-s1_s3-t1_t4-u1",1,False,False +"WURCS=2.0/5,27,26/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-1-3-1-4-1-4-1-4-1-1-4-1-4-1-4-1-5/a4-b1_a6-A1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_l2-m1_l6-t1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s1_t4-u1_u3-v1_v4-w1_w3-x1_x4-y1_y3-z1",1,False,False +"WURCS=2.0/5,36,35/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-1-4-1-4-3-1-4-1-4-1-4-1-4-1-4-1-4-1-4-1-4-1-4-1-4-5/a4-b1_a6-J1_b4-c1_c3-d1_c6-o1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_o2-p1_o6-z1_p4-q1_q3-r1_r4-s1_s3-t1_t4-u1_u3-v1_v4-w1_w3-x1_x4-y1_z4-A1_A3-B1_B4-C1_C3-D1_D4-E1_E3-F1_F4-G1_G3-H1_H4-I1",1,False,False +"WURCS=2.0/5,5,4/[a2122h-1a_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112m-1a_1-5_3*NCC/3=O]/1-2-3-4-5/a4-b1_b3-c1_b4-e1_c3-d1",105,False,False +"WURCS=2.0/5,5,4/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-5/a4-b1_a6-e1_b4-c1_c6-d1",2,True,True +"WURCS=2.0/5,5,4/[u1122h][a2122h-1a_1-5_2*NCC/3=O][a2122m-1a_1-5_2*NCC/3=O][a2122h-1a_1-5][a1122h-1b_1-5]/1-2-3-4-5/a2-b1_b3-c1_c3-d1_d4-e1",1,False,False +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5][a1122h-1b_1-5][a1221m-1a_1-5_3*NC=O]/1-2-3-4-5/a2-b1_a3-e1_b3-c1_c3-d1",1,False,False +"WURCS=2.0/5,5,4/[u1122m_4*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5][a1221m-1a_1-5][a1122m-1a_1-5_4*NCC/3=O]/1-2-3-4-5/a2-b1_b3-c1_c4-d1_d3-e1",1,False,False +"WURCS=2.0/5,5,4/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2211m-1a_1-5][a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-4-5/a2-b1_b3-c1_c4-d1_d3-e1",1,False,False +"WURCS=2.0/5,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3-4-5/a4-b1_b3-c1_c3-d1_c4-e1",5,False,False +"WURCS=2.0/5,5,4/[u2122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-3-4-5/a2-b1_b3-c1_c3-d1_d6-e1",1,False,False +"WURCS=2.0/5,5,4/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2112h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5]/1-2-3-4-5/a3-b1_b4-c1_c3-d1_c4-e1",1,False,False +"WURCS=2.0/5,5,4/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_c4-d1_d3-e2",6,False,False +"WURCS=2.0/5,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-5/a4-b1_b4-c1_c3-d1_d3-e1_e3-f1",105,False,False +"WURCS=2.0/5,6,5/[u1122h][a1221m-1a_1-5][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1a_1-5]/1-2-3-4-2-5/a3-b1_a4-d1_b2-c1_d3-e1_e3-f1",1,False,False +"WURCS=2.0/5,6,5/[u2112h][a1221m-1a_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-4-4-5/a2-b1_a3-c1_c2-d1_d3-e1_e3-f1",1,False,False +"WURCS=2.0/5,6,5/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5][a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2-4-5/a3-b1_a4-c1_c6-d1_d3-e1_e3-f1",1,False,False +"WURCS=2.0/5,6,5/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-3-5/a3-b1_b3-c1_b4-d1_d2-e1_d3-f1",126,False,False +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5/a4-b1_b3-c1_c6-d1_d4-e1_e3-f2",2,False,False +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2-4-5/a4-b1_b3-c1_c4-d1_d4-e1_e3-f1",146,False,False +"WURCS=2.0/5,6,5/[u2122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-3-4-5-3/a2-b1_a4-c1_c3-d1_c4-f1_d3-e1",1,False,False +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-5/a3-b1_a4-c1_c3-d1_d4-e1_e3-f2",195,False,False +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2211m-1a_1-5_2*OCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-3-3-4-5/a3-b1_b3-c1_c2-d1_d2-e1_d3-f1",1,False,False +"WURCS=2.0/5,6,5/[u2211m][a1122h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-5-5/a2-b1_a3-c1_c3-d1_d2-e1_e2-f1",1,False,False +"WURCS=2.0/5,7,6/[u1122h][a2122h-1a_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1a_1-5]/1-2-3-4-4-5-5/a6-b1_b3-c1_c2-d1_c3-g1_d2-e1_d4-f1",1,False,False +"WURCS=2.0/5,7,6/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-5-2-3/a3-b1_a6-d1_b3-c2_d3-e1_d4-f1_f3-g2",133,False,False +"WURCS=2.0/5,8,7/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-3-2-5/a4-b1_b3-c1_b6-f1_c3-d1_d2-e1_f4-g1_g6-h2",1,False,False +"WURCS=2.0/5,9,8/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5-2-3-4-5/a3-b1_a6-f1_b4-c1_c2-d1_d3-e1_f4-g1_g2-h1_h3-i1",1,False,False +"WURCS=2.0/5,9,8/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-4-3-5-2/a4-b1_b3-c1_b6-g1_c3-d1_c6-f2_d3-e2_g3-h1_g4-i1",1,False,False +"WURCS=2.0/5,9,8/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5-2-3-4-5/a3-b1_a6-f1_b4-c1_c2-d1_c3-e1_f4-g1_g2-h1_g3-i1",120,False,False +"WURCS=2.0/5,9,8/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-3-2-5/a4-b1_b3-c1_b6-g1_c3-d1_c4-e1_e2-f1_g4-h1_h6-i2",110,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-4-2-2-5/a4-b1_a6-i1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_f6-h1",112,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4-2-5-4-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",2,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3-4-2-5-4-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",2,False,False +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-3-2-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1",1,False,False +"WURCS=2.0/6,11,10/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f3-g2_h2-i1_i3-j1_j3-k2",1,False,False +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j3-k2",2,False,False +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-5-4/a4-b1_a6-l1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g6-h2_i2-j1_j4-k1",2,False,False +"WURCS=2.0/6,12,11/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-4-2-5-6/a4-b1_a6-l1_b4-c1_c3-d1_c4-g1_c6-i1_d2-e1_e4-f1_g4-h1_i2-j1_j4-k1",1,True,True +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6-6/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f2-g1_h2-i1_i3-j1_j2-k1",126,False,False +"WURCS=2.0/6,13,12/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f2-g1_f3-h1_i2-j1_j3-k1_k2-l1_k3-m1",1,False,False +"WURCS=2.0/6,13,12/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-6-5-4-2-5-6/a4-b1_a6-m1_b4-c1_c3-d1_c6-j1_d2-e1_d4-g1_e4-f1_g3-h1_g4-i1_j2-k1_k4-l1",2,False,False +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-6-5-2-5-4-2/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g3-h1_g4-i1_i3-j1_j4-k1_l2-m1",1,False,False +"WURCS=2.0/6,14,13/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-4-5-6-3-1-5-6-1-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f3-g2_h2-i1_h6-l1_i4-j1_j3-k2_l3-m1_m3-n2",1,False,False +"WURCS=2.0/6,14,13/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-1-2-3-1-4-5-6-3-1-4-5-6-5/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f2-g1_f3-h1_i2-j1_j4-k1_k2-l1_k3-m1",1,False,False +"WURCS=2.0/6,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f6-g2_h4-i1_i3-j2_k2-l1_l4-m1_m3-n2",6,False,False +"WURCS=2.0/6,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-1-4-5-3-1-4-5-6/a4-b1_a6-o1_b4-c1_c3-d1_c6-k1_d2-e1_d6-h1_e4-f1_f6-g2_h4-i1_i6-j2_k2-l1_l4-m1_m3-n2",6,False,False +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j2-k1_l2-m1_m4-n1_n2-o1",1,False,False +"WURCS=2.0/6,17,16/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d6-h1_e4-f1_f6-g2_h4-i1_i6-j2_k2-l1_k4-o1_l4-m1_m6-n2_o4-p1_p3-q2",1,False,False +"WURCS=2.0/6,18,17/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-1-2-3-1-4-5-1-4-3-1-6-4-5-5-1-4-5/a4-b1_a6-r1_b4-c1_c3-d1_c6-j1_d2-e1_d3-g1_d4-h1_e4-f1_h4-i1_j2-k1_j3-o1_j6-p1_k4-l1_l3-m1_m2-n1_p4-q1",105,False,False +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_l6-p1_m4-n1_n3-o2_p4-q1_q3-r2",1,False,False +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-2-5-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_h6-p1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_n3-o2_p4-q1_q3-r2",1,False,False +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_h6-l1_i4-j1_j3-k2_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1_q3-r2",1,False,False +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_h6-l1_i4-j1_j6-k2_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1_q6-r2",1,False,False +"WURCS=2.0/6,19,18/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s2",2,False,False +"WURCS=2.0/6,23,22/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-p1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_n6-o2_p2-q1_q4-r1_r3-s1_s4-t1_t3-u1_u4-v1_v6-w2",1,False,False +"WURCS=2.0/6,6,5/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-4][a1122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2112h-1a_1-4]/1-2-3-4-5-6/a2-b1_a4-f1_b3-c1_c6-d1_d3-e1",1,False,False +"WURCS=2.0/6,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*N][a1221m-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*N]/1-2-3-4-5-6/a4-b1_b3-c1_c3-d1_c4-e1_e3-f2",6,False,False +"WURCS=2.0/6,6,5/[u2122m_3*N][a2112h-1a_1-5_2*N][a2112h-1b_1-5][a2211m-1a_1-5][a2122m-1a_1-5_3*N][a2122h-1b_1-5]/1-2-3-4-5-6/a4-b1_b3-c1_b4-f1_c4-d1_d3-e1",1,False,False +"WURCS=2.0/6,7,6/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6/a4-b1_a6-g1_b4-c1_c6-d1_d6-e1_e4-f1",2,False,False +"WURCS=2.0/6,7,6/[u2112h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a1122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-3-2-4-5-6/a3-b1_a4-c1_c3-d1_c4-g1_d3-e1_e6-f1",1,False,False +"WURCS=2.0/6,7,6/[u2112h_2*N][a1221m-1a_1-5][a2112h-1b_1-5][a1122h-1a_1-5_2*N][a2112h-1a_1-5_2*N][a2122h-1b_1-5]/1-2-3-2-4-5-6/a3-b1_a4-c1_c3-d1_c4-g1_d3-e1_e6-f1",1,False,False +"WURCS=2.0/6,7,6/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-2-6/a4-b1_b3-c1_c4-d1_d3-e1_d4-f1_f3-g2",2,False,False +"WURCS=2.0/6,7,6/[u2211m][a2122h-1a_1-5][a2211m-1b_1-5][a2112m-1a_1-5_2*NCC/3=O][a2112h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-5-6-6/a3-b1_a4-c1_c3-d1_d3-e1_e3-f1_f2-g1",1,False,False +"WURCS=2.0/6,8,7/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-5-2-4-6/a2-b1_a6-f1_b3-c1_b4-d1_d3-e2_f4-g1_g3-h2",2,False,False +"WURCS=2.0/6,8,7/[u2112h][a2122h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-3-4-5-6-5/a2-b1_a3-d1_a4-e1_b2-c1_e3-f1_f4-g1_g3-h1",1,False,False +"WURCS=2.0/6,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5]/1-2-3-4-5-4-2-6/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1",2,False,False +"WURCS=2.0/6,9,8/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-2-3-4-6/a2-b1_a6-f1_b3-c1_b4-d1_d3-e2_f3-g1_f4-h1_h3-i2",2,False,False +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-7-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i3-j1_i4-k1",1,True,True +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-6-7-4-5-6-7/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",2,False,False +"WURCS=2.0/7,13,12/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-h1_f3-g1_i2-j1_j3-k1_j4-m1_k3-l1",1,False,False +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h1_i2-j1_j3-k1_j4-l1_l3-m1",146,False,False +"WURCS=2.0/7,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7-6/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f2-g1_f3-h1_i2-j1_j3-k1_k2-l1_k3-m1",120,False,False +"WURCS=2.0/7,16,15/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-6-7/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o2",2,False,False +"WURCS=2.0/7,16,15/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-6-7/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h6-i2_j2-k1_k4-l1_l3-m1_m4-n1_n6-o2",2,False,False +"WURCS=2.0/7,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-2-5-2-7/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j6-k2_l2-m1_l6-n1_n4-o1_o3-p1_p3-q1",1,False,False +"WURCS=2.0/7,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-2-5-2-6-5-2-5-7-2-5-2/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_f6-o1_g4-h1_h3-i1_i3-j1_i4-k1_k3-l1_l4-m1_m3-n2_o4-p1_p3-q1",1,False,False +"WURCS=2.0/7,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-4-2-5-2-5-2-5-6-2-5-2-7-5/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_f6-n1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m2_n4-o1_o3-p1_p3-q1_p4-r1",1,False,False +"WURCS=2.0/7,20,19/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6-7/a4-b1_a6-t1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j6-k2_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r6-s2",2,False,False +"WURCS=2.0/8,12,11/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-7-8/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j3-k1",1,False,False diff --git a/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/doubly_cold_scored_glycans.csv b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/doubly_cold_scored_glycans.csv new file mode 100644 index 0000000000000000000000000000000000000000..29435946ac3a39cbcef0ac340748aff3beeea92f --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/doubly_cold_scored_glycans.csv @@ -0,0 +1,174 @@ +canonical_wurcs,scored_rows +"WURCS=2.0/1,9,8/[a1122h-1a_1-5]/1-1-1-1-1-1-1-1-1/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1_e6-h1_f2-g1_h2-i1",1 +"WURCS=2.0/2,12,11/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2-2-2-2/a4-b1_b4-c1_c4-d1_d4-e1_e4-f1_f4-g1_g4-h1_h4-i1_i4-j1_j4-k1_k4-l1",4 +"WURCS=2.0/2,12,11/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1_e2-f1_f2-g1_g2-h1_h2-i1_i2-j1_j2-k1_k2-l1",2 +"WURCS=2.0/2,12,11/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1_g3-h1_h3-i1_i3-j1_j3-k1_k3-l1",4 +"WURCS=2.0/2,13,12/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1_g6-h1_h6-i1_i6-j1_j6-k1_k6-l1_l6-m1",4 +"WURCS=2.0/2,15,14/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1_g6-h1_h6-i1_i6-j1_j6-k1_k6-l1_l6-m1_m6-n1_n6-o1",2 +"WURCS=2.0/2,2,1/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2/a3-b1",1 +"WURCS=2.0/2,2,1/[axx2xh-1d_1-5_2*OC(CCCCCC$4)/3=O_3*OC(CCCCCC$4)/3=O_4*OC(CCCCCC$4)/3=O][axx2xh-1u_1-5_2*OC(CCCCCC$4)_3*OC(CCCCCC$4)_4*OC(CCCCCC$4)_6*OC(CCCCCC$4)]/1-2/a6-b1",4 +"WURCS=2.0/2,2,1/[u122xh_2*OC_3*OC_6*OC][a122xh-1u_1-5_2*OC_3*OC_4*OC_6*OC]/1-2/a4-b1",4 +"WURCS=2.0/2,3,2/[a1122h-1b_1-5_2*OCC/3=O_4*OCC/3=O][a1122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1-2-2/a3-b1_a6-c1",1 +"WURCS=2.0/2,3,2/[a2112h-1a_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2/a3-b2_a6-c2",1 +"WURCS=2.0/2,3,2/[u2122h][a2122h-1b_1-5]/1-2-2/a6-b1_b6-c1",4 +"WURCS=2.0/2,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-1-2/a4-b1_b3-c1_c4-d1",1 +"WURCS=2.0/2,4,3/[u2122h][a2122h-1a_1-5]/1-2-2-2/a4-b1_b4-c1_c4-d1",128 +"WURCS=2.0/2,4,3/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2-2/a4-b1_b3-c1_b6-d1",14 +"WURCS=2.0/2,5,4/[u2122h][a2122h-1a_1-5]/1-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1",2 +"WURCS=2.0/2,5,4/[u2122h][a2122h-1a_1-5]/1-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1",2 +"WURCS=2.0/2,6,5/[AUd21122h_5*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-2-2-2/a8-b2_b8-c2_c8-d2_d8-e2_e8-f2",6 +"WURCS=2.0/2,7,6/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1",8 +"WURCS=2.0/2,8,7/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1_g3-h1",2 +"WURCS=2.0/2,9,8/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1_e2-f1_f2-g1_g2-h1_h2-i1",2 +"WURCS=2.0/3,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-1-2-3-1-2-3-2/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f3-g1_g3-h1_g4-i1_i2-j1",1 +"WURCS=2.0/3,12,11/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_d6-k1_e4-f1_f3-g1_f6-i1_g4-h1_i4-j1_k4-l1",3 +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",1 +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*N][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b3-c1",1 +"WURCS=2.0/3,3,2/[h2112h_2*NCC/3=O][a2112h-1b_1-5_4*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_a6-c2",1 +"WURCS=2.0/3,3,2/[u2112h][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b2_a4-c1",1 +"WURCS=2.0/3,3,2/[u2112h][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b3-c1",106 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_b3-c2",1 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b3-c1",1 +"WURCS=2.0/3,3,2/[u2112h_2*OCC/3=O][a2112h-1a_1-5][a2112h-1b_1-4_2*OCC/3=O]/1-2-3/a3-b1_b3-c1",1 +"WURCS=2.0/3,3,2/[u2122A][a2122h-1a_1-5_2*NCC/3=O][a2122A-1b_1-5]/1-2-3/a4-b1_b4-c1",1 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5_3*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O_3*OSO/3=O/3=O]/1-2-3/a4-b1_b4-c1",3 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3/a3-b1_b3-c2",196 +"WURCS=2.0/3,3,2/[u222h][a2112h-1a_1-5_2*NCC/3=O][a222h-1b_1-4]/1-2-3/a2-b1_b3-c1",1 +"WURCS=2.0/3,4,3/[a1122h-1a_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-1-2-3/a3-b1_b3-c1_c3-d1",4 +"WURCS=2.0/3,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_a6-c1_c3-d1",1 +"WURCS=2.0/3,4,3/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-3/a4-b1_b4-c1_c6-d2",1 +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*N]/1-2-2-3/a4-b1_b3-c1_c4-d1",2 +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3/a4-b1_b3-c2_c8-d2",105 +"WURCS=2.0/3,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-2-3-3/a4-b1_b3-c1_c4-d1_d3-e1",1 +"WURCS=2.0/3,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][a2212h-1b_1-5]/1-2-2-2-3/a6-b1_b6-c1_c6-d1_d6-e1",105 +"WURCS=2.0/3,5,4/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3/a3-b1_a6-c1_c4-d1_d3-e1",105 +"WURCS=2.0/3,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2-3/a6-b1_b4-c1_c6-d1_d4-e1",54 +"WURCS=2.0/3,9,8/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-3-3/a4-b1_b3-c1_c4-d1_d3-e1_d6-i1_e4-f1_f3-g1_f6-h1",3 +"WURCS=2.0/4,10,9/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1a_1-5]/1-2-3-3-3-4-4-3-3-3/a4-b1_b3-c1_b6-h1_c2-d1_d2-e1_e3-f1_f3-g1_h3-i1_h6-j1",2 +"WURCS=2.0/4,11,10/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-4-2-3-2-3-4/a3-b1_a6-g1_b4-c1_c3-d1_d4-e1_e3-f2_g4-h1_h3-i1_i4-j1_j3-k2",105 +"WURCS=2.0/4,17,16/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-3-2-4-2-4-3-2-4-2-4-2-4-2-4/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g4-h1_i2-j1_i6-n1_j4-k1_k3-l1_l4-m1_n4-o1_o3-p1_p4-q1",1 +"WURCS=2.0/4,23,22/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-1-4-1-4-1-4-1-3-1-4-1-4-1-4-1-4-1/a4-b1_b4-c1_c3-d1_c6-n1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_n2-o1_o4-p1_p3-q1_q4-r1_r3-s1_s4-t1_t3-u1_u4-v1_v3-w1",1 +"WURCS=2.0/4,4,3/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a6-b1_b4-c1_c3-d2",2 +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*OCC/3=O_3*OCC/3=O_6*OCC/3=O][a2122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_6*OCC/3=O][a2122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O][a2122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1-2-3-4/a4-b1_b4-c1_c6-d1",1 +"WURCS=2.0/4,4,3/[u2112h][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-4/a2-b1_a3-c1_c4-d1",3 +"WURCS=2.0/4,4,3/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4/a3-b1_b3-c1_b4-d1",2 +"WURCS=2.0/4,4,3/[u2122h][a2122h-1b_1-5_2*NCC/3=O][a1112m-1a_1-5_2*OCC/3=O][a2122h-1b_1-5]/1-2-3-4/a2-b1_b3-c1_c3-d1",1 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-4/a6-b1_b3-c1_c3-d1",1 +"WURCS=2.0/4,5,4/[a2112h-1x_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-2-3-4/a3-b1_a6-c1_c4-d1_d3-e1",4 +"WURCS=2.0/4,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-4/a3-b1_a6-e1_b2-c1_b4-d1",2 +"WURCS=2.0/4,5,4/[u1221m_3*OCC/3=O_4*OCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5_3*OCC/3=O_4*OCC/3=O]/1-2-2-3-4/a2-b1_b3-c1_c3-d1_d2-e1",1 +"WURCS=2.0/4,5,4/[u2112h][a2112h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5][a2112h-1a_1-5]/1-2-2-3-4/a3-b1_a4-c1_c3-d1_d6-e1",1 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b4-c1_c3-d1_c6-e2",17 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*N]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e2",6 +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d3-e2",54 +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b3-c2_b4-d1_d3-e1_e3-f2",2 +"WURCS=2.0/4,6,5/[u2122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2122h-1a_1-5]/1-2-3-2-4-4/a2-b1_b3-c1_c3-d1_c4-e1_e6-f1",1 +"WURCS=2.0/4,6,5/[u2211m][a2122h-1a_1-5_2*NCC/3=O_6*OCC/3=O][a2122h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-4-4/a2-b1_b3-c1_c2-d1_d2-e1_e2-f1",1 +"WURCS=2.0/4,6,5/[u2211m][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-2-3-2-4/a3-b1_b2-c1_c2-d1_d3-e1_d4-f1",1 +"WURCS=2.0/4,6,5/[u222h][a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a222h-1b_1-4]/1-2-3-2-3-4/a2-b1_b3-c1_c4-d1_d4-e1_e4-f1",1 +"WURCS=2.0/4,7,6/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-4/a3-b1_a6-c1_c4-d1_d3-e1_e4-f1_f3-g2",1 +"WURCS=2.0/4,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-3-3-4/a4-b1_b3-c2_b4-g1_c8-d2_d8-e2_e8-f2",1 +"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-3-4/a3-b1_a6-e1_b4-c1_c3-d2_e4-f1_f3-g2",110 +"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-3-4/a3-b1_a6-e1_b3-c1_c2-d1_e3-f1_f2-g1",110 +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-3-2-3/a4-b1_b2-c1_b3-d1_d3-e1_d4-f1_f2-g1",3 +"WURCS=2.0/4,7,6/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-2/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f2-g1",17 +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-3-2-4/a4-b1_b3-c1_c3-d1_c4-e1_e3-f1_f3-g1_f4-h1",3 +"WURCS=2.0/4,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-e1_e3-f1_e6-h1_f2-g1",3 +"WURCS=2.0/4,9,8/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-4-2-3/a3-b1_a4-c1_c4-d1_d3-e1_d4-f1_f4-g1_g3-h1_g4-i1",104 +"WURCS=2.0/5,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1_i6-j2",1 +"WURCS=2.0/5,11,10/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1a_1-5]/1-2-3-2-2-3-2-4-3-2-5/a4-b1_b3-c1_c4-d1_d3-e1_d6-i1_e3-f1_f4-g1_g3-h2_i4-j1_j3-k1",2 +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f4-g1_h2-i1_i4-j1_j4-k1",1 +"WURCS=2.0/5,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-5-4-2-5-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g1_h2-i1_i4-j1_j3-k1",47 +"WURCS=2.0/5,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-4-5-5/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",1 +"WURCS=2.0/5,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-4-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g3-h1_i2-j1_j4-k1_k3-l1_l3-m1",105 +"WURCS=2.0/5,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1a_1-5]/1-2-3-4-4-4-5-5-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e2-f1_f3-g1_g3-h1_i3-j1_i6-l1_j2-k1_l2-m1",1 +"WURCS=2.0/5,14,13/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-4-2-5-2-2-5-2/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g1_h2-i1_h6-l1_i4-j1_j3-k1_l4-m1_m3-n1",1 +"WURCS=2.0/5,14,13/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-4-2-5-2-5/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_d4-g1_e4-f1_g4-h1_j2-k1_j6-m1_k4-l1_m4-n1",1 +"WURCS=2.0/5,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-1-4-5-3-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o2",1 +"WURCS=2.0/5,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-5-3-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h2-i1_j2-k1_k4-l1_l3-m1_m4-n1_n2-o1",1 +"WURCS=2.0/5,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4-2-5-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_g6-j1_h4-i1_j4-k1_k3-l1_l4-m1_m3-n1_n4-o1",1 +"WURCS=2.0/5,16,15/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-3-1-4-1-4-1-5/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1",1 +"WURCS=2.0/5,17,16/[u2112h_2*NCC/3=O][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-4-3-4-5-2-3-4-3-4-3-4-5/a3-b1_a6-j1_b2-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1_o4-p1_p3-q2",103 +"WURCS=2.0/5,17,16/[u2112h_2*NCC/3=O][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-4-3-4-5-2-3-4-3-4-3-4-5/a3-b1_a6-j1_b2-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h6-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1_o4-p1_p6-q2",103 +"WURCS=2.0/5,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-5-4-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_k2-l1_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1",105 +"WURCS=2.0/5,19,18/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-1-4-1-4-5-3-1-4-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s2",1 +"WURCS=2.0/5,22,21/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-1-4-3-1-4-1-4-1-4-1-4-5/a4-b1_a6-v1_b4-c1_c3-d1_c6-m1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_m2-n1_n4-o1_o3-p1_p4-q1_q3-r1_r4-s1_s3-t1_t4-u1",1 +"WURCS=2.0/5,27,26/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-1-3-1-4-1-4-1-4-1-1-4-1-4-1-4-1-5/a4-b1_a6-A1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_l2-m1_l6-t1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s1_t4-u1_u3-v1_v4-w1_w3-x1_x4-y1_y3-z1",1 +"WURCS=2.0/5,36,35/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-1-4-1-4-3-1-4-1-4-1-4-1-4-1-4-1-4-1-4-1-4-1-4-1-4-5/a4-b1_a6-J1_b4-c1_c3-d1_c6-o1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_o2-p1_o6-z1_p4-q1_q3-r1_r4-s1_s3-t1_t4-u1_u3-v1_v4-w1_w3-x1_x4-y1_z4-A1_A3-B1_B4-C1_C3-D1_D4-E1_E3-F1_F4-G1_G3-H1_H4-I1",1 +"WURCS=2.0/5,5,4/[a2122h-1a_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112m-1a_1-5_3*NCC/3=O]/1-2-3-4-5/a4-b1_b3-c1_b4-e1_c3-d1",105 +"WURCS=2.0/5,5,4/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-5/a4-b1_a6-e1_b4-c1_c6-d1",2 +"WURCS=2.0/5,5,4/[u1122h][a2122h-1a_1-5_2*NCC/3=O][a2122m-1a_1-5_2*NCC/3=O][a2122h-1a_1-5][a1122h-1b_1-5]/1-2-3-4-5/a2-b1_b3-c1_c3-d1_d4-e1",1 +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5][a1122h-1b_1-5][a1221m-1a_1-5_3*NC=O]/1-2-3-4-5/a2-b1_a3-e1_b3-c1_c3-d1",1 +"WURCS=2.0/5,5,4/[u1122m_4*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5][a1221m-1a_1-5][a1122m-1a_1-5_4*NCC/3=O]/1-2-3-4-5/a2-b1_b3-c1_c4-d1_d3-e1",1 +"WURCS=2.0/5,5,4/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2211m-1a_1-5][a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-4-5/a2-b1_b3-c1_c4-d1_d3-e1",1 +"WURCS=2.0/5,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3-4-5/a4-b1_b3-c1_c3-d1_c4-e1",5 +"WURCS=2.0/5,5,4/[u2122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-3-4-5/a2-b1_b3-c1_c3-d1_d6-e1",1 +"WURCS=2.0/5,5,4/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2112h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5]/1-2-3-4-5/a3-b1_b4-c1_c3-d1_c4-e1",1 +"WURCS=2.0/5,5,4/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_c4-d1_d3-e2",6 +"WURCS=2.0/5,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-5/a4-b1_b4-c1_c3-d1_d3-e1_e3-f1",105 +"WURCS=2.0/5,6,5/[u1122h][a1221m-1a_1-5][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1a_1-5]/1-2-3-4-2-5/a3-b1_a4-d1_b2-c1_d3-e1_e3-f1",1 +"WURCS=2.0/5,6,5/[u2112h][a1221m-1a_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-4-4-5/a2-b1_a3-c1_c2-d1_d3-e1_e3-f1",1 +"WURCS=2.0/5,6,5/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5][a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2-4-5/a3-b1_a4-c1_c6-d1_d3-e1_e3-f1",1 +"WURCS=2.0/5,6,5/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-3-5/a3-b1_b3-c1_b4-d1_d2-e1_d3-f1",126 +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5/a4-b1_b3-c1_c6-d1_d4-e1_e3-f2",2 +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2-4-5/a4-b1_b3-c1_c4-d1_d4-e1_e3-f1",146 +"WURCS=2.0/5,6,5/[u2122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-3-4-5-3/a2-b1_a4-c1_c3-d1_c4-f1_d3-e1",1 +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-5/a3-b1_a4-c1_c3-d1_d4-e1_e3-f2",195 +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2211m-1a_1-5_2*OCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-3-3-4-5/a3-b1_b3-c1_c2-d1_d2-e1_d3-f1",1 +"WURCS=2.0/5,6,5/[u2211m][a1122h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-5-5/a2-b1_a3-c1_c3-d1_d2-e1_e2-f1",1 +"WURCS=2.0/5,7,6/[u1122h][a2122h-1a_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1a_1-5]/1-2-3-4-4-5-5/a6-b1_b3-c1_c2-d1_c3-g1_d2-e1_d4-f1",1 +"WURCS=2.0/5,7,6/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-5-2-3/a3-b1_a6-d1_b3-c2_d3-e1_d4-f1_f3-g2",133 +"WURCS=2.0/5,8,7/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-3-2-5/a4-b1_b3-c1_b6-f1_c3-d1_d2-e1_f4-g1_g6-h2",1 +"WURCS=2.0/5,9,8/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5-2-3-4-5/a3-b1_a6-f1_b4-c1_c2-d1_d3-e1_f4-g1_g2-h1_h3-i1",1 +"WURCS=2.0/5,9,8/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-4-3-5-2/a4-b1_b3-c1_b6-g1_c3-d1_c6-f2_d3-e2_g3-h1_g4-i1",1 +"WURCS=2.0/5,9,8/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5-2-3-4-5/a3-b1_a6-f1_b4-c1_c2-d1_c3-e1_f4-g1_g2-h1_g3-i1",120 +"WURCS=2.0/5,9,8/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-3-2-5/a4-b1_b3-c1_b6-g1_c3-d1_c4-e1_e2-f1_g4-h1_h6-i2",110 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-4-2-2-5/a4-b1_a6-i1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_f6-h1",112 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4-2-5-4-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",2 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3-4-2-5-4-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",2 +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-3-2-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1",1 +"WURCS=2.0/6,11,10/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f3-g2_h2-i1_i3-j1_j3-k2",1 +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j3-k2",2 +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-5-4/a4-b1_a6-l1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g6-h2_i2-j1_j4-k1",2 +"WURCS=2.0/6,12,11/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-4-2-5-6/a4-b1_a6-l1_b4-c1_c3-d1_c4-g1_c6-i1_d2-e1_e4-f1_g4-h1_i2-j1_j4-k1",1 +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6-6/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f2-g1_h2-i1_i3-j1_j2-k1",126 +"WURCS=2.0/6,13,12/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f2-g1_f3-h1_i2-j1_j3-k1_k2-l1_k3-m1",1 +"WURCS=2.0/6,13,12/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-6-5-4-2-5-6/a4-b1_a6-m1_b4-c1_c3-d1_c6-j1_d2-e1_d4-g1_e4-f1_g3-h1_g4-i1_j2-k1_k4-l1",2 +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-6-5-2-5-4-2/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g3-h1_g4-i1_i3-j1_j4-k1_l2-m1",1 +"WURCS=2.0/6,14,13/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-4-5-6-3-1-5-6-1-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f3-g2_h2-i1_h6-l1_i4-j1_j3-k2_l3-m1_m3-n2",1 +"WURCS=2.0/6,14,13/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-1-2-3-1-4-5-6-3-1-4-5-6-5/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f2-g1_f3-h1_i2-j1_j4-k1_k2-l1_k3-m1",1 +"WURCS=2.0/6,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f6-g2_h4-i1_i3-j2_k2-l1_l4-m1_m3-n2",6 +"WURCS=2.0/6,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-1-4-5-3-1-4-5-6/a4-b1_a6-o1_b4-c1_c3-d1_c6-k1_d2-e1_d6-h1_e4-f1_f6-g2_h4-i1_i6-j2_k2-l1_l4-m1_m3-n2",6 +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j2-k1_l2-m1_m4-n1_n2-o1",1 +"WURCS=2.0/6,17,16/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d6-h1_e4-f1_f6-g2_h4-i1_i6-j2_k2-l1_k4-o1_l4-m1_m6-n2_o4-p1_p3-q2",1 +"WURCS=2.0/6,18,17/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-1-2-3-1-4-5-1-4-3-1-6-4-5-5-1-4-5/a4-b1_a6-r1_b4-c1_c3-d1_c6-j1_d2-e1_d3-g1_d4-h1_e4-f1_h4-i1_j2-k1_j3-o1_j6-p1_k4-l1_l3-m1_m2-n1_p4-q1",105 +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_l6-p1_m4-n1_n3-o2_p4-q1_q3-r2",1 +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-2-5-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_h6-p1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_n3-o2_p4-q1_q3-r2",1 +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_h6-l1_i4-j1_j3-k2_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1_q3-r2",1 +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_h6-l1_i4-j1_j6-k2_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1_q6-r2",1 +"WURCS=2.0/6,19,18/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s2",2 +"WURCS=2.0/6,23,22/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-p1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_n6-o2_p2-q1_q4-r1_r3-s1_s4-t1_t3-u1_u4-v1_v6-w2",1 +"WURCS=2.0/6,6,5/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-4][a1122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2112h-1a_1-4]/1-2-3-4-5-6/a2-b1_a4-f1_b3-c1_c6-d1_d3-e1",1 +"WURCS=2.0/6,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*N][a1221m-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*N]/1-2-3-4-5-6/a4-b1_b3-c1_c3-d1_c4-e1_e3-f2",6 +"WURCS=2.0/6,6,5/[u2122m_3*N][a2112h-1a_1-5_2*N][a2112h-1b_1-5][a2211m-1a_1-5][a2122m-1a_1-5_3*N][a2122h-1b_1-5]/1-2-3-4-5-6/a4-b1_b3-c1_b4-f1_c4-d1_d3-e1",1 +"WURCS=2.0/6,7,6/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6/a4-b1_a6-g1_b4-c1_c6-d1_d6-e1_e4-f1",2 +"WURCS=2.0/6,7,6/[u2112h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a1122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-3-2-4-5-6/a3-b1_a4-c1_c3-d1_c4-g1_d3-e1_e6-f1",1 +"WURCS=2.0/6,7,6/[u2112h_2*N][a1221m-1a_1-5][a2112h-1b_1-5][a1122h-1a_1-5_2*N][a2112h-1a_1-5_2*N][a2122h-1b_1-5]/1-2-3-2-4-5-6/a3-b1_a4-c1_c3-d1_c4-g1_d3-e1_e6-f1",1 +"WURCS=2.0/6,7,6/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-2-6/a4-b1_b3-c1_c4-d1_d3-e1_d4-f1_f3-g2",2 +"WURCS=2.0/6,7,6/[u2211m][a2122h-1a_1-5][a2211m-1b_1-5][a2112m-1a_1-5_2*NCC/3=O][a2112h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-5-6-6/a3-b1_a4-c1_c3-d1_d3-e1_e3-f1_f2-g1",1 +"WURCS=2.0/6,8,7/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-5-2-4-6/a2-b1_a6-f1_b3-c1_b4-d1_d3-e2_f4-g1_g3-h2",2 +"WURCS=2.0/6,8,7/[u2112h][a2122h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-3-4-5-6-5/a2-b1_a3-d1_a4-e1_b2-c1_e3-f1_f4-g1_g3-h1",1 +"WURCS=2.0/6,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5]/1-2-3-4-5-4-2-6/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1",2 +"WURCS=2.0/6,9,8/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-2-3-4-6/a2-b1_a6-f1_b3-c1_b4-d1_d3-e2_f3-g1_f4-h1_h3-i2",2 +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-7-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i3-j1_i4-k1",1 +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-6-7-4-5-6-7/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",2 +"WURCS=2.0/7,13,12/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-h1_f3-g1_i2-j1_j3-k1_j4-m1_k3-l1",1 +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h1_i2-j1_j3-k1_j4-l1_l3-m1",146 +"WURCS=2.0/7,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7-6/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f2-g1_f3-h1_i2-j1_j3-k1_k2-l1_k3-m1",120 +"WURCS=2.0/7,16,15/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-6-7/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o2",2 +"WURCS=2.0/7,16,15/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-6-7/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h6-i2_j2-k1_k4-l1_l3-m1_m4-n1_n6-o2",2 +"WURCS=2.0/7,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-2-5-2-7/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j6-k2_l2-m1_l6-n1_n4-o1_o3-p1_p3-q1",1 +"WURCS=2.0/7,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-2-5-2-6-5-2-5-7-2-5-2/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_f6-o1_g4-h1_h3-i1_i3-j1_i4-k1_k3-l1_l4-m1_m3-n2_o4-p1_p3-q1",1 +"WURCS=2.0/7,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-4-2-5-2-5-2-5-6-2-5-2-7-5/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_f6-n1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m2_n4-o1_o3-p1_p3-q1_p4-r1",1 +"WURCS=2.0/7,20,19/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6-7/a4-b1_a6-t1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j6-k2_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r6-s2",2 +"WURCS=2.0/8,12,11/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-7-8/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j3-k1",1 diff --git a/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/glycan_cold_exposure_join.csv b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/glycan_cold_exposure_join.csv new file mode 100644 index 0000000000000000000000000000000000000000..fd7d4b951aa718eef66dd6e2dbf187829c30e65b --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/glycan_cold_exposure_join.csv @@ -0,0 +1,337 @@ +canonical_wurcs,scored_rows,in_bpe_fit_partition,in_encoder_sequence_training +"WURCS=2.0/1,2,1/[a212h-1b_1-5]/1-1/a4-b1",52,False,False +"WURCS=2.0/1,6,5/[a212h-1b_1-5]/1-1-1-1-1-1/a4-b1_b4-c1_c4-d1_d4-e1_e4-f1",52,False,False +"WURCS=2.0/1,9,8/[a1122h-1a_1-5]/1-1-1-1-1-1-1-1-1/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1_e6-h1_f2-g1_h2-i1",479,False,False +"WURCS=2.0/2,12,11/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2-2-2-2/a4-b1_b4-c1_c4-d1_d4-e1_e4-f1_f4-g1_g4-h1_h4-i1_i4-j1_j4-k1_k4-l1",9,False,False +"WURCS=2.0/2,12,11/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1_e2-f1_f2-g1_g2-h1_h2-i1_i2-j1_j2-k1_k2-l1",9,False,False +"WURCS=2.0/2,12,11/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1_g3-h1_h3-i1_i3-j1_j3-k1_k3-l1",20,False,False +"WURCS=2.0/2,13,12/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1_g6-h1_h6-i1_i6-j1_j6-k1_k6-l1_l6-m1",9,False,False +"WURCS=2.0/2,13,12/[u212h][a212h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2-2/a4-b1_b4-c1_c4-d1_d4-e1_e4-f1_f4-g1_g4-h1_h4-i1_i4-j1_j4-k1_k4-l1_l4-m1",1,False,False +"WURCS=2.0/2,15,14/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1_g6-h1_h6-i1_i6-j1_j6-k1_k6-l1_l6-m1_m6-n1_n6-o1",3,False,False +"WURCS=2.0/2,2,1/[a11221h-1x_1-5][a11221h-1a_1-5]/1-2/a3-b1",52,False,False +"WURCS=2.0/2,2,1/[a1122h-1a_1-5_3*OC_4*OCC/3=O_6*OCC/3=O][a2122h-1b_1-5_2*NCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1-2/a2-b1",14,True,True +"WURCS=2.0/2,2,1/[a12x1h-1b_1-5_2*OSiC/3C/3C_3*OSiC/3C/3C_6*OSiC/3C/3C][a1221h-1b_1-5_2*OSiC/3C/3C_3*OSiC/3C/3C_4*OSiC/3C/3C_6*OSiC/3C/3C]/1-2/a4-b1",14,False,False +"WURCS=2.0/2,2,1/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2/a3-b1",467,True,True +"WURCS=2.0/2,2,1/[a212h-1b_1-5_3*OCC/3=O_4*OCC/3=O][a2122h-1b_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1-2/a2-b1",9,False,False +"WURCS=2.0/2,2,1/[adx22h-1a_1-5_3*OC(CCCCCC$4)_6*OC(CCCCCC$4)][adx22h-1x_1-5_3*OC(CCCCCC$4)_4*OC(CCCCCC$4)_6*OC(CCCCCC$4)]/1-2/a4-b1",10,False,False +"WURCS=2.0/2,2,1/[axx2xh-1d_1-5_2*OC(CCCCCC$4)/3=O_3*OC(CCCCCC$4)/3=O_4*OC(CCCCCC$4)/3=O][axx2xh-1u_1-5_2*OC(CCCCCC$4)_3*OC(CCCCCC$4)_4*OC(CCCCCC$4)_6*OC(CCCCCC$4)]/1-2/a6-b1",27,False,False +"WURCS=2.0/2,2,1/[u122xh_2*OC_3*OC_6*OC][a122xh-1u_1-5_2*OC_3*OC_4*OC_6*OC]/1-2/a4-b1",35,False,False +"WURCS=2.0/2,3,2/[a1122h-1a_1-5][a2122h-1b_1-5]/1-1-2/a6-b1_b6-c1",14,False,False +"WURCS=2.0/2,3,2/[a1122h-1b_1-5_2*OCC/3=O_4*OCC/3=O][a1122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1-2-2/a3-b1_a6-c1",40,False,False +"WURCS=2.0/2,3,2/[a2112h-1a_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2/a3-b2_a6-c2",479,True,True +"WURCS=2.0/2,3,2/[a2xxxh-1d_1-5][axxxxh-1x_1-5_2*NCC/3=O]/1-2-2/a2-b1_a6-c1",4,False,False +"WURCS=2.0/2,3,2/[u2112h][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2/a2-b2_a3-c2",15,False,False +"WURCS=2.0/2,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-2/a4-b1_b4-c1",15,False,False +"WURCS=2.0/2,3,2/[u2122h][a2122h-1b_1-5]/1-2-2/a6-b1_b6-c1",9,False,False +"WURCS=2.0/2,3,2/[u2122h][a212h-1a_1-5]/1-2-2/a3-b1_b3-c1",1,False,False +"WURCS=2.0/2,3,2/[u2211m][a2211m-1a_1-5]/1-2-2/a2-b1_b2-c1",14,True,True +"WURCS=2.0/2,4,3/[a1122h-1a_1-5][a1122h-1a_1-5_6*OPO/3O/3=O]/1-1-1-2/a2-b1_b3-c1_c3-d1",16,True,True +"WURCS=2.0/2,4,3/[a1122h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-1-1/a4-b1_a6-c1_c2-d1",52,False,False +"WURCS=2.0/2,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-1-2/a4-b1_b3-c1_c4-d1",447,False,False +"WURCS=2.0/2,4,3/[u1122A][a1122A-1b_1-5]/1-2-2-2/a4-b1_b4-c1_c4-d1",1,False,False +"WURCS=2.0/2,4,3/[u2122h][a2122h-1a_1-5]/1-2-2-2/a4-b1_b4-c1_c4-d1",721,False,False +"WURCS=2.0/2,4,3/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2-2/a4-b1_b3-c1_b6-d1",107,False,False +"WURCS=2.0/2,5,4/[u1122h][a1122h-1a_1-5]/1-2-2-2-2/a4-b1_a6-d1_b6-c1_d6-e1",9,False,False +"WURCS=2.0/2,5,4/[u2122h][a2122h-1a_1-5]/1-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1",9,False,False +"WURCS=2.0/2,5,4/[u2122h][a2122h-1a_1-5]/1-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1",7,False,False +"WURCS=2.0/2,5,4/[u2122h_2*N][a2122h-1b_1-5_2*N]/1-2-2-2-2/a4-b1_b4-c1_c4-d1_d4-e1",1,False,False +"WURCS=2.0/2,6,5/[AUd21122h_5*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-2-2-2/a8-b2_b8-c2_c8-d2_d8-e2_e8-f2",16,False,False +"WURCS=2.0/2,7,6/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1",30,False,False +"WURCS=2.0/2,8,7/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1_g3-h1",7,False,False +"WURCS=2.0/2,9,8/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1_e2-f1_f2-g1_g2-h1_h2-i1",9,False,False +"WURCS=2.0/3,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-1-2-3-1-2-3-2/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f3-g1_g3-h1_g4-i1_i2-j1",479,True,True +"WURCS=2.0/3,10,9/[u2112h_2*OSO/3=O/3=O][a2112h-1b_1-5_4*OSO/3=O/3=O][a2112h-1a_1-5_2*OSO/3=O/3=O]/1-2-3-2-3-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1",2,False,False +"WURCS=2.0/3,10,9/[u2112h_6*OSO/3=O/3=O][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3-2-3-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1_f4-g1_g3-h1_h4-i1_i3-j1",1,False,False +"WURCS=2.0/3,11,10/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3-2-3/a4-b1_b3-c1_b6-k1_c4-d1_d3-e1_e4-f1_f3-g1_f6-i1_g4-h1_i4-j1",9,False,False +"WURCS=2.0/3,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3-3-3-3-3-3-3/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e2-f1_f3-g1_h3-i1_h6-j1_j2-k1_k3-l1",4,False,False +"WURCS=2.0/3,12,11/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_d6-k1_e4-f1_f3-g1_f6-i1_g4-h1_i4-j1_k4-l1",5,False,False +"WURCS=2.0/3,12,11/[u2122h_2*NCC/3=O][a2122A-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1_f4-g1_g3-h1_h4-i1_i3-j1_j4-k1_k3-l1",1,False,False +"WURCS=2.0/3,18,17/[u2112h_6*OSO/3=O/3=O][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3-2-3-2-3-2-3-2-3-2-3-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1_f4-g1_g3-h1_h4-i1_i3-j1_j4-k1_k3-l1_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1_q3-r1",1,False,False +"WURCS=2.0/3,3,2/[a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-4][a2122h-1a_1-5]/1-2-3/a3-b1_b3-c1",9,False,False +"WURCS=2.0/3,3,2/[a2122h-1x_1-5][a2112h-1a_1-5][a2122h-1b_1-5_6*OPO/3O/3=O]/1-2-3/a3-b1_b6-c1",14,False,False +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",38,True,True +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*N][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b3-c1",19,False,False +"WURCS=2.0/3,3,2/[h2112h_2*NCC/3=O][a2112h-1b_1-5_4*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_a6-c2",17,False,False +"WURCS=2.0/3,3,2/[u2112h][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b2_a4-c1",2,False,False +"WURCS=2.0/3,3,2/[u2112h][a2112h-1a_1-5][a2112h-1b_1-5]/1-2-3/a3-b1_b4-c1",2,False,False +"WURCS=2.0/3,3,2/[u2112h][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b3-c1",599,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1a_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a3-b1_a6-c2",17,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_b3-c2",17,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b3-c1",17,False,False +"WURCS=2.0/3,3,2/[u2112h_2*OCC/3=O][a2112h-1a_1-5][a2112h-1b_1-4_2*OCC/3=O]/1-2-3/a3-b1_b3-c1",13,False,False +"WURCS=2.0/3,3,2/[u2112h_2*OSO/3=O/3=O][a2112h-1a_1-5_2*OSO/3=O/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_2*OSO/3=O/3=O]/1-2-3/a3-b1_b4-c1",2,False,False +"WURCS=2.0/3,3,2/[u2112h_4*OSO/3=O/3=O][a2112h-1a_1-5][a2112h-1b_1-5_4*OSO/3=O/3=O]/1-2-3/a3-b1_b4-c1",2,False,False +"WURCS=2.0/3,3,2/[u2112h_6*OSO/3=O/3=O][a2112h-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3/a3-b1_b4-c1",2,False,False +"WURCS=2.0/3,3,2/[u2122A][a2112h-1b_1-5_2*NCC/3=O][a2122A-1b_1-5]/1-2-3/a4-b1_b3-c1",6,False,False +"WURCS=2.0/3,3,2/[u2122A][a2122h-1a_1-5_2*NCC/3=O][a2122A-1b_1-5]/1-2-3/a4-b1_b4-c1",39,True,True +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5_3*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O_3*OSO/3=O/3=O]/1-2-3/a4-b1_b4-c1",5,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1a_1-5][a2112h-1b_1-5]/1-2-3/a3-b1_b2-c1",15,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3/a3-b1_b3-c2",1038,False,False +"WURCS=2.0/3,3,2/[u222h][a2112h-1a_1-5_2*NCC/3=O][a222h-1b_1-4]/1-2-3/a2-b1_b3-c1",13,False,False +"WURCS=2.0/3,4,3/[Aad1122h-2a_2-6][a11221h-1a_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-2-3/a5-b1_b3-c1_c2-d1",52,False,False +"WURCS=2.0/3,4,3/[Aad21122h-2b_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-3/a8-b1_b3-c1_c6-d1",10,False,False +"WURCS=2.0/3,4,3/[a1122h-1a_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-1-2-3/a3-b1_b3-c1_c3-d1",38,False,False +"WURCS=2.0/3,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3/a3-b1_a6-d2_b3-c2",3,False,False +"WURCS=2.0/3,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_a6-c1_c3-d1",447,True,True +"WURCS=2.0/3,4,3/[a2122h-1a_1-5][a2122h-1b_1-5][a2211m-1a_1-5]/1-1-2-3/a2-b1_b4-c1_c3-d1",52,False,False +"WURCS=2.0/3,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O][a1122h-1a_1-5]/1-2-3-3/a4-b1_b4-c1_c3-d1",1,False,False +"WURCS=2.0/3,4,3/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b3-c1_c3-d1",76,False,False +"WURCS=2.0/3,4,3/[a2122h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-3/a4-b1_a6-c1_c3-d2",1,False,False +"WURCS=2.0/3,4,3/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-3/a4-b1_b4-c1_c6-d2",479,True,True +"WURCS=2.0/3,4,3/[u2112h][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-2/a4-b1_b3-c1_c4-d1",2,False,False +"WURCS=2.0/3,4,3/[u2112h_2*NCC/3=O][a2122A-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_b4-c1_c3-d1",9,False,False +"WURCS=2.0/3,4,3/[u2112h_2*NCC/3=O_3*OCC/3=O][a2112h-1a_1-5_2*NCC/3=O_3*OCC/3=O][a2112h-1a_1-5_2*NCC/3=O_3*OCC/3=O_4*OCC/3=O]/1-2-2-3/a4-b1_b4-c1_c4-d1",14,False,False +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*N]/1-2-2-3/a4-b1_b3-c1_c4-d1",6,True,True +"WURCS=2.0/3,4,3/[u2122h][a2122A-1b_1-5][a2122h-1b_1-5]/1-2-3-2/a4-b1_b3-c1_c4-d1",14,False,False +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1a_1-5][a1221m-1a_1-5]/1-2-3-2/a4-b1_b2-c1_b3-d1",15,False,False +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3/a4-b1_b3-c2_c8-d2",588,False,False +"WURCS=2.0/3,5,4/[a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1a_1-5_6*OPO/3O/3=O]/1-2-2-2-3/a2-b1_b3-c1_c3-d1_d3-e1",13,True,True +"WURCS=2.0/3,5,4/[a2122h-1a_1-5][a2112h-1a_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-1-1-3/a3-b1_b2-c1_b3-e1_c2-d1",70,True,True +"WURCS=2.0/3,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-2-3-3/a4-b1_b3-c1_c4-d1_d3-e1",9,False,False +"WURCS=2.0/3,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][a2212h-1b_1-5]/1-2-2-2-3/a6-b1_b6-c1_c6-d1_d6-e1",587,False,False +"WURCS=2.0/3,5,4/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3/a3-b1_a6-c1_c4-d1_d3-e1",588,False,False +"WURCS=2.0/3,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2-3/a6-b1_b4-c1_c6-d1_d4-e1",286,False,False +"WURCS=2.0/3,5,4/[u2112h_4*OSO/3=O/3=O][a2112h-1a_1-5][a2112h-1b_1-5_4*OSO/3=O/3=O]/1-2-3-2-3/a3-b1_b4-c1_c3-d1_d4-e1",2,False,False +"WURCS=2.0/3,5,4/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3/a4-b1_b2-c1_b3-e1_c2-d1",9,False,False +"WURCS=2.0/3,6,5/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2/a4-b1_b4-c1_c3-d1_d4-e1_e3-f1",70,True,True +"WURCS=2.0/3,6,5/[u2112h_2*NCC/3=O][a2122A-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1",9,False,False +"WURCS=2.0/3,6,5/[u2112h_6*OSO/3=O/3=O][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1",1,False,False +"WURCS=2.0/3,6,5/[u211h][a211h-1a_1-4][a1122h-1a_1-5]/1-2-2-3-2-3/a5-b1_b3-c1_b5-e1_c5-d1_e5-f1",14,False,False +"WURCS=2.0/3,7,6/[u2112h][a2112h-1a_1-5][a2112h-1b_1-5]/1-2-3-2-3-2-3/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1_f4-g1",2,False,False +"WURCS=2.0/3,8,7/[u2112h_2*OSO/3=O/3=O][a2112h-1b_1-5_4*OSO/3=O/3=O][a2112h-1a_1-5_2*OSO/3=O/3=O]/1-2-3-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1",2,False,False +"WURCS=2.0/3,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-3-2-3/a4-b1_b3-c1_b6-f1_c4-d1_d3-e1_f4-g1_g3-h1",11,False,False +"WURCS=2.0/3,9,8/[u2112h][a2112h-1a_1-5][a2112h-1b_1-5]/1-2-3-2-3-2-3-2-3/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1_f4-g1_g3-h1_h4-i1",2,False,False +"WURCS=2.0/3,9,8/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-3-3/a4-b1_b3-c1_c4-d1_d3-e1_d6-i1_e4-f1_f3-g1_f6-h1",4,False,False +"WURCS=2.0/3,9,8/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3/a4-b1_b3-c1_c4-d1_d3-e1_d6-i1_e4-f1_f3-g1_g4-h1",9,False,False +"WURCS=2.0/4,10,9/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-3-2-4-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_d6-h1_e4-f1_f2-g1_h4-i1_i2-j1",4,True,True +"WURCS=2.0/4,10,9/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-3-2-3-2-3/a4-b1_b3-c1_b6-f1_c4-d1_d6-e2_f4-g1_g3-h1_h4-i1_i3-j1",5,False,False +"WURCS=2.0/4,10,9/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-3-4-2-3-2-4/a4-b1_b3-c1_b6-e1_c3-d1_e3-f1_e4-g1_g3-h1_h3-i1_i2-j1",6,False,False +"WURCS=2.0/4,10,9/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-3-2-3-4-2/a4-b1_b3-c1_b6-f1_c3-d1_c4-e1_f4-g1_g3-h1_h3-i1_h4-j1",5,True,True +"WURCS=2.0/4,10,9/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-3-2-4-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_d6-h1_e4-f1_f3-g1_h4-i1_i3-j1",1,False,False +"WURCS=2.0/4,10,9/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1a_1-5]/1-2-3-3-3-4-4-3-3-3/a4-b1_b3-c1_b6-h1_c2-d1_d2-e1_e3-f1_f3-g1_h3-i1_h6-j1",6,False,False +"WURCS=2.0/4,11,10/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-4-2-3-2-4/a4-b1_b3-c1_b6-f1_c3-d1_c4-e1_f3-g1_f4-h1_h3-i1_i3-j1_i4-k1",4,False,False +"WURCS=2.0/4,11,10/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-4-2-3-2-3-4/a3-b1_a6-g1_b4-c1_c3-d1_d4-e1_e3-f2_g4-h1_h3-i1_i4-j1_j3-k2",588,False,False +"WURCS=2.0/4,11,10/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-3-2-3-2-3-4-2/a4-b1_b3-c1_b6-e1_c3-d1_e4-f1_f3-g1_f6-i1_g4-h1_i3-j1_i4-k1",5,True,True +"WURCS=2.0/4,12,11/[u2211m][a2122h-1a_1-5_2*NCC/3=O][a2112h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-4-2-3-4-4-2-3-4/a3-b1_b3-c1_c2-d1_d3-e1_e3-f1_f3-g1_g2-h1_h3-i1_i3-j1_j3-k1_k2-l1",1,False,False +"WURCS=2.0/4,13,12/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-3-2-3-2-3-2-4/a3-b1_a6-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m2",2,False,False +"WURCS=2.0/4,13,12/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-3-2-3-2-4-3-2-4/a4-b1_b3-c1_b6-f1_c4-d1_d6-e2_f4-g1_g3-h1_g6-k1_h4-i1_i6-j2_k4-l1_l6-m2",11,False,False +"WURCS=2.0/4,15,14/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-3-2-3-2-4-3-2-4-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_d6-m1_e4-f1_f3-g1_f6-j1_g4-h1_h3-i1_j4-k1_k3-l1_m4-n1_n3-o1",1,False,False +"WURCS=2.0/4,17,16/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-3-2-4-2-4-3-2-4-2-4-2-4-2-4/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g4-h1_i2-j1_i6-n1_j4-k1_k3-l1_l4-m1_n4-o1_o3-p1_p4-q1",446,False,False +"WURCS=2.0/4,20,19/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-3-2-3-2-3-2-4-3-2-4-3-2-4-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_d6-r1_e4-f1_f3-g1_f6-o1_g4-h1_h3-i1_h6-l1_i4-j1_j3-k1_l4-m1_m3-n1_o4-p1_p3-q1_r4-s1_s3-t1",1,False,False +"WURCS=2.0/4,23,22/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-1-4-1-4-1-4-1-3-1-4-1-4-1-4-1-4-1/a4-b1_b4-c1_c3-d1_c6-n1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_n2-o1_o4-p1_p3-q1_q4-r1_r3-s1_s4-t1_t3-u1_u4-v1_v3-w1",447,False,False +"WURCS=2.0/4,25,24/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-3-2-3-2-3-2-3-2-4-3-2-4-3-2-4-3-2-4-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_d6-w1_e4-f1_f3-g1_f6-t1_g4-h1_h3-i1_h6-q1_i4-j1_j3-k1_j6-n1_k4-l1_l3-m1_n4-o1_o3-p1_q4-r1_r3-s1_t4-u1_u3-v1_w4-x1_x3-y1",1,False,False +"WURCS=2.0/4,4,3/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a6-b1_b4-c1_c3-d2",9,True,True +"WURCS=2.0/4,4,3/[a2112h-1b_1-?_2*NCC/3=O][a2122h-1b_1-?][a2112h-1a_1-?_2*NCC/3=O][a2112h-1b_1-?]/1-2-3-4/a3-b1_b4-c1_c3-d1",6,False,False +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*OCC/3=O_3*OCC/3=O_6*OCC/3=O][a2122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_6*OCC/3=O][a2122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O][a2122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1-2-3-4/a4-b1_b4-c1_c6-d1",39,False,False +"WURCS=2.0/4,4,3/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a4-b1_b4-c1_c3-d2",70,False,False +"WURCS=2.0/4,4,3/[u2112h][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-4/a2-b1_a3-c1_c4-d1",4,False,False +"WURCS=2.0/4,4,3/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4/a3-b1_b3-c1_b4-d1",3,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-4/a6-b1_b3-c1_c3-d1",13,False,False +"WURCS=2.0/4,5,4/[a2112h-1x_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-4/a3-b1_b3-c1_b4-e1_c2-d1",103,True,True +"WURCS=2.0/4,5,4/[a2112h-1x_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-2-3-4/a3-b1_a6-c1_c4-d1_d3-e1",24,False,False +"WURCS=2.0/4,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-4/a3-b1_a6-e1_b2-c1_b4-d1",19,False,False +"WURCS=2.0/4,5,4/[a2122h-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2/a4-b1_b6-c1_c3-d1_c4-e1",2,True,True +"WURCS=2.0/4,5,4/[a2122h-1a_1-5_2*NSO/3=O/3=O_6*OSO/3=O/3=O][a2121A-1a_1-5_2*OSO/3=O/3=O][a2122h-1a_1-5_2*N_3*OSO/3=O/3=O][a2122A-1b_1-5]/1-2-3-4-1/a4-b1_b4-c1_c4-d1_d4-e1",14,False,False +"WURCS=2.0/4,5,4/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b4-c1_c3-d1_d3-e1",70,False,False +"WURCS=2.0/4,5,4/[u1221m_3*OCC/3=O_4*OCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5_3*OCC/3=O_4*OCC/3=O]/1-2-2-3-4/a2-b1_b3-c1_c3-d1_d2-e1",13,False,False +"WURCS=2.0/4,5,4/[u2112h][a2112h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5][a2112h-1a_1-5]/1-2-2-3-4/a3-b1_a4-c1_c3-d1_d6-e1",13,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b4-c1_c3-d1_c6-e2",59,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*N]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e2",20,False,False +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d3-e2",289,False,False +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b3-c2_b4-d1_d3-e1_e3-f2",9,False,False +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-4-2/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1",3,False,False +"WURCS=2.0/4,6,5/[u2122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2122h-1a_1-5]/1-2-3-2-4-4/a2-b1_b3-c1_c3-d1_c4-e1_e6-f1",13,False,False +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4/a4-b1_b4-c1_c3-d1_d3-e1_d6-f1",10,False,False +"WURCS=2.0/4,6,5/[u2211m][a2122h-1a_1-5_2*NCC/3=O_6*OCC/3=O][a2122h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-4-4/a2-b1_b3-c1_c2-d1_d2-e1_e2-f1",13,False,False +"WURCS=2.0/4,6,5/[u2211m][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-2-3-2-4/a3-b1_b2-c1_c2-d1_d3-e1_d4-f1",13,False,False +"WURCS=2.0/4,6,5/[u222h][a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a222h-1b_1-4]/1-2-3-2-3-4/a2-b1_b3-c1_c4-d1_d4-e1_e4-f1",13,False,False +"WURCS=2.0/4,7,6/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122A-1b_1-5]/1-2-3-4-2-3-4/a2-b1_a6-e1_b4-c1_c3-d1_e4-f1_f3-g1",2,False,False +"WURCS=2.0/4,7,6/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-4/a3-b1_a6-c1_c4-d1_d3-e1_e4-f1_f3-g2",447,False,False +"WURCS=2.0/4,7,6/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-2-4/a3-b1_b3-c1_c4-d1_d2-e1_d4-f1_f2-g1",39,True,True +"WURCS=2.0/4,7,6/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-3-4/a3-b1_a6-e1_b4-c1_c2-d1_e4-f1_f2-g1",15,False,False +"WURCS=2.0/4,7,6/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-3-4/a3-b1_a6-e1_b4-c1_c3-d1_e4-f1_f3-g1",15,False,False +"WURCS=2.0/4,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-3-3-4/a4-b1_b3-c2_b4-g1_c8-d2_d8-e2_e8-f2",479,False,False +"WURCS=2.0/4,7,6/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d6-e1_e4-f1_f2-g1",4,True,True +"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-2/a3-b1_a6-f1_b3-c1_c4-d1_d2-e1_f4-g1",14,False,False +"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-3-4/a3-b1_a6-e1_b4-c1_c3-d2_e4-f1_f3-g2",633,False,False +"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-3-4/a3-b1_a6-e1_b3-c1_c2-d1_e3-f1_f2-g1",633,False,False +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-3-2-3/a4-b1_b2-c1_b3-d1_d3-e1_d4-f1_f2-g1",11,False,False +"WURCS=2.0/4,7,6/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-2/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f2-g1",59,False,False +"WURCS=2.0/4,8,7/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-1-4-2-3-1/a3-b1_a6-e1_b3-c2_b4-d1_e4-f1_f3-g2_f4-h1",15,False,False +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-3-2-4/a4-b1_b3-c1_c3-d1_c4-e1_e3-f1_f3-g1_f4-h1",5,False,False +"WURCS=2.0/4,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-e1_e3-f1_e6-h1_f2-g1",35,False,False +"WURCS=2.0/4,9,8/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-1-2-3-4-1/a3-b1_a6-f1_b4-c1_c2-d1_c3-e1_f4-g1_g2-h1_g3-i1",15,False,False +"WURCS=2.0/4,9,8/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i1",70,False,False +"WURCS=2.0/4,9,8/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-4-4/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g3-h1_g6-i1",33,False,False +"WURCS=2.0/4,9,8/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-4-2-3/a3-b1_a4-c1_c4-d1_d3-e1_d4-f1_f4-g1_g3-h1_g4-i1",573,False,False +"WURCS=2.0/5,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1_i6-j2",476,True,True +"WURCS=2.0/5,10,9/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-2-3-2-3-5/a4-b1_b3-c1_b6-j2_c4-d1_d3-e1_e4-f1_f3-g1_f6-i1_g4-h1",9,False,False +"WURCS=2.0/5,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1a_1-5_6*OPO/3O/3=O]/1-2-3-4-4-4-4-4-4-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e2-f1_g3-h1_g6-i1_i2-j1",2,False,False +"WURCS=2.0/5,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-2-5-2-4-4/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_d4-f1_f4-g1_i3-j1",9,False,False +"WURCS=2.0/5,11,10/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1a_1-5]/1-2-3-2-2-3-2-4-3-2-5/a4-b1_b3-c1_c4-d1_d3-e1_d6-i1_e3-f1_f4-g1_g3-h2_i4-j1_j3-k1",10,False,False +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-1-3-1-4-5-1/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1_g6-k1_h4-i1_i6-j2",1,False,False +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f4-g1_h2-i1_i4-j1_j4-k1",472,False,False +"WURCS=2.0/5,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-2-4-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1_g6-j1_h4-i1_j4-k1",7,False,False +"WURCS=2.0/5,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-5-4-2-5-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g1_h2-i1_i4-j1_j3-k1",303,False,False +"WURCS=2.0/5,12,11/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-3-4-2-3-2-5/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g3-h1_g4-i1_i3-j1_j4-k1_k3-l2",16,True,True +"WURCS=2.0/5,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-4-5-5/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",479,False,False +"WURCS=2.0/5,12,11/[h2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-4-2-5-5-4-5-2/a3-b1_a6-d1_b3-c2_d4-e1_e3-f1_e6-j1_f3-g1_f4-i1_g2-h1_j3-k1_j4-l1",2,False,False +"WURCS=2.0/5,12,11/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-3-4-2-3-4-2-5/a3-b1_b3-c1_c3-d1_c4-e1_e3-f1_f3-g1_f4-h1_h3-i1_i3-j1_i4-k1_k3-l2",2,False,False +"WURCS=2.0/5,12,11/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-5-2-3-5-2-5/a4-b1_b3-c1_b6-f1_c4-d1_d6-e2_f3-g1_f4-h1_h3-i1_i3-j1_i4-k1_k2-l1",5,False,False +"WURCS=2.0/5,13,12/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-2-3-5-2-3-5-2/a4-b1_b3-c1_b6-f1_c4-d1_d6-e2_f4-g1_g3-h1_g6-k1_h3-i1_h4-j1_k3-l1_k4-m1",11,False,False +"WURCS=2.0/5,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-4-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g3-h1_i2-j1_j4-k1_k3-l1_l3-m1",587,False,False +"WURCS=2.0/5,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1a_1-5]/1-2-3-4-4-4-5-5-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e2-f1_f3-g1_g3-h1_i3-j1_i6-l1_j2-k1_l2-m1",4,False,False +"WURCS=2.0/5,14,13/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-2-3-2-3-2-4-5-3-2-4-5/a4-b1_b3-c1_c4-d1_d3-e1_d6-k1_e4-f1_f3-g1_g4-h1_h2-i1_h3-j1_k4-l1_l2-m1_l3-n1",4,False,False +"WURCS=2.0/5,14,13/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-5-5-3-1-4-5-5-5/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-h1_f2-g1_i2-j1_j3-k1_j4-m1_k2-l1",9,False,False +"WURCS=2.0/5,14,13/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-4-2-5-2-2-5-2/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g1_h2-i1_h6-l1_i4-j1_j3-k1_l4-m1_m3-n1",447,False,False +"WURCS=2.0/5,14,13/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-4-2-5-2-5/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_d4-g1_e4-f1_g4-h1_j2-k1_j6-m1_k4-l1_m4-n1",472,True,True +"WURCS=2.0/5,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-1-4-5-3-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o2",389,False,False +"WURCS=2.0/5,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-5-3-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h2-i1_j2-k1_k4-l1_l3-m1_m4-n1_n2-o1",447,False,False +"WURCS=2.0/5,15,14/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-3-4-2-3-4-2-3-4-2-5/a4-b1_b3-c1_c3-d1_c4-e1_e3-f1_f3-g1_f4-h1_h3-i1_i3-j1_i4-k1_k3-l1_l3-m1_l4-n1_n3-o2",39,False,False +"WURCS=2.0/5,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4-2-5-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_g6-j1_h4-i1_j4-k1_k3-l1_l4-m1_m3-n1_n4-o1",9,False,False +"WURCS=2.0/5,16,15/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-3-1-4-1-4-1-5/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1",447,False,False +"WURCS=2.0/5,17,16/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-3-1-5-4-1-5-4-5/a4-b1_a6-q1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_d4-g1_e4-f1_g4-h1_j2-k1_j6-n1_k3-l1_k4-m1_n3-o1_n4-p1",14,False,False +"WURCS=2.0/5,17,16/[u2112h_2*NCC/3=O][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-4-3-4-5-2-3-4-3-4-3-4-5/a3-b1_a6-j1_b2-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1_o4-p1_p3-q2",576,False,False +"WURCS=2.0/5,17,16/[u2112h_2*NCC/3=O][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-4-3-4-5-2-3-4-3-4-3-4-5/a3-b1_a6-j1_b2-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h6-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1_o4-p1_p6-q2",576,False,False +"WURCS=2.0/5,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-5-4-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_k2-l1_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1",589,False,False +"WURCS=2.0/5,19,18/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-1-4-1-4-5-3-1-4-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s2",447,False,False +"WURCS=2.0/5,22,21/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-1-4-3-1-4-1-4-1-4-1-4-5/a4-b1_a6-v1_b4-c1_c3-d1_c6-m1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_m2-n1_n4-o1_o3-p1_p4-q1_q3-r1_r4-s1_s3-t1_t4-u1",446,False,False +"WURCS=2.0/5,27,26/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-1-3-1-4-1-4-1-4-1-1-4-1-4-1-4-1-5/a4-b1_a6-A1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_l2-m1_l6-t1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s1_t4-u1_u3-v1_v4-w1_w3-x1_x4-y1_y3-z1",446,False,False +"WURCS=2.0/5,36,35/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-1-4-1-4-3-1-4-1-4-1-4-1-4-1-4-1-4-1-4-1-4-1-4-1-4-5/a4-b1_a6-J1_b4-c1_c3-d1_c6-o1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_o2-p1_o6-z1_p4-q1_q3-r1_r4-s1_s3-t1_t4-u1_u3-v1_v4-w1_w3-x1_x4-y1_z4-A1_A3-B1_B4-C1_C3-D1_D4-E1_E3-F1_F4-G1_G3-H1_H4-I1",443,False,False +"WURCS=2.0/5,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-5/a6-b1_b4-c1_c3-d2_c4-e1",54,False,False +"WURCS=2.0/5,5,4/[a2122h-1a_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112m-1a_1-5_3*NCC/3=O]/1-2-3-4-5/a4-b1_b3-c1_b4-e1_c3-d1",587,False,False +"WURCS=2.0/5,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-5/a4-b1_b3-c2_b4-e1_c8-d2",70,True,True +"WURCS=2.0/5,5,4/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a4-b1_b3-c1_c3-d1_d3-e1",103,False,False +"WURCS=2.0/5,5,4/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-5/a4-b1_a6-e1_b4-c1_c6-d1",14,True,True +"WURCS=2.0/5,5,4/[a2122m-1a_1-5][a212h-1b_1-5][a2122m-1b_1-5][a2112h-1b_1-5][a2112m-1b_1-5]/1-2-3-4-5/a3-b1_b2-c1_b4-d1_d2-e1",14,False,False +"WURCS=2.0/5,5,4/[u1122h][a2122h-1a_1-5_2*NCC/3=O][a2122m-1a_1-5_2*NCC/3=O][a2122h-1a_1-5][a1122h-1b_1-5]/1-2-3-4-5/a2-b1_b3-c1_c3-d1_d4-e1",13,False,False +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5][a1122h-1b_1-5][a1221m-1a_1-5_3*NC=O]/1-2-3-4-5/a2-b1_a3-e1_b3-c1_c3-d1",13,False,False +"WURCS=2.0/5,5,4/[u1122m_4*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5][a1221m-1a_1-5][a1122m-1a_1-5_4*NCC/3=O]/1-2-3-4-5/a2-b1_b3-c1_c4-d1_d3-e1",13,False,False +"WURCS=2.0/5,5,4/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2211m-1a_1-5][a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-4-5/a2-b1_b3-c1_c4-d1_d3-e1",13,False,False +"WURCS=2.0/5,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3-4-5/a4-b1_b3-c1_c3-d1_c4-e1",5,False,False +"WURCS=2.0/5,5,4/[u2122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-3-4-5/a2-b1_b3-c1_c3-d1_d6-e1",13,False,False +"WURCS=2.0/5,5,4/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2112h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5]/1-2-3-4-5/a3-b1_b4-c1_c3-d1_c4-e1",13,False,False +"WURCS=2.0/5,5,4/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_c4-d1_d3-e2",21,False,False +"WURCS=2.0/5,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2212h-1b_1-5]/1-2-3-4-5-4/a4-b1_b3-c2_b4-d1_d3-e1_e4-f1",1,False,False +"WURCS=2.0/5,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-5/a4-b1_b4-c1_c3-d1_d3-e1_e3-f1",587,False,False +"WURCS=2.0/5,6,5/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5/a4-b1_b3-c1_c3-d1_d3-e1_e2-f1",103,False,False +"WURCS=2.0/5,6,5/[u1122h][a1221m-1a_1-5][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1a_1-5]/1-2-3-4-2-5/a3-b1_a4-d1_b2-c1_d3-e1_e3-f1",13,False,False +"WURCS=2.0/5,6,5/[u2112h][a1221m-1a_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-4-4-5/a2-b1_a3-c1_c2-d1_d3-e1_e3-f1",13,False,False +"WURCS=2.0/5,6,5/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-3-5/a3-b1_b3-c1_b4-d1_d2-e1_d3-f1",727,False,False +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5/a4-b1_b3-c1_c6-d1_d4-e1_e3-f2",9,False,False +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2-4-5/a4-b1_b3-c1_c4-d1_d4-e1_e3-f1",845,False,False +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-5/a3-b1_a4-c1_c3-d1_d4-e1_e3-f2",1027,False,False +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-3-4-5-4/a3-b1_b3-c1_c3-d1_c4-e1_e6-f1",13,False,False +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-5/a4-b1_b3-c1_b6-f2_c4-d1_d3-e1",9,False,False +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2211m-1a_1-5_2*OCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-3-3-4-5/a3-b1_b3-c1_c2-d1_d2-e1_d3-f1",13,False,False +"WURCS=2.0/5,6,5/[u2211m][a1122h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-5-5/a2-b1_a3-c1_c3-d1_d2-e1_e2-f1",13,False,False +"WURCS=2.0/5,7,6/[u1122h][a2122h-1a_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1a_1-5]/1-2-3-4-4-5-5/a6-b1_b3-c1_c2-d1_c3-g1_d2-e1_d4-f1",13,False,False +"WURCS=2.0/5,7,6/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-5-2-3/a3-b1_a6-d1_b3-c2_d3-e1_d4-f1_f3-g2",754,False,False +"WURCS=2.0/5,7,6/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-5/a3-b1_a6-d1_b6-c2_d4-e1_e3-f2_e4-g1",14,False,False +"WURCS=2.0/5,8,7/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-5-2-3-4/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1_e6-h2_f3-g2",3,False,False +"WURCS=2.0/5,8,7/[a2122h-1b_1-5_2*NCC/3=O][a2112m-1a_1-5][a1122h-1b_1-5][a212h-1a_1-5][a1122h-1a_1-5]/1-2-1-3-4-5-5-1/a3-b1_a4-c1_c4-d1_d2-e1_d3-f1_d6-g1_g2-h1",9,False,False +"WURCS=2.0/5,8,7/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-3-2-5/a4-b1_b3-c1_b6-f1_c3-d1_d2-e1_f4-g1_g6-h2",447,False,False +"WURCS=2.0/5,9,8/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5-2-3-4-5/a3-b1_a6-f1_b4-c1_c2-d1_d3-e1_f4-g1_g2-h1_h3-i1",380,False,False +"WURCS=2.0/5,9,8/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-4-3-5-2/a4-b1_b3-c1_b6-g1_c3-d1_c6-f2_d3-e2_g3-h1_g4-i1",456,False,False +"WURCS=2.0/5,9,8/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a2112h-1b_1-5][a1122h-1a_1-5]/1-2-3-2-4-5-2-4-2/a4-b1_b4-c1_c2-d1_c3-f1_c4-i1_d4-e1_f2-g1_g4-h1",29,False,False +"WURCS=2.0/5,9,8/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2-4-5-3-2-4/a3-b1_a6-g1_b3-c1_c4-d1_d3-e2_d4-f1_g4-h1_h3-i2",14,False,False +"WURCS=2.0/5,9,8/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5-2-3-4-5/a3-b1_a6-f1_b4-c1_c2-d1_c3-e1_f4-g1_g2-h1_g3-i1",698,False,False +"WURCS=2.0/5,9,8/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-3-2-5/a4-b1_b3-c1_b6-g1_c3-d1_c4-e1_e2-f1_g4-h1_h6-i2",633,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-5-5-5-5-2/a3-b1_a4-c1_a6-i1_c4-d1_d3-e1_d6-f1_f3-g1_f6-h1",10,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1a_1-5][a2112h-1b_1-5][a1122h-1b_1-5_2*NCC/3=O]/1-2-3-3-2-4-5-3-2/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_e4-f1_h2-i1",2,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-4-2-2-5/a4-b1_a6-i1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_f6-h1",638,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4-2-5-4-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",7,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3-4-2-5-4-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",7,False,False +"WURCS=2.0/6,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O_4*OSO/3=O/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-3-1-5-6/a4-b1_a6-j1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",10,False,False +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-3-2-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1",4,False,False +"WURCS=2.0/6,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-6-6/a4-b1_a6-k1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i3-j1",9,False,False +"WURCS=2.0/6,11,10/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",2,True,True +"WURCS=2.0/6,11,10/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f3-g2_h2-i1_i3-j1_j3-k2",450,False,False +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-5-3-5-3-6-2-6/a3-b1_a4-c1_a6-j1_c4-d1_d3-e1_d6-g1_e2-f1_g2-h1_h4-i1_j4-k1",2,False,False +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O_9*OCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",9,False,False +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*OCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j3-k2",9,False,False +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*OCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",9,False,False +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j3-k2",7,False,False +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-5-4/a4-b1_a6-l1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g6-h2_i2-j1_j4-k1",47,False,False +"WURCS=2.0/6,12,11/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-4-2-5-6/a4-b1_a6-l1_b4-c1_c3-d1_c4-g1_c6-i1_d2-e1_e4-f1_g4-h1_i2-j1_j4-k1",447,True,True +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e4-f1_f3-g2_i2-j1_j4-k1_k3-l2",1,False,False +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-4-2/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f3-g2_h4-i1_i3-j2_k6-l1",6,False,False +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6-6/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f2-g1_h2-i1_i3-j1_j2-k1",727,False,False +"WURCS=2.0/6,13,12/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f2-g1_f3-h1_i2-j1_j3-k1_k2-l1_k3-m1",479,False,False +"WURCS=2.0/6,13,12/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-6-5-4-2-5-6/a4-b1_a6-m1_b4-c1_c3-d1_c6-j1_d2-e1_d4-g1_e4-f1_g3-h1_g4-i1_j2-k1_k4-l1",10,False,False +"WURCS=2.0/6,13,12/[h2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_d4-h1_e4-f1_f3-g2_h4-i1_j2-k1_k4-l1_l3-m2",1,False,False +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-4-2-5-6-2/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h1_i2-j1_j3-k1_j4-l1_l3-m1",3,False,False +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-5-4-2-5-6-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f4-g1_g2-h1_i2-j1_j3-k1_j4-l1_l2-m1",1,False,False +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-6-4-2-5-6-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g2_g8-h2_i2-j1_j4-k1_k3-l2_l8-m2",3,False,False +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-6-6-4-2-5-6-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g2_g8-h2_i2-j1_j4-k1_k3-l2_l8-m2",3,False,False +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-4-2-5-2-6/a4-b1_a6-m1_b4-c1_c3-d1_c6-i1_d2-e1_d4-g1_e4-f1_g4-h1_i2-j1_i6-l1_j4-k1",7,False,False +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-6-5-2-5-4-2/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g3-h1_g4-i1_i3-j1_j4-k1_l2-m1",9,False,False +"WURCS=2.0/6,14,13/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-4-5-6-3-1-5-6-1-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f3-g2_h2-i1_h6-l1_i4-j1_j3-k2_l3-m1_m3-n2",38,False,False +"WURCS=2.0/6,14,13/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-1-2-3-1-4-5-6-3-1-4-5-6-5/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f2-g1_f3-h1_i2-j1_j4-k1_k2-l1_k3-m1",476,False,False +"WURCS=2.0/6,14,13/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e3-f1_e4-g1_h3-i1_h4-j1_k2-l1_l3-m1_l4-n1",39,False,False +"WURCS=2.0/6,14,13/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f3-g2_h4-i1_i3-j2_k2-l1_l4-m1_m3-n2",1,False,False +"WURCS=2.0/6,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f6-g2_h4-i1_i3-j2_k2-l1_l4-m1_m3-n2",28,False,False +"WURCS=2.0/6,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-1-4-5-3-1-4-5-6/a4-b1_a6-o1_b4-c1_c3-d1_c6-k1_d2-e1_d6-h1_e4-f1_f6-g2_h4-i1_i6-j2_k2-l1_l4-m1_m3-n2",49,False,False +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e3-f1_f3-g2_i2-j1_i6-m1_j3-k1_k3-l2_m3-n1_n3-o2",1,False,False +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j2-k1_l2-m1_m4-n1_n2-o1",9,False,False +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1",3,False,False +"WURCS=2.0/6,16,15/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-6-4-2-6-2-5-6-5/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_d4-h1_e3-f1_e4-g1_h4-i1_j2-k1_j6-m1_k4-l1_m3-n1_m4-o1",16,False,False +"WURCS=2.0/6,17,16/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d6-h1_e4-f1_f6-g2_h4-i1_i6-j2_k2-l1_k4-o1_l4-m1_m6-n2_o4-p1_p3-q2",19,False,False +"WURCS=2.0/6,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-6-2-4-2-5-6-2-6-2/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_e3-f1_e4-g1_g3-h1_h4-i1_i3-j1_k2-l1_l3-m1_l4-n1_n3-o1_o4-p1_p3-q1",3,False,False +"WURCS=2.0/6,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1_o4-p1_p3-q2",5,False,False +"WURCS=2.0/6,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-6-6-4-2-5-2-5-6-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_e4-f1_f3-g1_f6-j2_g4-h1_h3-i2_k2-l1_l4-m1_m3-n1_m6-q2_n4-o1_o3-p2",3,False,False +"WURCS=2.0/6,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-2-5-6-6-4-2-5-2-5-6-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_e4-f1_f3-g1_f6-j2_g4-h1_h6-i2_k2-l1_l4-m1_m3-n1_m6-q2_n4-o1_o6-p2",3,False,False +"WURCS=2.0/6,18,17/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-1-2-3-1-4-5-1-4-3-1-6-4-5-5-1-4-5/a4-b1_a6-r1_b4-c1_c3-d1_c6-j1_d2-e1_d3-g1_d4-h1_e4-f1_h4-i1_j2-k1_j3-o1_j6-p1_k4-l1_l3-m1_m2-n1_p4-q1",587,False,False +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_l6-p1_m4-n1_n3-o2_p4-q1_q3-r2",9,False,False +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-2-5-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_h6-p1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_n3-o2_p4-q1_q3-r2",9,False,False +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_h6-l1_i4-j1_j3-k2_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1_q3-r2",9,False,False +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_h6-l1_i4-j1_j6-k2_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1_q6-r2",9,False,False +"WURCS=2.0/6,19,18/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-6-2-6-4-2-5-6-2-6-2-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e3-f1_e4-g1_g3-h1_h4-i1_i3-j1_j4-k1_l2-m1_m3-n1_m4-o1_o3-p1_p4-q1_q3-r1_r4-s1",3,False,False +"WURCS=2.0/6,19,18/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s2",7,False,False +"WURCS=2.0/6,19,18/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s1",3,False,False +"WURCS=2.0/6,21,20/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-5-6-2-6-4-2-5-6-2-5-6-2-6/a4-b1_b4-c1_c3-d1_c6-m1_d2-e1_e3-f1_e4-g1_g3-h1_h3-i1_h4-j1_j3-k1_k4-l1_m2-n1_n3-o1_n4-p1_p3-q1_q3-r1_q4-s1_s3-t1_t4-u1",3,False,False +"WURCS=2.0/6,21,20/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-6-2-6-2-4-2-5-6-2-6-2-6-2/a4-b1_b4-c1_c3-d1_c6-m1_d2-e1_e3-f1_e4-g1_g3-h1_h4-i1_i3-j1_j4-k1_k3-l1_m2-n1_n3-o1_n4-p1_p3-q1_q4-r1_r3-s1_s4-t1_t3-u1",3,False,False +"WURCS=2.0/6,23,22/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-5-6-2-5-6-4-2-5-6-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-n1_d2-e1_e3-f1_e4-g1_g3-h1_h3-i1_h4-j1_j3-k1_k3-l1_k4-m1_n2-o1_o3-p1_o4-q1_q3-r1_r3-s1_r4-t1_t3-u1_u3-v1_u4-w1",3,False,False +"WURCS=2.0/6,23,22/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-6-2-6-2-6-4-2-5-6-2-6-2-6-2-6/a4-b1_b4-c1_c3-d1_c6-n1_d2-e1_e3-f1_e4-g1_g3-h1_h4-i1_i3-j1_j4-k1_k3-l1_l4-m1_n2-o1_o3-p1_o4-q1_q3-r1_r4-s1_s3-t1_t4-u1_u3-v1_v4-w1",3,False,False +"WURCS=2.0/6,23,22/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-p1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_n6-o2_p2-q1_q4-r1_r3-s1_s4-t1_t3-u1_u4-v1_v6-w2",9,False,False +"WURCS=2.0/6,6,5/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-4][a1122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2112h-1a_1-4]/1-2-3-4-5-6/a2-b1_a4-f1_b3-c1_c6-d1_d3-e1",13,False,False +"WURCS=2.0/6,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*N][a1221m-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*N]/1-2-3-4-5-6/a4-b1_b3-c1_c3-d1_c4-e1_e3-f2",20,False,False +"WURCS=2.0/6,6,5/[u2122m_3*N][a2112h-1a_1-5_2*N][a2112h-1b_1-5][a2211m-1a_1-5][a2122m-1a_1-5_3*N][a2122h-1b_1-5]/1-2-3-4-5-6/a4-b1_b3-c1_b4-f1_c4-d1_d3-e1",13,False,False +"WURCS=2.0/6,7,6/[a1211h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2211h-1b_1-5][a1122h-1a_1-5][a2211h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-5-1-6/a4-b1_b4-c1_c3-d1_c6-e1_e2-f1_f4-g1",9,False,False +"WURCS=2.0/6,7,6/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6/a4-b1_a6-g1_b4-c1_c6-d1_d6-e1_e4-f1",7,False,False +"WURCS=2.0/6,7,6/[u2112h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a1122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-3-2-4-5-6/a3-b1_a4-c1_c3-d1_c4-g1_d3-e1_e6-f1",13,False,False +"WURCS=2.0/6,7,6/[u2112h_2*N][a1221m-1a_1-5][a2112h-1b_1-5][a1122h-1a_1-5_2*N][a2112h-1a_1-5_2*N][a2122h-1b_1-5]/1-2-3-2-4-5-6/a3-b1_a4-c1_c3-d1_c4-g1_d3-e1_e6-f1",13,False,False +"WURCS=2.0/6,7,6/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-2-6/a4-b1_b3-c1_c4-d1_d3-e1_d4-f1_f3-g2",9,False,False +"WURCS=2.0/6,7,6/[u2122h_2*N_3*N][a2122h-1b_1-5_2*N_3*N_4*OPO/3O/3=O][Aad1122h-2a_2-6][a2112A-1a_1-5][a1122h-1a_1-5][a2122h-1b_1-5_2*N]/1-2-3-3-4-5-6/a6-b1_b6-c2_c4-d2_c5-f1_d5-e1_f3-g1",14,False,False +"WURCS=2.0/6,7,6/[u2211m][a2122h-1a_1-5][a2211m-1b_1-5][a2112m-1a_1-5_2*NCC/3=O][a2112h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-5-6-6/a3-b1_a4-c1_c3-d1_d3-e1_e3-f1_f2-g1",13,False,False +"WURCS=2.0/6,8,7/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-5-2-4-6/a2-b1_a6-f1_b3-c1_b4-d1_d3-e2_f4-g1_g3-h2",6,False,False +"WURCS=2.0/6,8,7/[u2112h][a2122h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-3-4-5-6-5/a2-b1_a3-d1_a4-e1_b2-c1_e3-f1_f4-g1_g3-h1",13,False,False +"WURCS=2.0/6,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5]/1-2-3-4-5-4-2-6/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1",7,False,False +"WURCS=2.0/6,9,8/[Aad1122h-2a_2-6][a11221h-1a_1-5][a2122h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-2-3-2-4-5-6/a5-b1_b3-c1_b4-e1_c2-d1_e6-f1_f4-g1_g4-h1_h3-i2",1,False,False +"WURCS=2.0/6,9,8/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-2-3-4-6/a2-b1_a6-f1_b3-c1_b4-d1_d3-e2_f3-g1_f4-h1_h3-i2",6,False,False +"WURCS=2.0/7,11,10/[a1122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-7/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",10,False,False +"WURCS=2.0/7,11,10/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-2-4-2/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_e3-f1_e4-g1_g3-h2_j2-k1",39,False,False +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-6-7-4-4-4/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i3-j1_i6-k1",9,True,True +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-7-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i3-j1_i4-k1",20,True,True +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-6-7-4-5-6-7/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",7,False,False +"WURCS=2.0/7,12,11/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a212h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-5-6-3-7-6-3-7-2/a3-b1_a4-c1_a6-l1_c4-d1_d2-e1_d3-f1_d6-i1_f2-g1_g4-h1_i2-j1_j4-k1",10,False,False +"WURCS=2.0/7,13,12/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-h1_f3-g1_i2-j1_j3-k1_j4-m1_k3-l1",476,False,False +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h1_i2-j1_j3-k1_j4-l1_l3-m1",846,False,False +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g2_g8-h2_i2-j1_j4-k1_k3-l2_l8-m2",3,False,False +"WURCS=2.0/7,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7-6/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f2-g1_f3-h1_i2-j1_j3-k1_k2-l1_k3-m1",698,False,False +"WURCS=2.0/7,16,15/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-6-7/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o2",9,False,False +"WURCS=2.0/7,16,15/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-6-7/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h6-i2_j2-k1_k4-l1_l3-m1_m4-n1_n6-o2",9,False,False +"WURCS=2.0/7,17,16/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1a_1-5]/1-2-3-4-2-5-6-2-5-7-4-2-5-7-2-5-7/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f6-g2_h4-i1_i4-j1_k2-l1_k6-o1_l4-m1_m4-n1_o4-p1_p4-q1",9,False,False +"WURCS=2.0/7,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-2-5-6-4-2-6-2-6-7/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_d4-i1_e3-f1_e4-g1_g3-h2_i3-j1_i4-k1_l2-m1_m4-n1_n3-o1_o4-p1_p6-q2",6,False,False +"WURCS=2.0/7,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-2-5-2-7/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j6-k2_l2-m1_l6-n1_n4-o1_o3-p1_p3-q1",9,False,False +"WURCS=2.0/7,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-2-5-2-6-5-2-5-7-2-5-2/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_f6-o1_g4-h1_h3-i1_i3-j1_i4-k1_k3-l1_l4-m1_m3-n2_o4-p1_p3-q1",9,False,False +"WURCS=2.0/7,18,17/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-2-7-5-4-2-7-5-2-7-5-7/a4-b1_a6-r1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f6-g2_h3-i1_h4-j1_k2-l1_k6-o1_l3-m1_l4-n1_o3-p1_o4-q1",13,False,False +"WURCS=2.0/7,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-4-2-5-2-5-2-5-6-2-5-2-7-5/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_f6-n1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m2_n4-o1_o3-p1_p3-q1_p4-r1",9,False,False +"WURCS=2.0/7,19,18/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-2-5-6-7-4-2-5-6-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e3-f1_e4-g1_g3-h1_h3-i1_h4-j1_j3-k1_l2-m1_m3-n1_m4-o1_o3-p1_p3-q1_p4-r1_r3-s1",3,False,False +"WURCS=2.0/7,20,19/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-2-5-6-4-2-5-2-5-6-2-5-6-7/a4-b1_a6-t1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f3-g2_h4-i1_i3-j2_k2-l1_k6-q1_l4-m1_m3-n1_n4-o1_o3-p2_q4-r1_r3-s2",7,False,False +"WURCS=2.0/7,20,19/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6-7/a4-b1_a6-t1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j6-k2_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r6-s2",7,False,False +"WURCS=2.0/7,23,22/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-2-5-6-2-6-7-4-2-5-6-2-5-6-2-6-7/a4-b1_b4-c1_c3-d1_c6-n1_d2-e1_e3-f1_e4-g1_g3-h1_h3-i1_h4-j1_j3-k1_k4-l1_l3-m1_n2-o1_o3-p1_o4-q1_q3-r1_r3-s1_r4-t1_t3-u1_u4-v1_v3-w1",3,False,False +"WURCS=2.0/7,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-6-7/a4-b1_b4-c1_c3-d1_d2-e1_e3-f1_e4-g1_g3-h2",9,True,True +"WURCS=2.0/7,9,8/[a2122h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112m-1a_1-5]/1-2-3-4-2-5-6-4-7/a4-b1_a6-i1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2",11,False,False +"WURCS=2.0/8,12,11/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-7-8/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j3-k1",17,False,False +"WURCS=2.0/9,14,13/[AUd1122h][Aa11122h-2a_2-6][a211h-1b_1-5_4*N][a11221h-1a_1-5][a2211m-1a_1-5][a2122m-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-3-4-4-5-6-5-7-8-9-4-9-4/a4-b2_a5-d1_b8-c1_d3-e1_d4-m1_e2-f1_e3-h1_e7-l1_f3-g1_h3-i1_i3-j1_j3-k1_m6-n1",14,False,False diff --git a/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/glycan_cold_scored_glycans.csv b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/glycan_cold_scored_glycans.csv new file mode 100644 index 0000000000000000000000000000000000000000..86a505aeb88ff4b20ba1b28f47417ee5125df293 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/glycan_cold_scored_glycans.csv @@ -0,0 +1,337 @@ +canonical_wurcs,scored_rows +"WURCS=2.0/1,2,1/[a212h-1b_1-5]/1-1/a4-b1",52 +"WURCS=2.0/1,6,5/[a212h-1b_1-5]/1-1-1-1-1-1/a4-b1_b4-c1_c4-d1_d4-e1_e4-f1",52 +"WURCS=2.0/1,9,8/[a1122h-1a_1-5]/1-1-1-1-1-1-1-1-1/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1_e6-h1_f2-g1_h2-i1",479 +"WURCS=2.0/2,12,11/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2-2-2-2/a4-b1_b4-c1_c4-d1_d4-e1_e4-f1_f4-g1_g4-h1_h4-i1_i4-j1_j4-k1_k4-l1",9 +"WURCS=2.0/2,12,11/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1_e2-f1_f2-g1_g2-h1_h2-i1_i2-j1_j2-k1_k2-l1",9 +"WURCS=2.0/2,12,11/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1_g3-h1_h3-i1_i3-j1_j3-k1_k3-l1",20 +"WURCS=2.0/2,13,12/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1_g6-h1_h6-i1_i6-j1_j6-k1_k6-l1_l6-m1",9 +"WURCS=2.0/2,13,12/[u212h][a212h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2-2/a4-b1_b4-c1_c4-d1_d4-e1_e4-f1_f4-g1_g4-h1_h4-i1_i4-j1_j4-k1_k4-l1_l4-m1",1 +"WURCS=2.0/2,15,14/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1_g6-h1_h6-i1_i6-j1_j6-k1_k6-l1_l6-m1_m6-n1_n6-o1",3 +"WURCS=2.0/2,2,1/[a11221h-1x_1-5][a11221h-1a_1-5]/1-2/a3-b1",52 +"WURCS=2.0/2,2,1/[a1122h-1a_1-5_3*OC_4*OCC/3=O_6*OCC/3=O][a2122h-1b_1-5_2*NCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1-2/a2-b1",14 +"WURCS=2.0/2,2,1/[a12x1h-1b_1-5_2*OSiC/3C/3C_3*OSiC/3C/3C_6*OSiC/3C/3C][a1221h-1b_1-5_2*OSiC/3C/3C_3*OSiC/3C/3C_4*OSiC/3C/3C_6*OSiC/3C/3C]/1-2/a4-b1",14 +"WURCS=2.0/2,2,1/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2/a3-b1",467 +"WURCS=2.0/2,2,1/[a212h-1b_1-5_3*OCC/3=O_4*OCC/3=O][a2122h-1b_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1-2/a2-b1",9 +"WURCS=2.0/2,2,1/[adx22h-1a_1-5_3*OC(CCCCCC$4)_6*OC(CCCCCC$4)][adx22h-1x_1-5_3*OC(CCCCCC$4)_4*OC(CCCCCC$4)_6*OC(CCCCCC$4)]/1-2/a4-b1",10 +"WURCS=2.0/2,2,1/[axx2xh-1d_1-5_2*OC(CCCCCC$4)/3=O_3*OC(CCCCCC$4)/3=O_4*OC(CCCCCC$4)/3=O][axx2xh-1u_1-5_2*OC(CCCCCC$4)_3*OC(CCCCCC$4)_4*OC(CCCCCC$4)_6*OC(CCCCCC$4)]/1-2/a6-b1",27 +"WURCS=2.0/2,2,1/[u122xh_2*OC_3*OC_6*OC][a122xh-1u_1-5_2*OC_3*OC_4*OC_6*OC]/1-2/a4-b1",35 +"WURCS=2.0/2,3,2/[a1122h-1a_1-5][a2122h-1b_1-5]/1-1-2/a6-b1_b6-c1",14 +"WURCS=2.0/2,3,2/[a1122h-1b_1-5_2*OCC/3=O_4*OCC/3=O][a1122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1-2-2/a3-b1_a6-c1",40 +"WURCS=2.0/2,3,2/[a2112h-1a_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2/a3-b2_a6-c2",479 +"WURCS=2.0/2,3,2/[a2xxxh-1d_1-5][axxxxh-1x_1-5_2*NCC/3=O]/1-2-2/a2-b1_a6-c1",4 +"WURCS=2.0/2,3,2/[u2112h][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2/a2-b2_a3-c2",15 +"WURCS=2.0/2,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-2/a4-b1_b4-c1",15 +"WURCS=2.0/2,3,2/[u2122h][a2122h-1b_1-5]/1-2-2/a6-b1_b6-c1",9 +"WURCS=2.0/2,3,2/[u2122h][a212h-1a_1-5]/1-2-2/a3-b1_b3-c1",1 +"WURCS=2.0/2,3,2/[u2211m][a2211m-1a_1-5]/1-2-2/a2-b1_b2-c1",14 +"WURCS=2.0/2,4,3/[a1122h-1a_1-5][a1122h-1a_1-5_6*OPO/3O/3=O]/1-1-1-2/a2-b1_b3-c1_c3-d1",16 +"WURCS=2.0/2,4,3/[a1122h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-1-1/a4-b1_a6-c1_c2-d1",52 +"WURCS=2.0/2,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-1-2/a4-b1_b3-c1_c4-d1",447 +"WURCS=2.0/2,4,3/[u1122A][a1122A-1b_1-5]/1-2-2-2/a4-b1_b4-c1_c4-d1",1 +"WURCS=2.0/2,4,3/[u2122h][a2122h-1a_1-5]/1-2-2-2/a4-b1_b4-c1_c4-d1",721 +"WURCS=2.0/2,4,3/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2-2/a4-b1_b3-c1_b6-d1",107 +"WURCS=2.0/2,5,4/[u1122h][a1122h-1a_1-5]/1-2-2-2-2/a4-b1_a6-d1_b6-c1_d6-e1",9 +"WURCS=2.0/2,5,4/[u2122h][a2122h-1a_1-5]/1-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1",9 +"WURCS=2.0/2,5,4/[u2122h][a2122h-1a_1-5]/1-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1",7 +"WURCS=2.0/2,5,4/[u2122h_2*N][a2122h-1b_1-5_2*N]/1-2-2-2-2/a4-b1_b4-c1_c4-d1_d4-e1",1 +"WURCS=2.0/2,6,5/[AUd21122h_5*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-2-2-2/a8-b2_b8-c2_c8-d2_d8-e2_e8-f2",16 +"WURCS=2.0/2,7,6/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1",30 +"WURCS=2.0/2,8,7/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1_g3-h1",7 +"WURCS=2.0/2,9,8/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1_e2-f1_f2-g1_g2-h1_h2-i1",9 +"WURCS=2.0/3,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-1-2-3-1-2-3-2/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f3-g1_g3-h1_g4-i1_i2-j1",479 +"WURCS=2.0/3,10,9/[u2112h_2*OSO/3=O/3=O][a2112h-1b_1-5_4*OSO/3=O/3=O][a2112h-1a_1-5_2*OSO/3=O/3=O]/1-2-3-2-3-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1",2 +"WURCS=2.0/3,10,9/[u2112h_6*OSO/3=O/3=O][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3-2-3-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1_f4-g1_g3-h1_h4-i1_i3-j1",1 +"WURCS=2.0/3,11,10/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3-2-3/a4-b1_b3-c1_b6-k1_c4-d1_d3-e1_e4-f1_f3-g1_f6-i1_g4-h1_i4-j1",9 +"WURCS=2.0/3,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3-3-3-3-3-3-3/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e2-f1_f3-g1_h3-i1_h6-j1_j2-k1_k3-l1",4 +"WURCS=2.0/3,12,11/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_d6-k1_e4-f1_f3-g1_f6-i1_g4-h1_i4-j1_k4-l1",5 +"WURCS=2.0/3,12,11/[u2122h_2*NCC/3=O][a2122A-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1_f4-g1_g3-h1_h4-i1_i3-j1_j4-k1_k3-l1",1 +"WURCS=2.0/3,18,17/[u2112h_6*OSO/3=O/3=O][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3-2-3-2-3-2-3-2-3-2-3-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1_f4-g1_g3-h1_h4-i1_i3-j1_j4-k1_k3-l1_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1_q3-r1",1 +"WURCS=2.0/3,3,2/[a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-4][a2122h-1a_1-5]/1-2-3/a3-b1_b3-c1",9 +"WURCS=2.0/3,3,2/[a2122h-1x_1-5][a2112h-1a_1-5][a2122h-1b_1-5_6*OPO/3O/3=O]/1-2-3/a3-b1_b6-c1",14 +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",38 +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*N][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b3-c1",19 +"WURCS=2.0/3,3,2/[h2112h_2*NCC/3=O][a2112h-1b_1-5_4*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_a6-c2",17 +"WURCS=2.0/3,3,2/[u2112h][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b2_a4-c1",2 +"WURCS=2.0/3,3,2/[u2112h][a2112h-1a_1-5][a2112h-1b_1-5]/1-2-3/a3-b1_b4-c1",2 +"WURCS=2.0/3,3,2/[u2112h][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b3-c1",599 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1a_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a3-b1_a6-c2",17 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_b3-c2",17 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b3-c1",17 +"WURCS=2.0/3,3,2/[u2112h_2*OCC/3=O][a2112h-1a_1-5][a2112h-1b_1-4_2*OCC/3=O]/1-2-3/a3-b1_b3-c1",13 +"WURCS=2.0/3,3,2/[u2112h_2*OSO/3=O/3=O][a2112h-1a_1-5_2*OSO/3=O/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_2*OSO/3=O/3=O]/1-2-3/a3-b1_b4-c1",2 +"WURCS=2.0/3,3,2/[u2112h_4*OSO/3=O/3=O][a2112h-1a_1-5][a2112h-1b_1-5_4*OSO/3=O/3=O]/1-2-3/a3-b1_b4-c1",2 +"WURCS=2.0/3,3,2/[u2112h_6*OSO/3=O/3=O][a2112h-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3/a3-b1_b4-c1",2 +"WURCS=2.0/3,3,2/[u2122A][a2112h-1b_1-5_2*NCC/3=O][a2122A-1b_1-5]/1-2-3/a4-b1_b3-c1",6 +"WURCS=2.0/3,3,2/[u2122A][a2122h-1a_1-5_2*NCC/3=O][a2122A-1b_1-5]/1-2-3/a4-b1_b4-c1",39 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5_3*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O_3*OSO/3=O/3=O]/1-2-3/a4-b1_b4-c1",5 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1a_1-5][a2112h-1b_1-5]/1-2-3/a3-b1_b2-c1",15 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3/a3-b1_b3-c2",1038 +"WURCS=2.0/3,3,2/[u222h][a2112h-1a_1-5_2*NCC/3=O][a222h-1b_1-4]/1-2-3/a2-b1_b3-c1",13 +"WURCS=2.0/3,4,3/[Aad1122h-2a_2-6][a11221h-1a_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-2-3/a5-b1_b3-c1_c2-d1",52 +"WURCS=2.0/3,4,3/[Aad21122h-2b_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-3/a8-b1_b3-c1_c6-d1",10 +"WURCS=2.0/3,4,3/[a1122h-1a_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-1-2-3/a3-b1_b3-c1_c3-d1",38 +"WURCS=2.0/3,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3/a3-b1_a6-d2_b3-c2",3 +"WURCS=2.0/3,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_a6-c1_c3-d1",447 +"WURCS=2.0/3,4,3/[a2122h-1a_1-5][a2122h-1b_1-5][a2211m-1a_1-5]/1-1-2-3/a2-b1_b4-c1_c3-d1",52 +"WURCS=2.0/3,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O][a1122h-1a_1-5]/1-2-3-3/a4-b1_b4-c1_c3-d1",1 +"WURCS=2.0/3,4,3/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b3-c1_c3-d1",76 +"WURCS=2.0/3,4,3/[a2122h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-3/a4-b1_a6-c1_c3-d2",1 +"WURCS=2.0/3,4,3/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-3/a4-b1_b4-c1_c6-d2",479 +"WURCS=2.0/3,4,3/[u2112h][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-2/a4-b1_b3-c1_c4-d1",2 +"WURCS=2.0/3,4,3/[u2112h_2*NCC/3=O][a2122A-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_b4-c1_c3-d1",9 +"WURCS=2.0/3,4,3/[u2112h_2*NCC/3=O_3*OCC/3=O][a2112h-1a_1-5_2*NCC/3=O_3*OCC/3=O][a2112h-1a_1-5_2*NCC/3=O_3*OCC/3=O_4*OCC/3=O]/1-2-2-3/a4-b1_b4-c1_c4-d1",14 +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*N]/1-2-2-3/a4-b1_b3-c1_c4-d1",6 +"WURCS=2.0/3,4,3/[u2122h][a2122A-1b_1-5][a2122h-1b_1-5]/1-2-3-2/a4-b1_b3-c1_c4-d1",14 +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1a_1-5][a1221m-1a_1-5]/1-2-3-2/a4-b1_b2-c1_b3-d1",15 +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3/a4-b1_b3-c2_c8-d2",588 +"WURCS=2.0/3,5,4/[a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1a_1-5_6*OPO/3O/3=O]/1-2-2-2-3/a2-b1_b3-c1_c3-d1_d3-e1",13 +"WURCS=2.0/3,5,4/[a2122h-1a_1-5][a2112h-1a_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-1-1-3/a3-b1_b2-c1_b3-e1_c2-d1",70 +"WURCS=2.0/3,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-2-3-3/a4-b1_b3-c1_c4-d1_d3-e1",9 +"WURCS=2.0/3,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][a2212h-1b_1-5]/1-2-2-2-3/a6-b1_b6-c1_c6-d1_d6-e1",587 +"WURCS=2.0/3,5,4/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3/a3-b1_a6-c1_c4-d1_d3-e1",588 +"WURCS=2.0/3,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2-3/a6-b1_b4-c1_c6-d1_d4-e1",286 +"WURCS=2.0/3,5,4/[u2112h_4*OSO/3=O/3=O][a2112h-1a_1-5][a2112h-1b_1-5_4*OSO/3=O/3=O]/1-2-3-2-3/a3-b1_b4-c1_c3-d1_d4-e1",2 +"WURCS=2.0/3,5,4/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3/a4-b1_b2-c1_b3-e1_c2-d1",9 +"WURCS=2.0/3,6,5/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2/a4-b1_b4-c1_c3-d1_d4-e1_e3-f1",70 +"WURCS=2.0/3,6,5/[u2112h_2*NCC/3=O][a2122A-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1",9 +"WURCS=2.0/3,6,5/[u2112h_6*OSO/3=O/3=O][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1",1 +"WURCS=2.0/3,6,5/[u211h][a211h-1a_1-4][a1122h-1a_1-5]/1-2-2-3-2-3/a5-b1_b3-c1_b5-e1_c5-d1_e5-f1",14 +"WURCS=2.0/3,7,6/[u2112h][a2112h-1a_1-5][a2112h-1b_1-5]/1-2-3-2-3-2-3/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1_f4-g1",2 +"WURCS=2.0/3,8,7/[u2112h_2*OSO/3=O/3=O][a2112h-1b_1-5_4*OSO/3=O/3=O][a2112h-1a_1-5_2*OSO/3=O/3=O]/1-2-3-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1",2 +"WURCS=2.0/3,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-3-2-3/a4-b1_b3-c1_b6-f1_c4-d1_d3-e1_f4-g1_g3-h1",11 +"WURCS=2.0/3,9,8/[u2112h][a2112h-1a_1-5][a2112h-1b_1-5]/1-2-3-2-3-2-3-2-3/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1_f4-g1_g3-h1_h4-i1",2 +"WURCS=2.0/3,9,8/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-3-3/a4-b1_b3-c1_c4-d1_d3-e1_d6-i1_e4-f1_f3-g1_f6-h1",4 +"WURCS=2.0/3,9,8/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3/a4-b1_b3-c1_c4-d1_d3-e1_d6-i1_e4-f1_f3-g1_g4-h1",9 +"WURCS=2.0/4,10,9/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-3-2-4-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_d6-h1_e4-f1_f2-g1_h4-i1_i2-j1",4 +"WURCS=2.0/4,10,9/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-3-2-3-2-3/a4-b1_b3-c1_b6-f1_c4-d1_d6-e2_f4-g1_g3-h1_h4-i1_i3-j1",5 +"WURCS=2.0/4,10,9/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-3-4-2-3-2-4/a4-b1_b3-c1_b6-e1_c3-d1_e3-f1_e4-g1_g3-h1_h3-i1_i2-j1",6 +"WURCS=2.0/4,10,9/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-3-2-3-4-2/a4-b1_b3-c1_b6-f1_c3-d1_c4-e1_f4-g1_g3-h1_h3-i1_h4-j1",5 +"WURCS=2.0/4,10,9/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-3-2-4-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_d6-h1_e4-f1_f3-g1_h4-i1_i3-j1",1 +"WURCS=2.0/4,10,9/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1a_1-5]/1-2-3-3-3-4-4-3-3-3/a4-b1_b3-c1_b6-h1_c2-d1_d2-e1_e3-f1_f3-g1_h3-i1_h6-j1",6 +"WURCS=2.0/4,11,10/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-4-2-3-2-4/a4-b1_b3-c1_b6-f1_c3-d1_c4-e1_f3-g1_f4-h1_h3-i1_i3-j1_i4-k1",4 +"WURCS=2.0/4,11,10/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-4-2-3-2-3-4/a3-b1_a6-g1_b4-c1_c3-d1_d4-e1_e3-f2_g4-h1_h3-i1_i4-j1_j3-k2",588 +"WURCS=2.0/4,11,10/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-3-2-3-2-3-4-2/a4-b1_b3-c1_b6-e1_c3-d1_e4-f1_f3-g1_f6-i1_g4-h1_i3-j1_i4-k1",5 +"WURCS=2.0/4,12,11/[u2211m][a2122h-1a_1-5_2*NCC/3=O][a2112h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-4-2-3-4-4-2-3-4/a3-b1_b3-c1_c2-d1_d3-e1_e3-f1_f3-g1_g2-h1_h3-i1_i3-j1_j3-k1_k2-l1",1 +"WURCS=2.0/4,13,12/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-3-2-3-2-3-2-4/a3-b1_a6-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m2",2 +"WURCS=2.0/4,13,12/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-3-2-3-2-4-3-2-4/a4-b1_b3-c1_b6-f1_c4-d1_d6-e2_f4-g1_g3-h1_g6-k1_h4-i1_i6-j2_k4-l1_l6-m2",11 +"WURCS=2.0/4,15,14/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-3-2-3-2-4-3-2-4-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_d6-m1_e4-f1_f3-g1_f6-j1_g4-h1_h3-i1_j4-k1_k3-l1_m4-n1_n3-o1",1 +"WURCS=2.0/4,17,16/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-3-2-4-2-4-3-2-4-2-4-2-4-2-4/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g4-h1_i2-j1_i6-n1_j4-k1_k3-l1_l4-m1_n4-o1_o3-p1_p4-q1",446 +"WURCS=2.0/4,20,19/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-3-2-3-2-3-2-4-3-2-4-3-2-4-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_d6-r1_e4-f1_f3-g1_f6-o1_g4-h1_h3-i1_h6-l1_i4-j1_j3-k1_l4-m1_m3-n1_o4-p1_p3-q1_r4-s1_s3-t1",1 +"WURCS=2.0/4,23,22/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-1-4-1-4-1-4-1-3-1-4-1-4-1-4-1-4-1/a4-b1_b4-c1_c3-d1_c6-n1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_n2-o1_o4-p1_p3-q1_q4-r1_r3-s1_s4-t1_t3-u1_u4-v1_v3-w1",447 +"WURCS=2.0/4,25,24/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-3-2-3-2-3-2-3-2-4-3-2-4-3-2-4-3-2-4-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_d6-w1_e4-f1_f3-g1_f6-t1_g4-h1_h3-i1_h6-q1_i4-j1_j3-k1_j6-n1_k4-l1_l3-m1_n4-o1_o3-p1_q4-r1_r3-s1_t4-u1_u3-v1_w4-x1_x3-y1",1 +"WURCS=2.0/4,4,3/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a6-b1_b4-c1_c3-d2",9 +"WURCS=2.0/4,4,3/[a2112h-1b_1-?_2*NCC/3=O][a2122h-1b_1-?][a2112h-1a_1-?_2*NCC/3=O][a2112h-1b_1-?]/1-2-3-4/a3-b1_b4-c1_c3-d1",6 +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*OCC/3=O_3*OCC/3=O_6*OCC/3=O][a2122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_6*OCC/3=O][a2122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O][a2122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1-2-3-4/a4-b1_b4-c1_c6-d1",39 +"WURCS=2.0/4,4,3/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a4-b1_b4-c1_c3-d2",70 +"WURCS=2.0/4,4,3/[u2112h][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-4/a2-b1_a3-c1_c4-d1",4 +"WURCS=2.0/4,4,3/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4/a3-b1_b3-c1_b4-d1",3 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-4/a6-b1_b3-c1_c3-d1",13 +"WURCS=2.0/4,5,4/[a2112h-1x_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-4/a3-b1_b3-c1_b4-e1_c2-d1",103 +"WURCS=2.0/4,5,4/[a2112h-1x_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-2-3-4/a3-b1_a6-c1_c4-d1_d3-e1",24 +"WURCS=2.0/4,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-4/a3-b1_a6-e1_b2-c1_b4-d1",19 +"WURCS=2.0/4,5,4/[a2122h-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2/a4-b1_b6-c1_c3-d1_c4-e1",2 +"WURCS=2.0/4,5,4/[a2122h-1a_1-5_2*NSO/3=O/3=O_6*OSO/3=O/3=O][a2121A-1a_1-5_2*OSO/3=O/3=O][a2122h-1a_1-5_2*N_3*OSO/3=O/3=O][a2122A-1b_1-5]/1-2-3-4-1/a4-b1_b4-c1_c4-d1_d4-e1",14 +"WURCS=2.0/4,5,4/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b4-c1_c3-d1_d3-e1",70 +"WURCS=2.0/4,5,4/[u1221m_3*OCC/3=O_4*OCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5_3*OCC/3=O_4*OCC/3=O]/1-2-2-3-4/a2-b1_b3-c1_c3-d1_d2-e1",13 +"WURCS=2.0/4,5,4/[u2112h][a2112h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5][a2112h-1a_1-5]/1-2-2-3-4/a3-b1_a4-c1_c3-d1_d6-e1",13 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b4-c1_c3-d1_c6-e2",59 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*N]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e2",20 +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d3-e2",289 +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b3-c2_b4-d1_d3-e1_e3-f2",9 +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-4-2/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1",3 +"WURCS=2.0/4,6,5/[u2122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2122h-1a_1-5]/1-2-3-2-4-4/a2-b1_b3-c1_c3-d1_c4-e1_e6-f1",13 +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4/a4-b1_b4-c1_c3-d1_d3-e1_d6-f1",10 +"WURCS=2.0/4,6,5/[u2211m][a2122h-1a_1-5_2*NCC/3=O_6*OCC/3=O][a2122h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-4-4/a2-b1_b3-c1_c2-d1_d2-e1_e2-f1",13 +"WURCS=2.0/4,6,5/[u2211m][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-2-3-2-4/a3-b1_b2-c1_c2-d1_d3-e1_d4-f1",13 +"WURCS=2.0/4,6,5/[u222h][a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a222h-1b_1-4]/1-2-3-2-3-4/a2-b1_b3-c1_c4-d1_d4-e1_e4-f1",13 +"WURCS=2.0/4,7,6/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122A-1b_1-5]/1-2-3-4-2-3-4/a2-b1_a6-e1_b4-c1_c3-d1_e4-f1_f3-g1",2 +"WURCS=2.0/4,7,6/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-4/a3-b1_a6-c1_c4-d1_d3-e1_e4-f1_f3-g2",447 +"WURCS=2.0/4,7,6/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-2-4/a3-b1_b3-c1_c4-d1_d2-e1_d4-f1_f2-g1",39 +"WURCS=2.0/4,7,6/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-3-4/a3-b1_a6-e1_b4-c1_c2-d1_e4-f1_f2-g1",15 +"WURCS=2.0/4,7,6/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-3-4/a3-b1_a6-e1_b4-c1_c3-d1_e4-f1_f3-g1",15 +"WURCS=2.0/4,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-3-3-4/a4-b1_b3-c2_b4-g1_c8-d2_d8-e2_e8-f2",479 +"WURCS=2.0/4,7,6/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d6-e1_e4-f1_f2-g1",4 +"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-2/a3-b1_a6-f1_b3-c1_c4-d1_d2-e1_f4-g1",14 +"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-3-4/a3-b1_a6-e1_b4-c1_c3-d2_e4-f1_f3-g2",633 +"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-3-4/a3-b1_a6-e1_b3-c1_c2-d1_e3-f1_f2-g1",633 +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-3-2-3/a4-b1_b2-c1_b3-d1_d3-e1_d4-f1_f2-g1",11 +"WURCS=2.0/4,7,6/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-2/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f2-g1",59 +"WURCS=2.0/4,8,7/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-1-4-2-3-1/a3-b1_a6-e1_b3-c2_b4-d1_e4-f1_f3-g2_f4-h1",15 +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-3-2-4/a4-b1_b3-c1_c3-d1_c4-e1_e3-f1_f3-g1_f4-h1",5 +"WURCS=2.0/4,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-e1_e3-f1_e6-h1_f2-g1",35 +"WURCS=2.0/4,9,8/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-1-2-3-4-1/a3-b1_a6-f1_b4-c1_c2-d1_c3-e1_f4-g1_g2-h1_g3-i1",15 +"WURCS=2.0/4,9,8/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i1",70 +"WURCS=2.0/4,9,8/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-4-4/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g3-h1_g6-i1",33 +"WURCS=2.0/4,9,8/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-4-2-3/a3-b1_a4-c1_c4-d1_d3-e1_d4-f1_f4-g1_g3-h1_g4-i1",573 +"WURCS=2.0/5,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1_i6-j2",476 +"WURCS=2.0/5,10,9/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-2-3-2-3-5/a4-b1_b3-c1_b6-j2_c4-d1_d3-e1_e4-f1_f3-g1_f6-i1_g4-h1",9 +"WURCS=2.0/5,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1a_1-5_6*OPO/3O/3=O]/1-2-3-4-4-4-4-4-4-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e2-f1_g3-h1_g6-i1_i2-j1",2 +"WURCS=2.0/5,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-2-5-2-4-4/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_d4-f1_f4-g1_i3-j1",9 +"WURCS=2.0/5,11,10/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1a_1-5]/1-2-3-2-2-3-2-4-3-2-5/a4-b1_b3-c1_c4-d1_d3-e1_d6-i1_e3-f1_f4-g1_g3-h2_i4-j1_j3-k1",10 +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-1-3-1-4-5-1/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1_g6-k1_h4-i1_i6-j2",1 +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f4-g1_h2-i1_i4-j1_j4-k1",472 +"WURCS=2.0/5,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-2-4-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1_g6-j1_h4-i1_j4-k1",7 +"WURCS=2.0/5,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-5-4-2-5-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g1_h2-i1_i4-j1_j3-k1",303 +"WURCS=2.0/5,12,11/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-3-4-2-3-2-5/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g3-h1_g4-i1_i3-j1_j4-k1_k3-l2",16 +"WURCS=2.0/5,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-4-5-5/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",479 +"WURCS=2.0/5,12,11/[h2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-4-2-5-5-4-5-2/a3-b1_a6-d1_b3-c2_d4-e1_e3-f1_e6-j1_f3-g1_f4-i1_g2-h1_j3-k1_j4-l1",2 +"WURCS=2.0/5,12,11/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-3-4-2-3-4-2-5/a3-b1_b3-c1_c3-d1_c4-e1_e3-f1_f3-g1_f4-h1_h3-i1_i3-j1_i4-k1_k3-l2",2 +"WURCS=2.0/5,12,11/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-5-2-3-5-2-5/a4-b1_b3-c1_b6-f1_c4-d1_d6-e2_f3-g1_f4-h1_h3-i1_i3-j1_i4-k1_k2-l1",5 +"WURCS=2.0/5,13,12/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-2-3-5-2-3-5-2/a4-b1_b3-c1_b6-f1_c4-d1_d6-e2_f4-g1_g3-h1_g6-k1_h3-i1_h4-j1_k3-l1_k4-m1",11 +"WURCS=2.0/5,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-4-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g3-h1_i2-j1_j4-k1_k3-l1_l3-m1",587 +"WURCS=2.0/5,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1a_1-5]/1-2-3-4-4-4-5-5-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e2-f1_f3-g1_g3-h1_i3-j1_i6-l1_j2-k1_l2-m1",4 +"WURCS=2.0/5,14,13/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-2-3-2-3-2-4-5-3-2-4-5/a4-b1_b3-c1_c4-d1_d3-e1_d6-k1_e4-f1_f3-g1_g4-h1_h2-i1_h3-j1_k4-l1_l2-m1_l3-n1",4 +"WURCS=2.0/5,14,13/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-5-5-3-1-4-5-5-5/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-h1_f2-g1_i2-j1_j3-k1_j4-m1_k2-l1",9 +"WURCS=2.0/5,14,13/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-4-2-5-2-2-5-2/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g1_h2-i1_h6-l1_i4-j1_j3-k1_l4-m1_m3-n1",447 +"WURCS=2.0/5,14,13/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-4-2-5-2-5/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_d4-g1_e4-f1_g4-h1_j2-k1_j6-m1_k4-l1_m4-n1",472 +"WURCS=2.0/5,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-1-4-5-3-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o2",389 +"WURCS=2.0/5,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-5-3-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h2-i1_j2-k1_k4-l1_l3-m1_m4-n1_n2-o1",447 +"WURCS=2.0/5,15,14/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-3-4-2-3-4-2-3-4-2-5/a4-b1_b3-c1_c3-d1_c4-e1_e3-f1_f3-g1_f4-h1_h3-i1_i3-j1_i4-k1_k3-l1_l3-m1_l4-n1_n3-o2",39 +"WURCS=2.0/5,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4-2-5-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_g6-j1_h4-i1_j4-k1_k3-l1_l4-m1_m3-n1_n4-o1",9 +"WURCS=2.0/5,16,15/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-3-1-4-1-4-1-5/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1",447 +"WURCS=2.0/5,17,16/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-3-1-5-4-1-5-4-5/a4-b1_a6-q1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_d4-g1_e4-f1_g4-h1_j2-k1_j6-n1_k3-l1_k4-m1_n3-o1_n4-p1",14 +"WURCS=2.0/5,17,16/[u2112h_2*NCC/3=O][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-4-3-4-5-2-3-4-3-4-3-4-5/a3-b1_a6-j1_b2-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1_o4-p1_p3-q2",576 +"WURCS=2.0/5,17,16/[u2112h_2*NCC/3=O][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-4-3-4-5-2-3-4-3-4-3-4-5/a3-b1_a6-j1_b2-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h6-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1_o4-p1_p6-q2",576 +"WURCS=2.0/5,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-5-4-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_k2-l1_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1",589 +"WURCS=2.0/5,19,18/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-1-4-1-4-5-3-1-4-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s2",447 +"WURCS=2.0/5,22,21/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-1-4-3-1-4-1-4-1-4-1-4-5/a4-b1_a6-v1_b4-c1_c3-d1_c6-m1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_m2-n1_n4-o1_o3-p1_p4-q1_q3-r1_r4-s1_s3-t1_t4-u1",446 +"WURCS=2.0/5,27,26/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-1-3-1-4-1-4-1-4-1-1-4-1-4-1-4-1-5/a4-b1_a6-A1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_l2-m1_l6-t1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s1_t4-u1_u3-v1_v4-w1_w3-x1_x4-y1_y3-z1",446 +"WURCS=2.0/5,36,35/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-1-4-1-4-3-1-4-1-4-1-4-1-4-1-4-1-4-1-4-1-4-1-4-1-4-5/a4-b1_a6-J1_b4-c1_c3-d1_c6-o1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_o2-p1_o6-z1_p4-q1_q3-r1_r4-s1_s3-t1_t4-u1_u3-v1_v4-w1_w3-x1_x4-y1_z4-A1_A3-B1_B4-C1_C3-D1_D4-E1_E3-F1_F4-G1_G3-H1_H4-I1",443 +"WURCS=2.0/5,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-5/a6-b1_b4-c1_c3-d2_c4-e1",54 +"WURCS=2.0/5,5,4/[a2122h-1a_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112m-1a_1-5_3*NCC/3=O]/1-2-3-4-5/a4-b1_b3-c1_b4-e1_c3-d1",587 +"WURCS=2.0/5,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-5/a4-b1_b3-c2_b4-e1_c8-d2",70 +"WURCS=2.0/5,5,4/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a4-b1_b3-c1_c3-d1_d3-e1",103 +"WURCS=2.0/5,5,4/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-5/a4-b1_a6-e1_b4-c1_c6-d1",14 +"WURCS=2.0/5,5,4/[a2122m-1a_1-5][a212h-1b_1-5][a2122m-1b_1-5][a2112h-1b_1-5][a2112m-1b_1-5]/1-2-3-4-5/a3-b1_b2-c1_b4-d1_d2-e1",14 +"WURCS=2.0/5,5,4/[u1122h][a2122h-1a_1-5_2*NCC/3=O][a2122m-1a_1-5_2*NCC/3=O][a2122h-1a_1-5][a1122h-1b_1-5]/1-2-3-4-5/a2-b1_b3-c1_c3-d1_d4-e1",13 +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5][a1122h-1b_1-5][a1221m-1a_1-5_3*NC=O]/1-2-3-4-5/a2-b1_a3-e1_b3-c1_c3-d1",13 +"WURCS=2.0/5,5,4/[u1122m_4*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5][a1221m-1a_1-5][a1122m-1a_1-5_4*NCC/3=O]/1-2-3-4-5/a2-b1_b3-c1_c4-d1_d3-e1",13 +"WURCS=2.0/5,5,4/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2211m-1a_1-5][a2122h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-4-5/a2-b1_b3-c1_c4-d1_d3-e1",13 +"WURCS=2.0/5,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3-4-5/a4-b1_b3-c1_c3-d1_c4-e1",5 +"WURCS=2.0/5,5,4/[u2122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-3-4-5/a2-b1_b3-c1_c3-d1_d6-e1",13 +"WURCS=2.0/5,5,4/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2112h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5]/1-2-3-4-5/a3-b1_b4-c1_c3-d1_c4-e1",13 +"WURCS=2.0/5,5,4/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_c4-d1_d3-e2",21 +"WURCS=2.0/5,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2212h-1b_1-5]/1-2-3-4-5-4/a4-b1_b3-c2_b4-d1_d3-e1_e4-f1",1 +"WURCS=2.0/5,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-5/a4-b1_b4-c1_c3-d1_d3-e1_e3-f1",587 +"WURCS=2.0/5,6,5/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5/a4-b1_b3-c1_c3-d1_d3-e1_e2-f1",103 +"WURCS=2.0/5,6,5/[u1122h][a1221m-1a_1-5][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1a_1-5]/1-2-3-4-2-5/a3-b1_a4-d1_b2-c1_d3-e1_e3-f1",13 +"WURCS=2.0/5,6,5/[u2112h][a1221m-1a_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-4-4-5/a2-b1_a3-c1_c2-d1_d3-e1_e3-f1",13 +"WURCS=2.0/5,6,5/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-3-5/a3-b1_b3-c1_b4-d1_d2-e1_d3-f1",727 +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5/a4-b1_b3-c1_c6-d1_d4-e1_e3-f2",9 +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2-4-5/a4-b1_b3-c1_c4-d1_d4-e1_e3-f1",845 +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-5/a3-b1_a4-c1_c3-d1_d4-e1_e3-f2",1027 +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-3-4-5-4/a3-b1_b3-c1_c3-d1_c4-e1_e6-f1",13 +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-5/a4-b1_b3-c1_b6-f2_c4-d1_d3-e1",9 +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2211m-1a_1-5_2*OCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-3-3-4-5/a3-b1_b3-c1_c2-d1_d2-e1_d3-f1",13 +"WURCS=2.0/5,6,5/[u2211m][a1122h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-5-5/a2-b1_a3-c1_c3-d1_d2-e1_e2-f1",13 +"WURCS=2.0/5,7,6/[u1122h][a2122h-1a_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1a_1-5]/1-2-3-4-4-5-5/a6-b1_b3-c1_c2-d1_c3-g1_d2-e1_d4-f1",13 +"WURCS=2.0/5,7,6/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-5-2-3/a3-b1_a6-d1_b3-c2_d3-e1_d4-f1_f3-g2",754 +"WURCS=2.0/5,7,6/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-5/a3-b1_a6-d1_b6-c2_d4-e1_e3-f2_e4-g1",14 +"WURCS=2.0/5,8,7/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-5-2-3-4/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1_e6-h2_f3-g2",3 +"WURCS=2.0/5,8,7/[a2122h-1b_1-5_2*NCC/3=O][a2112m-1a_1-5][a1122h-1b_1-5][a212h-1a_1-5][a1122h-1a_1-5]/1-2-1-3-4-5-5-1/a3-b1_a4-c1_c4-d1_d2-e1_d3-f1_d6-g1_g2-h1",9 +"WURCS=2.0/5,8,7/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-3-2-5/a4-b1_b3-c1_b6-f1_c3-d1_d2-e1_f4-g1_g6-h2",447 +"WURCS=2.0/5,9,8/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5-2-3-4-5/a3-b1_a6-f1_b4-c1_c2-d1_d3-e1_f4-g1_g2-h1_h3-i1",380 +"WURCS=2.0/5,9,8/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-4-3-5-2/a4-b1_b3-c1_b6-g1_c3-d1_c6-f2_d3-e2_g3-h1_g4-i1",456 +"WURCS=2.0/5,9,8/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a2112h-1b_1-5][a1122h-1a_1-5]/1-2-3-2-4-5-2-4-2/a4-b1_b4-c1_c2-d1_c3-f1_c4-i1_d4-e1_f2-g1_g4-h1",29 +"WURCS=2.0/5,9,8/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2-4-5-3-2-4/a3-b1_a6-g1_b3-c1_c4-d1_d3-e2_d4-f1_g4-h1_h3-i2",14 +"WURCS=2.0/5,9,8/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5-2-3-4-5/a3-b1_a6-f1_b4-c1_c2-d1_c3-e1_f4-g1_g2-h1_g3-i1",698 +"WURCS=2.0/5,9,8/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-3-2-5/a4-b1_b3-c1_b6-g1_c3-d1_c4-e1_e2-f1_g4-h1_h6-i2",633 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-5-5-5-5-2/a3-b1_a4-c1_a6-i1_c4-d1_d3-e1_d6-f1_f3-g1_f6-h1",10 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1a_1-5][a2112h-1b_1-5][a1122h-1b_1-5_2*NCC/3=O]/1-2-3-3-2-4-5-3-2/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_e4-f1_h2-i1",2 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-4-2-2-5/a4-b1_a6-i1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_f6-h1",638 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4-2-5-4-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",7 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3-4-2-5-4-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",7 +"WURCS=2.0/6,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O_4*OSO/3=O/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-3-1-5-6/a4-b1_a6-j1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",10 +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-3-2-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1",4 +"WURCS=2.0/6,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-6-6/a4-b1_a6-k1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i3-j1",9 +"WURCS=2.0/6,11,10/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",2 +"WURCS=2.0/6,11,10/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f3-g2_h2-i1_i3-j1_j3-k2",450 +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-5-3-5-3-6-2-6/a3-b1_a4-c1_a6-j1_c4-d1_d3-e1_d6-g1_e2-f1_g2-h1_h4-i1_j4-k1",2 +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O_9*OCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",9 +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*OCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j3-k2",9 +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*OCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",9 +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j3-k2",7 +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-5-4/a4-b1_a6-l1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g6-h2_i2-j1_j4-k1",47 +"WURCS=2.0/6,12,11/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-4-2-5-6/a4-b1_a6-l1_b4-c1_c3-d1_c4-g1_c6-i1_d2-e1_e4-f1_g4-h1_i2-j1_j4-k1",447 +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e4-f1_f3-g2_i2-j1_j4-k1_k3-l2",1 +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-4-2/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f3-g2_h4-i1_i3-j2_k6-l1",6 +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6-6/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f2-g1_h2-i1_i3-j1_j2-k1",727 +"WURCS=2.0/6,13,12/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f2-g1_f3-h1_i2-j1_j3-k1_k2-l1_k3-m1",479 +"WURCS=2.0/6,13,12/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-6-5-4-2-5-6/a4-b1_a6-m1_b4-c1_c3-d1_c6-j1_d2-e1_d4-g1_e4-f1_g3-h1_g4-i1_j2-k1_k4-l1",10 +"WURCS=2.0/6,13,12/[h2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_d4-h1_e4-f1_f3-g2_h4-i1_j2-k1_k4-l1_l3-m2",1 +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-4-2-5-6-2/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h1_i2-j1_j3-k1_j4-l1_l3-m1",3 +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-5-4-2-5-6-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f4-g1_g2-h1_i2-j1_j3-k1_j4-l1_l2-m1",1 +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-6-4-2-5-6-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g2_g8-h2_i2-j1_j4-k1_k3-l2_l8-m2",3 +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-6-6-4-2-5-6-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g2_g8-h2_i2-j1_j4-k1_k3-l2_l8-m2",3 +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-4-2-5-2-6/a4-b1_a6-m1_b4-c1_c3-d1_c6-i1_d2-e1_d4-g1_e4-f1_g4-h1_i2-j1_i6-l1_j4-k1",7 +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-6-5-2-5-4-2/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g3-h1_g4-i1_i3-j1_j4-k1_l2-m1",9 +"WURCS=2.0/6,14,13/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-4-5-6-3-1-5-6-1-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f3-g2_h2-i1_h6-l1_i4-j1_j3-k2_l3-m1_m3-n2",38 +"WURCS=2.0/6,14,13/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-1-2-3-1-4-5-6-3-1-4-5-6-5/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f2-g1_f3-h1_i2-j1_j4-k1_k2-l1_k3-m1",476 +"WURCS=2.0/6,14,13/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e3-f1_e4-g1_h3-i1_h4-j1_k2-l1_l3-m1_l4-n1",39 +"WURCS=2.0/6,14,13/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f3-g2_h4-i1_i3-j2_k2-l1_l4-m1_m3-n2",1 +"WURCS=2.0/6,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f6-g2_h4-i1_i3-j2_k2-l1_l4-m1_m3-n2",28 +"WURCS=2.0/6,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-1-4-5-3-1-4-5-6/a4-b1_a6-o1_b4-c1_c3-d1_c6-k1_d2-e1_d6-h1_e4-f1_f6-g2_h4-i1_i6-j2_k2-l1_l4-m1_m3-n2",49 +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e3-f1_f3-g2_i2-j1_i6-m1_j3-k1_k3-l2_m3-n1_n3-o2",1 +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j2-k1_l2-m1_m4-n1_n2-o1",9 +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1",3 +"WURCS=2.0/6,16,15/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-6-4-2-6-2-5-6-5/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_d4-h1_e3-f1_e4-g1_h4-i1_j2-k1_j6-m1_k4-l1_m3-n1_m4-o1",16 +"WURCS=2.0/6,17,16/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d6-h1_e4-f1_f6-g2_h4-i1_i6-j2_k2-l1_k4-o1_l4-m1_m6-n2_o4-p1_p3-q2",19 +"WURCS=2.0/6,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-6-2-4-2-5-6-2-6-2/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_e3-f1_e4-g1_g3-h1_h4-i1_i3-j1_k2-l1_l3-m1_l4-n1_n3-o1_o4-p1_p3-q1",3 +"WURCS=2.0/6,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1_o4-p1_p3-q2",5 +"WURCS=2.0/6,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-6-6-4-2-5-2-5-6-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_e4-f1_f3-g1_f6-j2_g4-h1_h3-i2_k2-l1_l4-m1_m3-n1_m6-q2_n4-o1_o3-p2",3 +"WURCS=2.0/6,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-2-5-6-6-4-2-5-2-5-6-6/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_e4-f1_f3-g1_f6-j2_g4-h1_h6-i2_k2-l1_l4-m1_m3-n1_m6-q2_n4-o1_o6-p2",3 +"WURCS=2.0/6,18,17/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-1-2-3-1-4-5-1-4-3-1-6-4-5-5-1-4-5/a4-b1_a6-r1_b4-c1_c3-d1_c6-j1_d2-e1_d3-g1_d4-h1_e4-f1_h4-i1_j2-k1_j3-o1_j6-p1_k4-l1_l3-m1_m2-n1_p4-q1",587 +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_l6-p1_m4-n1_n3-o2_p4-q1_q3-r2",9 +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-2-5-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_h6-p1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_n3-o2_p4-q1_q3-r2",9 +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_h6-l1_i4-j1_j3-k2_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1_q3-r2",9 +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_h6-l1_i4-j1_j6-k2_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1_q6-r2",9 +"WURCS=2.0/6,19,18/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-6-2-6-4-2-5-6-2-6-2-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e3-f1_e4-g1_g3-h1_h4-i1_i3-j1_j4-k1_l2-m1_m3-n1_m4-o1_o3-p1_p4-q1_q3-r1_r4-s1",3 +"WURCS=2.0/6,19,18/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s2",7 +"WURCS=2.0/6,19,18/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r3-s1",3 +"WURCS=2.0/6,21,20/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-5-6-2-6-4-2-5-6-2-5-6-2-6/a4-b1_b4-c1_c3-d1_c6-m1_d2-e1_e3-f1_e4-g1_g3-h1_h3-i1_h4-j1_j3-k1_k4-l1_m2-n1_n3-o1_n4-p1_p3-q1_q3-r1_q4-s1_s3-t1_t4-u1",3 +"WURCS=2.0/6,21,20/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-6-2-6-2-4-2-5-6-2-6-2-6-2/a4-b1_b4-c1_c3-d1_c6-m1_d2-e1_e3-f1_e4-g1_g3-h1_h4-i1_i3-j1_j4-k1_k3-l1_m2-n1_n3-o1_n4-p1_p3-q1_q4-r1_r3-s1_s4-t1_t3-u1",3 +"WURCS=2.0/6,23,22/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-5-6-2-5-6-4-2-5-6-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c6-n1_d2-e1_e3-f1_e4-g1_g3-h1_h3-i1_h4-j1_j3-k1_k3-l1_k4-m1_n2-o1_o3-p1_o4-q1_q3-r1_r3-s1_r4-t1_t3-u1_u3-v1_u4-w1",3 +"WURCS=2.0/6,23,22/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-6-2-6-2-6-4-2-5-6-2-6-2-6-2-6/a4-b1_b4-c1_c3-d1_c6-n1_d2-e1_e3-f1_e4-g1_g3-h1_h4-i1_i3-j1_j4-k1_k3-l1_l4-m1_n2-o1_o3-p1_o4-q1_q3-r1_r4-s1_s3-t1_t4-u1_u3-v1_v4-w1",3 +"WURCS=2.0/6,23,22/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6/a4-b1_b4-c1_c3-d1_c6-p1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_n6-o2_p2-q1_q4-r1_r3-s1_s4-t1_t3-u1_u4-v1_v6-w2",9 +"WURCS=2.0/6,6,5/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-4][a1122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5][a2112h-1a_1-4]/1-2-3-4-5-6/a2-b1_a4-f1_b3-c1_c6-d1_d3-e1",13 +"WURCS=2.0/6,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*N][a1221m-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O][Aad21122h-2a_2-6_5*N]/1-2-3-4-5-6/a4-b1_b3-c1_c3-d1_c4-e1_e3-f2",20 +"WURCS=2.0/6,6,5/[u2122m_3*N][a2112h-1a_1-5_2*N][a2112h-1b_1-5][a2211m-1a_1-5][a2122m-1a_1-5_3*N][a2122h-1b_1-5]/1-2-3-4-5-6/a4-b1_b3-c1_b4-f1_c4-d1_d3-e1",13 +"WURCS=2.0/6,7,6/[a1211h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2211h-1b_1-5][a1122h-1a_1-5][a2211h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-5-1-6/a4-b1_b4-c1_c3-d1_c6-e1_e2-f1_f4-g1",9 +"WURCS=2.0/6,7,6/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6/a4-b1_a6-g1_b4-c1_c6-d1_d6-e1_e4-f1",7 +"WURCS=2.0/6,7,6/[u2112h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a1122h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-3-2-4-5-6/a3-b1_a4-c1_c3-d1_c4-g1_d3-e1_e6-f1",13 +"WURCS=2.0/6,7,6/[u2112h_2*N][a1221m-1a_1-5][a2112h-1b_1-5][a1122h-1a_1-5_2*N][a2112h-1a_1-5_2*N][a2122h-1b_1-5]/1-2-3-2-4-5-6/a3-b1_a4-c1_c3-d1_c4-g1_d3-e1_e6-f1",13 +"WURCS=2.0/6,7,6/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-2-6/a4-b1_b3-c1_c4-d1_d3-e1_d4-f1_f3-g2",9 +"WURCS=2.0/6,7,6/[u2122h_2*N_3*N][a2122h-1b_1-5_2*N_3*N_4*OPO/3O/3=O][Aad1122h-2a_2-6][a2112A-1a_1-5][a1122h-1a_1-5][a2122h-1b_1-5_2*N]/1-2-3-3-4-5-6/a6-b1_b6-c2_c4-d2_c5-f1_d5-e1_f3-g1",14 +"WURCS=2.0/6,7,6/[u2211m][a2122h-1a_1-5][a2211m-1b_1-5][a2112m-1a_1-5_2*NCC/3=O][a2112h-1a_1-5][a2211m-1a_1-5]/1-2-3-4-5-6-6/a3-b1_a4-c1_c3-d1_d3-e1_e3-f1_f2-g1",13 +"WURCS=2.0/6,8,7/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-5-2-4-6/a2-b1_a6-f1_b3-c1_b4-d1_d3-e2_f4-g1_g3-h2",6 +"WURCS=2.0/6,8,7/[u2112h][a2122h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-3-4-5-6-5/a2-b1_a3-d1_a4-e1_b2-c1_e3-f1_f4-g1_g3-h1",13 +"WURCS=2.0/6,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5]/1-2-3-4-5-4-2-6/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1",7 +"WURCS=2.0/6,9,8/[Aad1122h-2a_2-6][a11221h-1a_1-5][a2122h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-2-3-2-4-5-6/a5-b1_b3-c1_b4-e1_c2-d1_e6-f1_f4-g1_g4-h1_h3-i2",1 +"WURCS=2.0/6,9,8/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-2-3-4-6/a2-b1_a6-f1_b3-c1_b4-d1_d3-e2_f3-g1_f4-h1_h3-i2",6 +"WURCS=2.0/7,11,10/[a1122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-7/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",10 +"WURCS=2.0/7,11,10/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-2-4-2/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_e3-f1_e4-g1_g3-h2_j2-k1",39 +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-6-7-4-4-4/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i3-j1_i6-k1",9 +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-7-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i3-j1_i4-k1",20 +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-6-7-4-5-6-7/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",7 +"WURCS=2.0/7,12,11/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a212h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-5-6-3-7-6-3-7-2/a3-b1_a4-c1_a6-l1_c4-d1_d2-e1_d3-f1_d6-i1_f2-g1_g4-h1_i2-j1_j4-k1",10 +"WURCS=2.0/7,13,12/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-h1_f3-g1_i2-j1_j3-k1_j4-m1_k3-l1",476 +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h1_i2-j1_j3-k1_j4-l1_l3-m1",846 +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g2_g8-h2_i2-j1_j4-k1_k3-l2_l8-m2",3 +"WURCS=2.0/7,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7-6/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f2-g1_f3-h1_i2-j1_j3-k1_k2-l1_k3-m1",698 +"WURCS=2.0/7,16,15/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-6-7/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o2",9 +"WURCS=2.0/7,16,15/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-6-7/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h6-i2_j2-k1_k4-l1_l3-m1_m4-n1_n6-o2",9 +"WURCS=2.0/7,17,16/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1a_1-5]/1-2-3-4-2-5-6-2-5-7-4-2-5-7-2-5-7/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f6-g2_h4-i1_i4-j1_k2-l1_k6-o1_l4-m1_m4-n1_o4-p1_p4-q1",9 +"WURCS=2.0/7,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-2-5-6-4-2-6-2-6-7/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_d4-i1_e3-f1_e4-g1_g3-h2_i3-j1_i4-k1_l2-m1_m4-n1_n3-o1_o4-p1_p6-q2",6 +"WURCS=2.0/7,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-2-5-2-7/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j6-k2_l2-m1_l6-n1_n4-o1_o3-p1_p3-q1",9 +"WURCS=2.0/7,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-2-5-2-6-5-2-5-7-2-5-2/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_f6-o1_g4-h1_h3-i1_i3-j1_i4-k1_k3-l1_l4-m1_m3-n2_o4-p1_p3-q1",9 +"WURCS=2.0/7,18,17/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-2-7-5-4-2-7-5-2-7-5-7/a4-b1_a6-r1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f6-g2_h3-i1_h4-j1_k2-l1_k6-o1_l3-m1_l4-n1_o3-p1_o4-q1",13 +"WURCS=2.0/7,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-4-2-5-2-5-2-5-6-2-5-2-7-5/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_f6-n1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m2_n4-o1_o3-p1_p3-q1_p4-r1",9 +"WURCS=2.0/7,19,18/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-2-5-6-7-4-2-5-6-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e3-f1_e4-g1_g3-h1_h3-i1_h4-j1_j3-k1_l2-m1_m3-n1_m4-o1_o3-p1_p3-q1_p4-r1_r3-s1",3 +"WURCS=2.0/7,20,19/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-2-5-6-4-2-5-2-5-6-2-5-6-7/a4-b1_a6-t1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f3-g2_h4-i1_i3-j2_k2-l1_k6-q1_l4-m1_m3-n1_n4-o1_o3-p2_q4-r1_r3-s2",7 +"WURCS=2.0/7,20,19/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-2-5-2-5-6-7/a4-b1_a6-t1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j6-k2_l2-m1_m4-n1_n3-o1_o4-p1_p3-q1_q4-r1_r6-s2",7 +"WURCS=2.0/7,23,22/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-2-5-6-2-6-7-4-2-5-6-2-5-6-2-6-7/a4-b1_b4-c1_c3-d1_c6-n1_d2-e1_e3-f1_e4-g1_g3-h1_h3-i1_h4-j1_j3-k1_k4-l1_l3-m1_n2-o1_o3-p1_o4-q1_q3-r1_r3-s1_r4-t1_t3-u1_u4-v1_v3-w1",3 +"WURCS=2.0/7,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-6-7/a4-b1_b4-c1_c3-d1_d2-e1_e3-f1_e4-g1_g3-h2",9 +"WURCS=2.0/7,9,8/[a2122h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112m-1a_1-5]/1-2-3-4-2-5-6-4-7/a4-b1_a6-i1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2",11 +"WURCS=2.0/8,12,11/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-7-8/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j3-k1",17 +"WURCS=2.0/9,14,13/[AUd1122h][Aa11122h-2a_2-6][a211h-1b_1-5_4*N][a11221h-1a_1-5][a2211m-1a_1-5][a2122m-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-3-4-4-5-6-5-7-8-9-4-9-4/a4-b2_a5-d1_b8-c1_d3-e1_d4-m1_e2-f1_e3-h1_e7-l1_f3-g1_h3-i1_i3-j1_j3-k1_m6-n1",14 diff --git a/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/manifest.json b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..36d571ee2ee23aac2f9741698d0026ce4ec5f0ed --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/manifest.json @@ -0,0 +1,70 @@ +{ + "job_id": "16608669", + "node": "nova23-7", + "source": "current reported-model probe per-row predictions", + "regimes": { + "glycan_cold": { + "cell": "affinose_mo_20260908_mo_A_glycan_s42", + "source_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mo_20260908_mo_A_glycan_s42.npz", + "source_bytes": 259358, + "source_sha256": "e54653e041ad8703f90fc2f4f5219bb7c94b60510d7ae30850ec2121c8747460", + "npz_keys": [ + "target", + "assay", + "protein", + "glycan", + "intact", + "reassigned", + "meanprot" + ], + "n_rows": 37295, + "n_glycans": 336, + "n_assays": 1767, + "assays_with_more_than_one_protein": 0, + "export_name": "glycan_cold_scored_glycans.csv", + "export_sha256": "0faab973a6ee5e5bf712983d51fad9f746e34edcbe5342574d45933bba62f48a" + }, + "protein_cold": { + "cell": "affinose_sa_20260908_mo_B_protein_s42", + "source_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_sa_20260908_mo_B_protein_s42.npz", + "source_bytes": 297081, + "source_sha256": "14273637bd49db1ef43d515fc74849b2d2d7894508d793ccf7fc24ac407ada53", + "npz_keys": [ + "target", + "assay", + "protein", + "glycan", + "intact", + "reassigned", + "meanprot" + ], + "n_rows": 38539, + "n_glycans": 826, + "n_assays": 246, + "assays_with_more_than_one_protein": 0, + "export_name": "protein_cold_scored_glycans.csv", + "export_sha256": "f35d6088903e993f46adee07806e577456599d9814f4f43e40efdf3d8ddf6c46" + }, + "doubly_cold": { + "cell": "affinose_mo_20260908_mo_C_doubly_s42", + "source_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mo_20260908_mo_C_doubly_s42.npz", + "source_bytes": 40363, + "source_sha256": "e6327a5d8f9bc584d6d04e0217fc1db118799bd295da6d8deee018ce6b849983", + "npz_keys": [ + "target", + "assay", + "protein", + "glycan", + "intact", + "reassigned", + "meanprot" + ], + "n_rows": 3691, + "n_glycans": 173, + "n_assays": 212, + "assays_with_more_than_one_protein": 0, + "export_name": "doubly_cold_scored_glycans.csv", + "export_sha256": "e5eebf2072779d7001dabd3981237025be37eee6f19a5b109b00ce4b3e776e09" + } + } +} diff --git a/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/protein_cold_exposure_join.csv b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/protein_cold_exposure_join.csv new file mode 100644 index 0000000000000000000000000000000000000000..91ad2bedc5194760220961f2e8e35bedf146e541 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/protein_cold_exposure_join.csv @@ -0,0 +1,827 @@ +canonical_wurcs,scored_rows,in_bpe_fit_partition,in_encoder_sequence_training +"WURCS=2.0/1,1,0/[AUd1122h_5*OPO/3O/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[AUd21122h_5*NCC/3=O_9*OCC/3=O]/1/",21,False,False +"WURCS=2.0/1,1,0/[AUd21122h_5*NCCO/3=O]/1/",23,False,False +"WURCS=2.0/1,1,0/[Aad21122h-2b_2-6_5*NCC/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[a1122h-1a_1-5]/1/",1,False,False +"WURCS=2.0/1,1,0/[a1122h-1a_1-5_2*OC(CCCCCC$4)/3=O_3*OC(CCCCCC$4)/3=O_4*F_6*OC(CCCCCC$4)/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[a1122h-1a_1-5_6*OPO/3O/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[a1122h-1b_1-5]/1/",1,False,False +"WURCS=2.0/1,1,0/[a1122h-1x_1-5_2*OC(CCCCCC$4)/3=O_3*OC(CCCCCC$4)/3=O_4*OC(CCCCCC$4)/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[a1212h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1/",104,False,False +"WURCS=2.0/1,1,0/[a1212m-1a_1-4_2*OCC/3=O_3*OC_5*OCC/3=O]/1/",104,False,False +"WURCS=2.0/1,1,0/[a1222h-1a_1-5_2*OCC_3*NO_6*OCCC/4C/4C/3=O]/1/",69,False,False +"WURCS=2.0/1,1,0/[a1x2h-1b_1-4_3*N]/1/",3,False,False +"WURCS=2.0/1,1,0/[a2112h-1a_1-5]/1/",1,False,False +"WURCS=2.0/1,1,0/[a2112h-1a_1-5_2*NCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[a2112h-1b_1-5]/1/",1,False,False +"WURCS=2.0/1,1,0/[a2112h-1b_1-5_2*NCC/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[a2112h-1b_1-5_3*OSO/3=O/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[a2122h-1b_1-5]/1/",2,False,False +"WURCS=2.0/1,1,0/[a2122h-1b_1-5_2*NCC/3=O_3*OSO/3=O/3=O_6*OSO/3=O/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[a2122h-1b_1-5_2*NCCO/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[a2122h-1b_1-5_6*OC]/1/",1,False,False +"WURCS=2.0/1,1,0/[a2122h-1b_1-5_6*OPO/3O/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[a212m-1a_1-4_3*OC(CCCCCC$4)]/1/",6,False,False +"WURCS=2.0/1,1,0/[a2211m-1a_1-5]/1/",1,False,False +"WURCS=2.0/1,1,0/[a2212h-1b_1-5_2*NCC/3=O_3*NCC/3=O]/1/",104,False,False +"WURCS=2.0/1,1,0/[ax22xh-1d_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O]/1/",2,False,False +"WURCS=2.0/1,1,0/[axxxh-1x_1-4_2*SC]/1/",1,False,False +"WURCS=2.0/1,1,0/[axxxxh-1a_1-5_2*NCC/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[hO222h]/1/",4,True,True +"WURCS=2.0/1,1,0/[u1122h]/1/",24,False,False +"WURCS=2.0/1,1,0/[u1122h_2*NCC/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[u1122h_6*OPO/3O/3=O]/1/",23,False,False +"WURCS=2.0/1,1,0/[u1211h]/1/",1,True,True +"WURCS=2.0/1,1,0/[u1221m]/1/",24,False,False +"WURCS=2.0/1,1,0/[u2112h]/1/",24,False,False +"WURCS=2.0/1,1,0/[u2112h_2*NCC/3=O]/1/",24,False,False +"WURCS=2.0/1,1,0/[u2112h_2*NCC/3=O_3*OSO/3=O/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[u2112h_2*NCC/3=O_4*OSO/3=O/3=O]/1/",10,False,False +"WURCS=2.0/1,1,0/[u2112h_2*NCC/3=O_6*OSO/3=O/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[u2112h_2*NCCO/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[u2112h_2*OCC/3=O_3*OCC/3=O_4*NCC/3=O_6*OCC/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[u2112h_3*OSO/3=O/3=O]/1/",23,False,False +"WURCS=2.0/1,1,0/[u2112h_4*OSO/3=O/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[u2112h_6*OSO/3=O/3=O]/1/",1,False,False +"WURCS=2.0/1,1,0/[u2122h]/1/",23,False,False +"WURCS=2.0/1,1,0/[u2122h_2*NCC/3=O]/1/",24,False,False +"WURCS=2.0/1,1,0/[u2122h_2*NCC/3=O_4*OSO/3=O/3=O]/1/",1,True,True +"WURCS=2.0/1,1,0/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O]/1/",24,False,False +"WURCS=2.0/1,1,0/[u2122h_2*NCCO/3=O]/1/",20,False,False +"WURCS=2.0/1,1,0/[u2122h_6*OPO/3O/3=O]/1/",18,False,False +"WURCS=2.0/1,1,0/[u212h]/1/",1,False,False +"WURCS=2.0/1,1,0/[u2211m]/1/",23,False,False +"WURCS=2.0/1,1,0/[u221h_2*OC(CCCCCC$4)_3*OC(CCCCCC$4)_4*OC(CCCCCC$4)]/1/",2,False,False +"WURCS=2.0/1,1,0/[u222h]/1/",1,False,False +"WURCS=2.0/1,2,1/[Aad21122h-2a_2-6_5*NCC/3=O]/1-1/a8-b2",1,False,False +"WURCS=2.0/1,2,1/[a2112h-1b_1-5]/1-1/a2-b1",1,False,False +"WURCS=2.0/1,2,1/[a2112h-1b_1-5]/1-1/a3-b1",1,False,False +"WURCS=2.0/1,2,1/[a2112h-1b_1-5]/1-1/a4-b1",1,False,False +"WURCS=2.0/1,2,1/[a2112h-1b_1-5]/1-1/a6-b1",1,False,False +"WURCS=2.0/1,2,1/[a2112h-1b_1-5_2*NCC/3=O]/1-1/a6-b1",1,False,False +"WURCS=2.0/1,3,2/[a2122h-1b_1-5_2*NCC/3=O]/1-1-1/a4-b1_b4-c1",1,True,True +"WURCS=2.0/1,4,3/[a1122h-1a_1-5]/1-1-1-1/a3-b1_b2-c1_c2-d1",1,False,False +"WURCS=2.0/1,6,5/[a2122h-1b_1-5_2*NCC/3=O]/1-1-1-1-1-1/a4-b1_b4-c1_c4-d1_d4-e1_e4-f1",1,True,True +"WURCS=2.0/2,10,9/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1_g3-h1_h3-i1_i3-j1",2,False,False +"WURCS=2.0/2,10,9/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1_e2-f1_f2-g1_g2-h1_h2-i1_i2-j1",2,False,False +"WURCS=2.0/2,10,9/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_c6-j1_d3-e1_e3-f1_f3-g1_g3-h1_h3-i1",2,False,False +"WURCS=2.0/2,10,9/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_e6-j1_f3-g1_g3-h1_h3-i1",2,False,False +"WURCS=2.0/2,10,9/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1_g3-h1_h3-i1_i3-j1",4,False,False +"WURCS=2.0/2,10,9/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1_g6-h1_h6-i1_i6-j1",4,False,False +"WURCS=2.0/2,11,10/[AUd21122h_5*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-2-2-2-2-2-2-2-2/a8-b2_b8-c2_c8-d2_d8-e2_e8-f2_f8-g2_g8-h2_h8-i2_i8-j2_j8-k2",2,False,False +"WURCS=2.0/2,11,10/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1_g6-h1_h6-i1_i6-j1_j6-k1",4,False,False +"WURCS=2.0/2,2,1/[Aad21122h-2b_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a8-b2",1,False,False +"WURCS=2.0/2,2,1/[a1122h-1b_1-5][a1122h-1a_1-5]/1-2/a6-b1",1,False,False +"WURCS=2.0/2,2,1/[a1222h-1b_1-5][a1122h-1b_1-5]/1-2/a4-b1",4,False,False +"WURCS=2.0/2,2,1/[a2112h-1a_1-5_2*NCC/3=O][Aad21122h-2b_2-6_5*NCC/3=O]/1-2/a6-b2",1,False,False +"WURCS=2.0/2,2,1/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2/a3-b1",1,False,False +"WURCS=2.0/2,2,1/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a3-b1",1,False,False +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a3-b2",1,False,False +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a6-b2",1,False,False +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][a1221m-1a_1-5]/1-2/a2-b1",1,False,False +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][a2112h-1a_1-5]/1-2/a2-b1",1,False,False +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][a2112h-1a_1-5]/1-2/a3-b1",1,False,False +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2/a3-b1",1,False,False +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2/a3-b1",1,True,True +"WURCS=2.0/2,2,1/[a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2/a3-b1",1,False,False +"WURCS=2.0/2,2,1/[a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2/a3-b1",1,True,True +"WURCS=2.0/2,2,1/[a2122h-1b_1-5][a2112h-1a_1-5]/1-2/a6-b1",1,False,False +"WURCS=2.0/2,2,1/[a2122h-1b_1-5][a2112h-1b_1-5]/1-2/a4-b1",1,True,True +"WURCS=2.0/2,2,1/[a2122h-1b_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a4-b1",1,False,False +"WURCS=2.0/2,2,1/[u1122h][a1122h-1a_1-5]/1-2/a2-b1",4,False,False +"WURCS=2.0/2,2,1/[u1122h][a1122h-1a_1-5]/1-2/a6-b1",177,False,False +"WURCS=2.0/2,2,1/[u2112h][Aad21122h-2a_2-6]/1-2/a6-b2",2,False,False +"WURCS=2.0/2,2,1/[u2112h][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a6-b2",189,False,False +"WURCS=2.0/2,2,1/[u2112h][a1221m-1a_1-5]/1-2/a2-b1",203,False,False +"WURCS=2.0/2,2,1/[u2112h][a2112h-1a_1-5]/1-2/a2-b1",201,False,False +"WURCS=2.0/2,2,1/[u2112h][a2112h-1a_1-5_2*NCC/3=O]/1-2/a3-b1",202,False,False +"WURCS=2.0/2,2,1/[u2112h][a2112h-1b_1-5]/1-2/a2-b1",200,False,False +"WURCS=2.0/2,2,1/[u2112h][a2112h-1b_1-5]/1-2/a3-b1",200,False,False +"WURCS=2.0/2,2,1/[u2112h][a2112h-1b_1-5]/1-2/a4-b1",126,False,False +"WURCS=2.0/2,2,1/[u2112h][a2112h-1b_1-5]/1-2/a6-b1",126,False,False +"WURCS=2.0/2,2,1/[u2112h][a2122A-1b_1-5]/1-2/a3-b1",197,False,False +"WURCS=2.0/2,2,1/[u2112h][a2122A-1b_1-5]/1-2/a6-b1",195,False,False +"WURCS=2.0/2,2,1/[u2112h][a2122A-1b_1-5_3*OSO/3=O/3=O]/1-2/a3-b1",3,False,False +"WURCS=2.0/2,2,1/[u2112h][a2122h-1a_1-5_2*NCC/3=O]/1-2/a4-b1",3,False,False +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a3-b2",201,False,False +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a6-b2",208,False,False +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2/a3-b1",204,False,False +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1a_1-5_2*NCCO/3=O]/1-2/a3-b1",1,False,False +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1a_1-5_6*OSO/3=O/3=O]/1-2/a3-b1",1,False,False +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1b_1-5]/1-2/a3-b1",212,False,False +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1b_1-5]/1-2/a6-b1",3,False,False +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2/a3-b1",190,False,False +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2/a6-b1",126,False,False +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a3-b1",202,False,False +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2122h-1b_1-5]/1-2/a4-b1",1,False,False +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1a_1-5]/1-2/a3-b1",1,False,False +"WURCS=2.0/2,2,1/[u2112h_2*NCCO/3=O][a2112h-1b_1-5]/1-2/a3-b1",1,False,False +"WURCS=2.0/2,2,1/[u2122h][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a6-b2",2,False,False +"WURCS=2.0/2,2,1/[u2122h][a2112h-1a_1-5]/1-2/a6-b1",202,False,False +"WURCS=2.0/2,2,1/[u2122h][a2112h-1b_1-5]/1-2/a4-b1",221,False,False +"WURCS=2.0/2,2,1/[u2122h][a2122h-1b_1-5]/1-2/a2-b1",3,False,False +"WURCS=2.0/2,2,1/[u2122h][a2122h-1b_1-5]/1-2/a3-b1",9,False,False +"WURCS=2.0/2,2,1/[u2122h][a2122h-1b_1-5]/1-2/a4-b1",205,False,False +"WURCS=2.0/2,2,1/[u2122h][a2211m-1a_1-5]/1-2/a6-b1",1,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a6-b2",2,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a1122h-1b_1-5]/1-2/a4-b1",197,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a1221m-1a_1-5]/1-2/a4-b1",196,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a1221m-1a_1-5]/1-2/a6-b1",3,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a1221m-1b_1-5]/1-2/a3-b1",200,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1a_1-5]/1-2/a4-b1",200,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5]/1-2/a4-b1",216,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2/a3-b1",106,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2/a4-b1",202,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_3*OSO/3=O/3=O_6*OSO/3=O/3=O]/1-2/a4-b1",1,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_4*OSO/3=O/3=O_6*OSO/3=O/3=O]/1-2/a4-b1",110,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a3-b1",202,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a4-b1",206,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O_4*OSO/3=O/3=O]/1-2/a4-b1",171,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O_6*OSO/3=O/3=O]/1-2/a4-b1",195,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_4*OSO/3=O/3=O]/1-2/a4-b1",200,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_4*OSO/3=O/3=O_6*OSO/3=O/3=O]/1-2/a4-b1",195,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_6*OPO/3O/3=O]/1-2/a4-b1",110,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2122A-1b_1-5]/1-2/a3-b1",171,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O_3*OC^RCO/4=O/3C]/1-2/a4-b1",105,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_3*OCC/3=O][a2112h-1b_1-5_2*NCC/3=O_4*OSO/3=O/3=O_6*OSO/3=O/3=O]/1-2/a4-b1",1,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_6*OPO/3O/3=O][a2112h-1b_1-5]/1-2/a4-b1",110,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a1221m-1a_1-5]/1-2/a3-b1",3,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5]/1-2/a3-b1",110,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2/a4-b1",110,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a4-b1",99,False,False +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O_6*OSO/3=O/3=O]/1-2/a4-b1",195,False,False +"WURCS=2.0/2,2,1/[u2122h_6*OSO/3=O/3=O][a2112h-1b_1-5]/1-2/a4-b1",200,False,False +"WURCS=2.0/2,2,1/[u2122h_6*OSO/3=O/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a4-b1",200,False,False +"WURCS=2.0/2,3,2/[AUd21122h_5*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2/a8-b2_b8-c2",207,False,False +"WURCS=2.0/2,3,2/[Aad21122h-2b_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2/a8-b2_b8-c2",1,False,False +"WURCS=2.0/2,3,2/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2/a3-b1_a6-c1",9,False,False +"WURCS=2.0/2,3,2/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2/a4-b1_a6-c1",9,False,False +"WURCS=2.0/2,3,2/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2/a6-b1_b3-c1",9,False,False +"WURCS=2.0/2,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a4-b1_a6-c1",1,True,True +"WURCS=2.0/2,3,2/[a2122h-1b_1-5][a2122h-1a_1-5]/1-2-2/a6-b1_b6-c1",1,False,False +"WURCS=2.0/2,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-1/a4-b1_b4-c1",1,True,True +"WURCS=2.0/2,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-1/a4-b1_b6-c1",1,True,True +"WURCS=2.0/2,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-2/a4-b1_b3-c1",1,True,True +"WURCS=2.0/2,3,2/[u1122h][a1122h-1a_1-5]/1-2-2/a4-b1_a6-c1",3,False,False +"WURCS=2.0/2,3,2/[u1122h][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a2-b1_a6-c1",2,True,True +"WURCS=2.0/2,3,2/[u2112h][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a3-b1_a6-c1",1,False,False +"WURCS=2.0/2,3,2/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a3-b1_a6-c1",190,False,False +"WURCS=2.0/2,3,2/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a4-b1_a6-c1",200,False,False +"WURCS=2.0/2,3,2/[u2122h][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2/a6-b2_b8-c2",2,False,False +"WURCS=2.0/2,3,2/[u2122h][a2122h-1a_1-5]/1-2-2/a2-b1_b2-c1",2,False,False +"WURCS=2.0/2,3,2/[u2122h][a2122h-1a_1-5]/1-2-2/a3-b1_b3-c1",2,False,False +"WURCS=2.0/2,3,2/[u2122h][a2122h-1a_1-5]/1-2-2/a4-b1_b6-c1",3,False,False +"WURCS=2.0/2,3,2/[u2122h][a2122h-1a_1-5]/1-2-2/a6-b1_b4-c1",2,False,False +"WURCS=2.0/2,3,2/[u2122h][a2122h-1a_1-5]/1-2-2/a6-b1_b6-c1",202,False,False +"WURCS=2.0/2,3,2/[u2122h][a2122h-1b_1-5]/1-2-2/a2-b1_b2-c1",2,False,False +"WURCS=2.0/2,3,2/[u2122h][a2122h-1b_1-5]/1-2-2/a3-b1_b3-c1",10,False,False +"WURCS=2.0/2,3,2/[u2122h][a2122h-1b_1-5]/1-2-2/a4-b1_b3-c1",2,False,False +"WURCS=2.0/2,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5]/1-2-2/a4-b1_b3-c1",171,False,False +"WURCS=2.0/2,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5]/1-2-2/a4-b1_b4-c1",1,False,False +"WURCS=2.0/2,3,2/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a3-b1_a6-c1",17,False,False +"WURCS=2.0/2,3,2/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a4-b1_b4-c1",210,False,False +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a2-b1_b2-c1_c2-d1",9,False,False +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a3-b1_a4-c1_a6-d1",9,False,False +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a3-b1_a6-c1_c2-d1",9,False,False +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a3-b1_a6-c1_c3-d1",9,False,False +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a3-b1_b2-c1_c2-d1",9,False,False +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a6-b1_b3-c1_b6-d1",9,False,False +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a6-b1_b3-c1_c2-d1",9,False,False +"WURCS=2.0/2,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-1-1/a4-b1_b3-c1_b6-d1",1,False,False +"WURCS=2.0/2,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-1-2/a3-b1_b3-c1_c4-d1",1,False,False +"WURCS=2.0/2,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-1-2/a4-b1_b6-c1_c3-d1",1,False,False +"WURCS=2.0/2,4,3/[u1122h][a1122h-1a_1-5]/1-2-2-2/a2-b1_b2-c1_c2-d1",3,False,False +"WURCS=2.0/2,4,3/[u1122h][a1122h-1a_1-5]/1-2-2-2/a3-b1_a4-c1_a6-d1",3,False,False +"WURCS=2.0/2,4,3/[u1122h][a1122h-1a_1-5]/1-2-2-2/a3-b1_a6-c1_c2-d1",3,False,False +"WURCS=2.0/2,4,3/[u1122h][a1122h-1a_1-5]/1-2-2-2/a3-b1_a6-c1_c3-d1",3,False,False +"WURCS=2.0/2,4,3/[u1122h][a1122h-1a_1-5]/1-2-2-2/a3-b1_a6-c1_c6-d1",3,False,False +"WURCS=2.0/2,4,3/[u1122h][a1122h-1a_1-5]/1-2-2-2/a6-b1_b3-c1_c2-d1",3,False,False +"WURCS=2.0/2,4,3/[u2122h][a2122h-1b_1-5]/1-2-2-2/a4-b1_b3-c1_c4-d1",3,False,False +"WURCS=2.0/2,4,3/[u2122h][a2122h-1b_1-5]/1-2-2-2/a4-b1_b4-c1_c3-d1",2,False,False +"WURCS=2.0/2,5,4/[a1122h-1b_1-5][a1122h-1a_1-5]/1-2-2-2-2/a3-b1_a6-c1_c3-d1_c6-e1",1,False,False +"WURCS=2.0/2,5,4/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2/a3-b1_a6-c1_c3-d1_d2-e1",9,False,False +"WURCS=2.0/2,5,4/[u1122h][a1122h-1a_1-5]/1-2-2-2-2/a3-b1_a6-c1_c2-d1_d2-e1",200,False,False +"WURCS=2.0/2,5,4/[u1122h][a1122h-1a_1-5]/1-2-2-2-2/a3-b1_a6-c1_c3-d1_d2-e1",3,False,False +"WURCS=2.0/2,5,4/[u1122h][a1122h-1a_1-5]/1-2-2-2-2/a3-b1_a6-d1_b2-c1_d2-e1",203,False,False +"WURCS=2.0/2,5,4/[u1122h][a1122h-1a_1-5]/1-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1",3,False,False +"WURCS=2.0/2,5,4/[u2122h][a2122h-1b_1-5]/1-2-2-2-2/a3-b1_b4-c1_c4-d1_d4-e1",2,False,False +"WURCS=2.0/2,5,4/[u2122h][a2122h-1b_1-5]/1-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1",5,False,False +"WURCS=2.0/2,6,5/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-c1_c3-d1_c6-e1_e2-f1",9,False,False +"WURCS=2.0/2,6,5/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-c1_c3-d1_c6-f1_d2-e1",9,False,False +"WURCS=2.0/2,6,5/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2-2/a6-b1_b3-c1_b6-e1_c2-d1_e2-f1",9,False,False +"WURCS=2.0/2,6,5/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-1-2-1-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1",1,False,False +"WURCS=2.0/2,6,5/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-c1_c3-d1_c6-f1_d2-e1",3,False,False +"WURCS=2.0/2,6,5/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_d6-f1",3,False,False +"WURCS=2.0/2,6,5/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_e2-f1",3,False,False +"WURCS=2.0/2,6,5/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d6-e1_e2-f1",3,False,False +"WURCS=2.0/2,6,5/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1",3,False,False +"WURCS=2.0/2,6,5/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1_e6-f1",3,False,False +"WURCS=2.0/2,6,5/[u1122h][a1122h-1b_1-5]/1-2-2-2-2-2/a4-b1_b4-c1_c4-d1_d4-e1_e4-f1",5,False,False +"WURCS=2.0/2,6,5/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1",7,False,False +"WURCS=2.0/2,6,5/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1",5,False,False +"WURCS=2.0/2,7,6/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_d6-f1_f2-g1",9,False,False +"WURCS=2.0/2,7,6/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2/a3-b1_a6-c1_c3-d1_c6-f1_d2-e1_f2-g1",3,False,False +"WURCS=2.0/2,7,6/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_d6-f1_f2-g1",3,False,False +"WURCS=2.0/2,7,6/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_d6-g1_e2-f1",3,False,False +"WURCS=2.0/2,7,6/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1_e6-g1",3,False,False +"WURCS=2.0/2,7,6/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1_e2-f1_f2-g1",2,False,False +"WURCS=2.0/2,7,6/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1",6,False,False +"WURCS=2.0/2,8,7/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_d6-g1_e2-f1_g2-h1",9,False,False +"WURCS=2.0/2,8,7/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1_e6-g1_g2-h1",9,False,False +"WURCS=2.0/2,8,7/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_d6-g1_e2-f1_g2-h1",3,False,False +"WURCS=2.0/2,8,7/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1_e6-g1_g2-h1",175,False,False +"WURCS=2.0/2,8,7/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1_e6-h1_f2-g1",3,False,False +"WURCS=2.0/3,10,9/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1",1,False,False +"WURCS=2.0/3,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3-3-3-3-3/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e2-f1_g3-h1_g6-i1_i2-j1",1,False,False +"WURCS=2.0/3,10,9/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1",9,False,False +"WURCS=2.0/3,3,2/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a2-b1_b3-c1",1,True,True +"WURCS=2.0/3,3,2/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a2-b1_b4-c1",1,True,True +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a3-b1_b3-c2",1,False,False +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a3-b1_a6-c2",1,False,False +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_b2-c1",1,False,False +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_b3-c1",1,False,False +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b3-c1",1,False,False +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b4-c1",1,False,False +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a6-b1_b4-c1",1,False,False +"WURCS=2.0/3,3,2/[a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a2-b1_a3-c1",1,False,False +"WURCS=2.0/3,3,2/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a3-b1_b4-c1",1,False,False +"WURCS=2.0/3,3,2/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_b3-c1",1,False,False +"WURCS=2.0/3,3,2/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b4-c1",1,False,False +"WURCS=2.0/3,3,2/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a6-b1_b4-c1",1,False,False +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3/a3-b1_a4-c1",1,False,False +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b3-c1",1,False,False +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b4-c1",1,False,False +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",2,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_a4-c1",1,False,False +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a3-b1_b3-c2",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a4-b1_b3-c2",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3/a3-b1_b3-c2",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3/a4-b1_b3-c2",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3/a4-b1_b6-c2",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",1,False,False +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a3-b1_a4-c1",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b3-c1",1,False,False +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a3-b1_b4-c1",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b6-c1",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1x_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a4-b1_b3-c2",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b3-c1",1,False,False +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a4-b1_b6-c2",1,True,True +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCCO/3=O]/1-2-3/a4-b1_b6-c2",1,False,False +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5]/1-2-3/a4-b1_b4-c1",9,True,True +"WURCS=2.0/3,3,2/[h2112h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3/a3-b1_a4-c1",4,True,True +"WURCS=2.0/3,3,2/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a2-b1_b3-c1",105,False,False +"WURCS=2.0/3,3,2/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a2-b1_b4-c1",122,False,False +"WURCS=2.0/3,3,2/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a2-b1_b4-c1",105,False,False +"WURCS=2.0/3,3,2/[u1221m][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b4-c1",3,False,False +"WURCS=2.0/3,3,2/[u2112h][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3/a2-b1_a3-c1",202,False,False +"WURCS=2.0/3,3,2/[u2112h][a1221m-1a_1-5][a2112h-1a_1-5_2*NCCO/3=O]/1-2-3/a2-b1_a3-c1",1,False,False +"WURCS=2.0/3,3,2/[u2112h][a1221m-1a_1-5][a2112h-1a_1-5_2*N]/1-2-3/a2-b1_a3-c1",1,False,False +"WURCS=2.0/3,3,2/[u2112h][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b4-c1",17,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a3-b1_b3-c2",146,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_a6-c2",202,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a3-b1_b4-c1",2,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",144,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_a6-c1",203,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_b2-c1",188,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_b3-c1",200,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a6-b1_b3-c1",110,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a6-b1_b4-c1",200,False,False +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_b3-c2",202,False,False +"WURCS=2.0/3,3,2/[u2122h][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3/a3-b1_a4-c1",2,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_4*OCC/3=O_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",6,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_4*OC_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",2,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",220,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",205,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OC]/1-2-3/a4-b1_b3-c2",2,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3/a4-b1_b6-c2",1,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*N]/1-2-3/a4-b1_b3-c2",6,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*N]/1-2-3/a4-b1_b6-c2",6,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",6,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",7,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",210,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a3-b1_b3-c1",17,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b4-c1",199,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",3,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",138,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2122A-1b_1-5]/1-2-3/a4-b1_b3-c1",3,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2122A-1b_1-5_3*OSO/3=O/3=O]/1-2-3/a4-b1_b3-c1",2,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",206,False,False +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5_6*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",181,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a4-b1_b3-c2",200,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a4-b1_b6-c2",146,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",206,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3/a4-b1_b3-c2",145,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3/a4-b1_b6-c2",205,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3/a4-b1_b6-c2",201,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",1,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",188,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCCO/3=O]/1-2-3/a4-b1_b6-c2",171,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",203,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b3-c1",202,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b4-c1",192,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",1,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",1,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",195,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",146,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",200,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",195,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b6-c1",195,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O]/1-2-3/a4-b1_b3-c1",146,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",196,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",195,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a3-b1_a4-c1",204,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",103,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a3-b1_b2-c1",110,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",84,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",146,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5]/1-2-3/a4-b1_b4-c1",3,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3/a4-b1_a6-c1",1,True,True +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3/a3-b1_a4-c1",181,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_a4-c1",110,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a1221m-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3/a3-b1_a4-c1",181,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_b3-c2",195,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_b6-c2",1,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",202,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",201,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a3-b1_b2-c1",110,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",181,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",111,False,False +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a3-b1_b2-c1",110,False,False +"WURCS=2.0/3,3,2/[u2122h_6*OSO/3=O/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3/a3-b1_a4-c1",181,False,False +"WURCS=2.0/3,3,2/[u2122h_6*OSO/3=O/3=O][a1221m-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3/a3-b1_a4-c1",181,False,False +"WURCS=2.0/3,3,2/[u2122h_6*OSO/3=O/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",181,False,False +"WURCS=2.0/3,3,2/[u2122h_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",181,False,False +"WURCS=2.0/3,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_b3-c1_c4-d1",1,False,False +"WURCS=2.0/3,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2/a3-b1_b4-c1_c3-d1",1,False,False +"WURCS=2.0/3,4,3/[a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-3/a3-b1_b4-c1_c3-d2",1,False,False +"WURCS=2.0/3,4,3/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b4-c1_c3-d1",1,True,True +"WURCS=2.0/3,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-3/a4-b1_b3-c1_b4-d1",1,False,False +"WURCS=2.0/3,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b3-c1_c3-d1",1,False,False +"WURCS=2.0/3,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b6-c1_c4-d1",1,False,False +"WURCS=2.0/3,4,3/[a2122h-1x_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3/a4-b1_b6-c1_c3-d1",9,False,False +"WURCS=2.0/3,4,3/[h2122h][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-2/a3-b1_a4-c1_c2-d1",2,True,True +"WURCS=2.0/3,4,3/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3/a3-b1_a6-d2_b6-c2",1,False,False +"WURCS=2.0/3,4,3/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_b3-c1_c4-d1",105,False,False +"WURCS=2.0/3,4,3/[u2122h][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-2/a2-b1_a4-c1_c2-d1",1,False,False +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2/a4-b1_b3-c2_b4-d1",1,False,False +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3/a4-b1_b3-c2_c9-d2",5,False,False +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b3-c1_c3-d1",17,False,False +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b3-c1_c4-d1",215,False,False +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-3/a4-b1_b3-c1_b6-d1",1,True,True +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-3/a4-b1_b6-c2_c8-d2",105,False,False +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-3/a3-b1_a4-d1_b2-c1",206,False,False +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-3/a4-b1_b3-c1_b4-d1",200,False,False +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_b3-c1_c3-d1",1,False,False +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_a6-c1_c4-d1",17,False,False +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_b3-c1_c4-d1",181,False,False +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b3-c1_c4-d1",208,False,False +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b6-c1_c4-d1",171,False,False +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-3/a4-b1_b3-c1_b4-d1",1,False,False +"WURCS=2.0/3,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2-3/a3-b1_a6-d1_b4-c1_d4-e1",1,True,True +"WURCS=2.0/3,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3-3/a4-b1_b3-c2_c8-d2_d8-e2",1,True,True +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-1/a4-b1_b4-c1_c3-d1_d2-e1",1,False,False +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-1/a4-b1_b4-c1_c6-d1_d2-e1",1,False,False +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3/a4-b1_b4-c1_c3-d1_c6-e1",11,False,False +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-1-3/a3-b1_a4-c1_c3-d1_d3-e1",1,False,False +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-2-3/a3-b1_b3-c1_c3-d1_d3-e2",1,True,True +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-2-3/a3-b1_b3-c1_c4-d1_d3-e2",1,False,False +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-2-3/a3-b1_b3-c1_c4-d1_d6-e2",1,False,False +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-2-3/a4-b1_b3-c1_c3-d1_d3-e2",1,True,True +"WURCS=2.0/3,5,4/[a2122h-1x_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3/a4-b1_b3-c1_b6-d1_d6-e1",9,False,False +"WURCS=2.0/3,5,4/[a2122h-1x_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3/a4-b1_b6-c1_c2-d1_c3-e1",9,False,False +"WURCS=2.0/3,5,4/[a2122h-1x_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3/a4-b1_b6-c1_c6-d1_d2-e1",9,False,False +"WURCS=2.0/3,5,4/[a2122h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3/a4-b1_b3-c1_b6-e1_c4-d1",1,True,True +"WURCS=2.0/3,5,4/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3-3/a4-b1_b3-c2_c8-d2_d8-e2",205,False,False +"WURCS=2.0/3,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3/a4-b1_b3-c1_b6-e1_c3-d1",4,True,True +"WURCS=2.0/3,5,4/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3/a4-b1_b6-c1_c2-d1_c3-e1",3,False,False +"WURCS=2.0/3,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3/a4-b1_b3-c1_b6-e1_c4-d1",171,False,False +"WURCS=2.0/3,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3/a4-b1_b3-c1_c4-d1_d3-e1",195,False,False +"WURCS=2.0/3,6,5/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-3-2-3/a3-b1_a6-d1_b3-c1_d4-e1_e3-f1",1,False,False +"WURCS=2.0/3,6,5/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1",1,True,True +"WURCS=2.0/3,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1",1,True,True +"WURCS=2.0/3,6,5/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3/a4-b1_b4-c1_c3-d1_c6-e1_e3-f1",6,False,False +"WURCS=2.0/3,6,5/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1",6,False,False +"WURCS=2.0/3,6,5/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3/a4-b1_b4-c1_c3-e1_c6-d1_e2-f1",3,False,False +"WURCS=2.0/3,6,5/[a2122h-1x_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3/a4-b1_b3-c1_b6-d1_d6-e1_e2-f1",9,False,False +"WURCS=2.0/3,6,5/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1",105,False,False +"WURCS=2.0/3,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3-3-3/a4-b1_b3-c2_c8-d2_d8-e2_e8-f2",1,False,False +"WURCS=2.0/3,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1",4,False,False +"WURCS=2.0/3,6,5/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3/a4-b1_b3-c1_b6-d1_d6-e1_e2-f1",3,False,False +"WURCS=2.0/3,6,5/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3/a4-b1_b3-c1_b6-e1_c2-d1_e6-f1",3,False,False +"WURCS=2.0/3,6,5/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3/a4-b1_b3-c1_b6-f1_c2-d1_d2-e1",3,False,False +"WURCS=2.0/3,6,5/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3/a4-b1_b6-c1_c3-d1_c6-e1_e2-f1",3,False,False +"WURCS=2.0/3,6,5/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2/a4-b1_b3-c1_b6-e1_c4-d1_e4-f1",171,False,False +"WURCS=2.0/3,6,5/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-3-2-3/a4-b1_b3-c1_b6-d1_d4-e1_e3-f1",105,False,False +"WURCS=2.0/3,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1",1,False,False +"WURCS=2.0/3,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3-3/a4-b1_b4-c1_c3-d1_c6-e1_e3-f1_e6-g1",2,True,True +"WURCS=2.0/3,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-1-2-3-2/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f2-g1",1,True,True +"WURCS=2.0/3,7,6/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-2-1-2-3/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g2",1,False,False +"WURCS=2.0/3,7,6/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-2-1-2-3/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f6-g2",1,True,True +"WURCS=2.0/3,7,6/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-1-2-1-2-3/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f4-g1",1,True,True +"WURCS=2.0/3,7,6/[a2122h-1x_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3-3/a4-b1_b3-c1_b6-f1_c2-d1_d2-e1_f6-g1",9,False,False +"WURCS=2.0/3,7,6/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3-3/a4-b1_b3-c1_b6-f1_c2-d1_d2-e1_f3-g1",3,False,False +"WURCS=2.0/3,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-1-1-3-1/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g6-h1",1,False,False +"WURCS=2.0/3,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-1-3-3-3/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-h1",1,False,False +"WURCS=2.0/3,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3-3-3/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-h1",1,True,True +"WURCS=2.0/3,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-1-1-3-1-1/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1_g6-i1",2,False,False +"WURCS=2.0/3,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3-3-3-3/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-i1_g2-h1",1,True,True +"WURCS=2.0/4,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-1-2-3-1-1-3-1-1-4/a4-b1_a6-j1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1_g6-i1",2,False,False +"WURCS=2.0/4,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-1-3-1-4/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_e3-f1_h2-i1_i3-j1",1,False,False +"WURCS=2.0/4,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-2-4-2-2/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_d4-f1_h2-i1_h6-j1",126,False,False +"WURCS=2.0/4,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-i1_g2-h1_i2-j1",10,False,False +"WURCS=2.0/4,11,10/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j6-k2",3,True,True +"WURCS=2.0/4,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-2-4-2-2-2/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_d4-f1_h2-i1_h4-j1_h6-k1",11,False,False +"WURCS=2.0/4,13,12/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-1-4-3-1-4-1-4/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_d4-g1_e4-f1_g4-h1_i2-j1_i6-l1_j4-k1_l4-m1",3,False,False +"WURCS=2.0/4,4,3/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a2-b1_b3-c1_c3-d2",1,False,False +"WURCS=2.0/4,4,3/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a2-b1_b3-c1_b4-d1",1,False,False +"WURCS=2.0/4,4,3/[a1122h-1x_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a2-b1_b4-c1_c6-d2",1,True,True +"WURCS=2.0/4,4,3/[a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a3-b1_b3-c1_c2-d1",1,False,False +"WURCS=2.0/4,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_b2-c1_b3-d1",1,False,False +"WURCS=2.0/4,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4/a3-b1_b3-c1_b4-d1",1,False,False +"WURCS=2.0/4,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a3-b1_b3-c1_c3-d2",1,True,True +"WURCS=2.0/4,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a3-b1_b4-c1_c2-d1",1,False,False +"WURCS=2.0/4,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a6-b1_b4-c1_c2-d1",1,False,False +"WURCS=2.0/4,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_b4-c1_c3-d1",1,False,False +"WURCS=2.0/4,4,3/[a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_b2-c1_b3-d1",1,False,False +"WURCS=2.0/4,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4/a6-b1_b3-c1_b4-d1",1,False,False +"WURCS=2.0/4,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a3-b1_b4-c1_c3-d2",1,True,True +"WURCS=2.0/4,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a3-b1_b4-c1_c6-d2",1,True,True +"WURCS=2.0/4,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a3-b1_b3-c1_c2-d1",1,False,False +"WURCS=2.0/4,4,3/[a2122h-1b_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4/a4-b1_b2-c1_b3-d1",1,False,False +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4/a3-b1_a4-c1_c3-d2",1,True,True +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_a4-c1_c3-d1",1,False,False +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4/a3-b1_a4-d1_b3-c2",1,False,False +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a1221m-1a_1-5]/1-2-3-4/a3-b1_a4-d1_b3-c2",1,True,True +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b2-c1_b4-d1",1,False,False +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b4-c1_c3-d1",1,False,False +"WURCS=2.0/4,4,3/[a2122h-1x_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3-4/a3-b1_a4-c1_c3-d2",1,True,True +"WURCS=2.0/4,4,3/[a2122h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4/a4-b1_b2-c1_b3-d1",1,False,False +"WURCS=2.0/4,4,3/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4/a4-b1_b4-c1_c3-d1",9,True,True +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4/a2-b1_b3-c1_b4-d1",112,False,False +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a2-b1_b3-c1_c3-d2",105,False,False +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a2-b1_b4-c1_c3-d2",112,False,False +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a2-b1_b4-c1_c6-d2",105,False,False +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a2-b1_b3-c1_b4-d1",105,False,False +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a2-b1_b4-c1_c2-d1",110,False,False +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a2-b1_b4-c1_c3-d1",105,False,False +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122A-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4/a2-b1_b4-c1_c3-d1",105,False,False +"WURCS=2.0/4,4,3/[u2112h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a3-b1_b3-c2_b4-d1",2,False,False +"WURCS=2.0/4,4,3/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a3-b1_b3-c1_b4-d1",1,True,True +"WURCS=2.0/4,4,3/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_b4-c1_c3-d1",1,False,False +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_a4-c1_c3-d1",17,False,False +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4/a3-b1_a6-d1_b3-c2",105,False,False +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4/a6-b1_b3-c1_b4-d1",120,False,False +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a3-b1_b3-c1_c3-d2",136,False,False +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a6-b1_b3-c1_c3-d2",110,False,False +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a6-b1_b4-c1_c3-d2",110,False,False +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a6-b1_b4-c1_c6-d2",110,False,False +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a3-b1_b3-c1_c2-d1",126,False,False +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a6-b1_b3-c1_b4-d1",110,False,False +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a6-b1_b4-c1_c2-d1",110,False,False +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a6-b1_b4-c1_c3-d1",110,False,False +"WURCS=2.0/4,4,3/[u2122h][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a3-b1_a4-c1_c3-d2",3,False,False +"WURCS=2.0/4,4,3/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4/a4-b1_b3-c2_c8-d2",1,True,True +"WURCS=2.0/4,4,3/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a3-b1_b3-c2_b4-d1",2,False,False +"WURCS=2.0/4,4,3/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b3-c2_b4-d1",218,False,False +"WURCS=2.0/4,4,3/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b3-c2_b6-d1",2,False,False +"WURCS=2.0/4,4,3/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a4-b1_b4-c1_b6-d2",2,False,False +"WURCS=2.0/4,4,3/[u2122h][a2112h-1b_1-5_3*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5]/1-2-3-4/a4-b1_b4-c1_c3-d1",3,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3-4/a3-b1_a4-c1_c3-d2",146,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3-4/a3-b1_a4-c1_c3-d2",2,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4/a3-b1_a4-c1_c3-d2",188,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_a4-c1_c3-d1",189,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4/a3-b1_a4-c1_c3-d1",1,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a3-b1_b3-c2_b4-d1",1,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4/a3-b1_a4-d1_b3-c2",210,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O][a1221m-1a_1-5]/1-2-3-4/a3-b1_a4-d1_b3-c2",2,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a4-b1_b2-c1_b6-d2",1,True,True +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_b2-c1_b3-d1",195,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b2-c1_b4-d1",200,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b3-c1_b4-d1",17,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b4-c1_c3-d1",195,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4/a4-b1_b3-c1_c4-d1",1,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4/a4-b1_b4-c1_c6-d1",11,False,False +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a3-b1_a4-c1_c3-d2",201,False,False +"WURCS=2.0/4,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a3-b1_a6-c1_c4-d1_d6-e2",1,False,False +"WURCS=2.0/4,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-3/a3-b1_b3-c1_b4-d1_d2-e1",1,True,True +"WURCS=2.0/4,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-1/a3-b1_b4-c1_c2-d1_c3-e1",1,False,False +"WURCS=2.0/4,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-1/a6-b1_b3-c1_c2-d1_c3-e1",1,False,False +"WURCS=2.0/4,5,4/[a2122h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-2-4/a3-b1_a4-c1_c2-d1_c3-e1",1,False,False +"WURCS=2.0/4,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d6-e2",1,False,False +"WURCS=2.0/4,5,4/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-2-4/a3-b1_a4-c1_c2-d1_c3-e1",1,False,False +"WURCS=2.0/4,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d4-e1",1,True,True +"WURCS=2.0/4,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d4-e1",1,False,False +"WURCS=2.0/4,5,4/[a2122h-1x_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d3-e1",1,True,True +"WURCS=2.0/4,5,4/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e2",2,False,False +"WURCS=2.0/4,5,4/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d6-e2",2,True,True +"WURCS=2.0/4,5,4/[a2122h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d3-e1",1,False,False +"WURCS=2.0/4,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-3-4/a2-b1_a6-c1_c4-d1_d3-e2",2,False,False +"WURCS=2.0/4,5,4/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-3/a3-b1_b3-c1_b4-d1_d2-e1",1,False,False +"WURCS=2.0/4,5,4/[u2122h][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-3/a3-b1_a4-c1_c3-d1_d3-e1",5,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-4/a4-b1_b3-c2_b4-e1_c8-d2",209,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b3-c2_b4-d1_d3-e1",218,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O]/1-2-3-3-4/a4-b1_b3-c2_b4-e1_c8-d2",3,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d3-e1",146,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b3-c1_c3-d1_d3-e1",1,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b4-c1_c3-d1_d4-e1",1,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b4-c1_c3-d1_d3-e2",51,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d2-e1",17,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d3-e2",1,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_b6-e2_c3-d1",4,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_c6-e2",10,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d3-e2",12,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e2",12,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b6-c1_c3-d1_c6-e2",84,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d3-e2",4,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d6-e2",4,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1",11,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122A-1b_1-5]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1",3,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122A-1b_1-5_3*OSO/3=O/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1",107,False,False +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d4-e1",146,False,False +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d3-e1",146,False,False +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d4-e1",200,False,False +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a3-b1_b3-c1_c3-d1_d3-e2",181,False,False +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a3-b1_b3-c1_c4-d1_d3-e2",181,False,False +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a3-b1_b3-c1_c4-d1_d6-e2",146,False,False +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d6-e2",201,False,False +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d6-e2",1,False,False +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d4-e1",146,False,False +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4/a4-b1_b4-c1_c6-d1_d3-e1",1,False,False +"WURCS=2.0/4,6,5/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-4/a3-b1_b4-c1_c3-d1_d4-e1_e3-f2",1,False,False +"WURCS=2.0/4,6,5/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-4/a3-b1_b4-c1_c3-d1_d4-e1_e6-f2",1,False,False +"WURCS=2.0/4,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-4-2/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1",1,False,False +"WURCS=2.0/4,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b3-c2_b4-d1_d3-e1_e3-f2",1,True,True +"WURCS=2.0/4,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b2-c1_b3-d1_d3-e1_e2-f1",1,True,True +"WURCS=2.0/4,6,5/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-1-2-3-3-4/a4-b1_a6-f1_b4-c1_c3-d1_c6-e1",1,False,False +"WURCS=2.0/4,6,5/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1",1,False,False +"WURCS=2.0/4,6,5/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1",1,False,False +"WURCS=2.0/4,6,5/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-3-2-4/a4-b1_b3-c1_c3-d1_c4-e1_e3-f2",1,True,True +"WURCS=2.0/4,6,5/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4/a4-b1_b4-c1_c3-d1_d2-e1_e2-f1",9,False,False +"WURCS=2.0/4,6,5/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4/a4-b1_b4-c1_c6-d1_d3-e1_d6-f1",9,False,False +"WURCS=2.0/4,6,5/[a2222h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-4/a4-b1_b3-c1_c3-d1_c4-f1_d2-e1",1,True,True +"WURCS=2.0/4,6,5/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-4/a2-b1_a6-e1_b3-c1_b4-d1_e4-f1",2,True,True +"WURCS=2.0/4,6,5/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-2-3-4/a2-b1_a6-d1_b4-c1_d4-e1_e3-f2",2,False,False +"WURCS=2.0/4,6,5/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-4/a3-b1_b4-c1_c3-d1_d4-e1_e3-f2",105,False,False +"WURCS=2.0/4,6,5/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-4/a3-b1_b4-c1_c3-d1_d4-e1_e6-f2",105,False,False +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-3-4/a4-b1_b3-c2_b4-f1_c8-d2_d8-e2",204,False,False +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-4-2/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1",144,False,False +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O]/1-2-3-3-3-4/a4-b1_b3-c2_b4-f1_c8-d2_d8-e2",3,False,False +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b2-c1_b3-d1_d3-e1_e2-f1",136,False,False +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-4/a4-b1_b4-c1_c3-d1_c6-f2_d6-e2",2,False,False +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-4/a4-b1_b4-c1_c3-d1_d3-e2_e8-f2",3,True,True +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b2-c1_b3-d1_d3-e1_e2-f1",136,False,False +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-4/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1",10,False,False +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-4/a4-b1_b4-c1_c3-d1_c6-f1_d4-e1",1,False,False +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-2/a4-b1_b4-c1_c3-d1_c6-e1_e2-f1",10,False,False +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4/a4-b1_b4-c1_c3-d1_c6-e1_e3-f1",3,False,False +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-2-2-3-4/a3-b1_a6-f1_b3-c1_c2-d1_d2-e1",1,False,False +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-2-2-3-4/a3-b1_b3-c1_c2-d1_c3-f1_d2-e1",1,False,False +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-2-2-3-4/a3-b1_b3-c1_b4-f1_c2-d1_d2-e1",1,False,False +"WURCS=2.0/4,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-4/a4-b1_b3-c1_b6-e1_c3-d1_e4-f1_f6-g2",1,True,True +"WURCS=2.0/4,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g2",2,True,True +"WURCS=2.0/4,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g2",1,False,False +"WURCS=2.0/4,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-3-2/a4-b1_b3-c1_c3-d1_c4-e1_e3-f1_f4-g1",1,True,True +"WURCS=2.0/4,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-1-3-4-2/a3-b1_a4-c1_c3-d1_d3-e1_d4-g1_e3-f2",1,False,False +"WURCS=2.0/4,7,6/[a2122h-1x_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-3/a4-b1_b3-c2_b4-d1_d3-e1_e3-f2_f8-g2",1,True,True +"WURCS=2.0/4,7,6/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-3-2/a4-b1_b3-c1_b6-f1_c3-d1_d6-e2_f4-g1",1,True,True +"WURCS=2.0/4,7,6/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-3-4/a2-b1_a6-e1_b4-c1_c3-d2_e4-f1_f3-g2",2,False,False +"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-4/a3-b1_a6-c1_c4-d1_d3-e1_e4-f1_f6-g2",105,False,False +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-3-4-2/a4-b1_b3-c2_b4-f1_c8-d2_d8-e2_f3-g1",108,False,False +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-4-2-3/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1_f3-g2",142,False,False +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-3/a4-b1_b3-c2_b4-d1_d3-e1_e3-f2_f8-g2",113,False,False +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-4/a4-b1_b3-c2_b4-d1_d3-e1_e3-f2_e4-g1",6,False,False +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O]/1-2-3-3-3-4-2/a4-b1_b3-c2_b4-f1_c8-d2_d8-e2_f3-g1",3,False,False +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-3/a4-b1_b2-c1_b3-d1_d3-e1_d4-g1_e2-f1",3,False,False +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-3-2/a4-b1_b6-c1_c3-d1_c4-e1_e3-f1_f4-g1",21,False,False +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1",1,False,False +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122A-1b_1-5]/1-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1",3,False,False +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122A-1b_1-5_3*OSO/3=O/3=O]/1-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1",3,False,False +"WURCS=2.0/4,7,6/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1",3,True,True +"WURCS=2.0/4,7,6/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-2-2-3-4-4/a3-b1_b3-c1_b4-g1_c2-d1_d2-e1_d3-f1",1,False,False +"WURCS=2.0/4,7,6/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-2-2-3-4-4/a3-b1_b3-c1_c2-d1_c3-g1_d2-e1_d3-f1",1,False,False +"WURCS=2.0/4,8,7/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-1-2-1-2-3-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f2-g1_f3-h1",1,False,False +"WURCS=2.0/4,8,7/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-2/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1",1,False,False +"WURCS=2.0/4,8,7/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-2/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1",1,False,False +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-3-2-4/a4-b1_b3-c1_b6-f1_c4-d1_d6-e2_f4-g1_g6-h2",6,False,False +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-4-2/a4-b1_b3-c1_b6-f1_c3-d1_c4-e1_f3-g1_f4-h1",3,False,False +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-4-2/a4-b1_b3-c1_b6-f1_c4-d1_d2-e1_f3-g1_f4-h1",105,False,False +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-4-3-2/a4-b1_b3-c1_b6-g1_c3-d1_c4-f1_d2-e1_g4-h1",138,False,False +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-3-4-2/a4-b1_b3-c1_b6-f1_c3-d1_c4-e1_f3-g1_f4-h1",3,False,False +"WURCS=2.0/4,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-2/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1",137,False,False +"WURCS=2.0/4,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-2/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1",147,False,False +"WURCS=2.0/4,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-4/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g6-h1",5,False,False +"WURCS=2.0/4,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e2-f1_g3-h1",3,True,True +"WURCS=2.0/4,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-1-2-3-1-1-3-1-4/a4-b1_a6-i1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1",2,False,False +"WURCS=2.0/4,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-3-1-4/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e3-f1_g2-h1_h3-i1",1,False,False +"WURCS=2.0/4,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-1-2-3-1-3-4/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f3-g1_g4-h1_h6-i2",1,True,True +"WURCS=2.0/4,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-1-2-3-1-3-4/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f3-g1_g4-h1_h4-i1",1,False,False +"WURCS=2.0/4,9,8/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-3-4-2-3-2/a4-b1_b3-c1_b6-e1_c3-d1_e3-f1_e4-g1_g3-h1_h3-i1",1,False,False +"WURCS=2.0/4,9,8/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-4-3-4-2/a4-b1_b3-c1_b6-g1_c3-d1_c4-f1_d2-e1_g3-h1_g4-i1",1,True,True +"WURCS=2.0/4,9,8/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-2-2/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1_g6-i1",1,False,False +"WURCS=2.0/4,9,8/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-h1_h2-i1",6,True,True +"WURCS=2.0/4,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-2-4-2/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_d4-f1_h2-i1",132,False,False +"WURCS=2.0/4,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-h1_h2-i1",14,False,False +"WURCS=2.0/4,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e2-f1_g6-h1_h2-i1",3,False,False +"WURCS=2.0/5,10,9/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-3-4-2-3-5/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f3-g1_g3-h1_g4-i1_i3-j2",200,False,False +"WURCS=2.0/5,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-4-2-5/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_e4-f1_h2-i1_i4-j1",135,False,False +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",2,False,False +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j3-k2",4,False,False +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j3-k2",2,True,True +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j3-k2",1,False,False +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",1,True,True +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f2-g1_h2-i1_i3-j1_j2-k1",1,False,False +"WURCS=2.0/5,11,10/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-2-2-4-2-2-5/a4-b1_a6-k1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_d4-f1_h2-i1_h6-j1",1,False,False +"WURCS=2.0/5,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1a_1-5_6*OPO/3O/3=O]/1-2-3-4-4-5-4-4-4-4-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e2-f1_g3-h1_g6-j1_h2-i1_j2-k1",1,False,False +"WURCS=2.0/5,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-2-2-4-2-2-5/a4-b1_a6-k1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_d4-f1_h2-i1_h6-j1",110,False,False +"WURCS=2.0/5,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-4-2-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_d4-g1_e4-f1_g3-h1_i2-j1_j4-k1",10,False,False +"WURCS=2.0/5,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-1-3-1-4-5/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e4-f1_f6-g2_i2-j1_j4-k1_k6-l2",1,False,False +"WURCS=2.0/5,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-3-1-4-1-5/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g1_h2-i1_i4-j1_j3-k1",1,False,False +"WURCS=2.0/5,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-4-2-5/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_d4-g1_e4-f1_g4-h1_j2-k1_k4-l1",126,False,False +"WURCS=2.0/5,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1_i3-j1_j4-k1_k3-l1_l4-m1",1,False,False +"WURCS=2.0/5,14,13/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-3-1-4-1-4-5/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g4-h1_i2-j1_j4-k1_k3-l1_l4-m1",1,False,False +"WURCS=2.0/5,15,14/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-3-4-2-3-4-2-3-4-2-5/a4-b1_b3-c1_c3-d1_c4-e1_e3-f1_f3-g1_f4-h1_h3-i1_i3-j1_i4-k1_k3-l1_l3-m1_l4-n1_n3-o2",1,False,False +"WURCS=2.0/5,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-1-4-5-3-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o2",1,False,False +"WURCS=2.0/5,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-4-2-5-2-5-2/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1",105,False,False +"WURCS=2.0/5,17,16/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-1-4-5-3-1-4-5-1-4-5/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f3-g2_h4-i1_i3-j2_k2-l1_k6-o1_l4-m1_m3-n2_o4-p1_p3-q2",2,False,False +"WURCS=2.0/5,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-4-2-5-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g4-h1_i2-j1_i6-n1_j4-k1_k3-l1_l4-m1_n4-o1_o3-p1_p4-q1",103,False,False +"WURCS=2.0/5,18,17/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-3-1-4-1-4-1-4-5/a4-b1_a6-r1_b4-c1_c3-d1_c6-k1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_k2-l1_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1",1,False,False +"WURCS=2.0/5,25,24/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-5-2-5-2-5-4-2-5-2-5-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-o1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_o2-p1_p4-q1_q3-r1_r4-s1_s3-t1_t4-u1_u3-v1_v4-w1_w3-x1_x4-y1",105,False,False +"WURCS=2.0/5,5,4/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a2-b1_b3-c1_b4-d1_d3-e2",1,True,True +"WURCS=2.0/5,5,4/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a2-b1_b4-c1_c2-d1_c3-e1",1,False,False +"WURCS=2.0/5,5,4/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a2-b1_b4-c1_c2-d1_c3-e1",1,True,True +"WURCS=2.0/5,5,4/[a1122h-1x_1-5][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-5/a6-b1_b2-c1_c4-d1_d3-e1",1,False,False +"WURCS=2.0/5,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_b4-d1_d3-e2",1,True,True +"WURCS=2.0/5,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a3-b1_b4-c1_c2-d1_c3-e1",1,False,False +"WURCS=2.0/5,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a6-b1_b4-c1_c2-d1_c3-e1",1,False,False +"WURCS=2.0/5,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a3-b1_b3-c1_c2-d1_c3-e1",1,False,False +"WURCS=2.0/5,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a6-b1_b3-c1_c2-d1_c3-e1",1,False,False +"WURCS=2.0/5,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_c2-d1_c3-e1",1,False,False +"WURCS=2.0/5,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a6-b1_b4-c1_c2-d1_c3-e1",1,False,False +"WURCS=2.0/5,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a4-b1_b4-c1_c3-d1_d3-e1",1,False,False +"WURCS=2.0/5,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a4-b1_b4-c1_c3-d1_d3-e1",1,False,False +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a2-b1_b3-c1_b4-d1_d3-e2",105,False,False +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a6-b1_b3-c1_b4-d1_d3-e2",2,False,False +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-5/a6-b1_b3-c1_b4-d1_d3-e2",2,False,False +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a2-b1_b4-c1_c2-d1_c3-e1",105,False,False +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a2-b1_b4-c1_c2-d1_c3-e1",105,False,False +"WURCS=2.0/5,5,4/[u2112h][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a3-b1_b3-c1_c2-d1_c3-e1",1,False,False +"WURCS=2.0/5,5,4/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3-4-5/a3-b1_b3-c1_b4-d1_d3-e2",2,False,False +"WURCS=2.0/5,5,4/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_b4-d1_d3-e2",2,False,False +"WURCS=2.0/5,5,4/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-5/a3-b1_b3-c1_b4-d1_d3-e2",4,False,False +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_b4-d1_d3-e2",137,False,False +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a3-b1_b4-c1_c2-d1_c3-e2",13,False,False +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a3-b1_b3-c1_c2-d1_c3-e1",126,False,False +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a6-b1_b3-c1_c2-d1_c3-e1",105,False,False +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a6-b1_b4-c1_c2-d1_c3-e1",110,False,False +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_c2-d1_c3-e1",126,False,False +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a3-b1_b4-c1_c2-d1_c3-e1",126,False,False +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a6-b1_b3-c1_c2-d1_c3-e1",110,False,False +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a6-b1_b4-c1_c2-d1_c3-e1",105,False,False +"WURCS=2.0/5,5,4/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4-5/a4-b1_b3-c2_b4-d1_d3-e1",3,False,False +"WURCS=2.0/5,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3-4-5/a4-b1_b3-c1_c3-d1_c4-e1",5,False,False +"WURCS=2.0/5,5,4/[u2122h][a2112h-1b_1-5_3*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a4-b1_b4-c1_c3-d1_d3-e2",3,False,False +"WURCS=2.0/5,6,5/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-3-5/a3-b1_b3-c1_b4-d1_d2-e1_d3-f1",1,True,True +"WURCS=2.0/5,6,5/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1",1,True,True +"WURCS=2.0/5,6,5/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-3-4-5/a2-b1_a6-c1_c3-d1_c4-e1_e3-f2",2,True,True +"WURCS=2.0/5,6,5/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-2/a2-b1_a6-f1_b3-c1_b4-d1_d3-e2",2,False,False +"WURCS=2.0/5,6,5/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-2-3-4-5/a2-b1_a6-c1_c3-d1_c4-e1_e3-f2",2,False,False +"WURCS=2.0/5,6,5/[u2122h][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-5/a3-b1_a4-c1_c3-d1_d3-e1_d6-f2",4,True,True +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-3-4-5/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1",3,False,False +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4-5-3/a4-b1_b3-c2_b4-d1_d3-e1_d6-f2",3,False,False +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-3-4-5/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1",3,False,False +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5/a4-b1_b3-c1_c3-d1_d3-e1_e3-f2",1,False,False +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-5/a4-b1_b3-c1_c3-d1_c4-f1_d3-e2",10,False,False +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*N]/1-2-3-4-2-5/a4-b1_b3-c1_c3-d1_c4-e1_e3-f2",6,False,False +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-2-4-5/a4-b1_b3-c1_c4-d1_d2-e1_d3-f1",1,False,False +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5_3*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-5/a4-b1_b4-c1_c3-d1_d3-e2_e8-f2",3,False,False +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-2-4-5/a4-b1_b3-c1_c4-d1_d2-e1_d3-f1",146,False,False +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1",147,False,False +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1",146,False,False +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-5/a4-b1_b4-c1_c3-d1_d2-e1_e3-f1_e4-g1",1,True,True +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-5/a4-b1_b4-c1_c6-d1_d2-e1_e3-f1_e4-g1",1,False,False +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f3-g2",1,False,False +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f6-g2",1,True,True +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1_f3-g2",1,False,False +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1_f6-g2",1,True,True +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-5/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f3-g2",1,False,False +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-5/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f6-g2",1,False,False +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-1-2-3-1-4-5/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f3-g1",1,False,False +"WURCS=2.0/5,7,6/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-5/a2-b1_a6-e1_b3-c1_b4-d1_e4-f1_f3-g2",2,False,False +"WURCS=2.0/5,7,6/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-5-2-4/a2-b1_a6-f1_b3-c1_b4-d1_d3-e2_f4-g1",2,False,False +"WURCS=2.0/5,7,6/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-3-5/a2-b1_a6-e1_b4-c1_c3-d2_e4-f1_f3-g2",2,False,False +"WURCS=2.0/5,7,6/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-3-3-4-5/a4-b1_b3-c2_b4-f1_c8-d2_d8-e2_f3-g1",3,False,False +"WURCS=2.0/5,7,6/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-5-5/a3-b1_a4-g1_b3-c1_c3-d1_c4-f1_d3-e2",146,False,False +"WURCS=2.0/5,7,6/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-4-2-5/a4-b1_a6-g1_b4-c1_c3-d1_c6-e1_e2-f1",9,False,False +"WURCS=2.0/5,7,6/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1",157,False,False +"WURCS=2.0/5,8,7/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-3-5-2-3/a4-b1_b3-c2_b4-f1_c8-d2_d8-e2_f3-g1_g3-h2",1,False,False +"WURCS=2.0/5,8,7/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-5-2-4-3/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1_f3-g2_g8-h2",1,True,True +"WURCS=2.0/5,8,7/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-3-2-5/a4-b1_b3-c1_c3-d1_c4-e1_e3-f1_f4-g1_g3-h2",1,False,False +"WURCS=2.0/5,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-1-2-3-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-e1_e2-f1_f3-g1_f4-h1",1,True,True +"WURCS=2.0/5,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-3/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2",1,False,False +"WURCS=2.0/5,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-e1_e2-f1_f4-g1_g6-h2",1,False,False +"WURCS=2.0/5,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-1-4-5-3-3/a4-b1_b3-c1_b6-g1_c2-d1_d4-e1_e3-f2_g3-h1",106,False,False +"WURCS=2.0/5,8,7/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-3-4/a2-b1_a6-e1_b4-c1_c3-d2_e3-f1_e4-g1_g3-h2",2,True,True +"WURCS=2.0/5,8,7/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-3-4/a2-b1_a6-e1_b4-c1_c3-d2_e3-f1_e4-g1_g3-h2",2,False,False +"WURCS=2.0/5,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-5-2/a4-b1_b3-c1_b6-f1_c3-d1_d3-e2_f3-g1_f4-h1",6,False,False +"WURCS=2.0/5,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-5-2/a4-b1_b3-c1_b6-f1_c3-d1_d6-e2_f3-g1_f4-h1",6,False,False +"WURCS=2.0/5,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4-2/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1",141,False,False +"WURCS=2.0/5,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g3-h1_g4-i1",1,False,False +"WURCS=2.0/5,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1_h3-i2",1,False,False +"WURCS=2.0/5,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-3-1/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1",2,False,False +"WURCS=2.0/5,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-5-3-1/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1",1,True,True +"WURCS=2.0/5,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-3-1-4-5/a4-b1_a6-i1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1",1,False,False +"WURCS=2.0/5,9,8/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-2-4-2-5/a4-b1_a6-i1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1",1,True,True +"WURCS=2.0/5,9,8/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-4-3-2-5/a4-b1_b3-c1_b6-g1_c3-d1_c6-f2_d3-e2_g4-h1_h2-i1",4,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1a_1-5_6*OPO/3O/3=O]/1-2-3-4-4-4-4-4-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e2-f1_g3-h1_g6-i1",1,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1a_1-5_6*OPO/3O/3=O]/1-2-3-4-5-4-4-4-5/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-i1_g2-h1",1,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-2-4-2-5/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1_h4-i1",6,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-4-2/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_e4-f1_h2-i1",1,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",217,False,False +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4-4-4/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g3-h1_g6-i1",5,False,False +"WURCS=2.0/6,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g3-h1_g4-i1_i3-j2",1,False,False +"WURCS=2.0/6,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-3-1-4-5-6/a4-b1_a6-j1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1_h3-i2",1,False,False +"WURCS=2.0/6,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a1221m-1a_1-5]/1-1-2-3-1-3-1-4-5-6/a4-b1_a6-j1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1_h4-i1",1,False,False +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-4-2-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i4-j1",1,False,False +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1_h4-i1_i3-j2",1,False,False +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1_h4-i1_i6-j2",1,True,True +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-4-2-5-6/a4-b1_a6-j1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",160,False,False +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1_i2-j1",3,False,False +"WURCS=2.0/6,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-3-1-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i4-j1_j3-k2",1,False,False +"WURCS=2.0/6,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j4-k1",1,True,True +"WURCS=2.0/6,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-3-3/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i3-j1_i6-k1",1,True,True +"WURCS=2.0/6,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-6-4/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i3-j1_i4-k1",1,True,True +"WURCS=2.0/6,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-3-1-5-4-6/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h3-i1_h4-j1_j3-k2",1,True,True +"WURCS=2.0/6,11,10/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",11,True,True +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-4-2-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e3-f1_e4-g1_i2-j1_j4-k1",1,True,True +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_e4-f1_h2-i1_i4-j1_j6-k2",1,False,False +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j6-k2",176,False,False +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",6,False,False +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-4-2-5-6/a4-b1_a6-k1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_e4-f1_h2-i1_i4-j1",115,False,False +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",43,False,False +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f2-g1_h2-i1_i4-j1_j2-k1",149,False,False +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1_k3-l2",1,False,False +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j3-k1_j4-l1",1,False,False +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j4-k1_k3-l2",1,False,False +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j4-k1_k6-l2",1,True,True +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-4-5-6/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j3-k2",3,False,False +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-6-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i3-j1_i4-k1_k3-l2",1,False,False +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-6-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i3-j1_i4-k1_k3-l2",1,True,True +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e3-f1_e4-g1_i2-j1_j3-k1_j4-l1",1,True,True +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-4-2-5-6-5/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",126,False,False +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e3-f1_f3-g2_i2-j1_j3-k1_k3-l2",110,False,False +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-4-2-6-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_d4-g1_e4-f1_g4-h1_i2-j1_j3-k1_j4-l1",3,False,False +"WURCS=2.0/6,13,12/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j3-k1_j4-l1_l3-m2",1,True,True +"WURCS=2.0/6,13,12/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-1-2-3-1-4-5-6-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f2-g1_f3-h1_i2-j1_j3-k1_k2-l1_k3-m1",1,False,False +"WURCS=2.0/6,13,12/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f2-g1_f3-h1_i2-j1_j4-k1_k2-l1_k3-m1",1,False,False +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-6-4-2-5-6-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-h1_f2-g1_i2-j1_j3-k1_j4-m1_k2-l1",146,False,False +"WURCS=2.0/6,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-4-2-5-2-5-6/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g4-h1_i2-j1_j4-k1_k3-l1_l4-m1",105,False,False +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e4-f1_f3-g2_i2-j1_i6-m1_j4-k1_k3-l2_m4-n1_n3-o2",105,False,False +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e4-f1_f6-g2_i2-j1_i6-m1_j4-k1_k6-l2_m4-n1_n6-o2",105,False,False +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-4-2-5-2-5-6/a4-b1_a6-o1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_d4-g1_e4-f1_g4-h1_j2-k1_j6-m1_k4-l1_m4-n1",110,False,False +"WURCS=2.0/6,18,17/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-1-4-5-3-1-4-5-1-4-5-6/a4-b1_a6-r1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f3-g2_h4-i1_i3-j2_k2-l1_k6-o1_l4-m1_m3-n2_o4-p1_p3-q2",2,False,False +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-2-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c4-k1_c6-l1_d2-e1_d4-h1_e4-f1_f6-g2_h4-i1_i6-j2_l2-m1_l6-p1_m4-n1_n6-o2_p4-q1_q6-r2",105,False,False +"WURCS=2.0/6,24,23/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-2-5-2-4-2-5-2-5-2-5-2-5-2-6/a4-b1_a6-x1_b4-c1_c3-d1_c6-n1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_n2-o1_o4-p1_p3-q1_q4-r1_r3-s1_s4-t1_t3-u1_u4-v1_v3-w1",104,False,False +"WURCS=2.0/6,7,6/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-5-6/a4-b1_b4-c1_c3-d1_d3-e1_e2-f1_e3-g1",1,False,False +"WURCS=2.0/6,7,6/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f6-g2",1,True,True +"WURCS=2.0/6,7,6/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1_f6-g2",1,False,False +"WURCS=2.0/6,7,6/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-5-6/a4-b1_b4-c1_c3-d1_d3-e1_e2-f1_e3-g1",106,False,False +"WURCS=2.0/6,7,6/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f6-g2",147,False,False +"WURCS=2.0/6,7,6/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1_f6-g2",146,False,False +"WURCS=2.0/6,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6/a4-b1_b4-c1_c6-d1_d2-e1_e3-f1_e4-g1_g3-h2",1,False,False +"WURCS=2.0/6,8,7/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2",1,False,False +"WURCS=2.0/6,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2",147,False,False +"WURCS=2.0/6,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-4-6/a4-b1_a6-h1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1",9,False,False +"WURCS=2.0/6,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g3-h1_g4-i1",1,False,False +"WURCS=2.0/6,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1_h3-i2",1,False,False +"WURCS=2.0/6,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1_h6-i2",173,False,False +"WURCS=2.0/6,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1",165,False,False +"WURCS=2.0/7,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g3-h1_g4-i1_i3-j2",1,False,False +"WURCS=2.0/7,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-4-2/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1",1,False,False +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-2-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1_h3-i1_h4-j1_j3-k2",1,False,False +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-6-7/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i4-j1_j6-k2",1,True,True +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-4-2-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j4-k1",1,False,False +"WURCS=2.0/7,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-4-2-6-7/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e3-f1_e4-g1_i2-j1_j4-k1_k6-l2",1,False,False +"WURCS=2.0/7,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1_k3-l2",1,True,True +"WURCS=2.0/7,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j3-k1_j4-l1",1,True,True +"WURCS=2.0/7,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-4-2-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j4-k1_k6-l2",1,False,False +"WURCS=2.0/7,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6-7/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",112,False,False +"WURCS=2.0/7,13,12/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-2-4-2-5-6-7/a4-b1_a6-m1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e4-f1_f3-g2_i2-j1_j4-k1_k3-l2",1,False,False +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_e3-f1_e4-g1_g3-h2_j2-k1_k3-l1_k4-m1",1,False,False +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-2-4-2-6-7/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_e3-f1_e4-g1_g3-h2_j2-k1_k4-l1_l6-m2",1,False,False +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j3-k1_j4-l1_l3-m2",1,True,True +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-2-4-2-7-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e4-f1_f6-g2_i2-j1_j3-k1_j4-l1_l3-m2",1,False,False +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f2-g1_f3-h1_i2-j1_j4-k1_k2-l1_k3-m1",146,False,False +"WURCS=2.0/7,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-2-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_e3-f1_e4-g1_g3-h2_j2-k1_k3-l1_k4-m1_m3-n2",1,False,False +"WURCS=2.0/7,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-2-6-5-7-4-2/a4-b1_b4-c1_c3-d1_c6-m1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i3-j1_i4-k1_k3-l2_m2-n1",1,False,False +"WURCS=2.0/7,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-5-6-7-4-2-5-6-7-6/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f2-g1_f3-h1_i2-j1_j3-k1_k2-l1_k3-m1",120,False,False +"WURCS=2.0/7,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-7-5/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h6-i2_j2-k1_k4-l1_l3-m1_m3-n1_m4-o1",1,False,False +"WURCS=2.0/7,16,15/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-6-7/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o2",1,False,False +"WURCS=2.0/7,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-2-5-2-7/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_l6-o1_m4-n1_o4-p1_p3-q1_q3-r1",1,False,False diff --git a/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/protein_cold_scored_glycans.csv b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/protein_cold_scored_glycans.csv new file mode 100644 index 0000000000000000000000000000000000000000..b5c5aa6d86c48106a3c6ad0d054d2aef74a33a24 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/inputs/current_glycan_sets/protein_cold_scored_glycans.csv @@ -0,0 +1,827 @@ +canonical_wurcs,scored_rows +"WURCS=2.0/1,1,0/[AUd1122h_5*OPO/3O/3=O]/1/",1 +"WURCS=2.0/1,1,0/[AUd21122h_5*NCC/3=O_9*OCC/3=O]/1/",21 +"WURCS=2.0/1,1,0/[AUd21122h_5*NCCO/3=O]/1/",23 +"WURCS=2.0/1,1,0/[Aad21122h-2b_2-6_5*NCC/3=O]/1/",1 +"WURCS=2.0/1,1,0/[a1122h-1a_1-5]/1/",1 +"WURCS=2.0/1,1,0/[a1122h-1a_1-5_2*OC(CCCCCC$4)/3=O_3*OC(CCCCCC$4)/3=O_4*F_6*OC(CCCCCC$4)/3=O]/1/",1 +"WURCS=2.0/1,1,0/[a1122h-1a_1-5_6*OPO/3O/3=O]/1/",1 +"WURCS=2.0/1,1,0/[a1122h-1b_1-5]/1/",1 +"WURCS=2.0/1,1,0/[a1122h-1x_1-5_2*OC(CCCCCC$4)/3=O_3*OC(CCCCCC$4)/3=O_4*OC(CCCCCC$4)/3=O]/1/",1 +"WURCS=2.0/1,1,0/[a1212h-1a_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1/",104 +"WURCS=2.0/1,1,0/[a1212m-1a_1-4_2*OCC/3=O_3*OC_5*OCC/3=O]/1/",104 +"WURCS=2.0/1,1,0/[a1222h-1a_1-5_2*OCC_3*NO_6*OCCC/4C/4C/3=O]/1/",69 +"WURCS=2.0/1,1,0/[a1x2h-1b_1-4_3*N]/1/",3 +"WURCS=2.0/1,1,0/[a2112h-1a_1-5]/1/",1 +"WURCS=2.0/1,1,0/[a2112h-1a_1-5_2*NCC/3=O_3*OCC/3=O_4*OCC/3=O_6*OCC/3=O]/1/",1 +"WURCS=2.0/1,1,0/[a2112h-1b_1-5]/1/",1 +"WURCS=2.0/1,1,0/[a2112h-1b_1-5_2*NCC/3=O]/1/",1 +"WURCS=2.0/1,1,0/[a2112h-1b_1-5_3*OSO/3=O/3=O]/1/",1 +"WURCS=2.0/1,1,0/[a2122h-1b_1-5]/1/",2 +"WURCS=2.0/1,1,0/[a2122h-1b_1-5_2*NCC/3=O_3*OSO/3=O/3=O_6*OSO/3=O/3=O]/1/",1 +"WURCS=2.0/1,1,0/[a2122h-1b_1-5_2*NCCO/3=O]/1/",1 +"WURCS=2.0/1,1,0/[a2122h-1b_1-5_6*OC]/1/",1 +"WURCS=2.0/1,1,0/[a2122h-1b_1-5_6*OPO/3O/3=O]/1/",1 +"WURCS=2.0/1,1,0/[a212m-1a_1-4_3*OC(CCCCCC$4)]/1/",6 +"WURCS=2.0/1,1,0/[a2211m-1a_1-5]/1/",1 +"WURCS=2.0/1,1,0/[a2212h-1b_1-5_2*NCC/3=O_3*NCC/3=O]/1/",104 +"WURCS=2.0/1,1,0/[ax22xh-1d_1-5_2*OCC/3=O_3*OCC/3=O_4*OCC/3=O]/1/",2 +"WURCS=2.0/1,1,0/[axxxh-1x_1-4_2*SC]/1/",1 +"WURCS=2.0/1,1,0/[axxxxh-1a_1-5_2*NCC/3=O]/1/",1 +"WURCS=2.0/1,1,0/[hO222h]/1/",4 +"WURCS=2.0/1,1,0/[u1122h]/1/",24 +"WURCS=2.0/1,1,0/[u1122h_2*NCC/3=O]/1/",1 +"WURCS=2.0/1,1,0/[u1122h_6*OPO/3O/3=O]/1/",23 +"WURCS=2.0/1,1,0/[u1211h]/1/",1 +"WURCS=2.0/1,1,0/[u1221m]/1/",24 +"WURCS=2.0/1,1,0/[u2112h]/1/",24 +"WURCS=2.0/1,1,0/[u2112h_2*NCC/3=O]/1/",24 +"WURCS=2.0/1,1,0/[u2112h_2*NCC/3=O_3*OSO/3=O/3=O]/1/",1 +"WURCS=2.0/1,1,0/[u2112h_2*NCC/3=O_4*OSO/3=O/3=O]/1/",10 +"WURCS=2.0/1,1,0/[u2112h_2*NCC/3=O_6*OSO/3=O/3=O]/1/",1 +"WURCS=2.0/1,1,0/[u2112h_2*NCCO/3=O]/1/",1 +"WURCS=2.0/1,1,0/[u2112h_2*OCC/3=O_3*OCC/3=O_4*NCC/3=O_6*OCC/3=O]/1/",1 +"WURCS=2.0/1,1,0/[u2112h_3*OSO/3=O/3=O]/1/",23 +"WURCS=2.0/1,1,0/[u2112h_4*OSO/3=O/3=O]/1/",1 +"WURCS=2.0/1,1,0/[u2112h_6*OSO/3=O/3=O]/1/",1 +"WURCS=2.0/1,1,0/[u2122h]/1/",23 +"WURCS=2.0/1,1,0/[u2122h_2*NCC/3=O]/1/",24 +"WURCS=2.0/1,1,0/[u2122h_2*NCC/3=O_4*OSO/3=O/3=O]/1/",1 +"WURCS=2.0/1,1,0/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O]/1/",24 +"WURCS=2.0/1,1,0/[u2122h_2*NCCO/3=O]/1/",20 +"WURCS=2.0/1,1,0/[u2122h_6*OPO/3O/3=O]/1/",18 +"WURCS=2.0/1,1,0/[u212h]/1/",1 +"WURCS=2.0/1,1,0/[u2211m]/1/",23 +"WURCS=2.0/1,1,0/[u221h_2*OC(CCCCCC$4)_3*OC(CCCCCC$4)_4*OC(CCCCCC$4)]/1/",2 +"WURCS=2.0/1,1,0/[u222h]/1/",1 +"WURCS=2.0/1,2,1/[Aad21122h-2a_2-6_5*NCC/3=O]/1-1/a8-b2",1 +"WURCS=2.0/1,2,1/[a2112h-1b_1-5]/1-1/a2-b1",1 +"WURCS=2.0/1,2,1/[a2112h-1b_1-5]/1-1/a3-b1",1 +"WURCS=2.0/1,2,1/[a2112h-1b_1-5]/1-1/a4-b1",1 +"WURCS=2.0/1,2,1/[a2112h-1b_1-5]/1-1/a6-b1",1 +"WURCS=2.0/1,2,1/[a2112h-1b_1-5_2*NCC/3=O]/1-1/a6-b1",1 +"WURCS=2.0/1,3,2/[a2122h-1b_1-5_2*NCC/3=O]/1-1-1/a4-b1_b4-c1",1 +"WURCS=2.0/1,4,3/[a1122h-1a_1-5]/1-1-1-1/a3-b1_b2-c1_c2-d1",1 +"WURCS=2.0/1,6,5/[a2122h-1b_1-5_2*NCC/3=O]/1-1-1-1-1-1/a4-b1_b4-c1_c4-d1_d4-e1_e4-f1",1 +"WURCS=2.0/2,10,9/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1_g3-h1_h3-i1_i3-j1",2 +"WURCS=2.0/2,10,9/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1_e2-f1_f2-g1_g2-h1_h2-i1_i2-j1",2 +"WURCS=2.0/2,10,9/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_c6-j1_d3-e1_e3-f1_f3-g1_g3-h1_h3-i1",2 +"WURCS=2.0/2,10,9/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_e6-j1_f3-g1_g3-h1_h3-i1",2 +"WURCS=2.0/2,10,9/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2/a3-b1_b3-c1_c3-d1_d3-e1_e3-f1_f3-g1_g3-h1_h3-i1_i3-j1",4 +"WURCS=2.0/2,10,9/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1_g6-h1_h6-i1_i6-j1",4 +"WURCS=2.0/2,11,10/[AUd21122h_5*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-2-2-2-2-2-2-2-2/a8-b2_b8-c2_c8-d2_d8-e2_e8-f2_f8-g2_g8-h2_h8-i2_i8-j2_j8-k2",2 +"WURCS=2.0/2,11,10/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1_g6-h1_h6-i1_i6-j1_j6-k1",4 +"WURCS=2.0/2,2,1/[Aad21122h-2b_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a8-b2",1 +"WURCS=2.0/2,2,1/[a1122h-1b_1-5][a1122h-1a_1-5]/1-2/a6-b1",1 +"WURCS=2.0/2,2,1/[a1222h-1b_1-5][a1122h-1b_1-5]/1-2/a4-b1",4 +"WURCS=2.0/2,2,1/[a2112h-1a_1-5_2*NCC/3=O][Aad21122h-2b_2-6_5*NCC/3=O]/1-2/a6-b2",1 +"WURCS=2.0/2,2,1/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2/a3-b1",1 +"WURCS=2.0/2,2,1/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a3-b1",1 +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a3-b2",1 +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a6-b2",1 +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][a1221m-1a_1-5]/1-2/a2-b1",1 +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][a2112h-1a_1-5]/1-2/a2-b1",1 +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][a2112h-1a_1-5]/1-2/a3-b1",1 +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2/a3-b1",1 +"WURCS=2.0/2,2,1/[a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2/a3-b1",1 +"WURCS=2.0/2,2,1/[a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2/a3-b1",1 +"WURCS=2.0/2,2,1/[a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2/a3-b1",1 +"WURCS=2.0/2,2,1/[a2122h-1b_1-5][a2112h-1a_1-5]/1-2/a6-b1",1 +"WURCS=2.0/2,2,1/[a2122h-1b_1-5][a2112h-1b_1-5]/1-2/a4-b1",1 +"WURCS=2.0/2,2,1/[a2122h-1b_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a4-b1",1 +"WURCS=2.0/2,2,1/[u1122h][a1122h-1a_1-5]/1-2/a2-b1",4 +"WURCS=2.0/2,2,1/[u1122h][a1122h-1a_1-5]/1-2/a6-b1",177 +"WURCS=2.0/2,2,1/[u2112h][Aad21122h-2a_2-6]/1-2/a6-b2",2 +"WURCS=2.0/2,2,1/[u2112h][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a6-b2",189 +"WURCS=2.0/2,2,1/[u2112h][a1221m-1a_1-5]/1-2/a2-b1",203 +"WURCS=2.0/2,2,1/[u2112h][a2112h-1a_1-5]/1-2/a2-b1",201 +"WURCS=2.0/2,2,1/[u2112h][a2112h-1a_1-5_2*NCC/3=O]/1-2/a3-b1",202 +"WURCS=2.0/2,2,1/[u2112h][a2112h-1b_1-5]/1-2/a2-b1",200 +"WURCS=2.0/2,2,1/[u2112h][a2112h-1b_1-5]/1-2/a3-b1",200 +"WURCS=2.0/2,2,1/[u2112h][a2112h-1b_1-5]/1-2/a4-b1",126 +"WURCS=2.0/2,2,1/[u2112h][a2112h-1b_1-5]/1-2/a6-b1",126 +"WURCS=2.0/2,2,1/[u2112h][a2122A-1b_1-5]/1-2/a3-b1",197 +"WURCS=2.0/2,2,1/[u2112h][a2122A-1b_1-5]/1-2/a6-b1",195 +"WURCS=2.0/2,2,1/[u2112h][a2122A-1b_1-5_3*OSO/3=O/3=O]/1-2/a3-b1",3 +"WURCS=2.0/2,2,1/[u2112h][a2122h-1a_1-5_2*NCC/3=O]/1-2/a4-b1",3 +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a3-b2",201 +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a6-b2",208 +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2/a3-b1",204 +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1a_1-5_2*NCCO/3=O]/1-2/a3-b1",1 +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1a_1-5_6*OSO/3=O/3=O]/1-2/a3-b1",1 +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1b_1-5]/1-2/a3-b1",212 +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1b_1-5]/1-2/a6-b1",3 +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2/a3-b1",190 +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2/a6-b1",126 +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a3-b1",202 +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O][a2122h-1b_1-5]/1-2/a4-b1",1 +"WURCS=2.0/2,2,1/[u2112h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1a_1-5]/1-2/a3-b1",1 +"WURCS=2.0/2,2,1/[u2112h_2*NCCO/3=O][a2112h-1b_1-5]/1-2/a3-b1",1 +"WURCS=2.0/2,2,1/[u2122h][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a6-b2",2 +"WURCS=2.0/2,2,1/[u2122h][a2112h-1a_1-5]/1-2/a6-b1",202 +"WURCS=2.0/2,2,1/[u2122h][a2112h-1b_1-5]/1-2/a4-b1",221 +"WURCS=2.0/2,2,1/[u2122h][a2122h-1b_1-5]/1-2/a2-b1",3 +"WURCS=2.0/2,2,1/[u2122h][a2122h-1b_1-5]/1-2/a3-b1",9 +"WURCS=2.0/2,2,1/[u2122h][a2122h-1b_1-5]/1-2/a4-b1",205 +"WURCS=2.0/2,2,1/[u2122h][a2211m-1a_1-5]/1-2/a6-b1",1 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2/a6-b2",2 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a1122h-1b_1-5]/1-2/a4-b1",197 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a1221m-1a_1-5]/1-2/a4-b1",196 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a1221m-1a_1-5]/1-2/a6-b1",3 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a1221m-1b_1-5]/1-2/a3-b1",200 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1a_1-5]/1-2/a4-b1",200 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5]/1-2/a4-b1",216 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2/a3-b1",106 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2/a4-b1",202 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_3*OSO/3=O/3=O_6*OSO/3=O/3=O]/1-2/a4-b1",1 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_4*OSO/3=O/3=O_6*OSO/3=O/3=O]/1-2/a4-b1",110 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a3-b1",202 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a4-b1",206 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O_4*OSO/3=O/3=O]/1-2/a4-b1",171 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O_6*OSO/3=O/3=O]/1-2/a4-b1",195 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_4*OSO/3=O/3=O]/1-2/a4-b1",200 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_4*OSO/3=O/3=O_6*OSO/3=O/3=O]/1-2/a4-b1",195 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2112h-1b_1-5_6*OPO/3O/3=O]/1-2/a4-b1",110 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2122A-1b_1-5]/1-2/a3-b1",171 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O_3*OC^RCO/4=O/3C]/1-2/a4-b1",105 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_3*OCC/3=O][a2112h-1b_1-5_2*NCC/3=O_4*OSO/3=O/3=O_6*OSO/3=O/3=O]/1-2/a4-b1",1 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_6*OPO/3O/3=O][a2112h-1b_1-5]/1-2/a4-b1",110 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a1221m-1a_1-5]/1-2/a3-b1",3 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5]/1-2/a3-b1",110 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2/a4-b1",110 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a4-b1",99 +"WURCS=2.0/2,2,1/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O_6*OSO/3=O/3=O]/1-2/a4-b1",195 +"WURCS=2.0/2,2,1/[u2122h_6*OSO/3=O/3=O][a2112h-1b_1-5]/1-2/a4-b1",200 +"WURCS=2.0/2,2,1/[u2122h_6*OSO/3=O/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2/a4-b1",200 +"WURCS=2.0/2,3,2/[AUd21122h_5*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2/a8-b2_b8-c2",207 +"WURCS=2.0/2,3,2/[Aad21122h-2b_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2/a8-b2_b8-c2",1 +"WURCS=2.0/2,3,2/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2/a3-b1_a6-c1",9 +"WURCS=2.0/2,3,2/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2/a4-b1_a6-c1",9 +"WURCS=2.0/2,3,2/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2/a6-b1_b3-c1",9 +"WURCS=2.0/2,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a4-b1_a6-c1",1 +"WURCS=2.0/2,3,2/[a2122h-1b_1-5][a2122h-1a_1-5]/1-2-2/a6-b1_b6-c1",1 +"WURCS=2.0/2,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-1/a4-b1_b4-c1",1 +"WURCS=2.0/2,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-1/a4-b1_b6-c1",1 +"WURCS=2.0/2,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-2/a4-b1_b3-c1",1 +"WURCS=2.0/2,3,2/[u1122h][a1122h-1a_1-5]/1-2-2/a4-b1_a6-c1",3 +"WURCS=2.0/2,3,2/[u1122h][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a2-b1_a6-c1",2 +"WURCS=2.0/2,3,2/[u2112h][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a3-b1_a6-c1",1 +"WURCS=2.0/2,3,2/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a3-b1_a6-c1",190 +"WURCS=2.0/2,3,2/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a4-b1_a6-c1",200 +"WURCS=2.0/2,3,2/[u2122h][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2/a6-b2_b8-c2",2 +"WURCS=2.0/2,3,2/[u2122h][a2122h-1a_1-5]/1-2-2/a2-b1_b2-c1",2 +"WURCS=2.0/2,3,2/[u2122h][a2122h-1a_1-5]/1-2-2/a3-b1_b3-c1",2 +"WURCS=2.0/2,3,2/[u2122h][a2122h-1a_1-5]/1-2-2/a4-b1_b6-c1",3 +"WURCS=2.0/2,3,2/[u2122h][a2122h-1a_1-5]/1-2-2/a6-b1_b4-c1",2 +"WURCS=2.0/2,3,2/[u2122h][a2122h-1a_1-5]/1-2-2/a6-b1_b6-c1",202 +"WURCS=2.0/2,3,2/[u2122h][a2122h-1b_1-5]/1-2-2/a2-b1_b2-c1",2 +"WURCS=2.0/2,3,2/[u2122h][a2122h-1b_1-5]/1-2-2/a3-b1_b3-c1",10 +"WURCS=2.0/2,3,2/[u2122h][a2122h-1b_1-5]/1-2-2/a4-b1_b3-c1",2 +"WURCS=2.0/2,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5]/1-2-2/a4-b1_b3-c1",171 +"WURCS=2.0/2,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5]/1-2-2/a4-b1_b4-c1",1 +"WURCS=2.0/2,3,2/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a3-b1_a6-c1",17 +"WURCS=2.0/2,3,2/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-2/a4-b1_b4-c1",210 +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a2-b1_b2-c1_c2-d1",9 +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a3-b1_a4-c1_a6-d1",9 +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a3-b1_a6-c1_c2-d1",9 +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a3-b1_a6-c1_c3-d1",9 +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a3-b1_b2-c1_c2-d1",9 +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a6-b1_b3-c1_b6-d1",9 +"WURCS=2.0/2,4,3/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2/a6-b1_b3-c1_c2-d1",9 +"WURCS=2.0/2,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-1-1/a4-b1_b3-c1_b6-d1",1 +"WURCS=2.0/2,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-1-2/a3-b1_b3-c1_c4-d1",1 +"WURCS=2.0/2,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-1-2/a4-b1_b6-c1_c3-d1",1 +"WURCS=2.0/2,4,3/[u1122h][a1122h-1a_1-5]/1-2-2-2/a2-b1_b2-c1_c2-d1",3 +"WURCS=2.0/2,4,3/[u1122h][a1122h-1a_1-5]/1-2-2-2/a3-b1_a4-c1_a6-d1",3 +"WURCS=2.0/2,4,3/[u1122h][a1122h-1a_1-5]/1-2-2-2/a3-b1_a6-c1_c2-d1",3 +"WURCS=2.0/2,4,3/[u1122h][a1122h-1a_1-5]/1-2-2-2/a3-b1_a6-c1_c3-d1",3 +"WURCS=2.0/2,4,3/[u1122h][a1122h-1a_1-5]/1-2-2-2/a3-b1_a6-c1_c6-d1",3 +"WURCS=2.0/2,4,3/[u1122h][a1122h-1a_1-5]/1-2-2-2/a6-b1_b3-c1_c2-d1",3 +"WURCS=2.0/2,4,3/[u2122h][a2122h-1b_1-5]/1-2-2-2/a4-b1_b3-c1_c4-d1",3 +"WURCS=2.0/2,4,3/[u2122h][a2122h-1b_1-5]/1-2-2-2/a4-b1_b4-c1_c3-d1",2 +"WURCS=2.0/2,5,4/[a1122h-1b_1-5][a1122h-1a_1-5]/1-2-2-2-2/a3-b1_a6-c1_c3-d1_c6-e1",1 +"WURCS=2.0/2,5,4/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2/a3-b1_a6-c1_c3-d1_d2-e1",9 +"WURCS=2.0/2,5,4/[u1122h][a1122h-1a_1-5]/1-2-2-2-2/a3-b1_a6-c1_c2-d1_d2-e1",200 +"WURCS=2.0/2,5,4/[u1122h][a1122h-1a_1-5]/1-2-2-2-2/a3-b1_a6-c1_c3-d1_d2-e1",3 +"WURCS=2.0/2,5,4/[u1122h][a1122h-1a_1-5]/1-2-2-2-2/a3-b1_a6-d1_b2-c1_d2-e1",203 +"WURCS=2.0/2,5,4/[u1122h][a1122h-1a_1-5]/1-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1",3 +"WURCS=2.0/2,5,4/[u2122h][a2122h-1b_1-5]/1-2-2-2-2/a3-b1_b4-c1_c4-d1_d4-e1",2 +"WURCS=2.0/2,5,4/[u2122h][a2122h-1b_1-5]/1-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1",5 +"WURCS=2.0/2,6,5/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-c1_c3-d1_c6-e1_e2-f1",9 +"WURCS=2.0/2,6,5/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-c1_c3-d1_c6-f1_d2-e1",9 +"WURCS=2.0/2,6,5/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2-2/a6-b1_b3-c1_b6-e1_c2-d1_e2-f1",9 +"WURCS=2.0/2,6,5/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-1-2-1-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1",1 +"WURCS=2.0/2,6,5/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-c1_c3-d1_c6-f1_d2-e1",3 +"WURCS=2.0/2,6,5/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_d6-f1",3 +"WURCS=2.0/2,6,5/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_e2-f1",3 +"WURCS=2.0/2,6,5/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d6-e1_e2-f1",3 +"WURCS=2.0/2,6,5/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1",3 +"WURCS=2.0/2,6,5/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1_e6-f1",3 +"WURCS=2.0/2,6,5/[u1122h][a1122h-1b_1-5]/1-2-2-2-2-2/a4-b1_b4-c1_c4-d1_d4-e1_e4-f1",5 +"WURCS=2.0/2,6,5/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1",7 +"WURCS=2.0/2,6,5/[u2122h][a2122h-1b_1-5]/1-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1",5 +"WURCS=2.0/2,7,6/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_d6-f1_f2-g1",9 +"WURCS=2.0/2,7,6/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2/a3-b1_a6-c1_c3-d1_c6-f1_d2-e1_f2-g1",3 +"WURCS=2.0/2,7,6/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_d6-f1_f2-g1",3 +"WURCS=2.0/2,7,6/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_d6-g1_e2-f1",3 +"WURCS=2.0/2,7,6/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1_e6-g1",3 +"WURCS=2.0/2,7,6/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2/a2-b1_b2-c1_c2-d1_d2-e1_e2-f1_f2-g1",2 +"WURCS=2.0/2,7,6/[u2122h][a2122h-1a_1-5]/1-2-2-2-2-2-2/a6-b1_b6-c1_c6-d1_d6-e1_e6-f1_f6-g1",6 +"WURCS=2.0/2,8,7/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_d6-g1_e2-f1_g2-h1",9 +"WURCS=2.0/2,8,7/[a1122h-1x_1-5][a1122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1_e6-g1_g2-h1",9 +"WURCS=2.0/2,8,7/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_a6-d1_b2-c1_d3-e1_d6-g1_e2-f1_g2-h1",3 +"WURCS=2.0/2,8,7/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1_e6-g1_g2-h1",175 +"WURCS=2.0/2,8,7/[u1122h][a1122h-1a_1-5]/1-2-2-2-2-2-2-2/a3-b1_a6-e1_b2-c1_c2-d1_e3-f1_e6-h1_f2-g1",3 +"WURCS=2.0/3,10,9/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1",1 +"WURCS=2.0/3,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3-3-3-3-3/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e2-f1_g3-h1_g6-i1_i2-j1",1 +"WURCS=2.0/3,10,9/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1",9 +"WURCS=2.0/3,3,2/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a2-b1_b3-c1",1 +"WURCS=2.0/3,3,2/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a2-b1_b4-c1",1 +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a3-b1_b3-c2",1 +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a3-b1_a6-c2",1 +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_b2-c1",1 +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_b3-c1",1 +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b3-c1",1 +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b4-c1",1 +"WURCS=2.0/3,3,2/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a6-b1_b4-c1",1 +"WURCS=2.0/3,3,2/[a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a2-b1_a3-c1",1 +"WURCS=2.0/3,3,2/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a3-b1_b4-c1",1 +"WURCS=2.0/3,3,2/[a2112h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_b3-c1",1 +"WURCS=2.0/3,3,2/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b4-c1",1 +"WURCS=2.0/3,3,2/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a6-b1_b4-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3/a3-b1_a4-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b3-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b4-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",2 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_a4-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a3-b1_b3-c2",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a4-b1_b3-c2",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3/a3-b1_b3-c2",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3/a4-b1_b3-c2",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3/a4-b1_b6-c2",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a3-b1_a4-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b3-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a3-b1_b4-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b6-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",1 +"WURCS=2.0/3,3,2/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",1 +"WURCS=2.0/3,3,2/[a2122h-1x_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a4-b1_b3-c2",1 +"WURCS=2.0/3,3,2/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b3-c1",1 +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a4-b1_b6-c2",1 +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCCO/3=O]/1-2-3/a4-b1_b6-c2",1 +"WURCS=2.0/3,3,2/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5]/1-2-3/a4-b1_b4-c1",9 +"WURCS=2.0/3,3,2/[h2112h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3/a3-b1_a4-c1",4 +"WURCS=2.0/3,3,2/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a2-b1_b3-c1",105 +"WURCS=2.0/3,3,2/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a2-b1_b4-c1",122 +"WURCS=2.0/3,3,2/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a2-b1_b4-c1",105 +"WURCS=2.0/3,3,2/[u1221m][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a3-b1_b4-c1",3 +"WURCS=2.0/3,3,2/[u2112h][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3/a2-b1_a3-c1",202 +"WURCS=2.0/3,3,2/[u2112h][a1221m-1a_1-5][a2112h-1a_1-5_2*NCCO/3=O]/1-2-3/a2-b1_a3-c1",1 +"WURCS=2.0/3,3,2/[u2112h][a1221m-1a_1-5][a2112h-1a_1-5_2*N]/1-2-3/a2-b1_a3-c1",1 +"WURCS=2.0/3,3,2/[u2112h][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b4-c1",17 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a3-b1_b3-c2",146 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_a6-c2",202 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a3-b1_b4-c1",2 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",144 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_a6-c1",203 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_b2-c1",188 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_b3-c1",200 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a6-b1_b3-c1",110 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3/a6-b1_b4-c1",200 +"WURCS=2.0/3,3,2/[u2112h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_b3-c2",202 +"WURCS=2.0/3,3,2/[u2122h][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3/a3-b1_a4-c1",2 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_4*OCC/3=O_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",6 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_4*OC_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",2 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",220 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",205 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OC]/1-2-3/a4-b1_b3-c2",2 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3/a4-b1_b6-c2",1 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*N]/1-2-3/a4-b1_b3-c2",6 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*N]/1-2-3/a4-b1_b6-c2",6 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",6 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",7 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",210 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a3-b1_b3-c1",17 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b4-c1",199 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",3 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",138 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2122A-1b_1-5]/1-2-3/a4-b1_b3-c1",3 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2122A-1b_1-5_3*OSO/3=O/3=O]/1-2-3/a4-b1_b3-c1",2 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",206 +"WURCS=2.0/3,3,2/[u2122h][a2112h-1b_1-5_6*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",181 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a4-b1_b3-c2",200 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3/a4-b1_b6-c2",146 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",206 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3/a4-b1_b3-c2",145 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3/a4-b1_b6-c2",205 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3/a4-b1_b6-c2",201 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",1 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",188 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2b_2-6_5*NCCO/3=O]/1-2-3/a4-b1_b6-c2",171 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",203 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b3-c1",202 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3/a4-b1_b4-c1",192 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",1 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",1 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",195 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",146 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b3-c1",200 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b4-c1",195 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3/a4-b1_b6-c1",195 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O]/1-2-3/a4-b1_b3-c1",146 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",196 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",195 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a3-b1_a4-c1",204 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",103 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a3-b1_b2-c1",110 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",84 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",146 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5]/1-2-3/a4-b1_b4-c1",3 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3/a4-b1_a6-c1",1 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3/a3-b1_a4-c1",181 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3/a3-b1_a4-c1",110 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a1221m-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3/a3-b1_a4-c1",181 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_b3-c2",195 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a3-b1_b6-c2",1 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b3-c2",202 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",201 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a3-b1_b2-c1",110 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",181 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3/a4-b1_b6-c2",111 +"WURCS=2.0/3,3,2/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a3-b1_b2-c1",110 +"WURCS=2.0/3,3,2/[u2122h_6*OSO/3=O/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3/a3-b1_a4-c1",181 +"WURCS=2.0/3,3,2/[u2122h_6*OSO/3=O/3=O][a1221m-1a_1-5][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3/a3-b1_a4-c1",181 +"WURCS=2.0/3,3,2/[u2122h_6*OSO/3=O/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",181 +"WURCS=2.0/3,3,2/[u2122h_6*OSO/3=O/3=O][a2112h-1b_1-5_6*OSO/3=O/3=O][a1221m-1a_1-5]/1-2-3/a4-b1_b2-c1",181 +"WURCS=2.0/3,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_b3-c1_c4-d1",1 +"WURCS=2.0/3,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2/a3-b1_b4-c1_c3-d1",1 +"WURCS=2.0/3,4,3/[a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-3/a3-b1_b4-c1_c3-d2",1 +"WURCS=2.0/3,4,3/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b4-c1_c3-d1",1 +"WURCS=2.0/3,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-3/a4-b1_b3-c1_b4-d1",1 +"WURCS=2.0/3,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b3-c1_c3-d1",1 +"WURCS=2.0/3,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b6-c1_c4-d1",1 +"WURCS=2.0/3,4,3/[a2122h-1x_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3/a4-b1_b6-c1_c3-d1",9 +"WURCS=2.0/3,4,3/[h2122h][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-2/a3-b1_a4-c1_c2-d1",2 +"WURCS=2.0/3,4,3/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3/a3-b1_a6-d2_b6-c2",1 +"WURCS=2.0/3,4,3/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_b3-c1_c4-d1",105 +"WURCS=2.0/3,4,3/[u2122h][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-2/a2-b1_a4-c1_c2-d1",1 +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2/a4-b1_b3-c2_b4-d1",1 +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3/a4-b1_b3-c2_c9-d2",5 +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b3-c1_c3-d1",17 +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b3-c1_c4-d1",215 +"WURCS=2.0/3,4,3/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-3/a4-b1_b3-c1_b6-d1",1 +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-3/a4-b1_b6-c2_c8-d2",105 +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-3/a3-b1_a4-d1_b2-c1",206 +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-3/a4-b1_b3-c1_b4-d1",200 +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_b3-c1_c3-d1",1 +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_a6-c1_c4-d1",17 +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a3-b1_b3-c1_c4-d1",181 +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b3-c1_c4-d1",208 +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2/a4-b1_b6-c1_c4-d1",171 +"WURCS=2.0/3,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-3/a4-b1_b3-c1_b4-d1",1 +"WURCS=2.0/3,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2-3/a3-b1_a6-d1_b4-c1_d4-e1",1 +"WURCS=2.0/3,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3-3/a4-b1_b3-c2_c8-d2_d8-e2",1 +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-1/a4-b1_b4-c1_c3-d1_d2-e1",1 +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-1/a4-b1_b4-c1_c6-d1_d2-e1",1 +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3/a4-b1_b4-c1_c3-d1_c6-e1",11 +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-1-3/a3-b1_a4-c1_c3-d1_d3-e1",1 +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-2-3/a3-b1_b3-c1_c3-d1_d3-e2",1 +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-2-3/a3-b1_b3-c1_c4-d1_d3-e2",1 +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-2-3/a3-b1_b3-c1_c4-d1_d6-e2",1 +"WURCS=2.0/3,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-2-3/a4-b1_b3-c1_c3-d1_d3-e2",1 +"WURCS=2.0/3,5,4/[a2122h-1x_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3/a4-b1_b3-c1_b6-d1_d6-e1",9 +"WURCS=2.0/3,5,4/[a2122h-1x_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3/a4-b1_b6-c1_c2-d1_c3-e1",9 +"WURCS=2.0/3,5,4/[a2122h-1x_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3/a4-b1_b6-c1_c6-d1_d2-e1",9 +"WURCS=2.0/3,5,4/[a2122h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3/a4-b1_b3-c1_b6-e1_c4-d1",1 +"WURCS=2.0/3,5,4/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3-3/a4-b1_b3-c2_c8-d2_d8-e2",205 +"WURCS=2.0/3,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3/a4-b1_b3-c1_b6-e1_c3-d1",4 +"WURCS=2.0/3,5,4/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3/a4-b1_b6-c1_c2-d1_c3-e1",3 +"WURCS=2.0/3,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3/a4-b1_b3-c1_b6-e1_c4-d1",171 +"WURCS=2.0/3,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3/a4-b1_b3-c1_c4-d1_d3-e1",195 +"WURCS=2.0/3,6,5/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-3-2-3/a3-b1_a6-d1_b3-c1_d4-e1_e3-f1",1 +"WURCS=2.0/3,6,5/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1",1 +"WURCS=2.0/3,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1",1 +"WURCS=2.0/3,6,5/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3/a4-b1_b4-c1_c3-d1_c6-e1_e3-f1",6 +"WURCS=2.0/3,6,5/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1",6 +"WURCS=2.0/3,6,5/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3/a4-b1_b4-c1_c3-e1_c6-d1_e2-f1",3 +"WURCS=2.0/3,6,5/[a2122h-1x_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3/a4-b1_b3-c1_b6-d1_d6-e1_e2-f1",9 +"WURCS=2.0/3,6,5/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5]/1-2-3-2-3-2/a3-b1_b4-c1_c3-d1_d4-e1_e3-f1",105 +"WURCS=2.0/3,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-3-3-3/a4-b1_b3-c2_c8-d2_d8-e2_e8-f2",1 +"WURCS=2.0/3,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1",4 +"WURCS=2.0/3,6,5/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3/a4-b1_b3-c1_b6-d1_d6-e1_e2-f1",3 +"WURCS=2.0/3,6,5/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3/a4-b1_b3-c1_b6-e1_c2-d1_e6-f1",3 +"WURCS=2.0/3,6,5/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3/a4-b1_b3-c1_b6-f1_c2-d1_d2-e1",3 +"WURCS=2.0/3,6,5/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3/a4-b1_b6-c1_c3-d1_c6-e1_e2-f1",3 +"WURCS=2.0/3,6,5/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2/a4-b1_b3-c1_b6-e1_c4-d1_e4-f1",171 +"WURCS=2.0/3,6,5/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-3-2-3/a4-b1_b3-c1_b6-d1_d4-e1_e3-f1",105 +"WURCS=2.0/3,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-2-3-2-3/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1",1 +"WURCS=2.0/3,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3-3/a4-b1_b4-c1_c3-d1_c6-e1_e3-f1_e6-g1",2 +"WURCS=2.0/3,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-1-2-3-2/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f2-g1",1 +"WURCS=2.0/3,7,6/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-2-1-2-3/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g2",1 +"WURCS=2.0/3,7,6/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-2-1-2-3/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f6-g2",1 +"WURCS=2.0/3,7,6/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-1-2-1-2-3/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f4-g1",1 +"WURCS=2.0/3,7,6/[a2122h-1x_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3-3/a4-b1_b3-c1_b6-f1_c2-d1_d2-e1_f6-g1",9 +"WURCS=2.0/3,7,6/[u2122h_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-3-3-3-3/a4-b1_b3-c1_b6-f1_c2-d1_d2-e1_f3-g1",3 +"WURCS=2.0/3,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-1-1-3-1/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g6-h1",1 +"WURCS=2.0/3,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-1-3-3-3/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-h1",1 +"WURCS=2.0/3,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3-3-3/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-h1",1 +"WURCS=2.0/3,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-1-1-3-1-1/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1_g6-i1",2 +"WURCS=2.0/3,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-1-2-3-3-3-3-3-3/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-i1_g2-h1",1 +"WURCS=2.0/4,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-1-2-3-1-1-3-1-1-4/a4-b1_a6-j1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1_g6-i1",2 +"WURCS=2.0/4,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-1-3-1-4/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_e3-f1_h2-i1_i3-j1",1 +"WURCS=2.0/4,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-2-4-2-2/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_d4-f1_h2-i1_h6-j1",126 +"WURCS=2.0/4,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-i1_g2-h1_i2-j1",10 +"WURCS=2.0/4,11,10/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j6-k2",3 +"WURCS=2.0/4,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-2-4-2-2-2/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_d4-f1_h2-i1_h4-j1_h6-k1",11 +"WURCS=2.0/4,13,12/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-1-4-3-1-4-1-4/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_d4-g1_e4-f1_g4-h1_i2-j1_i6-l1_j4-k1_l4-m1",3 +"WURCS=2.0/4,4,3/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a2-b1_b3-c1_c3-d2",1 +"WURCS=2.0/4,4,3/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a2-b1_b3-c1_b4-d1",1 +"WURCS=2.0/4,4,3/[a1122h-1x_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a2-b1_b4-c1_c6-d2",1 +"WURCS=2.0/4,4,3/[a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a3-b1_b3-c1_c2-d1",1 +"WURCS=2.0/4,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_b2-c1_b3-d1",1 +"WURCS=2.0/4,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4/a3-b1_b3-c1_b4-d1",1 +"WURCS=2.0/4,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a3-b1_b3-c1_c3-d2",1 +"WURCS=2.0/4,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a3-b1_b4-c1_c2-d1",1 +"WURCS=2.0/4,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a6-b1_b4-c1_c2-d1",1 +"WURCS=2.0/4,4,3/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_b4-c1_c3-d1",1 +"WURCS=2.0/4,4,3/[a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_b2-c1_b3-d1",1 +"WURCS=2.0/4,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4/a6-b1_b3-c1_b4-d1",1 +"WURCS=2.0/4,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a3-b1_b4-c1_c3-d2",1 +"WURCS=2.0/4,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a3-b1_b4-c1_c6-d2",1 +"WURCS=2.0/4,4,3/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a3-b1_b3-c1_c2-d1",1 +"WURCS=2.0/4,4,3/[a2122h-1b_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4/a4-b1_b2-c1_b3-d1",1 +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4/a3-b1_a4-c1_c3-d2",1 +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_a4-c1_c3-d1",1 +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4/a3-b1_a4-d1_b3-c2",1 +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a1221m-1a_1-5]/1-2-3-4/a3-b1_a4-d1_b3-c2",1 +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b2-c1_b4-d1",1 +"WURCS=2.0/4,4,3/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b4-c1_c3-d1",1 +"WURCS=2.0/4,4,3/[a2122h-1x_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3-4/a3-b1_a4-c1_c3-d2",1 +"WURCS=2.0/4,4,3/[a2122h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4/a4-b1_b2-c1_b3-d1",1 +"WURCS=2.0/4,4,3/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4/a4-b1_b4-c1_c3-d1",9 +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4/a2-b1_b3-c1_b4-d1",112 +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a2-b1_b3-c1_c3-d2",105 +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a2-b1_b4-c1_c3-d2",112 +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a2-b1_b4-c1_c6-d2",105 +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a2-b1_b3-c1_b4-d1",105 +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a2-b1_b4-c1_c2-d1",110 +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a2-b1_b4-c1_c3-d1",105 +"WURCS=2.0/4,4,3/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122A-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4/a2-b1_b4-c1_c3-d1",105 +"WURCS=2.0/4,4,3/[u2112h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a3-b1_b3-c2_b4-d1",2 +"WURCS=2.0/4,4,3/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a3-b1_b3-c1_b4-d1",1 +"WURCS=2.0/4,4,3/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_b4-c1_c3-d1",1 +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_a4-c1_c3-d1",17 +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4/a3-b1_a6-d1_b3-c2",105 +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4/a6-b1_b3-c1_b4-d1",120 +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a3-b1_b3-c1_c3-d2",136 +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a6-b1_b3-c1_c3-d2",110 +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a6-b1_b4-c1_c3-d2",110 +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a6-b1_b4-c1_c6-d2",110 +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a3-b1_b3-c1_c2-d1",126 +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a6-b1_b3-c1_b4-d1",110 +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4/a6-b1_b4-c1_c2-d1",110 +"WURCS=2.0/4,4,3/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a6-b1_b4-c1_c3-d1",110 +"WURCS=2.0/4,4,3/[u2122h][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a3-b1_a4-c1_c3-d2",3 +"WURCS=2.0/4,4,3/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4/a4-b1_b3-c2_c8-d2",1 +"WURCS=2.0/4,4,3/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a3-b1_b3-c2_b4-d1",2 +"WURCS=2.0/4,4,3/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b3-c2_b4-d1",218 +"WURCS=2.0/4,4,3/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b3-c2_b6-d1",2 +"WURCS=2.0/4,4,3/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a4-b1_b4-c1_b6-d2",2 +"WURCS=2.0/4,4,3/[u2122h][a2112h-1b_1-5_3*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5]/1-2-3-4/a4-b1_b4-c1_c3-d1",3 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3-4/a3-b1_a4-c1_c3-d2",146 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3-4/a3-b1_a4-c1_c3-d2",2 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4/a3-b1_a4-c1_c3-d2",188 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_a4-c1_c3-d1",189 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4/a3-b1_a4-c1_c3-d1",1 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a3-b1_b3-c2_b4-d1",1 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4/a3-b1_a4-d1_b3-c2",210 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O][a1221m-1a_1-5]/1-2-3-4/a3-b1_a4-d1_b3-c2",2 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a4-b1_b2-c1_b6-d2",1 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4/a3-b1_b2-c1_b3-d1",195 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b2-c1_b4-d1",200 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b3-c1_b4-d1",17 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4/a4-b1_b4-c1_c3-d1",195 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4/a4-b1_b3-c1_c4-d1",1 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4/a4-b1_b4-c1_c6-d1",11 +"WURCS=2.0/4,4,3/[u2122h_2*NCC/3=O_6*OSO/3=O/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4/a3-b1_a4-c1_c3-d2",201 +"WURCS=2.0/4,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a3-b1_a6-c1_c4-d1_d6-e2",1 +"WURCS=2.0/4,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-3/a3-b1_b3-c1_b4-d1_d2-e1",1 +"WURCS=2.0/4,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-1/a3-b1_b4-c1_c2-d1_c3-e1",1 +"WURCS=2.0/4,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-1/a6-b1_b3-c1_c2-d1_c3-e1",1 +"WURCS=2.0/4,5,4/[a2122h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-2-4/a3-b1_a4-c1_c2-d1_c3-e1",1 +"WURCS=2.0/4,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d6-e2",1 +"WURCS=2.0/4,5,4/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-2-4/a3-b1_a4-c1_c2-d1_c3-e1",1 +"WURCS=2.0/4,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d4-e1",1 +"WURCS=2.0/4,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d4-e1",1 +"WURCS=2.0/4,5,4/[a2122h-1x_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d3-e1",1 +"WURCS=2.0/4,5,4/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e2",2 +"WURCS=2.0/4,5,4/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d6-e2",2 +"WURCS=2.0/4,5,4/[a2122h-1x_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d3-e1",1 +"WURCS=2.0/4,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-3-4/a2-b1_a6-c1_c4-d1_d3-e2",2 +"WURCS=2.0/4,5,4/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-3/a3-b1_b3-c1_b4-d1_d2-e1",1 +"WURCS=2.0/4,5,4/[u2122h][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-3/a3-b1_a4-c1_c3-d1_d3-e1",5 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-4/a4-b1_b3-c2_b4-e1_c8-d2",209 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b3-c2_b4-d1_d3-e1",218 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O]/1-2-3-3-4/a4-b1_b3-c2_b4-e1_c8-d2",3 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d3-e1",146 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b3-c1_c3-d1_d3-e1",1 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b4-c1_c3-d1_d4-e1",1 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b4-c1_c3-d1_d3-e2",51 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d2-e1",17 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d3-e2",1 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_b6-e2_c3-d1",4 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_c6-e2",10 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d3-e2",12 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e2",12 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b6-c1_c3-d1_c6-e2",84 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d3-e2",4 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-2-4/a4-b1_b3-c1_c3-d1_d6-e2",4 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1",11 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122A-1b_1-5]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1",3 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122A-1b_1-5_3*OSO/3=O/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1",107 +"WURCS=2.0/4,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d4-e1",146 +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d3-e1",146 +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2/a4-b1_b2-c1_b3-d1_d4-e1",200 +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a3-b1_b3-c1_c3-d1_d3-e2",181 +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a3-b1_b3-c1_c4-d1_d3-e2",181 +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a3-b1_b3-c1_c4-d1_d6-e2",146 +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d6-e2",201 +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d6-e2",1 +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-2-4/a4-b1_b3-c1_c4-d1_d4-e1",146 +"WURCS=2.0/4,5,4/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4/a4-b1_b4-c1_c6-d1_d3-e1",1 +"WURCS=2.0/4,6,5/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-4/a3-b1_b4-c1_c3-d1_d4-e1_e3-f2",1 +"WURCS=2.0/4,6,5/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-4/a3-b1_b4-c1_c3-d1_d4-e1_e6-f2",1 +"WURCS=2.0/4,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-4-2/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1",1 +"WURCS=2.0/4,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b3-c2_b4-d1_d3-e1_e3-f2",1 +"WURCS=2.0/4,6,5/[a2122h-1b_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b2-c1_b3-d1_d3-e1_e2-f1",1 +"WURCS=2.0/4,6,5/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-1-2-3-3-4/a4-b1_a6-f1_b4-c1_c3-d1_c6-e1",1 +"WURCS=2.0/4,6,5/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1",1 +"WURCS=2.0/4,6,5/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1",1 +"WURCS=2.0/4,6,5/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-1-3-2-4/a4-b1_b3-c1_c3-d1_c4-e1_e3-f2",1 +"WURCS=2.0/4,6,5/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4/a4-b1_b4-c1_c3-d1_d2-e1_e2-f1",9 +"WURCS=2.0/4,6,5/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4/a4-b1_b4-c1_c6-d1_d3-e1_d6-f1",9 +"WURCS=2.0/4,6,5/[a2222h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-4/a4-b1_b3-c1_c3-d1_c4-f1_d2-e1",1 +"WURCS=2.0/4,6,5/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-4/a2-b1_a6-e1_b3-c1_b4-d1_e4-f1",2 +"WURCS=2.0/4,6,5/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-2-3-4/a2-b1_a6-d1_b4-c1_d4-e1_e3-f2",2 +"WURCS=2.0/4,6,5/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-4/a3-b1_b4-c1_c3-d1_d4-e1_e3-f2",105 +"WURCS=2.0/4,6,5/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-4/a3-b1_b4-c1_c3-d1_d4-e1_e6-f2",105 +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-3-4/a4-b1_b3-c2_b4-f1_c8-d2_d8-e2",204 +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-4-2/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1",144 +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O]/1-2-3-3-3-4/a4-b1_b3-c2_b4-f1_c8-d2_d8-e2",3 +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b2-c1_b3-d1_d3-e1_e2-f1",136 +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-4/a4-b1_b4-c1_c3-d1_c6-f2_d6-e2",2 +"WURCS=2.0/4,6,5/[u2122h][a2112h-1b_1-5][a2112h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-4/a4-b1_b4-c1_c3-d1_d3-e2_e8-f2",3 +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-3/a4-b1_b2-c1_b3-d1_d3-e1_e2-f1",136 +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-4/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1",10 +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-4/a4-b1_b4-c1_c3-d1_c6-f1_d4-e1",1 +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-2/a4-b1_b4-c1_c3-d1_c6-e1_e2-f1",10 +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4/a4-b1_b4-c1_c3-d1_c6-e1_e3-f1",3 +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-2-2-3-4/a3-b1_a6-f1_b3-c1_c2-d1_d2-e1",1 +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-2-2-3-4/a3-b1_b3-c1_c2-d1_c3-f1_d2-e1",1 +"WURCS=2.0/4,6,5/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1b_1-5]/1-2-2-2-3-4/a3-b1_b3-c1_b4-f1_c2-d1_d2-e1",1 +"WURCS=2.0/4,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-4/a4-b1_b3-c1_b6-e1_c3-d1_e4-f1_f6-g2",1 +"WURCS=2.0/4,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g2",2 +"WURCS=2.0/4,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g2",1 +"WURCS=2.0/4,7,6/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-3-2/a4-b1_b3-c1_c3-d1_c4-e1_e3-f1_f4-g1",1 +"WURCS=2.0/4,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-1-3-4-2/a3-b1_a4-c1_c3-d1_d3-e1_d4-g1_e3-f2",1 +"WURCS=2.0/4,7,6/[a2122h-1x_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-3/a4-b1_b3-c2_b4-d1_d3-e1_e3-f2_f8-g2",1 +"WURCS=2.0/4,7,6/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-3-2/a4-b1_b3-c1_b6-f1_c3-d1_d6-e2_f4-g1",1 +"WURCS=2.0/4,7,6/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-3-4/a2-b1_a6-e1_b4-c1_c3-d2_e4-f1_f3-g2",2 +"WURCS=2.0/4,7,6/[u2112h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-3-2-4/a3-b1_a6-c1_c4-d1_d3-e1_e4-f1_f6-g2",105 +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-3-4-2/a4-b1_b3-c2_b4-f1_c8-d2_d8-e2_f3-g1",108 +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-3-4-2-3/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1_f3-g2",142 +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-3/a4-b1_b3-c2_b4-d1_d3-e1_e3-f2_f8-g2",113 +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-4/a4-b1_b3-c2_b4-d1_d3-e1_e3-f2_e4-g1",6 +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O]/1-2-3-3-3-4-2/a4-b1_b3-c2_b4-f1_c8-d2_d8-e2_f3-g1",3 +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a1221m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O]/1-2-3-4-2-3-3/a4-b1_b2-c1_b3-d1_d3-e1_d4-g1_e2-f1",3 +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-3-2/a4-b1_b6-c1_c3-d1_c4-e1_e3-f1_f4-g1",21 +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5]/1-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1",1 +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122A-1b_1-5]/1-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1",3 +"WURCS=2.0/4,7,6/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122A-1b_1-5_3*OSO/3=O/3=O]/1-2-3-2-3-2-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f3-g1",3 +"WURCS=2.0/4,7,6/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1",3 +"WURCS=2.0/4,7,6/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-2-2-3-4-4/a3-b1_b3-c1_b4-g1_c2-d1_d2-e1_d3-f1",1 +"WURCS=2.0/4,7,6/[u2122h_2*NCC/3=O][a2211m-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2122h-1a_1-5]/1-2-2-2-3-4-4/a3-b1_b3-c1_c2-d1_c3-g1_d2-e1_d3-f1",1 +"WURCS=2.0/4,8,7/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-1-2-1-2-3-4/a4-b1_b3-c1_c4-d1_d3-e1_e4-f1_f2-g1_f3-h1",1 +"WURCS=2.0/4,8,7/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-2/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1",1 +"WURCS=2.0/4,8,7/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-2/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1",1 +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-2-4-3-2-4/a4-b1_b3-c1_b6-f1_c4-d1_d6-e2_f4-g1_g6-h2",6 +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-4-2/a4-b1_b3-c1_b6-f1_c3-d1_c4-e1_f3-g1_f4-h1",3 +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-4-2/a4-b1_b3-c1_b6-f1_c4-d1_d2-e1_f3-g1_f4-h1",105 +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-4-3-2/a4-b1_b3-c1_b6-g1_c3-d1_c4-f1_d2-e1_g4-h1",138 +"WURCS=2.0/4,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-3-4-2/a4-b1_b3-c1_b6-f1_c3-d1_c4-e1_f3-g1_f4-h1",3 +"WURCS=2.0/4,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-2/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1",137 +"WURCS=2.0/4,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-2/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1",147 +"WURCS=2.0/4,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-4/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g6-h1",5 +"WURCS=2.0/4,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e2-f1_g3-h1",3 +"WURCS=2.0/4,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-1-2-3-1-1-3-1-4/a4-b1_a6-i1_b4-c1_c3-d1_c6-g1_d2-e1_d4-f1_g2-h1",2 +"WURCS=2.0/4,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-3-1-4/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e3-f1_g2-h1_h3-i1",1 +"WURCS=2.0/4,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-1-2-3-1-3-4/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f3-g1_g4-h1_h6-i2",1 +"WURCS=2.0/4,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1a_1-5_2*NCC/3=O]/1-2-3-1-2-3-1-3-4/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f3-g1_g4-h1_h4-i1",1 +"WURCS=2.0/4,9,8/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-3-4-2-3-2/a4-b1_b3-c1_b6-e1_c3-d1_e3-f1_e4-g1_g3-h1_h3-i1",1 +"WURCS=2.0/4,9,8/[a2122h-1x_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-4-3-4-2/a4-b1_b3-c1_b6-g1_c3-d1_c4-f1_d2-e1_g3-h1_g4-i1",1 +"WURCS=2.0/4,9,8/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-4-2-2/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1_g6-i1",1 +"WURCS=2.0/4,9,8/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-h1_h2-i1",6 +"WURCS=2.0/4,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-2-2-2-4-2/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_d4-f1_h2-i1",132 +"WURCS=2.0/4,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-h1_h2-i1",14 +"WURCS=2.0/4,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5]/1-2-3-4-4-4-4-4-4/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e2-f1_g6-h1_h2-i1",3 +"WURCS=2.0/5,10,9/[u2122h_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-3-4-2-3-5/a3-b1_a4-c1_c3-d1_d3-e1_d4-f1_f3-g1_g3-h1_g4-i1_i3-j2",200 +"WURCS=2.0/5,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-4-2-5/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_e4-f1_h2-i1_i4-j1",135 +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",2 +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j3-k2",4 +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j3-k2",2 +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j3-k2",1 +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",1 +"WURCS=2.0/5,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_f2-g1_h2-i1_i3-j1_j2-k1",1 +"WURCS=2.0/5,11,10/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-2-2-4-2-2-5/a4-b1_a6-k1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_d4-f1_h2-i1_h6-j1",1 +"WURCS=2.0/5,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1a_1-5_6*OPO/3O/3=O]/1-2-3-4-4-5-4-4-4-4-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e2-f1_g3-h1_g6-j1_h2-i1_j2-k1",1 +"WURCS=2.0/5,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-2-2-4-2-2-5/a4-b1_a6-k1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_d4-f1_h2-i1_h6-j1",110 +"WURCS=2.0/5,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-4-2-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_d4-g1_e4-f1_g3-h1_i2-j1_j4-k1",10 +"WURCS=2.0/5,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-1-3-1-4-5/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e4-f1_f6-g2_i2-j1_j4-k1_k6-l2",1 +"WURCS=2.0/5,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-3-1-4-1-5/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g1_h2-i1_i4-j1_j3-k1",1 +"WURCS=2.0/5,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-4-2-5/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_d4-g1_e4-f1_g4-h1_j2-k1_k4-l1",126 +"WURCS=2.0/5,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1_i3-j1_j4-k1_k3-l1_l4-m1",1 +"WURCS=2.0/5,14,13/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-3-1-4-1-4-5/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g4-h1_i2-j1_j4-k1_k3-l1_l4-m1",1 +"WURCS=2.0/5,15,14/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-3-4-2-3-4-2-3-4-2-5/a4-b1_b3-c1_c3-d1_c4-e1_e3-f1_f3-g1_f4-h1_h3-i1_i3-j1_i4-k1_k3-l1_l3-m1_l4-n1_n3-o2",1 +"WURCS=2.0/5,15,14/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-1-4-5-3-1-4-1-4-5/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o2",1 +"WURCS=2.0/5,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-4-2-5-2-5-2/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_j2-k1_k4-l1_l3-m1_m4-n1_n3-o1",105 +"WURCS=2.0/5,17,16/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-1-4-5-3-1-4-5-1-4-5/a4-b1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f3-g2_h4-i1_i3-j2_k2-l1_k6-o1_l4-m1_m3-n2_o4-p1_p3-q2",2 +"WURCS=2.0/5,17,16/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-4-2-5-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g4-h1_i2-j1_i6-n1_j4-k1_k3-l1_l4-m1_n4-o1_o3-p1_p4-q1",103 +"WURCS=2.0/5,18,17/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-4-1-4-1-4-3-1-4-1-4-1-4-5/a4-b1_a6-r1_b4-c1_c3-d1_c6-k1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_k2-l1_l4-m1_m3-n1_n4-o1_o3-p1_p4-q1",1 +"WURCS=2.0/5,25,24/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-5-2-5-2-5-2-5-4-2-5-2-5-2-5-2-5-2-5/a4-b1_b4-c1_c3-d1_c6-o1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_m4-n1_o2-p1_p4-q1_q3-r1_r4-s1_s3-t1_t4-u1_u3-v1_v4-w1_w3-x1_x4-y1",105 +"WURCS=2.0/5,5,4/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a2-b1_b3-c1_b4-d1_d3-e2",1 +"WURCS=2.0/5,5,4/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a2-b1_b4-c1_c2-d1_c3-e1",1 +"WURCS=2.0/5,5,4/[a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a2-b1_b4-c1_c2-d1_c3-e1",1 +"WURCS=2.0/5,5,4/[a1122h-1x_1-5][a1122h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5]/1-2-3-4-5/a6-b1_b2-c1_c4-d1_d3-e1",1 +"WURCS=2.0/5,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_b4-d1_d3-e2",1 +"WURCS=2.0/5,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a3-b1_b4-c1_c2-d1_c3-e1",1 +"WURCS=2.0/5,5,4/[a2112h-1a_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a6-b1_b4-c1_c2-d1_c3-e1",1 +"WURCS=2.0/5,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a3-b1_b3-c1_c2-d1_c3-e1",1 +"WURCS=2.0/5,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a6-b1_b3-c1_c2-d1_c3-e1",1 +"WURCS=2.0/5,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_c2-d1_c3-e1",1 +"WURCS=2.0/5,5,4/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a6-b1_b4-c1_c2-d1_c3-e1",1 +"WURCS=2.0/5,5,4/[a2122h-1b_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a4-b1_b4-c1_c3-d1_d3-e1",1 +"WURCS=2.0/5,5,4/[a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a4-b1_b4-c1_c3-d1_d3-e1",1 +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a2-b1_b3-c1_b4-d1_d3-e2",105 +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a6-b1_b3-c1_b4-d1_d3-e2",2 +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-5/a6-b1_b3-c1_b4-d1_d3-e2",2 +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a2-b1_b4-c1_c2-d1_c3-e1",105 +"WURCS=2.0/5,5,4/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a2-b1_b4-c1_c2-d1_c3-e1",105 +"WURCS=2.0/5,5,4/[u2112h][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a3-b1_b3-c1_c2-d1_c3-e1",1 +"WURCS=2.0/5,5,4/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6]/1-2-3-4-5/a3-b1_b3-c1_b4-d1_d3-e2",2 +"WURCS=2.0/5,5,4/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O_9*OCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_b4-d1_d3-e2",2 +"WURCS=2.0/5,5,4/[u2112h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-5/a3-b1_b3-c1_b4-d1_d3-e2",4 +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_b4-d1_d3-e2",137 +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a3-b1_b4-c1_c2-d1_c3-e2",13 +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a3-b1_b3-c1_c2-d1_c3-e1",126 +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a6-b1_b3-c1_c2-d1_c3-e1",105 +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-5/a6-b1_b4-c1_c2-d1_c3-e1",110 +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a3-b1_b3-c1_c2-d1_c3-e1",126 +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a3-b1_b4-c1_c2-d1_c3-e1",126 +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a6-b1_b3-c1_c2-d1_c3-e1",110 +"WURCS=2.0/5,5,4/[u2112h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-5/a6-b1_b4-c1_c2-d1_c3-e1",105 +"WURCS=2.0/5,5,4/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4-5/a4-b1_b3-c2_b4-d1_d3-e1",3 +"WURCS=2.0/5,5,4/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5_6*OSO/3=O/3=O]/1-2-3-4-5/a4-b1_b3-c1_c3-d1_c4-e1",5 +"WURCS=2.0/5,5,4/[u2122h][a2112h-1b_1-5_3*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5/a4-b1_b4-c1_c3-d1_d3-e2",3 +"WURCS=2.0/5,6,5/[a2112h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-3-5/a3-b1_b3-c1_b4-d1_d2-e1_d3-f1",1 +"WURCS=2.0/5,6,5/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1",1 +"WURCS=2.0/5,6,5/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-2-3-4-5/a2-b1_a6-c1_c3-d1_c4-e1_e3-f2",2 +"WURCS=2.0/5,6,5/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-2/a2-b1_a6-f1_b3-c1_b4-d1_d3-e2",2 +"WURCS=2.0/5,6,5/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-2-3-4-5/a2-b1_a6-c1_c3-d1_c4-e1_e3-f2",2 +"WURCS=2.0/5,6,5/[u2122h][a1221m-1a_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-3-5/a3-b1_a4-c1_c3-d1_d3-e1_d6-f2",4 +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-3-4-5/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1",3 +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-4-5-3/a4-b1_b3-c2_b4-d1_d3-e1_d6-f2",3 +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-3-4-5/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1",3 +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5/a4-b1_b3-c1_c3-d1_d3-e1_e3-f2",1 +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-5/a4-b1_b3-c1_c3-d1_c4-f1_d3-e2",10 +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*N]/1-2-3-4-2-5/a4-b1_b3-c1_c3-d1_c4-e1_e3-f2",6 +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-2-4-5/a4-b1_b3-c1_c4-d1_d2-e1_d3-f1",1 +"WURCS=2.0/5,6,5/[u2122h][a2112h-1b_1-5_3*OSO/3=O/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-5-5/a4-b1_b4-c1_c3-d1_d3-e2_e8-f2",3 +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-2-4-5/a4-b1_b3-c1_c4-d1_d2-e1_d3-f1",146 +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1",147 +"WURCS=2.0/5,6,5/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1",146 +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-5/a4-b1_b4-c1_c3-d1_d2-e1_e3-f1_e4-g1",1 +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-4-5/a4-b1_b4-c1_c6-d1_d2-e1_e3-f1_e4-g1",1 +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f3-g2",1 +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f6-g2",1 +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1_f3-g2",1 +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1_f6-g2",1 +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-5/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f3-g2",1 +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-5/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f6-g2",1 +"WURCS=2.0/5,7,6/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5]/1-1-2-3-1-4-5/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f3-g1",1 +"WURCS=2.0/5,7,6/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-5/a2-b1_a6-e1_b3-c1_b4-d1_e4-f1_f3-g2",2 +"WURCS=2.0/5,7,6/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-5-2-4/a2-b1_a6-f1_b3-c1_b4-d1_d3-e2_f4-g1",2 +"WURCS=2.0/5,7,6/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-3-5/a2-b1_a6-e1_b4-c1_c3-d2_e4-f1_f3-g2",2 +"WURCS=2.0/5,7,6/[u2122h][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a2112h-1b_1-5_2*NCC/3=O_6*OSO/3=O/3=O][a2112h-1b_1-5_3*OSO/3=O/3=O]/1-2-3-3-3-4-5/a4-b1_b3-c2_b4-f1_c8-d2_d8-e2_f3-g1",3 +"WURCS=2.0/5,7,6/[u2122h_2*NCC/3=O][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-5-5/a3-b1_a4-g1_b3-c1_c3-d1_c4-f1_d3-e2",146 +"WURCS=2.0/5,7,6/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-4-2-5/a4-b1_a6-g1_b4-c1_c3-d1_c6-e1_e2-f1",9 +"WURCS=2.0/5,7,6/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1",157 +"WURCS=2.0/5,8,7/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-3-5-2-3/a4-b1_b3-c2_b4-f1_c8-d2_d8-e2_f3-g1_g3-h2",1 +"WURCS=2.0/5,8,7/[a2122h-1b_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][Aad21122h-2a_2-6_5*NCCO/3=O][a2112h-1b_1-5_2*NCC/3=O]/1-2-3-4-5-2-4-3/a4-b1_b3-c2_b4-e1_c8-d2_e3-f1_f3-g2_g8-h2",1 +"WURCS=2.0/5,8,7/[a2122h-1b_1-5][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-3-2-5/a4-b1_b3-c1_c3-d1_c4-e1_e3-f1_f4-g1_g3-h2",1 +"WURCS=2.0/5,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-1-2-3-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-e1_e2-f1_f3-g1_f4-h1",1 +"WURCS=2.0/5,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-3/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2",1 +"WURCS=2.0/5,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-e1_e2-f1_f4-g1_g6-h2",1 +"WURCS=2.0/5,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-1-4-5-3-3/a4-b1_b3-c1_b6-g1_c2-d1_d4-e1_e3-f2_g3-h1",106 +"WURCS=2.0/5,8,7/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-3-4/a2-b1_a6-e1_b4-c1_c3-d2_e3-f1_e4-g1_g3-h2",2 +"WURCS=2.0/5,8,7/[u1122h][a2122h-1b_1-5_2*NCC/3=O][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-3-4/a2-b1_a6-e1_b4-c1_c3-d2_e3-f1_e4-g1_g3-h2",2 +"WURCS=2.0/5,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-5-2/a4-b1_b3-c1_b6-f1_c3-d1_d3-e2_f3-g1_f4-h1",6 +"WURCS=2.0/5,8,7/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-3-5-2/a4-b1_b3-c1_b6-f1_c3-d1_d6-e2_f3-g1_f4-h1",6 +"WURCS=2.0/5,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4-2/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1",141 +"WURCS=2.0/5,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-1-2-3-1-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g3-h1_g4-i1",1 +"WURCS=2.0/5,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1_h3-i2",1 +"WURCS=2.0/5,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-3-1/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1",2 +"WURCS=2.0/5,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-1-2-3-1-4-5-3-1/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1",1 +"WURCS=2.0/5,9,8/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-1-2-3-1-3-1-4-5/a4-b1_a6-i1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1",1 +"WURCS=2.0/5,9,8/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5]/1-2-3-4-2-2-4-2-5/a4-b1_a6-i1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1",1 +"WURCS=2.0/5,9,8/[u2122h][a2112h-1b_1-5][a2122h-1b_1-5_2*NCC/3=O][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-2-4-4-3-2-5/a4-b1_b3-c1_b6-g1_c3-d1_c6-f2_d3-e2_g4-h1_h2-i1",4 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1a_1-5_6*OPO/3O/3=O]/1-2-3-4-4-4-4-4-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e2-f1_g3-h1_g6-i1",1 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1122h-1a_1-5_6*OPO/3O/3=O]/1-2-3-4-5-4-4-4-5/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f3-g1_f6-i1_g2-h1",1 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-2-4-2-5/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1_h4-i1",6 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-2-4-2/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_e4-f1_h2-i1",1 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4-2-5/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",217 +"WURCS=2.0/5,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-4-4-4/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g3-h1_g6-i1",5 +"WURCS=2.0/6,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g3-h1_g4-i1_i3-j2",1 +"WURCS=2.0/6,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-3-1-4-5-6/a4-b1_a6-j1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1_h3-i2",1 +"WURCS=2.0/6,10,9/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a1221m-1a_1-5]/1-1-2-3-1-3-1-4-5-6/a4-b1_a6-j1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1_h4-i1",1 +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-4-2-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i4-j1",1 +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1_h4-i1_i3-j2",1 +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1_h4-i1_i6-j2",1 +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-4-2-5-6/a4-b1_a6-j1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1",160 +"WURCS=2.0/6,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h4-i1_i2-j1",3 +"WURCS=2.0/6,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-3-1-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i4-j1_j3-k2",1 +"WURCS=2.0/6,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j4-k1",1 +"WURCS=2.0/6,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-3-3/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i3-j1_i6-k1",1 +"WURCS=2.0/6,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-6-4/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i3-j1_i4-k1",1 +"WURCS=2.0/6,11,10/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-3-1-5-4-6/a4-b1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1_g2-h1_h3-i1_h4-j1_j3-k2",1 +"WURCS=2.0/6,11,10/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",11 +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-4-2-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e3-f1_e4-g1_i2-j1_j4-k1",1 +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_e4-f1_h2-i1_i4-j1_j6-k2",1 +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j6-k2",176 +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",6 +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-4-2-5-6/a4-b1_a6-k1_b4-c1_c3-d1_c4-g1_c6-h1_d2-e1_e4-f1_h2-i1_i4-j1",115 +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",43 +"WURCS=2.0/6,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f2-g1_h2-i1_i4-j1_j2-k1",149 +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1_k3-l2",1 +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-4-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j3-k1_j4-l1",1 +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j4-k1_k3-l2",1 +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j4-k1_k6-l2",1 +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-4-5-6/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i4-j1_j3-k2",3 +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-6-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f3-g2_h2-i1_i3-j1_i4-k1_k3-l2",1 +"WURCS=2.0/6,12,11/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-3-1-6-4-5/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i3-j1_i4-k1_k3-l2",1 +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e3-f1_e4-g1_i2-j1_j3-k1_j4-l1",1 +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-5-6-4-2-5-6-5/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1",126 +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e3-f1_f3-g2_i2-j1_j3-k1_k3-l2",110 +"WURCS=2.0/6,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-4-2-6-5/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_d4-g1_e4-f1_g4-h1_i2-j1_j3-k1_j4-l1",3 +"WURCS=2.0/6,13,12/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j3-k1_j4-l1_l3-m2",1 +"WURCS=2.0/6,13,12/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-1-2-3-1-4-5-6-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f2-g1_f3-h1_i2-j1_j3-k1_k2-l1_k3-m1",1 +"WURCS=2.0/6,13,12/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-1-2-3-1-4-5-6-3-1-4-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f2-g1_f3-h1_i2-j1_j4-k1_k2-l1_k3-m1",1 +"WURCS=2.0/6,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-6-6-4-2-5-6-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-h1_f2-g1_i2-j1_j3-k1_j4-m1_k2-l1",146 +"WURCS=2.0/6,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-4-2-5-2-5-6/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f3-g1_g4-h1_i2-j1_j4-k1_k3-l1_l4-m1",105 +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e4-f1_f3-g2_i2-j1_i6-m1_j4-k1_k3-l2_m4-n1_n3-o2",105 +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e4-f1_f6-g2_i2-j1_i6-m1_j4-k1_k6-l2_m4-n1_n6-o2",105 +"WURCS=2.0/6,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-4-2-5-2-5-6/a4-b1_a6-o1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_d4-g1_e4-f1_g4-h1_j2-k1_j6-m1_k4-l1_m4-n1",110 +"WURCS=2.0/6,18,17/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-1-2-3-1-4-5-1-4-5-3-1-4-5-1-4-5-6/a4-b1_a6-r1_b4-c1_c3-d1_c6-k1_d2-e1_d4-h1_e4-f1_f3-g2_h4-i1_i3-j2_k2-l1_k6-o1_l4-m1_m3-n2_o4-p1_p3-q2",2 +"WURCS=2.0/6,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-5-6-2-4-2-5-6-2-5-6/a4-b1_b4-c1_c3-d1_c4-k1_c6-l1_d2-e1_d4-h1_e4-f1_f6-g2_h4-i1_i6-j2_l2-m1_l6-p1_m4-n1_n6-o2_p4-q1_q6-r2",105 +"WURCS=2.0/6,24,23/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-2-5-2-4-2-5-2-5-2-5-2-5-2-6/a4-b1_a6-x1_b4-c1_c3-d1_c6-n1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k1_k4-l1_l3-m1_n2-o1_o4-p1_p3-q1_q4-r1_r3-s1_s4-t1_t3-u1_u4-v1_v3-w1",104 +"WURCS=2.0/6,7,6/[a2122h-1x_1-5][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-5-6/a4-b1_b4-c1_c3-d1_d3-e1_e2-f1_e3-g1",1 +"WURCS=2.0/6,7,6/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f6-g2",1 +"WURCS=2.0/6,7,6/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1_f6-g2",1 +"WURCS=2.0/6,7,6/[u2122h][a2112h-1b_1-5][a2112h-1a_1-5][a2112h-1b_1-5_2*NCC/3=O][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-5-6/a4-b1_b4-c1_c3-d1_d3-e1_e2-f1_e3-g1",106 +"WURCS=2.0/6,7,6/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6/a4-b1_b4-c1_c3-d1_d2-e1_e4-f1_f6-g2",147 +"WURCS=2.0/6,7,6/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6/a4-b1_b4-c1_c6-d1_d2-e1_e4-f1_f6-g2",146 +"WURCS=2.0/6,8,7/[a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-1-2-3-1-4-5-6/a4-b1_b4-c1_c6-d1_d2-e1_e3-f1_e4-g1_g3-h2",1 +"WURCS=2.0/6,8,7/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2",1 +"WURCS=2.0/6,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2",147 +"WURCS=2.0/6,8,7/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5]/1-2-3-4-2-5-4-6/a4-b1_a6-h1_b4-c1_c3-d1_c6-g1_d2-e1_e4-f1",9 +"WURCS=2.0/6,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5]/1-2-3-4-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g3-h1_g4-i1",1 +"WURCS=2.0/6,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1_h3-i2",1 +"WURCS=2.0/6,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g4-h1_h6-i2",173 +"WURCS=2.0/6,9,8/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1",165 +"WURCS=2.0/7,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-f1_d2-e1_f2-g1_g3-h1_g4-i1_i3-j2",1 +"WURCS=2.0/7,10,9/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-4-2/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1",1 +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-2-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c4-f1_c6-g1_d2-e1_g2-h1_h3-i1_h4-j1_j3-k2",1 +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-6-7/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i4-j1_j6-k2",1 +"WURCS=2.0/7,11,10/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-4-2-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j4-k1",1 +"WURCS=2.0/7,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-2-4-2-6-7/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e3-f1_e4-g1_i2-j1_j4-k1_k6-l2",1 +"WURCS=2.0/7,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-h1_d2-e1_e3-f1_e4-g1_h2-i1_i3-j1_i4-k1_k3-l2",1 +"WURCS=2.0/7,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-4-2-5-6/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j3-k1_j4-l1",1 +"WURCS=2.0/7,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-4-2-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j4-k1_k6-l2",1 +"WURCS=2.0/7,12,11/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-4-2-5-6-7/a4-b1_a6-l1_b4-c1_c3-d1_c6-h1_d2-e1_e4-f1_f6-g2_h2-i1_i4-j1_j6-k2",112 +"WURCS=2.0/7,13,12/[a2122h-1x_1-5_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-2-4-2-5-6-7/a4-b1_a6-m1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e4-f1_f3-g2_i2-j1_j4-k1_k3-l2",1 +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-2-4-2-5-6/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_e3-f1_e4-g1_g3-h2_j2-k1_k3-l1_k4-m1",1 +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-2-4-2-6-7/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_e3-f1_e4-g1_g3-h2_j2-k1_k4-l1_l6-m2",1 +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_e4-g1_g3-h2_i2-j1_j3-k1_j4-l1_l3-m2",1 +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-6-2-4-2-7-5-6/a4-b1_b4-c1_c3-d1_c4-h1_c6-i1_d2-e1_e4-f1_f6-g2_i2-j1_j3-k1_j4-l1_l3-m2",1 +"WURCS=2.0/7,13,12/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5]/1-2-3-4-2-5-6-7-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c6-i1_d2-e1_e4-f1_f2-g1_f3-h1_i2-j1_j4-k1_k2-l1_k3-m1",146 +"WURCS=2.0/7,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a1221m-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-6-7-2-4-2-5-6-7/a4-b1_b4-c1_c3-d1_c4-i1_c6-j1_d2-e1_e3-f1_e4-g1_g3-h2_j2-k1_k3-l1_k4-m1_m3-n2",1 +"WURCS=2.0/7,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][Aad21122h-2a_2-6_5*NCC/3=O]/1-2-3-4-2-5-2-5-2-6-5-7-4-2/a4-b1_b4-c1_c3-d1_c6-m1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i3-j1_i4-k1_k3-l2_m2-n1",1 +"WURCS=2.0/7,14,13/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][a1221m-1a_1-5][a2112h-1a_1-5_2*NCC/3=O]/1-2-3-4-2-5-6-7-4-2-5-6-7-6/a4-b1_a6-n1_b4-c1_c3-d1_c6-i1_d2-e1_e3-f1_f2-g1_f3-h1_i2-j1_j3-k1_k2-l1_k3-m1",120 +"WURCS=2.0/7,15,14/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-7-5/a4-b1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h6-i2_j2-k1_k4-l1_l3-m1_m3-n1_m4-o1",1 +"WURCS=2.0/7,16,15/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCCO/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-6-4-2-5-2-5-6-7/a4-b1_a6-p1_b4-c1_c3-d1_c6-j1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i2_j2-k1_k4-l1_l3-m1_m4-n1_n3-o2",1 +"WURCS=2.0/7,18,17/[u2122h_2*NCC/3=O][a2122h-1b_1-5_2*NCC/3=O][a1122h-1b_1-5][a1122h-1a_1-5][a2112h-1b_1-5][Aad21122h-2a_2-6_5*NCC/3=O][a1221m-1a_1-5]/1-2-3-4-2-5-2-5-2-5-6-4-2-5-2-5-2-7/a4-b1_b4-c1_c3-d1_c6-l1_d2-e1_e4-f1_f3-g1_g4-h1_h3-i1_i4-j1_j3-k2_l2-m1_l6-o1_m4-n1_o4-p1_p3-q1_q3-r1",1 diff --git a/releases/2026-10-02/bertosebind_new_runs/package_manifest.json b/releases/2026-10-02/bertosebind_new_runs/package_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..7a946a2eaedc00e33477de27ac4f5c3ac0efe844 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/package_manifest.json @@ -0,0 +1,1876 @@ +{ + "schema": "bertosebind.new_runs.code_package.v1", + "scope": "source identity, saved results and portable reporting/exposure checks; not a full model replay", + "files": [ + { + "path": "executed/remote/aff_attribution_motif.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/aff_attribution_motif.py", + "original_path": "/work/ratul1/supantha/Bertint/aff_attribution_motif.py", + "source_sha256": "33d41f680cf7a5ae3b98fef4d1ef604f6e12a6a856ec6e90df8bb5a88f336bbe", + "sha256": "33d41f680cf7a5ae3b98fef4d1ef604f6e12a6a856ec6e90df8bb5a88f336bbe", + "bytes": 14866, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/aff_attribution_motif.sbatch", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/aff_attribution_motif.sbatch", + "original_path": "/work/ratul1/supantha/Bertint/aff_attribution_motif.sbatch", + "source_sha256": "2b89020895eebac8c99366036eebb07dd43c687fe47274dcd1de47d1017548ff", + "sha256": "2b89020895eebac8c99366036eebb07dd43c687fe47274dcd1de47d1017548ff", + "bytes": 1616, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/affinose_gifflar_macro_A_glycan_gifflarESM.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_A_glycan_gifflarESM.json", + "original_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_gifflarESM.json", + "source_sha256": "d7f21b8037172e6d42fb65c8169d37b19c385d68dc9cbebadbafe9e930843074", + "sha256": "d7f21b8037172e6d42fb65c8169d37b19c385d68dc9cbebadbafe9e930843074", + "bytes": 903, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/affinose_gifflar_macro_A_glycan_sweetnetESM.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_A_glycan_sweetnetESM.json", + "original_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_sweetnetESM.json", + "source_sha256": "eca94bfbe82bfba95c2086c9c4ffe14091d442017356394ec2e75173cb66810f", + "sha256": "eca94bfbe82bfba95c2086c9c4ffe14091d442017356394ec2e75173cb66810f", + "bytes": 906, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/affinose_gifflar_macro_B_protein_gifflarESM.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_B_protein_gifflarESM.json", + "original_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_gifflarESM.json", + "source_sha256": "529296c1388651b4451f35829d0caa63e692a96fc88b74ee9b8dc8c1d09136da", + "sha256": "529296c1388651b4451f35829d0caa63e692a96fc88b74ee9b8dc8c1d09136da", + "bytes": 905, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/affinose_gifflar_macro_B_protein_sweetnetESM.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_B_protein_sweetnetESM.json", + "original_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_sweetnetESM.json", + "source_sha256": "6f0098947aa4c962f991d1e17acc17707d7cb2eb5e9d6338182d6cfa65d28a2d", + "sha256": "6f0098947aa4c962f991d1e17acc17707d7cb2eb5e9d6338182d6cfa65d28a2d", + "bytes": 908, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/affinose_gifflar_macro_C_doubly_gifflarESM.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_C_doubly_gifflarESM.json", + "original_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_gifflarESM.json", + "source_sha256": "bf720edacbad09cd04c42df7cf347dd1fe9846a22f307f7be1c38f06e89faa44", + "sha256": "bf720edacbad09cd04c42df7cf347dd1fe9846a22f307f7be1c38f06e89faa44", + "bytes": 900, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/affinose_gifflar_macro_C_doubly_sweetnetESM.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_C_doubly_sweetnetESM.json", + "original_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_sweetnetESM.json", + "source_sha256": "1884d744232b56c5edc76e655cf9bd117e43d8d749c98300b528ea6a5e55b75d", + "sha256": "1884d744232b56c5edc76e655cf9bd117e43d8d749c98300b528ea6a5e55b75d", + "bytes": 900, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/affinose_glycan_cold_contamination.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_glycan_cold_contamination.json", + "original_path": "/work/ratul1/supantha/Bertint/affinose_glycan_cold_contamination.json", + "source_sha256": "0d4458462cd10dae219a9f15eb6dc8129d200a09891bd0b6bf0297cd85c4dae2", + "sha256": "0d4458462cd10dae219a9f15eb6dc8129d200a09891bd0b6bf0297cd85c4dae2", + "bytes": 1818, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/b4_baselines_perrow.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_baselines_perrow.py", + "original_path": "/work/ratul1/supantha/Bertint/b4_baselines_perrow.py", + "source_sha256": "61a5ef32482365e37e58bd4aee49ff5dabc2fafa04f4e063f3a0be7c294c84c7", + "sha256": "61a5ef32482365e37e58bd4aee49ff5dabc2fafa04f4e063f3a0be7c294c84c7", + "bytes": 7176, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/b4_gif_repeat.sbatch", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_gif_repeat.sbatch", + "original_path": "/work/ratul1/supantha/Bertint/b4_gif_repeat.sbatch", + "source_sha256": "a381978d36492bb21cdb7c2a3007c51414b7630dd88016c7a74eb19c48080925", + "sha256": "a381978d36492bb21cdb7c2a3007c51414b7630dd88016c7a74eb19c48080925", + "bytes": 1648, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/b4_gif_repeat_compare.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_gif_repeat_compare.py", + "original_path": "/work/ratul1/supantha/Bertint/b4_gif_repeat_compare.py", + "source_sha256": "7fe6a80de1e7662a916e84b0a679c5579ab7fdcaaace70e1855f7d8face51ca3", + "sha256": "7fe6a80de1e7662a916e84b0a679c5579ab7fdcaaace70e1855f7d8face51ca3", + "bytes": 1977, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/b4_lo_perrow_ckpt.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_lo_perrow_ckpt.py", + "original_path": "/work/ratul1/supantha/Bertint/b4_lo_perrow_ckpt.py", + "source_sha256": "1d0433763d7ad49088e396b435a42f2a12141436db05592778a79938c88a953b", + "sha256": "1d0433763d7ad49088e396b435a42f2a12141436db05592778a79938c88a953b", + "bytes": 7705, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/b4_step1_structure.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_step1_structure.py", + "original_path": "/work/ratul1/supantha/Bertint/b4_step1_structure.py", + "source_sha256": "c82d7fe71d178d78d52ee47d809cd12d0286c48b1375c0c7b8b80fa222858e61", + "sha256": "c82d7fe71d178d78d52ee47d809cd12d0286c48b1375c0c7b8b80fa222858e61", + "bytes": 9872, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/b4_step3_bootstrap.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_step3_bootstrap.py", + "original_path": "/work/ratul1/supantha/Bertint/b4_step3_bootstrap.py", + "source_sha256": "ab7560abe237da435464a984a4e23925e7ec48d802949f57ef9600b829e6b37d", + "sha256": "ab7560abe237da435464a984a4e23925e7ec48d802949f57ef9600b829e6b37d", + "bytes": 19304, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/b4_step3_bootstrap_r2.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_step3_bootstrap_r2.py", + "original_path": "/work/ratul1/supantha/Bertint/b4_step3_bootstrap_r2.py", + "source_sha256": "6dbbbeb14bb860f6344a93bb65754f540dee8da4ceb3fdc526133c7133dd426c", + "sha256": "6dbbbeb14bb860f6344a93bb65754f540dee8da4ceb3fdc526133c7133dd426c", + "bytes": 19828, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/diagnostics/affinose_b4_gif_repeat_20260927.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/diagnostics/affinose_b4_gif_repeat_20260927.json", + "original_path": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_gif_repeat_20260927.json", + "source_sha256": "50049bf5658f27700205e91d07f40512b8d297a7af11f51fcfbd514df9b59478", + "sha256": "50049bf5658f27700205e91d07f40512b8d297a7af11f51fcfbd514df9b59478", + "bytes": 796, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/diagnostics/affinose_b4_step1_structure_20260926.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/diagnostics/affinose_b4_step1_structure_20260926.json", + "original_path": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_step1_structure_20260926.json", + "source_sha256": "7f9edc64528d5b43d2c464f8f5d4db91c2a133f54364993c7798a2a606bd3427", + "sha256": "7f9edc64528d5b43d2c464f8f5d4db91c2a133f54364993c7798a2a606bd3427", + "bytes": 16214, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/diagnostics/affinose_b4_step3_bootstrap_20260926.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/diagnostics/affinose_b4_step3_bootstrap_20260926.json", + "original_path": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_step3_bootstrap_20260926.json", + "source_sha256": "17ab513ec2d9dec6f1e8c9445dfd7500190f99f0e8758b21fbb435b026324f3b", + "sha256": "17ab513ec2d9dec6f1e8c9445dfd7500190f99f0e8758b21fbb435b026324f3b", + "bytes": 10624, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json", + "original_path": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json", + "source_sha256": "6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235", + "sha256": "6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235", + "bytes": 48191, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml", + "source_sha256": "1ab7793ddb0daa247dc1f75b53356663d2c99e2e279a33207c9dd82f24288d17", + "sha256": "1ab7793ddb0daa247dc1f75b53356663d2c99e2e279a33207c9dd82f24288d17", + "bytes": 1122, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml", + "source_sha256": "cda3d3e0df11dcbffff287c985039a4abe486a39bb97fe1554851992cbca127e", + "sha256": "cda3d3e0df11dcbffff287c985039a4abe486a39bb97fe1554851992cbca127e", + "bytes": 1159, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml", + "source_sha256": "d11d6ca73935a664a9afe9330d07e51b7e95e89e044a1012065ef1780d820381", + "sha256": "d11d6ca73935a664a9afe9330d07e51b7e95e89e044a1012065ef1780d820381", + "bytes": 1136, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml", + "source_sha256": "dab891f502cb328f8313a9d2971e5d8134472b059fa776409f97f5f59e5d470b", + "sha256": "dab891f502cb328f8313a9d2971e5d8134472b059fa776409f97f5f59e5d470b", + "bytes": 1159, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml", + "source_sha256": "875883d0ec38fca1a4995ea76c00db81ba84357fb2ed9a7c0921dbb6c7cf6492", + "sha256": "875883d0ec38fca1a4995ea76c00db81ba84357fb2ed9a7c0921dbb6c7cf6492", + "bytes": 1136, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml", + "source_sha256": "529c3940cfce81ab3d135f25b722d7c302cd83e8540646f041a5d6ba36baebf3", + "sha256": "529c3940cfce81ab3d135f25b722d7c302cd83e8540646f041a5d6ba36baebf3", + "bytes": 1126, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml", + "source_sha256": "908379483dc5b2d0655aa7b0a13b33c8b70ba0379852ffc2d848e354ebd9945e", + "sha256": "908379483dc5b2d0655aa7b0a13b33c8b70ba0379852ffc2d848e354ebd9945e", + "bytes": 1164, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml", + "source_sha256": "57cbf88ddf620ffbec7c4a8167a271ec38da0f94b1d3a4e9fe9769a9a19b8eea", + "sha256": "57cbf88ddf620ffbec7c4a8167a271ec38da0f94b1d3a4e9fe9769a9a19b8eea", + "bytes": 1141, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml", + "source_sha256": "5e518f2db88c03663eb263a5e4a44e93a3bc43e51c4af6c626cd0da416a18d81", + "sha256": "5e518f2db88c03663eb263a5e4a44e93a3bc43e51c4af6c626cd0da416a18d81", + "bytes": 1164, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml", + "source_sha256": "50c68416d3d4d72445e61811474179cb552e60d9f8a87f6cc0ed1da32d8b55e8", + "sha256": "50c68416d3d4d72445e61811474179cb552e60d9f8a87f6cc0ed1da32d8b55e8", + "bytes": 1141, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml", + "source_sha256": "034ba8bdefc3410b987d7bc380bd24a469a01c912349fef1e35436df2a24c36e", + "sha256": "034ba8bdefc3410b987d7bc380bd24a469a01c912349fef1e35436df2a24c36e", + "bytes": 1122, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml", + "source_sha256": "ed244565f2f81e6c554613718398af97683ad375eb4debb5a61d25855c444368", + "sha256": "ed244565f2f81e6c554613718398af97683ad375eb4debb5a61d25855c444368", + "bytes": 1159, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml", + "source_sha256": "d8ba3e8d83871cdd92548bc8bab1493225cdcbd536c0004ff6b40b48e4e62e40", + "sha256": "d8ba3e8d83871cdd92548bc8bab1493225cdcbd536c0004ff6b40b48e4e62e40", + "bytes": 1136, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml", + "source_sha256": "2faa1986c043cf5d8b869d316afa0a043d071400c4f2018ba83551332a143f25", + "sha256": "2faa1986c043cf5d8b869d316afa0a043d071400c4f2018ba83551332a143f25", + "bytes": 1159, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml", + "source_sha256": "5fd2cdec3ee4d49f7d7441a037e0a2fbe428b1c0586de88beaf17a2ab67580f1", + "sha256": "5fd2cdec3ee4d49f7d7441a037e0a2fbe428b1c0586de88beaf17a2ab67580f1", + "bytes": 1136, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_sweetonly.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_sweetonly.yaml", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_sweetonly.yaml", + "source_sha256": "e8fafb98627685ededa4392c5310e149a7dbbe907e37b43da7d20d228961b181", + "sha256": "e8fafb98627685ededa4392c5310e149a7dbbe907e37b43da7d20d228961b181", + "bytes": 1592, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/data/utils.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/data/utils.py", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/data/utils.py", + "source_sha256": "ab257b93c23a522dcd99f37b2b802e67c8e3b4ba46b938db6229a6311a77cd39", + "sha256": "ab257b93c23a522dcd99f37b2b802e67c8e3b4ba46b938db6229a6311a77cd39", + "bytes": 6186, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/train.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/train.py", + "original_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/train.py", + "source_sha256": "ab79451e7b51e27d985904a4445fc09b756d759413bb2ebaf8755d177bb3e8ad", + "sha256": "ab79451e7b51e27d985904a4445fc09b756d759413bb2ebaf8755d177bb3e8ad", + "bytes": 10058, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gif_seeds.sbatch", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gif_seeds.sbatch", + "original_path": "/work/ratul1/supantha/Bertint/gif_seeds.sbatch", + "source_sha256": "56bf1e5b11a386d0920b9f50da6288eff222ee1b7f25d772a8a666a2387b2a9d", + "sha256": "56bf1e5b11a386d0920b9f50da6288eff222ee1b7f25d772a8a666a2387b2a9d", + "bytes": 2790, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_launch.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_launch.py", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_launch.py", + "source_sha256": "241d3ca6045610a70ccad8307448b4d57e47810c945f127fef768357e56cdef2", + "sha256": "241d3ca6045610a70ccad8307448b4d57e47810c945f127fef768357e56cdef2", + "bytes": 10473, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "source_sha256": "e391584ec821c1e86916c6f8c14a6571a550034fd246e1dc0e7d7b3b6d4dbd7e", + "sha256": "e391584ec821c1e86916c6f8c14a6571a550034fd246e1dc0e7d7b3b6d4dbd7e", + "bytes": 572, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "source_sha256": "35d0ef06a1b9725233ed1e58c74101b7e6a555da48165ed57c9bd71bb5e77315", + "sha256": "35d0ef06a1b9725233ed1e58c74101b7e6a555da48165ed57c9bd71bb5e77315", + "bytes": 175381, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "source_sha256": "0dae829566b87d0dd00613343bc5a0c49fb1107c0f4834327d8cca71b8932389", + "sha256": "0dae829566b87d0dd00613343bc5a0c49fb1107c0f4834327d8cca71b8932389", + "bytes": 550, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "source_sha256": "fd6f39dd3bef9326bc1f583bf07a1f9b8f02f846630a0c58c66c7bae70456d59", + "sha256": "fd6f39dd3bef9326bc1f583bf07a1f9b8f02f846630a0c58c66c7bae70456d59", + "bytes": 175252, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "source_sha256": "fb07ac7cfcb63c4dd77c7493f4a518e11d268fd5e8d4cf6a849c31552e48369a", + "sha256": "fb07ac7cfcb63c4dd77c7493f4a518e11d268fd5e8d4cf6a849c31552e48369a", + "bytes": 572, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "source_sha256": "1d9e1b8c6fff12f8603ce8f7e58189da0ae8580e72d3c5bf5ff3893a4f9bce2f", + "sha256": "1d9e1b8c6fff12f8603ce8f7e58189da0ae8580e72d3c5bf5ff3893a4f9bce2f", + "bytes": 175505, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "source_sha256": "4902e83edaa137f55f5fe4f32f32068e94a3f4832630b284048c22b8a099dca6", + "sha256": "4902e83edaa137f55f5fe4f32f32068e94a3f4832630b284048c22b8a099dca6", + "bytes": 550, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "source_sha256": "b911e06e11968f9d8655ab69619f33a8878759e497eb44498432c341dc6fbdd1", + "sha256": "b911e06e11968f9d8655ab69619f33a8878759e497eb44498432c341dc6fbdd1", + "bytes": 175410, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "source_sha256": "75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b", + "sha256": "75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "source_sha256": "346d480fa44e31a5a486bfa99c136cc5ddfee27a197194b7fac289de9ba55665", + "sha256": "346d480fa44e31a5a486bfa99c136cc5ddfee27a197194b7fac289de9ba55665", + "bytes": 15294, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "source_sha256": "75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b", + "sha256": "75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "source_sha256": "6a42d5cf20bf64a7b027660beca902ec84a80a1beb73e8aec1e4eb26fbb7c913", + "sha256": "6a42d5cf20bf64a7b027660beca902ec84a80a1beb73e8aec1e4eb26fbb7c913", + "bytes": 1062, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/hparams.yaml", + "source_sha256": "75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b", + "sha256": "75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "source_sha256": "a71483c34b9d9cd904a6fe241f88af3e30bb3e100a15d666def5b06e4a5c0431", + "sha256": "a71483c34b9d9cd904a6fe241f88af3e30bb3e100a15d666def5b06e4a5c0431", + "bytes": 158739, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "source_sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "bytes": 553, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "source_sha256": "faee86ceadc7e1dbe6835d44aef8c5d4f810a2cbe224e13202154b52dab92be3", + "sha256": "faee86ceadc7e1dbe6835d44aef8c5d4f810a2cbe224e13202154b52dab92be3", + "bytes": 4108, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "source_sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "bytes": 553, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "source_sha256": "ed66bf0654eeaabf3b4f5f92e1295abc53a0155095160092ffb47826ff385d1a", + "sha256": "ed66bf0654eeaabf3b4f5f92e1295abc53a0155095160092ffb47826ff385d1a", + "bytes": 9534, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml", + "source_sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "bytes": 553, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "source_sha256": "127b095cc67faf26378a247dc7345de56d331537dad375990ed319f684fbde27", + "sha256": "127b095cc67faf26378a247dc7345de56d331537dad375990ed319f684fbde27", + "bytes": 57261, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml", + "source_sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "bytes": 553, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "source_sha256": "eee99377078178660db1f12c2700b0c46c9d8120db5f445a8d71d3f584cc9fcd", + "sha256": "eee99377078178660db1f12c2700b0c46c9d8120db5f445a8d71d3f584cc9fcd", + "bytes": 99720, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "source_sha256": "0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35", + "sha256": "0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "source_sha256": "47b51d96993782f3c9e6117722176941bd2c6d571200d160e28aa654c97c6356", + "sha256": "47b51d96993782f3c9e6117722176941bd2c6d571200d160e28aa654c97c6356", + "bytes": 1418, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "source_sha256": "0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35", + "sha256": "0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "source_sha256": "89d056126636c1fd1fa44d27ecfd57040a9bfc9eec2a76104da0ae07d01680b3", + "sha256": "89d056126636c1fd1fa44d27ecfd57040a9bfc9eec2a76104da0ae07d01680b3", + "bytes": 1474, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/hparams.yaml", + "source_sha256": "0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35", + "sha256": "0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "source_sha256": "c066cdbf7827bdec2f87c15bf95a42e0a23b511bf03338482e4d2b20c149336b", + "sha256": "c066cdbf7827bdec2f87c15bf95a42e0a23b511bf03338482e4d2b20c149336b", + "bytes": 175499, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "source_sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "bytes": 553, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "source_sha256": "fe5d987579ac234e8f21bb70e642177e9eccb69493564b7c5895e6abd51f4dc2", + "sha256": "fe5d987579ac234e8f21bb70e642177e9eccb69493564b7c5895e6abd51f4dc2", + "bytes": 4381, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "source_sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "bytes": 553, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "source_sha256": "0ecfee6421a63cee0f0537fdb311e44b87227421f637816a0a3ccfd132763d16", + "sha256": "0ecfee6421a63cee0f0537fdb311e44b87227421f637816a0a3ccfd132763d16", + "bytes": 87583, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml", + "source_sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "bytes": 553, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "source_sha256": "0d313e8557cb13577b34c8e94e0f2c887c11cfa6da6ca36ab2aa5f9d1cc10f22", + "sha256": "0d313e8557cb13577b34c8e94e0f2c887c11cfa6da6ca36ab2aa5f9d1cc10f22", + "bytes": 41685, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml", + "source_sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "bytes": 553, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "source_sha256": "5ef2b9552f452e4218b9728c0ed57f7a14ec5068d065c7223e2c6e566e5dafd2", + "sha256": "5ef2b9552f452e4218b9728c0ed57f7a14ec5068d065c7223e2c6e566e5dafd2", + "bytes": 29032, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "source_sha256": "781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf", + "sha256": "781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf", + "bytes": 572, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "source_sha256": "e92266239d6445a0de886e5081e433632c6719719f6d536ad31e98045160fcea", + "sha256": "e92266239d6445a0de886e5081e433632c6719719f6d536ad31e98045160fcea", + "bytes": 12411, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "source_sha256": "781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf", + "sha256": "781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf", + "bytes": 572, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "source_sha256": "929a3396f429527836db8368e7908024bf69766e0567636b1f24df8c1c06ea42", + "sha256": "929a3396f429527836db8368e7908024bf69766e0567636b1f24df8c1c06ea42", + "bytes": 275117, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "source_sha256": "f7852d23330d3b55e46eec193b3fe411306ea59349de6fa53273294d893dce1c", + "sha256": "f7852d23330d3b55e46eec193b3fe411306ea59349de6fa53273294d893dce1c", + "bytes": 550, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "source_sha256": "1e68c5af1f9c7fe0f1c85d9f3d49fa1104bf3d4c768014154316ee27b94a3cc3", + "sha256": "1e68c5af1f9c7fe0f1c85d9f3d49fa1104bf3d4c768014154316ee27b94a3cc3", + "bytes": 284563, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "source_sha256": "987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a", + "sha256": "987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a", + "bytes": 572, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "source_sha256": "e937607ecc6a7058664faab71728c58ef7a9bba8f6985082bca5d565aef6ec7e", + "sha256": "e937607ecc6a7058664faab71728c58ef7a9bba8f6985082bca5d565aef6ec7e", + "bytes": 11292, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "source_sha256": "987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a", + "sha256": "987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a", + "bytes": 572, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "source_sha256": "eb420f0ea03bce2075ad4eac9237862ccbecb2c37c02d162d860516f4739b280", + "sha256": "eb420f0ea03bce2075ad4eac9237862ccbecb2c37c02d162d860516f4739b280", + "bytes": 274338, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "source_sha256": "22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd", + "sha256": "22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd", + "bytes": 550, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "source_sha256": "30f0105da3f2c579a8261a30ed6c3fcc8308cf9ebc2068f0e71168567e919922", + "sha256": "30f0105da3f2c579a8261a30ed6c3fcc8308cf9ebc2068f0e71168567e919922", + "bytes": 32118, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "source_sha256": "22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd", + "sha256": "22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd", + "bytes": 550, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "source_sha256": "168da3dcbf6ca795bb75ec67b9fc567788637c25875b766cc76b441825e6020c", + "sha256": "168da3dcbf6ca795bb75ec67b9fc567788637c25875b766cc76b441825e6020c", + "bytes": 251993, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_score_macro.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_score_macro.py", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_score_macro.py", + "source_sha256": "ef833104d5eecd273df7d9f7c39bae4a216b015bde15978ea716f1f864874de4", + "sha256": "ef833104d5eecd273df7d9f7c39bae4a216b015bde15978ea716f1f864874de4", + "bytes": 14847, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_score_macro_seeds.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_score_macro_seeds.py", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_score_macro_seeds.py", + "source_sha256": "578635213e1a3eddd61438a6249f14e1a5d2487267286fc459eb77972808e225", + "sha256": "578635213e1a3eddd61438a6249f14e1a5d2487267286fc459eb77972808e225", + "bytes": 15417, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/gifflar_score_perrow.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_score_perrow.py", + "original_path": "/work/ratul1/supantha/Bertint/gifflar_score_perrow.py", + "source_sha256": "f88bcf303685ea6a075747a12eafa7df041909b9b455d80ea98c2b536aed0de8", + "sha256": "f88bcf303685ea6a075747a12eafa7df041909b9b455d80ea98c2b536aed0de8", + "bytes": 16705, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_attr_motif_16596807.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_attr_motif_16596807.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_attr_motif_16596807.out", + "source_sha256": "e65e21b8c9c9bd0291a034852f7ab47f826e1f51448d9ea8439b5eb23ed8eb98", + "sha256": "e65e21b8c9c9bd0291a034852f7ab47f826e1f51448d9ea8439b5eb23ed8eb98", + "bytes": 7511, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_b4_grep_16604967.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_b4_grep_16604967.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_b4_grep_16604967.out", + "source_sha256": "dadfe2c408938645b4138bb011719affdaebe7098060f66354df56da71d0a146", + "sha256": "dadfe2c408938645b4138bb011719affdaebe7098060f66354df56da71d0a146", + "bytes": 4542, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_b4_s3_16604914.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_b4_s3_16604914.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_b4_s3_16604914.out", + "source_sha256": "79eb29df46c44942a2a6ac4313789ebc29e1672bec4512c4f965be5ebb739cc9", + "sha256": "79eb29df46c44942a2a6ac4313789ebc29e1672bec4512c4f965be5ebb739cc9", + "bytes": 609, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_b4_s3r2_16605803.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_b4_s3r2_16605803.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_b4_s3r2_16605803.out", + "source_sha256": "5d93f96fb6e537c9b802fd1b2d9fe25df41a19800f85ea860246274d2e897d71", + "sha256": "5d93f96fb6e537c9b802fd1b2d9fe25df41a19800f85ea860246274d2e897d71", + "bytes": 5103, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_0.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_0.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_0.err", + "source_sha256": "6c486b37a642549a8dcf924eabd52e2660d88a6ada53ba05aecb91937fd98626", + "sha256": "6c486b37a642549a8dcf924eabd52e2660d88a6ada53ba05aecb91937fd98626", + "bytes": 3771, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_0.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_0.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_0.out", + "source_sha256": "7832596dfd62832aadeed39c1acca59643f00ec8dbe812730b49bd1b2ca5150b", + "sha256": "7832596dfd62832aadeed39c1acca59643f00ec8dbe812730b49bd1b2ca5150b", + "bytes": 3954, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_1.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_1.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_1.err", + "source_sha256": "bf5e3ff79c6b942dca7f35dcb85d0f32081b03875cb4640022fab29dff833b11", + "sha256": "bf5e3ff79c6b942dca7f35dcb85d0f32081b03875cb4640022fab29dff833b11", + "bytes": 3771, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_1.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_1.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_1.out", + "source_sha256": "134b045efbf1f560d0d41fa702ff53b6369fd38235fcef55ca8aaa4615698fed", + "sha256": "134b045efbf1f560d0d41fa702ff53b6369fd38235fcef55ca8aaa4615698fed", + "bytes": 3956, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_10.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_10.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_10.err", + "source_sha256": "d911a9619dee68a9fc982bb3db253b8e72f12dc1c06d2bc434556211909b2719", + "sha256": "d911a9619dee68a9fc982bb3db253b8e72f12dc1c06d2bc434556211909b2719", + "bytes": 3777, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_10.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_10.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_10.out", + "source_sha256": "c079926adcc0d2bce5b591f870208dcd2bef2ea3029aee8950bf0ce44c1105ea", + "sha256": "c079926adcc0d2bce5b591f870208dcd2bef2ea3029aee8950bf0ce44c1105ea", + "bytes": 3998, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_11.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_11.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_11.err", + "source_sha256": "5024c4160aeeccd212930b0d959ed0bab4dd7bf593b61b26decd78c7513aa638", + "sha256": "5024c4160aeeccd212930b0d959ed0bab4dd7bf593b61b26decd78c7513aa638", + "bytes": 4168, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_11.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_11.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_11.out", + "source_sha256": "4d110e939761ff4d8c7938c754e182d2c09ede84c8360d10ce18a04280dafea6", + "sha256": "4d110e939761ff4d8c7938c754e182d2c09ede84c8360d10ce18a04280dafea6", + "bytes": 4229, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_2.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_2.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_2.err", + "source_sha256": "d9383fa7e0469a436e08d24f4f9af31c1a6fb9ebb5e115843b53e2b2ded612f1", + "sha256": "d9383fa7e0469a436e08d24f4f9af31c1a6fb9ebb5e115843b53e2b2ded612f1", + "bytes": 3777, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_2.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_2.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_2.out", + "source_sha256": "0bbeab27824eeffbbfe5cf04317d1795b1f8f02d4c5ad9b7dbc23e159a823940", + "sha256": "0bbeab27824eeffbbfe5cf04317d1795b1f8f02d4c5ad9b7dbc23e159a823940", + "bytes": 3992, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_3.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_3.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_3.err", + "source_sha256": "735f42f273046b3af0374283927429fa75a1b7a8b66d6b205a20e4e1cfd59eed", + "sha256": "735f42f273046b3af0374283927429fa75a1b7a8b66d6b205a20e4e1cfd59eed", + "bytes": 3777, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_3.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_3.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_3.out", + "source_sha256": "dcdbc088e7945d0f63803ac95aed81f3f8c8d25c97dd760df269921a08bacae7", + "sha256": "dcdbc088e7945d0f63803ac95aed81f3f8c8d25c97dd760df269921a08bacae7", + "bytes": 3997, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_4.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_4.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_4.err", + "source_sha256": "98912251710582e65eaed2ba01ee184d957d177ec31e30969939b4ef0962a2bf", + "sha256": "98912251710582e65eaed2ba01ee184d957d177ec31e30969939b4ef0962a2bf", + "bytes": 4166, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_4.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_4.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_4.out", + "source_sha256": "b1febe3591a887bd63d7bb607536ce17bdab51eb9db9a8b8c3d9d5ff77aca1c2", + "sha256": "b1febe3591a887bd63d7bb607536ce17bdab51eb9db9a8b8c3d9d5ff77aca1c2", + "bytes": 4182, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_5.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_5.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_5.err", + "source_sha256": "cbb38c7fc50100cfa44cdf9b64de3df9a002613c62d8489b9d3db301406712c7", + "sha256": "cbb38c7fc50100cfa44cdf9b64de3df9a002613c62d8489b9d3db301406712c7", + "bytes": 3775, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_5.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_5.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_5.out", + "source_sha256": "a1b8f17ba63285c54d42ad49ce61bf8356ac4dfe279de8b65f687304783bdf55", + "sha256": "a1b8f17ba63285c54d42ad49ce61bf8356ac4dfe279de8b65f687304783bdf55", + "bytes": 3956, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_6.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_6.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_6.err", + "source_sha256": "8ec18cd103ee2f80b2bacc8660a53588ed6313dbdc2455fe87fb5cdac6d30ef1", + "sha256": "8ec18cd103ee2f80b2bacc8660a53588ed6313dbdc2455fe87fb5cdac6d30ef1", + "bytes": 4178, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_6.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_6.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_6.out", + "source_sha256": "18050c22347d3a2900b0d15cd7f2b97c1f6028ff27e5e060fc33c8308851b358", + "sha256": "18050c22347d3a2900b0d15cd7f2b97c1f6028ff27e5e060fc33c8308851b358", + "bytes": 4226, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_7.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_7.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_7.err", + "source_sha256": "1a1baefb3f9d8bae9c38975310f96004470e75bed27b32b5273b31a9baca05f5", + "sha256": "1a1baefb3f9d8bae9c38975310f96004470e75bed27b32b5273b31a9baca05f5", + "bytes": 4178, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_7.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_7.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_7.out", + "source_sha256": "8869a90d89089a6f26c7d88b1a389630930c35adff10016a015bc5bb331308b7", + "sha256": "8869a90d89089a6f26c7d88b1a389630930c35adff10016a015bc5bb331308b7", + "bytes": 4229, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_8.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_8.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_8.err", + "source_sha256": "01b633582a3ed13728f688fde16693926778896ba0952506cce66072f600f354", + "sha256": "01b633582a3ed13728f688fde16693926778896ba0952506cce66072f600f354", + "bytes": 4156, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_8.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_8.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_8.out", + "source_sha256": "8f468cb20588f01bc0794c43ea69d5fa78627f4e35ef7ecdb7ffbcd3266c78c3", + "sha256": "8f468cb20588f01bc0794c43ea69d5fa78627f4e35ef7ecdb7ffbcd3266c78c3", + "bytes": 4184, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_9.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_9.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_9.err", + "source_sha256": "a3ea46d3bd9191b9bbd49627cbfdac0dee312230e5e1ed93016f98f8786b94ba", + "sha256": "a3ea46d3bd9191b9bbd49627cbfdac0dee312230e5e1ed93016f98f8786b94ba", + "bytes": 4600, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gseed_16597159_9.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_9.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gseed_16597159_9.out", + "source_sha256": "313f8c5e3999dfa75ae508fd57d0d033a00b40cdf2b794cb4c32fb0a901b53bb", + "sha256": "313f8c5e3999dfa75ae508fd57d0d033a00b40cdf2b794cb4c32fb0a901b53bb", + "bytes": 4184, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_0.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_0.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_0.err", + "source_sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_0.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_0.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_0.out", + "source_sha256": "19bb18892da4f9174e308bd42908a6e6d383001edd75c9ad482eef111b5bbb31", + "sha256": "19bb18892da4f9174e308bd42908a6e6d383001edd75c9ad482eef111b5bbb31", + "bytes": 2138, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_1.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_1.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_1.err", + "source_sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_1.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_1.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_1.out", + "source_sha256": "152af1228aa39534d68470023321d4350bb2ea4b997bfd0bf38efbbeb92bad8b", + "sha256": "152af1228aa39534d68470023321d4350bb2ea4b997bfd0bf38efbbeb92bad8b", + "bytes": 2137, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_10.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_10.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_10.err", + "source_sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_10.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_10.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_10.out", + "source_sha256": "d842f047adc16782a9724406ecab07aa67fe3ad853f5d0c8bee73cb63d129782", + "sha256": "d842f047adc16782a9724406ecab07aa67fe3ad853f5d0c8bee73cb63d129782", + "bytes": 2141, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_11.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_11.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_11.err", + "source_sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_11.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_11.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_11.out", + "source_sha256": "922dfe72fd457b50a6c468db266827346ab1173381458ad61e21ceb5a0c8736c", + "sha256": "922dfe72fd457b50a6c468db266827346ab1173381458ad61e21ceb5a0c8736c", + "bytes": 2150, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_2.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_2.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_2.err", + "source_sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_2.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_2.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_2.out", + "source_sha256": "2b008f6ae0f5554b9841582ded12a01558218558d8b7748899e94a0499d8caaf", + "sha256": "2b008f6ae0f5554b9841582ded12a01558218558d8b7748899e94a0499d8caaf", + "bytes": 2152, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_3.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_3.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_3.err", + "source_sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_3.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_3.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_3.out", + "source_sha256": "c1d325125ee0463b230e5ac347c45a117ebc1a1686393d9d7bd63dd7c9a8a8d4", + "sha256": "c1d325125ee0463b230e5ac347c45a117ebc1a1686393d9d7bd63dd7c9a8a8d4", + "bytes": 2152, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_4.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_4.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_4.err", + "source_sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_4.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_4.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_4.out", + "source_sha256": "939f30920d3d4a772d8736c945f6e39dc949cde64cc7b9b9e0116e7b45f4f895", + "sha256": "939f30920d3d4a772d8736c945f6e39dc949cde64cc7b9b9e0116e7b45f4f895", + "bytes": 2170, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_5.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_5.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_5.err", + "source_sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_5.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_5.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_5.out", + "source_sha256": "7817d9b5c087d542f2c0659726a66532091a24c9b05edb04196a756291dd5784", + "sha256": "7817d9b5c087d542f2c0659726a66532091a24c9b05edb04196a756291dd5784", + "bytes": 2171, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_6.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_6.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_6.err", + "source_sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_6.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_6.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_6.out", + "source_sha256": "4283aa1d699582d4766ca394cf2d9c4b046ce8247b5cef0f8250c424329138a2", + "sha256": "4283aa1d699582d4766ca394cf2d9c4b046ce8247b5cef0f8250c424329138a2", + "bytes": 2197, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_7.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_7.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_7.err", + "source_sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_7.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_7.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_7.out", + "source_sha256": "eb0257132cbd79d1a3a84bec543183b7bbdaceaaaefc85c988368d70d4146322", + "sha256": "eb0257132cbd79d1a3a84bec543183b7bbdaceaaaefc85c988368d70d4146322", + "bytes": 2196, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_8.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_8.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_8.err", + "source_sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_8.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_8.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_8.out", + "source_sha256": "523b5ac11259832265dab5c4e08d837f3fe7e4780048a5a4af1f513f6b8c3d4a", + "sha256": "523b5ac11259832265dab5c4e08d837f3fe7e4780048a5a4af1f513f6b8c3d4a", + "bytes": 2137, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_9.err", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_9.err", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_9.err", + "source_sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "sha256": "53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4", + "bytes": 575, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/logs/aff_gsmac_16602170_9.out", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_9.out", + "original_path": "/work/ratul1/supantha/Bertint/logs/aff_gsmac_16602170_9.out", + "source_sha256": "40ef3d8f12ba723cfe0e845ec72a960dbd32c8bc5baa3013f570e1c27a6431b6", + "sha256": "40ef3d8f12ba723cfe0e845ec72a960dbd32c8bc5baa3013f570e1c27a6431b6", + "bytes": 2137, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/manifest.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/manifest.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/manifest.json", + "source_sha256": "06fbfcd2f820fc4621d35c16dcd6bbece93ea68b96d417d8b7bd2ce3ea104cdb", + "sha256": "06fbfcd2f820fc4621d35c16dcd6bbece93ea68b96d417d8b7bd2ce3ea104cdb", + "bytes": 74005, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/remote/train_lgi.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/train_lgi.py", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/train_lgi.py", + "source_sha256": "bf602abb05eeb3b0203766d9d1bc462579c181bc3418d762f6d02d5f36e8a230", + "sha256": "bf602abb05eeb3b0203766d9d1bc462579c181bc3418d762f6d02d5f36e8a230", + "bytes": 6375, + "role": "unchanged remote executed source/configuration/runtime evidence", + "transformation": "none" + }, + { + "path": "executed/local/audit_current_pretraining_exposure.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/audit_current_pretraining_exposure.py", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/audit_current_pretraining_exposure.py", + "source_sha256": "45a366b40a523671427950b83ac2c8a243c96f1bce8527b0af2337a375ff2b15", + "sha256": "45a366b40a523671427950b83ac2c8a243c96f1bce8527b0af2337a375ff2b15", + "bytes": 6154, + "role": "unchanged executed local verification source", + "transformation": "none" + }, + { + "path": "executed/local/collect_current_glycan_sets.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/collect_current_glycan_sets.py", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/collect_current_glycan_sets.py", + "source_sha256": "bdb19bf323c94eacc1943b4345b5b2485dfa50b7ac00a755e8a1dde2f8a4ed74", + "sha256": "bdb19bf323c94eacc1943b4345b5b2485dfa50b7ac00a755e8a1dde2f8a4ed74", + "bytes": 1923, + "role": "unchanged executed local verification source", + "transformation": "none" + }, + { + "path": "executed/local/dc_anatomy.py", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/bertosebind_doubly_cold_anatomy_20260927/analysis/dc_anatomy.py", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/bertosebind_doubly_cold_anatomy_20260927/analysis/dc_anatomy.py", + "source_sha256": "9c9b90f077709c105dd16b706ebcd434dd793177c274eca17b10bc3241f0138b", + "sha256": "9c9b90f077709c105dd16b706ebcd434dd793177c274eca17b10bc3241f0138b", + "bytes": 17876, + "role": "unchanged anatomy source; panel-bootstrap outputs descriptive only", + "transformation": "none" + }, + { + "path": "results/doubly_cold_anatomy.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/bertosebind_doubly_cold_anatomy_20260927/outputs/doubly_cold_anatomy.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/bertosebind_doubly_cold_anatomy_20260927/outputs/doubly_cold_anatomy.json", + "source_sha256": "0dff08537f0cd5a1ad40562537c48546d3d4f3858a75b2ab2d3729b22a5dfe91", + "sha256": "0dff08537f0cd5a1ad40562537c48546d3d4f3858a75b2ab2d3729b22a5dfe91", + "bytes": 9441, + "role": "saved anatomy result; no model refit", + "transformation": "none" + }, + { + "path": "results/doubly_cold_per_assay.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/bertosebind_doubly_cold_anatomy_20260927/outputs/doubly_cold_per_assay.csv", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/bertosebind_doubly_cold_anatomy_20260927/outputs/doubly_cold_per_assay.csv", + "source_sha256": "4186c66c13fd05d62d83a10df2a5761b2e29ded502660c12cb450836f9881496", + "sha256": "4186c66c13fd05d62d83a10df2a5761b2e29ded502660c12cb450836f9881496", + "bytes": 18263, + "role": "saved anatomy result; no model refit", + "transformation": "none" + }, + { + "path": "results/protein_probe.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/affinose_attribution_motif_20260925.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/affinose_attribution_motif_20260925.json", + "source_sha256": "4fd80f7396aa9803602fd62bd82ec3e98e1f937b46e1057cb26ffa56ea6c93f0", + "sha256": "4fd80f7396aa9803602fd62bd82ec3e98e1f937b46e1057cb26ffa56ea6c93f0", + "bytes": 10946, + "role": "reported-model protein replacement result", + "transformation": "none" + }, + { + "path": "results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s43.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_gifflarESM_s43.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_gifflarESM_s43.json", + "source_sha256": "2c494ac1351d4ff63828139eac004c0047dc3259d62fd10334d5a740cab9182f", + "sha256": "2c494ac1351d4ff63828139eac004c0047dc3259d62fd10334d5a740cab9182f", + "bytes": 927, + "role": "original producer seed43/44 score receipt", + "transformation": "none" + }, + { + "path": "results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s44.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_gifflarESM_s44.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_gifflarESM_s44.json", + "source_sha256": "82173016b893cb2913e90e99feea5f6f4ff22cff9e1aff0fe7dc136161c7f627", + "sha256": "82173016b893cb2913e90e99feea5f6f4ff22cff9e1aff0fe7dc136161c7f627", + "bytes": 927, + "role": "original producer seed43/44 score receipt", + "transformation": "none" + }, + { + "path": "results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json", + "source_sha256": "ac58a83969a0ffb860cf1a33a472f4cb5b3e14f25097c3ba909f7555f65aa589", + "sha256": "ac58a83969a0ffb860cf1a33a472f4cb5b3e14f25097c3ba909f7555f65aa589", + "bytes": 933, + "role": "original producer seed43/44 score receipt", + "transformation": "none" + }, + { + "path": "results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json", + "source_sha256": "d2d2d73c834a2fcca7b8c22fd6ce91907f18866443628c2c54f8b8ec04477803", + "sha256": "d2d2d73c834a2fcca7b8c22fd6ce91907f18866443628c2c54f8b8ec04477803", + "bytes": 933, + "role": "original producer seed43/44 score receipt", + "transformation": "none" + }, + { + "path": "results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s43.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_gifflarESM_s43.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_gifflarESM_s43.json", + "source_sha256": "7b0a01a1acc7e2ca80a3de9aaab02941942ead519e6661abec6c44c7fa5fd079", + "sha256": "7b0a01a1acc7e2ca80a3de9aaab02941942ead519e6661abec6c44c7fa5fd079", + "bytes": 929, + "role": "original producer seed43/44 score receipt", + "transformation": "none" + }, + { + "path": "results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s44.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_gifflarESM_s44.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_gifflarESM_s44.json", + "source_sha256": "f2e40d306b767e6949c02304077a08398dc16ac19d08d94937f7dc49abd7cc24", + "sha256": "f2e40d306b767e6949c02304077a08398dc16ac19d08d94937f7dc49abd7cc24", + "bytes": 930, + "role": "original producer seed43/44 score receipt", + "transformation": "none" + }, + { + "path": "results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s43.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_sweetnetESM_s43.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_sweetnetESM_s43.json", + "source_sha256": "e13c8021d6e94b3bd6cb4ef00d7456c182449f57c4b1356256e011805a6efdbf", + "sha256": "e13c8021d6e94b3bd6cb4ef00d7456c182449f57c4b1356256e011805a6efdbf", + "bytes": 935, + "role": "original producer seed43/44 score receipt", + "transformation": "none" + }, + { + "path": "results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s44.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_sweetnetESM_s44.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_sweetnetESM_s44.json", + "source_sha256": "d274d35c9a0ba25e4597cdb8c01001f4f7ff7760aabfe7c8a00b84a70b74252f", + "sha256": "d274d35c9a0ba25e4597cdb8c01001f4f7ff7760aabfe7c8a00b84a70b74252f", + "bytes": 935, + "role": "original producer seed43/44 score receipt", + "transformation": "none" + }, + { + "path": "results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s43.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_gifflarESM_s43.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_gifflarESM_s43.json", + "source_sha256": "2208056d5303fda27c5b541eed1c6f64cb03de1c10abd2868d4ce55d1bdb475c", + "sha256": "2208056d5303fda27c5b541eed1c6f64cb03de1c10abd2868d4ce55d1bdb475c", + "bytes": 922, + "role": "original producer seed43/44 score receipt", + "transformation": "none" + }, + { + "path": "results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s44.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_gifflarESM_s44.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_gifflarESM_s44.json", + "source_sha256": "c831378d73c3c2c9456be5ff9ff05acc34b64815b056c5df21bef2078a415393", + "sha256": "c831378d73c3c2c9456be5ff9ff05acc34b64815b056c5df21bef2078a415393", + "bytes": 922, + "role": "original producer seed43/44 score receipt", + "transformation": "none" + }, + { + "path": "results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json", + "source_sha256": "121a30d0de568217e722036cf25ba4ef61128398fde3466fc8b2f60f096722c7", + "sha256": "121a30d0de568217e722036cf25ba4ef61128398fde3466fc8b2f60f096722c7", + "bytes": 929, + "role": "original producer seed43/44 score receipt", + "transformation": "none" + }, + { + "path": "results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json", + "source_sha256": "3d29ac377491db5d952f6066228fe4099f99db0e2fbaa80063ee429fc28e0a28", + "sha256": "3d29ac377491db5d952f6066228fe4099f99db0e2fbaa80063ee429fc28e0a28", + "bytes": 927, + "role": "original producer seed43/44 score receipt", + "transformation": "none" + }, + { + "path": "inputs/current_glycan_sets/doubly_cold_exposure_join.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/doubly_cold_exposure_join.csv", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/doubly_cold_exposure_join.csv", + "source_sha256": "9d13452309d64f138705657334b74738eaf167c9faff835d024582e0e98c0af8", + "sha256": "9d13452309d64f138705657334b74738eaf167c9faff835d024582e0e98c0af8", + "bytes": 32408, + "role": "current scored-set source export or exact-WURCS exposure join", + "transformation": "none" + }, + { + "path": "inputs/current_glycan_sets/doubly_cold_scored_glycans.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/doubly_cold_scored_glycans.csv", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/doubly_cold_scored_glycans.csv", + "source_sha256": "e5eebf2072779d7001dabd3981237025be37eee6f19a5b109b00ce4b3e776e09", + "sha256": "e5eebf2072779d7001dabd3981237025be37eee6f19a5b109b00ce4b3e776e09", + "bytes": 30484, + "role": "current scored-set source export or exact-WURCS exposure join", + "transformation": "none" + }, + { + "path": "inputs/current_glycan_sets/glycan_cold_exposure_join.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/glycan_cold_exposure_join.csv", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/glycan_cold_exposure_join.csv", + "source_sha256": "4d101cc92685c63ecca99cfad2c1bc46c73c77b1e565bd686bde14ee0d020886", + "sha256": "4d101cc92685c63ecca99cfad2c1bc46c73c77b1e565bd686bde14ee0d020886", + "bytes": 62994, + "role": "current scored-set source export or exact-WURCS exposure join", + "transformation": "none" + }, + { + "path": "inputs/current_glycan_sets/glycan_cold_scored_glycans.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/glycan_cold_scored_glycans.csv", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/glycan_cold_scored_glycans.csv", + "source_sha256": "0faab973a6ee5e5bf712983d51fad9f746e34edcbe5342574d45933bba62f48a", + "sha256": "0faab973a6ee5e5bf712983d51fad9f746e34edcbe5342574d45933bba62f48a", + "bytes": 59313, + "role": "current scored-set source export or exact-WURCS exposure join", + "transformation": "none" + }, + { + "path": "inputs/current_glycan_sets/manifest.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/manifest.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/manifest.json", + "source_sha256": "7655d9d080df7cb5dc748b7d9721037fbec67c04cf837e4724f0afba7e7a4d71", + "sha256": "7655d9d080df7cb5dc748b7d9721037fbec67c04cf837e4724f0afba7e7a4d71", + "bytes": 2391, + "role": "current scored-set source export or exact-WURCS exposure join", + "transformation": "none" + }, + { + "path": "inputs/current_glycan_sets/protein_cold_exposure_join.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/protein_cold_exposure_join.csv", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/protein_cold_exposure_join.csv", + "source_sha256": "08ceef347f61012e0baab4daf1472122dc80335c6ea02fe084098c055a3e3e30", + "sha256": "08ceef347f61012e0baab4daf1472122dc80335c6ea02fe084098c055a3e3e30", + "bytes": 112384, + "role": "current scored-set source export or exact-WURCS exposure join", + "transformation": "none" + }, + { + "path": "inputs/current_glycan_sets/protein_cold_scored_glycans.csv", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/protein_cold_scored_glycans.csv", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/protein_cold_scored_glycans.csv", + "source_sha256": "f35d6088903e993f46adee07806e577456599d9814f4f43e40efdf3d8ddf6c46", + "sha256": "f35d6088903e993f46adee07806e577456599d9814f4f43e40efdf3d8ddf6c46", + "bytes": 103485, + "role": "current scored-set source export or exact-WURCS exposure join", + "transformation": "none" + }, + { + "path": "provenance/protein_gifflar_audit.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/protein_gifflar_audit.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/protein_gifflar_audit.json", + "source_sha256": "7d24cac24a37583fddac7d91c73e22ea6d4a022194ac213ab354f9e9831b1084", + "sha256": "7d24cac24a37583fddac7d91c73e22ea6d4a022194ac213ab354f9e9831b1084", + "bytes": 109442, + "role": "verification record or required external input manifest; not a scientific rerun", + "transformation": "none" + }, + { + "path": "provenance/protein_gifflar_verified_numbers.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/protein_gifflar_verified_numbers.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/protein_gifflar_verified_numbers.json", + "source_sha256": "9d2e628a789a46a69333c24550d2a150166aebed382880c2d0a67fbd43124eaa", + "sha256": "9d2e628a789a46a69333c24550d2a150166aebed382880c2d0a67fbd43124eaa", + "bytes": 30957, + "role": "verification record or required external input manifest; not a scientific rerun", + "transformation": "none" + }, + { + "path": "provenance/current_pretraining_exposure_audit.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_pretraining_exposure_audit.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_pretraining_exposure_audit.json", + "source_sha256": "30a70a1703183b50fa1c10986c065471513981fac1e3e69f9c7ad649aeecb16a", + "sha256": "30a70a1703183b50fa1c10986c065471513981fac1e3e69f9c7ad649aeecb16a", + "bytes": 9596, + "role": "verification record or required external input manifest; not a scientific rerun", + "transformation": "none" + }, + { + "path": "provenance/bootstrap_anatomy_audit.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/bootstrap_anatomy_audit.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/bootstrap_anatomy_audit.json", + "source_sha256": "11014b5f0972c23b7225c4202f2254b444109b8105563d968e9c8f4534061ff1", + "sha256": "11014b5f0972c23b7225c4202f2254b444109b8105563d968e9c8f4534061ff1", + "bytes": 41282, + "role": "verification record or required external input manifest; not a scientific rerun", + "transformation": "none" + }, + { + "path": "provenance/bootstrap_code_audit.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/bootstrap_code_audit.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/bootstrap_code_audit.json", + "source_sha256": "d2812e72a7befc1bdb08465189d2fed035ae725142c1cf978a578e0add72e94d", + "sha256": "d2812e72a7befc1bdb08465189d2fed035ae725142c1cf978a578e0add72e94d", + "bytes": 12403, + "role": "verification record or required external input manifest; not a scientific rerun", + "transformation": "none" + }, + { + "path": "provenance/bootstrap_exact_input_manifest.json", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/bootstrap_exact_input_manifest.json", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/bootstrap_exact_input_manifest.json", + "source_sha256": "d6e36605873c587028c6dab2dde8093c6e4e33df53ebc27f1d6e3c6b4de14991", + "sha256": "d6e36605873c587028c6dab2dde8093c6e4e33df53ebc27f1d6e3c6b4de14991", + "bytes": 24651, + "role": "verification record or required external input manifest; not a scientific rerun", + "transformation": "none" + }, + { + "path": "provenance/gifflar_scorer_diff.txt", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/gifflar_scorer_diff.txt", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/gifflar_scorer_diff.txt", + "source_sha256": "6649cef7a00096ba2981c611a4c6432be93300e3bb439cd543a692cbb40a15af", + "sha256": "6649cef7a00096ba2981c611a4c6432be93300e3bb439cd543a692cbb40a15af", + "bytes": 1510, + "role": "verification record or required external input manifest; not a scientific rerun", + "transformation": "none" + }, + { + "path": "protocol/original_20260910.md", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/AFFINOSE_BOOTSTRAP_PREDECLARATION_20260910.md", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/AFFINOSE_BOOTSTRAP_PREDECLARATION_20260910.md", + "source_sha256": "04dea299feb3ac0840ff5db7471381ad3f1cf531653bf6aeb9825005236d2f0b", + "sha256": "04dea299feb3ac0840ff5db7471381ad3f1cf531653bf6aeb9825005236d2f0b", + "bytes": 10993, + "role": "unchanged original protocol; superseded in specified respects", + "transformation": "none" + }, + { + "path": "protocol/amendment_excerpts_20260925_26.md", + "source_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/AFFINOSE_UPDATE_TRACKER.md", + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/AFFINOSE_UPDATE_TRACKER.md", + "source_sha256": "cac6e840402f83fae2dc7115ce9247423c82122b3ebf0dd6488f30f5946aa495", + "sha256": "924765b90a840277c5ed9dd6594a8ded2d5f7add5b138a9af1adf89bbb46cbcc", + "bytes": 13421, + "role": "verbatim selected protocol sections", + "transformation": "exact source line excerpts:68\u2013177 and199\u2013261; explanatory header" + }, + { + "path": "README.md", + "source_path": null, + "original_path": "generated portable reporting check or documentation", + "source_sha256": null, + "sha256": "b18eed4c3ad4f0cbdd700e41d6ff7af1f520d26386f76f4573e82332f3e1ea28", + "bytes": 5655, + "role": "portable reporting check or documentation", + "transformation": "new documentation/check, or path-only port recorded in exposure_portability.patch" + }, + { + "path": "audit_pretraining_exposure.py", + "source_path": null, + "original_path": "generated portable reporting check or documentation", + "source_sha256": null, + "sha256": "fc4ffac8de965da6250297ee24fa801be2619f1afcc29471204c7e5aead03012", + "bytes": 6235, + "role": "portable reporting check or documentation", + "transformation": "new documentation/check, or path-only port recorded in exposure_portability.patch" + }, + { + "path": "check_package.py", + "source_path": null, + "original_path": "generated portable reporting check or documentation", + "source_sha256": null, + "sha256": "2b8be4fcd7ebc98f49e9532415644f457930a1e7700d5c17fdc58a0abd0dd271", + "bytes": 655, + "role": "portable reporting check or documentation", + "transformation": "new documentation/check, or path-only port recorded in exposure_portability.patch" + }, + { + "path": "provenance/exposure_portability.patch", + "source_path": null, + "original_path": "generated portable reporting check or documentation", + "source_sha256": null, + "sha256": "ff65b38435040ba2f5987e0c78ecc0fafc4604341b9bc094513d47cb343db023", + "bytes": 8422, + "role": "portable reporting check or documentation", + "transformation": "new documentation/check, or path-only port recorded in exposure_portability.patch" + }, + { + "path": "reproduce_summary.py", + "source_path": null, + "original_path": "generated portable reporting check or documentation", + "source_sha256": null, + "sha256": "4b49c6f8f6c9953cee46ff2f6c47e1bb68692c9b58984973b3d8666648999f62", + "bytes": 2008, + "role": "portable reporting check or documentation", + "transformation": "new documentation/check, or path-only port recorded in exposure_portability.patch" + }, + { + "path": "requirements.txt", + "source_path": null, + "original_path": "generated portable reporting check or documentation", + "source_sha256": null, + "sha256": "99acda4c8365d691c16de3e032e225de05cee38cff063a772bf9eaec2067328f", + "bytes": 104, + "role": "portable reporting check or documentation", + "transformation": "new documentation/check, or path-only port recorded in exposure_portability.patch" + } + ] +} diff --git a/releases/2026-10-02/bertosebind_new_runs/protocol/amendment_excerpts_20260925_26.md b/releases/2026-10-02/bertosebind_new_runs/protocol/amendment_excerpts_20260925_26.md new file mode 100644 index 0000000000000000000000000000000000000000..4748c5c5a3a4dff72e632e08e197263e01f66dfb --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/protocol/amendment_excerpts_20260925_26.md @@ -0,0 +1,184 @@ +# Preserved protocol excerpts,25–26 September + +Current source: `AFFINOSE_UPDATE_TRACKER.md`, SHA256 `cac6e840402f83fae2dc7115ce9247423c82122b3ebf0dd6488f30f5946aa495`. +These excerpts preserve B1/B2/B4 and exclude the dropped workstream. File text alone does not certify when a decision was written. + +## Source lines 68–177 + +### B1 · #3 ✅ DONE — Protein-dependence probe on the reported model — owner GO 2026-09-25 + +**Why.** The only protein-dependence evidence (wrong protein costs 0.2001, job `12246385`) was +measured on the pre-motif P3 configuration, intact macro 0.3029. The reported model scores 0.3293 +and carries an additive **glycan-only** motif term, so "is this a glycan predictor with a protein +decoration?" is the sharpest available objection and we currently have no measurement against it. +A 22 Sep lineage audit (`_verification/deletions_review_validation_20260922/affinose_protein_dependence.json`) +independently marked the old result `HOLD_DO_NOT_IMPORT_AS_FINAL_MODEL_RESULT`. + +**🔄 SUBMITTED 2026-09-25 — job `16596807`**, route `nova/ratul/normal`, generic `gpu:1`, 3 h limit. +PENDING (Priority) at submission. Code and sbatch uploaded and byte-verified (14,866 / 1,616). + +| | path on Nova (`/work/ratul1/supantha/Bertint/`) | +|---|---| +| producer | `aff_attribution_motif.py` (new; `aff_attribution.py` left untouched) | +| sbatch | `aff_attribution_motif.sbatch` — CUDA guard + output-absence gate | +| result | `affinose_attribution_motif_20260925.json` | +| per-row predictions | `affinose_attribution_motif_preds/.npz` | +| log | `logs/aff_attr_motif_16596807.out` | + +The Sept 8 outputs (`affinose_attribution_20260908.json`, `affinose_attribution_preds/`) are not +touched. Check with one `sacct -j 16596807` — **never poll.** + +**⏳ INTERIM (log read 2026-09-25, 4 of 9 cells, 15:45 elapsed) — formal verdict waits for all 9 gates.** +Ran on A100-SXM4-80GB; tripwires 200/200 on every cell; **every intact score reproduces its test +export to 0.00000.** + +| glycan-cold | intact | wrong protein | Δ | mean protein | Δ | +|---|---:|---:|---:|---:|---:| +| s42 | 0.3341 | 0.1580 | −0.1760 | 0.2595 | −0.0746 | +| s43 | 0.3184 | 0.1277 | −0.1907 | 0.2461 | −0.0723 | +| s44 | 0.3355 | 0.1857 | −0.1498 | 0.2544 | −0.0811 | +| **mean** | **0.3293** | | **−0.1722** | | **−0.0760** | + +Pre-declared rule on glycan-cold: threshold 0.1722 > 0.019 ✅ · specificity 0.1722 ≥ 0.0760 ✅ (3/3 +seeds). Versus the pre-motif probe (−0.2001 / −0.1773, gap 0.023) the reported model's +wrong-vs-mean gap is **0.096** — more protein-specific, not less. Protein-cold s42: −0.0525 / −0.0317. + +**✅ FINAL — job `16596807` COMPLETED 2026-09-25 (23:16 elapsed, exit 0). `gate_passed: True` — all 9 +intact scores reproduce the test export to 0.00000. VERDICT: SUPPORTED — the reported model uses the +protein partner.** Local copy: `review/affinose_eval/affinose_attribution_motif_20260925.json`. + +| regime | intact | wrong-protein drop (± seed SD) | mean-protein drop | wrong ≥ mean | agreement with intact | +|---|---:|---:|---:|:--:|---:| +| glycan-cold | 0.3293 | **0.1722 ± 0.0207** | 0.0760 | 3/3 | 0.468 | +| protein-cold | 0.2409 | **0.0691 ± 0.0150** | 0.0353 | 3/3 | 0.643 | +| doubly-cold | 0.1785 | **0.0061 ± 0.0156** | −0.0079 | 2/3 | 0.752 | + +Doubly-cold per seed (wrong / mean): s42 −0.0221 / **+0.0324** · s43 **+0.0091** / −0.0070 · s44 +−0.0053 / −0.0016. On doubly-cold a wrong protein and an average protein both leave the score +essentially unchanged, in either direction — **the protein pathway contributes nothing measurable +when the proteins are also new.** This was pre-declared as expected, and it is smaller than the +pre-motif −0.0199. + +⭐ **Protein use falls as proteins become unfamiliar: 0.172 → 0.069 → 0.006.** It mirrors the motif +benefit, which *rises* as glycans become unfamiliar (−0.0042 → +0.0291 → +0.0682, validation). +Together they explain doubly-cold: new proteins supply no usable protein signal, so the model falls +back on glycan features — exactly where the glycan-feature regressions compete. See D8. + +**⭐ PRE-DECLARED before any result — written 2026-09-25, not to be edited after the job runs.** + +| | | +|---|---| +| model | the 9 reported motif cells (3 regimes × seeds 42/43/44), `motif_additive_dim 165` | +| interventions | **(a) wrong protein** — deterministic cyclic derangement of protein identity within the stratum, zero self-assignments (the `12246385` method); **(b) mean protein** — residue vectors replaced by the stratum mean | +| held fixed | glycan input **and the motif features** — the point is whether the protein pathway still matters *with* the glycan-only term present | +| metric | equal-assay macro Spearman on the frozen **test** strata, eligible assays 1,767 / 246 / 212 | +| validation gate | intact per-cell scores must reproduce the test export to **±0.0005** (e.g. `mo_A_glycan_s42` = 0.334059) — or the harness is wrong and nothing is reported | +| **"uses protein" is supported if** | glycan-cold mean wrong-protein drop **> 0.019** (2 × the reported model's glycan-cold seed SD, 0.0095) **and** wrong-protein drop ≥ mean-protein drop on the same seeds (specific, not a generic presence gate) | +| expected, not a failure | a **small** doubly-cold drop — the pre-motif mechanism predicts it (−0.0199 there) | +| reporting | all three regimes, all three seeds, both interventions, **whatever the direction** | + +**Implementation details pinned before submission (2026-09-25, same day, still pre-result):** +- "wrong-protein drop ≥ mean-protein drop" is evaluated on the **mean over the three seeds**. The + per-seed comparison is reported as a secondary line, not used for the verdict. +- Derangement RNG seed **20260908** — identical to job `12246385`, so the wrong-protein map matches + the pre-motif probe wherever the stratum's protein set is the same. +- Stratum override: every receipt records `test_stratum = val_*` (training was pointed at + validation). The probe maps `val_*` → `test_*` with row counts 37,295 / 38,539 / 3,691, exactly as + `score_arms_on_test_historical.py` did — reusing `aff_attribution.py` unmodified would have probed + **validation**. +- Construction copied from `score_arms_on_test_historical.py` (the producer of the reference + numbers), including its `chdir` into `model_motif_20260908`. +- Tripwires, fail-closed: reassigned rows must carry a different protein embedding; motif features + must be identical between intact and reassigned inputs. +- GPU: generic `gpu:1` per project rules; the device name is recorded so the ±0.0005 gate can be read. + +### B2 · #1 ✅ DONE — GIFFLAR seeds 43 + 44 — equal-footing CIs — owner GO 2026-09-25 + +**✅ RESULT 26 Sep (scoring `16602170`, all 12 gates True) — full tables in `AFFINOSE_NEW_RUNS_20260925.md` #1.** +Three-seed GIFFLAR: glycan-cold 0.2550 / 0.2658, protein-cold 0.2074 / 0.1765, doubly-cold 0.1645 / 0.2221 +(gifflarESM / sweetnetESM). BERToseBind beats both on glycan- and protein-cold (all p ≤ 0.034); on +doubly-cold ties gifflarESM (p 0.60) and **loses to sweetnetESM, −0.0436 [−0.0591, −0.0281], p 0.0021**. + +**Why.** GIFFLAR was the only learned comparator at one seed, so it had no CI. Job **`16597159`**, +array 0-11 = 3 arms × {gifflarESM, sweetnetESM} × seeds {43, 44}; seed 42 exists and is not rerun. +Tasks 0-2 on `nova/ratul/normal`; tasks 3-11 moved to `scavenger` (ratul's 4-GPU cap would have +serialised them into ~2 days). `--constraint=a100` (seed 42 trained on A100), `--time=36:00`. + +- configs `$G/configs/lgi/ours__s_.yaml` — ONE encoder each, own + `logs_dir = gifflar_lgi_/logs_s_` so the launcher cannot hijack another run +- processed data reused: the dataset name is `hash_dict(pre-transforms)` only (`gifflar/train.py:251`), + seed-independent +- ⛔ **Liveness = `weights/last.ckpt` mtime + `metrics.csv` rows, NEVER the job log** +- **Gates before a seed is scored:** 50 epochs in `metrics.csv`; zero `Dimension out of range` in its + `.err` (the only tell for a zero-protein fallback); pooled Spearman from the macro scorer must + reproduce that run's `metrics.csv`, as for seed 42 +- ⚠ `gifflar_score_macro.py` locates runs under the arm's `logs/` — it needs a `--logs_dir` argument + before it can score these + + +## Source lines 199–261 + +### B4 · #4 ✅ COMPLETE 27 Sep (job `16605803`) — Is the doubly-cold ranking identifiable? — owner/PI question 2026-09-25 + +**Question (owner + PI):** can we show, mathematically and statistically, that doubly-cold +differences between methods — including our rank — are mostly noise? + +**Two parts:** +- **Math — effective sample size.** 212 assays but only 40 glycan panels, 88 (42 %) on one. A + glycan-only predictor gives *every* assay on a panel the identical prediction vector. Under + perfect within-panel dependence the Kish effective count is `1/Σw²` ≤ 1/0.415² ≈ **5.8**; the true + value lies between that and 212 and is set by the within-panel correlation of per-assay ρ. +- **Stat — paired cluster bootstrap over ALL methods at once.** Same resample for every method, so + contrasts are paired. Output: pairwise CIs against BERToseBind, and each method's rank distribution. + +**⭐ PRE-DECLARED 2026-09-25, before any bootstrap result exists:** +- **Resampling unit = the rule already on record** (`[[bertose-component-bootstrap-unit-trap]]`): + two-way cluster — resample glycan components and protein components independently, intersect. + ⛔ Not a new unit chosen now; panels enter only through the math bound above. +- ⛔ **Applied to ALL THREE regimes with the same rule**, not only doubly-cold. It will widen every + interval, and **may push protein-cold above 0.05**. Fixing only the regime we lose is result-shopping. +- **B = 2,000**, percentile intervals, fixed RNG seed, equal-assay macro with the data-only eligibility. +- **Reported whatever it shows.** It tests whether the ranking is identifiable; it cannot be run to + prove our rank "does not matter". If the ridges' lead survives, that is reported. +- Prediction, recorded so it can be wrong: cross-method ranks in the neural cluster become + indistinguishable; the paired motif-vs-no-motif gain (same seeds, same rows) is more likely to + survive, because pairing cancels shared panel noise. + +**Execution plan (26 Sep) — three steps, every input gated on reproducing its recorded score:** + +| step | what | status | +|---|---|---| +| 1 | Structure + math bound + inventory | ✅ job `16602279` — results in `AFFINOSE_NEW_RUNS_20260925.md` #4 | +| 2 | Per-row predictions: LectinOracle ×4 configs from **saved checkpoints** (inference, reproduces reported draws — retraining would not: LO drifts 0.027 at fixed seed); GIFFLAR ×18 (scorer never saved per-row); 6 baselines regenerated | ⏳ | +| 3 | Paired two-way cluster bootstrap + Welch CIs regenerated on Nova | ✅ r1 `16604914` stopped at its gate (C13); r2 `16605803` complete, 64/64 gates — answer in `AFFINOSE_NEW_RUNS_20260925.md` #4 | + +Inputs staged 26 Sep: `v2_artifacts/review_affinose_v2_{glycan,protein}_components_20260926.tsv.gz` (from the +local v2 ledger; sha in `review_affinose_v2_components_20260926.README.json`; no official artifact modified). + +⚠ **Size-rule definition:** `p35` fits an isotonic map and EXCLUDES constant-prediction assays; the authority +defines it as raw residue count; the #4 rule scores constant predictions ρ = 0. Step 1 reports both +treatments and which one reproduces 0.2449 / −0.0147 / 0.2242 — the table value is not silently replaced. + +**⭐ STEP-3 DETAILS PINNED 2026-09-26 — while step 2 was still running, before any bootstrap result:** +1. **Primary interval = test-set uncertainty.** Two-way cluster resampling (glycan components × + protein components, independently, rows weighted by the product of their draw counts). A seeded + method's score in each replicate = the mean of its three per-seed macros on that replicate. + **Secondary interval = test + seed**: additionally redraw the three seeds with replacement per + seeded method in each replicate. Both reported; the primary is the one that answers "does this + survive test-set sampling". +2. **Methods per regime** = the main table's: 13 on protein-cold; protein-family excluded on + glycan- and doubly-cold, where it is constant within every assay by construction ("undefined"). +3. **Point estimates use the #4 rule** (data-only eligibility on the full stratum; an unscorable or + constant assay scores ρ = 0) for every method alike. Each producer's own rule is recomputed + alongside and must reproduce its recorded value (the gate); if any gate fails, no bootstrap is run. +4. **Outputs:** Δ vs BERToseBind (95 % percentile CI, P(Δ > 0)); each method's rank distribution + (median, 95 % interval, P(rank 1)); pooled Spearman for BERToseBind and the primary LectinOracle + only (E4); every main-table Welch seed-CI regenerated on Nova (C10). +5. **B = 2,000, RNG seed 20260926.** Protein-level draws treat each duplicated assay as a copy; + within an assay, duplicated rows are tied copies (Spearman on the expanded rows). + +**Blocked on: per-row predictions for every method.** BERToseBind ← B1's `.npz`; LectinOracle ← +`affinose_lectinoracle_matched_*_perrow.npz` (exist); GIFFLAR and the six baselines ← inventory needed. + +--- + diff --git a/releases/2026-10-02/bertosebind_new_runs/protocol/original_20260910.md b/releases/2026-10-02/bertosebind_new_runs/protocol/original_20260910.md new file mode 100644 index 0000000000000000000000000000000000000000..b5a6dfcb2db3df107493406023866d6913dc7491 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/protocol/original_20260910.md @@ -0,0 +1,205 @@ +# Pre-declaration — component-level intervals for the Affinose three-regime comparison + +**First issued 2026-09-10. AMENDED 2026-09-10, before any recomputation had reported.** +Owner go-ahead given 2026-09-10. Required by `AFFINOSE_THREE_REGIME_RESULTS_20260826.md` §10a: + +> *"Pre-declare one rule for all three strata in writing, publish the pre-declaration, then +> recompute. **Never the reverse.**"* + +⛔ **Nothing here may be revised once a recomputation reports.** If the outcome is unfavourable, +the outcome ships. + +--- + +## 0. ⛔ AMENDMENT RECORD — what the first issue got wrong, and why amending is legitimate + +The first issue of §2 declared *"the effective unit count is near **min(220 glycans, 151 +proteins)**."* **Four things were wrong with that sentence, and one of them was wrong as +statistics rather than as arithmetic.** + +**(a) Wrong columns.** `AFFINOSE_THREE_REGIME_DESIGN_20260825.md:49` has six columns — +`glycans | glycan comps | proteins | protein comps`. The doubly-cold row reads +`220 | 144 | 151 | 112`. **220 and 151 are distinct molecules; 144 and 112 are the components.** +The first issue read the molecule columns and called them units. + +**(b) Wrong vintage.** All four figures describe the **v1** partition (doubly-cold n = 6,993). +The 2026-09-10 finals were scored on **v2** (n = 3,691). Written as-is, the executing lane was +told to resample 220 glycans in a stratum containing 173. + +**(c) Wrong form — the serious one.** A two-way cluster-robust variance is +**V_g + V_p − V_gp**: the intersection is *subtracted*, never *minimised*. **The bootstrap +estimates the variance directly and takes no effective-unit count as an input**, so naming one is +a category error in a document meant to be followed literally. Worse, the sentence had two +readings that move the interval in opposite directions. Simulated on the real doubly-cold +incidence matrix (B = 300, additive response, no model score entering): the **two-way SD exceeds +both single-axis SDs by 1.86×–2.83×**. Read as a mechanic — *"cluster on the smaller axis"* — the +first issue was **anti-conservative**, in the stratum where understating uncertainty flatters us. + +**(d) Traceable origin of the "151".** `AFFINOSE_THREE_REGIME_RESULTS_20260826.md:479-481` wrote +doubly-cold as *"at most 151 glycan and 116 protein components"* — those are **glycan-cold's and +protein-cold's** cells — and **retracted it twenty lines later** at :500-501, naming 144 × 112. +The first issue inherited the retracted figure. + +⭐ **Amending is the rule working, not breaking.** §10a governs **order**. No recomputation has +reported and no score artifact for the v2 arms exists locally. Retraction would be required only +if a result already existed. **This amendment is dated, precedes any result, and gives an +artifact reason for every change — never a direction.** + +--- + +## 1. ⛔ What the published intervals actually are — the premise of the first issue was also wrong + +The first issue said doubly-cold's interval *"resamples pairs, not components."* **It resamples +nothing.** `AFFINOSE_COMPLETE_20260910.md:168` states the estimator, and all three published +intervals and p-values reproduce exactly from the seed means and SDs alone under a two-sample +Welch t with n = 3 per arm: + +| regime | reproduced CI | published CI | reproduced p | published p | +|---|---|---|---:|---:| +| glycan-cold | [+0.0246, +0.0634] | [+0.0246, +0.0634] | 0.0044 | 0.0044 | +| protein-cold | [+0.0093, +0.0397] | [+0.0093, +0.0398] | 0.0155 | 0.0156 | +| doubly-cold | [−0.0472, +0.0264] | [−0.0471, +0.0263] | 0.3887 | 0.386 | + +⛔ **So the real defect is not a wrong resampling unit — it is that the published intervals +capture seed variance only, and no test-set variance at all.** The statistics lane has already +measured the consequence: **test-set sampling dominates downstream-seed sampling by ≈7×, and +averaging over seeds does not shrink test-set error, because the three fits score the same rows** +(`ABLATION_CONTRASTIVE_AFFINOSE_STATISTICS_20260905.md:315`). + +⇒ **This declaration therefore ADDS a component-level interval alongside the seed interval. It +does not replace it.** Both are reported, always together, never conflated — R6's standing rule. + +--- + +## 2. The rule, declared + +**One rule means one PROCEDURE, applied to each stratum's own held-out axis.** `§10e` item 3 asks +for *"one bootstrap rule for all 3 strata"* — a rule is a procedure, not a count. R6 states it +per-stratum and this declaration follows R6. + +⚠ **The first issue's sentence "No stratum gets its own unit" is struck.** It was backwards: +naming per-stratum units is **required** by the one-rule commitment, not a violation of it. In +glycan-cold **all 364 test protein components are training proteins** +(`review_per_regime_membership_audit_20260905.json`, `frozen_protein_roles.test = ["p_fit"]`); in +protein-cold **826 of 827 test glycans appear in training**. Resampling a fully warm axis as +though it were a source of generalisation uncertainty would be a *different estimand*, not the +same rule. + +### The procedure + +Nonparametric cluster bootstrap over each stratum's **held-out** axis or axes. For doubly-cold, +the two-way form: **glycan components and protein components are resampled independently, with +replacement, and cells are taken at the intersection with multiplicity.** + +**Pairing rule — mandatory, and omitted from the first issue.** In every replicate, the identical +component weights are applied to **both arms**; every seed-level metric is recomputed under those +weights; the **paired seed differences are then averaged**. ⛔ **Arms are never bootstrapped +separately and their intervals never differenced.** + +### The units, measured on the v2 as-run strata + +| stratum | held-out axis | components | +|---|---|---:| +| glycan-cold | glycan | **339** | +| protein-cold | protein | **216** | +| doubly-cold | glycan **×** protein | **173 × 199** | + +Measured by joining the frozen per-regime roles files to the component ledger; reproduces +`review_per_regime_membership_audit_20260905.json` and `p23_three_regime_view.json` exactly, with +zero unmapped rows. + +⚠ **The binding axis flipped between vintages.** On v1 the protein axis bound (112 < 144); on v2 +the **glycan** axis binds (173 < 199). Any declaration naming a single governing axis would have +been wrong on one of the two. + +⛔ **No effective sample size is declared, and none should be.** The bootstrap estimates the +variance; a unit count is not an input to it. + +### ⚠ Why even 173 must not be read as an effective sample size — disclosed here deliberately + +Measured from `affinose_v2/ledger/per_assay_attribution_C_doubly.csv` (212 assays, n summing to +3,691): the stratum contains only **40 distinct glycan panels**, and the largest single panel +covers **88 assays / 2,288 rows — 62% of the stratum — carrying 26 distinct glycans**. The +row-weighted effective glycan count is **≈33 of 173**. + +⭐ **This disclosure is adverse to us and belongs here for exactly that reason:** it means the +doubly-cold stratum is far less informative than its row count suggests, in both directions. + +### Struck from the first issue + +⛔ **All design-effect figures are struck** — 4.67×, 4.56× and ≥2.9×. A bound computed under an +assumption is not the estimator, and quoting one invites the normal-theory rescaling of +percentile half-widths that Codex **already withdrew** (f86942d2 §2.6). ⚠ Note also that 4.67× +was labelled *"a recomputation on the corrected 144 × 112 axes"* while using only 144, and was +the **smallest** — most favourable — of three defensible figures. + +### Frozen inputs + +The per-seed point estimates and the eligible row set are **frozen at their 2026-09-10 values and +are inputs to this recomputation, not outputs.** Eligibility is evaluated **once** on the full +stratum and held fixed across replicates. ⚠ This is stronger than the first issue's *"analysis +only, no refits"*, which would not have caught the mechanism that has already moved a headline +here once: the glycan-cold margin went **+0.0353 → +0.0440** through an eligibility change with no +refit. + +**Undefined-Spearman rule:** an assay whose resampled rows admit no defined Spearman is dropped +from that replicate's macro; the mean and maximum number of dropped assays across replicates is +reported. + +--- + +## 3. Multiplicity — D1 governs + +⛔ **The first issue said *"Multiplicity is unchanged: Holm over the three regimes."* That was +false.** Owner decision **D1** (2026-09-08) is **no multiplicity correction; report raw p**, with +the disclosure that three comparisons were made. The first issue reversed D1 and the change was +justified in the guide **by its direction** — *"favourably: both wins survive"* — which is the +same move §4 exists to forbid. + +**Raw p is reported here.** If D1 is superseded by a fresh owner decision argued on family +structure, this section is amended **before** the recomputation, never after. + +--- + +## 4. ⛔ What we expect this to cost us — stated in advance + +A correct component-level interval will be **wider** than the seed-only interval, because it adds +a variance component the seed interval omits entirely. + +| stratum | current raw p (seed-only) | expected effect of adding component variance | +|---|---:|---| +| glycan-cold | 0.0044 | some margin; **expected to survive** | +| protein-cold | **0.0156** | ⚠⚠ **may cross 0.05 and be lost** | +| doubly-cold | 0.386 | **helps us** — the adverse verdict weakens | + +> **We adopted one procedure across all three strata knowing it may cost us protein-cold.** + +Fixing only doubly-cold would buy us the one stratum we lose. Applying the same procedure +everywhere risks a claim we currently win. **That asymmetry is what makes the correction +principled rather than result-shopping.** If protein-cold does not survive, it is reported as not +surviving, and the glycan-cold lead stands on its own. + +--- + +## 5. Scope + +**In scope:** component-level intervals for the three Affinose regime comparisons. + +**Out of scope, unchanged:** all point estimates; the equal-assay macro estimand; the comparator +ladder; the Table 1 / ablation / contrastive multiplicity families; and the matched-LectinOracle +family, which supports a different claim. + +--- + +## 6. Execution and reporting + +**Owner:** statistics lane, on the corrected go-ahead in +`MESSAGE_TO_STATISTICS_LANE_GOAHEAD_20260910.md`. + +**Reporting rule:** the component-level interval is reported **alongside** the seed interval +wherever the three-regime comparison appears — guide §BU2, §BV1a, and reviewer-response items 15 +and 38. Both letter tables must move **together**; a mixed table is a defect. + +**If the recomputation does not complete before resubmission:** report the seed intervals with +this pre-declaration cited, the ≈7× test-set-dominance finding stated, and the pending correction +disclosed. That is materially different from shipping a seed-only interval silently. diff --git a/releases/2026-10-02/bertosebind_new_runs/provenance/bootstrap_anatomy_audit.json b/releases/2026-10-02/bertosebind_new_runs/provenance/bootstrap_anatomy_audit.json new file mode 100644 index 0000000000000000000000000000000000000000..17e57d020d546261e8994c2bd77e574b59adda6c --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/provenance/bootstrap_anatomy_audit.json @@ -0,0 +1,882 @@ +{ + "schema": "bootstrap_anatomy_local_audit_v1", + "created_utc": "2026-09-27T20:45:19.742985+00:00", + "status": "LOCAL_NUMBERS_EXACT_SOURCE_AND_SAVED_RUNTIME_RECEIPTS_VERIFIED_RAW_INPUT_REPLAY_AND_PREDECLARATION_CHRONOLOGY_PENDING", + "scope": "Read-only local saved results, 10-Sep declaration, 25–26-Sep tracker, master requested sections, anatomy code/CSV. No model execution, bootstrap rerun, remote work, or live document edits. Exact retrieved bootstrap/structure code, r1/r2 logs/receipts inspected after bounded compute fetch;400 small algorithm checks and one saved-CSV ICC calculation, no scientific bootstrap rerun.", + "source_manifest": { + "master": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/BERTOSEBIND_MASTER_FOR_CODEX_20260927.md", + "sha256": "9f19d55796cf06266719860f16f9e5be6f4adab56488338dead7939329f029a0", + "bytes": 91664 + }, + "declaration_10sep": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/AFFINOSE_BOOTSTRAP_PREDECLARATION_20260910.md", + "sha256": "04dea299feb3ac0840ff5db7471381ad3f1cf531653bf6aeb9825005236d2f0b", + "bytes": 10993 + }, + "tracker_25_26sep": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/AFFINOSE_UPDATE_TRACKER.md", + "sha256": "cac6e840402f83fae2dc7115ce9247423c82122b3ebf0dd6488f30f5946aa495", + "bytes": 31731 + }, + "worklog": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/AFFINOSE_NEW_RUNS_20260925_worklog.md", + "sha256": "b686901775bf13383d3b299a41fcff9886275538f1a85d3c5377f9125fe098a3", + "bytes": 48912 + }, + "structure": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/affinose_b4_step1_structure_20260926.json", + "sha256": "7f9edc64528d5b43d2c464f8f5d4db91c2a133f54364993c7798a2a606bd3427", + "bytes": 16214, + "expected_handoff_sha256": "7f9edc64528d5b43d2c464f8f5d4db91c2a133f54364993c7798a2a606bd3427", + "hash_matches_handoff": true + }, + "bootstrap": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/affinose_b4_step3_bootstrap_r2_20260927.json", + "sha256": "6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235", + "bytes": 48191, + "expected_handoff_sha256": "6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235", + "hash_matches_handoff": true + }, + "probe": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/affinose_attribution_motif_20260925.json", + "sha256": "4fd80f7396aa9803602fd62bd82ec3e98e1f937b46e1057cb26ffa56ea6c93f0", + "bytes": 10946, + "expected_handoff_sha256": "4fd80f7396aa9803602fd62bd82ec3e98e1f937b46e1057cb26ffa56ea6c93f0", + "hash_matches_handoff": true + }, + "anatomy": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/bertosebind_doubly_cold_anatomy_20260927/outputs/doubly_cold_anatomy.json", + "sha256": "0dff08537f0cd5a1ad40562537c48546d3d4f3858a75b2ab2d3729b22a5dfe91", + "bytes": 9441 + }, + "assays": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/bertosebind_doubly_cold_anatomy_20260927/outputs/doubly_cold_per_assay.csv", + "sha256": "4186c66c13fd05d62d83a10df2a5761b2e29ded502660c12cb450836f9881496", + "bytes": 18263 + }, + "anatomy_code": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/bertosebind_doubly_cold_anatomy_20260927/analysis/dc_anatomy.py", + "sha256": "9c9b90f077709c105dd16b706ebcd434dd793177c274eca17b10bc3241f0138b", + "bytes": 17876 + } + }, + "audit_script": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/audit_bootstrap_anatomy.py", + "sha256": "a17ff8e2ea41d49644a458839fae6b0b48252fed423f388622160848165d0475" + }, + "bootstrap_saved_run": { + "schema": "affinose_b4_step3_v1", + "nboot": 2000, + "rng_seed": 20260926, + "status": "COMPLETE" + }, + "checks": { + "source_hashes_match_handoff": true, + "all_37_points_equal_mean_saved_seed_scores": { + "n": 37, + "max_abs_error": 0.0 + }, + "all_34_saved_deltas_equal_BTB_minus_comparator": { + "n": 34, + "max_abs_error": 0.0 + }, + "pooled_3_deltas_match_subtraction": { + "n": 3, + "max_abs_error": 0.0 + }, + "saved_source_gates": { + "n": 64, + "pass_flags": 64, + "reported_passed": 64, + "reported_total": 64, + "largest_abs_difference": 0.0003009999999999957, + "largest_difference_gate": { + "source": "GIFFLAR gifflarESM B_protein s42", + "recomputed": 0.210711, + "recorded": 0.21041, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + "qualification": "Flags and arithmetic audited; raw per-row inputs were not locally replayed." + }, + "structure_design_effect_Kish_and_neff_algebra": "PASS for all3 regimes. Exact ICC(1) implementation inspected; doubly-cold ICC recomputed from212-row CSV to floating-point precision.", + "doubly_cold_CSV_counts_means_and_contributions": "PASS", + "primary_vs_secondary_CI_zero_exclusion_changes": [], + "secondary_CI_not_always_wider": [ + [ + "glycan_cold", + "nearest-neighbour glycan", + 0.2037090491296354, + 0.20216599148066078 + ] + ] + }, + "trustworthy_saved_numbers": { + "glycan_cold": { + "source_pointer": "bootstrap#/regimes/glycan_cold", + "methods_total": 12, + "learned_comparators": 6, + "simple_baselines": 5, + "positive_pointwise_ci_learned": [], + "negative_pointwise_ci_learned": [], + "positive_pointwise_ci_simple": [ + "nearest-neighbour glycan", + "motif ridge (p44)" + ], + "negative_pointwise_ci_simple": [], + "BERToseBind_point_rank": 1, + "BERToseBind_rank_summary": { + "score_ci95": [ + 0.2554688030781091, + 0.3889963902571539 + ], + "rank_median": 1.0, + "rank_ci95": [ + 1.0, + 8.0 + ], + "p_rank1": 0.608 + }, + "primary_vs_LectinOracle": { + "score_ci95": [ + 0.22623506775544625, + 0.35847811597714097 + ], + "rank_median": 5.0, + "rank_ci95": [ + 3.0, + 9.0 + ], + "p_rank1": 0.0015, + "delta_btb_minus": 0.04398791702715632, + "delta_ci95": [ + -0.03178395437687447, + 0.08903637793981824 + ], + "p_btb_better": 0.834 + }, + "pooled_secondary_metric": { + "point": { + "BERToseBind": 0.352423627827634, + "LectinOracle ESM-C (primary)": 0.3408005508825944 + }, + "ci95": { + "BERToseBind": [ + 0.2809791531735357, + 0.4198719821256602 + ], + "LectinOracle ESM-C (primary)": [ + 0.26727027961583627, + 0.4054770689026824 + ] + }, + "delta_btb_minus_lo": 0.011623076945039557, + "delta_ci95": [ + -0.0429587028976285, + 0.06873342208019707 + ], + "p_btb_better": 0.682 + }, + "uniform_rule_points": { + "BERToseBind": 0.3293033324285421, + "LectinOracle ESM-C (primary)": 0.2853154154013858, + "LectinOracle _flex": 0.28368419310221066, + "LectinOracle ESM-1b": 0.297762139305791, + "LectinOracle matched tuning": 0.29492614530569383, + "GIFFLAR gifflarESM": 0.25505273565629216, + "GIFFLAR sweetnetESM": 0.2658198702099431, + "composition ridge": 0.2674864561319807, + "char 3-5-gram ridge": 0.21347663480166548, + "nearest-neighbour glycan": 0.15856447405803165, + "motif ridge (p44)": 0.2230309186548315, + "glycan-size rule (BPE tokens)": 0.2449266100013241 + }, + "bootstrap_units": { + "glycan_components": 339, + "protein_components": 364, + "assays": 1767 + }, + "structure": { + "rows": 37295, + "assays_eligible": 1767, + "glycans": 336, + "proteins": 1088, + "glycan_components": 336, + "protein_components": 364, + "assays_with_more_than_one_protein": 0, + "unmapped_rows": { + "glycan": 0, + "protein": 0 + }, + "panels": { + "distinct": 149, + "largest_panel_assays": 429, + "largest_panel_share": 0.2427843803056027, + "largest_panel_glycans": 26, + "assays_per_panel_top10": [ + 429, + 355, + 98, + 70, + 68, + 56, + 52, + 48, + 43, + 42 + ], + "kish_n_eff_max_perfect_dependence": 8.910362403006754 + }, + "btb": { + "macro_from_per_row": 0.3293033324285421, + "reported": 0.3293, + "neff_icc_within_panel": 0.24420923455817234, + "neff_cluster_size_weighted_mean": 198.30843237125072, + "neff_design_effect": 49.18454124125605, + "neff_n_eff": 35.925922157790474 + } + } + }, + "protein_cold": { + "source_pointer": "bootstrap#/regimes/protein_cold", + "methods_total": 13, + "learned_comparators": 6, + "simple_baselines": 6, + "positive_pointwise_ci_learned": [ + "LectinOracle _flex", + "GIFFLAR gifflarESM", + "GIFFLAR sweetnetESM" + ], + "negative_pointwise_ci_learned": [], + "positive_pointwise_ci_simple": [ + "composition ridge", + "char 3-5-gram ridge", + "nearest-neighbour glycan", + "protein-family nearest", + "motif ridge (p44)", + "glycan-size rule (BPE tokens)" + ], + "negative_pointwise_ci_simple": [], + "BERToseBind_point_rank": 1, + "BERToseBind_rank_summary": { + "score_ci95": [ + 0.19990186950566438, + 0.2809251377652073 + ], + "rank_median": 1.0, + "rank_ci95": [ + 1.0, + 3.0 + ], + "p_rank1": 0.892 + }, + "primary_vs_LectinOracle": { + "score_ci95": [ + 0.1769518194175074, + 0.25537706527593684 + ], + "rank_median": 4.0, + "rank_ci95": [ + 2.0, + 6.0 + ], + "p_rank1": 0.0105, + "delta_btb_minus": 0.024508435880027296, + "delta_ci95": [ + -0.0033261547942619123, + 0.048983628199518764 + ], + "p_btb_better": 0.96 + }, + "pooled_secondary_metric": { + "point": { + "BERToseBind": 0.26451514279675, + "LectinOracle ESM-C (primary)": 0.24260613049142152 + }, + "ci95": { + "BERToseBind": [ + 0.22685659704476233, + 0.30227237193882434 + ], + "LectinOracle ESM-C (primary)": [ + 0.20464146531693983, + 0.28174655591460923 + ] + }, + "delta_btb_minus_lo": 0.021909012305328462, + "delta_ci95": [ + 0.00983804391148444, + 0.03530998396725674 + ], + "p_btb_better": 0.9995 + }, + "uniform_rule_points": { + "BERToseBind": 0.24087415343191254, + "LectinOracle ESM-C (primary)": 0.21636571755188524, + "LectinOracle _flex": 0.1842971937782524, + "LectinOracle ESM-1b": 0.22383859993844366, + "LectinOracle matched tuning": 0.21672762402347998, + "GIFFLAR gifflarESM": 0.20753304313957813, + "GIFFLAR sweetnetESM": 0.17646909258858567, + "composition ridge": 0.12655514259910874, + "char 3-5-gram ridge": 0.16099207925480097, + "nearest-neighbour glycan": 0.1885912285296723, + "protein-family nearest": 0.1510829012726471, + "motif ridge (p44)": 0.07411945343032166, + "glycan-size rule (BPE tokens)": -0.014709395191754895 + }, + "bootstrap_units": { + "glycan_components": 826, + "protein_components": 216, + "assays": 246 + }, + "structure": { + "rows": 38539, + "assays_eligible": 246, + "glycans": 826, + "proteins": 235, + "glycan_components": 825, + "protein_components": 216, + "assays_with_more_than_one_protein": 0, + "unmapped_rows": { + "glycan": 0, + "protein": 0 + }, + "panels": { + "distinct": 77, + "largest_panel_assays": 52, + "largest_panel_share": 0.21138211382113822, + "largest_panel_glycans": 231, + "assays_per_panel_top10": [ + 52, + 29, + 19, + 9, + 7, + 7, + 6, + 6, + 5, + 5 + ], + "kish_n_eff_max_perfect_dependence": 13.691402714932126 + }, + "btb": { + "macro_from_per_row": 0.24087415343191254, + "reported": 0.2409, + "neff_icc_within_panel": 0.5236325692340034, + "neff_cluster_size_weighted_mean": 17.96747967479675, + "neff_design_effect": 9.884724975539553, + "neff_n_eff": 24.8868836117084 + } + } + }, + "doubly_cold": { + "source_pointer": "bootstrap#/regimes/doubly_cold", + "methods_total": 12, + "learned_comparators": 6, + "simple_baselines": 5, + "positive_pointwise_ci_learned": [], + "negative_pointwise_ci_learned": [], + "positive_pointwise_ci_simple": [], + "negative_pointwise_ci_simple": [], + "BERToseBind_point_rank": 9, + "BERToseBind_rank_summary": { + "score_ci95": [ + 0.08800632066585967, + 0.29818324441093086 + ], + "rank_median": 8.0, + "rank_ci95": [ + 1.0, + 12.0 + ], + "p_rank1": 0.03 + }, + "primary_vs_LectinOracle": { + "score_ci95": [ + 0.08266460776080133, + 0.30550585726431234 + ], + "rank_median": 8.0, + "rank_ci95": [ + 1.0, + 11.0 + ], + "p_rank1": 0.034, + "delta_btb_minus": -0.01039245995439042, + "delta_ci95": [ + -0.11538313078589431, + 0.10570818896632488 + ], + "p_btb_better": 0.4535 + }, + "pooled_secondary_metric": { + "point": { + "BERToseBind": 0.20301446590351957, + "LectinOracle ESM-C (primary)": 0.20907991263250447 + }, + "ci95": { + "BERToseBind": [ + 0.08246077904615426, + 0.31816115831059805 + ], + "LectinOracle ESM-C (primary)": [ + 0.0882215136498559, + 0.31970213263648534 + ] + }, + "delta_btb_minus_lo": -0.006065446728984902, + "delta_ci95": [ + -0.10288120882127332, + 0.09931149204034828 + ], + "p_btb_better": 0.45 + }, + "uniform_rule_points": { + "BERToseBind": 0.17853311044049022, + "LectinOracle ESM-C (primary)": 0.18892557039488064, + "LectinOracle _flex": 0.16591843938018871, + "LectinOracle ESM-1b": 0.20632734858634674, + "LectinOracle matched tuning": 0.19436559345044505, + "GIFFLAR gifflarESM": 0.16453849607071838, + "GIFFLAR sweetnetESM": 0.22214733229047123, + "composition ridge": 0.24210410559558815, + "char 3-5-gram ridge": 0.24958196240289526, + "nearest-neighbour glycan": 0.09632788784547305, + "motif ridge (p44)": 0.22896473471498477, + "glycan-size rule (BPE tokens)": 0.2242042239447186 + }, + "bootstrap_units": { + "glycan_components": 173, + "protein_components": 199, + "assays": 212 + }, + "structure": { + "rows": 3691, + "assays_eligible": 212, + "glycans": 173, + "proteins": 212, + "glycan_components": 173, + "protein_components": 199, + "assays_with_more_than_one_protein": 0, + "unmapped_rows": { + "glycan": 0, + "protein": 0 + }, + "panels": { + "distinct": 40, + "largest_panel_assays": 88, + "largest_panel_share": 0.41509433962264153, + "largest_panel_glycans": 26, + "assays_per_panel_top10": [ + 88, + 26, + 12, + 10, + 9, + 8, + 7, + 7, + 5, + 4 + ], + "kish_n_eff_max_perfect_dependence": 4.995998221431748 + }, + "btb": { + "macro_from_per_row": 0.17853311044049022, + "reported": 0.1785, + "neff_icc_within_panel": 0.16283693088250406, + "neff_cluster_size_weighted_mean": 42.43396226415094, + "neff_design_effect": 7.746979249395828, + "neff_n_eff": 27.36550507948417 + } + } + } + }, + "anatomy_recomputation": { + "n_assays": 212, + "rows": 3691, + "n_panels": 40, + "largest_panel_assays": 88, + "largest_panel_share": 0.41509433962264153, + "kish_perfect_dependence": 4.995998221431748, + "macro_from_assay_csv": { + "bertosebind": 0.17853311044049022, + "lectinoracle": 0.18892557039488062, + "size_rule": 0.21783172796334524 + }, + "size_definition": "WURCS residue count; this is not the published BPE-token baseline", + "comparisons": { + "lectinoracle": { + "mean_delta": -0.010392459954390402, + "two_most_negative_panels": [ + { + "panel": "54d602012bed", + "assays": 26, + "macro_contribution": -0.015408805031446541 + }, + { + "panel": "ffe19aef8e05", + "assays": 9, + "macro_contribution": -0.011215932914046121 + } + ], + "two_panel_assays": 35, + "two_panel_assay_share": 0.1650943396226415, + "two_panel_contribution": -0.02662473794549266, + "rest_contribution_to_full_macro": 0.01623227799110226, + "rest_subset_mean_delta": 0.019442050475218523 + }, + "size_rule": { + "mean_delta": -0.03929861752285501, + "two_most_negative_panels": [ + { + "panel": "e48f24eb7cd0", + "assays": 88, + "macro_contribution": -0.024220365819043122 + }, + { + "panel": "54d602012bed", + "assays": 26, + "macro_contribution": -0.02373608995875905 + } + ], + "two_panel_assays": 114, + "two_panel_assay_share": 0.5377358490566038, + "two_panel_contribution": -0.047956455777802165, + "rest_contribution_to_full_macro": 0.008657838254947155, + "rest_subset_mean_delta": 0.018729201122946904 + } + }, + "outcome_defined_size_split": { + "median_rho": 0.2736227287626576, + "low": { + "n": 106, + "bertosebind": 0.14492323756069012, + "lectinoracle": 0.13481860477799057, + "size_rule": -0.03827559699462229 + }, + "high": { + "n": 106, + "bertosebind": 0.21214298332029033, + "lectinoracle": 0.2430325360117707, + "size_rule": 0.4739390529213128 + } + }, + "BTB_beats_residue_size_assays": 99 + }, + "protein_probe_saved_summary": { + "test_glycan_cold": { + "n_seeds": 3, + "intact_mean": 0.3293033324285421, + "wrong_protein_drop_mean": 0.17215236989096358, + "wrong_protein_drop_sd": 0.020722832396126666, + "mean_protein_drop_mean": 0.07598559159725833, + "wrong_ge_mean_per_seed": 3, + "agree_with_intact_mean": 0.46751838899498416 + }, + "test_protein_cold": { + "n_seeds": 3, + "intact_mean": 0.24087415343191254, + "wrong_protein_drop_mean": 0.06905840971319487, + "wrong_protein_drop_sd": 0.01500188329785255, + "mean_protein_drop_mean": 0.03525562762188845, + "wrong_ge_mean_per_seed": 3, + "agree_with_intact_mean": 0.6425617766316197 + }, + "test_doubly_cold": { + "n_seeds": 3, + "intact_mean": 0.17853311044049022, + "wrong_protein_drop_mean": 0.0061175970444965755, + "wrong_protein_drop_sd": 0.01564024407052394, + "mean_protein_drop_mean": -0.007939461503380032, + "wrong_ge_mean_per_seed": 2, + "agree_with_intact_mean": 0.7519211280702608 + } + }, + "findings": [ + { + "id": "B01", + "priority": "required", + "location": "Master §5.1/§5.2", + "claim": "Simple-baseline positive intervals: 2/6, 7/7, 0/6.", + "assessment": "Incorrect denominators and protein-cold numerator. Models include BERToseBind, six learned comparators and five/six/five simple baselines.", + "suggested_text": "The primary pointwise 95% intervals excluded zero in BERToseBind’s favour for 2/5, 6/6 and 0/5 simple baselines on glycan-, protein- and doubly-cold data, respectively.", + "evidence": [ + "bootstrap#/regimes/*/point_#4_rule", + "bootstrap#/regimes/*/primary_test_only" + ] + }, + { + "id": "B02", + "priority": "required", + "location": "Master §0.5, §5.5; Tracker B4", + "claim": "Unchanged rule already on record / September 10 pre-declaration.", + "assessment": "The 10-Sep rule resamples only each held-out axis, freezes prior points, and drops undefined assays. The 25–26-Sep record applies two-way resampling to all regimes, expands the comparator analysis and adopts a uniform zero-scoring rule that changes some points. This is an amendment, not an unchanged execution. Mutable current Markdown cannot independently prove chronology. Retrieved source additionally confirms eligibility is re-evaluated per replicate, rather than fixed once as in the10-Sep plan. Target-degenerate full-stratum assays are dropped; method-specific unscorable assays receive zero within the retained data-only denominator.", + "suggested_text": "The 25–26 September protocol specified two-way component resampling in all three regimes and a uniform scoring rule, amending the 10 September plan. Component intervals are reported alongside seed intervals.", + "evidence": [ + "declaration_10sep:76-105", + "declaration_10sep:136-147", + "declaration_10sep:183-191", + "tracker_25_26sep:212-256", + "remote_evidence/b4_step3_bootstrap_r2.py:193-209", + "remote_evidence/b4_step3_bootstrap_r2.py:269-293" + ] + }, + { + "id": "B03", + "priority": "required", + "location": "Master §0.5, §5.2, D1/D2, C0/C3/C6", + "claim": "No doubly-cold difference is resolvable / every pairwise difference spans zero.", + "assessment": "Saved contrasts compare BERToseBind with each method, not every pair of methods. All 11 doubly-cold BTB contrasts include zero. Wide intervals do not prove equivalence, pure noise or universal non-identifiability.", + "suggested_text": "All eleven pointwise 95% intervals for BERToseBind minus a comparator included zero on doubly-cold data; its bootstrap rank interval was 1–12.", + "evidence": [ + "bootstrap#/regimes/doubly_cold/primary_test_only" + ] + }, + { + "id": "B04", + "priority": "required", + "location": "Master D1/D2 and C0/C1/C6", + "claim": "The protein pathway contributed nothing; the model is glycan-only; it wins only because of protein.", + "assessment": "A small average intervention effect is not zero information or equivalence to a trained glycan-only control. Each assay has one protein, but protein–glycan interactions can still change within-assay ranking. Correlations do not yield an additive mechanistic decomposition.", + "suggested_text": "Replacing assay proteins reduced mean macro Spearman by 0.1722, 0.0691 and 0.0061 across the three regimes. The small doubly-cold change indicates limited score sensitivity to this intervention, not an absent protein contribution.", + "evidence": [ + "probe#/summary", + "anatomy_code:224-236" + ] + }, + { + "id": "B05", + "priority": "required", + "location": "Master §0.5/§5.2", + "claim": "Protein-cold beats primary LectinOracle; CI just touching zero; significantly ahead of three learned comparators.", + "assessment": "The macro interval crosses zero. The positive pooled interval estimates a different, declared secondary metric. The saved percentile intervals are pointwise, unadjusted; resample fractions are not p-values or posterior probabilities.", + "suggested_text": "On protein-cold data, the macro difference from primary LectinOracle was 0.0245 (pointwise 95% interval −0.0033 to 0.0490). The secondary pooled difference was 0.0219 (0.0098 to 0.0353). Pointwise macro intervals excluded zero for three of six learned comparators.", + "evidence": [ + "bootstrap#/regimes/protein_cold/primary_test_only", + "bootstrap#/regimes/protein_cold/pooled_E4" + ] + }, + { + "id": "B06", + "priority": "required", + "location": "Master D3, §5.3, C0/C2/C6", + "claim": "About five independent panels / measured effective number of assays.", + "assessment": "Kish is a concentration calculation under perfect within-panel dependence; ICC-derived n_eff is a model-based estimate, not a directly measured count of independent tests. Panel concentration alone does not establish all dependence.", + "suggested_text": "The 212 doubly-cold assays used 40 glycan panels, with 88 assays (41.5%) on one panel. The Kish concentration count was 5.0 under perfect within-panel dependence; an ICC-based design-effect estimate gave 27.4 effective assays.", + "evidence": [ + "structure#/regimes/doubly_cold/panels", + "structure#/regimes/doubly_cold/btb", + "anatomy_code:123-125", + "anatomy_code:188-208" + ] + }, + { + "id": "B07", + "priority": "required", + "location": "Master C2; held D1 clause", + "claim": "Two panels covering about half of assays explain both deficits; size rule treated interchangeably.", + "assessment": "The residue-size pair covers 114/212=53.8%; the LectinOracle pair covers only 35/212=16.5%. This decomposition uses residue count (0.2178), not the published BPE-token rule (0.2242).", + "suggested_text": "For the residue-count diagnostic, two panels covering 114 of 212 assays contributed −0.0480 to the full-sample macro gap, compared with a total gap of −0.0393. The two most negative LectinOracle panels covered 35 assays. Do not transfer this result to the BPE-token baseline.", + "evidence": [ + "assays", + "anatomy_code:199-220", + "anatomy_code:274-287" + ] + }, + { + "id": "B08", + "priority": "required_if_used", + "location": "Master C1/C5/C7", + "claim": "Less protein training data explains the deficit; size shift excluded; motif block removed size overuse.", + "assessment": "These are cross-regime/cross-model observational comparisons. Similar shifts do not rule out interactions with unseen proteins. The ratio of two average correlations is not an overuse test. The outcome-defined size split is exploratory, including its conditional BTB–LO comparison.", + "suggested_text": "Both glycan- and doubly-cold tests showed larger glycans than training. In doubly-cold assays, mean prediction–size and target–size correlations were 0.2028 and 0.2178. These diagnostics do not establish the cause of the performance difference.", + "evidence": [ + "anatomy#/regimes", + "anatomy_code:231-236", + "anatomy_code:314-321" + ] + }, + { + "id": "B09", + "priority": "required_if_used", + "location": "Master §0.5 test-set question", + "claim": "If different glycans and proteins had been held out.", + "assessment": "Bootstrap reweights observed test components under fixed fitted models; it does not retrain under new partitions or sample unseen future molecules.", + "suggested_text": "The component bootstrap describes test-set sampling uncertainty conditional on the fitted models and observed component structure.", + "evidence": [ + "tracker_25_26sep:240-256" + ] + }, + { + "id": "B10", + "priority": "source_limit", + "location": "Master §5.4, §8 verification checklist", + "claim": "First run stopped before resampling; only tolerance changed; rule predates diagnostic.", + "assessment": "Resolved for exact r1/r2 diff, NOT-RUN receipt, repeat nondeterminism receipt and completed r2 log, all hash-verified. Chronology of written decisions remains unverified: current source/worklog assertions are not immutable pre-result evidence.", + "suggested_text": "The first run stopped at three failed GIFFLAR receipt gates; the second changed only that tolerance, gate labels and output path. Repeats demonstrated nondeterminism. Pre-result timing of the written decision remains documented by the handoff rather than independently established.", + "evidence": [ + "worklog:598-665", + "master:778-855" + ] + }, + { + "id": "B11", + "priority": "source_limit", + "location": "Anatomy script lines94-106,244-267", + "claim": "Source alignment fully gated.", + "assessment": "Code checks assay/glycan order across BTB seeds and assay sets for LO, but does not directly assert equality of every target/protein vector or cross-model assay-panel composition. No mismatch is established; raw identity verification remains pending. Retrieved step1 code does assert equality of BTB target/assay/protein/glycan arrays across seeds. Remaining limit is independent raw-input replay and cross-model alignment.", + "suggested_text": "The saved macro gates passed; full per-row identity checks were not independently replayed in this local audit.", + "evidence": [ + "anatomy_code:94-106", + "anatomy_code:244-267" + ] + }, + { + "id": "B12", + "priority": "label_only_if_used", + "location": "Anatomy JSON similarity_to_training", + "claim": "share_exact_composition_in_training.", + "assessment": "Code tests cosine > 1−1e−9 after normalization, which also accepts proportional count vectors. It does not test literal equality of residue-count compositions.", + "suggested_text": "Fraction with the same normalized residue composition (cosine > 1−10⁻⁹).", + "evidence": [ + "anatomy_code:128-151" + ] + } + ], + "reporting_recommendation": "Report seed and component intervals together, with correct uncertainty labels. Preserve all adverse point estimates. Use the 25–26-Sep amended protocol label; do not imply identical execution of the 10-Sep plan. Limit zero-inclusion claims to the 34 saved BERToseBind-vs-comparator contrasts. Primary macro and secondary pooled claims must remain separate.", + "pending_primary_verification": { + "bounded_local_search": "Exact filenames searched with rg --files under writing/review/../.. (v3.1_cluster_training); none of the remote_specs files found.", + "remote_access": "Resolved: bounded compute fetch job16608615 delivered exact scripts/logs/diagnostic receipts. No parallel access by this auditor.", + "exact_named_files": [ + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_step1_structure.py", + "expected_sha256_from_handoff": "c82d7fe71d178d78d52ee47d809cd12d0286c48b1375c0c7b8b80fa222858e61", + "purpose": "Verify panel/ICC estimator and mapping/count inputs.", + "local_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_step1_structure.py", + "verified_sha256": "c82d7fe71d178d78d52ee47d809cd12d0286c48b1375c0c7b8b80fa222858e61", + "status": "RETRIEVED_HASH_VERIFIED" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_step3_bootstrap_r2.py", + "expected_sha256_from_handoff": "6dbbbeb14bb860f6344a93bb65754f540dee8da4ceb3fdc526133c7133dd426c", + "purpose": "Verify two-way weights, assay multiplicity, weighted-tie Spearman, eligibility/undefined rules, seed draws, pooled metric and gate enforcement.", + "local_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_step3_bootstrap_r2.py", + "verified_sha256": "6dbbbeb14bb860f6344a93bb65754f540dee8da4ceb3fdc526133c7133dd426c", + "status": "RETRIEVED_HASH_VERIFIED" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_step3_bootstrap.py", + "expected_sha256_from_handoff": null, + "purpose": "Diff exact r1 versus r2; preserve r1.", + "local_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_step3_bootstrap.py", + "verified_sha256": "ab7560abe237da435464a984a4e23925e7ec48d802949f57ef9600b829e6b37d", + "status": "RETRIEVED_HASH_VERIFIED" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_gif_repeat_compare.py", + "expected_sha256_from_handoff": "7fe6a80de1e7662a916e84b0a679c5579ab7fdcaaace70e1855f7d8face51ca3", + "purpose": "Verify repeat diagnostic and tolerance basis.", + "local_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_gif_repeat_compare.py", + "verified_sha256": "7fe6a80de1e7662a916e84b0a679c5579ab7fdcaaace70e1855f7d8face51ca3", + "status": "RETRIEVED_HASH_VERIFIED" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_step3_bootstrap_20260926.json", + "expected_sha256_from_handoff": null, + "purpose": "Verify failed gate status and absence of bootstrap output.", + "local_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/diagnostics/affinose_b4_step3_bootstrap_20260926.json", + "verified_sha256": "17ab513ec2d9dec6f1e8c9445dfd7500190f99f0e8758b21fbb435b026324f3b", + "status": "RETRIEVED_HASH_VERIFIED" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_gif_repeat_20260927.json", + "expected_sha256_from_handoff": null, + "purpose": "Verify within-job nondeterminism and original-versus-repeat mismatch.", + "local_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/diagnostics/affinose_b4_gif_repeat_20260927.json", + "verified_sha256": "50049bf5658f27700205e91d07f40512b8d297a7af11f51fcfbd514df9b59478", + "status": "RETRIEVED_HASH_VERIFIED" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_baselines_perrow.py", + "expected_sha256_from_handoff": "61a5ef32482365e37e58bd4aee49ff5dabc2fafa04f4e063f3a0be7c294c84c7", + "purpose": "Verify regenerated BPE-size/motif definitions.", + "local_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_baselines_perrow.py", + "verified_sha256": "61a5ef32482365e37e58bd4aee49ff5dabc2fafa04f4e063f3a0be7c294c84c7", + "status": "RETRIEVED_HASH_VERIFIED" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_lo_perrow_ckpt.py", + "expected_sha256_from_handoff": "1d0433763d7ad49088e396b435a42f2a12141436db05592778a79938c88a953b", + "purpose": "Verify checkpoint inference/scoring matches source producers.", + "local_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_lo_perrow_ckpt.py", + "verified_sha256": "1d0433763d7ad49088e396b435a42f2a12141436db05592778a79938c88a953b", + "status": "RETRIEVED_HASH_VERIFIED" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/gifflar_score_perrow.py", + "expected_sha256_from_handoff": "f88bcf303685ea6a075747a12eafa7df041909b9b455d80ea98c2b536aed0de8", + "purpose": "Verify checkpoint/receipt selection and per-row gates.", + "local_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_score_perrow.py", + "verified_sha256": "f88bcf303685ea6a075747a12eafa7df041909b9b455d80ea98c2b536aed0de8", + "status": "RETRIEVED_HASH_VERIFIED" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/v2_artifacts/review_affinose_v2_glycan_components_20260926.tsv.gz", + "expected_sha256_from_handoff": "2e7873e1ca45161e8dd8bada6a89e2634039870cf697eb21b7db34d1ee50610c", + "purpose": "Check exact staged component input.", + "status": "NOT_IN_BOUNDED_FETCH" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/v2_artifacts/review_affinose_v2_protein_components_20260926.tsv.gz", + "expected_sha256_from_handoff": "5426612f662e5cde66b4cdb4b5244a742d3a124bc5e18c6cf14caad6185d76b8", + "purpose": "Check exact staged component input.", + "status": "NOT_IN_BOUNDED_FETCH" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/v2_artifacts/review_affinose_v2_components_20260926.README.json", + "expected_sha256_from_handoff": null, + "purpose": "Verify staged-source provenance.", + "status": "NOT_IN_BOUNDED_FETCH" + } + ], + "additional_requires_inventory_not_guessed_paths": [ + "Immutable/versioned pre-result protocol and tolerance-decision text to establish chronology. Named logs are now retrieved but contain no independent timestamp for when the decision text was written.", + "Exact input file inventory for a future bounded per-row identity/gate audit: /Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/bootstrap_exact_input_manifest.json. No bootstrap rerun required." + ], + "anatomy_row_inputs_from_code": [ + "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mo_20260908_mo_A_glycan_s42.npz", + "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_sa_20260908_moc_A_glycan_s43.npz", + "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_sa_20260908_moc_A_glycan_s44.npz", + "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_sa_20260908_mo_B_protein_s42.npz", + "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mof_20260909_mof_B_protein_s43.npz", + "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mof_20260909_mof_B_protein_s44.npz", + "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mo_20260908_mo_C_doubly_s42.npz", + "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mof_20260909_mof_C_doubly_s43.npz", + "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mof_20260909_mof_C_doubly_s44.npz", + "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_mtC_doublys42_test_doubly_cold_perrow.npz", + "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_mtC_doublys43_test_doubly_cold_perrow.npz", + "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_mtC_doublys44_test_doubly_cold_perrow.npz" + ] + }, + "code_audit": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/bootstrap_code_audit.json", + "sha256": "d2812e72a7befc1bdb08465189d2fed035ae725142c1cf978a578e0add72e94d", + "status": "EXACT_SOURCE_AND_SAVED_RUNTIME_RECEIPTS_VERIFIED_RAW_INPUT_REPLAY_PENDING", + "weighted_rank_toy_checks": { + "toy_assay_checks": 400, + "max_abs_error_vs_explicit_integer_expansion": 2.220446049250313e-16, + "scientific_resampling_performed": false + }, + "doubly_cold_ICC_replay": { + "value": 0.16283693088250392, + "saved_value": 0.16283693088250406, + "abs_error": 1.3877787807814457e-16 + }, + "actual_eligibility_rule": "Lines269-293 re-evaluate data-only eligibility in each replicate using BERToseBind seed42 full-stratum rows: >=5 expanded rows and >=2 surviving distinct target values, and positive assay/protein multiplicity. Protein draws weight assay copies; glycan draws weight rows for each within-assay Spearman.", + "actual_zero_rule": "Lines193-209 return zero for nonfinite/constant-target/constant-prediction rho or fewer than5 weighted method rows. These zeros enter the macro only where data-only replicate eligibility permits." + } +} diff --git a/releases/2026-10-02/bertosebind_new_runs/provenance/bootstrap_code_audit.json b/releases/2026-10-02/bertosebind_new_runs/provenance/bootstrap_code_audit.json new file mode 100644 index 0000000000000000000000000000000000000000..4d75c63dc40b40c9c17456b6473f8cff37f014af --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/provenance/bootstrap_code_audit.json @@ -0,0 +1,197 @@ +{ + "schema": "bootstrap_code_audit_v1", + "created_utc": "2026-09-27T20:49:42.362288+00:00", + "status": "EXACT_SOURCE_AND_SAVED_RUNTIME_RECEIPTS_VERIFIED_RAW_INPUT_REPLAY_PENDING", + "compute_fetch_job": "16608615", + "sources": [ + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_step1_structure.py", + "remote_path": "/work/ratul1/supantha/Bertint/b4_step1_structure.py", + "sha256": "c82d7fe71d178d78d52ee47d809cd12d0286c48b1375c0c7b8b80fa222858e61", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_step3_bootstrap.py", + "remote_path": "/work/ratul1/supantha/Bertint/b4_step3_bootstrap.py", + "sha256": "ab7560abe237da435464a984a4e23925e7ec48d802949f57ef9600b829e6b37d", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_step3_bootstrap_r2.py", + "remote_path": "/work/ratul1/supantha/Bertint/b4_step3_bootstrap_r2.py", + "sha256": "6dbbbeb14bb860f6344a93bb65754f540dee8da4ceb3fdc526133c7133dd426c", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_gif_repeat_compare.py", + "remote_path": "/work/ratul1/supantha/Bertint/b4_gif_repeat_compare.py", + "sha256": "7fe6a80de1e7662a916e84b0a679c5579ab7fdcaaace70e1855f7d8face51ca3", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_gif_repeat.sbatch", + "remote_path": "/work/ratul1/supantha/Bertint/b4_gif_repeat.sbatch", + "sha256": "a381978d36492bb21cdb7c2a3007c51414b7630dd88016c7a74eb19c48080925", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_baselines_perrow.py", + "remote_path": "/work/ratul1/supantha/Bertint/b4_baselines_perrow.py", + "sha256": "61a5ef32482365e37e58bd4aee49ff5dabc2fafa04f4e063f3a0be7c294c84c7", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_lo_perrow_ckpt.py", + "remote_path": "/work/ratul1/supantha/Bertint/b4_lo_perrow_ckpt.py", + "sha256": "1d0433763d7ad49088e396b435a42f2a12141436db05592778a79938c88a953b", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_score_perrow.py", + "remote_path": "/work/ratul1/supantha/Bertint/gifflar_score_perrow.py", + "sha256": "f88bcf303685ea6a075747a12eafa7df041909b9b455d80ea98c2b536aed0de8", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/diagnostics/affinose_b4_step1_structure_20260926.json", + "remote_path": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_step1_structure_20260926.json", + "sha256": "7f9edc64528d5b43d2c464f8f5d4db91c2a133f54364993c7798a2a606bd3427", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/diagnostics/affinose_b4_step3_bootstrap_20260926.json", + "remote_path": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_step3_bootstrap_20260926.json", + "sha256": "17ab513ec2d9dec6f1e8c9445dfd7500190f99f0e8758b21fbb435b026324f3b", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json", + "remote_path": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json", + "sha256": "6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/diagnostics/affinose_b4_gif_repeat_20260927.json", + "remote_path": "/work/ratul1/supantha/Bertint/diagnostics/affinose_b4_gif_repeat_20260927.json", + "sha256": "50049bf5658f27700205e91d07f40512b8d297a7af11f51fcfbd514df9b59478", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_b4_s3_16604914.out", + "remote_path": "/work/ratul1/supantha/Bertint/logs/aff_b4_s3_16604914.out", + "sha256": "79eb29df46c44942a2a6ac4313789ebc29e1672bec4512c4f965be5ebb739cc9", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_b4_grep_16604967.out", + "remote_path": "/work/ratul1/supantha/Bertint/logs/aff_b4_grep_16604967.out", + "sha256": "dadfe2c408938645b4138bb011719affdaebe7098060f66354df56da71d0a146", + "matches_compute_manifest": true + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_b4_s3r2_16605803.out", + "remote_path": "/work/ratul1/supantha/Bertint/logs/aff_b4_s3r2_16605803.out", + "sha256": "5d93f96fb6e537c9b802fd1b2d9fe25df41a19800f85ea860246274d2e897d71", + "matches_compute_manifest": true + } + ], + "checks": { + "weighted_tie_rank_algorithm": { + "toy_assay_checks": 400, + "max_abs_error_vs_explicit_integer_expansion": 2.220446049250313e-16, + "scientific_resampling_performed": false + }, + "doubly_cold_ICC_recomputed_from_212_assay_CSV": { + "value": 0.16283693088250392, + "saved_value": 0.16283693088250406, + "abs_error": 1.3877787807814457e-16 + }, + "r1_stops_before_bootstrap": { + "gate_passes": 61, + "gate_total": 64, + "failed": [ + { + "source": "GIFFLAR gifflarESM s42", + "recomputed": 0.210711, + "recorded": 0.21041, + "pass": false, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM s44", + "recomputed": 0.207363, + "recorded": 0.207397, + "pass": false, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM s44", + "recomputed": 0.17515, + "recorded": 0.175171, + "pass": false, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + } + ], + "no_regimes_key": true, + "code_gate_exit_lines": "150-158 precede 296-373 loop" + }, + "r2_log": { + "all64_gates_message": true, + "all_3_regimes_reach_2000": true, + "output_hash_matches_prior_local_copy": true + }, + "r1_r2_source_diff": "Only output filename/comment, explanatory comment, regime label in GIFFLAR gate, and GIFFLAR tolerance 1e-5 to 5e-4. No resampling/scoring change.", + "repeat_receipt": { + "B_protein_gifflarESM_s42": { + "row_keys_identical": true, + "predictions_bit_identical": false, + "max_abs_prediction_diff": 1.7881393432617188e-07, + "macros_step2_r1_r2": [ + 0.210711, + 0.21068, + 0.210736 + ], + "macro_spread": 5.6000000000000494e-05 + }, + "B_protein_gifflarESM_s44": { + "row_keys_identical": true, + "predictions_bit_identical": false, + "max_abs_prediction_diff": 1.1920928955078125e-07, + "macros_step2_r1_r2": [ + 0.207363, + 0.207415, + 0.20736 + ], + "macro_spread": 5.4999999999999494e-05 + }, + "B_protein_sweetnetESM_s44": { + "row_keys_identical": true, + "predictions_bit_identical": false, + "max_abs_prediction_diff": 1.8477439880371094e-06, + "macros_step2_r1_r2": [ + 0.17515, + 0.175183, + 0.17517 + ], + "macro_spread": 3.300000000000525e-05 + } + } + }, + "implementation": { + "component_resampling": "Lines309-311 independently sample glycan and protein component indices with replacement; every method shares wg and wa.", + "macro_statistic": "Lines269-293 re-evaluate data-only eligibility in each replicate using BERToseBind seed42 full-stratum rows: >=5 expanded rows and >=2 surviving distinct target values, and positive assay/protein multiplicity. Protein draws weight assay copies; glycan draws weight rows for each within-assay Spearman.", + "method_undefined_rule": "Lines193-209 return zero for nonfinite/constant-target/constant-prediction rho or fewer than5 weighted method rows. These zeros enter the macro only where data-only replicate eligibility permits.", + "points": "On all-one weights, averages each method’s seed macros; some producer-rule points change under the uniform rule.", + "seeds": "Primary always averages available fixed seed models. Secondary redraws3 seeds independently within each seeded method, with replacement; deterministic methods have1.", + "pooled": "Lines244-266 apply product glycan×protein weights to global row ranks, mean across3 fixed models; separate secondary metric from equal-assay macro.", + "intervals": "Lines319-332 use 2.5%/97.5% quantiles, no multiplicity correction; p_btb_better is fraction(delta>0). Rank ties use minimum rank.", + "gate_scope": "64 gates =36 LectinOracle +18 GIFFLAR +10 p36. BTB9 sources and regenerated size/motif6 rely on upstream gates. GIFFLAR step3 gates compare saved per-row receipts to producer receipts, rather than recomputing receipt macro from the loaded NPZ at this gate. No raw-file inconsistency found; full raw linkage replay remains pending.", + "structure": "Step1 lines82-96 ANOVA ICC(1), unbalanced n0; lines152-158 weighted mean cluster size, negative ICC truncated to0 for design effect. Its BTB seed input check asserts target/assay/protein/glycan equality (114-117), stronger than the separate anatomy script." + }, + "remaining_limits": [ + "Logs and current source comments support gate stop/repeat/rerun sequence but do not independently timestamp when the written tolerance decision or protocol amendment was made. Need immutable/versioned pre-result record to prove that chronology.", + "Exact staged component maps and per-row arrays/receipts were not in this bounded fetch. No independent replay of all producer gates or verification of cross-model target/panel identity was performed. Exact149-file input inventory is saved separately; no heavy bootstrap rerun is required for a future input audit.", + "The initial September10 pre-declaration remains materially different. Report actual replicate eligibility and two-way all-regime protocol as amended25–26 September.", + "The seed42 recorded-to-rescored macro gap0.000301 is about5.4 times the within-job repeat spread0.000056. Nondeterminism is demonstrated, but does not establish the cause of that larger cross-run discrepancy." + ] +} diff --git a/releases/2026-10-02/bertosebind_new_runs/provenance/bootstrap_exact_input_manifest.json b/releases/2026-10-02/bertosebind_new_runs/provenance/bootstrap_exact_input_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..904b0195ba38df5467089256161094c4e839fa7e --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/provenance/bootstrap_exact_input_manifest.json @@ -0,0 +1,603 @@ +{ + "derived_from": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_step3_bootstrap_r2.py", + "source_sha256": "6dbbbeb14bb860f6344a93bb65754f540dee8da4ceb3fdc526133c7133dd426c", + "n_files": 149, + "files": [ + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtA_glycans42_test_glycan_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtA_glycans42_test_glycan_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prA_glycans42_test_glycan_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prA_glycans42_test_glycan_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtA_glycans42_test_glycan_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtA_glycans42.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtA_glycans42_test_glycan_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtA_glycans42.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_A_glycan_gifflarESM_s42_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_A_glycan_gifflarESM_s42_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_gifflarESM.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_A_glycan_sweetnetESM_s42_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_A_glycan_sweetnetESM_s42_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_sweetnetESM.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtA_glycans43_test_glycan_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtA_glycans43_test_glycan_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prA_glycans43_test_glycan_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prA_glycans43_test_glycan_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtA_glycans43_test_glycan_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtA_glycans43.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtA_glycans43_test_glycan_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtA_glycans43.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_A_glycan_gifflarESM_s43_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_A_glycan_gifflarESM_s43_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_gifflarESM_s43.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_A_glycan_sweetnetESM_s43_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_A_glycan_sweetnetESM_s43_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtA_glycans44_test_glycan_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtA_glycans44_test_glycan_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prA_glycans44_test_glycan_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prA_glycans44_test_glycan_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtA_glycans44_test_glycan_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtA_glycans44.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtA_glycans44_test_glycan_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtA_glycans44.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_A_glycan_gifflarESM_s44_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_A_glycan_gifflarESM_s44_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_gifflarESM_s44.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_A_glycan_sweetnetESM_s44_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_A_glycan_sweetnetESM_s44_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/p36_reviewer_baselines_A_glycan_perrow.npz", + "role": "p36 source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/p36_reviewer_baselines_A_glycan.json", + "role": "p36 source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/baseline_motif_ridge_A_glycan_perrow.npz", + "role": "regenerated baseline source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/baseline_size_ntok_A_glycan_perrow.npz", + "role": "regenerated baseline source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtB_proteins42_test_protein_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtB_proteins42_test_protein_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prB_proteins42_test_protein_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prB_proteins42_test_protein_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtB_proteins42_test_protein_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtB_proteins42.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtB_proteins42_test_protein_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtB_proteins42.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_B_protein_gifflarESM_s42_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_B_protein_gifflarESM_s42_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_gifflarESM.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_B_protein_sweetnetESM_s42_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_B_protein_sweetnetESM_s42_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_sweetnetESM.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtB_proteins43_test_protein_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtB_proteins43_test_protein_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prB_proteins43_test_protein_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prB_proteins43_test_protein_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtB_proteins43_test_protein_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtB_proteins43.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtB_proteins43_test_protein_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtB_proteins43.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_B_protein_gifflarESM_s43_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_B_protein_gifflarESM_s43_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_gifflarESM_s43.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_B_protein_sweetnetESM_s43_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_B_protein_sweetnetESM_s43_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_sweetnetESM_s43.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtB_proteins44_test_protein_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtB_proteins44_test_protein_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prB_proteins44_test_protein_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prB_proteins44_test_protein_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtB_proteins44_test_protein_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtB_proteins44.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtB_proteins44_test_protein_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtB_proteins44.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_B_protein_gifflarESM_s44_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_B_protein_gifflarESM_s44_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_gifflarESM_s44.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_B_protein_sweetnetESM_s44_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_B_protein_sweetnetESM_s44_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_B_protein_sweetnetESM_s44.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/p36_reviewer_baselines_B_protein_perrow.npz", + "role": "p36 source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/p36_reviewer_baselines_B_protein.json", + "role": "p36 source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/baseline_motif_ridge_B_protein_perrow.npz", + "role": "regenerated baseline source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/baseline_size_ntok_B_protein_perrow.npz", + "role": "regenerated baseline source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtC_doublys42_test_doubly_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtC_doublys42_test_doubly_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prC_doublys42_test_doubly_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prC_doublys42_test_doubly_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtC_doublys42_test_doubly_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtC_doublys42.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtC_doublys42_test_doubly_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtC_doublys42.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_C_doubly_gifflarESM_s42_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_C_doubly_gifflarESM_s42_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_gifflarESM.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_C_doubly_sweetnetESM_s42_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_C_doubly_sweetnetESM_s42_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_sweetnetESM.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtC_doublys43_test_doubly_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtC_doublys43_test_doubly_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prC_doublys43_test_doubly_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prC_doublys43_test_doubly_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtC_doublys43_test_doubly_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtC_doublys43.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtC_doublys43_test_doubly_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtC_doublys43.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_C_doubly_gifflarESM_s43_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_C_doubly_gifflarESM_s43_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_gifflarESM_s43.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_C_doubly_sweetnetESM_s43_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_C_doubly_sweetnetESM_s43_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtC_doublys44_test_doubly_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_matched_mtC_doublys44_test_doubly_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prC_doublys44_test_doubly_cold_perrow.npz", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/lo_flex_prC_doublys44_test_doubly_cold_receipt.json", + "role": "primary/flex source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtC_doublys44_test_doubly_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_esm1b_mtC_doublys44.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtC_doublys44_test_doubly_cold_perrow.npz", + "role": "ESM1b/matched-tuning source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_lectinoracle_matched_spearsel_mtC_doublys44.json", + "role": "producer receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_C_doubly_gifflarESM_s44_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_C_doubly_gifflarESM_s44_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_gifflarESM_s44.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_C_doubly_sweetnetESM_s44_perrow.npz", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/gifflar_C_doubly_sweetnetESM_s44_receipt.json", + "role": "GIFFLAR source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json", + "role": "GIFFLAR original receipt" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/p36_reviewer_baselines_C_doubly_perrow.npz", + "role": "p36 source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/p36_reviewer_baselines_C_doubly.json", + "role": "p36 source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/baseline_motif_ridge_C_doubly_perrow.npz", + "role": "regenerated baseline source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/b4_perrow/baseline_size_ntok_C_doubly_perrow.npz", + "role": "regenerated baseline source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mo_20260908_mo_A_glycan_s42.npz", + "role": "BERToseBind source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_sa_20260908_moc_A_glycan_s43.npz", + "role": "BERToseBind source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_sa_20260908_moc_A_glycan_s44.npz", + "role": "BERToseBind source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_sa_20260908_mo_B_protein_s42.npz", + "role": "BERToseBind source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mof_20260909_mof_B_protein_s43.npz", + "role": "BERToseBind source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mof_20260909_mof_B_protein_s44.npz", + "role": "BERToseBind source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mo_20260908_mo_C_doubly_s42.npz", + "role": "BERToseBind source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mof_20260909_mof_C_doubly_s43.npz", + "role": "BERToseBind source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mof_20260909_mof_C_doubly_s44.npz", + "role": "BERToseBind source" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/v2_artifacts/review_affinose_v2_glycan_components_20260926.tsv.gz", + "role": "component map" + }, + { + "remote_path": "/work/ratul1/supantha/Bertint/v2_artifacts/review_affinose_v2_protein_components_20260926.tsv.gz", + "role": "component map" + } + ] +} diff --git a/releases/2026-10-02/bertosebind_new_runs/provenance/current_pretraining_exposure_audit.json b/releases/2026-10-02/bertosebind_new_runs/provenance/current_pretraining_exposure_audit.json new file mode 100644 index 0000000000000000000000000000000000000000..19c44bde64a29d8151d9238a3a2039e99b1132ef --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/provenance/current_pretraining_exposure_audit.json @@ -0,0 +1,182 @@ +{ + "schema": "bertosebind.current_scored_pretraining_exposure.v1", + "status": "PASS_EXACT_PRIMARY_ARTIFACT_SET_JOIN", + "match_rule": "exact canonical WURCS string equality only; no graph-alias or structural similarity search", + "scope": "Current scored test glycans from the reported-model seed42 probe files. Not the unfiltered roster. All seeds share the same evaluated data according to the verified probe records.", + "pretraining_populations": { + "parent_index": 281208, + "bpe_fit_partition_parent_count": 221899, + "bpe_fit_partition_distinct_wurcs": 221899, + "encoder_sequence_training_parent_count": 221827, + "encoder_sequence_training_distinct_wurcs": 221827, + "train_parents_excluded_by_objective_mask": 72, + "train_mask_matches_full_untruncated_length_le_256": true, + "mask_authority": "Hash-bound runtime objective-eligibility array; role=pretraining_train. The length rule is checked within train, not globally, because excluded roles have independent eligibility flags." + }, + "sources": { + "partition": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/review_a5_non_iar_later_role_successor_20260720_r1/review_a5_non_iar_successor_parent_partition.tsv.gz", + "sha256": "86a8c6742156683d502c93fc71b31b9a93450037d647e5a90db437a015bb3bbc", + "bytes": 12149834 + }, + "sequence_index": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz", + "sha256": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0", + "bytes": 14697953 + }, + "objective_mask": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_objective_eligible.npy", + "sha256": "62502d0d1b44a10989350a78f1e033d271fe8417715e10d42eb47c6720ceb3bf", + "bytes": 281336 + }, + "sequence_package_summary": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_summary.json", + "sha256": "93ed219d807d4a7735be96bf7cf6a59a0bd407619925ee194aed6d473048cdf0", + "bytes": 7777 + }, + "WA3_final_receipt": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/provenance/WA3_final_receipt.json", + "sha256": "b8b05510e97f6b94ca5e0d1465eba034724d7ddcc405aa405db09c4c29fc768b", + "bytes": 86511 + }, + "current_sets_manifest": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/manifest.json", + "sha256": "7655d9d080df7cb5dc748b7d9721037fbec67c04cf837e4724f0afba7e7a4d71", + "bytes": 2391 + }, + "current_sets_archive": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets_16608669.tar.gz", + "sha256": "f44d492acb48d5d9a64d77ce8d5c172ded6093c3acbb6f64bdb16cc30b64fd1d", + "bytes": 19285 + } + }, + "regimes": { + "glycan_cold": { + "scored_glycans": 336, + "scored_rows": 37295, + "assays": 1767, + "assays_with_more_than_one_protein": 0, + "source_npz": { + "source_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mo_20260908_mo_A_glycan_s42.npz", + "source_sha256": "e54653e041ad8703f90fc2f4f5219bb7c94b60510d7ae30850ec2121c8747460", + "source_bytes": 259358 + }, + "source_set": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/glycan_cold_scored_glycans.csv", + "sha256": "0faab973a6ee5e5bf712983d51fad9f746e34edcbe5342574d45933bba62f48a", + "bytes": 59313 + }, + "joined_output": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/glycan_cold_exposure_join.csv", + "sha256": "4d101cc92685c63ecca99cfad2c1bc46c73c77b1e565bd686bde14ee0d020886", + "bytes": 62994 + }, + "bpe_fit_partition": { + "exact_wurcs_overlap": 32, + "glycan_denominator": 336, + "glycan_percent": 9.523809523809524, + "scored_rows_with_overlap": 4337, + "scored_row_denominator": 37295, + "scored_row_percent": 11.628904678911383 + }, + "encoder_sequence_training": { + "exact_wurcs_overlap": 32, + "glycan_denominator": 336, + "glycan_percent": 9.523809523809524, + "scored_rows_with_overlap": 4337, + "scored_row_denominator": 37295, + "scored_row_percent": 11.628904678911383 + } + }, + "protein_cold": { + "scored_glycans": 826, + "scored_rows": 38539, + "assays": 246, + "assays_with_more_than_one_protein": 0, + "source_npz": { + "source_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_sa_20260908_mo_B_protein_s42.npz", + "source_sha256": "14273637bd49db1ef43d515fc74849b2d2d7894508d793ccf7fc24ac407ada53", + "source_bytes": 297081 + }, + "source_set": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/protein_cold_scored_glycans.csv", + "sha256": "f35d6088903e993f46adee07806e577456599d9814f4f43e40efdf3d8ddf6c46", + "bytes": 103485 + }, + "joined_output": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/protein_cold_exposure_join.csv", + "sha256": "08ceef347f61012e0baab4daf1472122dc80335c6ea02fe084098c055a3e3e30", + "bytes": 112384 + }, + "bpe_fit_partition": { + "exact_wurcs_overlap": 118, + "glycan_denominator": 826, + "glycan_percent": 14.285714285714286, + "scored_rows_with_overlap": 179, + "scored_row_denominator": 38539, + "scored_row_percent": 0.4644645683593243 + }, + "encoder_sequence_training": { + "exact_wurcs_overlap": 118, + "glycan_denominator": 826, + "glycan_percent": 14.285714285714286, + "scored_rows_with_overlap": 179, + "scored_row_denominator": 38539, + "scored_row_percent": 0.4644645683593243 + } + }, + "doubly_cold": { + "scored_glycans": 173, + "scored_rows": 3691, + "assays": 212, + "assays_with_more_than_one_protein": 0, + "source_npz": { + "source_path": "/work/ratul1/supantha/Bertint/affinose_attribution_motif_preds/affinose_mo_20260908_mo_C_doubly_s42.npz", + "source_sha256": "e6327a5d8f9bc584d6d04e0217fc1db118799bd295da6d8deee018ce6b849983", + "source_bytes": 40363 + }, + "source_set": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/doubly_cold_scored_glycans.csv", + "sha256": "e5eebf2072779d7001dabd3981237025be37eee6f19a5b109b00ce4b3e776e09", + "bytes": 30484 + }, + "joined_output": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_glycan_sets/doubly_cold_exposure_join.csv", + "sha256": "9d13452309d64f138705657334b74738eaf167c9faff835d024582e0e98c0af8", + "bytes": 32408 + }, + "bpe_fit_partition": { + "exact_wurcs_overlap": 14, + "glycan_denominator": 173, + "glycan_percent": 8.092485549132949, + "scored_rows_with_overlap": 17, + "scored_row_denominator": 3691, + "scored_row_percent": 0.4605797886751558 + }, + "encoder_sequence_training": { + "exact_wurcs_overlap": 14, + "glycan_denominator": 173, + "glycan_percent": 8.092485549132949, + "scored_rows_with_overlap": 17, + "scored_row_denominator": 3691, + "scored_row_percent": 0.4605797886751558 + } + } + }, + "limits": [ + "Exact identity exposure only; does not establish independence, absence of related structures, or a causal effect of exposure.", + "BPE fitting and actual encoder sequence-training populations are distinct even when their test overlap counts agree.", + "Old fit_train297/1505 and19.73% are not recalculated or carried forward.", + "No comparison of current binding-training glycan exposure is claimed.", + "The raw roster339 vs scored336 glycan-cold denominators are distinct; this audit reports the scored-set denominator only." + ], + "compute_receipt": { + "job_id": "16608669", + "state": "COMPLETED", + "exit_code": "0:0", + "elapsed_seconds": 1, + "node": "nova23-7", + "remote_work": "Read3 exact small saved NPZs, export WURCS row counts and one-protein-per-assay check; no model inference or training", + "local_work": "Read hash-bound primary partition/index/eligibility mask and compute exact set intersections" + } +} diff --git a/releases/2026-10-02/bertosebind_new_runs/provenance/exposure_portability.patch b/releases/2026-10-02/bertosebind_new_runs/provenance/exposure_portability.patch new file mode 100644 index 0000000000000000000000000000000000000000..f35d1e59a87167c339c369cc848e6035437eb5f9 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/provenance/exposure_portability.patch @@ -0,0 +1,39 @@ +--- executed/local/audit_current_pretraining_exposure.py ++++ audit_pretraining_exposure.py +@@ -1,8 +1,17 @@ + from pathlib import Path + import json,hashlib + import pandas as pd,numpy as np +-B=Path('/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training');O=B/'writing/review/submit_comm/_verification/bertosebind_new_runs_20260927' +-part=B/'writing/review/multimodal/outputs/review_a5_non_iar_later_role_successor_20260720_r1/review_a5_non_iar_successor_parent_partition.tsv.gz';seq=B/'data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz';obj=seq.parent/'review_sequence_objective_eligible.npy' ++import argparse ++ap=argparse.ArgumentParser(description='Reproduce the exact current scored-set exposure join from pinned external pretraining inputs.') ++ap.add_argument('--partition', type=Path, required=True) ++ap.add_argument('--sequence-index', type=Path, required=True) ++ap.add_argument('--wa3-receipt', type=Path, required=True) ++ap.add_argument('--outdir', type=Path, required=True) ++a=ap.parse_args() ++O=a.outdir.resolve(); O.mkdir(parents=True,exist_ok=True) ++(O/'current_glycan_sets').mkdir(exist_ok=True) ++SCORING=Path(__file__).resolve().parent/'inputs/current_glycan_sets' ++part=a.partition.resolve();seq=a.sequence_index.resolve();obj=seq.parent/'review_sequence_objective_eligible.npy' + expected={part:'86a8c6742156683d502c93fc71b31b9a93450037d647e5a90db437a015bb3bbc',seq:'2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0',obj:'62502d0d1b44a10989350a78f1e033d271fe8417715e10d42eb47c6720ceb3bf'} + def seal(p):return {'path':str(p),'sha256':hashlib.sha256(p.read_bytes()).hexdigest(),'bytes':p.stat().st_size} + for p,h in expected.items():assert seal(p)['sha256']==h +@@ -15,13 +24,13 @@ + assert int(fit.sum())==221899 and int((fit&o).sum())==221827 + assert np.array_equal(o[fit],(s.full_untruncated_length.to_numpy()<=256)[fit]) + fitset=set(s.loc[fit,'canonical_wurcs']);actualset=set(s.loc[fit&o,'canonical_wurcs']);assert len(fitset)==221899 and len(actualset)==221827 +-manifest=json.loads((O/'current_glycan_sets/manifest.json').read_text());results={} ++manifest=json.loads((SCORING/'manifest.json').read_text());results={} + for reg,r in manifest['regimes'].items(): +- csv=O/'current_glycan_sets'/r['export_name'];assert seal(csv)['sha256']==r['export_sha256'];g=pd.read_csv(csv);gset=set(g.canonical_wurcs);assert len(gset)==r['n_glycans'] and int(g.scored_rows.sum())==r['n_rows'] ++ csv=SCORING/r['export_name'];assert seal(csv)['sha256']==r['export_sha256'];g=pd.read_csv(csv);gset=set(g.canonical_wurcs);assert len(gset)==r['n_glycans'] and int(g.scored_rows.sum())==r['n_rows'] + g['in_bpe_fit_partition']=g.canonical_wurcs.isin(fitset);g['in_encoder_sequence_training']=g.canonical_wurcs.isin(actualset);out=O/'current_glycan_sets'/(reg+'_exposure_join.csv');g.to_csv(out,index=False) + x={'scored_glycans':len(gset),'scored_rows':r['n_rows'],'assays':r['n_assays'],'assays_with_more_than_one_protein':r['assays_with_more_than_one_protein'],'source_npz':{k:r[k] for k in ['source_path','source_sha256','source_bytes']},'source_set':seal(csv),'joined_output':seal(out)} + for key,col in [('bpe_fit_partition','in_bpe_fit_partition'),('encoder_sequence_training','in_encoder_sequence_training')]: + n=int(g[col].sum());rows=int(g.loc[g[col],'scored_rows'].sum());x[key]={'exact_wurcs_overlap':n,'glycan_denominator':len(gset),'glycan_percent':100*n/len(gset),'scored_rows_with_overlap':rows,'scored_row_denominator':r['n_rows'],'scored_row_percent':100*rows/r['n_rows']} + results[reg]=x +-report={'schema':'bertosebind.current_scored_pretraining_exposure.v1','status':'PASS_EXACT_PRIMARY_ARTIFACT_SET_JOIN','match_rule':'exact canonical WURCS string equality only; no graph-alias or structural similarity search','scope':'Current scored test glycans from the reported-model seed42 probe files. Not the unfiltered roster. All seeds share the same evaluated data according to the verified probe records.','pretraining_populations':{'parent_index':281208,'bpe_fit_partition_parent_count':221899,'bpe_fit_partition_distinct_wurcs':len(fitset),'encoder_sequence_training_parent_count':221827,'encoder_sequence_training_distinct_wurcs':len(actualset),'train_parents_excluded_by_objective_mask':72,'train_mask_matches_full_untruncated_length_le_256':True,'mask_authority':'Hash-bound runtime objective-eligibility array; role=pretraining_train. The length rule is checked within train, not globally, because excluded roles have independent eligibility flags.'},'sources':{'partition':seal(part),'sequence_index':seal(seq),'objective_mask':seal(obj),'sequence_package_summary':seal(seq.parent/'review_sequence_package_summary.json'),'WA3_final_receipt':seal(B/'writing/review/submit_comm/06_code/provenance/WA3_final_receipt.json'),'current_sets_manifest':seal(O/'current_glycan_sets/manifest.json'),'current_sets_archive':seal(O/'current_glycan_sets_16608669.tar.gz')},'regimes':results,'limits':['Exact identity exposure only; does not establish independence, absence of related structures, or a causal effect of exposure.','BPE fitting and actual encoder sequence-training populations are distinct even when their test overlap counts agree.','Old fit_train297/1505 and19.73% are not recalculated or carried forward.','No comparison of current binding-training glycan exposure is claimed.','The raw roster339 vs scored336 glycan-cold denominators are distinct; this audit reports the scored-set denominator only.'],'compute_receipt':{'job_id':'16608669','state':'COMPLETED','exit_code':'0:0','elapsed_seconds':1,'node':'nova23-7','remote_work':'Read3 exact small saved NPZs, export WURCS row counts and one-protein-per-assay check; no model inference or training','local_work':'Read hash-bound primary partition/index/eligibility mask and compute exact set intersections'}} ++report={'schema':'bertosebind.current_scored_pretraining_exposure.v1','status':'PASS_EXACT_PRIMARY_ARTIFACT_SET_JOIN','match_rule':'exact canonical WURCS string equality only; no graph-alias or structural similarity search','scope':'Current scored test glycans from the reported-model seed42 probe files. Not the unfiltered roster. All seeds share the same evaluated data according to the verified probe records.','pretraining_populations':{'parent_index':281208,'bpe_fit_partition_parent_count':221899,'bpe_fit_partition_distinct_wurcs':len(fitset),'encoder_sequence_training_parent_count':221827,'encoder_sequence_training_distinct_wurcs':len(actualset),'train_parents_excluded_by_objective_mask':72,'train_mask_matches_full_untruncated_length_le_256':True,'mask_authority':'Hash-bound runtime objective-eligibility array; role=pretraining_train. The length rule is checked within train, not globally, because excluded roles have independent eligibility flags.'},'sources':{'partition':seal(part),'sequence_index':seal(seq),'objective_mask':seal(obj),'sequence_package_summary':seal(seq.parent/'review_sequence_package_summary.json'),'WA3_final_receipt':seal(a.wa3_receipt.resolve()),'current_sets_manifest':seal(SCORING/'manifest.json'),'packaged_scored_sets':str(SCORING)},'regimes':results,'limits':['Exact identity exposure only; does not establish independence, absence of related structures, or a causal effect of exposure.','BPE fitting and actual encoder sequence-training populations are distinct even when their test overlap counts agree.','Old fit_train297/1505 and19.73% are not recalculated or carried forward.','No comparison of current binding-training glycan exposure is claimed.','The raw roster339 vs scored336 glycan-cold denominators are distinct; this audit reports the scored-set denominator only.'],'compute_receipt':{'job_id':'16608669','state':'COMPLETED','exit_code':'0:0','elapsed_seconds':1,'node':'nova23-7','remote_work':'Read3 exact small saved NPZs, export WURCS row counts and one-protein-per-assay check; no model inference or training','local_work':'Read hash-bound primary partition/index/eligibility mask and compute exact set intersections'}} + fp=O/'current_pretraining_exposure_audit.json';fp.write_text(json.dumps(report,indent=2)+'\n');print(json.dumps({'output':str(fp),'sha256':seal(fp)['sha256'],'populations':report['pretraining_populations'],'regimes':{k:{z:v[z] for z in ['scored_glycans','scored_rows','bpe_fit_partition','encoder_sequence_training']} for k,v in results.items()}},indent=2)) diff --git a/releases/2026-10-02/bertosebind_new_runs/provenance/gifflar_scorer_diff.txt b/releases/2026-10-02/bertosebind_new_runs/provenance/gifflar_scorer_diff.txt new file mode 100644 index 0000000000000000000000000000000000000000..3b1067708402a0b8784d3fc8521ac7783c66aa7c --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/provenance/gifflar_scorer_diff.txt @@ -0,0 +1,24 @@ +--- gifflar_score_macro.py ++++ gifflar_score_macro_seeds.py +@@ -60,12 +60,19 @@ + ap.add_argument("--version", default=None, help="version_N; default = newest COMPLETE one") + ap.add_argument("--ckpt", default="best", choices=["best", "last"]) + ap.add_argument("--out", default=None) ++# seeds copy (2026-09-26): the ONLY two changes vs gifflar_score_macro.py. Defaults reproduce the ++# original exactly; seed runs pass --logs_dir logs_s_ and --tag s. ++ap.add_argument("--logs_dir", default="logs", help="log dir under the arm dir (seed runs: logs_s_)") ++ap.add_argument("--tag", default="", help="appended to the output name so seed 42 results are never overwritten") + A = ap.parse_args() + + STRAT = OWN[A.arm] + ARMDIR = os.path.join(B, "gifflar_lgi_%s" % A.arm) +-LOGDIR = os.path.join(ARMDIR, "logs", "LGI_%s" % A.variant) +-OUT = A.out or os.path.join(B, "affinose_gifflar_macro_%s_%s.json" % (A.arm, A.variant)) ++LOGDIR = os.path.join(ARMDIR, A.logs_dir, "LGI_%s" % A.variant) ++OUT = A.out or os.path.join(B, "affinose_gifflar_macro_%s_%s%s.json" ++ % (A.arm, A.variant, ("_" + A.tag) if A.tag else "")) ++if os.path.exists(OUT): ++ sys.exit("FATAL: %s exists -- refusing to overwrite" % OUT) + + # ── pick the version dir ────────────────────────────────────────────────────────────────── + def is_complete(vd): diff --git a/releases/2026-10-02/bertosebind_new_runs/provenance/protein_gifflar_audit.json b/releases/2026-10-02/bertosebind_new_runs/provenance/protein_gifflar_audit.json new file mode 100644 index 0000000000000000000000000000000000000000..d600c6411d38e9f767fbd455a37757e87b0dd45c --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/provenance/protein_gifflar_audit.json @@ -0,0 +1,2198 @@ +{ + "schema": "bertosebind.protein_gifflar.audit.v1", + "status": "PASS_ARITHMETIC_LINEAGE_AND_PRIMARY_RUNTIME_RECORDS_WITH_CHRONOLOGY_LIMIT", + "scope": "Reported WA3 motif165 BERToseBind protein-replacement and GIFFLAR seeds42/43/44 only; no new model compute", + "evidence": { + "probe": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/affinose_attribution_motif_20260925.json", + "sha256": "4fd80f7396aa9803602fd62bd82ec3e98e1f937b46e1057cb26ffa56ea6c93f0", + "bytes": 10946 + }, + "historical_reported_scores": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/provenance/affinose_arms_on_test_20260909.json", + "sha256": "670cfcbcfe89e0729bb75f122cff8c7100c24d39ef775c69421d4bb820654056", + "bytes": 6707 + }, + "historical_test_scorer": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/provenance/score_arms_on_test_historical.py", + "sha256": "dc42f4cdd76cc2c49fedfe6b8b8ef40b5915ee70803c9cec5ec0b0573256f815", + "bytes": 6328 + }, + "upstream_crosswalk": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/receipts_gate1_checkpoint_crosswalk.json", + "sha256": "25b8e7f647205d1bcf87c90007e38bc3556ea9523422e51bafbec12044783635", + "bytes": 8928 + }, + "uniform_bootstrap_rescore": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/affinose_b4_step3_bootstrap_r2_20260927.json", + "sha256": "6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235", + "bytes": 48191 + }, + "master": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/BERTOSEBIND_MASTER_FOR_CODEX_20260927.md", + "sha256": "9f19d55796cf06266719860f16f9e5be6f4adab56488338dead7939329f029a0", + "bytes": 91664 + }, + "original_seed42_A_glycan_gifflarESM": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_A_glycan_gifflarESM.json", + "sha256": "d7f21b8037172e6d42fb65c8169d37b19c385d68dc9cbebadbafe9e930843074", + "bytes": 903 + }, + "original_seed42_A_glycan_sweetnetESM": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_A_glycan_sweetnetESM.json", + "sha256": "eca94bfbe82bfba95c2086c9c4ffe14091d442017356394ec2e75173cb66810f", + "bytes": 906 + }, + "original_seed42_B_protein_gifflarESM": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_B_protein_gifflarESM.json", + "sha256": "529296c1388651b4451f35829d0caa63e692a96fc88b74ee9b8dc8c1d09136da", + "bytes": 905 + }, + "original_seed42_B_protein_sweetnetESM": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_B_protein_sweetnetESM.json", + "sha256": "6f0098947aa4c962f991d1e17acc17707d7cb2eb5e9d6338182d6cfa65d28a2d", + "bytes": 908 + }, + "original_seed42_C_doubly_gifflarESM": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_C_doubly_gifflarESM.json", + "sha256": "bf720edacbad09cd04c42df7cf347dd1fe9846a22f307f7be1c38f06e89faa44", + "bytes": 900 + }, + "original_seed42_C_doubly_sweetnetESM": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_C_doubly_sweetnetESM.json", + "sha256": "1884d744232b56c5edc76e655cf9bd117e43d8d749c98300b528ea6a5e55b75d", + "bytes": 900 + } + }, + "protein": { + "checks": [ + { + "cell": "affinose_mo_20260908_mo_A_glycan_s42", + "exact_historical_macro": true, + "exact_historical_pooled": true, + "row_assay_identity": true, + "seed_stratum_identity": true, + "wa3_upstream_receipt": true, + "reported_recipe": true, + "receipt_test_is_validation": true, + "recorded_delta_arithmetic": true + }, + { + "cell": "affinose_sa_20260908_moc_A_glycan_s43", + "exact_historical_macro": true, + "exact_historical_pooled": true, + "row_assay_identity": true, + "seed_stratum_identity": true, + "wa3_upstream_receipt": true, + "reported_recipe": true, + "receipt_test_is_validation": true, + "recorded_delta_arithmetic": true + }, + { + "cell": "affinose_sa_20260908_moc_A_glycan_s44", + "exact_historical_macro": true, + "exact_historical_pooled": true, + "row_assay_identity": true, + "seed_stratum_identity": true, + "wa3_upstream_receipt": true, + "reported_recipe": true, + "receipt_test_is_validation": true, + "recorded_delta_arithmetic": true + }, + { + "cell": "affinose_sa_20260908_mo_B_protein_s42", + "exact_historical_macro": true, + "exact_historical_pooled": true, + "row_assay_identity": true, + "seed_stratum_identity": true, + "wa3_upstream_receipt": true, + "reported_recipe": true, + "receipt_test_is_validation": true, + "recorded_delta_arithmetic": true + }, + { + "cell": "affinose_mof_20260909_mof_B_protein_s43", + "exact_historical_macro": true, + "exact_historical_pooled": true, + "row_assay_identity": true, + "seed_stratum_identity": true, + "wa3_upstream_receipt": true, + "reported_recipe": true, + "receipt_test_is_validation": true, + "recorded_delta_arithmetic": true + }, + { + "cell": "affinose_mof_20260909_mof_B_protein_s44", + "exact_historical_macro": true, + "exact_historical_pooled": true, + "row_assay_identity": true, + "seed_stratum_identity": true, + "wa3_upstream_receipt": true, + "reported_recipe": true, + "receipt_test_is_validation": true, + "recorded_delta_arithmetic": true + }, + { + "cell": "affinose_mo_20260908_mo_C_doubly_s42", + "exact_historical_macro": true, + "exact_historical_pooled": true, + "row_assay_identity": true, + "seed_stratum_identity": true, + "wa3_upstream_receipt": true, + "reported_recipe": true, + "receipt_test_is_validation": true, + "recorded_delta_arithmetic": true + }, + { + "cell": "affinose_mof_20260909_mof_C_doubly_s43", + "exact_historical_macro": true, + "exact_historical_pooled": true, + "row_assay_identity": true, + "seed_stratum_identity": true, + "wa3_upstream_receipt": true, + "reported_recipe": true, + "receipt_test_is_validation": true, + "recorded_delta_arithmetic": true + }, + { + "cell": "affinose_mof_20260909_mof_C_doubly_s44", + "exact_historical_macro": true, + "exact_historical_pooled": true, + "row_assay_identity": true, + "seed_stratum_identity": true, + "wa3_upstream_receipt": true, + "reported_recipe": true, + "receipt_test_is_validation": true, + "recorded_delta_arithmetic": true + } + ], + "cells": [ + { + "cell": "affinose_mo_20260908_mo_A_glycan_s42", + "seed": 42, + "stratum": "test_glycan_cold", + "rows": 37295, + "eligible_assays": 1767, + "reported_downstream_checkpoint_sha256": "3303250c5aa34f7f20e605dafb138554302baa336598ec84645f196e7f906b52", + "intact_macro": 0.33405850648525903, + "wrong_protein_macro": 0.15801497671819276, + "mean_protein_macro": 0.2594956399755904, + "wrong_protein_drop": 0.17604352976706628, + "mean_protein_drop": 0.07456286650966865, + "intact_pooled": 0.3519114017717813, + "wrong_prediction_agreement_with_intact": 0.46577155590127756, + "receipt": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/provenance/affinose_cells/affinose_mo_20260908_mo_A_glycan_s42/receipt.json", + "sha256": "a291a8e8f2b77c7955b5346aa52289afc520a0b5181d62eb0dfa2c096bd6bbb8", + "bytes": 6137 + } + }, + { + "cell": "affinose_sa_20260908_moc_A_glycan_s43", + "seed": 43, + "stratum": "test_glycan_cold", + "rows": 37295, + "eligible_assays": 1767, + "reported_downstream_checkpoint_sha256": "e2c0bebaaf53894bb928bc6b302c3eacfa5254d9c7301ff47854e98338b97ee3", + "intact_macro": 0.318371586837939, + "wrong_protein_macro": 0.12771779371507755, + "mean_protein_macro": 0.24610584405709057, + "wrong_protein_drop": 0.19065379312286143, + "mean_protein_drop": 0.07226574278084841, + "intact_pooled": 0.3491029922366602, + "wrong_prediction_agreement_with_intact": 0.38649872977325306, + "receipt": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s43/receipt.json", + "sha256": "c3e3028a05cf7f5b58883d9485bcd7a7e0ba5d05265f4503b8bad09e307c1480", + "bytes": 6142 + } + }, + { + "cell": "affinose_sa_20260908_moc_A_glycan_s44", + "seed": 44, + "stratum": "test_glycan_cold", + "rows": 37295, + "eligible_assays": 1767, + "reported_downstream_checkpoint_sha256": "c4adf409efbb985b1fceee6a398ac8be0c84946ea354791c95ae835ae59e67a4", + "intact_macro": 0.3354799039624282, + "wrong_protein_macro": 0.1857201171794652, + "mean_protein_macro": 0.25435173846117026, + "wrong_protein_drop": 0.149759786782963, + "mean_protein_drop": 0.08112816550125795, + "intact_pooled": 0.3562564894744605, + "wrong_prediction_agreement_with_intact": 0.5502848813104219, + "receipt": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s44/receipt.json", + "sha256": "6f5cbc9e19a45b4e9c8d33e7f4a82e41ef610b5040175852d3c05ea172995d4f", + "bytes": 6142 + } + }, + { + "cell": "affinose_sa_20260908_mo_B_protein_s42", + "seed": 42, + "stratum": "test_protein_cold", + "rows": 38539, + "eligible_assays": 246, + "reported_downstream_checkpoint_sha256": "ebdc31defe4c7a6d105670626d2da50f7d29026e41c31f24bd5722079bb7a80d", + "intact_macro": 0.23260289913763402, + "wrong_protein_macro": 0.18010721693552095, + "mean_protein_macro": 0.20089533044093738, + "wrong_protein_drop": 0.052495682202113064, + "mean_protein_drop": 0.031707568696696636, + "intact_pooled": 0.26884245311406896, + "wrong_prediction_agreement_with_intact": 0.7352154609379177, + "receipt": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/provenance/affinose_cells/affinose_sa_20260908_mo_B_protein_s42/receipt.json", + "sha256": "07a919272c928f9630f4d70a73cf1aa91a327e2c9597cf582814c5386b6f24cc", + "bytes": 6147 + } + }, + { + "cell": "affinose_mof_20260909_mof_B_protein_s43", + "seed": 43, + "stratum": "test_protein_cold", + "rows": 38539, + "eligible_assays": 246, + "reported_downstream_checkpoint_sha256": "f143720e8ebd41ba247ddeac5a5b58971c9cc3c407361b8071cf7dd1c513b57d", + "intact_macro": 0.24512556467979302, + "wrong_protein_macro": 0.17218050912323637, + "mean_protein_macro": 0.20672400888172926, + "wrong_protein_drop": 0.07294505555655664, + "mean_protein_drop": 0.03840155579806376, + "intact_pooled": 0.2699137753848991, + "wrong_prediction_agreement_with_intact": 0.6187879434501171, + "receipt": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s43/receipt.json", + "sha256": "a380534df6f877c212a2c7dbce577511e282537bbff9ad5d7ac3e186f1cc5633", + "bytes": 6153 + } + }, + { + "cell": "affinose_mof_20260909_mof_B_protein_s44", + "seed": 44, + "stratum": "test_protein_cold", + "rows": 38539, + "eligible_assays": 246, + "reported_downstream_checkpoint_sha256": "d43e1b62ce0b51b874d255544d63088f10735c85e57234eb9c420e8af3af88f1", + "intact_macro": 0.24489399647831056, + "wrong_protein_macro": 0.16315950509739569, + "mean_protein_macro": 0.2092362381074056, + "wrong_protein_drop": 0.08173449138091488, + "mean_protein_drop": 0.03565775837090496, + "intact_pooled": 0.2547891998912819, + "wrong_prediction_agreement_with_intact": 0.5736819255068246, + "receipt": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s44/receipt.json", + "sha256": "9344a727416db1368c45a0ddad962a12130e10f03944a5142874f72ba5311297", + "bytes": 6153 + } + }, + { + "cell": "affinose_mo_20260908_mo_C_doubly_s42", + "seed": 42, + "stratum": "test_doubly_cold", + "rows": 3691, + "eligible_assays": 212, + "reported_downstream_checkpoint_sha256": "e3872d4768fdcf5aa1d7be070cad8789a427332ba6741fdfa420d1c69f54b321", + "intact_macro": 0.17732109020146009, + "wrong_protein_macro": 0.1551714308573706, + "mean_protein_macro": 0.20970366631135062, + "wrong_protein_drop": 0.022149659344089495, + "mean_protein_drop": -0.03238257610989054, + "intact_pooled": 0.19643520103251555, + "wrong_prediction_agreement_with_intact": 0.7222998436599677, + "receipt": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/provenance/affinose_cells/affinose_mo_20260908_mo_C_doubly_s42/receipt.json", + "sha256": "29b68fb30127700fa55942d5cc4c237f8bf15c2d0c883192b62698d811e71c51", + "bytes": 6135 + } + }, + { + "cell": "affinose_mof_20260909_mof_C_doubly_s43", + "seed": 43, + "stratum": "test_doubly_cold", + "rows": 3691, + "eligible_assays": 212, + "reported_downstream_checkpoint_sha256": "7b56d428df6c91ec02e3fa5aab4df73afba7127f020738548ae37b7048bb66a1", + "intact_macro": 0.1839765095395252, + "wrong_protein_macro": 0.19307542754537219, + "mean_protein_macro": 0.1770139140083824, + "wrong_protein_drop": -0.009098918005846973, + "mean_protein_drop": 0.006962595531142812, + "intact_pooled": 0.2208411762069753, + "wrong_prediction_agreement_with_intact": 0.7779136776624087, + "receipt": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s43/receipt.json", + "sha256": "068bb72cc2fc0231f3a9f729ac78f1a6340a7088ea86a60449ebe63dcfbd794d", + "bytes": 6141 + } + }, + { + "cell": "affinose_mof_20260909_mof_C_doubly_s44", + "seed": 44, + "stratum": "test_doubly_cold", + "rows": 3691, + "eligible_assays": 212, + "reported_downstream_checkpoint_sha256": "509a088a821250e6464c2f696aa1b53cc4f00443c73153c95a18afdfe53a621d", + "intact_macro": 0.17430173158048537, + "wrong_protein_macro": 0.16899968178523816, + "mean_protein_macro": 0.17270013551187774, + "wrong_protein_drop": 0.0053020497952472045, + "mean_protein_drop": 0.0016015960686076303, + "intact_pooled": 0.19176702047106786, + "wrong_prediction_agreement_with_intact": 0.7555498628884061, + "receipt": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s44/receipt.json", + "sha256": "3044b56619b1bb83063070624b02bfaa64c952c1da76a80051bb62bb26098395", + "bytes": 6141 + } + } + ], + "summary": { + "glycan_cold": { + "intact_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.33405850648525903, + 0.318371586837939, + 0.3354799039624282 + ], + "mean": 0.3293033324285421, + "sample_sd": 0.009493807926236891, + "formatted_4dp": "0.3293 \u00b1 0.0095" + }, + "wrong_protein_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.15801497671819276, + 0.12771779371507755, + 0.1857201171794652 + ], + "mean": 0.15715096253757851, + "sample_sd": 0.029010813021959427, + "formatted_4dp": "0.1572 \u00b1 0.0290" + }, + "mean_protein_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.2594956399755904, + 0.24610584405709057, + 0.25435173846117026 + ], + "mean": 0.2533177408312837, + "sample_sd": 0.0067545186363446195, + "formatted_4dp": "0.2533 \u00b1 0.0068" + }, + "wrong_protein_drop": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.17604352976706628, + 0.19065379312286143, + 0.149759786782963 + ], + "mean": 0.17215236989096358, + "sample_sd": 0.020722832396126666, + "formatted_4dp": "0.1722 \u00b1 0.0207" + }, + "mean_protein_drop": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.07456286650966865, + 0.07226574278084841, + 0.08112816550125795 + ], + "mean": 0.07598559159725833, + "sample_sd": 0.0045993199633153, + "formatted_4dp": "0.0760 \u00b1 0.0046" + }, + "wrong_ge_mean_seed_count": 3 + }, + "protein_cold": { + "intact_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.23260289913763402, + 0.24512556467979302, + 0.24489399647831056 + ], + "mean": 0.24087415343191254, + "sample_sd": 0.007164052041858018, + "formatted_4dp": "0.2409 \u00b1 0.0072" + }, + "wrong_protein_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.18010721693552095, + 0.17218050912323637, + 0.16315950509739569 + ], + "mean": 0.17181574371871766, + "sample_sd": 0.008479742005938807, + "formatted_4dp": "0.1718 \u00b1 0.0085" + }, + "mean_protein_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.20089533044093738, + 0.20672400888172926, + 0.2092362381074056 + ], + "mean": 0.20561852581002407, + "sample_sd": 0.004278931501146884, + "formatted_4dp": "0.2056 \u00b1 0.0043" + }, + "wrong_protein_drop": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.052495682202113064, + 0.07294505555655664, + 0.08173449138091488 + ], + "mean": 0.06905840971319487, + "sample_sd": 0.01500188329785255, + "formatted_4dp": "0.0691 \u00b1 0.0150" + }, + "mean_protein_drop": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.031707568696696636, + 0.03840155579806376, + 0.03565775837090496 + ], + "mean": 0.03525562762188845, + "sample_sd": 0.003365062805178498, + "formatted_4dp": "0.0353 \u00b1 0.0034" + }, + "wrong_ge_mean_seed_count": 3 + }, + "doubly_cold": { + "intact_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.17732109020146009, + 0.1839765095395252, + 0.17430173158048537 + ], + "mean": 0.17853311044049022, + "sample_sd": 0.004949957265880665, + "formatted_4dp": "0.1785 \u00b1 0.0049" + }, + "wrong_protein_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.1551714308573706, + 0.19307542754537219, + 0.16899968178523816 + ], + "mean": 0.17241551339599365, + "sample_sd": 0.019181479881015078, + "formatted_4dp": "0.1724 \u00b1 0.0192" + }, + "mean_protein_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.20970366631135062, + 0.1770139140083824, + 0.17270013551187774 + ], + "mean": 0.18647257194387026, + "sample_sd": 0.02023400554418996, + "formatted_4dp": "0.1865 \u00b1 0.0202" + }, + "wrong_protein_drop": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.022149659344089495, + -0.009098918005846973, + 0.0053020497952472045 + ], + "mean": 0.0061175970444965755, + "sample_sd": 0.015640244070523942, + "formatted_4dp": "0.0061 \u00b1 0.0156" + }, + "mean_protein_drop": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + -0.03238257610989054, + 0.006962595531142812, + 0.0016015960686076303 + ], + "mean": -0.007939461503380032, + "sample_sd": 0.021337395988254543, + "formatted_4dp": "-0.0079 \u00b1 0.0213" + }, + "wrong_ge_mean_seed_count": 2 + } + }, + "upstream": { + "arm": "wa3", + "upstream_ckpt": "/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt", + "declared_epoch": "58", + "fresh_sha256": "8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82", + "verdict": "PASS" + }, + "declared_rule_numerically_passed": true, + "historical_versus_probe_exact_macro_count": 9, + "historical_versus_probe_exact_pooled_count": 9, + "lineage_limit": "Packaged receipts and saved crosswalk support reported WA3 epoch58 upstream lineage; current checkpoint bytes and actual probe execution not freshly inspected." + }, + "gifflar": { + "new_seed_primary_receipts": [ + { + "arm": "A_glycan", + "variant": "gifflarESM", + "seed": 43, + "macro_eligibility_corrected": 0.252077, + "rows_total": 37315, + "rows_scored": 36635, + "assays_eligible": 1767, + "assays_scored": 1687, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 9.999999999732445e-07, + "denominator_rescale_abs_rounding_residual": 1.3469156762146994e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_gifflarESM_s43.json", + "sha256": "2c494ac1351d4ff63828139eac004c0047dc3259d62fd10334d5a740cab9182f", + "bytes": 927 + } + }, + { + "arm": "A_glycan", + "variant": "gifflarESM", + "seed": 44, + "macro_eligibility_corrected": 0.275437, + "rows_total": 37315, + "rows_scored": 36635, + "assays_eligible": 1767, + "assays_scored": 1687, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 3.5880022636325393e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_gifflarESM_s44.json", + "sha256": "82173016b893cb2913e90e99feea5f6f4ff22cff9e1aff0fe7dc136161c7f627", + "bytes": 927 + } + }, + { + "arm": "A_glycan", + "variant": "sweetnetESM", + "seed": 43, + "macro_eligibility_corrected": 0.292708, + "rows_total": 37315, + "rows_scored": 36635, + "assays_eligible": 1767, + "assays_scored": 1687, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 6.112054329321381e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=38-step=134238.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json", + "sha256": "ac58a83969a0ffb860cf1a33a472f4cb5b3e14f25097c3ba909f7555f65aa589", + "bytes": 933 + } + }, + { + "arm": "A_glycan", + "variant": "sweetnetESM", + "seed": 44, + "macro_eligibility_corrected": 0.261029, + "rows_total": 37315, + "rows_scored": 36635, + "assays_eligible": 1767, + "assays_scored": 1687, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 3.5880022636325393e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=37-step=130796.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json", + "sha256": "d2d2d73c834a2fcca7b8c22fd6ce91907f18866443628c2c54f8b8ec04477803", + "bytes": 933 + } + }, + { + "arm": "B_protein", + "variant": "gifflarESM", + "seed": 43, + "macro_eligibility_corrected": 0.20452, + "rows_total": 38556, + "rows_scored": 36957, + "assays_eligible": 246, + "assays_scored": 233, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 1.2195121940061782e-08, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/weights/epoch=48-step=168756.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_gifflarESM_s43.json", + "sha256": "7b0a01a1acc7e2ca80a3de9aaab02941942ead519e6661abec6c44c7fa5fd079", + "bytes": 929 + } + }, + { + "arm": "B_protein", + "variant": "gifflarESM", + "seed": 44, + "macro_eligibility_corrected": 0.207397, + "rows_total": 38556, + "rows_scored": 36957, + "assays_eligible": 246, + "assays_scored": 233, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 4.796747967716897e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/weights/epoch=37-step=130872.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_gifflarESM_s44.json", + "sha256": "f2e40d306b767e6949c02304077a08398dc16ac19d08d94937f7dc49abd7cc24", + "bytes": 930 + } + }, + { + "arm": "B_protein", + "variant": "sweetnetESM", + "seed": 43, + "macro_eligibility_corrected": 0.178855, + "rows_total": 38556, + "rows_scored": 36957, + "assays_eligible": 246, + "assays_scored": 233, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 3.252032518274994e-08, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=42-step=148092.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_sweetnetESM_s43.json", + "sha256": "e13c8021d6e94b3bd6cb4ef00d7456c182449f57c4b1356256e011805a6efdbf", + "bytes": 935 + } + }, + { + "arm": "B_protein", + "variant": "sweetnetESM", + "seed": 44, + "macro_eligibility_corrected": 0.175171, + "rows_total": 38556, + "rows_scored": 36957, + "assays_eligible": 246, + "assays_scored": 233, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 4.6341463413868134e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=48-step=168756.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_sweetnetESM_s44.json", + "sha256": "d274d35c9a0ba25e4597cdb8c01001f4f7ff7760aabfe7c8a00b84a70b74252f", + "bytes": 935 + } + }, + { + "arm": "C_doubly", + "variant": "gifflarESM", + "seed": 43, + "macro_eligibility_corrected": 0.187401, + "rows_total": 3691, + "rows_scored": 3533, + "assays_eligible": 212, + "assays_scored": 201, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 2.1226415092279183e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/weights/epoch=8-step=51624.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_gifflarESM_s43.json", + "sha256": "2208056d5303fda27c5b541eed1c6f64cb03de1c10abd2868d4ce55d1bdb475c", + "bytes": 922 + } + }, + { + "arm": "C_doubly", + "variant": "gifflarESM", + "seed": 44, + "macro_eligibility_corrected": 0.187003, + "rows_total": 3691, + "rows_scored": 3533, + "assays_eligible": 212, + "assays_scored": 201, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 4.716981111263507e-09, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/weights/epoch=6-step=40152.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_gifflarESM_s44.json", + "sha256": "c831378d73c3c2c9456be5ff9ff05acc34b64815b056c5df21bef2078a415393", + "bytes": 922 + } + }, + { + "arm": "C_doubly", + "variant": "sweetnetESM", + "seed": 43, + "macro_eligibility_corrected": 0.227939, + "rows_total": 3691, + "rows_scored": 3533, + "assays_eligible": 212, + "assays_scored": 201, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 9.999999999732445e-07, + "denominator_rescale_abs_rounding_residual": 6.886792452698298e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=21-step=126192.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json", + "sha256": "121a30d0de568217e722036cf25ba4ef61128398fde3466fc8b2f60f096722c7", + "bytes": 929 + } + }, + { + "arm": "C_doubly", + "variant": "sweetnetESM", + "seed": 44, + "macro_eligibility_corrected": 0.213571, + "rows_total": 3691, + "rows_scored": 3533, + "assays_eligible": 212, + "assays_scored": 201, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 9.999999999732445e-07, + "denominator_rescale_abs_rounding_residual": 3.3018867889866854e-08, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/weights/epoch=6-step=40152.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json", + "sha256": "3d29ac377491db5d952f6066228fe4099f99db0e2fbaa80063ee429fc28e0a28", + "bytes": 927 + } + } + ], + "original_producer_3seed": { + "glycan_cold": { + "gifflarESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.237639, + 0.252077, + 0.275437 + ], + "mean": 0.25505099999999997, + "sample_sd": 0.01907369151475403, + "formatted_4dp": "0.2551 \u00b1 0.0191", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.07425233242854212, + "ci95": [ + 0.034599909389778014, + 0.11390475546730623 + ], + "p_two_sided": 0.00971682207340426, + "df": 2.9336856931653146, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "precision_and_provenance": "all seeds primary producer JSONs, each producer score rounded six decimals" + }, + "sweetnetESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.243723, + 0.292708, + 0.261029 + ], + "mean": 0.26582, + "sample_sd": 0.024841453600785938, + "formatted_4dp": "0.2658 \u00b1 0.0248", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.0634833324285421, + "ci95": [ + 0.009682552273780787, + 0.1172841125833034 + ], + "p_two_sided": 0.03437070747100726, + "df": 2.572030862923261, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "precision_and_provenance": "all seeds primary producer JSONs, each producer score rounded six decimals" + } + }, + "protein_cold": { + "gifflarESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.21041, + 0.20452, + 0.207397 + ], + "mean": 0.20744233333333334, + "sample_sd": 0.002945261674848833, + "formatted_4dp": "0.2074 \u00b1 0.0029", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.0334318200985792, + "ci95": [ + 0.018102805291075896, + 0.048760834906082504 + ], + "p_two_sided": 0.007430314876024293, + "df": 2.6572912103325406, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "precision_and_provenance": "all seeds primary producer JSONs, each producer score rounded six decimals" + }, + "sweetnetESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.175404, + 0.178855, + 0.175171 + ], + "mean": 0.17647666666666667, + "sample_sd": 0.0020629891743131627, + "formatted_4dp": "0.1765 \u00b1 0.0021", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.06439748676524587, + "ci95": [ + 0.048174498365200456, + 0.08062047516529128 + ], + "p_two_sided": 0.00228885041033366, + "df": 2.3294278562036883, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "precision_and_provenance": "all seeds primary producer JSONs, each producer score rounded six decimals" + } + }, + "doubly_cold": { + "gifflarESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.119211, + 0.187401, + 0.187003 + ], + "mean": 0.16453833333333334, + "sample_sd": 0.03925512656116821, + "formatted_4dp": "0.1645 \u00b1 0.0393", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.01399477710715688, + "ci95": [ + -0.08144662547197519, + 0.10943617968628895 + ], + "p_two_sided": 0.6008051758610409, + "df": 2.0635858293297056, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "precision_and_provenance": "all seeds primary producer JSONs, each producer score rounded six decimals" + }, + "sweetnetESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.224931, + 0.227939, + 0.213571 + ], + "mean": 0.222147, + "sample_sd": 0.007577786484191799, + "formatted_4dp": "0.2221 \u00b1 0.0076", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": -0.04361388955950979, + "ci95": [ + -0.05909522478850694, + -0.02813255433051264 + ], + "p_two_sided": 0.0021091175135923793, + "df": 3.443893902980397, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "precision_and_provenance": "all seeds primary producer JSONs, each producer score rounded six decimals" + } + } + }, + "uniform_bootstrap_rescore_3seed": { + "glycan_cold": { + "gifflarESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.2376472549518116, + 0.2520752003987527, + 0.27543575161831213 + ], + "mean": 0.25505273565629216, + "sample_sd": 0.019069397138765248, + "formatted_4dp": "0.2551 \u00b1 0.0191", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.07425059677224993, + "ci95": [ + 0.034608253562023794, + 0.11389293998247607 + ], + "p_two_sided": 0.009709116736489314, + "df": 2.934057593604352, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "arithmetic_matches_stored_welch": true + }, + "sweetnetESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.24372274134791053, + 0.29270779270966824, + 0.2610290765722505 + ], + "mean": 0.2658198702099431, + "sample_sd": 0.024841449071817994, + "formatted_4dp": "0.2658 \u00b1 0.0248", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.06348346221859902, + "ci95": [ + 0.009682693505369176, + 0.11728423093182885 + ], + "p_two_sided": 0.0343705278085289, + "df": 2.57203106278944, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "arithmetic_matches_stored_welch": true + } + }, + "protein_cold": { + "gifflarESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.21071117805914696, + 0.20452460419269286, + 0.20736334716689458 + ], + "mean": 0.20753304313957813, + "sample_sd": 0.003096775999912164, + "formatted_4dp": "0.2075 \u00b1 0.0031", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.033341110292334414, + "ci95": [ + 0.018136314435884517, + 0.04854590614878431 + ], + "p_two_sided": 0.007056963860288863, + "df": 2.722200349034115, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "arithmetic_matches_stored_welch": true + }, + "sweetnetESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.17540362192512995, + 0.17885413788754334, + 0.1751495179530837 + ], + "mean": 0.17646909258858567, + "sample_sd": 0.002069413688877239, + "formatted_4dp": "0.1765 \u00b1 0.0021", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.06440506084332687, + "ci95": [ + 0.048189258396257255, + 0.08062086329039647 + ], + "p_two_sided": 0.002280402507870895, + "df": 2.3314545156291864, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "arithmetic_matches_stored_welch": true + } + }, + "doubly_cold": { + "gifflarESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.11921097272627695, + 0.18740125661964038, + 0.1870032588662378 + ], + "mean": 0.16453849607071838, + "sample_sd": 0.03925529110780597, + "formatted_4dp": "0.1645 \u00b1 0.0393", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.01399461436977184, + "ci95": [ + -0.08144720467260831, + 0.10943643341215199 + ], + "p_two_sided": 0.6008104918014349, + "df": 2.0635852965340957, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "arithmetic_matches_stored_welch": true + }, + "sweetnetESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.22493144339363638, + 0.22793936767579281, + 0.2135711858019845 + ], + "mean": 0.22214733229047123, + "sample_sd": 0.00757790330934514, + "formatted_4dp": "0.2221 \u00b1 0.0076", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": -0.04361422184998101, + "ci95": [ + -0.05909579015892234, + -0.028132653541039675 + ], + "p_two_sided": 0.0021092157995203854, + "df": 3.4438630973535296, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "arithmetic_matches_stored_welch": true + } + } + }, + "doubly_encoder_gap_original": 0.05760866666666667, + "learned_fits_after_update": { + "bertosebind": 9, + "lectinoracle": 36, + "gifflar": 18, + "total": 63 + }, + "coverage_caveat": "GIFFLAR scores fewer rows and assays; missing eligible assays count as zero under the reported correction. Do not claim identical scored rows.", + "seed_spread_caveat": "Three training seeds; six final training logs record resumed runs. Resume is not established as bit-identical; seed-only Welch is secondary to test-set bootstrap and unadjusted." + }, + "issues": [ + { + "id": "GIFFLAR_MIXED_SCORE_FAMILY", + "severity": "correction", + "finding": "Protein-cold gifflarESM in master mixes original seed42 0.210410 with re-score mean/SD. Original producer convention:0.2074\u00b10.0029; uniform bootstrap re-score:0.2075\u00b10.0031. Preserve separate provenance." + }, + { + "id": "GIFFLAR_ROUNDING", + "severity": "correction", + "finding": "At four decimals glycan gifflarESM mean is0.2551 (not0.2550), glycan sweetnetESM sampleSD0.0248 (not0.0249), doubly-cold sweetnetESM sampleSD0.0076 (not0.0075). Both original and re-score sets give these rounded values." + }, + { + "id": "PROTEIN_CLAIM_LIMIT", + "severity": "wording", + "finding": "Doubly-cold has a small mean replacement effect with sign variation; no equivalence test. Avoid absent/no contribution/proves mechanism. A different-protein replacement can alter length too; supports reliance on protein inputs, not isolated sequence-identity causality." + }, + { + "id": "PROBE_VS_PREMOTIF", + "severity": "wording", + "finding": "Do not report0.2001 as the reported-model drop. Older producer may use receipt validation stratum; no controlled pre-motif comparison established here." + }, + { + "id": "PREDECLARATION_CHRONOLOGY", + "severity": "cannot_verify", + "finding": "Timestamped pre-job tracker state not recovered; rules are present in producer source and saved tracker, but chronological predeclaration is not independently certified." + }, + { + "id": "STALE_PRETRAIN_EXPOSURE_DENOMINATORS", + "severity": "correction", + "finding": "The fetched contamination receipt uses fit_train297/1505,231318rows; glycan-cold32/339,24704rows; used-pretrain221899. These are not the current reported scored rosters and actual221827 sequence-training population. Do not transplant19.7%,32/339 or14/173 as current without a current-set join.", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_glycan_cold_contamination.json", + "sha256": "0d4458462cd10dae219a9f15eb6dc8129d200a09891bd0b6bf0297cd85c4dae2", + "bytes": 1818 + }, + "resolution": "Resolved by fresh exact current scored-set join:32/336 glycan-cold,118/826 protein-cold,14/173 doubly-cold. Identical counts against221899 BPE-fit and221827 actual sequence-training parents; old19.7% training comparison omitted." + } + ], + "remote_access": { + "socket": "/tmp/codex_nova_crest_master", + "job_id": "16608615", + "state": "COMPLETED", + "exit_code": "0:0", + "elapsed_seconds": 5, + "node": "nova23-7", + "resources": "1CPU,2GB,5minute limit", + "science_compute": false, + "remote_process_check": "One-shot ps after both completed jobs/fetches showed only transient check shell/awk; no audit-created process persisted. No cleanup required.", + "cleanup_required": false, + "connection_preserved": true, + "additional_set_export_job": { + "job_id": "16608669", + "state": "COMPLETED", + "exit_code": "0:0", + "elapsed_seconds": 1, + "node": "nova23-7" + } + }, + "runtime_verification": { + "status": "PASS_PRIMARY_CODE_CONFIG_LOG_AND_COMPLETION_CHECKS", + "source_hashes_match_master": { + "aff_attribution_motif.py": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/aff_attribution_motif.py", + "sha256": "33d41f680cf7a5ae3b98fef4d1ef604f6e12a6a856ec6e90df8bb5a88f336bbe", + "bytes": 14866 + }, + "aff_attribution_motif.sbatch": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/aff_attribution_motif.sbatch", + "sha256": "2b89020895eebac8c99366036eebb07dd43c687fe47274dcd1de47d1017548ff", + "bytes": 1616 + }, + "gif_seeds.sbatch": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gif_seeds.sbatch", + "sha256": "56bf1e5b11a386d0920b9f50da6288eff222ee1b7f25d772a8a666a2387b2a9d", + "bytes": 2790 + }, + "gifflar_score_macro_seeds.py": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_score_macro_seeds.py", + "sha256": "578635213e1a3eddd61438a6249f14e1a5d2487267286fc459eb77972808e225", + "bytes": 15417 + }, + "b4_step1_structure.py": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_step1_structure.py", + "sha256": "c82d7fe71d178d78d52ee47d809cd12d0286c48b1375c0c7b8b80fa222858e61", + "bytes": 9872 + }, + "b4_step3_bootstrap_r2.py": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/b4_step3_bootstrap_r2.py", + "sha256": "6dbbbeb14bb860f6344a93bb65754f540dee8da4ceb3fdc526133c7133dd426c", + "bytes": 19828 + } + }, + "manifest": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/manifest.json", + "sha256": "06fbfcd2f820fc4621d35c16dcd6bbece93ea68b96d417d8b7bd2ce3ea104cdb", + "bytes": 74005 + }, + "archive": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence_16608615.tar.gz", + "sha256": "dcb1661213302bd69d5f406c915963598b03bc7b2170a6b39efa4af9b4c242aa", + "bytes": 763298 + }, + "copied_files_verified_against_compute_hashes": 144, + "protein": { + "val_to_test_mapping_verified_in_code": true, + "fixed_data_only_assay_eligibility": "at least5 rows and2 distinct targets; constant/nonfinite Spearman scored0", + "distinct_protein_cyclic_derangement_with_zero_self_assignments": "verified in code", + "sample_tripwires": { + "cells": 9, + "changed_protein_embedding_per_cell": 200, + "sampled_rows_per_cell": 200, + "glycan_token_and_motif_changes_per_cell": 0 + }, + "encoder_strict_load_count_per_cell": 209, + "encoder_load_cells": 9, + "nonzero_motif_head_asserted_in_code": true, + "probe_log": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_attr_motif_16596807.out", + "sha256": "e65e21b8c9c9bd0291a034852f7ab47f826e1f51448d9ea8439b5eb23ed8eb98", + "bytes": 7511 + }, + "mean_embedding_definition": "Sum over all masked-in residue vectors across all stratum rows divided by total masked-in residues; repeated proteins weighted by row frequency. Original protein masks/length retained.", + "limit": "Tripwires sample200 rows per cell; invariant glycan fields additionally follow from modifying only protein_id in the copied records. Downstream state load allows missing position_ids only, while209/209 strict count refers to upstream encoder." + }, + "gifflar": { + "configs": [ + { + "arm": "A_glycan", + "seed": 43, + "variant": "gifflarESM", + "only_allowed_changes": true, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml", + "sha256": "cda3d3e0df11dcbffff287c985039a4abe486a39bb97fe1554851992cbca127e", + "bytes": 1159 + }, + "reference": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml", + "sha256": "1ab7793ddb0daa247dc1f75b53356663d2c99e2e279a33207c9dd82f24288d17", + "bytes": 1122 + } + }, + { + "arm": "A_glycan", + "seed": 44, + "variant": "gifflarESM", + "only_allowed_changes": true, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml", + "sha256": "dab891f502cb328f8313a9d2971e5d8134472b059fa776409f97f5f59e5d470b", + "bytes": 1159 + }, + "reference": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml", + "sha256": "1ab7793ddb0daa247dc1f75b53356663d2c99e2e279a33207c9dd82f24288d17", + "bytes": 1122 + } + }, + { + "arm": "A_glycan", + "seed": 43, + "variant": "sweetnetESM", + "only_allowed_changes": true, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml", + "sha256": "d11d6ca73935a664a9afe9330d07e51b7e95e89e044a1012065ef1780d820381", + "bytes": 1136 + }, + "reference": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml", + "sha256": "1ab7793ddb0daa247dc1f75b53356663d2c99e2e279a33207c9dd82f24288d17", + "bytes": 1122 + } + }, + { + "arm": "A_glycan", + "seed": 44, + "variant": "sweetnetESM", + "only_allowed_changes": true, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml", + "sha256": "875883d0ec38fca1a4995ea76c00db81ba84357fb2ed9a7c0921dbb6c7cf6492", + "bytes": 1136 + }, + "reference": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml", + "sha256": "1ab7793ddb0daa247dc1f75b53356663d2c99e2e279a33207c9dd82f24288d17", + "bytes": 1122 + } + }, + { + "arm": "B_protein", + "seed": 43, + "variant": "gifflarESM", + "only_allowed_changes": true, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml", + "sha256": "908379483dc5b2d0655aa7b0a13b33c8b70ba0379852ffc2d848e354ebd9945e", + "bytes": 1164 + }, + "reference": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml", + "sha256": "529c3940cfce81ab3d135f25b722d7c302cd83e8540646f041a5d6ba36baebf3", + "bytes": 1126 + } + }, + { + "arm": "B_protein", + "seed": 44, + "variant": "gifflarESM", + "only_allowed_changes": true, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml", + "sha256": "5e518f2db88c03663eb263a5e4a44e93a3bc43e51c4af6c626cd0da416a18d81", + "bytes": 1164 + }, + "reference": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml", + "sha256": "529c3940cfce81ab3d135f25b722d7c302cd83e8540646f041a5d6ba36baebf3", + "bytes": 1126 + } + }, + { + "arm": "B_protein", + "seed": 43, + "variant": "sweetnetESM", + "only_allowed_changes": true, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml", + "sha256": "57cbf88ddf620ffbec7c4a8167a271ec38da0f94b1d3a4e9fe9769a9a19b8eea", + "bytes": 1141 + }, + "reference": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml", + "sha256": "529c3940cfce81ab3d135f25b722d7c302cd83e8540646f041a5d6ba36baebf3", + "bytes": 1126 + } + }, + { + "arm": "B_protein", + "seed": 44, + "variant": "sweetnetESM", + "only_allowed_changes": true, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml", + "sha256": "50c68416d3d4d72445e61811474179cb552e60d9f8a87f6cc0ed1da32d8b55e8", + "bytes": 1141 + }, + "reference": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml", + "sha256": "529c3940cfce81ab3d135f25b722d7c302cd83e8540646f041a5d6ba36baebf3", + "bytes": 1126 + } + }, + { + "arm": "C_doubly", + "seed": 43, + "variant": "gifflarESM", + "only_allowed_changes": true, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml", + "sha256": "ed244565f2f81e6c554613718398af97683ad375eb4debb5a61d25855c444368", + "bytes": 1159 + }, + "reference": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml", + "sha256": "034ba8bdefc3410b987d7bc380bd24a469a01c912349fef1e35436df2a24c36e", + "bytes": 1122 + } + }, + { + "arm": "C_doubly", + "seed": 44, + "variant": "gifflarESM", + "only_allowed_changes": true, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml", + "sha256": "2faa1986c043cf5d8b869d316afa0a043d071400c4f2018ba83551332a143f25", + "bytes": 1159 + }, + "reference": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml", + "sha256": "034ba8bdefc3410b987d7bc380bd24a469a01c912349fef1e35436df2a24c36e", + "bytes": 1122 + } + }, + { + "arm": "C_doubly", + "seed": 43, + "variant": "sweetnetESM", + "only_allowed_changes": true, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml", + "sha256": "d8ba3e8d83871cdd92548bc8bab1493225cdcbd536c0004ff6b40b48e4e62e40", + "bytes": 1136 + }, + "reference": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml", + "sha256": "034ba8bdefc3410b987d7bc380bd24a469a01c912349fef1e35436df2a24c36e", + "bytes": 1122 + } + }, + { + "arm": "C_doubly", + "seed": 44, + "variant": "sweetnetESM", + "only_allowed_changes": true, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml", + "sha256": "5fd2cdec3ee4d49f7d7441a037e0a2fbe428b1c0586de88beaf17a2ab67580f1", + "bytes": 1136 + }, + "reference": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml", + "sha256": "034ba8bdefc3410b987d7bc380bd24a469a01c912349fef1e35436df2a24c36e", + "bytes": 1122 + } + } + ], + "run_completion_and_hparams": [ + { + "arm": "A_glycan", + "seed": 43, + "variant": "gifflarESM", + "selected_version": "version_0", + "selected_max_epoch": 50.0, + "metrics_sources": [ + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "sha256": "35d0ef06a1b9725233ed1e58c74101b7e6a555da48165ed57c9bd71bb5e77315", + "bytes": 175381 + } + ], + "hparams": [ + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "sha256": "e391584ec821c1e86916c6f8c14a6571a550034fd246e1dc0e7d7b3b6d4dbd7e", + "bytes": 572 + }, + "all_declared_config_values_match": true + } + ] + }, + { + "arm": "A_glycan", + "seed": 44, + "variant": "gifflarESM", + "selected_version": "version_0", + "selected_max_epoch": 50.0, + "metrics_sources": [ + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "sha256": "1d9e1b8c6fff12f8603ce8f7e58189da0ae8580e72d3c5bf5ff3893a4f9bce2f", + "bytes": 175505 + } + ], + "hparams": [ + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "sha256": "fb07ac7cfcb63c4dd77c7493f4a518e11d268fd5e8d4cf6a849c31552e48369a", + "bytes": 572 + }, + "all_declared_config_values_match": true + } + ] + }, + { + "arm": "A_glycan", + "seed": 43, + "variant": "sweetnetESM", + "selected_version": "version_0", + "selected_max_epoch": 50.0, + "metrics_sources": [ + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "sha256": "fd6f39dd3bef9326bc1f583bf07a1f9b8f02f846630a0c58c66c7bae70456d59", + "bytes": 175252 + } + ], + "hparams": [ + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "sha256": "0dae829566b87d0dd00613343bc5a0c49fb1107c0f4834327d8cca71b8932389", + "bytes": 550 + }, + "all_declared_config_values_match": true + } + ] + }, + { + "arm": "A_glycan", + "seed": 44, + "variant": "sweetnetESM", + "selected_version": "version_0", + "selected_max_epoch": 50.0, + "metrics_sources": [ + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "sha256": "b911e06e11968f9d8655ab69619f33a8878759e497eb44498432c341dc6fbdd1", + "bytes": 175410 + } + ], + "hparams": [ + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "sha256": "4902e83edaa137f55f5fe4f32f32068e94a3f4832630b284048c22b8a099dca6", + "bytes": 550 + }, + "all_declared_config_values_match": true + } + ] + }, + { + "arm": "B_protein", + "seed": 43, + "variant": "gifflarESM", + "selected_version": "version_2", + "selected_max_epoch": 50.0, + "metrics_sources": [ + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "sha256": "346d480fa44e31a5a486bfa99c136cc5ddfee27a197194b7fac289de9ba55665", + "bytes": 15294 + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "sha256": "6a42d5cf20bf64a7b027660beca902ec84a80a1beb73e8aec1e4eb26fbb7c913", + "bytes": 1062 + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "sha256": "a71483c34b9d9cd904a6fe241f88af3e30bb3e100a15d666def5b06e4a5c0431", + "bytes": 158739 + } + ], + "hparams": [ + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "sha256": "75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b", + "bytes": 575 + }, + "all_declared_config_values_match": true + }, + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "sha256": "75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b", + "bytes": 575 + }, + "all_declared_config_values_match": true + }, + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/hparams.yaml", + "sha256": "75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b", + "bytes": 575 + }, + "all_declared_config_values_match": true + } + ] + }, + { + "arm": "B_protein", + "seed": 44, + "variant": "gifflarESM", + "selected_version": "version_2", + "selected_max_epoch": 50.0, + "metrics_sources": [ + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "sha256": "47b51d96993782f3c9e6117722176941bd2c6d571200d160e28aa654c97c6356", + "bytes": 1418 + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "sha256": "89d056126636c1fd1fa44d27ecfd57040a9bfc9eec2a76104da0ae07d01680b3", + "bytes": 1474 + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/metrics.csv", + "sha256": "c066cdbf7827bdec2f87c15bf95a42e0a23b511bf03338482e4d2b20c149336b", + "bytes": 175499 + } + ], + "hparams": [ + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "sha256": "0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35", + "bytes": 575 + }, + "all_declared_config_values_match": true + }, + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "sha256": "0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35", + "bytes": 575 + }, + "all_declared_config_values_match": true + }, + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/hparams.yaml", + "sha256": "0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35", + "bytes": 575 + }, + "all_declared_config_values_match": true + } + ] + }, + { + "arm": "B_protein", + "seed": 43, + "variant": "sweetnetESM", + "selected_version": "version_3", + "selected_max_epoch": 50.0, + "metrics_sources": [ + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "sha256": "faee86ceadc7e1dbe6835d44aef8c5d4f810a2cbe224e13202154b52dab92be3", + "bytes": 4108 + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "sha256": "ed66bf0654eeaabf3b4f5f92e1295abc53a0155095160092ffb47826ff385d1a", + "bytes": 9534 + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "sha256": "127b095cc67faf26378a247dc7345de56d331537dad375990ed319f684fbde27", + "bytes": 57261 + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "sha256": "eee99377078178660db1f12c2700b0c46c9d8120db5f445a8d71d3f584cc9fcd", + "bytes": 99720 + } + ], + "hparams": [ + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "bytes": 553 + }, + "all_declared_config_values_match": true + }, + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "bytes": 553 + }, + "all_declared_config_values_match": true + }, + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml", + "sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "bytes": 553 + }, + "all_declared_config_values_match": true + }, + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml", + "sha256": "2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16", + "bytes": 553 + }, + "all_declared_config_values_match": true + } + ] + }, + { + "arm": "B_protein", + "seed": 44, + "variant": "sweetnetESM", + "selected_version": "version_3", + "selected_max_epoch": 50.0, + "metrics_sources": [ + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "sha256": "fe5d987579ac234e8f21bb70e642177e9eccb69493564b7c5895e6abd51f4dc2", + "bytes": 4381 + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "sha256": "0ecfee6421a63cee0f0537fdb311e44b87227421f637816a0a3ccfd132763d16", + "bytes": 87583 + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/metrics.csv", + "sha256": "0d313e8557cb13577b34c8e94e0f2c887c11cfa6da6ca36ab2aa5f9d1cc10f22", + "bytes": 41685 + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/metrics.csv", + "sha256": "5ef2b9552f452e4218b9728c0ed57f7a14ec5068d065c7223e2c6e566e5dafd2", + "bytes": 29032 + } + ], + "hparams": [ + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "bytes": 553 + }, + "all_declared_config_values_match": true + }, + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "bytes": 553 + }, + "all_declared_config_values_match": true + }, + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml", + "sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "bytes": 553 + }, + "all_declared_config_values_match": true + }, + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml", + "sha256": "1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef", + "bytes": 553 + }, + "all_declared_config_values_match": true + } + ] + }, + { + "arm": "C_doubly", + "seed": 43, + "variant": "gifflarESM", + "selected_version": "version_1", + "selected_max_epoch": 50.0, + "metrics_sources": [ + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "sha256": "e92266239d6445a0de886e5081e433632c6719719f6d536ad31e98045160fcea", + "bytes": 12411 + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "sha256": "929a3396f429527836db8368e7908024bf69766e0567636b1f24df8c1c06ea42", + "bytes": 275117 + } + ], + "hparams": [ + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "sha256": "781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf", + "bytes": 572 + }, + "all_declared_config_values_match": true + }, + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "sha256": "781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf", + "bytes": 572 + }, + "all_declared_config_values_match": true + } + ] + }, + { + "arm": "C_doubly", + "seed": 44, + "variant": "gifflarESM", + "selected_version": "version_1", + "selected_max_epoch": 50.0, + "metrics_sources": [ + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv", + "sha256": "e937607ecc6a7058664faab71728c58ef7a9bba8f6985082bca5d565aef6ec7e", + "bytes": 11292 + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv", + "sha256": "eb420f0ea03bce2075ad4eac9237862ccbecb2c37c02d162d860516f4739b280", + "bytes": 274338 + } + ], + "hparams": [ + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml", + "sha256": "987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a", + "bytes": 572 + }, + "all_declared_config_values_match": true + }, + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml", + "sha256": "987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a", + "bytes": 572 + }, + "all_declared_config_values_match": true + } + ] + }, + { + "arm": "C_doubly", + "seed": 43, + "variant": "sweetnetESM", + "selected_version": "version_0", + "selected_max_epoch": 50.0, + "metrics_sources": [ + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "sha256": "1e68c5af1f9c7fe0f1c85d9f3d49fa1104bf3d4c768014154316ee27b94a3cc3", + "bytes": 284563 + } + ], + "hparams": [ + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "sha256": "f7852d23330d3b55e46eec193b3fe411306ea59349de6fa53273294d893dce1c", + "bytes": 550 + }, + "all_declared_config_values_match": true + } + ] + }, + { + "arm": "C_doubly", + "seed": 44, + "variant": "sweetnetESM", + "selected_version": "version_1", + "selected_max_epoch": 50.0, + "metrics_sources": [ + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv", + "sha256": "30f0105da3f2c579a8261a30ed6c3fcc8308cf9ebc2068f0e71168567e919922", + "bytes": 32118 + }, + { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv", + "sha256": "168da3dcbf6ca795bb75ec67b9fc567788637c25875b766cc76b441825e6020c", + "bytes": 251993 + } + ], + "hparams": [ + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml", + "sha256": "22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd", + "bytes": 550 + }, + "all_declared_config_values_match": true + }, + { + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml", + "sha256": "22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd", + "bytes": 550 + }, + "all_declared_config_values_match": true + } + ] + } + ], + "all12_dimension_out_of_range_counts": 0, + "g_zero_by_task": [ + { + "task": 0, + "glycans_with_multiple_proteins": 312, + "constant_prediction_fraction": 0.0, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_0.out", + "sha256": "19bb18892da4f9174e308bd42908a6e6d383001edd75c9ad482eef111b5bbb31", + "bytes": 2138 + }, + "training_error_log": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_0.err", + "sha256": "6c486b37a642549a8dcf924eabd52e2660d88a6ada53ba05aecb91937fd98626", + "bytes": 3771 + } + }, + { + "task": 1, + "glycans_with_multiple_proteins": 312, + "constant_prediction_fraction": 0.0, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_1.out", + "sha256": "152af1228aa39534d68470023321d4350bb2ea4b997bfd0bf38efbbeb92bad8b", + "bytes": 2137 + }, + "training_error_log": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_1.err", + "sha256": "bf5e3ff79c6b942dca7f35dcb85d0f32081b03875cb4640022fab29dff833b11", + "bytes": 3771 + } + }, + { + "task": 2, + "glycans_with_multiple_proteins": 312, + "constant_prediction_fraction": 0.0, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_2.out", + "sha256": "2b008f6ae0f5554b9841582ded12a01558218558d8b7748899e94a0499d8caaf", + "bytes": 2152 + }, + "training_error_log": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_2.err", + "sha256": "d9383fa7e0469a436e08d24f4f9af31c1a6fb9ebb5e115843b53e2b2ded612f1", + "bytes": 3777 + } + }, + { + "task": 3, + "glycans_with_multiple_proteins": 312, + "constant_prediction_fraction": 0.0, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_3.out", + "sha256": "c1d325125ee0463b230e5ac347c45a117ebc1a1686393d9d7bd63dd7c9a8a8d4", + "bytes": 2152 + }, + "training_error_log": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_3.err", + "sha256": "735f42f273046b3af0374283927429fa75a1b7a8b66d6b205a20e4e1cfd59eed", + "bytes": 3777 + } + }, + { + "task": 4, + "glycans_with_multiple_proteins": 444, + "constant_prediction_fraction": 0.0, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_4.out", + "sha256": "939f30920d3d4a772d8736c945f6e39dc949cde64cc7b9b9e0116e7b45f4f895", + "bytes": 2170 + }, + "training_error_log": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_4.err", + "sha256": "98912251710582e65eaed2ba01ee184d957d177ec31e30969939b4ef0962a2bf", + "bytes": 4166 + } + }, + { + "task": 5, + "glycans_with_multiple_proteins": 444, + "constant_prediction_fraction": 0.0, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_5.out", + "sha256": "7817d9b5c087d542f2c0659726a66532091a24c9b05edb04196a756291dd5784", + "bytes": 2171 + }, + "training_error_log": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_5.err", + "sha256": "cbb38c7fc50100cfa44cdf9b64de3df9a002613c62d8489b9d3db301406712c7", + "bytes": 3775 + } + }, + { + "task": 6, + "glycans_with_multiple_proteins": 444, + "constant_prediction_fraction": 0.0, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_6.out", + "sha256": "4283aa1d699582d4766ca394cf2d9c4b046ce8247b5cef0f8250c424329138a2", + "bytes": 2197 + }, + "training_error_log": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_6.err", + "sha256": "8ec18cd103ee2f80b2bacc8660a53588ed6313dbdc2455fe87fb5cdac6d30ef1", + "bytes": 4178 + } + }, + { + "task": 7, + "glycans_with_multiple_proteins": 444, + "constant_prediction_fraction": 0.0, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_7.out", + "sha256": "eb0257132cbd79d1a3a84bec543183b7bbdaceaaaefc85c988368d70d4146322", + "bytes": 2196 + }, + "training_error_log": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_7.err", + "sha256": "1a1baefb3f9d8bae9c38975310f96004470e75bed27b32b5273b31a9baca05f5", + "bytes": 4178 + } + }, + { + "task": 8, + "glycans_with_multiple_proteins": 69, + "constant_prediction_fraction": 0.0, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_8.out", + "sha256": "523b5ac11259832265dab5c4e08d837f3fe7e4780048a5a4af1f513f6b8c3d4a", + "bytes": 2137 + }, + "training_error_log": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_8.err", + "sha256": "01b633582a3ed13728f688fde16693926778896ba0952506cce66072f600f354", + "bytes": 4156 + } + }, + { + "task": 9, + "glycans_with_multiple_proteins": 69, + "constant_prediction_fraction": 0.0, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_9.out", + "sha256": "40ef3d8f12ba723cfe0e845ec72a960dbd32c8bc5baa3013f570e1c27a6431b6", + "bytes": 2137 + }, + "training_error_log": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_9.err", + "sha256": "a3ea46d3bd9191b9bbd49627cbfdac0dee312230e5e1ed93016f98f8786b94ba", + "bytes": 4600 + } + }, + { + "task": 10, + "glycans_with_multiple_proteins": 69, + "constant_prediction_fraction": 0.0, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_10.out", + "sha256": "d842f047adc16782a9724406ecab07aa67fe3ad853f5d0c8bee73cb63d129782", + "bytes": 2141 + }, + "training_error_log": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_10.err", + "sha256": "d911a9619dee68a9fc982bb3db253b8e72f12dc1c06d2bc434556211909b2719", + "bytes": 3777 + } + }, + { + "task": 11, + "glycans_with_multiple_proteins": 69, + "constant_prediction_fraction": 0.0, + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gsmac_16602170_11.out", + "sha256": "922dfe72fd457b50a6c468db266827346ab1173381458ad61e21ceb5a0c8736c", + "bytes": 2150 + }, + "training_error_log": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/logs/aff_gseed_16597159_11.err", + "sha256": "5024c4160aeeccd212930b0d959ed0bab4dd7bf593b61b26decd78c7513aa638", + "bytes": 4168 + } + } + ], + "six_final_logs_resume_from_own_last_checkpoint_tasks": [ + 4, + 6, + 7, + 8, + 9, + 11 + ], + "fresh_tasks": [ + 0, + 1, + 2, + 3, + 5, + 10 + ], + "resume_limit": "Final logs verify six resumes. Seven runs have more than one version because B_protein/gifflarESM/seed44 starts fresh after earlier incomplete versions. Preemption cause is not established from final overwritten logs. Lightning logs restore checkpoint states; do not claim optimizer state was not restored. Producer resets random seeds when entering train; no explicit custom RNG-state restoration, so bit-identical continuation is not established.", + "score_selection": "newest version with a nonempty test metric, then exactly one monitored checkpoint other than last.ckpt; pooled reproduction is recorded as abs difference<0.005, not enforced; G_ZERO is enforced", + "scorer_diff_verified_only_logs_dir_tag_and_overwrite_guard": true, + "scorer_diff": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/gifflar_scorer_diff.txt", + "sha256": "6649cef7a00096ba2981c611a4c6432be93300e3bb439cd543a692cbb40a15af", + "bytes": 1510 + }, + "launcher": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/gifflar_launch.py", + "sha256": "241d3ca6045610a70ccad8307448b4d57e47810c945f127fef768357e56cdef2", + "bytes": 10473 + }, + "actual_train_lgi_source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/train_lgi.py", + "sha256": "bf602abb05eeb3b0203766d9d1bc462579c181bc3418d762f6d02d5f36e8a230", + "bytes": 6375 + } + }, + "limitations": [ + "Timestamped pre-job tracker state not recovered; rules are present in producer source and saved tracker, but chronological predeclaration is not independently certified.", + "No models or per-row predictions were recomputed; primary result and execution records were checked." + ] + }, + "current_pretraining_exposure_audit": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/current_pretraining_exposure_audit.json", + "sha256": "30a70a1703183b50fa1c10986c065471513981fac1e3e69f9c7ad649aeecb16a", + "bytes": 9596 + } +} diff --git a/releases/2026-10-02/bertosebind_new_runs/provenance/protein_gifflar_verified_numbers.json b/releases/2026-10-02/bertosebind_new_runs/provenance/protein_gifflar_verified_numbers.json new file mode 100644 index 0000000000000000000000000000000000000000..02efb6f5bffbc53ef43da34c269ae81e4d5eaefa --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/provenance/protein_gifflar_verified_numbers.json @@ -0,0 +1,859 @@ +{ + "schema": "bertosebind.protein_gifflar.verified_numbers.v1", + "seed_order": [ + 42, + 43, + 44 + ], + "primary_score_convention": "original producer six-decimal GIFFLAR scores; full-precision reported-model BERToseBind scores; sampleSD(ddof=1); seed-only unadjusted Welch, BERToseBind minus comparator", + "protein": { + "glycan_cold": { + "intact_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.33405850648525903, + 0.318371586837939, + 0.3354799039624282 + ], + "mean": 0.3293033324285421, + "sample_sd": 0.009493807926236891, + "formatted_4dp": "0.3293 \u00b1 0.0095" + }, + "wrong_protein_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.15801497671819276, + 0.12771779371507755, + 0.1857201171794652 + ], + "mean": 0.15715096253757851, + "sample_sd": 0.029010813021959427, + "formatted_4dp": "0.1572 \u00b1 0.0290" + }, + "mean_protein_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.2594956399755904, + 0.24610584405709057, + 0.25435173846117026 + ], + "mean": 0.2533177408312837, + "sample_sd": 0.0067545186363446195, + "formatted_4dp": "0.2533 \u00b1 0.0068" + }, + "wrong_protein_drop": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.17604352976706628, + 0.19065379312286143, + 0.149759786782963 + ], + "mean": 0.17215236989096358, + "sample_sd": 0.020722832396126666, + "formatted_4dp": "0.1722 \u00b1 0.0207" + }, + "mean_protein_drop": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.07456286650966865, + 0.07226574278084841, + 0.08112816550125795 + ], + "mean": 0.07598559159725833, + "sample_sd": 0.0045993199633153, + "formatted_4dp": "0.0760 \u00b1 0.0046" + }, + "wrong_ge_mean_seed_count": 3 + }, + "protein_cold": { + "intact_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.23260289913763402, + 0.24512556467979302, + 0.24489399647831056 + ], + "mean": 0.24087415343191254, + "sample_sd": 0.007164052041858018, + "formatted_4dp": "0.2409 \u00b1 0.0072" + }, + "wrong_protein_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.18010721693552095, + 0.17218050912323637, + 0.16315950509739569 + ], + "mean": 0.17181574371871766, + "sample_sd": 0.008479742005938807, + "formatted_4dp": "0.1718 \u00b1 0.0085" + }, + "mean_protein_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.20089533044093738, + 0.20672400888172926, + 0.2092362381074056 + ], + "mean": 0.20561852581002407, + "sample_sd": 0.004278931501146884, + "formatted_4dp": "0.2056 \u00b1 0.0043" + }, + "wrong_protein_drop": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.052495682202113064, + 0.07294505555655664, + 0.08173449138091488 + ], + "mean": 0.06905840971319487, + "sample_sd": 0.01500188329785255, + "formatted_4dp": "0.0691 \u00b1 0.0150" + }, + "mean_protein_drop": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.031707568696696636, + 0.03840155579806376, + 0.03565775837090496 + ], + "mean": 0.03525562762188845, + "sample_sd": 0.003365062805178498, + "formatted_4dp": "0.0353 \u00b1 0.0034" + }, + "wrong_ge_mean_seed_count": 3 + }, + "doubly_cold": { + "intact_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.17732109020146009, + 0.1839765095395252, + 0.17430173158048537 + ], + "mean": 0.17853311044049022, + "sample_sd": 0.004949957265880665, + "formatted_4dp": "0.1785 \u00b1 0.0049" + }, + "wrong_protein_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.1551714308573706, + 0.19307542754537219, + 0.16899968178523816 + ], + "mean": 0.17241551339599365, + "sample_sd": 0.019181479881015078, + "formatted_4dp": "0.1724 \u00b1 0.0192" + }, + "mean_protein_macro": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.20970366631135062, + 0.1770139140083824, + 0.17270013551187774 + ], + "mean": 0.18647257194387026, + "sample_sd": 0.02023400554418996, + "formatted_4dp": "0.1865 \u00b1 0.0202" + }, + "wrong_protein_drop": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.022149659344089495, + -0.009098918005846973, + 0.0053020497952472045 + ], + "mean": 0.0061175970444965755, + "sample_sd": 0.015640244070523942, + "formatted_4dp": "0.0061 \u00b1 0.0156" + }, + "mean_protein_drop": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + -0.03238257610989054, + 0.006962595531142812, + 0.0016015960686076303 + ], + "mean": -0.007939461503380032, + "sample_sd": 0.021337395988254543, + "formatted_4dp": "-0.0079 \u00b1 0.0213" + }, + "wrong_ge_mean_seed_count": 2 + } + }, + "gifflar_original_producer_3seed": { + "glycan_cold": { + "gifflarESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.237639, + 0.252077, + 0.275437 + ], + "mean": 0.25505099999999997, + "sample_sd": 0.01907369151475403, + "formatted_4dp": "0.2551 \u00b1 0.0191", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.07425233242854212, + "ci95": [ + 0.034599909389778014, + 0.11390475546730623 + ], + "p_two_sided": 0.00971682207340426, + "df": 2.9336856931653146, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "precision_and_provenance": "all seeds primary producer JSONs, each producer score rounded six decimals" + }, + "sweetnetESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.243723, + 0.292708, + 0.261029 + ], + "mean": 0.26582, + "sample_sd": 0.024841453600785938, + "formatted_4dp": "0.2658 \u00b1 0.0248", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.0634833324285421, + "ci95": [ + 0.009682552273780787, + 0.1172841125833034 + ], + "p_two_sided": 0.03437070747100726, + "df": 2.572030862923261, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "precision_and_provenance": "all seeds primary producer JSONs, each producer score rounded six decimals" + } + }, + "protein_cold": { + "gifflarESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.21041, + 0.20452, + 0.207397 + ], + "mean": 0.20744233333333334, + "sample_sd": 0.002945261674848833, + "formatted_4dp": "0.2074 \u00b1 0.0029", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.0334318200985792, + "ci95": [ + 0.018102805291075896, + 0.048760834906082504 + ], + "p_two_sided": 0.007430314876024293, + "df": 2.6572912103325406, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "precision_and_provenance": "all seeds primary producer JSONs, each producer score rounded six decimals" + }, + "sweetnetESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.175404, + 0.178855, + 0.175171 + ], + "mean": 0.17647666666666667, + "sample_sd": 0.0020629891743131627, + "formatted_4dp": "0.1765 \u00b1 0.0021", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.06439748676524587, + "ci95": [ + 0.048174498365200456, + 0.08062047516529128 + ], + "p_two_sided": 0.00228885041033366, + "df": 2.3294278562036883, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "precision_and_provenance": "all seeds primary producer JSONs, each producer score rounded six decimals" + } + }, + "doubly_cold": { + "gifflarESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.119211, + 0.187401, + 0.187003 + ], + "mean": 0.16453833333333334, + "sample_sd": 0.03925512656116821, + "formatted_4dp": "0.1645 \u00b1 0.0393", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.01399477710715688, + "ci95": [ + -0.08144662547197519, + 0.10943617968628895 + ], + "p_two_sided": 0.6008051758610409, + "df": 2.0635858293297056, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "precision_and_provenance": "all seeds primary producer JSONs, each producer score rounded six decimals" + }, + "sweetnetESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.224931, + 0.227939, + 0.213571 + ], + "mean": 0.222147, + "sample_sd": 0.007577786484191799, + "formatted_4dp": "0.2221 \u00b1 0.0076", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": -0.04361388955950979, + "ci95": [ + -0.05909522478850694, + -0.02813255433051264 + ], + "p_two_sided": 0.0021091175135923793, + "df": 3.443893902980397, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "precision_and_provenance": "all seeds primary producer JSONs, each producer score rounded six decimals" + } + } + }, + "gifflar_uniform_bootstrap_rescore_3seed": { + "glycan_cold": { + "gifflarESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.2376472549518116, + 0.2520752003987527, + 0.27543575161831213 + ], + "mean": 0.25505273565629216, + "sample_sd": 0.019069397138765248, + "formatted_4dp": "0.2551 \u00b1 0.0191", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.07425059677224993, + "ci95": [ + 0.034608253562023794, + 0.11389293998247607 + ], + "p_two_sided": 0.009709116736489314, + "df": 2.934057593604352, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "arithmetic_matches_stored_welch": true + }, + "sweetnetESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.24372274134791053, + 0.29270779270966824, + 0.2610290765722505 + ], + "mean": 0.2658198702099431, + "sample_sd": 0.024841449071817994, + "formatted_4dp": "0.2658 \u00b1 0.0248", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.06348346221859902, + "ci95": [ + 0.009682693505369176, + 0.11728423093182885 + ], + "p_two_sided": 0.0343705278085289, + "df": 2.57203106278944, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "arithmetic_matches_stored_welch": true + } + }, + "protein_cold": { + "gifflarESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.21071117805914696, + 0.20452460419269286, + 0.20736334716689458 + ], + "mean": 0.20753304313957813, + "sample_sd": 0.003096775999912164, + "formatted_4dp": "0.2075 \u00b1 0.0031", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.033341110292334414, + "ci95": [ + 0.018136314435884517, + 0.04854590614878431 + ], + "p_two_sided": 0.007056963860288863, + "df": 2.722200349034115, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "arithmetic_matches_stored_welch": true + }, + "sweetnetESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.17540362192512995, + 0.17885413788754334, + 0.1751495179530837 + ], + "mean": 0.17646909258858567, + "sample_sd": 0.002069413688877239, + "formatted_4dp": "0.1765 \u00b1 0.0021", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.06440506084332687, + "ci95": [ + 0.048189258396257255, + 0.08062086329039647 + ], + "p_two_sided": 0.002280402507870895, + "df": 2.3314545156291864, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "arithmetic_matches_stored_welch": true + } + }, + "doubly_cold": { + "gifflarESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.11921097272627695, + 0.18740125661964038, + 0.1870032588662378 + ], + "mean": 0.16453849607071838, + "sample_sd": 0.03925529110780597, + "formatted_4dp": "0.1645 \u00b1 0.0393", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": 0.01399461436977184, + "ci95": [ + -0.08144720467260831, + 0.10943643341215199 + ], + "p_two_sided": 0.6008104918014349, + "df": 2.0635852965340957, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "arithmetic_matches_stored_welch": true + }, + "sweetnetESM": { + "seed_order": [ + 42, + 43, + 44 + ], + "values": [ + 0.22493144339363638, + 0.22793936767579281, + 0.2135711858019845 + ], + "mean": 0.22214733229047123, + "sample_sd": 0.00757790330934514, + "formatted_4dp": "0.2221 \u00b1 0.0076", + "welch_versus_bertosebind": { + "delta_bertosebind_minus_comparator": -0.04361422184998101, + "ci95": [ + -0.05909579015892234, + -0.028132653541039675 + ], + "p_two_sided": 0.0021092157995203854, + "df": 3.4438630973535296, + "interpretation": "seed-only uncertainty on the fixed test data; unadjusted" + }, + "arithmetic_matches_stored_welch": true + } + } + }, + "primary_receipts": { + "original_seed42_A_glycan_gifflarESM": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_A_glycan_gifflarESM.json", + "sha256": "d7f21b8037172e6d42fb65c8169d37b19c385d68dc9cbebadbafe9e930843074", + "bytes": 903 + }, + "original_seed42_A_glycan_sweetnetESM": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_A_glycan_sweetnetESM.json", + "sha256": "eca94bfbe82bfba95c2086c9c4ffe14091d442017356394ec2e75173cb66810f", + "bytes": 906 + }, + "original_seed42_B_protein_gifflarESM": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_B_protein_gifflarESM.json", + "sha256": "529296c1388651b4451f35829d0caa63e692a96fc88b74ee9b8dc8c1d09136da", + "bytes": 905 + }, + "original_seed42_B_protein_sweetnetESM": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_B_protein_sweetnetESM.json", + "sha256": "6f0098947aa4c962f991d1e17acc17707d7cb2eb5e9d6338182d6cfa65d28a2d", + "bytes": 908 + }, + "original_seed42_C_doubly_gifflarESM": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_C_doubly_gifflarESM.json", + "sha256": "bf720edacbad09cd04c42df7cf347dd1fe9846a22f307f7be1c38f06e89faa44", + "bytes": 900 + }, + "original_seed42_C_doubly_sweetnetESM": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/bertosebind_new_runs_20260927/remote_evidence/affinose_gifflar_macro_C_doubly_sweetnetESM.json", + "sha256": "1884d744232b56c5edc76e655cf9bd117e43d8d749c98300b528ea6a5e55b75d", + "bytes": 900 + } + }, + "new_seed_primary_receipts": [ + { + "arm": "A_glycan", + "variant": "gifflarESM", + "seed": 43, + "macro_eligibility_corrected": 0.252077, + "rows_total": 37315, + "rows_scored": 36635, + "assays_eligible": 1767, + "assays_scored": 1687, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 9.999999999732445e-07, + "denominator_rescale_abs_rounding_residual": 1.3469156762146994e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_gifflarESM_s43.json", + "sha256": "2c494ac1351d4ff63828139eac004c0047dc3259d62fd10334d5a740cab9182f", + "bytes": 927 + } + }, + { + "arm": "A_glycan", + "variant": "gifflarESM", + "seed": 44, + "macro_eligibility_corrected": 0.275437, + "rows_total": 37315, + "rows_scored": 36635, + "assays_eligible": 1767, + "assays_scored": 1687, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 3.5880022636325393e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_gifflarESM_s44.json", + "sha256": "82173016b893cb2913e90e99feea5f6f4ff22cff9e1aff0fe7dc136161c7f627", + "bytes": 927 + } + }, + { + "arm": "A_glycan", + "variant": "sweetnetESM", + "seed": 43, + "macro_eligibility_corrected": 0.292708, + "rows_total": 37315, + "rows_scored": 36635, + "assays_eligible": 1767, + "assays_scored": 1687, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 6.112054329321381e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=38-step=134238.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json", + "sha256": "ac58a83969a0ffb860cf1a33a472f4cb5b3e14f25097c3ba909f7555f65aa589", + "bytes": 933 + } + }, + { + "arm": "A_glycan", + "variant": "sweetnetESM", + "seed": 44, + "macro_eligibility_corrected": 0.261029, + "rows_total": 37315, + "rows_scored": 36635, + "assays_eligible": 1767, + "assays_scored": 1687, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 3.5880022636325393e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=37-step=130796.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json", + "sha256": "d2d2d73c834a2fcca7b8c22fd6ce91907f18866443628c2c54f8b8ec04477803", + "bytes": 933 + } + }, + { + "arm": "B_protein", + "variant": "gifflarESM", + "seed": 43, + "macro_eligibility_corrected": 0.20452, + "rows_total": 38556, + "rows_scored": 36957, + "assays_eligible": 246, + "assays_scored": 233, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 1.2195121940061782e-08, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/weights/epoch=48-step=168756.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_gifflarESM_s43.json", + "sha256": "7b0a01a1acc7e2ca80a3de9aaab02941942ead519e6661abec6c44c7fa5fd079", + "bytes": 929 + } + }, + { + "arm": "B_protein", + "variant": "gifflarESM", + "seed": 44, + "macro_eligibility_corrected": 0.207397, + "rows_total": 38556, + "rows_scored": 36957, + "assays_eligible": 246, + "assays_scored": 233, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 4.796747967716897e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/weights/epoch=37-step=130872.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_gifflarESM_s44.json", + "sha256": "f2e40d306b767e6949c02304077a08398dc16ac19d08d94937f7dc49abd7cc24", + "bytes": 930 + } + }, + { + "arm": "B_protein", + "variant": "sweetnetESM", + "seed": 43, + "macro_eligibility_corrected": 0.178855, + "rows_total": 38556, + "rows_scored": 36957, + "assays_eligible": 246, + "assays_scored": 233, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 3.252032518274994e-08, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=42-step=148092.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_sweetnetESM_s43.json", + "sha256": "e13c8021d6e94b3bd6cb4ef00d7456c182449f57c4b1356256e011805a6efdbf", + "bytes": 935 + } + }, + { + "arm": "B_protein", + "variant": "sweetnetESM", + "seed": 44, + "macro_eligibility_corrected": 0.175171, + "rows_total": 38556, + "rows_scored": 36957, + "assays_eligible": 246, + "assays_scored": 233, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 4.6341463413868134e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=48-step=168756.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_B_protein_sweetnetESM_s44.json", + "sha256": "d274d35c9a0ba25e4597cdb8c01001f4f7ff7760aabfe7c8a00b84a70b74252f", + "bytes": 935 + } + }, + { + "arm": "C_doubly", + "variant": "gifflarESM", + "seed": 43, + "macro_eligibility_corrected": 0.187401, + "rows_total": 3691, + "rows_scored": 3533, + "assays_eligible": 212, + "assays_scored": 201, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 2.1226415092279183e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/weights/epoch=8-step=51624.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_gifflarESM_s43.json", + "sha256": "2208056d5303fda27c5b541eed1c6f64cb03de1c10abd2868d4ce55d1bdb475c", + "bytes": 922 + } + }, + { + "arm": "C_doubly", + "variant": "gifflarESM", + "seed": 44, + "macro_eligibility_corrected": 0.187003, + "rows_total": 3691, + "rows_scored": 3533, + "assays_eligible": 212, + "assays_scored": 201, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 0.0, + "denominator_rescale_abs_rounding_residual": 4.716981111263507e-09, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/weights/epoch=6-step=40152.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_gifflarESM_s44.json", + "sha256": "c831378d73c3c2c9456be5ff9ff05acc34b64815b056c5df21bef2078a415393", + "bytes": 922 + } + }, + { + "arm": "C_doubly", + "variant": "sweetnetESM", + "seed": 43, + "macro_eligibility_corrected": 0.227939, + "rows_total": 3691, + "rows_scored": 3533, + "assays_eligible": 212, + "assays_scored": 201, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 9.999999999732445e-07, + "denominator_rescale_abs_rounding_residual": 6.886792452698298e-07, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=21-step=126192.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json", + "sha256": "121a30d0de568217e722036cf25ba4ef61128398fde3466fc8b2f60f096722c7", + "bytes": 929 + } + }, + { + "arm": "C_doubly", + "variant": "sweetnetESM", + "seed": 44, + "macro_eligibility_corrected": 0.213571, + "rows_total": 3691, + "rows_scored": 3533, + "assays_eligible": 212, + "assays_scored": 201, + "constant_pred_assays": 0, + "recorded_pooled_reproduction": true, + "pooled_reproduction_abs_diff": 9.999999999732445e-07, + "denominator_rescale_abs_rounding_residual": 3.3018867889866854e-08, + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/weights/epoch=6-step=40152.ckpt", + "source": { + "path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/affinose_eval/gifflar_seed_macro_20260926/affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json", + "sha256": "3d29ac377491db5d952f6066228fe4099f99db0e2fbaa80063ee429fc28e0a28", + "bytes": 927 + } + } + ] +} diff --git a/releases/2026-10-02/bertosebind_new_runs/reproduce_summary.py b/releases/2026-10-02/bertosebind_new_runs/reproduce_summary.py new file mode 100644 index 0000000000000000000000000000000000000000..ac946b7f2edf2f86d4df45701542177a29738633 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/reproduce_summary.py @@ -0,0 +1,23 @@ +"""Reproduce published scalar summaries from bundled producer receipts; no model inference.""" +from pathlib import Path +import json, statistics as st, math +from scipy.stats import t +P=Path(__file__).resolve().parent +probe=json.loads((P/'results/protein_probe.json').read_text()) +rows={} +for regime,arm in [('glycan_cold','A_glycan'),('protein_cold','B_protein'),('doubly_cold','C_doubly')]: + cells=sorted([v for v in probe['cells'].values() if v['stratum']=='test_'+regime],key=lambda v:v['seed']) + intact=[x['passes']['intact']['macro_spearman'] for x in cells] + wrong=[x['passes']['intact']['macro_spearman']-x['passes']['reassigned']['macro_spearman'] for x in cells] + mean=[x['passes']['intact']['macro_spearman']-x['passes']['meanprot']['macro_spearman'] for x in cells] + pooled=[x['passes']['intact']['pooled_spearman'] for x in cells] + def summary(v):return {'mean':st.mean(v),'sample_sd':st.stdev(v),'values':v} + rows[regime]={'reported_bertosebind':summary(intact),'wrong_protein_drop':summary(wrong),'mean_protein_drop':summary(mean),'pooled_bertosebind':summary(pooled),'gifflar':{}} + for variant in ['gifflarESM','sweetnetESM']: + v=[] + for seed in [42,43,44]: + path=P/(f'executed/remote/affinose_gifflar_macro_{arm}_{variant}.json' if seed==42 else f'results/gifflar/affinose_gifflar_macro_{arm}_{variant}_s{seed}.json') + receipt=json.loads(path.read_text());assert receipt['pooled_reproduces_gifflar'];v.append(receipt['macro_eligibility_corrected']) + q=summary(v);u=st.variance(intact)/3;w=st.variance(v)/3;se=math.sqrt(u+w);df=(u+w)**2/(u*u/2+w*w/2);delta=st.mean(intact)-st.mean(v);half=t.ppf(.975,df)*se + q['welch_seed_only']={'delta_bertosebind_minus_comparator':delta,'ci95':[delta-half,delta+half],'p_two_sided':float(2*t.sf(abs(delta/se),df))};rows[regime]['gifflar'][variant]=q +print(json.dumps({'convention':'original GIFFLAR producer scores, sampleSD; seed-only unadjusted Welch on fixed test data, not test-set uncertainty','seed_order':[42,43,44],'regimes':rows},indent=2)) diff --git a/releases/2026-10-02/bertosebind_new_runs/requirements.txt b/releases/2026-10-02/bertosebind_new_runs/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..64953fbfea98c6799fb0d6de17c54befb7c2e109 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/requirements.txt @@ -0,0 +1,4 @@ +# Portable summaries and exposure join; historical GPU environments remain external. +numpy +pandas +scipy diff --git a/releases/2026-10-02/bertosebind_new_runs/results/doubly_cold_anatomy.json b/releases/2026-10-02/bertosebind_new_runs/results/doubly_cold_anatomy.json new file mode 100644 index 0000000000000000000000000000000000000000..449d76466877b8c6a4288f5fde3bb910e088b504 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/doubly_cold_anatomy.json @@ -0,0 +1,351 @@ +{ + "schema": "bertosebind_doubly_cold_anatomy_v1", + "gates": { + "A_glycan": { + "recomputed": [ + 0.3341, + 0.3184, + 0.3355 + ], + "published": [ + 0.3341, + 0.3184, + 0.3355 + ], + "pass": true + }, + "B_protein": { + "recomputed": [ + 0.2326, + 0.2451, + 0.2449 + ], + "published": [ + 0.2326, + 0.2451, + 0.2449 + ], + "pass": true + }, + "C_doubly": { + "recomputed": [ + 0.1773, + 0.184, + 0.1743 + ], + "published": [ + 0.1773, + 0.184, + 0.1743 + ], + "pass": true + }, + "lectinoracle_C": { + "recomputed": [ + 0.1701, + 0.1972, + 0.1995 + ], + "published": [ + 0.1701, + 0.1972, + 0.1995 + ], + "pass": true + } + }, + "regimes": { + "A_glycan": { + "data": { + "test_rows": 37295, + "size_unparsed_test_rows": 0, + "eligible_assays": 1767, + "test_glycans": 336, + "test_proteins": 1088, + "train_rows": 484491, + "train_glycans": 1911, + "train_proteins": 1666, + "strata_rows": { + "fit_train": 484653, + "test_glycan_cold": 37315, + "val_glycan_cold": 36757 + }, + "distinct_panels": 149, + "largest_panel_assays": 429, + "largest_panel_share": 0.2428, + "kish_effective_panels": 8.9, + "kish_effective_glycans": 70.9, + "median_rows_per_assay": 26.0, + "size_train_mean": 4.71, + "size_test_mean": 9.93, + "size_train_share_gt12": 0.0332, + "size_test_share_gt12": 0.3036, + "size_test_share_above_train_p95": 0.352, + "size_test_share_above_train_p99": 0.1523, + "size_test_share_above_train_max": 0.0238, + "size_ks_D_train_vs_test": 0.4926, + "within_assay_size_sd_mean": 4.45, + "size_rule_macro_residue_count": 0.243, + "size_rule_macro_token_count": 0.2449, + "similarity_to_training": { + "distinct_test_glycans": 336, + "distinct_train_glycans": 1911, + "nearest_cosine_mean": 0.8804, + "nearest_cosine_median": 0.9745, + "share_exact_composition_in_training": 0.1577, + "share_nearest_below_0.9": 0.2798 + } + }, + "model": { + "bertosebind_macro_seed_mean": 0.3293, + "wrong_protein_macro": 0.1572, + "mean_protein_macro": 0.2533, + "prediction_size_reliance": 0.2581, + "target_size_reliance": 0.243, + "protein_dependence_wrong_minus_intact": -0.1721, + "size_overuse_ratio": 1.06, + "assays_bertosebind_beats_size_rule": "1004/1767" + } + }, + "B_protein": { + "data": { + "test_rows": 38539, + "size_unparsed_test_rows": 0, + "eligible_assays": 246, + "test_glycans": 826, + "test_proteins": 235, + "train_rows": 480431, + "train_glycans": 2579, + "train_proteins": 1191, + "strata_rows": { + "fit_train": 480596, + "val_protein_cold": 39489, + "test_protein_cold": 38556 + }, + "distinct_panels": 77, + "largest_panel_assays": 52, + "largest_panel_share": 0.2114, + "kish_effective_panels": 13.7, + "kish_effective_glycans": 241.6, + "median_rows_per_assay": 164.0, + "size_train_mean": 5.58, + "size_test_mean": 4.53, + "size_train_share_gt12": 0.0734, + "size_test_share_gt12": 0.0359, + "size_test_share_above_train_p95": 0.0221, + "size_test_share_above_train_p99": 0.0054, + "size_test_share_above_train_max": 0.0, + "size_ks_D_train_vs_test": 0.1274, + "within_assay_size_sd_mean": 2.762, + "size_rule_macro_residue_count": -0.0194, + "size_rule_macro_token_count": -0.0147, + "similarity_to_training": { + "distinct_test_glycans": 826, + "distinct_train_glycans": 2579, + "nearest_cosine_mean": 0.9999, + "nearest_cosine_median": 1.0, + "share_exact_composition_in_training": 0.9988, + "share_nearest_below_0.9": 0.0 + } + }, + "model": { + "bertosebind_macro_seed_mean": 0.2409, + "wrong_protein_macro": 0.1718, + "mean_protein_macro": 0.2056, + "prediction_size_reliance": -0.0839, + "target_size_reliance": -0.0194, + "protein_dependence_wrong_minus_intact": -0.0691, + "size_overuse_ratio": 4.32, + "assays_bertosebind_beats_size_rule": "213/246" + } + }, + "C_doubly": { + "data": { + "test_rows": 3691, + "size_unparsed_test_rows": 0, + "eligible_assays": 212, + "test_glycans": 173, + "test_proteins": 212, + "train_rows": 406483, + "train_glycans": 1911, + "train_proteins": 1191, + "strata_rows": { + "fit_train": 406616, + "val_doubly_cold": 3822, + "test_doubly_cold": 3691 + }, + "distinct_panels": 40, + "largest_panel_assays": 88, + "largest_panel_share": 0.4151, + "kish_effective_panels": 5.0, + "kish_effective_glycans": 32.9, + "median_rows_per_assay": 25.0, + "size_train_mean": 4.75, + "size_test_mean": 8.56, + "size_train_share_gt12": 0.0327, + "size_test_share_gt12": 0.2284, + "size_test_share_above_train_p95": 0.2674, + "size_test_share_above_train_p99": 0.1192, + "size_test_share_above_train_max": 0.0005, + "size_ks_D_train_vs_test": 0.4534, + "within_assay_size_sd_mean": 3.678, + "size_rule_macro_residue_count": 0.2178, + "size_rule_macro_token_count": 0.2242, + "similarity_to_training": { + "distinct_test_glycans": 173, + "distinct_train_glycans": 1911, + "nearest_cosine_mean": 0.897, + "nearest_cosine_median": 0.9762, + "share_exact_composition_in_training": 0.1561, + "share_nearest_below_0.9": 0.3064 + } + }, + "model": { + "bertosebind_macro_seed_mean": 0.1785, + "wrong_protein_macro": 0.1724, + "mean_protein_macro": 0.1865, + "prediction_size_reliance": 0.2028, + "target_size_reliance": 0.2178, + "protein_dependence_wrong_minus_intact": -0.0061, + "size_overuse_ratio": 0.93, + "assays_bertosebind_beats_size_rule": "99/212" + } + } + }, + "lectinoracle_assay_ids_match": true, + "doubly_cold_head_to_head": { + "macro_bertosebind": 0.1785, + "macro_lectinoracle": 0.1889, + "macro_size_rule": 0.2178, + "vs_lectinoracle": { + "gap": -0.0104, + "largest_panel_contribution": 0.003, + "five_most_negative_panels": [ + { + "panel": "54d602012bed", + "assays": 26, + "contribution": -0.0154 + }, + { + "panel": "ffe19aef8e05", + "assays": 9, + "contribution": -0.0112 + }, + { + "panel": "2317ccf9206c", + "assays": 2, + "contribution": -0.0029 + }, + { + "panel": "b22ad3ee5d72", + "assays": 2, + "contribution": -0.0027 + }, + { + "panel": "085b3af87cb9", + "assays": 7, + "contribution": -0.0015 + } + ], + "gap_without_largest_panel": -0.0229 + }, + "vs_size_rule": { + "gap": -0.0393, + "largest_panel_contribution": -0.0242, + "five_most_negative_panels": [ + { + "panel": "e48f24eb7cd0", + "assays": 88, + "contribution": -0.0242 + }, + { + "panel": "54d602012bed", + "assays": 26, + "contribution": -0.0237 + }, + { + "panel": "74a3b8af56e6", + "assays": 12, + "contribution": -0.0063 + }, + { + "panel": "2317ccf9206c", + "assays": 2, + "contribution": -0.0055 + }, + { + "panel": "669b117dea0e", + "assays": 8, + "contribution": -0.0054 + } + ], + "gap_without_largest_panel": -0.0258 + }, + "panel_bootstrap": { + "bb_minus_lo": { + "ci95": [ + -0.0701, + 0.0388 + ], + "p_positive": 0.3405, + "sd": 0.0268 + }, + "bb_minus_size": { + "ci95": [ + -0.0932, + 0.0558 + ], + "p_positive": 0.1515, + "sd": 0.0362 + }, + "lo_minus_size": { + "ci95": [ + -0.0737, + 0.0682 + ], + "p_positive": 0.2152, + "sd": 0.0356 + } + }, + "assay_bootstrap_ignoring_panels": { + "bb_minus_lo": { + "ci95": [ + -0.0502, + 0.0293 + ], + "sd": 0.0204 + }, + "bb_minus_size": { + "ci95": [ + -0.102, + 0.0223 + ], + "sd": 0.0317 + } + }, + "design_effect_sd_ratio": { + "bb_minus_lo": 1.31, + "bb_minus_size": 1.14 + }, + "bertosebind_rank_among_3_distribution": { + "1": 0.0801, + "2": 0.3318, + "3": 0.5881 + }, + "size_informative_split": { + "size_rule_median_rho": 0.2736, + "size_informative_half": { + "assays": 106, + "bertosebind": 0.2121, + "size_rule": 0.4739, + "lectinoracle": 0.243 + }, + "size_uninformative_half": { + "assays": 106, + "bertosebind": 0.1449, + "size_rule": -0.0383, + "lectinoracle": 0.1348 + } + } + } +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/results/doubly_cold_per_assay.csv b/releases/2026-10-02/bertosebind_new_runs/results/doubly_cold_per_assay.csv new file mode 100644 index 0000000000000000000000000000000000000000..a50047a55fb418e0a211fb364b689262e46e94ef --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/doubly_cold_per_assay.csv @@ -0,0 +1,213 @@ +assay,panel,rows,bertosebind,lectinoracle,size_rule +cg_235,44600a718d01,31,0.3525674367059623,0.46384408602150545,0.489396890194087 +gw_row_0002,e48f24eb7cd0,26,0.5255373272016847,0.39737891737891734,0.5648584100236232 +gw_row_0005,e48f24eb7cd0,26,0.3929509575471282,0.025641025641025637,0.4212386926331885 +gw_row_0010,e48f24eb7cd0,26,0.401292726822636,0.3103133903133903,0.3415263136030909 +gw_row_0038,54d602012bed,5,-0.3,-0.6333333333333333,0.35909242322980395 +gw_row_0039,ffe19aef8e05,9,-0.3111111111111111,0.11666666666666665,0.10084389681792215 +gw_row_0043,0a35ae266856,9,0.08888888888888889,0.3499999999999999,-0.01695158759052026 +gw_row_0048,54d602012bed,5,0.39999999999999997,0.2333333333333333,0.10259783520851543 +gw_row_0059,e48f24eb7cd0,26,0.3732418788075729,0.4981196581196581,0.5332483286841017 +gw_row_0134,e48f24eb7cd0,26,0.2034188034188034,0.30962962962962964,0.365921050289026 +gw_row_0141,e48f24eb7cd0,26,0.30461538461538457,0.12911680911680912,0.14636842011561038 +gw_row_0142,54d602012bed,5,-0.6,0.03333333333333333,0.8720815992723809 +gw_row_0143,e48f24eb7cd0,26,0.21795145254612094,0.06233618233618233,0.15701964317566655 +gw_row_0144,e48f24eb7cd0,26,0.00831622397149927,0.015612535612535611,0.3339673811088575 +gw_row_0145,e48f24eb7cd0,26,0.20686083338404324,0.40056980056980046,0.38791067209043223 +gw_row_0146,e48f24eb7cd0,26,0.13835322910132544,-0.13504273504273503,0.06287657483839601 +gw_row_0148,e48f24eb7cd0,26,0.28136752136752136,0.46985754985754985,0.4140233479796022 +gw_row_0184,e48f24eb7cd0,26,0.5060968660968661,0.282051282051282,0.5061048892729908 +gw_row_0242,e48f24eb7cd0,26,0.13618309611128834,0.17037037037037037,0.27212156979240243 +gw_row_0243,e48f24eb7cd0,26,0.13585191323081203,0.2656410256410256,-0.07902520334880374 +gw_row_0244,e48f24eb7cd0,26,0.3432638802119326,0.4144729344729345,0.2697164549078736 +gw_row_0245,2317ccf9206c,12,-0.2840446021322795,-0.03755961681087993,0.17762017361368734 +gw_row_0247,e48f24eb7cd0,26,-0.11111111111111109,-0.1316239316239316,0.30648035385709965 +gw_row_0250,e48f24eb7cd0,26,0.5541880341880342,0.5092877492877492,0.352521124503794 +gw_row_0254,54d602012bed,5,-0.7333333333333333,0.0,0.8207826816681234 +gw_row_0267,54d602012bed,5,0.36666666666666664,0.16666666666666666,0.10259783520851543 +gw_row_0268,ffe19aef8e05,9,0.17222222222222225,0.5555555555555557,0.7899438584070568 +gw_row_0282,ffe19aef8e05,9,0.6888888888888888,0.7555555555555555,0.46220119374880986 +gw_row_0286,54d602012bed,5,0.36666666666666664,0.5333333333333333,0.15389675281277312 +gw_row_0288,ffe19aef8e05,9,-0.20555555555555557,0.21666666666666667,0.2605134001129656 +gw_row_0293,669b117dea0e,11,0.021212121212121213,0.2090909090909091,0.13334214206279385 +gw_row_0311,0a35ae266856,9,-0.3333333333333333,-0.022222222222222216,-0.01695158759052026 +gw_row_0317,e48f24eb7cd0,26,0.3244444444444444,0.4247293447293447,0.1549581161317847 +gw_row_0322,74a3b8af56e6,5,0.2333333333333333,0.0,0.09999999999999999 +gw_row_0326,e48f24eb7cd0,26,0.45111038528195135,0.04296296296296295,0.3044188268132178 +gw_row_0328,e48f24eb7cd0,26,0.45033413102110265,0.24535612535612536,0.47518198361476327 +gw_row_0336,e48f24eb7cd0,26,0.06474041241254595,-0.09811965811965812,0.3731363949426124 +gw_row_0339,e48f24eb7cd0,26,0.1070214073446611,0.07532763532763531,0.28655225909957527 +gw_row_0340,296b50909f6c,14,-0.5099141546421789,-0.3193399786716689,-0.10819983564450335 +gw_row_0348,e48f24eb7cd0,26,-0.03555803019598964,0.12410256410256408,0.31335211067003915 +gw_row_0350,639e1cba9a7c,5,0.8198915917499229,0.8571593913749194,-0.05892556509887895 +gw_row_0360,54d602012bed,5,0.2333333333333333,0.6333333333333333,0.6668859288553503 +gw_row_0361,e48f24eb7cd0,26,0.09698005698005696,0.19156695156695158,0.25253706287552496 +gw_row_0363,74a3b8af56e6,5,-0.033333333333333326,-0.6,0.39999999999999997 +gw_row_0370,b2d371841d66,25,0.33945049841659075,0.504270270148912,0.0075420098256403145 +gw_row_0397,e48f24eb7cd0,26,-0.09698005698005696,-0.06689458689458688,-0.042604892240224616 +gw_row_0401,e48f24eb7cd0,26,0.29641025641025637,0.33059829059829055,0.23638843436511725 +gw_row_0421,e48f24eb7cd0,26,0.20764896738575167,-0.04524216524216523,0.4002798343537232 +gw_row_0423,1ea7c2b6556f,27,0.42780464862776163,0.38156288156288154,0.27374953637032495 +gw_row_0425,e48f24eb7cd0,26,0.20592592592592593,0.2667806267806268,0.36420311108579106 +gw_row_0431,e48f24eb7cd0,26,0.5054057085648326,0.45253561253561253,0.4672794632798829 +gw_row_0439,502d330d3600,7,0.22619047619047625,0.059523809523809534,-0.4076871241636057 +gw_row_0440,39ad00ac6e31,7,-0.1785714285714286,0.23809523809523814,-0.46848748060169076 +gw_row_0468,e48f24eb7cd0,26,0.2676923076923077,0.1578347578347578,0.478617862021233 +gw_row_0472,8d1a16c280a6,32,0.4139291961677743,0.5760809451187173,0.27652705334163796 +gw_row_0477,e48f24eb7cd0,26,0.5819487140526461,0.535042735042735,0.25906523184781743 +gw_row_0481,54d602012bed,5,0.4666666666666666,0.03333333333333333,-0.35909242322980395 +gw_row_0483,e48f24eb7cd0,26,0.18724217644628757,0.35361823361823363,0.04982023689381105 +gw_row_0489,54d602012bed,5,0.03333333333333334,0.6333333333333333,0.35909242322980395 +gw_row_0494,e48f24eb7cd0,26,0.17538461538461536,0.14757834757834756,-0.01992809475752442 +gw_row_0507,e48f24eb7cd0,26,0.5426821578293636,0.5712820512820512,0.5895967345502052 +gw_row_0517,74a3b8af56e6,5,-0.26666666666666666,-0.5333333333333333,0.39999999999999997 +gw_row_0518,8394ba3fe216,11,0.09393939393939395,0.12424242424242425,0.7494747984908758 +gw_row_0520,e48f24eb7cd0,26,0.32459817417356956,0.38301994301994297,0.163891399988606 +gw_row_0523,b99bae262729,30,0.2804983997944984,0.11798294401186504,0.3929357168981138 +gw_row_0524,e48f24eb7cd0,26,0.08262108262108261,0.11247863247863248,0.4648743483953542 +gw_row_0538,87fa69ed4d0d,9,0.12803158415571483,-0.20083160441856088,-0.12060453783110545 +gw_row_0557,e48f24eb7cd0,26,0.5115557754769715,0.11407407407407406,0.4470077806817115 +gw_row_0565,e48f24eb7cd0,26,0.07487179487179486,0.12364672364672365,0.1937835421248926 +gw_row_0567,54d602012bed,5,-0.7666666666666666,-0.4333333333333333,0.8207826816681234 +gw_row_0574,ffe19aef8e05,9,0.30000000000000004,0.13333333333333333,0.033614632272640714 +gw_row_0575,87b8c6e32516,10,0.7575757575757575,0.7979797979797979,0.6646465023178235 +gw_row_0587,c739f761495e,6,0.1037886172691191,-0.009523809523809525,0.14285714285714288 +gw_row_0592,e48f24eb7cd0,26,0.4393162393162393,0.48398860398860394,0.4346386184184205 +gw_row_0604,50a2be6ea0f2,11,0.017253382575906067,0.16247247889198468,0.21325347327567878 +gw_row_0605,74a3b8af56e6,5,-0.4666666666666666,-0.4333333333333332,0.8999999999999998 +gw_row_0647,e48f24eb7cd0,26,0.5174928774928774,0.2672364672364672,0.7105396544579395 +gw_row_0652,fe3ae2b061c4,30,0.37020200223298416,0.289284390063033,0.3111068443077575 +gw_row_0653,669b117dea0e,11,0.2636363636363636,0.296969696969697,0.2804782988217388 +gw_row_0655,54d602012bed,5,-0.33333333333333326,0.6666666666666666,0.6155870112510925 +gw_row_0656,d26dabf445d5,15,-0.12738095238095237,-0.29047619047619044,-0.2371259211688388 +gw_row_0663,54d602012bed,5,-0.2333333333333333,-0.3,-0.6668859288553503 +gw_row_0664,54d602012bed,5,4.625929269271485e-18,-0.13333333333333333,0.35909242322980395 +gw_row_0665,54d602012bed,5,4.625929269271485e-18,-0.13333333333333333,0.35909242322980395 +gw_row_0729,1ea7c2b6556f,27,0.18468387507014847,0.03642653642653642,0.6383397260653317 +gw_row_0735,54d602012bed,5,-0.4666666666666666,-0.4333333333333333,0.8207826816681234 +gw_row_0740,e48f24eb7cd0,26,0.11566951566951567,0.5282051282051282,0.04810229769057619 +gw_row_0746,085b3af87cb9,6,0.42857142857142866,-0.20000000000000004,-0.8406680016960504 +gw_row_0750,e48f24eb7cd0,26,0.18839249453265047,0.03817663817663817,0.41780281422671883 +gw_row_0772,6640d84de47e,15,0.23466108033789168,0.21583799902736558,-0.1956323229223785 +gw_row_0775,e48f24eb7cd0,26,0.09436485893701445,-0.19316239316239314,0.20065529893783207 +gw_row_0777,e48f24eb7cd0,26,0.5197720797720797,0.4776068376068376,0.6847705664094166 +gw_row_0780,669b117dea0e,11,0.5090909090909091,0.4484848484848485,0.482790514365288 +gw_row_0782,e48f24eb7cd0,26,-0.08901190969420213,-0.3048433048433048,0.07490214926104007 +gw_row_0787,085b3af87cb9,6,-0.10476190476190476,-0.48571428571428577,-0.5797710356524485 +gw_row_0790,085b3af87cb9,6,0.10476190476190476,0.5047619047619049,0.05797710356524484 +gw_row_0792,669b117dea0e,11,-0.23636363636363636,-0.34242424242424246,0.041382044088453265 +gw_row_0795,54d602012bed,5,0.6,0.3333333333333333,-0.10259783520851543 +gw_row_0833,e48f24eb7cd0,26,0.3887179487179487,0.48968660968660965,0.18931690019648195 +gw_row_0836,1ea7c2b6556f,27,0.17647266012181828,0.1756206756206756,0.20500525817867385 +gw_row_0847,669b117dea0e,11,0.4564165030018505,0.3303030303030304,0.39083041639094745 +gw_row_0858,e48f24eb7cd0,26,0.6949702787407794,0.7037037037037037,0.4095567060511915 +gw_row_0861,e48f24eb7cd0,26,-0.17789173789173787,-0.10928774928774927,0.2734959211549903 +gw_row_0862,e48f24eb7cd0,26,0.14462156147379093,0.07418803418803417,0.3198802796423316 +gw_row_0874,74a3b8af56e6,5,-0.06666666666666667,0.16666666666666666,0.09999999999999999 +gw_row_0879,e48f24eb7cd0,26,0.26887298894528266,0.29618233618233614,0.5569558896887428 +gw_row_0884,e48f24eb7cd0,26,0.059369360282536275,0.3048433048433048,0.45972053078564956 +gw_row_0885,54d602012bed,5,-0.19999999999999998,-0.09999999999999999,-0.05129891760425771 +gw_row_0890,e48f24eb7cd0,26,0.0807977207977208,0.11794871794871793,0.2807112658085767 +gw_row_0893,e48f24eb7cd0,26,0.30920664148695337,0.26267806267806265,0.5717301668365626 +gw_row_0898,3a5caba0fa7d,5,-0.6668859288553501,-0.08549819600709618,0.41039134083406165 +gw_row_0908,e48f24eb7cd0,26,0.11692919532540998,0.18199430199430197,0.24807042094711432 +gw_row_0912,d26dabf445d5,15,0.05119047619047618,-0.06428571428571428,-0.17196154588579915 +gw_row_0913,e48f24eb7cd0,26,0.18248799089368725,0.09834757834757833,0.05840993290998536 +gw_row_1001,74a3b8af56e6,5,-0.19999999999999996,-0.7333333333333333,0.49999999999999994 +gw_row_1005,085b3af87cb9,6,0.3922837243913639,0.46666666666666673,0.4928053803045812 +gw_row_1007,e48f24eb7cd0,26,0.4701168220260876,0.5409686609686609,0.40096701003501717 +gw_row_1008,e48f24eb7cd0,26,0.21630561029730014,0.2385185185185185,0.46075129430759043 +gw_row_1015,e48f24eb7cd0,26,0.4554985754985755,0.3476923076923077,0.25597294128199466 +gw_row_1023,39ad00ac6e31,7,0.22619047619047625,-0.02380952380952382,0.198206241793023 +gw_row_1029,0a35ae266856,9,-0.06666666666666667,-0.29444444444444445,-0.45769286494404704 +gw_row_1030,54d602012bed,5,0.09999999999999999,-0.09999999999999999,-0.6668859288553503 +gw_row_1038,54d602012bed,5,0.5666666666666665,0.36666666666666664,-0.6668859288553503 +gw_row_1046,1ea7c2b6556f,27,0.48789279124278867,0.5207738282645145,0.430199263045039 +gw_row_1050,39ad00ac6e31,7,0.3809523809523811,-0.10714285714285716,0.30631873731649006 +gw_row_1063,b22ad3ee5d72,7,-0.012354155277685007,0.2841455713867555,-0.3019405424385589 +gw_row_1067,b22ad3ee5d72,7,2.3129646346357427e-18,0.2841455713867555,-0.3019405424385589 +gw_row_1107,669b117dea0e,11,-0.3242424242424243,0.06363636363636364,0.49658452906143913 +gw_row_1117,09912eefb9ad,6,0.48571428571428577,-0.08571428571428573,0.46291004988627577 +gw_row_1118,74a3b8af56e6,5,0.2666666666666666,-0.03333333333333335,-0.7999999999999999 +gw_row_1128,54d602012bed,5,-0.16666666666666666,-0.16666666666666666,0.15389675281277312 +gw_row_1160,8911b4d8e023,19,0.5684432503111663,0.463527915184792,0.29643045764729437 +gw_row_1181,e48f24eb7cd0,26,0.4198558327106064,0.15692307692307692,0.27521386035822515 +gw_row_1192,e48f24eb7cd0,26,0.30074074074074075,0.41698005698005697,0.31781875259844977 +gw_row_1212,54d602012bed,5,-0.033333333333333326,-0.6333333333333332,-0.46169025843831935 +gw_row_1215,e48f24eb7cd0,26,0.46438746438746437,0.5001709401709401,0.16973239327960454 +gw_row_1223,e48f24eb7cd0,26,0.3963740087739209,0.01219373219373219,0.44872571988494636 +gw_row_1243,e48f24eb7cd0,26,-0.06700689075313838,-0.06142450142450142,-0.06665604108551271 +gw_row_1259,cfe6d8ecdc50,54,0.024159356594689235,0.08809519991314563,0.32535663532643677 +gw_row_1287,39ad00ac6e31,7,0.03571428571428572,0.5952380952380953,0.07207499701564472 +gw_row_1291,1ea7c2b6556f,27,0.06736332051196281,-0.08587708587708587,0.5815643177374055 +gw_row_1293,0a35ae266856,9,0.2888888888888889,0.4611111111111111,0.5763539780776888 +gw_row_1299,74a3b8af56e6,5,0.13333333333333328,0.6,-0.6 +gw_row_1302,f1e3f64214ad,30,0.4211345939933259,0.571227289581016,0.5511150750166044 +gw_row_1309,e48f24eb7cd0,26,0.21596355458720007,0.3627350427350427,0.5418380247002761 +gw_row_1314,669b117dea0e,11,0.3666666666666667,0.3060606060606061,0.17012618125253007 +gw_row_1320,54d602012bed,5,-0.36666666666666664,0.03333333333333333,0.6668859288553503 +gw_row_1321,e48f24eb7cd0,26,0.4592869674379778,0.4985754985754985,0.201686062459773 +gw_row_1322,39ad00ac6e31,7,0.380952380952381,0.20238095238095244,0.4504687313477795 +gw_row_1324,ffe19aef8e05,9,0.5277777777777777,0.8388888888888889,0.6134670389756931 +gw_row_1336,6b73214a52cf,14,0.05054945054945056,-0.09597069597069598,0.05980246131979694 +gw_row_1339,39ad00ac6e31,7,0.023809523809523763,-0.04761904761904762,-0.36037498507822363 +gw_row_1341,085b3af87cb9,6,-0.3149809196377041,0.08571428571428573,-0.05797710356524484 +gw_row_1347,c64e05ca1b07,8,0.10317460317460318,0.07936507936507937,-0.19518001458970666 +gw_row_1350,d26dabf445d5,15,0.3,0.10476190476190474,0.21540446274115893 +gw_row_1361,e48f24eb7cd0,26,0.1864546854613848,0.3321937321937322,0.043635655762165534 +gw_row_1362,e48f24eb7cd0,26,0.46933804099609855,0.2553846153846154,0.23020385323347173 +gw_row_1363,502d330d3600,7,0.3571428571428572,0.08333333333333333,-0.48181205582971587 +gw_row_1364,74a3b8af56e6,5,0.7999999999999998,-0.19999999999999996,-0.7999999999999999 +gw_row_1365,74a3b8af56e6,5,0.19999999999999998,0.0,-0.39999999999999997 +gw_row_1383,74a3b8af56e6,5,-0.6666666666666666,0.7999999999999999,0.8999999999999998 +gw_row_1386,fba21a6a779d,60,0.3597199980138224,0.3415872374708128,0.2692746954466072 +gw_row_1399,a867e6054507,31,0.37241753514115955,0.23158602150537635,0.2297045330492424 +gw_row_1400,e48f24eb7cd0,26,0.17630904298976466,0.19908831908831906,0.4019977735569581 +gw_row_1405,e48f24eb7cd0,26,-0.13686609686609685,-0.29549857549857544,-0.06803039244810061 +gw_row_1411,3298ed663a54,6,0.6900655593423544,-0.13801311186847087,0.10660035817780522 +gw_row_1412,e48f24eb7cd0,26,0.10427350427350428,0.04227920227920227,0.3295007391804468 +gw_row_1422,90d857115bb3,28,0.2213099799306696,0.18482028826856414,0.1190883679730181 +gw_row_1423,085b3af87cb9,6,0.009523809523809526,0.06666666666666668,-0.05797710356524484 +gw_row_1425,e48f24eb7cd0,26,0.028376068376068375,0.4883190883190882,0.28277279285245854 +gw_row_1437,0a35ae266856,9,0.4666666666666666,0.15,0.15256428831468233 +gw_row_1440,54d602012bed,5,-0.03333333333333335,0.5333333333333333,0.35909242322980395 +gw_row_1452,e48f24eb7cd0,26,-0.11910283567984181,-0.18997150997150994,0.15908117021954837 +gw_row_1499,e48f24eb7cd0,26,0.42659958832344974,0.3816524216524217,0.6456015525756618 +gw_row_1505,39ad00ac6e31,7,0.7380952380952382,0.6190476190476192,0.4504687313477795 +gw_row_1508,e48f24eb7cd0,26,0.057557398383306264,0.06962962962962961,0.10445070355667971 +gw_row_1510,39ad00ac6e31,7,0.6666666666666666,0.6904761904761907,0.30631873731649006 +gw_row_1512,77dd72454480,16,0.14124791618019145,0.19803921568627447,-0.3457837133230864 +gw_row_1514,39ad00ac6e31,7,0.21428571428571433,-0.29761904761904767,0.03603749850782236 +gw_row_1520,39ad00ac6e31,7,0.5714285714285716,0.6904761904761907,0.5405624776173354 +gw_row_1521,1ea7c2b6556f,27,0.030326502220351687,-0.20553520553520555,0.07119943098421008 +gw_row_1525,e48f24eb7cd0,26,-0.3116809116809116,-0.006039886039886033,0.3202238674829786 +gw_row_1528,e48f24eb7cd0,26,0.48398860398860394,0.4557264957264957,0.4470077806817115 +gw_row_1533,3a5caba0fa7d,5,0.4274909800354809,0.15389675281277312,0.35909242322980395 +gw_row_1534,d26dabf445d5,15,-0.32328825809851863,-0.2916666666666666,-0.2371259211688388 +gw_row_1542,085b3af87cb9,6,0.20000000000000004,0.6,0.05797710356524484 +gw_row_1543,54d602012bed,5,0.5666666666666665,0.5666666666666665,-0.8207826816681234 +gw_row_1575,ffe19aef8e05,9,-0.04444444444444445,0.3111111111111111,-0.3697609549990479 +gw_row_1581,cde89a45cf36,25,0.4910493506126634,0.6047198087740234,0.5297161040476247 +gw_row_1589,1ea7c2b6556f,27,0.29365079365079366,0.26516076516076514,0.32254569812243444 +gw_row_1592,09912eefb9ad,6,0.6184224380292783,0.47347967911616623,0.2348341091569311 +gw_row_1595,74a3b8af56e6,5,0.13333333333333333,-0.5333333333333333,0.7 +gw_row_1596,e48f24eb7cd0,26,0.6592592592592591,0.48125356125356117,0.55386359912292 +gw_row_1597,e48f24eb7cd0,26,-0.20172791279926292,-0.13139601139601137,0.040886953036989755 +gw_row_1610,e48f24eb7cd0,26,0.4908817830665099,0.5817663817663817,0.4222694561551295 +gw_row_1613,e48f24eb7cd0,26,0.08217330910335009,0.20934472934472934,0.2192090423327686 +gw_row_1625,e48f24eb7cd0,26,-0.0657535633238701,0.3285470085470085,-0.2662805765014039 +gw_row_1632,e48f24eb7cd0,26,0.3149166891360477,0.46393162393162385,0.4738076322521754 +gw_row_1634,669b117dea0e,11,0.3272727272727273,0.3242424242424242,0.5333685682511754 +gw_row_1635,e48f24eb7cd0,26,0.11886039886039886,0.18336182336182336,0.188973312355835 +gw_row_1645,e48f24eb7cd0,26,0.5086301964101606,0.4997150997150997,0.4147105236608961 +gw_row_1646,e48f24eb7cd0,26,0.2597337861731806,0.5594301994301994,0.3772594490303761 +gw_row_1661,ffe19aef8e05,9,-0.09444444444444444,0.44999999999999996,0.1176512129542425 +gw_row_1662,e48f24eb7cd0,26,0.6588034188034187,0.49903133903133895,0.6655296473331862 +gw_row_1665,54d602012bed,5,-0.06666666666666667,0.6,-0.35909242322980395 +gw_row_1672,a3534ff5edab,14,0.6131868131868132,0.46666666666666673,0.7367418913727768 +gw_row_1686,b99bae262729,30,0.36888049326167854,0.4074898034853541,0.49251225107787505 +gw_row_1692,e48f24eb7cd0,26,0.36083872850881776,0.4557264957264957,0.19687583269071537 +gw_row_1702,2317ccf9206c,12,-0.3953888649319501,-0.020979020979020952,0.31041771350452524 +gw_row_1703,e48f24eb7cd0,26,0.134045681946467,0.15008547008547005,0.25253706287552496 +gw_row_1740,ffe19aef8e05,9,0.3111111111111111,0.3444444444444445,0.05882560647712125 +gw_row_1742,54d602012bed,5,-0.5333333333333333,-0.16666666666666666,0.46169025843831935 diff --git a/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s43.json b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s43.json new file mode 100644 index 0000000000000000000000000000000000000000..6f4a74f9410896d017aa5ae9127ef0359a6138cd --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s43.json @@ -0,0 +1,19 @@ +{ + "arm": "A_glycan", + "variant": "gifflarESM", + "stratum": "test_glycan_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt", + "gifflar_reported_test_spearman": 0.320816, + "pooled_over_gifflar_rows": 0.320815, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 37315, + "rows_scored": 36635, + "assays_eligible_data_only": 1767, + "assays_scored": 1687, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.264031, + "macro_eligibility_corrected": 0.252077, + "pooled_over_our_rows": 0.320815, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s44.json b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s44.json new file mode 100644 index 0000000000000000000000000000000000000000..ad3eed73d1d2134794dd8a782751d25074626f0a --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s44.json @@ -0,0 +1,19 @@ +{ + "arm": "A_glycan", + "variant": "gifflarESM", + "stratum": "test_glycan_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/weights/epoch=10-step=37862.ckpt", + "gifflar_reported_test_spearman": 0.350189, + "pooled_over_gifflar_rows": 0.350189, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 37315, + "rows_scored": 36635, + "assays_eligible_data_only": 1767, + "assays_scored": 1687, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.288499, + "macro_eligibility_corrected": 0.275437, + "pooled_over_our_rows": 0.350189, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json new file mode 100644 index 0000000000000000000000000000000000000000..835ba8e278a42615c84dd575ab7985d6c24b79ae --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json @@ -0,0 +1,19 @@ +{ + "arm": "A_glycan", + "variant": "sweetnetESM", + "stratum": "test_glycan_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=38-step=134238.ckpt", + "gifflar_reported_test_spearman": 0.335903, + "pooled_over_gifflar_rows": 0.335903, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 37315, + "rows_scored": 36635, + "assays_eligible_data_only": 1767, + "assays_scored": 1687, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.306588, + "macro_eligibility_corrected": 0.292708, + "pooled_over_our_rows": 0.335903, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json new file mode 100644 index 0000000000000000000000000000000000000000..8c7dfb34c5bb86fff351ccea9df5253def78db58 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json @@ -0,0 +1,19 @@ +{ + "arm": "A_glycan", + "variant": "sweetnetESM", + "stratum": "test_glycan_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=37-step=130796.ckpt", + "gifflar_reported_test_spearman": 0.309276, + "pooled_over_gifflar_rows": 0.309276, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 37315, + "rows_scored": 36635, + "assays_eligible_data_only": 1767, + "assays_scored": 1687, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.273407, + "macro_eligibility_corrected": 0.261029, + "pooled_over_our_rows": 0.309276, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s43.json b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s43.json new file mode 100644 index 0000000000000000000000000000000000000000..0f55680d1bde98ddab524309de393b792f90f404 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s43.json @@ -0,0 +1,19 @@ +{ + "arm": "B_protein", + "variant": "gifflarESM", + "stratum": "test_protein_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/weights/epoch=48-step=168756.ckpt", + "gifflar_reported_test_spearman": 0.241086, + "pooled_over_gifflar_rows": 0.241086, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 38556, + "rows_scored": 36957, + "assays_eligible_data_only": 246, + "assays_scored": 233, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.215931, + "macro_eligibility_corrected": 0.20452, + "pooled_over_our_rows": 0.241086, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s44.json b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s44.json new file mode 100644 index 0000000000000000000000000000000000000000..b6041995f43734f60872cda895296c09e4e42538 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s44.json @@ -0,0 +1,19 @@ +{ + "arm": "B_protein", + "variant": "gifflarESM", + "stratum": "test_protein_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/weights/epoch=37-step=130872.ckpt", + "gifflar_reported_test_spearman": 0.250504, + "pooled_over_gifflar_rows": 0.250504, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 38556, + "rows_scored": 36957, + "assays_eligible_data_only": 246, + "assays_scored": 233, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.218968, + "macro_eligibility_corrected": 0.207397, + "pooled_over_our_rows": 0.250504, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s43.json b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s43.json new file mode 100644 index 0000000000000000000000000000000000000000..1e243a468c915462eae02a2bde593df373aef0c0 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s43.json @@ -0,0 +1,19 @@ +{ + "arm": "B_protein", + "variant": "sweetnetESM", + "stratum": "test_protein_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=42-step=148092.ckpt", + "gifflar_reported_test_spearman": 0.182637, + "pooled_over_gifflar_rows": 0.182637, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 38556, + "rows_scored": 36957, + "assays_eligible_data_only": 246, + "assays_scored": 233, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.188834, + "macro_eligibility_corrected": 0.178855, + "pooled_over_our_rows": 0.182637, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s44.json b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s44.json new file mode 100644 index 0000000000000000000000000000000000000000..fc1cad44abf0326ef22fc020b358d9613fe5ae48 --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s44.json @@ -0,0 +1,19 @@ +{ + "arm": "B_protein", + "variant": "sweetnetESM", + "stratum": "test_protein_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/weights/epoch=48-step=168756.ckpt", + "gifflar_reported_test_spearman": 0.198962, + "pooled_over_gifflar_rows": 0.198962, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 38556, + "rows_scored": 36957, + "assays_eligible_data_only": 246, + "assays_scored": 233, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.184944, + "macro_eligibility_corrected": 0.175171, + "pooled_over_our_rows": 0.198962, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s43.json b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s43.json new file mode 100644 index 0000000000000000000000000000000000000000..7bf273357cb042d03bfd676169ea45ef70405ceb --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s43.json @@ -0,0 +1,19 @@ +{ + "arm": "C_doubly", + "variant": "gifflarESM", + "stratum": "test_doubly_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/weights/epoch=8-step=51624.ckpt", + "gifflar_reported_test_spearman": 0.220454, + "pooled_over_gifflar_rows": 0.220454, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 3691, + "rows_scored": 3533, + "assays_eligible_data_only": 212, + "assays_scored": 201, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.197657, + "macro_eligibility_corrected": 0.187401, + "pooled_over_our_rows": 0.220454, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s44.json b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s44.json new file mode 100644 index 0000000000000000000000000000000000000000..83c47a21ffb61e5cf9f0ed7bf414e86815e912fc --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s44.json @@ -0,0 +1,19 @@ +{ + "arm": "C_doubly", + "variant": "gifflarESM", + "stratum": "test_doubly_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/weights/epoch=6-step=40152.ckpt", + "gifflar_reported_test_spearman": 0.257452, + "pooled_over_gifflar_rows": 0.257452, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 3691, + "rows_scored": 3533, + "assays_eligible_data_only": 212, + "assays_scored": 201, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.197237, + "macro_eligibility_corrected": 0.187003, + "pooled_over_our_rows": 0.257452, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json new file mode 100644 index 0000000000000000000000000000000000000000..481a42ed9a8b350ec8bedf943e8f777c759e0f0f --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json @@ -0,0 +1,19 @@ +{ + "arm": "C_doubly", + "variant": "sweetnetESM", + "stratum": "test_doubly_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/weights/epoch=21-step=126192.ckpt", + "gifflar_reported_test_spearman": 0.277268, + "pooled_over_gifflar_rows": 0.277269, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 3691, + "rows_scored": 3533, + "assays_eligible_data_only": 212, + "assays_scored": 201, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.240414, + "macro_eligibility_corrected": 0.227939, + "pooled_over_our_rows": 0.277269, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json new file mode 100644 index 0000000000000000000000000000000000000000..7e0d89e1b33af346d96721236dc261442e9e0d6b --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json @@ -0,0 +1,19 @@ +{ + "arm": "C_doubly", + "variant": "sweetnetESM", + "stratum": "test_doubly_cold", + "version_dir": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1", + "checkpoint": "/work/ratul1/supantha/Bertint/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/weights/epoch=6-step=40152.ckpt", + "gifflar_reported_test_spearman": 0.253017, + "pooled_over_gifflar_rows": 0.253016, + "pooled_reproduces_gifflar": true, + "rows_stratum_total": 3691, + "rows_scored": 3533, + "assays_eligible_data_only": 212, + "assays_scored": 201, + "assays_constant_pred_scored_zero": 0, + "macro_over_scored_assays": 0.225259, + "macro_eligibility_corrected": 0.213571, + "pooled_over_our_rows": 0.253016, + "note": "macro_eligibility_corrected is the comparable number: assays GIFFLAR cannot score count as rho=0 against the data-only eligible denominator, matching the correction applied to LectinOracle." +} \ No newline at end of file diff --git a/releases/2026-10-02/bertosebind_new_runs/results/protein_probe.json b/releases/2026-10-02/bertosebind_new_runs/results/protein_probe.json new file mode 100644 index 0000000000000000000000000000000000000000..d8dd1261d0420cd8bcefdb6f42cc29fc16416bda --- /dev/null +++ b/releases/2026-10-02/bertosebind_new_runs/results/protein_probe.json @@ -0,0 +1,325 @@ +{ + "schema": "affinose_protein_dependence_motif_v1", + "predeclaration": "review/AFFINOSE_UPDATE_TRACKER.md \u00a7B1 (written before this job ran)", + "tree": "model_motif_20260908", + "device": "NVIDIA A100-SXM4-80GB", + "derangement_seed": 20260908, + "gate_tolerance": 0.0005, + "threshold": 0.019, + "cells": { + "affinose_mo_20260908_mo_A_glycan_s42": { + "stratum": "test_glycan_cold", + "seed": 42, + "n_rows": 37295, + "n_assays_eligible": 1767, + "checkpoint_sha256": "3303250c5aa34f7f20e605dafb138554302baa336598ec84645f196e7f906b52", + "reference_test_macro": 0.334059, + "passes": { + "intact": { + "macro_spearman": 0.33405850648525903, + "pooled_spearman": 0.3519114017717813, + "pred_sd": 0.17623404518319485, + "abs_diff_vs_reference": 4.935147409623752e-07, + "reproduces_reference": true + }, + "reassigned": { + "macro_spearman": 0.15801497671819276, + "pooled_spearman": 0.1836147758398004, + "pred_sd": 0.15987793567771824, + "delta_macro_vs_intact": -0.17604352976706628, + "spearman_vs_intact_predictions": 0.46577155590127756 + }, + "meanprot": { + "macro_spearman": 0.2594956399755904, + "pooled_spearman": 0.30078479752302867, + "pred_sd": 0.06256117904583337, + "delta_macro_vs_intact": -0.07456286650966865, + "spearman_vs_intact_predictions": 0.6209856300345357 + } + } + }, + "affinose_sa_20260908_moc_A_glycan_s43": { + "stratum": "test_glycan_cold", + "seed": 43, + "n_rows": 37295, + "n_assays_eligible": 1767, + "checkpoint_sha256": "e2c0bebaaf53894bb928bc6b302c3eacfa5254d9c7301ff47854e98338b97ee3", + "reference_test_macro": 0.318372, + "passes": { + "intact": { + "macro_spearman": 0.318371586837939, + "pooled_spearman": 0.3491029922366602, + "pred_sd": 0.19822149172766365, + "abs_diff_vs_reference": 4.1316206100816544e-07, + "reproduces_reference": true + }, + "reassigned": { + "macro_spearman": 0.12771779371507755, + "pooled_spearman": 0.15975513589385712, + "pred_sd": 0.18685962265140366, + "delta_macro_vs_intact": -0.19065379312286143, + "spearman_vs_intact_predictions": 0.38649872977325306 + }, + "meanprot": { + "macro_spearman": 0.24610584405709057, + "pooled_spearman": 0.295367505087327, + "pred_sd": 0.05091976243139101, + "delta_macro_vs_intact": -0.07226574278084841, + "spearman_vs_intact_predictions": 0.5512011088098818 + } + } + }, + "affinose_sa_20260908_moc_A_glycan_s44": { + "stratum": "test_glycan_cold", + "seed": 44, + "n_rows": 37295, + "n_assays_eligible": 1767, + "checkpoint_sha256": "c4adf409efbb985b1fceee6a398ac8be0c84946ea354791c95ae835ae59e67a4", + "reference_test_macro": 0.33548, + "passes": { + "intact": { + "macro_spearman": 0.3354799039624282, + "pooled_spearman": 0.3562564894744605, + "pred_sd": 0.15249519061365666, + "abs_diff_vs_reference": 9.60375717840023e-08, + "reproduces_reference": true + }, + "reassigned": { + "macro_spearman": 0.1857201171794652, + "pooled_spearman": 0.20629732747019963, + "pred_sd": 0.13243043911629598, + "delta_macro_vs_intact": -0.149759786782963, + "spearman_vs_intact_predictions": 0.5502848813104219 + }, + "meanprot": { + "macro_spearman": 0.25435173846117026, + "pooled_spearman": 0.2878145361984606, + "pred_sd": 0.06654944060151355, + "delta_macro_vs_intact": -0.08112816550125795, + "spearman_vs_intact_predictions": 0.6940969591462645 + } + } + }, + "affinose_sa_20260908_mo_B_protein_s42": { + "stratum": "test_protein_cold", + "seed": 42, + "n_rows": 38539, + "n_assays_eligible": 246, + "checkpoint_sha256": "ebdc31defe4c7a6d105670626d2da50f7d29026e41c31f24bd5722079bb7a80d", + "reference_test_macro": 0.232603, + "passes": { + "intact": { + "macro_spearman": 0.23260289913763402, + "pooled_spearman": 0.26884245311406896, + "pred_sd": 0.07415273376255468, + "abs_diff_vs_reference": 1.0086236598705334e-07, + "reproduces_reference": true + }, + "reassigned": { + "macro_spearman": 0.18010721693552095, + "pooled_spearman": 0.2232534650168052, + "pred_sd": 0.0745452838242309, + "delta_macro_vs_intact": -0.052495682202113064, + "spearman_vs_intact_predictions": 0.7352154609379177 + }, + "meanprot": { + "macro_spearman": 0.20089533044093738, + "pooled_spearman": 0.2451951694701566, + "pred_sd": 0.052282428024560935, + "delta_macro_vs_intact": -0.031707568696696636, + "spearman_vs_intact_predictions": 0.8216122380666062 + } + } + }, + "affinose_mof_20260909_mof_B_protein_s43": { + "stratum": "test_protein_cold", + "seed": 43, + "n_rows": 38539, + "n_assays_eligible": 246, + "checkpoint_sha256": "f143720e8ebd41ba247ddeac5a5b58971c9cc3c407361b8071cf7dd1c513b57d", + "reference_test_macro": 0.245126, + "passes": { + "intact": { + "macro_spearman": 0.24512556467979302, + "pooled_spearman": 0.2699137753848991, + "pred_sd": 0.11351810614403735, + "abs_diff_vs_reference": 4.353202069928841e-07, + "reproduces_reference": true + }, + "reassigned": { + "macro_spearman": 0.17218050912323637, + "pooled_spearman": 0.20970655545396383, + "pred_sd": 0.11409332501457131, + "delta_macro_vs_intact": -0.07294505555655664, + "spearman_vs_intact_predictions": 0.6187879434501171 + }, + "meanprot": { + "macro_spearman": 0.20672400888172926, + "pooled_spearman": 0.2504898402405782, + "pred_sd": 0.05664906854075081, + "delta_macro_vs_intact": -0.03840155579806376, + "spearman_vs_intact_predictions": 0.7334131788218877 + } + } + }, + "affinose_mof_20260909_mof_B_protein_s44": { + "stratum": "test_protein_cold", + "seed": 44, + "n_rows": 38539, + "n_assays_eligible": 246, + "checkpoint_sha256": "d43e1b62ce0b51b874d255544d63088f10735c85e57234eb9c420e8af3af88f1", + "reference_test_macro": 0.244894, + "passes": { + "intact": { + "macro_spearman": 0.24489399647831056, + "pooled_spearman": 0.2547891998912819, + "pred_sd": 0.11077573500214949, + "abs_diff_vs_reference": 3.521689440066922e-09, + "reproduces_reference": true + }, + "reassigned": { + "macro_spearman": 0.16315950509739569, + "pooled_spearman": 0.20053941648068715, + "pred_sd": 0.11192989872627439, + "delta_macro_vs_intact": -0.08173449138091488, + "spearman_vs_intact_predictions": 0.5736819255068246 + }, + "meanprot": { + "macro_spearman": 0.2092362381074056, + "pooled_spearman": 0.25163156742127774, + "pred_sd": 0.057796309039301136, + "delta_macro_vs_intact": -0.03565775837090496, + "spearman_vs_intact_predictions": 0.6886831879467487 + } + } + }, + "affinose_mo_20260908_mo_C_doubly_s42": { + "stratum": "test_doubly_cold", + "seed": 42, + "n_rows": 3691, + "n_assays_eligible": 212, + "checkpoint_sha256": "e3872d4768fdcf5aa1d7be070cad8789a427332ba6741fdfa420d1c69f54b321", + "reference_test_macro": 0.177321, + "passes": { + "intact": { + "macro_spearman": 0.17732109020146009, + "pooled_spearman": 0.19643520103251555, + "pred_sd": 0.11589859420082081, + "abs_diff_vs_reference": 9.020146007898688e-08, + "reproduces_reference": true + }, + "reassigned": { + "macro_spearman": 0.1551714308573706, + "pooled_spearman": 0.1673388336573097, + "pred_sd": 0.11752920131628669, + "delta_macro_vs_intact": -0.022149659344089495, + "spearman_vs_intact_predictions": 0.7222998436599677 + }, + "meanprot": { + "macro_spearman": 0.20970366631135062, + "pooled_spearman": 0.23544140926888144, + "pred_sd": 0.05122910166929219, + "delta_macro_vs_intact": 0.03238257610989054, + "spearman_vs_intact_predictions": 0.7968623201581909 + } + } + }, + "affinose_mof_20260909_mof_C_doubly_s43": { + "stratum": "test_doubly_cold", + "seed": 43, + "n_rows": 3691, + "n_assays_eligible": 212, + "checkpoint_sha256": "7b56d428df6c91ec02e3fa5aab4df73afba7127f020738548ae37b7048bb66a1", + "reference_test_macro": 0.183977, + "passes": { + "intact": { + "macro_spearman": 0.1839765095395252, + "pooled_spearman": 0.2208411762069753, + "pred_sd": 0.10688619858966744, + "abs_diff_vs_reference": 4.904604747890673e-07, + "reproduces_reference": true + }, + "reassigned": { + "macro_spearman": 0.19307542754537219, + "pooled_spearman": 0.21182624434692446, + "pred_sd": 0.10911116122521138, + "delta_macro_vs_intact": 0.009098918005846973, + "spearman_vs_intact_predictions": 0.7779136776624087 + }, + "meanprot": { + "macro_spearman": 0.1770139140083824, + "pooled_spearman": 0.19598219033259603, + "pred_sd": 0.07809228422492347, + "delta_macro_vs_intact": -0.006962595531142812, + "spearman_vs_intact_predictions": 0.8192739997632578 + } + } + }, + "affinose_mof_20260909_mof_C_doubly_s44": { + "stratum": "test_doubly_cold", + "seed": 44, + "n_rows": 3691, + "n_assays_eligible": 212, + "checkpoint_sha256": "509a088a821250e6464c2f696aa1b53cc4f00443c73153c95a18afdfe53a621d", + "reference_test_macro": 0.174302, + "passes": { + "intact": { + "macro_spearman": 0.17430173158048537, + "pooled_spearman": 0.19176702047106786, + "pred_sd": 0.12041494177293972, + "abs_diff_vs_reference": 2.684195146429591e-07, + "reproduces_reference": true + }, + "reassigned": { + "macro_spearman": 0.16899968178523816, + "pooled_spearman": 0.17749864849373065, + "pred_sd": 0.1222815320469839, + "delta_macro_vs_intact": -0.0053020497952472045, + "spearman_vs_intact_predictions": 0.7555498628884061 + }, + "meanprot": { + "macro_spearman": 0.17270013551187774, + "pooled_spearman": 0.19363527291012253, + "pred_sd": 0.09509485950919112, + "delta_macro_vs_intact": -0.0016015960686076303, + "spearman_vs_intact_predictions": 0.8423291372017004 + } + } + } + }, + "gate_passed": true, + "summary": { + "test_glycan_cold": { + "n_seeds": 3, + "intact_mean": 0.3293033324285421, + "wrong_protein_drop_mean": 0.17215236989096358, + "wrong_protein_drop_sd": 0.020722832396126666, + "mean_protein_drop_mean": 0.07598559159725833, + "wrong_ge_mean_per_seed": 3, + "agree_with_intact_mean": 0.46751838899498416 + }, + "test_protein_cold": { + "n_seeds": 3, + "intact_mean": 0.24087415343191254, + "wrong_protein_drop_mean": 0.06905840971319487, + "wrong_protein_drop_sd": 0.01500188329785255, + "mean_protein_drop_mean": 0.03525562762188845, + "wrong_ge_mean_per_seed": 3, + "agree_with_intact_mean": 0.6425617766316197 + }, + "test_doubly_cold": { + "n_seeds": 3, + "intact_mean": 0.17853311044049022, + "wrong_protein_drop_mean": 0.0061175970444965755, + "wrong_protein_drop_sd": 0.01564024407052394, + "mean_protein_drop_mean": -0.007939461503380032, + "wrong_ge_mean_per_seed": 2, + "agree_with_intact_mean": 0.7519211280702608 + } + }, + "verdict_components": { + "threshold_met": true, + "specificity_met": true + }, + "verdict": "SUPPORTED: the reported model uses the protein partner" +} \ No newline at end of file diff --git a/releases/2026-10-02/check_release.py b/releases/2026-10-02/check_release.py new file mode 100644 index 0000000000000000000000000000000000000000..9b9c2154d254ec0596d844cff63de973165e24e3 --- /dev/null +++ b/releases/2026-10-02/check_release.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +"""Verify the local release, tokenizer, and optionally a real sequence export.""" +import argparse +import csv +import hashlib +import json +from pathlib import Path +import torch +import bertose + +ROOT = Path(__file__).resolve().parent + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--checkpoint", type=Path) + parser.add_argument("--variant", choices=[str(i) for i in range(1, 6)] + [f"WA{i}" for i in range(1, 6)], default="3") + args = parser.parse_args() + verified = 0 + sources = [] + for line in (ROOT / "SHA256SUMS").read_text().splitlines(): + digest, relative = line.split(" ", 1) + if bertose.sha256_file(ROOT / relative) != digest: + raise ValueError(f"SHA-256 mismatch: {relative}") + if relative.endswith(".py"): + sources.append(ROOT / relative) + verified += 1 + for source in sources: + compile(source.read_bytes(), str(source), "exec") + tokenizer = bertose.load_tokenizer() + rows = list(csv.DictReader((ROOT / "examples/glycans.csv").open())) + tokens = [bertose.tokenize(r["wurcs"], tokenizer) for r in rows] + assert len(tokenizer.token_to_id) == 2114 + assert all(t["tree_channels_valid"] and t["unknown_token_count"] == 0 for t in tokens) + result = {"status":"PASS", "file_hashes":verified, "python_sources_compiled":len(sources), + "tokenizer_examples":len(tokens), "checkpoint_loaded":False, + "scope":"File integrity, source compilation and tokenizer examples"} + if args.checkpoint: + torch.set_num_threads(2) + encoder, metadata = bertose.load_encoder(args.checkpoint, args.variant) + vectors, diagnostics = bertose.embed([r["wurcs"] for r in rows], encoder, tokenizer) + assert vectors.shape == (2, 768) + result.update(checkpoint_loaded=True, checkpoint=metadata, + embedding_shape=list(vectors.shape), diagnostics=diagnostics, + embedding_bytes_sha256=hashlib.sha256(vectors.tobytes()).hexdigest(), + scope="File integrity, compilation, tokenizer and real sequence-export CPU inference") + print(json.dumps(result, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/code_inventory.tsv b/releases/2026-10-02/code_inventory.tsv new file mode 100644 index 0000000000000000000000000000000000000000..58cfe075d48ee24cad76d013af366c15b6fcc4ea --- /dev/null +++ b/releases/2026-10-02/code_inventory.tsv @@ -0,0 +1,576 @@ +original_path original_sha256 output_path output_sha256 status +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/.gitattributes 87c07b5f72ac341f0eb42c040e0617c9512c4ec9f89a20790580d01d473f1b99 .gitattributes 87c07b5f72ac341f0eb42c040e0617c9512c4ec9f89a20790580d01d473f1b99 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/.gitignore 6f8f72cd77c10018fd9f9666bad581556097a04a67d11e3e831ef21bb250f25b .gitignore 6f8f72cd77c10018fd9f9666bad581556097a04a67d11e3e831ef21bb250f25b unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/huggingface_release/bertose-glycan-encoder/LICENSE a6cba85bc92e0cff7a450b1d873c0eaa2e9fc96bf472df0247a26bec77bf3ff9 LICENSE a6cba85bc92e0cff7a450b1d873c0eaa2e9fc96bf472df0247a26bec77bf3ff9 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/NOTICE b6c446fc86540a7a2c432368a5987ed15d622820a0b1bdf45c7cd7273b9bcad0 NOTICE b6c446fc86540a7a2c432368a5987ed15d622820a0b1bdf45c7cd7273b9bcad0 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/README.md 66394ada302d12a8af27b9c45510175a9138d4b9255cc10623293bbc94a9e4bb README.md 5b60c2b1da93ffe81348a456f7f43ba0909855355347f1ea18436c8acb613843 workbench release change +submit_comm/06_code/affinose/a1111_encoder_adapter.py 52c790c24e10061b5890260aad39cefdb6c2c615b8b9c167cc23d86393e41d98 affinose/a1111_encoder_adapter.py 52c790c24e10061b5890260aad39cefdb6c2c615b8b9c167cc23d86393e41d98 unchanged inherited file +submit_comm/06_code/affinose/a5_tokenizer_shim.py c4bbe5c1a0286b319f0b71c87669b4f9cfe781051019fb02a98b5d7e208b8b2b affinose/a5_tokenizer_shim.py c4bbe5c1a0286b319f0b71c87669b4f9cfe781051019fb02a98b5d7e208b8b2b unchanged inherited file +submit_comm/06_code/affinose/bertint_v8.py 7fa8d6fe95db3ccecefdd396931d6354442800cd5284cabf519e3425cc388883 affinose/bertint_v8.py 7fa8d6fe95db3ccecefdd396931d6354442800cd5284cabf519e3425cc388883 unchanged inherited file +submit_comm/06_code/affinose/dataset_v8.py 27e7fe6820357551e9e09a135db4a9d2cff5c4382f5396912dced12c54aaa288 affinose/dataset_v8.py 27e7fe6820357551e9e09a135db4a9d2cff5c4382f5396912dced12c54aaa288 unchanged inherited file +submit_comm/06_code/affinose/training_v8.py 82d1d55ed231740fff88065cff7eb9bc45907d69f7c96beebf7eb5fa6e1ae52d affinose/training_v8.py 82d1d55ed231740fff88065cff7eb9bc45907d69f7c96beebf7eb5fa6e1ae52d unchanged inherited file +submit_comm/06_code/benchmark_exclusion/MANIFEST_SHA256.tsv 8452e3ac521af1d3ea24bb5a99e02a930d913fc96394e5610fe8b86e19ea89ec benchmark_exclusion/MANIFEST_SHA256.tsv 8452e3ac521af1d3ea24bb5a99e02a930d913fc96394e5610fe8b86e19ea89ec unchanged inherited file +submit_comm/06_code/benchmark_exclusion/README.md 96567c3b9c3e254bceb6bd82e43c1f252b987ced58dad41d3b4406b9f58a76ec benchmark_exclusion/README.md 96567c3b9c3e254bceb6bd82e43c1f252b987ced58dad41d3b4406b9f58a76ec unchanged inherited file +submit_comm/06_code/benchmark_exclusion/SHA256SUMS 3d37d993b1cd4135ca9fe90feca856b73907d725516ea652425ca24060769698 benchmark_exclusion/SHA256SUMS 3d37d993b1cd4135ca9fe90feca856b73907d725516ea652425ca24060769698 unchanged inherited file +submit_comm/06_code/benchmark_exclusion/code_inventory.tsv e2e0dfa7d133362146de10ba3dd774e9a3e186088f976189b0aae9d26b442bc4 benchmark_exclusion/code_inventory.tsv e2e0dfa7d133362146de10ba3dd774e9a3e186088f976189b0aae9d26b442bc4 unchanged inherited file +submit_comm/06_code/benchmark_exclusion/required_successor_inputs.json 050c0af96f133ded3139baf6dfea594f91c6659f411dc25fc06d5847951b2f0c benchmark_exclusion/required_successor_inputs.json 050c0af96f133ded3139baf6dfea594f91c6659f411dc25fc06d5847951b2f0c unchanged inherited file +submit_comm/06_code/benchmark_exclusion/source_verification.json 0507537ca8ee05b249f9ab3f3fa09de94b7acc633b91235f2778ae07659096bd benchmark_exclusion/source_verification.json 0507537ca8ee05b249f9ab3f3fa09de94b7acc633b91235f2778ae07659096bd unchanged inherited file +submit_comm/06_code/benchmark_exclusion/writing/review/glytoucan/scripts/build_connection_level_support_audit.py 3d598a249db90c928f8a317923ba5d37eebbc1f63383a2c39e0541f20c31ccac benchmark_exclusion/writing/review/glytoucan/scripts/build_connection_level_support_audit.py 3d598a249db90c928f8a317923ba5d37eebbc1f63383a2c39e0541f20c31ccac unchanged inherited file +submit_comm/06_code/benchmark_exclusion/writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py a9160769759c1df56238caad6a9f4ed6ec68477d44435ebbc81d64bbf541b64c benchmark_exclusion/writing/review/multimodal/scripts/build_p1_direct_local_neighbor_audit_20260710.py a9160769759c1df56238caad6a9f4ed6ec68477d44435ebbc81d64bbf541b64c unchanged inherited file +submit_comm/06_code/benchmark_exclusion/writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py 0f88f53e22d0c068a87a09508a9d286e4982eddcb4e2154e63b2ca25339ece69 benchmark_exclusion/writing/review/multimodal/scripts/build_p1_non_iar_exact_graph_authority_20260711.py 0f88f53e22d0c068a87a09508a9d286e4982eddcb4e2154e63b2ca25339ece69 unchanged inherited file +submit_comm/06_code/benchmark_exclusion/writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py 2c8821586df1caa53556b4cc14e6cd7507af4830aa8a149657571e0455eb6853 benchmark_exclusion/writing/review/multimodal/scripts/build_review_a5_non_iar_later_role_successor_20260720.py 2c8821586df1caa53556b4cc14e6cd7507af4830aa8a149657571e0455eb6853 unchanged inherited file +submit_comm/06_code/benchmark_exclusion/writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py cd86a0a0b228c32e51ec73490711e37da3e6c9fdf9e64e980b7222b5312484aa benchmark_exclusion/writing/review/multimodal/scripts/repartition_a5_non_iar_80_20_20260712.py cd86a0a0b228c32e51ec73490711e37da3e6c9fdf9e64e980b7222b5312484aa unchanged inherited file +submit_comm/06_code/benchmark_exclusion/writing/review/multimodal/tests/test_build_review_a5_non_iar_later_role_successor_20260720.py 966889118fa567729e1959750b1601018ba117aed0bfad3508005ba6b1896a08 benchmark_exclusion/writing/review/multimodal/tests/test_build_review_a5_non_iar_later_role_successor_20260720.py 966889118fa567729e1959750b1601018ba117aed0bfad3508005ba6b1896a08 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/bertose.py 92a9fb830e7adfad3d6999bd3b0cd73f2d5414934c65521a3ee7c6f59003a66d bertose.py 92a9fb830e7adfad3d6999bd3b0cd73f2d5414934c65521a3ee7c6f59003a66d unchanged inherited file +submit_comm/06_code/bertose_source/bert_training_v4/downstream_tasks/utils/wurcs_bpe_tokenizer.py 0bc54399362945601bcfd403441fc80968d173200dd0561f57568b2053a94839 bertose_source/bert_training_v4/downstream_tasks/utils/wurcs_bpe_tokenizer.py 0bc54399362945601bcfd403441fc80968d173200dd0561f57568b2053a94839 unchanged inherited file +submit_comm/06_code/bertose_source/bert_training_v4/model/__init__.py e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 bertose_source/bert_training_v4/model/__init__.py e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 unchanged inherited file +submit_comm/06_code/bertose_source/bert_training_v4/model/glycan_bert.py b69f14c9976951325e3a0a4e8107a16126e67d410e966650f513f1f538a732bb bertose_source/bert_training_v4/model/glycan_bert.py b69f14c9976951325e3a0a4e8107a16126e67d410e966650f513f1f538a732bb unchanged inherited file +submit_comm/06_code/bertose_source/bert_training_v4/model/multimodal_glycan_bert_v3.py 83fde1c18cd6547a6ea026017296b5c94d209ac8f0e125057f03d507b3b65190 bertose_source/bert_training_v4/model/multimodal_glycan_bert_v3.py 83fde1c18cd6547a6ea026017296b5c94d209ac8f0e125057f03d507b3b65190 unchanged inherited file +submit_comm/06_code/bertose_source/data/bpe_vocabulary.json 8a7f8569ff3a21513723d3a15e969120f0fdcf352943dbbadfdc54afd382149e bertose_source/data/bpe_vocabulary.json 8a7f8569ff3a21513723d3a15e969120f0fdcf352943dbbadfdc54afd382149e unchanged inherited file +submit_comm/06_code/bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_authority.json 48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4 bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_authority.json 48914855c4e458ff02452ad4db3743a4fbef12221e0313584db4c2b1bd684cd4 unchanged inherited file +submit_comm/06_code/bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_independent_certificate.json 53098620a5c22dafdc951ba743515b4b10b1673c02f0aa4d881db669584902fa bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_independent_certificate.json 53098620a5c22dafdc951ba743515b4b10b1673c02f0aa4d881db669584902fa unchanged inherited file +submit_comm/06_code/bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_receipt.json f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4 bertose_source/data/review_ms_acquisition_top30_runtime_20260721_r3/review_a5_ms_acquisition_top30_runtime_receipt.json f654177eb6fde7289b6755812c2be298084697cf0d85159b3ec9da310fe3d4b4 unchanged inherited file +submit_comm/06_code/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json 918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json 918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b unchanged inherited file +submit_comm/06_code/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py 10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04 bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py 10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04 unchanged inherited file +submit_comm/06_code/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7 bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7 unchanged inherited file +submit_comm/06_code/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py 6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4 bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py 6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4 unchanged inherited file +submit_comm/06_code/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_receipt.json 399df3de2b6c4d5e88aa442c8326214ab9cff2e8f0411e6921762bbade1475ba bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_receipt.json 399df3de2b6c4d5e88aa442c8326214ab9cff2e8f0411e6921762bbade1475ba unchanged inherited file +submit_comm/06_code/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_summary.json 93ed219d807d4a7735be96bf7cf6a59a0bd407619925ee194aed6d473048cdf0 bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_package_summary.json 93ed219d807d4a7735be96bf7cf6a59a0bd407619925ee194aed6d473048cdf0 unchanged inherited file +submit_comm/06_code/bertose_source/model/glycan_bert.py b69f14c9976951325e3a0a4e8107a16126e67d410e966650f513f1f538a732bb bertose_source/model/glycan_bert.py b69f14c9976951325e3a0a4e8107a16126e67d410e966650f513f1f538a732bb unchanged inherited file +submit_comm/06_code/bertose_source/model/multimodal_glycan_bert_v3.py 8e06c32f4e844c3c66f146fd15a075472808a0720c892d0b9683dfd32f15ef0c bertose_source/model/multimodal_glycan_bert_v3.py 8e06c32f4e844c3c66f146fd15a075472808a0720c892d0b9683dfd32f15ef0c unchanged inherited file +submit_comm/06_code/bertose_source/training/a5_wurcs_bpe.py 6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4 bertose_source/training/a5_wurcs_bpe.py 6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_submission_readback_11767377/review_a5_native_eight_cuda_resume_diagnostic_r5_11767377_terminal_certification_receipt.json 2a3b28bd980b144eb42f9688f411adfbced054b9e7bad9fac4de37c6180064f8 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_submission_readback_11767377/review_a5_native_eight_cuda_resume_diagnostic_r5_11767377_terminal_certification_receipt.json 2a3b28bd980b144eb42f9688f411adfbced054b9e7bad9fac4de37c6180064f8 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/review_a5_native_eight_cuda_resume_diagnostic_receipt_r5.json 6a1bc65c568a17dc45f1102cd122ac43c62a8ee3b28e06ec855577857cc41ce0 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/review_a5_native_eight_cuda_resume_diagnostic_receipt_r5.json 6a1bc65c568a17dc45f1102cd122ac43c62a8ee3b28e06ec855577857cc41ce0 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/review_checkpoints_r1/review_checkpoint_index.json 9292c31195a7eddfe9f987a8cfe8cda843b283bb10a1bc8fb1b05d88f82a92d9 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_cuda_resume_diagnostic_20260727_r5_synthetic_device_receipt_fix/review_checkpoints_r1/review_checkpoint_index.json 9292c31195a7eddfe9f987a8cfe8cda843b283bb10a1bc8fb1b05d88f82a92d9 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r1/review_a5_native_eight_data_adapter_receipt_r1.json cacec838740d64a493c2e56fd1efa8a85ba7d11fce3ec26e40905c33db05e58d bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r1/review_a5_native_eight_data_adapter_receipt_r1.json cacec838740d64a493c2e56fd1efa8a85ba7d11fce3ec26e40905c33db05e58d unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_receipt_r2.json 3b2118e128a5550ba4918b4f4f2c6d8045e319b7cff37b76d74dce6b3220c9f0 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_receipt_r2.json 3b2118e128a5550ba4918b4f4f2c6d8045e319b7cff37b76d74dce6b3220c9f0 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_receipt_r3.json e29df7a91d0c30238abe9155e600fb1b77b0d3d3481f6599d2ca0d2185371b9f bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_receipt_r3.json e29df7a91d0c30238abe9155e600fb1b77b0d3d3481f6599d2ca0d2185371b9f unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_verification_receipt_r1.json a92f4b951476e84af006015c97698f07d5e03e7a182c54c82b7d7c5c0e68ffb3 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_verification_receipt_r1.json a92f4b951476e84af006015c97698f07d5e03e7a182c54c82b7d7c5c0e68ffb3 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4_integrity_receipt.json 9aa5860bfc032afd82561a6db6f8df1439245b73aa3f7575b2b88836e384a1f9 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4_integrity_receipt.json 9aa5860bfc032afd82561a6db6f8df1439245b73aa3f7575b2b88836e384a1f9 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5_integrity_receipt.json 59a2fd53e9e75f6f8ec258d76e103adb61c908ab0ace6718a348739f5b70d8bd bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5_integrity_receipt.json 59a2fd53e9e75f6f8ec258d76e103adb61c908ab0ace6718a348739f5b70d8bd unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6_integrity_receipt.json 0c078ce52e2eb6d6feaeb1a1c2af1794ef33aef56aca7959f76a93f39d152692 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6_integrity_receipt.json 0c078ce52e2eb6d6feaeb1a1c2af1794ef33aef56aca7959f76a93f39d152692 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7_integrity_receipt.json 912bc1391ff66c3fd704e61266de508adcf9ed587d7e136932508029b77cb956 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7_integrity_receipt.json 912bc1391ff66c3fd704e61266de508adcf9ed587d7e136932508029b77cb956 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_final_binding_r22.json d8feaf25a7266a919c42d3a4fd1ad2d105ab088ae79c024edc665dfa29cf758a bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_final_binding_r22.json d8feaf25a7266a919c42d3a4fd1ad2d105ab088ae79c024edc665dfa29cf758a unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_launch_config_r22.json 30082379d47318f5d9e17fafad4aa018e7e9f0f0bf1aac559178d46784fe4b9f bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/review_a5_native_eight_launch_config_r22.json 30082379d47318f5d9e17fafad4aa018e7e9f0f0bf1aac559178d46784fe4b9f unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/run_review_a5_native_eight_r22.sbatch 826f3e8167fdd459cff7677b5b69d0f3caf9dababaaa71d9eded6070aa5d93a7 bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_production_bundle_20260728_r24_stable_null_jobside/run_review_a5_native_eight_r22.sbatch 826f3e8167fdd459cff7677b5b69d0f3caf9dababaaa71d9eded6070aa5d93a7 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_authority_r1.json 1238f76e5da5184d16d33077bf3e5342033918fadb4eba84242c47cb1b1322cc bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_authority_r1.json 1238f76e5da5184d16d33077bf3e5342033918fadb4eba84242c47cb1b1322cc unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_receipt_r1.json fb65dddf0bc61b4c73b5dc5ec796967e65263e9d7bdc4882e07684e882280fdb bertose_source/writing/review/multimodal/outputs/review_a5_native_eight_scientific_boundary_20260721_r1/review_a5_native_eight_scientific_boundary_child_receipt_r1.json fb65dddf0bc61b4c73b5dc5ec796967e65263e9d7bdc4882e07684e882280fdb unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_topology_loss_v2.py 64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r3/review_a5_topology_loss_v2.py 64eaf9174f523ae909c84987049d071bf3869ca8e83919f14f0572ef77b0530e unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_receipt_r4.json 654f5b9728c3dfd2588c4b570b0e3a1bcab8feb366af28eeead36f9beb37d921 bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_receipt_r4.json 654f5b9728c3dfd2588c4b570b0e3a1bcab8feb366af28eeead36f9beb37d921 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_summary_r4.json ccd4b81d3afac8ae789c538e0af332f74f2468d403da1d243fefefd4df013538 bertose_source/writing/review/multimodal/outputs/review_a5_official_ragged_sequence_topology_runtime_20260721_r4/review_a5_official_ragged_sequence_topology_runtime_summary_r4.json ccd4b81d3afac8ae789c538e0af332f74f2468d403da1d243fefefd4df013538 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null.json b10556643abf560b9e8622e8ae67936d2d3ca8867433db485e785f31d049a8fb bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null.json b10556643abf560b9e8622e8ae67936d2d3ca8867433db485e785f31d049a8fb unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null_receipt.json f4eb239f56e472d57dd3a3848c1a6c142e193cb326320ac8bf134b96ac35102a bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_a5_official_sequence_train_only_null_receipt.json f4eb239f56e472d57dd3a3848c1a6c142e193cb326320ac8bf134b96ac35102a unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_frozen_sequence_masking_runtime.py 831bebd2dcf6a8308d01ec62eb6e1132fe7edbbc666c1c83787335acc576b19c bertose_source/writing/review/multimodal/outputs/review_a5_sequence_official_array_train_only_null_20260721_r1/review_frozen_sequence_masking_runtime.py 831bebd2dcf6a8308d01ec62eb6e1132fe7edbbc666c1c83787335acc576b19c unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_topology_bfs_replay_all_20260722_r1/review_a5_sequence_topology_bfs_replay_all_receipt_r1.json eae6b3772cd08c65cdc26bdf7ec525742452aad4a35b4d5aa9a7a5936dc3bf73 bertose_source/writing/review/multimodal/outputs/review_a5_sequence_topology_bfs_replay_all_20260722_r1/review_a5_sequence_topology_bfs_replay_all_receipt_r1.json eae6b3772cd08c65cdc26bdf7ec525742452aad4a35b4d5aa9a7a5936dc3bf73 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_topology_bfs_replay_all_20260722_r1/review_a5_sequence_topology_bfs_replay_all_summary_r1.json da7814d20c81c0d072544cfc5761e8fae0292def176d63b863083389c9caa0ff bertose_source/writing/review/multimodal/outputs/review_a5_sequence_topology_bfs_replay_all_20260722_r1/review_a5_sequence_topology_bfs_replay_all_summary_r1.json da7814d20c81c0d072544cfc5761e8fae0292def176d63b863083389c9caa0ff unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_v4_two_run_reproduction_20260722_r1/review_a5_sequence_v4_two_run_reproduction_receipt.json ba9591529f3747706fbc169fe8262e23ca31a810473d10c284fb01d9190ebe42 bertose_source/writing/review/multimodal/outputs/review_a5_sequence_v4_two_run_reproduction_20260722_r1/review_a5_sequence_v4_two_run_reproduction_receipt.json ba9591529f3747706fbc169fe8262e23ca31a810473d10c284fb01d9190ebe42 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_sequence_v4_two_run_reproduction_20260722_r1/review_a5_sequence_v4_two_run_reproduction_summary.json d6b3dad73d8c9cc78a7c721e7969280d0ff6500773402545bc2ff143b125f56c bertose_source/writing/review/multimodal/outputs/review_a5_sequence_v4_two_run_reproduction_20260722_r1/review_a5_sequence_v4_two_run_reproduction_summary.json d6b3dad73d8c9cc78a7c721e7969280d0ff6500773402545bc2ff143b125f56c unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_epoch_boundary_continuation_11762446_r1.json 8ff3181d22567728c0a10580c1e775da0714f17561ace81034fc673813f54af6 bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_epoch_boundary_continuation_11762446_r1.json 8ff3181d22567728c0a10580c1e775da0714f17561ace81034fc673813f54af6 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_epoch_boundary_continuation_11762534_r1.json 163374c5c6b049908d935f0d92d8f1a1adda761550761db9b2cb423bfb450ee1 bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_epoch_boundary_continuation_11762534_r1.json 163374c5c6b049908d935f0d92d8f1a1adda761550761db9b2cb423bfb450ee1 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_amendment_11762446_r2.json 85711141c9d0e84dee228df84d02df7d4693fb4b85b1ae8163466e208f5e9fd6 bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_amendment_11762446_r2.json 85711141c9d0e84dee228df84d02df7d4693fb4b85b1ae8163466e208f5e9fd6 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_amendment_11762534_r3.json 0d96b7867eeec85dbf14eb8f55b745b7c354edb5d16ac702d17b97bf850c79af bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_amendment_11762534_r3.json 0d96b7867eeec85dbf14eb8f55b745b7c354edb5d16ac702d17b97bf850c79af unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_rightsizing_applied_11762446_r2.json f7adbf64e17c3a2afc677b7af9f05e50e37b4d681f38f0fc192634ca0447e4f4 bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_rightsizing_applied_11762446_r2.json f7adbf64e17c3a2afc677b7af9f05e50e37b4d681f38f0fc192634ca0447e4f4 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_rightsizing_applied_11762534_r3.json 6796f0b163dcf21af5dfe3048b53e8d2660fe10290e22222232a6c7f6668396c bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_epoch_boundary_resume_20260725_r1/review_a5_static_v2_scheduler_memory_rightsizing_applied_11762534_r3.json 6796f0b163dcf21af5dfe3048b53e8d2660fe10290e22222232a6c7f6668396c unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_cpu_finalization_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_cpu_finalization_execution_r21.json be55a87986dd6d80942dcd0b17dd75994145ff4a383596314d5b4ee51972a443 bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_cpu_finalization_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_cpu_finalization_execution_r21.json be55a87986dd6d80942dcd0b17dd75994145ff4a383596314d5b4ee51972a443 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_publication_receipt_r4.json 77ba176a9fab70e75b3c2c423c857d1e266f2021875aea01e15bac3f11f327d1 bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_postfit_publication_receipt_r4.json 77ba176a9fab70e75b3c2c423c857d1e266f2021875aea01e15bac3f11f327d1 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_train_only_null_r4.json 661d04d76fcf36d116feb117154eac01e6569e377d4245c07653b28696e1227b bertose_source/writing/review/multimodal/outputs/review_a5_static_v2_postfit_direct_publication_20260728_r21_stable_null_mass_adapter/review_a5_static_v2_train_only_null_r4.json 661d04d76fcf36d116feb117154eac01e6569e377d4245c07653b28696e1227b unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_a5_official_ragged_topology_receipt.json 333ee6f34e69f89e26b810cc565415b89d6874615ea4ac57850371fb159c1b71 bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_later_role_20260721_r1/review_a5_official_ragged_topology_receipt.json 333ee6f34e69f89e26b810cc565415b89d6874615ea4ac57850371fb159c1b71 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null.json a752ffd350fbe38aa0e6f6b42b76137f4f72d76fa9a7f5d3609bc47c65c552de bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null.json a752ffd350fbe38aa0e6f6b42b76137f4f72d76fa9a7f5d3609bc47c65c552de unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null_receipt.json dace4cb5df71912f5aa7531bb0ce87db3b63d726b2a12aa41facabf9d54b5c35 bertose_source/writing/review/multimodal/outputs/review_a5_topology_official_ragged_train_only_null_20260721_r1/review_a5_official_topology_train_only_null_receipt.json dace4cb5df71912f5aa7531bb0ce87db3b63d726b2a12aa41facabf9d54b5c35 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_ms_acquisition_top30_v3_20260721_r3/review_a5_ms_acquisition_top30_runtime_v3.py 68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6 bertose_source/writing/review/multimodal/runtime/a5_ms_acquisition_top30_v3_20260721_r3/review_a5_ms_acquisition_top30_runtime_v3.py 68c0d543c5411276ef56c7072bded4ebda886f46b9fa4ebf3c95c1e54c1a08c6 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_r2.py 9f8f167148aa234df413e4c3d4e1846881781c8e5a19bd91b0b178b260a3a537 bertose_source/writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r2/review_a5_native_eight_data_adapter_r2.py 9f8f167148aa234df413e4c3d4e1846881781c8e5a19bd91b0b178b260a3a537 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_r3.py a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e bertose_source/writing/review/multimodal/runtime/a5_native_eight_data_adapter_20260721_r3/review_a5_native_eight_data_adapter_r3.py a76c24cb0a3b904ae95bfda21bdeb2ba96e36293368fe44a218429be2b10d43e unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_direct_static_bridge_20260724_r1/review_a5_native_eight_direct_static_bridge_r1.py c71ba654568a24993bc1733b26b6863b11e5c198c53871a6183b485ab96540f0 bertose_source/writing/review/multimodal/runtime/a5_native_eight_direct_static_bridge_20260724_r1/review_a5_native_eight_direct_static_bridge_r1.py c71ba654568a24993bc1733b26b6863b11e5c198c53871a6183b485ab96540f0 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260727_r19_external_release_runtime_binding/review_a5_native_eight_finalization_runtime_r19.py b6266553c075e9b85d221a6278d1ef3ab1d26fbce5de70dbcd4569db42653990 bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260727_r19_external_release_runtime_binding/review_a5_native_eight_finalization_runtime_r19.py b6266553c075e9b85d221a6278d1ef3ab1d26fbce5de70dbcd4569db42653990 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260727_r19_external_release_runtime_binding/run_review_a5_native_eight_training_r19.py 28d482fbae230c999d84e64a5abd6a1260ae26fb555c92b7d3176afb37cb260a bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260727_r19_external_release_runtime_binding/run_review_a5_native_eight_training_r19.py 28d482fbae230c999d84e64a5abd6a1260ae26fb555c92b7d3176afb37cb260a unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/review_a5_native_eight_finalization_runtime_r22.py 62f5355ef06cdc56f85214ac251bfa0ed4b19b41a19ab6acac51d644678f0a62 bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/review_a5_native_eight_finalization_runtime_r22.py 62f5355ef06cdc56f85214ac251bfa0ed4b19b41a19ab6acac51d644678f0a62 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/run_review_a5_native_eight_training_r22.py cb9a583091912c59f515f46074b04c90dfbe0ebf0fc28d241db980851b180335 bertose_source/writing/review/multimodal/runtime/a5_native_eight_finalization_controller_20260728_r24_stable_null_jobside/run_review_a5_native_eight_training_r22.py cb9a583091912c59f515f46074b04c90dfbe0ebf0fc28d241db980851b180335 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r1/review_a5_native_eight_hotpath_r1.py 3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r1/review_a5_native_eight_hotpath_r1.py 3b9ada847b1ea3ecf1f12a6566b55fe1a0218b10aed9d5dabf40190cf0e70c4f unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/load_review_a5_native_eight_hotpath_r2.py 101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/load_review_a5_native_eight_hotpath_r2.py 101559df116319422762f0d7293fe55478b56defcbc1724661696163bb4fc9ae unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/review_a5_native_eight_hotpath_r2.py 941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260725_r2/review_a5_native_eight_hotpath_r2.py 941f08e0db8bbf2fa61852d4fc218f592fdd63c12f2dafdb70ed3b18e6aedf98 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/load_review_a5_native_eight_hotpath_r3.py e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/load_review_a5_native_eight_hotpath_r3.py e99f4556a8e3b3721d1f9155738d2bf4e9765e43a0e9f7734259e33533ff4b30 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/review_a5_native_eight_hotpath_r3.py a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r3/review_a5_native_eight_hotpath_r3.py a81dd58c727a28b1a383477338e41922a2d746dac5cb33f351b4501ee8c5d0dd unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/load_review_a5_native_eight_hotpath_r4.py 662d0766a8d68638480e9c44ca4070387481d43e1c666a20363025cf5b9bc958 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/load_review_a5_native_eight_hotpath_r4.py 662d0766a8d68638480e9c44ca4070387481d43e1c666a20363025cf5b9bc958 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4.py 600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r4/review_a5_native_eight_hotpath_r4.py 600af4b6b0fab63b7780bb1e6be8233eb28bd0808ff390c3096369afec9c6649 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/load_review_a5_native_eight_hotpath_r5.py 864a05e86c5ea91318b11373d2cdffcdd2ddd0777f141cb7ef0305f779a42ea6 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/load_review_a5_native_eight_hotpath_r5.py 864a05e86c5ea91318b11373d2cdffcdd2ddd0777f141cb7ef0305f779a42ea6 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5.py ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r5/review_a5_native_eight_hotpath_r5.py ce4bad9195229341cab0890ed775b78126c17a23d82f2244757f120c12b346c8 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/load_review_a5_native_eight_hotpath_r6.py e2496170942db844e4ebe71d4c098b0d0cf99540d3465ed7e8e9a113469cf7d2 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/load_review_a5_native_eight_hotpath_r6.py e2496170942db844e4ebe71d4c098b0d0cf99540d3465ed7e8e9a113469cf7d2 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6.py 73b42e5131c64284c6f748ddf81b4d187dcb57f756c88c22240d189f2afc4cef bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260726_r6/review_a5_native_eight_hotpath_r6.py 73b42e5131c64284c6f748ddf81b4d187dcb57f756c88c22240d189f2afc4cef unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/load_review_a5_native_eight_hotpath_r7.py fa9538829ff3ccfaf3d3f4346c7e735c70758661eb6bf3da5eece2e7e96e0fb6 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/load_review_a5_native_eight_hotpath_r7.py fa9538829ff3ccfaf3d3f4346c7e735c70758661eb6bf3da5eece2e7e96e0fb6 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7.py c0cb618f7856daf24666dbec07ff51b86e3fbd52c073c58bd1b7151122714f47 bertose_source/writing/review/multimodal/runtime/a5_native_eight_hotpath_20260727_r7_cuda_rng_cpu_normalization/review_a5_native_eight_hotpath_r7.py c0cb618f7856daf24666dbec07ff51b86e3fbd52c073c58bd1b7151122714f47 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_submission_20260727_r15_preparation/review_a5_native_eight_submission_contract_r15.py 35c7a13da662f49bec07b63f590c8fb3d9cc4578633a179da42ff2650a2d7865 bertose_source/writing/review/multimodal/runtime/a5_native_eight_submission_20260727_r15_preparation/review_a5_native_eight_submission_contract_r15.py 35c7a13da662f49bec07b63f590c8fb3d9cc4578633a179da42ff2650a2d7865 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r1/review_a5_native_eight_training_runner_r1.py 34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r1/review_a5_native_eight_training_runner_r1.py 34785bf46f38579e48c3be6326f667a04521cb7d95c1f94c5200d84012b577bf unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/review_a5_native_eight_training_runner_r2.py 7e93b13b3212b3c97e30144f3e393a86a13411d5e82fe19bd55d43bc58587e30 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/review_a5_native_eight_training_runner_r2.py 7e93b13b3212b3c97e30144f3e393a86a13411d5e82fe19bd55d43bc58587e30 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/run_review_a5_native_eight_training_r2.py 195dbedfde65c061eb0fca5684270ff95a2bec16732683b1df7f40d91909cc7f bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r2/run_review_a5_native_eight_training_r2.py 195dbedfde65c061eb0fca5684270ff95a2bec16732683b1df7f40d91909cc7f unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/review_a5_native_eight_training_runner_r3.py 550588ca033718273de2e35825b8b9faffe4a5fb747ff8775fe17bb31050d9be bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/review_a5_native_eight_training_runner_r3.py 550588ca033718273de2e35825b8b9faffe4a5fb747ff8775fe17bb31050d9be unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/run_review_a5_native_eight_training_r3.py bba69e736a44fbfa6b380089d50b945e93b45d5202fa265b5869ffd378149040 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260722_r3/run_review_a5_native_eight_training_r3.py bba69e736a44fbfa6b380089d50b945e93b45d5202fa265b5869ffd378149040 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/review_a5_native_eight_training_runner_r8.py cbc9fc0179ecb1e7c449fa37a574f38ff3e912e13db5c984d87e05e3e347a0e1 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/review_a5_native_eight_training_runner_r8.py cbc9fc0179ecb1e7c449fa37a574f38ff3e912e13db5c984d87e05e3e347a0e1 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/run_review_a5_native_eight_training_r8.py 213afce295408dda11cf3ede98ebff191735a77e1db09b6252cae964caca39e2 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r8/run_review_a5_native_eight_training_r8.py 213afce295408dda11cf3ede98ebff191735a77e1db09b6252cae964caca39e2 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/review_a5_native_eight_training_runner_r9.py 4430560565a18da0e68700d60526d3dec15fabd79854111d1e85deb59e2381c8 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/review_a5_native_eight_training_runner_r9.py 4430560565a18da0e68700d60526d3dec15fabd79854111d1e85deb59e2381c8 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/run_review_a5_native_eight_training_r9.py b2bae85c879d2d266ac1e39869c661625958e21c1c3b7299713c8a0b46827ec5 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260724_r9_isolated_path/run_review_a5_native_eight_training_r9.py b2bae85c879d2d266ac1e39869c661625958e21c1c3b7299713c8a0b46827ec5 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r11_certification_gate_candidate/review_a5_native_eight_certification_gate_r11.py ce7626823c2980bc21b46a7eec6c1961a87dc5512525e553c49f2c7d57bf0430 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r11_certification_gate_candidate/review_a5_native_eight_certification_gate_r11.py ce7626823c2980bc21b46a7eec6c1961a87dc5512525e553c49f2c7d57bf0430 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_final_bindings_r12.py a8cfaca102f7c3d0c7936d244ce1e9ed75099e70c0ca3a27943be7ce5587b6e0 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_final_bindings_r12.py a8cfaca102f7c3d0c7936d244ce1e9ed75099e70c0ca3a27943be7ce5587b6e0 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_training_runner_r12.py 47e973c7c4ed5bc6686e5d7795b00d3eea5c2da8c2a15fc534a7cc24c1744ee1 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/review_a5_native_eight_training_runner_r12.py 47e973c7c4ed5bc6686e5d7795b00d3eea5c2da8c2a15fc534a7cc24c1744ee1 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/run_review_a5_native_eight_training_r12.py 66270933d1ff23ffe50b800267a4705c905fc423e8e2c929bf642cb5c6c37def bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260725_r12_r11_integrated/run_review_a5_native_eight_training_r12.py 66270933d1ff23ffe50b800267a4705c905fc423e8e2c929bf642cb5c6c37def unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_direct_submit_controller_r13.py 2feb9a90db66ca277fb9e23d079ce8b089a31060e5670961a13b0e5146ed39a8 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_direct_submit_controller_r13.py 2feb9a90db66ca277fb9e23d079ce8b089a31060e5670961a13b0e5146ed39a8 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py c30b6b03dae852a4b10c6d01596e977d8a071e738dc3074f1ca0592a50778dd3 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_final_bindings_r13.py c30b6b03dae852a4b10c6d01596e977d8a071e738dc3074f1ca0592a50778dd3 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py 17cf8ab216b354ec1de7574ebebd7bfe02b5935da605b4131e45c7aa13982d5b bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/review_a5_native_eight_training_runner_r13.py 17cf8ab216b354ec1de7574ebebd7bfe02b5935da605b4131e45c7aa13982d5b unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/run_review_a5_native_eight_training_r13.py a2a0a0d9056c7cd360913a792ff5e3390a190b692d7663c3a6d48a3ee0f180d5 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r13_final_candidate/run_review_a5_native_eight_training_r13.py a2a0a0d9056c7cd360913a792ff5e3390a190b692d7663c3a6d48a3ee0f180d5 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/__init__.py 737b1caa9086f8ac1556c05625d1b5391b8cae58e9d98a7755fa72f44e94c7ba bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/__init__.py 737b1caa9086f8ac1556c05625d1b5391b8cae58e9d98a7755fa72f44e94c7ba unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_final_bindings_r14.py bd6c704239e2bb4898dddda5c86274f41cd5b304b35d584ddfae3884e8bc8503 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_final_bindings_r14.py bd6c704239e2bb4898dddda5c86274f41cd5b304b35d584ddfae3884e8bc8503 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_strict_successor_r14.py eda983e1b0c29357eb1b6e2f555f402a83b7176fb857488e9be5f5faed490b2d bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260726_r14_r6_strict_candidate/review_a5_native_eight_strict_successor_r14.py eda983e1b0c29357eb1b6e2f555f402a83b7176fb857488e9be5f5faed490b2d unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/__init__.py 7ef11d9a891d32b0c1bb3ee24016700acd14251ac49448f004a701cdea79ca53 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/__init__.py 7ef11d9a891d32b0c1bb3ee24016700acd14251ac49448f004a701cdea79ca53 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_bindings_r15.py 1f21427486260e8b56795f7137f0f7322ae768d80645db6636414e5961aa3224 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_bindings_r15.py 1f21427486260e8b56795f7137f0f7322ae768d80645db6636414e5961aa3224 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_gate_r15.py 1556d6e2643edfc80b6b6782164ab47560e259ff55791c50dcffdd9b9afc001f bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r15_current_static_terminal_gate_preparation/review_a5_native_eight_current_terminal_gate_r15.py 1556d6e2643edfc80b6b6782164ab47560e259ff55791c50dcffdd9b9afc001f unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation/review_a5_native_eight_final_bindings_r16.py 1287db8472580db69e38d60be8c13beeddb4fdde7958a5b302d072e1226f4de3 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation/review_a5_native_eight_final_bindings_r16.py 1287db8472580db69e38d60be8c13beeddb4fdde7958a5b302d072e1226f4de3 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation/review_a5_native_eight_release_successor_r16.py 689db8aaf51d15288f01b196c5ad2fe8ee3ca8aab3ff525695abaa9f25060ff6 bertose_source/writing/review/multimodal/runtime/a5_native_eight_training_20260727_r16_r7_cuda_terminal_preparation/review_a5_native_eight_release_successor_r16.py 689db8aaf51d15288f01b196c5ad2fe8ee3ca8aab3ff525695abaa9f25060ff6 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_balanced_planner_r4.py 2c985edfe747bae712c41689da8be2abb5096bd97a8771691b3676d3a8af49fd bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_balanced_planner_r4.py 2c985edfe747bae712c41689da8be2abb5096bd97a8771691b3676d3a8af49fd unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_composite_r4.py 52a311636e7631b97711aab63aec28e2ada47a446d1aecc1a47921d584f69f9d bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_composite_r4.py 52a311636e7631b97711aab63aec28e2ada47a446d1aecc1a47921d584f69f9d unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_balanced_planner_r5.py 1b9b05c812603db7b216aa989214a3c3715f80032b3a8b82577ae2b9e48f048d bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_balanced_planner_r5.py 1b9b05c812603db7b216aa989214a3c3715f80032b3a8b82577ae2b9e48f048d unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_composite_r5.py 24c35257fc61e1c9c77630d2b0075775a7f46b6500ecb5f175ef8f42bd214e0e bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_composite_r5.py 24c35257fc61e1c9c77630d2b0075775a7f46b6500ecb5f175ef8f42bd214e0e unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_executor_r5.py a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2 bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_executor_r5.py a482a70a2edcb7c9936b091a86a0f7d98714b5bab09a0bdc80cd927f015a46f2 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_r4_lineage_receipt_r1.json b5fbdff168de23676208484ccccc3cc32f613ea411d193e6d8930456e8edeeef bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_r4_lineage_receipt_r1.json b5fbdff168de23676208484ccccc3cc32f613ea411d193e6d8930456e8edeeef unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r6/review_a5_native_eight_executor_r6.py e47e6e9810db0e8ec9d37ce5533f762e287b162f811bfadc347666f5ad78db82 bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r6/review_a5_native_eight_executor_r6.py e47e6e9810db0e8ec9d37ce5533f762e287b162f811bfadc347666f5ad78db82 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r7/review_a5_native_eight_executor_r7.py e068a3c233fc3fd94fe3b8618edb9bd8c87fd81b97dff2666206fb870f0f898a bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r7/review_a5_native_eight_executor_r7.py e068a3c233fc3fd94fe3b8618edb9bd8c87fd81b97dff2666206fb870f0f898a unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r8/review_a5_native_eight_executor_r8.py 60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630 bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r8/review_a5_native_eight_executor_r8.py 60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_static_failure_release_chain_20260727_r1_preparation/review_a5_native_static_failure_release_gate_r1.py ee97bf4e68ddfbf280b7e0f01ce3409c4d4692feafbc9382613bbc5698913fa7 bertose_source/writing/review/multimodal/runtime/a5_static_failure_release_chain_20260727_r1_preparation/review_a5_native_static_failure_release_gate_r1.py ee97bf4e68ddfbf280b7e0f01ce3409c4d4692feafbc9382613bbc5698913fa7 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_static_v2_epoch_boundary_resume_20260725_r1/run_review_a5_static_v2_epoch_boundary_resume_r1_scavenger_v100.sbatch f420c84258cdf4247fdd766a9e8470bad55bd1f845ebd6640ec70b97b3953e6e bertose_source/writing/review/multimodal/runtime/a5_static_v2_epoch_boundary_resume_20260725_r1/run_review_a5_static_v2_epoch_boundary_resume_r1_scavenger_v100.sbatch f420c84258cdf4247fdd766a9e8470bad55bd1f845ebd6640ec70b97b3953e6e unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_checkpoint_store_r2.py f2e558c52bf166d6e7f42ecdd92995f2b70c8a174eab8d6814875399fb69732e bertose_source/writing/review/multimodal/runtime/a5_static_v2_ops_20260721_r2/review_a5_static_v2_checkpoint_store_r2.py f2e558c52bf166d6e7f42ecdd92995f2b70c8a174eab8d6814875399fb69732e unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/review_a5_static_v2_postfit_direct_publication_r2.py 8e57c17fd43f3894f94f980cf70a0d6d7f183cf04c26780c3fe30c1932bb7abb bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/review_a5_static_v2_postfit_direct_publication_r2.py 8e57c17fd43f3894f94f980cf70a0d6d7f183cf04c26780c3fe30c1932bb7abb unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/run_review_a5_static_v2_postfit_direct_publication_r2.py c46a7d4644899a5e7551e2dd5eb30666e01e0f36e2f65a2cd821b8c5565258dc bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260724_r2/run_review_a5_static_v2_postfit_direct_publication_r2.py c46a7d4644899a5e7551e2dd5eb30666e01e0f36e2f65a2cd821b8c5565258dc unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r4_terminal_certification/review_a5_static_v2_terminal_certification_r4.py 3b9632e840265e1a5c1d226f3fe7fb8cd4c448f810f3826c59e19c25132dd04f bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r4_terminal_certification/review_a5_static_v2_terminal_certification_r4.py 3b9632e840265e1a5c1d226f3fe7fb8cd4c448f810f3826c59e19c25132dd04f unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r5_terminal_certification/__init__.py 9429deca8cfb6cb25ef6f79a5b0ee0b91d47657e7f21f61627afd655d08fe7d3 bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r5_terminal_certification/__init__.py 9429deca8cfb6cb25ef6f79a5b0ee0b91d47657e7f21f61627afd655d08fe7d3 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r5_terminal_certification/review_a5_static_v2_terminal_certification_r5.py 04d724ee84f67565e2f0229db99006c8f64d2492564643f6e60af25930cf12a1 bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r5_terminal_certification/review_a5_static_v2_terminal_certification_r5.py 04d724ee84f67565e2f0229db99006c8f64d2492564643f6e60af25930cf12a1 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/__init__.py bbdce8deb776917ade3704eb5d08b064917f52c76f3f39ee345b3b2938992add bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/__init__.py bbdce8deb776917ade3704eb5d08b064917f52c76f3f39ee345b3b2938992add unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/review_a5_static_v2_production_module_roster_r6.json 195d41bba2282fdfde77a88f8b0a70eb64b0207d1a9efd42ddaeb873f8ccaeed bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/review_a5_static_v2_production_module_roster_r6.json 195d41bba2282fdfde77a88f8b0a70eb64b0207d1a9efd42ddaeb873f8ccaeed unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/review_a5_static_v2_terminal_certification_r6.py bdb0fa37804531f6446cee9411c9730fde792eb9674054e56b883156f36da4cb bertose_source/writing/review/multimodal/runtime/a5_static_v2_postfit_direct_publication_20260725_r6_terminal_certification/review_a5_static_v2_terminal_certification_r6.py bdb0fa37804531f6446cee9411c9730fde792eb9674054e56b883156f36da4cb unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/a5_wa345_continuation_manifest_20260819_r1.json 30b64143eb15688fa1e1c8aeaf3b84eb08a2a65730fa1c996c9ef6f12679d80f bertose_source/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/a5_wa345_continuation_manifest_20260819_r1.json 30b64143eb15688fa1e1c8aeaf3b84eb08a2a65730fa1c996c9ef6f12679d80f unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/submit_a5_wa345_continuation_20260819_r1.sbatch f517b5c99d93103d1212b2153c26be1cc58267c7b2d9bfa747f6d512f0fdadf2 bertose_source/writing/review/multimodal/runtime/a5_wa345_continuation_20260819_r1_preparation/submit_a5_wa345_continuation_20260819_r1.sbatch f517b5c99d93103d1212b2153c26be1cc58267c7b2d9bfa747f6d512f0fdadf2 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/a5_wa345_manifest_20260817_r1.json eeebc9c7e2cfc701f3ad47e62696ae2247c8caec93d8b034d5f573b701eab2a1 bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/a5_wa345_manifest_20260817_r1.json eeebc9c7e2cfc701f3ad47e62696ae2247c8caec93d8b034d5f573b701eab2a1 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/run_a5_wa345_shim_20260817_r1.py 5159414381025cf3e2d5e742422c84c292481168af42801c773df4ba12797fb4 bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/run_a5_wa345_shim_20260817_r1.py 5159414381025cf3e2d5e742422c84c292481168af42801c773df4ba12797fb4 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/submit_a5_wa345_20260817_r1.sbatch a090f111df7cc0db09e61ea0a8067882b7cd9bf21d91c53da4115549560b08e7 bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/submit_a5_wa345_20260817_r1.sbatch a090f111df7cc0db09e61ea0a8067882b7cd9bf21d91c53da4115549560b08e7 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/review_md_temporal_20x6_a1111_wa2_manifest_20260811_r1.json 600144a7f5b893958d629083a3a9266eec980765218408d2d51db72b73c1e506 bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/review_md_temporal_20x6_a1111_wa2_manifest_20260811_r1.json 600144a7f5b893958d629083a3a9266eec980765218408d2d51db72b73c1e506 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py dd74253863f39150af4ddc7e8d48c0a366e1f327c30aa50e0748078330b97b85 bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/run_review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1.py dd74253863f39150af4ddc7e8d48c0a366e1f327c30aa50e0748078330b97b85 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/submit_review_md_temporal_20x6_a1111_wa2_20260811_r1.sbatch 6ffd2f97706bdf0001b90ca2f8af7ec565b298cc8585444ba6027194d0e378d2 bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_a1111_wa2_s424344_20260811_r2_log_route_preparation/submit_review_md_temporal_20x6_a1111_wa2_20260811_r1.sbatch 6ffd2f97706bdf0001b90ca2f8af7ec565b298cc8585444ba6027194d0e378d2 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/__init__.py aa37d1e86bd3a58262f9824ba80993c0f0f280db4d0f4d704ca469dc12ba3df7 bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/__init__.py aa37d1e86bd3a58262f9824ba80993c0f0f280db4d0f4d704ca469dc12ba3df7 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/review_md_temporal_20x6_core_r3.py 3e96d8092239c2c21f217ad5bae4ee7e07dbe0f7630b213bad468d6b08d3b1c1 bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/review_md_temporal_20x6_core_r3.py 3e96d8092239c2c21f217ad5bae4ee7e07dbe0f7630b213bad468d6b08d3b1c1 unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/run_review_md_temporal_20x6_training_r3.py 1e446e7e89a39ef01132b9f2a4deb817161f7b376a0fa04c2b11529004f53e8a bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/run_review_md_temporal_20x6_training_r3.py 1e446e7e89a39ef01132b9f2a4deb817161f7b376a0fa04c2b11529004f53e8a unchanged inherited file +submit_comm/06_code/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260805_r4_dev_memory/run_review_md_temporal_20x6_training_r4.py a6a180ae103eaaf68458b298cd4180920a0e88c1724a6ba9a94ef94559e75c5f bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260805_r4_dev_memory/run_review_md_temporal_20x6_training_r4.py a6a180ae103eaaf68458b298cd4180920a0e88c1724a6ba9a94ef94559e75c5f unchanged inherited file +new workbench interface or documentation bertose_workbench.py 32285cc5fedd421032bd98b97214f899ccacda9b211c1b2a97a3fb1513f1ad70 workbench release change +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/bertosebind_inference/README.md 3d3077181b519b0106d9201ee8514a41905e32057237d8fdb48343e10cfa97b3 bertosebind_inference/README.md 3d3077181b519b0106d9201ee8514a41905e32057237d8fdb48343e10cfa97b3 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/bertosebind_inference/__init__.py 81f3da9b814892c3f12b2f7a535284b89f0be07b22bce50a374c8303d6db6c72 bertosebind_inference/__init__.py 81f3da9b814892c3f12b2f7a535284b89f0be07b22bce50a374c8303d6db6c72 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/bertosebind_inference/check_real_examples.py b7cfcdaf1c902664252f3d2022e290a803892a31618c1290c09c174131036541 bertosebind_inference/check_real_examples.py b7cfcdaf1c902664252f3d2022e290a803892a31618c1290c09c174131036541 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/bertosebind_inference/config.json 07282f0fec34ef2cf9f832c3662227ca89064b52e3fdbe9fd3ad11b5f4e01154 bertosebind_inference/config.json 07282f0fec34ef2cf9f832c3662227ca89064b52e3fdbe9fd3ad11b5f4e01154 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/bertosebind_inference/examples/doubly_cold.csv d748e004c483597c86cc214ecd43f5c902e3d3ced41d1e9223b555dfa3b9ed58 bertosebind_inference/examples/doubly_cold.csv d748e004c483597c86cc214ecd43f5c902e3d3ced41d1e9223b555dfa3b9ed58 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/bertosebind_inference/examples/glycan_cold.csv c50e124eba39a8bb5f08e4d75e54b0f168ff74ee886d7f28e3156b3beba6ad96 bertosebind_inference/examples/glycan_cold.csv c50e124eba39a8bb5f08e4d75e54b0f168ff74ee886d7f28e3156b3beba6ad96 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/bertosebind_inference/examples/protein_cold.csv 6d70ea272cb716c7bf001675493496bfe7491add0185c010f83417a8ed607784 bertosebind_inference/examples/protein_cold.csv 6d70ea272cb716c7bf001675493496bfe7491add0185c010f83417a8ed607784 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/bertosebind_inference/examples/reference.json 3de9b7e6b9c6035c0e07504b1dadb2c1c430151b7c889c33825a437a5c70e659 bertosebind_inference/examples/reference.json 3de9b7e6b9c6035c0e07504b1dadb2c1c430151b7c889c33825a437a5c70e659 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/bertosebind_inference/loader.py 0c074c3901ac55b737e10a2b316db3c00678e569d151fc3e2192b46bd1662ce6 bertosebind_inference/loader.py 0c074c3901ac55b737e10a2b316db3c00678e569d151fc3e2192b46bd1662ce6 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/bertosebind_inference/local_checks.json e06c540874abbfd72b72b6ee41aa2d35a6d35bf11d26e10714f382d031765b3a bertosebind_inference/local_checks.json e06c540874abbfd72b72b6ee41aa2d35a6d35bf11d26e10714f382d031765b3a unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/bertosebind_inference/predict.py fe3f559157a6bc3dd4b59803fb010054c8987f402b6790f488e6cce51bc95d4b bertosebind_inference/predict.py fe3f559157a6bc3dd4b59803fb010054c8987f402b6790f488e6cce51bc95d4b unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/README.md b18eed4c3ad4f0cbdd700e41d6ff7af1f520d26386f76f4573e82332f3e1ea28 bertosebind_new_runs/README.md b18eed4c3ad4f0cbdd700e41d6ff7af1f520d26386f76f4573e82332f3e1ea28 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/audit_pretraining_exposure.py fc4ffac8de965da6250297ee24fa801be2619f1afcc29471204c7e5aead03012 bertosebind_new_runs/audit_pretraining_exposure.py fc4ffac8de965da6250297ee24fa801be2619f1afcc29471204c7e5aead03012 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/check_package.py 2b8be4fcd7ebc98f49e9532415644f457930a1e7700d5c17fdc58a0abd0dd271 bertosebind_new_runs/check_package.py 2b8be4fcd7ebc98f49e9532415644f457930a1e7700d5c17fdc58a0abd0dd271 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/local/audit_current_pretraining_exposure.py 45a366b40a523671427950b83ac2c8a243c96f1bce8527b0af2337a375ff2b15 bertosebind_new_runs/executed/local/audit_current_pretraining_exposure.py 45a366b40a523671427950b83ac2c8a243c96f1bce8527b0af2337a375ff2b15 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/local/collect_current_glycan_sets.py bdb19bf323c94eacc1943b4345b5b2485dfa50b7ac00a755e8a1dde2f8a4ed74 bertosebind_new_runs/executed/local/collect_current_glycan_sets.py bdb19bf323c94eacc1943b4345b5b2485dfa50b7ac00a755e8a1dde2f8a4ed74 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/local/dc_anatomy.py 9c9b90f077709c105dd16b706ebcd434dd793177c274eca17b10bc3241f0138b bertosebind_new_runs/executed/local/dc_anatomy.py 9c9b90f077709c105dd16b706ebcd434dd793177c274eca17b10bc3241f0138b unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/aff_attribution_motif.py 33d41f680cf7a5ae3b98fef4d1ef604f6e12a6a856ec6e90df8bb5a88f336bbe bertosebind_new_runs/executed/remote/aff_attribution_motif.py 33d41f680cf7a5ae3b98fef4d1ef604f6e12a6a856ec6e90df8bb5a88f336bbe unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/aff_attribution_motif.sbatch 2b89020895eebac8c99366036eebb07dd43c687fe47274dcd1de47d1017548ff bertosebind_new_runs/executed/remote/aff_attribution_motif.sbatch 2b89020895eebac8c99366036eebb07dd43c687fe47274dcd1de47d1017548ff unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_A_glycan_gifflarESM.json d7f21b8037172e6d42fb65c8169d37b19c385d68dc9cbebadbafe9e930843074 bertosebind_new_runs/executed/remote/affinose_gifflar_macro_A_glycan_gifflarESM.json d7f21b8037172e6d42fb65c8169d37b19c385d68dc9cbebadbafe9e930843074 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_A_glycan_sweetnetESM.json eca94bfbe82bfba95c2086c9c4ffe14091d442017356394ec2e75173cb66810f bertosebind_new_runs/executed/remote/affinose_gifflar_macro_A_glycan_sweetnetESM.json eca94bfbe82bfba95c2086c9c4ffe14091d442017356394ec2e75173cb66810f unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_B_protein_gifflarESM.json 529296c1388651b4451f35829d0caa63e692a96fc88b74ee9b8dc8c1d09136da bertosebind_new_runs/executed/remote/affinose_gifflar_macro_B_protein_gifflarESM.json 529296c1388651b4451f35829d0caa63e692a96fc88b74ee9b8dc8c1d09136da unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_B_protein_sweetnetESM.json 6f0098947aa4c962f991d1e17acc17707d7cb2eb5e9d6338182d6cfa65d28a2d bertosebind_new_runs/executed/remote/affinose_gifflar_macro_B_protein_sweetnetESM.json 6f0098947aa4c962f991d1e17acc17707d7cb2eb5e9d6338182d6cfa65d28a2d unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_C_doubly_gifflarESM.json bf720edacbad09cd04c42df7cf347dd1fe9846a22f307f7be1c38f06e89faa44 bertosebind_new_runs/executed/remote/affinose_gifflar_macro_C_doubly_gifflarESM.json bf720edacbad09cd04c42df7cf347dd1fe9846a22f307f7be1c38f06e89faa44 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/affinose_gifflar_macro_C_doubly_sweetnetESM.json 1884d744232b56c5edc76e655cf9bd117e43d8d749c98300b528ea6a5e55b75d bertosebind_new_runs/executed/remote/affinose_gifflar_macro_C_doubly_sweetnetESM.json 1884d744232b56c5edc76e655cf9bd117e43d8d749c98300b528ea6a5e55b75d unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/affinose_glycan_cold_contamination.json 0d4458462cd10dae219a9f15eb6dc8129d200a09891bd0b6bf0297cd85c4dae2 bertosebind_new_runs/executed/remote/affinose_glycan_cold_contamination.json 0d4458462cd10dae219a9f15eb6dc8129d200a09891bd0b6bf0297cd85c4dae2 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/b4_baselines_perrow.py 61a5ef32482365e37e58bd4aee49ff5dabc2fafa04f4e063f3a0be7c294c84c7 bertosebind_new_runs/executed/remote/b4_baselines_perrow.py 61a5ef32482365e37e58bd4aee49ff5dabc2fafa04f4e063f3a0be7c294c84c7 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/b4_gif_repeat.sbatch a381978d36492bb21cdb7c2a3007c51414b7630dd88016c7a74eb19c48080925 bertosebind_new_runs/executed/remote/b4_gif_repeat.sbatch a381978d36492bb21cdb7c2a3007c51414b7630dd88016c7a74eb19c48080925 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/b4_gif_repeat_compare.py 7fe6a80de1e7662a916e84b0a679c5579ab7fdcaaace70e1855f7d8face51ca3 bertosebind_new_runs/executed/remote/b4_gif_repeat_compare.py 7fe6a80de1e7662a916e84b0a679c5579ab7fdcaaace70e1855f7d8face51ca3 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/b4_lo_perrow_ckpt.py 1d0433763d7ad49088e396b435a42f2a12141436db05592778a79938c88a953b bertosebind_new_runs/executed/remote/b4_lo_perrow_ckpt.py 1d0433763d7ad49088e396b435a42f2a12141436db05592778a79938c88a953b unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/b4_step1_structure.py c82d7fe71d178d78d52ee47d809cd12d0286c48b1375c0c7b8b80fa222858e61 bertosebind_new_runs/executed/remote/b4_step1_structure.py c82d7fe71d178d78d52ee47d809cd12d0286c48b1375c0c7b8b80fa222858e61 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/b4_step3_bootstrap.py ab7560abe237da435464a984a4e23925e7ec48d802949f57ef9600b829e6b37d bertosebind_new_runs/executed/remote/b4_step3_bootstrap.py ab7560abe237da435464a984a4e23925e7ec48d802949f57ef9600b829e6b37d unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/b4_step3_bootstrap_r2.py 6dbbbeb14bb860f6344a93bb65754f540dee8da4ceb3fdc526133c7133dd426c bertosebind_new_runs/executed/remote/b4_step3_bootstrap_r2.py 6dbbbeb14bb860f6344a93bb65754f540dee8da4ceb3fdc526133c7133dd426c unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_gif_repeat_20260927.json 50049bf5658f27700205e91d07f40512b8d297a7af11f51fcfbd514df9b59478 bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_gif_repeat_20260927.json 50049bf5658f27700205e91d07f40512b8d297a7af11f51fcfbd514df9b59478 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step1_structure_20260926.json 7f9edc64528d5b43d2c464f8f5d4db91c2a133f54364993c7798a2a606bd3427 bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step1_structure_20260926.json 7f9edc64528d5b43d2c464f8f5d4db91c2a133f54364993c7798a2a606bd3427 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step3_bootstrap_20260926.json 17ab513ec2d9dec6f1e8c9445dfd7500190f99f0e8758b21fbb435b026324f3b bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step3_bootstrap_20260926.json 17ab513ec2d9dec6f1e8c9445dfd7500190f99f0e8758b21fbb435b026324f3b unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json 6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235 bertosebind_new_runs/executed/remote/diagnostics/affinose_b4_step3_bootstrap_r2_20260927.json 6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml 1ab7793ddb0daa247dc1f75b53356663d2c99e2e279a33207c9dd82f24288d17 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan.yaml 1ab7793ddb0daa247dc1f75b53356663d2c99e2e279a33207c9dd82f24288d17 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml cda3d3e0df11dcbffff287c985039a4abe486a39bb97fe1554851992cbca127e bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_gifflar.yaml cda3d3e0df11dcbffff287c985039a4abe486a39bb97fe1554851992cbca127e unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml d11d6ca73935a664a9afe9330d07e51b7e95e89e044a1012065ef1780d820381 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s43_sweetnet.yaml d11d6ca73935a664a9afe9330d07e51b7e95e89e044a1012065ef1780d820381 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml dab891f502cb328f8313a9d2971e5d8134472b059fa776409f97f5f59e5d470b bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_gifflar.yaml dab891f502cb328f8313a9d2971e5d8134472b059fa776409f97f5f59e5d470b unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml 875883d0ec38fca1a4995ea76c00db81ba84357fb2ed9a7c0921dbb6c7cf6492 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_A_glycan_s44_sweetnet.yaml 875883d0ec38fca1a4995ea76c00db81ba84357fb2ed9a7c0921dbb6c7cf6492 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml 529c3940cfce81ab3d135f25b722d7c302cd83e8540646f041a5d6ba36baebf3 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein.yaml 529c3940cfce81ab3d135f25b722d7c302cd83e8540646f041a5d6ba36baebf3 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml 908379483dc5b2d0655aa7b0a13b33c8b70ba0379852ffc2d848e354ebd9945e bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_gifflar.yaml 908379483dc5b2d0655aa7b0a13b33c8b70ba0379852ffc2d848e354ebd9945e unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml 57cbf88ddf620ffbec7c4a8167a271ec38da0f94b1d3a4e9fe9769a9a19b8eea bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s43_sweetnet.yaml 57cbf88ddf620ffbec7c4a8167a271ec38da0f94b1d3a4e9fe9769a9a19b8eea unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml 5e518f2db88c03663eb263a5e4a44e93a3bc43e51c4af6c626cd0da416a18d81 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_gifflar.yaml 5e518f2db88c03663eb263a5e4a44e93a3bc43e51c4af6c626cd0da416a18d81 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml 50c68416d3d4d72445e61811474179cb552e60d9f8a87f6cc0ed1da32d8b55e8 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_B_protein_s44_sweetnet.yaml 50c68416d3d4d72445e61811474179cb552e60d9f8a87f6cc0ed1da32d8b55e8 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml 034ba8bdefc3410b987d7bc380bd24a469a01c912349fef1e35436df2a24c36e bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly.yaml 034ba8bdefc3410b987d7bc380bd24a469a01c912349fef1e35436df2a24c36e unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml ed244565f2f81e6c554613718398af97683ad375eb4debb5a61d25855c444368 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_gifflar.yaml ed244565f2f81e6c554613718398af97683ad375eb4debb5a61d25855c444368 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml d8ba3e8d83871cdd92548bc8bab1493225cdcbd536c0004ff6b40b48e4e62e40 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s43_sweetnet.yaml d8ba3e8d83871cdd92548bc8bab1493225cdcbd536c0004ff6b40b48e4e62e40 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml 2faa1986c043cf5d8b869d316afa0a043d071400c4f2018ba83551332a143f25 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_gifflar.yaml 2faa1986c043cf5d8b869d316afa0a043d071400c4f2018ba83551332a143f25 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml 5fd2cdec3ee4d49f7d7441a037e0a2fbe428b1c0586de88beaf17a2ab67580f1 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_s44_sweetnet.yaml 5fd2cdec3ee4d49f7d7441a037e0a2fbe428b1c0586de88beaf17a2ab67580f1 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_sweetonly.yaml e8fafb98627685ededa4392c5310e149a7dbbe907e37b43da7d20d228961b181 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/configs/lgi/ours_C_doubly_sweetonly.yaml e8fafb98627685ededa4392c5310e149a7dbbe907e37b43da7d20d228961b181 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/data/utils.py ab257b93c23a522dcd99f37b2b802e67c8e3b4ba46b938db6229a6311a77cd39 bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/data/utils.py ab257b93c23a522dcd99f37b2b802e67c8e3b4ba46b938db6229a6311a77cd39 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/train.py ab79451e7b51e27d985904a4445fc09b756d759413bb2ebaf8755d177bb3e8ad bertosebind_new_runs/executed/remote/external/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/bench/models/GIFFLAR/gifflar/train.py ab79451e7b51e27d985904a4445fc09b756d759413bb2ebaf8755d177bb3e8ad unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gif_seeds.sbatch 56bf1e5b11a386d0920b9f50da6288eff222ee1b7f25d772a8a666a2387b2a9d bertosebind_new_runs/executed/remote/gif_seeds.sbatch 56bf1e5b11a386d0920b9f50da6288eff222ee1b7f25d772a8a666a2387b2a9d unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_launch.py 241d3ca6045610a70ccad8307448b4d57e47810c945f127fef768357e56cdef2 bertosebind_new_runs/executed/remote/gifflar_launch.py 241d3ca6045610a70ccad8307448b4d57e47810c945f127fef768357e56cdef2 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml e391584ec821c1e86916c6f8c14a6571a550034fd246e1dc0e7d7b3b6d4dbd7e bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml e391584ec821c1e86916c6f8c14a6571a550034fd246e1dc0e7d7b3b6d4dbd7e unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv 35d0ef06a1b9725233ed1e58c74101b7e6a555da48165ed57c9bd71bb5e77315 bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv 35d0ef06a1b9725233ed1e58c74101b7e6a555da48165ed57c9bd71bb5e77315 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml 0dae829566b87d0dd00613343bc5a0c49fb1107c0f4834327d8cca71b8932389 bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml 0dae829566b87d0dd00613343bc5a0c49fb1107c0f4834327d8cca71b8932389 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv fd6f39dd3bef9326bc1f583bf07a1f9b8f02f846630a0c58c66c7bae70456d59 bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv fd6f39dd3bef9326bc1f583bf07a1f9b8f02f846630a0c58c66c7bae70456d59 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml fb07ac7cfcb63c4dd77c7493f4a518e11d268fd5e8d4cf6a849c31552e48369a bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml fb07ac7cfcb63c4dd77c7493f4a518e11d268fd5e8d4cf6a849c31552e48369a unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv 1d9e1b8c6fff12f8603ce8f7e58189da0ae8580e72d3c5bf5ff3893a4f9bce2f bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv 1d9e1b8c6fff12f8603ce8f7e58189da0ae8580e72d3c5bf5ff3893a4f9bce2f unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml 4902e83edaa137f55f5fe4f32f32068e94a3f4832630b284048c22b8a099dca6 bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml 4902e83edaa137f55f5fe4f32f32068e94a3f4832630b284048c22b8a099dca6 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv b911e06e11968f9d8655ab69619f33a8878759e497eb44498432c341dc6fbdd1 bertosebind_new_runs/executed/remote/gifflar_lgi_A_glycan/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv b911e06e11968f9d8655ab69619f33a8878759e497eb44498432c341dc6fbdd1 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml 75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml 75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv 346d480fa44e31a5a486bfa99c136cc5ddfee27a197194b7fac289de9ba55665 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv 346d480fa44e31a5a486bfa99c136cc5ddfee27a197194b7fac289de9ba55665 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml 75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml 75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv 6a42d5cf20bf64a7b027660beca902ec84a80a1beb73e8aec1e4eb26fbb7c913 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv 6a42d5cf20bf64a7b027660beca902ec84a80a1beb73e8aec1e4eb26fbb7c913 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/hparams.yaml 75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/hparams.yaml 75ffe300584ac7f56ecc28e85be309a3f7c9f506a615d1edc8e77aac4f3d4b7b unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/metrics.csv a71483c34b9d9cd904a6fe241f88af3e30bb3e100a15d666def5b06e4a5c0431 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_gifflar/LGI_gifflarESM/version_2/metrics.csv a71483c34b9d9cd904a6fe241f88af3e30bb3e100a15d666def5b06e4a5c0431 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml 2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml 2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv faee86ceadc7e1dbe6835d44aef8c5d4f810a2cbe224e13202154b52dab92be3 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv faee86ceadc7e1dbe6835d44aef8c5d4f810a2cbe224e13202154b52dab92be3 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml 2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml 2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/metrics.csv ed66bf0654eeaabf3b4f5f92e1295abc53a0155095160092ffb47826ff385d1a bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_1/metrics.csv ed66bf0654eeaabf3b4f5f92e1295abc53a0155095160092ffb47826ff385d1a unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml 2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml 2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/metrics.csv 127b095cc67faf26378a247dc7345de56d331537dad375990ed319f684fbde27 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_2/metrics.csv 127b095cc67faf26378a247dc7345de56d331537dad375990ed319f684fbde27 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml 2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml 2213baffb7e7ada5a1f384d75380098d53bc92f2c3134e94d35750ab9e419c16 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/metrics.csv eee99377078178660db1f12c2700b0c46c9d8120db5f445a8d71d3f584cc9fcd bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s43_sweetnet/LGI_sweetnetESM/version_3/metrics.csv eee99377078178660db1f12c2700b0c46c9d8120db5f445a8d71d3f584cc9fcd unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml 0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml 0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv 47b51d96993782f3c9e6117722176941bd2c6d571200d160e28aa654c97c6356 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv 47b51d96993782f3c9e6117722176941bd2c6d571200d160e28aa654c97c6356 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml 0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml 0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv 89d056126636c1fd1fa44d27ecfd57040a9bfc9eec2a76104da0ae07d01680b3 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv 89d056126636c1fd1fa44d27ecfd57040a9bfc9eec2a76104da0ae07d01680b3 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/hparams.yaml 0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/hparams.yaml 0c1b007e6c5b0146ed2927ff60720f7c9fba81286f4dc4b866f896e18c878d35 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/metrics.csv c066cdbf7827bdec2f87c15bf95a42e0a23b511bf03338482e4d2b20c149336b bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_gifflar/LGI_gifflarESM/version_2/metrics.csv c066cdbf7827bdec2f87c15bf95a42e0a23b511bf03338482e4d2b20c149336b unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml 1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml 1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv fe5d987579ac234e8f21bb70e642177e9eccb69493564b7c5895e6abd51f4dc2 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv fe5d987579ac234e8f21bb70e642177e9eccb69493564b7c5895e6abd51f4dc2 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml 1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml 1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv 0ecfee6421a63cee0f0537fdb311e44b87227421f637816a0a3ccfd132763d16 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv 0ecfee6421a63cee0f0537fdb311e44b87227421f637816a0a3ccfd132763d16 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml 1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/hparams.yaml 1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/metrics.csv 0d313e8557cb13577b34c8e94e0f2c887c11cfa6da6ca36ab2aa5f9d1cc10f22 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_2/metrics.csv 0d313e8557cb13577b34c8e94e0f2c887c11cfa6da6ca36ab2aa5f9d1cc10f22 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml 1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/hparams.yaml 1192dfb103f69ed8970d6bb263fa292648b6c673b3067a33b46d26940d0231ef unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/metrics.csv 5ef2b9552f452e4218b9728c0ed57f7a14ec5068d065c7223e2c6e566e5dafd2 bertosebind_new_runs/executed/remote/gifflar_lgi_B_protein/logs_s44_sweetnet/LGI_sweetnetESM/version_3/metrics.csv 5ef2b9552f452e4218b9728c0ed57f7a14ec5068d065c7223e2c6e566e5dafd2 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml 781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/hparams.yaml 781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv e92266239d6445a0de886e5081e433632c6719719f6d536ad31e98045160fcea bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_0/metrics.csv e92266239d6445a0de886e5081e433632c6719719f6d536ad31e98045160fcea unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml 781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/hparams.yaml 781862ff668231f3501e892c7be567e4e3a16709f6b433e97edeadd60ec1e8bf unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv 929a3396f429527836db8368e7908024bf69766e0567636b1f24df8c1c06ea42 bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_gifflar/LGI_gifflarESM/version_1/metrics.csv 929a3396f429527836db8368e7908024bf69766e0567636b1f24df8c1c06ea42 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml f7852d23330d3b55e46eec193b3fe411306ea59349de6fa53273294d893dce1c bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml f7852d23330d3b55e46eec193b3fe411306ea59349de6fa53273294d893dce1c unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv 1e68c5af1f9c7fe0f1c85d9f3d49fa1104bf3d4c768014154316ee27b94a3cc3 bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s43_sweetnet/LGI_sweetnetESM/version_0/metrics.csv 1e68c5af1f9c7fe0f1c85d9f3d49fa1104bf3d4c768014154316ee27b94a3cc3 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml 987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/hparams.yaml 987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv e937607ecc6a7058664faab71728c58ef7a9bba8f6985082bca5d565aef6ec7e bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_0/metrics.csv e937607ecc6a7058664faab71728c58ef7a9bba8f6985082bca5d565aef6ec7e unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml 987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/hparams.yaml 987afb2ba2360ff7f2a5a94943d064a7a3e5c902b53e445bc59bc291241e9d9a unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv eb420f0ea03bce2075ad4eac9237862ccbecb2c37c02d162d860516f4739b280 bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_gifflar/LGI_gifflarESM/version_1/metrics.csv eb420f0ea03bce2075ad4eac9237862ccbecb2c37c02d162d860516f4739b280 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml 22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/hparams.yaml 22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv 30f0105da3f2c579a8261a30ed6c3fcc8308cf9ebc2068f0e71168567e919922 bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_0/metrics.csv 30f0105da3f2c579a8261a30ed6c3fcc8308cf9ebc2068f0e71168567e919922 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml 22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/hparams.yaml 22796804655424d5977b04b0b171d4da9fba18896eb4928842c4fad6bb7911dd unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv 168da3dcbf6ca795bb75ec67b9fc567788637c25875b766cc76b441825e6020c bertosebind_new_runs/executed/remote/gifflar_lgi_C_doubly/logs_s44_sweetnet/LGI_sweetnetESM/version_1/metrics.csv 168da3dcbf6ca795bb75ec67b9fc567788637c25875b766cc76b441825e6020c unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_score_macro.py ef833104d5eecd273df7d9f7c39bae4a216b015bde15978ea716f1f864874de4 bertosebind_new_runs/executed/remote/gifflar_score_macro.py ef833104d5eecd273df7d9f7c39bae4a216b015bde15978ea716f1f864874de4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_score_macro_seeds.py 578635213e1a3eddd61438a6249f14e1a5d2487267286fc459eb77972808e225 bertosebind_new_runs/executed/remote/gifflar_score_macro_seeds.py 578635213e1a3eddd61438a6249f14e1a5d2487267286fc459eb77972808e225 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/gifflar_score_perrow.py f88bcf303685ea6a075747a12eafa7df041909b9b455d80ea98c2b536aed0de8 bertosebind_new_runs/executed/remote/gifflar_score_perrow.py f88bcf303685ea6a075747a12eafa7df041909b9b455d80ea98c2b536aed0de8 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_attr_motif_16596807.out e65e21b8c9c9bd0291a034852f7ab47f826e1f51448d9ea8439b5eb23ed8eb98 bertosebind_new_runs/executed/remote/logs/aff_attr_motif_16596807.out e65e21b8c9c9bd0291a034852f7ab47f826e1f51448d9ea8439b5eb23ed8eb98 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_b4_grep_16604967.out dadfe2c408938645b4138bb011719affdaebe7098060f66354df56da71d0a146 bertosebind_new_runs/executed/remote/logs/aff_b4_grep_16604967.out dadfe2c408938645b4138bb011719affdaebe7098060f66354df56da71d0a146 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_b4_s3_16604914.out 79eb29df46c44942a2a6ac4313789ebc29e1672bec4512c4f965be5ebb739cc9 bertosebind_new_runs/executed/remote/logs/aff_b4_s3_16604914.out 79eb29df46c44942a2a6ac4313789ebc29e1672bec4512c4f965be5ebb739cc9 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_b4_s3r2_16605803.out 5d93f96fb6e537c9b802fd1b2d9fe25df41a19800f85ea860246274d2e897d71 bertosebind_new_runs/executed/remote/logs/aff_b4_s3r2_16605803.out 5d93f96fb6e537c9b802fd1b2d9fe25df41a19800f85ea860246274d2e897d71 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_0.err 6c486b37a642549a8dcf924eabd52e2660d88a6ada53ba05aecb91937fd98626 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_0.err 6c486b37a642549a8dcf924eabd52e2660d88a6ada53ba05aecb91937fd98626 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_0.out 7832596dfd62832aadeed39c1acca59643f00ec8dbe812730b49bd1b2ca5150b bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_0.out 7832596dfd62832aadeed39c1acca59643f00ec8dbe812730b49bd1b2ca5150b unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_1.err bf5e3ff79c6b942dca7f35dcb85d0f32081b03875cb4640022fab29dff833b11 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_1.err bf5e3ff79c6b942dca7f35dcb85d0f32081b03875cb4640022fab29dff833b11 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_1.out 134b045efbf1f560d0d41fa702ff53b6369fd38235fcef55ca8aaa4615698fed bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_1.out 134b045efbf1f560d0d41fa702ff53b6369fd38235fcef55ca8aaa4615698fed unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_10.err d911a9619dee68a9fc982bb3db253b8e72f12dc1c06d2bc434556211909b2719 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_10.err d911a9619dee68a9fc982bb3db253b8e72f12dc1c06d2bc434556211909b2719 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_10.out c079926adcc0d2bce5b591f870208dcd2bef2ea3029aee8950bf0ce44c1105ea bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_10.out c079926adcc0d2bce5b591f870208dcd2bef2ea3029aee8950bf0ce44c1105ea unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_11.err 5024c4160aeeccd212930b0d959ed0bab4dd7bf593b61b26decd78c7513aa638 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_11.err 5024c4160aeeccd212930b0d959ed0bab4dd7bf593b61b26decd78c7513aa638 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_11.out 4d110e939761ff4d8c7938c754e182d2c09ede84c8360d10ce18a04280dafea6 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_11.out 4d110e939761ff4d8c7938c754e182d2c09ede84c8360d10ce18a04280dafea6 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_2.err d9383fa7e0469a436e08d24f4f9af31c1a6fb9ebb5e115843b53e2b2ded612f1 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_2.err d9383fa7e0469a436e08d24f4f9af31c1a6fb9ebb5e115843b53e2b2ded612f1 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_2.out 0bbeab27824eeffbbfe5cf04317d1795b1f8f02d4c5ad9b7dbc23e159a823940 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_2.out 0bbeab27824eeffbbfe5cf04317d1795b1f8f02d4c5ad9b7dbc23e159a823940 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_3.err 735f42f273046b3af0374283927429fa75a1b7a8b66d6b205a20e4e1cfd59eed bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_3.err 735f42f273046b3af0374283927429fa75a1b7a8b66d6b205a20e4e1cfd59eed unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_3.out dcdbc088e7945d0f63803ac95aed81f3f8c8d25c97dd760df269921a08bacae7 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_3.out dcdbc088e7945d0f63803ac95aed81f3f8c8d25c97dd760df269921a08bacae7 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_4.err 98912251710582e65eaed2ba01ee184d957d177ec31e30969939b4ef0962a2bf bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_4.err 98912251710582e65eaed2ba01ee184d957d177ec31e30969939b4ef0962a2bf unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_4.out b1febe3591a887bd63d7bb607536ce17bdab51eb9db9a8b8c3d9d5ff77aca1c2 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_4.out b1febe3591a887bd63d7bb607536ce17bdab51eb9db9a8b8c3d9d5ff77aca1c2 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_5.err cbb38c7fc50100cfa44cdf9b64de3df9a002613c62d8489b9d3db301406712c7 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_5.err cbb38c7fc50100cfa44cdf9b64de3df9a002613c62d8489b9d3db301406712c7 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_5.out a1b8f17ba63285c54d42ad49ce61bf8356ac4dfe279de8b65f687304783bdf55 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_5.out a1b8f17ba63285c54d42ad49ce61bf8356ac4dfe279de8b65f687304783bdf55 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_6.err 8ec18cd103ee2f80b2bacc8660a53588ed6313dbdc2455fe87fb5cdac6d30ef1 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_6.err 8ec18cd103ee2f80b2bacc8660a53588ed6313dbdc2455fe87fb5cdac6d30ef1 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_6.out 18050c22347d3a2900b0d15cd7f2b97c1f6028ff27e5e060fc33c8308851b358 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_6.out 18050c22347d3a2900b0d15cd7f2b97c1f6028ff27e5e060fc33c8308851b358 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_7.err 1a1baefb3f9d8bae9c38975310f96004470e75bed27b32b5273b31a9baca05f5 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_7.err 1a1baefb3f9d8bae9c38975310f96004470e75bed27b32b5273b31a9baca05f5 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_7.out 8869a90d89089a6f26c7d88b1a389630930c35adff10016a015bc5bb331308b7 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_7.out 8869a90d89089a6f26c7d88b1a389630930c35adff10016a015bc5bb331308b7 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_8.err 01b633582a3ed13728f688fde16693926778896ba0952506cce66072f600f354 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_8.err 01b633582a3ed13728f688fde16693926778896ba0952506cce66072f600f354 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_8.out 8f468cb20588f01bc0794c43ea69d5fa78627f4e35ef7ecdb7ffbcd3266c78c3 bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_8.out 8f468cb20588f01bc0794c43ea69d5fa78627f4e35ef7ecdb7ffbcd3266c78c3 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_9.err a3ea46d3bd9191b9bbd49627cbfdac0dee312230e5e1ed93016f98f8786b94ba bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_9.err a3ea46d3bd9191b9bbd49627cbfdac0dee312230e5e1ed93016f98f8786b94ba unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_9.out 313f8c5e3999dfa75ae508fd57d0d033a00b40cdf2b794cb4c32fb0a901b53bb bertosebind_new_runs/executed/remote/logs/aff_gseed_16597159_9.out 313f8c5e3999dfa75ae508fd57d0d033a00b40cdf2b794cb4c32fb0a901b53bb unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_0.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_0.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_0.out 19bb18892da4f9174e308bd42908a6e6d383001edd75c9ad482eef111b5bbb31 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_0.out 19bb18892da4f9174e308bd42908a6e6d383001edd75c9ad482eef111b5bbb31 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_1.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_1.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_1.out 152af1228aa39534d68470023321d4350bb2ea4b997bfd0bf38efbbeb92bad8b bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_1.out 152af1228aa39534d68470023321d4350bb2ea4b997bfd0bf38efbbeb92bad8b unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_10.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_10.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_10.out d842f047adc16782a9724406ecab07aa67fe3ad853f5d0c8bee73cb63d129782 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_10.out d842f047adc16782a9724406ecab07aa67fe3ad853f5d0c8bee73cb63d129782 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_11.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_11.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_11.out 922dfe72fd457b50a6c468db266827346ab1173381458ad61e21ceb5a0c8736c bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_11.out 922dfe72fd457b50a6c468db266827346ab1173381458ad61e21ceb5a0c8736c unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_2.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_2.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_2.out 2b008f6ae0f5554b9841582ded12a01558218558d8b7748899e94a0499d8caaf bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_2.out 2b008f6ae0f5554b9841582ded12a01558218558d8b7748899e94a0499d8caaf unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_3.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_3.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_3.out c1d325125ee0463b230e5ac347c45a117ebc1a1686393d9d7bd63dd7c9a8a8d4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_3.out c1d325125ee0463b230e5ac347c45a117ebc1a1686393d9d7bd63dd7c9a8a8d4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_4.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_4.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_4.out 939f30920d3d4a772d8736c945f6e39dc949cde64cc7b9b9e0116e7b45f4f895 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_4.out 939f30920d3d4a772d8736c945f6e39dc949cde64cc7b9b9e0116e7b45f4f895 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_5.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_5.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_5.out 7817d9b5c087d542f2c0659726a66532091a24c9b05edb04196a756291dd5784 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_5.out 7817d9b5c087d542f2c0659726a66532091a24c9b05edb04196a756291dd5784 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_6.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_6.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_6.out 4283aa1d699582d4766ca394cf2d9c4b046ce8247b5cef0f8250c424329138a2 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_6.out 4283aa1d699582d4766ca394cf2d9c4b046ce8247b5cef0f8250c424329138a2 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_7.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_7.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_7.out eb0257132cbd79d1a3a84bec543183b7bbdaceaaaefc85c988368d70d4146322 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_7.out eb0257132cbd79d1a3a84bec543183b7bbdaceaaaefc85c988368d70d4146322 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_8.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_8.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_8.out 523b5ac11259832265dab5c4e08d837f3fe7e4780048a5a4af1f513f6b8c3d4a bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_8.out 523b5ac11259832265dab5c4e08d837f3fe7e4780048a5a4af1f513f6b8c3d4a unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_9.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_9.err 53e0d436715c2b2e61c45d8474df7edff033d7693326a363aa202198e7001ff4 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_9.out 40ef3d8f12ba723cfe0e845ec72a960dbd32c8bc5baa3013f570e1c27a6431b6 bertosebind_new_runs/executed/remote/logs/aff_gsmac_16602170_9.out 40ef3d8f12ba723cfe0e845ec72a960dbd32c8bc5baa3013f570e1c27a6431b6 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/manifest.json 06fbfcd2f820fc4621d35c16dcd6bbece93ea68b96d417d8b7bd2ce3ea104cdb bertosebind_new_runs/executed/remote/manifest.json 06fbfcd2f820fc4621d35c16dcd6bbece93ea68b96d417d8b7bd2ce3ea104cdb unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/executed/remote/train_lgi.py bf602abb05eeb3b0203766d9d1bc462579c181bc3418d762f6d02d5f36e8a230 bertosebind_new_runs/executed/remote/train_lgi.py bf602abb05eeb3b0203766d9d1bc462579c181bc3418d762f6d02d5f36e8a230 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/inputs/current_glycan_sets/doubly_cold_exposure_join.csv 9d13452309d64f138705657334b74738eaf167c9faff835d024582e0e98c0af8 bertosebind_new_runs/inputs/current_glycan_sets/doubly_cold_exposure_join.csv 9d13452309d64f138705657334b74738eaf167c9faff835d024582e0e98c0af8 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/inputs/current_glycan_sets/doubly_cold_scored_glycans.csv e5eebf2072779d7001dabd3981237025be37eee6f19a5b109b00ce4b3e776e09 bertosebind_new_runs/inputs/current_glycan_sets/doubly_cold_scored_glycans.csv e5eebf2072779d7001dabd3981237025be37eee6f19a5b109b00ce4b3e776e09 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/inputs/current_glycan_sets/glycan_cold_exposure_join.csv 4d101cc92685c63ecca99cfad2c1bc46c73c77b1e565bd686bde14ee0d020886 bertosebind_new_runs/inputs/current_glycan_sets/glycan_cold_exposure_join.csv 4d101cc92685c63ecca99cfad2c1bc46c73c77b1e565bd686bde14ee0d020886 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/inputs/current_glycan_sets/glycan_cold_scored_glycans.csv 0faab973a6ee5e5bf712983d51fad9f746e34edcbe5342574d45933bba62f48a bertosebind_new_runs/inputs/current_glycan_sets/glycan_cold_scored_glycans.csv 0faab973a6ee5e5bf712983d51fad9f746e34edcbe5342574d45933bba62f48a unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/inputs/current_glycan_sets/manifest.json 7655d9d080df7cb5dc748b7d9721037fbec67c04cf837e4724f0afba7e7a4d71 bertosebind_new_runs/inputs/current_glycan_sets/manifest.json 7655d9d080df7cb5dc748b7d9721037fbec67c04cf837e4724f0afba7e7a4d71 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/inputs/current_glycan_sets/protein_cold_exposure_join.csv 08ceef347f61012e0baab4daf1472122dc80335c6ea02fe084098c055a3e3e30 bertosebind_new_runs/inputs/current_glycan_sets/protein_cold_exposure_join.csv 08ceef347f61012e0baab4daf1472122dc80335c6ea02fe084098c055a3e3e30 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/inputs/current_glycan_sets/protein_cold_scored_glycans.csv f35d6088903e993f46adee07806e577456599d9814f4f43e40efdf3d8ddf6c46 bertosebind_new_runs/inputs/current_glycan_sets/protein_cold_scored_glycans.csv f35d6088903e993f46adee07806e577456599d9814f4f43e40efdf3d8ddf6c46 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/package_manifest.json 56d04a5a985d2bd96067e5c1a1e7acd67c5f76ae05c17831bc5949cb6bee26ab bertosebind_new_runs/package_manifest.json 56d04a5a985d2bd96067e5c1a1e7acd67c5f76ae05c17831bc5949cb6bee26ab unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/protocol/amendment_excerpts_20260925_26.md 924765b90a840277c5ed9dd6594a8ded2d5f7add5b138a9af1adf89bbb46cbcc bertosebind_new_runs/protocol/amendment_excerpts_20260925_26.md 924765b90a840277c5ed9dd6594a8ded2d5f7add5b138a9af1adf89bbb46cbcc unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/protocol/original_20260910.md 04dea299feb3ac0840ff5db7471381ad3f1cf531653bf6aeb9825005236d2f0b bertosebind_new_runs/protocol/original_20260910.md 04dea299feb3ac0840ff5db7471381ad3f1cf531653bf6aeb9825005236d2f0b unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/provenance/bootstrap_anatomy_audit.json 11014b5f0972c23b7225c4202f2254b444109b8105563d968e9c8f4534061ff1 bertosebind_new_runs/provenance/bootstrap_anatomy_audit.json 11014b5f0972c23b7225c4202f2254b444109b8105563d968e9c8f4534061ff1 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/provenance/bootstrap_code_audit.json d2812e72a7befc1bdb08465189d2fed035ae725142c1cf978a578e0add72e94d bertosebind_new_runs/provenance/bootstrap_code_audit.json d2812e72a7befc1bdb08465189d2fed035ae725142c1cf978a578e0add72e94d unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/provenance/bootstrap_exact_input_manifest.json d6e36605873c587028c6dab2dde8093c6e4e33df53ebc27f1d6e3c6b4de14991 bertosebind_new_runs/provenance/bootstrap_exact_input_manifest.json d6e36605873c587028c6dab2dde8093c6e4e33df53ebc27f1d6e3c6b4de14991 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/provenance/current_pretraining_exposure_audit.json 30a70a1703183b50fa1c10986c065471513981fac1e3e69f9c7ad649aeecb16a bertosebind_new_runs/provenance/current_pretraining_exposure_audit.json 30a70a1703183b50fa1c10986c065471513981fac1e3e69f9c7ad649aeecb16a unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/provenance/exposure_portability.patch ff65b38435040ba2f5987e0c78ecc0fafc4604341b9bc094513d47cb343db023 bertosebind_new_runs/provenance/exposure_portability.patch ff65b38435040ba2f5987e0c78ecc0fafc4604341b9bc094513d47cb343db023 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/provenance/gifflar_scorer_diff.txt 6649cef7a00096ba2981c611a4c6432be93300e3bb439cd543a692cbb40a15af bertosebind_new_runs/provenance/gifflar_scorer_diff.txt 6649cef7a00096ba2981c611a4c6432be93300e3bb439cd543a692cbb40a15af unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/provenance/protein_gifflar_audit.json 7d24cac24a37583fddac7d91c73e22ea6d4a022194ac213ab354f9e9831b1084 bertosebind_new_runs/provenance/protein_gifflar_audit.json 7d24cac24a37583fddac7d91c73e22ea6d4a022194ac213ab354f9e9831b1084 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/provenance/protein_gifflar_verified_numbers.json 9d2e628a789a46a69333c24550d2a150166aebed382880c2d0a67fbd43124eaa bertosebind_new_runs/provenance/protein_gifflar_verified_numbers.json 9d2e628a789a46a69333c24550d2a150166aebed382880c2d0a67fbd43124eaa unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/reproduce_summary.py 4b49c6f8f6c9953cee46ff2f6c47e1bb68692c9b58984973b3d8666648999f62 bertosebind_new_runs/reproduce_summary.py 4b49c6f8f6c9953cee46ff2f6c47e1bb68692c9b58984973b3d8666648999f62 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/requirements.txt 99acda4c8365d691c16de3e032e225de05cee38cff063a772bf9eaec2067328f bertosebind_new_runs/requirements.txt 99acda4c8365d691c16de3e032e225de05cee38cff063a772bf9eaec2067328f unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/doubly_cold_anatomy.json 0dff08537f0cd5a1ad40562537c48546d3d4f3858a75b2ab2d3729b22a5dfe91 bertosebind_new_runs/results/doubly_cold_anatomy.json 0dff08537f0cd5a1ad40562537c48546d3d4f3858a75b2ab2d3729b22a5dfe91 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/doubly_cold_per_assay.csv 4186c66c13fd05d62d83a10df2a5761b2e29ded502660c12cb450836f9881496 bertosebind_new_runs/results/doubly_cold_per_assay.csv 4186c66c13fd05d62d83a10df2a5761b2e29ded502660c12cb450836f9881496 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s43.json 2c494ac1351d4ff63828139eac004c0047dc3259d62fd10334d5a740cab9182f bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s43.json 2c494ac1351d4ff63828139eac004c0047dc3259d62fd10334d5a740cab9182f unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s44.json 82173016b893cb2913e90e99feea5f6f4ff22cff9e1aff0fe7dc136161c7f627 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_gifflarESM_s44.json 82173016b893cb2913e90e99feea5f6f4ff22cff9e1aff0fe7dc136161c7f627 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json ac58a83969a0ffb860cf1a33a472f4cb5b3e14f25097c3ba909f7555f65aa589 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json ac58a83969a0ffb860cf1a33a472f4cb5b3e14f25097c3ba909f7555f65aa589 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json d2d2d73c834a2fcca7b8c22fd6ce91907f18866443628c2c54f8b8ec04477803 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json d2d2d73c834a2fcca7b8c22fd6ce91907f18866443628c2c54f8b8ec04477803 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s43.json 7b0a01a1acc7e2ca80a3de9aaab02941942ead519e6661abec6c44c7fa5fd079 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s43.json 7b0a01a1acc7e2ca80a3de9aaab02941942ead519e6661abec6c44c7fa5fd079 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s44.json f2e40d306b767e6949c02304077a08398dc16ac19d08d94937f7dc49abd7cc24 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_gifflarESM_s44.json f2e40d306b767e6949c02304077a08398dc16ac19d08d94937f7dc49abd7cc24 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s43.json e13c8021d6e94b3bd6cb4ef00d7456c182449f57c4b1356256e011805a6efdbf bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s43.json e13c8021d6e94b3bd6cb4ef00d7456c182449f57c4b1356256e011805a6efdbf unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s44.json d274d35c9a0ba25e4597cdb8c01001f4f7ff7760aabfe7c8a00b84a70b74252f bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_B_protein_sweetnetESM_s44.json d274d35c9a0ba25e4597cdb8c01001f4f7ff7760aabfe7c8a00b84a70b74252f unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s43.json 2208056d5303fda27c5b541eed1c6f64cb03de1c10abd2868d4ce55d1bdb475c bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s43.json 2208056d5303fda27c5b541eed1c6f64cb03de1c10abd2868d4ce55d1bdb475c unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s44.json c831378d73c3c2c9456be5ff9ff05acc34b64815b056c5df21bef2078a415393 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_gifflarESM_s44.json c831378d73c3c2c9456be5ff9ff05acc34b64815b056c5df21bef2078a415393 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json 121a30d0de568217e722036cf25ba4ef61128398fde3466fc8b2f60f096722c7 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json 121a30d0de568217e722036cf25ba4ef61128398fde3466fc8b2f60f096722c7 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json 3d29ac377491db5d952f6066228fe4099f99db0e2fbaa80063ee429fc28e0a28 bertosebind_new_runs/results/gifflar/affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json 3d29ac377491db5d952f6066228fe4099f99db0e2fbaa80063ee429fc28e0a28 unchanged inherited file +submit_comm/06_code/bertosebind_new_runs/results/protein_probe.json 4fd80f7396aa9803602fd62bd82ec3e98e1f937b46e1057cb26ffa56ea6c93f0 bertosebind_new_runs/results/protein_probe.json 4fd80f7396aa9803602fd62bd82ec3e98e1f937b46e1057cb26ffa56ea6c93f0 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/check_release.py f224aac78366d64d60b86841b11a9694d234e955904112d266de9bbbc4d8af3e check_release.py f224aac78366d64d60b86841b11a9694d234e955904112d266de9bbbc4d8af3e unchanged inherited file +new workbench interface or documentation docs/DATA_ACCESS.md 6d805fd046c5aca89ef531f37950bb73ef15125865c6a841dcc4934ba7932780 workbench release change +new workbench interface or documentation docs/QUICKSTART.md 1fa5b83d57f611207e04c88d2190d6cd364833b4c6ec9c0ca35649937ec5f645 workbench release change +new workbench interface or documentation docs/TRAINING.md b5072e437307aedfd1f789b3dc8024498e6c96ffb6f80d06d0f6a08a805d4b00 workbench release change +new workbench interface or documentation docs/WEBSITE_INTEGRATION.md 5f19be94138c38e9f35afa27aeedb514f9421a4e4724ee27c76ec0302487eed3 workbench release change +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/docs/reproduction.md 52263f18a04e465305b49d53a73f9682849fd138fe817d4afb774c48252d869b docs/reproduction.md 52263f18a04e465305b49d53a73f9682849fd138fe817d4afb774c48252d869b unchanged inherited file +new workbench interface or documentation download_assets.py 4008db9ad60a8d97e5bf705cee0da416dd6755eed15ab4882ffa61e04e4299a5 workbench release change +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/embed.py b8fe7b4e50ffa4caf7ca9c50742dd279bb4a717b6fad629a24971ceab635b2ab embed.py b8fe7b4e50ffa4caf7ca9c50742dd279bb4a717b6fad629a24971ceab635b2ab unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/examples/glycans.csv a46c2c31f02fb0829fbe70a29c4c032b16a1cd5208386c2ecbc9f6c3fc2018bc examples/glycans.csv a46c2c31f02fb0829fbe70a29c4c032b16a1cd5208386c2ecbc9f6c3fc2018bc unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/examples/predictions.csv b4a8c26479a118943646d4baae370c1d0a267fe30c487fbf816a3999b5a4ed03 examples/predictions.csv b4a8c26479a118943646d4baae370c1d0a267fe30c487fbf816a3999b5a4ed03 unchanged inherited file +submit_comm/06_code/examples/smoke_affinose.py 903d14d8bafc9ae2aa968a74ad4b9d31396c598624fe05e2acb1814cb60bd60e examples/smoke_affinose.py 903d14d8bafc9ae2aa968a74ad4b9d31396c598624fe05e2acb1814cb60bd60e unchanged inherited file +submit_comm/06_code/examples/smoke_models.py ff95ff2a7707940b849a44259cdf356f66dd5b0351faf4e400feac6666afd9af examples/smoke_models.py ff95ff2a7707940b849a44259cdf356f66dd5b0351faf4e400feac6666afd9af unchanged inherited file +multimodal/runtime/a5_downstream_native_taxonomy_multilabel_s42_20260802_r3_cuda_device_retry/review_a5_native_checkpoint.py 89b65f9186f2080eab214f1b7389854cd8477124cdc729a428624312fb7a1453 executed/downstream/review_a5_native_checkpoint.py 89b65f9186f2080eab214f1b7389854cd8477124cdc729a428624312fb7a1453 unchanged inherited file +multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/evidence/frozen/run_review_native_md_on_terminal4_s42.py 1c958427bca7991b8ec091b6f0c8d209fc1ddfaf1aa9e1f96ad22ed5c60b839d executed/downstream/run_review_native_md_on_terminal4_s42.py 1c958427bca7991b8ec091b6f0c8d209fc1ddfaf1aa9e1f96ad22ed5c60b839d unchanged inherited file +submit_comm/06_code/figures/Figure_style.md 75d530c95c218fafb25e844865dd3884737d11b23c4cfdc121226549923fecdb figures/Figure_style.md 75d530c95c218fafb25e844865dd3884737d11b23c4cfdc121226549923fecdb unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/README.md 83791502b5e689451ea735a3da108185ad5aed4d861a187b68c622e0b4b3fe69 figures/README.md 83791502b5e689451ea735a3da108185ad5aed4d861a187b68c622e0b4b3fe69 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/ablation_figure9/README.md 14addd0706d771da818f53b0d17a0248ba496c7e6ceb3850b89cc6573d35ae71 figures/ablation_figure9/README.md 14addd0706d771da818f53b0d17a0248ba496c7e6ceb3850b89cc6573d35ae71 unchanged inherited file +submit_comm/06_code/figures/ablation_figure9/nature-bpg-palette.json a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b figures/ablation_figure9/nature-bpg-palette.json a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b unchanged inherited file +submit_comm/06_code/figures/ablation_figure9/plot_data.json 179bf3ddb15842c726a90a9cf373c7861409c8f823bae344a0b621fa77ed51f9 figures/ablation_figure9/plot_data.json 179bf3ddb15842c726a90a9cf373c7861409c8f823bae344a0b621fa77ed51f9 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/bootstrap_figure13/README.md 457cfdc37e557c623d23292cfb221b214b9f158ab9ec611576b5553969ce4469 figures/bootstrap_figure13/README.md 457cfdc37e557c623d23292cfb221b214b9f158ab9ec611576b5553969ce4469 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/bootstrap_figure13/build_figure13.py fbddc62114cd214265d12bb11584004988c169731fe66c8faba20d1c871bb876 figures/bootstrap_figure13/build_figure13.py fbddc62114cd214265d12bb11584004988c169731fe66c8faba20d1c871bb876 unchanged inherited file +submit_comm/06_code/figures/bootstrap_figure13/inputs/affinose_b4_step3_bootstrap_r2_20260927.json 6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235 figures/bootstrap_figure13/inputs/affinose_b4_step3_bootstrap_r2_20260927.json 6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235 unchanged inherited file +submit_comm/06_code/figures/bootstrap_figure13/inputs/nature-bpg-palette.json a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b figures/bootstrap_figure13/inputs/nature-bpg-palette.json a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/bootstrap_figure13/inputs/review_affinose_gifflar_seed_welch.csv 7b14add6ccb6e16d72ab066ae902b77fd15cca4baab69c52015a828c5bc32b35 figures/bootstrap_figure13/inputs/review_affinose_gifflar_seed_welch.csv 7b14add6ccb6e16d72ab066ae902b77fd15cca4baab69c52015a828c5bc32b35 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/bootstrap_figure13/inputs/review_affinose_individual_values.csv 8a5ce609298e83a231895587c64a24bbc535a3887feb157ef2b4934db4355243 figures/bootstrap_figure13/inputs/review_affinose_individual_values.csv 8a5ce609298e83a231895587c64a24bbc535a3887feb157ef2b4934db4355243 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/bootstrap_figure13/inputs/review_affinose_results.csv cd5a299c7b3a21ce8bbd0c445e66b938e497658e9ffe602d562517eb1ce103fd figures/bootstrap_figure13/inputs/review_affinose_results.csv cd5a299c7b3a21ce8bbd0c445e66b938e497658e9ffe602d562517eb1ce103fd unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/bootstrap_figure13/inputs/source_manifest.json c0957bc56e0694a72289183e7424b49383346e6e55c245b92132c2e77ffc6f9d figures/bootstrap_figure13/inputs/source_manifest.json c0957bc56e0694a72289183e7424b49383346e6e55c245b92132c2e77ffc6f9d unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/build_bpe_figure3.py d734b8076500af5edbd2bedd26f29004fb066725a45c273e35b49a1a711d26b1 figures/build_bpe_figure3.py d734b8076500af5edbd2bedd26f29004fb066725a45c273e35b49a1a711d26b1 unchanged inherited file +submit_comm/06_code/figures/build_corpus_composition_figure.py 0ceff115647c4921165805fb25fb5ec5451e8ac1264a9140b3db8591f30f66d2 figures/build_corpus_composition_figure.py 0ceff115647c4921165805fb25fb5ec5451e8ac1264a9140b3db8591f30f66d2 unchanged inherited file +submit_comm/06_code/figures/build_grey_seal_figure5.py 6053ddca0892325752308544a39da61d427de959f6559ab771902b0c30c7c103 figures/build_grey_seal_figure5.py 6053ddca0892325752308544a39da61d427de959f6559ab771902b0c30c7c103 unchanged inherited file +submit_comm/06_code/figures/build_submission_figures.py 90fd5e292872323cf90b2312903f8320731808e382a4798cc033379ebd57e568 figures/build_submission_figures.py 90fd5e292872323cf90b2312903f8320731808e382a4798cc033379ebd57e568 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/build_supplement_figure1.py f112a826a7b210c2700d810c2a62f91d80c0f2e964b141290f0343f648ce8a81 figures/build_supplement_figure1.py f112a826a7b210c2700d810c2a62f91d80c0f2e964b141290f0343f648ce8a81 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/build_supplement_presentation.py 2b33f563431fc64271f84bebfbf99210e057d4f6d8b4b838316c574aa6bf33b8 figures/build_supplement_presentation.py 2b33f563431fc64271f84bebfbf99210e057d4f6d8b4b838316c574aa6bf33b8 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/build_supplementary_figure9.py ba1cbfccd6a8f0e029849e9188ae212cfbf9afbc5174d1099970911821c740a1 figures/build_supplementary_figure9.py ba1cbfccd6a8f0e029849e9188ae212cfbf9afbc5174d1099970911821c740a1 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/build_taxonomy_figure11.py 25e648b564e4db77532947bcd432cf82ef15cd08f5676441a21feffadb9eacfa figures/build_taxonomy_figure11.py 25e648b564e4db77532947bcd432cf82ef15cd08f5676441a21feffadb9eacfa unchanged inherited file +submit_comm/06_code/figures/build_token_length_figure2.py e964dc2d021382d5950008eceef05d001d640de608b0d86ce37701db5de8379e figures/build_token_length_figure2.py e964dc2d021382d5950008eceef05d001d640de608b0d86ce37701db5de8379e unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/build_training_coverage_figure6.py de51e3d170a28a319aed0eaf8f0ee5c1a3b95c59146d0360a3e228c947178a78 figures/build_training_coverage_figure6.py de51e3d170a28a319aed0eaf8f0ee5c1a3b95c59146d0360a3e228c947178a78 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/compact_modalities/README.md dd7f57d15e39df52dfa3a92a1ba3aab7e85c284fabc926cffbcad7876366b852 figures/compact_modalities/README.md dd7f57d15e39df52dfa3a92a1ba3aab7e85c284fabc926cffbcad7876366b852 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/compact_modalities/builders/build_figures6_7.py 5d2748b98cf4f4ce9b74b71b8617d98c6d52a7cf3b68b567210727659804b363 figures/compact_modalities/builders/build_figures6_7.py 5d2748b98cf4f4ce9b74b71b8617d98c6d52a7cf3b68b567210727659804b363 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/compact_modalities/inputs/figure7_original_provenance.json 000b70258a2b599a326903d9792e11b6bb67adf5ed6730b5fddc416df6cbe7d7 figures/compact_modalities/inputs/figure7_original_provenance.json 000b70258a2b599a326903d9792e11b6bb67adf5ed6730b5fddc416df6cbe7d7 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/compact_modalities/inputs/review_md_temporal_20x6_core_r3.py 3e96d8092239c2c21f217ad5bae4ee7e07dbe0f7630b213bad468d6b08d3b1c1 figures/compact_modalities/inputs/review_md_temporal_20x6_core_r3.py 3e96d8092239c2c21f217ad5bae4ee7e07dbe0f7630b213bad468d6b08d3b1c1 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/compact_modalities/inputs/review_training_modality_coverage.csv a0096e0a0cd5ac6ade78c6b0ee4b0b0fffc7d2c8969899f26f03134aa63edd8e figures/compact_modalities/inputs/review_training_modality_coverage.csv a0096e0a0cd5ac6ade78c6b0ee4b0b0fffc7d2c8969899f26f03134aa63edd8e unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/contrastive_figure12/README.md 2373a8e7e2998023e764a4a69dead5f3f3a5cba87743fd8762e31bfb55e03393 figures/contrastive_figure12/README.md 2373a8e7e2998023e764a4a69dead5f3f3a5cba87743fd8762e31bfb55e03393 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/contrastive_figure12/build_figure12.py ed7446d8ab3b4a0258cc031361b93e1613fab438786a81fc1a775b88f6ae3c67 figures/contrastive_figure12/build_figure12.py ed7446d8ab3b4a0258cc031361b93e1613fab438786a81fc1a775b88f6ae3c67 unchanged inherited file +submit_comm/06_code/figures/contrastive_figure12/inputs/nature-bpg-palette.json a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b figures/contrastive_figure12/inputs/nature-bpg-palette.json a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b unchanged inherited file +submit_comm/06_code/figures/contrastive_figure12/inputs/review_contrastive_fit_values.csv d732e76c28cd3d741fad99636a8937b464f1efa190d26e7005146e6c88b1feb3 figures/contrastive_figure12/inputs/review_contrastive_fit_values.csv d732e76c28cd3d741fad99636a8937b464f1efa190d26e7005146e6c88b1feb3 unchanged inherited file +submit_comm/06_code/figures/contrastive_figure12/inputs/review_contrastive_paired_summary.csv 5bfd6352e60158fe3a09c2a3228a7fffc4926780aa320b5e205ef276db3e4113 figures/contrastive_figure12/inputs/review_contrastive_paired_summary.csv 5bfd6352e60158fe3a09c2a3228a7fffc4926780aa320b5e205ef276db3e4113 unchanged inherited file +submit_comm/06_code/figures/contrastive_figure12/inputs/review_contrastive_taxonomy_summary.csv dc90a817bc54ac310a73298f60d03fc30eaccd724f4676eb826301dd85470acc figures/contrastive_figure12/inputs/review_contrastive_taxonomy_summary.csv dc90a817bc54ac310a73298f60d03fc30eaccd724f4676eb826301dd85470acc unchanged inherited file +submit_comm/06_code/figures/figure3_inputs/nature-bpg-palette.json a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b figures/figure3_inputs/nature-bpg-palette.json a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b unchanged inherited file +submit_comm/06_code/figures/figure3_inputs/partition_count_flow.csv bd530abacb61f3d6cffda8d1e7e6112f9261fd0a761e594fddceb5c615b9497b figures/figure3_inputs/partition_count_flow.csv bd530abacb61f3d6cffda8d1e7e6112f9261fd0a761e594fddceb5c615b9497b unchanged inherited file +submit_comm/06_code/figures/figure3_inputs/review_bpe_vocabulary.json 918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b figures/figure3_inputs/review_bpe_vocabulary.json 918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b unchanged inherited file +submit_comm/06_code/figures/figure3_inputs/source_example.json c885944b4ebce9b08c99318ce51c81b7648309c49ba5244ad0345b794429f151 figures/figure3_inputs/source_example.json c885944b4ebce9b08c99318ce51c81b7648309c49ba5244ad0345b794429f151 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/final_iar/README.md 8bed92feb2c7ff8f8759e4fa287470336e364764ac7b6fead456840b92b5a5db figures/final_iar/README.md 8bed92feb2c7ff8f8759e4fa287470336e364764ac7b6fead456840b92b5a5db unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/final_iar/build_final_iar_figures.py 014b0949823ae8691f09efccab38919400282c33e0fd9b6994b39a6fb4ad78dd figures/final_iar/build_final_iar_figures.py 014b0949823ae8691f09efccab38919400282c33e0fd9b6994b39a6fb4ad78dd unchanged inherited file +submit_comm/06_code/figures/final_iar/inputs/baselines_same_cases.csv 259fdc68a39b415c4ec114fbd6872ceaccaf09327d1fde958390071a5a94af2a figures/final_iar/inputs/baselines_same_cases.csv 259fdc68a39b415c4ec114fbd6872ceaccaf09327d1fde958390071a5a94af2a unchanged inherited file +submit_comm/06_code/figures/final_iar/inputs/final_iar_summary.json d5b7fd634677ea22ea27670649ea30636ef6c98daedc8592cd3f5d7b56beb9c0 figures/final_iar/inputs/final_iar_summary.json d5b7fd634677ea22ea27670649ea30636ef6c98daedc8592cd3f5d7b56beb9c0 unchanged inherited file +submit_comm/06_code/figures/final_iar/inputs/iar_recount_and_wilson_intervals.csv 50906ea3964a4a7c9744d224c8ffe2d356738d83bc0f5ead05b04ae6c558a64a figures/final_iar/inputs/iar_recount_and_wilson_intervals.csv 50906ea3964a4a7c9744d224c8ffe2d356738d83bc0f5ead05b04ae6c558a64a unchanged inherited file +submit_comm/06_code/figures/final_iar/inputs/nature-bpg-palette.json a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b figures/final_iar/inputs/nature-bpg-palette.json a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b unchanged inherited file +submit_comm/06_code/figures/final_iar/inputs/run_manifest.json 0aa0dc0fb74388a72750578acdf9beafba917a1976059c813157a90eceae3419 figures/final_iar/inputs/run_manifest.json 0aa0dc0fb74388a72750578acdf9beafba917a1976059c813157a90eceae3419 unchanged inherited file +submit_comm/06_code/figures/model_variants_figure10/README.md 61136a3d00e0184db8fbf4db47fa480766e7dadbb4f81d278df27b1fd0a0613c figures/model_variants_figure10/README.md 61136a3d00e0184db8fbf4db47fa480766e7dadbb4f81d278df27b1fd0a0613c unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/06_code/figures/model_variants_figure10/build_model_variants_figure10.py d88d4db86071e94d9012f0062696920c2c44a9a15a66e3f152826943234aac0c figures/model_variants_figure10/build_model_variants_figure10.py d88d4db86071e94d9012f0062696920c2c44a9a15a66e3f152826943234aac0c unchanged inherited file +submit_comm/06_code/figures/model_variants_figure10/inputs/review_weight_policy_ranks.csv 53fdfc11a75e3aaf39b78a9c59d90e206b0726579440d03df2d5cb5708249ebf figures/model_variants_figure10/inputs/review_weight_policy_ranks.csv 53fdfc11a75e3aaf39b78a9c59d90e206b0726579440d03df2d5cb5708249ebf unchanged inherited file +submit_comm/06_code/figures/model_variants_figure10/inputs/review_weight_policy_sensitivity.csv 9b35cb9ab5056c0548eea944f8472906a8cb36e2a7adf5cf3135268c675619b7 figures/model_variants_figure10/inputs/review_weight_policy_sensitivity.csv 9b35cb9ab5056c0548eea944f8472906a8cb36e2a7adf5cf3135268c675619b7 unchanged inherited file +submit_comm/06_code/figures/taxonomy_figure11/README.md dd96f6ec2247a918a89873dd031be5f738bcd870056e9b98cb7a1e2c85e158e8 figures/taxonomy_figure11/README.md dd96f6ec2247a918a89873dd031be5f738bcd870056e9b98cb7a1e2c85e158e8 unchanged inherited file +submit_comm/06_code/figures/taxonomy_figure11/nature-bpg-palette.json a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b figures/taxonomy_figure11/nature-bpg-palette.json a2ad6df46618b2e94ecd46fd8a2ca41c8d43556d46f26fd8066a102f42b1404b unchanged inherited file +submit_comm/06_code/iar_completion/README.md 04670f06e3459608d7a43da767531544421d4da1a6125376edc3939dba951d1f iar_completion/README.md 04670f06e3459608d7a43da767531544421d4da1a6125376edc3939dba951d1f unchanged inherited file +submit_comm/06_code/iar_completion/SHA256SUMS 8f7e1027e67222d49eb9e3c12fcdff083005d182583990c08c54b7ac3c11040e iar_completion/SHA256SUMS 8f7e1027e67222d49eb9e3c12fcdff083005d182583990c08c54b7ac3c11040e unchanged inherited file +submit_comm/06_code/iar_completion/assets/linkage_readout.pt a03990a02a1737de05a7fa1739164e84fa6a0a4170ebaa65317a9f3c2f16c0b0 iar_completion/assets/linkage_readout.pt a03990a02a1737de05a7fa1739164e84fa6a0a4170ebaa65317a9f3c2f16c0b0 unchanged inherited file +submit_comm/06_code/iar_completion/check_package.py 37514cb79322719772b5c14a5795f00a78f3275f3315d5b3b674ee97127ca953 iar_completion/check_package.py 37514cb79322719772b5c14a5795f00a78f3275f3315d5b3b674ee97127ca953 unchanged inherited file +submit_comm/06_code/iar_completion/model_metadata.json bbf016ce2f1a7dc82940be28397cbe8083da7ad0f5f525b1cf7345fd42a5758d iar_completion/model_metadata.json bbf016ce2f1a7dc82940be28397cbe8083da7ad0f5f525b1cf7345fd42a5758d unchanged inherited file +submit_comm/06_code/iar_completion/originals/run_all_training.sbatch d406620e3b0c070dff4d6fb6e0c57effce848a9ca5b3dc3de705d65c49ac0961 iar_completion/originals/run_all_training.sbatch d406620e3b0c070dff4d6fb6e0c57effce848a9ca5b3dc3de705d65c49ac0961 unchanged inherited file +submit_comm/06_code/iar_completion/originals/wa3_final_iar_readout.py 5acafc45244a0bf9a8489794f8a39f956622cf50594d87eb2eaa04502589fcb5 iar_completion/originals/wa3_final_iar_readout.py 5acafc45244a0bf9a8489794f8a39f956622cf50594d87eb2eaa04502589fcb5 unchanged inherited file +submit_comm/06_code/iar_completion/originals/wa3_final_iar_readout_all.py 72f8583bf32799ba29c09829d138900c0cbb589f73bd278f389da6fa8a786730 iar_completion/originals/wa3_final_iar_readout_all.py 72f8583bf32799ba29c09829d138900c0cbb589f73bd278f389da6fa8a786730 unchanged inherited file +submit_comm/06_code/iar_completion/originals/wa3_linkage_diagnosis.py 679499406106611dc2c70240a3c14c9b94311bc03a7811d3dae807c58aef4ef8 iar_completion/originals/wa3_linkage_diagnosis.py 679499406106611dc2c70240a3c14c9b94311bc03a7811d3dae807c58aef4ef8 unchanged inherited file +submit_comm/06_code/iar_completion/originals/wa3_linkage_probe.py 0ebc629778c854621f485ceb4f5f11090e84ac9171d52270fcc90b6b07d6fe7f iar_completion/originals/wa3_linkage_probe.py 0ebc629778c854621f485ceb4f5f11090e84ac9171d52270fcc90b6b07d6fe7f unchanged inherited file +submit_comm/06_code/iar_completion/originals/wa3_same_test.py 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 iar_completion/originals/wa3_same_test.py 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 unchanged inherited file +submit_comm/06_code/iar_completion/originals/wa3_typed_strict_test.py c6e9506dbf97752aa248e325e75acf3abf63495054bcac68d48602967379531d iar_completion/originals/wa3_typed_strict_test.py c6e9506dbf97752aa248e325e75acf3abf63495054bcac68d48602967379531d unchanged inherited file +submit_comm/06_code/iar_completion/originals/wa3_typed_test.py 1341b0051fefaf54b4113d7dda5e408540844d12a9275f9a73607c416f35928d iar_completion/originals/wa3_typed_test.py 1341b0051fefaf54b4113d7dda5e408540844d12a9275f9a73607c416f35928d unchanged inherited file +submit_comm/06_code/iar_completion/provenance/final_run/baselines_same_cases.csv 259fdc68a39b415c4ec114fbd6872ceaccaf09327d1fde958390071a5a94af2a iar_completion/provenance/final_run/baselines_same_cases.csv 259fdc68a39b415c4ec114fbd6872ceaccaf09327d1fde958390071a5a94af2a unchanged inherited file +submit_comm/06_code/iar_completion/provenance/final_run/final_iar_summary.json d5b7fd634677ea22ea27670649ea30636ef6c98daedc8592cd3f5d7b56beb9c0 iar_completion/provenance/final_run/final_iar_summary.json d5b7fd634677ea22ea27670649ea30636ef6c98daedc8592cd3f5d7b56beb9c0 unchanged inherited file +submit_comm/06_code/iar_completion/provenance/final_run/run_manifest.json 0aa0dc0fb74388a72750578acdf9beafba917a1976059c813157a90eceae3419 iar_completion/provenance/final_run/run_manifest.json 0aa0dc0fb74388a72750578acdf9beafba917a1976059c813157a90eceae3419 unchanged inherited file +submit_comm/06_code/iar_completion/provenance/heldout_masking_wa3_final_iar_readout_20260926_run_manifest.json a615d9a889c7a62c19d05a4d07d66d9e743fbfb9e37e4d646c889490d297e492 iar_completion/provenance/heldout_masking_wa3_final_iar_readout_20260926_run_manifest.json a615d9a889c7a62c19d05a4d07d66d9e743fbfb9e37e4d646c889490d297e492 unchanged inherited file +submit_comm/06_code/iar_completion/provenance/heldout_masking_wa3_final_iar_readout_all_20260927_run_manifest.json 0aa0dc0fb74388a72750578acdf9beafba917a1976059c813157a90eceae3419 iar_completion/provenance/heldout_masking_wa3_final_iar_readout_all_20260927_run_manifest.json 0aa0dc0fb74388a72750578acdf9beafba917a1976059c813157a90eceae3419 unchanged inherited file +submit_comm/06_code/iar_completion/provenance/heldout_masking_wa3_linkage_diagnosis_20260925_run_manifest.json 933ef4d07c380bd4322814acff135e207e00db36197c3dc543214b24cb5d554e iar_completion/provenance/heldout_masking_wa3_linkage_diagnosis_20260925_run_manifest.json 933ef4d07c380bd4322814acff135e207e00db36197c3dc543214b24cb5d554e unchanged inherited file +submit_comm/06_code/iar_completion/provenance/heldout_masking_wa3_same_test_run_manifest.json 3f713f4e074cbb068264173a8fb0ec99813665ad1b23fdea507f7389071cb04b iar_completion/provenance/heldout_masking_wa3_same_test_run_manifest.json 3f713f4e074cbb068264173a8fb0ec99813665ad1b23fdea507f7389071cb04b unchanged inherited file +submit_comm/06_code/iar_completion/provenance/heldout_masking_wa3_typed_20260924_run_manifest.json b3cf90dc772f206dc386a3a92d96e43d7a6c1de4147bc7cc501599730d31807f iar_completion/provenance/heldout_masking_wa3_typed_20260924_run_manifest.json b3cf90dc772f206dc386a3a92d96e43d7a6c1de4147bc7cc501599730d31807f unchanged inherited file +submit_comm/06_code/iar_completion/provenance/heldout_masking_wa3_typed_strict_20260925_run_manifest.json 4a13b9faecc329257c2aa08fd6734a8b6c02837d0b230b0f659fd00602832c75 iar_completion/provenance/heldout_masking_wa3_typed_strict_20260925_run_manifest.json 4a13b9faecc329257c2aa08fd6734a8b6c02837d0b230b0f659fd00602832c75 unchanged inherited file +submit_comm/06_code/iar_completion/provenance/local_checks.json 9c957fe6b76da503c909ac4e3a0d70cf4ea1fd6da34a3aa6573bac4722d4c62d iar_completion/provenance/local_checks.json 9c957fe6b76da503c909ac4e3a0d70cf4ea1fd6da34a3aa6573bac4722d4c62d unchanged inherited file +submit_comm/06_code/iar_completion/provenance/required_input_hashes.json 8af8ed8b6124f26072d6041deb0e6966c13c149926f5bd720b714884cba6801e iar_completion/provenance/required_input_hashes.json 8af8ed8b6124f26072d6041deb0e6966c13c149926f5bd720b714884cba6801e unchanged inherited file +submit_comm/06_code/iar_completion/provenance/source_inventory.json 2cb3a3f4e8b1d37dd3ad0234996d546f34ab48231bf69247ffb6ace0651a4a69 iar_completion/provenance/source_inventory.json 2cb3a3f4e8b1d37dd3ad0234996d546f34ab48231bf69247ffb6ace0651a4a69 unchanged inherited file +submit_comm/06_code/iar_completion/readout.py 42464d76c743a302bae79ced6b09af9657444c6f977535b5de49dcf59a5a8a90 iar_completion/readout.py 42464d76c743a302bae79ced6b09af9657444c6f977535b5de49dcf59a5a8a90 unchanged inherited file +submit_comm/06_code/iar_completion/requirements.txt 9ef74c17ef3ffacde3f0fc862f9844757bacfffa55b3ac9e7e6a6cca43f5843c iar_completion/requirements.txt 9ef74c17ef3ffacde3f0fc862f9844757bacfffa55b3ac9e7e6a6cca43f5843c unchanged inherited file +submit_comm/06_code/iar_completion/runtime_dependencies.json 3392850a98f1739e3eec8434f42c26f3fad2d3da9fc815a17dd2790aa3b0ff98 iar_completion/runtime_dependencies.json 3392850a98f1739e3eec8434f42c26f3fad2d3da9fc815a17dd2790aa3b0ff98 unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/java/review_A5WurcsArrayTreeAudit.java a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6 iar_completion/runtime_snapshot/java/review_A5WurcsArrayTreeAudit.java a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6 unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/java/review_MolWURCS.jar bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf iar_completion/runtime_snapshot/java/review_MolWURCS.jar bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/java/review_wurcsframework-1.3.1.jar 5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37 iar_completion/runtime_snapshot/java/review_wurcsframework-1.3.1.jar 5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37 unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/project/bert_training_v4/downstream_tasks/utils/wurcs_bpe_tokenizer.py 0bc54399362945601bcfd403441fc80968d173200dd0561f57568b2053a94839 iar_completion/runtime_snapshot/project/bert_training_v4/downstream_tasks/utils/wurcs_bpe_tokenizer.py 0bc54399362945601bcfd403441fc80968d173200dd0561f57568b2053a94839 unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/project/data/bpe_ambiguity_tokens.json c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74 iar_completion/runtime_snapshot/project/data/bpe_ambiguity_tokens.json c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74 unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/project/data/bpe_vocabulary_clean.json 6a572afdf53f1494ab96c896876b824ca7ea749777352606aa9f96bf270ceecc iar_completion/runtime_snapshot/project/data/bpe_vocabulary_clean.json 6a572afdf53f1494ab96c896876b824ca7ea749777352606aa9f96bf270ceecc unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_ambiguity_tokens.json 22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_ambiguity_tokens.json 22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json 918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json 918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py 10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04 iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py 10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04 unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7 iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7 unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py 6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4 iar_completion/runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py 6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4 unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/project/writing/cluster/nature_submission/code/model/__init__.py de8c3237b858b640ee9fbf4dac34864c54b6dac80bc89f346a44c774254289a4 iar_completion/runtime_snapshot/project/writing/cluster/nature_submission/code/model/__init__.py de8c3237b858b640ee9fbf4dac34864c54b6dac80bc89f346a44c774254289a4 unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/project/writing/cluster/nature_submission/code/model/glycan_bert.py b69f14c9976951325e3a0a4e8107a16126e67d410e966650f513f1f538a732bb iar_completion/runtime_snapshot/project/writing/cluster/nature_submission/code/model/glycan_bert.py b69f14c9976951325e3a0a4e8107a16126e67d410e966650f513f1f538a732bb unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/project/writing/cluster/nature_submission/code/model/multimodal_glycan_bert_v3.py 8e06c32f4e844c3c66f146fd15a075472808a0720c892d0b9683dfd32f15ef0c iar_completion/runtime_snapshot/project/writing/cluster/nature_submission/code/model/multimodal_glycan_bert_v3.py 8e06c32f4e844c3c66f146fd15a075472808a0720c892d0b9683dfd32f15ef0c unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/project/writing/cluster/nature_submission/code/training/ipa_bpe_distillation.py f0c8efda7a12942b4c6359792d6ee9417e6a9ec0eb04623ad17b4772430270b5 iar_completion/runtime_snapshot/project/writing/cluster/nature_submission/code/training/ipa_bpe_distillation.py f0c8efda7a12942b4c6359792d6ee9417e6a9ec0eb04623ad17b4772430270b5 unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/project/writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py 8d05a4048e200625694ff9a36f50af89b845fd0d38ba8034a97a710e7ad3dce2 iar_completion/runtime_snapshot/project/writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py 8d05a4048e200625694ff9a36f50af89b845fd0d38ba8034a97a710e7ad3dce2 unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/schema/classify.py cfce20d28291c8b5868d35386990037415090202dd823bdfd73038456cc65557 iar_completion/runtime_snapshot/schema/classify.py cfce20d28291c8b5868d35386990037415090202dd823bdfd73038456cc65557 unchanged inherited file +submit_comm/06_code/iar_completion/runtime_snapshot/schema/pipelib.py 704ed130bdcce94a7af7ce3e37654705f709b8526f632907ef794451c6ef7f30 iar_completion/runtime_snapshot/schema/pipelib.py 704ed130bdcce94a7af7ce3e37654705f709b8526f632907ef794451c6ef7f30 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/iar_inference/README.md be4b51d806c364f6aa88119d17d71674b8313dde8a35c82099ca755a5c46e0b6 iar_inference/README.md be4b51d806c364f6aa88119d17d71674b8313dde8a35c82099ca755a5c46e0b6 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/iar_inference/SHA256SUMS 1d21cb72f1cc7d5a094a5fb5f0ec11a6072df996f0975cc39569ed9964daee1c iar_inference/SHA256SUMS 1d21cb72f1cc7d5a094a5fb5f0ec11a6072df996f0975cc39569ed9964daee1c unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/iar_inference/config.json 043a38744f9fd832181d822ae8481488d954604bf615b2eb05c4c8ad29794325 iar_inference/config.json 043a38744f9fd832181d822ae8481488d954604bf615b2eb05c4c8ad29794325 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/iar_inference/fixtures/case0_pre_sequence_head.npy a212cfbd49ec2f951e942c92caaac63260687a626eca588cb692d86bb1e52198 iar_inference/fixtures/case0_pre_sequence_head.npy a212cfbd49ec2f951e942c92caaac63260687a626eca588cb692d86bb1e52198 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/iar_inference/fixtures/case1_pre_sequence_head.npy 6ffca438526432a33168a85a0fee1158fd2a9c9f23ecb97f587235f204ae50b3 iar_inference/fixtures/case1_pre_sequence_head.npy 6ffca438526432a33168a85a0fee1158fd2a9c9f23ecb97f587235f204ae50b3 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/iar_inference/fixtures/rebuilt_two_case_inputs.json 60ac0c0fd1b6e0ada2d847d1fccff4f6fe7c085aab3146247dc5d7bfebbabc27 iar_inference/fixtures/rebuilt_two_case_inputs.json 60ac0c0fd1b6e0ada2d847d1fccff4f6fe7c085aab3146247dc5d7bfebbabc27 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/iar_inference/fixtures/reference_smoke_report.json 60dcdb6262457962da84c7b239c194fac343bd8d27db0e05f15906acb9bf5f4b iar_inference/fixtures/reference_smoke_report.json 60dcdb6262457962da84c7b239c194fac343bd8d27db0e05f15906acb9bf5f4b unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/iar_inference/infer.py 9237b349668ea3fb5266f4696169fd958e9f997e5064ede0ab06e41859b17361 iar_inference/infer.py 9237b349668ea3fb5266f4696169fd958e9f997e5064ede0ab06e41859b17361 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/iar_inference/original_inference_helpers.py 87fa484e1f6105fa476dff4cf8c7e6aea71a2aac537796131a4858632f54b906 iar_inference/original_inference_helpers.py 87fa484e1f6105fa476dff4cf8c7e6aea71a2aac537796131a4858632f54b906 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/iar_inference/preparation_validation.json 4e36f9237dc494eb47898ff3ab9a5b1a483f5004aa933a5294af794edd0757ce iar_inference/preparation_validation.json 4e36f9237dc494eb47898ff3ab9a5b1a483f5004aa933a5294af794edd0757ce unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/iar_inference/requirements.txt 16e89b25a13eabc8586ba2a8ec32890ecf321f652b03f7548c63112d13cb2e62 iar_inference/requirements.txt 16e89b25a13eabc8586ba2a8ec32890ecf321f652b03f7548c63112d13cb2e62 unchanged inherited file +new workbench interface or documentation notebooks/BERTose_workbench.ipynb 144e09f44c6cc2c09df0fafefb2c3975c590ae684756500fae9b6a589767574c workbench release change +submit_comm/06_code/provenance/WA3_checkpoint_index.json a4b66d2ed429ad6516646256a84173082b2fca6b779baa6e4ff93586a81a5c2b provenance/WA3_checkpoint_index.json a4b66d2ed429ad6516646256a84173082b2fca6b779baa6e4ff93586a81a5c2b unchanged inherited file +submit_comm/06_code/provenance/WA3_final_receipt.json b8b05510e97f6b94ca5e0d1465eba034724d7ddcc405aa405db09c4c29fc768b provenance/WA3_final_receipt.json b8b05510e97f6b94ca5e0d1465eba034724d7ddcc405aa405db09c4c29fc768b unchanged inherited file +submit_comm/06_code/provenance/affinose_arms_on_test_20260909.json 670cfcbcfe89e0729bb75f122cff8c7100c24d39ef775c69421d4bb820654056 provenance/affinose_arms_on_test_20260909.json 670cfcbcfe89e0729bb75f122cff8c7100c24d39ef775c69421d4bb820654056 unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_mo_20260908_mo_A_glycan_s42/receipt.json a291a8e8f2b77c7955b5346aa52289afc520a0b5181d62eb0dfa2c096bd6bbb8 provenance/affinose_cells/affinose_mo_20260908_mo_A_glycan_s42/receipt.json a291a8e8f2b77c7955b5346aa52289afc520a0b5181d62eb0dfa2c096bd6bbb8 unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_mo_20260908_mo_A_glycan_s42/results.json fdd520b70e38d0e6bc112118adad89cf209278614645b47e219341736bf99599 provenance/affinose_cells/affinose_mo_20260908_mo_A_glycan_s42/results.json fdd520b70e38d0e6bc112118adad89cf209278614645b47e219341736bf99599 unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_mo_20260908_mo_C_doubly_s42/receipt.json 29b68fb30127700fa55942d5cc4c237f8bf15c2d0c883192b62698d811e71c51 provenance/affinose_cells/affinose_mo_20260908_mo_C_doubly_s42/receipt.json 29b68fb30127700fa55942d5cc4c237f8bf15c2d0c883192b62698d811e71c51 unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_mo_20260908_mo_C_doubly_s42/results.json 54918a535b86b01590bab11c78ff4c354c106ca78a384446eb79038b0df666af provenance/affinose_cells/affinose_mo_20260908_mo_C_doubly_s42/results.json 54918a535b86b01590bab11c78ff4c354c106ca78a384446eb79038b0df666af unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s43/receipt.json a380534df6f877c212a2c7dbce577511e282537bbff9ad5d7ac3e186f1cc5633 provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s43/receipt.json a380534df6f877c212a2c7dbce577511e282537bbff9ad5d7ac3e186f1cc5633 unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s43/results.json a732a56ddc81fc41b02dde8f56d852929ec8eefa12524ed9410a09361f267544 provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s43/results.json a732a56ddc81fc41b02dde8f56d852929ec8eefa12524ed9410a09361f267544 unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s44/receipt.json 9344a727416db1368c45a0ddad962a12130e10f03944a5142874f72ba5311297 provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s44/receipt.json 9344a727416db1368c45a0ddad962a12130e10f03944a5142874f72ba5311297 unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s44/results.json a530b2fac81a72d99674906253897a1e3eecca4ee17e83c3a27ed409a3411877 provenance/affinose_cells/affinose_mof_20260909_mof_B_protein_s44/results.json a530b2fac81a72d99674906253897a1e3eecca4ee17e83c3a27ed409a3411877 unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s43/receipt.json 068bb72cc2fc0231f3a9f729ac78f1a6340a7088ea86a60449ebe63dcfbd794d provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s43/receipt.json 068bb72cc2fc0231f3a9f729ac78f1a6340a7088ea86a60449ebe63dcfbd794d unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s43/results.json a21307bb48db62270792f990541bac1c2728feb34063f4b2009e2f6c7d8a7e4c provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s43/results.json a21307bb48db62270792f990541bac1c2728feb34063f4b2009e2f6c7d8a7e4c unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s44/receipt.json 3044b56619b1bb83063070624b02bfaa64c952c1da76a80051bb62bb26098395 provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s44/receipt.json 3044b56619b1bb83063070624b02bfaa64c952c1da76a80051bb62bb26098395 unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s44/results.json 42ffeb2f81acbae80df3284300d0213b52918b90d3b186dbbd1f074800af75f0 provenance/affinose_cells/affinose_mof_20260909_mof_C_doubly_s44/results.json 42ffeb2f81acbae80df3284300d0213b52918b90d3b186dbbd1f074800af75f0 unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_sa_20260908_mo_B_protein_s42/receipt.json 07a919272c928f9630f4d70a73cf1aa91a327e2c9597cf582814c5386b6f24cc provenance/affinose_cells/affinose_sa_20260908_mo_B_protein_s42/receipt.json 07a919272c928f9630f4d70a73cf1aa91a327e2c9597cf582814c5386b6f24cc unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_sa_20260908_mo_B_protein_s42/results.json ef5a0b42f15f23a473d46198bd39dc17176add75a1bf76cd708d5b595d552b6e provenance/affinose_cells/affinose_sa_20260908_mo_B_protein_s42/results.json ef5a0b42f15f23a473d46198bd39dc17176add75a1bf76cd708d5b595d552b6e unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s43/receipt.json c3e3028a05cf7f5b58883d9485bcd7a7e0ba5d05265f4503b8bad09e307c1480 provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s43/receipt.json c3e3028a05cf7f5b58883d9485bcd7a7e0ba5d05265f4503b8bad09e307c1480 unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s43/results.json f62ddffaffae54f91e4f921fa235741df4023e94b47c2c90f3e158b7c4cd9858 provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s43/results.json f62ddffaffae54f91e4f921fa235741df4023e94b47c2c90f3e158b7c4cd9858 unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s44/receipt.json 6f5cbc9e19a45b4e9c8d33e7f4a82e41ef610b5040175852d3c05ea172995d4f provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s44/receipt.json 6f5cbc9e19a45b4e9c8d33e7f4a82e41ef610b5040175852d3c05ea172995d4f unchanged inherited file +submit_comm/06_code/provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s44/results.json 9f0a6dc5b89f58603fb368e754da90001a987016ed4d9ab425420703aeb44d9e provenance/affinose_cells/affinose_sa_20260908_moc_A_glycan_s44/results.json 9f0a6dc5b89f58603fb368e754da90001a987016ed4d9ab425420703aeb44d9e unchanged inherited file +submit_comm/06_code/provenance/affinose_input_hashes_moA_glycan_20260908.json f4fb099a7dbe229450d2ca337d213555203dc69dd67f1e4b2cca227baca3d701 provenance/affinose_input_hashes_moA_glycan_20260908.json f4fb099a7dbe229450d2ca337d213555203dc69dd67f1e4b2cca227baca3d701 unchanged inherited file +submit_comm/06_code/provenance/affinose_input_hashes_moB_protein_20260908.json 00c53175abc949336bf495c796dc9c779af2109227bc6f351433356129d85663 provenance/affinose_input_hashes_moB_protein_20260908.json 00c53175abc949336bf495c796dc9c779af2109227bc6f351433356129d85663 unchanged inherited file +submit_comm/06_code/provenance/affinose_input_hashes_moC_doubly_20260908.json 3d3c6fd5c39fe2f1ce37ce5ba47b842fa193b716c08227678d68cdcc7e996c4e provenance/affinose_input_hashes_moC_doubly_20260908.json 3d3c6fd5c39fe2f1ce37ce5ba47b842fa193b716c08227678d68cdcc7e996c4e unchanged inherited file +submit_comm/06_code/provenance/affinose_recipe.json ebf5e35b60640944bf3d03955f10da2c40cd5075a85bf0e3a4c6210f97ed85a6 provenance/affinose_recipe.json ebf5e35b60640944bf3d03955f10da2c40cd5075a85bf0e3a4c6210f97ed85a6 unchanged inherited file +submit_comm/06_code/provenance/artifact_locations.tsv 9c14d2981a11bef92ef230e9848f9876d941b290f2c70848e739a2795bb6feea provenance/artifact_locations.tsv 9c14d2981a11bef92ef230e9848f9876d941b290f2c70848e739a2795bb6feea unchanged inherited file +submit_comm/06_code/provenance/candidate_affinose_input_hashes_moA_glycan_20260908.json 4dfa51299e99a23add6cdfe5380403d4504a207e2b6522ea86cc50ba1cd2cb74 provenance/candidate_affinose_input_hashes_moA_glycan_20260908.json 4dfa51299e99a23add6cdfe5380403d4504a207e2b6522ea86cc50ba1cd2cb74 unchanged inherited file +submit_comm/06_code/provenance/candidate_affinose_input_hashes_moB_protein_20260908.json 48768c773a262864e7a5104732d1e37971be2581058dec7e6f8778d05483965c provenance/candidate_affinose_input_hashes_moB_protein_20260908.json 48768c773a262864e7a5104732d1e37971be2581058dec7e6f8778d05483965c unchanged inherited file +submit_comm/06_code/provenance/candidate_affinose_input_hashes_moC_doubly_20260908.json efbfbea3df98ff7b20dadae530aaf5e3cdadc7216a60a97495b4344e39ef1934 provenance/candidate_affinose_input_hashes_moC_doubly_20260908.json efbfbea3df98ff7b20dadae530aaf5e3cdadc7216a60a97495b4344e39ef1934 unchanged inherited file +submit_comm/06_code/provenance/candidate_portability.patch 2ce6f4a60fdb0bc87d69e270bd724fbccbfae6239579f3c17c0c4d8de05b3d94 provenance/candidate_portability.patch 2ce6f4a60fdb0bc87d69e270bd724fbccbfae6239579f3c17c0c4d8de05b3d94 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/provenance/copied_sources.json 16bed602b94a1a3010f07c2feca3e219035160ab5cc05f4ab202faf57ae1c63c provenance/copied_sources.json 16bed602b94a1a3010f07c2feca3e219035160ab5cc05f4ab202faf57ae1c63c unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/provenance/execution_summary.json 967d38d95702e0863eec468dac9de27fee7da60312fc53ba0f95c5b88f381595 provenance/execution_summary.json 967d38d95702e0863eec468dac9de27fee7da60312fc53ba0f95c5b88f381595 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/provenance/local_checks.json f4cd53bb88fb383677e0f85417662c01a351a954db6df93b6162d0aadda495b0 provenance/local_checks.json f4cd53bb88fb383677e0f85417662c01a351a954db6df93b6162d0aadda495b0 unchanged inherited file +submit_comm/06_code/provenance/local_test_environment.json fc689486dc297277e32480d52d9abb69549520c085101bd406ef3ed6c2fad86b provenance/local_test_environment.json fc689486dc297277e32480d52d9abb69549520c085101bd406ef3ed6c2fad86b unchanged inherited file +submit_comm/06_code/provenance/moconf_cells.tsv 7202cdde019556a7babb3459ae04da8ab5ecb5edbdfde2b74c4a675ed1c9ff43 provenance/moconf_cells.tsv 7202cdde019556a7babb3459ae04da8ab5ecb5edbdfde2b74c4a675ed1c9ff43 unchanged inherited file +submit_comm/06_code/provenance/mofull_cells.tsv e6f1be53ab77ad80ea274f80bd11369bb4efe3836b6119c58283ec12af224752 provenance/mofull_cells.tsv e6f1be53ab77ad80ea274f80bd11369bb4efe3836b6119c58283ec12af224752 unchanged inherited file +submit_comm/06_code/provenance/motif_cells.tsv 67b5ade1b857e789173128939c6baa4687354bb1d640d8fd3b40332b5956ec72 provenance/motif_cells.tsv 67b5ade1b857e789173128939c6baa4687354bb1d640d8fd3b40332b5956ec72 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/provenance/portable_execution_20260930/binding_portable_report.json fb75dee7521e1ca381d9b1fd5c7054bb7ba6389dfde61259362ae4d082ba9a7e provenance/portable_execution_20260930/binding_portable_report.json fb75dee7521e1ca381d9b1fd5c7054bb7ba6389dfde61259362ae4d082ba9a7e unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/provenance/portable_execution_20260930/code_snapshot_manifest.json 24f61f4291610df9d7ad89a0cc8afb6a472e41b2dab3ef1ca73d852076c073da provenance/portable_execution_20260930/code_snapshot_manifest.json 24f61f4291610df9d7ad89a0cc8afb6a472e41b2dab3ef1ca73d852076c073da unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/provenance/portable_execution_20260930/execution_receipt.json 07fee191f75e12c5becd19b3dbe627ff3a9dbcfcdeb0aea770126483bfd0cebb provenance/portable_execution_20260930/execution_receipt.json 07fee191f75e12c5becd19b3dbe627ff3a9dbcfcdeb0aea770126483bfd0cebb unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/provenance/portable_execution_20260930/iar_portable_report.json b51a0f8f5c7b5682e4c432587236bce9daa74e6f2389ccba89b34bcc8c0042cd provenance/portable_execution_20260930/iar_portable_report.json b51a0f8f5c7b5682e4c432587236bce9daa74e6f2389ccba89b34bcc8c0042cd unchanged inherited file +submit_comm/06_code/provenance/score_arms_on_test_historical.py dc42f4cdd76cc2c49fedfe6b8b8ef40b5915ee70803c9cec5ec0b0573256f815 provenance/score_arms_on_test_historical.py dc42f4cdd76cc2c49fedfe6b8b8ef40b5915ee70803c9cec5ec0b0573256f815 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/provenance/sequence_variants.json e2bad73cbdcc16a2a44f2d6e8230bc55b5a8a484d7553af29e379a12f541bba9 provenance/sequence_variants.json e2bad73cbdcc16a2a44f2d6e8230bc55b5a8a484d7553af29e379a12f541bba9 unchanged inherited file +submit_comm/06_code/README.md 6fc928f84838ac82af228d744fadb8be670d631afd5ca84ff84d0847b140d8fd provenance/submission_README.md 6fc928f84838ac82af228d744fadb8be670d631afd5ca84ff84d0847b140d8fd unchanged inherited file +submit_comm/06_code/SHA256SUMS cf0e33d454260a8fa949a9c5fea60bac6291b84c3db573e48fb1735f3a2a2772 provenance/submission_SHA256SUMS cf0e33d454260a8fa949a9c5fea60bac6291b84c3db573e48fb1735f3a2a2772 unchanged inherited file +submit_comm/06_code/code_inventory.tsv 80aae521be2bdc5ac2337ea733f7a8ade028f788499d7d44ff1b6e7389639c8d provenance/submission_code_inventory.tsv 80aae521be2bdc5ac2337ea733f7a8ade028f788499d7d44ff1b6e7389639c8d unchanged inherited file +submit_comm/06_code/requirements.txt 48da67d3a47fb1155389fccdd9022b825b2eeefb60e28260633ec4c2fe00a33f provenance/submission_requirements.txt 48da67d3a47fb1155389fccdd9022b825b2eeefb60e28260633ec4c2fe00a33f unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/provenance/third_party_archives.json 05832b5f811b977c09418c79545d8e38c689973b4a91e36a96e20389ac3c0e2c provenance/third_party_archives.json 05832b5f811b977c09418c79545d8e38c689973b4a91e36a96e20389ac3c0e2c unchanged inherited file +submit_comm/06_code/provenance/training_v8_before_resume_load_fix.py b7cb8a39e167f2cc9e35476dcdcad56320b02c1898d13db3236a41bbb2ed4852 provenance/training_v8_before_resume_load_fix.py b7cb8a39e167f2cc9e35476dcdcad56320b02c1898d13db3236a41bbb2ed4852 unchanged inherited file +submit_comm/06_code/provenance/wa3_config.json be8f4ae30ae2fbd8f91de0e5db98de3044213e24587717775c31df37e2272dbb provenance/wa3_config.json be8f4ae30ae2fbd8f91de0e5db98de3044213e24587717775c31df37e2272dbb unchanged inherited file +new workbench interface or documentation provenance/workbench_assets.json 881354fe1ef1eb6ae73565a42da2b175a0426f41feb6b3a1d8897c4e048fa012 workbench release change +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/requirements-analysis.txt fcbf7a31abd2f468c589feca4111a1d5b851e587046aed53ca0196deb3f39e74 requirements-analysis.txt fcbf7a31abd2f468c589feca4111a1d5b851e587046aed53ca0196deb3f39e74 unchanged inherited file +new workbench interface or documentation requirements-workbench.txt 2c69dc6c9b8643afe0e9fbd5f2f355662dc55f2b555f2b096b582065baa2db74 workbench release change +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/requirements.txt 1c89cbdda9d2c1fb7a3df6692f93eb2765f59f64dd3392b8799697f3238a8867 requirements.txt 1c89cbdda9d2c1fb7a3df6692f93eb2765f59f64dd3392b8799697f3238a8867 unchanged inherited file +submit_comm/06_code/score_predictions.py 428d6c855cd9a6a1988581f9d71bd85a130ceb7b803e6190b3590f5e40ef426c score_predictions.py 428d6c855cd9a6a1988581f9d71bd85a130ceb7b803e6190b3590f5e40ef426c unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/README.md 1a8459fea8d7d35948bd4315d840a0ec6f60e4fcb4823e18d903294f2c1c20d5 structure_md_processing/README.md 1a8459fea8d7d35948bd4315d840a0ec6f60e4fcb4823e18d903294f2c1c20d5 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/SHA256SUMS d1c48e285928b5b4e2b84f7748bfeb3360f0c98c8d66ac1651927f849e5384f6 structure_md_processing/SHA256SUMS d1c48e285928b5b4e2b84f7748bfeb3360f0c98c8d66ac1651927f849e5384f6 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/evidence/review_md_parent_temporal_20x6_v2_summary.json 39c6691d762b1ac2d0bed3464b1ed31e4fbe72b18e218ba4a553f3f94702a9e2 structure_md_processing/evidence/review_md_parent_temporal_20x6_v2_summary.json 39c6691d762b1ac2d0bed3464b1ed31e4fbe72b18e218ba4a553f3f94702a9e2 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/extension_checks.json 823f089df162283c6ed2077d7c8af1cfc49d1f814e58a029b64c2c18a0a075d8 structure_md_processing/extension_checks.json 823f089df162283c6ed2077d7c8af1cfc49d1f814e58a029b64c2c18a0a075d8 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/independent_qa_20260930.json 2e644b90c80388a169da946a22557e0d6d0f37876334fa5d450f27fce41aebe1 structure_md_processing/independent_qa_20260930.json 2e644b90c80388a169da946a22557e0d6d0f37876334fa5d450f27fce41aebe1 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/input_closure_20260930.json 1e15e8a160c1af8e31c490fde35e9177fce583d98157751a852846d1390cb43a structure_md_processing/input_closure_20260930.json 1e15e8a160c1af8e31c490fde35e9177fce583d98157751a852846d1390cb43a unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/prior_snapshot_20260929.json 0f43a293b4b5edaa76da4c4073a7a221582b064c41375a7de982b09dbfe05642 structure_md_processing/prior_snapshot_20260929.json 0f43a293b4b5edaa76da4c4073a7a221582b064c41375a7de982b09dbfe05642 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/training/__init__.py 0d967082a8225a1eab98315c2fe7916eff0e863ec04287a43351b757e08f5070 structure_md_processing/project/training/__init__.py 0d967082a8225a1eab98315c2fe7916eff0e863ec04287a43351b757e08f5070 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/training/a5_glycam_chemistry.py daae9ee3f3c286e36c7fd7ede37f889eca2a6f9956755717a5bf714645ffa4bb structure_md_processing/project/training/a5_glycam_chemistry.py daae9ee3f3c286e36c7fd7ede37f889eca2a6f9956755717a5bf714645ffa4bb unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/training/a5_static_alignment.py ee6e3d06fce7316b3622f4ad92d900608eb91af09f3872d0200c1b246158605f structure_md_processing/project/training/a5_static_alignment.py ee6e3d06fce7316b3622f4ad92d900608eb91af09f3872d0200c1b246158605f unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/training/a5_topology.py f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7 structure_md_processing/project/training/a5_topology.py f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/training/masking.py d08683664ffe28661becd6bdfd5b6b8169bd430800c3e844218969548d3498a2 structure_md_processing/project/training/masking.py d08683664ffe28661becd6bdfd5b6b8169bd430800c3e844218969548d3498a2 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/training/multimodal_dataset.py ca2be55ece9c15271713f553f619bdd42cf4292c6c9d86e19037db9a73168e28 structure_md_processing/project/training/multimodal_dataset.py ca2be55ece9c15271713f553f619bdd42cf4292c6c9d86e19037db9a73168e28 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/training/multimodal_masking.py 21ae467f964ea98486ed7efa3f7887194e05c326e4fa92f124e8d5f5570f030c structure_md_processing/project/training/multimodal_masking.py 21ae467f964ea98486ed7efa3f7887194e05c326e4fa92f124e8d5f5570f030c unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/configs/review_md_temporal_20x6_v1_20260801.yaml 2e3b0a72767fa5e7ca950ada7923faac63e58db53f6969a030e01938a81254ad structure_md_processing/project/writing/review/glycam_structure/configs/review_md_temporal_20x6_v1_20260801.yaml 2e3b0a72767fa5e7ca950ada7923faac63e58db53f6969a030e01938a81254ad unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/configs/review_md_temporal_20x9_v1_20260731.yaml 4d668c45f1f17f12b1d4af022d2e1849cec815e24664e8ad9183569fae7f764f structure_md_processing/project/writing/review/glycam_structure/configs/review_md_temporal_20x9_v1_20260731.yaml 4d668c45f1f17f12b1d4af022d2e1849cec815e24664e8ad9183569fae7f764f unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/audit_review_md_charge_corrected_exact_roster_20260802_r1.py ddabd88756774a9c75ae93709fafb6b7c2d3cdf0c9b7d5b66fd801d8e2388c76 structure_md_processing/project/writing/review/glycam_structure/scripts/audit_review_md_charge_corrected_exact_roster_20260802_r1.py ddabd88756774a9c75ae93709fafb6b7c2d3cdf0c9b7d5b66fd801d8e2388c76 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/audit_review_md_parent_feature_package.py 131499356bc91f07ebd1f2f40166c9f756d7e64b49a66ee69d1efa0fcecf9843 structure_md_processing/project/writing/review/glycam_structure/scripts/audit_review_md_parent_feature_package.py 131499356bc91f07ebd1f2f40166c9f756d7e64b49a66ee69d1efa0fcecf9843 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/audit_review_md_temporal_20x6_r2.py dacc54f37dc4c816fdf2fb801b13eb239cf42444883ace1dfed2a92b6fc798da structure_md_processing/project/writing/review/glycam_structure/scripts/audit_review_md_temporal_20x6_r2.py dacc54f37dc4c816fdf2fb801b13eb239cf42444883ace1dfed2a92b6fc798da unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/build_review_md_parent_feature_package.py 2df5009bdcefb49ed7742391d7d6f5f73cf1574fc7d17cd46bd2ad3098331a06 structure_md_processing/project/writing/review/glycam_structure/scripts/build_review_md_parent_feature_package.py 2df5009bdcefb49ed7742391d7d6f5f73cf1574fc7d17cd46bd2ad3098331a06 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/build_review_md_temporal_20x6_r2.py 4bad11cfd69c150f2c50b92856a6ab21641772baa2236b45ca505f5637ea5a0b structure_md_processing/project/writing/review/glycam_structure/scripts/build_review_md_temporal_20x6_r2.py 4bad11cfd69c150f2c50b92856a6ab21641772baa2236b45ca505f5637ea5a0b unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/build_review_md_temporal_20x9.py 2743e322eccd5c0217b44e3eb6c4dc242d35db7eacf91f235d23f7a846b70dbb structure_md_processing/project/writing/review/glycam_structure/scripts/build_review_md_temporal_20x9.py 2743e322eccd5c0217b44e3eb6c4dc242d35db7eacf91f235d23f7a846b70dbb unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/freeze_review_md_temporal_feature_layer.py 35108afde036b0f1fbf888014a5afebc45568b45dbdea85a5913c2dba8938127 structure_md_processing/project/writing/review/glycam_structure/scripts/freeze_review_md_temporal_feature_layer.py 35108afde036b0f1fbf888014a5afebc45568b45dbdea85a5913c2dba8938127 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/merge_review_md_charge_corrected_temporal_20x9_r1.py 102466ed3bf04ef2cf2ab53b04fdbb9c6e6ea1d16061194f97eed5bedc4e2e2d structure_md_processing/project/writing/review/glycam_structure/scripts/merge_review_md_charge_corrected_temporal_20x9_r1.py 102466ed3bf04ef2cf2ab53b04fdbb9c6e6ea1d16061194f97eed5bedc4e2e2d unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/prepare_review_md_charge_corrected_feature_overlay_r1.py 47c9d9a448325e59742e30a444b636e888df18cf88f010fdad09e0393f5bf9c9 structure_md_processing/project/writing/review/glycam_structure/scripts/prepare_review_md_charge_corrected_feature_overlay_r1.py 47c9d9a448325e59742e30a444b636e888df18cf88f010fdad09e0393f5bf9c9 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_all20_charge_corrected_run_state_r6.py 80c1e2cbf2f2bbf7a19564a7e88d65e2d9dd4a190c33e6b5405dd107d6e553fe structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_all20_charge_corrected_run_state_r6.py 80c1e2cbf2f2bbf7a19564a7e88d65e2d9dd4a190c33e6b5405dd107d6e553fe unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_wiley_pca_corpus.py dfc5670ad8a146af48abfb381198bacd017ad7dbac4a081bc204d5dbf61cb1cb structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_wiley_pca_corpus.py dfc5670ad8a146af48abfb381198bacd017ad7dbac4a081bc204d5dbf61cb1cb unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_wiley_pca_pilot.py b9f20eef44858866d95338a6f5dedebf253d8e827890d10806ce7d0045b14594 structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_wiley_pca_pilot.py b9f20eef44858866d95338a6f5dedebf253d8e827890d10806ce7d0045b14594 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_wiley_structural_extension.py 39f9ddfd0e91c3afc1c3b6085689f8bed7bf585446128be634ab97369a79869b structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_wiley_structural_extension.py 39f9ddfd0e91c3afc1c3b6085689f8bed7bf585446128be634ab97369a79869b unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_wiley_torsion_pca_corpus.py 163c93827dc18dd281d8e5a6ceb8b106a02b00e3366442ee09fd0e1b477262e8 structure_md_processing/project/writing/review/glycam_structure/scripts/review_md_wiley_torsion_pca_corpus.py 163c93827dc18dd281d8e5a6ceb8b106a02b00e3366442ee09fd0e1b477262e8 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/run_review_md_charge_corrected_feature_stage_20260802_r1.sh 3cb1b2ea38fef04ba9ba2b01ef1944f69a48fb5dcfd4d8011684de9ddaa10ca7 structure_md_processing/project/writing/review/glycam_structure/scripts/run_review_md_charge_corrected_feature_stage_20260802_r1.sh 3cb1b2ea38fef04ba9ba2b01ef1944f69a48fb5dcfd4d8011684de9ddaa10ca7 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/slurm_freeze_review_md_temporal_feature_layer_20260801.sh 21ffbc09d34291adc6d2a3535ef142014d1d31ea8a28002fee23af29b88f415a structure_md_processing/project/writing/review/glycam_structure/scripts/slurm_freeze_review_md_temporal_feature_layer_20260801.sh 21ffbc09d34291adc6d2a3535ef142014d1d31ea8a28002fee23af29b88f415a unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/glycam_structure/scripts/slurm_review_md_parent_feature_package_20260731.sh bf3ef76494d936044615b59e0941f3b6fb35a935d6743abb5c035995b61a63d5 structure_md_processing/project/writing/review/glycam_structure/scripts/slurm_review_md_parent_feature_package_20260731.sh bf3ef76494d936044615b59e0941f3b6fb35a935d6743abb5c035995b61a63d5 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/multimodal/outputs/p1_a5_static_role_successor_cascade_20260720_r1/review_a5_static_role_successor_cascade_receipt.json b8e953947b4ac55e1cd9d509c33e1bddf211f046b9124ddc175166a1a763b31a structure_md_processing/project/writing/review/multimodal/outputs/p1_a5_static_role_successor_cascade_20260720_r1/review_a5_static_role_successor_cascade_receipt.json b8e953947b4ac55e1cd9d509c33e1bddf211f046b9124ddc175166a1a763b31a unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/multimodal/outputs/review_a5_static_glycam_template_registry_20260721_r2/review_a5_static_glycam_template_registry_r2.json ffbbe2126eb6131ab8b64ab5809b79b29e5534785cbe6fcfe1bba04b93e06050 structure_md_processing/project/writing/review/multimodal/outputs/review_a5_static_glycam_template_registry_20260721_r2/review_a5_static_glycam_template_registry_r2.json ffbbe2126eb6131ab8b64ab5809b79b29e5534785cbe6fcfe1bba04b93e06050 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/multimodal/outputs/review_a5_static_glycam_template_registry_20260721_r2/review_a5_static_glycam_template_registry_receipt_r2.json 6bba07e7da9284af46b97f80c25c7e1dc332facf452e0fd2140a975b7c1e496b structure_md_processing/project/writing/review/multimodal/outputs/review_a5_static_glycam_template_registry_20260721_r2/review_a5_static_glycam_template_registry_receipt_r2.json 6bba07e7da9284af46b97f80c25c7e1dc332facf452e0fd2140a975b7c1e496b unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/multimodal/runtime/a5_static_v2_20260721_r7/review_a5_static_graph_materializer_r7.py da8d6dab478ace650fa5af3e99c72dedaf65a6cbc2bf62373fa2082bef748cea structure_md_processing/project/writing/review/multimodal/runtime/a5_static_v2_20260721_r7/review_a5_static_graph_materializer_r7.py da8d6dab478ace650fa5af3e99c72dedaf65a6cbc2bf62373fa2082bef748cea unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/project/writing/review/multimodal/scripts/build_review_a5_static_graph_v2_20260721_r7.py 12fd869f52759168e0f3ff3243ac7dcdb36c0b067d83e24931c185c67fc80c26 structure_md_processing/project/writing/review/multimodal/scripts/build_review_a5_static_graph_v2_20260721_r7.py 12fd869f52759168e0f3ff3243ac7dcdb36c0b067d83e24931c185c67fc80c26 unchanged inherited file +/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/release_20260928/code/structure_md_processing/source_manifest.json 8da3a60c3d205f9a56f3a97842f3c05e647d3f89ad56c91d431eb75ede49c9ff structure_md_processing/source_manifest.json 8da3a60c3d205f9a56f3a97842f3c05e647d3f89ad56c91d431eb75ede49c9ff unchanged inherited file +new workbench interface or documentation test_bertose_workbench.py 28c3941d1ae7ebc86296a4ac7117c27a1d4bcaa0ec6c56ea8cfd18fade1bb7a2 workbench release change diff --git a/releases/2026-10-02/docs/DATA_ACCESS.md b/releases/2026-10-02/docs/DATA_ACCESS.md new file mode 100644 index 0000000000000000000000000000000000000000..906097132626b9dbb1d026159eca53827acc8407 --- /dev/null +++ b/releases/2026-10-02/docs/DATA_ACCESS.md @@ -0,0 +1,33 @@ +# Download code, models and data + +Choose the workflow first. Embedding new WURCS glycans needs the code and one sequence checkpoint. It does not need GlyCorpus, molecular dynamics trajectories or the protein feature cache. + +```bash +python download_assets.py --task embed --variant 3 --output-dir assets +``` + +Use `--dry-run` to see the files and total size before downloading. `--revision` accepts a Hub branch, tag or commit. The loader checks each model's released SHA-256; the downloader also checks the scientific input files. `--local-files-only` reuses downloaded assets without network access. + +| Workflow | Selective download | Approximate size | +|---|---|---| +| Sequence embeddings | One of five sequence checkpoints | 362 MB | +| Cached binding prediction | One fitted checkpoint, glycan feature arrays/index and protein HDF5 | 2.74 GB | +| Supplied IAR cases | Full checkpoint; readout is included in the code | 1.66 GB | + +These are decimal sizes. The download command writes `assets/paths_embed.json`, `paths_binding.json` or `paths_iar.json` with the verified local paths. Keep the downloaded code and weights from matching release versions. The five sequence variants represent different objective weights, rather than independent training seeds. + +## Manuscript data and structure/MD archives + +The combined [Zenodo deposit](https://zenodo.org/deposit/23073476) contains the code archive, the main derived-data archive, static structures, MD coordinates and solute-only trajectories. While the record is a draft, its files require owner access; a reserved DOI is not yet a public download link. The final public availability statement must use the published record and verified Hugging Face versions. + +For the main data, extract `revised_data_for_review_20260930.tar.gz` and read its `DATASET_CARD.md`, `MANIFEST_SHA256.tsv`, licence and source notices. Its September 2026 preparation text records the state when that archive was built; the current release description records upload/publication status. The scientific payload and archive bytes are preserved. + +For trajectories, download the required original TAR or all pieces of a split TAR. Put the pieces together with `raw_archive_reassembly.json` and `reconstruct_raw_archives.py` in one folder, then run: + +```bash +python reconstruct_raw_archives.py +``` + +The reconstruction script checks piece identities and recreates the original TAR archives. Keep the corresponding `.members.jsonl.gz` files for member mappings. Static PDB and MD coordinate archives can be downloaded independently; users interested only in sequence embeddings need none of these archives. + +Original project code and model weights use Apache-2.0. CC-BY-4.0 applies to newly generated data where the contributors hold the rights. Upstream inputs and bundled third-party materials retain their original terms and attribution. diff --git a/releases/2026-10-02/docs/QUICKSTART.md b/releases/2026-10-02/docs/QUICKSTART.md new file mode 100644 index 0000000000000000000000000000000000000000..7ac10b66b5765ff426616d04bd56b8b08737dde0 --- /dev/null +++ b/releases/2026-10-02/docs/QUICKSTART.md @@ -0,0 +1,192 @@ +# BERTose quickstart + +This guide covers the `releases/2026-10-02/` workbench. Code is packaged for `supanthadey1/bertose-affinose-training-code`; the encoder, binding and IAR model assets use their `releases/2026-09-28/` folders. Run the examples from the workbench code directory. + +## Install and open the notebook + +Use Python 3.12. If you already have the code, create an environment and install its requirements: + +```bash +python3.12 -m venv .venv +source .venv/bin/activate +python -m pip install -r requirements-workbench.txt +``` + +To download the version from Hugging Face, install `huggingface-hub` in a Python environment, then select the code folder: + +```bash +python -m pip install "huggingface-hub>=1.1,<2" +hf download supanthadey1/bertose-affinose-training-code --include "releases/2026-10-02/*" --local-dir bertose-workbench +cd bertose-workbench/releases/2026-10-02 +``` + +Open [BERTose_workbench.ipynb](../notebooks/BERTose_workbench.ipynb) in Jupyter or VS Code and select the Python environment above. If your notebook editor needs a named kernel: + +```bash +python -m ipykernel install --user --name bertose-workbench --display-name "BERTose workbench" +``` + +You can also copy the Python examples below into a script in the code directory. PyTorch 2.9.1 and NumPy 1.26.4 are pinned in the base requirements. Use CPU first; changing to a GPU is a separate execution choice, not a claim that the original GPU benchmark has been reproduced. + +## One glycan or a batch + +```python +from bertose_workbench import Encoder + +encoder = Encoder.from_pretrained(variant="3", revision="main", device="cpu") +wurcs = [ + "WURCS=2.0/1,1,0/[a2122h-1a_1-5]/1/", + "WURCS=2.0/1,2,1/[a2122h-1a_1-5]/1-1/a4-b1", +] +vectors, diagnostics = encoder.encode_with_diagnostics( + wurcs, batch_size=8, pooling="first" +) +print(vectors.shape) # (2, 768) +print(diagnostics) +``` + +For just the vectors, call `encoder.encode(wurcs)`. Both methods accept a list of WURCS 2.0 strings. Inputs beyond the trained 256-token envelope are rejected without truncation. Glycan names, IUPAC strings and images are not accepted. Check the diagnostics for unknown characters and unavailable tree channels. + +The default pooling uses the first sequence token. `pooling="mean"` averages attended tokens, including START and END. Use the same pooling for all vectors you compare. The output is a glycan representation; a sequence export alone does not predict binding or fill missing linkage annotations. + +To use an existing local checkpoint: + +```python +encoder = Encoder.from_pretrained( + variant="3", device="cpu", local_checkpoint="/path/to/sequence_encoder.pt" +) +``` + +## Export embeddings from CSV + +Use a CSV with unique `sample_id` values and a `wurcs` column, as in [examples/glycans.csv](../examples/glycans.csv). + +```python +import csv +import numpy as np + +with open("examples/glycans.csv", newline="") as handle: + rows = list(csv.DictReader(handle)) +sample_ids = [row["sample_id"] for row in rows] +vectors = encoder.encode([row["wurcs"] for row in rows], batch_size=8) +np.savez( + "embeddings.npz", + embeddings=vectors, + sample_id=np.asarray(sample_ids, dtype=str), +) +``` + +Replace the example path with your CSV. Load the export with `np.load("embeddings.npz", allow_pickle=False)`. For the existing command-line exporter, including its companion diagnostics JSON, download an encoder with `python download_assets.py --task embed --variant 3 --output-dir assets` and pass the checkpoint path printed by the helper to `embed.py`; see its `--help`. + +## Similarity, neighbors and PCA + +These examples use the vectors and sample IDs from the CSV above: + +```python +from bertose_workbench import cosine_similarity, nearest_neighbors, pca + +similarity = cosine_similarity(vectors, vectors) +print(similarity) # one row and column per glycan + +# Search the remaining rows for neighbors of the first glycan. +indices, scores = nearest_neighbors( + vectors[:1], vectors[1:], k=min(5, len(vectors) - 1) +) +for index, score in zip(indices[0], scores[0]): + print(sample_ids[1 + int(index)], float(score)) +``` + +The neighbor example needs at least two glycans. It excludes the query itself by searching only the remaining rows. Returned indices refer to that search array. + +```python +import matplotlib.pyplot as plt + +coordinates = pca(vectors, n_components=2) +fig, ax = plt.subplots() +ax.scatter(coordinates[:, 0], coordinates[:, 1]) +for name, point in zip(sample_ids, coordinates): + ax.annotate(name, point, xytext=(4, 4), textcoords="offset points") +ax.set(xlabel="PC1", ylabel="PC2", title="BERTose glycan embeddings") +fig.tight_layout() +plt.show() +``` + +PCA uses NumPy SVD to project the current collection; a two-example plot is just a demonstration. Cosine similarity and nearby points describe the learned representation. They do not establish chemical identity, biological equivalence, affinity or model accuracy. + +## Reuse the encoder in a website + +Load the encoder once when the backend starts, then call it for each batch: + +```python +from bertose_workbench import Encoder + +encoder = Encoder.from_pretrained(variant="3", device="cpu") + +def embed_glycans(wurcs_strings): + vectors, diagnostics = encoder.encode_with_diagnostics(wurcs_strings) + return {"embeddings": vectors.tolist(), "diagnostics": diagnostics} +``` + +The website supplies WURCS strings and handles the returned diagnostics. Model inference runs in that backend's Python process. The same API can use `local_checkpoint` for a model file already installed on the server. Keep the binding and IAR input limits below visible wherever those tools are offered. + +## Binding from cached inputs + +Download one fitted model and its glycan/protein feature cache: + +```bash +python download_assets.py --task binding --cell-id mo_A_glycan_s42 --output-dir assets +``` + +The helper writes absolute paths to `assets/paths_binding.json`. Run the two example pairs using those paths: + +```python +import json +import subprocess +import sys +from pathlib import Path + +paths = json.loads(Path("assets/paths_binding.json").read_text()) +subprocess.run([ + sys.executable, "-m", "bertosebind_inference.predict", + "--checkpoint", paths["checkpoint"], + "--cell-id", paths["cell_id"], + "--pairs", "bertosebind_inference/examples/glycan_cold.csv", + "--features-dir", paths["features_dir"], + "--protein-h5", paths["protein_h5"], + "--output", "binding_predictions.json", +], check=True) +``` + +Use a new output filename for another run. The protein feature download is large. Choose another fitted model using a `cell_id` from [the loader configuration](../bertosebind_inference/config.json). + +Your pair CSV needs `sample_id`, `protein_id` and `glycan_wurcs` columns. Both members of every pair must be represented in the supplied cache. This command does not create glycan annotations or ESM-C representations for new inputs. Its score is a model regression output, not a calibrated probability or affinity constant. See [the binding input guide](../bertosebind_inference/README.md) for CSV options and the importable loader API. + +## The two supplied IAR cases + +Download the full reference checkpoint: + +```bash +python download_assets.py --task iar --output-dir assets +``` + +Use the path in `assets/paths_iar.json`: + +```python +import json +import subprocess +import sys +from pathlib import Path + +paths = json.loads(Path("assets/paths_iar.json").read_text()) +subprocess.run([ + sys.executable, "iar_inference/infer.py", + "--checkpoint", paths["checkpoint"], + "--output-dir", "iar_results", "--threads", "4", +], check=True) +``` + +Use a new output directory. The command writes `inference_report.json` with the linkage proposals and acceptance/abstention decisions for the two supplied single-linkage cases. It uses the full reference model and fitted readout on CPU; sequence encoder exports cannot substitute for that checkpoint. General user-input masking, residue completion, multi-token fallback and active physical-modality inputs are outside this interface. See [the IAR guide](../iar_inference/README.md) for its complete input and output details. + +## Training, licenses and source records + +For training or manuscript analyses, see [TRAINING.md](TRAINING.md). Original code and revised model weights use Apache-2.0; newly generated contributor-owned data use CC-BY-4.0. Upstream inputs and third-party dependencies keep their own terms. [LICENSE](../LICENSE), [NOTICE](../NOTICE) and the preserved files under `provenance/` give the scope and references. diff --git a/releases/2026-10-02/docs/TRAINING.md b/releases/2026-10-02/docs/TRAINING.md new file mode 100644 index 0000000000000000000000000000000000000000..f14e540a908ab993341b3dcdbba1e74e54e93ec3 --- /dev/null +++ b/releases/2026-10-02/docs/TRAINING.md @@ -0,0 +1,60 @@ +# Training and reproduction + +The package includes the BERTose pretraining, BERToseBind training and evaluation, completion, structure processing, and figure sources used for the manuscript. The workbench adds a simpler way to use saved models. It does not launch training or replace the original implementations. + +## Find the entry points + +Run commands from the code directory. The longer source paths retain their original names so that they can be traced to the recorded experiments. + +| Workflow | Entry point | Additional inputs | +|---|---|---| +| Sequence embeddings | `embed.py`, `bertose.py` | One sequence encoder checkpoint | +| Multimodal pretraining | `bertose_source/writing/review/multimodal/runtime/a5_wa345_pretraining_20260817_r1_preparation/run_a5_wa345_shim_20260817_r1.py` | Sequence, topology, MS, static and MD packages, matching configurations and input manifests, and a training environment | +| Fitted binding prediction | `bertosebind_inference/predict.py` | One fitted checkpoint, glycan features and protein HDF5 | +| Supplied IAR cases | `iar_inference/infer.py` | Full Variant 3 checkpoint, saved readout and recorded inputs | +| Structure and MD processing | `structure_md_processing/` | Raw structures, intermediate data and external simulation tools | +| BERToseBind training | `affinose/training_v8.py` | Binding and role CSVs, glycan arrays, 165 motif features, protein HDF5, full upstream checkpoint and matching input records | +| Fitted IAR linkage readout | `iar_completion/readout.py` | Hidden features from the full reference model | + +The inference download helper retrieves assets for its selected task. Training needs the additional data listed above. See [input contracts](reproduction.md) and [recorded artifact locations](../provenance/artifact_locations.tsv) before preparing a run. + +## BERTose pretraining + +[The recorded configuration](../provenance/wa3_config.json) and [Variant 3 receipt](../provenance/WA3_final_receipt.json) describe the manuscript reference. The five sequence variants use different pretraining loss weights; they are not five independent repeats of the same recipe. Their selected checkpoints and input mappings are recorded in [sequence_variants.json](../provenance/sequence_variants.json). + +Pretraining requires the full sequence, topology, MS, static and MD inputs, including masks, normalizers and the matching input manifests. The preserved runner imports its predecessor modules through their original directory layout. Historical absolute paths describe the original execution; they must be mapped to the corresponding files on the machine used for a new run. + +The sequence encoder exports contain neither benchmark task heads nor the masked-token output head. Embedding a dataset alone does not reproduce the downstream benchmark or IAR completion. + +## BERToseBind training + +Install the analysis requirements, then inspect the trainer arguments: + +```bash +python -m pip install -r requirements-analysis.txt +python affinose/training_v8.py --help +``` + +Use [affinose_recipe.json](../provenance/affinose_recipe.json) for the recorded model and training settings. A run needs one regime's binding CSV and roles, glycan token/depth/linkage/mask arrays, feature index and motif array, cached protein representations, and the full upstream checkpoint. The regimes are glycan-cold, protein-cold and doubly-cold. The `affinose/` directory retains the earlier code name; the model is BERToseBind. + +The motif branch uses 165 raw count features. Preserve their order and values; they are not binary indicators. The supplied protein representations are cached ESM-C features. The inference helper does not generate new protein embeddings or glycan annotations. + +The historical trainer's validation scorer differs from the final manuscript scorer for constant predictions. For final reporting, use `score_predictions.py` on the complete prediction roster; see [the scoring contract](reproduction.md#bertosebind). + +## Completion, processing and figures + +The supplied IAR command runs two single-linkage cases with the full saved model and fitted readout. The preserved historical completion workflow also contains fitting and dataset-specific steps; see [IAR input requirements](reproduction.md#iar-saved-readout) before using those sources. Sequence-export embeddings cannot substitute for the full model's readout features. + +`structure_md_processing/` contains simulation and descriptor processing sources. Force fields, simulation tools and the corresponding raw inputs are separate dependencies. `figures/` and `bertosebind_new_runs/` contain analysis and figure scripts with their own input instructions. For example: + +```bash +python bertosebind_new_runs/reproduce_summary.py +``` + +This command recreates saved scalar summaries; it does not fit models or generate new predictions. + +The workbench examples exercise inference. They are not a tested recipe for rerunning the full training or benchmark campaign. The original execution records, environments and detailed input requirements remain in [reproduction.md](reproduction.md) and [the execution summary](../provenance/execution_summary.json). + +## Licenses and references + +Original project code uses [Apache-2.0](../LICENSE). See [NOTICE](../NOTICE) for third-party exceptions and attribution. Revised model weights use Apache-2.0; newly generated contributor-owned data use CC-BY-4.0. Upstream data, external model assets and simulation software retain their own terms. Historical package references and source lineage are preserved under `provenance/`. diff --git a/releases/2026-10-02/docs/WEBSITE_INTEGRATION.md b/releases/2026-10-02/docs/WEBSITE_INTEGRATION.md new file mode 100644 index 0000000000000000000000000000000000000000..6f386ed22b0b7fa87c62e047548227339b82b393 --- /dev/null +++ b/releases/2026-10-02/docs/WEBSITE_INTEGRATION.md @@ -0,0 +1,53 @@ +# Use the release code in BERTose Workbench + +The Hugging Face package supplies the model code, weights, example notebook and input descriptions. A website can import the same Python functions. Keep one encoder loaded per worker and batch requests; there is no need to invoke a new process for every glycan. + +## Embeddings and exploration + +```python +from bertose_workbench import Encoder, nearest_neighbors + +encoder = Encoder.from_pretrained(variant="3", device="cpu") + +def embedding_response(wurcs_strings): + vectors, diagnostics = encoder.encode_with_diagnostics( + wurcs_strings, batch_size=8, pooling="first" + ) + return { + "embeddings": vectors.tolist(), + "dimension": int(vectors.shape[1]), + "variant": encoder.metadata["variant"], + "checkpoint_sha256": encoder.metadata["sha256"], + "pooling": "first", + "diagnostics": diagnostics, + } +``` + +Pass WURCS 2.0 strings to this function after validating the request shape and applying the website's request-size limit. The tokenizer rejects inputs outside the trained 256-token envelope and reports unknown tokens and unavailable tree channels. Show those diagnostics to the user. The package does not convert IUPAC, GlycoCT, drawings or other notations to WURCS. + +`nearest_neighbors(query_vectors, reference_vectors, k=5)` returns indices and cosine scores. Keep reference glycan IDs alongside the reference matrix. The notebook also shows PCA visualization and CSV/NPZ export. Similarity and two-dimensional projections are exploratory summaries of embeddings; they are not binding predictions or proof of chemical equivalence. + +The default API downloads only one sequence checkpoint. For an offline deployment, use `Encoder(local_checkpoint_path, variant="3", device="cpu")`. Model bytes and vocabulary are checked by the existing loader. Select a PyTorch device appropriate to the deployment and test it there; the released checks used CPU. + +## Binding and IAR + +Binding is available through `bertosebind_inference.CachedInputs`, `load_model` and `predict_batch`, with CSV parsing in `bertosebind_inference.loader.read_pairs`. See [the loader guide](../bertosebind_inference/README.md) and [quickstart](QUICKSTART.md). Reuse a `CachedInputs` context across batches to avoid reopening and rehashing the protein cache for every request. The nine model IDs in `bertosebind_inference/config.json` identify the fitted checkpoints; select the intended regime and seed explicitly. + +The released binding adapter accepts glycans and proteins in the supplied feature cache. A website accepting new glycans or arbitrary protein FASTA still needs matching glycan annotation, motif counts and per-residue ESM-C 300M features. It cannot substitute the sequence embedding vector for the complete binding-model inputs. Describe the output as a predicted interaction score on the rank-normalized training-target scale, rather than a probability or an absolute affinity measurement. + +The released IAR command runs two supplied single-linkage cases with the full checkpoint and fitted linkage readout. It exposes proposed tokens, their readout probabilities and abstention. A general uncertain-glycan form needs an additional input adapter and validation. Expand IAR as **iterative ambiguity resolution**; token proposals do not establish a chemically valid completed structure. + +## Match website features to the release + +| Website feature | Reusable release component | Additional website work | +|---|---|---| +| Single/batch glycan embeddings | `Encoder.encode_with_diagnostics` | Input conversion and request limits | +| Similarity search and visualization | `nearest_neighbors`, `cosine_similarity`, `pca` | Reference IDs/index and UI | +| CSV/JSON/NPZ embedding export | Notebook and `embed.py` | HTTP export response | +| Protein–glycan binding | Fitted loader and cached input API | Preprocessing for inputs outside the released cache | +| Uncertain-glycan resolver | Full checkpoint and two-case IAR command | General input adapter and valid output contract | +| GlyCorpus/interaction search | Released data and source descriptions | Search index, filtering and attribution | + +At the 2 October 2026 check, the website's health endpoints reported ready models but exposed no checkpoint hash or revised release identity. Include the loaded checkpoint SHA-256 and code commit in a status response before describing a deployment as the revised release. Replace the unfinished About text and align the binding and IAR labels with the meanings above. + +This guide prepares the integration; it does not certify the existing website's inference or deploy a new backend. diff --git a/releases/2026-10-02/docs/reproduction.md b/releases/2026-10-02/docs/reproduction.md new file mode 100644 index 0000000000000000000000000000000000000000..90b8b118c0c034b569904977dca0b91c03ed8392 --- /dev/null +++ b/releases/2026-10-02/docs/reproduction.md @@ -0,0 +1,68 @@ +# Reproduction and input contracts + +## Sequence exports + +`bertose.py` imports the unchanged `ExactNativeSequenceEncoder` class from `executed/downstream/review_a5_native_checkpoint.py`. Its embeddings and twelve layers are the exact native classes used by the R4 composite and inherited by R5. The adapter loads the 209 exported entries strictly, preserving names, tensors and positional buffers. It does not construct a Hugging Face `AutoModel`, reinitialize loaded weights, rename keys, or add a learned pooling layer. Source and export hashes are recorded in the manifests. + +The archival `run_review_native_md_on_terminal4_s42.py` documents the original export/load procedure. Its original context-specific seed guard and cluster paths remain unchanged. The public loader instead checks the released variant's complete file hash and recorded seed/epoch. It is a portable loading adapter, not a modified training runner. + +The selected export is a sequence representation model. Reproducing taxonomy, linkage, immunogenicity, or interaction benchmarks also requires the corresponding fitted task heads, task-specific split/label files and per-task recipe. Those heads are not contained in the sequence exports. Benchmark scores cannot be inferred by applying the mean-pooling option to arbitrary data. + +## Multimodal pretraining + +The selected model used sequence/topology/MS/static/MD coefficients 0.5/0.25/2/0.25/2 and five fixed objective slots. Sparse auxiliary inputs and runtime checks are implemented in the preserved source tree; changing paths must not change its input digests or objective definitions. `provenance/WA3_final_receipt.json` and `WA3_checkpoint_index.json` identify seed 42 and selected epoch 58. `wa3_config.json` is a compact recorded configuration, not a complete launch command. + +The pretraining entrypoint has a chain of immutable predecessor modules and input manifests. Their necessary directory structure is retained. Running `--help` or compiling them does not establish that the complete training data and environment are present. Repeating pretraining requires all referenced arrays, static code tokens, corrected MD features and normalization constants, MS selection/mask streams, and path-bound receipts. These large scientific inputs are released separately subject to their provenance and terms. + +## BERToseBind + +The `affinose/` filenames retain the implementation's historical identifier. The model is called BERToseBind in public text. The executed motif model combines a BERTose sequence tower, cached per-residue protein embeddings, two bidirectional cross-attention blocks, mean pooling, a prediction head, and an additive 165-feature motif branch. Embeddings and the first four glycan encoder layers are frozen by the documented training recipe; the remaining glycan layers and task model are optimized. Protein features are supplied from cache. + +Inspect the actual trainer arguments with: + +```bash +python affinose/training_v8.py --help +``` + +Use `provenance/affinose_recipe.json` for recorded values and `provenance/artifact_locations.tsv` for input identities. A training invocation needs the exact selected regime's binding CSV and roles, token/depth/linkage/mask arrays, index and motif arrays, protein HDF5, upstream checkpoint, counted memberships and matching seals. Regime names identify glycan-cold, protein-cold and doubly-cold splits. No dataset, HDF5 or fitted binding weights are downloaded automatically. + +The trainer's historical validation macro excludes constant-prediction assays, whereas the final reporting scorer uses data-only eligibility and assigns constant predictions zero. This difference is preserved and documented; the training selection code has not been silently changed. `score_predictions.py` is for final reporting on a complete supplied roster. + +## Portable fitted prediction + +`python -m bertosebind_inference.predict` loads a complete fitted state with strict key matching and recorded SHA-256 identity. Its feature reader preserves token channels, raw motif counts, protein-cache ID decoding, BOS/EOS removal, truncation and the original collate masks. The release data package includes all eight glycan feature files and the pinned protein HDF5. The six example pairs and all 18 CPU outputs were checked by job 16683971 from a fresh public-code extraction. See `bertosebind_inference/README.md` for commands and cached-population limits. + +## IAR saved readout + +```bash +python iar_completion/readout.py +python iar_completion/readout.py --features hidden.npy --output linkage_probabilities.json +``` + +The supplied readout predicts 211 ordered ordinary-linkage tokens from N × 768 hidden features. It preserves the saved mean, scale, weight matrix and bias. The feature array must come from the input of `sequence_head` in the exact full selected model, under the neutralized linkage input specified in `iar_completion/model_metadata.json`. Sequence-export embeddings are not interchangeable with these features. + +The unchanged executed final IAR source is retained for provenance. Its full workflow needs the full multimodal checkpoint, fixed evaluation cases, source arrays and schema/Java environment. It also contains a readout-fitting step and absolute execution paths. It is not a portable prediction command. The artifact check validates the supplied readout only; no calibration, full glycan completion or historical metric replay is implied. + +## Portable full-checkpoint IAR examples + +`python iar_inference/infer.py --checkpoint FULL_CHECKPOINT --output-dir NEW_DIRECTORY` runs the two included recorded single-linkage inputs through the full saved model and existing readout. The composite constructor rechecks its twelve pinned component authorities; the wrapper avoids the training-launch bootstrap. Eight inference helpers retain their original function ASTs. No readout is fitted. + +Job 16683971 loaded the 505-entry state strictly from a fresh extraction, matched both first-round hidden vectors bitwise, and matched the ordered predictions, rounds, acceptance and abstention. The public interface supports these recorded cases with physical modalities absent. It does not establish generic input conversion, every completion branch, active physical-modality inference, benchmark replay or CUDA equivalence. + +## Structure and MD processing + +`structure_md_processing/` contains 32 unchanged source/configuration/evidence payloads with paths, hashes and inclusion reasons. It includes simulation and descriptor extraction sources, the corrected temporal overlay, parent aggregation, final 20-by-6 reduction and audit sources. Contextual historical launchers are labelled in its manifest. Original software/force-field resources remain external dependencies; preserved source bytes do not certify their historical environments or an end-to-end simulation replay. + +## Existing package checks + +All 470 files from the submission code package are preserved. The original top-level README, requirements, inventory and checksums are archived as `provenance/submission_*`; the release-facing versions describe this candidate. `code_inventory.tsv` and `provenance/release_manifest.json` describe the current candidate. The archived `provenance/submission_code_inventory.tsv` retains the earlier source lineage. + +The IAR `check_package.py` passes file/import checks, but does not verify an external evaluation-input hash or load the encoder. The complete existing source snapshot and checks are included. Figure reconstruction requires the consolidated package’s adjacent source-data folders, except where individual figure builders document self-contained inputs. + +```bash +python iar_completion/check_package.py +python bertosebind_new_runs/check_package.py +python bertosebind_new_runs/reproduce_summary.py +``` + +`benchmark_exclusion/` preserves the five exclusion scripts and required helpers; its README specifies the corpus and benchmark input contracts. `bertosebind_new_runs/` retains the executed comparison/scoring scripts, frozen small score tables and bootstrap/exposure provenance. Its summary command reproduces saved scalar summaries, not model fitting or raw prediction generation. `figures/` retains the existing figure and table reconstruction scripts and their input instructions. Historical raw keys and filenames are unchanged. diff --git a/releases/2026-10-02/download_assets.py b/releases/2026-10-02/download_assets.py new file mode 100644 index 0000000000000000000000000000000000000000..d6e1e14ced00d55845daaf7bd4965d39fe9a943e --- /dev/null +++ b/releases/2026-10-02/download_assets.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +"""Download only the released assets needed for one BERTose workflow.""" +import argparse +import hashlib +import json +from pathlib import Path + +ROOT = Path(__file__).resolve().parent + + +def select_assets(task, variant="3", cell_id="mo_A_glycan_s42"): + files = json.loads((ROOT / "provenance/workbench_assets.json").read_text())["files"] + if task == "embed": + selected = [x for x in files if x.get("variant") == str(variant)] + elif task == "binding": + selected = [x for x in files if x.get("cell_id") == cell_id or x["repo"] == "glycorpus"] + if not any(x.get("cell_id") == cell_id for x in selected): + raise ValueError("Unknown fitted model ID; see bertosebind_inference/config.json") + elif task == "iar": + selected = [x for x in files if x["role"] == "full_primary_checkpoint"] + else: + raise ValueError("task must be embed, binding or iar") + if not selected: + raise ValueError("No assets found for the selected workflow") + return selected + + +def verify(path, asset): + path = Path(path) + if path.stat().st_size != asset["bytes"]: + raise ValueError("Downloaded size differs: " + asset["path_in_repo"]) + with path.open("rb") as handle: + digest = hashlib.file_digest(handle, "sha256").hexdigest() + if digest != asset["sha256"]: + raise ValueError("Downloaded SHA-256 differs: " + asset["path_in_repo"]) + return path.resolve() + + +def download(task, output_dir="assets", variant="3", cell_id="mo_A_glycan_s42", + revision="main", local_files_only=False): + """Return verified local paths. No downloads occur until this is called. + + Binding needs a fitted checkpoint and the complete released protein cache. + IAR downloads its full checkpoint; the fitted readout is in the code package. + """ + from huggingface_hub import hf_hub_download + output_dir = Path(output_dir).resolve() + paths = {} + verified_files = [] + for asset in select_assets(task, variant, cell_id): + path = hf_hub_download(repo_id=asset["repo_id"], repo_type=asset["repo_type"], + filename=asset["path_in_repo"], revision=revision, + local_dir=output_dir / asset["repo"], + local_files_only=local_files_only) + path = verify(path, asset) + verified_files.append({**asset, "local_path": str(path)}) + if asset["role"] in {"sequence_export", "bertosebind_checkpoint", "full_primary_checkpoint"}: + paths["checkpoint"] = str(path) + elif "/features/" in asset["path_in_repo"]: + paths["features_dir"] = str(path.parent) + elif "/protein_features/" in asset["path_in_repo"]: + paths["protein_h5"] = str(path) + result = {"task": task, "variant": str(variant) if task == "embed" else None, + "cell_id": cell_id if task == "binding" else None, + "requested_revision": revision, **paths, "files": verified_files} + output_dir.mkdir(parents=True, exist_ok=True) + (output_dir / f"paths_{task}.json").write_text(json.dumps(result, indent=2) + "\n") + return result + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--task", choices=("embed", "binding", "iar"), required=True) + parser.add_argument("--variant", choices=tuple(str(i) for i in range(1, 6)), default="3") + parser.add_argument("--cell-id", default="mo_A_glycan_s42") + parser.add_argument("--output-dir", type=Path, default=Path("assets")) + parser.add_argument("--revision", default="main", help="Hub branch, tag or immutable commit") + parser.add_argument("--local-files-only", action="store_true") + parser.add_argument("--dry-run", action="store_true", help="List the files and bytes; no network or downloads") + args = parser.parse_args() + if args.dry_run: + files = select_assets(args.task, args.variant, args.cell_id) + result = {"task": args.task, "files": files, + "download_bytes": sum(x["bytes"] for x in files), "network_calls": 0} + else: + result = download(args.task, args.output_dir, args.variant, args.cell_id, + args.revision, args.local_files_only) + print(json.dumps(result, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/embed.py b/releases/2026-10-02/embed.py new file mode 100644 index 0000000000000000000000000000000000000000..8239a2ee0d712e7a2d55c5bb8f73159070939346 --- /dev/null +++ b/releases/2026-10-02/embed.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +"""Embed a CSV with sample_id,wurcs columns using a pinned BERTose sequence export.""" +import argparse +import csv +import json +from pathlib import Path +import numpy as np +import torch +from bertose import embed, load_encoder, load_tokenizer + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--checkpoint", type=Path, required=True) + parser.add_argument("--variant", choices=[str(i) for i in range(1, 6)] + [f"WA{i}" for i in range(1, 6)], default="3") + parser.add_argument("--input", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True, help="New .npz file; metadata is written alongside it") + parser.add_argument("--pooling", choices=["first", "mean"], default="first") + parser.add_argument("--batch-size", type=int, default=2) + parser.add_argument("--device", default="cpu") + parser.add_argument("--threads", type=int, default=2) + args = parser.parse_args() + if args.batch_size < 1 or args.threads < 1: + parser.error("batch-size and threads must be positive") + meta_path = args.output.with_suffix(".json") + if args.output.suffix != ".npz" or args.output.exists() or meta_path.exists(): + parser.error("output must be a new .npz path with no existing sibling .json") + with args.input.open(newline="") as handle: + reader = csv.DictReader(handle) + if not {"sample_id", "wurcs"}.issubset(reader.fieldnames or []): + parser.error("input requires sample_id,wurcs columns") + rows = list(reader) + if not rows or len({r["sample_id"] for r in rows}) != len(rows) or any(not r["sample_id"] for r in rows): + parser.error("input requires nonempty, unique sample_id values") + torch.set_num_threads(args.threads) + encoder, metadata = load_encoder(args.checkpoint, args.variant, args.device) + tokenizer = load_tokenizer() + vectors, diagnostics = [], [] + for start in range(0, len(rows), args.batch_size): + batch = rows[start:start + args.batch_size] + v, d = embed([r["wurcs"] for r in batch], encoder, tokenizer, args.pooling) + vectors.append(v) + diagnostics.extend(dict(sample_id=r["sample_id"], **item) for r, item in zip(batch, d)) + matrix = np.concatenate(vectors) + with args.output.open("xb") as handle: + np.savez_compressed(handle, sample_id=np.asarray([r["sample_id"] for r in rows]), embeddings=matrix) + metadata.update(pooling=args.pooling, shape=list(matrix.shape), device=args.device, + input=str(args.input), diagnostics=diagnostics) + with meta_path.open("x") as handle: + json.dump(metadata, handle, indent=2) + handle.write("\n") + print(json.dumps({"output":str(args.output), "metadata":str(meta_path), "shape":list(matrix.shape)})) + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/examples/glycans.csv b/releases/2026-10-02/examples/glycans.csv new file mode 100644 index 0000000000000000000000000000000000000000..0a0ab236c6f3b7cb0626d718089fdb6beae5ac0e --- /dev/null +++ b/releases/2026-10-02/examples/glycans.csv @@ -0,0 +1,3 @@ +sample_id,wurcs +example_monosaccharide,"WURCS=2.0/1,1,0/[a2122h-1a_1-5]/1/" +example_disaccharide,"WURCS=2.0/1,2,1/[a2122h-1a_1-5]/1-1/a4-b1" diff --git a/releases/2026-10-02/examples/predictions.csv b/releases/2026-10-02/examples/predictions.csv new file mode 100644 index 0000000000000000000000000000000000000000..772b0f31c91e8ff90e9da959d2523ff00b05792b --- /dev/null +++ b/releases/2026-10-02/examples/predictions.csv @@ -0,0 +1,11 @@ +assay,target,prediction +example_assay_a,0,0 +example_assay_a,1,1 +example_assay_a,2,2 +example_assay_a,3,3 +example_assay_a,4,4 +example_assay_b,0,2 +example_assay_b,1,2 +example_assay_b,2,2 +example_assay_b,3,2 +example_assay_b,4,2 diff --git a/releases/2026-10-02/examples/smoke_affinose.py b/releases/2026-10-02/examples/smoke_affinose.py new file mode 100644 index 0000000000000000000000000000000000000000..eae66ee236c0619717d043e63c746f4814314886 --- /dev/null +++ b/releases/2026-10-02/examples/smoke_affinose.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +"""Verify constructor preservation and motif wiring on small CPU tensors.""" +from pathlib import Path +import contextlib +import io +import importlib.util +import json +import sys +import torch +ROOT=Path(__file__).resolve().parents[1] +sys.path.insert(0,str(ROOT/'affinose')) +sys.path.insert(0,str(ROOT/'bertose_source/bert_training_v4')) +from model.multimodal_glycan_bert_v3 import MultimodalGlycanBERTConfig, ConvGlycanBERTEmbeddings +from model.glycan_bert import GlycanBERTLayer +from bertint_v8 import BertintV8 +from a1111_encoder_adapter import remap_key +p=ROOT/'bertose_source/writing/review/multimodal/runtime/a5_pretraining_failclosed_integration_20260721_r4/review_a5_native_eight_composite_r4.py' +spec=importlib.util.spec_from_file_location('aff_native',p);native=importlib.util.module_from_spec(spec);sys.modules[spec.name]=native;spec.loader.exec_module(native) + +def build(motif_dim): + torch.manual_seed(42) + cfg=native.NativeEightConfig(cell_id='A111',seq_vocab_size=2114,seq_hidden_size=24, + seq_num_layers=12,seq_num_heads=4,ms_hidden_size=24,ms_num_layers=1,ms_num_heads=4, + static_hidden_size=24,static_num_layers=1,static_num_heads=4,cross_attention_heads=4, + fusion_hidden_size=24,topology_projection_size=8,isolated_test_fixture=True, + hidden_dropout_prob=0.0,attention_dropout_prob=0.0) + nemb=native.ExactSequenceEmbeddings(cfg) + nlay=torch.nn.ModuleList([native.EncoderLayer(24,4,0.0,0.0,1e-12) for _ in range(12)]) + source={**{'sequence_embeddings.'+k:v for k,v in nemb.state_dict().items()}, + **{'sequence_layers.'+k:v for k,v in nlay.state_dict().items()}} + remapped={remap_key(k):v for k,v in source.items()};assert len(remapped)==209 + c=MultimodalGlycanBERTConfig(seq_vocab_size=2114,seq_hidden_size=24,seq_num_layers=12, + seq_num_heads=4,seq_max_length=256,hidden_dropout_prob=0.0,attention_probs_dropout_prob=0.0).to_seq_config() + c.max_branch_depth=203;c.num_linkage_types=10 + emb=ConvGlycanBERTEmbeddings(c);layers=torch.nn.ModuleList([GlycanBERTLayer(c) for _ in range(12)]) + emb.load_state_dict({k[len('seq_embeddings.'):]:v for k,v in remapped.items() if k.startswith('seq_embeddings.')},strict=True) + layers.load_state_dict({k[len('seq_layers.'):]:v for k,v in remapped.items() if k.startswith('seq_layers.')},strict=True) + emb.requires_grad_(False) + for layer in layers[:4]:layer.requires_grad_(False) + before={**{'seq_embeddings.'+k:v.clone() for k,v in emb.state_dict().items()}, + **{'seq_layers.'+k:v.clone() for k,v in layers.state_dict().items()}} + torch.manual_seed(7) + with contextlib.redirect_stdout(io.StringIO()): + model=BertintV8(emb,layers,glycan_dim=24,protein_dim=16,shared_dim=24, + num_cross_layers=2,num_heads=4,ffn_dim=48,head_hidden=16,dropout=0.0, + pooling_mode='mean',interaction_mode='concat',motif_additive_dim=motif_dim) + after=model.state_dict();assert all(torch.equal(v,after[k]) for k,v in before.items()) + assert all(not p.requires_grad for p in model.seq_embeddings.parameters()) + assert all(not p.requires_grad for layer in model.seq_layers[:4] for p in layer.parameters()) + assert torch.equal(after['seq_embeddings.position_embeddings.weight'],nemb.state_dict()['position_embeddings.weight']) + return model.eval(),nemb,nlay + +def main(): + torch.set_num_threads(1) + ref,nemb,nlay=build(0);arm,_,_=build(165) + assert all(torch.equal(v,arm.state_dict()[k]) for k,v in ref.state_dict().items()) + tok=torch.tensor([[2,10,11,3],[2,10,3,0]]);mask=tok.ne(0) + kw=dict(token_ids=tok,attention_mask=mask.long(),branch_depths=torch.zeros_like(tok), + linkage_types=torch.zeros_like(tok),protein_emb=torch.randn(2,5,16), + protein_mask=torch.ones(2,5,dtype=torch.bool)) + n=nemb(tok,kw['branch_depths'],kw['linkage_types']);a=arm.seq_embeddings(tok,kw['branch_depths'],kw['linkage_types']) + for nl,al in zip(nlay,arm.seq_layers):n=nl(n,mask);a=al(a,mask.long()) + native_delta=float(torch.max(torch.abs(n-a)).detach()) + assert torch.allclose(n,a,rtol=1e-5,atol=1e-5),native_delta + motifs=torch.ones(2,165) + with torch.no_grad(): + base=ref(**kw);aug=arm(motif_features=motifs,**kw) + assert torch.equal(base,aug) + try:arm(**kw) + except ValueError:pass + else:raise AssertionError('missing motifs did not raise') + arm(motif_features=motifs,**kw).sum().backward() + assert arm.motif_head.weight.grad.abs().max()>0 + with torch.device('meta'): + c=MultimodalGlycanBERTConfig(seq_vocab_size=2114,seq_max_length=256).to_seq_config() + c.max_branch_depth=203;c.num_linkage_types=10 + full_emb=ConvGlycanBERTEmbeddings(c) + full_layers=torch.nn.ModuleList([GlycanBERTLayer(c) for _ in range(12)]) + full_emb.requires_grad_(False) + for layer in full_layers[:4]:layer.requires_grad_(False) + with contextlib.redirect_stdout(io.StringIO()): + full=BertintV8(full_emb,full_layers,pooling_mode='mean',interaction_mode='concat',motif_additive_dim=165) + full_count=sum(p.numel() for p in full.parameters()) + full_trainable=sum(p.numel() for p in full.parameters() if p.requires_grad) + assert (full_count,full_trainable,len(full.state_dict()))==(100209318,66330534,272) + print(json.dumps({'scope':'reduced-width synthetic CPU tensors and full-dimension meta counts; no trained checkpoint loaded', + 'full_parameters':full_count,'full_trainable_parameters':full_trainable,'full_state_entries':len(full.state_dict()), + 'encoder_state_entries_preserved':209,'positional_embeddings_preserved':True, + 'native_to_affinose_forward_max_abs_delta':native_delta,'native_forward_atol_rtol':1e-5,'zero_motif_initial_output_bit_equal':True, + 'missing_motifs_raise':True,'motif_gradient_nonzero':True, + 'frozen_embeddings_and_first_four_layers_preserved':True},indent=2)) +if __name__=='__main__':main() diff --git a/releases/2026-10-02/examples/smoke_models.py b/releases/2026-10-02/examples/smoke_models.py new file mode 100644 index 0000000000000000000000000000000000000000..cccacee635d1d6e6e2f62ab5551ab7266779501c --- /dev/null +++ b/releases/2026-10-02/examples/smoke_models.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +"""Small CPU checks of packaged source; not checkpoint or training certification.""" +from pathlib import Path +import importlib.util +import json +import sys +from types import SimpleNamespace +import torch + +ROOT = Path(__file__).resolve().parents[1] +RUNTIME = ROOT / 'bertose_source/writing/review/multimodal/runtime' + +def load(name, path): + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + spec.loader.exec_module(module) + return module + +def main(): + torch.set_num_threads(1) + torch.manual_seed(42) + r5 = load('submission_r5', RUNTIME / 'a5_pretraining_failclosed_integration_20260721_r5/review_a5_native_eight_composite_r5.py') + md = load('submission_md', RUNTIME / 'md_temporal_20x6_end_to_end_20260802_r3_native_intersection/review_md_temporal_20x6_core_r3.py') + bound = dict(r5.verify_component_authorities()) + cls = md.make_md_enabled_composite_class(SimpleNamespace(_composite=r5, NativeEightCompositeR5=r5.NativeEightCompositeR5)) + # Meta tensors measure architecture without allocating production model weights. + with torch.device('meta'): + model = cls(r5.NativeEightConfig(cell_id='A111', seq_vocab_size=2114), md_cell_id='A1111') + counts = md.parameter_summary(model) + assert counts['total_parameters'] == 138487995, counts + assert sum(x.numel() for x in model.state_dict().values()) == 138488535 + cfg = r5.NativeEightConfig(cell_id='A111', seq_vocab_size=2114, + seq_hidden_size=24, seq_num_layers=2, seq_num_heads=4, + ms_hidden_size=24, ms_num_layers=1, ms_num_heads=4, + static_hidden_size=24, static_num_layers=1, static_num_heads=4, + cross_attention_heads=4, fusion_hidden_size=24, topology_projection_size=8, + isolated_test_fixture=True, hidden_dropout_prob=0.0, attention_dropout_prob=0.0) + small = cls(cfg, md_cell_id='A1111', md_temporal_size=8).eval() + tok=torch.tensor([[2,10,11,3]]); branch=torch.zeros_like(tok); link=torch.zeros_like(tok) + emb=small.sequence_embeddings(tok,branch,link) + hidden=r5._run_layers(emb,torch.ones_like(tok,dtype=torch.bool),small.sequence_layers) + assert hidden.shape==(1,4,24) and torch.isfinite(hidden).all() + values=torch.randn(1,2,20,6); feature=torch.ones_like(values,dtype=torch.bool) + present=torch.ones(1,2,dtype=torch.bool); windows=torch.zeros(1,2,20,dtype=torch.bool) + windows[:,:,:3]=True; labels=values.clone(); values[windows]=0 + pool,loss,indices=small.md_encoder(values=values,feature_mask=feature, + child_present_mask=present,window_input_mask=windows,labels=labels, + parent_available=torch.ones(1,dtype=torch.bool)) + assert pool.shape==(1,24) and loss.shape==(1,) and indices.tolist()==[0] + assert torch.isfinite(pool).all() and torch.isfinite(loss).all() + result={'scope':'source and synthetic CPU tensors only','torch':torch.__version__, + 'component_bindings_verified':len(bound),'wa3_parameter_counts':counts, + 'wa3_state_elements':138488535,'sequence_encoder_forward':'PASS', + 'md_three_masked_windows_per_child_forward':'PASS'} + print(json.dumps(result,indent=2)) +if __name__=='__main__': main() diff --git a/releases/2026-10-02/executed/downstream/review_a5_native_checkpoint.py b/releases/2026-10-02/executed/downstream/review_a5_native_checkpoint.py new file mode 100644 index 0000000000000000000000000000000000000000..88b5b78d80cdaa3bf57f1005cdf4c040819b1d0a --- /dev/null +++ b/releases/2026-10-02/executed/downstream/review_a5_native_checkpoint.py @@ -0,0 +1,448 @@ +"""Exact native-eight checkpoint-to-sequence-encoder loader. + +This module deliberately constructs the pinned R8/R5 model on the ``meta`` +device. The complete 484-entry checkpoint schema is checked against that +exact model without allocating the unused topology, MS, static, fusion, or MLM +weights. Only the 209 sequence encoder tensors/buffers are then materialized. +""" + +from __future__ import annotations + +import contextlib +import gc +import hashlib +import json +import os +from collections import OrderedDict +from dataclasses import dataclass +from pathlib import Path +import stat +import sys +from types import ModuleType +from typing import BinaryIO, Iterator, Mapping + +import torch +import torch.nn as nn + + +R8_EXECUTOR_SHA256 = "60ab4de6bc1ee151e9da2c312c41079638e11469502e8136ede51be032eac630" +R5_COMPOSITE_SHA256 = "24c35257fc61e1c9c77630d2b0075775a7f46b6500ecb5f175ef8f42bd214e0e" +CHECKPOINT_SCHEMA = "bertose_review_a5_native_eight_completed_epoch_checkpoint_20260722_r3" +ENCODER_SCHEMA_SHA256 = "21ec95377ac8e66c5e832bfe8f3357123951b7ea235b2d78989fe9fbaa42e129" +ENCODER_SCHEMA_ENCODED_BYTES = 13_786 +FULL_STATE_ENTRY_COUNT = 484 +ENCODER_STATE_ENTRY_COUNT = 209 +SEQUENCE_PREFIXES = ("sequence_embeddings.", "sequence_layers.") +CELL_IDS = ("A000", "A100", "A010", "A001", "A110", "A101", "A011", "A111") +SEQ_VOCAB_SIZE = 2_114 +SEQ_HIDDEN_SIZE = 768 +SEQ_LAYER_COUNT = 12 +SEQ_MAX_LENGTH = 256 + + +class NativeCheckpointError(RuntimeError): + """Raised before any altered or schema-incompatible checkpoint is used.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise NativeCheckpointError(message) + + +def _valid_sha256(value: object) -> bool: + return ( + type(value) is str + and len(value) == 64 + and all(character in "0123456789abcdef" for character in value) + ) + + +@contextlib.contextmanager +def open_regular_nofollow(path: Path, *, label: str) -> Iterator[tuple[BinaryIO, os.stat_result]]: + """Open a regular file through an entirely no-follow absolute path chain.""" + + absolute = Path(path) + _require(absolute.is_absolute(), f"{label} path must be absolute") + _require(hasattr(os, "O_NOFOLLOW") and hasattr(os, "O_DIRECTORY"), "no-follow traversal unavailable") + parts = absolute.parts + _require( + bool(parts) + and parts[0] == os.sep + and all(part not in {"", ".", ".."} for part in parts[1:]), + f"{label} path is not canonical absolute syntax", + ) + close_on_exec = getattr(os, "O_CLOEXEC", 0) + directory_flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | close_on_exec + leaf_flags = os.O_RDONLY | os.O_NOFOLLOW | close_on_exec + directory_fd: int | None = None + leaf_fd: int | None = None + handle: BinaryIO | None = None + try: + directory_fd = os.open(os.sep, directory_flags) + for component in parts[1:-1]: + next_fd = os.open(component, directory_flags, dir_fd=directory_fd) + os.close(directory_fd) + directory_fd = next_fd + leaf_fd = os.open(parts[-1], leaf_flags, dir_fd=directory_fd) + os.close(directory_fd) + directory_fd = None + metadata = os.fstat(leaf_fd) + _require(stat.S_ISREG(metadata.st_mode), f"{label} is not a regular file") + handle = os.fdopen(leaf_fd, "rb", closefd=True) + leaf_fd = None + yield handle, metadata + except OSError as error: + raise NativeCheckpointError(f"{label} no-follow open failed: {error}") from error + finally: + if handle is not None: + handle.close() + if leaf_fd is not None: + os.close(leaf_fd) + if directory_fd is not None: + os.close(directory_fd) + + +def _hash_open_file(handle: BinaryIO) -> tuple[str, int]: + digest = hashlib.sha256() + total = 0 + handle.seek(0) + for chunk in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(chunk) + total += len(chunk) + handle.seek(0) + return digest.hexdigest(), total + + +def verify_bound_file( + path: Path, + *, + expected_sha256: str, + expected_bytes: int | None = None, + label: str, +) -> Path: + _require(_valid_sha256(expected_sha256), f"{label} SHA-256 is malformed") + _require(expected_bytes is None or type(expected_bytes) is int and expected_bytes > 0, f"{label} byte count is invalid") + with open_regular_nofollow(path, label=label) as (handle, before): + observed_sha256, observed_bytes = _hash_open_file(handle) + after = os.fstat(handle.fileno()) + _require( + (before.st_dev, before.st_ino, before.st_size, before.st_mtime_ns) + == (after.st_dev, after.st_ino, after.st_size, after.st_mtime_ns), + f"{label} changed while being hashed", + ) + _require(observed_sha256 == expected_sha256, f"{label} SHA-256 changed") + _require(observed_bytes == before.st_size, f"{label} truncated while being hashed") + if expected_bytes is not None: + _require(observed_bytes == expected_bytes, f"{label} byte count changed") + return Path(path) + + +def read_bound_file_bytes( + path: Path, + *, + expected_sha256: str, + expected_bytes: int | None = None, + label: str, +) -> bytes: + """Return only bytes hashed and read through the same no-follow handle.""" + + _require(_valid_sha256(expected_sha256), f"{label} SHA-256 is malformed") + _require( + expected_bytes is None or type(expected_bytes) is int and expected_bytes > 0, + f"{label} byte count is invalid", + ) + with open_regular_nofollow(path, label=label) as (handle, before): + payload = handle.read() + after = os.fstat(handle.fileno()) + _require( + (before.st_dev, before.st_ino, before.st_size, before.st_mtime_ns) + == (after.st_dev, after.st_ino, after.st_size, after.st_mtime_ns), + f"{label} changed while being read", + ) + _require(len(payload) == before.st_size, f"{label} truncated while being read") + _require(hashlib.sha256(payload).hexdigest() == expected_sha256, f"{label} SHA-256 changed") + if expected_bytes is not None: + _require(len(payload) == expected_bytes, f"{label} byte count changed") + return payload + + +def ordered_encoder_inventory(model_state: Mapping[str, torch.Tensor]) -> list[list[object]]: + """Return the executed checkpoint's canonical ordered encoder schema. + + Insertion order is scientific identity. Sorting changes the digest and is + therefore intentionally prohibited. + """ + + _require(isinstance(model_state, Mapping), "model_state is not a mapping") + inventory: list[list[object]] = [] + for key, tensor in model_state.items(): + _require(type(key) is str and bool(key), "model_state contains an invalid key") + _require(torch.is_tensor(tensor), f"model_state entry is not a tensor: {key}") + if key.startswith(SEQUENCE_PREFIXES): + inventory.append([key, list(tensor.shape), str(tensor.dtype)]) + return inventory + + +def encoder_schema_payload(model_state: Mapping[str, torch.Tensor]) -> bytes: + inventory = ordered_encoder_inventory(model_state) + return json.dumps(inventory, sort_keys=True, separators=(",", ":")).encode("utf-8") + + +def validate_encoder_schema_fingerprint(model_state: Mapping[str, torch.Tensor]) -> str: + inventory = ordered_encoder_inventory(model_state) + _require(len(inventory) == ENCODER_STATE_ENTRY_COUNT, "sequence encoder state must contain exactly 209 entries") + _require( + inventory[0] == ["sequence_embeddings.position_ids", [1, 256], "torch.int64"], + "sequence encoder inventory first entry changed", + ) + _require( + inventory[-1] == ["sequence_layers.11.output_norm.bias", [768], "torch.float32"], + "sequence encoder inventory last entry changed", + ) + encoded = json.dumps(inventory, sort_keys=True, separators=(",", ":")).encode("utf-8") + _require(len(encoded) == ENCODER_SCHEMA_ENCODED_BYTES, "sequence encoder schema byte count changed") + digest = hashlib.sha256(encoded).hexdigest() + _require(digest == ENCODER_SCHEMA_SHA256, "sequence encoder ordered schema SHA-256 changed") + return digest + + +def _load_executor_module(source_path: Path, *, expected_sha256: str) -> ModuleType: + source_payload = read_bound_file_bytes( + source_path, + expected_sha256=expected_sha256, + label="native-eight R8 executor source", + ) + writing_root = source_path.parents[4] + project_root = writing_root.parent + r5_source = ( + source_path.parent.parent + / "a5_pretraining_failclosed_integration_20260721_r5" + / "review_a5_native_eight_composite_r5.py" + ) + r5_payload = read_bound_file_bytes( + r5_source, + expected_sha256=R5_COMPOSITE_SHA256, + label="native-eight R5 composite source", + ) + module_name = f"_review_a5_native_executor_r8_{expected_sha256[:20]}" + existing = sys.modules.get(module_name) + if existing is not None: + return existing + module = ModuleType(module_name) + module.__file__ = os.fspath(source_path) + module.__package__ = "" + module.__review_verified_source_contract__ = { + "executor": { + "path": os.fspath(source_path), + "bytes": len(source_payload), + "sha256": expected_sha256, + }, + "r5_composite": { + "path": os.fspath(r5_source), + "bytes": len(r5_payload), + "sha256": R5_COMPOSITE_SHA256, + }, + "parse_import_mode": "compile_exact_verified_nofollow_bytes_no_path_reopen", + } + sys.modules[module_name] = module + inserted: list[str] = [] + for root in (os.fspath(writing_root), os.fspath(project_root)): + if root not in sys.path: + sys.path.insert(0, root) + inserted.append(root) + try: + exec( + compile(source_payload, os.fspath(source_path), "exec", dont_inherit=True), + module.__dict__, + ) + except BaseException: + sys.modules.pop(module_name, None) + raise + finally: + for root in inserted: + try: + sys.path.remove(root) + except ValueError: + pass + _require(getattr(module, "NativeEightConfig", None) is not None, "R8 executor did not export NativeEightConfig") + _require(getattr(module, "NativeEightCompositeR5", None) is not None, "R8 executor did not export NativeEightCompositeR5") + return module + + +def _torch_load_bound_checkpoint(path: Path, *, sha256: str, expected_bytes: int | None) -> Mapping[str, object]: + _require(_valid_sha256(sha256), "checkpoint SHA-256 is malformed") + with open_regular_nofollow(path, label="native selected checkpoint") as (handle, before): + observed_sha256, observed_bytes = _hash_open_file(handle) + _require(observed_sha256 == sha256, "native selected checkpoint SHA-256 changed") + if expected_bytes is not None: + _require(observed_bytes == expected_bytes, "native selected checkpoint byte count changed") + try: + checkpoint = torch.load(handle, map_location="cpu", weights_only=True) + except TypeError as error: + raise NativeCheckpointError("PyTorch runtime lacks required weights_only checkpoint loading") from error + after = os.fstat(handle.fileno()) + _require( + (before.st_dev, before.st_ino, before.st_size, before.st_mtime_ns) + == (after.st_dev, after.st_ino, after.st_size, after.st_mtime_ns), + "native selected checkpoint changed while being loaded", + ) + _require(isinstance(checkpoint, Mapping), "checkpoint root is not a mapping") + return checkpoint + + +def validate_checkpoint_against_reference( + checkpoint: Mapping[str, object], + *, + cell_id: str, + reference_state: Mapping[str, torch.Tensor], +) -> OrderedDict[str, torch.Tensor]: + """Validate the complete state and return prefix-stripped encoder state.""" + + _require(checkpoint.get("schema") == CHECKPOINT_SCHEMA, "checkpoint schema changed") + _require(checkpoint.get("cell_id") == cell_id, "checkpoint cell identity changed") + _require("model_state" in checkpoint, "checkpoint model_state is missing") + model_state = checkpoint["model_state"] + _require(isinstance(model_state, Mapping), "checkpoint model_state is not a mapping") + _require(len(model_state) == FULL_STATE_ENTRY_COUNT, "checkpoint model_state must contain exactly 484 entries") + _require(len(reference_state) == FULL_STATE_ENTRY_COUNT, "exact R8/R5 reference state no longer has 484 entries") + _require(list(model_state) == list(reference_state), "checkpoint full state key order/schema changed") + for key, reference in reference_state.items(): + tensor = model_state[key] + _require(torch.is_tensor(tensor), f"checkpoint state entry is not a tensor: {key}") + _require(tuple(tensor.shape) == tuple(reference.shape), f"checkpoint tensor shape changed: {key}") + _require(tensor.dtype == reference.dtype, f"checkpoint tensor dtype changed: {key}") + _require(tensor.layout == torch.strided, f"checkpoint tensor layout changed: {key}") + validate_encoder_schema_fingerprint(model_state) + sequence_state: OrderedDict[str, torch.Tensor] = OrderedDict() + for key, tensor in model_state.items(): + if key.startswith("sequence_embeddings."): + sequence_state[key] = tensor + elif key.startswith("sequence_layers."): + sequence_state[key] = tensor + _require(len(sequence_state) == ENCODER_STATE_ENTRY_COUNT, "checkpoint encoder selection did not yield 209 entries") + return sequence_state + + +class ExactNativeSequenceEncoder(nn.Module): + """Only the exact R5 sequence embedding and twelve encoder layers.""" + + def __init__(self, sequence_embeddings: nn.Module, sequence_layers: nn.ModuleList) -> None: + super().__init__() + _require(type(sequence_layers) is nn.ModuleList, "sequence layers must be the exact ModuleList surface") + _require(len(sequence_layers) == SEQ_LAYER_COUNT, "sequence encoder must have twelve layers") + self.sequence_embeddings = sequence_embeddings + self.sequence_layers = sequence_layers + + def forward( + self, + token_ids: torch.Tensor, + attention_mask: torch.Tensor, + branch_depths: torch.Tensor, + linkage_types: torch.Tensor, + ) -> torch.Tensor: + _require(token_ids.ndim == 2, "token IDs must be [batch,length]") + _require(attention_mask.shape == token_ids.shape, "attention mask shape changed") + _require(branch_depths.shape == token_ids.shape, "branch-depth shape changed") + _require(linkage_types.shape == token_ids.shape, "linkage-type shape changed") + _require(token_ids.shape[1] <= SEQ_MAX_LENGTH, "sequence exceeds max length 256") + attention = attention_mask.bool() + _require(bool(attention[:, 0].all()), "every sequence must attend its first token") + hidden = self.sequence_embeddings(token_ids, branch_depths, linkage_types) + for layer in self.sequence_layers: + hidden = layer(hidden, attention) + return hidden + + +@dataclass(frozen=True) +class LoadedNativeEncoder: + encoder: ExactNativeSequenceEncoder + checkpoint_sha256: str + executor_sha256: str + encoder_schema_sha256: str + cell_id: str + + +def load_exact_native_encoder( + *, + checkpoint_path: Path, + checkpoint_sha256: str, + checkpoint_bytes: int | None, + cell_id: str, + r8_executor_path: Path, + r8_executor_sha256: str = R8_EXECUTOR_SHA256, + device: torch.device | str = "cpu", +) -> LoadedNativeEncoder: + """Load the exact sequence encoder while rejecting every schema drift.""" + + _require(cell_id in CELL_IDS, "unknown native-eight cell") + _require(r8_executor_sha256 == R8_EXECUTOR_SHA256, "R8 executor source identity changed") + executor = _load_executor_module(Path(r8_executor_path), expected_sha256=r8_executor_sha256) + config = executor.NativeEightConfig(cell_id=cell_id, seq_vocab_size=SEQ_VOCAB_SIZE) + with torch.device("meta"): + full_model = executor.NativeEightCompositeR5(config) + reference_state = full_model.state_dict() + checkpoint = _torch_load_bound_checkpoint( + Path(checkpoint_path), + sha256=checkpoint_sha256, + expected_bytes=checkpoint_bytes, + ) + sequence_state = validate_checkpoint_against_reference( + checkpoint, + cell_id=cell_id, + reference_state=reference_state, + ) + sequence_embeddings = full_model.sequence_embeddings + sequence_layers = full_model.sequence_layers + delattr(full_model, "sequence_embeddings") + delattr(full_model, "sequence_layers") + del reference_state, checkpoint, full_model + gc.collect() + encoder = ExactNativeSequenceEncoder(sequence_embeddings, sequence_layers) + target_device = torch.device(device) + encoder.to_empty(device=target_device) + incompatible = encoder.load_state_dict(sequence_state, strict=True, assign=False) + _require(not incompatible.missing_keys and not incompatible.unexpected_keys, "strict encoder load reported incompatible keys") + del sequence_state + gc.collect() + for name, tensor in encoder.state_dict().items(): + _require(tensor.device == target_device, f"encoder tensor landed on wrong device: {name}") + executor_contract = getattr(executor, "__review_verified_source_contract__", None) + _require(isinstance(executor_contract, Mapping), "native encoder executed-source contract is absent") + encoder.__review_execution_contract__ = { + "schema": "bertose_a5_native_encoder_execution_contract_v2", + "parse_import_mode": "compile_and_load_exact_verified_nofollow_bytes_no_path_reopen", + "sources": dict(executor_contract), + "checkpoint": { + "path": os.fspath(Path(checkpoint_path)), + "bytes": checkpoint_bytes, + "sha256": checkpoint_sha256, + "schema": CHECKPOINT_SCHEMA, + "cell_id": cell_id, + "encoder_schema_sha256": ENCODER_SCHEMA_SHA256, + }, + } + return LoadedNativeEncoder( + encoder=encoder, + checkpoint_sha256=checkpoint_sha256, + executor_sha256=r8_executor_sha256, + encoder_schema_sha256=ENCODER_SCHEMA_SHA256, + cell_id=cell_id, + ) + + +__all__ = [ + "CHECKPOINT_SCHEMA", + "ENCODER_SCHEMA_SHA256", + "ENCODER_STATE_ENTRY_COUNT", + "ExactNativeSequenceEncoder", + "FULL_STATE_ENTRY_COUNT", + "LoadedNativeEncoder", + "NativeCheckpointError", + "encoder_schema_payload", + "load_exact_native_encoder", + "ordered_encoder_inventory", + "read_bound_file_bytes", + "validate_checkpoint_against_reference", + "validate_encoder_schema_fingerprint", + "verify_bound_file", +] diff --git a/releases/2026-10-02/executed/downstream/run_review_native_md_on_terminal4_s42.py b/releases/2026-10-02/executed/downstream/run_review_native_md_on_terminal4_s42.py new file mode 100644 index 0000000000000000000000000000000000000000..be88eff7bb232cdfded32445c698c8791a1fd482 --- /dev/null +++ b/releases/2026-10-02/executed/downstream/run_review_native_md_on_terminal4_s42.py @@ -0,0 +1,784 @@ +#!/usr/bin/env python3 +"""Run the four terminal MD-on native cells on the frozen 11 development endpoints.""" + +from __future__ import annotations + +import argparse +from collections import OrderedDict +import gc +import hashlib +import importlib.util +import json +import math +import os +from pathlib import Path +import stat +import sys +import tempfile +from typing import Any, Mapping, Sequence + +import numpy as np +import torch + + +WRITING_ROOT = Path(__file__).resolve().parents[4] +PROJECT_ROOT = WRITING_ROOT.parent +RUNTIME_ROOT = WRITING_ROOT / "review/multimodal/runtime" +if os.fspath(RUNTIME_ROOT) not in sys.path: + sys.path.insert(0, os.fspath(RUNTIME_ROOT)) + +from a5_downstream_native_taxonomy_multilabel_s42_20260802_r3_cuda_device_retry import ( # noqa: E402 + review_a5_native_checkpoint as native_checkpoint, +) + + +SCHEMA = "bertose_review_a5_native_md_on_terminal4_assignment_20260808_r1" +EXPORT_SCHEMA = "bertose_review_a5_native_md_on_sequence_export_20260808_r1" +EXPORT_RECEIPT_SCHEMA = "bertose_review_a5_native_md_on_sequence_export_receipt_20260808_r1" +SCALAR_RESULT_SCHEMA = "bertose_review_a5_native_md_on_scalar_common_fixed_s42_result_20260808_r1" +SCALAR_STATE_SCHEMA = "bertose_review_a5_native_md_on_scalar_selected_state_20260808_r1" +SCALAR_HOLD_SCHEMA = "bertose_review_a5_native_md_on_scalar_hold_20260808_r1" +MD_CHECKPOINT_SCHEMA = "bertose_review_md_temporal_20x6_checkpoint_20260802_r3" +MD_INDEX_SCHEMA = "bertose_review_md_temporal_20x6_checkpoint_index_20260802_r3" +MD_FINAL_SCHEMA = "bertose_review_md_temporal_20x6_final_receipt_20260802_r3" +CELLS = ("A0001", "A0011", "A1011", "A0111") +BASE_CELL = {"A0001": "A000", "A0011": "A001", "A1011": "A101", "A0111": "A011"} +RANKS = ("domain", "kingdom", "phylum", "class", "order", "family", "genus", "species") +ENDPOINTS = (*RANKS, "immunogenicity", "linkage", "interaction") +FULL_STATE_ENTRY_COUNT = 505 +FULL_INVENTORY_BYTES = 31_608 +FULL_INVENTORY_SHA256 = "97c7a3e256cc64f5abeac77d684b666ddfbf892f2ece89062ed0345791c69c9e" +SEQUENCE_ENTRY_COUNT = 209 +SEQUENCE_INVENTORY_BYTES = 13_786 +SEQUENCE_INVENTORY_SHA256 = "21ec95377ac8e66c5e832bfe8f3357123951b7ea235b2d78989fe9fbaa42e129" +SEQUENCE_TENSOR_VALUE_DOMAIN = "bertose_review_a5_native_md_on_sequence_tensor_values_20260808_r1" +SEQUENCE_TENSOR_BYTES = 362_329_088 +SEQUENCE_PREFIXES = ("sequence_embeddings.", "sequence_layers.") +DOWNSTREAM_SEED = 42 + + +class MDOnDownstreamError(RuntimeError): + pass + + +def require(condition: bool, message: str) -> None: + if not condition: + raise MDOnDownstreamError(message) + + +def sha256_file(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for block in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + +def canonical_bytes(value: object) -> bytes: + return ( + json.dumps(value, sort_keys=True, separators=(",", ":"), ensure_ascii=True, allow_nan=False) + "\n" + ).encode("ascii") + + +def canonical_sha256(value: object, *, domain: str) -> str: + return hashlib.sha256(domain.encode("ascii") + b"\0" + canonical_bytes(value)).hexdigest() + + +def verify_binding(binding: Mapping[str, Any], label: str) -> Path: + require(set(binding) >= {"path", "bytes", "sha256"}, f"{label} binding fields changed") + path = Path(str(binding["path"])) + require(path.is_absolute() and path.is_file() and not path.is_symlink(), f"{label} is absent or unsafe") + metadata = path.stat() + require(stat.S_ISREG(metadata.st_mode), f"{label} is not regular") + require(metadata.st_size == int(binding["bytes"]), f"{label} byte count changed") + require(sha256_file(path) == binding["sha256"], f"{label} SHA-256 changed") + return path + + +def _canonical_inventory(model_state: Mapping[str, torch.Tensor]) -> tuple[list[list[Any]], bytes, str]: + inventory: list[list[Any]] = [] + for key, tensor in model_state.items(): + require(type(key) is str and torch.is_tensor(tensor), f"model state entry changed: {key!r}") + require(tensor.layout == torch.strided, f"model state tensor is not strided: {key}") + inventory.append([key, list(tensor.shape), str(tensor.dtype)]) + payload = json.dumps(inventory, sort_keys=True, separators=(",", ":")).encode("utf-8") + return inventory, payload, hashlib.sha256(payload).hexdigest() + + +def _sequence_state(model_state: Mapping[str, torch.Tensor]) -> OrderedDict[str, torch.Tensor]: + selected: OrderedDict[str, torch.Tensor] = OrderedDict() + for key, tensor in model_state.items(): + if key.startswith(SEQUENCE_PREFIXES): + selected[key] = tensor.detach().cpu().contiguous().clone() + inventory, payload, digest = _canonical_inventory(selected) + require(len(inventory) == SEQUENCE_ENTRY_COUNT, "sequence export must contain exactly 209 tensors") + require(len(payload) == SEQUENCE_INVENTORY_BYTES, "sequence inventory byte count changed") + require(digest == SEQUENCE_INVENTORY_SHA256, "sequence inventory SHA-256 changed") + for key, tensor in selected.items(): + if tensor.is_floating_point() or tensor.is_complex(): + require(bool(torch.isfinite(tensor).all()), f"sequence tensor is nonfinite: {key}") + return selected + + +def _sequence_tensor_values_sha256(sequence_state: Mapping[str, torch.Tensor]) -> tuple[int, str]: + digest = hashlib.sha256(SEQUENCE_TENSOR_VALUE_DOMAIN.encode("ascii") + b"\0") + total_bytes = 0 + for key, tensor in sequence_state.items(): + require(type(key) is str and torch.is_tensor(tensor), "sequence tensor-value input changed") + value = tensor.detach().cpu().contiguous() + header = json.dumps( + [key, list(value.shape), str(value.dtype), value.numel()], + sort_keys=True, + separators=(",", ":"), + ).encode("ascii") + raw = value.view(torch.uint8).numpy().tobytes(order="C") + digest.update(len(header).to_bytes(8, "big")) + digest.update(header) + digest.update(len(raw).to_bytes(8, "big")) + digest.update(raw) + total_bytes += len(raw) + require(total_bytes == SEQUENCE_TENSOR_BYTES, "sequence tensor-value byte count changed") + return total_bytes, digest.hexdigest() + + +def _read_json(binding: Mapping[str, Any], label: str) -> dict[str, Any]: + path = verify_binding(binding, label) + value = json.loads(path.read_text(encoding="ascii")) + require(type(value) is dict, f"{label} JSON root changed") + return value + + +def _validate_terminal_handoff(entry: Mapping[str, Any]) -> None: + cell = str(entry["cell"]) + require(cell in CELLS and entry["base_cell"] == BASE_CELL[cell], f"{cell} base-cell mapping changed") + require( + entry.get("sequence_tensor_bytes") == SEQUENCE_TENSOR_BYTES + and type(entry.get("sequence_tensor_values_sha256")) is str + and len(entry["sequence_tensor_values_sha256"]) == 64 + and set(entry["sequence_tensor_values_sha256"]) <= set("0123456789abcdef"), + f"{cell} sequence tensor-value authority changed", + ) + final = _read_json(entry["final_receipt"], f"{cell} final receipt") + unsigned_final = dict(final) + final_identity = unsigned_final.pop("receipt_sha256", None) + require(final.get("schema") == MD_FINAL_SCHEMA and final.get("status") == "PASS_TRAINING_COMPLETE", f"{cell} is not terminal PASS") + require(final_identity == canonical_sha256(unsigned_final, domain=MD_FINAL_SCHEMA), f"{cell} final receipt identity changed") + require(final.get("run_identity_sha256") == entry["run_identity_sha256"], f"{cell} run identity changed") + selection = final.get("selection", {}) + require(selection.get("best_epoch") == entry["selected_epoch"], f"{cell} selected epoch changed") + require(float(selection.get("best_loss")) == float(entry["selected_loss"]), f"{cell} selected loss changed") + terminal = final.get("terminal_attempt_identity", {}) + expected_terminal = entry["terminal_slurm"] + for field in ("slurm_array_job_id", "slurm_array_task_id", "slurm_job_id", "slurm_restart_count"): + require(str(terminal.get(field)) == str(expected_terminal[field]), f"{cell} terminal Slurm identity changed: {field}") + + index = _read_json(entry["checkpoint_index"], f"{cell} checkpoint index") + unsigned_index = dict(index) + index_identity = unsigned_index.pop("index_sha256", None) + require(index.get("schema") == MD_INDEX_SCHEMA, f"{cell} checkpoint index schema changed") + require(index_identity == canonical_sha256(unsigned_index, domain=MD_INDEX_SCHEMA), f"{cell} checkpoint index identity changed") + require(index.get("cell_id") == cell and index.get("run_identity_sha256") == entry["run_identity_sha256"], f"{cell} checkpoint index lineage changed") + best = index.get("roles", {}).get("best", {}) + source = entry["selected_checkpoint"] + require( + best.get("filename") == Path(str(source["path"])).name + and best.get("sha256") == source["sha256"] + and best.get("epoch") == entry["selected_epoch"] + and float(best.get("development_loss")) == float(entry["selected_loss"]), + f"{cell} selected checkpoint differs from index", + ) + + +def validate_manifest(path: Path, expected_sha256: str, *, live: bool) -> dict[str, Any]: + require(path.is_absolute() and path.is_file() and not path.is_symlink(), "assignment manifest is absent or unsafe") + payload = path.read_bytes() + require(hashlib.sha256(payload).hexdigest() == expected_sha256, "assignment manifest SHA-256 changed") + value = json.loads(payload) + identity = value.get("manifest_identity_sha256") + unsigned = dict(value) + unsigned.pop("manifest_identity_sha256", None) + require(value.get("schema") == SCHEMA and identity == canonical_sha256(unsigned, domain=SCHEMA), "assignment identity changed") + require(tuple(value.get("cells", ())) == CELLS, "terminal-cell order changed") + require(tuple(value.get("endpoints", ())) == ENDPOINTS, "endpoint order changed") + require( + value.get("downstream_seed") == DOWNSTREAM_SEED + and value.get("upstream_seed") == 43 + and value.get("fit_count") == 44, + "44-fit scope changed", + ) + require(value.get("physical_cell_task_count") == 4, "physical task topology changed") + boundary = value.get("capability_boundary", {}) + require(boundary.get("heldout_capability_present") is False and boundary.get("heldout_opened_or_used") is False, "heldout capability opened") + require(boundary.get("hpo") is False, "HPO opened") + handoffs = value.get("terminal_handoffs") + require(type(handoffs) is list and [row.get("cell") for row in handoffs] == list(CELLS), "terminal handoff order changed") + if live: + for name, binding in value["runtime_sources"].items(): + verify_binding(binding, f"runtime source {name}") + for name in ("r8_executor", "tokenizer_runtime", "vocabulary"): + verify_binding(value["inputs"][name], f"native input {name}") + verify_binding(value["rank_weight_authority"], "taxonomy rank-weight authority") + verify_binding(value["protein_embeddings"], "interaction protein embeddings") + for row in handoffs: + _validate_terminal_handoff(row) + return value + + +def _safe_load_md_checkpoint(path: Path, binding: Mapping[str, Any]) -> Mapping[str, Any]: + require(path.is_absolute(), "selected MD checkpoint path must be absolute") + unsafe_expected = {"numpy._core.multiarray._reconstruct", "numpy.dtype", "numpy.ndarray"} + with native_checkpoint.open_regular_nofollow(path, label="selected MD checkpoint") as (handle, before): + observed_sha, observed_bytes = native_checkpoint._hash_open_file(handle) + require(observed_sha == binding["sha256"] and observed_bytes == binding["bytes"], "selected MD checkpoint binding changed") + unsafe = set(torch.serialization.get_unsafe_globals_in_checkpoint(handle)) + require(unsafe == unsafe_expected, "selected MD checkpoint unsafe-global surface changed") + handle.seek(0) + dtype_types = {type(np.dtype(np.float32)), type(np.dtype(np.uint32))} + safe = [np._core.multiarray._reconstruct, np.ndarray, np.dtype, *sorted(dtype_types, key=str)] + with torch.serialization.safe_globals(safe): + checkpoint = torch.load(handle, map_location="cpu", weights_only=True) + after = os.fstat(handle.fileno()) + require( + (before.st_dev, before.st_ino, before.st_size, before.st_mtime_ns) + == (after.st_dev, after.st_ino, after.st_size, after.st_mtime_ns), + "selected MD checkpoint changed while loading", + ) + require(isinstance(checkpoint, Mapping), "selected MD checkpoint root changed") + return checkpoint + + +def _write_create_only(path: Path, payload: bytes, mode: int = 0o600) -> None: + descriptor = os.open(path, os.O_WRONLY | os.O_CREAT | os.O_EXCL, mode) + try: + with os.fdopen(descriptor, "wb") as handle: + handle.write(payload) + handle.flush() + os.fsync(handle.fileno()) + except BaseException: + try: + path.unlink() + except FileNotFoundError: + pass + raise + + +def _export_directory(manifest: Mapping[str, Any], cell: str) -> Path: + return Path(str(manifest["output_root"])) / "_upstream_sequence_exports" / cell + + +def _validate_export(manifest: Mapping[str, Any], entry: Mapping[str, Any]) -> dict[str, Any]: + cell = str(entry["cell"]) + root = _export_directory(manifest, cell) + require(root.is_dir() and not root.is_symlink(), f"{cell} sequence export directory is absent or unsafe") + receipt_path = root / "review_md_on_sequence_export_receipt.json" + export_path_expected = root / "review_md_on_sequence_state.pt" + require( + set(root.iterdir()) == {receipt_path, export_path_expected} + and all(path.is_file() and not path.is_symlink() for path in (receipt_path, export_path_expected)), + f"{cell} sequence export inventory changed", + ) + receipt = json.loads(receipt_path.read_text(encoding="ascii")) + identity = receipt.get("receipt_identity_sha256") + unsigned = dict(receipt) + unsigned.pop("receipt_identity_sha256", None) + require(receipt.get("schema") == EXPORT_RECEIPT_SCHEMA and identity == canonical_sha256(unsigned, domain=EXPORT_RECEIPT_SCHEMA), f"{cell} sequence export receipt changed") + require( + receipt.get("status") == "PASS_TENSOR_ONLY_209_SEQUENCE_EXPORT" + and receipt.get("cell") == cell + and receipt.get("base_cell") == BASE_CELL[cell] + and receipt.get("upstream_seed") == manifest["upstream_seed"] == 43 + and receipt.get("manifest_identity_sha256") == manifest["manifest_identity_sha256"] + and receipt.get("selected_epoch") == entry["selected_epoch"] + and float(receipt.get("selected_loss")) == float(entry["selected_loss"]) + and receipt.get("source_checkpoint") == entry["selected_checkpoint"] + and receipt.get("source_checkpoint_index") == entry["checkpoint_index"] + and receipt.get("source_final_receipt") == entry["final_receipt"] + and receipt.get("full_model_state_entry_count") == FULL_STATE_ENTRY_COUNT + and receipt.get("full_model_inventory_sha256") == FULL_INVENTORY_SHA256 + and receipt.get("sequence_state_entry_count") == SEQUENCE_ENTRY_COUNT + and receipt.get("sequence_inventory_sha256") == SEQUENCE_INVENTORY_SHA256 + and receipt.get("sequence_tensor_bytes") == entry["sequence_tensor_bytes"] == SEQUENCE_TENSOR_BYTES + and receipt.get("sequence_tensor_values_sha256") == entry["sequence_tensor_values_sha256"] + and receipt.get("weights_only_load") is True + and receipt.get("optimizer_or_rng_exported") is False + and receipt.get("heldout_capability_present") is False + and receipt.get("heldout_opened_or_used") is False, + f"{cell} sequence export lineage changed", + ) + export_binding = receipt["sequence_export"] + require(Path(str(export_binding["path"])) == export_path_expected, f"{cell} sequence export path changed") + export_path = verify_binding(export_binding, f"{cell} sequence export") + receipt_binding = { + "path": os.fspath(receipt_path), + "bytes": receipt_path.stat().st_size, + "sha256": sha256_file(receipt_path), + "receipt_identity_sha256": identity, + } + return { + **receipt, + "sequence_export": {**export_binding, "path": os.fspath(export_path)}, + "sequence_export_receipt": receipt_binding, + } + + +def ensure_sequence_export(manifest: Mapping[str, Any], entry: Mapping[str, Any]) -> dict[str, Any]: + cell = str(entry["cell"]) + final_root = _export_directory(manifest, cell) + if final_root.exists() or final_root.is_symlink(): + return _validate_export(manifest, entry) + _validate_terminal_handoff(entry) + output_root = Path(str(manifest["output_root"])) + export_parent = output_root / "_upstream_sequence_exports" + export_parent.mkdir(parents=True, exist_ok=True) + require(export_parent.is_dir() and not export_parent.is_symlink(), "sequence export parent is unsafe") + temporary = Path(tempfile.mkdtemp(prefix=f".{cell}.", dir=export_parent)) + try: + checkpoint = _safe_load_md_checkpoint(Path(str(entry["selected_checkpoint"]["path"])), entry["selected_checkpoint"]) + require(list(checkpoint) == ["schema", "run_identity_sha256", "md_cell_id", "base_cell_id", "selection", "development_history", "adapter_cursor", "model_state", "optimizer_state", "rng_state"], f"{cell} checkpoint root schema changed") + require(checkpoint["schema"] == MD_CHECKPOINT_SCHEMA and checkpoint["run_identity_sha256"] == entry["run_identity_sha256"], f"{cell} checkpoint lineage changed") + require(checkpoint["md_cell_id"] == cell and checkpoint["base_cell_id"] == BASE_CELL[cell], f"{cell} checkpoint cell changed") + selection = checkpoint["selection"] + require(selection["completed_epochs"] == selection["best_epoch"] == entry["selected_epoch"], f"{cell} selected checkpoint epoch changed") + require(float(selection["best_loss"]) == float(entry["selected_loss"]), f"{cell} selected checkpoint loss changed") + model_state = checkpoint["model_state"] + require(isinstance(model_state, Mapping) and len(model_state) == FULL_STATE_ENTRY_COUNT, f"{cell} full model state must contain 505 entries") + inventory, inventory_payload, inventory_sha = _canonical_inventory(model_state) + require(len(inventory) == FULL_STATE_ENTRY_COUNT and len(inventory_payload) == FULL_INVENTORY_BYTES and inventory_sha == FULL_INVENTORY_SHA256, f"{cell} full model inventory changed") + sequence = _sequence_state(model_state) + sequence_tensor_bytes, sequence_tensor_values_sha256 = _sequence_tensor_values_sha256(sequence) + require( + sequence_tensor_bytes == entry["sequence_tensor_bytes"] + and sequence_tensor_values_sha256 == entry["sequence_tensor_values_sha256"], + f"{cell} selected sequence tensor values changed", + ) + export_value = { + "schema": EXPORT_SCHEMA, + "cell": cell, + "base_cell": BASE_CELL[cell], + "upstream_seed": manifest["upstream_seed"], + "selected_epoch": entry["selected_epoch"], + "selected_loss": entry["selected_loss"], + "run_identity_sha256": entry["run_identity_sha256"], + "full_model_state_entry_count": FULL_STATE_ENTRY_COUNT, + "full_model_inventory_sha256": FULL_INVENTORY_SHA256, + "sequence_state_entry_count": SEQUENCE_ENTRY_COUNT, + "sequence_inventory_sha256": SEQUENCE_INVENTORY_SHA256, + "sequence_tensor_bytes": sequence_tensor_bytes, + "sequence_tensor_values_sha256": sequence_tensor_values_sha256, + "source_checkpoint": dict(entry["selected_checkpoint"]), + "source_checkpoint_index": dict(entry["checkpoint_index"]), + "source_final_receipt": dict(entry["final_receipt"]), + "optimizer_or_rng_exported": False, + "heldout_capability_present": False, + "model_state": sequence, + } + del sequence, model_state, checkpoint + gc.collect() + export_path = temporary / "review_md_on_sequence_state.pt" + with export_path.open("xb") as handle: + torch.save(export_value, handle) + handle.flush() + os.fsync(handle.fileno()) + os.chmod(export_path, 0o600) + export_binding = {"path": os.fspath(final_root / export_path.name), "bytes": export_path.stat().st_size, "sha256": sha256_file(export_path)} + receipt = { + "schema": EXPORT_RECEIPT_SCHEMA, + "status": "PASS_TENSOR_ONLY_209_SEQUENCE_EXPORT", + "manifest_identity_sha256": manifest["manifest_identity_sha256"], + "cell": cell, + "base_cell": BASE_CELL[cell], + "upstream_seed": manifest["upstream_seed"], + "selected_epoch": entry["selected_epoch"], + "selected_loss": entry["selected_loss"], + "source_checkpoint": dict(entry["selected_checkpoint"]), + "source_checkpoint_index": dict(entry["checkpoint_index"]), + "source_final_receipt": dict(entry["final_receipt"]), + "sequence_export": export_binding, + "full_model_state_entry_count": FULL_STATE_ENTRY_COUNT, + "full_model_inventory_sha256": FULL_INVENTORY_SHA256, + "sequence_state_entry_count": SEQUENCE_ENTRY_COUNT, + "sequence_inventory_sha256": SEQUENCE_INVENTORY_SHA256, + "sequence_tensor_bytes": sequence_tensor_bytes, + "sequence_tensor_values_sha256": sequence_tensor_values_sha256, + "weights_only_load": True, + "optimizer_or_rng_exported": False, + "heldout_capability_present": False, + "heldout_opened_or_used": False, + } + receipt["receipt_identity_sha256"] = canonical_sha256(receipt, domain=EXPORT_RECEIPT_SCHEMA) + _write_create_only(temporary / "review_md_on_sequence_export_receipt.json", canonical_bytes(receipt)) + os.replace(temporary, final_root) + except BaseException: + raise + return _validate_export(manifest, entry) + + +def load_exported_encoder( + *, + checkpoint_path: Path, + checkpoint_sha256: str, + checkpoint_bytes: int | None, + cell_id: str, + r8_executor_path: Path, + r8_executor_sha256: str = native_checkpoint.R8_EXECUTOR_SHA256, + device: torch.device | str = "cpu", +) -> Any: + require(cell_id in CELLS, "unknown MD-on downstream cell") + with native_checkpoint.open_regular_nofollow(Path(checkpoint_path), label="MD-on sequence export") as (handle, before): + observed_sha, observed_bytes = native_checkpoint._hash_open_file(handle) + require(observed_sha == checkpoint_sha256 and observed_bytes == checkpoint_bytes, "MD-on sequence export binding changed") + value = torch.load(handle, map_location="cpu", weights_only=True) + after = os.fstat(handle.fileno()) + require((before.st_dev, before.st_ino, before.st_size, before.st_mtime_ns) == (after.st_dev, after.st_ino, after.st_size, after.st_mtime_ns), "MD-on sequence export changed while loading") + require(type(value) is dict and value.get("schema") == EXPORT_SCHEMA and value.get("cell") == cell_id, "MD-on sequence export identity changed") + require(value.get("optimizer_or_rng_exported") is False and set(value) == {"schema", "cell", "base_cell", "upstream_seed", "selected_epoch", "selected_loss", "run_identity_sha256", "full_model_state_entry_count", "full_model_inventory_sha256", "sequence_state_entry_count", "sequence_inventory_sha256", "sequence_tensor_bytes", "sequence_tensor_values_sha256", "source_checkpoint", "source_checkpoint_index", "source_final_receipt", "optimizer_or_rng_exported", "heldout_capability_present", "model_state"}, "MD-on sequence export schema changed") + sequence_state = value["model_state"] + require(isinstance(sequence_state, Mapping) and len(sequence_state) == SEQUENCE_ENTRY_COUNT, "MD-on sequence export state changed") + native_checkpoint.validate_encoder_schema_fingerprint(sequence_state) + tensor_bytes, tensor_values_sha256 = _sequence_tensor_values_sha256(sequence_state) + require( + _ACTIVE_MANIFEST is not None and _ACTIVE_ENTRY is not None and _ACTIVE_ENTRY["cell"] == cell_id, + "active MD-on source contract is absent", + ) + expected = _ACTIVE_ENTRY["checkpoint"] + require( + value.get("base_cell") == BASE_CELL[cell_id] + and value.get("upstream_seed") == _ACTIVE_MANIFEST["upstream_seed"] == 43 + and value.get("selected_epoch") == _ACTIVE_ENTRY["selected_epoch"] + and value.get("selected_loss") == expected["selected_loss"] + and value.get("run_identity_sha256") == expected["run_identity_sha256"] + and value.get("source_checkpoint") == expected["source_checkpoint"] + and value.get("source_checkpoint_index") == expected["source_checkpoint_index"] + and value.get("source_final_receipt") == expected["source_final_receipt"] + and value.get("full_model_state_entry_count") == FULL_STATE_ENTRY_COUNT + and value.get("full_model_inventory_sha256") == FULL_INVENTORY_SHA256 + and value.get("sequence_state_entry_count") == SEQUENCE_ENTRY_COUNT + and value.get("sequence_inventory_sha256") == SEQUENCE_INVENTORY_SHA256 + and value.get("sequence_tensor_bytes") == expected["sequence_tensor_bytes"] == tensor_bytes + and value.get("sequence_tensor_values_sha256") == expected["sequence_tensor_values_sha256"] == tensor_values_sha256 + and value.get("heldout_capability_present") is False, + "MD-on sequence export provenance changed", + ) + + executor = native_checkpoint._load_executor_module(Path(r8_executor_path), expected_sha256=r8_executor_sha256) + config = executor.NativeEightConfig(cell_id=BASE_CELL[cell_id], seq_vocab_size=native_checkpoint.SEQ_VOCAB_SIZE) + with torch.device("meta"): + full_model = executor.NativeEightCompositeR5(config) + sequence_embeddings = full_model.sequence_embeddings + sequence_layers = full_model.sequence_layers + delattr(full_model, "sequence_embeddings") + delattr(full_model, "sequence_layers") + del full_model + encoder = native_checkpoint.ExactNativeSequenceEncoder(sequence_embeddings, sequence_layers) + target = torch.device(device) + encoder.to_empty(device=target) + incompatible = encoder.load_state_dict(sequence_state, strict=True, assign=False) + require(not incompatible.missing_keys and not incompatible.unexpected_keys, "strict MD-on sequence load failed") + encoder.__review_execution_contract__ = { + "schema": EXPORT_SCHEMA, + "cell": cell_id, + "base_cell": BASE_CELL[cell_id], + "export": {"path": os.fspath(checkpoint_path), "bytes": checkpoint_bytes, "sha256": checkpoint_sha256}, + "source_checkpoint": value["source_checkpoint"], + "source_checkpoint_index": value["source_checkpoint_index"], + "source_final_receipt": value["source_final_receipt"], + } + return native_checkpoint.LoadedNativeEncoder( + encoder=encoder, + checkpoint_sha256=checkpoint_sha256, + executor_sha256=r8_executor_sha256, + encoder_schema_sha256=SEQUENCE_INVENTORY_SHA256, + cell_id=cell_id, + ) + + +def selection_step(best: float | None, stale: int, metric: Mapping[str, Any], *, patience: int) -> tuple[bool, bool, float | None, int, bool]: + flags = [metric[key] for key in ("MCC_denominator_degenerate", "mcc_denominator_degenerate") if key in metric] + require(len(flags) == 1 and type(flags[0]) is bool, "classification degeneracy flag changed") + value = float(metric["value"]) + require(math.isfinite(value), "classification MCC is nonfinite") + eligible = not flags[0] + improved = eligible and (best is None or value > best + 1e-12) + if improved: + return eligible, improved, value, 0, False + if best is None: + return eligible, improved, best, 0, False + next_stale = stale + 1 + return eligible, improved, best, next_stale, next_stale >= patience + + +def corrected_scalar_classification(module: Any, **kwargs: Any) -> Mapping[str, Any]: + args = kwargs["args"] + manifest = kwargs["manifest"] + entry = kwargs["entry"] + cell = kwargs["cell"] + endpoint = kwargs["endpoint"] + tokenizer = kwargs["tokenizer"] + view = kwargs["view"] + adapter = kwargs["adapter"] + authority_binding = kwargs["authority_binding"] + device = kwargs["device"] + require(args.smoke_batches is None, "MD-on 44-fit package does not authorize smoke outputs") + final_output = args.output_root / cell / endpoint / "seed42" + output = module._staging_output(final_output) + train_role = module._classification_role(args.authority_project_root, view, endpoint, "train") + validation_role = module._classification_role(args.authority_project_root, view, endpoint, "validation") + require(not ({item.row_id for item in train_role.examples} & {item.row_id for item in validation_role.examples}), f"{endpoint} train/validation overlap") + hp = module.CLASSIFICATION_HP[endpoint] + loaded = module._load_encoder(manifest, entry, cell, device) + model = module.native_core.build_classifier_after_checkpoint_load( + loaded, num_labels=1 if endpoint == "immunogenicity" else 3, dropout=float(hp["dropout"]) + ).to(device=device, dtype=torch.float32) + for index, layer in enumerate(model.encoder.sequence_layers): + if index < int(hp["freeze_layers"]): + for parameter in layer.parameters(): + parameter.requires_grad = False + train_loader = module._loader(module.ClassificationDataset(train_role, tokenizer), batch_size=int(hp["batch_size"]), shuffle=True, workers=args.num_workers) + validation_loader = module._loader(module.ClassificationDataset(validation_role, tokenizer), batch_size=int(hp["batch_size"]), shuffle=False, workers=args.num_workers) + optimizer = module.AdamW([parameter for parameter in model.parameters() if parameter.requires_grad], lr=float(hp["lr"]), weight_decay=module.WEIGHT_DECAY) + steps = len(train_loader) + scheduler = module.CosineAnnealingLR(optimizer, T_max=max(1, steps * module.MAX_CLASSIFICATION_EPOCHS)) + history: list[dict[str, Any]] = [] + best_value: float | None = None + best_epoch = 0 + best_state: dict[str, torch.Tensor] | None = None + stale = 0 + for epoch in range(1, module.MAX_CLASSIFICATION_EPOCHS + 1): + train_loss = module._train_classification_epoch(model, train_loader, optimizer, scheduler, device, endpoint, maximum_batches=None) + logits = module._classification_logits(model, validation_loader, device, maximum_batches=None) + metric = module._classification_metric(adapter, validation_role, logits) + eligible, improved, best_value, stale, stop = selection_step(best_value, stale, metric, patience=module.CLASSIFICATION_PATIENCE) + if improved: + best_epoch = epoch + best_state = module.hp0.state_to_cpu(model) + module._persist_best( + output / "review_selected_downstream_state.pt", + { + "schema": SCALAR_STATE_SCHEMA, + "cell": cell, + "endpoint": endpoint, + "downstream_seed": DOWNSTREAM_SEED, + "selected_epoch": best_epoch, + "selected_validation_metric": best_value, + "selection_eligible": True, + "upstream_checkpoint": dict(entry["checkpoint"]), + "fixed_hp0": dict(hp), + "model_state": best_state, + }, + ) + record = {"epoch": epoch, "train_loss": train_loss, "validation_metric": metric, "selection_eligible": eligible, "selected_as_best": improved, "best_epoch": best_epoch, "stale_eligible_or_degenerate_epochs_after_first_eligible": stale} + history.append(record) + print(json.dumps({"cell": cell, "endpoint": endpoint, **record}, sort_keys=True), flush=True) + if stop: + break + history_binding = module.hp0.write_json_create_only(output / "review_history.json", {"cell": cell, "endpoint": endpoint, "history": history}) + if best_state is None or best_epoch <= 0 or best_value is None: + hold = { + "schema": SCALAR_HOLD_SCHEMA, + "status": "HOLD_ALL_EPOCHS_DEGENERATE", + "cell": cell, + "endpoint": endpoint, + "downstream_seed": DOWNSTREAM_SEED, + "completed_epochs": len(history), + "expected_maximum_epochs": module.MAX_CLASSIFICATION_EPOCHS, + "upstream_checkpoint": dict(entry["checkpoint"]), + "history": history_binding, + "heldout_capability_present": False, + "heldout_opened_or_used": False, + } + hold["hold_identity_sha256"] = module.hp0.canonical_sha256(hold) + module.hp0.write_json_create_only(output / "review_hold.json", hold) + module._publish_output(output, final_output) + raise MDOnDownstreamError(f"{cell}/{endpoint}: all configured epochs were MCC-degenerate") + selected_path = output / "review_selected_downstream_state.pt" + persisted = torch.load(selected_path, map_location="cpu", weights_only=True) + require(persisted["selected_epoch"] == best_epoch and float(persisted["selected_validation_metric"]) == best_value, "persisted scalar selection changed") + model.load_state_dict(persisted["model_state"], strict=True) + metric = module._classification_metric(adapter, validation_role, module._classification_logits(model, validation_loader, device, maximum_batches=None)) + eligible, _, _, _, _ = selection_step(None, 0, metric, patience=module.CLASSIFICATION_PATIENCE) + require(eligible and abs(float(metric["value"]) - best_value) <= module.TIE_TOLERANCE, "restored scalar checkpoint changed") + logits = module._classification_logits(model, validation_loader, device, maximum_batches=None) + ledger = module._emit_classification_ledger(output / "review_validation_prediction_ledger.tsv.gz", authority=validation_role, logits=logits, adapter=adapter) + result = { + "schema": SCALAR_RESULT_SCHEMA, + "status": "COMPLETE_VALIDATION_SELECTION", + "cell": cell, + "endpoint": endpoint, + "downstream_seed": DOWNSTREAM_SEED, + "upstream_checkpoint": dict(entry["checkpoint"]), + "upstream_selected_epoch": entry["selected_epoch"], + "fixed_hp0": dict(hp), + "procedure": { + "loss": "one_logit_unweighted_mean_BCEWithLogitsLoss" if endpoint == "immunogenicity" else "three_logit_unweighted_mean_cross_entropy", + "selection": "strict_higher_nondegenerate_validation_MCC_earliest_tie", + "maximum_epochs": module.MAX_CLASSIFICATION_EPOCHS, + "patience": module.CLASSIFICATION_PATIENCE, + "patience_before_first_eligible": False, + "degenerate_checkpoint_eligible": False, + "threshold": "inclusive_sigmoid_probability_greater_than_or_equal_to_0.5" if endpoint == "immunogenicity" else None, + "hpo": False, + }, + "authority": dict(authority_binding), + "role_counts": {"train": len(train_role.examples), "validation": len(validation_role.examples)}, + "completed_epochs": len(history), + "selected_epoch": best_epoch, + "validation_metric": metric, + "history": history_binding, + "selected_state": module._binding(selected_path), + "validation_predictions": ledger, + "heldout_capability_present": False, + "heldout_opened_or_used": False, + "execution_environment": module._environment(), + "claim_boundary": "MD-on native validation ablation; one upstream seed43 and downstream seed42.", + } + result = module._rebase_paths(result, output, final_output) + result["result_identity_sha256"] = module.hp0.canonical_sha256(result) + module.hp0.write_json_create_only(output / "review_result.json", result) + module._publish_output(output, final_output) + return result + + +_ACTIVE_MANIFEST: dict[str, Any] | None = None +_ACTIVE_ENTRY: dict[str, Any] | None = None + + +def _patched_read_manifest(path: Path, expected_sha256: str) -> Mapping[str, Any]: + require(_ACTIVE_MANIFEST is not None, "active assignment manifest is absent") + observed = validate_manifest(Path(path), expected_sha256, live=False) + require(observed["manifest_identity_sha256"] == _ACTIVE_MANIFEST["manifest_identity_sha256"], "active assignment changed") + return observed + + +def _patched_validate_cell(manifest: Mapping[str, Any], index: int) -> tuple[str, Mapping[str, Any]]: + require(_ACTIVE_ENTRY is not None and 0 <= index < len(CELLS), "active cell entry is absent") + require(CELLS[index] == _ACTIVE_ENTRY["cell"], "active cell index changed") + return CELLS[index], _ACTIVE_ENTRY + + +def _load_module(binding: Mapping[str, Any], name: str) -> Any: + path = verify_binding(binding, name) + spec = importlib.util.spec_from_file_location(name, path) + require(spec is not None and spec.loader is not None, f"cannot load {name}") + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + spec.loader.exec_module(module) + return module + + +def _patch_runner(module: Any, manifest_sha256: str) -> None: + target = getattr(module, "base", module) + for item in {module, target}: + if hasattr(item, "CELLS"): + item.CELLS = CELLS + if hasattr(item, "ASSIGNMENT_SHA256"): + item.ASSIGNMENT_SHA256 = manifest_sha256 + if hasattr(item, "checkpoint"): + item.checkpoint.load_exact_native_encoder = load_exported_encoder + if hasattr(item, "hp0"): + item.hp0.CELLS = CELLS + if hasattr(item, "assignment"): + item.assignment.CELLS = CELLS + item.assignment._read_manifest = _patched_read_manifest + item.assignment._validate_cell = _patched_validate_cell + + +def _require_endpoint_absent(output_root: Path, cell: str, endpoint: str) -> None: + root = output_root / cell / endpoint / "seed42" + require(not root.exists() and not root.is_symlink(), "create-only endpoint output already exists") + + +def run_endpoint(manifest: dict[str, Any], manifest_path: Path, manifest_sha256: str, cell_index: int, endpoint: str) -> int: + global _ACTIVE_MANIFEST, _ACTIVE_ENTRY + cell = CELLS[cell_index] + output_root = Path(str(manifest["output_root"])) + _require_endpoint_absent(output_root, cell, endpoint) + source_entry = manifest["terminal_handoffs"][cell_index] + export_receipt = ensure_sequence_export(manifest, source_entry) + _ACTIVE_MANIFEST = manifest + _ACTIVE_ENTRY = { + "cell": cell, + "base_cell": BASE_CELL[cell], + "selected_epoch": source_entry["selected_epoch"], + "checkpoint": { + **export_receipt["sequence_export"], + "schema": EXPORT_SCHEMA, + "cell": cell, + "base_cell": BASE_CELL[cell], + "source_checkpoint": source_entry["selected_checkpoint"], + "source_checkpoint_index": source_entry["checkpoint_index"], + "source_final_receipt": source_entry["final_receipt"], + "selected_loss": source_entry["selected_loss"], + "run_identity_sha256": source_entry["run_identity_sha256"], + "sequence_tensor_bytes": source_entry["sequence_tensor_bytes"], + "sequence_tensor_values_sha256": source_entry["sequence_tensor_values_sha256"], + "export_receipt_identity_sha256": export_receipt["receipt_identity_sha256"], + "sequence_export_receipt": export_receipt["sequence_export_receipt"], + "assignment_manifest": { + "path": os.fspath(manifest_path), + "bytes": manifest_path.stat().st_size, + "sha256": manifest_sha256, + "manifest_identity_sha256": manifest["manifest_identity_sha256"], + }, + "md_on_adapter": dict(manifest["runtime_sources"]["md_on_adapter"]), + }, + "final_selection_receipt": source_entry["final_receipt"], + } + common = [ + "--native-project-root", str(manifest["native_project_root"]), + "--authority-project-root", str(manifest["authority_roots"]["taxonomy" if endpoint in RANKS else "scalar_interaction"]), + "--assignment-manifest", os.fspath(manifest_path), + "--assignment-sha256", manifest_sha256, + "--array-index", str(cell_index), + "--output-root", os.fspath(output_root), + "--num-workers", str(manifest["num_workers"]), + ] + if endpoint in RANKS: + module = _load_module(manifest["runtime_sources"]["taxonomy_runner"], f"review_md_on_taxonomy_{cell_index}_{endpoint}") + _patch_runner(module, manifest_sha256) + args = module.parse_args([*common, "--rank-weight-authority", str(manifest["rank_weight_authority"]["path"]), "--only-rank", endpoint]) + elif endpoint in {"immunogenicity", "linkage"}: + module = _load_module(manifest["runtime_sources"]["scalar_runner"], f"review_md_on_scalar_{cell_index}_{endpoint}") + _patch_runner(module, manifest_sha256) + module._run_classification = lambda **kwargs: corrected_scalar_classification(module, **kwargs) + args = module.parse_args([*common, "--only-endpoint", endpoint]) + else: + module = _load_module(manifest["runtime_sources"]["interaction_runner"], f"review_md_on_interaction_{cell_index}") + _patch_runner(module, manifest_sha256) + args = module.parse_args([*common, "--protein-embeddings", str(manifest["protein_embeddings"]["path"]), "--only-endpoint", "interaction"]) + return int(module.run(args)) + + +def parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--manifest", type=Path, required=True) + parser.add_argument("--manifest-sha256", required=True) + parser.add_argument("--array-index", type=int) + parser.add_argument("--endpoint", choices=ENDPOINTS) + parser.add_argument("--self-check", action="store_true") + args = parser.parse_args(argv) + args.manifest = args.manifest.resolve(strict=True) + require(args.self_check or (args.array_index is not None and args.endpoint is not None), "cell index and endpoint are required") + return args + + +def main(argv: Sequence[str] | None = None) -> int: + args = parse_args(argv) + manifest = validate_manifest(args.manifest, args.manifest_sha256, live=not args.self_check) + if args.self_check: + print(json.dumps({"status": "SELF_CHECK_PASS", "cells": list(CELLS), "endpoints": list(ENDPOINTS), "fit_count": 44, "heldout": False, "hpo": False}, sort_keys=True)) + return 0 + require(0 <= args.array_index < len(CELLS), "array index outside terminal-four scope") + slurm_index = os.environ.get("SLURM_ARRAY_TASK_ID") + require(slurm_index is None or int(slurm_index) == args.array_index, "Slurm array identity changed") + if slurm_index is not None: + require( + os.environ.get("SLURM_JOB_PARTITION") == "scavenger" + and os.environ.get("SLURM_JOB_ACCOUNT") == "ratul-scavenger" + and os.environ.get("SLURM_JOB_QOS") == "scavenger", + "Slurm route changed", + ) + return run_endpoint(manifest, args.manifest, args.manifest_sha256, args.array_index, args.endpoint) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/releases/2026-10-02/figures/Figure_style.md b/releases/2026-10-02/figures/Figure_style.md new file mode 100644 index 0000000000000000000000000000000000000000..13f6d4dfe238c955bfd84038e934c3014a692c62 --- /dev/null +++ b/releases/2026-10-02/figures/Figure_style.md @@ -0,0 +1,13 @@ +# Figure style + +Supplementary Figure 10 remains the reference for comparison-plot design. Most other figures use larger type after review at their final document size. + +- Final width: 6.5 inches. Heights depend on panel content. +- Arial: 12–13-point bold headings and panel letters, usually 10–11-point body/axis labels, and at least 9.5-point ticks and notes. Figure 9 uses a 9-point minimum to retain the full matrix; Figure 10 retains its approved typography. +- Tighten outer margins and gaps before reducing type size. Give key counts enough prominence and check the complete figure at its intended size. +- White backgrounds, dark text, light-grey grids and thin neutral axes. +- Editable SVG text and vector PDF; PNG/TIFF exports at 300 dpi or higher. Figure 9 uses 600 dpi. +- Nature BPG categorical colours, with explicitly labelled categories. Quantitative scales use ordered colours. +- BERTose IAR uses coral and first-choice completion uses peach. Marginal frequency is cyan, context frequency teal, and nearest neighbour navy in both completion figures. +- Preserve all values, denominators, uncertainty definitions and source bindings when changing layout. +- The MD panel in Figure 7 is a schematic of the implemented method, not a measured trajectory or heatmap. diff --git a/releases/2026-10-02/figures/README.md b/releases/2026-10-02/figures/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7f96bdc2a740dc3b913b15d24e029ffeac6d4a87 --- /dev/null +++ b/releases/2026-10-02/figures/README.md @@ -0,0 +1,100 @@ +# Figure reproduction + +The figure-specific builders below reproduce the supplementary figures from stored data or declared model structure. They do not fit models or run glycan inference. SVG files retain editable text and shapes; PDF files are vector exports. Figures 1–3, 6–8 and 10–11 use 300 dpi PNG and losslessly compressed TIFF; Figures 4, 5, 9, 12 and 13 use 600 dpi rasters. The current supplementary figures are generated from Python; SVG is the editable vector format. PNG/TIFF files are exports, not the editing source. No supplementary PowerPoint source is included. + +The figures are sized for a 6.5-inch column. Most use 10–11-point Arial labels, with a 9.5-point minimum and 12–13-point headings. Dense Figure 9 uses a 9-point minimum. Figure 10 retains its approved layout and typography. Matching methods use matching colours in Figures 4 and 5; colour meanings are otherwise specific to the labelled categories. Figure 9 retains 600-dpi raster exports. See `Figure_style.md` for the shared editing conventions. + +Run the commands from this folder. Replace `/path/to/submit_comm` with the consolidated package root and `/path/to/output` with the chosen output directory. Matplotlib and Pillow are required for Figures 2–9. Figure 1 additionally requires Pillow, pypdf and CairoSVG, available either as the `cairosvg` command on `PATH` or as a Python module. Arial was used for the reviewed exports; rendering may differ when fonts or library versions differ. + +## Supplementary Figures 1 and 7 + +```sh +python build_supplement_presentation.py --package-dir /path/to/submit_comm --outdir /path/to/output +``` + +This wrapper builds Figures 1 and 7. Figure 1 calls `build_supplement_figure1.py`, an editable vector recreation of the original three-card design with current counts and labels. The original native artwork was not recovered. Its inputs are `04_source_data/benchmark_exclusion/partition_count_flow.csv` and `04_source_data/figure_inputs/Supplementary_Figure_8_corpus_composition.csv`. The Figure 7 callable forwards to `compact_modalities/builders/build_figures6_7.py`. Its two compact panels show static tokenization and MD encoding; the grid and mask positions are schematic, with no measured descriptor values. The Figure 1 callable and its inputs are unchanged. + +To build Figure 1 alone, run: + +```sh +python build_supplement_figure1.py --package-dir /path/to/submit_comm --outdir /path/to/output +``` + +The Figure 1 builder also accepts `--inputs` pointing to a directory containing the two CSV filenames above. Its default output directory is the builder's own directory; the wrapper defaults to the package's `05_figures` directory. + +## Supplementary Figures 2 and 3 + +```sh +python build_token_length_figure2.py --package-dir /path/to/submit_comm --outdir /path/to/output +python build_bpe_figure3.py --package-dir /path/to/submit_comm --outdir /path/to/output +``` + +Figure 2 reads `04_source_data/figure_inputs/Supplementary_Figure_2_token_length_counts.csv`; its histogram data and geometry are unchanged. Training and validation are the display labels, while raw source role identifiers remain intact. Figure 3 shows one residue unit as characters, learned fragments and a token. The intermediate fragments are reconstructed from saved merge rules; fitting and sequence-length counts remain in the caption. Both commands default to `05_figures`; Figure 2 also accepts `--source` for another histogram CSV. See the Figure 3 builder and its adjacent input files for the exact example and source bindings. + +## Supplementary Figures 4 and 5 + +```sh +python build_grey_seal_figure5.py --package-dir /path/to/submit_comm --outdir /path/to/output +``` + +This compatibility entrypoint calls `final_iar/build_final_iar_figures.py` and rebuilds the two final IAR figures together. It reads the three final-run artifacts and saved palette in `final_iar/inputs/`, then writes four figure formats, a ten-row source CSV for each figure, `IAR_token_metrics_source.csv` and `build_receipt.json`. The earlier eight-row `--source-csv` workflow is superseded. The consolidated package's `05_figures/build_current_iar_figure4.py` calls the same builder. + +The small inputs are included in the code-only package. Without the consolidated layout, run `python final_iar/build_final_iar_figures.py --outdir /path/to/output`. That builder defaults to its own `final_iar/` directory. It does not require the encoder checkpoint or training arrays. See `final_iar/README.md` for denominator definitions and reproduction limits. + +## Supplementary Figure 6 + +```sh +python build_training_coverage_figure6.py --package-dir /path/to/submit_comm --outdir /path/to/output +``` + +Figure 6 is a compact coverage dot plot for sequence, topology, MS, static 3D and MD. The compatibility entry point forwards to the shared compact modality builder. It uses the `train` rows of `04_source_data/review_training_modality_coverage.csv` when the consolidated package is present, or the identical bundled CSV in the code-only package. The denominator is 221,827 glycans; subsets overlap, and static coverage counts parent glycans. `--source` is retained and output defaults to `05_figures`. The historical interaction network remains a separate earlier artifact. + +To build either compact modality figure directly from bundled inputs: + +```sh +python compact_modalities/builders/build_figures6_7.py --figure 6 --outdir /path/to/output +python compact_modalities/builders/build_figures6_7.py --figure 7 --outdir /path/to/output +``` + +See `compact_modalities/README.md` for the three required input files and the recorded rendering environment. + +## Supplementary Figure 8 + +```sh +python build_corpus_composition_figure.py +``` + +This command rebuilds Figure 8 in `05_figures` from `04_source_data/figure_inputs/Supplementary_Figure_8_corpus_composition.csv`. The CSV records the input overlay hash, category predicates and verification-receipt hash. Counts are 146,282 structure-defined records, 134,927 auxiliary WURCS 2.0 context records and 3,841 outside the main set, totalling 285,050. The categories describe curation eligibility, and percentages use the full corpus. The figure uses the first three saved Nature BPG colours at 0.6 opacity. + +## Supplementary Figure 9 + +```sh +python build_supplementary_figure9.py --outdir /path/to/output +``` + +The existing drawing code is packaged with `ablation_figure9/plot_data.json` and `ablation_figure9/nature-bpg-palette.json`. These stored inputs are sufficient to draw the figure; upstream paths in the JSON are provenance records, not runtime dependencies. The compact figure retains the categorical ablation matrix, sign and interval markers, and separate tokenizer-control panel. The packaged builder restores portable default paths; its numerical inputs are unchanged. `--inputs` selects another input directory, and `--package-dir` selects the package used for the default `05_figures` output. See `ablation_figure9/README.md` for metric and seed-order qualifications. + +## Supplementary Figures 10–12 + +```sh +python model_variants_figure10/build_model_variants_figure10.py --package-dir /path/to/submit_comm --outdir /path/to/output +python build_taxonomy_figure11.py --package-dir /path/to/submit_comm --outdir /path/to/output +python contrastive_figure12/build_figure12.py --outdir /path/to/output +``` + +Figure 10 shows the five model variants, objective coefficients and eleven endpoints. Figure 11 shows the eight taxonomy comparisons with their saved bootstrap intervals. Figure 12 shows both contrastive weight mixtures, their individual paired runs and saved intervals. Each builder has an adjacent README identifying its inputs and plotting conventions. The complete numerical results remain in Source Data. + +## General builder and package layout + +`build_submission_figures.py` is the broader builder for main figures and earlier diagnostics as well as supplementary figures. Its tokenizer labels agree with the Figure 2/3 builders, and its final IAR call uses the current two-figure builder. Use the figure-specific commands above for the current supplement. The general builder requires numpy, pandas, Matplotlib, Pillow and openpyxl, plus the Figure 1 dependencies; it reads adjacent `04_source_data` and `_original_submission/Source Data.xlsx` and uses `05_figures` and `_verification/figure_work` for output. + +The consolidated package supplies the adjacent source-data files. The code-only reviewer ZIP does not contain every adjacent dataset required by the general builder. The small final-IAR and Figure 9 plotting inputs are included with their code. CPU model examples in `06_code/examples` have separate dependencies and do not reproduce the scientific figure data. + + +## Supplementary Figure 13 + +```sh +python bootstrap_figure13/build_figure13.py --out-dir /path/to/output +``` + +Figure 13 retains the original doubly-cold scores in panel a and shows all 34 defined BERToseBind-minus-comparator component-bootstrap intervals across three regimes in panel b. Individual fits, mean ± sample SD, single prediction sets and undefined results remain distinct. The bootstrap uses saved common-scoring results with fitted models fixed; it does not rerun the analysis. See `bootstrap_figure13/README.md`. diff --git a/releases/2026-10-02/figures/ablation_figure9/README.md b/releases/2026-10-02/figures/ablation_figure9/README.md new file mode 100644 index 0000000000000000000000000000000000000000..70d5b3f3a2ad180f3de2ae513f294b270866447a --- /dev/null +++ b/releases/2026-10-02/figures/ablation_figure9/README.md @@ -0,0 +1,17 @@ +# Supplementary Figure 9 + +The compact figure has two panels. Panel a shows 110 component contrasts as higher, similar or lower categories. Dots mark a common nonzero direction across three pairs; outlines mark saved pointwise intervals excluding zero. Panel b shows the separate tokenizer control with paired-seed markers and the saved taxonomy-mean interval. All values, categories and interval flags are read from `plot_data.json`; plotting does not fit models or recalculate statistical tests. + +From the package root, with Python 3, Matplotlib, Pillow and Arial available: + +```sh +python3 06_code/figures/build_supplementary_figure9.py +``` + +The default inputs are beside the builder in `06_code/figures/ablation_figure9`, and exports go to `05_figures`. Use `--outdir /path/to/output` for a separate destination, `--inputs /path/to/inputs` for another input directory, or `--package-dir /path/to/package` to select the default output package root. The existing `plot_data.json` and `nature-bpg-palette.json` are the only runtime inputs. Historical paths inside the data are provenance, not runtime dependencies. + +The artwork is 6.5 by 5.8 inches; PNG and LZW TIFF exports use 600 dpi. SVG text remains editable. Source CSVs and the synchronized caption are exported with the figure. Panel a uses Spearman for interaction and average precision for immunogenicity; panel b uses Pearson and binary MCC, respectively. Interaction in panel b has two paired fits because BPE seed 44 is unavailable. No component comparison passed Holm correction over 110 comparisons. + +Full component estimates, all 330 source-order paired differences, pointwise intervals, cross-GPU counts and raw/Holm-adjusted P values remain in `04_source_data/review_ablation_contrasts.csv` and the Ablation sheet of `04_source_data/Source Data.xlsx`. The original ablation source order is retained without inventing seed identities. + +The approved rendering and the portable reproduction used Matplotlib 3.10.7. diff --git a/releases/2026-10-02/figures/ablation_figure9/nature-bpg-palette.json b/releases/2026-10-02/figures/ablation_figure9/nature-bpg-palette.json new file mode 100644 index 0000000000000000000000000000000000000000..45ea20e5b3865ea0fefd85cc8c2befd639ee1000 --- /dev/null +++ b/releases/2026-10-02/figures/ablation_figure9/nature-bpg-palette.json @@ -0,0 +1,30 @@ +{ + "name": "Nature BPG", + "upstream_palette": "ggsci NPG nrc", + "alpha": 0.6, + "alpha_hex_suffix": "99", + "alpha_0_6_hex8": [ + "#E64B3599", + "#4DBBD599", + "#00A08799", + "#3C548899", + "#F39B7F99", + "#8491B499", + "#91D1C299", + "#DC000099", + "#7E614899", + "#B09C8599" + ], + "opaque_hex": [ + "#E64B35", + "#4DBBD5", + "#00A087", + "#3C5488", + "#F39B7F", + "#8491B4", + "#91D1C2", + "#DC0000", + "#7E6148", + "#B09C85" + ] +} diff --git a/releases/2026-10-02/figures/ablation_figure9/plot_data.json b/releases/2026-10-02/figures/ablation_figure9/plot_data.json new file mode 100644 index 0000000000000000000000000000000000000000..66ae10dba9821bd39e395c7c4f3ba4b23867405b --- /dev/null +++ b/releases/2026-10-02/figures/ablation_figure9/plot_data.json @@ -0,0 +1,5117 @@ +{ + "schema": "bertose_ablation_final_edits_plot_v1", + "source_sha256": { + "submit_comm/04_source_data/review_ablation_contrasts.csv": "6b92f3e62e5d08fbde9f677d30a0508ed8579011741975b195cc410f2c70a6ef", + "response_data/R1_06_20260911/ablation_contrast_table.json": "1ed9483e31b7169c2ec4ab89b74a4a94396e7b779bde5e549e0d1c3c78b585aa", + "multimodal/outputs/review_a5_representation_paired3_harvest_20260821_r1/paired3_aggregate_summary.json": "2397560300b01ed9fa84457bb1fd6182a4bfbee1fd4411913837fa9fa50daca4", + "submit_comm/04_source_data/review_tokenizer_control_taxonomy_interval.csv": "57948ae30911b7223353d35141a8e160750909bc5d020135d251a36e261b3aa9", + "multimodal/outputs/review_a5_representation_paired3_harvest_20260821_r1/paired3_per_fit_results.tsv": "23ed4f1a5446f67f9086e75b114886d268fb76ebc668044b9137eb5d8ed92924", + "multimodal/outputs/review_a5_representation_paired3_harvest_20260821_r1/paired3_metrics.tar.gz": "5ef9b2d6de14d5324d82a487c973fd01a7d6e58edb592488582d678b044e8ef7", + "R1_02_ABLATION_RESPONSE_DRAFT_20260911.md": "09da3e92715ac28bc07e0eac995d05a9c2a39da304188af40b149c115c489b74", + "ABLATION_FINAL_EDITS_20260926.md": "b19eed25393ebcafe3dc296c3a527648877b43dd66eb983fe0d7bc309e2d7e70", + "ABLATION_DETAIL_TABLE_FOR_CODEX_20260925.md": "0ccc20dd3ce92282c71ada8365d8508348fbb09c876d61a2e3766b8154ff519c" + }, + "endpoint_order": [ + "domain", + "kingdom", + "phylum", + "class", + "order", + "family", + "genus", + "species", + "immunogenicity", + "linkage", + "interaction" + ], + "contrast_order": [ + "topology_removed", + "ms_removed", + "static_removed", + "md_removed", + "tree_channels_full", + "topology_added", + "ms_added", + "static_added", + "tree_channels_base", + "three_branches_added" + ], + "delta_direction": "component present or active minus absent or inactive; BPE minus character", + "category_rule": { + "higher": "mean >= 0.005", + "similar": "-0.005 < mean < 0.005", + "lower": "mean <= -0.005", + "interpretation": "descriptive threshold, not significance or equivalence; classify unrounded means" + }, + "ablation_seed_note": "source summary arrays omit per-value upstream seed labels; retain original source order, never label as seeds42/43/44", + "ablation_rows": [ + { + "contrast": "topology_removed", + "endpoint": "domain", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A0111", + "mean_delta": -0.004626458359226371, + "sample_sd": 0.0030854709973056264, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.004362986427953297 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.0016811717085521982 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.007835216941173617 + } + ], + "ci95_low": -0.012291193222433432, + "ci95_high": 0.00303827650398069, + "p_raw": 0.12176579600194806, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_removed", + "endpoint": "kingdom", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A0111", + "mean_delta": -0.008209554550619003, + "sample_sd": 0.003186956837811049, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.00818282506232293 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.005036046527160498 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.01140979206237358 + } + ], + "ci95_low": -0.016126394217443746, + "ci95_high": -0.0002927148837942612, + "p_raw": 0.04673958855908958, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": true, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_removed", + "endpoint": "phylum", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A0111", + "mean_delta": -0.006862379128227365, + "sample_sd": 0.004147876067598536, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.009442529148635637 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.009066870654275916 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0020777375817705446 + } + ], + "ci95_low": -0.017166274491803055, + "ci95_high": 0.0034415162353483254, + "p_raw": 0.1032608147931959, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_removed", + "endpoint": "class", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A0111", + "mean_delta": -0.013301468948567837, + "sample_sd": 0.013944173557772695, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.01784951145292779 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0023488917970306833 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.024403787189806403 + } + ], + "ci95_low": -0.047940716343925466, + "ci95_high": 0.021337778446789787, + "p_raw": 0.24029516920543506, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_removed", + "endpoint": "order", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A0111", + "mean_delta": -0.0005781025787423936, + "sample_sd": 0.023828483251562362, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.02360574735646781 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.0021062239124679527 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.023977663532708582 + } + ], + "ci95_low": -0.0597713364399857, + "ci95_high": 0.05861513128250092, + "p_raw": 0.9702995859579512, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_removed", + "endpoint": "family", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A0111", + "mean_delta": -0.007732792749970778, + "sample_sd": 0.017663146176822943, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.016038192558802122 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.012552234431543297 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.019712420122653507 + } + ], + "ci95_low": -0.05161048027762545, + "ci95_high": 0.0361448947776839, + "p_raw": 0.5274568936427116, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_removed", + "endpoint": "genus", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A0111", + "mean_delta": -0.012512676233799794, + "sample_sd": 0.018450089597469237, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.029144284932320852 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.01572717978281768 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0073334360137391474 + } + ], + "ci95_low": -0.05834523958976925, + "ci95_high": 0.03331988712216966, + "p_raw": 0.3610526032407754, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_removed", + "endpoint": "species", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A0111", + "mean_delta": -0.023315159918891604, + "sample_sd": 0.013998446663923405, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.029559119655921007 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.007281315967120949 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.033105044133632855 + } + ], + "ci95_low": -0.05808922918397711, + "ci95_high": 0.011458909346193903, + "p_raw": 0.10208968678149363, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_removed", + "endpoint": "immunogenicity", + "label": "Topology objective", + "metric": "average_precision", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A0111", + "mean_delta": -0.04023898287712746, + "sample_sd": 0.16328855247303467, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.13896550073020653 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.1806099764874971 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0790724728740918 + } + ], + "ci95_low": -0.44587023398777037, + "ci95_high": 0.36539226823351545, + "p_raw": 0.7110607978981116, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_removed", + "endpoint": "linkage", + "label": "Topology objective", + "metric": "MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A0111", + "mean_delta": -0.009852199542960571, + "sample_sd": 0.008532255091737988, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.014778025901845404 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.01477857272703631 + } + ], + "ci95_low": -0.031047496183417785, + "ci95_high": 0.011343097097496643, + "p_raw": 0.18350341921201138, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 2, + "zero_pairs": 1, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_removed", + "endpoint": "interaction", + "label": "Topology objective", + "metric": "spearman", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A0111", + "mean_delta": -0.0015578689206893574, + "sample_sd": 0.002514028033312633, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.0017435391270845535 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0010438467861091094 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.003973914421092628 + } + ], + "ci95_low": -0.007803060766873652, + "ci95_high": 0.004687322925494937, + "p_raw": 0.39545298670482365, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_removed", + "endpoint": "domain", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1011", + "mean_delta": 0.0012587986153810293, + "sample_sd": 0.004860939986759693, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.004331251760557375 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.003615371809703838 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.004492275796996625 + } + ], + "ci95_low": -0.010816445720737995, + "ci95_high": 0.013334042951500053, + "p_raw": 0.6976788996627913, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_removed", + "endpoint": "kingdom", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1011", + "mean_delta": 0.0012105453010949896, + "sample_sd": 0.0022342058770487886, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.0009585081807427231 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0010854931294433934 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0035046509545842985 + } + ], + "ci95_low": -0.004339529774104852, + "ci95_high": 0.006760620376294831, + "p_raw": 0.4470726198680872, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_removed", + "endpoint": "phylum", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1011", + "mean_delta": 0.0033491707362404144, + "sample_sd": 0.00395210491248823, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0020315069948313447 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.00022422738400351694 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.007791777829886382 + } + ], + "ci95_low": -0.006468402118034551, + "ci95_high": 0.01316674359051538, + "p_raw": 0.27986811776119047, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_removed", + "endpoint": "class", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1011", + "mean_delta": -0.0017215919916036733, + "sample_sd": 0.011776887551215793, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.012008485207954944 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.011124448423889155 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.004280739190745231 + } + ], + "ci95_low": -0.030977002485722053, + "ci95_high": 0.02753381850251471, + "p_raw": 0.8237642572341212, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_removed", + "endpoint": "order", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1011", + "mean_delta": 0.022719515960388754, + "sample_sd": 0.028630543929933753, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.009926484332981045 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.002715997644209822 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0555160659039754 + } + ], + "ci95_low": -0.04840269792655892, + "ci95_high": 0.09384172984733642, + "p_raw": 0.30304574989083877, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_removed", + "endpoint": "family", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1011", + "mean_delta": 0.03805497866054305, + "sample_sd": 0.0274577668352227, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.008055229200971015 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.06193968506288405 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.044170021717774066 + } + ], + "ci95_low": -0.03015389541784636, + "ci95_high": 0.10626385273893246, + "p_raw": 0.13840130883907356, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_removed", + "endpoint": "genus", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1011", + "mean_delta": 0.023003780911119154, + "sample_sd": 0.019380505043713785, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0010443205432862923 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.03024980636453012 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.03771721582554105 + } + ], + "ci95_low": -0.025140062542548323, + "ci95_high": 0.07114762436478664, + "p_raw": 0.17610886664006142, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_removed", + "endpoint": "species", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1011", + "mean_delta": 0.001553648100922067, + "sample_sd": 0.01220268227575962, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.012258724115510933 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.010872143277058821 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.006047525141218313 + } + ], + "ci95_low": -0.02875949512593975, + "ci95_high": 0.03186679132778389, + "p_raw": 0.845927163029122, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_removed", + "endpoint": "immunogenicity", + "label": "MS", + "metric": "average_precision", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1011", + "mean_delta": 0.08033401089899529, + "sample_sd": 0.07698964117937245, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.08434243519400475 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.15524113894220565 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.001418458560775493 + } + ], + "ci95_low": -0.11091886017600254, + "ci95_high": 0.2715868819739931, + "p_raw": 0.2124554295408359, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_removed", + "endpoint": "linkage", + "label": "MS", + "metric": "MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1011", + "mean_delta": -0.004649604237739968, + "sample_sd": 0.008004736136647502, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0006533626517790658 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.01385736004138216 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0007448153236168098 + } + ], + "ci95_low": -0.024534471148144495, + "ci95_high": 0.015235262672664559, + "p_raw": 0.4203192305904922, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_removed", + "endpoint": "interaction", + "label": "MS", + "metric": "spearman", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1011", + "mean_delta": 0.0002821231092786647, + "sample_sd": 0.0010777942202875954, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.0008518035614578645 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.00040490392548434007 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0012932689638095185 + } + ], + "ci95_low": -0.002395266158944984, + "ci95_high": 0.0029595123775023133, + "p_raw": 0.6947156461092049, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_removed", + "endpoint": "domain", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1101", + "mean_delta": -0.0028520016070300303, + "sample_sd": 0.001999063344477454, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.0051598444233064145 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.0016574550003753963 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.00173870539740828 + } + ], + "ci95_low": -0.007817950249410972, + "ci95_high": 0.002113947035350912, + "p_raw": 0.1320865036578436, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_removed", + "endpoint": "kingdom", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1101", + "mean_delta": -0.003634005338014871, + "sample_sd": 0.00323185673016606, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.005720820177136043 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 8.873050388169545e-05 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.005269926340790265 + } + ], + "ci95_low": -0.011662382520696419, + "ci95_high": 0.004394371844666678, + "p_raw": 0.1908285003103898, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_removed", + "endpoint": "phylum", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1101", + "mean_delta": 0.0016593187609296918, + "sample_sd": 0.005343969325490695, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.007671295122470556 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.002550875931611407 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.00014246290807007345 + } + ], + "ci95_low": -0.011615836971457965, + "ci95_high": 0.01493447449331735, + "p_raw": 0.644547829687443, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_removed", + "endpoint": "class", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1101", + "mean_delta": -0.015287482876142419, + "sample_sd": 0.010272296483007108, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.02560930273407147 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.005065436597488593 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.015187709296867191 + } + ], + "ci95_low": -0.04080528195682032, + "ci95_high": 0.010230316204535487, + "p_raw": 0.12328037014922652, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_removed", + "endpoint": "order", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1101", + "mean_delta": -0.004496687751057975, + "sample_sd": 0.011601010417633662, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.007130239395512938 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.008194697823246111 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.014554521680907095 + } + ], + "ci95_low": -0.033315195224994, + "ci95_high": 0.02432181972287805, + "p_raw": 0.5711455357191086, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 3, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_removed", + "endpoint": "family", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1101", + "mean_delta": -0.023359323156165884, + "sample_sd": 0.009502464512158847, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.02580249180436922 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.012873828911184937 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.03140164875294349 + } + ], + "ci95_low": -0.046964753606276624, + "ci95_high": 0.0002461072939448569, + "p_raw": 0.050979494893268695, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_removed", + "endpoint": "genus", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1101", + "mean_delta": -0.013394522853667287, + "sample_sd": 0.014090013547335616, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.02730479992164786 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.013747368014452976 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0008685993750989773 + } + ], + "ci95_low": -0.04839605686699306, + "ci95_high": 0.021607011159658483, + "p_raw": 0.24139941022476405, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_removed", + "endpoint": "species", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1101", + "mean_delta": -0.01912253076246928, + "sample_sd": 0.01653448657678643, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.008818714094190716 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.010354569560301508 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.03819430863291562 + } + ], + "ci95_low": -0.06019647241383876, + "ci95_high": 0.0219514108889002, + "p_raw": 0.18307429996274946, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_removed", + "endpoint": "immunogenicity", + "label": "Static structure", + "metric": "average_precision", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1101", + "mean_delta": 0.0074591328058245905, + "sample_sd": 0.09212040465089691, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.11259252729840963 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.05912169926552424 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.031093429615411616 + } + ], + "ci95_low": -0.22138063841777508, + "ci95_high": 0.23629890402942424, + "p_raw": 0.9013145761284655, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_removed", + "endpoint": "linkage", + "label": "Static structure", + "metric": "MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1101", + "mean_delta": 0.004085651802976413, + "sample_sd": 0.008192738611322142, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.013517764067982774 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0012608086590535361 + } + ], + "ci95_low": -0.016266239144687337, + "ci95_high": 0.024437542750640164, + "p_raw": 0.4787617978677398, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 1, + "zero_pairs": 1, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_removed", + "endpoint": "interaction", + "label": "Static structure", + "metric": "spearman", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1101", + "mean_delta": 0.0004665187749759714, + "sample_sd": 0.001722376595342326, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.000399527803613825 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0022214134861419377 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0012213849648278485 + } + ], + "ci95_low": -0.0038121018795109476, + "ci95_high": 0.00474513942946289, + "p_raw": 0.6851409352202715, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "md_removed", + "endpoint": "domain", + "label": "MD", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1110", + "mean_delta": 0.00030004848039825543, + "sample_sd": 0.006565366605732852, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.006901529542164719 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0018497416488738594 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.005951933334485626 + } + ], + "ci95_low": -0.016009226296982336, + "ci95_high": 0.01660932325777885, + "p_raw": 0.944114540370125, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "md_removed", + "endpoint": "kingdom", + "label": "MD", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1110", + "mean_delta": 0.0014164535642736305, + "sample_sd": 0.0020610284622551846, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.002860410088567966 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.000943841055964012 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0023327916602169374 + } + ], + "ci95_low": -0.0037034249639978124, + "ci95_high": 0.006536332092545073, + "p_raw": 0.3560399050418338, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "md_removed", + "endpoint": "phylum", + "label": "MD", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1110", + "mean_delta": -0.000346072945608622, + "sample_sd": 0.007241754225808548, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.001632123208689329 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.008371367385022976 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0057010253395077815 + } + ], + "ci95_low": -0.018335587717843493, + "ci95_high": 0.01764344182662625, + "p_raw": 0.9415712083119578, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "md_removed", + "endpoint": "class", + "label": "MD", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1110", + "mean_delta": -0.008824228359647615, + "sample_sd": 0.008790694929996394, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.017537523127102994 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 4.187443175851513e-05 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.008977036383598369 + } + ], + "ci95_low": -0.030661525148565336, + "ci95_high": 0.013013068429270103, + "p_raw": 0.22422545197074212, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "md_removed", + "endpoint": "order", + "label": "MD", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1110", + "mean_delta": -0.008424094006933594, + "sample_sd": 0.015245266385828847, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0011452498181141468 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.026004815749127497 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0004127160897874349 + } + ], + "ci95_low": -0.046295435163074945, + "ci95_high": 0.02944724714920776, + "p_raw": 0.43952697375436256, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "md_removed", + "endpoint": "family", + "label": "MD", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1110", + "mean_delta": -0.01169298515818625, + "sample_sd": 0.01140906839522363, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.023726076366977433 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.0010320473849945166 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.010320831722586798 + } + ], + "ci95_low": -0.040034682215765956, + "ci95_high": 0.016648711899393452, + "p_raw": 0.21786279277670925, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "md_removed", + "endpoint": "genus", + "label": "MD", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1110", + "mean_delta": -0.007756624364828509, + "sample_sd": 0.006023078371667982, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.014145467255657296 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.00218218444081264 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.006942221398015591 + } + ], + "ci95_low": -0.022718780489279406, + "ci95_high": 0.0072055317596223896, + "p_raw": 0.15544158689093104, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "md_removed", + "endpoint": "species", + "label": "MD", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1110", + "mean_delta": -0.015033574468160579, + "sample_sd": 0.01635412694840474, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.025225407725630755 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0038301440687761867 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.023705459747627167 + } + ], + "ci95_low": -0.05565947796497298, + "ci95_high": 0.02559232902865182, + "p_raw": 0.2523415987400571, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "md_removed", + "endpoint": "immunogenicity", + "label": "MD", + "metric": "average_precision", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1110", + "mean_delta": 0.0010306913181310866, + "sample_sd": 0.13565907344997286, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.1426767543695293 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.01186411888294403 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.12772056153219202 + } + ], + "ci95_low": -0.33596512899272807, + "ci95_high": 0.3380265116289903, + "p_raw": 0.9906952094931699, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "md_removed", + "endpoint": "linkage", + "label": "MD", + "metric": "MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1110", + "mean_delta": -0.00017161948618467834, + "sample_sd": 0.014521904090667507, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.014263714268482275 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.01477857272703631 + } + ], + "ci95_low": -0.036246029085589895, + "ci95_high": 0.035902790113220534, + "p_raw": 0.9855275127414121, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 1, + "zero_pairs": 1, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "md_removed", + "endpoint": "interaction", + "label": "MD", + "metric": "spearman", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1110", + "mean_delta": 0.0016821702187969079, + "sample_sd": 0.0047928520605814255, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0016832300038042425 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.006474492298998158 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.003111211646411677 + } + ], + "ci95_low": -0.01022393433218145, + "ci95_high": 0.013588274769775265, + "p_raw": 0.6050850142870892, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_full", + "endpoint": "domain", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1111-notree", + "mean_delta": -0.0020232802052971843, + "sample_sd": 0.005955712657853651, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.008755296733811702 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0001259789649502574 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.002559477152969891 + } + ], + "ci95_low": -0.016818090619576627, + "ci95_high": 0.01277153020898226, + "p_raw": 0.6158529107211148, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_full", + "endpoint": "kingdom", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1111-notree", + "mean_delta": -0.004368909408610233, + "sample_sd": 0.003396952964870973, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.0009065676524202537 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.007696461074002903 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.004503699499407543 + } + ], + "ci95_low": -0.012807408374005664, + "ci95_high": 0.004069589556785198, + "p_raw": 0.15576005682639996, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_full", + "endpoint": "phylum", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1111-notree", + "mean_delta": 0.0006414449714617169, + "sample_sd": 0.012099407919901559, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0047607646583298635 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.012979749199223733 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.01014331945527902 + } + ], + "ci95_low": -0.02941515053334672, + "ci95_high": 0.030698040476270155, + "p_raw": 0.9352071047487084, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_full", + "endpoint": "class", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1111-notree", + "mean_delta": -0.00799360991868081, + "sample_sd": 0.0047426746817564374, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.01013717410041104 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.0025575624158504784 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.011286093239780914 + } + ], + "ci95_low": -0.019775066950638548, + "ci95_high": 0.0037878471132769247, + "p_raw": 0.10003956342173975, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_full", + "endpoint": "order", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1111-notree", + "mean_delta": 0.022058519655513347, + "sample_sd": 0.012552366339228519, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0288921979344966 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.007572013330477634 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.029711347701565805 + } + ], + "ci95_low": -0.009123286940642333, + "ci95_high": 0.05324032625166902, + "p_raw": 0.09310897729155446, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_full", + "endpoint": "family", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1111-notree", + "mean_delta": 0.015207030024136517, + "sample_sd": 0.0061258187441414315, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.021774528658366377 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.014198500817937498 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.009648060596105679 + } + ], + "ci95_low": -1.0347334104548675e-05, + "ci95_high": 0.03042440738237758, + "p_raw": 0.05006304008126574, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_full", + "endpoint": "genus", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1111-notree", + "mean_delta": 0.020374115832244227, + "sample_sd": 0.007960066916793547, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.011517876857048082 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.026932479139336607 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.022671991500347988 + } + ], + "ci95_low": 0.0006002134154375477, + "ci95_high": 0.040148018249050905, + "p_raw": 0.047300030383522804, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": true, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_full", + "endpoint": "species", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1111-notree", + "mean_delta": 0.0005671448294184422, + "sample_sd": 0.008417199564367234, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.004940913751851184 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.010256245605291203 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.003613897365184693 + } + ], + "ci95_low": -0.02034233803654101, + "ci95_high": 0.021476627695377896, + "p_raw": 0.9177571346209186, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_full", + "endpoint": "immunogenicity", + "label": "Tree input embeddings", + "metric": "average_precision", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1111-notree", + "mean_delta": 0.07964264931498888, + "sample_sd": 0.16377304330969872, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.1866102818868165 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.10889691065257778 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.16121457671072792 + } + ], + "ci95_low": -0.3271921437540539, + "ci95_high": 0.4864774423840317, + "p_raw": 0.4882915981647864, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_full", + "endpoint": "linkage", + "label": "Tree input embeddings", + "metric": "MCC", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1111-notree", + "mean_delta": -0.005421060504763357, + "sample_sd": 0.009389552225155117, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.01626318151429007 + } + ], + "ci95_low": -0.02874600128459761, + "ci95_high": 0.017903880275070894, + "p_raw": 0.42264973081037427, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 1, + "zero_pairs": 2, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_full", + "endpoint": "interaction", + "label": "Tree input embeddings", + "metric": "spearman", + "comparison_group": "full_model", + "present_cell_id": "A1111", + "absent_cell_id": "A1111-notree", + "mean_delta": -6.474599521312056e-05, + "sample_sd": 0.00318438157743747, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.00022417042513422913 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.003196353325882334 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0031664208863874665 + } + ], + "ci95_low": -0.007975188360626035, + "ci95_high": 0.007845696370199795, + "p_raw": 0.9751057627189363, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_added", + "endpoint": "domain", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1000", + "absent_cell_id": "A0000", + "mean_delta": 0.0025534959545966407, + "sample_sd": 0.0016548587234775244, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0041474886723404936 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0008438398527184088 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0026691593387310197 + } + ], + "ci95_low": -0.00155740100816749, + "ci95_high": 0.006664392917360771, + "p_raw": 0.11611701515401855, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_added", + "endpoint": "kingdom", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1000", + "absent_cell_id": "A0000", + "mean_delta": -0.0011562101007594656, + "sample_sd": 0.002749415920739694, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.001575206146656516 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0017786538866714219 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.003672078042293303 + } + ], + "ci95_low": -0.007986137875012555, + "ci95_high": 0.005673717673493623, + "p_raw": 0.5421209372631371, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_added", + "endpoint": "phylum", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1000", + "absent_cell_id": "A0000", + "mean_delta": -0.004698732493310838, + "sample_sd": 0.005807612740972453, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.009941853211217988 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.005698032474413917 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0015436882056993895 + } + ], + "ci95_low": -0.01912564231894477, + "ci95_high": 0.009728177332323094, + "p_raw": 0.29613353520725283, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_added", + "endpoint": "class", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1000", + "absent_cell_id": "A0000", + "mean_delta": -0.006411315106962319, + "sample_sd": 0.013627663527329288, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.018697984106079146 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.008782176805149589 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.008246215590341777 + } + ], + "ci95_low": -0.04026430799951866, + "ci95_high": 0.02744167778559402, + "p_raw": 0.5007493234089713, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_added", + "endpoint": "order", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1000", + "absent_cell_id": "A0000", + "mean_delta": -0.010112933348141636, + "sample_sd": 0.022556611661882036, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.03558422566066477 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.007335533684458495 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0020901080682186324 + } + ], + "ci95_low": -0.06614666302883739, + "ci95_high": 0.04592079633255411, + "p_raw": 0.5186891981304709, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_added", + "endpoint": "family", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1000", + "absent_cell_id": "A0000", + "mean_delta": -0.008226786941931427, + "sample_sd": 0.00535959222087427, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.009787293164090105 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.0022601242806903343 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.01263294338101384 + } + ], + "ci95_low": -0.021540752097909614, + "ci95_high": 0.005087178214046761, + "p_raw": 0.11713376096501817, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_added", + "endpoint": "genus", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1000", + "absent_cell_id": "A0000", + "mean_delta": -0.01959921815919045, + "sample_sd": 0.005404823275641278, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.014947972775099516 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.025528526731503964 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.018321154970967868 + } + ], + "ci95_low": -0.03302554348406183, + "ci95_high": -0.006172892834319071, + "p_raw": 0.024424321149159163, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": true, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_added", + "endpoint": "species", + "label": "Topology objective", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1000", + "absent_cell_id": "A0000", + "mean_delta": -0.025166815044873486, + "sample_sd": 0.018900265178649442, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.020024210629885908 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.009370067854119202 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.04610616665061534 + } + ], + "ci95_low": -0.07211767653900387, + "ci95_high": 0.0217840464492569, + "p_raw": 0.1475071229349525, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_added", + "endpoint": "immunogenicity", + "label": "Topology objective", + "metric": "average_precision", + "comparison_group": "baseline", + "present_cell_id": "A1000", + "absent_cell_id": "A0000", + "mean_delta": 0.1381217720840551, + "sample_sd": 0.09177662527430477, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.034352339747676486 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.171381837082908 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.2086311394215808 + } + ], + "ci95_low": -0.0898640038255979, + "ci95_high": 0.3661075479937081, + "p_raw": 0.12102628380549336, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_added", + "endpoint": "linkage", + "label": "Topology objective", + "metric": "MCC", + "comparison_group": "baseline", + "present_cell_id": "A1000", + "absent_cell_id": "A0000", + "mean_delta": -0.009550744851108295, + "sample_sd": 0.021606727409097193, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.015015589606963031 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.014263714268482275 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.027900359214844128 + } + ], + "ci95_low": -0.06322483123757469, + "ci95_high": 0.044123341535358095, + "p_raw": 0.5239188309328175, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "topology_added", + "endpoint": "interaction", + "label": "Topology objective", + "metric": "spearman", + "comparison_group": "baseline", + "present_cell_id": "A1000", + "absent_cell_id": "A0000", + "mean_delta": 0.0013925931524371344, + "sample_sd": 0.0018017892200880982, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.002808177339473056 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.0006356289659916747 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0020052310838300225 + } + ], + "ci95_low": -0.003083299397977254, + "ci95_high": 0.005868485702851522, + "p_raw": 0.31255000616149387, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_added", + "endpoint": "domain", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0100", + "absent_cell_id": "A0000", + "mean_delta": 0.0031515515879993274, + "sample_sd": 0.001443241047351219, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0015573510862391116 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.004369173290056483 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0035281303877023884 + } + ], + "ci95_low": -0.0004336579250067106, + "ci95_high": 0.0067367611010053655, + "p_raw": 0.06333605161045844, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_added", + "endpoint": "kingdom", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0100", + "absent_cell_id": "A0000", + "mean_delta": 0.005065608262617223, + "sample_sd": 0.009810307895281568, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.013689113450939594 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.007115342106424505 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.005607630769512428 + } + ], + "ci95_low": -0.019304547544850236, + "ci95_high": 0.02943576407008468, + "p_raw": 0.46550863937750225, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_added", + "endpoint": "phylum", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0100", + "absent_cell_id": "A0000", + "mean_delta": 0.004866844727717294, + "sample_sd": 0.003889804328202234, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0048753564450909614 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0009727915253759933 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.008752386212684926 + } + ], + "ci95_low": -0.004795964895662928, + "ci95_high": 0.014529654351097515, + "p_raw": 0.1625455480116657, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_added", + "endpoint": "class", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0100", + "absent_cell_id": "A0000", + "mean_delta": 0.004751919447882447, + "sample_sd": 0.010265000199010528, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.0035950382978111595 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0016372949063017117 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.016213501735156788 + } + ], + "ci95_low": -0.020747754658563232, + "ci95_high": 0.030251593554328125, + "p_raw": 0.5067914375466875, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_added", + "endpoint": "order", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0100", + "absent_cell_id": "A0000", + "mean_delta": 0.010545185136012583, + "sample_sd": 0.018922494298392035, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.007955202616032109 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.02986327503060182 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.00972748299346804 + } + ], + "ci95_low": -0.03646089655277147, + "ci95_high": 0.05755126682479663, + "p_raw": 0.4362621479724107, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_added", + "endpoint": "family", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0100", + "absent_cell_id": "A0000", + "mean_delta": 0.015341176828113978, + "sample_sd": 0.016883423416028494, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.00799258110617218 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.034653524181636475 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.003377425196533279 + } + ], + "ci95_low": -0.02659957198466828, + "ci95_high": 0.057281925640896236, + "p_raw": 0.2561804748617776, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_added", + "endpoint": "genus", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0100", + "absent_cell_id": "A0000", + "mean_delta": 0.022707708405037646, + "sample_sd": 0.011570662427863306, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.028455639519334497 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.009388591104207311 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.030278894591571126 + } + ], + "ci95_low": -0.006035410483031189, + "ci95_high": 0.05145082729310648, + "p_raw": 0.07671910858560291, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_added", + "endpoint": "species", + "label": "MS", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0100", + "absent_cell_id": "A0000", + "mean_delta": 0.00440328419777893, + "sample_sd": 0.014276120687409102, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.018807612637015525 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.004143318012099162 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.009741078055777896 + } + ], + "ci95_low": -0.031060565580646776, + "ci95_high": 0.03986713397620464, + "p_raw": 0.6466167152950351, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_added", + "endpoint": "immunogenicity", + "label": "MS", + "metric": "average_precision", + "comparison_group": "baseline", + "present_cell_id": "A0100", + "absent_cell_id": "A0000", + "mean_delta": 0.12666405090218885, + "sample_sd": 0.1855649383160595, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.08711866902563237 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.22102313942633123 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.2460876823058677 + } + ], + "ci95_low": -0.33430481036469434, + "ci95_high": 0.587632912169072, + "p_raw": 0.35861175054473304, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_added", + "endpoint": "linkage", + "label": "MS", + "metric": "MCC", + "comparison_group": "baseline", + "present_cell_id": "A0100", + "absent_cell_id": "A0000", + "mean_delta": 0.00038724971572031325, + "sample_sd": 0.0007690555345274677, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.0004956251437593373 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0007459502004995011 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.000911424090420776 + } + ], + "ci95_low": -0.0015231901401015246, + "ci95_high": 0.002297689571542151, + "p_raw": 0.475086287760405, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "ms_added", + "endpoint": "interaction", + "label": "MS", + "metric": "spearman", + "comparison_group": "baseline", + "present_cell_id": "A0100", + "absent_cell_id": "A0000", + "mean_delta": 0.0022386785780846388, + "sample_sd": 0.002538712148560159, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0033737215215424166 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.004011844507660539 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0006695302949490389 + } + ], + "ci95_low": -0.004067832009669531, + "ci95_high": 0.00854518916583881, + "p_raw": 0.2662392040858807, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_added", + "endpoint": "domain", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0010", + "absent_cell_id": "A0000", + "mean_delta": 0.00021433509262580586, + "sample_sd": 0.0021894347677554934, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.0002247955522045597 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0025900538905233583 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.001722253060441381 + } + ], + "ci95_low": -0.005224522381577484, + "ci95_high": 0.005653192566829095, + "p_raw": 0.8809559780019074, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_added", + "endpoint": "kingdom", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0010", + "absent_cell_id": "A0000", + "mean_delta": 0.00023720060896048611, + "sample_sd": 0.006759083829912828, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.006475675873339193 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.001179524745548055 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0069435987920057896 + } + ], + "ci95_low": -0.016553294430439274, + "ci95_high": 0.017027695648360246, + "p_raw": 0.9570589340177735, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_added", + "endpoint": "phylum", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0010", + "absent_cell_id": "A0000", + "mean_delta": 0.00017442919614385488, + "sample_sd": 0.001988058631967304, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.0006923688325762845 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.0012330609787725155 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0024487173997803646 + } + ], + "ci95_low": -0.004764182224882625, + "ci95_high": 0.005113040617170335, + "p_raw": 0.893157860694382, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_added", + "endpoint": "class", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0010", + "absent_cell_id": "A0000", + "mean_delta": -0.007897619379557205, + "sample_sd": 0.006328300185600518, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.004744447196677215 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.015183015515823128 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0037653954261712697 + } + ], + "ci95_low": -0.02361798852247527, + "ci95_high": 0.007822749763360863, + "p_raw": 0.16318608165487208, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_added", + "endpoint": "order", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0010", + "absent_cell_id": "A0000", + "mean_delta": -0.0065145187400961575, + "sample_sd": 0.011924349748304473, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.015723730992288187 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.010774613634928376 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.006954788406928092 + } + ], + "ci95_low": -0.036136245639073854, + "ci95_high": 0.02310720815888154, + "p_raw": 0.44389850486715976, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_added", + "endpoint": "family", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0010", + "absent_cell_id": "A0000", + "mean_delta": -0.04758198194949385, + "sample_sd": 0.04576904932482681, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.08680409621909757 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.002705209072501824 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0586470587018858 + } + ], + "ci95_low": -0.16127860341253297, + "ci95_high": 0.06611463951354529, + "p_raw": 0.21355665316146202, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_added", + "endpoint": "genus", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0010", + "absent_cell_id": "A0000", + "mean_delta": -0.01877189105082966, + "sample_sd": 0.010410170275674454, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.029965070643988734 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.01697085037328433 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.009379752135215913 + } + ], + "ci95_low": -0.044632187619347445, + "ci95_high": 0.0070884055176881275, + "p_raw": 0.08903468668270781, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_added", + "endpoint": "species", + "label": "Static structure", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0010", + "absent_cell_id": "A0000", + "mean_delta": -0.011615930917954856, + "sample_sd": 0.011221045936059824, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.0018154043508511464 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.009176294259764628 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.023856094143248796 + } + ], + "ci95_low": -0.03949055429405215, + "ci95_high": 0.016258692458142432, + "p_raw": 0.21483702625314607, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 3, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_added", + "endpoint": "immunogenicity", + "label": "Static structure", + "metric": "average_precision", + "comparison_group": "baseline", + "present_cell_id": "A0010", + "absent_cell_id": "A0000", + "mean_delta": 0.03540328718968431, + "sample_sd": 0.053189672171290586, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.02394321394481258 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.011122214330798186 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.09338886195503854 + } + ], + "ci95_low": -0.09672718333162483, + "ci95_high": 0.16753375771099344, + "p_raw": 0.36814962024090286, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_added", + "endpoint": "linkage", + "label": "Static structure", + "metric": "MCC", + "comparison_group": "baseline", + "present_cell_id": "A0010", + "absent_cell_id": "A0000", + "mean_delta": -0.017492816589346944, + "sample_sd": 0.04030057409720112, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.040953854999797756 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.02904174017032768 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.04056633493857076 + } + ], + "ci95_low": -0.11760499251315774, + "ci95_high": 0.08261935933446386, + "p_raw": 0.5305960439248475, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "static_added", + "endpoint": "interaction", + "label": "Static structure", + "metric": "spearman", + "comparison_group": "baseline", + "present_cell_id": "A0010", + "absent_cell_id": "A0000", + "mean_delta": 0.0007127213092662602, + "sample_sd": 0.001602768553227935, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.0006560589636765146 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.00031836334793242105 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0024758595435428743 + } + ], + "ci95_low": -0.0032687764971645037, + "ci95_high": 0.004694219115697024, + "p_raw": 0.5217119877375856, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_base", + "endpoint": "domain", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0000", + "absent_cell_id": "A0000-notree", + "mean_delta": -0.0005993922178743801, + "sample_sd": 0.004534022500315695, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.004600153163450638 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.003729170478342758 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0026691593387310197 + } + ], + "ci95_low": -0.0118625284972567, + "ci95_high": 0.010663744061507939, + "p_raw": 0.840171609073588, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 3, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_base", + "endpoint": "kingdom", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0000", + "absent_cell_id": "A0000-notree", + "mean_delta": -0.0022257302169042723, + "sample_sd": 0.008630345854816023, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.005557466155488577 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.008693589640413002 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.007573865145188763 + } + ], + "ci95_low": -0.023664697821107163, + "ci95_high": 0.01921323738729862, + "p_raw": 0.6988104307738443, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_base", + "endpoint": "phylum", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0000", + "absent_cell_id": "A0000-notree", + "mean_delta": -0.00034773619538885914, + "sample_sd": 0.009126477795415956, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.009763898416986772 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.0028328082692411494 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0079742987339122 + } + ], + "ci95_low": -0.02301916386328627, + "ci95_high": 0.022323691472508553, + "p_raw": 0.9533856134383151, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_base", + "endpoint": "class", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0000", + "absent_cell_id": "A0000-notree", + "mean_delta": 0.005132337180871471, + "sample_sd": 0.004445558191031016, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.007784085711866728 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0076129258307476855 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0 + } + ], + "ci95_low": -0.005911041571664569, + "ci95_high": 0.01617571593340751, + "p_raw": 0.18355386373326324, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 2, + "negative_pairs": 0, + "zero_pairs": 1, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_base", + "endpoint": "order", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0000", + "absent_cell_id": "A0000-notree", + "mean_delta": -0.009019839118066622, + "sample_sd": 0.01961367666670016, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.013419184305339171 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.01758153532850859 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.02289716633103045 + } + ], + "ci95_low": -0.057742912993726365, + "ci95_high": 0.039703234757593124, + "p_raw": 0.5092559802365034, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_base", + "endpoint": "family", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0000", + "absent_cell_id": "A0000-notree", + "mean_delta": 0.017071522159563163, + "sample_sd": 0.037365166312563924, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.03688636951769442 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.026027534828154675 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.04035573178914975 + } + ], + "ci95_low": -0.07574869658679066, + "ci95_high": 0.10989174090591698, + "p_raw": 0.5116852883428318, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_base", + "endpoint": "genus", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0000", + "absent_cell_id": "A0000-notree", + "mean_delta": 0.02083663221033512, + "sample_sd": 0.008436749039473095, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.027121201288854868 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.011247885232028909 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.02414081011012159 + } + ], + "ci95_low": -0.00012141424398155048, + "ci95_high": 0.041794678664651794, + "p_raw": 0.050540832539946845, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_base", + "endpoint": "species", + "label": "Tree input embeddings", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A0000", + "absent_cell_id": "A0000-notree", + "mean_delta": 0.025464887699054712, + "sample_sd": 0.024469021981706075, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.01722436835229052 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.006179946723587015 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.052990348021286604 + } + ], + "ci95_low": -0.03531953257763511, + "ci95_high": 0.08624930797574452, + "p_raw": 0.2132427887659099, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_base", + "endpoint": "immunogenicity", + "label": "Tree input embeddings", + "metric": "average_precision", + "comparison_group": "baseline", + "present_cell_id": "A0000", + "absent_cell_id": "A0000-notree", + "mean_delta": -0.12444910272794524, + "sample_sd": 0.19664329891677926, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.08937805166415169 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.1652034172141693 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.2975219426338181 + } + ], + "ci95_low": -0.6129381373484803, + "ci95_high": 0.3640399318925899, + "p_raw": 0.38737850623905645, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_base", + "endpoint": "linkage", + "label": "Tree input embeddings", + "metric": "MCC", + "comparison_group": "baseline", + "present_cell_id": "A0000", + "absent_cell_id": "A0000-notree", + "mean_delta": -0.005499825678977295, + "sample_sd": 0.01632364913358392, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.014075494770470987 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.015748323055736035 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.013324340789275135 + } + ], + "ci95_low": -0.04605001808661872, + "ci95_high": 0.03505036672866412, + "p_raw": 0.6185539969670958, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "tree_channels_base", + "endpoint": "interaction", + "label": "Tree input embeddings", + "metric": "spearman", + "comparison_group": "baseline", + "present_cell_id": "A0000", + "absent_cell_id": "A0000-notree", + "mean_delta": 0.0004265098051432677, + "sample_sd": 0.0007421221644334716, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.00042084374703107996 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.000960817838823208 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0007395553236376751 + } + ], + "ci95_low": -0.0014170238503210298, + "ci95_high": 0.0022700434606075653, + "p_raw": 0.4244096290289336, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "three_branches_added", + "endpoint": "domain", + "label": "Topology + MS + static", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1110", + "absent_cell_id": "A0000", + "mean_delta": 2.966162974615827e-05, + "sample_sd": 0.0021101574912582126, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0015796758177355485 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0008827996922675663 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.00237349062076464 + } + ], + "ci95_low": -0.0052122601722179715, + "ci95_high": 0.005271583431710288, + "p_raw": 0.9827868077207458, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "three_branches_added", + "endpoint": "kingdom", + "label": "Topology + MS + static", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1110", + "absent_cell_id": "A0000", + "mean_delta": -0.0033134518331024245, + "sample_sd": 0.0061204222011153, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.004217879686820969 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0032088589309554605 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.008931334743441766 + } + ], + "ci95_low": -0.01851742343529869, + "ci95_high": 0.011890519769093841, + "p_raw": 0.44738956195166657, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "three_branches_added", + "endpoint": "phylum", + "label": "Topology + MS + static", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1110", + "absent_cell_id": "A0000", + "mean_delta": -0.0019328488341299188, + "sample_sd": 0.0031515682300405114, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.0054677707699245515 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.0009141384852501266 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.0005833627527849217 + } + ], + "ci95_low": -0.00976177832582222, + "ci95_high": 0.005896080657562383, + "p_raw": 0.3994204098822696, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "three_branches_added", + "endpoint": "class", + "label": "Topology + MS + static", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1110", + "absent_cell_id": "A0000", + "mean_delta": -0.0045570589320611905, + "sample_sd": 0.0042075565746329665, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.007854825099087637 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.005998011776141676 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.00018166007904574233 + } + ], + "ci95_low": -0.015009208893823067, + "ci95_high": 0.005895091029700685, + "p_raw": 0.20148791596660728, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "three_branches_added", + "endpoint": "order", + "label": "Topology + MS + static", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1110", + "absent_cell_id": "A0000", + "mean_delta": 0.012291101933005014, + "sample_sd": 0.023870794935925164, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.01499439741895603 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.029316305556726818 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.022551397661244255 + } + ], + "ci95_low": -0.04700723997901556, + "ci95_high": 0.0715894438450256, + "p_raw": 0.4665853657484348, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "three_branches_added", + "endpoint": "family", + "label": "Topology + MS + static", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1110", + "absent_cell_id": "A0000", + "mean_delta": 0.013992234185134808, + "sample_sd": 0.016144502493091403, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.02156771240296418 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.024955903757353903 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.0045469136049136605 + } + ], + "ci95_low": -0.02611293329690903, + "ci95_high": 0.05409740166717865, + "p_raw": 0.2721316143048483, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 1, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "three_branches_added", + "endpoint": "genus", + "label": "Topology + MS + static", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1110", + "absent_cell_id": "A0000", + "mean_delta": 0.01029184781301068, + "sample_sd": 0.011832113829227959, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.010922053038048829 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.0018427746162589242 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.021796265017242133 + } + ], + "ci95_low": -0.019100752361002487, + "ci95_high": 0.03968444798702385, + "p_raw": 0.270896771341871, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "three_branches_added", + "endpoint": "species", + "label": "Topology + MS + static", + "metric": "pooled_multilabel_MCC", + "comparison_group": "baseline", + "present_cell_id": "A1110", + "absent_cell_id": "A0000", + "mean_delta": -0.01258526188699255, + "sample_sd": 0.017197867254655882, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.002651503447199166 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": -0.009174257684373244 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.03123303142380357 + } + ], + "ci95_low": -0.05530713249756601, + "ci95_high": 0.030136608723580913, + "p_raw": 0.33257604110896005, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 1, + "negative_pairs": 2, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 2, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "three_branches_added", + "endpoint": "immunogenicity", + "label": "Topology + MS + static", + "metric": "average_precision", + "comparison_group": "baseline", + "present_cell_id": "A1110", + "absent_cell_id": "A0000", + "mean_delta": 0.13330527370179698, + "sample_sd": 0.1308737208679096, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.03681124159065352 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.08083184923504116 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.2822727302796963 + } + ], + "ci95_low": -0.19180307179548997, + "ci95_high": 0.45841361919908397, + "p_raw": 0.21974179635091795, + "p_holm110": 1.0, + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "three_branches_added", + "endpoint": "linkage", + "label": "Topology + MS + static", + "metric": "MCC", + "comparison_group": "baseline", + "present_cell_id": "A1110", + "absent_cell_id": "A0000", + "mean_delta": -0.00940960958886953, + "sample_sd": 0.008152728103646699, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": -0.014362226955183965 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": -0.013866601811424628 + } + ], + "ci95_low": -0.0296621089255467, + "ci95_high": 0.010842889747807638, + "p_raw": 0.1836292376941628, + "p_holm110": 1.0, + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 2, + "zero_pairs": 1, + "all_seed_pairs_same_sign": false, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + }, + { + "contrast": "three_branches_added", + "endpoint": "interaction", + "label": "Topology + MS + static", + "metric": "spearman", + "comparison_group": "baseline", + "present_cell_id": "A1110", + "absent_cell_id": "A0000", + "mean_delta": 0.0023040761363039655, + "sample_sd": 0.0011071149934325571, + "n_pairs": 3, + "paired_deltas": [ + { + "source_order": 1, + "upstream_seed": null, + "delta": 0.0035629337074201683 + }, + { + "source_order": 2, + "upstream_seed": null, + "delta": 0.0014818733368961445 + }, + { + "source_order": 3, + "upstream_seed": null, + "delta": 0.001867421364595584 + } + ], + "ci95_low": -0.0004461499702294986, + "ci95_high": 0.005054302242837429, + "p_raw": 0.0690812388724156, + "p_holm110": 1.0, + "category": "similar", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "pointwise_excludes_zero": false, + "provisional_pairing_count": 0, + "reference_run_parity": "Unestablished" + } + ], + "contrast_summary": [ + { + "contrast": "topology_removed", + "label": "Topology objective", + "category_counts": { + "higher": 0, + "similar": 3, + "lower": 8 + }, + "positive_mean_count": 0, + "all_three_positive": [], + "all_three_negative": [ + "domain", + "kingdom", + "phylum", + "species" + ], + "higher_all_three_positive_count": 0, + "lower_all_three_negative_count": 3 + }, + { + "contrast": "ms_removed", + "label": "MS", + "category_counts": { + "higher": 4, + "similar": 7, + "lower": 0 + }, + "positive_mean_count": 9, + "all_three_positive": [ + "phylum", + "order", + "family", + "genus", + "immunogenicity" + ], + "all_three_negative": [], + "higher_all_three_positive_count": 4, + "lower_all_three_negative_count": 0 + }, + { + "contrast": "static_removed", + "label": "Static structure", + "category_counts": { + "higher": 1, + "similar": 6, + "lower": 4 + }, + "positive_mean_count": 4, + "all_three_positive": [], + "all_three_negative": [ + "domain", + "class", + "family", + "species" + ], + "higher_all_three_positive_count": 0, + "lower_all_three_negative_count": 3 + }, + { + "contrast": "md_removed", + "label": "MD", + "category_counts": { + "higher": 0, + "similar": 6, + "lower": 5 + }, + "positive_mean_count": 4, + "all_three_positive": [], + "all_three_negative": [ + "family", + "genus" + ], + "higher_all_three_positive_count": 0, + "lower_all_three_negative_count": 2 + }, + { + "contrast": "tree_channels_full", + "label": "Tree input embeddings", + "category_counts": { + "higher": 4, + "similar": 5, + "lower": 2 + }, + "positive_mean_count": 6, + "all_three_positive": [ + "order", + "family", + "genus" + ], + "all_three_negative": [ + "kingdom", + "class" + ], + "higher_all_three_positive_count": 3, + "lower_all_three_negative_count": 1 + }, + { + "contrast": "topology_added", + "label": "Topology objective", + "category_counts": { + "higher": 1, + "similar": 4, + "lower": 6 + }, + "positive_mean_count": 3, + "all_three_positive": [ + "domain", + "immunogenicity" + ], + "all_three_negative": [ + "family", + "genus", + "species" + ], + "higher_all_three_positive_count": 1, + "lower_all_three_negative_count": 3 + }, + { + "contrast": "ms_added", + "label": "MS", + "category_counts": { + "higher": 5, + "similar": 6, + "lower": 0 + }, + "positive_mean_count": 11, + "all_three_positive": [ + "domain", + "phylum", + "family", + "genus" + ], + "all_three_negative": [], + "higher_all_three_positive_count": 2, + "lower_all_three_negative_count": 0 + }, + { + "contrast": "static_added", + "label": "Static structure", + "category_counts": { + "higher": 1, + "similar": 4, + "lower": 6 + }, + "positive_mean_count": 5, + "all_three_positive": [], + "all_three_negative": [ + "class", + "genus", + "species" + ], + "higher_all_three_positive_count": 0, + "lower_all_three_negative_count": 3 + }, + { + "contrast": "tree_channels_base", + "label": "Tree input embeddings", + "category_counts": { + "higher": 4, + "similar": 4, + "lower": 3 + }, + "positive_mean_count": 5, + "all_three_positive": [ + "genus", + "species" + ], + "all_three_negative": [], + "higher_all_three_positive_count": 2, + "lower_all_three_negative_count": 0 + }, + { + "contrast": "three_branches_added", + "label": "Topology + MS + static", + "category_counts": { + "higher": 4, + "similar": 5, + "lower": 2 + }, + "positive_mean_count": 6, + "all_three_positive": [ + "immunogenicity", + "interaction" + ], + "all_three_negative": [], + "higher_all_three_positive_count": 1, + "lower_all_three_negative_count": 0 + } + ], + "tokenizer": { + "endpoint_rows": [ + { + "endpoint": "domain", + "metric": "pooled_multilabel_MCC", + "mean_delta": 0.0032507760192292587, + "sample_sd": 0.002824028333469653, + "n_pairs": 3, + "paired_deltas": [ + { + "upstream_seed": 42, + "delta": 0.005297483788700985 + }, + { + "upstream_seed": 43, + "delta": 0.0044259162800456275 + }, + { + "upstream_seed": 44, + "delta": 2.8927988941163107e-05 + } + ], + "missing_seeds": [], + "category": "similar", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "bpe_paired_mean": 0.9555619796046927, + "character_paired_mean": 0.9523112035854634 + }, + { + "endpoint": "kingdom", + "metric": "pooled_multilabel_MCC", + "mean_delta": 0.0012952126698491107, + "sample_sd": 0.0044176650563725155, + "n_pairs": 3, + "paired_deltas": [ + { + "upstream_seed": 42, + "delta": -0.0032395731961185614 + }, + { + "upstream_seed": 43, + "delta": 0.005585611389443468 + }, + { + "upstream_seed": 44, + "delta": 0.0015395998162224256 + } + ], + "missing_seeds": [], + "category": "similar", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "bpe_paired_mean": 0.9098123413981193, + "character_paired_mean": 0.9085171287282702 + }, + { + "endpoint": "phylum", + "metric": "pooled_multilabel_MCC", + "mean_delta": 0.007925277366786979, + "sample_sd": 0.012181126817035166, + "n_pairs": 3, + "paired_deltas": [ + { + "upstream_seed": 42, + "delta": 0.003855463979229312 + }, + { + "upstream_seed": 43, + "delta": 0.02162025759273256 + }, + { + "upstream_seed": 44, + "delta": -0.001699889471600935 + } + ], + "missing_seeds": [], + "category": "higher", + "positive_pairs": 2, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "bpe_paired_mean": 0.8838515018068893, + "character_paired_mean": 0.8759262244401024 + }, + { + "endpoint": "class", + "metric": "pooled_multilabel_MCC", + "mean_delta": 0.06644722403803882, + "sample_sd": 0.009727823296963067, + "n_pairs": 3, + "paired_deltas": [ + { + "upstream_seed": 42, + "delta": 0.07277383716380614 + }, + { + "upstream_seed": 43, + "delta": 0.07132201556267492 + }, + { + "upstream_seed": 44, + "delta": 0.0552458193876354 + } + ], + "missing_seeds": [], + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "bpe_paired_mean": 0.7951023939242953, + "character_paired_mean": 0.7286551698862563 + }, + { + "endpoint": "order", + "metric": "pooled_multilabel_MCC", + "mean_delta": 0.07165052564319518, + "sample_sd": 0.0038321792400067014, + "n_pairs": 3, + "paired_deltas": [ + { + "upstream_seed": 42, + "delta": 0.06869623551400061 + }, + { + "upstream_seed": 43, + "delta": 0.07598069105506411 + }, + { + "upstream_seed": 44, + "delta": 0.07027465036052083 + } + ], + "missing_seeds": [], + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "bpe_paired_mean": 0.6051963004193464, + "character_paired_mean": 0.5335457747761512 + }, + { + "endpoint": "family", + "metric": "pooled_multilabel_MCC", + "mean_delta": 0.12116919615067451, + "sample_sd": 0.032181604745790834, + "n_pairs": 3, + "paired_deltas": [ + { + "upstream_seed": 42, + "delta": 0.15830334932841705 + }, + { + "upstream_seed": 43, + "delta": 0.10380490168807222 + }, + { + "upstream_seed": 44, + "delta": 0.10139933743553425 + } + ], + "missing_seeds": [], + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "bpe_paired_mean": 0.5433649376881632, + "character_paired_mean": 0.4221957415374886 + }, + { + "endpoint": "genus", + "metric": "pooled_multilabel_MCC", + "mean_delta": 0.06200596514963195, + "sample_sd": 0.031115411868163526, + "n_pairs": 3, + "paired_deltas": [ + { + "upstream_seed": 42, + "delta": 0.09509412630415692 + }, + { + "upstream_seed": 43, + "delta": 0.033335506329687514 + }, + { + "upstream_seed": 44, + "delta": 0.057588262815051416 + } + ], + "missing_seeds": [], + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "bpe_paired_mean": 0.45305892952706595, + "character_paired_mean": 0.39105296437743403 + }, + { + "endpoint": "species", + "metric": "pooled_multilabel_MCC", + "mean_delta": 0.05176142413390165, + "sample_sd": 0.02691005955514634, + "n_pairs": 3, + "paired_deltas": [ + { + "upstream_seed": 42, + "delta": 0.03342321236679563 + }, + { + "upstream_seed": 43, + "delta": 0.03920649270506488 + }, + { + "upstream_seed": 44, + "delta": 0.08265456732984444 + } + ], + "missing_seeds": [], + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "bpe_paired_mean": 0.4475489524770031, + "character_paired_mean": 0.39578752834310144 + }, + { + "endpoint": "immunogenicity", + "metric": "binary_MCC", + "mean_delta": -0.2422769731402373, + "sample_sd": 0.13006383779550088, + "n_pairs": 3, + "paired_deltas": [ + { + "upstream_seed": 42, + "delta": -0.3343979042438272 + }, + { + "upstream_seed": 43, + "delta": -0.2989389610324197 + }, + { + "upstream_seed": 44, + "delta": -0.09349405414446499 + } + ], + "missing_seeds": [], + "category": "lower", + "positive_pairs": 0, + "negative_pairs": 3, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "bpe_paired_mean": 0.5286283557118178, + "character_paired_mean": 0.770905328852055 + }, + { + "endpoint": "linkage", + "metric": "multiclass_MCC", + "mean_delta": 0.03631995977271507, + "sample_sd": 0.007230971699574292, + "n_pairs": 3, + "paired_deltas": [ + { + "upstream_seed": 42, + "delta": 0.041110854982966405 + }, + { + "upstream_seed": 43, + "delta": 0.028002312911119098 + }, + { + "upstream_seed": 44, + "delta": 0.03984671142405971 + } + ], + "missing_seeds": [], + "category": "higher", + "positive_pairs": 3, + "negative_pairs": 0, + "zero_pairs": 0, + "all_seed_pairs_same_sign": true, + "bpe_paired_mean": 0.948204273870994, + "character_paired_mean": 0.9118843140982791 + }, + { + "endpoint": "interaction", + "metric": "pearson", + "mean_delta": 0.0011283846491147581, + "sample_sd": 0.0018813955577391944, + "n_pairs": 2, + "paired_deltas": [ + { + "upstream_seed": 42, + "delta": -0.00020196290785687299 + }, + { + "upstream_seed": 43, + "delta": 0.002458732206086389 + } + ], + "missing_seeds": [ + 44 + ], + "category": "similar", + "positive_pairs": 1, + "negative_pairs": 1, + "zero_pairs": 0, + "all_seed_pairs_same_sign": false, + "bpe_paired_mean": 0.22181081691144638, + "character_paired_mean": 0.2206824322623316 + } + ], + "taxonomy8": { + "endpoint": "taxonomy8_mean", + "metric": "mean_pooled_multilabel_MCC_across_eight_ranks", + "mean_delta": 0.04818820014641343, + "sample_sd": 0.005322674600769698, + "n_pairs": 3, + "paired_deltas": [ + { + "upstream_seed": 42, + "delta": 0.05427551690612351 + }, + { + "upstream_seed": 43, + "delta": 0.04441017407534816 + }, + { + "upstream_seed": 44, + "delta": 0.045878909457768624 + } + ], + "ci95_low": 0.03496594344276853, + "ci95_high": 0.06141045685005833, + "pointwise_excludes_zero": true, + "interval_scope": "unadjusted t interval across three per-seed means, each averaged over eight taxonomy ranks; not 24 independent pairs", + "reported_prior_source": "R1_02_ABLATION_RESPONSE_DRAFT_20260911.md:215" + }, + "campaign": "separate sequence-only representation control without tree input embeddings", + "fits_present": 65, + "fits_expected": 66, + "missing": "B-bpe upstream44 / interaction", + "metric_difference_note": "immunogenicity binary MCC here vs AP in component ablation; interaction Pearson here vs Spearman in component ablation and existing tokenizer workbook/CSV", + "confounds": [ + "tokenizer vocabulary and prediction head capacity", + "sequence compression and unequal truncation", + "cross-architecture hardware pairing", + "upstream/downstream randomness yoked 1:1" + ], + "hardware_matched_taxonomy": { + "mean_delta": 0.0475353170040776, + "n": 11, + "sd": 0.04061997863771183 + }, + "hardware_mismatched_taxonomy": { + "mean_delta": 0.048740639728389906, + "n": 13, + "sd": 0.04679522368169334 + } + } +} diff --git a/releases/2026-10-02/figures/bootstrap_figure13/README.md b/releases/2026-10-02/figures/bootstrap_figure13/README.md new file mode 100644 index 0000000000000000000000000000000000000000..ee4476eaf28555667022818aa1c64e223b454e1d --- /dev/null +++ b/releases/2026-10-02/figures/bootstrap_figure13/README.md @@ -0,0 +1,17 @@ +# Supplementary Figure 13 + +Panel a shows the original doubly-cold scores for all 13 methods: 12 defined results, 21 individual fitted-model scores, seven means with sample SDs, and five single prediction sets. Protein-family nearest is undefined. Panel b shows all 34 saved BERToseBind-minus-comparator differences: 11 glycan-cold, 12 protein-cold and 11 doubly-cold, with primary test-only 95% component-bootstrap intervals. The method order is shared across panels. + +From the package root, with Python 3, NumPy, Matplotlib, Pillow and Arial available: + +```sh +python3 06_code/figures/bootstrap_figure13/build_figure13.py --out-dir 05_figures +``` + +Inputs remain adjacent to the builder under `inputs/`. If `--out-dir` is omitted, exports go beside the builder. `source_manifest.json` binds the four data files by SHA-256. Original absolute paths in that manifest record provenance only and are not read by the builder. The bootstrap JSON supplies all three regimes. The CSV inputs preserve original scores, individual fits and the separate seed-only Welch comparison. + +No inference, bootstrap resampling or statistical tests are rerun. Arithmetic assertions check stored summaries and plotted coordinates. Panel a retains original scoring rules, including the different simple-predictor denominators; panel b uses the saved common eligibility rule with fitted models fixed. Filled circles mark unadjusted intervals excluding zero. The 11 doubly-cold component-bootstrap intervals all include zero, which does not establish equivalence. The separate Welch result in the caption describes seed variation on the fixed test set. Rank-first headings are rounded resample frequencies, not posterior probabilities or hypothesis-test P values. + +The artwork is 7.0 by 6.1 inches with Arial at least 10.25 pt, equivalent to 9.52 pt when placed at 6.5 inches wide. PNG and LZW TIFF use 600 dpi; SVG text remains editable and PDF fonts are embedded. Exports include a synchronized caption, plotted-value CSV and provenance JSON. The CSV has 39 method-by-regime rows: 34 defined contrasts, three reference rows and two undefined comparisons. Columns prefixed `panel_a_` contain the original doubly-cold scores and fit values on doubly-cold rows only. + +The checked rendering used Python 3.12.12 and Matplotlib 3.8.4. The figure provenance records the actual runtime and hashes. Other renderer versions can change pixels while preserving values. Executed bootstrap sources, receipts and protocol records remain in `06_code/bertosebind_new_runs`; rebuilding the figure does not reproduce the row-level analysis. diff --git a/releases/2026-10-02/figures/bootstrap_figure13/build_figure13.py b/releases/2026-10-02/figures/bootstrap_figure13/build_figure13.py new file mode 100644 index 0000000000000000000000000000000000000000..0868c659021dab74c261a3735538abfe3937fbda --- /dev/null +++ b/releases/2026-10-02/figures/bootstrap_figure13/build_figure13.py @@ -0,0 +1,285 @@ +#!/usr/bin/env python3 +"""Supplementary Figure 13, all-regime version. Plots saved results only; no inference or resampling. + +Panel a is unchanged from submit_comm/06_code/figures/bootstrap_figure13/build_figure13.py (doubly-cold +reported scores). Panel b shows the saved primary test-only component-bootstrap differences for all +three regimes in aligned columns, so every interval cited in the Results is displayed. +Inputs are read from the adjacent inputs/ folder and checked against source_manifest.json. +Use --out-dir to choose the output folder; original source paths in the manifest are provenance only. +""" +from pathlib import Path +import argparse +import platform +import xml.etree.ElementTree as ET +import csv +import hashlib +import json +import statistics + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +from matplotlib import font_manager +from matplotlib.lines import Line2D +from matplotlib.ticker import FuncFormatter +import numpy as np + +HERE = Path(__file__).resolve().parent +INPUTS = HERE / "inputs" +SIZE = (7.0, 6.1) +CAPTION = 'Supplementary Figure 13 | BERToseBind performance and test-set uncertainty. a, Doubly-cold equal-assay macro Spearman under the original scoring rules, ordered by reported mean. Small circles show three fits (seeds 42-44); diamonds and error bars show means and sample SDs; squares show single prediction sets. BERToseBind ranked ninth among twelve defined results; protein-family nearest was undefined. Neural scores used an eligible-assay correction, whereas simple predictors retained their original denominators. GIFFLAR scored 3,533 of 3,691 doubly-cold observations after representation conversion. b, BERToseBind-minus-comparator differences in all three regimes, rescored under a common assay-eligibility rule. Circles and error bars show differences and unadjusted 95% percentile intervals from 2,000 paired resamples of glycan and protein components, with fitted models fixed. Glycan/protein component counts were 339/364, 826/216 and 173/199 for glycan-cold, protein-cold and doubly-cold, respectively. Filled circles mark intervals excluding zero; headings give the percentage of resamples in which BERToseBind ranked first. Positive differences favour BERToseBind. All eleven doubly-cold intervals include zero; this does not establish equivalence. These test-set intervals differ from seed-only Welch intervals, which excluded zero for GIFFLAR sweetnetESM on doubly-cold data (difference -0.0436; unadjusted P = 0.0021).' +INK = "#292929" +COLORS = {"BERToseBind": "#D95789", "neural": "#4A6B96", "baseline": "#648F8B"} +KEYS = { # identical to the current builder + "Affinose": ("BERToseBind", "BERToseBind"), + "LectinOracle ESM-C stock": ("LectinOracle ESM-C (primary)", "LectinOracle ESM-C\n(primary)"), + "LectinOracle ESM-C matched tuning": ("LectinOracle matched tuning", "LectinOracle ESM-C\nmatched tuning"), + "LectinOracle ESM-1b": ("LectinOracle ESM-1b", "LectinOracle ESM-1b"), + "LectinOracle flex": ("LectinOracle _flex", "LectinOracle flex"), + "GIFFLAR LGI gifflarESM": ("GIFFLAR gifflarESM", "GIFFLAR gifflarESM"), + "GIFFLAR LGI sweetnetESM": ("GIFFLAR sweetnetESM", "GIFFLAR sweetnetESM"), + "Glycan composition ridge": ("composition ridge", "Composition ridge"), + "Character 3-5-gram ridge": ("char 3-5-gram ridge", "Character 3–5-gram ridge"), + "Motif ridge (p44)": ("motif ridge (p44)", "Motif ridge"), + "Glycan size rule (BPE token count)": ("glycan-size rule (BPE tokens)", "Glycan size (BPE tokens)"), + "Nearest-neighbour glycan": ("nearest-neighbour glycan", "Nearest-neighbour glycan"), + "Protein-family nearest": ("protein-family nearest", "Protein-family nearest"), +} +REGIMES = [("glycan_cold", "Glycan-cold"), ("protein_cold", "Protein-cold"), ("doubly_cold", "Doubly-cold")] +XLIM = (-0.25, 0.36) + + +def sha(path): + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + + +def read_csv(path): + with path.open() as handle: + return list(csv.DictReader(handle)) + + +def load(): + manifest = json.loads((INPUTS / "source_manifest.json").read_text()) + for name, info in manifest.items(): + assert sha(INPUTS / name) == info["sha256"], name + summary = [r for r in read_csv(INPUTS / "review_affinose_results.csv") if r["regime"] == "doubly-cold"] + fits = [r for r in read_csv(INPUTS / "review_affinose_individual_values.csv") if r["regime"] == "doubly-cold"] + data = json.loads((INPUTS / "affinose_b4_step3_bootstrap_r2_20260927.json").read_text()) + assert data["status"] == "COMPLETE" and data["nboot"] == 2000 + assert data["gates_passed"] == data["gates_total"] == 64 + records = [] + for r in summary: + r["mean"] = float(r["mean"]) if r["mean"] else None + r["sample_sd"] = float(r["sample_sd"]) if r["sample_sd"] else None + r["n_fits"] = int(r["n_fits"]) + r["key"], r["label"] = KEYS[r["method"]] + r["points"] = [(int(p["sample"].split()[-1]), float(p["value"])) for p in fits if p["method"] == r["method"]] + if r["n_fits"] == 3: + values = [v for _, v in r["points"]] + assert [s for s, _ in r["points"]] == [42, 43, 44] + assert abs(statistics.mean(values) - r["mean"]) < 1e-15 + assert abs(statistics.stdev(values) - r["sample_sd"]) < 1e-15 + records.append(r) + records.sort(key=lambda r: r["mean"] if r["mean"] is not None else -1, reverse=True) + assert len(records) == 13 and records[8]["key"] == "BERToseBind" + return records, data["regimes"], manifest + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--out-dir", type=Path, default=HERE) + args = parser.parse_args() + out = args.out_dir.resolve() + out.mkdir(parents=True, exist_ok=True) + records, regimes, manifest = load() + for name in ["Arial.ttf", "Arial Bold.ttf"]: + font = Path("/System/Library/Fonts/Supplemental") / name + if font.exists(): + font_manager.fontManager.addfont(str(font)) + font_manager.findfont("Arial", fallback_to_default=False) + plt.rcParams.update({"font.family": "Arial", "font.size": 10.5, "text.color": INK, + "axes.labelcolor": INK, "xtick.color": INK, "ytick.color": INK, + "axes.linewidth": .7, "svg.fonttype": "none", "svg.hashsalt": "figure13-all-regimes", + "pdf.fonttype": 42, "savefig.facecolor": "white"}) + fig = plt.figure(figsize=SIZE, facecolor="white") + left, bottom, height = 2.05, .95, 4.45 + a = fig.add_axes([left / SIZE[0], bottom / SIZE[1], 1.30 / SIZE[0], height / SIZE[1]]) + cols = [fig.add_axes([(3.62 + i * 1.12) / SIZE[0], bottom / SIZE[1], 1.00 / SIZE[0], height / SIZE[1]]) + for i in range(3)] + labels = [r["label"] for r in records] + fmt = FuncFormatter(lambda v, _: "0" if abs(v) < 1e-12 else f"{v:.1f}".replace("-", "−")) + for index, ax in enumerate([a] + cols): + ax.set_ylim(12.62, -.65) + ax.set_yticks(range(13), labels if index == 0 else [""] * 13) + ax.tick_params(axis="y", length=0, pad=8, labelsize=10.5) + ax.tick_params(axis="x", length=3, pad=4, labelsize=10.25) + for side in ["top", "right", "left"]: + ax.spines[side].set_visible(False) + ax.spines["bottom"].set_color("#888888") + for y in range(13): + ax.axhline(y, color="#E8E8E8", linewidth=.45, zorder=0) + ax.axhspan(7.51, 8.49, color="#D9578912", zorder=-2) + ax.xaxis.set_major_formatter(fmt) + a.set_xlim(.045, .285) + a.set_xticks([.1, .2]) + fig.text(.12 / SIZE[0], (bottom + height + .42) / SIZE[1], "a Doubly-cold scores", + fontsize=11.5, weight="bold", ha="left", va="bottom") + a.set_xlabel("Macro Spearman", fontsize=10.5, labelpad=8) + fig.text((3.62) / SIZE[0], (bottom + height + .42) / SIZE[1], "b Test-set differences", + fontsize=11.5, weight="bold", ha="left", va="bottom") + fig.text((3.62 + 1.56) / SIZE[0], .43 / SIZE[1], "BERToseBind − comparator", fontsize=10.5, ha="center") + checks, plotted = [], [] + + # panel a: identical encoding to the current builder + for y, r in enumerate(records): + color = COLORS.get(r["key"], COLORS[r["kind"]]) + if r["mean"] is None: + a.text(.52, y, "undefined", transform=a.get_yaxis_transform(), ha="center", va="center", fontsize=10.5, + bbox={"facecolor": "white", "edgecolor": "none", "pad": 1}) + continue + if r["n_fits"] == 3: + bar = a.errorbar(r["mean"], y - .19, xerr=r["sample_sd"], fmt="D", markersize=4.8, color=color, + markeredgecolor=INK, markeredgewidth=.5, elinewidth=1, capsize=2.6, capthick=.85, zorder=4) + bar[0].set_gid(f"mean:{r['method']}") + bar[2][0].set_gid(f"sample-sd:{r['method']}") + checks.append(max(abs(bar[2][0].get_segments()[0][:, 0] - + np.array([r["mean"] - r["sample_sd"], r["mean"] + r["sample_sd"]])))) + for (seed, value), offset in zip(r["points"], [.08, .26, .44]): + dot = a.scatter([value], [y + offset], s=13, facecolor="white", edgecolor=color, linewidth=.85, zorder=5) + dot.set_gid(f"fit:{r['method']}:{seed}") + checks.append(abs(float(dot.get_offsets()[0][0]) - value)) + else: + dot = a.scatter([r["mean"]], [y], marker="s", s=24, facecolor=color, edgecolor=INK, linewidth=.55, zorder=4) + dot.set_gid(f"single-fit:{r['method']}") + checks.append(abs(float(dot.get_offsets()[0][0]) - r["mean"])) + if r["key"] == "BERToseBind": + a.get_yticklabels()[y].set_weight("bold") + + # panel b: three regimes, same rows + for ax, (rk, title) in zip(cols, REGIMES): + reg = regimes[rk] + units = reg["units"] + p1 = reg["primary_test_only"]["BERToseBind"]["p_rank1"] + ax.set_xlim(*XLIM) + ax.set_xticks([-.2, 0, .2]) + ax.axvline(0, color="#8B8B8B", linewidth=.8, zorder=1) + ax.set_title(f"{title}\nfirst in {p1:.0%}", fontsize=10.5, pad=6, linespacing=1.15) + for y, r in enumerate(records): + color = COLORS.get(r["key"], COLORS[r["kind"]]) + row = {"regime": title, "method": r["method"], "row": y, "delta": None, "ci95_low": None, + "ci95_high": None, "excludes_zero": None, "bertosebind_rank1_fraction": p1, + "glycan_components": units["glycan_components"], "protein_components": units["protein_components"], + "assays": units["assays"], "panel_a_reported_rank": None, + "panel_a_reported_mean": None, "panel_a_sample_sd": None, + "panel_a_seed_42": None, "panel_a_seed_43": None, "panel_a_seed_44": None} + if rk == "doubly_cold": + row.update(panel_a_reported_rank=y + 1 if r["mean"] is not None else None, + panel_a_reported_mean=r["mean"], panel_a_sample_sd=r["sample_sd"]) + for seed, value in r["points"]: + row[f"panel_a_seed_{seed}"] = value + if r["key"] == "BERToseBind": + ax.text(.5, y, "ref.", transform=ax.get_yaxis_transform(), ha="center", va="center", fontsize=10.25, + bbox={"facecolor": "#FCF7F9", "edgecolor": "none", "pad": 1}) + elif r["key"] not in reg["primary_test_only"]: + ax.text(.5, y, "undefined", transform=ax.get_yaxis_transform(), ha="center", va="center", + fontsize=10.25, bbox={"facecolor": "white", "edgecolor": "none", "pad": 1}) + else: + d = reg["primary_test_only"][r["key"]] + delta, (lo, hi) = d["delta_btb_minus"], d["delta_ci95"] + assert XLIM[0] < lo <= delta <= hi < XLIM[1] + excl = lo > 0 or hi < 0 + art = ax.errorbar(delta, y, xerr=[[delta - lo], [hi - delta]], fmt="o", markersize=4.4, + markerfacecolor=color if excl else "white", markeredgecolor=color, + markeredgewidth=1, ecolor=color, elinewidth=1.0, capsize=2.2, capthick=.8, zorder=4) + art[0].set_gid(f"contrast:{rk}:{r['method']}") + checks.append(max(abs(art[2][0].get_segments()[0][:, 0] - np.array([lo, hi])))) + checks.append(abs(float(art[0].get_xdata()[0]) - delta)) + row.update(delta=delta, ci95_low=lo, ci95_high=hi, excludes_zero=excl) + plotted.append(row) + + legend = [Line2D([], [], marker="o", color=COLORS["neural"], markerfacecolor="white", linestyle="none", + markersize=4, label="Individual fit"), + Line2D([], [], marker="D", color=COLORS["neural"], linewidth=1, markersize=4.7, label="Mean ± sample SD"), + Line2D([], [], marker="s", color=COLORS["baseline"], linestyle="none", markersize=4.7, + label="Single prediction set"), + Line2D([], [], marker="o", color=COLORS["neural"], markerfacecolor=COLORS["neural"], linestyle="none", + markersize=4.4, label="95% CI excludes 0")] + fig.legend(handles=legend, loc="lower center", bbox_to_anchor=(.5, .005), ncol=4, frameon=False, fontsize=10.25, + handlelength=1.2, handletextpad=.45, columnspacing=1.1) + fig.canvas.draw() + renderer = fig.canvas.get_renderer() + outside = [t.get_text() for t in fig.findobj(matplotlib.text.Text) if t.get_visible() and t.get_text() + and (lambda b: b.x0 < -.5 or b.y0 < -.5 or b.x1 > fig.bbox.width + .5 or b.y1 > fig.bbox.height + .5)( + t.get_window_extent(renderer))] + assert not outside, outside + assert max(checks) < 1e-12 + outputs = [] + for ext in ["svg", "pdf", "png", "tif"]: + path = out / f"Supplementary_Figure_13.{ext}" + kw = {"dpi": 600} + if ext == "svg": + kw["metadata"] = {"Creator": "build_figure13.py", "Date": None} + if ext == "pdf": + kw["metadata"] = {"Creator": "build_figure13.py", "CreationDate": None} + if ext == "tif": + kw["pil_kwargs"] = {"compression": "tiff_lzw"} + fig.savefig(path, **kw) + outputs.append(path) + preview = out / "Supplementary_Figure_13_preview.png" + fig.savefig(preview, dpi=180) + plt.close(fig) + outputs.append(preview) + caption = out / "Supplementary_Figure_13_caption.txt" + caption.write_text(CAPTION + "\n") + outputs.append(caption) + csvpath = out / "Supplementary_Figure_13_plotted_values.csv" + with csvpath.open("w", newline="") as handle: + writer = csv.DictWriter(handle, fieldnames=list(plotted[0])) + writer.writeheader() + writer.writerows(plotted) + outputs.append(csvpath) + tree = ET.parse(out / "Supplementary_Figure_13.svg") + gids = [el.get("id", "") for el in tree.iter()] + glyphs = {p: sum(g.startswith(p + ":") for g in gids) + for p in ["fit", "mean", "sample-sd", "single-fit", "contrast"]} + assert glyphs == {"fit": 21, "mean": 7, "sample-sd": 7, "single-fit": 5, "contrast": 34} + summary = {} + for rk, title in REGIMES: + rows = [p for p in plotted if p["regime"] == title and p["delta"] is not None] + learned = [p for p in rows if p["method"] in {"LectinOracle ESM-C stock", "LectinOracle ESM-C matched tuning", + "LectinOracle ESM-1b", "LectinOracle flex", + "GIFFLAR LGI gifflarESM", "GIFFLAR LGI sweetnetESM"}] + summary[title] = {"comparisons": len(rows), "excluding_zero": sum(p["excludes_zero"] for p in rows), + "learned_excluding_zero": sum(p["excludes_zero"] for p in learned), + "learned_comparisons": len(learned), + "bertosebind_rank1_fraction": rows[0]["bertosebind_rank1_fraction"]} + receipt = { + "schema": "supplementary_figure13_all_regimes_v2", + "status": "NUMERICAL_PASS_PENDING_VISUAL", + "builder": {"path": "06_code/figures/bootstrap_figure13/build_figure13.py", "sha256": sha(__file__)}, + "source_inputs": manifest, + "source_manifest_sha256": sha(INPUTS / "source_manifest.json"), + "source_scopes": { + "panel_a": "Original producer doubly-cold macro scores, three fitted-model points and sample SD; no common-denominator claim.", + "panel_b": "All 34 saved uniform-rule primary_test_only paired component-bootstrap contrasts; unadjusted 95% percentile intervals; fitted models fixed.", + "caption_welch": "Original GIFFLAR producer-score Welch comparison, separate from uniform-rule test-set resampling." + }, + "render": {"inches": SIZE, "dpi": 600, "font": "Arial", "minimum_font_pt": 10.25, + "minimum_font_pt_at_6_5_inches": 10.25 * 6.5 / SIZE[0], + "resolved_font": font_manager.findfont("Arial", fallback_to_default=False), + "editable_svg_text": True, "colors": COLORS, + "matplotlib": matplotlib.__version__, "python": platform.python_version()}, + "checks": {"statistics_recomputed": False, "models_run": False, "glyph_counts": glyphs, + "max_actual_artist_coordinate_error": float(max(checks)), "outside_canvas": outside, + "method_rows": 13, "defined_panel_a_scores": 12, "point_rank_bertosebind": 9, + "all_saved_intervals_visible": True}, + "regime_summary": summary, + "outputs": [{"filename": p.name, "sha256": sha(p), "bytes": p.stat().st_size} for p in outputs] + } + (out / "Supplementary_Figure_13_source_provenance.json").write_text(json.dumps(receipt, indent=2) + "\n") + print(json.dumps(summary, indent=1)) + + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/figures/bootstrap_figure13/inputs/affinose_b4_step3_bootstrap_r2_20260927.json b/releases/2026-10-02/figures/bootstrap_figure13/inputs/affinose_b4_step3_bootstrap_r2_20260927.json new file mode 100644 index 0000000000000000000000000000000000000000..0549dd59a3c2346d5b9462bdee2ea290ffcbc026 --- /dev/null +++ b/releases/2026-10-02/figures/bootstrap_figure13/inputs/affinose_b4_step3_bootstrap_r2_20260927.json @@ -0,0 +1,2207 @@ +{ + "schema": "affinose_b4_step3_v1", + "nboot": 2000, + "rng_seed": 20260926, + "gates": [ + { + "source": "LectinOracle ESM-C (primary) mtA_glycans42", + "recomputed": 0.29461295940901033, + "recorded": 0.2946, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtA_glycans43", + "recomputed": 0.2998599927845876, + "recorded": 0.2999, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtA_glycans44", + "recomputed": 0.2874261831082949, + "recorded": 0.2874, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prA_glycans42", + "recomputed": 0.3109242356511057, + "recorded": 0.3109, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prA_glycans43", + "recomputed": 0.2859891382180945, + "recorded": 0.286, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prA_glycans44", + "recomputed": 0.27994371513069394, + "recorded": 0.2799, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtA_glycans42", + "recomputed": 0.3150591754340759, + "recorded": 0.3151, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtA_glycans43", + "recomputed": 0.29880716777597094, + "recorded": 0.2988, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtA_glycans44", + "recomputed": 0.30650514393864015, + "recorded": 0.3065, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtA_glycans42", + "recomputed": 0.2941697165690018, + "recorded": 0.2942, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtA_glycans43", + "recomputed": 0.3126936790919916, + "recorded": 0.3127, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtA_glycans44", + "recomputed": 0.3047421415200463, + "recorded": 0.3047, + "pass": true, + "note": "" + }, + { + "source": "GIFFLAR gifflarESM A_glycan s42", + "recomputed": 0.237647, + "recorded": 0.237639, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM A_glycan s43", + "recomputed": 0.252075, + "recorded": 0.252077, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM A_glycan s44", + "recomputed": 0.275436, + "recorded": 0.275437, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM A_glycan s42", + "recomputed": 0.243723, + "recorded": 0.243723, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM A_glycan s43", + "recomputed": 0.292708, + "recorded": 0.292708, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM A_glycan s44", + "recomputed": 0.261029, + "recorded": 0.261029, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "composition ridge A_glycan", + "recomputed": 0.26748645613198063, + "recorded": 0.2675, + "pass": true, + "note": "" + }, + { + "source": "char 3-5-gram ridge A_glycan", + "recomputed": 0.21347663480166548, + "recorded": 0.2135, + "pass": true, + "note": "" + }, + { + "source": "nearest-neighbour glycan A_glycan", + "recomputed": 0.15856447405803167, + "recorded": 0.1586, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtB_proteins42", + "recomputed": 0.21990459487526257, + "recorded": 0.2199, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtB_proteins43", + "recomputed": 0.2153987341851486, + "recorded": 0.2154, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtB_proteins44", + "recomputed": 0.21379382359524457, + "recorded": 0.2138, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prB_proteins42", + "recomputed": 0.1803915270395587, + "recorded": 0.1804, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prB_proteins43", + "recomputed": 0.18271729614940446, + "recorded": 0.1827, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prB_proteins44", + "recomputed": 0.18978275814579412, + "recorded": 0.1898, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtB_proteins42", + "recomputed": 0.2337321131085862, + "recorded": 0.2337, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtB_proteins43", + "recomputed": 0.22020818751550644, + "recorded": 0.2202, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtB_proteins44", + "recomputed": 0.2175754991912383, + "recorded": 0.2176, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtB_proteins42", + "recomputed": 0.2154870719127689, + "recorded": 0.2155, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtB_proteins43", + "recomputed": 0.21589875483600227, + "recorded": 0.2159, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtB_proteins44", + "recomputed": 0.2187970453216688, + "recorded": 0.2188, + "pass": true, + "note": "" + }, + { + "source": "GIFFLAR gifflarESM B_protein s42", + "recomputed": 0.210711, + "recorded": 0.21041, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM B_protein s43", + "recomputed": 0.204525, + "recorded": 0.20452, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM B_protein s44", + "recomputed": 0.207363, + "recorded": 0.207397, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM B_protein s42", + "recomputed": 0.175404, + "recorded": 0.175404, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM B_protein s43", + "recomputed": 0.178854, + "recorded": 0.178855, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM B_protein s44", + "recomputed": 0.17515, + "recorded": 0.175171, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "composition ridge B_protein", + "recomputed": 0.12655514259910874, + "recorded": 0.1266, + "pass": true, + "note": "" + }, + { + "source": "char 3-5-gram ridge B_protein", + "recomputed": 0.160992079254801, + "recorded": 0.161, + "pass": true, + "note": "" + }, + { + "source": "nearest-neighbour glycan B_protein", + "recomputed": 0.18859122852967236, + "recorded": 0.1886, + "pass": true, + "note": "" + }, + { + "source": "protein-family nearest B_protein", + "recomputed": 0.1510829012726471, + "recorded": 0.1511, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtC_doublys42", + "recomputed": 0.1701223415454592, + "recorded": 0.1701, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtC_doublys43", + "recomputed": 0.19716032050198853, + "recorded": 0.1972, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-C (primary) mtC_doublys44", + "recomputed": 0.19949404913719423, + "recorded": 0.1995, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prC_doublys42", + "recomputed": 0.17876515213936092, + "recorded": 0.1788, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prC_doublys43", + "recomputed": 0.19308595684499813, + "recorded": 0.1931, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle _flex prC_doublys44", + "recomputed": 0.12590420915620712, + "recorded": 0.1259, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtC_doublys42", + "recomputed": 0.2184879902331782, + "recorded": 0.2185, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtC_doublys43", + "recomputed": 0.18003134941992985, + "recorded": 0.18, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle ESM-1b mtC_doublys44", + "recomputed": 0.2204627061059322, + "recorded": 0.2205, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtC_doublys42", + "recomputed": 0.19473326628891705, + "recorded": 0.1947, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtC_doublys43", + "recomputed": 0.20377865532401557, + "recorded": 0.2038, + "pass": true, + "note": "" + }, + { + "source": "LectinOracle matched tuning mtC_doublys44", + "recomputed": 0.18458485873840258, + "recorded": 0.1846, + "pass": true, + "note": "" + }, + { + "source": "GIFFLAR gifflarESM C_doubly s42", + "recomputed": 0.119211, + "recorded": 0.119211, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM C_doubly s43", + "recomputed": 0.187401, + "recorded": 0.187401, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR gifflarESM C_doubly s44", + "recomputed": 0.187003, + "recorded": 0.187003, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM C_doubly s42", + "recomputed": 0.224931, + "recorded": 0.224931, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM C_doubly s43", + "recomputed": 0.227939, + "recorded": 0.227939, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "GIFFLAR sweetnetESM C_doubly s44", + "recomputed": 0.213571, + "recorded": 0.213571, + "pass": true, + "note": "same checkpoint re-scored; pooled_reproduces_gifflar=True" + }, + { + "source": "composition ridge C_doubly", + "recomputed": 0.24210410559558812, + "recorded": 0.2421, + "pass": true, + "note": "" + }, + { + "source": "char 3-5-gram ridge C_doubly", + "recomputed": 0.2495819624028953, + "recorded": 0.2496, + "pass": true, + "note": "" + }, + { + "source": "nearest-neighbour glycan C_doubly", + "recomputed": 0.09632788784547304, + "recorded": 0.0963, + "pass": true, + "note": "" + } + ], + "gates_passed": 64, + "gates_total": 64, + "regimes": { + "glycan_cold": { + "units": { + "glycan_components": 339, + "protein_components": 364, + "assays": 1767 + }, + "point_#4_rule": { + "BERToseBind": 0.3293033324285421, + "LectinOracle ESM-C (primary)": 0.2853154154013858, + "LectinOracle _flex": 0.28368419310221066, + "LectinOracle ESM-1b": 0.297762139305791, + "LectinOracle matched tuning": 0.29492614530569383, + "GIFFLAR gifflarESM": 0.25505273565629216, + "GIFFLAR sweetnetESM": 0.2658198702099431, + "composition ridge": 0.2674864561319807, + "char 3-5-gram ridge": 0.21347663480166548, + "nearest-neighbour glycan": 0.15856447405803165, + "motif ridge (p44)": 0.2230309186548315, + "glycan-size rule (BPE tokens)": 0.2449266100013241 + }, + "per_seed_#4_rule": { + "BERToseBind": [ + 0.33405850648525903, + 0.318371586837939, + 0.3354799039624282 + ], + "LectinOracle ESM-C (primary)": [ + 0.28594296852657203, + 0.2910355900540847, + 0.2789676876235007 + ], + "LectinOracle _flex": [ + 0.3017742298481303, + 0.27757293267913535, + 0.2717054167793662 + ], + "LectinOracle ESM-1b": [ + 0.3057874849289418, + 0.2900137480111999, + 0.29748518497723136 + ], + "LectinOracle matched tuning": [ + 0.28551276961847094, + 0.3034916013824366, + 0.295774064916174 + ], + "GIFFLAR gifflarESM": [ + 0.2376472549518116, + 0.2520752003987527, + 0.27543575161831213 + ], + "GIFFLAR sweetnetESM": [ + 0.24372274134791053, + 0.29270779270966824, + 0.2610290765722505 + ], + "composition ridge": [ + 0.2674864561319807 + ], + "char 3-5-gram ridge": [ + 0.21347663480166548 + ], + "nearest-neighbour glycan": [ + 0.15856447405803165 + ], + "motif ridge (p44)": [ + 0.2230309186548315 + ], + "glycan-size rule (BPE tokens)": [ + 0.2449266100013241 + ] + }, + "primary_test_only": { + "BERToseBind": { + "score_ci95": [ + 0.2554688030781091, + 0.3889963902571539 + ], + "rank_median": 1.0, + "rank_ci95": [ + 1.0, + 8.0 + ], + "p_rank1": 0.608 + }, + "LectinOracle ESM-C (primary)": { + "score_ci95": [ + 0.22623506775544625, + 0.35847811597714097 + ], + "rank_median": 5.0, + "rank_ci95": [ + 3.0, + 9.0 + ], + "p_rank1": 0.0015, + "delta_btb_minus": 0.04398791702715632, + "delta_ci95": [ + -0.03178395437687447, + 0.08903637793981824 + ], + "p_btb_better": 0.834 + }, + "LectinOracle _flex": { + "score_ci95": [ + 0.2237543329575964, + 0.354961396131035 + ], + "rank_median": 5.0, + "rank_ci95": [ + 2.0, + 10.0 + ], + "p_rank1": 0.0105, + "delta_btb_minus": 0.04561913932633144, + "delta_ci95": [ + -0.02643513264537863, + 0.08875646067570539 + ], + "p_btb_better": 0.863 + }, + "LectinOracle ESM-1b": { + "score_ci95": [ + 0.23572246300992017, + 0.3684531988306366 + ], + "rank_median": 3.0, + "rank_ci95": [ + 1.0, + 7.0 + ], + "p_rank1": 0.1135, + "delta_btb_minus": 0.03154119312275111, + "delta_ci95": [ + -0.04474364837693402, + 0.07889577185085227 + ], + "p_btb_better": 0.7325 + }, + "LectinOracle matched tuning": { + "score_ci95": [ + 0.2316612263454309, + 0.37011610040682796 + ], + "rank_median": 3.0, + "rank_ci95": [ + 1.0, + 8.0 + ], + "p_rank1": 0.117, + "delta_btb_minus": 0.03437718712284826, + "delta_ci95": [ + -0.042717821187179685, + 0.07915154676646698 + ], + "p_btb_better": 0.727 + }, + "GIFFLAR gifflarESM": { + "score_ci95": [ + 0.1987857297519285, + 0.3465440698090343 + ], + "rank_median": 7.0, + "rank_ci95": [ + 2.0, + 10.0 + ], + "p_rank1": 0.0135, + "delta_btb_minus": 0.07425059677224993, + "delta_ci95": [ + -0.01700157149057998, + 0.11520266898013086 + ], + "p_btb_better": 0.9205 + }, + "GIFFLAR sweetnetESM": { + "score_ci95": [ + 0.21379486274553441, + 0.3410578126235054 + ], + "rank_median": 7.0, + "rank_ci95": [ + 2.0, + 11.0 + ], + "p_rank1": 0.0095, + "delta_btb_minus": 0.06348346221859902, + "delta_ci95": [ + -0.025408699327114283, + 0.10800418302979356 + ], + "p_btb_better": 0.912 + }, + "composition ridge": { + "score_ci95": [ + 0.18922176785192266, + 0.3588153496773146 + ], + "rank_median": 7.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.092, + "delta_btb_minus": 0.06181687629656141, + "delta_ci95": [ + -0.04269882084854056, + 0.12711949645561946 + ], + "p_btb_better": 0.838 + }, + "char 3-5-gram ridge": { + "score_ci95": [ + 0.14034243373957977, + 0.3285541954265566 + ], + "rank_median": 10.0, + "rank_ci95": [ + 3.0, + 12.0 + ], + "p_rank1": 0.006, + "delta_btb_minus": 0.11582669762687661, + "delta_ci95": [ + -0.007952965697240341, + 0.1775451913956852 + ], + "p_btb_better": 0.967 + }, + "nearest-neighbour glycan": { + "score_ci95": [ + 0.0545735243642953, + 0.2553687960872403 + ], + "rank_median": 12.0, + "rank_ci95": [ + 10.0, + 12.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.17073885837051045, + "delta_ci95": [ + 0.06737660452222888, + 0.27108565365186427 + ], + "p_btb_better": 1.0 + }, + "motif ridge (p44)": { + "score_ci95": [ + 0.1551500648469665, + 0.308485567750794 + ], + "rank_median": 10.0, + "rank_ci95": [ + 6.0, + 12.0 + ], + "p_rank1": 0.0005, + "delta_btb_minus": 0.1062724137737106, + "delta_ci95": [ + 0.011693774963207719, + 0.16657081949941016 + ], + "p_btb_better": 0.9855 + }, + "glycan-size rule (BPE tokens)": { + "score_ci95": [ + 0.16625436287204828, + 0.34557862026746927 + ], + "rank_median": 9.0, + "rank_ci95": [ + 1.0, + 12.0 + ], + "p_rank1": 0.028, + "delta_btb_minus": 0.084376722427218, + "delta_ci95": [ + -0.02461685006138715, + 0.15459768177292643 + ], + "p_btb_better": 0.9205 + } + }, + "secondary_test_plus_seed": { + "BERToseBind": { + "score_ci95": [ + 0.25347868151198766, + 0.38880294680559396 + ], + "rank_median": 1.0, + "rank_ci95": [ + 1.0, + 8.0 + ], + "p_rank1": 0.5735 + }, + "LectinOracle ESM-C (primary)": { + "score_ci95": [ + 0.22461627290585706, + 0.35961154287997854 + ], + "rank_median": 5.0, + "rank_ci95": [ + 2.0, + 9.0 + ], + "p_rank1": 0.0045, + "delta_btb_minus": 0.04398791702715632, + "delta_ci95": [ + -0.03375695150317954, + 0.09207675159628773 + ], + "p_btb_better": 0.8245 + }, + "LectinOracle _flex": { + "score_ci95": [ + 0.22230135714522106, + 0.36176997455022886 + ], + "rank_median": 5.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.026, + "delta_btb_minus": 0.04561913932633144, + "delta_ci95": [ + -0.03182701201797303, + 0.09411096758869278 + ], + "p_btb_better": 0.8455 + }, + "LectinOracle ESM-1b": { + "score_ci95": [ + 0.23457407744378792, + 0.37248367163755863 + ], + "rank_median": 3.0, + "rank_ci95": [ + 1.0, + 8.0 + ], + "p_rank1": 0.1125, + "delta_btb_minus": 0.03154119312275111, + "delta_ci95": [ + -0.0458036347010033, + 0.08330637740352137 + ], + "p_btb_better": 0.72 + }, + "LectinOracle matched tuning": { + "score_ci95": [ + 0.2301891940522413, + 0.3701510269156564 + ], + "rank_median": 3.0, + "rank_ci95": [ + 1.0, + 8.0 + ], + "p_rank1": 0.1215, + "delta_btb_minus": 0.03437718712284826, + "delta_ci95": [ + -0.044120366124002754, + 0.08104780952117469 + ], + "p_btb_better": 0.713 + }, + "GIFFLAR gifflarESM": { + "score_ci95": [ + 0.19392815723053966, + 0.3532289545178834 + ], + "rank_median": 7.0, + "rank_ci95": [ + 2.0, + 11.0 + ], + "p_rank1": 0.02, + "delta_btb_minus": 0.07425059677224993, + "delta_ci95": [ + -0.021931255397935723, + 0.1213752523599596 + ], + "p_btb_better": 0.8985 + }, + "GIFFLAR sweetnetESM": { + "score_ci95": [ + 0.20700049743600124, + 0.3469943933201588 + ], + "rank_median": 7.0, + "rank_ci95": [ + 1.9750000000000014, + 11.0 + ], + "p_rank1": 0.025, + "delta_btb_minus": 0.06348346221859902, + "delta_ci95": [ + -0.030560824659069938, + 0.11664772319713455 + ], + "p_btb_better": 0.8945 + }, + "composition ridge": { + "score_ci95": [ + 0.18922176785192266, + 0.3588153496773146 + ], + "rank_median": 7.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.0845, + "delta_btb_minus": 0.06181687629656141, + "delta_ci95": [ + -0.04388294968767785, + 0.12952306579877298 + ], + "p_btb_better": 0.8385 + }, + "char 3-5-gram ridge": { + "score_ci95": [ + 0.14034243373957977, + 0.3285541954265566 + ], + "rank_median": 10.0, + "rank_ci95": [ + 3.0, + 12.0 + ], + "p_rank1": 0.0055, + "delta_btb_minus": 0.11582669762687661, + "delta_ci95": [ + -0.006114233373329367, + 0.17996678225107984 + ], + "p_btb_better": 0.967 + }, + "nearest-neighbour glycan": { + "score_ci95": [ + 0.0545735243642953, + 0.2553687960872403 + ], + "rank_median": 12.0, + "rank_ci95": [ + 10.0, + 12.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.17073885837051045, + "delta_ci95": [ + 0.06957370622304927, + 0.27173969770371004 + ], + "p_btb_better": 1.0 + }, + "motif ridge (p44)": { + "score_ci95": [ + 0.1551500648469665, + 0.308485567750794 + ], + "rank_median": 10.0, + "rank_ci95": [ + 7.0, + 12.0 + ], + "p_rank1": 0.0005, + "delta_btb_minus": 0.1062724137737106, + "delta_ci95": [ + 0.011516542067665017, + 0.16790726695327865 + ], + "p_btb_better": 0.9875 + }, + "glycan-size rule (BPE tokens)": { + "score_ci95": [ + 0.16625436287204828, + 0.34557862026746927 + ], + "rank_median": 8.0, + "rank_ci95": [ + 1.0, + 12.0 + ], + "p_rank1": 0.0265, + "delta_btb_minus": 0.084376722427218, + "delta_ci95": [ + -0.026263927559185087, + 0.15709512713171556 + ], + "p_btb_better": 0.9205 + } + }, + "welch_seed_only": { + "LectinOracle ESM-C (primary)": { + "delta": 0.04398791702715632, + "ci95": [ + 0.024598559208070185, + 0.06337727484624245 + ], + "p": 0.004398400077247011 + }, + "LectinOracle _flex": { + "delta": 0.04561913932633144, + "ci95": [ + 0.013022022915174014, + 0.07821625573748886 + ], + "p": 0.02005263462413165 + }, + "LectinOracle ESM-1b": { + "delta": 0.03154119312275111, + "ci95": [ + 0.011488991968660586, + 0.051593394276841634 + ], + "p": 0.012340735251811896 + }, + "LectinOracle matched tuning": { + "delta": 0.03437718712284826, + "ci95": [ + 0.013364274854223302, + 0.05539009939147323 + ], + "p": 0.010505513932187016 + }, + "GIFFLAR gifflarESM": { + "delta": 0.07425059677224993, + "ci95": [ + 0.034608253562014246, + 0.11389293998248562 + ], + "p": 0.009709116736489332 + }, + "GIFFLAR sweetnetESM": { + "delta": 0.06348346221859902, + "ci95": [ + 0.009682693505285361, + 0.11728423093191268 + ], + "p": 0.034370527808528895 + } + }, + "pooled_E4": { + "point": { + "BERToseBind": 0.352423627827634, + "LectinOracle ESM-C (primary)": 0.3408005508825944 + }, + "ci95": { + "BERToseBind": [ + 0.2809791531735357, + 0.4198719821256602 + ], + "LectinOracle ESM-C (primary)": [ + 0.26727027961583627, + 0.4054770689026824 + ] + }, + "delta_btb_minus_lo": 0.011623076945039557, + "delta_ci95": [ + -0.0429587028976285, + 0.06873342208019707 + ], + "p_btb_better": 0.682 + } + }, + "protein_cold": { + "units": { + "glycan_components": 826, + "protein_components": 216, + "assays": 246 + }, + "point_#4_rule": { + "BERToseBind": 0.24087415343191254, + "LectinOracle ESM-C (primary)": 0.21636571755188524, + "LectinOracle _flex": 0.1842971937782524, + "LectinOracle ESM-1b": 0.22383859993844366, + "LectinOracle matched tuning": 0.21672762402347998, + "GIFFLAR gifflarESM": 0.20753304313957813, + "GIFFLAR sweetnetESM": 0.17646909258858567, + "composition ridge": 0.12655514259910874, + "char 3-5-gram ridge": 0.16099207925480097, + "nearest-neighbour glycan": 0.1885912285296723, + "protein-family nearest": 0.1510829012726471, + "motif ridge (p44)": 0.07411945343032166, + "glycan-size rule (BPE tokens)": -0.014709395191754895 + }, + "per_seed_#4_rule": { + "BERToseBind": [ + 0.23260289913763402, + 0.24512556467979305, + 0.24489399647831056 + ], + "LectinOracle ESM-C (primary)": [ + 0.21990459487526254, + 0.2153987341851486, + 0.21379382359524454 + ], + "LectinOracle _flex": [ + 0.18039152703955869, + 0.18271729614940446, + 0.18978275814579412 + ], + "LectinOracle ESM-1b": [ + 0.2337321131085862, + 0.22020818751550642, + 0.2175754991912383 + ], + "LectinOracle matched tuning": [ + 0.21548707191276883, + 0.21589875483600227, + 0.2187970453216688 + ], + "GIFFLAR gifflarESM": [ + 0.21071117805914696, + 0.20452460419269286, + 0.20736334716689458 + ], + "GIFFLAR sweetnetESM": [ + 0.17540362192512995, + 0.17885413788754334, + 0.1751495179530837 + ], + "composition ridge": [ + 0.12655514259910874 + ], + "char 3-5-gram ridge": [ + 0.16099207925480097 + ], + "nearest-neighbour glycan": [ + 0.1885912285296723 + ], + "protein-family nearest": [ + 0.1510829012726471 + ], + "motif ridge (p44)": [ + 0.07411945343032166 + ], + "glycan-size rule (BPE tokens)": [ + -0.014709395191754895 + ] + }, + "primary_test_only": { + "BERToseBind": { + "score_ci95": [ + 0.19990186950566438, + 0.2809251377652073 + ], + "rank_median": 1.0, + "rank_ci95": [ + 1.0, + 3.0 + ], + "p_rank1": 0.892 + }, + "LectinOracle ESM-C (primary)": { + "score_ci95": [ + 0.1769518194175074, + 0.25537706527593684 + ], + "rank_median": 4.0, + "rank_ci95": [ + 2.0, + 6.0 + ], + "p_rank1": 0.0105, + "delta_btb_minus": 0.024508435880027296, + "delta_ci95": [ + -0.0033261547942619123, + 0.048983628199518764 + ], + "p_btb_better": 0.96 + }, + "LectinOracle _flex": { + "score_ci95": [ + 0.14370658545017348, + 0.22458058723529778 + ], + "rank_median": 7.0, + "rank_ci95": [ + 5.0, + 9.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.056576959653660136, + "delta_ci95": [ + 0.023026786546039353, + 0.08870620710109084 + ], + "p_btb_better": 0.9995 + }, + "LectinOracle ESM-1b": { + "score_ci95": [ + 0.18593877623029764, + 0.261610488858604 + ], + "rank_median": 2.0, + "rank_ci95": [ + 1.0, + 5.0 + ], + "p_rank1": 0.088, + "delta_btb_minus": 0.017035553493468886, + "delta_ci95": [ + -0.011095550438623382, + 0.04288506701379807 + ], + "p_btb_better": 0.904 + }, + "LectinOracle matched tuning": { + "score_ci95": [ + 0.17847029380890223, + 0.2540055177699127 + ], + "rank_median": 4.0, + "rank_ci95": [ + 2.0, + 5.0 + ], + "p_rank1": 0.006, + "delta_btb_minus": 0.024146529408432565, + "delta_ci95": [ + -0.0006049275359731744, + 0.04768812060615063 + ], + "p_btb_better": 0.9725 + }, + "GIFFLAR gifflarESM": { + "score_ci95": [ + 0.1690119926395548, + 0.2496268085807646 + ], + "rank_median": 5.0, + "rank_ci95": [ + 2.0, + 7.0 + ], + "p_rank1": 0.0025, + "delta_btb_minus": 0.033341110292334414, + "delta_ci95": [ + 0.008160737841985129, + 0.059409349015113334 + ], + "p_btb_better": 0.9945 + }, + "GIFFLAR sweetnetESM": { + "score_ci95": [ + 0.14284280581539216, + 0.21056522725098895 + ], + "rank_median": 8.0, + "rank_ci95": [ + 6.0, + 9.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.06440506084332687, + "delta_ci95": [ + 0.03360626578639135, + 0.09371721998689221 + ], + "p_btb_better": 1.0 + }, + "composition ridge": { + "score_ci95": [ + 0.08060570302272095, + 0.17253774701907162 + ], + "rank_median": 11.0, + "rank_ci95": [ + 10.0, + 12.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.1143190108328038, + "delta_ci95": [ + 0.0710542106393962, + 0.16060914157920583 + ], + "p_btb_better": 1.0 + }, + "char 3-5-gram ridge": { + "score_ci95": [ + 0.12095377224079984, + 0.2032899675702806 + ], + "rank_median": 9.0, + "rank_ci95": [ + 7.0, + 11.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.07988207417711157, + "delta_ci95": [ + 0.04192269182893507, + 0.11527601656070136 + ], + "p_btb_better": 1.0 + }, + "nearest-neighbour glycan": { + "score_ci95": [ + 0.14294992756613306, + 0.22833055643994993 + ], + "rank_median": 7.0, + "rank_ci95": [ + 3.0, + 9.0 + ], + "p_rank1": 0.001, + "delta_btb_minus": 0.052282924902240235, + "delta_ci95": [ + 0.01873960177852268, + 0.09084806127386198 + ], + "p_btb_better": 0.998 + }, + "protein-family nearest": { + "score_ci95": [ + 0.10662851372581617, + 0.19133591197239094 + ], + "rank_median": 10.0, + "rank_ci95": [ + 6.0, + 11.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.08979125215926545, + "delta_ci95": [ + 0.04879649199031761, + 0.1331543030983215 + ], + "p_btb_better": 1.0 + }, + "motif ridge (p44)": { + "score_ci95": [ + 0.028821993538636938, + 0.11605372140127032 + ], + "rank_median": 12.0, + "rank_ci95": [ + 11.0, + 12.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.16675470000159087, + "delta_ci95": [ + 0.11841299132174923, + 0.2179193631634287 + ], + "p_btb_better": 1.0 + }, + "glycan-size rule (BPE tokens)": { + "score_ci95": [ + -0.06018587225264553, + 0.028553507790947796 + ], + "rank_median": 13.0, + "rank_ci95": [ + 13.0, + 13.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.25558354862366744, + "delta_ci95": [ + 0.20033347452303485, + 0.3185854807420734 + ], + "p_btb_better": 1.0 + } + }, + "secondary_test_plus_seed": { + "BERToseBind": { + "score_ci95": [ + 0.19901618124854453, + 0.28126466592414734 + ], + "rank_median": 1.0, + "rank_ci95": [ + 1.0, + 4.0 + ], + "p_rank1": 0.8345 + }, + "LectinOracle ESM-C (primary)": { + "score_ci95": [ + 0.17781070310160602, + 0.2548269942294191 + ], + "rank_median": 4.0, + "rank_ci95": [ + 1.0, + 6.0 + ], + "p_rank1": 0.0255, + "delta_btb_minus": 0.024508435880027296, + "delta_ci95": [ + -0.008606789419618966, + 0.053187208992192245 + ], + "p_btb_better": 0.9335 + }, + "LectinOracle _flex": { + "score_ci95": [ + 0.1430008365664705, + 0.2246820562770138 + ], + "rank_median": 7.0, + "rank_ci95": [ + 5.0, + 9.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.056576959653660136, + "delta_ci95": [ + 0.01913565602863821, + 0.09370660679451114 + ], + "p_btb_better": 0.999 + }, + "LectinOracle ESM-1b": { + "score_ci95": [ + 0.18548899394664478, + 0.2644896712084594 + ], + "rank_median": 2.0, + "rank_ci95": [ + 1.0, + 5.0 + ], + "p_rank1": 0.1185, + "delta_btb_minus": 0.017035553493468886, + "delta_ci95": [ + -0.014902296745193477, + 0.04794088595457959 + ], + "p_btb_better": 0.8655 + }, + "LectinOracle matched tuning": { + "score_ci95": [ + 0.17830869690999498, + 0.25575174316481347 + ], + "rank_median": 4.0, + "rank_ci95": [ + 2.0, + 6.0 + ], + "p_rank1": 0.0135, + "delta_btb_minus": 0.024146529408432565, + "delta_ci95": [ + -0.0060759103490305244, + 0.053730163212137756 + ], + "p_btb_better": 0.95 + }, + "GIFFLAR gifflarESM": { + "score_ci95": [ + 0.16690761573544066, + 0.250029276729087 + ], + "rank_median": 5.0, + "rank_ci95": [ + 2.0, + 7.0 + ], + "p_rank1": 0.006, + "delta_btb_minus": 0.033341110292334414, + "delta_ci95": [ + 0.004694724614958774, + 0.06271076895621958 + ], + "p_btb_better": 0.985 + }, + "GIFFLAR sweetnetESM": { + "score_ci95": [ + 0.1398955238226955, + 0.21225918068827307 + ], + "rank_median": 8.0, + "rank_ci95": [ + 6.0, + 10.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.06440506084332687, + "delta_ci95": [ + 0.02972381461091908, + 0.09605456656898627 + ], + "p_btb_better": 0.9995 + }, + "composition ridge": { + "score_ci95": [ + 0.08060570302272095, + 0.17253774701907162 + ], + "rank_median": 11.0, + "rank_ci95": [ + 9.0, + 12.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.1143190108328038, + "delta_ci95": [ + 0.07149506194978549, + 0.16170770594652173 + ], + "p_btb_better": 1.0 + }, + "char 3-5-gram ridge": { + "score_ci95": [ + 0.12095377224079984, + 0.2032899675702806 + ], + "rank_median": 9.0, + "rank_ci95": [ + 6.0, + 11.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.07988207417711157, + "delta_ci95": [ + 0.04133776825893229, + 0.1161707395849824 + ], + "p_btb_better": 1.0 + }, + "nearest-neighbour glycan": { + "score_ci95": [ + 0.14294992756613306, + 0.22833055643994993 + ], + "rank_median": 7.0, + "rank_ci95": [ + 3.0, + 9.0 + ], + "p_rank1": 0.002, + "delta_btb_minus": 0.052282924902240235, + "delta_ci95": [ + 0.017277042003073537, + 0.09175658351136994 + ], + "p_btb_better": 0.998 + }, + "protein-family nearest": { + "score_ci95": [ + 0.10662851372581617, + 0.19133591197239094 + ], + "rank_median": 10.0, + "rank_ci95": [ + 6.0, + 11.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.08979125215926545, + "delta_ci95": [ + 0.04816453060967756, + 0.13544128055873392 + ], + "p_btb_better": 1.0 + }, + "motif ridge (p44)": { + "score_ci95": [ + 0.028821993538636938, + 0.11605372140127032 + ], + "rank_median": 12.0, + "rank_ci95": [ + 11.0, + 12.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.16675470000159087, + "delta_ci95": [ + 0.11524377211334574, + 0.21932309094447988 + ], + "p_btb_better": 1.0 + }, + "glycan-size rule (BPE tokens)": { + "score_ci95": [ + -0.06018587225264553, + 0.028553507790947796 + ], + "rank_median": 13.0, + "rank_ci95": [ + 13.0, + 13.0 + ], + "p_rank1": 0.0, + "delta_btb_minus": 0.25558354862366744, + "delta_ci95": [ + 0.19898688335018824, + 0.3188426201248919 + ], + "p_btb_better": 1.0 + } + }, + "welch_seed_only": { + "LectinOracle ESM-C (primary)": { + "delta": 0.024508435880027296, + "ci95": [ + 0.00935827186949135, + 0.039658599890563244 + ], + "p": 0.01533421157430026 + }, + "LectinOracle _flex": { + "delta": 0.056576959653660136, + "ci95": [ + 0.04191372249935968, + 0.07124019680796059 + ], + "p": 0.0006751343539153076 + }, + "LectinOracle ESM-1b": { + "delta": 0.017035553493468886, + "ci95": [ + -0.0012462617680410112, + 0.03531736875497878 + ], + "p": 0.060680843993287326 + }, + "LectinOracle matched tuning": { + "delta": 0.024146529408432565, + "ci95": [ + 0.007632226317791622, + 0.04066083249907351 + ], + "p": 0.022619072364313375 + }, + "GIFFLAR gifflarESM": { + "delta": 0.033341110292334414, + "ci95": [ + 0.018136314435873734, + 0.048545906148795094 + ], + "p": 0.007056963860288867 + }, + "GIFFLAR sweetnetESM": { + "delta": 0.06440506084332687, + "ci95": [ + 0.048189258396163726, + 0.08062086329049001 + ], + "p": 0.002280402507870871 + } + }, + "pooled_E4": { + "point": { + "BERToseBind": 0.26451514279675, + "LectinOracle ESM-C (primary)": 0.24260613049142152 + }, + "ci95": { + "BERToseBind": [ + 0.22685659704476233, + 0.30227237193882434 + ], + "LectinOracle ESM-C (primary)": [ + 0.20464146531693983, + 0.28174655591460923 + ] + }, + "delta_btb_minus_lo": 0.021909012305328462, + "delta_ci95": [ + 0.00983804391148444, + 0.03530998396725674 + ], + "p_btb_better": 0.9995 + } + }, + "doubly_cold": { + "units": { + "glycan_components": 173, + "protein_components": 199, + "assays": 212 + }, + "point_#4_rule": { + "BERToseBind": 0.17853311044049022, + "LectinOracle ESM-C (primary)": 0.18892557039488064, + "LectinOracle _flex": 0.16591843938018871, + "LectinOracle ESM-1b": 0.20632734858634674, + "LectinOracle matched tuning": 0.19436559345044505, + "GIFFLAR gifflarESM": 0.16453849607071838, + "GIFFLAR sweetnetESM": 0.22214733229047123, + "composition ridge": 0.24210410559558815, + "char 3-5-gram ridge": 0.24958196240289526, + "nearest-neighbour glycan": 0.09632788784547305, + "motif ridge (p44)": 0.22896473471498477, + "glycan-size rule (BPE tokens)": 0.2242042239447186 + }, + "per_seed_#4_rule": { + "BERToseBind": [ + 0.17732109020146009, + 0.1839765095395252, + 0.17430173158048537 + ], + "LectinOracle ESM-C (primary)": [ + 0.17012234154545913, + 0.1971603205019885, + 0.19949404913719423 + ], + "LectinOracle _flex": [ + 0.17876515213936095, + 0.19308595684499813, + 0.12590420915620712 + ], + "LectinOracle ESM-1b": [ + 0.2184879902331782, + 0.18003134941992985, + 0.22046270610593216 + ], + "LectinOracle matched tuning": [ + 0.19473326628891705, + 0.20377865532401557, + 0.18458485873840255 + ], + "GIFFLAR gifflarESM": [ + 0.11921097272627695, + 0.18740125661964038, + 0.1870032588662378 + ], + "GIFFLAR sweetnetESM": [ + 0.22493144339363638, + 0.22793936767579281, + 0.2135711858019845 + ], + "composition ridge": [ + 0.24210410559558815 + ], + "char 3-5-gram ridge": [ + 0.24958196240289526 + ], + "nearest-neighbour glycan": [ + 0.09632788784547305 + ], + "motif ridge (p44)": [ + 0.22896473471498477 + ], + "glycan-size rule (BPE tokens)": [ + 0.2242042239447186 + ] + }, + "primary_test_only": { + "BERToseBind": { + "score_ci95": [ + 0.08800632066585967, + 0.29818324441093086 + ], + "rank_median": 8.0, + "rank_ci95": [ + 1.0, + 12.0 + ], + "p_rank1": 0.03 + }, + "LectinOracle ESM-C (primary)": { + "score_ci95": [ + 0.08266460776080133, + 0.30550585726431234 + ], + "rank_median": 8.0, + "rank_ci95": [ + 1.0, + 11.0 + ], + "p_rank1": 0.034, + "delta_btb_minus": -0.01039245995439042, + "delta_ci95": [ + -0.11538313078589431, + 0.10570818896632488 + ], + "p_btb_better": 0.4535 + }, + "LectinOracle _flex": { + "score_ci95": [ + 0.07288417641226902, + 0.275937321371501 + ], + "rank_median": 10.0, + "rank_ci95": [ + 5.0, + 12.0 + ], + "p_rank1": 0.0015, + "delta_btb_minus": 0.012614671060301508, + "delta_ci95": [ + -0.07242815907623544, + 0.11582134063882747 + ], + "p_btb_better": 0.647 + }, + "LectinOracle ESM-1b": { + "score_ci95": [ + 0.10740550725208699, + 0.3200246031953035 + ], + "rank_median": 6.0, + "rank_ci95": [ + 2.0, + 9.0 + ], + "p_rank1": 0.0245, + "delta_btb_minus": -0.02779423814585652, + "delta_ci95": [ + -0.11816939713664168, + 0.07219018528869879 + ], + "p_btb_better": 0.308 + }, + "LectinOracle matched tuning": { + "score_ci95": [ + 0.09749794058496436, + 0.31276811835705887 + ], + "rank_median": 7.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.0285, + "delta_btb_minus": -0.015832483009954823, + "delta_ci95": [ + -0.1084512250087089, + 0.0793245507023225 + ], + "p_btb_better": 0.372 + }, + "GIFFLAR gifflarESM": { + "score_ci95": [ + 0.06664086666531871, + 0.2941583966576146 + ], + "rank_median": 9.0, + "rank_ci95": [ + 3.0, + 12.0 + ], + "p_rank1": 0.0045, + "delta_btb_minus": 0.01399461436977184, + "delta_ci95": [ + -0.10208068365397563, + 0.11935280964623651 + ], + "p_btb_better": 0.598 + }, + "GIFFLAR sweetnetESM": { + "score_ci95": [ + 0.12107448243175156, + 0.333818443516957 + ], + "rank_median": 5.0, + "rank_ci95": [ + 2.0, + 11.0 + ], + "p_rank1": 0.0225, + "delta_btb_minus": -0.04361422184998101, + "delta_ci95": [ + -0.13614677827137323, + 0.06719927914086063 + ], + "p_btb_better": 0.221 + }, + "composition ridge": { + "score_ci95": [ + 0.12284574923032972, + 0.39654256786641773 + ], + "rank_median": 2.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.2665, + "delta_btb_minus": -0.06357099515509793, + "delta_ci95": [ + -0.20471924626328933, + 0.06159341124136493 + ], + "p_btb_better": 0.142 + }, + "char 3-5-gram ridge": { + "score_ci95": [ + 0.13013627889296603, + 0.40208712510580363 + ], + "rank_median": 2.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.3125, + "delta_btb_minus": -0.07104885196240504, + "delta_ci95": [ + -0.2079801989913431, + 0.05868593852736077 + ], + "p_btb_better": 0.1345 + }, + "nearest-neighbour glycan": { + "score_ci95": [ + -0.08742707353186373, + 0.24688243161414627 + ], + "rank_median": 12.0, + "rank_ci95": [ + 3.0, + 12.0 + ], + "p_rank1": 0.0095, + "delta_btb_minus": 0.08220522259501717, + "delta_ci95": [ + -0.08155240346201399, + 0.2909551564206972 + ], + "p_btb_better": 0.852 + }, + "motif ridge (p44)": { + "score_ci95": [ + 0.10239506688401254, + 0.36522546882109536 + ], + "rank_median": 4.0, + "rank_ci95": [ + 1.0, + 11.0 + ], + "p_rank1": 0.1265, + "delta_btb_minus": -0.050431624274494546, + "delta_ci95": [ + -0.16134139416938548, + 0.06598445695441883 + ], + "p_btb_better": 0.211 + }, + "glycan-size rule (BPE tokens)": { + "score_ci95": [ + 0.09227469353444419, + 0.37172814525552617 + ], + "rank_median": 4.0, + "rank_ci95": [ + 1.0, + 12.0 + ], + "p_rank1": 0.1395, + "delta_btb_minus": -0.04567111350422837, + "delta_ci95": [ + -0.1838850472775437, + 0.09480669943239373 + ], + "p_btb_better": 0.2585 + } + }, + "secondary_test_plus_seed": { + "BERToseBind": { + "score_ci95": [ + 0.08345635222246622, + 0.29937441294278466 + ], + "rank_median": 8.0, + "rank_ci95": [ + 1.0, + 12.0 + ], + "p_rank1": 0.0305 + }, + "LectinOracle ESM-C (primary)": { + "score_ci95": [ + 0.07767034554469496, + 0.3088052101447096 + ], + "rank_median": 8.0, + "rank_ci95": [ + 1.0, + 11.0 + ], + "p_rank1": 0.036, + "delta_btb_minus": -0.01039245995439042, + "delta_ci95": [ + -0.11912997696777865, + 0.11020898829112488 + ], + "p_btb_better": 0.4515 + }, + "LectinOracle _flex": { + "score_ci95": [ + 0.0625083493409713, + 0.2864505189436178 + ], + "rank_median": 10.0, + "rank_ci95": [ + 4.0, + 12.0 + ], + "p_rank1": 0.0025, + "delta_btb_minus": 0.012614671060301508, + "delta_ci95": [ + -0.0850877500856685, + 0.12821539451113115 + ], + "p_btb_better": 0.618 + }, + "LectinOracle ESM-1b": { + "score_ci95": [ + 0.10456176771907934, + 0.3258515541626566 + ], + "rank_median": 6.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.031, + "delta_btb_minus": -0.02779423814585652, + "delta_ci95": [ + -0.1290219039807597, + 0.08482456097817342 + ], + "p_btb_better": 0.3255 + }, + "LectinOracle matched tuning": { + "score_ci95": [ + 0.09256155859865482, + 0.31443979219675516 + ], + "rank_median": 7.0, + "rank_ci95": [ + 1.0, + 11.0 + ], + "p_rank1": 0.031, + "delta_btb_minus": -0.015832483009954823, + "delta_ci95": [ + -0.1167933980106859, + 0.08584183256840364 + ], + "p_btb_better": 0.368 + }, + "GIFFLAR gifflarESM": { + "score_ci95": [ + 0.057383695081133515, + 0.2983003571299295 + ], + "rank_median": 9.0, + "rank_ci95": [ + 3.0, + 12.0 + ], + "p_rank1": 0.008, + "delta_btb_minus": 0.01399461436977184, + "delta_ci95": [ + -0.1128437340449113, + 0.1319335845109975 + ], + "p_btb_better": 0.589 + }, + "GIFFLAR sweetnetESM": { + "score_ci95": [ + 0.10820709435067695, + 0.3447887118839026 + ], + "rank_median": 5.0, + "rank_ci95": [ + 1.0, + 11.0 + ], + "p_rank1": 0.05, + "delta_btb_minus": -0.04361422184998101, + "delta_ci95": [ + -0.1514269305745274, + 0.07666796021358044 + ], + "p_btb_better": 0.243 + }, + "composition ridge": { + "score_ci95": [ + 0.12284574923032972, + 0.39654256786641773 + ], + "rank_median": 2.0, + "rank_ci95": [ + 1.0, + 10.0 + ], + "p_rank1": 0.259, + "delta_btb_minus": -0.06357099515509793, + "delta_ci95": [ + -0.21127353357494535, + 0.06450243983590945 + ], + "p_btb_better": 0.148 + }, + "char 3-5-gram ridge": { + "score_ci95": [ + 0.13013627889296603, + 0.40208712510580363 + ], + "rank_median": 2.0, + "rank_ci95": [ + 1.0, + 9.024999999999864 + ], + "p_rank1": 0.2945, + "delta_btb_minus": -0.07104885196240504, + "delta_ci95": [ + -0.2087795451557328, + 0.06372114490308109 + ], + "p_btb_better": 0.1405 + }, + "nearest-neighbour glycan": { + "score_ci95": [ + -0.08742707353186373, + 0.24688243161414627 + ], + "rank_median": 12.0, + "rank_ci95": [ + 3.0, + 12.0 + ], + "p_rank1": 0.0085, + "delta_btb_minus": 0.08220522259501717, + "delta_ci95": [ + -0.08745065486792296, + 0.29558347005102525 + ], + "p_btb_better": 0.847 + }, + "motif ridge (p44)": { + "score_ci95": [ + 0.10239506688401254, + 0.36522546882109536 + ], + "rank_median": 4.0, + "rank_ci95": [ + 1.0, + 11.0 + ], + "p_rank1": 0.1165, + "delta_btb_minus": -0.050431624274494546, + "delta_ci95": [ + -0.16370509581439416, + 0.0678029002876689 + ], + "p_btb_better": 0.2165 + }, + "glycan-size rule (BPE tokens)": { + "score_ci95": [ + 0.09227469353444419, + 0.37172814525552617 + ], + "rank_median": 4.0, + "rank_ci95": [ + 1.0, + 12.0 + ], + "p_rank1": 0.1325, + "delta_btb_minus": -0.04567111350422837, + "delta_ci95": [ + -0.184213966932032, + 0.09606883431842134 + ], + "p_btb_better": 0.265 + } + }, + "welch_seed_only": { + "LectinOracle ESM-C (primary)": { + "delta": -0.01039245995439042, + "ci95": [ + -0.047085591818819425, + 0.026300671910038584 + ], + "p": 0.38709626485743254 + }, + "LectinOracle _flex": { + "delta": 0.012614671060301508, + "ci95": [ + -0.07301677354806982, + 0.09824611566867283 + ], + "p": 0.6010489361885247 + }, + "LectinOracle ESM-1b": { + "delta": -0.02779423814585652, + "ci95": [ + -0.08121496697625738, + 0.02562649068454434 + ], + "p": 0.16400871612185952 + }, + "LectinOracle matched tuning": { + "delta": -0.015832483009954823, + "ci95": [ + -0.03570850701705528, + 0.004043540997145635 + ], + "p": 0.08499443908882842 + }, + "GIFFLAR gifflarESM": { + "delta": 0.01399461436977184, + "ci95": [ + -0.08144720467032997, + 0.10943643340987365 + ], + "p": 0.6008104918014352 + }, + "GIFFLAR sweetnetESM": { + "delta": -0.04361422184998101, + "ci95": [ + -0.059095790158922676, + -0.028132653541039342 + ], + "p": 0.002109215799520392 + } + }, + "pooled_E4": { + "point": { + "BERToseBind": 0.20301446590351957, + "LectinOracle ESM-C (primary)": 0.20907991263250447 + }, + "ci95": { + "BERToseBind": [ + 0.08246077904615426, + 0.31816115831059805 + ], + "LectinOracle ESM-C (primary)": [ + 0.0882215136498559, + 0.31970213263648534 + ] + }, + "delta_btb_minus_lo": -0.006065446728984902, + "delta_ci95": [ + -0.10288120882127332, + 0.09931149204034828 + ], + "p_btb_better": 0.45 + } + } + }, + "status": "COMPLETE" +} \ No newline at end of file diff --git a/releases/2026-10-02/figures/bootstrap_figure13/inputs/nature-bpg-palette.json b/releases/2026-10-02/figures/bootstrap_figure13/inputs/nature-bpg-palette.json new file mode 100644 index 0000000000000000000000000000000000000000..45ea20e5b3865ea0fefd85cc8c2befd639ee1000 --- /dev/null +++ b/releases/2026-10-02/figures/bootstrap_figure13/inputs/nature-bpg-palette.json @@ -0,0 +1,30 @@ +{ + "name": "Nature BPG", + "upstream_palette": "ggsci NPG nrc", + "alpha": 0.6, + "alpha_hex_suffix": "99", + "alpha_0_6_hex8": [ + "#E64B3599", + "#4DBBD599", + "#00A08799", + "#3C548899", + "#F39B7F99", + "#8491B499", + "#91D1C299", + "#DC000099", + "#7E614899", + "#B09C8599" + ], + "opaque_hex": [ + "#E64B35", + "#4DBBD5", + "#00A087", + "#3C5488", + "#F39B7F", + "#8491B4", + "#91D1C2", + "#DC0000", + "#7E6148", + "#B09C85" + ] +} diff --git a/releases/2026-10-02/figures/bootstrap_figure13/inputs/review_affinose_gifflar_seed_welch.csv b/releases/2026-10-02/figures/bootstrap_figure13/inputs/review_affinose_gifflar_seed_welch.csv new file mode 100644 index 0000000000000000000000000000000000000000..9c26ef753f20b5c7fee1a09bdd22eefe193c8475 --- /dev/null +++ b/releases/2026-10-02/figures/bootstrap_figure13/inputs/review_affinose_gifflar_seed_welch.csv @@ -0,0 +1,7 @@ +regime,comparator,bertosebind_mean,comparator_mean,comparator_sample_sd,n_fits,delta_btb_minus_comparator,seed_only_ci95_low,seed_only_ci95_high,raw_two_sided_p,welch_df +glycan-cold,GIFFLAR LGI gifflarESM,0.3293033324285421,0.25505099999999997,0.01907369151475403,3,0.07425233242854212,0.034599909389778014,0.11390475546730623,0.00971682207340426,2.9336856931653146 +glycan-cold,GIFFLAR LGI sweetnetESM,0.3293033324285421,0.26582,0.024841453600785938,3,0.0634833324285421,0.009682552273780787,0.1172841125833034,0.03437070747100726,2.572030862923261 +protein-cold,GIFFLAR LGI gifflarESM,0.24087415343191254,0.20744233333333334,0.002945261674848833,3,0.0334318200985792,0.018102805291075896,0.048760834906082504,0.007430314876024293,2.6572912103325406 +protein-cold,GIFFLAR LGI sweetnetESM,0.24087415343191254,0.17647666666666667,0.0020629891743131627,3,0.06439748676524587,0.048174498365200456,0.08062047516529128,0.00228885041033366,2.3294278562036883 +doubly-cold,GIFFLAR LGI gifflarESM,0.17853311044049022,0.16453833333333334,0.03925512656116821,3,0.01399477710715688,-0.08144662547197519,0.10943617968628895,0.6008051758610409,2.0635858293297056 +doubly-cold,GIFFLAR LGI sweetnetESM,0.17853311044049022,0.222147,0.007577786484191799,3,-0.04361388955950979,-0.05909522478850694,-0.02813255433051264,0.0021091175135923793,3.443893902980397 diff --git a/releases/2026-10-02/figures/bootstrap_figure13/inputs/review_affinose_individual_values.csv b/releases/2026-10-02/figures/bootstrap_figure13/inputs/review_affinose_individual_values.csv new file mode 100644 index 0000000000000000000000000000000000000000..07fcf4b3b619107f3b97171d1dbd353f3e4f1e73 --- /dev/null +++ b/releases/2026-10-02/figures/bootstrap_figure13/inputs/review_affinose_individual_values.csv @@ -0,0 +1,64 @@ +method,regime,sample,value,source_file,precision,note +Affinose,glycan-cold,seed 42,0.33405850648525903,affinose_arms_on_test_20260909.json,full precision primary result,Equal-assay macro Spearman. +Affinose,glycan-cold,seed 43,0.318371586837939,affinose_arms_on_test_20260909.json,full precision primary result,Equal-assay macro Spearman. +Affinose,glycan-cold,seed 44,0.3354799039624282,affinose_arms_on_test_20260909.json,full precision primary result,Equal-assay macro Spearman. +Affinose,protein-cold,seed 42,0.23260289913763402,affinose_arms_on_test_20260909.json,full precision primary result,Equal-assay macro Spearman. +Affinose,protein-cold,seed 43,0.24512556467979302,affinose_arms_on_test_20260909.json,full precision primary result,Equal-assay macro Spearman. +Affinose,protein-cold,seed 44,0.24489399647831056,affinose_arms_on_test_20260909.json,full precision primary result,Equal-assay macro Spearman. +Affinose,doubly-cold,seed 42,0.17732109020146009,affinose_arms_on_test_20260909.json,full precision primary result,Equal-assay macro Spearman. +Affinose,doubly-cold,seed 43,0.1839765095395252,affinose_arms_on_test_20260909.json,full precision primary result,Equal-assay macro Spearman. +Affinose,doubly-cold,seed 44,0.17430173158048537,affinose_arms_on_test_20260909.json,full precision primary result,Equal-assay macro Spearman. +LectinOracle ESM-C stock,glycan-cold,seed 42,0.2859303904923599,affinose_lectinoracle_matched_mtA_glycans42.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C stock,glycan-cold,seed 43,0.29107441992076966,affinose_lectinoracle_matched_mtA_glycans43.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C stock,glycan-cold,seed 44,0.27894227504244484,affinose_lectinoracle_matched_mtA_glycans44.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C stock,protein-cold,seed 42,0.2199,affinose_lectinoracle_matched_mtB_proteins42.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C stock,protein-cold,seed 43,0.2154,affinose_lectinoracle_matched_mtB_proteins43.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C stock,protein-cold,seed 44,0.2138,affinose_lectinoracle_matched_mtB_proteins44.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C stock,doubly-cold,seed 42,0.1701,affinose_lectinoracle_matched_mtC_doublys42.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C stock,doubly-cold,seed 43,0.1972,affinose_lectinoracle_matched_mtC_doublys43.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C stock,doubly-cold,seed 44,0.1995,affinose_lectinoracle_matched_mtC_doublys44.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C matched tuning,glycan-cold,seed 42,0.2855421618562536,affinose_lectinoracle_matched_spearsel_mtA_glycans42.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C matched tuning,glycan-cold,seed 43,0.3034977362761743,affinose_lectinoracle_matched_spearsel_mtA_glycans43.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C matched tuning,glycan-cold,seed 44,0.29573316355404644,affinose_lectinoracle_matched_spearsel_mtA_glycans44.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C matched tuning,protein-cold,seed 42,0.2155,affinose_lectinoracle_matched_spearsel_mtB_proteins42.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C matched tuning,protein-cold,seed 43,0.2159,affinose_lectinoracle_matched_spearsel_mtB_proteins43.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C matched tuning,protein-cold,seed 44,0.2188,affinose_lectinoracle_matched_spearsel_mtB_proteins44.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C matched tuning,doubly-cold,seed 42,0.1947,affinose_lectinoracle_matched_spearsel_mtC_doublys42.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C matched tuning,doubly-cold,seed 43,0.2038,affinose_lectinoracle_matched_spearsel_mtC_doublys43.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-C matched tuning,doubly-cold,seed 44,0.1846,affinose_lectinoracle_matched_spearsel_mtC_doublys44.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-1b,glycan-cold,seed 42,0.30582710809281266,affinose_lectinoracle_matched_esm1b_mtA_glycans42.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-1b,glycan-cold,seed 43,0.2900067911714771,affinose_lectinoracle_matched_esm1b_mtA_glycans43.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-1b,glycan-cold,seed 44,0.2974801924165252,affinose_lectinoracle_matched_esm1b_mtA_glycans44.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-1b,protein-cold,seed 42,0.2337,affinose_lectinoracle_matched_esm1b_mtB_proteins42.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-1b,protein-cold,seed 43,0.2202,affinose_lectinoracle_matched_esm1b_mtB_proteins43.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-1b,protein-cold,seed 44,0.2176,affinose_lectinoracle_matched_esm1b_mtB_proteins44.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-1b,doubly-cold,seed 42,0.2185,affinose_lectinoracle_matched_esm1b_mtC_doublys42.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-1b,doubly-cold,seed 43,0.18,affinose_lectinoracle_matched_esm1b_mtC_doublys43.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle ESM-1b,doubly-cold,seed 44,0.2205,affinose_lectinoracle_matched_esm1b_mtC_doublys44.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle flex,glycan-cold,seed 42,0.30175070741369553,affinose_lectinoracle_retrain_v2_prA_glycans42.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle flex,glycan-cold,seed 43,0.27758347481607243,affinose_lectinoracle_retrain_v2_prA_glycans43.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle flex,glycan-cold,seed 44,0.2716629881154499,affinose_lectinoracle_retrain_v2_prA_glycans44.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle flex,protein-cold,seed 42,0.1804,affinose_lectinoracle_retrain_v2_prB_proteins42.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle flex,protein-cold,seed 43,0.1827,affinose_lectinoracle_retrain_v2_prB_proteins43.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle flex,protein-cold,seed 44,0.1898,affinose_lectinoracle_retrain_v2_prB_proteins44.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle flex,doubly-cold,seed 42,0.1788,affinose_lectinoracle_retrain_v2_prC_doublys42.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle flex,doubly-cold,seed 43,0.1931,affinose_lectinoracle_retrain_v2_prC_doublys43.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +LectinOracle flex,doubly-cold,seed 44,0.1259,affinose_lectinoracle_retrain_v2_prC_doublys44.json,primary comparator JSON stores macro scores at four decimals,Glycan-cold values and SD rescaled by1715/1767; named seed follows recorded checkpoint path. +GIFFLAR LGI gifflarESM,glycan-cold,seed 42,0.237639,affinose_gifflar_macro_A_glycan_gifflarESM.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI gifflarESM,glycan-cold,seed 43,0.252077,affinose_gifflar_macro_A_glycan_gifflarESM_s43.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI gifflarESM,glycan-cold,seed 44,0.275437,affinose_gifflar_macro_A_glycan_gifflarESM_s44.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI sweetnetESM,glycan-cold,seed 42,0.243723,affinose_gifflar_macro_A_glycan_sweetnetESM.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI sweetnetESM,glycan-cold,seed 43,0.292708,affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI sweetnetESM,glycan-cold,seed 44,0.261029,affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI gifflarESM,protein-cold,seed 42,0.210410,affinose_gifflar_macro_B_protein_gifflarESM.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI gifflarESM,protein-cold,seed 43,0.204520,affinose_gifflar_macro_B_protein_gifflarESM_s43.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI gifflarESM,protein-cold,seed 44,0.207397,affinose_gifflar_macro_B_protein_gifflarESM_s44.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI sweetnetESM,protein-cold,seed 42,0.175404,affinose_gifflar_macro_B_protein_sweetnetESM.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI sweetnetESM,protein-cold,seed 43,0.178855,affinose_gifflar_macro_B_protein_sweetnetESM_s43.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI sweetnetESM,protein-cold,seed 44,0.175171,affinose_gifflar_macro_B_protein_sweetnetESM_s44.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI gifflarESM,doubly-cold,seed 42,0.119211,affinose_gifflar_macro_C_doubly_gifflarESM.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI gifflarESM,doubly-cold,seed 43,0.187401,affinose_gifflar_macro_C_doubly_gifflarESM_s43.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI gifflarESM,doubly-cold,seed 44,0.187003,affinose_gifflar_macro_C_doubly_gifflarESM_s44.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI sweetnetESM,doubly-cold,seed 42,0.224931,affinose_gifflar_macro_C_doubly_sweetnetESM.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI sweetnetESM,doubly-cold,seed 43,0.227939,affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. +GIFFLAR LGI sweetnetESM,doubly-cold,seed 44,0.213571,affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json,Primary producer score rounded to six decimals,Equal-assay macro Spearman; data-only eligible denominator; unavailable assays contribute rho=0. diff --git a/releases/2026-10-02/figures/bootstrap_figure13/inputs/review_affinose_results.csv b/releases/2026-10-02/figures/bootstrap_figure13/inputs/review_affinose_results.csv new file mode 100644 index 0000000000000000000000000000000000000000..20e79634fdcc86c0afadf60e3b476ce4de8d5de9 --- /dev/null +++ b/releases/2026-10-02/figures/bootstrap_figure13/inputs/review_affinose_results.csv @@ -0,0 +1,40 @@ +method,kind,regime,metric,mean,sample_sd,n_fits,data_eligible_assays,eligibility,availability,source_file,source_section,source_sha256,uncertainty_scope,notes,seed_42,seed_43,seed_44,scored_rows +Affinose,neural,glycan-cold,equal-assay macro Spearman,0.3293033324285421,0.009493807926236891,3,1767,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary seed-labelled test macro scores,affinose_arms_on_test_20260909.json,mo_A_glycan_s42;moc_A_glycan_s43;moc_A_glycan_s44,670cfcbcfe89e0729bb75f122cff8c7100c24d39ef775c69421d4bb820654056,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.33405850648525903,0.318371586837939,0.3354799039624282,37295 +Affinose,neural,protein-cold,equal-assay macro Spearman,0.24087415343191254,0.007164052041858018,3,246,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary seed-labelled test macro scores,affinose_arms_on_test_20260909.json,mo_B_protein_s42;mof_B_protein_s43;mof_B_protein_s44,670cfcbcfe89e0729bb75f122cff8c7100c24d39ef775c69421d4bb820654056,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.23260289913763402,0.24512556467979302,0.24489399647831056,38539 +Affinose,neural,doubly-cold,equal-assay macro Spearman,0.17853311044049022,0.004949957265880665,3,212,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary seed-labelled test macro scores,affinose_arms_on_test_20260909.json,mo_C_doubly_s42;mof_C_doubly_s43;mof_C_doubly_s44,670cfcbcfe89e0729bb75f122cff8c7100c24d39ef775c69421d4bb820654056,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.17732109020146009,0.1839765095395252,0.17430173158048537,3691 +LectinOracle ESM-C stock,neural,glycan-cold,equal-assay macro Spearman,0.2853156951518581,0.0060893860616971635,3,1767,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary four-decimal seed-labelled test macro scores,LectinOracle_primary_result_checks.json,LectinOracle ESM-C stock glycan-cold,148db04d08eb01155925f160eb4981239403f331c56d083b8ca2d0f0faad4887,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.2859303904923599,0.29107441992076966,0.27894227504244484,37003 +LectinOracle ESM-C stock,neural,protein-cold,equal-assay macro Spearman,0.21636666666666668,0.003162804662531879,3,246,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary four-decimal seed-labelled test macro scores,LectinOracle_primary_result_checks.json,LectinOracle ESM-C stock protein-cold,148db04d08eb01155925f160eb4981239403f331c56d083b8ca2d0f0faad4887,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.2199,0.2154,0.2138,38556 +LectinOracle ESM-C stock,neural,doubly-cold,equal-assay macro Spearman,0.18893333333333334,0.016350637092582457,3,212,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary four-decimal seed-labelled test macro scores,LectinOracle_primary_result_checks.json,LectinOracle ESM-C stock doubly-cold,148db04d08eb01155925f160eb4981239403f331c56d083b8ca2d0f0faad4887,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",D3 adopted rerun draw on doubly-cold.,0.1701,0.1972,0.1995,3691 +LectinOracle ESM-C matched tuning,neural,glycan-cold,equal-assay macro Spearman,0.29492435389549143,0.00900507040423099,3,1767,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary four-decimal seed-labelled test macro scores,LectinOracle_primary_result_checks.json,LectinOracle ESM-C matched tuning glycan-cold,148db04d08eb01155925f160eb4981239403f331c56d083b8ca2d0f0faad4887,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.2855421618562536,0.3034977362761743,0.29573316355404644,37003 +LectinOracle ESM-C matched tuning,neural,protein-cold,equal-assay macro Spearman,0.21673333333333333,0.0018009256878986758,3,246,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary four-decimal seed-labelled test macro scores,LectinOracle_primary_result_checks.json,LectinOracle ESM-C matched tuning protein-cold,148db04d08eb01155925f160eb4981239403f331c56d083b8ca2d0f0faad4887,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.2155,0.2159,0.2188,38556 +LectinOracle ESM-C matched tuning,neural,doubly-cold,equal-assay macro Spearman,0.19436666666666666,0.00960433929707471,3,212,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary four-decimal seed-labelled test macro scores,LectinOracle_primary_result_checks.json,LectinOracle ESM-C matched tuning doubly-cold,148db04d08eb01155925f160eb4981239403f331c56d083b8ca2d0f0faad4887,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.1947,0.2038,0.1846,3691 +LectinOracle ESM-1b,neural,glycan-cold,equal-assay macro Spearman,0.297771363893605,0.007914176678257362,3,1767,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary four-decimal seed-labelled test macro scores,LectinOracle_primary_result_checks.json,LectinOracle ESM-1b glycan-cold,148db04d08eb01155925f160eb4981239403f331c56d083b8ca2d0f0faad4887,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.30582710809281266,0.2900067911714771,0.2974801924165252,37003 +LectinOracle ESM-1b,neural,protein-cold,equal-assay macro Spearman,0.22383333333333333,0.00864310900853005,3,246,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary four-decimal seed-labelled test macro scores,LectinOracle_primary_result_checks.json,LectinOracle ESM-1b protein-cold,148db04d08eb01155925f160eb4981239403f331c56d083b8ca2d0f0faad4887,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.2337,0.2202,0.2176,38556 +LectinOracle ESM-1b,neural,doubly-cold,equal-assay macro Spearman,0.20633333333333334,0.022827249797847605,3,212,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary four-decimal seed-labelled test macro scores,LectinOracle_primary_result_checks.json,LectinOracle ESM-1b doubly-cold,148db04d08eb01155925f160eb4981239403f331c56d083b8ca2d0f0faad4887,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.2185,0.18,0.2205,3691 +LectinOracle flex,neural,glycan-cold,equal-assay macro Spearman,0.28366572344840596,0.015939354581087892,3,1767,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary four-decimal seed-labelled test macro scores,LectinOracle_primary_result_checks.json,LectinOracle flex glycan-cold,148db04d08eb01155925f160eb4981239403f331c56d083b8ca2d0f0faad4887,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.30175070741369553,0.27758347481607243,0.2716629881154499,37003 +LectinOracle flex,neural,protein-cold,equal-assay macro Spearman,0.1843,0.0048999999999999955,3,246,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary four-decimal seed-labelled test macro scores,LectinOracle_primary_result_checks.json,LectinOracle flex protein-cold,148db04d08eb01155925f160eb4981239403f331c56d083b8ca2d0f0faad4887,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.1804,0.1827,0.1898,38556 +LectinOracle flex,neural,doubly-cold,equal-assay macro Spearman,0.16593333333333332,0.035399482105439514,3,212,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,primary four-decimal seed-labelled test macro scores,LectinOracle_primary_result_checks.json,LectinOracle flex doubly-cold,148db04d08eb01155925f160eb4981239403f331c56d083b8ca2d0f0faad4887,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",,0.1788,0.1931,0.1259,3691 +GIFFLAR LGI gifflarESM,neural,glycan-cold,equal-assay macro Spearman,0.25505099999999997,0.01907369151475403,3,1767,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,Three seed-labelled primary producer receipts,affinose_gifflar_macro_A_glycan_gifflarESM.json;affinose_gifflar_macro_A_glycan_gifflarESM_s43.json;affinose_gifflar_macro_A_glycan_gifflarESM_s44.json,"macro_eligibility_corrected; seeds 42,43,44",d7f21b8037172e6d42fb65c8169d37b19c385d68dc9cbebadbafe9e930843074;2c494ac1351d4ff63828139eac004c0047dc3259d62fd10334d5a740cab9182f;82173016b893cb2913e90e99feea5f6f4ff22cff9e1aff0fe7dc136161c7f627,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",Original producer scores rounded to six decimals. Method-union bootstrap rescores are reported separately.,0.237639,0.252077,0.275437,seed 42: 36635;seed 43: 36635;seed 44: 36635 +GIFFLAR LGI gifflarESM,neural,protein-cold,equal-assay macro Spearman,0.20744233333333334,0.002945261674848833,3,246,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,Three seed-labelled primary producer receipts,affinose_gifflar_macro_B_protein_gifflarESM.json;affinose_gifflar_macro_B_protein_gifflarESM_s43.json;affinose_gifflar_macro_B_protein_gifflarESM_s44.json,"macro_eligibility_corrected; seeds 42,43,44",529296c1388651b4451f35829d0caa63e692a96fc88b74ee9b8dc8c1d09136da;7b0a01a1acc7e2ca80a3de9aaab02941942ead519e6661abec6c44c7fa5fd079;f2e40d306b767e6949c02304077a08398dc16ac19d08d94937f7dc49abd7cc24,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",Original producer scores rounded to six decimals. Method-union bootstrap rescores are reported separately.,0.210410,0.204520,0.207397,seed 42: 36957;seed 43: 36957;seed 44: 36957 +GIFFLAR LGI gifflarESM,neural,doubly-cold,equal-assay macro Spearman,0.16453833333333334,0.03925512656116821,3,212,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,Three seed-labelled primary producer receipts,affinose_gifflar_macro_C_doubly_gifflarESM.json;affinose_gifflar_macro_C_doubly_gifflarESM_s43.json;affinose_gifflar_macro_C_doubly_gifflarESM_s44.json,"macro_eligibility_corrected; seeds 42,43,44",bf720edacbad09cd04c42df7cf347dd1fe9846a22f307f7be1c38f06e89faa44;2208056d5303fda27c5b541eed1c6f64cb03de1c10abd2868d4ce55d1bdb475c;c831378d73c3c2c9456be5ff9ff05acc34b64815b056c5df21bef2078a415393,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",Original producer scores rounded to six decimals. Method-union bootstrap rescores are reported separately.,0.119211,0.187401,0.187003,seed 42: 3533;seed 43: 3533;seed 44: 3533 +GIFFLAR LGI sweetnetESM,neural,glycan-cold,equal-assay macro Spearman,0.26582,0.024841453600785938,3,1767,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,Three seed-labelled primary producer receipts,affinose_gifflar_macro_A_glycan_sweetnetESM.json;affinose_gifflar_macro_A_glycan_sweetnetESM_s43.json;affinose_gifflar_macro_A_glycan_sweetnetESM_s44.json,"macro_eligibility_corrected; seeds 42,43,44",eca94bfbe82bfba95c2086c9c4ffe14091d442017356394ec2e75173cb66810f;ac58a83969a0ffb860cf1a33a472f4cb5b3e14f25097c3ba909f7555f65aa589;d2d2d73c834a2fcca7b8c22fd6ce91907f18866443628c2c54f8b8ec04477803,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",Original producer scores rounded to six decimals. Method-union bootstrap rescores are reported separately.,0.243723,0.292708,0.261029,seed 42: 36635;seed 43: 36635;seed 44: 36635 +GIFFLAR LGI sweetnetESM,neural,protein-cold,equal-assay macro Spearman,0.17647666666666667,0.0020629891743131627,3,246,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,Three seed-labelled primary producer receipts,affinose_gifflar_macro_B_protein_sweetnetESM.json;affinose_gifflar_macro_B_protein_sweetnetESM_s43.json;affinose_gifflar_macro_B_protein_sweetnetESM_s44.json,"macro_eligibility_corrected; seeds 42,43,44",6f0098947aa4c962f991d1e17acc17707d7cb2eb5e9d6338182d6cfa65d28a2d;e13c8021d6e94b3bd6cb4ef00d7456c182449f57c4b1356256e011805a6efdbf;d274d35c9a0ba25e4597cdb8c01001f4f7ff7760aabfe7c8a00b84a70b74252f,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",Original producer scores rounded to six decimals. Method-union bootstrap rescores are reported separately.,0.175404,0.178855,0.175171,seed 42: 36957;seed 43: 36957;seed 44: 36957 +GIFFLAR LGI sweetnetESM,neural,doubly-cold,equal-assay macro Spearman,0.222147,0.007577786484191799,3,212,Data-only eligible denominator; unavailable comparator assays contribute rho=0.,Three seed-labelled primary producer receipts,affinose_gifflar_macro_C_doubly_sweetnetESM.json;affinose_gifflar_macro_C_doubly_sweetnetESM_s43.json;affinose_gifflar_macro_C_doubly_sweetnetESM_s44.json,"macro_eligibility_corrected; seeds 42,43,44",1884d744232b56c5edc76e655cf9bd117e43d8d749c98300b528ea6a5e55b75d;121a30d0de568217e722036cf25ba4ef61128398fde3466fc8b2f60f096722c7;3d29ac377491db5d952f6066228fe4099f99db0e2fbaa80063ee429fc28e0a28,"Sample SD across three downstream fits. Component-bootstrap intervals are reported separately: primary test-only, secondary test plus seed.",Original producer scores rounded to six decimals. Method-union bootstrap rescores are reported separately.,0.224931,0.227939,0.213571,seed 42: 3533;seed 43: 3533;seed 44: 3533 +Glycan composition ridge,baseline,glycan-cold,equal-assay macro Spearman,0.2675,,1,1767,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Glycan composition ridge,baseline,protein-cold,equal-assay macro Spearman,0.1266,,1,246,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Glycan composition ridge,baseline,doubly-cold,equal-assay macro Spearman,0.2421,,1,212,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Character 3-5-gram ridge,baseline,glycan-cold,equal-assay macro Spearman,0.2135,,1,1767,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Character 3-5-gram ridge,baseline,protein-cold,equal-assay macro Spearman,0.161,,1,246,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Character 3-5-gram ridge,baseline,doubly-cold,equal-assay macro Spearman,0.2496,,1,212,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Motif ridge (p44),baseline,glycan-cold,equal-assay macro Spearman,0.2298,,1,1767,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Motif ridge (p44),baseline,protein-cold,equal-assay macro Spearman,0.0741,,1,246,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Motif ridge (p44),baseline,doubly-cold,equal-assay macro Spearman,0.229,,1,212,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Glycan size rule (BPE token count),baseline,glycan-cold,equal-assay macro Spearman,0.2449,,1,1767,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Glycan size rule (BPE token count),baseline,protein-cold,equal-assay macro Spearman,-0.0147,,1,246,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Glycan size rule (BPE token count),baseline,doubly-cold,equal-assay macro Spearman,0.2242,,1,212,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Nearest-neighbour glycan,baseline,glycan-cold,equal-assay macro Spearman,0.1491,,1,1767,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Nearest-neighbour glycan,baseline,protein-cold,equal-assay macro Spearman,0.1817,,1,246,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Nearest-neighbour glycan,baseline,doubly-cold,equal-assay macro Spearman,0.0983,,1,212,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Protein-family nearest,baseline,glycan-cold,equal-assay macro Spearman,,,1,1767,Eligibility correction not applied; denominator requires reconciliation.,undefined,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Protein-family nearest,baseline,protein-cold,equal-assay macro Spearman,0.159,,1,246,Eligibility correction not applied; denominator requires reconciliation.,printed measured summary; primary run JSON absent locally,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, +Protein-family nearest,baseline,doubly-cold,equal-assay macro Spearman,,,1,212,Eligibility correction not applied; denominator requires reconciliation.,undefined,AFFINOSE_COMPLETE_20260910.md,3,7964c75e50d67d11b51385a0622b4b1f587fd1b0fffeab203e6ce3916f89653b,Single fit; no across-seed SD.,,,,, diff --git a/releases/2026-10-02/figures/bootstrap_figure13/inputs/source_manifest.json b/releases/2026-10-02/figures/bootstrap_figure13/inputs/source_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..609188db6ad1c327aa6db74fb2526543e3b0f9ba --- /dev/null +++ b/releases/2026-10-02/figures/bootstrap_figure13/inputs/source_manifest.json @@ -0,0 +1,18 @@ +{ + "review_affinose_results.csv": { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/review_affinose_results.csv", + "sha256": "cd5a299c7b3a21ce8bbd0c445e66b938e497658e9ffe602d562517eb1ce103fd" + }, + "review_affinose_individual_values.csv": { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/review_affinose_individual_values.csv", + "sha256": "8a5ce609298e83a231895587c64a24bbc535a3887feb157ef2b4934db4355243" + }, + "affinose_b4_step3_bootstrap_r2_20260927.json": { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/bertosebind_new_runs/provenance/affinose_b4_step3_bootstrap_r2_20260927.json", + "sha256": "6a87e6a8abc926f41ca13b1bb6c81cbf9ea1d04b06e8f39bfdaf847ce55ba235" + }, + "review_affinose_gifflar_seed_welch.csv": { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/bertosebind_new_runs/review_affinose_gifflar_seed_welch.csv", + "sha256": "7b14add6ccb6e16d72ab066ae902b77fd15cca4baab69c52015a828c5bc32b35" + } +} diff --git a/releases/2026-10-02/figures/build_bpe_figure3.py b/releases/2026-10-02/figures/build_bpe_figure3.py new file mode 100644 index 0000000000000000000000000000000000000000..3d692beb190c0131bc9243f3a77d7aed2d0d9c03 --- /dev/null +++ b/releases/2026-10-02/figures/build_bpe_figure3.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +"""Reproduce Supplementary Figure 3 from a verified WURCS test example. + +Requires Python 3, matplotlib and Pillow. All inputs are adjacent to this script +in figure3_inputs/ (released layout) or inputs/ (staging layout). No model or +corpus execution is needed to regenerate the editable artwork. +""" +from pathlib import Path +import argparse +import csv +import hashlib +import json +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from matplotlib.patches import Rectangle, FancyArrowPatch + +CAPTION = ('Supplementary Figure 3 | WURCS 2.0-aware BPE tokenization. Character merges within WURCS 2.0 semantic units. The tokenizer was fitted on 221,899 training glycans using 2,000 merges, yielding 2,114 vocabulary items, including ten special tokens. Category, residue, branch-depth and linkage annotations remained aligned after merging.') + +def digest(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + +def build(inputs, output): + inputs, output = Path(inputs), Path(output) + output.mkdir(parents=True, exist_ok=True) + example = json.loads((inputs/'source_example.json').read_text()) + vocab = json.loads((inputs/'review_bpe_vocabulary.json').read_text()) + palette = json.loads((inputs/'nature-bpg-palette.json').read_text()) + rows = list(csv.DictReader((inputs/'partition_count_flow.csv').open())) + counts = {r['metric']: int(r['count']) for r in rows} + unit = example['selected_unit'] + assert unit['text'] == 'a2122h-1b' and unit['bpe_tokens'] == [unit['text']] + assert vocab['token_to_id'][unit['text']] == unit['token_ids'][0] == 177 + assert (unit['type_from_code'], unit['residue_id'], unit['branch_depth'], unit['linkage_type']) == ('residue',0,0,0) + alphabet = vocab['review_trace']['fit_only_character_alphabet_size'] + specials, merges, size = len(vocab['special_tokens']), len(vocab['merges']), len(vocab['token_to_id']) + fit = counts['Training parents and learned-preprocessing fit contributors'] + excluded = counts['Over-length training parents excluded from sequence objective'] + retained = counts['Training sequence parents'] + assert (alphabet,specials,merges,size,fit,excluded,retained) == (104,10,2000,2114,221899,72,221827) + assert alphabet + specials + merges == size and fit-excluded == retained + assert vocab['review_trace']['fit_parent_count'] == fit + # Reconstruct a learned token from the stored pair rules. The runtime can + # return an already-known unit directly; these are not inference timings. + ranks = {tuple(pair): i for i, pair in enumerate(vocab['merges'])} + pieces = list(unit['text']); construction = [pieces.copy()] + while len(pieces) > 1: + options = [(ranks.get((pieces[i], pieces[i+1]), float('inf')), i) + for i in range(len(pieces)-1)] + rank, i = min(options) + assert rank != float('inf') + pieces = pieces[:i] + [pieces[i]+pieces[i+1]] + pieces[i+2:] + construction.append(pieces.copy()) + middle = ['a2', '122h-1', 'b'] + assert middle in construction and construction[-1] == [unit['text']] + plt.rcParams.update({'font.family':'Arial','font.size':11,'svg.fonttype':'none','pdf.fonttype':42,'ps.fonttype':42,'svg.hashsalt':'bertose-figure3-v2'}) + fig = plt.figure(figsize=(6.5,1.35), facecolor='white') + ax = fig.add_axes([0,0,1,1]); ax.set(xlim=(0,6.5),ylim=(0,1.35)); ax.axis('off') + ink, gray = '#252525', '#666666' + blue,teal,orange = [palette['alpha_0_6_hex8'][i] for i in (1,2,4)] + def text(x,y,s,size=11,weight='normal'): + return ax.text(x,y,s,fontsize=size,ha='center',va='center',fontweight=weight,color=ink) + def pieces_row(tokens,x,widths,fill): + for token,width in zip(tokens,widths): + ax.add_patch(Rectangle((x,.37),width,.39,facecolor=fill,edgecolor='none')) + text(x+width/2,.565,token,12) + x += width+.018 + def arrow(x0,x1): + ax.add_patch(FancyArrowPatch((x0,.565),(x1,.565),arrowstyle='-|>',mutation_scale=10,linewidth=1.05,color=gray)) + text(1.15,1.035,'Characters',11.5,'bold') + text(3.58,1.035,'Learned merges',11.5,'bold') + text(5.68,1.035,'Token',11.5,'bold') + pieces_row(list(unit['text']),.17,[.21]*9,blue) + arrow(2.30,2.65) + pieces_row(middle,2.80,[.34,.94,.22],teal) + arrow(4.46,4.91) + pieces_row([unit['text']],5.02,[1.31],orange) + stem=output/'Supplementary_Figure_3_current_BPE' + for suffix in ('svg','pdf','png','tif'): + kwargs={'dpi':300,'facecolor':'white'} + if suffix == 'svg': kwargs['metadata']={'Date':None,'Creator':'BERTose figure builder'} + if suffix == 'pdf': kwargs['metadata']={'CreationDate':None,'ModDate':None,'Creator':'BERTose figure builder'} + if suffix == 'tif': kwargs['pil_kwargs']={'compression':'tiff_lzw'} + fig.savefig(stem.with_suffix('.'+suffix),**kwargs) + plt.close(fig) + (output/'Supplementary_Figure_3_caption.txt').write_text(CAPTION+'\n') + source_files={p.name:{'sha256':digest(p)} for p in sorted(inputs.iterdir()) if p.is_file()} + provenance={'figure':'Supplementary Figure 3','dimensions_inches':[6.5,1.35],'raster_dpi':300,'source_files':source_files,'example_source':'Existing base-tokenizer test; no corpus membership claimed. Only the residue semantic unit a2122h-1b is illustrated; annotations remain in the source record.','selected_unit':unit,'learned_token_construction':construction,'displayed_intermediate':middle,'construction_scope':'Illustration from saved learned merge rules, not an inference trace. Known units return directly in the runtime.','counts':{'character_alphabet':alphabet,'special_tokens':specials,'initial_vocabulary':alphabet+specials,'merges':merges,'vocabulary':size,'fit_parents':fit,'excluded_overlength_training_parents':excluded,'sequence_pretraining_parents':retained},'builder_sha256':digest(Path(__file__)),'caption_unchanged':True} + (output/'Supplementary_Figure_3_source_provenance.json').write_text(json.dumps(provenance,indent=2)+'\n') + return stem + +if __name__=='__main__': + here=Path(__file__).resolve().parent + default_inputs = here/'figure3_inputs' if (here/'figure3_inputs').exists() else here/'inputs' + parser=argparse.ArgumentParser(description=__doc__) + parser.add_argument('--inputs',type=Path,default=default_inputs) + parser.add_argument('--package-dir',type=Path) + parser.add_argument('--output-dir','--outdir',dest='output_dir',type=Path) + args=parser.parse_args() + package=args.package_dir or (here.parents[1] if here.name=='figures' and here.parent.name=='06_code' else None) + output=args.output_dir or (package/'05_figures' if package else here/'outputs') + print(build(args.inputs,output)) diff --git a/releases/2026-10-02/figures/build_corpus_composition_figure.py b/releases/2026-10-02/figures/build_corpus_composition_figure.py new file mode 100644 index 0000000000000000000000000000000000000000..d7aa6f54a230afcb5d4488e969b969e61f9bc244 --- /dev/null +++ b/releases/2026-10-02/figures/build_corpus_composition_figure.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +"""Plot full GlyCorpus composition from its source-bound three-category CSV. + +Run this file from any directory; only Supplementary Figure 8 is written. +The palette is the saved Nature BPG palette (ggsci NPG nrc), first three +ordered colors at 0.6 opacity. Source hashes and curation predicates are +recorded in the input CSV; counts describe records, not chemical validity. +""" +from pathlib import Path +import argparse +import csv +import math + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +from PIL import Image + +PACKAGE = Path(__file__).resolve().parents[2] +STEM = "Supplementary_Figure_8_corpus_composition" +# Exact alpha_0_6_hex8 values from nature-bpg/assets/nature-bpg-palette.json. +COLORS = ["#E64B3599", "#4DBBD599", "#00A08799"] + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--package-dir', type=Path, default=PACKAGE) + parser.add_argument('--outdir', type=Path) + args = parser.parse_args() + source = args.package_dir / "04_source_data/figure_inputs/Supplementary_Figure_8_corpus_composition.csv" + outdir = args.outdir or args.package_dir / "05_figures" + with source.open(newline="") as handle: + rows = list(csv.DictReader(handle)) + categories = [row["category"] for row in rows] + counts = [int(row["count"]) for row in rows] + total = int(rows[0]["denominator"]) + assert categories == ["Structure-defined", "Auxiliary WURCS 2.0 context", "Outside main set"] + assert len(rows) == 3 and sum(counts) == total + assert all(int(row["denominator"]) == total for row in rows) + assert all(len(row["source_sha256"]) == 64 for row in rows) + percentages = [100 * count / total for count in counts] + assert all(abs(float(row["percentage"]) - pct) < 1e-10 + for row, pct in zip(rows, percentages)) + + plt.rcParams.update({"font.family": "Arial", "font.size": 10.5, + "pdf.fonttype": 42, "ps.fonttype": 42, + "svg.fonttype": "none"}) + fig = plt.figure(figsize=(6.5, 4.7), facecolor="white") + fig.text(.025, .96, "GlyCorpus composition", ha="left", va="center", + fontsize=13, weight="bold", color="#25282B") + fig.text(.5, .902, f"Full corpus: {total:,} records", ha="center", va="center", + fontsize=10, color="#4B5156") + ax = fig.add_axes([.035, .015, .93, .84]) + wedges, _ = ax.pie(counts, colors=COLORS, startangle=90, + counterclock=True, normalize=True, + wedgeprops={"edgecolor": "white", "linewidth": 1.25}) + ax.set(aspect="equal", xlim=(-1.36, 1.36), ylim=(-1.07, 1.23)) + ax.axis("off") + for i, x in enumerate([-.50, .50]): + label = categories[i].replace("WURCS 2.0 context", "WURCS 2.0\ncontext") + ax.text(x, .14, label, ha="center", va="center", fontsize=10.5, + color="#25282B", linespacing=1.2) + ax.text(x, -.17, f"{counts[i]:,}\n{percentages[i]:.2f}%", ha="center", + va="center", fontsize=10.5, color="#25282B", linespacing=1.3) + small = wedges[2] + angle = math.radians((small.theta1 + small.theta2) / 2) + point = (math.cos(angle), math.sin(angle)) + ax.annotate(f"{categories[2]}\n{counts[2]:,} ({percentages[2]:.2f}%)", + xy=point, xytext=(.40, 1.16), ha="left", va="center", + fontsize=10.5, color="#25282B", linespacing=1.25, + arrowprops={"arrowstyle": "-", "color": "#555B60", "lw": .7, + "connectionstyle": "angle,angleA=0,angleB=90,rad=0"}) + outdir.mkdir(parents=True, exist_ok=True) + for extension in ("svg", "pdf", "png"): + fig.savefig(outdir / f"{STEM}.{extension}", dpi=300, facecolor="white") + with Image.open(outdir / f"{STEM}.png") as image: + image.convert("RGB").save(outdir / f"{STEM}.tif", compression="tiff_lzw", + dpi=(300, 300)) + plt.close(fig) + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/figures/build_grey_seal_figure5.py b/releases/2026-10-02/figures/build_grey_seal_figure5.py new file mode 100644 index 0000000000000000000000000000000000000000..2388a4bb3ffed2aa1c50c7d5a06d275d45217eab --- /dev/null +++ b/releases/2026-10-02/figures/build_grey_seal_figure5.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +"""Compatibility entrypoint: rebuild final IAR Figures 4 and 5 together.""" +from pathlib import Path +import argparse +import json +import subprocess +import sys + + +HERE = Path(__file__).resolve().parent + + +def build(package_dir, outdir=None, source_csv=None, inputs=None): + """Preserve the main figure builder's build(package_dir, outdir) interface.""" + if source_csv is not None: + raise ValueError("The eight-row --source-csv workflow is superseded; use the final job --inputs directory.") + package_dir = Path(package_dir) + outdir = Path(outdir) if outdir is not None else package_dir / "05_figures" + script = HERE / "final_iar/build_final_iar_figures.py" + command = [sys.executable, str(script), "--outdir", str(outdir)] + if inputs is not None: + command.extend(["--inputs", str(inputs)]) + subprocess.run(command, check=True) + return json.loads((outdir / "build_receipt.json").read_text()) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--package-dir", type=Path, default=HERE.parents[1]) + parser.add_argument("--outdir", type=Path) + parser.add_argument("--inputs", type=Path) + parser.add_argument("--source-csv", type=Path, help="Superseded; final inputs are required.") + args = parser.parse_args() + build(args.package_dir, args.outdir, args.source_csv, args.inputs) + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/figures/build_submission_figures.py b/releases/2026-10-02/figures/build_submission_figures.py new file mode 100644 index 0000000000000000000000000000000000000000..d930bad33e133b5b81fa6f2fa6a1197aa6edd272 --- /dev/null +++ b/releases/2026-10-02/figures/build_submission_figures.py @@ -0,0 +1,374 @@ +#!/usr/bin/env python3 +"""Rebuild revision figures from named local evidence; leave originals unchanged.""" +from pathlib import Path +import csv, json, hashlib, shutil +import numpy as np +import pandas as pd +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from matplotlib import patches +from matplotlib.colors import ListedColormap, BoundaryNorm +import openpyxl +from PIL import Image + +PACKAGE = Path(__file__).resolve().parents[2] +REVIEW = PACKAGE.parent +OUT = PACKAGE / '05_figures' +WORK = PACKAGE / '_verification/figure_work' +ORIGINAL = PACKAGE / '_original_submission' +TABLE = PACKAGE / '04_source_data/review_table1_cells.csv' +OUT.mkdir(exist_ok=True, parents=True) +plt.rcParams.update({'font.family':'Arial','font.size':9,'pdf.fonttype':42,'ps.fonttype':42, + 'svg.fonttype':'none','axes.spines.top':False,'axes.spines.right':False, + 'axes.linewidth':.65,'xtick.major.width':.65,'ytick.major.width':.65}) +C = dict(blue='#1687C9',pink='#D95789',green='#4F9B59',purple='#8275AC',teal='#008F84', + gold='#E3AA39',ink='#25282B',line='#777D81',grid='#E6E9EB', + pale_blue='#EBF4F9',pale_pink='#FBEDF2',pale_green='#EEF5EA',pale_purple='#F1EEF8') + +def save(fig, stem): + for fmt in ('pdf','svg','png'): + fig.savefig(OUT/f'{stem}.{fmt}',dpi=300,facecolor='white') + with Image.open(OUT/f'{stem}.png') as im: + im.convert('RGB').save(OUT/f'{stem}.tif',compression='tiff_lzw',dpi=(300,300)) + plt.close(fig) + +def axis_canvas(fig, pos): + ax=fig.add_axes(pos);ax.set(xlim=(0,1),ylim=(0,1));ax.axis('off');return ax + +def box(ax,x,y,w,h,text,fill='white',edge='#7F878C',fs=9,bold=False): + ax.add_patch(patches.FancyBboxPatch((x,y),w,h,boxstyle='round,pad=0.008,rounding_size=0.016', + linewidth=.85,edgecolor=edge,facecolor=fill,clip_on=False)) + ax.text(x+w/2,y+h/2,text,ha='center',va='center',fontsize=fs, + weight='bold' if bold else 'normal',color=C['ink'],linespacing=1.3) + +def arrow(ax,start,end,color=None,lw=1): + ax.annotate('',xy=end,xytext=start,arrowprops=dict(arrowstyle='-|>',color=color or C['line'], + lw=lw,shrinkA=1,shrinkB=1,mutation_scale=9)) + +def panel(ax,letter,title): + ax.text(0,1.035,letter,fontsize=15,weight='bold',va='bottom',transform=ax.transAxes) + ax.text(.045,1.035,title,fontsize=11,va='bottom',transform=ax.transAxes) + +def footer(fig,text): + fig.text(.025,.017,text,ha='left',va='bottom',fontsize=7.3,color='#4B5156',linespacing=1.3) + +def snfg(ax, x, y, scale=.13, asymmetric=False): + """Graph topology copied from submitted Fig3c; Fuc moved to reducing GlcNAc. + + The original SVG incorrectly attaches Fuc to distal GlcNAc at core index 1. + Correct edge is Fuc alpha1-6 -> reducing-end core index 0 (guide R2-09). + Other linkage positions are deliberately not asserted in this illustration. + """ + pts={0:(0,0),1:(0,1),2:(0,2),3:(-.55,3),4:(.55,3),5:(-.55,4),6:(-.55,5),9:(-.95,-.25)} + if not asymmetric:pts.update({7:(.55,4),8:(.55,5)}) + edges=[(0,1),(1,2),(2,3),(2,4),(3,5),(5,6),(0,9)] + if not asymmetric:edges += [(4,7),(7,8)] + for a,b in edges: + pa,pb=pts[a],pts[b];ax.plot([x+pa[0]*scale,x+pb[0]*scale], + [y+pa[1]*scale,y+pb[1]*scale],lw=.9,c='#333333',zorder=1) + ax.plot([x,x],[y-.45*scale,y],lw=.9,c='#333333') + for key,(px,py) in pts.items(): + marker='s' if key in (0,1,5,7) else '^' if key==9 else 'o' + color='#0385AE' if marker=='s' else '#C23537' if key==9 else '#FCC326' if key in (6,8) else '#058F60' + ax.scatter([x+px*scale],[y+py*scale],s=(scale*70)**2, + marker=marker,c=color,edgecolors='#333333',linewidths=.5,zorder=3) + ax.text(x-.67*scale,y-.67*scale,r'$\alpha$1-6',ha='center',fontsize=7) + +def historical_exact(): + wb=openpyxl.load_workbook(ORIGINAL/'Source Data.xlsx',read_only=True,data_only=True) + for old,new,label in [(6,4,'Historical submitted masking analysis')]: + raw=list(wb[f'Supp. Fig. {old}'].values) + if old==6: + rows=[dict(zip(raw[0],r)) for r in raw[1:] if r[0]] + ys=[r['exact_span_accuracy'] for r in rows] + ns=[r['num_cases'] for r in rows] + labels=[r['masking_plan'] for r in rows] + else: + rows=[dict(zip(raw[0],r)) for r in raw[1:] if r[0]] + ys=[r['Exact span accuracy'] for r in rows] + ns=[r['Glycans evaluated'] for r in rows] + labels=[r['Point label'] for r in rows] + fig,ax=plt.subplots(figsize=(8.4,3.7)) + fig.subplots_adjust(left=.09,right=.98,top=.79,bottom=.31) + colors=[C['blue']]*3+[C['pink']]*3+[C['purple']]*2 + x=np.arange(8) + ax.scatter(x,ys,s=45,c=colors,zorder=3) + for a,b,col in [(0,3,C['blue']),(3,6,C['pink']),(6,8,C['purple'])]: + ax.plot(x[a:b],ys[a:b],c=col,lw=1.15) + for i,(v,n) in enumerate(zip(ys,ns)): + ax.text(i,v+.042,f'{v:.3f}',ha='center',fontsize=8.5) + display_labels=[s.replace(' + ','\n+ ') for s in labels] + ax.set(ylim=(0,1.09),xticks=x,xticklabels=[f'{s}\n(n={n:,})' for s,n in zip(display_labels,ns)], + ylabel='Per-glycan exact-span accuracy') + ax.tick_params(axis='x',labelsize=8,length=0,pad=7) + ax.set_yticks(np.arange(0,1.1,.2));ax.grid(axis='y',color=C['grid'],zorder=0) + fig.text(.025,.94,f'Supplementary Figure {new} | {label}',fontsize=12,weight='bold') + fig.text(.025,.866,'Historical diagnostic; not a validation of WA3 or of naturally ambiguous linkages.',fontsize=9) + footer(fig,'All masked spans in a glycan must be correct; abstentions count as incorrect. Confidence threshold = 0.80.\n' + 'Points are aggregate accuracies; no independent replicate intervals are available. n denotes evaluated glycans.') + stem=f'Supplementary_Figure_{new}_historical_exact_span' + save(fig,stem) + pd.DataFrame({'condition':labels,'evaluated_glycans':ns,'exact_span_accuracy':ys, + 'source_sheet':f'Supp. Fig. {old}', + 'model_lineage':'submitted WA0 / historical' if old==7 else 'historical submitted analysis; checkpoint binding unverified'}).to_csv(OUT/f'{stem}_source.csv',index=False) + wb.close() + +def figure2(): + df=pd.read_csv(TABLE) + eps=['domain','kingdom','phylum','class','order','family','genus','species','immunogenicity','linkage','interaction_851'] + rank_source=pd.read_csv(PACKAGE/'04_source_data/figure_inputs/Figure_2_corrected_descriptive_ranks.csv').set_index('model') + ranks=rank_source[eps] + vals=df[df.endpoint.isin(eps)].pivot(index='model',columns='endpoint',values='mean').reindex(columns=eps) + expected=vals.rank(ascending=False,method='average').reindex(ranks.index) + assert np.allclose(ranks.to_numpy(),expected.to_numpy(),equal_nan=True) + for e in eps: + n=int(ranks[e].notna().sum());assert abs(ranks[e].sum()-n*(n+1)/2)<1e-9 + means=rank_source['mean_rank_11'] + assert np.allclose(means.dropna(),ranks.mean(axis=1).loc[means.dropna().index]) + assert ranks.notna().sum(axis=1).equals(rank_source['ranked_endpoint_count']) + assert (ranks.eq(1).sum(axis=1)==rank_source['first_place_count']).all() + assert pd.isna(means['GNNGly']) and ranks.loc['GNNGly'].notna().sum()==10 + assert np.isclose(means['BERTose (WA3)'],15/11) and rank_source.loc['BERTose (WA3)','first_place_count']==9 + order=means.drop('GNNGly').sort_values().index.tolist()+['GNNGly'] + ranks=ranks.loc[order] + fig=plt.figure(figsize=(14,9.4)) + a=axis_canvas(fig,[.035,.755,.93,.185]);panel(a,'a','Matched benchmark context') + for x,w,t,col in [(.0,.20,'BERTose\nreported checkpoint',C['pale_blue']), + (.265,.20,'24 comparator families\nmatched downstream recipe',C['pale_green']), + (.53,.20,'Joint822 held-out view\nthree downstream seeds',C['pale_purple']), + (.795,.195,'Endpoint-wise metrics\nmean and sample SD',C['pale_pink'])]: + box(a,x,.39,w,.50,t,fill=col,fs=10) + for xx in [.2,.465,.73]:arrow(a,(xx+.008,.64),(xx+.054,.64)) + a.text(0,.13,'The reported weighting configuration was chosen after held-out results were available. These comparisons are descriptive; exposure, tuning and hardware limitations apply.',fontsize=9) + b=fig.add_axes([.145,.145,.43,.565]);panel(b,'b','Endpoint-wise descriptive ranks') + cmap=ListedColormap(['#A9C3DA','#BCD0E2','#CFDCEA','#E7ECEF']) + disp=np.where(ranks.to_numpy()<=3,ranks.to_numpy(),4) + im=b.pcolormesh(np.arange(-.5,len(eps)+.5),np.arange(-.5,len(order)+.5),np.ma.masked_invalid(disp), + cmap=cmap,norm=BoundaryNorm([.5,1.5,2.5,3.5,4.5],4),shading='flat') + b.set(xlim=(-.5,len(eps)-.5),ylim=(len(order)-.5,-.5)) + for i,row in enumerate(ranks.to_numpy()): + for j,v in enumerate(row):b.text(j,i,'NA' if np.isnan(v) else f'{v:g}',ha='center',va='center',fontsize=8.3,color='#30383E') + b.set_yticks(range(len(order)),['BERTose' if s=='BERTose (WA3)' else s.replace('BERTose','Bertose').replace('_','-') for s in order],fontsize=8.5) + b.set_xticks(range(len(eps)),['Domain','Kingdom','Phylum','Class','Order','Family','Genus','Species','Immunogenicity','Linkage','Interaction'],rotation=45,ha='right',fontsize=8.3) + b.tick_params(length=0);b.spines[['left','bottom']].set_visible(False) + for tick in b.get_yticklabels(): + if tick.get_text()=='BERTose':tick.set_weight('bold') + c=fig.add_axes([.635,.145,.305,.565]);panel(c,'c','All endpoint ranks, with mean') + for i,name in enumerate(order): + v=ranks.loc[name].dropna().values + jitter=np.linspace(-.18,.18,len(v)) + col=C['pink'] if 'WA3' in name else '#6387A1' + c.scatter(v,i+jitter,s=13,c=col,alpha=.8,zorder=3) + if name!='GNNGly': + c.boxplot([v],positions=[i],vert=False,widths=.55,showfliers=False,manage_ticks=False, + patch_artist=True,boxprops={'facecolor':'none','edgecolor':'#8C959A','linewidth':.65}, + medianprops={'color':'#777777','linewidth':.7},whiskerprops={'color':'#8C959A','linewidth':.65},capprops={'color':'#8C959A','linewidth':.65}) + m=means[name];c.scatter([m],[i],marker='D',s=24,c=col,edgecolors='white',linewidths=.4,zorder=5) + c.text(26.1,i,f'{m:.2f}',va='center',fontsize=8) + else:c.text(26.1,i,'n=10',va='center',fontsize=8) + c.set(ylim=(24.5,-.5),xlim=(.3,29.4),yticks=[],xticks=[1,5,10,15,20,25],xlabel='Rank (lower is better)') + c.grid(axis='x',color=C['grid'],zorder=0);c.spines['left'].set_visible(False) + footer(fig,'Higher metric is better; tied values receive average ranks. Ranks use source-bound, unrounded metric means, including immunogenicity average precision.\n' + 'Domain ranks are arithmetic summaries, not a superiority claim. GNNGly has no scoreable linkage fit; its ten points have no comparable mean.\n' + 'Boxes: median and interquartile range; whiskers: 1.5×IQR. Dots: individual endpoint ranks (n=11, except GNNGly n=10); diamonds: mean ranks. Eight taxonomy ranks are correlated.') + save(fig,'Figure_2_current_benchmark') + +def supplementary_schematics(): + import runpy + with plt.rc_context(): + drawing = runpy.run_path(str(Path(__file__).with_name('build_supplement_presentation.py')), run_name='_supplement_presentation') + drawing['figure1'](OUT, drawing['load_counts'](PACKAGE)) + +def corrected_snfg(): + fig=plt.figure(figsize=(5.6,3.2));ax=axis_canvas(fig,[.03,.12,.94,.8]);ax.set_aspect('equal') + ax.set(xlim=(-.1,1.05),ylim=(-.1,.92)) + snfg(ax,.25,.16,.105);snfg(ax,.8,.16,.105,asymmetric=True) + ax.text(.525,.85,'Corrected illustrative core-fucosylated glycans',ha='center',fontsize=11) + ax.text(.525,-.065,'Fuc connects to the reducing-end GlcNAc via α1-6.',ha='center',fontsize=9) + save(fig,'Figure_3_SNFG_corrected_examples') + +def draw_affinose_results(fig, ypos, height, with_panel=True): + df=pd.read_csv(PACKAGE/'04_source_data/review_affinose_results.csv') + individuals=pd.read_csv(PACKAGE/'04_source_data/review_affinose_individual_values.csv') + methods=df.method.drop_duplicates().tolist() + labels={'Affinose':'BERToseBind', + 'LectinOracle ESM-C stock':'LectinOracle · ESM-C (primary)', + 'LectinOracle ESM-C matched tuning':'LectinOracle · matched tuning', + 'LectinOracle ESM-1b':'LectinOracle · ESM-1b', + 'LectinOracle flex':'LectinOracle · flex', + 'GIFFLAR LGI gifflarESM':'GIFFLAR LGI · gifflarESM', + 'GIFFLAR LGI sweetnetESM':'GIFFLAR LGI · sweetnetESM'} + regimes=['glycan-cold','protein-cold','doubly-cold'] + for k,regime in enumerate(regimes): + ax=fig.add_axes([.275+.233*k,ypos,.205,height]) + data=df[df.regime==regime].set_index('method').loc[methods] + for i,(name,r) in enumerate(data.iterrows()): + col=C['pink'] if name=='Affinose' else C['blue'] if r['kind']=='neural' else '#6E797F' + marker='D' if r['n_fits']==3 else 's' + raw=individuals[(individuals.method==name)&(individuals.regime==regime)].value.to_numpy() + if len(raw): + ax.scatter(raw,i+np.linspace(-.17,.17,len(raw)),s=13,facecolors='white',edgecolors=col, + linewidths=.7,zorder=4) + if pd.notna(r['mean']): + ax.errorbar(r['mean'],i,xerr=r['sample_sd'] if pd.notna(r['sample_sd']) else None, + fmt=marker,ms=5,color=col,lw=1,capsize=2,zorder=3) + ax.text(.432,i,f'{r["mean"]:.4f}',ha='right',va='center',fontsize=8.1,color=C['ink']) + else:ax.text(.12,i,'undefined',ha='center',va='center',fontsize=8,color='#777777') + ax.set(xlim=(-.042,.44),ylim=(len(methods)-.5,-.5),xticks=[0,.1,.2,.3],xlabel='Equal-assay macro Spearman') + ax.axvline(0,c='#B3B9BD',lw=.65);ax.grid(axis='x',color=C['grid'],zorder=0) + ax.set_yticks(range(len(methods))) + ax.set_yticklabels([labels.get(m,m.replace('baseline - ','').replace('_',' ')) for m in methods] if k==0 else [],fontsize=8.7) + ax.tick_params(axis='y',length=0,pad=10);ax.spines['left'].set_visible(False) + for t in ax.get_yticklabels(): + if t.get_text()=='BERToseBind':t.set_weight('bold') + ax.set_title(regime.replace('-',' ').capitalize()+f'\n{[1767,246,212][k]:,} eligible assays',fontsize=10,pad=10) + if with_panel and k==0: + ax.text(-1.23,1.13,'d Performance across three test regimes',transform=ax.transAxes, + fontsize=12,weight='bold',va='bottom') + return df + +def figure3(): + fig=plt.figure(figsize=(14,10.5)) + a=axis_canvas(fig,[.035,.705,.29,.23]);panel(a,'a','BERToseBind target construction') + box(a,.015,.69,.31,.22,'CarboGrove\nbinding measurements',C['pale_green'],fs=8) + box(a,.015,.36,.31,.22,'glycowork\nbinding measurements',C['pale_blue'],fs=8) + box(a,.43,.50,.54,.27,'Assay-aware curation\nprotein · glycan · assay',C['pale_purple'],fs=9) + arrow(a,(.33,.80),(.425,.70));arrow(a,(.33,.47),(.425,.57)) + box(a,.43,.075,.54,.25,'Within-assay rank target\n(equal-assay evaluation)',C['pale_pink'],fs=9) + arrow(a,(.7,.49),(.7,.34)) + a.text(.015,.09,'Observed binding\nassays define targets.',fontsize=8.5) + b=axis_canvas(fig,[.36,.685,.29,.25]);panel(b,'b','BERToseBind architecture') + box(b,.005,.74,.45,.20,'Bertose glycan tokens\n768 → 512',C['pale_pink'],fs=8.7) + box(b,.545,.74,.45,.20,'ESM-C 300M protein tokens\n960 → 512',C['pale_blue'],fs=8.7) + box(b,.155,.405,.69,.23,'2 bidirectional cross-attention layers\nmasked mean pooling · concatenate',C['pale_purple'],fs=8.5) + arrow(b,(.23,.735),(.31,.645));arrow(b,(.77,.735),(.69,.645)) + box(b,.005,.08,.50,.20,'MLP 1024 → 256 → 256 → 1',C['pale_blue'],fs=8) + arrow(b,(.41,.4),(.25,.285)) + box(b,.565,.08,.43,.20,'165 motif counts\nlinear additive score',C['pale_green'],fs=8) + b.text(.53,.18,'+',ha='center',va='center',fontsize=16) + b.text(.50,-.065,'Jointly trained; first four Bertose layers frozen.',ha='center',fontsize=8.3) + c=axis_canvas(fig,[.69,.685,.28,.25]);panel(c,'c','Frozen test regimes') + rows=[['','Glycan-cold','Protein-cold','Doubly-cold'], + ['Train rows','484,491','480,431','406,483'], + ['Validation','36,745','39,477','3,822'], + ['Test rows','37,295','38,539','3,691'], + ['Test assays','1,767','246','212']] + table=c.table(cellText=rows,cellLoc='center',bbox=[0,.52,.99,.42],colWidths=[.25,.25,.25,.25]) + table.auto_set_font_size(False);table.set_fontsize(7.9) + for (row,col),cell in table.get_celld().items(): + cell.set_edgecolor('#D0D8DD');cell.set_linewidth(.5) + if row==0:cell.set_facecolor(C['pale_blue']);cell.set_text_props(weight='bold') + # Corrected core motif, explicitly illustrative rather than a claimed sampled glycan. + inset=fig.add_axes([.735,.647,.20,.15]);inset.axis('off');inset.set(xlim=(-.2,1.05),ylim=(-.1,.8),aspect='equal') + snfg(inset,.17,.07,.105);snfg(inset,.78,.07,.105,asymmetric=True) + c.text(.52,-.21,'Illustrative SNFG; core Fuc is α1-6\nto the reducing-end GlcNAc.',ha='center',fontsize=8) + draw_affinose_results(fig,.13,.395,True) + footer(fig,'All 13 current methods. Diamonds: three-fit means; squares: one fit; small open circles: all 45 individual BERToseBind/LectinOracle values. Bars: three-fit sample SD.\n' + 'Learned-model eligibility denominators are 1,767 / 246 / 212 assays. The six simple baselines retain their reported scoring denominators (glycan-cold estimands differ).\n' + 'LectinOracle source scores are recorded to four decimals; glycan-cold values and SDs receive the same eligibility factor.\n' + 'Uncertainty reflects downstream seeds only, not held-out components. The primary LectinOracle doubly-cold value uses the D3 rerun draw.') + save(fig,'Figure_3_current_Affinose') + fig=plt.figure(figsize=(13.5,6.5)) + draw_affinose_results(fig,.18,.64,True) + footer(fig,'All 13 current methods. Diamonds: three-fit means; squares: one fit; small open circles: all 45 individual BERToseBind/LectinOracle values. Bars: three-fit sample SD.\n' + 'Learned models use data-only eligible denominators. Baseline glycan-cold scores retain their reported denominators; they are not fully harmonized.\n' + 'LectinOracle source scores are recorded to four decimals; glycan-cold values and SDs receive the same eligibility factor.\n' + 'Seed variation is not held-out-component uncertainty. D3 rerun used for the primary comparator on doubly-cold.') + save(fig,'Figure_3d_all_methods_macro') + +def figure1(): + fig=plt.figure(figsize=(13,8.8)) + a=axis_canvas(fig,[.035,.41,.93,.53]);panel(a,'a','BERTose: four representation slots') + branches=[('Sequence + topology','WURCS 2.0-aware BPE\n2,114 vocabulary items\naligned residue/tree channels', + 'Sequence encoder\n768 dimensions',C['pale_blue'],C['blue']), + ('Mass spectrometry','80–2,200 Da · 10-Da bins\nbin maxima → normalize → top 30\nLOW / MED / HIGH intensity', + 'MS encoder\n768 dimensions',C['pale_pink'],C['pink']), + ('Generated static structure','In-house GLYCAM conformers\nEGNN → residue pooling → 128-D\n4-stage RVQ: 4 code IDs/residue', + 'Static-token encoder\n768 dimensions',C['pale_green'],C['green']), + ('Molecular dynamics','20 consecutive 1-ns windows\n6 standardized descriptors/window\nseparate reducing-end states', + 'Bidirectional GRU\nmean pool → 768 dimensions',C['pale_purple'],C['purple'])] + for i,(lab,prep,enc,fill,edge) in enumerate(branches): + yy=.76-i*.235 + a.text(.005,yy+.15,lab,fontsize=9.5,weight='bold',color=edge) + box(a,.19,yy-.015,.34,.19,prep,fill=fill,edge=edge,fs=8.8) + box(a,.585,yy-.015,.22,.19,enc,fill=fill,edge=edge,fs=8.7) + arrow(a,(.535,yy+.08),(.58,yy+.08),edge) + a.plot([.813,.835,.835],[yy+.08,yy+.08,.50],color=edge,lw=.9) + box(a,.865,.33,.13,.35,'Concatenate\n4 × 768\n\nFusion MLP',fill='#F1F3F4',fs=9) + arrow(a,(.837,.50),(.86,.50)) + a.text(.59,-.013,'Unavailable auxiliary slots are exact zero vectors.',fontsize=8.3) + b=axis_canvas(fig,[.04,.12,.43,.205]);panel(b,'b','Five pretraining objectives') + labels=['Sequence masked-token prediction (fused representation)', + 'Topology: residue-graph shortest-path distances', + 'MS: coarse intensity-token prediction', + 'Static structure: slot-specific RVQ-code prediction', + 'MD: reconstruction of three masked windows per state'] + for i,s in enumerate(labels): + b.scatter([.017],[.91-i*.18],s=25,c=[C['blue'],C['blue'],C['pink'],C['green'],C['purple']][i]) + b.text(.06,.91-i*.18,s,fontsize=9,va='center') + c=fig.add_axes([.63,.13,.30,.19]);panel(c,'c','Training-parent coverage') + cov=pd.read_csv(PACKAGE/'04_source_data/review_training_modality_coverage.csv') + cov=cov[cov.role=='train'].set_index('modality').loc[['sequence','topology','MS','static','MD']] + yy=np.arange(5);colors=[C['blue'],C['blue'],C['pink'],C['green'],C['purple']] + c.scatter(cov.fraction*100,yy,c=colors,s=38) + for i,(_,row) in enumerate(cov.iterrows()):c.text(124,i,f'{int(row.parents):,}',va='center',ha='right',fontsize=8.7) + c.set(ylim=(4.6,-.6),xlim=(-2,127),yticks=yy,yticklabels=['Sequence','Topology','MS','Static','MD'], + xticks=[0,25,50,75,100],xlabel='Available training parents (%)') + c.tick_params(axis='y',length=0);c.spines['left'].set_visible(False);c.grid(axis='x',color=C['grid']) + footer(fig,'BERTose pretraining schematic. Topology is an auxiliary objective on the sequence representation, not a fifth fusion slot.\n' + 'Coverage denominator: 221,827 model-training sequence parents. Learned preprocessing used training parents only; parents above 256 tokens were excluded whole.\n' + 'Static codes describe generated local geometry; MD is an ordered summary, not coordinate input. This schematic makes no claim of a downstream benefit from any branch.') + save(fig,'Figure_1_current_WA3') + +def current_tokenizer_figures(): + src=PACKAGE/'04_source_data/figure_inputs' + source=src/'review_sequence_parent_index.tsv.gz' + d=pd.read_csv(source,sep='\t',usecols=['pretraining_partition','model_pretraining_contributor','sequence_length','full_untruncated_length']) + d=d[d.pretraining_partition.isin(['pretraining_train','pretraining_development'])] + d=d[d.full_untruncated_length<=256] + assert len(d)==277267 + assert d.sequence_length.max()<=256 + stats={} + hist=[] + fig,ax=plt.subplots(figsize=(8.6,4.8));fig.subplots_adjust(left=.09,right=.965,bottom=.20,top=.85) + for role,col,alpha in [('pretraining_train',C['blue'],.5),('pretraining_development',C['pink'],.45)]: + lengths=d.loc[d.pretraining_partition.eq(role),'sequence_length'].to_numpy() + h=np.bincount(lengths,minlength=257) + stats[role]={'n':len(lengths),'min':int(lengths.min()),'mean':float(lengths.mean()),'median':float(np.median(lengths)), + 'p10':float(np.percentile(lengths,10)),'p90':float(np.percentile(lengths,90)), + 'p99':float(np.percentile(lengths,99)),'max':int(lengths.max())} + label={'pretraining_train':'Training','pretraining_development':'Validation'}[role]+f' (n={len(lengths):,})' + ax.stairs(h[1:],np.arange(.5,257),fill=True,alpha=alpha,color=col,lw=.6,label=label) + hist.extend({'role':role,'bpe_tokens':i,'parent_count':int(h[i])} for i in range(1,257)) + ax.set(xlim=(.5,256.5),xlabel='BPE tokens per glycan',ylabel='Training/validation glycans') + ax.grid(axis='y',color=C['grid']);ax.legend(frameon=False,fontsize=9) + fig.text(.025,.94,'Supplementary Figure 2 | BPE token-length distribution',fontsize=12,weight='bold') + footer(fig,'Vocabulary: 2,114 items. Sequences longer than 256 tokens were excluded.\n' + 'Training and validation distributions are shown separately.') + save(fig,'Supplementary_Figure_2_current_token_lengths') + pd.DataFrame(hist).to_csv(OUT/'Supplementary_Figure_2_token_length_counts.csv',index=False) + stats['source']={'path':str(source.resolve()),'sha256':hashlib.sha256(source.read_bytes()).hexdigest()} + (WORK/'token_length_summary.json').write_text(json.dumps(stats,indent=2)) + # Use the current editable tokenization figure rather than an older inline drawing. + import subprocess, sys + subprocess.run([sys.executable, str(Path(__file__).with_name('build_token_length_figure2.py')), + '--package-dir', str(PACKAGE), '--outdir', str(OUT)], check=True) + subprocess.run([sys.executable, str(Path(__file__).with_name('build_bpe_figure3.py')), + '--package-dir', str(PACKAGE), '--outdir', str(OUT)], check=True) + +def current_static_figure(): + import runpy + with plt.rc_context(): + drawing = runpy.run_path(str(Path(__file__).with_name('build_supplement_presentation.py')), run_name='_supplement_presentation') + drawing['figure7'](OUT) + +def current_grey_seal_figure(): + import runpy + with plt.rc_context(): + drawing = runpy.run_path(str(Path(__file__).with_name('build_grey_seal_figure5.py')), run_name='_grey_seal_figure5') + drawing['build'](PACKAGE, OUT) + +if __name__=='__main__': + historical_exact();figure2();supplementary_schematics();corrected_snfg();figure3() + figure1();current_tokenizer_figures();current_static_figure();current_grey_seal_figure() diff --git a/releases/2026-10-02/figures/build_supplement_figure1.py b/releases/2026-10-02/figures/build_supplement_figure1.py new file mode 100644 index 0000000000000000000000000000000000000000..995c5aec5552da0bda8459eb08a9493399d2c3cc --- /dev/null +++ b/releases/2026-10-02/figures/build_supplement_figure1.py @@ -0,0 +1,244 @@ +#!/usr/bin/env python3 +"""Recreate Supplementary Figure 1 as editable SVG, retaining the submitted design. + +This is a vector recreation, not recovered original native artwork. Requires +Pillow, pypdf and the CairoSVG command-line program (or its Python module). +Reads packaged CSVs only; no training, inference or scientific recount occurs. +""" +from pathlib import Path +import argparse +import csv +import hashlib +import importlib.util +import io +import json +import shutil +import subprocess +import sys +from xml.sax.saxutils import escape +from PIL import Image, ImageFont +from pypdf import PdfReader, PdfWriter + +HERE = Path(__file__).resolve().parent +STEM = 'Supplementary_Figure_1_corpus_provenance' +FLOW = 'partition_count_flow.csv' +COMPOSITION = 'Supplementary_Figure_8_corpus_composition.csv' + + +def sha(path): + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + + +def read_csv(path): + with Path(path).open(newline='') as handle: + return list(csv.DictReader(handle)) + + +def default_sources(package=None): + if package is not None: + base = Path(package) / '04_source_data' + return base / 'benchmark_exclusion' / FLOW, base / 'figure_inputs' / COMPOSITION + if (HERE / 'inputs' / FLOW).exists(): + return HERE / 'inputs' / FLOW, HERE / 'inputs' / COMPOSITION + return default_sources(HERE.parents[1]) + + +def values(counts, composition): + get = lambda key: int(counts[key]['count']) + v = dict(full=get('Full GlyCorpus resource'), held=get('Outside main set on curation grounds'), + eligible=get('Main-set eligible records'), missing=get('Main-set eligible record missing sequence payload'), + sequence=get('Eligible sequence-bearing parents'), excluded=get('Excluded identity-match union'), + exact=get('Exact canonical-WURCS matches'), graph=get('Additional verified graph-identity matches'), + retained=get('Retained training-plus-development parents'), + train=get('Training parents and learned-preprocessing fit contributors'), + validation=get('Development parents'), + train_long=get('Over-length training parents excluded from sequence objective'), + validation_long=get('Over-length development parents excluded from sequence objective'), + train_final=get('Training sequence parents'), validation_final=get('Development sequence parents')) + categories = {row['category']: row for row in composition} + v['structure'] = int(categories['Structure-defined']['count']) + v['context'] = int(categories['Auxiliary WURCS 2.0 context']['count']) + assert int(categories['Outside main set']['count']) == v['held'] + assert all(int(row['denominator']) == v['full'] for row in composition) + assert v['structure'] + v['context'] + v['held'] == v['full'] + assert v['full'] - v['held'] == v['eligible'] + assert v['eligible'] - v['missing'] == v['sequence'] + assert v['exact'] + v['graph'] == v['excluded'] + assert v['sequence'] - v['excluded'] == v['retained'] == v['train'] + v['validation'] + assert v['train'] - v['train_long'] == v['train_final'] + assert v['validation'] - v['validation_long'] == v['validation_final'] + return v + + +def make_svg(v): + # Retain the submitted three-card design with larger type and compact spacing. + parts = ['', + 'GlyCorpus pipeline', + 'Resource curation, sequence availability, benchmark identity exclusions and retained parent partitions. Editable three-card design.', + '', + '', + '', + '', + '', + '', + '', + ''] + + def text(x, y, content, size=10, bold=False, anchor='middle'): + parts.append(f'{escape(str(content))}') + + def rect(x, y, w, h, fill, stroke='#8B9296', radius=5): + parts.append(f'') + + def arrow(x1, x2, y): + parts.append(f'') + + text(10, 20, 'GlyCorpus pipeline', 13, True, 'start') + rect(10, 36, 132, 205, 'url(#grey)') + rect(225, 36, 76, 205, 'url(#blue)') + rect(381, 36, 77, 205, 'url(#teal)') + rect(146, 44, 75, 96, 'url(#process)', '#CFCFCF', 3) + rect(305, 44, 72, 96, 'url(#process)', '#CFCFCF', 3) + arrow(143, 225, 149) + arrow(302, 381, 149) + parts.append('') + rect(146, 167, 75, 69, 'url(#orange)', 'none', 6) + rect(303.5, 167, 75, 69, 'url(#orange)', 'none', 6) + # Two documents merging, and a funnel, keep the original process-icon roles. + parts.append('' + '' + '' + '' + '' + '' + '' + '' + '') + text(76, 58, 'GlyCorpus resource', 11, True) + text(76, 101, f"{v['full']:,}", 16, True) + text(76, 117, 'records') + for y, number, label in [(146,v['structure'],'structure-defined'), + (181,v['context'],'auxiliary context'), + (216,v['held'],'withheld during curation')]: + text(76, y, f'{number:,}', 12, True) + text(76, y+13, label, 10 if y<216 else 9.5) + text(183.5, 102, 'Curation +', 10, True) + text(183.5, 114, 'sequence', 10, True) + text(183.5, 126, 'checks', 10, True) + text(183.5, 184, f"{v['held']:,}", 12, True) + text(183.5, 197, 'withheld', 9.5) + text(183.5, 209, f"+ {v['missing']} record", 9.5) + text(183.5, 221, 'without', 9.5) + text(183.5, 232, 'sequence data', 9.5) + text(263, 58, 'Eligible', 11, True) + text(263, 73, 'parent glycans', 9.5) + text(263, 111, f"{v['sequence']:,}", 15, True) + text(263, 129, 'with sequence', 9.5) + text(263, 143, 'data', 10) + text(341, 102, 'Benchmark', 10, True) + text(341, 114, 'identity', 10, True) + text(341, 126, 'filter', 10, True) + text(341, 188, f"{v['excluded']:,}", 12, True) + text(341, 202, 'identity', 10) + text(341, 215, 'matches', 10) + text(341, 228, 'excluded', 10) + text(419.5, 52, 'After', 10, True) + text(419.5, 65, 'benchmark', 10, True) + text(419.5, 78, 'exclusions', 10, True) + text(419.5, 111, f"{v['retained']:,}", 15, True) + text(419.5, 129, 'parent glycans', 9.5) + text(419.5, 143, 'retained', 10) + text(419.5, 181, f"{v['train']:,}", 12, True) + text(419.5, 194, 'training', 10) + text(419.5, 216, f"{v['validation']:,}", 12, True) + text(419.5, 229, 'validation', 10) + parts.append('') + return '\n'.join(parts) + '\n' + + +def caption(v): + # Final author-approved caption; source-count assertions remain in values(). + return 'Supplementary Figure 1 | GlyCorpus pipeline. Curation, benchmark exclusion and pretraining partitions. Of 285,050 records, 3,841 were withheld during curation and one lacked sequence data. A further 3,833 parents matched benchmark glycans by exact WURCS 2.0 or verified graph identity. Preprocessing used 221,899 training parents; the 256-token limit left 221,827 training and 55,440 validation glycans for pretraining.\n' + + +def render(svg, out): + command = shutil.which('cairosvg') + if command: + command = [command] + elif importlib.util.find_spec('cairosvg'): + command = [sys.executable, '-m', 'cairosvg'] + else: + raise RuntimeError('Install CairoSVG or place its cairosvg command on PATH to export PNG/PDF from the editable SVG.') + png = out / f'{STEM}.png' + pdf = out / f'{STEM}.pdf' + subprocess.run(command + [str(svg), '-f', 'png', '--output-width', '1950', '--output-height', '1050', '-o', str(png)], check=True) + subprocess.run(command + [str(svg), '-f', 'pdf', '-o', str(pdf)], check=True) + # Stable PDF metadata permits byte-for-byte reproduction without changing artwork. + reader = PdfReader(io.BytesIO(pdf.read_bytes())) + writer = PdfWriter() + writer.append_pages_from_reader(reader) + writer.add_metadata({'/Title': 'Supplementary Figure 1 | GlyCorpus pipeline', + '/Creator': 'build_supplement_figure1.py', + '/CreationDate': 'D:20260927000000Z', '/ModDate': 'D:20260927000000Z'}) + with pdf.open('wb') as handle: + writer.write(handle) + with Image.open(png) as im: + rgb = im.convert('RGB') + rgb.save(png, dpi=(300, 300)) + rgb.save(out / f'{STEM}.tif', compression='tiff_lzw', dpi=(300, 300)) + + +def figure1(out, counts, composition_path=None): + """Keep the historical figure1(out, counts) callable API; return its receipt.""" + out = Path(out) + out.mkdir(parents=True, exist_ok=True) + if composition_path is None: + composition_path = default_sources()[1] + composition_path = Path(composition_path) + composition = read_csv(composition_path) + v = values(counts, composition) + svg = out / f'{STEM}.svg' + svg.write_text(make_svg(v)) + caption_path = out / 'Supplementary_Figure_1_caption.txt' + caption_path.write_text(caption(v)) + render(svg, out) + sources = [] + for row in counts.values(): + if row['section'] != 'Final evaluation test union': + sources.append(dict(source_table=FLOW, source_key=row['metric'], count=row['count'], unit=row['unit'], + source_path=row['source_path'], source_sha256=row['source_sha256'])) + for row in composition: + sources.append(dict(source_table=COMPOSITION, source_key=row['category'], count=row['count'], unit='GlyCorpus records', + source_path=row['source_path'], source_sha256=row['source_sha256'])) + source_csv = out / f'{STEM}_source.csv' + with source_csv.open('w', newline='') as handle: + writer = csv.DictWriter(handle, fieldnames=list(sources[0])) + writer.writeheader() + writer.writerows(sources) + receipt = dict(status='BUILT', artwork_origin='Deliberate editable vector recreation of the submitted raster design; not recovered original native artwork.', + builder_sha256=sha(Path(__file__)), composition_source=str(composition_path.resolve()), composition_source_sha256=sha(composition_path), + count_source_rows=list(counts.values()), displayed_values=v, canvas_px=[1950, 1050], size_inches=[6.5, 3.5], + raster_dpi=300, no_training_or_inference=True, outputs={p.name: sha(p) for p in + [svg, out / f'{STEM}.png', out / f'{STEM}.pdf', out / f'{STEM}.tif', caption_path, source_csv]}) + (out / 'Supplementary_Figure_1_source_provenance.json').write_text(json.dumps(receipt, indent=2) + '\n') + return receipt + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--package-dir', type=Path) + parser.add_argument('--inputs', type=Path) + parser.add_argument('--outdir', type=Path, default=HERE) + args = parser.parse_args() + flow, composition = default_sources(args.package_dir) + if args.inputs is not None: + flow, composition = args.inputs / FLOW, args.inputs / COMPOSITION + counts = {row['metric']: row for row in read_csv(flow)} + receipt = figure1(args.outdir, counts, composition) + receipt.update(count_source=str(flow.resolve()), count_source_sha256=sha(flow)) + (args.outdir / 'Supplementary_Figure_1_source_provenance.json').write_text(json.dumps(receipt, indent=2) + '\n') + print(json.dumps({'outdir': str(args.outdir.resolve()), 'values': receipt['displayed_values']}, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/releases/2026-10-02/figures/build_supplement_presentation.py b/releases/2026-10-02/figures/build_supplement_presentation.py new file mode 100644 index 0000000000000000000000000000000000000000..6957d8e354ecd7bcc814888e8269b9054cfbd28b --- /dev/null +++ b/releases/2026-10-02/figures/build_supplement_presentation.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +"""Draw Supplementary Figures 1 and 7 from the packaged counts and method scope. + +Usage: python build_supplement_presentation.py --package-dir /path/submit_comm + --outdir /path/figures +No fitting, inference, graph matching, or other figure generation is performed. +""" +from pathlib import Path +import argparse +import csv +import hashlib +import json +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from matplotlib.patches import Rectangle, FancyArrowPatch +from PIL import Image + +C = dict(blue='#1687C9', green='#4F9B59', purple='#8275AC', pink='#D95789', + ink='#25282B', grey='#667077', light='#E5E9EB', + pale_blue='#EBF4F9', pale_green='#EEF5EA', pale_purple='#F1EEF8', pale_pink='#FBEDF2') +plt.rcParams.update({'font.family':'Arial', 'font.size':8.5, + 'pdf.fonttype':42, 'ps.fonttype':42, 'svg.fonttype':'none', + 'text.color':C['ink']}) + +def canvas(w, h): + fig = plt.figure(figsize=(w,h)) + ax = fig.add_axes([0,0,1,1], xlim=(0,w), ylim=(0,h)) + ax.axis('off') + return fig, ax + +def text(ax,x,y,s,fs=8.5,weight='normal',ha='left',color=None,**kwargs): + return ax.text(x,y,s,fontsize=fs,fontweight=weight,ha=ha,va='center', + color=color or C['ink'],linespacing=1.3,**kwargs) + +def line(ax,a,b,color=None,lw=.8): + ax.plot([a[0],b[0]],[a[1],b[1]],color=color or C['grey'],lw=lw,zorder=1) + +def arrow(ax,a,b,color=None): + ax.add_patch(FancyArrowPatch(a,b,arrowstyle='-|>',mutation_scale=7, + lw=.8,color=color or C['grey'],zorder=2)) + +def count_box(ax,x,y,w,h,title,n,unit,accent,fill): + ax.add_patch(Rectangle((x,y),w,h,facecolor=fill,edgecolor=C['light'],linewidth=.65)) + text(ax,x+.12,y+h-.18,title,8.5,weight='bold') + text(ax,x+.12,y+.36,f'{n:,}',15,weight='bold') + text(ax,x+.12,y+.14,unit,8,color=C['grey']) + +def save(fig,out,stem): + for ext in ('svg','pdf','png'): + fig.savefig(out/f'{stem}.{ext}',dpi=300,facecolor='white') + with Image.open(out/f'{stem}.png') as im: + im.convert('RGB').save(out/f'{stem}.tif',compression='tiff_lzw',dpi=(300,300)) + plt.close(fig) + +def load_counts(package): + with (package/'04_source_data/benchmark_exclusion/partition_count_flow.csv').open(newline='') as f: + return {r['metric']:r for r in csv.DictReader(f)} + +def figure1(out,counts,composition_path=None): + # Preserve the existing callable while recreating the submitted three-card style. + import runpy + builder=runpy.run_path(str(Path(__file__).with_name('build_supplement_figure1.py'))) + return builder['figure1'](out,counts,composition_path) + +FIGURE7_CAPTION = 'Supplementary Figure 7 | Static and MD representations. a, An atom-defined, right-handed frame removes translation and proper rotation while retaining reflection sensitivity. A four-layer EGNN yields residue means projected to 128 dimensions; four ordered 1,024-entry residual codebooks produce four tokens per residue aligned to WURCS 2.0. b, Each molecular-dynamics state supplies twenty 1-ns intervals and six descriptors. Training statistics scale values; flags distinguish undefined descriptors. Three intervals are masked for reconstruction of defined values. A bidirectional GRU predicts masked descriptors; its outputs are averaged over time, projected to 768 dimensions and averaged across available states. Codebooks and scaling use training glycans only. Grid and mask positions are schematic.\n' + +MD_CORE_RELATIVE = ('06_code/bertose_source/writing/review/multimodal/runtime/' + 'md_temporal_20x6_end_to_end_20260802_r3_native_intersection/' + 'review_md_temporal_20x6_core_r3.py') + +def figure7(out, package_dir=None): + """Draw the current static/MD schematic through the shared compact builder.""" + import subprocess + import sys + builder = Path(__file__).parent / 'compact_modalities/builders/build_figures6_7.py' + subprocess.run([sys.executable, str(builder), '--figure', '7', '--outdir', str(out)], check=True) + + +def main(): + parser=argparse.ArgumentParser() + parser.add_argument('--package-dir',type=Path,default=Path(__file__).resolve().parents[2]) + parser.add_argument('--outdir',type=Path) + args=parser.parse_args() + if args.outdir is None: args.outdir=args.package_dir/'05_figures' + args.outdir.mkdir(parents=True,exist_ok=True) + source=args.package_dir/'04_source_data/benchmark_exclusion/partition_count_flow.csv' + with source.open(newline='') as f: rows=list(csv.DictReader(f)) + counts={r['metric']:r for r in rows} + figure1(args.outdir,counts,args.package_dir/'04_source_data/figure_inputs/Supplementary_Figure_8_corpus_composition.csv'); figure7(args.outdir,args.package_dir) + (args.outdir/'Supplementary_Figures_1_7_source_provenance.json').write_text(json.dumps({ + 'figure1_count_source':str(source.resolve()), + 'figure1_count_source_sha256':hashlib.sha256(source.read_bytes()).hexdigest(), + 'figure1_source_rows':rows, + 'figure1_provenance_file':'Supplementary_Figure_1_source_provenance.json', + 'figure1_provenance_sha256':hashlib.sha256((args.outdir/'Supplementary_Figure_1_source_provenance.json').read_bytes()).hexdigest(), + 'figure1_builder':'06_code/figures/build_supplement_figure1.py', + 'figure1_builder_sha256':hashlib.sha256(Path(__file__).with_name('build_supplement_figure1.py').read_bytes()).hexdigest(), + 'figure7_method_source':'06_code/figures/build_supplement_presentation.py::figure7', + 'figure7_method_source_sha256':hashlib.sha256(Path(__file__).read_bytes()).hexdigest(), + 'figure7_provenance_file':'Supplementary_Figure_7_source_provenance.json', + 'figure7_provenance_sha256':hashlib.sha256((args.outdir/'Supplementary_Figure_7_source_provenance.json').read_bytes()).hexdigest(), + 'figure7_preserved_parameters':{'egnn_layers':4,'egnn_width':256,'residue_projection_dimensions':128,'residual_quantizer_stages':4,'entries_per_stage':1024,'codes_per_residue':4}, + 'no_training_or_inference':True},indent=2)+'\n') + +if __name__=='__main__':main() diff --git a/releases/2026-10-02/figures/build_supplementary_figure9.py b/releases/2026-10-02/figures/build_supplementary_figure9.py new file mode 100644 index 0000000000000000000000000000000000000000..8fbec90c2bb223788434f21429b1661e8168acad --- /dev/null +++ b/releases/2026-10-02/figures/build_supplementary_figure9.py @@ -0,0 +1,252 @@ +#!/usr/bin/env python3 +"""Render Supplementary Figure 9 from the independently verified plot_data.json. + +No model fitting or new inference is performed here. Categories, pointwise-CI flags, +and sign-agreement flags come from the verified data. Output defaults to the package 05_figures directory; use --outdir for staged work. +""" +from pathlib import Path +import argparse +import csv +import hashlib +import json +import platform +import shutil +import sys + +parser = argparse.ArgumentParser(description="Rebuild Supplementary Figure 9 from packaged stored paired differences; no fitting or inference.") +parser.add_argument("--package-dir", type=Path, default=Path(__file__).resolve().parents[2]) +parser.add_argument("--outdir", type=Path) +parser.add_argument("--inputs", type=Path, default=Path(__file__).resolve().parent / "ablation_figure9") +args = parser.parse_args() +OUT = args.outdir or args.package_dir / "05_figures" +OUT.mkdir(parents=True, exist_ok=True) + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +from matplotlib.lines import Line2D +from matplotlib.patches import Rectangle +from matplotlib.ticker import FuncFormatter + +DATA = args.inputs / "plot_data.json" +PALETTE = args.inputs / "nature-bpg-palette.json" +data = json.loads(DATA.read_text()) +palette = json.loads(PALETTE.read_text()) + +plt.rcParams.update({ + "font.family": "Arial", "font.size": 9.5, + "axes.labelsize": 9.5, "axes.linewidth": 0.55, + "xtick.labelsize": 9.0, "ytick.labelsize": 9.0, + "pdf.fonttype": 42, "ps.fonttype": 42, "svg.fonttype": "none", + "figure.facecolor": "white", "axes.facecolor": "white", + "savefig.facecolor": "white", "savefig.transparent": False, + "text.color": "#202020", "axes.labelcolor": "#202020", + "xtick.color": "#303030", "ytick.color": "#303030", + "svg.hashsalt": "SupplementaryFigure9_verified_20260926", +}) +colors = {"lower": palette["alpha_0_6_hex8"][0], + "higher": palette["alpha_0_6_hex8"][1], "similar": "#E8EAEC"} +ink = "#202020" +endpoints = data["endpoint_order"] +contrasts = data["contrast_order"] +lookup = {(r["contrast"], r["endpoint"]): r for r in data["ablation_rows"]} +assert len(lookup) == 110 +assert sum(r["pointwise_excludes_zero"] for r in lookup.values()) == 3 +assert sum(r["p_holm110"] < .05 for r in lookup.values()) == 0 + +labels = { + "topology_removed": "Topology objective", + "ms_removed": "MS", + "static_removed": "Static 3D", + "md_removed": "MD: active vs masked", + "tree_channels_full": "Tree input embeddings", + "topology_added": "Topology objective added", + "ms_added": "MS added", + "static_added": "Static 3D added", + "tree_channels_base": "Tree inputs: with vs without", + "three_branches_added": "Topology + MS + static 3D", +} + +fig = plt.figure(figsize=(6.5, 5.8)) +fig.text(.019, .984, "a", fontsize=12, weight="bold", va="top") +fig.text(.057, .982, "Component ablation", fontsize=12, weight="bold", va="top") +fig.text(.057, .942, "Present − absent / disabled", fontsize=9.5, + ha="left", va="top") + +ax = fig.add_axes([.270, .515, .710, .345]) +ys = [0, 1, 2, 3, 4, 6, 7, 8, 9, 10] +for i, contrast in enumerate(contrasts): + y = ys[i] + for j, endpoint in enumerate(endpoints): + row = lookup[(contrast, endpoint)] + ax.add_patch(Rectangle((j + .025, y - .405), .95, .81, + facecolor=colors[row["category"]], edgecolor="none")) + if row["pointwise_excludes_zero"]: + ax.add_patch(Rectangle((j + .045, y - .385), .91, .77, + fill=False, edgecolor=ink, linewidth=1.05)) + if row["all_seed_pairs_same_sign"]: + ax.plot(j + .5, y, "o", color=ink, markersize=3.2, + markeredgewidth=0, zorder=4) + ax.text(-.20, y, labels[contrast], ha="right", va="center", fontsize=9.0) + +ax.text(-.20, -1.12, "Full-model contrasts", fontsize=9.0, + fontweight="bold", ha="right", va="center", clip_on=False) +ax.text(-.20, 5.02, "Baseline contrasts", fontsize=9.0, + fontweight="bold", ha="right", va="center", clip_on=False) +task_labels = {e: e.capitalize() for e in endpoints} +task_labels.update(kingdom="Kingd.", species="Spec.", immunogenicity="Immun.", linkage="Link.", interaction="Inter.") +for j, endpoint in enumerate(endpoints): + ax.text(j + .5, -.78, task_labels[endpoint], fontsize=8.5, + rotation=0, ha="center", va="bottom") +ax.set_xlim(0, 11) +ax.set_ylim(10.6, -.6) +ax.axis("off") + +# Categorical key: same category-color semantics are used in panel b. +key_y = .478 +key_specs = [("higher", .043, "Higher: Δ ≥ +0.005"), + ("similar", .371, "Similar: |Δ| < 0.005"), + ("lower", .684, "Lower: Δ ≤ −0.005")] +for category, x, text in key_specs: + fig.add_artist(Rectangle((x, key_y - .007), .020, .014, + transform=fig.transFigure, facecolor=colors[category], + edgecolor="none")) + fig.text(x + .028, key_y, text, fontsize=9.5, va="center") +key_y2 = .442 +fig.add_artist(Line2D([.053], [key_y2], transform=fig.transFigure, + marker="o", markersize=3.2, color=ink, linestyle="none")) +fig.text(.074, key_y2, "Same direction (3/3)", fontsize=9.5, va="center") +fig.add_artist(Rectangle((.550, key_y2 - .007), .020, .014, + transform=fig.transFigure, facecolor="none", + edgecolor=ink, linewidth=.9)) +fig.text(.580, key_y2, "95% CI excludes 0", fontsize=9.5, va="center") + + + +fig.text(.019, .415, "b", fontsize=12, weight="bold", va="top") +fig.text(.057, .413, "Tokenizer control", + fontsize=12, weight="bold", va="top") + +bx = fig.add_axes([.100, .110, .880, .225]) +rows = data["tokenizer"]["endpoint_rows"] +by_endpoint = {r["endpoint"]: r for r in rows} +seed_styles = {42: ("o", -.18), 43: ("s", 0), 44: ("^", .18)} +for j, endpoint in enumerate(endpoints): + row = by_endpoint[endpoint] + bx.bar(j, row["mean_delta"], width=.65, color=colors[row["category"]], + edgecolor="none", zorder=2) + for pair in row["paired_deltas"]: + marker, dx = seed_styles[pair["upstream_seed"]] + bx.scatter(j + dx, pair["delta"], marker=marker, s=12, + facecolor=ink, edgecolor="white", linewidth=.25, zorder=5) + +tax = data["tokenizer"]["taxonomy8"] +tx = 12.15 +bx.axvspan(11.3, 12.9, color="#F5F6F7", zorder=0) +bx.bar(tx, tax["mean_delta"], width=.65, color=colors["higher"], + edgecolor="none", zorder=2) +bx.errorbar(tx, tax["mean_delta"], + yerr=[[tax["mean_delta"] - tax["ci95_low"]], + [tax["ci95_high"] - tax["mean_delta"]]], + fmt="none", ecolor=ink, elinewidth=.75, capsize=2.2, capthick=.75, zorder=4) +for pair in tax["paired_deltas"]: + marker, dx = seed_styles[pair["upstream_seed"]] + bx.scatter(tx + dx, pair["delta"], marker=marker, s=12, + facecolor=ink, edgecolor="white", linewidth=.25, zorder=5) + + +bx.axhline(0, color="#707070", linewidth=.55, zorder=1) +bx.set_xlim(-.65, 12.90) +bx.set_ylim(-.37, .195) +bx.set_yticks([-.3, -.2, -.1, 0, .1]) +bx.yaxis.set_major_formatter(FuncFormatter(lambda x, _: "0" if x == 0 else f"{x:+.1f}")) +fig.text(.100, .349, "BPE − character", fontsize=9.0, ha="left", va="bottom") +bx.yaxis.grid(True, color="#E9EAEC", linewidth=.45) +bx.set_axisbelow(True) +bx.spines[["top", "right", "bottom"]].set_visible(False) +bx.spines["left"].set_color("#B0B0B0") +bx.tick_params(axis="x", length=0, pad=4) +bx.tick_params(axis="y", length=2, width=.5, pad=2) +bx.set_xticks(list(range(11)) + [tx]) +b_labels = [task_labels[e] for e in endpoints] + ["Taxonomy\nmean"] +b_labels[10] = "Inter.\n(n = 2)" +bx.set_xticklabels(b_labels, rotation=0, ha="center", fontsize=8.5, linespacing=1.0) + +# Seed markers have an identity only in the separate tokenizer campaign. +handles = [Line2D([], [], color=ink, linestyle="none", marker=seed_styles[s][0], + markersize=3.5, markeredgewidth=.25, markeredgecolor="white", label=str(s)) + for s in (42, 43, 44)] +fig.legend(handles=handles, title="Paired seeds", title_fontsize=9.0, + loc="upper right", bbox_to_anchor=(.983, .397), ncol=3, + fontsize=9.0, frameon=False, handletextpad=.25, columnspacing=.65, + borderaxespad=0, labelspacing=.25) + +# Export full precision panel data; original seed identities are not invented. +with (OUT / "Supplementary_Figure_9_ablation.csv").open("w", newline="") as f: + cols = ["contrast", "comparison_group", "label", "endpoint", "metric", "present_cell_id", + "absent_cell_id", "mean_delta", "sample_sd", "n_pairs", "ci95_low", "ci95_high", + "category", "all_seed_pairs_same_sign", "pointwise_excludes_zero", "p_raw", "p_holm110", + "delta_source_order_1", "delta_source_order_2", "delta_source_order_3", "seed_order_note"] + w = csv.DictWriter(f, fieldnames=cols) + w.writeheader() + for contrast in contrasts: + for endpoint in endpoints: + r = lookup[(contrast, endpoint)] + out = {k: r.get(k, "") for k in cols} + out["label"] = labels[contrast] + for d in r["paired_deltas"]: + out[f"delta_source_order_{d['source_order']}"] = d["delta"] + out["seed_order_note"] = "Original source order; individual seed labels unavailable." + w.writerow(out) + +with (OUT / "Supplementary_Figure_9_tokenizer_control.csv").open("w", newline="") as f: + cols = ["endpoint", "metric", "mean_delta", "sample_sd", "n_pairs", "delta_seed_42", + "delta_seed_43", "delta_seed_44", "ci95_low", "ci95_high", "missing_seed_note", "interval_scope"] + w = csv.DictWriter(f, fieldnames=cols) + w.writeheader() + for r in [by_endpoint[e] for e in endpoints] + [tax]: + out = {k: r.get(k, "") for k in cols} + for d in r["paired_deltas"]: + out[f"delta_seed_{d['upstream_seed']}"] = d["delta"] + out["missing_seed_note"] = "BPE interaction seed 44 unavailable; two paired fits shown." if r["endpoint"] == "interaction" else "" + w.writerow(out) + +CAPTION = 'Supplementary Figure 9 | Component ablation and tokenizer control. a, Mean validation differences (component present minus absent or disabled) across three paired pretraining seeds. Colours denote higher (≥0.005), similar (|difference| < 0.005) and lower (≤−0.005) scores. Dots mark the same nonzero sign across all three pairs; outlines mark pointwise 95% intervals excluding zero. None of 110 comparisons passed Holm correction. Metrics are MCC, except immunogenicity (average precision) and interaction (Spearman correlation). b, BPE minus character tokenization, evaluated separately in sequence-only models without tree inputs. Bars show means; circles, squares and triangles show paired seeds 42, 43 and 44. Each endpoint has three pairs except interaction (two; one BPE fit unavailable). The taxonomy mean and pointwise 95% paired t interval use three within-seed averages across eight ranks: +0.0482 [0.0350, 0.0614]. Immunogenicity uses binary MCC; interaction uses Pearson correlation. Vocabulary size and length handling also differed. Kingd., kingdom; Spec., species; Immun., immunogenicity; Link., linkage; Inter., interaction.' +(OUT / "Supplementary_Figure_9_caption.txt").write_text(CAPTION + "\n") +stem = OUT / "Supplementary_Figure_9_ablation_tokenizer" +fig.canvas.draw() +renderer = fig.canvas.get_renderer() +text_bounds = [] +for artist in fig.findobj(matplotlib.text.Text): + if artist.get_visible() and artist.get_text().strip(): + box = artist.get_window_extent(renderer) + text_bounds.append({"text": artist.get_text(), "rotation": artist.get_rotation(), "bounds_px": list(box.bounds), "inside_canvas": bool(box.x0 >= -1 and box.y0 >= -1 and box.x1 <= fig.bbox.width+1 and box.y1 <= fig.bbox.height+1)}) +(OUT / "text_bounds.json").write_text(json.dumps({"canvas_px": [fig.bbox.width, fig.bbox.height], "text": text_bounds}, indent=2)+"\n") +fig.savefig(stem.with_suffix(".svg"), metadata={"Title": "Supplementary Figure 9 | Component ablation and tokenizer control"}) +fig.savefig(stem.with_suffix(".pdf"), metadata={"Title": "Supplementary Figure 9 | Component ablation and tokenizer control", "Creator": "Matplotlib; verified stored paired differences", "CreationDate": None}) +fig.savefig(stem.with_suffix(".png"), dpi=600) +fig.savefig(stem.with_suffix(".tiff"), dpi=600, pil_kwargs={"compression": "tiff_lzw"}) +fig.savefig(OUT / "Supplementary_Figure_9_preview.png", dpi=180) +plt.close(fig) + +def sha(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + +receipt = { + "status": "STAGED; visual review pending", + "figure": "SupplementaryFigure9", "dimensions_inches": [6.5, 5.8], + "raster_dpi": 600, "raster_pixels": [3900, 3480], + "background": "white", "svg_text": "editable text", "pdf_fonts": "TrueType embedded", + "runtime": {"python": sys.executable, "version": platform.python_version(), "matplotlib": matplotlib.__version__}, + "source": {"plot_data": str(DATA), "plot_data_sha256": sha(DATA), "upstream_sources": data["source_sha256"]}, + "palette": {"name": palette["name"], "path": str(PALETTE), "sha256": sha(PALETTE), "lower": colors["lower"], "higher": colors["higher"], "similar": colors["similar"]}, + "checks": {"panel_a_rows": 110, "panel_a_pointwise_intervals_excluding_zero": 3, + "panel_a_holm_significant": 0, "panel_b_endpoints": 11, + "panel_b_interaction_pairs": by_endpoint["interaction"]["n_pairs"], + "panel_b_interaction_metric": by_endpoint["interaction"]["metric"], + "panel_b_summary": "Eight taxonomy rank differences averaged within each of three seeds; pointwise t interval across those three averages."}, + "files": {p.name: {"sha256": sha(p), "bytes": p.stat().st_size} + for p in sorted(OUT.glob("Supplementary_Figure_9*")) if p.is_file() and p.name != "Supplementary_Figure_9_build_receipt.json"}, +} +(OUT / "Supplementary_Figure_9_build_receipt.json").write_text(json.dumps(receipt, indent=2) + "\n") +print(json.dumps({"status": receipt["status"], "dimensions_inches": receipt["dimensions_inches"], "preview": str(OUT / "Supplementary_Figure_9_preview.png")}, indent=2)) diff --git a/releases/2026-10-02/figures/build_taxonomy_figure11.py b/releases/2026-10-02/figures/build_taxonomy_figure11.py new file mode 100644 index 0000000000000000000000000000000000000000..10e029314b0fdad6d2f7df3d7483d62a1b7bbcb3 --- /dev/null +++ b/releases/2026-10-02/figures/build_taxonomy_figure11.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 +"""Plot stored taxonomy estimates and intervals; no statistical recomputation. + +Requires matplotlib and Pillow. Input CSV is part of the submission source data. +""" +from pathlib import Path +import argparse +import csv +import hashlib +import json + +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from PIL import Image + +STEM = 'Supplementary_Figure_11_taxonomy_sensitivity' +CAPTION = ( + 'Supplementary Figure 11 | Taxonomy sensitivity. MCC differences between BERTose and the strongest observed comparator, scored on labels with at least one held-out positive. Points show means; lines show unadjusted 95% percentile intervals from 10,000 paired whole-glycan resamples across three fixed downstream fits. Glycan and label counts are shown. Comparators were chosen post hoc and held fixed during resampling; intervals exclude model-selection and pretraining uncertainty. The eight taxonomy ranks are correlated.' +) + + +def sha(path): + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + + +def build(source, palette_path, outdir): + source, palette_path, outdir = map(Path, (source, palette_path, outdir)) + with source.open(newline='') as handle: + rows = list(csv.DictReader(handle)) + order = ['domain', 'kingdom', 'phylum', 'class', 'order', 'family', 'genus', 'species'] + assert [row['endpoint'] for row in rows] == order + palette = json.loads(palette_path.read_text()) + coral = palette['alpha_0_6_hex8'][0] + coral_outline = palette['opaque_hex'][0] + muted_interval = palette['alpha_0_6_hex8'][5] + means = [float(row['difference_wa3_minus_comparator']) for row in rows] + lows = [float(row['ci95_low']) for row in rows] + highs = [float(row['ci95_high']) for row in rows] + assert all(low <= mean <= high for low, mean, high in zip(lows, means, highs)) + limits = (-0.03, 0.07) + assert min(lows) > limits[0] and max(highs) < limits[1] + outdir.mkdir(parents=True, exist_ok=True) + + with plt.rc_context({ + 'font.family': 'Arial', 'font.size': 10.5, 'pdf.fonttype': 42, + 'ps.fonttype': 42, 'svg.fonttype': 'none', 'svg.hashsalt': STEM, + 'text.color': '#25282B', 'axes.labelcolor': '#25282B', + 'xtick.color': '#50565B', 'axes.linewidth': 0.55, + }): + fig = plt.figure(figsize=(6.5, 3.95), facecolor='white') + ax = fig.add_axes([0.205, 0.205, 0.365, 0.61]) + ax.set(xlim=limits, ylim=(7.5, -0.5), yticks=[], + xticks=[-0.02, 0, 0.02, 0.04, 0.06]) + ax.set_xticklabels(['−0.02', '0', '0.02', '0.04', '0.06'], fontsize=9.5) + ax.set_xlabel('MCC difference\nBERTose − strongest observed comparator', fontsize=10.5, labelpad=7) + ax.grid(axis='x', color='#EBEDEF', linewidth=0.6, zorder=0) + ax.axvline(0, color='#747B80', linewidth=0.85, linestyle=(0, (3, 3)), zorder=1) + ax.spines[['top', 'left', 'right']].set_visible(False) + ax.spines['bottom'].set_color('#AAB0B4') + ax.tick_params(axis='x', length=3, width=0.55) + for i, (low, mean, high) in enumerate(zip(lows, means, highs)): + ax.plot([low, high], [i, i], color=muted_interval, linewidth=1.7, + solid_capstyle='round', zorder=2) + ax.scatter([mean], [i], s=29, c=coral, edgecolors=coral_outline, + linewidths=0.45, zorder=3) + fy = 0.205 + 0.61 * (7.5 - i) / 8 + fig.text(0.025, fy, order[i].capitalize(), va='center', fontsize=10.5) + fig.text(0.605, fy, rows[i]['best_comparator'], va='center', fontsize=10.5) + fig.text(0.850, fy, rows[i]['n_glycans'], ha='right', va='center', fontsize=10.5) + fig.text(0.975, fy, rows[i]['labels_kept'] + ' / ' + rows[i]['labels_total'], + ha='right', va='center', fontsize=10.5) + fig.text(0.025, 0.953, 'Taxonomy sensitivity', fontsize=12, weight='bold', va='top') + fig.text(0.025, 0.895, 'Mean differences and unadjusted 95% paired bootstrap intervals', + fontsize=9.5, color='#50565B', va='top') + for x, label, alignment in [ + (0.025, 'Rank', 'left'), (0.605, 'Comparator', 'left'), + (0.850, 'Glycans', 'right'), (0.975, 'Labels\nkept / all', 'right')]: + fig.text(x, 0.815, label, fontsize=10, weight='bold', ha=alignment, va='bottom') + for ext in ('svg', 'pdf', 'png'): + metadata = {'Date': None} if ext == 'svg' else ( + {'CreationDate': None, 'ModDate': None} if ext == 'pdf' else {}) + fig.savefig(outdir / f'{STEM}.{ext}', dpi=300, facecolor='white', metadata=metadata) + plt.close(fig) + with Image.open(outdir / f'{STEM}.png') as image: + image.convert('RGB').save(outdir / f'{STEM}.tif', compression='tiff_lzw', dpi=(300, 300)) + caption_path = outdir / 'Supplementary_Figure_11_caption.txt' + caption_path.write_text(CAPTION + '\n') + outputs = [outdir / f'{STEM}.{ext}' for ext in ('svg', 'pdf', 'png', 'tif')] + [caption_path] + receipt = dict( + source_file=str(source.resolve()), source_sha256=sha(source), + builder_sha256=sha(__file__), palette_sha256=sha(palette_path), + plotted_values=[{key: row[key] for key in ( + 'endpoint', 'difference_wa3_minus_comparator', 'ci95_low', 'ci95_high', + 'best_comparator', 'n_glycans', 'labels_kept', 'labels_total')} for row in rows], + axis_limits=list(limits), size_inches=[6.5, 3.95], raster_dpi=300, + interval_definition=rows[0]['interval_method'], + no_statistical_recomputation=True, no_training_or_inference=True, + outputs={path.name: sha(path) for path in outputs}) + (outdir / f'{STEM}_source_provenance.json').write_text(json.dumps(receipt, indent=2) + '\n') + return receipt + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--package-dir', type=Path, default=Path(__file__).resolve().parents[2]) + parser.add_argument('--input', type=Path) + parser.add_argument('--palette', type=Path, default=Path(__file__).with_name('taxonomy_figure11') / 'nature-bpg-palette.json') + parser.add_argument('--outdir', type=Path) + args = parser.parse_args() + source = args.input or args.package_dir / '04_source_data/review_restricted_taxonomy_bootstrap.csv' + outdir = args.outdir or args.package_dir / '05_figures' + build(source, args.palette, outdir) + + +if __name__ == '__main__': + main() diff --git a/releases/2026-10-02/figures/build_token_length_figure2.py b/releases/2026-10-02/figures/build_token_length_figure2.py new file mode 100644 index 0000000000000000000000000000000000000000..1645bf8253fa5214f99a02e729df55dde4b8eea6 --- /dev/null +++ b/releases/2026-10-02/figures/build_token_length_figure2.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +"""Rebuild Supplementary Figure 2 from its released length-count CSV. + +The existing plot design and counts are retained. Publication labels use +training and validation. Raw source role identifiers remain unchanged. +Requires matplotlib and Pillow; no model fitting or inference. +""" +from pathlib import Path +import argparse +import csv + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--package-dir', type=Path, default=Path(__file__).resolve().parents[2]) + parser.add_argument('--source', type=Path) + parser.add_argument('--outdir', type=Path) + args = parser.parse_args() + source = args.source or args.package_dir / '04_source_data/figure_inputs/Supplementary_Figure_2_token_length_counts.csv' + outdir = args.outdir or args.package_dir / '05_figures' + outdir.mkdir(parents=True, exist_ok=True) + with source.open(newline='') as stream: + rows = list(csv.DictReader(stream)) + import matplotlib + matplotlib.use('Agg') + import matplotlib.pyplot as plt + from PIL import Image + plt.rcParams.update({'font.family':'Arial','font.size':10,'axes.labelsize':11, + 'xtick.labelsize':10,'ytick.labelsize':10,'pdf.fonttype':42,'ps.fonttype':42, + 'svg.fonttype':'none', 'svg.hashsalt':'SupplementaryFigure2_validation_labels', + 'axes.spines.top':False,'axes.spines.right':False, + 'axes.linewidth':.55,'xtick.major.width':.55,'ytick.major.width':.55}) + fig, ax = plt.subplots(figsize=(6.5, 3.7)) + fig.subplots_adjust(left=.145, right=.975, bottom=.17, top=.84) + tail = ax.inset_axes([.58, .30, .40, .37]) + for role, label, color, alpha, expected in [ + ('pretraining_train', 'Training', '#1687C9', .5, 221827), + ('pretraining_development', 'Validation', '#D95789', .45, 55440)]: + counts = {int(r['bpe_tokens']): int(r['parent_count']) for r in rows if r['role'] == role} + assert set(counts) == set(range(1, 257)) and sum(counts.values()) == expected + values = [counts[i] for i in range(1, 257)] + edges = [i + .5 for i in range(257)] + for view in (ax, tail): + patch = view.stairs(values, edges, fill=True, alpha=alpha, color=color, + lw=.6, label=f'{label} (n={expected:,})') + if label == 'Validation': + # Keep the fill RGBA unchanged; a dashed edge also identifies it in grayscale. + patch.set(alpha=None, facecolor=matplotlib.colors.to_rgba(color, alpha), + edgecolor='#4A4A4A', linestyle='--', linewidth=.9) + # Keep each complete unit-width bin; bin 90 is visible in both views. + ax.set(xlim=(0, 90.5), xticks=range(0, 91, 10), + xlabel='BPE tokens per glycan', ylabel='Glycans') + tail.set(xlim=(89.5, 256.5), ylim=(0, 100), + xticks=[90, 140, 200, 256], yticks=[0, 50, 100]) + tail.set_title('Tail (90–256 tokens)', fontsize=10.5, loc='left', pad=5) + for view in (ax, tail): + view.grid(axis='y', color='#E6E9EB', linewidth=.55) + view.spines[['left', 'bottom']].set_color('#707070') + ax.legend(frameon=False, fontsize=10) + fig.text(.025, .925, 'BPE token-length distribution', fontsize=13, weight='bold') + stem = 'Supplementary_Figure_2_current_token_lengths' + for fmt in ['pdf', 'svg', 'png']: + metadata = {'Date': None} if fmt == 'svg' else {'CreationDate': None, 'ModDate': None} if fmt == 'pdf' else None + fig.savefig(outdir / f'{stem}.{fmt}', dpi=300, facecolor='white', metadata=metadata) + with Image.open(outdir / f'{stem}.png') as image: + image.convert('RGB').save(outdir / f'{stem}.tif', compression='tiff_lzw', dpi=(300, 300)) + plt.close(fig) + + +if __name__ == '__main__': + main() diff --git a/releases/2026-10-02/figures/build_training_coverage_figure6.py b/releases/2026-10-02/figures/build_training_coverage_figure6.py new file mode 100644 index 0000000000000000000000000000000000000000..46d72a7a27f4536b2af6409cfcadd394615565f4 --- /dev/null +++ b/releases/2026-10-02/figures/build_training_coverage_figure6.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +"""Draw current training coverage with the shared compact modality builder.""" +from pathlib import Path +import argparse +import subprocess +import sys + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--package-dir', type=Path, default=Path(__file__).resolve().parents[2]) + parser.add_argument('--source', type=Path) + parser.add_argument('--outdir', type=Path) + args = parser.parse_args() + builder = Path(__file__).parent / 'compact_modalities/builders/build_figures6_7.py' + outdir = args.outdir or args.package_dir / '05_figures' + source = args.source + packaged_source = args.package_dir / '04_source_data/review_training_modality_coverage.csv' + if source is None and packaged_source.is_file(): + source = packaged_source + command = [sys.executable, str(builder), '--figure', '6', '--outdir', str(outdir)] + if source is not None: + command.extend(['--source', str(source)]) + subprocess.run(command, check=True) + + +if __name__ == '__main__': + main() diff --git a/releases/2026-10-02/figures/compact_modalities/README.md b/releases/2026-10-02/figures/compact_modalities/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e9214a6309c5667e042787283f866d9de1b29275 --- /dev/null +++ b/releases/2026-10-02/figures/compact_modalities/README.md @@ -0,0 +1,14 @@ +# Compact modality figures + +`builders/build_figures6_7.py` draws Supplementary Figures 6 and 7 from bundled counts and implemented method definitions. It does not train models, calculate trajectories or generate new scientific results. + +```sh +python builders/build_figures6_7.py --figure 6 --outdir /path/to/output +python builders/build_figures6_7.py --figure 7 --outdir /path/to/output +``` + +`--figure both` builds both. `--root` selects a directory with the same `inputs/` layout; `--source` optionally selects the Figure 6 coverage CSV. Without `--outdir`, files are written to this directory's `figures/` subdirectory. The existing Figure 6 CLI and `build_supplement_presentation.py::figure7` forward to this builder. + +The three runtime inputs are the unchanged training-coverage CSV, the static/MD parameter provenance JSON, and the MD source file. The source file is read only to validate declared constants and its digest; it is not executed. Figure 6 retains 221,827 sequence-training glycans as its common denominator. Figure 7 is a schematic with twenty intervals, six descriptors and three illustrative masked intervals, preserving training-only scaling and the implemented pooling definition. + +Outputs are editable SVG, vector PDF, 300 dpi PNG/TIFF, caption text and a provenance receipt. Final widths are 6.5 inches; heights are 2.35 and 4.8 inches. The approved images were reproduced byte-for-byte using Python 3.12.12, Matplotlib 3.8.4 and Arial. Other rendering-library versions can change pixels without changing the plotted content. diff --git a/releases/2026-10-02/figures/compact_modalities/builders/build_figures6_7.py b/releases/2026-10-02/figures/compact_modalities/builders/build_figures6_7.py new file mode 100644 index 0000000000000000000000000000000000000000..e0c78eb8f2945ea22b8ff736e636f12dc9a501be --- /dev/null +++ b/releases/2026-10-02/figures/compact_modalities/builders/build_figures6_7.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python3 +"""Build staged Figures 6/7 from copied counts and method facts; no analysis or training. + +Usage: python builders/build_figures6_7.py [--root /path/to/coverage_static_md] + [--outdir /path/to/figures] [--figure 6|7|both] +Requires matplotlib and Pillow. SVG text remains editable. +""" +from pathlib import Path +import argparse +import ast +import csv +import hashlib +import json +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from matplotlib.patches import Rectangle, FancyArrowPatch +from PIL import Image + +CAPTIONS = { +6: ('Supplementary Figure 6 | Modality coverage. Percentages use the 221,827 glycans ' + 'retained for sequence pretraining as the denominator. Modality subsets overlap. ' + 'Static 3D coverage counts parent glycans, not conformer states; topology coverage ' + 'counts glycans eligible for that objective. MS, mass spectrometry; MD, molecular dynamics.'), +7: ('Supplementary Figure 7 | Static and MD representations. a, An atom-defined, ' + 'right-handed frame removes translation and proper rotation while retaining reflection ' + 'sensitivity. A four-layer EGNN yields residue means projected to 128 dimensions; four ' + 'ordered 1,024-entry residual codebooks produce four tokens per residue aligned to WURCS 2.0. ' + 'b, Each molecular-dynamics state supplies twenty 1-ns intervals and six descriptors. ' + 'Training statistics scale values; flags distinguish undefined descriptors. Three intervals ' + 'are masked for reconstruction of defined values. A bidirectional GRU predicts masked ' + 'descriptors; its outputs are averaged over time, projected to 768 dimensions and averaged ' + 'across available states. ' + 'Codebooks and scaling use training glycans only. Grid and mask positions are schematic.')} +STEMS = {6:'Supplementary_Figure_6_training_coverage',7:'Supplementary_Figure_7_current_static_RVQ'} +INK, GREY = '#25282B', '#667077' + +def configure_style(): + plt.rcParams.update({'font.family':'Arial','font.size':10.5,'axes.labelsize':11, + 'xtick.labelsize':10.5,'ytick.labelsize':11,'axes.linewidth':.55, + 'xtick.major.width':.55,'ytick.major.width':.55, + 'pdf.fonttype':42,'ps.fonttype':42,'svg.fonttype':'none', + 'svg.hashsalt':'supplement_simplification_20260928','text.color':INK}) + +def digest(path): + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + +def label(ax,x,y,value,fs=10.5,weight='normal',ha='left',color=INK): + return ax.text(x,y,value,fontsize=fs,fontweight=weight,ha=ha,va='center', + color=color,linespacing=1.2) + +def line(ax,a,b,color=GREY,lw=.8): + ax.plot([a[0],b[0]],[a[1],b[1]],color=color,lw=lw,zorder=1) + +def arrow(ax,a,b,color=GREY): + ax.add_patch(FancyArrowPatch(a,b,arrowstyle='-|>',mutation_scale=8, + lw=.8,color=color,zorder=2)) + +def save(fig,b,number,out): + stem=STEMS[number] + fig.canvas.draw() + renderer=fig.canvas.get_renderer() + texts=[] + for ax in fig.axes: + visible_texts=list(ax.texts) + if ax.axison: + visible_texts.extend([*ax.get_xticklabels(),*ax.get_yticklabels(),ax.xaxis.label,ax.yaxis.label]) + texts.extend(t for t in visible_texts if t.get_text() and t.get_visible()) + extents=[{'text':t.get_text(),'font_size_pt':t.get_fontsize(), + 'bounds_px_at_100dpi':list(t.get_window_extent(renderer).bounds)} for t in texts] + for ext in ('svg','pdf','png'): + metadata={'Date':None} if ext=='svg' else {'CreationDate':None,'ModDate':None} if ext=='pdf' else None + fig.savefig(out/f'{stem}.{ext}',dpi=300,facecolor='white',metadata=metadata) + with Image.open(out/f'{stem}.png') as im: + im.convert('RGB').save(out/f'{stem}.tif',compression='tiff_lzw',dpi=(300,300)) + plt.close(fig) + caption=out/f'Supplementary_Figure_{number}_caption.txt' + caption.write_text(CAPTIONS[number]+'\n') + return {'outputs':{str(p.relative_to(b)) if p.is_relative_to(b) else str(p):digest(p) + for p in [*(out/f'{stem}.{e}' for e in ('svg','pdf','png','tif')),caption]},'text_extents':extents} + +def coverage(b,out=None,source=None): + b=Path(b) + configure_style() + out=Path(out) if out is not None else b/'figures' + out.mkdir(parents=True,exist_ok=True) + src=Path(source) if source is not None else b/'inputs/review_training_modality_coverage.csv' + with src.open(newline='') as f: rows={r['modality']:r for r in csv.DictReader(f) if r['role']=='train'} + order=['sequence','topology','MS','static','MD'] + counts=[221827,71914,2455,22980,22872] + percentages=[] + for key,count in zip(order,counts): + r=rows[key] + assert int(r['parents'])==count and int(r['sequence_parent_denominator'])==221827 + assert abs(float(r['fraction'])-count/221827)<1e-12 + percentages.append(float(r['fraction'])*100) + colors=['#1687C9','#1687C9','#D95789','#4F9B59','#8275AC'] + fig,ax=plt.subplots(figsize=(6.5,2.35)) + fig.subplots_adjust(left=.18,right=.97,bottom=.25,top=.97) + ax.scatter(percentages,range(5),c=colors,s=42,zorder=3) + ax.set(ylim=(4.5,-.5),xlim=(-2,103),yticks=range(5), + yticklabels=['Sequence','Topology','MS','Static 3D','MD'], + xticks=[0,25,50,75,100],xlabel='Coverage (%)') + ax.tick_params(axis='y',length=0,pad=8) + ax.spines[['left','top','right']].set_visible(False) + ax.spines['bottom'].set_color('#777D81') + ax.grid(axis='x',color='#E6E9EB',linewidth=.55) + ax.set_axisbelow(True) + result=save(fig,b,6,out) + result.update({'source_sha256':digest(src),'source_counts':dict(zip(order,counts)), + 'denominator':221827,'percentages':dict(zip(order,percentages)), + 'count_labels_in_artwork':False,'canvas_inches':[6.5,2.35], + 'palette':dict(zip(order,colors)),'font_family':'Arial'}) + return result + +def static_md(b,out=None): + b=Path(b) + configure_style() + out=Path(out) if out is not None else b/'figures' + out.mkdir(parents=True,exist_ok=True) + facts=json.loads((b/'inputs/figure7_original_provenance.json').read_text()) + core=b/'inputs/review_md_temporal_20x6_core_r3.py' + constants={} + for node in ast.parse(core.read_text()).body: + if isinstance(node,ast.Assign) and isinstance(node.value,ast.Constant): + for target in node.targets: + if isinstance(target,ast.Name):constants[target.id]=node.value.value + assert [constants[k] for k in ('MD_WINDOW_COUNT','MD_FEATURE_COUNT','MD_MASKED_WINDOWS')]==[20,6,3] + assert facts['static_parameters']=={'egnn_layers':4,'egnn_width':256,'residue_projection_dimensions':128, + 'residual_quantizer_stages':4,'entries_per_stage':1024,'codes_per_residue':4} + assert facts['md_parameters']['pooled_output_dimensions']==768 + assert digest(core)==facts['md_method_source_sha256'] + static_fill,static_ink='#8491B499','#3C5488' + md_ink,masked_fill,masked_ink='#00A087','#E64B3599','#E64B35' + fig=plt.figure(figsize=(6.5,4.8)) + ax=fig.add_axes([0,0,1,1],xlim=(0,6.5),ylim=(0,4.8)) + ax.axis('off') + label(ax,.15,4.58,'a',12,weight='bold') + label(ax,.40,4.58,'Static tokenization',12,weight='bold') + centers=[.65,2.12,3.78,5.43] + titles=['Conformer','Right-handed frame','4-layer EGNN','Residue mean'] + subtitles=['','Mapped sugar atoms','256 dimensions','128-D projection'] + for x,title,sub in zip(centers,titles,subtitles): + label(ax,x,4.15,title,10.5,weight='bold',ha='center') + if sub:label(ax,x,3.89,sub,10,ha='center') + for a,z in [(1.14,1.35),(2.88,3.14),(4.43,4.78)]:arrow(ax,(a,4.15),(z,4.15)) + label(ax,.18,3.50,'Residual quantization',10.5,weight='bold') + xs=[1.63,2.83,4.03,5.23] + label(ax,.18,3.12,'Four ordered\ncodebooks',10.5) + for i,x in enumerate(xs,1): + ax.add_patch(Rectangle((x,2.89),1.04,.53,facecolor=static_fill,edgecolor=static_ink,linewidth=.65)) + label(ax,x+.52,3.27,f'Stage {i}',10.5,weight='bold',ha='center') + label(ax,x+.52,3.05,'1,024 entries',10,ha='center') + label(ax,x+.52,2.65,f'Token {i}',10.5,ha='center',color=static_ink) + arrow(ax,(x+.52,2.89),(x+.52,2.77),static_ink) + if i<4:arrow(ax,(x+1.055,3.16),(xs[i]-.02,3.16),static_ink) + arrow(ax,(1.30,3.16),(1.58,3.16),static_ink) + + label(ax,.15,2.27,'b',12,weight='bold') + label(ax,.40,2.27,'MD encoding',12,weight='bold') + x0,y0,cw,ch=2.35,.66,.1075,.20 + names=['Mean radius of gyration','Mean aligned RMSD','Aligned RMSD SD', + 'SASA / residue','Span / graph-diameter residues','Torsion circular variance'] + masked_columns={3,10,16} + for row,name in enumerate(names): + y=y0+(5-row)*ch + label(ax,x0-.10,y+ch/2,name,10,ha='right') + for col in range(20): + masked=col in masked_columns + xx=x0+col*cw + ax.add_patch(Rectangle((xx,y),cw,ch,facecolor=masked_fill if masked else '#F2F3F4',edgecolor='white',linewidth=.7)) + if masked: + line(ax,(xx+.02,y+.04),(xx+cw-.02,y+ch-.04),masked_ink,.6) + line(ax,(xx+.02,y+ch-.04),(xx+cw-.02,y+.04),masked_ink,.6) + for col,name in [(0,'1'),(4,'5'),(9,'10'),(14,'15'),(19,'20')]: + label(ax,x0+(col+.5)*cw,2.00,name,10,ha='center') + label(ax,x0+10*cw,.49,'Interval (1 ns)',10,ha='center') + label(ax,.18,.22,'Flags: 1 defined · 0 undefined',10) + # Applicability flags enter alongside the values; masks do not change flags. + line(ax,(3.93,.22),(4.63,.22),md_ink) + line(ax,(4.63,.22),(4.63,1.35),md_ink) + arrow(ax,(4.51,1.35),(4.89,1.35),md_ink) + label(ax,5.62,1.41,'Bidirectional\nGRU',11,weight='bold',ha='center',color=md_ink) + label(ax,5.62,1.01,'Values + flags',10,ha='center') + arrow(ax,(5.62,1.69),(5.62,1.82),md_ink) + label(ax,5.62,2.04,'Reconstruct 3\nmasked intervals',10.5,ha='center') + arrow(ax,(5.62,.91),(5.62,.78),md_ink) + label(ax,5.62,.64,'Time + state mean',10,ha='center') + label(ax,5.62,.32,'768-D MD vector',10.5,ha='center',color=md_ink) + result=save(fig,b,7,out) + result.update({'static_parameters':facts['static_parameters'],'md_parameters':facts['md_parameters'], + 'md_method_source_sha256':digest(core),'canvas_inches':[6.5,4.8], + 'font_family':'Arial','minimum_font_size_pt':10, + 'palette':{'static_fill':static_fill,'static_outline':static_ink,'md':md_ink,'masked_fill':masked_fill,'masked_outline':masked_ink}, + 'grid_shape':[6,20],'masked_interval_indices_one_based':[4,11,17], + 'schematic':True,'measured_descriptor_values_used':False, + 'shortened_descriptor_label':{'original':'Span / diameter residue count','candidate':'Span / graph-diameter residues','definition':'Mean terminal span divided by graph-diameter residue count; unchanged quantity.'}, + 'pooling_definition':'Mean over time, projection to 768 dimensions, then mean over available state embeddings.'}) + return result + +def main(): + parser=argparse.ArgumentParser(description=__doc__) + parser.add_argument('--root',type=Path,default=Path(__file__).resolve().parents[1]) + parser.add_argument('--outdir',type=Path,help='Figure and caption destination; defaults to ROOT/figures') + parser.add_argument('--figure',choices=('6','7','both'),default='both') + parser.add_argument('--source',type=Path,help='Optional Figure 6 coverage CSV') + args=parser.parse_args() + b=args.root.resolve() + out=(args.outdir or b/'figures').resolve() + out.mkdir(parents=True,exist_ok=True) + result={'scope':'Presentation only; no training, inference or source-data edits.', + 'builder_sha256':digest(__file__),'requested_figure':args.figure} + if args.figure in ('6','both'):result['figure6']=coverage(b,out,args.source) + if args.figure in ('7','both'):result['figure7']=static_md(b,out) + receipt_name='source_equality_and_provenance.json' if args.figure=='both' else f'Supplementary_Figure_{args.figure}_source_provenance.json' + (out/receipt_name).write_text(json.dumps(result,indent=2)+'\n') + +if __name__=='__main__':main() diff --git a/releases/2026-10-02/figures/compact_modalities/inputs/figure7_original_provenance.json b/releases/2026-10-02/figures/compact_modalities/inputs/figure7_original_provenance.json new file mode 100644 index 0000000000000000000000000000000000000000..bd7ffda63cb9a45ce62e42111854e0e557c0799b --- /dev/null +++ b/releases/2026-10-02/figures/compact_modalities/inputs/figure7_original_provenance.json @@ -0,0 +1,540 @@ +{ + "figure": "Supplementary Figure 7", + "title": "Static structure and molecular-dynamics representations", + "builder": "06_code/figures/build_supplement_presentation.py::figure7", + "builder_sha256": "9086813c19cb26d23e1f7d2a75b1ef80ed29d4d087822fa9e95ac40821a32896", + "static_parameters": { + "egnn_layers": 4, + "egnn_width": 256, + "residue_projection_dimensions": 128, + "residual_quantizer_stages": 4, + "entries_per_stage": 1024, + "codes_per_residue": 4 + }, + "md_parameters": { + "trajectory_duration_ns": 20, + "interval_duration_ns": 1, + "interval_count": 20, + "descriptors_per_interval": 6, + "applicability_flags_per_interval": 6, + "masked_intervals_per_state": 3, + "encoder": "bidirectional GRU", + "pooled_output_dimensions": 768, + "pooling": "mean over time, then mean over available state embeddings" + }, + "md_method_source": "06_code/bertose_source/writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/review_md_temporal_20x6_core_r3.py", + "md_method_source_sha256": "3e96d8092239c2c21f217ad5bae4ee7e07dbe0f7630b213bad468d6b08d3b1c1", + "source_line_ranges": { + "md_dimensions": "49-51", + "md_tensor_and_flags": "219-262", + "md_encoder_and_loss": "441-540" + }, + "schematic": true, + "illustrative_masked_interval_indices_one_based": [ + 4, + 11, + 17 + ], + "measured_descriptor_values_used": false, + "raw_coordinates_used": false, + "applicability": "Flags are defined as 0/1; no real-state applicability pattern is asserted.", + "palette": "Nature BPG (NPG nrc), alpha 0.6 categorical fills", + "canvas_inches": [ + 6.5, + 5.3 + ], + "minimum_font_size_pt": 9.5, + "font_family": "Arial", + "text_extents_at_100_dpi": [ + { + "text": "a", + "font_size_pt": 12.5, + "bounds_px": [ + 15.0, + 501.50000000000006, + 9.75, + 14.999999999999943 + ] + }, + { + "text": "Static conformer to residue-aligned tokens", + "font_size_pt": 12.5, + "bounds_px": [ + 40.0, + 501.44531250000006, + 353.625, + 15.109374999999943 + ] + }, + { + "text": "Conformer", + "font_size_pt": 10.5, + "bounds_px": [ + 34.5, + 457.00000000000006, + 75.0, + 14.0 + ] + }, + { + "text": "Static geometry", + "font_size_pt": 9.5, + "bounds_px": [ + 25.9375, + 431.80468750000006, + 92.125, + 12.390625 + ] + }, + { + "text": "Right-handed frame", + "font_size_pt": 10.5, + "bounds_px": [ + 150.93750000000003, + 457.00000000000006, + 138.12499999999997, + 14.0 + ] + }, + { + "text": "Mapped sugar atoms", + "font_size_pt": 9.5, + "bounds_px": [ + 157.87500000000003, + 431.80468750000006, + 124.24999999999997, + 12.390625 + ] + }, + { + "text": "4-layer EGNN", + "font_size_pt": 10.5, + "bounds_px": [ + 331.375, + 457.00000000000006, + 93.25, + 14.0 + ] + }, + { + "text": "256 dimensions", + "font_size_pt": 9.5, + "bounds_px": [ + 331.625, + 432.00000000000006, + 92.75, + 12.0 + ] + }, + { + "text": "Residue mean", + "font_size_pt": 10.5, + "bounds_px": [ + 490.3125, + 457.00000000000006, + 99.375, + 14.0 + ] + }, + { + "text": "Project to 128 dimensions", + "font_size_pt": 9.5, + "bounds_px": [ + 463.8125, + 431.80468750000006, + 152.375, + 12.390625 + ] + }, + { + "text": "Residual quantization", + "font_size_pt": 10.5, + "bounds_px": [ + 18.0, + 396.00000000000006, + 150.875, + 14.0 + ] + }, + { + "text": "Four ordered\ncodebooks", + "font_size_pt": 10.5, + "bounds_px": [ + 18.0, + 346.3500000000001, + 84.375, + 31.299999999999955 + ] + }, + { + "text": "Stage 1", + "font_size_pt": 10.5, + "bounds_px": [ + 189.0625, + 369.00000000000006, + 51.875, + 14.0 + ] + }, + { + "text": "1,024 entries", + "font_size_pt": 10.0, + "bounds_px": [ + 174.75, + 347.00000000000006, + 80.5, + 12.0 + ] + }, + { + "text": "Token 1", + "font_size_pt": 10.5, + "bounds_px": [ + 189.4375, + 306.00000000000006, + 51.125, + 14.0 + ] + }, + { + "text": "Stage 2", + "font_size_pt": 10.5, + "bounds_px": [ + 309.0625, + 369.00000000000006, + 51.875, + 14.0 + ] + }, + { + "text": "1,024 entries", + "font_size_pt": 10.0, + "bounds_px": [ + 294.75, + 347.00000000000006, + 80.5, + 12.0 + ] + }, + { + "text": "Token 2", + "font_size_pt": 10.5, + "bounds_px": [ + 309.4375, + 306.00000000000006, + 51.125, + 14.0 + ] + }, + { + "text": "Stage 3", + "font_size_pt": 10.5, + "bounds_px": [ + 429.06250000000006, + 369.00000000000006, + 51.875, + 14.0 + ] + }, + { + "text": "1,024 entries", + "font_size_pt": 10.0, + "bounds_px": [ + 414.75000000000006, + 347.00000000000006, + 80.5, + 12.0 + ] + }, + { + "text": "Token 3", + "font_size_pt": 10.5, + "bounds_px": [ + 429.43750000000006, + 306.00000000000006, + 51.125, + 14.0 + ] + }, + { + "text": "Stage 4", + "font_size_pt": 10.5, + "bounds_px": [ + 549.0625, + 369.00000000000006, + 51.875, + 14.0 + ] + }, + { + "text": "1,024 entries", + "font_size_pt": 10.0, + "bounds_px": [ + 534.75, + 347.00000000000006, + 80.5, + 12.0 + ] + }, + { + "text": "Token 4", + "font_size_pt": 10.5, + "bounds_px": [ + 549.4375, + 306.00000000000006, + 51.125, + 14.0 + ] + }, + { + "text": "b", + "font_size_pt": 12.5, + "bounds_px": [ + 15.0, + 274.5, + 10.625, + 15.0 + ] + }, + { + "text": "MD trajectory to temporal representation", + "font_size_pt": 12.5, + "bounds_px": [ + 40.0, + 274.4453125, + 336.25, + 15.109375 + ] + }, + { + "text": "20 ns → twenty 1-ns intervals; training-set scaling", + "font_size_pt": 10.5, + "bounds_px": [ + 18.0, + 249.00000000000006, + 321.75, + 14.0 + ] + }, + { + "text": "Mean radius of gyration", + "font_size_pt": 10.0, + "bounds_px": [ + 65.37500000000003, + 200.796875, + 145.625, + 12.40625 + ] + }, + { + "text": "Mean aligned RMSD", + "font_size_pt": 10.0, + "bounds_px": [ + 82.50000000000003, + 179.00000000000003, + 128.5, + 12.0 + ] + }, + { + "text": "Aligned RMSD SD", + "font_size_pt": 10.0, + "bounds_px": [ + 96.37500000000003, + 157.00000000000003, + 114.625, + 12.0 + ] + }, + { + "text": "SASA / residue", + "font_size_pt": 10.0, + "bounds_px": [ + 117.50000000000003, + 135.00000000000003, + 93.5, + 12.0 + ] + }, + { + "text": "Span / diameter residue count", + "font_size_pt": 10.0, + "bounds_px": [ + 25.50000000000003, + 112.79687500000003, + 185.5, + 12.40625 + ] + }, + { + "text": "Torsion circular variance", + "font_size_pt": 10.0, + "bounds_px": [ + 61.00000000000003, + 91.00000000000001, + 150.0, + 12.0 + ] + }, + { + "text": "1", + "font_size_pt": 10.0, + "bounds_px": [ + 221.5, + 225.00000000000003, + 7.75, + 12.0 + ] + }, + { + "text": "5", + "font_size_pt": 10.0, + "bounds_px": [ + 264.50000000000006, + 225.00000000000003, + 7.75, + 12.0 + ] + }, + { + "text": "10", + "font_size_pt": 10.0, + "bounds_px": [ + 314.37500000000006, + 225.00000000000003, + 15.5, + 12.0 + ] + }, + { + "text": "15", + "font_size_pt": 10.0, + "bounds_px": [ + 368.125, + 225.00000000000003, + 15.5, + 12.0 + ] + }, + { + "text": "20", + "font_size_pt": 10.0, + "bounds_px": [ + 421.87500000000006, + 225.00000000000003, + 15.5, + 12.0 + ] + }, + { + "text": "Interval (1 ns)", + "font_size_pt": 10.0, + "bounds_px": [ + 285.0, + 63.796875, + 85.0, + 12.40625 + ] + }, + { + "text": "Applicability flags:", + "font_size_pt": 10.5, + "bounds_px": [ + 18.0, + 37.00000000000001, + 129.375, + 14.0 + ] + }, + { + "text": "1 = defined 0 = undefined", + "font_size_pt": 10.0, + "bounds_px": [ + 162.0, + 38.00000000000001, + 166.125, + 12.0 + ] + }, + { + "text": "Schematic; masked intervals are illustrative.", + "font_size_pt": 9.5, + "bounds_px": [ + 18.0, + 10.000000000000004, + 258.5, + 12.0 + ] + }, + { + "text": "Bidirectional\nGRU", + "font_size_pt": 11.0, + "bounds_px": [ + 506.375, + 143.35000000000002, + 93.25, + 31.30000000000001 + ] + }, + { + "text": "Values + flags", + "font_size_pt": 10.5, + "bounds_px": [ + 507.625, + 113.00000000000001, + 90.75, + 14.0 + ] + }, + { + "text": "Reconstruct 3\nmasked intervals", + "font_size_pt": 10.5, + "bounds_px": [ + 498.25, + 219.35000000000002, + 109.5, + 31.30000000000001 + ] + }, + { + "text": "Pool time and states", + "font_size_pt": 10.0, + "bounds_px": [ + 489.9375, + 72.00000000000001, + 126.125, + 12.0 + ] + }, + { + "text": "768-dimensional\nMD vector", + "font_size_pt": 10.5, + "bounds_px": [ + 499.25, + 33.35000000000001, + 107.5, + 31.299999999999997 + ] + } + ], + "outputs": { + "Supplementary_Figure_7_current_static_RVQ.svg": "80e3e38e6be6227be80c61dd476de454f10c874eac9f78d31b44c36045ca1f07", + "Supplementary_Figure_7_current_static_RVQ.pdf": "390360c35ebcdafa503b4e00878572c51e59b9f4e33da6df3edba857af2e7b67", + "Supplementary_Figure_7_current_static_RVQ.png": "02f0f41b3b2a83808ec4269e4f2f77d465b77c002819bed9cc2806c65d571d49", + "Supplementary_Figure_7_current_static_RVQ.tif": "72c56c025915c25dfe78378da0e5cc6255609d8e47524b1c39b46ce89d23534b", + "Supplementary_Figure_7_caption.txt": "0d2a9fe681de87e0576e4cd24ab8f885a55793504b9a3b7c5c6045abdd74780f" + }, + "no_training_or_inference": true, + "caption_sync_update": { + "date": "2026-09-27", + "scope": "Caption concision and cross-reference synchronization only. Artwork and numerical inputs were not changed or rerendered. Existing historical build/update records remain preserved.", + "approved_caption_plan_sha256": "b08938fdbb1d06865d4c4ee8f90d6087d65b3952ed2fb2dc1387e6d2610304fa", + "caption_path": "05_figures/Supplementary_Figure_7_caption.txt", + "previous_caption_sha256": "51afd048be79346df4890e1d9faa825a2e0b700429dbd8dafbea028e945f3648", + "caption_sha256": "0d2a9fe681de87e0576e4cd24ab8f885a55793504b9a3b7c5c6045abdd74780f", + "builder_path": "06_code/figures/build_supplement_presentation.py", + "previous_builder_sha256": "6e901d7f494404f2205e71e41174e06010e2aa97d48776e33d7480f3e3923084", + "builder_sha256": "9086813c19cb26d23e1f7d2a75b1ef80ed29d4d087822fa9e95ac40821a32896", + "previous_builder_record": "06_code/figures/build_supplement_presentation.py::figure7" + } +} diff --git a/releases/2026-10-02/figures/compact_modalities/inputs/review_md_temporal_20x6_core_r3.py b/releases/2026-10-02/figures/compact_modalities/inputs/review_md_temporal_20x6_core_r3.py new file mode 100644 index 0000000000000000000000000000000000000000..ace10633ce10df4ed1ec2f010fa42061d9d6b893 --- /dev/null +++ b/releases/2026-10-02/figures/compact_modalities/inputs/review_md_temporal_20x6_core_r3.py @@ -0,0 +1,999 @@ +"""MD temporal package, encoder, and native-composite successor. + +The implementation reuses the exact native-eight sequence, topology, MS, and +static modules. It adds one ordered temporal branch and expands only the new +MD-on experiment family's fusion input from three to four fixed 768-wide slots. +""" + +from __future__ import annotations + +import csv +from dataclasses import dataclass +import gzip +import hashlib +import json +from pathlib import Path +from types import MappingProxyType, ModuleType +from typing import Any, Mapping, Optional, Sequence + +import numpy as np +import torch +from torch import nn + + +SCHEMA = "bertose_review_md_temporal_20x6_core_20260802_r3" +PACKAGE_SCHEMA = "review_md_parent_temporal_20x6_v2" +CORRECTED_OVERLAY_SCHEMA = "review_md_temporal_20x9_v2_charge_corrected_overlay" +MD_CELL_ORDER = ( + "A0001", + "A1001", + "A0101", + "A0011", + "A1101", + "A1011", + "A0111", + "A1111", +) +BASE_CELL_BY_MD_CELL = { + "A0001": "A000", + "A1001": "A100", + "A0101": "A010", + "A0011": "A001", + "A1101": "A110", + "A1011": "A101", + "A0111": "A011", + "A1111": "A111", +} +OBJECTIVES = ("sequence", "topology", "ms", "static", "md") +LOSS_DENOMINATOR = 5 +MD_WINDOW_COUNT = 20 +MD_FEATURE_COUNT = 6 +MD_MASKED_WINDOWS = 3 +ROLE_CONTRIBUTOR_FIELD = MappingProxyType( + { + "pretraining_train": "md_pretraining_train_contributor", + "pretraining_development": "md_pretraining_development_contributor", + } +) +DECLARED_ROLE_COUNT = MappingProxyType( + {"pretraining_train": 22914, "pretraining_development": 5074} +) +DECLARED_ROLE_ROSTER_SHA256 = MappingProxyType( + { + "pretraining_train": "052898ac01e3939d1a9c7229085c9702ce71e96c3da347cb741b18b8e6d06730", + "pretraining_development": "d68ff3b8c24b4a7cc5e3751fb9d30b3c932235d838856be9023340a81f337e42", + } +) +NATIVE_INTERSECTION_COUNT = MappingProxyType( + {"pretraining_train": 22872, "pretraining_development": 5066} +) +NATIVE_INTERSECTION_ROSTER_SHA256 = MappingProxyType( + { + "pretraining_train": "6efa5bd7ff81f9b49aab026d44d613765041dc5ea10e116059c9477650f7403a", + "pretraining_development": "b94e6907dc441597ee7ea098894de9ffd7cfe71a61b9ae3a0489f5e1b73e79d8", + } +) + + +class MDTemporal20x6Error(RuntimeError): + """Raised when an MD package, tensor, model, or identity drifts.""" + + +def require(condition: bool, message: str) -> None: + if not condition: + raise MDTemporal20x6Error(message) + + +def sha256_file(path: Path) -> str: + digest = hashlib.sha256() + with Path(path).open("rb") as handle: + for block in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + +def canonical_bytes(value: object) -> bytes: + return ( + json.dumps( + value, + sort_keys=True, + separators=(",", ":"), + ensure_ascii=True, + allow_nan=False, + ) + + "\n" + ).encode("ascii") + + +def canonical_sha256(value: object, *, domain: str) -> str: + return hashlib.sha256(domain.encode("ascii") + b"\0" + canonical_bytes(value)).hexdigest() + + +def corrected_overlay_binding(summary: Mapping[str, Any]) -> Mapping[str, Any]: + expected = { + "schema": CORRECTED_OVERLAY_SCHEMA, + "status": "PASS", + "state_count": 47063, + "affected_state_count": 9943, + "unaffected_state_count": 37120, + "unaffected_state_tensor_values_verified_unchanged": True, + "tensor_shape": [47063, 20, 9], + } + overlay = summary.get("corrected_overlay") + require(isinstance(overlay, dict), "MD summary lacks corrected-overlay provenance") + require(set(overlay) == set(expected) | {"summary_path", "summary_sha256"}, + "MD corrected-overlay fields changed") + for field, value in expected.items(): + require(overlay.get(field) == value, f"MD corrected-overlay {field} changed") + require( + isinstance(overlay.get("summary_path"), str) and overlay["summary_path"], + "MD corrected-overlay summary path is invalid", + ) + require( + isinstance(overlay.get("summary_sha256"), str) + and len(overlay["summary_sha256"]) == 64, + "MD corrected-overlay summary hash is invalid", + ) + return MappingProxyType(overlay) + + +def coefficients_for_md_cell(cell_id: str) -> Mapping[str, int]: + require(cell_id in BASE_CELL_BY_MD_CELL, f"unknown MD-on cell {cell_id!r}") + topology, ms, static = (int(value) for value in BASE_CELL_BY_MD_CELL[cell_id][1:]) + return MappingProxyType( + {"sequence": 1, "topology": topology, "ms": ms, "static": static, "md": 1} + ) + + +def _deterministic_windows( + *, + parent_id: str, + child_row: int, + split: str, + epoch: int, +) -> np.ndarray: + require(split in {"train", "development"}, "unknown MD split") + effective_epoch = epoch if split == "train" else 0 + payload = f"{SCHEMA}\0{split}\0{effective_epoch}\0{parent_id}\0{child_row}".encode("ascii") + seed = int.from_bytes(hashlib.sha256(payload).digest()[:8], "big") + return np.sort( + np.random.default_rng(seed).choice( + MD_WINDOW_COUNT, + size=MD_MASKED_WINDOWS, + replace=False, + ) + ) + + +@dataclass(frozen=True, slots=True) +class MDPackageBinding: + model_path: Path + model_sha256: str + index_path: Path + index_sha256: str + ledger_path: Path + ledger_sha256: str + objective_path: Path + objective_sha256: str + summary_path: Path + summary_sha256: str + + +class MDTemporal20x6Package: + """Audited state tensors plus exact parent-to-child lookup.""" + + def __init__(self, binding: MDPackageBinding) -> None: + self.binding = binding + for label, path, expected in ( + ("model", binding.model_path, binding.model_sha256), + ("parent index", binding.index_path, binding.index_sha256), + ("master ledger", binding.ledger_path, binding.ledger_sha256), + ("objective table", binding.objective_path, binding.objective_sha256), + ("summary", binding.summary_path, binding.summary_sha256), + ): + require(path.is_file() and not path.is_symlink(), f"MD {label} is absent or unsafe") + require(sha256_file(path) == expected, f"MD {label} hash changed") + summary_payload = binding.summary_path.read_bytes() + try: + summary = json.loads(summary_payload.decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise MDTemporal20x6Error("MD summary is invalid JSON") from error + require(summary.get("schema") == PACKAGE_SCHEMA, "MD summary schema changed") + require(summary.get("status") == "PASS", "MD summary is not PASS") + require(summary.get("state_tensor_shape") == [47063, 20, 6], "MD tensor shape changed") + require(summary.get("md_parent_count") == 30088, "MD parent count changed") + corrected_overlay_binding(summary) + output_hashes = summary.get("output_sha256", {}) + require( + output_hashes.get(binding.model_path.name) == binding.model_sha256, + "MD summary no longer binds the model", + ) + require( + output_hashes.get(binding.index_path.name) == binding.index_sha256, + "MD summary no longer binds the parent index", + ) + require( + output_hashes.get(binding.ledger_path.name) == binding.ledger_sha256, + "MD summary no longer binds the master ledger", + ) + require( + output_hashes.get(binding.objective_path.name) == binding.objective_sha256, + "MD summary no longer binds the objective table", + ) + with np.load(binding.model_path, allow_pickle=False) as source: + expected_keys = { + "state_parent_row_index", + "parent_child_state_row_index", + "parent_child_present_mask", + "campaign_index", + "qc_dominant_conformer_occupancy", + "child_slot_names", + "window_start_ps", + "window_end_ps", + "state_features_z", + "state_feature_mask", + "feature_mean", + "feature_sd", + "feature_names", + "source_feature_indices", + } + require(set(source.files) == expected_keys, "MD model keys changed") + self.state_features = np.asarray(source["state_features_z"], dtype=np.float32) + self.state_feature_mask = np.asarray(source["state_feature_mask"], dtype=np.uint8) + self.parent_child_rows = np.asarray( + source["parent_child_state_row_index"], dtype=np.int32 + ) + self.parent_child_mask = np.asarray( + source["parent_child_present_mask"], dtype=np.uint8 + ) + self.feature_names = tuple(str(value) for value in source["feature_names"].tolist()) + self.child_slot_names = tuple(str(value) for value in source["child_slot_names"].tolist()) + require(self.state_features.shape == (47063, 20, 6), "MD state tensor shape changed") + require(self.state_feature_mask.shape == self.state_features.shape, "MD masks are misaligned") + require(self.parent_child_rows.shape == (30088, 2), "MD child rows changed") + require(self.parent_child_mask.shape == (30088, 2), "MD child mask changed") + require(np.isfinite(self.state_features).all(), "MD standardized values are nonfinite") + require(np.isin(self.state_feature_mask, (0, 1)).all(), "MD feature mask is nonbinary") + require(np.isin(self.parent_child_mask, (0, 1)).all(), "MD child mask is nonbinary") + require( + np.all(self.state_features[self.state_feature_mask == 0] == 0), + "MD masked values are nonzero", + ) + self.parent_row_by_id = self._load_parent_index(binding.index_path) + require(len(self.parent_row_by_id) == 30088, "MD parent index population changed") + self.summary = MappingProxyType(summary) + + @staticmethod + def _load_parent_index(path: Path) -> Mapping[str, int]: + result: dict[str, int] = {} + with gzip.open(path, "rt", encoding="utf-8", newline="") as handle: + reader = csv.DictReader(handle, delimiter="\t") + require(reader.fieldnames is not None, "MD parent index has no header") + for expected_row, row in enumerate(reader): + require(int(row["md_parent_row_index"]) == expected_row, "MD parent rows reordered") + parent_id = row["parent_glycorpus_id"] + require(parent_id and parent_id not in result, "MD parent ID is blank or duplicated") + result[parent_id] = expected_row + return MappingProxyType(result) + + def available_parent_ids(self, parent_ids: Sequence[str]) -> tuple[str, ...]: + return tuple(parent_id for parent_id in parent_ids if parent_id in self.parent_row_by_id) + + def declared_parent_ids_for_role(self, role: str) -> tuple[str, ...]: + require(role in ROLE_CONTRIBUTOR_FIELD, "unknown reviewed parent role") + contributor_field = ROLE_CONTRIBUTOR_FIELD[role] + result: list[str] = [] + with gzip.open(self.binding.ledger_path, "rt", encoding="utf-8", newline="") as handle: + reader = csv.DictReader(handle, delimiter="\t") + require(reader.fieldnames is not None, "MD master ledger has no header") + require( + { + "parent_glycorpus_id", + "data_role", + "in_a5_parent_partition", + "has_md_completed", + "has_md_a5_objective", + contributor_field, + }.issubset(reader.fieldnames), + "MD role-specific contributor fields changed", + ) + for row in reader: + if ( + row["in_a5_parent_partition"] == "1" + and row["data_role"] == role + and row[contributor_field] == "1" + and row["has_md_completed"] == "1" + and row["has_md_a5_objective"] == "1" + ): + result.append(row["parent_glycorpus_id"]) + require(len(result) == len(set(result)), "MD role ledger duplicates a parent") + result.sort() + require( + len(result) == DECLARED_ROLE_COUNT[role], + f"MD {role} contributor count changed", + ) + require( + canonical_sha256( + result, + domain=f"bertose-review-md20x6-role-roster-r2:{role}", + ) + == DECLARED_ROLE_ROSTER_SHA256[role], + f"MD {role} contributor roster changed", + ) + require(set(result).issubset(self.parent_row_by_id), "MD role ledger has absent tensor parent") + return tuple(result) + + def native_intersection_parent_ids_for_role( + self, + role: str, + native_parent_ids: Sequence[str], + ) -> tuple[str, ...]: + require(role in ROLE_CONTRIBUTOR_FIELD, "unknown native intersection role") + require( + len(native_parent_ids) == len(set(native_parent_ids)), + "native adapter roster duplicates a parent", + ) + declared = set(self.declared_parent_ids_for_role(role)) + result = tuple(sorted(declared.intersection(native_parent_ids))) + require( + len(result) == NATIVE_INTERSECTION_COUNT[role], + f"MD/native {role} intersection count changed", + ) + require( + canonical_sha256( + result, + domain=f"bertose-review-md20x6-native-intersection-r3:{role}", + ) + == NATIVE_INTERSECTION_ROSTER_SHA256[role], + f"MD/native {role} intersection roster changed", + ) + return result + + def collate( + self, + parent_ids: Sequence[str], + *, + split: str, + epoch: int, + device: torch.device, + ) -> tuple[Mapping[str, torch.Tensor], str]: + require(parent_ids and len(set(parent_ids)) == len(parent_ids), "MD batch parents are empty or repeated") + batch_size = len(parent_ids) + values = np.zeros((batch_size, 2, 20, 6), dtype=np.float32) + labels = np.zeros_like(values) + feature_mask = np.zeros_like(values, dtype=np.uint8) + child_mask = np.zeros((batch_size, 2), dtype=np.uint8) + input_mask = np.zeros((batch_size, 2, 20), dtype=np.uint8) + state_rows = np.full((batch_size, 2), -1, dtype=np.int32) + mask_surface: list[dict[str, object]] = [] + for local_parent, parent_id in enumerate(parent_ids): + parent_row = self.parent_row_by_id.get(parent_id) + if parent_row is None: + continue + for child_slot in range(2): + if not self.parent_child_mask[parent_row, child_slot]: + continue + child_row = int(self.parent_child_rows[parent_row, child_slot]) + require(0 <= child_row < self.state_features.shape[0], "MD child row outside tensor") + selected = _deterministic_windows( + parent_id=parent_id, + child_row=child_row, + split=split, + epoch=epoch, + ) + original = self.state_features[child_row] + values[local_parent, child_slot] = original + labels[local_parent, child_slot] = original + feature_mask[local_parent, child_slot] = self.state_feature_mask[child_row] + child_mask[local_parent, child_slot] = 1 + input_mask[local_parent, child_slot, selected] = 1 + values[local_parent, child_slot, selected] = 0.0 + state_rows[local_parent, child_slot] = child_row + mask_surface.append( + { + "parent_id": parent_id, + "child_slot": child_slot, + "state_row": child_row, + "selected_windows": selected.tolist(), + } + ) + parent_available = child_mask.any(axis=1) + tensors = { + "md_values": torch.as_tensor(values, device=device), + "md_feature_mask": torch.as_tensor(feature_mask, dtype=torch.bool, device=device), + "md_child_present_mask": torch.as_tensor(child_mask, dtype=torch.bool, device=device), + "md_state_row_ids": torch.as_tensor(state_rows, dtype=torch.long, device=device), + "md_window_input_mask": torch.as_tensor(input_mask, dtype=torch.bool, device=device), + "md_labels": torch.as_tensor(labels, device=device), + "md_parent_available": torch.as_tensor(parent_available, dtype=torch.bool, device=device), + } + identity = canonical_sha256( + { + "model_sha256": self.binding.model_sha256, + "index_sha256": self.binding.index_sha256, + "split": split, + "effective_epoch": epoch if split == "train" else 0, + "parent_ids": list(parent_ids), + "mask_surface": mask_surface, + }, + domain="bertose-review-md20x6-batch-r3", + ) + return MappingProxyType(tensors), identity + + def null_mse_scale(self, train_parent_ids: Sequence[str]) -> tuple[float, int]: + parents = self.available_parent_ids(train_parent_ids) + require(parents, "no training parents have MD") + parent_losses: list[float] = [] + for parent_id in parents: + parent_row = self.parent_row_by_id[parent_id] + child_losses: list[float] = [] + for child_slot in range(2): + if not self.parent_child_mask[parent_row, child_slot]: + continue + child_row = int(self.parent_child_rows[parent_row, child_slot]) + selected = self.state_feature_mask[child_row].astype(bool) + child_losses.append(float(np.mean(np.square(self.state_features[child_row][selected])))) + require(child_losses, "MD parent has no present child") + parent_losses.append(float(np.mean(child_losses))) + return float(np.mean(np.asarray(parent_losses, dtype=np.float64))), len(parent_losses) + + +class MDTemporalEncoder(nn.Module): + """One small bidirectional GRU over ordered one-nanosecond windows.""" + + def __init__( + self, + *, + output_size: int, + temporal_size: int = 128, + feature_count: int = 6, + dropout: float = 0.1, + layer_norm_eps: float = 1e-12, + ) -> None: + super().__init__() + require(temporal_size > 0 and temporal_size % 2 == 0, "MD temporal width must be positive and even") + self.output_size = output_size + self.temporal_size = temporal_size + self.feature_count = feature_count + self.input_projection = nn.Linear(feature_count * 2, temporal_size) + self.time_embedding = nn.Embedding(MD_WINDOW_COUNT, temporal_size) + self.mask_embedding = nn.Parameter(torch.empty(temporal_size)) + nn.init.zeros_(self.mask_embedding) + self.input_norm = nn.LayerNorm(temporal_size, eps=layer_norm_eps) + self.gru = nn.GRU( + temporal_size, + temporal_size // 2, + num_layers=1, + batch_first=True, + bidirectional=True, + ) + self.output_norm = nn.LayerNorm(temporal_size, eps=layer_norm_eps) + self.dropout = nn.Dropout(dropout) + self.projection = nn.Linear(temporal_size, output_size) + self.reconstruction_head = nn.Linear(temporal_size, feature_count) + self.register_buffer("time_ids", torch.arange(MD_WINDOW_COUNT).view(1, -1)) + + def forward( + self, + *, + values: torch.Tensor, + feature_mask: torch.Tensor, + child_present_mask: torch.Tensor, + window_input_mask: torch.Tensor, + labels: Optional[torch.Tensor], + parent_available: torch.Tensor, + ) -> tuple[torch.Tensor, Optional[torch.Tensor], Optional[torch.Tensor]]: + require(values.ndim == 4 and values.shape[1:] == (2, 20, self.feature_count), "MD values must be [parent,2,20,6]") + require(feature_mask.dtype == torch.bool and feature_mask.shape == values.shape, "MD feature mask changed") + require(child_present_mask.dtype == torch.bool and child_present_mask.shape == values.shape[:2], "MD child mask changed") + require(window_input_mask.dtype == torch.bool and window_input_mask.shape == values.shape[:3], "MD window mask changed") + require(parent_available.dtype == torch.bool and parent_available.shape == (values.shape[0],), "MD availability changed") + require(torch.equal(child_present_mask.any(dim=1), parent_available), "MD child and parent availability disagree") + require(torch.isfinite(values).all().item(), "MD values are nonfinite") + require(not (feature_mask & ~child_present_mask[:, :, None, None]).any().item(), "absent MD child has feature mask") + require(not (window_input_mask & ~child_present_mask[:, :, None]).any().item(), "absent MD child has input mask") + if labels is None: + require(not window_input_mask.any().item(), "MD input mask requires labels") + else: + require(labels.shape == values.shape and torch.isfinite(labels).all().item(), "MD labels changed") + selected_counts = window_input_mask.sum(dim=-1) + require( + torch.equal( + selected_counts[child_present_mask], + torch.full_like(selected_counts[child_present_mask], MD_MASKED_WINDOWS), + ), + "present MD child must mask exactly three windows", + ) + require(not values[window_input_mask].ne(0).any().item(), "masked MD input window is nonzero") + active = child_present_mask.nonzero(as_tuple=False) + parent_pool = values.new_zeros((values.shape[0], self.output_size)) + if active.shape[0] == 0: + empty = values.new_empty((0,)) if labels is not None else None + empty_indices = torch.empty((0,), dtype=torch.long, device=values.device) if labels is not None else None + return parent_pool, empty, empty_indices + active_parent = active[:, 0] + active_child = active[:, 1] + active_values = values[active_parent, active_child] + active_features = feature_mask[active_parent, active_child] + active_windows = window_input_mask[active_parent, active_child] + encoder_input = torch.cat((active_values, active_features.to(active_values.dtype)), dim=-1) + hidden = self.input_projection(encoder_input) + self.time_embedding(self.time_ids[:, : active_values.shape[1]]) + hidden = hidden + active_windows.unsqueeze(-1).to(hidden.dtype) * self.mask_embedding.view(1, 1, -1) + hidden = self.input_norm(hidden) + hidden, _ = self.gru(hidden) + hidden = self.dropout(self.output_norm(hidden)) + child_pool = self.projection(hidden.mean(dim=1)) + parent_pool.index_add_(0, active_parent, child_pool) + child_counts = torch.bincount(active_parent, minlength=values.shape[0]).clamp_min(1) + parent_pool = parent_pool / child_counts.unsqueeze(-1).to(parent_pool.dtype) + if labels is None: + return parent_pool, None, None + predictions = self.reconstruction_head(hidden) + active_labels = labels[active_parent, active_child] + selected = active_windows.unsqueeze(-1) & active_features + scalar_counts = selected.sum(dim=(1, 2)) + require(scalar_counts.gt(0).all().item(), "masked MD child has no valid target") + child_losses = ((predictions - active_labels).square() * selected).sum(dim=(1, 2)) / scalar_counts + parent_sums = child_losses.new_zeros(values.shape[0]).index_add(0, active_parent, child_losses) + observed = torch.bincount(active_parent, minlength=values.shape[0]).gt(0) + parent_losses = parent_sums[observed] / child_counts[observed].to(parent_sums.dtype) + parent_indices = observed.nonzero(as_tuple=False).squeeze(-1) + return parent_pool, parent_losses, parent_indices + + +@dataclass(slots=True) +class MDEnabledNativeOutput: + cell_id: str + sequence_logits: torch.Tensor + sequence_replica_parent_indices: torch.Tensor + shared_parent_hidden: torch.Tensor + topology_token_pair_predictions: Optional[torch.Tensor] + ms_logits: Optional[torch.Tensor] + static_local_logits: Optional[torch.Tensor] + md_parent_pool: torch.Tensor + parent_losses: Mapping[str, Optional[torch.Tensor]] + loss_parent_indices: Mapping[str, Optional[torch.Tensor]] + + +def _state_acquisition_md_fusion( + composite: ModuleType, + *, + base_parent_hidden: torch.Tensor, + static_state_hidden: torch.Tensor, + static_state_pool: torch.Tensor, + static_state_parent_indices: torch.Tensor, + replica_parent_indices: torch.Tensor, + replica_ms_pool: torch.Tensor, + replica_ms_present: torch.Tensor, + md_parent_pool: torch.Tensor, + md_parent_present: torch.Tensor, + fusion: nn.Module, +) -> torch.Tensor: + require(base_parent_hidden.ndim == 3 and base_parent_hidden.shape[0] > 0, "base hidden changed") + batch_size, _, hidden_size = base_parent_hidden.shape + require(md_parent_pool.shape == (batch_size, hidden_size), "MD parent pool shape changed") + require(md_parent_present.shape == (batch_size,), "MD parent presence shape changed") + counts = torch.bincount(static_state_parent_indices.long(), minlength=batch_size) + replica_counts = counts.index_select(0, replica_parent_indices.long()) + effective_counts = replica_counts.clamp_min(1) + replica_axis = torch.arange(replica_parent_indices.numel(), device=replica_parent_indices.device) + combination_replica = torch.repeat_interleave(replica_axis, effective_counts) + total = int(effective_counts.sum().item()) + group_starts = torch.cumsum(effective_counts, dim=0) - effective_counts + within_group = torch.arange(total, device=replica_parent_indices.device) - torch.repeat_interleave(group_starts, effective_counts) + state_starts = torch.cumsum(counts, dim=0) - counts + repeated_state_starts = torch.repeat_interleave( + state_starts.index_select(0, replica_parent_indices.long()), + effective_counts, + ) + combination_has_state = torch.repeat_interleave(replica_counts.gt(0), effective_counts) + combination_state = repeated_state_starts + within_group + combination_parent = replica_parent_indices.index_select(0, combination_replica.long()) + combination_base = base_parent_hidden.index_select(0, combination_parent.long()) + combination_static_pool = base_parent_hidden.new_zeros((total, hidden_size)) + if static_state_hidden.shape[0] > 0 and combination_has_state.any(): + safe_state = combination_state.clamp_max(static_state_hidden.shape[0] - 1) + selected_state_hidden = static_state_hidden.index_select(0, safe_state.long()) + selected_state_pool = static_state_pool.index_select(0, safe_state.long()) + combination_base = torch.where( + combination_has_state.view(-1, 1, 1), selected_state_hidden, combination_base + ) + combination_static_pool = torch.where( + combination_has_state.view(-1, 1), selected_state_pool, combination_static_pool + ) + combination_ms_pool = replica_ms_pool.index_select(0, combination_replica.long()) + combination_ms_present = replica_ms_present.index_select(0, combination_replica.long()) + combination_md_pool = md_parent_pool.index_select(0, combination_parent.long()) + combination_md_present = md_parent_present.index_select(0, combination_parent.long()) + carrier = combination_has_state | combination_ms_present | combination_md_present + residual = combination_base.new_zeros((total, hidden_size)) + if carrier.any(): + carriers = carrier.nonzero(as_tuple=False).squeeze(-1) + fusion_input = torch.cat( + ( + combination_base.index_select(0, carriers)[:, 0], + combination_ms_pool.index_select(0, carriers), + combination_static_pool.index_select(0, carriers), + combination_md_pool.index_select(0, carriers), + ), + dim=-1, + ) + active_residual = fusion(fusion_input) + require(active_residual.shape == (carriers.numel(), hidden_size), "MD fusion residual changed") + residual = residual.index_copy(0, carriers, active_residual) + combination_shared = combination_base + residual.unsqueeze(1) + view_hidden, observed = composite._group_mean_tensor( + combination_shared, + combination_replica, + group_count=replica_parent_indices.numel(), + ) + require(observed.all().item(), "state/acquisition view is incomplete") + return view_hidden + + +def make_md_enabled_composite_class(executor_module: ModuleType) -> type[nn.Module]: + """Bind the MD successor to the exact classes loaded by the native authority.""" + + composite = executor_module._composite + base_class = executor_module.NativeEightCompositeR5 + + class MDEnabledNativeComposite(base_class): + def __init__( + self, + base_config: Any, + *, + md_cell_id: str, + md_temporal_size: int = 128, + ) -> None: + require(md_cell_id in BASE_CELL_BY_MD_CELL, "unknown MD-on model cell") + require(base_config.cell_id == BASE_CELL_BY_MD_CELL[md_cell_id], "MD/base cell mismatch") + super().__init__(base_config) + self.md_cell_id = md_cell_id + self.md_encoder = MDTemporalEncoder( + output_size=base_config.seq_hidden_size, + temporal_size=md_temporal_size, + feature_count=MD_FEATURE_COUNT, + dropout=base_config.hidden_dropout_prob, + layer_norm_eps=base_config.layer_norm_eps, + ) + self.fusion = nn.Sequential( + nn.Linear(base_config.seq_hidden_size * 4, base_config.fusion_hidden_size), + nn.LayerNorm(base_config.fusion_hidden_size, eps=base_config.layer_norm_eps), + nn.GELU(), + nn.Dropout(base_config.hidden_dropout_prob), + nn.Linear(base_config.fusion_hidden_size, base_config.fusion_hidden_size), + ) + self.fusion.apply(self._initialize) + self.md_encoder.apply(self._initialize) + nn.init.normal_(self.md_encoder.mask_embedding, mean=0.0, std=base_config.initializer_range) + for name, parameter in self.md_encoder.gru.named_parameters(): + if "weight" in name: + nn.init.normal_(parameter, mean=0.0, std=base_config.initializer_range) + else: + nn.init.zeros_(parameter) + self._parameter_shape_identity = tuple( + (name, tuple(parameter.shape)) for name, parameter in self.named_parameters() + ) + self._disabled_parameter_names = frozenset( + name for name, parameter in self.named_parameters() if not parameter.requires_grad + ) + + def verify_live_contract(self) -> None: + require(type(self) is MDEnabledNativeComposite, "MD composite cannot be subclassed") + require(self.config.cell_id == BASE_CELL_BY_MD_CELL[self.md_cell_id], "MD cell changed") + require( + tuple((name, tuple(parameter.shape)) for name, parameter in self.named_parameters()) + == self._parameter_shape_identity, + "MD model architecture changed after construction", + ) + for name, parameter in self.named_parameters(): + if name in self._disabled_parameter_names: + require(not parameter.requires_grad, f"disabled parameter re-enabled: {name}") + + def forward( + self, + *, + seq_token_ids: torch.Tensor, + seq_attention_mask: torch.Tensor, + seq_residue_ids: torch.Tensor, + seq_branch_depths: torch.Tensor, + seq_linkage_types: torch.Tensor, + seq_labels: Optional[torch.Tensor] = None, + topology_labels: Optional[torch.Tensor] = None, + topology_available: Optional[torch.Tensor] = None, + ms_token_ids: Optional[torch.Tensor] = None, + ms_attention_mask: Optional[torch.Tensor] = None, + ms_input_mask: Optional[torch.Tensor] = None, + ms_labels: Optional[torch.Tensor] = None, + ms_acquisition_parent_indices: Optional[torch.Tensor] = None, + ms_parent_available: Optional[torch.Tensor] = None, + ms_mode: Optional[str] = None, + static_token_ids: Optional[torch.Tensor] = None, + static_attention_mask: Optional[torch.Tensor] = None, + static_residue_ids: Optional[torch.Tensor] = None, + static_slot_ids: Optional[torch.Tensor] = None, + static_state_mask: Optional[torch.Tensor] = None, + static_state_ids: Optional[torch.Tensor] = None, + static_input_mask: Optional[torch.Tensor] = None, + static_labels: Optional[torch.Tensor] = None, + static_parent_available: Optional[torch.Tensor] = None, + md_values: Optional[torch.Tensor] = None, + md_feature_mask: Optional[torch.Tensor] = None, + md_child_present_mask: Optional[torch.Tensor] = None, + md_state_row_ids: Optional[torch.Tensor] = None, + md_window_input_mask: Optional[torch.Tensor] = None, + md_labels: Optional[torch.Tensor] = None, + md_parent_available: Optional[torch.Tensor] = None, + ) -> MDEnabledNativeOutput: + self.verify_live_contract() + sequence_attention = composite.validate_sequence_surface( + self.config, + token_ids=seq_token_ids, + attention_mask=seq_attention_mask, + residue_ids=seq_residue_ids, + branch_depths=seq_branch_depths, + linkage_types=seq_linkage_types, + labels=seq_labels, + ) + batch_size = seq_token_ids.shape[0] + sequence_hidden = composite._run_layers( + self.sequence_embeddings(seq_token_ids, seq_branch_depths, seq_linkage_types), + sequence_attention, + self.sequence_layers, + ) + topology_predictions = topology_loss = topology_loss_indices = None + topology_bundle = self._bundle_presence( + {"labels": topology_labels, "availability": topology_available}, + "topology target", + ) + if not self.enabled["topology"]: + require(not topology_bundle, "disabled topology branch received payload") + else: + projected = self.topology_projection(sequence_hidden) + pair_hidden = torch.abs(projected.unsqueeze(2) - projected.unsqueeze(1)) + topology_predictions = self.topology_head(pair_hidden).squeeze(-1) + if topology_bundle: + topology_loss, topology_loss_indices = composite.topology_parent_losses_inverse_bpe( + topology_predictions, + sequence_residue_ids=seq_residue_ids, + sequence_attention=sequence_attention, + topology_labels=topology_labels, + topology_available=topology_available, + ) + empty_indices = torch.empty((0,), dtype=torch.long, device=seq_token_ids.device) + cross_state_hidden = sequence_hidden.new_empty((0, *sequence_hidden.shape[1:])) + projected_state_pool = sequence_hidden.new_empty((0, sequence_hidden.shape[-1])) + active_parents = active_states = empty_indices + static_logits = static_loss = static_loss_indices = None + static_core = { + "token_ids": static_token_ids, + "attention": static_attention_mask, + "residues": static_residue_ids, + "slots": static_slot_ids, + "states": static_state_mask, + "state_ids": static_state_ids, + "input_mask": static_input_mask, + "availability": static_parent_available, + } + static_bundle = self._bundle_presence(static_core, "static") + if not self.enabled["static"]: + require(not static_bundle and static_labels is None, "disabled static branch received payload") + else: + require(static_bundle, "enabled static branch requires complete payload") + static_attention = composite.validate_static_surface( + batch_size=batch_size, + token_ids=static_token_ids, + attention_mask=static_attention_mask, + residue_ids=static_residue_ids, + slot_ids=static_slot_ids, + state_mask=static_state_mask, + state_ids=static_state_ids, + input_mask=static_input_mask, + labels=static_labels, + parent_available=static_parent_available, + sequence_residue_ids=seq_residue_ids, + sequence_attention=sequence_attention, + ) + active_coordinates = static_state_mask.nonzero(as_tuple=False) + active_parents, active_states = active_coordinates[:, 0], active_coordinates[:, 1] + if active_coordinates.shape[0] > 0: + active_token_ids = static_token_ids[active_parents, active_states] + active_attention = static_attention[active_parents, active_states] + active_residue_ids = static_residue_ids[active_parents, active_states] + active_slot_ids = static_slot_ids[active_parents, active_states] + active_input_mask = static_input_mask[active_parents, active_states] + static_hidden = composite._run_layers( + self.static_embeddings(active_token_ids, active_slot_ids, active_input_mask), + active_attention, + self.static_layers, + ) + static_logits = self.static_head(static_hidden, active_slot_ids, active_attention) + cross_state_hidden = self.static_cross_attention( + sequence_hidden.index_select(0, active_parents), + static_hidden, + seq_residue_ids.index_select(0, active_parents), + active_residue_ids, + sequence_attention.index_select(0, active_parents), + active_attention, + ) + valid_weights = active_attention.to(static_hidden.dtype).unsqueeze(-1) + state_pool = (static_hidden * valid_weights).sum(dim=1) / valid_weights.sum(dim=1) + projected_state_pool = self.static_projection(state_pool) + if static_labels is not None: + static_loss, static_loss_indices = composite.static_parent_losses( + static_logits, + global_labels=static_labels[active_parents, active_states], + slot_ids=active_slot_ids, + attention_mask=active_attention, + active_parent_indices=active_parents, + active_state_indices=active_states, + batch_size=batch_size, + ) + else: + static_logits = sequence_hidden.new_empty((0, static_token_ids.shape[-1], 1024)) + if static_labels is not None: + static_loss, static_loss_indices = sequence_hidden.new_empty((0,)), empty_indices + ms_logits = ms_loss = ms_loss_indices = None + acquisition_pool = sequence_hidden.new_empty((0, sequence_hidden.shape[-1])) + ms_core = { + "token_ids": ms_token_ids, + "attention": ms_attention_mask, + "input_mask": ms_input_mask, + "parent_indices": ms_acquisition_parent_indices, + "availability": ms_parent_available, + "mode": ms_mode, + } + ms_bundle = self._bundle_presence(ms_core, "MS acquisition") + if not self.enabled["ms"]: + require(not ms_bundle and ms_labels is None, "disabled MS branch received payload") + else: + require(ms_bundle, "enabled MS branch requires complete payload") + ms_attention = composite.validate_ms_surface( + batch_size=batch_size, + token_ids=ms_token_ids, + attention_mask=ms_attention_mask, + input_mask=ms_input_mask, + labels=ms_labels, + acquisition_parent_indices=ms_acquisition_parent_indices, + parent_available=ms_parent_available, + mode=ms_mode, + ) + if ms_token_ids.shape[0] > 0: + ms_hidden = composite._run_layers( + self.ms_embeddings(ms_token_ids, ms_input_mask), + ms_attention, + self.ms_layers, + ) + ms_logits = self.ms_head(ms_hidden) + acquisition_pool = self.ms_projection(composite._first_token_pool(ms_hidden, ms_attention)) + if ms_labels is not None: + ms_loss, ms_loss_indices = composite.ms_parent_losses( + ms_logits, + labels=ms_labels, + attention_mask=ms_attention, + acquisition_parent_indices=ms_acquisition_parent_indices, + batch_size=batch_size, + ) + else: + ms_logits = sequence_hidden.new_empty((0, ms_token_ids.shape[1], 242)) + if ms_labels is not None: + ms_loss, ms_loss_indices = sequence_hidden.new_empty((0,)), empty_indices + md_core = { + "values": md_values, + "feature_mask": md_feature_mask, + "children": md_child_present_mask, + "state_rows": md_state_row_ids, + "input_mask": md_window_input_mask, + "availability": md_parent_available, + } + require(self._bundle_presence(md_core, "MD temporal"), "MD-on cell requires complete MD payload") + require(md_state_row_ids.shape == md_child_present_mask.shape, "MD state rows changed") + require( + torch.equal(md_state_row_ids.ge(0), md_child_present_mask), + "MD state-row sentinels disagree with child presence", + ) + md_parent_pool, md_loss, md_loss_indices = self.md_encoder( + values=md_values, + feature_mask=md_feature_mask, + child_present_mask=md_child_present_mask, + window_input_mask=md_window_input_mask, + labels=md_labels, + parent_available=md_parent_available, + ) + if self.enabled["ms"]: + missing_parents = (~ms_parent_available).nonzero(as_tuple=False).squeeze(-1) + replica_parent_indices = torch.cat((ms_acquisition_parent_indices.long(), missing_parents.long())) + replica_ms_pool = torch.cat( + ( + acquisition_pool, + sequence_hidden.new_zeros((missing_parents.numel(), sequence_hidden.shape[-1])), + ) + ) + replica_ms_present = torch.cat( + ( + torch.ones(ms_acquisition_parent_indices.numel(), dtype=torch.bool, device=seq_token_ids.device), + torch.zeros(missing_parents.numel(), dtype=torch.bool, device=seq_token_ids.device), + ) + ) + else: + replica_parent_indices = torch.arange(batch_size, device=seq_token_ids.device) + replica_ms_pool = sequence_hidden.new_zeros((batch_size, sequence_hidden.shape[-1])) + replica_ms_present = torch.zeros(batch_size, dtype=torch.bool, device=seq_token_ids.device) + require(torch.unique(replica_parent_indices).numel() == batch_size, "fusion omitted a sequence parent") + shared_replica_hidden = _state_acquisition_md_fusion( + composite, + base_parent_hidden=sequence_hidden, + static_state_hidden=cross_state_hidden, + static_state_pool=projected_state_pool, + static_state_parent_indices=active_parents, + replica_parent_indices=replica_parent_indices, + replica_ms_pool=replica_ms_pool, + replica_ms_present=replica_ms_present, + md_parent_pool=md_parent_pool, + md_parent_present=md_parent_available, + fusion=self.fusion, + ) + sequence_logits = self.sequence_head(shared_replica_hidden) + shared_parent_hidden, observed_sequence = composite._group_mean_tensor( + shared_replica_hidden, + replica_parent_indices, + group_count=batch_size, + ) + require(observed_sequence.all().item(), "shared parent representation is incomplete") + sequence_loss = sequence_loss_indices = None + if seq_labels is not None: + sequence_loss, sequence_loss_indices = composite._r4._token_parent_losses( + sequence_logits, + seq_labels, + replica_parent_indices, + batch_size=batch_size, + ) + require( + torch.equal(sequence_loss_indices, torch.arange(batch_size, device=seq_token_ids.device)), + "sequence parent loss axis changed", + ) + parent_losses = MappingProxyType( + { + "sequence": sequence_loss, + "topology": topology_loss, + "ms": ms_loss, + "static": static_loss, + "md": md_loss, + } + ) + loss_parent_indices = MappingProxyType( + { + "sequence": sequence_loss_indices, + "topology": topology_loss_indices, + "ms": ms_loss_indices, + "static": static_loss_indices, + "md": md_loss_indices, + } + ) + return MDEnabledNativeOutput( + cell_id=self.md_cell_id, + sequence_logits=sequence_logits, + sequence_replica_parent_indices=replica_parent_indices, + shared_parent_hidden=shared_parent_hidden, + topology_token_pair_predictions=topology_predictions, + ms_logits=ms_logits, + static_local_logits=static_logits, + md_parent_pool=md_parent_pool, + parent_losses=parent_losses, + loss_parent_indices=loss_parent_indices, + ) + + MDEnabledNativeComposite.__name__ = "MDEnabledNativeCompositeR3" + MDEnabledNativeComposite.__qualname__ = "MDEnabledNativeCompositeR3" + return MDEnabledNativeComposite + + +def parameter_summary(model: nn.Module) -> dict[str, int]: + md_parameters = sum(parameter.numel() for parameter in model.md_encoder.parameters()) + fusion_parameters = sum(parameter.numel() for parameter in model.fusion.parameters()) + return { + "total_parameters": sum(parameter.numel() for parameter in model.parameters()), + "trainable_parameters": sum(parameter.numel() for parameter in model.parameters() if parameter.requires_grad), + "md_branch_parameters": md_parameters, + "four_slot_fusion_parameters": fusion_parameters, + } diff --git a/releases/2026-10-02/figures/compact_modalities/inputs/review_training_modality_coverage.csv b/releases/2026-10-02/figures/compact_modalities/inputs/review_training_modality_coverage.csv new file mode 100644 index 0000000000000000000000000000000000000000..4e0cc1f6ca75fb66df8daf465dedd485de487416 --- /dev/null +++ b/releases/2026-10-02/figures/compact_modalities/inputs/review_training_modality_coverage.csv @@ -0,0 +1,11 @@ +role,modality,parents,sequence_parent_denominator,fraction,source_file,source_sha256,evidence,retained_static_states +train,sequence,221827,221827,1.0,review_a5_native_eight_joined_train_manifest_r1.tsv.gz,13b7ebc78b22baa1a38d2ae40da202dcc1e20e56f44220b4d4d5003ca5f3b8f2,recounted from frozen joined manifest, +train,topology,71914,221827,0.32418957115229435,review_a5_native_eight_joined_train_manifest_r1.tsv.gz,13b7ebc78b22baa1a38d2ae40da202dcc1e20e56f44220b4d4d5003ca5f3b8f2,recounted from frozen joined manifest, +train,MS,2455,221827,0.011067182984938714,review_a5_native_eight_joined_train_manifest_r1.tsv.gz,13b7ebc78b22baa1a38d2ae40da202dcc1e20e56f44220b4d4d5003ca5f3b8f2,recounted from frozen joined manifest, +train,static,22980,221827,0.10359424236003732,review_a5_native_eight_joined_train_manifest_r1.tsv.gz,13b7ebc78b22baa1a38d2ae40da202dcc1e20e56f44220b4d4d5003ca5f3b8f2,recounted from frozen joined manifest,34408 +development,sequence,55440,55440,1.0,review_a5_native_eight_joined_development_manifest_r1.tsv.gz,4eea50c1bd4eee0ea10062c287f31c619cef5835e2e660facd098698859f7e70,recounted from frozen joined manifest, +development,topology,17650,55440,0.31836219336219335,review_a5_native_eight_joined_development_manifest_r1.tsv.gz,4eea50c1bd4eee0ea10062c287f31c619cef5835e2e660facd098698859f7e70,recounted from frozen joined manifest, +development,MS,580,55440,0.010461760461760462,review_a5_native_eight_joined_development_manifest_r1.tsv.gz,4eea50c1bd4eee0ea10062c287f31c619cef5835e2e660facd098698859f7e70,recounted from frozen joined manifest, +development,static,5390,55440,0.09722222222222222,review_a5_native_eight_joined_development_manifest_r1.tsv.gz,4eea50c1bd4eee0ea10062c287f31c619cef5835e2e660facd098698859f7e70,recounted from frozen joined manifest,7964 +train,MD,22872,221827,0.1031073764690502,review_md_20x6_native_intersection_path_neutral_r2.json,24e73e33dfe9b5f1a81ff2261b290aa33f494da7997684fc4744c162d1136be6,native intersection count; corroborated development count in PRETRAINING_STATISTICS_20260905.md, +development,MD,5066,55440,0.09137806637806638,review_md_20x6_native_intersection_path_neutral_r2.json,24e73e33dfe9b5f1a81ff2261b290aa33f494da7997684fc4744c162d1136be6,native intersection count; corroborated development count in PRETRAINING_STATISTICS_20260905.md, diff --git a/releases/2026-10-02/figures/contrastive_figure12/README.md b/releases/2026-10-02/figures/contrastive_figure12/README.md new file mode 100644 index 0000000000000000000000000000000000000000..fdb7f535e5b641f3f3d8032af2d7b32263f6afb9 --- /dev/null +++ b/releases/2026-10-02/figures/contrastive_figure12/README.md @@ -0,0 +1,15 @@ +# Supplementary Figure 12: contrastive refinement + +Requires Python 3.9 or later, matplotlib, NumPy and Pillow, with Arial installed. Run from the submission-package root: + +```sh +python 06_code/figures/contrastive_figure12/build_figure12.py --outdir rebuilt_figure12 +``` + +Inputs default to the builder's adjacent `inputs/` directory. This contains exact copies of `review_contrastive_paired_summary.csv`, `review_contrastive_fit_values.csv` and `review_contrastive_taxonomy_summary.csv`, together with `nature-bpg-palette.json`. Use `--inputs` to select another directory containing these four files. + +The output includes editable SVG, vector PDF, PNG and TIFF at 600 dpi (6.5 × 4.4 inches), `caption.md`, source provenance and verification records. In the submission figures directory, the same caption is named `Supplementary_Figure_12_caption.txt`. + +The figure retains all eleven endpoints for both weight mixtures: 22 mean differences and their full pointwise 95% paired t intervals, plus 66 individual paired differences. The taxonomy summary is retained as input provenance; no additional taxonomy aggregate is plotted. The builder checks the saved statistics against the supplied values and does not perform model fitting or select additional results. + +The compact panels retain the same source values, method colours and interval scales; procedural and statistical qualifications are in the caption. Reviewed exports used Matplotlib 3.10.7 with Arial. diff --git a/releases/2026-10-02/figures/contrastive_figure12/build_figure12.py b/releases/2026-10-02/figures/contrastive_figure12/build_figure12.py new file mode 100644 index 0000000000000000000000000000000000000000..52a413cf16b8b6afb925d0f561831e6aed4c5388 --- /dev/null +++ b/releases/2026-10-02/figures/contrastive_figure12/build_figure12.py @@ -0,0 +1,248 @@ +#!/usr/bin/env python3 +"""Rebuild Supplementary Figure 12 from bundled source tables. + +Requires Python >=3.9, matplotlib, NumPy (matplotlib dependency), and Pillow. +Run: python build_figure12.py --outdir /absolute/output/path +This script only checks and plots existing results; it performs no fitting. +""" +from __future__ import annotations + +import argparse +import csv +import hashlib +import json +import math +from pathlib import Path +import platform +import statistics +import sys + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +from matplotlib import font_manager +from matplotlib.lines import Line2D +from matplotlib.ticker import FuncFormatter + + +HERE = Path(__file__).resolve().parent +STEM = "Supplementary_Figure_12" +SEEDS = (42, 43, 44) +MIXTURES = ("CONMIX50", "CONMIX80") +MCC_ENDPOINTS = ("domain", "kingdom", "phylum", "class", "order", "family", "genus", "species", "linkage") +ENDPOINTS = MCC_ENDPOINTS + ("immunogenicity", "interaction") +SOURCE_NAMES = ("review_contrastive_paired_summary.csv", "review_contrastive_fit_values.csv", "review_contrastive_taxonomy_summary.csv", "nature-bpg-palette.json") +CAPTION = 'Supplementary Figure 12 | Contrastive refinement. Validation differences from the unrefined parent for mixtures retaining 50% or 80% pretrained weights. Positive differences favour the mixture. a, Taxonomy and linkage (MCC). b, Immunogenicity (average precision). c, Interaction (Spearman correlation). Small markers show three paired pretraining seeds with matched downstream seeds; large markers and bars show means and pointwise 95% paired t intervals. None of 22 two-sided paired tests passed Holm correction (α = 0.05). Immunogenicity used validation-MCC-selected epochs (146 examples, 12 positives). Fits used different GPU types.\n' + + +def digest(path): + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + + +def rows(path): + with Path(path).open(newline="") as handle: + return list(csv.DictReader(handle)) + + +def close(a, b, label, tol=1e-12): + if not math.isclose(float(a), float(b), abs_tol=tol, rel_tol=tol): + raise AssertionError(f"{label}: {a} != {b}") + + +def verify(summary, fits): + assert len(summary) == 22 + assert len(fits) == 99 + summary_keys = {(r["mixture"], r["endpoint"]) for r in summary} + assert summary_keys == {(m, e) for m in MIXTURES for e in ENDPOINTS} + fit_keys = {(r["arm"], r["endpoint"], int(r["upstream_seed"])) for r in fits} + assert len(fit_keys) == len(fits) + assert fit_keys == {(m, e, s) for m in ("REF",) + MIXTURES for e in ENDPOINTS for s in SEEDS} + index = {(r["arm"], r["endpoint"], int(r["upstream_seed"])): r for r in fits} + assert {r["split"] for r in fits} == {"validation"} + # Closed-form t(.975, df=2), used to check the supplied pointwise intervals. + tcrit = math.sqrt(2 * 0.95**2 / (1 - 0.95**2)) + audits, seed_records, pvalues = [], [], [] + for row in summary: + mixture, endpoint = row["mixture"], row["endpoint"] + assert int(row["n_pairs"]) == 3 + close(row["pretrained_weight_fraction"], .5 if mixture == "CONMIX50" else .8, "weight fraction") + ds, parents, values = [], [], [] + for seed in SEEDS: + reference = index[("REF", endpoint, seed)] + fit = index[(mixture, endpoint, seed)] + assert fit["downstream_seed"] == reference["downstream_seed"] + assert fit["metric"] == reference["metric"] == row["metric"] + delta = float(fit["value"]) - float(reference["value"]) + close(delta, row[f"delta_seed{seed}"], f"{mixture}/{endpoint}/seed{seed}") + ds.append(delta) + parents.append(float(reference["value"])) + values.append(float(fit["value"])) + seed_records.append({"mixture": mixture, "endpoint": endpoint, "upstream_seed": seed, + "downstream_seed": fit["downstream_seed"], "delta": delta}) + mean, sd = statistics.mean(ds), statistics.stdev(ds) + halfwidth = tcrit * sd / math.sqrt(3) + lo, hi = mean - halfwidth, mean + halfwidth + for name, value in (("delta_mean", mean), ("delta_sd", sd), ("ci95_low", lo), ("ci95_high", hi), + ("parent_mean", statistics.mean(parents)), ("parent_sd", statistics.stdev(parents)), + ("mixture_mean", statistics.mean(values)), ("mixture_sd", statistics.stdev(values))): + close(value, row[name], f"{mixture}/{endpoint}/{name}") + statistic = mean / (sd / math.sqrt(3)) + pvalue = 1 - abs(statistic) / math.sqrt(statistic**2 + 2) + close(pvalue, row["p_raw"], f"{mixture}/{endpoint}/p_raw") + pvalues.append(pvalue) + audits.append({"mixture": mixture, "endpoint": endpoint, "metric": row["metric"], "n_pairs": 3, + "delta_mean": mean, "ci95_low": lo, "ci95_high": hi, "p_raw": pvalue, + "p_holm22": float(row["p_holm22"])}) + running = 0 + for rank, i in enumerate(sorted(range(22), key=pvalues.__getitem__)): + running = min(1., max(running, (22-rank) * pvalues[i])) + close(running, summary[i]["p_holm22"], f"Holm adjusted test {i}") + assert len(seed_records) == 66 + assert all(float(r["p_holm22"]) >= .05 for r in summary) + return {"status": "PASS", "summary_rows_verified": 22, "fit_values_verified": 99, + "seed_deltas_verified": 66, "means_verified": 22, "pointwise_intervals_verified": 22, + "holm22_pvalues_verified": 22, "holm22_significant_at_0_05": 0, + "min_holm22_pvalue": min(float(r["p_holm22"]) for r in summary), + "t_critical_df2": tcrit, "checks": audits, "seed_deltas": seed_records} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--inputs", type=Path, default=HERE / "inputs") + parser.add_argument("--outdir", type=Path, default=HERE) + args = parser.parse_args() + args.outdir.mkdir(parents=True, exist_ok=True) + source = {name: args.inputs / name for name in SOURCE_NAMES} + summary = rows(source["review_contrastive_paired_summary.csv"]) + audit = verify(summary, rows(source["review_contrastive_fit_values.csv"])) + palette = json.loads(source["nature-bpg-palette.json"].read_text()) + style = { + "CONMIX50": {"color": palette["opaque_hex"][0], "fill": palette["alpha_0_6_hex8"][0], "marker": "o", "label": "50% pretrained weights"}, + "CONMIX80": {"color": palette["opaque_hex"][2], "fill": palette["alpha_0_6_hex8"][2], "marker": "s", "label": "80% pretrained weights"}, + } + # Arial is embedded in PDF and retained as editable text in SVG. + font_path = font_manager.findfont("Arial", fallback_to_default=False) + plt.rcParams.update({"font.family": "Arial", "font.size": 10.5, "axes.labelsize": 10.5, + "axes.titlesize": 12, "xtick.labelsize": 9.5, "ytick.labelsize": 10.5, + "svg.fonttype": "none", "pdf.fonttype": 42, "ps.fonttype": 42, + "text.color": "#25282B", "axes.labelcolor": "#25282B", + "xtick.color": "#50565B", "ytick.color": "#25282B", + "axes.linewidth": .55, "savefig.facecolor": "white", "figure.facecolor": "white"}) + fig = plt.figure(figsize=(6.5, 4.4)) + fig.suptitle("Contrastive refinement", x=.055, y=.975, ha="left", va="top", fontsize=12, fontweight="bold") + legend = [Line2D([0], [0], color=style[m]["color"], marker=style[m]["marker"], linestyle="none", + markersize=4.5, label=style[m]["label"]) for m in MIXTURES] + fig.legend(handles=legend, loc="upper left", bbox_to_anchor=(.053, .928), ncol=2, + frameon=False, fontsize=9.5, handletextpad=.45, columnspacing=2, borderaxespad=0) + ax_a = fig.add_axes([.155, .15, .455, .65]) + ax_b = fig.add_axes([.715, .555, .255, .245]) + ax_c = fig.add_axes([.715, .15, .255, .245]) + lookup = {(r["mixture"], r["endpoint"]): r for r in summary} + marks = [] + + def fmt(value, _position): + if abs(value) < 1e-12: + return "0" + return f"{value:g}".replace("-", "−") + + def setup(ax, title, xlabel, limits, ticks): + ax.set_title(title, loc="left", pad=9, fontsize=12, fontweight="bold") + ax.set_xlabel(xlabel, labelpad=5) + ax.set_xlim(*limits) + ax.set_xticks(ticks) + ax.xaxis.set_major_formatter(FuncFormatter(fmt)) + ax.axvline(0, color="#777777", linewidth=.7, linestyle=(0, (3, 2)), zorder=0) + for spine in ("top", "right", "left"): + ax.spines[spine].set_visible(False) + ax.spines["bottom"].set_color("#A5A5A5") + ax.tick_params(axis="y", length=0, pad=5) + ax.tick_params(axis="x", length=3, width=.55, color="#999999") + + def estimate(ax, endpoint, mixture, y): + row, s = lookup[(mixture, endpoint)], style[mixture] + mean, lo, hi = (float(row[k]) for k in ("delta_mean", "ci95_low", "ci95_high")) + lower, upper = ax.get_xlim() + assert lower < lo <= mean <= hi < upper, f"Clipped interval: {mixture}/{endpoint}" + # Seed markers occupy distinct nearby y positions; the x values are unmodified. + for seed, offset in zip(SEEDS, (-.075, 0, .075)): + ax.scatter(float(row[f"delta_seed{seed}"]), y + offset, s=11, marker=s["marker"], + facecolor=s["fill"], edgecolor="none", zorder=4) + ax.errorbar(mean, y, xerr=[[mean-lo], [hi-mean]], fmt=s["marker"], markersize=4.6, + color=s["color"], markerfacecolor="white", markeredgewidth=1.15, + elinewidth=1.05, capsize=2.3, capthick=.8, zorder=3) + marks.append({"mixture": mixture, "endpoint": endpoint, "y": y, + "delta_mean": mean, "ci95_low": lo, "ci95_high": hi, + "seed_values": [float(row[f"delta_seed{s}"]) for s in SEEDS]}) + + setup(ax_a, "a Taxonomy and linkage", "Change in MCC", (-.08, .10), (-.08, -.04, 0, .04, .08)) + ax_a.set_ylim(8.65, -.65) + ax_a.set_yticks(range(9), [endpoint.capitalize() for endpoint in MCC_ENDPOINTS]) + for i, endpoint in enumerate(MCC_ENDPOINTS): + if i % 2 == 0: + ax_a.axhspan(i-.5, i+.5, color="#F5F5F5", zorder=-1) + for mixture, shift in zip(MIXTURES, (-.18, .18)): + estimate(ax_a, endpoint, mixture, i+shift) + + setup(ax_b, "b Immunogenicity", "Change in average precision", (-.5, .32), (-.4, -.2, 0, .2)) + setup(ax_c, "c Interaction", "Change in Spearman ρ", (-.006, .006), (-.005, 0, .005)) + for ax, endpoint in ((ax_b, "immunogenicity"), (ax_c, "interaction")): + ax.set_ylim(1.55, -.55) + ax.set_yticks((0, 1), ("50%", "80%")) + for i, mixture in enumerate(MIXTURES): + estimate(ax, endpoint, mixture, i) + + assert len(marks) == 22 and sum(len(m["seed_values"]) for m in marks) == 66 + fig.canvas.draw() + renderer = fig.canvas.get_renderer() + text_bounds = [] + for artist in fig.findobj(matplotlib.text.Text): + if artist.get_visible() and artist.get_text().strip(): + box = artist.get_window_extent(renderer) + text_bounds.append({"text": artist.get_text(), "rotation": artist.get_rotation(), "bounds_px": list(box.bounds), "inside_canvas": bool(box.x0 >= -1 and box.y0 >= -1 and box.x1 <= fig.bbox.width+1 and box.y1 <= fig.bbox.height+1)}) + (args.outdir / "text_bounds.json").write_text(json.dumps({"canvas_px": [fig.bbox.width, fig.bbox.height], "text": text_bounds}, indent=2)+"\n") + filenames = {} + for extension in ("svg", "pdf", "png", "tiff"): + path = args.outdir / f"{STEM}.{extension}" + savekwargs = {"dpi": 600} + if extension == "tiff": + savekwargs["pil_kwargs"] = {"compression": "tiff_lzw"} + fig.savefig(path, **savekwargs) + filenames[extension] = path.name + plt.close(fig) + (args.outdir / "caption.md").write_text(CAPTION) + (args.outdir / "Supplementary_Figure_12_caption.txt").write_text(CAPTION) + audit["figure_estimates"] = marks + audit["all_intervals_visible"] = True + audit["artwork_internal_arm_names"] = False + (args.outdir / "verification.json").write_text(json.dumps(audit, indent=2) + "\n") + provenance = { + "figure": "Supplementary Figure 12", "title": "Contrastive refinement", + "replaces": "Supplementary Table 18 (both 50% and 80% pretrained-weight tables)", + "source_directory_in_submission": "04_source_data", "sources": [ + {"file": f"inputs/{name}", "sha256": digest(path), "plotted": name in SOURCE_NAMES[:2]} + for name, path in source.items()], + "taxonomy_summary_use": "Included unchanged for provenance; no aggregate taxonomy mean plotted.", + "builder": {"file": Path(__file__).name, "sha256": digest(__file__)}, + "runtime": {"python": sys.executable, "python_version": platform.python_version(), + "matplotlib": matplotlib.__version__, "font": "Arial", "font_file": font_path}, + "visual_encoding": {"50_percent_pretrained_weights": style["CONMIX50"], + "80_percent_pretrained_weights": style["CONMIX80"], + "pointwise_ci": "Student t interval over three paired differences; df=2", + "panel_scales": {"MCC": [-.08, .10], "average_precision": [-.5, .32], "spearman": [-.006, .006]}, + "seed_marker_y_offsets": [-.075, 0, .075]}, + "export": {"width_inches": 6.5, "height_inches": 4.4, "raster_dpi": 600, "svg_text_editable": True}, + "verification": {k: v for k, v in audit.items() if k not in ("checks", "seed_deltas", "figure_estimates")}, + "files": [{"file": name, "sha256": digest(args.outdir / name)} for name in [*filenames.values(), "caption.md"]] + } + (args.outdir / f"{STEM}_source_provenance.json").write_text(json.dumps(provenance, indent=2) + "\n") + filemap = {"figure": STEM, "artwork": filenames, "caption": "caption.md", "builder": Path(__file__).name, + "provenance": f"{STEM}_source_provenance.json", "verification": "verification.json", + "caption_sha256": digest(args.outdir / "caption.md"), + "inputs": [f"inputs/{name}" for name in SOURCE_NAMES]} + (args.outdir / "filemap.json").write_text(json.dumps(filemap, indent=2) + "\n") + print(json.dumps({"status": "PASS", "outdir": str(args.outdir.resolve()), "means_and_intervals": 22, + "seed_deltas": 66, "Holm22_significant": 0, "files": filenames}, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/figures/contrastive_figure12/inputs/nature-bpg-palette.json b/releases/2026-10-02/figures/contrastive_figure12/inputs/nature-bpg-palette.json new file mode 100644 index 0000000000000000000000000000000000000000..45ea20e5b3865ea0fefd85cc8c2befd639ee1000 --- /dev/null +++ b/releases/2026-10-02/figures/contrastive_figure12/inputs/nature-bpg-palette.json @@ -0,0 +1,30 @@ +{ + "name": "Nature BPG", + "upstream_palette": "ggsci NPG nrc", + "alpha": 0.6, + "alpha_hex_suffix": "99", + "alpha_0_6_hex8": [ + "#E64B3599", + "#4DBBD599", + "#00A08799", + "#3C548899", + "#F39B7F99", + "#8491B499", + "#91D1C299", + "#DC000099", + "#7E614899", + "#B09C8599" + ], + "opaque_hex": [ + "#E64B35", + "#4DBBD5", + "#00A087", + "#3C5488", + "#F39B7F", + "#8491B4", + "#91D1C2", + "#DC0000", + "#7E6148", + "#B09C85" + ] +} diff --git a/releases/2026-10-02/figures/contrastive_figure12/inputs/review_contrastive_fit_values.csv b/releases/2026-10-02/figures/contrastive_figure12/inputs/review_contrastive_fit_values.csv new file mode 100644 index 0000000000000000000000000000000000000000..555885b2b224081fefa0f6a310f3516e062aa67c --- /dev/null +++ b/releases/2026-10-02/figures/contrastive_figure12/inputs/review_contrastive_fit_values.csv @@ -0,0 +1,100 @@ +arm,upstream_seed,downstream_seed,endpoint,metric,value,source_path,sha,result_json_path,result_json_sha256,selected_downstream_epoch,upstream_selected_epoch,device_name,split +REF,42,241271852,domain,pooled_multilabel_MCC,0.951322295047207,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/domain/s241271852/review_result.json,dc32d89a6584d9b1724be47c9adc64bde982b4bcfcd2f6f8384048a17b287c27,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/domain/s241271852/review_result.json,dc32d89a6584d9b1724be47c9adc64bde982b4bcfcd2f6f8384048a17b287c27,17,58,NVIDIA A100 80GB PCIe,validation +REF,42,241271852,kingdom,pooled_multilabel_MCC,0.9079381522298399,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/kingdom/s241271852/review_result.json,dd01d9ce643afcd68b8c4af1a1bd63eba2d0f88f6414fb0dfd65d60033d95f48,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/kingdom/s241271852/review_result.json,dd01d9ce643afcd68b8c4af1a1bd63eba2d0f88f6414fb0dfd65d60033d95f48,18,58,NVIDIA A100-PCIE-40GB,validation +REF,42,241271852,phylum,pooled_multilabel_MCC,0.8845709954423014,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/phylum/s241271852/review_result.json,1b657dff309830bba14b6fd6511e0caa800ff96e0622b2049cfa32fe48237e6f,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/phylum/s241271852/review_result.json,1b657dff309830bba14b6fd6511e0caa800ff96e0622b2049cfa32fe48237e6f,44,58,NVIDIA A100-PCIE-40GB,validation +REF,42,241271852,class,pooled_multilabel_MCC,0.7791988773688638,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/class/s241271852/review_result.json,c7013f92e7ba58e8a5fab8779cd4c0471523820336be337f741db685dd6e0897,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/class/s241271852/review_result.json,c7013f92e7ba58e8a5fab8779cd4c0471523820336be337f741db685dd6e0897,38,58,NVIDIA A100 80GB PCIe,validation +REF,42,241271852,order,pooled_multilabel_MCC,0.6216743493851287,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/order/s241271852/review_result.json,ef9803a1a74c33ef492c5966bb141fd3f583de18334571d16f5ce23c24f3a3af,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/order/s241271852/review_result.json,ef9803a1a74c33ef492c5966bb141fd3f583de18334571d16f5ce23c24f3a3af,50,58,NVIDIA A100 80GB PCIe,validation +REF,42,241271852,family,pooled_multilabel_MCC,0.5779676343008563,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/family/s241271852/review_result.json,6b684fa5ab3f1d6217dafe0132260d418aef13e04190b3aec51d873628d35691,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/family/s241271852/review_result.json,6b684fa5ab3f1d6217dafe0132260d418aef13e04190b3aec51d873628d35691,50,58,NVIDIA H200 NVL,validation +REF,42,241271852,genus,pooled_multilabel_MCC,0.4971675435338068,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/genus/s241271852/review_result.json,9eeff663738bd2b40cc32e306d8673804a4cd0f2dbc887ad81658b36bb77c9bd,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/genus/s241271852/review_result.json,9eeff663738bd2b40cc32e306d8673804a4cd0f2dbc887ad81658b36bb77c9bd,48,58,NVIDIA A100-PCIE-40GB,validation +REF,42,241271852,species,pooled_multilabel_MCC,0.44125832403020976,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/species/s241271852/review_result.json,904230a837fa16d780483fef6843f695dc4f2e0e2067495f6188c1858c551fd1,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/species/s241271852/review_result.json,904230a837fa16d780483fef6843f695dc4f2e0e2067495f6188c1858c551fd1,49,58,NVIDIA H200 NVL,validation +REF,42,241271852,immunogenicity,average_precision,0.8028175800234624,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/immunogenicity/s241271852/review_validation_prediction_ledger.tsv.gz,fa15b66d09b0ab6c855e249cf065a0959ac183eb5d2eb986a904ebc0b29627b5,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/immunogenicity/s241271852/review_result.json,f9311ec745684a289b2e449bbbc56f93b670e795b94f412ed94c965727e547e2,3,58,NVIDIA A100 80GB PCIe,validation +REF,42,241271852,linkage,multiclass_MCC,0.9436247409901152,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/linkage/s241271852/review_result.json,a1a5ebcd13c1459cbe815e3e8f2c82eefcf132178b563d1b7b3f7859c81701d0,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/linkage/s241271852/review_result.json,a1a5ebcd13c1459cbe815e3e8f2c82eefcf132178b563d1b7b3f7859c81701d0,3,58,NVIDIA A100 80GB PCIe,validation +REF,42,241271852,interaction,spearman,0.22156892237192702,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/interaction/s241271852/review_result.json,11ccca9956af26a33e2a8fe57dffa8c5134cb34834773225b75f51990f55fb6d,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed42/A1111/interaction/s241271852/review_result.json,11ccca9956af26a33e2a8fe57dffa8c5134cb34834773225b75f51990f55fb6d,21,58,NVIDIA A100 80GB PCIe,validation +REF,43,582005623,domain,pooled_multilabel_MCC,0.9583080547078546,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/domain/s582005623/review_result.json,1d1734036b5c9e6ef771b9487d2f87a010fbcb4bed948d5e2bfa66b7aeb5832b,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/domain/s582005623/review_result.json,1d1734036b5c9e6ef771b9487d2f87a010fbcb4bed948d5e2bfa66b7aeb5832b,11,75,NVIDIA A100-PCIE-40GB,validation +REF,43,582005623,kingdom,pooled_multilabel_MCC,0.9084245162181599,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/kingdom/s582005623/review_result.json,7056744be96dde4c863262ee22797b6efeb6047dcfafa30d14278a416c5c39ff,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/kingdom/s582005623/review_result.json,7056744be96dde4c863262ee22797b6efeb6047dcfafa30d14278a416c5c39ff,9,75,NVIDIA A100 80GB PCIe,validation +REF,43,582005623,phylum,pooled_multilabel_MCC,0.8745907761110502,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/phylum/s582005623/review_result.json,21ea925a8d1b0cd2dbe4c7d16fb28a810313dc2d0ed1d8b90ecb41bca38f4243,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/phylum/s582005623/review_result.json,21ea925a8d1b0cd2dbe4c7d16fb28a810313dc2d0ed1d8b90ecb41bca38f4243,36,75,NVIDIA A100-PCIE-40GB,validation +REF,43,582005623,class,pooled_multilabel_MCC,0.7982583519585589,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/class/s582005623/review_result.json,72aff78e7664c52004b21264aa740803bb5bea3f0b0288de322e0aac28eb3877,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/class/s582005623/review_result.json,72aff78e7664c52004b21264aa740803bb5bea3f0b0288de322e0aac28eb3877,44,75,NVIDIA A100-PCIE-40GB,validation +REF,43,582005623,order,pooled_multilabel_MCC,0.6174291590743922,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/order/s582005623/review_result.json,37329135c32f6744c71351480ac7fea8192518880c25024ccb11ed50405219f6,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/order/s582005623/review_result.json,37329135c32f6744c71351480ac7fea8192518880c25024ccb11ed50405219f6,45,75,NVIDIA A100 80GB PCIe,validation +REF,43,582005623,family,pooled_multilabel_MCC,0.595705508810229,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/family/s582005623/review_result.json,d7ae45ae65546c3741fb780f378b6fd0d32e76d7994db6777cfe854fa2981b2a,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/family/s582005623/review_result.json,d7ae45ae65546c3741fb780f378b6fd0d32e76d7994db6777cfe854fa2981b2a,44,75,NVIDIA A100 80GB PCIe,validation +REF,43,582005623,genus,pooled_multilabel_MCC,0.5106322816576493,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/genus/s582005623/review_result.json,7a3118feb376d4a3b97c55969f130768a43accd512510b20625bee64872ca17d,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/genus/s582005623/review_result.json,7a3118feb376d4a3b97c55969f130768a43accd512510b20625bee64872ca17d,44,75,NVIDIA A100 80GB PCIe,validation +REF,43,582005623,species,pooled_multilabel_MCC,0.4594283073562854,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/species/s582005623/review_result.json,0392590ff57ca2f690b70582fefc1c48b160e0ba05a51ac37bf9ed14309eff02,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/species/s582005623/review_result.json,0392590ff57ca2f690b70582fefc1c48b160e0ba05a51ac37bf9ed14309eff02,50,75,NVIDIA A100-PCIE-40GB,validation +REF,43,582005623,immunogenicity,average_precision,0.615755946237121,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/immunogenicity/s582005623/review_validation_prediction_ledger.tsv.gz,510728e8a2b120b44e3bf0ba078f83beae8681cabffcdca8190666bc447623f0,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/immunogenicity/s582005623/review_result.json,8a0a0bb423dcdf80ac7b07f7c0bc6f4262c35a6c08079342f6321223ce0b5564,8,75,NVIDIA A100 80GB PCIe,validation +REF,43,582005623,linkage,multiclass_MCC,0.9436247409901152,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/linkage/s582005623/review_result.json,e38dfa8999976a83f6e1da05023744f5db5095298904fbe652d9bd60f10fcb6e,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/linkage/s582005623/review_result.json,e38dfa8999976a83f6e1da05023744f5db5095298904fbe652d9bd60f10fcb6e,20,75,NVIDIA A100 80GB PCIe,validation +REF,43,582005623,interaction,spearman,0.22927723900132235,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/interaction/s582005623/review_result.json,88ce8a90d9c57da4010fe542a6280ea7a6cbe9690dcf67ee72c92fd3d3b91fcb,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed43/A1111/interaction/s582005623/review_result.json,88ce8a90d9c57da4010fe542a6280ea7a6cbe9690dcf67ee72c92fd3d3b91fcb,24,75,NVIDIA H200 NVL,validation +REF,44,1258669096,domain,pooled_multilabel_MCC,0.9600158220342486,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/domain/s1258669096/review_result.json,881aee1b1ae08f3390acdd03daaeb1b63049a50f78845a8cacc63800ad70554a,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/domain/s1258669096/review_result.json,881aee1b1ae08f3390acdd03daaeb1b63049a50f78845a8cacc63800ad70554a,19,90,NVIDIA A100 80GB PCIe,validation +REF,44,1258669096,kingdom,pooled_multilabel_MCC,0.9102709438900568,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/kingdom/s1258669096/review_result.json,b65410157ee2531763cfed09a68bcffcdfb9175036ebe13dce03806352a48fe8,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/kingdom/s1258669096/review_result.json,b65410157ee2531763cfed09a68bcffcdfb9175036ebe13dce03806352a48fe8,45,90,NVIDIA A100 80GB PCIe,validation +REF,44,1258669096,phylum,pooled_multilabel_MCC,0.887602008613858,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/phylum/s1258669096/review_result.json,e794509c2c556e0755b7d06e807c08a31f3c533365364e2e56f08c515901e73c,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/phylum/s1258669096/review_result.json,e794509c2c556e0755b7d06e807c08a31f3c533365364e2e56f08c515901e73c,43,90,NVIDIA A100 80GB PCIe,validation +REF,44,1258669096,class,pooled_multilabel_MCC,0.7874116007162483,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/class/s1258669096/review_result.json,bb26a80b8cc9198cd70f49aecbca0a783a317f6162ba96ba2c70737c724ba47a,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/class/s1258669096/review_result.json,bb26a80b8cc9198cd70f49aecbca0a783a317f6162ba96ba2c70737c724ba47a,30,90,NVIDIA A100 80GB PCIe,validation +REF,44,1258669096,order,pooled_multilabel_MCC,0.6282092783525935,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/order/s1258669096/review_result.json,20d19586a863863d9e88ba2d37667e4baa1048d762bc99b1a52df831aca26660,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/order/s1258669096/review_result.json,20d19586a863863d9e88ba2d37667e4baa1048d762bc99b1a52df831aca26660,48,90,NVIDIA A100 80GB PCIe,validation +REF,44,1258669096,family,pooled_multilabel_MCC,0.5773207835903824,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/family/s1258669096/review_result.json,e321d9c83f54687c53fbba13a30f54718d0c4dbd2c096ef486c0bd53879bffdc,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/family/s1258669096/review_result.json,e321d9c83f54687c53fbba13a30f54718d0c4dbd2c096ef486c0bd53879bffdc,50,90,NVIDIA A100 80GB PCIe,validation +REF,44,1258669096,genus,pooled_multilabel_MCC,0.5129605748184295,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/genus/s1258669096/review_result.json,b54657919af1ed7ce72508b8aa5ccde093da6c99acf4537cdf01b5b693d64941,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/genus/s1258669096/review_result.json,b54657919af1ed7ce72508b8aa5ccde093da6c99acf4537cdf01b5b693d64941,47,90,NVIDIA A100 80GB PCIe,validation +REF,44,1258669096,species,pooled_multilabel_MCC,0.44203191314853363,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/species/s1258669096/review_result.json,7b4061a1d943f9f8c07548a42d799a23a7dd6adb8b8e6cfdb5670a8f7282f08e,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/species/s1258669096/review_result.json,7b4061a1d943f9f8c07548a42d799a23a7dd6adb8b8e6cfdb5670a8f7282f08e,38,90,NVIDIA A100 80GB PCIe,validation +REF,44,1258669096,immunogenicity,average_precision,0.5854688623480214,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/immunogenicity/s1258669096/review_validation_prediction_ledger.tsv.gz,b2602598583d84e95ebb62d504360dc289303f468db685e0b637b1f4d539749e,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/immunogenicity/s1258669096/review_result.json,f58822326416446a4ac23a246c6891411ca7de6a0c8d61292021b253af3c088b,4,90,NVIDIA A100-PCIE-40GB,validation +REF,44,1258669096,linkage,multiclass_MCC,0.9288461682630789,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/linkage/s1258669096/review_result.json,3c35c004da82f24c689eba0ac55c6807188d7f39c5f64f8accfa543eeea4350c,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/linkage/s1258669096/review_result.json,3c35c004da82f24c689eba0ac55c6807188d7f39c5f64f8accfa543eeea4350c,5,90,NVIDIA A100-PCIE-40GB,validation +REF,44,1258669096,interaction,spearman,0.21984454609223472,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/interaction/s1258669096/review_result.json,ab18eab176ef99bc0cfd7361ba1e0eebf0373d57f66432c955c23696855caa02,/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/outputs/a5_ablation_downstream_20260825_r1/production/reference_A1111_seed44/A1111/interaction/s1258669096/review_result.json,ab18eab176ef99bc0cfd7361ba1e0eebf0373d57f66432c955c23696855caa02,22,90,NVIDIA A100-SXM4-80GB,validation +CONMIX50,42,241271852,domain,pooled_multilabel_MCC,0.9538837269314536,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/domain/s241271852/review_result.json,98cfeca79dd32ca62c443e55250e923455e8c5aefbcac338701d9b9e4dd6e147,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/domain/s241271852/review_result.json,98cfeca79dd32ca62c443e55250e923455e8c5aefbcac338701d9b9e4dd6e147,17,29,NVIDIA A100-SXM4-80GB,validation +CONMIX50,42,241271852,kingdom,pooled_multilabel_MCC,0.9047364299218835,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/kingdom/s241271852/review_result.json,49b81bff6d9097db78681e6206fd83e64e8c4b42865384a994b6fdac72178597,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/kingdom/s241271852/review_result.json,49b81bff6d9097db78681e6206fd83e64e8c4b42865384a994b6fdac72178597,25,29,NVIDIA A100-SXM4-80GB,validation +CONMIX50,42,241271852,phylum,pooled_multilabel_MCC,0.8807353478810662,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/phylum/s241271852/review_result.json,193fd88ce14626a6e530a301bac19095eb968387ba23f2fb1a935fca70f23e2b,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/phylum/s241271852/review_result.json,193fd88ce14626a6e530a301bac19095eb968387ba23f2fb1a935fca70f23e2b,42,29,NVIDIA A100 80GB PCIe,validation +CONMIX50,42,241271852,class,pooled_multilabel_MCC,0.7881311339128286,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/class/s241271852/review_result.json,4b9d5a314c1a40e782fef13553dfe58b0d6ffda90b77cda0412b9dce9c9e8ef5,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/class/s241271852/review_result.json,4b9d5a314c1a40e782fef13553dfe58b0d6ffda90b77cda0412b9dce9c9e8ef5,38,29,NVIDIA A100 80GB PCIe,validation +CONMIX50,42,241271852,order,pooled_multilabel_MCC,0.6368045111554259,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/order/s241271852/review_result.json,aac2fc5b1c0802966e5f97bfe410f327ea79424ff54500cfd6223759ece22fdc,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/order/s241271852/review_result.json,aac2fc5b1c0802966e5f97bfe410f327ea79424ff54500cfd6223759ece22fdc,45,29,NVIDIA A100-SXM4-80GB,validation +CONMIX50,42,241271852,family,pooled_multilabel_MCC,0.5986147703432448,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/family/s241271852/review_result.json,abc2dd89eb28e9af1fcd4d28efed2ceb4b937ae41511abcf8f9ffccbde265fd4,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/family/s241271852/review_result.json,abc2dd89eb28e9af1fcd4d28efed2ceb4b937ae41511abcf8f9ffccbde265fd4,50,29,NVIDIA A100-SXM4-80GB,validation +CONMIX50,42,241271852,genus,pooled_multilabel_MCC,0.5207126670818668,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/genus/s241271852/review_result.json,231c13539835579d7154b936092fad11eabd3f3b9ddf3559bff8c80b967a81d5,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/genus/s241271852/review_result.json,231c13539835579d7154b936092fad11eabd3f3b9ddf3559bff8c80b967a81d5,49,29,NVIDIA A100-SXM4-80GB,validation +CONMIX50,42,241271852,species,pooled_multilabel_MCC,0.4643656038769004,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/species/s241271852/review_result.json,923b6e7a1545cc9ea8010292ad5f771daa257d03747fad9245c1eb6943e585ef,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/species/s241271852/review_result.json,923b6e7a1545cc9ea8010292ad5f771daa257d03747fad9245c1eb6943e585ef,50,29,NVIDIA A100 80GB PCIe,validation +CONMIX50,42,241271852,immunogenicity,average_precision,0.6311665953113321,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/immunogenicity/s241271852/review_validation_prediction_ledger.tsv.gz,c9fe6ac0d5c0ac05ee7b5ee641ee3e70b19ecc24f47bdd251d3a00a0ea67e618,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/immunogenicity/s241271852/review_result.json,9d2de5965377f768cf35cfc4ab5f6c841c1d9669f7385e33cb761291acfb5e47,8,29,NVIDIA A100-PCIE-40GB,validation +CONMIX50,42,241271852,linkage,multiclass_MCC,0.9288461682630789,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/linkage/s241271852/review_result.json,4fb09baac77d073aea92ae8c36b58d945ba97cb531930068b6fac0a42dc53dbc,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/linkage/s241271852/review_result.json,4fb09baac77d073aea92ae8c36b58d945ba97cb531930068b6fac0a42dc53dbc,7,29,NVIDIA A100 80GB PCIe,validation +CONMIX50,42,241271852,interaction,spearman,0.221477611196389,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/interaction/s241271852/review_result.json,5406472282971c9798bcbda4233cb43ae9e0291786d1ea49622c10c30045c35c,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed42/CONMIX50/interaction/s241271852/review_result.json,5406472282971c9798bcbda4233cb43ae9e0291786d1ea49622c10c30045c35c,24,29,NVIDIA A100 80GB PCIe,validation +CONMIX50,43,582005623,domain,pooled_multilabel_MCC,0.956685025644734,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/domain/s582005623/review_result.json,22358c47030b11c5970f8d84471db11536fe296df0ab9186beb6351ff302050a,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/domain/s582005623/review_result.json,22358c47030b11c5970f8d84471db11536fe296df0ab9186beb6351ff302050a,9,25,NVIDIA A100 80GB PCIe,validation +CONMIX50,43,582005623,kingdom,pooled_multilabel_MCC,0.9079381522298399,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/kingdom/s582005623/review_result.json,b39c28f0054a72f0004b70984ac9d7ea7061440b3ef5a9dd7e3e9577d664b8aa,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/kingdom/s582005623/review_result.json,b39c28f0054a72f0004b70984ac9d7ea7061440b3ef5a9dd7e3e9577d664b8aa,27,25,NVIDIA A100 80GB PCIe,validation +CONMIX50,43,582005623,phylum,pooled_multilabel_MCC,0.8767606747579817,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/phylum/s582005623/review_result.json,7ccec2c45d3b90d51c392bf02b20838c1bad0aa2a3a28385ad9063e3af6c7952,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/phylum/s582005623/review_result.json,7ccec2c45d3b90d51c392bf02b20838c1bad0aa2a3a28385ad9063e3af6c7952,22,25,NVIDIA A100 80GB PCIe,validation +CONMIX50,43,582005623,class,pooled_multilabel_MCC,0.8115643936040554,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/class/s582005623/review_result.json,3d4f25edf81ca4b726f3dcc35f104a9b5672a8b8b671411afb2de092be976309,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/class/s582005623/review_result.json,3d4f25edf81ca4b726f3dcc35f104a9b5672a8b8b671411afb2de092be976309,49,25,NVIDIA A100 80GB PCIe,validation +CONMIX50,43,582005623,order,pooled_multilabel_MCC,0.6249927320436074,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/order/s582005623/review_result.json,881acf3e10086961e70ebf729e649d1cab124712b1c7f57c2ce379ac349bc51f,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/order/s582005623/review_result.json,881acf3e10086961e70ebf729e649d1cab124712b1c7f57c2ce379ac349bc51f,41,25,NVIDIA A100 80GB PCIe,validation +CONMIX50,43,582005623,family,pooled_multilabel_MCC,0.5997429051008607,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/family/s582005623/review_result.json,b17d0425ebe24a5a22f59153fd6414b7b50742fb793b18a4f3aea25e46c7ab61,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/family/s582005623/review_result.json,b17d0425ebe24a5a22f59153fd6414b7b50742fb793b18a4f3aea25e46c7ab61,48,25,NVIDIA A100 80GB PCIe,validation +CONMIX50,43,582005623,genus,pooled_multilabel_MCC,0.5293521209055181,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/genus/s582005623/review_result.json,8fa2ea08d41cd337b120cc37abe245ef18dd167fbb04fb2647665a06ff7ef687,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/genus/s582005623/review_result.json,8fa2ea08d41cd337b120cc37abe245ef18dd167fbb04fb2647665a06ff7ef687,49,25,NVIDIA A100 80GB PCIe,validation +CONMIX50,43,582005623,species,pooled_multilabel_MCC,0.4741408739295404,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/species/s582005623/review_result.json,339738ca9060446e420b37fbb44cdf64a82797bde297ac9907a3fb2c900bf0a4,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/species/s582005623/review_result.json,339738ca9060446e420b37fbb44cdf64a82797bde297ac9907a3fb2c900bf0a4,46,25,NVIDIA A100 80GB PCIe,validation +CONMIX50,43,582005623,immunogenicity,average_precision,0.40731846800615795,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/immunogenicity/s582005623/review_validation_prediction_ledger.tsv.gz,aa5e8a98bda3ed3a28ebb65a171b657a3ac305f7bf4da14c1f14cfce2e837489,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/immunogenicity/s582005623/review_result.json,ca24d126fb3f90c2a1420502f3d606f7d7757fb8ea3989de0f5681b699b6342e,6,25,NVIDIA A100-SXM4-80GB,validation +CONMIX50,43,582005623,linkage,multiclass_MCC,0.9288461682630789,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/linkage/s582005623/review_result.json,7a8568ca1cd05f7a5bfc589c2db7a02ccd5633d856deaaa798c382a541c82352,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/linkage/s582005623/review_result.json,7a8568ca1cd05f7a5bfc589c2db7a02ccd5633d856deaaa798c382a541c82352,2,25,NVIDIA A100-SXM4-80GB,validation +CONMIX50,43,582005623,interaction,spearman,0.227048447920654,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/interaction/s582005623/review_result.json,810bda19bc0fff424fe0dd175dda4fc4fba1f014d69db9e543b09152751b1c74,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed43/CONMIX50/interaction/s582005623/review_result.json,810bda19bc0fff424fe0dd175dda4fc4fba1f014d69db9e543b09152751b1c74,24,25,NVIDIA A100 80GB PCIe,validation +CONMIX50,44,1258669096,domain,pooled_multilabel_MCC,0.9512882697452757,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/domain/s1258669096/review_result.json,d3c2b815daf9bd7c6698f513ea92238429b922a7a6a61691135b99d01a378e2a,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/domain/s1258669096/review_result.json,d3c2b815daf9bd7c6698f513ea92238429b922a7a6a61691135b99d01a378e2a,10,28,NVIDIA A100 80GB PCIe,validation +CONMIX50,44,1258669096,kingdom,pooled_multilabel_MCC,0.9090880426697018,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/kingdom/s1258669096/review_result.json,18f8d4fc349f728e6c66b2767423297cdfc6a1160a6725805acf5945eb33d9ed,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/kingdom/s1258669096/review_result.json,18f8d4fc349f728e6c66b2767423297cdfc6a1160a6725805acf5945eb33d9ed,28,28,NVIDIA A100 80GB PCIe,validation +CONMIX50,44,1258669096,phylum,pooled_multilabel_MCC,0.8890985459278401,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/phylum/s1258669096/review_result.json,99b8c7437de30932b193befcae0db2b231069105f5646c7f8a8351fcc516df9d,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/phylum/s1258669096/review_result.json,99b8c7437de30932b193befcae0db2b231069105f5646c7f8a8351fcc516df9d,38,28,NVIDIA A100 80GB PCIe,validation +CONMIX50,44,1258669096,class,pooled_multilabel_MCC,0.7833445380960674,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/class/s1258669096/review_result.json,a9b4b19a07f1b5ed7e561e445a109485783ce0498f1c8bd1e078d4a0f4bb499a,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/class/s1258669096/review_result.json,a9b4b19a07f1b5ed7e561e445a109485783ce0498f1c8bd1e078d4a0f4bb499a,43,28,NVIDIA A100 80GB PCIe,validation +CONMIX50,44,1258669096,order,pooled_multilabel_MCC,0.6136498696603563,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/order/s1258669096/review_result.json,ec601efd070c24b9be8285c0575521f3528611744e4ef4fb4f71449e38fecc08,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/order/s1258669096/review_result.json,ec601efd070c24b9be8285c0575521f3528611744e4ef4fb4f71449e38fecc08,48,28,NVIDIA A100 80GB PCIe,validation +CONMIX50,44,1258669096,family,pooled_multilabel_MCC,0.5940248250444351,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/family/s1258669096/review_result.json,48dd58e0ea6119e5e57ec3dcd4d46b35694e1f20c954a47f86095f8138a21d8f,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/family/s1258669096/review_result.json,48dd58e0ea6119e5e57ec3dcd4d46b35694e1f20c954a47f86095f8138a21d8f,48,28,NVIDIA A100 80GB PCIe,validation +CONMIX50,44,1258669096,genus,pooled_multilabel_MCC,0.5027898222972463,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/genus/s1258669096/review_result.json,2418ff1870cac0bc82d1dd2b30e1534660ef471c34eef5bd7e2f3a93d4555260,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/genus/s1258669096/review_result.json,2418ff1870cac0bc82d1dd2b30e1534660ef471c34eef5bd7e2f3a93d4555260,45,28,NVIDIA A100 80GB PCIe,validation +CONMIX50,44,1258669096,species,pooled_multilabel_MCC,0.4483672939123668,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/species/s1258669096/review_result.json,9826ab8e010ee882004add044af8d277fce1afdf1e57c3883edca415a49eb040,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/species/s1258669096/review_result.json,9826ab8e010ee882004add044af8d277fce1afdf1e57c3883edca415a49eb040,45,28,NVIDIA A100 80GB PCIe,validation +CONMIX50,44,1258669096,immunogenicity,average_precision,0.6295975566766642,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/immunogenicity/s1258669096/review_validation_prediction_ledger.tsv.gz,fa5bf67e691fb40e27b73924bb8a35da02c1c19271d816b3bfbabe2bc0bad709,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/immunogenicity/s1258669096/review_result.json,15ff33d4dfdcadc7e9bd98eac1928a57e98bf9ab8e55027ed0b8223496163f96,5,28,NVIDIA A100-SXM4-80GB,validation +CONMIX50,44,1258669096,linkage,multiclass_MCC,0.9301069769221324,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/linkage/s1258669096/review_result.json,278c827e46260e3b13b8ca55af42ec3242f5a2b83c63f95e10cb04bd91caeb30,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/linkage/s1258669096/review_result.json,278c827e46260e3b13b8ca55af42ec3242f5a2b83c63f95e10cb04bd91caeb30,5,28,NVIDIA A100-SXM4-80GB,validation +CONMIX50,44,1258669096,interaction,spearman,0.22164930741194688,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/interaction/s1258669096/review_result.json,89d307bbfe7497c071ebf1794d47fba6b6f624b408b8fecdcde8ac0b6dace823,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX50_wa3_seed44/CONMIX50/interaction/s1258669096/review_result.json,89d307bbfe7497c071ebf1794d47fba6b6f624b408b8fecdcde8ac0b6dace823,22,28,NVIDIA A100 80GB PCIe,validation +CONMIX80,42,241271852,domain,pooled_multilabel_MCC,0.9555986481252416,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/domain/s241271852/review_result.json,eaf0d42ec15fb049a12416853503bbcbe3da43252f0181ed7fa84a8ce7038859,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/domain/s241271852/review_result.json,eaf0d42ec15fb049a12416853503bbcbe3da43252f0181ed7fa84a8ce7038859,17,29,NVIDIA A100 80GB PCIe,validation +CONMIX80,42,241271852,kingdom,pooled_multilabel_MCC,0.9058318685588093,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/kingdom/s241271852/review_result.json,61befbd4ea1c0b1feb29f5f52fbb22d5c3dd359a170ad30f182465cac75095e8,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/kingdom/s241271852/review_result.json,61befbd4ea1c0b1feb29f5f52fbb22d5c3dd359a170ad30f182465cac75095e8,6,29,NVIDIA A100 80GB PCIe,validation +CONMIX80,42,241271852,phylum,pooled_multilabel_MCC,0.8874023734458412,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/phylum/s241271852/review_result.json,3fc0a42216ba6697bfc020eaa7d9b0c57aff460b7100da0f1113bd579d29ba1a,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/phylum/s241271852/review_result.json,3fc0a42216ba6697bfc020eaa7d9b0c57aff460b7100da0f1113bd579d29ba1a,35,29,NVIDIA A100 80GB PCIe,validation +CONMIX80,42,241271852,class,pooled_multilabel_MCC,0.7887069307381113,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/class/s241271852/review_result.json,435b5a36d3088addba860312b3ebd608f4057246a7d5dc773ff012dc83a16a7f,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/class/s241271852/review_result.json,435b5a36d3088addba860312b3ebd608f4057246a7d5dc773ff012dc83a16a7f,38,29,NVIDIA A100 80GB PCIe,validation +CONMIX80,42,241271852,order,pooled_multilabel_MCC,0.6245489630018852,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/order/s241271852/review_result.json,51fcb3c215ad854946336ddb4bc4723c6fe04028a99e58bba67988341cb3e9af,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/order/s241271852/review_result.json,51fcb3c215ad854946336ddb4bc4723c6fe04028a99e58bba67988341cb3e9af,41,29,NVIDIA A100 80GB PCIe,validation +CONMIX80,42,241271852,family,pooled_multilabel_MCC,0.5849137207705268,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/family/s241271852/review_result.json,deb4d9e6e6aab61f4c5eb42b3c452e741f280fee719387bd023a057279136f3c,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/family/s241271852/review_result.json,deb4d9e6e6aab61f4c5eb42b3c452e741f280fee719387bd023a057279136f3c,41,29,NVIDIA A100-SXM4-80GB,validation +CONMIX80,42,241271852,genus,pooled_multilabel_MCC,0.5375259856071151,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/genus/s241271852/review_result.json,24f103fbabc8fda8caba9144d10454536bc6b032c6d6ceb7d810db85b0263a12,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/genus/s241271852/review_result.json,24f103fbabc8fda8caba9144d10454536bc6b032c6d6ceb7d810db85b0263a12,49,29,NVIDIA A100 80GB PCIe,validation +CONMIX80,42,241271852,species,pooled_multilabel_MCC,0.4616387042458575,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/species/s241271852/review_result.json,35a94f6dd07753af2c368dbbfafff86c8c2c145f74d7d0021624caf2a005326f,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/species/s241271852/review_result.json,35a94f6dd07753af2c368dbbfafff86c8c2c145f74d7d0021624caf2a005326f,44,29,NVIDIA A100 80GB PCIe,validation +CONMIX80,42,241271852,immunogenicity,average_precision,0.7129412254412254,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/immunogenicity/s241271852/review_validation_prediction_ledger.tsv.gz,8fce1973a01096be5c3b2834752673e7414c7c87b5ea4b3fe216c2bf8ab2bfa8,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/immunogenicity/s241271852/review_result.json,017abd1b0cd7130651f92d08e1ec2075c988356c6bb1bebe77be345862de7d2f,12,29,NVIDIA A100-PCIE-40GB,validation +CONMIX80,42,241271852,linkage,multiclass_MCC,0.9436247409901152,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/linkage/s241271852/review_result.json,aca2f0447e40e7c78155c1ee3046b8253180e0cb59f02f39c1fb4ccc7d696655,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/linkage/s241271852/review_result.json,aca2f0447e40e7c78155c1ee3046b8253180e0cb59f02f39c1fb4ccc7d696655,3,29,NVIDIA A100 80GB PCIe,validation +CONMIX80,42,241271852,interaction,spearman,0.22315747597199187,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/interaction/s241271852/review_result.json,56f7e4aaadf7b8f30b8b3958780a8f3b099b5619606a75f7e4b40e36c131fcf1,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed42/CONMIX80/interaction/s241271852/review_result.json,56f7e4aaadf7b8f30b8b3958780a8f3b099b5619606a75f7e4b40e36c131fcf1,24,29,NVIDIA A100 80GB PCIe,validation +CONMIX80,43,582005623,domain,pooled_multilabel_MCC,0.9600158220342486,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/domain/s582005623/review_result.json,6e1a77ff0edad44660419615a4e08131aa0e5fbde49a8f979835f552cb32453f,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/domain/s582005623/review_result.json,6e1a77ff0edad44660419615a4e08131aa0e5fbde49a8f979835f552cb32453f,10,25,NVIDIA A100-SXM4-80GB,validation +CONMIX80,43,582005623,kingdom,pooled_multilabel_MCC,0.9063334571520423,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/kingdom/s582005623/review_result.json,84e59fe639f218bbbea3dea193f5e38bbbd09ce1549123e22f55533cc898d3bc,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/kingdom/s582005623/review_result.json,84e59fe639f218bbbea3dea193f5e38bbbd09ce1549123e22f55533cc898d3bc,21,25,NVIDIA A100 80GB PCIe,validation +CONMIX80,43,582005623,phylum,pooled_multilabel_MCC,0.8759261071973267,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/phylum/s582005623/review_result.json,d26627b779322847f23502199b3c76d77f4acf2996124300e4357cc35a3fa3d7,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/phylum/s582005623/review_result.json,d26627b779322847f23502199b3c76d77f4acf2996124300e4357cc35a3fa3d7,11,25,NVIDIA A100 80GB PCIe,validation +CONMIX80,43,582005623,class,pooled_multilabel_MCC,0.8049186071392491,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/class/s582005623/review_result.json,5abaa027e23f1f4f2a30dd2094bd8b3a966cf0f92f1d380f2d11b2492c853cad,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/class/s582005623/review_result.json,5abaa027e23f1f4f2a30dd2094bd8b3a966cf0f92f1d380f2d11b2492c853cad,48,25,NVIDIA A100 80GB PCIe,validation +CONMIX80,43,582005623,order,pooled_multilabel_MCC,0.623562796231876,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/order/s582005623/review_result.json,c6d7314f45cd1f49b12c7c1476b758d9c76aa7bc41325bab55a511572ca93d71,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/order/s582005623/review_result.json,c6d7314f45cd1f49b12c7c1476b758d9c76aa7bc41325bab55a511572ca93d71,38,25,NVIDIA A100 80GB PCIe,validation +CONMIX80,43,582005623,family,pooled_multilabel_MCC,0.6021094869833719,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/family/s582005623/review_result.json,47275891ab1a22551b52676f54f4af08f4fd7bd87bcd71265310dc65e67442ee,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/family/s582005623/review_result.json,47275891ab1a22551b52676f54f4af08f4fd7bd87bcd71265310dc65e67442ee,45,25,NVIDIA A100 80GB PCIe,validation +CONMIX80,43,582005623,genus,pooled_multilabel_MCC,0.5209423726113823,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/genus/s582005623/review_result.json,621436eea3cb025828e4fde55374074c74aadfc0610c71fb3e18942f35a7516f,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/genus/s582005623/review_result.json,621436eea3cb025828e4fde55374074c74aadfc0610c71fb3e18942f35a7516f,48,25,NVIDIA A100 80GB PCIe,validation +CONMIX80,43,582005623,species,pooled_multilabel_MCC,0.4665303756437034,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/species/s582005623/review_result.json,725df0c8c1145ddab944f8b663f2465fad879cdde27c85e9fb93185032a7ac64,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/species/s582005623/review_result.json,725df0c8c1145ddab944f8b663f2465fad879cdde27c85e9fb93185032a7ac64,46,25,NVIDIA A100 80GB PCIe,validation +CONMIX80,43,582005623,immunogenicity,average_precision,0.7310797535797535,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/immunogenicity/s582005623/review_validation_prediction_ledger.tsv.gz,d06fa72a0c0bef883ecac0bcfe69131b635fb081e78c4087485bff272cefa860,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/immunogenicity/s582005623/review_result.json,d15253b67c3d23f344b6575c2efab8d716de97c1f248019438c214a189f18027,5,25,NVIDIA A100 80GB PCIe,validation +CONMIX80,43,582005623,linkage,multiclass_MCC,0.9436247409901152,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/linkage/s582005623/review_result.json,bd098eb50fa5873f67af7637ca19c9d3b078ccf12ef983fe4982af14cbfa53ba,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/linkage/s582005623/review_result.json,bd098eb50fa5873f67af7637ca19c9d3b078ccf12ef983fe4982af14cbfa53ba,16,25,NVIDIA A100-PCIE-40GB,validation +CONMIX80,43,582005623,interaction,spearman,0.22800689814143765,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/interaction/s582005623/review_result.json,01da174f6c932c8bc780954554875b1604367a3b6a55a187d7bf314580cffbfa,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed43/CONMIX80/interaction/s582005623/review_result.json,01da174f6c932c8bc780954554875b1604367a3b6a55a187d7bf314580cffbfa,24,25,NVIDIA A100 80GB PCIe,validation +CONMIX80,44,1258669096,domain,pooled_multilabel_MCC,0.9581820757429044,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/domain/s1258669096/review_result.json,d445576431d6b491e116e92c718f29457f43cd407af1ee80910e89d7787ad50c,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/domain/s1258669096/review_result.json,d445576431d6b491e116e92c718f29457f43cd407af1ee80910e89d7787ad50c,20,28,NVIDIA A100 80GB PCIe,validation +CONMIX80,44,1258669096,kingdom,pooled_multilabel_MCC,0.9126825747772982,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/kingdom/s1258669096/review_result.json,6f33095dcbfa9424ed23edb4e6718dac1146c9ab5c0d82874e3848e274777aa4,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/kingdom/s1258669096/review_result.json,6f33095dcbfa9424ed23edb4e6718dac1146c9ab5c0d82874e3848e274777aa4,33,28,NVIDIA A100 80GB PCIe,validation +CONMIX80,44,1258669096,phylum,pooled_multilabel_MCC,0.8899704769434525,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/phylum/s1258669096/review_result.json,bd882060d176e42390c64d84129c7aa3bc2fb6423e34fb05c4a9ccbc03fcfc9a,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/phylum/s1258669096/review_result.json,bd882060d176e42390c64d84129c7aa3bc2fb6423e34fb05c4a9ccbc03fcfc9a,44,28,NVIDIA A100 80GB PCIe,validation +CONMIX80,44,1258669096,class,pooled_multilabel_MCC,0.792319963443177,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/class/s1258669096/review_result.json,e4cce40ea95ccf0d9f0e55e9be65b65031d31a9810a2bf2b67083097b7268c18,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/class/s1258669096/review_result.json,e4cce40ea95ccf0d9f0e55e9be65b65031d31a9810a2bf2b67083097b7268c18,41,28,NVIDIA A100 80GB PCIe,validation +CONMIX80,44,1258669096,order,pooled_multilabel_MCC,0.6198105131507129,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/order/s1258669096/review_result.json,a15c397474c5e1bbcbe3c2943e54d8d330d9d2ddec39a281ba0250e1811e6528,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/order/s1258669096/review_result.json,a15c397474c5e1bbcbe3c2943e54d8d330d9d2ddec39a281ba0250e1811e6528,41,28,NVIDIA A100 80GB PCIe,validation +CONMIX80,44,1258669096,family,pooled_multilabel_MCC,0.5904681918281159,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/family/s1258669096/review_result.json,8fe556ec1bb99ee9024723ddc6be799be9e67d25a1c3a5c303c835c7647687d0,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/family/s1258669096/review_result.json,8fe556ec1bb99ee9024723ddc6be799be9e67d25a1c3a5c303c835c7647687d0,48,28,NVIDIA A100 80GB PCIe,validation +CONMIX80,44,1258669096,genus,pooled_multilabel_MCC,0.49486537425692634,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/genus/s1258669096/review_result.json,432d8d6d694dacb32e69e2f5538aa643135c87ece7dbee57d30922c110669e7e,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/genus/s1258669096/review_result.json,432d8d6d694dacb32e69e2f5538aa643135c87ece7dbee57d30922c110669e7e,47,28,NVIDIA A100 80GB PCIe,validation +CONMIX80,44,1258669096,species,pooled_multilabel_MCC,0.4366964397631625,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/species/s1258669096/review_result.json,437f4bbc83514050a3bbc51479efd879b2076961ba6fb2aa4ada6098c7ab5019,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/species/s1258669096/review_result.json,437f4bbc83514050a3bbc51479efd879b2076961ba6fb2aa4ada6098c7ab5019,44,28,NVIDIA A100 80GB PCIe,validation +CONMIX80,44,1258669096,immunogenicity,average_precision,0.6241917804417805,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/immunogenicity/s1258669096/review_validation_prediction_ledger.tsv.gz,f28025373fde959a9266affed7e3d812e281b507ac99e354db44d9cf796453e5,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/immunogenicity/s1258669096/review_result.json,c7e9d324582e2feea5aada013f61cb5f5019ec7bcc2bed25dff0acbfbf7bc77c,2,28,NVIDIA A100 80GB PCIe,validation +CONMIX80,44,1258669096,linkage,multiclass_MCC,0.9436247409901152,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/linkage/s1258669096/review_result.json,08b5a4b2e638c1a3c91a2fcb77c21c46a36a5a043830f81ae1937fdbecfd2536,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/linkage/s1258669096/review_result.json,08b5a4b2e638c1a3c91a2fcb77c21c46a36a5a043830f81ae1937fdbecfd2536,21,28,NVIDIA A100-PCIE-40GB,validation +CONMIX80,44,1258669096,interaction,spearman,0.2185919017287676,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/interaction/s1258669096/review_result.json,3903b7b24309b5244bd6f943c21637d13b48f7a90ee59f45a79114822de85257,/work/ratul1/supantha/bertose_negatives_20260825_r1/downstream/production/contrastive_mix_CONMIX80_wa3_seed44/CONMIX80/interaction/s1258669096/review_result.json,3903b7b24309b5244bd6f943c21637d13b48f7a90ee59f45a79114822de85257,22,28,NVIDIA A100 80GB PCIe,validation diff --git a/releases/2026-10-02/figures/contrastive_figure12/inputs/review_contrastive_paired_summary.csv b/releases/2026-10-02/figures/contrastive_figure12/inputs/review_contrastive_paired_summary.csv new file mode 100644 index 0000000000000000000000000000000000000000..6c5c96ad2fe1413897b2696eb3e8e47e24f66b6b --- /dev/null +++ b/releases/2026-10-02/figures/contrastive_figure12/inputs/review_contrastive_paired_summary.csv @@ -0,0 +1,23 @@ +mixture,pretrained_weight_fraction,endpoint,metric,n_pairs,parent_mean,parent_sd,mixture_mean,mixture_sd,delta_mean,delta_sd,ci95_low,ci95_high,p_raw,p_holm22,positive_pairs,zero_pairs,negative_pairs,delta_seed42,delta_seed43,delta_seed44 +CONMIX50,0.5,domain,pooled_multilabel_MCC,3,0.9565487239297701,0.004606059754132801,0.9539523407738211,0.0026990321328409297,-0.0025963831559489745,0.0057070880979988095,-0.016773575924469285,0.011580809612571337,0.5132693896272081,1.0,1,0,2,0.0025614318842466233,-0.001623029063120618,-0.008727552288972928 +CONMIX80,0.8,domain,pooled_multilabel_MCC,3,0.9565487239297701,0.004606059754132801,0.9579321819674649,0.002219164597287805,0.0013834580376947958,0.0030679326853719478,-0.0062377092431491225,0.009004625318538715,0.5165441407861767,1.0,2,0,1,0.004276353078034645,0.001707767326393994,-0.0018337462913442515 +CONMIX50,0.5,kingdom,pooled_multilabel_MCC,3,0.9088778707793522,0.0012307018327400903,0.9072542082738084,0.0022549873343297474,-0.0016236625055437992,0.0014103175471841393,-0.005127085510047147,0.0018797604989595484,0.18431336630895534,1.0,0,0,3,-0.003201722307956345,-0.0004863639883200266,-0.001182901220355026 +CONMIX80,0.8,kingdom,pooled_multilabel_MCC,3,0.9088778707793522,0.0012307018327400903,0.9082826334960499,0.0038187053091381586,-0.0005952372833022782,0.0026040353479590394,-0.007064019693898224,0.005873545127293667,0.7304098830055016,1.0,1,0,2,-0.0021062836710306065,-0.0020910590661176176,0.0024116308872413894 +CONMIX50,0.5,phylum,pooled_multilabel_MCC,3,0.8822545933890699,0.0068078874597551926,0.882198189522296,0.00629767381669555,-5.640386677385756e-05,0.003290192402850072,-0.008229694893608159,0.008116887160060444,0.9790087882547163,1.0,2,0,1,-0.0038356475612352225,0.002169898646931512,0.001496537313982138 +CONMIX80,0.8,phylum,pooled_multilabel_MCC,3,0.8822545933890699,0.0068078874597551926,0.8844329858622068,0.007478236915065976,0.002178392473136929,0.0007659214829662984,0.00027573803306060827,0.0040810469132132494,0.03882349241013706,0.8152933406128782,3,0,0,0.0028313780035397196,0.0013353310862764811,0.0023684683295945863 +CONMIX50,0.5,class,pooled_multilabel_MCC,3,0.788289610014557,0.009560024485049456,0.7943466885376504,0.015101817794343117,0.006057078523093488,0.009036380605380707,-0.01639053531646201,0.02850469236264899,0.3654835517541038,1.0,2,0,1,0.00893225654396479,0.013306041645496536,-0.004067062620180861 +CONMIX80,0.8,class,pooled_multilabel_MCC,3,0.788289610014557,0.009560024485049456,0.7953151671068458,0.008510760640151015,0.007025557092288803,0.0023215022326549023,0.0012586258482381691,0.012792488336339437,0.03452245603843771,0.7594940328456297,3,0,0,0.009508053369247427,0.006660255180690244,0.004908362726928739 +CONMIX50,0.5,order,pooled_multilabel_MCC,3,0.6224375956040381,0.005430437505953981,0.6251490376197966,0.011578112076939009,0.0027114420157583843,0.015428059814979021,-0.03561398318977084,0.041036867221287604,0.7895736394244912,1.0,2,0,1,0.015130161770297246,0.007563572969215171,-0.014559408692237263 +CONMIX80,0.8,order,pooled_multilabel_MCC,3,0.6224375956040381,0.005430437505953981,0.6226407574614914,0.0025001686680278423,0.0002031618574532453,0.007625625906135782,-0.018739943031678943,0.01914626674658543,0.9673877144740232,1.0,2,0,1,0.0028746136167565606,0.006133637157483829,-0.008398765201880654 +CONMIX50,0.5,family,pooled_multilabel_MCC,3,0.5836646422338225,0.01043271081232132,0.5974608334961802,0.0030286610190285636,0.013796191262357649,0.008678280832531202,-0.007761853426893169,0.03535423595160847,0.11046589169531976,1.0,3,0,0,0.020647136042388547,0.004037396290631712,0.016704041454052687 +CONMIX80,0.8,family,pooled_multilabel_MCC,3,0.5836646422338225,0.01043271081232132,0.5924971331940049,0.008775593781127694,0.008832490960182312,0.0037466456578349556,-0.00047469281101112856,0.018139674731375753,0.05507090924781738,1.0,3,0,0,0.006946086469670543,0.006403978173142866,0.013147408237733527 +CONMIX50,0.5,genus,pooled_multilabel_MCC,3,0.5069201333366286,0.008525842665520547,0.5176182034282104,0.01354882673210486,0.010698070091581876,0.018233256979396407,-0.03459585117897167,0.055991991362135424,0.4164446251423641,1.0,2,0,1,0.023545123548059987,0.018719839247868797,-0.010170752521183157 +CONMIX80,0.8,genus,pooled_multilabel_MCC,3,0.5069201333366286,0.008525842665520547,0.5177779108251412,0.021505634238273418,0.010857777488512707,0.029230669761824556,-0.06175523160655574,0.08347078658358115,0.5859044397575944,1.0,2,0,1,0.04035844207330824,0.010310090953733031,-0.018095200561503155 +CONMIX50,0.5,species,pooled_multilabel_MCC,3,0.4475728481783429,0.010274412113152404,0.4622912572396025,0.013011400470516788,0.014718409061259596,0.008385951067850828,-0.006113448235281607,0.0355502663578008,0.09331019028073731,1.0,3,0,0,0.023107279846690643,0.014712566573254982,0.006335380763833165 +CONMIX80,0.8,species,pooled_multilabel_MCC,3,0.4475728481783429,0.010274412113152404,0.4549551732175745,0.016000566327026455,0.007382325039231548,0.012860217319021535,-0.024564225784254583,0.03932887586271768,0.42486051897373606,1.0,2,0,1,0.020380380215647753,0.007102068287417995,-0.005335473385371103 +CONMIX50,0.5,immunogenicity,average_precision,3,0.6680141295362017,0.11772130036692537,0.5560275399980514,0.1287882236078939,-0.1119865895381502,0.13644521948005284,-0.4509353048366004,0.22696212576029995,0.2910612072354888,1.0,1,0,2,-0.17165098471213025,-0.2084374782309631,0.04412869432864275 +CONMIX80,0.8,immunogenicity,average_precision,3,0.6680141295362017,0.11772130036692537,0.6894042531542531,0.057199226382131145,0.02139012361805152,0.10369231377855834,-0.23619586345791369,0.27897611069401673,0.7550506756942285,1.0,2,0,1,-0.08987635458223697,0.11532380734263248,0.03872291809375905 +CONMIX50,0.5,linkage,multiclass_MCC,3,0.938698550081103,0.008532412942192875,0.9292664378160967,0.0007279282187011702,-0.009432112265006362,0.009260341160894045,-0.0324360749664571,0.013571850436444375,0.21975086751613057,1.0,1,0,2,-0.01477857272703631,-0.01477857272703631,0.0012608086590535361 +CONMIX80,0.8,linkage,multiclass_MCC,3,0.938698550081103,0.008532412942192875,0.9436247409901152,0.0,0.004926190909012103,0.008532412942192875,-0.01626949785291582,0.026121879670940023,0.4226497308103744,1.0,1,2,0,0.0,0.0,0.01477857272703631 +CONMIX50,0.5,interaction,spearman,3,0.22356356915516137,0.005022736875617551,0.22339178884299662,0.003167923074392717,-0.00017178031216473025,0.00201797985696486,-0.0051847201764036776,0.0048411595520742165,0.8963057507727946,1.0,1,0,2,-9.131117553801138e-05,-0.002228791080668341,0.0018047613197121615 +CONMIX80,0.8,interaction,spearman,3,0.22356356915516137,0.005022736875617551,0.22325209194739903,0.004708211284527187,-0.00031147720776232107,0.0016454987373181566,-0.0043991226757719055,0.0037761682602472633,0.7741571662812383,1.0,1,0,2,0.0015885536000648515,-0.0012703408598847,-0.0012526443634671147 diff --git a/releases/2026-10-02/figures/contrastive_figure12/inputs/review_contrastive_taxonomy_summary.csv b/releases/2026-10-02/figures/contrastive_figure12/inputs/review_contrastive_taxonomy_summary.csv new file mode 100644 index 0000000000000000000000000000000000000000..1129359f259defc698ef320665484ad2eaf302d2 --- /dev/null +++ b/releases/2026-10-02/figures/contrastive_figure12/inputs/review_contrastive_taxonomy_summary.csv @@ -0,0 +1,3 @@ +mixture,pretrained_weight_fraction,metric,n_pairs,ranks_per_pair,rank_seed_pairs,parent_mean,parent_sd,mixture_mean,mixture_sd,delta_mean,delta_sd,ci95_low,ci95_high,parent_mean_seed42,mixture_mean_seed42,delta_seed42,parent_mean_seed43,mixture_mean_seed43,delta_seed43,parent_mean_seed44,mixture_mean_seed44,delta_seed44,interval_scope +CONMIX50,0.5,unweighted_eight_rank_mean_MCC,3,8,24,0.7120707521831977,0.00398304192637157,0.7175338448614207,0.005657315801854871,0.0054630926782230456,0.006513361072213948,-0.010716993191510194,0.021643178547956287,0.7076372714172767,0.7184980238880837,0.010860752470807034,0.7153471194867724,0.7226471097770172,0.007299990290244758,0.7132278656455439,0.7114564009191612,-0.0017714647263826558,Pointwise Student t CI over three run-level eight-rank mean differences; not part of Holm22 family. +CONMIX80,0.8,unweighted_eight_rank_mean_MCC,3,8,24,0.7120707521831977,0.00398304192637157,0.7167292428913474,0.0042966598413453315,0.004658490708149758,0.005993605734137202,-0.010230451325383496,0.019547432741683014,0.7076372714172767,0.7182708993116735,0.010633627894396785,0.7153471194867724,0.7200423781241501,0.004695258637377603,0.7132278656455439,0.7118744512382187,-0.0013534144073251153,Pointwise Student t CI over three run-level eight-rank mean differences; not part of Holm22 family. diff --git a/releases/2026-10-02/figures/figure3_inputs/nature-bpg-palette.json b/releases/2026-10-02/figures/figure3_inputs/nature-bpg-palette.json new file mode 100644 index 0000000000000000000000000000000000000000..45ea20e5b3865ea0fefd85cc8c2befd639ee1000 --- /dev/null +++ b/releases/2026-10-02/figures/figure3_inputs/nature-bpg-palette.json @@ -0,0 +1,30 @@ +{ + "name": "Nature BPG", + "upstream_palette": "ggsci NPG nrc", + "alpha": 0.6, + "alpha_hex_suffix": "99", + "alpha_0_6_hex8": [ + "#E64B3599", + "#4DBBD599", + "#00A08799", + "#3C548899", + "#F39B7F99", + "#8491B499", + "#91D1C299", + "#DC000099", + "#7E614899", + "#B09C8599" + ], + "opaque_hex": [ + "#E64B35", + "#4DBBD5", + "#00A087", + "#3C5488", + "#F39B7F", + "#8491B4", + "#91D1C2", + "#DC0000", + "#7E6148", + "#B09C85" + ] +} diff --git a/releases/2026-10-02/figures/figure3_inputs/partition_count_flow.csv b/releases/2026-10-02/figures/figure3_inputs/partition_count_flow.csv new file mode 100644 index 0000000000000000000000000000000000000000..696cc696bfa0b62a22418f5aea40d8ebdeee4def --- /dev/null +++ b/releases/2026-10-02/figures/figure3_inputs/partition_count_flow.csv @@ -0,0 +1,22 @@ +section,metric,count,unit,scope,definition,source_path,source_sha256,verification +Curation boundary,Full GlyCorpus resource,285050,GlyCorpus records,current final successor unless explicitly stated curation or final test evaluation,"Parent identity manifest, all rows; curation population before sequence availability and benchmark exclusion.",multimodal/outputs/p0_p1_freeze_20260710/review_p1_parent_identity_manifest.tsv.gz,55b830d839370c0cec0aab2b61b4721e6ace9ba3ee49e4c93e7be6e486d1c5c4,direct local recount +Curation boundary,Outside main set on curation grounds,3841,GlyCorpus records,current final successor unless explicitly stated curation or final test evaluation,"Distinct curation boundary. These records are absent from the eligible sequence-parent index and are not the 3,833 benchmark identity exclusions.",submit_comm/03_supplementary/curation/review_glycorpus_v2_outside_main_training_supplement.tsv.gz,1234d4f89d7a21020838183646d7176b01b0228bc916d749248232bb59b4355a,direct local recount +Curation boundary,Main-set eligible records,281209,GlyCorpus records,current final successor unless explicitly stated curation or final test evaluation,review_v2_main_training_keep=True; equals 285050-3841.,multimodal/outputs/p0_p1_freeze_20260710/review_p1_parent_identity_manifest.tsv.gz,55b830d839370c0cec0aab2b61b4721e6ace9ba3ee49e4c93e7be6e486d1c5c4,direct local recount +Sequence availability,Main-set eligible record missing sequence payload,1,GlyCorpus record,current final successor unless explicitly stated curation or final test evaluation,GC0268366; has_sequence=False; sequence_eligibility_reason=sequence_payload_missing.,multimodal/outputs/p0_p1_freeze_20260710/review_p1_parent_identity_manifest.tsv.gz,55b830d839370c0cec0aab2b61b4721e6ace9ba3ee49e4c93e7be6e486d1c5c4,direct local recount +Sequence availability,Eligible sequence-bearing parents,281208,GlyCorpus parent glycans,current final successor unless explicitly stated curation or final test evaluation,sequence_eligible_before_partition=True; equals 281209-1. Denominator for benchmark identity exclusion.,multimodal/outputs/p0_p1_freeze_20260710/review_p1_parent_identity_manifest.tsv.gz,55b830d839370c0cec0aab2b61b4721e6ace9ba3ee49e4c93e7be6e486d1c5c4,direct local recount +Benchmark identity exclusion,Exact canonical-WURCS matches,3673,eligible sequence-bearing parent glycans,current final successor unless explicitly stated curation or final test evaluation,"Exact anchor membership, independently rejoined to final anchor strings. Includes 3427 also verified by graph identity and 246 exact-only parents.",multimodal/outputs/review_a5_non_iar_later_role_successor_20260720_r1/review_a5_non_iar_successor_exact_known_graph_parent_manifest.tsv.gz,a022c035d829db549b521e677d64c010883e77ffe384ad9d59f90217510b31d3,direct local recount +Benchmark identity exclusion,Additional verified graph-identity matches,160,eligible sequence-bearing parent glycans,current final successor unless explicitly stated curation or final test evaluation,Recorded graph_identity_anchor_count>0 and exact_wurcs_anchor=False; disjoint from 3673 exact matches.,multimodal/outputs/review_a5_non_iar_later_role_successor_20260720_r1/review_a5_non_iar_successor_exact_known_graph_parent_manifest.tsv.gz,a022c035d829db549b521e677d64c010883e77ffe384ad9d59f90217510b31d3,direct local recount +Benchmark identity exclusion,Excluded identity-match union,3833,eligible sequence-bearing parent glycans,current final successor unless explicitly stated curation or final test evaluation,3673 exact +160 graph-only. Count audit of frozen identity decisions; no new isomorphism computation.,multimodal/outputs/review_a5_non_iar_later_role_successor_20260720_r1/review_a5_non_iar_successor_exact_known_graph_parent_manifest.tsv.gz,a022c035d829db549b521e677d64c010883e77ffe384ad9d59f90217510b31d3,direct local recount +Partition after exclusion,Retained training-plus-development parents,277375,eligible sequence-bearing parent glycans,current final successor unless explicitly stated curation or final test evaluation,281208-3833; equals 221899+55476. Pre-length-filter roles.,multimodal/outputs/review_a5_non_iar_later_role_successor_20260720_r1/review_a5_non_iar_successor_parent_partition.tsv.gz,86a8c6742156683d502c93fc71b31b9a93450037d647e5a90db437a015bb3bbc,direct local recount +Partition after exclusion,Training parents and learned-preprocessing fit contributors,221899,parent glycans,current final successor unless explicitly stated curation or final test evaluation,pretraining_train and learned_preprocessing_fit_contributor=True. Before sequence length filtering.,multimodal/outputs/review_a5_non_iar_later_role_successor_20260720_r1/review_a5_non_iar_successor_parent_partition.tsv.gz,86a8c6742156683d502c93fc71b31b9a93450037d647e5a90db437a015bb3bbc,direct local recount +Partition after exclusion,Development parents,55476,parent glycans,current final successor unless explicitly stated curation or final test evaluation,pretraining_development; not learned-preprocessing fit contributors. Before sequence length filtering.,multimodal/outputs/review_a5_non_iar_later_role_successor_20260720_r1/review_a5_non_iar_successor_parent_partition.tsv.gz,86a8c6742156683d502c93fc71b31b9a93450037d647e5a90db437a015bb3bbc,direct local recount +Whole-sequence length filter,Over-length training parents excluded from sequence objective,72,parent glycans,current final successor unless explicitly stated curation or final test evaluation,pretraining_train with full_untruncated_length>256. Do not relabel these as absent from tokenizer fitting.,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz,2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0,direct local recount +Whole-sequence length filter,Over-length development parents excluded from sequence objective,36,parent glycans,current final successor unless explicitly stated curation or final test evaluation,pretraining_development with full_untruncated_length>256.,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz,2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0,direct local recount +Sequence objective,Training sequence parents,221827,parent glycans,current final successor unless explicitly stated curation or final test evaluation,221899-72; retained whole sequences with full_untruncated_length<=256.,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz,2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0,direct local recount +Sequence objective,Development sequence parents,55440,parent glycans,current final successor unless explicitly stated curation or final test evaluation,55476-36; retained whole sequences with full_untruncated_length<=256.,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz,2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0,direct local recount +Sequence objective,Training-plus-development sequence parents,277267,parent glycans,current final successor unless explicitly stated curation or final test evaluation,221827+55440; not a tokenizer-fit population.,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz,2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0,direct local recount +Final evaluation test union,Distinct test glycans across eleven tasks,1434,distinct canonical WURCS strings,current final successor unless explicitly stated curation or final test evaluation,"Deduplicated union of 8 taxonomy, 2 scalar and interaction observed test targets; not observation count or all validation/test anchors.",multimodal/outputs/review_matched24_common_intersection_20260802_v1/review_matched24_common_domain_test_examples_v1.tsv.gz; multimodal/outputs/review_matched24_common_intersection_20260802_v1/review_matched24_common_kingdom_test_examples_v1.tsv.gz; multimodal/outputs/review_matched24_common_intersection_20260802_v1/review_matched24_common_phylum_test_examples_v1.tsv.gz; multimodal/outputs/review_matched24_common_intersection_20260802_v1/review_matched24_common_class_test_examples_v1.tsv.gz; multimodal/outputs/review_matched24_common_intersection_20260802_v1/review_matched24_common_order_test_examples_v1.tsv.gz; multimodal/outputs/review_matched24_common_intersection_20260802_v1/review_matched24_common_family_test_examples_v1.tsv.gz; multimodal/outputs/review_matched24_common_intersection_20260802_v1/review_matched24_common_genus_test_examples_v1.tsv.gz; multimodal/outputs/review_matched24_common_intersection_20260802_v1/review_matched24_common_species_test_examples_v1.tsv.gz; multimodal/outputs/review_matched24_scalar_common_intersection_20260802_v1/review_matched24_scalar_common_immunogenicity_test_examples_v1.tsv.gz; multimodal/outputs/review_matched24_scalar_common_intersection_20260802_v1/review_matched24_scalar_common_linkage_test_examples_v1.tsv.gz; multimodal/runtime/a5_downstream_matched24_20260801_r2/authority/review_matched24_interaction851_test_observed_cells_v1.tsv.gz,2784ee89ddecc3a088e06753380c47a0d7205d2a412bbcb7330119ed9d824fd5; 963774151bff002e43635d9233142686d68ba8881fdcb270c99387a4eb2af3ee; 026abebde73ccaef7b24b7b37bc1949b0ac9fccb1bdfa066713386057dcd7320; 39d25a47e2a983dc7fe9cd86690befb3cf2d34fb41f436ac7f383a942182d02c; a4d92be0379348c86da750a60719e436f34cf4a7433f3436e582761b712e84b7; 15a829f17b9db1a13b0d3c2cadfc141f6c00ae6aff4852fe8b146f230313d908; 052f9241e110a0c352e35bbf9789a80c78d8eff119e4afb0c7822e0640d68f4e; 4c16989fef4e94ccd914220bd97df6bf2336e37d0a1e88efef6c066def11d1ad; aebc4b32ee1e2f0c8883c56048a8e303a62a4792fd0c34776bd9ef07799d3c17; f298a4ae3631fcf429aa768f8880ed96942797cdaee5087187c1c6aea73532a7; ec3224347794118dcb852111022a9e7ded2a842f00baef7b0aca97c0ea0598eb,direct local recount +Final evaluation test union,Test glycans present in eligible sequence-parent index,1279,distinct canonical WURCS strings,current final successor unless explicitly stated curation or final test evaluation,Exact-key join of final test union; all 1279 have excluded_exact_or_verified_graph_identity role and both contributor flags False.,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz,2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0,direct local recount +Final evaluation test union,Test glycans absent from eligible sequence-parent index,155,distinct canonical WURCS strings,current final successor unless explicitly stated curation or final test evaluation,1434-1279; these were not removed from this pool because they were absent.,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz,2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0,direct local recount +Final evaluation test union,Test glycans assigned training or development role,0,distinct canonical WURCS strings,current final successor unless explicitly stated curation or final test evaluation,Direct union join to the complete 281208-parent index. Identity-overlap check; not a claim of absent shared motifs or neighbours.,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz,2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0,direct local recount +Final evaluation test union,Test glycans flagged as learned-preprocessing fit contributors,0,distinct canonical WURCS strings,current final successor unless explicitly stated curation or final test evaluation,Direct union join and contributor flag check before length filtering.,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz,2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0,direct local recount diff --git a/releases/2026-10-02/figures/figure3_inputs/review_bpe_vocabulary.json b/releases/2026-10-02/figures/figure3_inputs/review_bpe_vocabulary.json new file mode 100644 index 0000000000000000000000000000000000000000..b572bd7f979062ce20f91e3adfa0b17d6192f2c4 --- /dev/null +++ b/releases/2026-10-02/figures/figure3_inputs/review_bpe_vocabulary.json @@ -0,0 +1,10264 @@ +{ + "merges": [ + [ + "?", + "|" + ], + [ + "1", + "2" + ], + [ + "1", + "-" + ], + [ + "C", + "C" + ], + [ + "-", + "1" + ], + [ + "1-", + "5" + ], + [ + "h", + "-1" + ], + [ + "12", + "2" + ], + [ + "/", + "3" + ], + [ + "=", + "O" + ], + [ + "/3", + "=O" + ], + [ + "a", + "2" + ], + [ + "122", + "h-1" + ], + [ + "*", + "N" + ], + [ + "CC", + "/3=O" + ], + [ + "x", + "x" + ], + [ + "*N", + "CC/3=O" + ], + [ + "a", + "?|" + ], + [ + "a?|", + "b" + ], + [ + "?|", + "c" + ], + [ + "a?|b", + "?|c" + ], + [ + "?|", + "d" + ], + [ + "a?|b?|c", + "?|d" + ], + [ + "?|", + "e" + ], + [ + "a?|b?|c?|d", + "?|e" + ], + [ + "2", + "*NCC/3=O" + ], + [ + "?|", + "f" + ], + [ + "a?|b?|c?|d?|e", + "?|f" + ], + [ + "?|", + "g" + ], + [ + "a?|b?|c?|d?|e?|f", + "?|g" + ], + [ + "?|", + "h" + ], + [ + "a?|b?|c?|d?|e?|f?|g", + "?|h" + ], + [ + "a2", + "122h-1" + ], + [ + "?|", + "i" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h", + "?|i" + ], + [ + "?", + "-" + ], + [ + "?|", + "j" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i", + "?|j" + ], + [ + "?|", + "k" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j", + "?|k" + ], + [ + "1", + "12" + ], + [ + "?|", + "l" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k", + "?|l" + ], + [ + "?|", + "m" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l", + "?|m" + ], + [ + "a2", + "112" + ], + [ + "4", + "-" + ], + [ + "a", + "1" + ], + [ + "*", + "O" + ], + [ + "?", + "}" + ], + [ + "?|", + "n" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m", + "?|n" + ], + [ + "a2112", + "h-1" + ], + [ + "?|", + "o" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n", + "?|o" + ], + [ + "-", + "{" + ], + [ + "?}", + "-{" + ], + [ + "122", + "h" + ], + [ + "a1", + "122h-1" + ], + [ + "CC", + "CC" + ], + [ + "2", + "-" + ], + [ + "?|", + "p" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o", + "?|p" + ], + [ + "a2122h-1", + "b" + ], + [ + "3", + "-" + ], + [ + "b", + "1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|", + "q" + ], + [ + "xx", + "xx" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q", + "?|" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|", + "r" + ], + [ + "c", + "1" + ], + [ + "d", + "1" + ], + [ + "a2122h-1", + "x" + ], + [ + "u", + "2" + ], + [ + "m", + "-1" + ], + [ + "a2112h-1", + "b" + ], + [ + "2", + "1" + ], + [ + "?|", + "s" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r", + "?|s" + ], + [ + "122", + "1" + ], + [ + "6", + "-" + ], + [ + "a1122h-1", + "a" + ], + [ + "?|", + "t" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s", + "?|t" + ], + [ + "O", + "/3=O" + ], + [ + "e", + "1" + ], + [ + "u", + "xxxx" + ], + [ + "*O", + "C" + ], + [ + "h-1", + "x" + ], + [ + "d", + "21" + ], + [ + "a2112h-1", + "x" + ], + [ + "-", + "2" + ], + [ + "d21", + "122h" + ], + [ + "2-", + "6" + ], + [ + "A", + "a" + ], + [ + "CCCC", + "CC" + ], + [ + "f", + "1" + ], + [ + "uxxxx", + "h" + ], + [ + "a", + "1221" + ], + [ + "CCCCCC", + "$" + ], + [ + "a1221", + "m-1" + ], + [ + "(", + "CCCCCC$" + ], + [ + "?|", + "u" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t", + "?|u" + ], + [ + "u2", + "122h" + ], + [ + "Aa", + "d21122h" + ], + [ + "Aad21122h", + "-2" + ], + [ + "a", + "4-" + ], + [ + "a1122h-1", + "x" + ], + [ + "a", + "xxxx" + ], + [ + "5", + "*NCC/3=O" + ], + [ + "a", + "?-" + ], + [ + "4", + ")" + ], + [ + "a4-", + "b1" + ], + [ + "c", + "?-" + ], + [ + "*O", + "CC/3=O" + ], + [ + "axxxx", + "h-1x" + ], + [ + "g", + "1" + ], + [ + "*OC", + "(CCCCCC$" + ], + [ + "h", + "1" + ], + [ + "*OC(CCCCCC$", + "4)" + ], + [ + "b", + "4-" + ], + [ + "b", + "?-" + ], + [ + "?|", + "v" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u", + "?|v" + ], + [ + "i", + "1" + ], + [ + "a?-", + "b1" + ], + [ + "b4-", + "c1" + ], + [ + "112", + "h" + ], + [ + "*O", + "S" + ], + [ + "a1221m-1", + "a" + ], + [ + "a2122h-1", + "a" + ], + [ + "d", + "?-" + ], + [ + "c", + "3-" + ], + [ + "O/3=O", + "/3=O" + ], + [ + "a1122h-1", + "b" + ], + [ + "b?-", + "c1" + ], + [ + "u2", + "112h" + ], + [ + "j", + "1" + ], + [ + "Aad21122h-2", + "a" + ], + [ + "c3-", + "d1" + ], + [ + "a", + "3-" + ], + [ + "*OS", + "O/3=O/3=O" + ], + [ + "c?-", + "d1" + ], + [ + "A", + "-1" + ], + [ + "u", + "1" + ], + [ + "a", + "6-" + ], + [ + "a3-", + "b1" + ], + [ + "k", + "1" + ], + [ + "?|", + "w" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v", + "?|w" + ], + [ + "Aad21122h-2", + "x" + ], + [ + "21", + "1" + ], + [ + "c", + "6-" + ], + [ + "2", + "*N" + ], + [ + "a1221m-1", + "x" + ], + [ + "b", + "3-" + ], + [ + "A", + "U" + ], + [ + "1-", + "?" + ], + [ + "m-1", + "a" + ], + [ + "d?-", + "e1" + ], + [ + "e", + "?-" + ], + [ + "h-1", + "a" + ], + [ + "d", + "2-" + ], + [ + "*O", + "P" + ], + [ + "/3", + "O/3=O" + ], + [ + "a2112h-1", + "a" + ], + [ + "d2-", + "e1" + ], + [ + "*N", + "CC" + ], + [ + "l", + "1" + ], + [ + "a2", + "211" + ], + [ + "u1", + "122h" + ], + [ + "e", + "4-" + ], + [ + "c", + "4-" + ], + [ + "5", + "*NCC" + ], + [ + "5*NCC", + "O/3=O" + ], + [ + "b3-", + "c1" + ], + [ + "[", + "C" + ], + [ + "[C", + "@" + ], + [ + "2", + "2" + ], + [ + "e?-", + "f1" + ], + [ + "1", + "1" + ], + [ + "3", + "|" + ], + [ + "?|", + "x" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w", + "?|x" + ], + [ + "1-", + "4" + ], + [ + "a1", + "1221" + ], + [ + "m", + "1" + ], + [ + "h-1", + "b" + ], + [ + "a2", + "122" + ], + [ + "a2", + "12" + ], + [ + "d", + "4-" + ], + [ + "*OP", + "O" + ], + [ + "e4-", + "f1" + ], + [ + "f", + "?-" + ], + [ + "n", + "1" + ], + [ + "-", + "b1" + ], + [ + "*OC(CCCCCC$4)", + "/3=O" + ], + [ + "C", + "/" + ], + [ + "a2211", + "m-1a" + ], + [ + "h", + "2" + ], + [ + "AU", + "d21122h" + ], + [ + "x", + "h" + ], + [ + "m-1", + "x" + ], + [ + "a", + "1-" + ], + [ + "a2122", + "A-1" + ], + [ + "c4-", + "d1" + ], + [ + "?|", + "y" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x", + "?|y" + ], + [ + "3", + "*OCC/3=O" + ], + [ + "d1", + "122h" + ], + [ + "H", + "]" + ], + [ + "2", + "*OCC/3=O" + ], + [ + "u", + "1221" + ], + [ + "g", + "?-" + ], + [ + "u1221", + "m" + ], + [ + "^", + "X" + ], + [ + "3", + "*OC" + ], + [ + "6", + "*OSO/3=O/3=O" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?" + ], + [ + "4", + "*OCC/3=O" + ], + [ + "o", + "1" + ], + [ + "b", + "6-" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?" + ], + [ + "d", + "3-" + ], + [ + "4", + "|" + ], + [ + "i", + "?-" + ], + [ + "/3", + "C" + ], + [ + "e", + "3-" + ], + [ + "g", + "2" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?" + ], + [ + "h", + "?-" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?" + ], + [ + "*OPO", + "/3O/3=O" + ], + [ + "d", + "2" + ], + [ + "a11221", + "h-1a" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?" + ], + [ + "6", + "*OCC/3=O" + ], + [ + "f?-", + "g1" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?" + ], + [ + "*O", + "CC" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?" + ], + [ + "(", + "C" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?" + ], + [ + "C", + "/3=O" + ], + [ + "[C@", + "@" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?" + ], + [ + "CCCC", + "CCCC" + ], + [ + "?|", + "z" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y", + "?|z" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?" + ], + [ + "^X", + "O" + ], + [ + "O", + ")" + ], + [ + "e3-", + "f1" + ], + [ + "f", + "3-" + ], + [ + "b", + "2-" + ], + [ + "3", + "*OC(CCCCCC$4)" + ], + [ + "uxxxx", + "m" + ], + [ + "a2", + "-b1" + ], + [ + "p", + "1" + ], + [ + "g?-", + "h1" + ], + [ + "c", + "2-" + ], + [ + "6", + "|" + ], + [ + "a6-", + "b1" + ], + [ + "j", + "?-" + ], + [ + "d1122h", + "-2" + ], + [ + "Aa", + "d1122h-2" + ], + [ + "d4-", + "e1" + ], + [ + "h?-", + "i1" + ], + [ + "a1", + "122" + ], + [ + "d3-", + "e1" + ], + [ + "CC", + "N" + ], + [ + "c2-", + "d1" + ], + [ + "O", + "/" + ], + [ + "i?-", + "j1" + ], + [ + "k", + "?-" + ], + [ + "a2122A-1", + "b" + ], + [ + "b2-", + "c1" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?" + ], + [ + "(C", + ")" + ], + [ + "m-1", + "b" + ], + [ + "a11221", + "h-1x" + ], + [ + "~", + "n" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?" + ], + [ + "(", + "O)" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?" + ], + [ + "a2", + "11" + ], + [ + "?|", + "A" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z", + "?|A" + ], + [ + "c", + "2" + ], + [ + "A-1", + "a" + ], + [ + "h", + "2-" + ], + [ + "C/", + "4" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f" + ], + [ + "?}-{a?|b?|c?|d?|e?|f", + "?" + ], + [ + "a?|b?|c?|d?|e?|f", + "?}-{a?|b?|c?|d?|e?|f?" + ], + [ + "h", + "4-" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g", + "?}-{a?|b?|c?|d?|e?|f?|g?" + ], + [ + "2", + "*OC(CCCCCC$4)" + ], + [ + "q", + "1" + ], + [ + "3", + "4" + ], + [ + "l", + "?-" + ], + [ + "a212", + "h-1b" + ], + [ + "x", + "h-1" + ], + [ + ")", + "O" + ], + [ + "*OP", + "^XO" + ], + [ + "d", + "xxxx" + ], + [ + "4", + "*OC(CCCCCC$4)" + ], + [ + "=", + "C" + ], + [ + "g", + "4-" + ], + [ + "=", + "^" + ], + [ + "6", + "*OC(CCCCCC$4)" + ], + [ + "AU", + "dxxxx" + ], + [ + "?|", + "B" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A", + "?|B" + ], + [ + "f3-", + "g1" + ], + [ + "A-1", + "x" + ], + [ + "h4-", + "i1" + ], + [ + "/", + "6" + ], + [ + "/", + "7" + ], + [ + "2", + "*OSO/3=O/3=O" + ], + [ + "j?-", + "k1" + ], + [ + "i", + "4-" + ], + [ + "[C@", + "]" + ], + [ + "a", + "x" + ], + [ + "r", + "1" + ], + [ + "2", + "*OC" + ], + [ + "?}-{", + "a?|b?|c?|d?|e" + ], + [ + "?}-{a?|b?|c?|d?|e", + "?" + ], + [ + "a?|b?|c?|d?|e", + "?}-{a?|b?|c?|d?|e?" + ], + [ + "f", + "4-" + ], + [ + "d", + "6-" + ], + [ + "m", + "?-" + ], + [ + "g", + "2-" + ], + [ + "a", + "5" + ], + [ + "22", + "2" + ], + [ + "a", + "d" + ], + [ + "g4-", + "h1" + ], + [ + "?}-{", + "a?|b?|c?|d" + ], + [ + "?}-{a?|b?|c?|d", + "?" + ], + [ + "a?|b?|c?|d", + "?}-{a?|b?|c?|d?" + ], + [ + "1", + "*N" + ], + [ + "g", + "3-" + ], + [ + "S", + "O/3=O/3=O" + ], + [ + "?|", + "C" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B", + "?|C" + ], + [ + "2*N", + "SO/3=O/3=O" + ], + [ + "k?-", + "l1" + ], + [ + "e", + "2-" + ], + [ + "/", + "4" + ], + [ + "f?-", + "g2" + ], + [ + "/", + "5" + ], + [ + "i4-", + "j1" + ], + [ + "[C@@", + "]" + ], + [ + "}", + "C" + ], + [ + "=^", + "Z" + ], + [ + "CC", + "C" + ], + [ + "h2-", + "i1" + ], + [ + "*OPO", + "*" + ], + [ + "*OPO*", + "/3O/3=O" + ], + [ + "b6-", + "c1" + ], + [ + "e2-", + "f1" + ], + [ + "f4-", + "g1" + ], + [ + "2", + "*OC(CCCCCC$4)/3=O" + ], + [ + "a2211", + "m-1x" + ], + [ + "4", + "*OC" + ], + [ + "AUdxxxx", + "xh" + ], + [ + "l?-", + "m1" + ], + [ + "*OP^XO", + "CCN" + ], + [ + "a5", + "-b1" + ], + [ + "[C@@", + "H]" + ], + [ + "3", + "*OC(CCCCCC$4)/3=O" + ], + [ + "2-", + "5" + ], + [ + "i", + "2-" + ], + [ + "Aad1122h-2", + "x" + ], + [ + "a", + "xx" + ], + [ + "h2", + "122h" + ], + [ + "e4-", + "g1" + ], + [ + "a212", + "h-1x" + ], + [ + "6", + "*OC" + ], + [ + "j", + "4-" + ], + [ + "xh-1", + "u" + ], + [ + "g2-", + "h1" + ], + [ + "a2122A-1", + "x" + ], + [ + "<", + "Q" + ], + [ + "" + ], + [ + "?|", + "D" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C", + "?|D" + ], + [ + "[C@", + "H]" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?" + ], + [ + "*OS", + "i" + ], + [ + "/", + "1" + ], + [ + "f", + "6-" + ], + [ + "g3-", + "h1" + ], + [ + "l", + "4-" + ], + [ + "a212", + "1" + ], + [ + "e", + "2" + ], + [ + "3", + "*OSO/3=O/3=O" + ], + [ + "i2-", + "j1" + ], + [ + "s", + "1" + ], + [ + "34", + "4" + ], + [ + "?|", + "a" + ], + [ + "3-", + "7" + ], + [ + "M", + "I" + ], + [ + "i", + "3-" + ], + [ + "12", + "h" + ], + [ + "8", + "-" + ], + [ + "/6", + ")" + ], + [ + "@", + "S" + ], + [ + "E", + "S" + ], + [ + "L", + "ES" + ], + [ + "@S", + "MI" + ], + [ + "@SMI", + "LES" + ], + [ + "@SMILES", + "@" + ], + [ + "j4-", + "k1" + ], + [ + "c6-", + "h1" + ], + [ + "k", + "2-" + ], + [ + "b", + "2" + ], + [ + "*", + "1" + ], + [ + "AU", + "d1122h" + ], + [ + "a4-", + "c1" + ], + [ + "h", + "3-" + ], + [ + "Aad1122h-2", + "a" + ], + [ + "h2", + "112h" + ], + [ + "=", + "@SMILES@" + ], + [ + "@", + "=@SMILES@" + ], + [ + "C", + "N" + ], + [ + "1221", + "h" + ], + [ + "*O", + "CCCC" + ], + [ + "a", + "122h-1" + ], + [ + "4", + "*OSO/3=O/3=O" + ], + [ + "u1", + "1221h" + ], + [ + "5", + "-" + ], + [ + "*OP^XOCCN", + "/3O/3=O" + ], + [ + "j", + "2" + ], + [ + "4", + "/7" + ], + [ + "*", + "2" + ], + [ + "*O", + "CCCCCCCC" + ], + [ + "l4-", + "m1" + ], + [ + "n", + "?-" + ], + [ + "f", + "2-" + ], + [ + "?}", + "*OSO/3=O/3=O" + ], + [ + "c6-", + "d1" + ], + [ + "*", + "C" + ], + [ + "/3", + "(CCCCCC$" + ], + [ + "/3C", + "/3C" + ], + [ + "a", + "4" + ], + [ + "122h", + "-2" + ], + [ + "j", + "2-" + ], + [ + "C", + "(CCCCCC$" + ], + [ + "4", + "*OC(CCCCCC$4)/3=O" + ], + [ + "?}-{", + "a?|b?|c" + ], + [ + "?}-{a?|b?|c", + "?" + ], + [ + "a?|b?|c", + "?}-{a?|b?|c?" + ], + [ + "(CCCCCC$", + "3" + ], + [ + "4", + "*OPO/3O/3=O" + ], + [ + "c6-", + "g1" + ], + [ + "?|", + "E" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D", + "?|E" + ], + [ + "k", + "4-" + ], + [ + "uxxxx", + "xh" + ], + [ + "a", + "12" + ], + [ + "C", + "/3C/3C" + ], + [ + "4", + "*N" + ], + [ + "[", + "H]" + ], + [ + "f2-", + "g1" + ], + [ + "u2", + "211" + ], + [ + "axxxx", + "m-1x" + ], + [ + "f", + "2" + ], + [ + "m?-", + "n1" + ], + [ + "^", + "R" + ], + [ + "3", + "*OCC" + ], + [ + "/", + "4)" + ], + [ + "a211", + "h-1a" + ], + [ + "*1", + "O" + ], + [ + "h", + "a" + ], + [ + "i", + "2" + ], + [ + "c6-", + "i1" + ], + [ + "h3-", + "i1" + ], + [ + "k2-", + "l1" + ], + [ + "u2211", + "m" + ], + [ + "k", + "2" + ], + [ + "a2112", + "A-1a" + ], + [ + "n", + "2" + ], + [ + "?|", + "F" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E", + "?|F" + ], + [ + "o", + "?-" + ], + [ + "e", + "6-" + ], + [ + "x", + "h-1x" + ], + [ + "d?-", + "h1" + ], + [ + "7", + "-" + ], + [ + "", + "@" + ], + [ + ")", + "C" + ], + [ + "6", + "*N" + ], + [ + "a1122", + "2" + ], + [ + "?|", + "G" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F", + "?|G" + ], + [ + "3", + "}" + ], + [ + "c?-", + "h1" + ], + [ + "d4-", + "h1" + ], + [ + "a2", + "2" + ], + [ + "t", + "1" + ], + [ + "a2", + "1" + ], + [ + "c?-", + "i1" + ], + [ + "j", + "3-" + ], + [ + "j2-", + "k1" + ], + [ + "3|", + "g" + ], + [ + "i3-", + "j1" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?" + ], + [ + "3", + "*N" + ], + [ + "m", + "4-" + ], + [ + "u2", + "122" + ], + [ + "k4-", + "l1" + ], + [ + "O/", + "5" + ], + [ + "?|", + "H" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G", + "?|H" + ], + [ + "ha", + "122h-2" + ], + [ + "/3(CCCCCC$", + "1" + ], + [ + "}C", + "(O)" + ], + [ + "n", + "2-" + ], + [ + "(", + "[H]" + ], + [ + "h2", + "h" + ], + [ + "?|", + "I" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H", + "?|I" + ], + [ + "n1", + "*1O" + ], + [ + "d6-", + "e1" + ], + [ + "u", + "xx" + ], + [ + "CC", + "/4" + ], + [ + "g", + "6-" + ], + [ + "c6-", + "k1" + ], + [ + "u2", + "12h" + ], + [ + "i", + "n" + ], + [ + "l", + "2-" + ], + [ + "C/3=O", + "/3=O" + ], + [ + "a2112", + "m-1a" + ], + [ + "?|", + "J" + ], + [ + "a2", + "22" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I", + "?|J" + ], + [ + "3", + "~n" + ], + [ + "o", + "l" + ], + [ + ")O", + "(" + ], + [ + "3", + "*NCC/3=O" + ], + [ + "{", + "1" + ], + [ + "*", + "F" + ], + [ + "CC/4", + "C/4" + ], + [ + "*OSi", + "CC/4C/4" + ], + [ + "a1122", + "m-1a" + ], + [ + "d", + "h" + ], + [ + "6", + "*OC(CCCCCC$4)/3=O" + ], + [ + "h", + "6-" + ], + [ + "0", + "=O" + ], + [ + "E", + "R" + ], + [ + "a1-", + "d" + ], + [ + "CC", + "^" + ], + [ + "a2", + "222" + ], + [ + "a6-", + "c1" + ], + [ + "(CCCCCC$3", + "/6)" + ], + [ + "f3-", + "g2" + ], + [ + "c?-", + "g1" + ], + [ + "=^Z", + "CCC" + ], + [ + "i", + "6-" + ], + [ + "C/", + "7" + ], + [ + "A-1", + "b" + ], + [ + "?}", + "*OC" + ], + [ + "m", + "3-" + ], + [ + "4", + "~n" + ], + [ + "a3-", + "c1" + ], + [ + "c?-", + "k1" + ], + [ + "2-", + "?" + ], + [ + "xh-1", + "d" + ], + [ + "O/5", + "=O" + ], + [ + "C", + "(" + ], + [ + "C/4", + "C/3=O" + ], + [ + "11", + "h" + ], + [ + "2", + "*OCC" + ], + [ + "ER", + "R" + ], + [ + "ERR", + "O" + ], + [ + "ERRO", + "R" + ], + [ + "n", + "4-" + ], + [ + "ax", + "12" + ], + [ + "/", + "2" + ], + [ + "n?-", + "o1" + ], + [ + "m4-", + "n1" + ], + [ + "a", + "3" + ], + [ + "x", + "2" + ], + [ + "c6-", + "e1" + ], + [ + "22", + "h" + ], + [ + "O/5=O", + "/3O/3=O" + ], + [ + "a1-", + "c" + ], + [ + "?}", + "*OPO/3O/3=O" + ], + [ + "6", + "}" + ], + [ + "3", + "34" + ], + [ + "b4-", + "d1" + ], + [ + "e", + "n" + ], + [ + "A", + "d1" + ], + [ + "g", + "3|g" + ], + [ + "/", + "8" + ], + [ + "b3-", + "c2" + ], + [ + "u2", + "112" + ], + [ + "o?-", + "p1" + ], + [ + "k", + "6-" + ], + [ + "d?-", + "g1" + ], + [ + "A", + "d2" + ], + [ + "CC", + "[C@]" + ], + [ + "6", + "*OPO/3O/3=O" + ], + [ + "c6-", + "f1" + ], + [ + "x", + "1" + ], + [ + "[C@@H]", + "(O)" + ], + [ + "g3|g", + "6" + ], + [ + "k", + "3-" + ], + [ + "(CCCCCC$3/6)", + "N" + ], + [ + "3|", + "c" + ], + [ + "f6-", + "g2" + ], + [ + "([H]", + ")" + ], + [ + "c6-", + "j1" + ], + [ + "{", + "2" + ], + [ + "j3-", + "k1" + ], + [ + "6", + "*OCC" + ], + [ + "122", + "2" + ], + [ + "a211", + "h-1x" + ], + [ + "h2-", + "g3|g6" + ], + [ + "o", + "4-" + ], + [ + "u2122", + "A" + ], + [ + "j", + "6-" + ], + [ + "a122h-1", + "a" + ], + [ + "p", + "?-" + ], + [ + "c3-", + "e1" + ], + [ + "a2121", + "A-1a" + ], + [ + "uxxxx", + "A" + ], + [ + "{", + "3}" + ], + [ + "b3-", + "d1" + ], + [ + "a6-", + "d1" + ], + [ + "l", + "2" + ], + [ + "6", + "=O" + ], + [ + "a12", + "11" + ], + [ + "d?-", + "i1" + ], + [ + "4/7", + ")" + ], + [ + ")O", + "C" + ], + [ + "a?|b?|c?|d?|e", + "?}" + ], + [ + "d4-", + "g1" + ], + [ + "b?-", + "c2" + ], + [ + "3|", + "f" + ], + [ + "1", + "h" + ], + [ + "e6-", + "f1" + ], + [ + "a", + "112" + ], + [ + "a2112", + "A-1x" + ], + [ + "a2122", + "m-1b" + ], + [ + "l", + "3-" + ], + [ + "*OSi", + "C/3C/3C" + ], + [ + "C", + "$" + ], + [ + "/5", + "O/5=O/3O/3=O" + ], + [ + "a11222", + "h-1a" + ], + [ + "C/4", + "C/4C/3=O" + ], + [ + "n4-", + "o1" + ], + [ + "n", + "3-" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?" + ], + [ + ")", + "/3(CCCCCC$1" + ], + [ + "a3", + "344" + ], + [ + "C/", + "5" + ], + [ + "n1*1O", + "(CCCCCC$3/6)N" + ], + [ + "a212", + "h-1a" + ], + [ + "a6-", + "l1" + ], + [ + "e?-", + "h1" + ], + [ + "/4)", + "*2" + ], + [ + "l2-", + "m1" + ], + [ + "c?-", + "j1" + ], + [ + "c4-", + "e1" + ], + [ + "a2122A-1", + "a" + ], + [ + "F", + "/4" + ], + [ + "a2112", + "m-1x" + ], + [ + "a1", + "112" + ], + [ + "CCCC", + "CCCCCC" + ], + [ + "*OP^XO", + "P" + ], + [ + "m", + "2-" + ], + [ + "/1", + "0=O" + ], + [ + "ha122h-2", + "b" + ], + [ + "?|", + "K" + ], + [ + "a22", + "21" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J", + "?|K" + ], + [ + "a?|b?|c?|d?|e?|f", + "?}" + ], + [ + "a1-", + "b" + ], + [ + "m3-", + "n1" + ], + [ + "*", + "S" + ], + [ + "u", + "d" + ], + [ + "6", + ")" + ], + [ + "i", + "c" + ], + [ + "5", + "*N" + ], + [ + "d4-", + "f1" + ], + [ + "q", + "?-" + ], + [ + "c?-", + "f1" + ], + [ + "a4", + "334" + ], + [ + "6", + "*OP^XOCCN/3O/3=O" + ], + [ + "AUdxxxx", + "h" + ], + [ + "*OSiCC/4C/4", + "C/3C/3C" + ], + [ + "4", + "*OCC" + ], + [ + "ax", + "11" + ], + [ + "^", + "S" + ], + [ + "a222", + "h-1b" + ], + [ + "h", + "xh" + ], + [ + "k3-", + "l1" + ], + [ + "o4-", + "p1" + ], + [ + "1-", + "a" + ], + [ + "d4-", + "i1" + ], + [ + "O/", + "6=O" + ], + [ + "i?-", + "j2" + ], + [ + "C/5", + "O/3=O" + ], + [ + "i", + "d" + ], + [ + "222", + "h" + ], + [ + "3", + "~" + ], + [ + "CC", + "$" + ], + [ + "l3-", + "m1" + ], + [ + "C", + "^R" + ], + [ + "4", + "~" + ], + [ + "4|", + "d" + ], + [ + "1-", + "a?|b?|c?|d?|e?}" + ], + [ + "?}", + "*OCC/3=O" + ], + [ + "r", + "o" + ], + [ + "n", + "2-6" + ], + [ + "j?-", + "k2" + ], + [ + "o", + "2" + ], + [ + "F", + "/3=O" + ], + [ + "=O", + ")" + ], + [ + "3", + "*OCCCCCCCC" + ], + [ + "1-", + "c" + ], + [ + "a2121", + "A-1x" + ], + [ + "c?-", + "e1" + ], + [ + "axx", + "2" + ], + [ + "*OP^XOP", + "^XO" + ], + [ + "CCN", + "/5O/5=O/3O/3=O" + ], + [ + "a2211", + "m-1b" + ], + [ + "g?-", + "h2" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i", + "?}" + ], + [ + "O", + "C" + ], + [ + "uxx", + "xh" + ], + [ + "=^", + "E" + ], + [ + "h", + "4" + ], + [ + "(CCCCCC$", + "4/7)" + ], + [ + "C/", + "1" + ], + [ + "h?-", + "i2" + ], + [ + "c?-", + "l1" + ], + [ + "o", + "3-" + ], + [ + "l", + "6-" + ], + [ + "1-", + "d" + ], + [ + "c6-", + "l1" + ], + [ + "3", + "*C" + ], + [ + "@", + "a" + ], + [ + "a6-", + "j1" + ], + [ + "m", + "6-" + ], + [ + "5", + "n2-6" + ], + [ + "5n2-6", + "n1*1O(CCCCCC$3/6)N" + ], + [ + "{", + "5" + ], + [ + "b6-", + "c2" + ], + [ + "p", + "4-" + ], + [ + "/", + "9" + ], + [ + "a1-", + "e" + ], + [ + "b?-", + "e1" + ], + [ + "Ad2", + "d" + ], + [ + "a", + "n" + ], + [ + "u", + "x" + ], + [ + "a4", + "344" + ], + [ + "(CCCCCC$4/7)", + "C/3=O/3=O" + ], + [ + "a1-", + "b1" + ], + [ + "v", + "1" + ], + [ + "=^ZCCC", + "=^ZCCC" + ], + [ + "a112", + "1" + ], + [ + "2", + "*OCCCCCCCC" + ], + [ + "[C@H]", + "(O)" + ], + [ + "n3-", + "o1" + ], + [ + "4", + "*NCC/3=O" + ], + [ + "@=@SMILES@", + "C" + ], + [ + "a2112", + "m-1b" + ], + [ + "CCCCCC", + "CC/3=O" + ], + [ + "d3-", + "f1" + ], + [ + "1-", + "a?|b?|c?|d?|e?|f?}" + ], + [ + "=", + "CC" + ], + [ + "-2", + "x" + ], + [ + "Ad1", + "d" + ], + [ + "ERROR", + "1-" + ], + [ + "8", + "-b1" + ], + [ + "h", + "y" + ], + [ + "CC^", + "Z" + ], + [ + "a1-", + "b2" + ], + [ + "a2", + "-" + ], + [ + "b?-", + "f1" + ], + [ + "?|", + "L" + ], + [ + "?|", + "M" + ], + [ + "?|", + "N" + ], + [ + "?|L", + "?|M" + ], + [ + "?|L?|M", + "?|N" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K", + "?|L?|M?|N" + ], + [ + "ad", + "222" + ], + [ + "@=@SMILES@", + "O" + ], + [ + "a6-", + "f1" + ], + [ + "m", + "2" + ], + [ + "*OS", + "(CCCCCC$4/7)C/3=O/3=O" + ], + [ + "m?-", + "n2" + ], + [ + "a6-", + "e1" + ], + [ + "p?-", + "q1" + ], + [ + "e?-", + "g1" + ], + [ + "a6-", + "k1" + ], + [ + "c", + "5-" + ], + [ + "1-c", + "3|c" + ], + [ + "o3-", + "p1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j", + "?}" + ], + [ + "a?-", + "d1" + ], + [ + "4/7", + ")OC" + ], + [ + "d?-", + "f1" + ], + [ + "3", + "*OCCCC" + ], + [ + "r", + "?-" + ], + [ + "CC", + "[C@@]" + ], + [ + "CCCC", + "CC/3=O" + ], + [ + "b6-", + "f1" + ], + [ + "1", + "*NCC" + ], + [ + "C", + "/3O/3=O" + ], + [ + "3|", + "i" + ], + [ + "u2112", + "m" + ], + [ + "21", + "h" + ], + [ + "a?-", + "c1" + ], + [ + "*OP^XOP^XO", + "CCN/5O/5=O/3O/3=O" + ], + [ + "3|", + "b" + ], + [ + "*", + "/2" + ], + [ + "p", + "3-" + ], + [ + "u2", + "11h" + ], + [ + "(", + "{2" + ], + [ + "a?-", + "e1" + ], + [ + "C/7", + "C/7" + ], + [ + "b4-", + "e1" + ], + [ + "a122h-1", + "x" + ], + [ + "g", + "en" + ], + [ + "5", + ")" + ], + [ + "f6-", + "g1" + ], + [ + "C/7C/7", + "C/3O/3=O" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?" + ], + [ + "C", + "l" + ], + [ + "2*N", + "CCC" + ], + [ + "a11222", + "h-1x" + ], + [ + "1-c3|c", + "6" + ], + [ + "?}-{", + "a?|b" + ], + [ + "?}-{a?|b", + "?" + ], + [ + "a?|b", + "?}-{a?|b?" + ], + [ + "a", + "1222" + ], + [ + "C", + "=^Z" + ], + [ + "f", + "3|f" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h", + "?}" + ], + [ + "d?-", + "j1" + ], + [ + "2", + "*OCCCC" + ], + [ + "?|", + "O" + ], + [ + "?|", + "P" + ], + [ + "?|", + "Q" + ], + [ + "?|", + "R" + ], + [ + "?|", + "S" + ], + [ + "?|", + "T" + ], + [ + "?|", + "U" + ], + [ + "?|", + "V" + ], + [ + "?|O", + "?|P" + ], + [ + "?|O?|P", + "?|Q" + ], + [ + "?|O?|P?|Q", + "?|R" + ], + [ + "?|O?|P?|Q?|R", + "?|S" + ], + [ + "?|O?|P?|Q?|R?|S", + "?|T" + ], + [ + "?|O?|P?|Q?|R?|S?|T", + "?|U" + ], + [ + "?|O?|P?|Q?|R?|S?|T?|U", + "?|V" + ], + [ + "a2", + "d" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N", + "?|O?|P?|Q?|R?|S?|T?|U?|V" + ], + [ + "q", + "2" + ], + [ + "b?-", + "g1" + ], + [ + "a22", + "12" + ], + [ + "2*N", + "C" + ], + [ + "4|", + "i" + ], + [ + "CN", + "(CCCCCC$" + ], + [ + "q?-", + "r1" + ], + [ + "CC", + "O" + ], + [ + "4)", + "/3=O" + ], + [ + "axx", + "1" + ], + [ + "o", + "2-" + ], + [ + "1", + "m" + ], + [ + "3|", + "j" + ], + [ + "*OS", + "C/3=O/3=O" + ], + [ + "1*N", + "C(CCCCCC$" + ], + [ + "f3|f", + "6" + ], + [ + "b6-", + "d1" + ], + [ + "[C@@]", + "3" + ], + [ + "c?-", + "m1" + ], + [ + "m2-", + "n1" + ], + [ + "ad", + "122" + ], + [ + "i3-", + "j2" + ], + [ + "122", + "m" + ], + [ + "*", + "I" + ], + [ + "4|d", + "6|" + ], + [ + "/3C", + "O/6=O" + ], + [ + "/3CO/6=O", + "/3C" + ], + [ + "a211", + "1" + ], + [ + "h", + "U" + ], + [ + "3-", + "6" + ], + [ + "d?-", + "e2" + ], + [ + "g2-", + "f3|f6" + ], + [ + "/10=O", + "(" + ], + [ + "a1122", + "A-1b" + ], + [ + "a6-", + "i1" + ], + [ + "a?-", + "f1" + ], + [ + "ERROR1-", + "ERROR" + ], + [ + "n", + "1-" + ], + [ + "6", + "~n" + ], + [ + "*OPO", + "CCN" + ], + [ + "3|", + "k" + ], + [ + "3|", + "h" + ], + [ + "e", + "t" + ], + [ + "-2", + "b" + ], + [ + "e", + "4|" + ], + [ + "O/", + "4" + ], + [ + " ", + "@" + ], + [ + "p", + "2-" + ], + [ + "3|", + "d" + ], + [ + "C", + "^S" + ], + [ + "CC", + "=C" + ], + [ + "ax11", + "xh-1u" + ], + [ + "b?-", + "d1" + ], + [ + "4|", + "b" + ], + [ + "4|", + "h" + ], + [ + "4", + "}" + ], + [ + "5", + "*OC(CCCCCC$4)/3=O" + ], + [ + "ax12", + "xh-1u" + ], + [ + "?", + "*OSO/3=O/3=O" + ], + [ + "4|", + "c" + ], + [ + "(C)", + "C" + ], + [ + "3|", + "e" + ], + [ + "p4-", + "q1" + ], + [ + "*OP^XOCCN", + "C/7C/7C/3O/3=O" + ], + [ + "-2", + "a" + ], + [ + "f", + "4|" + ], + [ + "q", + "4-" + ], + [ + "u2112", + "A" + ], + [ + "C", + "=C" + ], + [ + "/7", + ")O(" + ], + [ + "{3}", + "[C@@H](O)" + ], + [ + "c4-", + "f1" + ], + [ + "xxxx", + "h" + ], + [ + "*OC(CCCCCC$", + "4/7)OC" + ], + [ + "F", + "F" + ], + [ + "1-", + "b" + ], + [ + "5", + "*OC(CCCCCC$4)" + ], + [ + "c4-", + "h1" + ], + [ + "a2122", + "m-1x" + ], + [ + "/3(CCCCCC$1", + "0" + ], + [ + "/3(CCCCCC$10", + ")/3(CCCCCC$1" + ], + [ + "p3-", + "q1" + ], + [ + "a1", + "11" + ], + [ + "C", + "^X" + ], + [ + "ha122h-2", + "x" + ], + [ + "e", + "E" + ], + [ + "@a", + "c" + ], + [ + ")/3(CCCCCC$1", + "4)" + ], + [ + "*OSiCC/4C/4", + "C" + ], + [ + "*OSiCC/4C/4C", + "/3(CCCCCC$" + ], + [ + "*OSiCC/4C/4C/3(CCCCCC$", + "8" + ], + [ + "*OSiCC/4C/4C/3(CCCCCC$8", + ")/3(CCCCCC$14)" + ], + [ + "b6-", + "e1" + ], + [ + "a6-", + "m1" + ], + [ + "a2222", + "h-1b" + ], + [ + "a?-", + "l1" + ], + [ + "k?-", + "l2" + ], + [ + "@ac", + "id" + ], + [ + "x", + "m-1" + ], + [ + "x", + "y" + ], + [ + "1222", + "h" + ], + [ + "ic", + "@acid" + ], + [ + "d3-", + "e2" + ], + [ + "h", + "xxxxh" + ], + [ + "k?-", + "o1" + ], + [ + "gen", + "in" + ], + [ + "q", + "3-" + ], + [ + "CC^", + "E" + ], + [ + "a1221m-1", + "b" + ], + [ + "C", + "=O" + ], + [ + "c5-", + "d1" + ], + [ + "d", + "x" + ], + [ + "/3(CCCCCC$10)/3(CCCCCC$1", + "6)" + ], + [ + "2", + "*F" + ], + [ + "axx", + "xh-1x" + ], + [ + "E", + "E" + ], + [ + "g6-", + "h1" + ], + [ + "hy", + "d" + ], + [ + "r?-", + "s1" + ], + [ + "axxxx", + "xh-1x" + ], + [ + "O/", + "2" + ], + [ + "b6-", + "g1" + ], + [ + "F/4", + "F/4" + ], + [ + "a2222", + "h-1x" + ], + [ + "hyd", + "ro" + ], + [ + "a1122", + "m-1x" + ], + [ + "CCCC", + "C$" + ], + [ + "S", + "(CCCCCC$" + ], + [ + "a3344", + "h-1a" + ], + [ + "}C", + "O)" + ], + [ + "a?|b?|c?|d?|e?|f?|g", + "?}" + ], + [ + "i4-", + "k1" + ], + [ + "B", + "r" + ], + [ + "ad222", + "m-1b" + ], + [ + "u2", + "12" + ], + [ + "z", + "z" + ], + [ + "a211", + "h-1b" + ], + [ + "3|c", + "3|d" + ], + [ + "p", + "2" + ], + [ + "6", + "~" + ], + [ + "5", + "*OCC/3=O" + ], + [ + "c?-", + "d2" + ], + [ + "3|b", + "3|c3|d" + ], + [ + "o", + "n" + ], + [ + "a6-", + "n1" + ], + [ + "a6-", + "o1" + ], + [ + "=O", + "/5" + ], + [ + "?|", + "W" + ], + [ + "?|", + "X" + ], + [ + "?|", + "Y" + ], + [ + "?|W", + "?|X" + ], + [ + "?|W?|X", + "?|Y" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V", + "?|W?|X?|Y" + ], + [ + "s", + "?-" + ], + [ + "3|b3|c3|d", + "3|e" + ], + [ + "CCCCCCCCCC", + "C/5O/3=O" + ], + [ + "4|", + "j" + ], + [ + "6|", + "h" + ], + [ + "g?-", + "i1" + ], + [ + "6|", + "c" + ], + [ + "6|", + "d" + ], + [ + "*C", + "l" + ], + [ + "g4-", + "i1" + ], + [ + "*", + "/3CO/6=O/3C" + ], + [ + "h6-", + "i1" + ], + [ + "6|", + "b" + ], + [ + "u", + "12" + ], + [ + "3|b3|c3|d3|e", + "3|f" + ], + [ + "=C", + "1" + ], + [ + "F/4F/4", + "F/3=O" + ], + [ + "h4", + "h" + ], + [ + "6|", + "i" + ], + [ + "a", + "6|b" + ], + [ + "i?-", + "l1" + ], + [ + "h4-", + "j1" + ], + [ + "r", + "4-" + ], + [ + "*", + "Br" + ], + [ + "e?-", + "f2" + ], + [ + "d", + "i" + ], + [ + "xm-1", + "u" + ], + [ + "c4-", + "i1" + ], + [ + "f4-", + "h1" + ], + [ + "2", + "*OPO/3O/3=O" + ], + [ + "w", + "1" + ], + [ + "k", + "1-" + ], + [ + "e", + "6|" + ], + [ + "a2122", + "m-1a" + ], + [ + "3|b3|c3|d3|e3|f", + "3|g" + ], + [ + "=O", + "/3C" + ], + [ + "q", + "2-" + ], + [ + "2", + "(C)" + ], + [ + "2", + "C" + ], + [ + "6|", + "g" + ], + [ + "f", + "6|g" + ], + [ + "u2122", + "m" + ], + [ + "hydro", + "xy" + ], + [ + "/4)", + "CN" + ], + [ + "3|", + "o" + ], + [ + "c4-", + "k1" + ], + [ + "d", + "22h" + ], + [ + "n?-", + "o2" + ], + [ + "*OPOCCN", + "/3O/3=O" + ], + [ + "4", + "/8" + ], + [ + "a1", + "1" + ], + [ + "j", + "1-" + ], + [ + "3|b3|c3|d3|e3|f3|g", + "3|h" + ], + [ + "CCCCCCCC", + "C/3=O" + ], + [ + "d6-", + "f1" + ], + [ + "/2", + "=O" + ], + [ + "a2112", + "A-1b" + ], + [ + "22", + "h-1b" + ], + [ + "j3-", + "k2" + ], + [ + "}", + "[C@@H](O)" + ], + [ + "a?-", + "j1" + ], + [ + "d6-", + "h1" + ], + [ + "[C@H]", + "1" + ], + [ + "a122h-1", + "b" + ], + [ + "7", + "-b1" + ], + [ + "g6-", + "i1" + ], + [ + "a1", + "x2" + ], + [ + "3|b3|c3|d3|e3|f3|g3|h", + "3|i" + ], + [ + "3|", + "l" + ], + [ + "a1", + "*OPO*/3O/3=O" + ], + [ + "k6-", + "o1" + ], + [ + "6|", + "j" + ], + [ + "a1-d", + "3~n" + ], + [ + "q3-", + "r1" + ], + [ + "3|", + "n" + ], + [ + "c", + "7-" + ], + [ + "a2", + "8-b1" + ], + [ + "b?-", + "h1" + ], + [ + "6", + "*OCCCC" + ], + [ + "d6-", + "g1" + ], + [ + "a?|b?|c?|d?|e", + "?}*OSO/3=O/3=O" + ], + [ + "u2", + "2" + ], + [ + "a21", + "EE" + ], + [ + "c", + "c" + ], + [ + "e", + "r" + ], + [ + "u", + "4" + ], + [ + "4", + "*OP^XOP^XOCCN/5O/5=O/3O/3=O" + ], + [ + "b4-", + "f1" + ], + [ + "g3-", + "h2" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k", + "?}" + ], + [ + "a6-", + "r1" + ], + [ + "b2-", + "d1" + ], + [ + "e3-", + "g1" + ], + [ + "O/4", + "=O/3C" + ], + [ + "a?-", + "b2" + ], + [ + "dx", + "dh" + ], + [ + "h", + "dxdh" + ], + [ + "{3}[C@@H](O)", + "CC[C@]" + ], + [ + "4", + "*OCCCC" + ], + [ + "=^Z", + "CCCCCC/3=O" + ], + [ + "/7)O(", + "/6)" + ], + [ + "a21", + "eE" + ], + [ + "P", + "O" + ], + [ + "O/2", + "=O" + ], + [ + "a6-", + "g1" + ], + [ + "ax12", + "xh-1d" + ], + [ + "d", + "d1" + ], + [ + "d", + "7-" + ], + [ + "u", + "122h" + ], + [ + "a", + "7-b1" + ], + [ + "a", + "8-" + ], + [ + "m3-", + "n2" + ], + [ + "ad122", + "m-1b" + ], + [ + "o", + "3|o" + ], + [ + "b", + "5-" + ], + [ + "Cl", + "/3=O" + ], + [ + "c4-", + "g1" + ], + [ + "1", + "A" + ], + [ + "d", + "d2" + ], + [ + "/10=O(", + "/4)*2" + ], + [ + "3|", + "m" + ], + [ + "C", + "O/4=O/3C" + ], + [ + "axxxx", + "A-1x" + ], + [ + "a1112", + "h-1b" + ], + [ + "3*OCC", + "=C" + ], + [ + "o3|o", + "6" + ], + [ + "p2-", + "o3|o6" + ], + [ + "O/", + "7" + ], + [ + "h?-", + "j1" + ], + [ + "i", + "1-" + ], + [ + "q4-", + "r1" + ], + [ + "CC=C", + "4" + ], + [ + "e?-", + "i1" + ], + [ + "A", + "" + ], + [ + "a111", + "1" + ], + [ + "a2d", + "12" + ], + [ + "a5", + "-" + ], + [ + "a4334", + "h-1x" + ], + [ + "ERROR1-ERROR", + "2" + ], + [ + "[C@@]", + "(C)" + ], + [ + "a1-", + "f" + ], + [ + "c6-", + "m1" + ], + [ + "2", + "/5" + ], + [ + "a", + "b" + ], + [ + "i?-", + "k1" + ], + [ + "a?-", + "k1" + ], + [ + "4/8", + ")O(" + ], + [ + "d1", + "1h" + ], + [ + "h", + "222h" + ], + [ + "/7", + "=O/5" + ], + [ + "a6-", + "h1" + ], + [ + "[C@]", + "5" + ], + [ + "$", + "4)" + ], + [ + "*OC(CCCCCC$", + "4/8)O(" + ], + [ + "6*OC(CCCCCC$4)", + "/3(CCCCCC$10)/3(CCCCCC$16)" + ], + [ + "6|", + "k" + ], + [ + "u2", + "1" + ], + [ + "4", + "/5" + ], + [ + "c3-", + "d2" + ], + [ + "CC", + "(C)" + ], + [ + "a?|b?|c?|d?|e?|f", + "?}*OSO/3=O/3=O" + ], + [ + "r", + "2-" + ], + [ + "d2", + "|" + ], + [ + "([H]", + ")C" + ], + [ + "344", + "h" + ], + [ + "h1", + "122h" + ], + [ + "*OC(CCCCCC$4/8)O(", + "/7)O(/6)" + ], + [ + "*OC(CCCCCC$4/8)O(/7)O(/6)", + "O/3=O" + ], + [ + "2", + ")" + ], + [ + "a?-", + "g1" + ], + [ + "n2-", + "8" + ], + [ + "e3-", + "f2" + ], + [ + "*", + "(CCCCCC$" + ], + [ + "{", + "7" + ], + [ + "a21", + "FF" + ], + [ + "a2221", + "m-1a" + ], + [ + "a?|b?|c?|d", + "?}*OSO/3=O/3=O" + ], + [ + "3|b3|c3|d3|e3|f3|g3|h3|i", + "3|j" + ], + [ + "a1-", + "d2" + ], + [ + "a1-c", + "3~n" + ], + [ + "a1-d", + "4~n" + ], + [ + "6", + "*S" + ], + [ + "3", + ")" + ], + [ + "dd1", + "dh" + ], + [ + "(", + "N" + ], + [ + "a12", + "12" + ], + [ + "i6-", + "j1" + ], + [ + "d?-", + "k1" + ], + [ + "dd2", + "dh" + ], + [ + "l", + "1-" + ], + [ + "2", + "*O" + ], + [ + "c", + "8-" + ], + [ + "r", + "2" + ], + [ + "(", + "CC" + ], + [ + "Aa", + "d2" + ], + [ + "m4-", + "o1" + ], + [ + "}C(O)", + "=O)" + ], + [ + "?|", + "Z" + ], + [ + "?|Z", + "?|a" + ], + [ + "?|Z?|a", + "a?|" + ], + [ + "?|Z?|aa?|", + "ab" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V?|W?|X?|Y", + "?|Z?|aa?|ab" + ], + [ + "h", + "8-" + ], + [ + "3|", + "p" + ], + [ + "[C@H](O)", + "C" + ], + [ + "a4-", + "d1" + ], + [ + "d", + "22" + ], + [ + "h8-", + "i2" + ], + [ + "1", + "*OC" + ], + [ + "^XO", + "*/3CO/6=O/3C" + ], + [ + "l?-", + "m2" + ], + [ + "r4-", + "s1" + ], + [ + "A", + "2" + ], + [ + "Q", + "Q" + ], + [ + "d", + "1-c3|c6" + ], + [ + "r", + "3-" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?" + ], + [ + "c4-", + "j1" + ], + [ + ")C", + "l" + ], + [ + "7", + "*N" + ], + [ + "C/1", + "0=O" + ], + [ + "f?-", + "h1" + ], + [ + "1", + "*OP^XOCCNC/7C/7C/3O/3=O" + ], + [ + "C(CCCCCC$", + "4)/3=O" + ], + [ + "3*OC", + "^R" + ], + [ + "9", + "*OCC/3=O" + ], + [ + "[C@]", + "3" + ], + [ + "8", + "*N" + ], + [ + "n", + "6-" + ], + [ + "g6-", + "j1" + ], + [ + "i6-", + "l1" + ], + [ + "3", + "*OPO/3O/3=O" + ], + [ + "s", + "t" + ], + [ + "b", + "3" + ], + [ + "s", + "2-" + ], + [ + "u1", + "1222h" + ], + [ + "3", + "*F" + ], + [ + "4|", + "k" + ], + [ + "ad", + "22h-1b" + ], + [ + "u1", + "122m" + ], + [ + "2*OCC", + "C/4C/4C/3=O" + ], + [ + "a?-", + "m1" + ], + [ + "f6-", + "h1" + ], + [ + "a", + "8-b1" + ], + [ + "a1", + "x1" + ], + [ + "a?-", + "i1" + ], + [ + "({2", + "8" + ], + [ + "3", + "*OSiC/3C/3C" + ], + [ + ",", + "2" + ], + [ + "7", + "*NCC/3=O" + ], + [ + "a?-", + "n1" + ], + [ + "axx1", + "xh-1u" + ], + [ + "CCCCCCCC", + "CC/3=O" + ], + [ + "s?-", + "t1" + ], + [ + "3", + "*NCC" + ], + [ + "[C@]", + "1" + ], + [ + "CCCCCCCC", + "CCCC" + ], + [ + "b", + "1-b" + ], + [ + "p?-", + "q2" + ], + [ + ")O", + "C/3=O" + ], + [ + "4", + "(C)" + ], + [ + "6*OCC", + "C/4C/4C/3=O" + ], + [ + "CN(CCCCCC$", + "5" + ], + [ + "C", + "1" + ], + [ + "1-a", + "4|" + ], + [ + "2*N", + "CC" + ], + [ + "4*N", + "C=O" + ], + [ + "2*NC", + "O" + ], + [ + "3|b3|c3|d3|e3|f3|g3|h3|i3|j", + "3|k" + ], + [ + "3", + "*O" + ], + [ + "c?-", + "n1" + ], + [ + "n2-", + "o1" + ], + [ + "x", + "m" + ], + [ + "4|", + "g" + ], + [ + "uxx", + "2" + ], + [ + "x", + "A-1" + ], + [ + "e4|", + "e6|" + ], + [ + "a2", + "|" + ], + [ + "1-a4|", + "a6|b" + ], + [ + "1-a4|a6|b", + "4|b" + ], + [ + "1-a4|a6|b4|b", + "6|c" + ], + [ + "1-a4|a6|b4|b6|c", + "4|c" + ], + [ + "1-a4|a6|b4|b6|c4|c", + "6|d" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d", + "4|d6|" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|", + "e4|e6|" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|", + "f4|" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|", + "f6|g" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g", + "4|g" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g", + "6|h" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h", + "4|h" + ], + [ + "*/2", + "C" + ], + [ + "u212", + "1A" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h", + "6|i" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i", + "4|i" + ], + [ + "j6-", + "k2" + ], + [ + "(", + "$" + ], + [ + "1-d", + "4|d6|" + ], + [ + "i6-", + "j2" + ], + [ + "CCCCCCCC", + "CCCCCC" + ], + [ + "t", + "2-" + ], + [ + "(", + "OC" + ], + [ + "a1211", + "h-1x" + ], + [ + "a6-", + "p1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m", + "?}" + ], + [ + "a4344", + "h-1x" + ], + [ + "a1221", + "h-1a" + ], + [ + "=^E", + "C(CCCCCC$" + ], + [ + "a1112", + "h-1x" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l", + "?}" + ], + [ + "c8-", + "d2" + ], + [ + "(", + "O" + ], + [ + "3|p", + "6" + ], + [ + "p", + "3|p6" + ], + [ + "q2-", + "p3|p6" + ], + [ + "d1", + "1" + ], + [ + "y", + "c" + ], + [ + "a1122", + "A-1x" + ], + [ + "n", + "3|n" + ], + [ + "@=@SMILES@", + "CC" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i", + "6|j" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j", + "4|j" + ], + [ + "a1211", + "h-1b" + ], + [ + "h6-", + "j1" + ], + [ + "u2", + "22h" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?" + ], + [ + "d2|", + "e2" + ], + [ + "o?-", + "p2" + ], + [ + "N", + "CC$" + ], + [ + "c2", + "|" + ], + [ + "l4-", + "n1" + ], + [ + "=", + "{5" + ], + [ + "n3|n", + "6" + ], + [ + "o2-", + "n3|n6" + ], + [ + "(", + "CCCC" + ], + [ + "=", + "N" + ], + [ + "[C@@H]", + "1" + ], + [ + "g?-", + "j1" + ], + [ + "r", + "i" + ], + [ + "CC^E", + "CC^Z" + ], + [ + "b2", + "|" + ], + [ + "b5-", + "c1" + ], + [ + "3", + "*OSiCC/4C/4C/3C/3C" + ], + [ + "C=^Z", + "CCCCCCCCC/3=O" + ], + [ + "n2", + "*1O" + ], + [ + "O/2=O", + "/2=O" + ], + [ + "/3", + "O" + ], + [ + "CCCCCCCCCC", + "C/3=O" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n", + "?}" + ], + [ + "6", + "*OSiCC/4C/4C/3(CCCCCC$8)/3(CCCCCC$14)" + ], + [ + "a2|", + "b2|" + ], + [ + "a2|b2|", + "c2|" + ], + [ + "axx2", + "xh-1d" + ], + [ + "axx2", + "xh-1u" + ], + [ + "*O", + "*/2C" + ], + [ + "b?-", + "i1" + ], + [ + "r3-", + "s1" + ], + [ + "A", + "1" + ], + [ + "=^ZCCC", + "=^ZCCCCCC/3=O" + ], + [ + "a2|b2|c2|", + "d2|e2" + ], + [ + "e6-", + "g1" + ], + [ + "j6-", + "k1" + ], + [ + "o4-", + "q1" + ], + [ + "a", + "d2" + ], + [ + "C(", + "CCCC" + ], + [ + "2", + "*OSiC/3C/3C" + ], + [ + "6", + "/9" + ], + [ + "u", + "112" + ], + [ + "/4)CN", + "*2" + ], + [ + "6", + "n2-8" + ], + [ + "6n2-8", + "n1*1O(CCCCCC$3/6)N" + ], + [ + "m", + "1-" + ], + [ + "m6-", + "n2" + ], + [ + "6", + "*F" + ], + [ + "[C@@]", + "2" + ], + [ + "CCCCCC", + "C/3=O" + ], + [ + "=", + "^X" + ], + [ + "=O", + "/3=O" + ], + [ + "hU", + "122h" + ], + [ + "/", + "11" + ], + [ + "s", + "4-" + ], + [ + "2", + "*C" + ], + [ + "c2-", + "e1" + ], + [ + "xA-1", + "u" + ], + [ + "3*OC^R", + "CO/4=O/3C" + ], + [ + "a?-", + "h1" + ], + [ + "(C)", + "CC" + ], + [ + "a?|b?|c", + "?}*OC" + ], + [ + "6", + "*I" + ], + [ + "6", + "*O" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?" + ], + [ + "xx", + "xh" + ], + [ + "2(C)", + "[C@@]3" + ], + [ + "n4-", + "p1" + ], + [ + "h3-", + "i2" + ], + [ + "ic", + "~" + ], + [ + "y", + "1" + ], + [ + "a222", + "h-1x" + ], + [ + "e", + "7-" + ], + [ + "h", + "1-" + ], + [ + "11", + "/1" + ], + [ + "3*OCC", + "C^X" + ], + [ + "4", + "*F" + ], + [ + "}C(O)", + "=C" + ], + [ + "xh", + "-2x" + ], + [ + "6", + "*OSiCC/4C/4C/3C/3C" + ], + [ + "k4-", + "m1" + ], + [ + "{1", + "6}" + ], + [ + "7", + "*OCC/3=O" + ], + [ + "6", + "*NCC" + ], + [ + "O", + "($" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j", + "6|k" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k", + "4|k" + ], + [ + "334", + "h" + ], + [ + "CC^Z", + "CC^Z" + ], + [ + "k", + "3|k" + ], + [ + "[C@]", + "(C)" + ], + [ + "k3-", + "l2" + ], + [ + "*OPO", + "PO" + ], + [ + "4|b", + "4|c" + ], + [ + "4|b4|c", + "4|d" + ], + [ + "4|b4|c4|d", + "4|" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?" + ], + [ + "6)", + "/3=O" + ], + [ + "[C@@]", + "4" + ], + [ + "a?-", + "o1" + ], + [ + "1-a", + "4|b4|c4|d4|" + ], + [ + "ax", + "22" + ], + [ + "c?-", + "o1" + ], + [ + "s", + "3-" + ], + [ + "*OC(CCCCCC$", + "4/7)" + ], + [ + "*OC(CCCCCC$4/7)", + "C/3=O" + ], + [ + "3|", + "q" + ], + [ + "3*C", + "O" + ], + [ + "{", + "3" + ], + [ + "2*NCCC", + "^R" + ], + [ + "a6-", + "b2" + ], + [ + "ol", + "e" + ], + [ + "/7=O/5", + "CCCCCCCCCCC/3=O" + ], + [ + "3|b3|c3|d3|e3|f3|g3|h3|i3|j3|k", + "3|l" + ], + [ + "}C", + "1" + ], + [ + "4", + "*OSiC/3C/3C" + ], + [ + "a1221", + "h-1x" + ], + [ + "e4|", + "f4|" + ], + [ + "uxx2", + "xh" + ], + [ + "a12", + "1" + ], + [ + "j?-", + "m1" + ], + [ + "[C@H]", + "3" + ], + [ + "a1-c", + "4~n" + ], + [ + "d", + "xx" + ], + [ + "3|", + "r" + ], + [ + "k3|k", + "6" + ], + [ + "l2-", + "k3|k6" + ], + [ + ")", + "F" + ], + [ + "?}-{", + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C" + ], + [ + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C", + "?" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C", + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?" + ], + [ + "d1", + "11" + ], + [ + "a1-b", + "4~n" + ], + [ + "a3-", + "d1" + ], + [ + "ux", + "12" + ], + [ + "{", + "8" + ], + [ + "(", + "/6)" + ], + [ + "6|", + "l" + ], + [ + "[C@H]", + "4" + ], + [ + "f3-", + "h1" + ], + [ + "j", + "3|j" + ], + [ + "-", + "3" + ], + [ + "5", + "*OPO*/3O/3=O" + ], + [ + "6", + "*OS(CCCCCC$4/7)C/3=O/3=O" + ], + [ + "h6-", + "k1" + ], + [ + "4", + "}C(O)" + ], + [ + "N", + "$" + ], + [ + "C", + ")C" + ], + [ + "e4|f4|", + "g" + ], + [ + "i", + "3|i" + ], + [ + "1-a4|b4|c4|d4|", + "e4|f4|g" + ], + [ + "=", + "C/" + ], + [ + "211", + "1m" + ], + [ + "=^X", + "CC" + ], + [ + "CC$", + "2" + ], + [ + "a?-", + "r1" + ], + [ + "axx", + "21" + ], + [ + "CN", + "$" + ], + [ + "N", + "CCO" + ], + [ + "a5-", + "c1" + ], + [ + "b3-", + "e1" + ], + [ + "z", + "1" + ], + [ + "=^EC(CCCCCC$", + "6/9" + ], + [ + "?", + "%" + ], + [ + "u2", + "222h" + ], + [ + "b?-", + "j1" + ], + [ + "g", + "1-a?|b?|c?|d?|e?|f?}" + ], + [ + "i6-", + "k1" + ], + [ + "6", + "*OCCCCCCCC" + ], + [ + "d", + "12h" + ], + [ + "3*OCC", + "C/4C/4C/3=O" + ], + [ + "C", + ")" + ], + [ + "d1", + "11h" + ], + [ + "d2", + "21h" + ], + [ + "d4-", + "j1" + ], + [ + "ad", + "112" + ], + [ + "4|", + "l" + ], + [ + "j3|j", + "6" + ], + [ + "k2-", + "j3|j6" + ], + [ + "CC", + "^R" + ], + [ + "m?-", + "p1" + ], + [ + "{1", + "}" + ], + [ + "/1", + "5" + ], + [ + "a21", + "d2" + ], + [ + "a4344", + "h-1b" + ], + [ + "6", + "*OPOCCN/3O/3=O" + ], + [ + "a1", + "d21" + ], + [ + "3|q", + "6" + ], + [ + "C", + "=^ZCCC=^ZCCC" + ], + [ + "q", + "3|q6" + ], + [ + "r2-", + "q3|q6" + ], + [ + "*", + "/5O/5=O/3O/3=O" + ], + [ + "hy", + "l" + ], + [ + ",", + "1" + ], + [ + "3|", + "s" + ], + [ + "g", + "l" + ], + [ + "O", + "*2" + ], + [ + "3|r", + "6" + ], + [ + "e7-", + "f1" + ], + [ + "r", + "3|r6" + ], + [ + "s2-", + "r3|r6" + ], + [ + "a", + "m" + ], + [ + "a1-d", + "3~" + ], + [ + "6", + "*Br" + ], + [ + "a1111", + "h-1a" + ], + [ + "g", + "8-" + ], + [ + "O/", + "8" + ], + [ + "4", + "[C@@](C)" + ], + [ + "4[C@@](C)", + "3" + ], + [ + "=^XCC", + "/3O" + ], + [ + "CCCC", + "$" + ], + [ + "ux12", + "xh" + ], + [ + "C/10=O", + "(" + ], + [ + "[C@@]", + "1" + ], + [ + "g8-", + "h2" + ], + [ + "n1", + "*1" + ], + [ + "O/5", + "O/5=O/3O/3=O" + ], + [ + "a1122", + "m-1b" + ], + [ + "a2212", + "h-1b" + ], + [ + "ax", + "1" + ], + [ + "l?-", + "p1" + ], + [ + "Ad2", + "zz" + ], + [ + "s", + "3|s" + ], + [ + "=^E", + "C(" + ], + [ + "n", + "2*OC" + ], + [ + "ole", + "an" + ], + [ + "5", + "*OPO/3O/3=O" + ], + [ + "[C@@]", + "5" + ], + [ + "ad", + "122h-1" + ], + [ + "s3|s", + "6" + ], + [ + "t2-", + "s3|s6" + ], + [ + "?|", + "ad" + ], + [ + "?|a", + "c" + ], + [ + "?|ac", + "?|ad" + ], + [ + "a?-", + "p1" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V?|W?|X?|Y?|Z?|aa?|ab", + "?|ac?|ad" + ], + [ + "et", + "hyl" + ], + [ + "i3|i", + "6" + ], + [ + "j4-", + "l1" + ], + [ + "*OPO*/3O/3=O", + "~n" + ], + [ + "5", + "*OC" + ], + [ + "O", + "/3O/3=O" + ], + [ + "a2211", + "h-1x" + ], + [ + "l6-", + "p1" + ], + [ + "*(CCCCCC$", + "2/5" + ], + [ + "Ad1", + "zz" + ], + [ + "j?-", + "l1" + ], + [ + "7", + "*OP^XOCCN/3O/3=O" + ], + [ + "}C", + "(" + ], + [ + ")O", + "C(" + ], + [ + "({28", + "}C(O)=O)" + ], + [ + "a6-", + "q1" + ], + [ + "j6-", + "m1" + ], + [ + "p4-", + "r1" + ], + [ + "([H])", + "CC[C@]" + ], + [ + "c4-", + "l1" + ], + [ + "m", + "3|m" + ], + [ + "%", + "?%" + ], + [ + "j2-", + "i3|i6" + ], + [ + "(C)", + "/" + ], + [ + "2", + "*I" + ], + [ + "CC", + "C/3=O" + ], + [ + "a1-c", + "3~" + ], + [ + "a2222", + "h-1a" + ], + [ + "gl", + "yc" + ], + [ + "Aa", + "d21" + ], + [ + "a4-", + "b2" + ], + [ + "a?|b?|c", + "?}*OCC/3=O" + ], + [ + "d7-", + "e1" + ], + [ + "a2-", + "c1" + ], + [ + "d2", + "h" + ], + [ + "a2d12", + "m-1a" + ], + [ + "n", + "1-4" + ], + [ + "*", + "(N" + ], + [ + "k?-", + "n1" + ], + [ + "s4-", + "t1" + ], + [ + "a21EE", + "A-1a" + ], + [ + "a2211", + "h-1a" + ], + [ + "a", + "r" + ], + [ + "a1-d2", + "~n" + ], + [ + "o", + "s" + ], + [ + "1*NC(CCCCCC$", + "4/5" + ], + [ + "a2212", + "h-1x" + ], + [ + "ax", + "21" + ], + [ + "l?-", + "n1" + ], + [ + "CN(CCCCCC$", + "12" + ], + [ + "a2121", + "h-1b" + ], + [ + "x", + "21" + ], + [ + "x2", + "h" + ], + [ + "4", + "4" + ], + [ + "?", + "*OPO/3O/3=O" + ], + [ + "N", + "C$" + ], + [ + "f", + "1-a?|b?|c?|d?|e?}" + ], + [ + "h6-", + "l1" + ], + [ + "Aad2", + "2111m" + ], + [ + "d21", + "h" + ], + [ + "s3-", + "t1" + ], + [ + "/1", + "0" + ], + [ + "l?-", + "q1" + ], + [ + "m3|m", + "6" + ], + [ + "n2-", + "m3|m6" + ], + [ + "([H])", + "CC=C4" + ], + [ + "o", + "ic@acid" + ], + [ + "9", + "-b1" + ], + [ + "a1-b", + "3~n" + ], + [ + "a222", + "h-1a" + ], + [ + "|", + "f2" + ], + [ + "1", + "*OCCCCCCCC" + ], + [ + "a1222", + "h-1a" + ], + [ + "a2|b2|c2|d2|e2", + "|f2" + ], + [ + "222", + "m" + ], + [ + "7", + "*OPO/3O/3=O" + ], + [ + "a1-", + "a" + ], + [ + "t", + "ri" + ], + [ + "a1-e", + "3~n" + ], + [ + "6", + "*OP^XOCCNC/7C/7C/3O/3=O" + ], + [ + "a2221", + "h-1b" + ], + [ + "ol", + "@=@SMILES@C" + ], + [ + "#", + "N" + ], + [ + "2*N", + "C(CCCCCC$4)/3=O" + ], + [ + "c3-", + "f1" + ], + [ + "O/", + "9" + ], + [ + "p", + "6-" + ], + [ + "t", + "?-" + ], + [ + "/4)*2", + "/10=O" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k4|k", + "6|l" + ], + [ + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k4|k6|l", + "4|l" + ], + [ + "a", + "c" + ], + [ + "4|h", + "4|i" + ], + [ + "C/", + "2" + ], + [ + "C=^Z", + "CCCCCCC/3=O" + ], + [ + "a", + "d21" + ], + [ + "a1", + "*OC" + ], + [ + "a1121", + "A-1a" + ], + [ + "a1x2", + "xh-1u" + ], + [ + "o", + "genin" + ], + [ + "?|i", + "?}" + ], + [ + "[C@]", + "2" + ], + [ + "a6-", + "u1" + ], + [ + "ad222", + "m-1x" + ], + [ + "xx", + "h" + ], + [ + "3*OCC", + "C^R" + ], + [ + "C", + "F/4F/4F/3=O" + ], + [ + "CF/4F/4F/3=O", + "/3=O" + ], + [ + "h", + "22" + ], + [ + "@a", + "glyc" + ], + [ + "@aglyc", + "on" + ], + [ + "CCC", + "NCC$" + ], + [ + "a1", + "d22" + ], + [ + "a1-", + "g" + ], + [ + "a4334", + "h-1b" + ], + [ + "b", + "3*N" + ], + [ + "d3-", + "g1" + ], + [ + "6", + "n1-4" + ], + [ + "a1-c", + "4~" + ], + [ + "A", + "4" + ], + [ + "[C@]", + "4" + ], + [ + "*OS", + "CF/4F/4F/3=O/3=O" + ], + [ + "6", + "*OSiC/3C/3C" + ], + [ + "6*OC", + "^XO*/3CO/6=O/3C" + ], + [ + "d6-", + "e2" + ], + [ + "C", + "=^ZCCC=^ZCCCCCC/3=O" + ], + [ + "a3344", + "h-1x" + ], + [ + "2*NCCC", + "^X" + ], + [ + "6", + "*Cl" + ], + [ + "a6-", + "s1" + ], + [ + "s", + "2" + ], + [ + "1-a4|b4|c4|d4|e4|f4|g", + "4|h4|i" + ], + [ + "a1211", + "h-1a" + ], + [ + "C(CCCCCC$", + "6)/3=O" + ], + [ + "C/", + "2C" + ], + [ + "[C@]", + "12" + ], + [ + "a2d", + "22" + ], + [ + "a6-", + "t1" + ], + [ + "o", + "1-" + ], + [ + "11", + "xh" + ], + [ + "CC^ECC^Z", + "$4)" + ], + [ + "O/", + "6" + ], + [ + "{", + "22" + ], + [ + "4-", + "6*OC^XO*/3CO/6=O/3C" + ], + [ + "d", + "8-" + ], + [ + "in", + "e" + ], + [ + "k?-", + "m1" + ], + [ + "x", + "22h" + ], + [ + ")", + "-" + ], + [ + "2*NCCC", + "^XO" + ], + [ + "h", + "21" + ], + [ + "n?-", + "q1" + ], + [ + "4", + "*OSC/3=O/3=O" + ], + [ + "a", + "d111" + ], + [ + "id", + "e" + ], + [ + "u", + "2-" + ], + [ + "6*S", + "O/2=O/2=O" + ], + [ + "a1-", + "c2" + ], + [ + "m", + "ethyl" + ], + [ + "t", + "2" + ], + [ + "=^Z", + "CCC/3=O" + ], + [ + "a3-", + "b2" + ], + [ + "h1", + "1" + ], + [ + "j1-", + "a?|b?|c?|d?|e?|f?|g?|h?|i?}" + ], + [ + "11/1", + "4)" + ], + [ + "a?-", + "s1" + ], + [ + "*N", + "*/2" + ], + [ + "3", + "*OC(CCCCCC$4/7)OC" + ], + [ + "a1-d", + "4~" + ], + [ + "a3-", + "e1" + ], + [ + "a?-", + "q1" + ], + [ + "c", + "(O)" + ], + [ + "a", + "l" + ], + [ + "6n1-4", + "n2*OC" + ], + [ + "[C@]5", + "([H])" + ], + [ + "ol", + "ic~" + ], + [ + "-", + "?" + ], + [ + "1", + "n1-" + ], + [ + "a1x1", + "xh-1u" + ], + [ + "3", + "*OP^XOCCN/3O/3=O" + ], + [ + "a1-", + "e2" + ], + [ + "a?|b?|c?|d", + "?}" + ], + [ + "(CCCCCC$", + "4)" + ], + [ + "*OP^XOP", + "O/5O/5=O/3O/3=O" + ], + [ + "4", + "*C" + ], + [ + "a2", + "6" + ], + [ + "x", + "h-1a" + ], + [ + "CC^ECC^Z$4)", + "/9" + ], + [ + "l3-", + "m2" + ], + [ + "(CCCCCC$4)", + "/3C" + ], + [ + "/3", + "=N" + ], + [ + "{1", + "4}" + ], + [ + "12", + "m" + ], + [ + "8", + "*(N" + ], + [ + "a1211", + "m-1a" + ], + [ + "2*OCC", + "=C" + ], + [ + "C/", + "9" + ], + [ + "a21FF", + "A-1a" + ], + [ + "f?-", + "i1" + ], + [ + "k6-", + "n1" + ], + [ + "122h-2", + "b" + ], + [ + "Aa", + "x21" + ], + [ + "Ad2d", + "d22h" + ], + [ + "c?-", + "q1" + ], + [ + "h", + "12" + ], + [ + "4", + "/6)" + ], + [ + "m?-", + "r1" + ], + [ + "Ad1d", + "d11h" + ], + [ + "a1222", + "h-1x" + ], + [ + "a?|b?|c?|d", + "?}*OC" + ], + [ + "*2", + "/6" + ], + [ + "5n2-6n1*1O(CCCCCC$3/6)N", + "CN(CCCCCC$12" + ], + [ + "a21eE", + "A-1a" + ], + [ + "u12", + "11h" + ], + [ + "a", + "344" + ], + [ + "a6-", + "b3*N" + ], + [ + "(C)", + "CC[C@@]" + ], + [ + "[C@H]", + "2" + ], + [ + "1", + "*OPO/3O/3=O" + ], + [ + "i1-", + "a?|b?|c?|d?|e?|f?|g?|h?}" + ], + [ + "2*N", + "=^XCC/3O" + ], + [ + "n1*1O", + "(CCCCCC$3" + ], + [ + "u4", + "344h" + ], + [ + "2*N", + "CCO" + ], + [ + "5", + "*OCC" + ], + [ + "=C", + "(C" + ], + [ + "a21EE", + "A-1x" + ], + [ + "q4-", + "s1" + ], + [ + "t", + "3-" + ], + [ + "=O", + ")C" + ], + [ + "Ad1d", + "d22h" + ], + [ + "[C@@H]", + "2" + ], + [ + "{2", + "}" + ], + [ + "122h-2", + "x" + ], + [ + "a21eE", + "A-1x" + ], + [ + "e", + "1-" + ], + [ + "f", + "7-" + ], + [ + "b6-", + "h1" + ], + [ + "k6-", + "l1" + ], + [ + "ud", + "222m" + ], + [ + "1-b", + "3|b" + ], + [ + "c4-", + "d2" + ], + [ + "C/", + "11" + ], + [ + "f6-", + "i1" + ], + [ + "g", + "1-" + ], + [ + "n3-", + "o2" + ], + [ + "{3}[C@@H](O)CC[C@]", + "2(C)[C@@]3" + ], + [ + "Ad2d", + "d11h" + ], + [ + "CCC", + "l" + ], + [ + "l?-", + "o1" + ], + [ + "c?-", + "p1" + ], + [ + "q?-", + "r2" + ], + [ + "y", + "l" + ], + [ + "/6", + "Cl" + ], + [ + "/6", + "Cl/3=O" + ], + [ + "/6Cl", + "/6Cl/3=O" + ], + [ + "C/4", + "O/3=O" + ], + [ + "CCCl", + "/6Cl/6Cl/3=O" + ], + [ + "b", + "1-" + ], + [ + ")O(", + "/8" + ], + [ + "A", + "a11" + ], + [ + "CC", + "^X" + ], + [ + "a1d21", + "m-1a" + ], + [ + "c6-", + "n1" + ], + [ + "2*NCO", + "CCCl/6Cl/6Cl/3=O" + ], + [ + "4", + "*OSiCC/4C/4C/3C/3C" + ], + [ + "c6-", + "d2" + ], + [ + "o", + "6-" + ], + [ + "#N", + "(" + ], + [ + "4", + "*NCC" + ], + [ + "5)", + "/3=O" + ], + [ + "6*N", + "CN(CCCCCC$5" + ], + [ + "C/10=O(", + "/4)*2" + ], + [ + "d8-", + "e2" + ], + [ + "", + "-?" + ], + [ + "h", + "axx" + ], + [ + "3|b3|c3|d3|e3|f3|g3|h3|i3|j3|k3|l", + "3|m" + ], + [ + "l", + "3|l" + ], + [ + "a?-", + "t1" + ], + [ + "m?-", + "q1" + ], + [ + "1", + "n2-" + ], + [ + "CC[C@]", + "3" + ], + [ + "a4-", + "e1" + ], + [ + "o", + "p" + ], + [ + "a21FF", + "A-1x" + ], + [ + "a2221", + "h-1x" + ], + [ + "B", + "1" + ], + [ + "d", + "5-" + ], + [ + "a?|b?|c", + "?}*OSO/3=O/3=O" + ], + [ + "x2", + "xh" + ], + [ + "/5", + "C/3=O" + ], + [ + "?", + "*OCC/3=O" + ], + [ + "a?|b?|c?|d?|e", + "?}*OC" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h", + "?}*OSO/3=O/3=O" + ], + [ + "d", + "d" + ], + [ + "ad", + "xx" + ], + [ + "e6-", + "f2" + ], + [ + "2", + "*OS(CCCCCC$4/7)C/3=O/3=O" + ], + [ + "a8-", + "b3" + ], + [ + "ad2", + "21" + ], + [ + "in", + "@=@SMILES@O" + ], + [ + "@", + "p" + ], + [ + "[C@H]", + "(C" + ], + [ + "(CCCCCC$3", + ")" + ], + [ + "/10=O(", + "/4)CN*2" + ], + [ + "CC^", + "S" + ], + [ + "u112", + "1h" + ], + [ + "=", + "{" + ], + [ + "@=@SMILES@CC", + "1" + ], + [ + "=^EC(CCCCCC$6/9", + ")O(/8" + ], + [ + "C", + "2" + ], + [ + "N$", + "2" + ], + [ + "j6-", + "n1" + ], + [ + "3*OCCCCCCCC", + "CCCCCCCC/3=O" + ], + [ + "FF", + "A" + ], + [ + "a1-e", + "4~n" + ], + [ + "h6-", + "i2" + ], + [ + "o2-", + "p1" + ], + [ + "β", + "," + ], + [ + "3*OCCC^X", + "CCCCCCCCCCC/5O/3=O" + ], + [ + "4*OCC", + "C/4C/4C/3=O" + ], + [ + "$", + "5" + ], + [ + "?|h", + "?}" + ], + [ + "6|c", + "6|d" + ], + [ + "c?-", + "r1" + ], + [ + "?-", + "?" + ], + [ + "@", + "olean" + ], + [ + "@olean", + "olic~" + ], + [ + "C/", + "12" + ], + [ + "axxxx", + "xh-1a" + ], + [ + "b4-", + "g1" + ], + [ + ")O(", + "/4)" + ], + [ + "3", + "*OS(CCCCCC$4/7)C/3=O/3=O" + ], + [ + "6|c6|d", + "6|" + ], + [ + "e", + "c" + ], + [ + "i", + "1-a?|b?|c?|d?|e?}" + ], + [ + "l3|l", + "6" + ], + [ + "m2-", + "l3|l6" + ], + [ + "|", + "g2" + ], + [ + "C/", + "6=O" + ], + [ + "/1", + "8" + ], + [ + "3", + "*S" + ], + [ + "=O", + ")O" + ], + [ + "@=@SMILES@O", + "{3}" + ], + [ + "a3344", + "m-1x" + ], + [ + "u1221", + "h" + ], + [ + "21", + "m" + ], + [ + "={5", + "4}C(O)" + ], + [ + ")", + "O/3=O" + ], + [ + "a1222", + "h-1b" + ], + [ + "f", + "1-" + ], + [ + "j?-", + "n1" + ], + [ + "4", + "*O" + ], + [ + "d6-", + "i1" + ], + [ + "h-1", + "u" + ], + [ + "{3}", + "[C@H](O)" + ], + [ + "/", + "12" + ], + [ + "/1", + "7" + ], + [ + "1-d", + "?|i?}" + ], + [ + "a?|b", + "?}*OSO/3=O/3=O" + ], + [ + "d4-", + "k1" + ], + [ + "{3}", + "[C@H](O)C" + ], + [ + "Aa", + "d" + ], + [ + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o", + "?}" + ], + [ + "1", + "0" + ], + [ + "12", + "[H]" + ], + [ + "122h-2", + "a" + ], + [ + "@", + "2" + ], + [ + "a?|b?|c?|d?|e?|f", + "?}*OC" + ], + [ + "}C(O)", + "C" + ], + [ + "2", + "*OSC/3=O/3=O" + ], + [ + "2", + "*OSiCC/4C/4C/3C/3C" + ] + ], + "metadata": { + "num_merges": 2000, + "vocab_size": 2114 + }, + "review_trace": { + "authority_generation": "r3_dependency_closed", + "bounded_distance_cache": true, + "development_or_excluded_rows_read_for_merge_learning": 0, + "fit_contributor_manifest": "review_bpe_fit_contributors.tsv.gz", + "fit_contributor_manifest_sha256": "4ec8dfaeacef355092313507ab71c628f48ddf1a4fe39e7663748060a07af297", + "fit_non_special_unit_occurrences": 4306785, + "fit_only_character_alphabet": [ + "\t", + " ", + "\"", + "#", + "$", + "%", + "'", + "(", + ")", + "*", + "+", + ",", + "-", + ".", + "/", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + ":", + "<", + "=", + ">", + "?", + "@", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "[", + "\\", + "]", + "^", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "{", + "|", + "}", + "~", + "Δ", + "α", + "β", + "γ", + "δ", + "ζ", + "ξ", + "С", + "’", + "′", + "″", + "→", + "−" + ], + "fit_only_character_alphabet_size": 104, + "fit_parent_count": 221899, + "fit_unique_non_special_unit_strings": 20949, + "max_token_length": null, + "merge_tie_rule": "highest_frequency_then_lexicographic_pair", + "minimum_pair_frequency": 2, + "num_merges_realized": 2000, + "num_merges_requested": 2000, + "official_submitted_artifacts_modified": false, + "parser": "fail_closed_parser_v3_exact_semantic_units", + "schema": "bertose_a5_later_role_train_only_bpe_v1", + "scientific_launch_authorized": false, + "successor_partition_sha256": "86a8c6742156683d502c93fc71b31b9a93450037d647e5a90db437a015bb3bbc", + "training_authorized": false + }, + "special_tokens": { + "[BRANCH_CLOSE]": 6, + "[BRANCH_OPEN]": 5, + "[END]": 3, + "[LINK]": 7, + "[MASK]": 4, + "[MOD]": 8, + "[PAD]": 0, + "[RESIDUE_ERROR]": 9, + "[START]": 2, + "[UNK]": 1 + }, + "token_to_id": { + "\t": 10, + " ": 11, + " @": 1066, + "\"": 12, + "#": 13, + "#N": 1824, + "#N(": 2010, + "$": 14, + "$4)": 1325, + "$5": 2063, + "%": 15, + "%?%": 1763, + "'": 16, + "(": 17, + "($": 1470, + "(/6)": 1642, + "(C": 374, + "(C)": 422, + "(C)/": 1765, + "(C)C": 1080, + "(C)CC": 1562, + "(C)CC[C@@]": 1958, + "(CC": 1366, + "(CCCC": 1510, + "(CCCCCC$": 216, + "(CCCCCC$3": 605, + "(CCCCCC$3)": 2045, + "(CCCCCC$3/6)": 709, + "(CCCCCC$3/6)N": 763, + "(CCCCCC$4)": 1924, + "(CCCCCC$4)/3C": 1931, + "(CCCCCC$4/7)": 891, + "(CCCCCC$4/7)C/3=O/3=O": 915, + "(N": 1357, + "(O": 1485, + "(O)": 429, + "(OC": 1475, + "([H]": 673, + "([H])": 766, + "([H])C": 1336, + "([H])CC=C4": 1807, + "([H])CC[C@]": 1760, + "({2": 978, + "({28": 1421, + "({28}C(O)=O)": 1756, + ")": 18, + ")-": 1890, + ")/3(CCCCCC$1": 811, + ")/3(CCCCCC$14)": 1107, + ")C": 643, + ")Cl": 1393, + ")F": 1633, + ")O": 453, + ")O(": 693, + ")O(/4)": 2073, + ")O(/8": 2001, + ")O/3=O": 2090, + ")OC": 790, + ")OC(": 1755, + ")OC/3=O": 1434, + "*": 19, + "*(CCCCCC$": 1345, + "*(CCCCCC$2/5": 1750, + "*(N": 1779, + "*/2": 975, + "*/2C": 1465, + "*/3CO/6=O/3C": 1183, + "*/5O/5=O/3O/3=O": 1697, + "*1": 569, + "*1O": 625, + "*2": 587, + "*2/6": 1952, + "*Br": 1196, + "*C": 594, + "*Cl": 1181, + "*F": 696, + "*I": 1043, + "*N": 127, + "*N*/2": 1908, + "*NCC": 283, + "*NCC/3=O": 130, + "*O": 162, + "*O*/2C": 1530, + "*OC": 202, + "*OC(CCCCCC$": 233, + "*OC(CCCCCC$4)": 235, + "*OC(CCCCCC$4)/3=O": 312, + "*OC(CCCCCC$4/7)": 1610, + "*OC(CCCCCC$4/7)C/3=O": 1611, + "*OC(CCCCCC$4/7)OC": 1093, + "*OC(CCCCCC$4/8)O(": 1326, + "*OC(CCCCCC$4/8)O(/7)O(/6)": 1339, + "*OC(CCCCCC$4/8)O(/7)O(/6)O/3=O": 1340, + "*OCC": 370, + "*OCC/3=O": 230, + "*OCCCC": 579, + "*OCCCCCCCC": 588, + "*OP": 279, + "*OPO": 307, + "*OPO*": 507, + "*OPO*/3O/3=O": 508, + "*OPO*/3O/3=O~n": 1745, + "*OPO/3O/3=O": 356, + "*OPOCCN": 1059, + "*OPOCCN/3O/3=O": 1221, + "*OPOPO": 1596, + "*OP^XO": 454, + "*OP^XOCCN": 517, + "*OP^XOCCN/3O/3=O": 584, + "*OP^XOCCNC/7C/7C/3O/3=O": 1083, + "*OP^XOP": 827, + "*OP^XOPO/5O/5=O/3O/3=O": 1925, + "*OP^XOP^XO": 882, + "*OP^XOP^XOCCN/5O/5=O/3O/3=O": 973, + "*OS": 244, + "*OS(CCCCCC$4/7)C/3=O/3=O": 949, + "*OSC/3=O/3=O": 1033, + "*OSCF/4F/4F/3=O/3=O": 1863, + "*OSO/3=O/3=O": 257, + "*OSi": 541, + "*OSiC/3C/3C": 801, + "*OSiCC/4C/4": 698, + "*OSiCC/4C/4C": 1108, + "*OSiCC/4C/4C/3(CCCCCC$": 1109, + "*OSiCC/4C/4C/3(CCCCCC$8": 1110, + "*OSiCC/4C/4C/3(CCCCCC$8)/3(CCCCCC$14)": 1111, + "*OSiCC/4C/4C/3C/3C": 848, + "*S": 837, + "+": 20, + ",": 21, + ",1": 1699, + ",2": 1423, + "-": 22, + "-1": 118, + "-2": 206, + "-2a": 1084, + "-2b": 1063, + "-2x": 930, + "-3": 1647, + "-?": 1918, + "-b1": 311, + "-{": 169, + ".": 23, + "/": 24, + "/1": 542, + "/10": 1803, + "/10=O": 829, + "/10=O(": 1052, + "/10=O(/4)*2": 1292, + "/10=O(/4)CN*2": 2046, + "/11": 1555, + "/12": 2098, + "/15": 1688, + "/17": 2099, + "/18": 2082, + "/2": 733, + "/2=O": 1228, + "/3": 122, + "/3(CCCCCC$": 595, + "/3(CCCCCC$1": 670, + "/3(CCCCCC$10": 1099, + "/3(CCCCCC$10)/3(CCCCCC$1": 1100, + "/3(CCCCCC$10)/3(CCCCCC$16)": 1132, + "/3=N": 1932, + "/3=O": 124, + "/3C": 346, + "/3C/3C": 596, + "/3CO/6=O": 1045, + "/3CO/6=O/3C": 1046, + "/3O": 1522, + "/3O/3=O": 280, + "/4": 498, + "/4)": 623, + "/4)*2": 818, + "/4)*2/10=O": 1830, + "/4)CN": 1216, + "/4)CN*2": 1544, + "/5": 500, + "/5C/3=O": 2032, + "/5O/5=O/3O/3=O": 803, + "/6": 467, + "/6)": 558, + "/6Cl": 1995, + "/6Cl/3=O": 1996, + "/6Cl/6Cl/3=O": 1997, + "/7": 468, + "/7)O(": 1089, + "/7)O(/6)": 1273, + "/7=O/5": 1322, + "/7=O/5CCCCCCCCCCC/3=O": 1618, + "/8": 749, + "/9": 908, + "0": 25, + "0=O": 703, + "1": 26, + "1*N": 490, + "1*NC(CCCCCC$": 1034, + "1*NC(CCCCCC$4/5": 1787, + "1*NCC": 967, + "1*OC": 1381, + "1*OCCCCCCCC": 1813, + "1*OPO/3O/3=O": 1960, + "1*OP^XOCCNC/7C/7C/3O/3=O": 1397, + "1-": 116, + "1-4": 300, + "1-5": 119, + "1-?": 273, + "1-a": 856, + "1-a4|": 1439, + "1-a4|a6|b": 1453, + "1-a4|a6|b4|b": 1454, + "1-a4|a6|b4|b6|c": 1455, + "1-a4|a6|b4|b6|c4|c": 1456, + "1-a4|a6|b4|b6|c4|c6|d": 1457, + "1-a4|a6|b4|b6|c4|c6|d4|d6|": 1458, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|": 1459, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|": 1460, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g": 1461, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g": 1462, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h": 1463, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h": 1464, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i": 1467, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i": 1468, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j": 1494, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j": 1495, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k": 1589, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k4|k": 1590, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k4|k6|l": 1831, + "1-a4|a6|b4|b6|c4|c6|d4|d6|e4|e6|f4|f6|g4|g6|h4|h6|i4|i6|j4|j6|k4|k6|l4|l": 1832, + "1-a4|b4|c4|d4|": 1606, + "1-a4|b4|c4|d4|e4|f4|g": 1656, + "1-a4|b4|c4|d4|e4|f4|g4|h4|i": 1873, + "1-a?|b?|c?|d?|e?|f?}": 928, + "1-a?|b?|c?|d?|e?}": 869, + "1-b": 1095, + "1-b3|b": 1982, + "1-c": 878, + "1-c3|c": 956, + "1-c3|c6": 993, + "1-d": 897, + "1-d4|d6|": 1471, + "1-d?|i?}": 2100, + "10": 2106, + "11": 296, + "11/1": 1578, + "11/14)": 1906, + "112": 154, + "112h": 243, + "11h": 726, + "11xh": 1881, + "12": 115, + "122": 121, + "1221": 194, + "1221h": 578, + "1222": 771, + "1222h": 1120, + "122h": 171, + "122h-1": 126, + "122h-2": 598, + "122h-2a": 2108, + "122h-2b": 1942, + "122h-2x": 1975, + "122m": 1042, + "12[H]": 2107, + "12h": 556, + "12m": 1934, + "1A": 1290, + "1h": 795, + "1m": 1031, + "1n1-": 1919, + "1n2-": 2022, + "2": 27, + "2(C)": 1210, + "2(C)[C@@]3": 1570, + "2)": 1341, + "2*C": 1557, + "2*F": 1133, + "2*I": 1766, + "2*N": 269, + "2*N=^XCC/3O": 1962, + "2*NC": 1023, + "2*NC(CCCCCC$4)/3=O": 1825, + "2*NCC": 1440, + "2*NCC/3=O": 139, + "2*NCCC": 991, + "2*NCCC^R": 1615, + "2*NCCC^X": 1869, + "2*NCCC^XO": 1891, + "2*NCCO": 1965, + "2*NCO": 1442, + "2*NCOCCCl/6Cl/6Cl/3=O": 2006, + "2*NSO/3=O/3=O": 495, + "2*O": 1363, + "2*OC": 475, + "2*OC(CCCCCC$4)": 447, + "2*OC(CCCCCC$4)/3=O": 512, + "2*OCC": 727, + "2*OCC/3=O": 327, + "2*OCC=C": 1937, + "2*OCCC/4C/4C/3=O": 1415, + "2*OCCCC": 1002, + "2*OCCCCCCCC": 920, + "2*OPO/3O/3=O": 1202, + "2*OS(CCCCCC$4/7)C/3=O/3=O": 2039, + "2*OSC/3=O/3=O": 2112, + "2*OSO/3=O/3=O": 469, + "2*OSiC/3C/3C": 1541, + "2*OSiCC/4C/4C/3C/3C": 2113, + "2-": 174, + "2-5": 521, + "2-6": 208, + "2-?": 721, + "2/5": 1315, + "21": 191, + "211": 267, + "2111m": 1658, + "21h": 971, + "21m": 2088, + "22": 294, + "222": 484, + "222h": 862, + "222m": 1816, + "22h": 739, + "22h-1b": 1230, + "2C": 1211, + "3": 28, + "3)": 1355, + "3*C": 899, + "3*CO": 1613, + "3*F": 1411, + "3*N": 662, + "3*NCC": 1429, + "3*NCC/3=O": 694, + "3*O": 1444, + "3*OC": 332, + "3*OC(CCCCCC$4)": 397, + "3*OC(CCCCCC$4)/3=O": 520, + "3*OC(CCCCCC$4/7)OC": 1909, + "3*OCC": 622, + "3*OCC/3=O": 324, + "3*OCC=C": 1297, + "3*OCCC/4C/4C/3=O": 1676, + "3*OCCCC": 962, + "3*OCCCCCCCC": 877, + "3*OCCCCCCCCCCCCCCCC/3=O": 2055, + "3*OCCC^R": 1847, + "3*OCCC^X": 1579, + "3*OCCC^XCCCCCCCCCCC/5O/3=O": 2061, + "3*OC^R": 1399, + "3*OC^RCO/4=O/3C": 1560, + "3*OPO/3O/3=O": 1406, + "3*OP^XOCCN/3O/3=O": 1921, + "3*OS(CCCCCC$4/7)C/3=O/3=O": 2074, + "3*OSO/3=O/3=O": 548, + "3*OSiC/3C/3C": 1422, + "3*OSiCC/4C/4C/3C/3C": 1518, + "3*S": 2083, + "3-": 178, + "3-6": 1049, + "3-7": 553, + "334": 744, + "334h": 1591, + "34": 449, + "344": 551, + "344h": 1337, + "3|": 297, + "3|b": 974, + "3|b3|c3|d": 1162, + "3|b3|c3|d3|e": 1174, + "3|b3|c3|d3|e3|f": 1187, + "3|b3|c3|d3|e3|f3|g": 1207, + "3|b3|c3|d3|e3|f3|g3|h": 1225, + "3|b3|c3|d3|e3|f3|g3|h3|i": 1240, + "3|b3|c3|d3|e3|f3|g3|h3|i3|j": 1350, + "3|b3|c3|d3|e3|f3|g3|h3|i3|j3|k": 1443, + "3|b3|c3|d3|e3|f3|g3|h3|i3|j3|k3|l": 1619, + "3|b3|c3|d3|e3|f3|g3|h3|i3|j3|k3|l3|m": 2018, + "3|c": 764, + "3|c3|d": 1157, + "3|d": 1068, + "3|e": 1081, + "3|f": 794, + "3|g": 657, + "3|h": 1061, + "3|i": 969, + "3|j": 1032, + "3|k": 1060, + "3|l": 1241, + "3|m": 1293, + "3|n": 1247, + "3|o": 1217, + "3|p": 1376, + "3|p6": 1486, + "3|q": 1612, + "3|q6": 1693, + "3|r": 1630, + "3|r6": 1703, + "3|s": 1700, + "3}": 648, + "3~": 863, + "3~n": 691, + "4": 29, + "4(C)": 1435, + "4)": 227, + "4)/3=O": 1028, + "4*C": 1926, + "4*F": 1580, + "4*N": 614, + "4*NC=O": 1441, + "4*NCC": 2011, + "4*NCC/3=O": 923, + "4*O": 2094, + "4*OC": 514, + "4*OC(CCCCCC$4)": 456, + "4*OC(CCCCCC$4)/3=O": 601, + "4*OCC": 849, + "4*OCC/3=O": 337, + "4*OCCC/4C/4C/3=O": 2062, + "4*OCCCC": 1271, + "4*OPO/3O/3=O": 606, + "4*OP^XOP^XOCCN/5O/5=O/3O/3=O": 1259, + "4*OSC/3=O/3=O": 1894, + "4*OSO/3=O/3=O": 581, + "4*OSiC/3C/3C": 1621, + "4*OSiCC/4C/4C/3C/3C": 2007, + "4-": 160, + "4-6*OC^XO*/3CO/6=O/3C": 1885, + "4/5": 1330, + "4/6)": 1947, + "4/7": 586, + "4/7)": 789, + "4/7)OC": 960, + "4/8": 1222, + "4/8)O(": 1319, + "44": 1795, + "4[C@@](C)": 1713, + "4[C@@](C)3": 1714, + "4|": 344, + "4|b": 1073, + "4|b4|c": 1597, + "4|b4|c4|d": 1598, + "4|b4|c4|d4|": 1599, + "4|c": 1079, + "4|d": 868, + "4|d6|": 1044, + "4|g": 1448, + "4|h": 1074, + "4|h4|i": 1834, + "4|i": 1024, + "4|j": 1176, + "4|k": 1412, + "4|l": 1682, + "4}": 1075, + "4}C(O)": 1651, + "4~": 867, + "4~n": 718, + "5": 30, + "5)": 984, + "5)/3=O": 2012, + "5*N": 841, + "5*NCC": 289, + "5*NCC/3=O": 225, + "5*NCCO/3=O": 290, + "5*OC": 1746, + "5*OC(CCCCCC$4)": 1096, + "5*OC(CCCCCC$4)/3=O": 1076, + "5*OCC": 1966, + "5*OCC/3=O": 1160, + "5*OPO*/3O/3=O": 1648, + "5*OPO/3O/3=O": 1732, + "5-": 583, + "5n2-6": 903, + "5n2-6n1*1O(CCCCCC$3/6)N": 904, + "5n2-6n1*1O(CCCCCC$3/6)NCN(CCCCCC$12": 1953, + "6": 31, + "6)": 839, + "6)/3=O": 1603, + "6*Br": 1709, + "6*Cl": 1870, + "6*F": 1549, + "6*I": 1564, + "6*N": 644, + "6*NCC": 1587, + "6*NCN(CCCCCC$5": 2013, + "6*O": 1565, + "6*OC": 528, + "6*OC(CCCCCC$4)": 460, + "6*OC(CCCCCC$4)/3(CCCCCC$10)/3(CCCCCC$16)": 1327, + "6*OC(CCCCCC$4)/3=O": 701, + "6*OCC": 770, + "6*OCC/3=O": 362, + "6*OCCC/4C/4C/3=O": 1436, + "6*OCCCC": 1251, + "6*OCCCCCCCC": 1674, + "6*OC^XO*/3CO/6=O/3C": 1865, + "6*OPO/3O/3=O": 757, + "6*OPOCCN/3O/3=O": 1691, + "6*OP^XOCCN/3O/3=O": 846, + "6*OP^XOCCNC/7C/7C/3O/3=O": 1821, + "6*OS(CCCCCC$4/7)C/3=O/3=O": 1649, + "6*OSO/3=O/3=O": 333, + "6*OSiC/3C/3C": 1864, + "6*OSiCC/4C/4C/3(CCCCCC$8)/3(CCCCCC$14)": 1525, + "6*OSiCC/4C/4C/3C/3C": 1583, + "6*S": 1354, + "6*SO/2=O/2=O": 1898, + "6-": 195, + "6/9": 1542, + "6=O": 786, + "6n1-4": 1859, + "6n1-4n2*OC": 1915, + "6n2-8": 1545, + "6n2-8n1*1O(CCCCCC$3/6)N": 1546, + "6|": 403, + "6|b": 1185, + "6|c": 1179, + "6|c6|d": 2065, + "6|c6|d6|": 2075, + "6|d": 1180, + "6|g": 1212, + "6|h": 1177, + "6|i": 1191, + "6|j": 1244, + "6|k": 1328, + "6|l": 1643, + "6}": 743, + "6~": 1159, + "6~n": 1058, + "7": 32, + "7*N": 1394, + "7*NCC/3=O": 1424, + "7*OCC/3=O": 1586, + "7*OPO/3O/3=O": 1817, + "7*OP^XOCCN/3O/3=O": 1753, + "7-": 641, + "7-b1": 1237, + "8": 33, + "8*(N": 1935, + "8*N": 1402, + "8-": 557, + "8-b1": 933, + "9": 34, + "9*OCC/3=O": 1400, + "9-b1": 1809, + ":": 35, + "<": 36, + "": 534, + "-?": 2016, + "@": 642, + "@2": 2109, + "@p": 2043, + "=": 37, + "=@SMILES@": 575, + "=C": 457, + "=C(C": 1967, + "=C/": 1657, + "=C1": 1188, + "=CC": 929, + "=N": 1511, + "=O": 123, + "=O)": 876, + "=O)C": 1971, + "=O)O": 2084, + "=O/3=O": 1553, + "=O/3C": 1208, + "=O/5": 1166, + "=^": 459, + "=^E": 889, + "=^EC(": 1729, + "=^EC(CCCCCC$": 1481, + "=^EC(CCCCCC$6/9": 1668, + "=^EC(CCCCCC$6/9)O(/8": 2051, + "=^X": 1552, + "=^XCC": 1659, + "=^XCC/3O": 1715, + "=^Z": 504, + "=^ZCCC": 712, + "=^ZCCC/3=O": 1902, + "=^ZCCC=^ZCCC": 918, + "=^ZCCC=^ZCCCCCC/3=O": 1534, + "=^ZCCCCCC/3=O": 1272, + "={": 2049, + "={5": 1507, + "={54}C(O)": 2089, + ">": 38, + "?": 39, + "?%": 1669, + "?*OCC/3=O": 2033, + "?*OPO/3O/3=O": 1796, + "?*OSO/3=O/3=O": 1078, + "?-": 149, + "?-?": 2067, + "?|": 114, + "?|A": 434, + "?|B": 462, + "?|C": 493, + "?|D": 535, + "?|E": 608, + "?|F": 635, + "?|G": 646, + "?|H": 667, + "?|I": 675, + "?|J": 688, + "?|K": 831, + "?|L": 939, + "?|L?|M": 942, + "?|L?|M?|N": 943, + "?|M": 940, + "?|N": 941, + "?|O": 1003, + "?|O?|P": 1011, + "?|O?|P?|Q": 1012, + "?|O?|P?|Q?|R": 1013, + "?|O?|P?|Q?|R?|S": 1014, + "?|O?|P?|Q?|R?|S?|T": 1015, + "?|O?|P?|Q?|R?|S?|T?|U": 1016, + "?|O?|P?|Q?|R?|S?|T?|U?|V": 1017, + "?|P": 1004, + "?|Q": 1005, + "?|R": 1006, + "?|S": 1007, + "?|T": 1008, + "?|U": 1009, + "?|V": 1010, + "?|W": 1167, + "?|W?|X": 1170, + "?|W?|X?|Y": 1171, + "?|X": 1168, + "?|Y": 1169, + "?|Z": 1370, + "?|Z?|a": 1371, + "?|Z?|aa?|": 1372, + "?|Z?|aa?|ab": 1373, + "?|a": 552, + "?|ac": 1738, + "?|ac?|ad": 1739, + "?|ad": 1737, + "?|c": 133, + "?|d": 135, + "?|e": 137, + "?|f": 140, + "?|g": 142, + "?|h": 144, + "?|h?}": 2064, + "?|i": 147, + "?|i?}": 1842, + "?|j": 150, + "?|k": 152, + "?|l": 155, + "?|m": 157, + "?|n": 164, + "?|o": 167, + "?|p": 175, + "?|s": 192, + "?|t": 197, + "?|u": 217, + "?|v": 238, + "?|w": 264, + "?|x": 298, + "?|y": 322, + "?|z": 387, + "?}": 163, + "?}*OC": 716, + "?}*OCC/3=O": 870, + "?}*OPO/3O/3=O": 742, + "?}*OSO/3=O/3=O": 592, + "?}-{": 170, + "?}-{a?|b": 994, + "?}-{a?|b?": 995, + "?}-{a?|b?|c": 602, + "?}-{a?|b?|c?": 603, + "?}-{a?|b?|c?|d": 487, + "?}-{a?|b?|c?|d?": 488, + "?}-{a?|b?|c?|d?|e": 476, + "?}-{a?|b?|c?|d?|e?": 477, + "?}-{a?|b?|c?|d?|e?|f": 440, + "?}-{a?|b?|c?|d?|e?|f?": 441, + "?}-{a?|b?|c?|d?|e?|f?|g": 444, + "?}-{a?|b?|c?|d?|e?|f?|g?": 445, + "?}-{a?|b?|c?|d?|e?|f?|g?|h": 430, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?": 431, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i": 419, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?": 420, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j": 383, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?": 384, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k": 371, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?": 372, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l": 340, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?": 341, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m": 389, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?": 390, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n": 378, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?": 379, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o": 359, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?": 360, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p": 349, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?": 350, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q": 375, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?": 376, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r": 353, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?": 354, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s": 367, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?": 368, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t": 334, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?": 335, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u": 364, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?": 365, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v": 426, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?": 427, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w": 538, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?": 539, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x": 659, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?": 660, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y": 808, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?": 809, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z": 987, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?": 988, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A": 1499, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?": 1500, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B": 1389, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?": 1390, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C": 1634, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?": 1635, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D": 1600, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?": 1601, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J": 1566, + "?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?": 1567, + "@": 40, + "@=@SMILES@": 576, + "@=@SMILES@C": 924, + "@=@SMILES@CC": 1493, + "@=@SMILES@CC1": 2050, + "@=@SMILES@O": 946, + "@=@SMILES@O{3}": 2085, + "@S": 559, + "@SMI": 562, + "@SMILES": 563, + "@SMILES@": 564, + "@a": 900, + "@ac": 1106, + "@acid": 1117, + "@aglyc": 1851, + "@aglycon": 1852, + "@olean": 2068, + "@oleanolic~": 2069, + "A": 41, + "A-1": 259, + "A-1a": 437, + "A-1b": 715, + "A-1x": 465, + "A1": 1533, + "A2": 1385, + "A4": 1861, + "A": 1306, + "AU": 272, + "AUd1122h": 570, + "AUd21122h": 316, + "AUdxxxx": 461, + "AUdxxxxh": 847, + "AUdxxxxxh": 515, + "Aa": 209, + "Aa11": 2002, + "Aad": 2104, + "Aad1122h-2": 407, + "Aad1122h-2a": 573, + "Aad1122h-2x": 523, + "Aad2": 1367, + "Aad21": 1771, + "Aad21122h": 220, + "Aad21122h-2": 221, + "Aad21122h-2a": 254, + "Aad21122h-2x": 266, + "Aad22111m": 1800, + "Aax21": 1943, + "Ad1": 747, + "Ad1d": 931, + "Ad1dd11h": 1949, + "Ad1dd22h": 1972, + "Ad1zz": 1751, + "Ad2": 755, + "Ad2d": 911, + "Ad2dd11h": 1989, + "Ad2dd22h": 1944, + "Ad2zz": 1727, + "B": 42, + "B1": 2028, + "Br": 1152, + "C": 43, + "C$": 802, + "C(": 724, + "C(CCCC": 1540, + "C(CCCCCC$": 600, + "C(CCCCCC$4)/3=O": 1398, + "C(CCCCCC$6)/3=O": 1875, + "C)": 1677, + "C)C": 1653, + "C/": 313, + "C/1": 892, + "C/10=O": 1395, + "C/10=O(": 1718, + "C/10=O(/4)*2": 2014, + "C/11": 1984, + "C/12": 2070, + "C/2": 1835, + "C/2C": 1876, + "C/3=O": 381, + "C/3=O/3=O": 686, + "C/3C/3C": 613, + "C/3O/3=O": 968, + "C/4": 439, + "C/4C/3=O": 725, + "C/4C/4C/3=O": 805, + "C/4O/3=O": 1998, + "C/5": 813, + "C/5O/3=O": 860, + "C/6=O": 2081, + "C/7": 714, + "C/7C/7": 980, + "C/7C/7C/3O/3=O": 986, + "C/9": 1938, + "C1": 1438, + "C2": 2052, + "C=C": 1088, + "C=O": 1129, + "C=^Z": 998, + "C=^ZCCC=^ZCCC": 1694, + "C=^ZCCC=^ZCCCCCC/3=O": 1867, + "C=^ZCCCCCCC/3=O": 1836, + "C=^ZCCCCCCCCC/3=O": 1519, + "CC": 117, + "CC$": 864, + "CC$2": 1660, + "CC(C)": 1332, + "CC/3=O": 128, + "CC/4": 680, + "CC/4C/4": 697, + "CC=C": 1070, + "CC=C4": 1304, + "CCC": 505, + "CCC/3=O": 1767, + "CCCC": 173, + "CCCC$": 1716, + "CCCCC$": 1146, + "CCCCCC": 210, + "CCCCCC$": 214, + "CCCCCC/3=O": 965, + "CCCCCCC/3=O": 1551, + "CCCCCCCC": 386, + "CCCCCCCC/3=O": 926, + "CCCCCCCCC/3=O": 1226, + "CCCCCCCCCC": 826, + "CCCCCCCCCC/3=O": 1427, + "CCCCCCCCCCC/3=O": 1523, + "CCCCCCCCCCC/5O/3=O": 1175, + "CCCCCCCCCCCC": 1431, + "CCCCCCCCCCCCCC": 1473, + "CCCNCC$": 1853, + "CCCl": 1990, + "CCCl/6Cl/6Cl/3=O": 1999, + "CCN": 412, + "CCN/5O/5=O/3O/3=O": 883, + "CCO": 1027, + "CC[C@@]": 964, + "CC[C@]": 756, + "CC[C@]3": 2023, + "CC^": 706, + "CC^E": 1127, + "CC^ECC^Z": 1515, + "CC^ECC^Z$4)": 1882, + "CC^ECC^Z$4)/9": 1929, + "CC^R": 1685, + "CC^S": 2047, + "CC^X": 2003, + "CC^Z": 935, + "CC^ZCC^Z": 1592, + "CF/4F/4F/3=O": 1848, + "CF/4F/4F/3=O/3=O": 1849, + "CN": 577, + "CN$": 1663, + "CN(CCCCCC$": 1025, + "CN(CCCCCC$12": 1791, + "CN(CCCCCC$5": 1437, + "CO/4=O/3C": 1294, + "C^R": 866, + "C^S": 1069, + "C^X": 1103, + "Cl": 990, + "Cl/3=O": 1288, + "D": 44, + "E": 45, + "EE": 1135, + "ER": 704, + "ERR": 728, + "ERRO": 729, + "ERROR": 730, + "ERROR1-": 932, + "ERROR1-ERROR": 1056, + "ERROR1-ERROR2": 1311, + "ES": 560, + "F": 46, + "F/3=O": 875, + "F/4": 823, + "F/4F/4": 1142, + "F/4F/4F/3=O": 1189, + "FF": 1094, + "FFA": 2056, + "G": 47, + "H": 48, + "H]": 326, + "I": 49, + "J": 50, + "K": 51, + "L": 52, + "LES": 561, + "M": 53, + "MI": 554, + "N": 54, + "N$": 1652, + "N$2": 2053, + "NC$": 1797, + "NCC$": 1504, + "NCCO": 1664, + "O": 55, + "O($": 1588, + "O)": 393, + "O*2": 1702, + "O/": 414, + "O/2": 1140, + "O/2=O": 1276, + "O/2=O/2=O": 1521, + "O/3=O": 199, + "O/3=O/3=O": 249, + "O/3O/3=O": 1747, + "O/4": 1065, + "O/4=O/3C": 1266, + "O/5": 666, + "O/5=O": 723, + "O/5=O/3O/3=O": 740, + "O/5O/5=O/3O/3=O": 1722, + "O/6": 1883, + "O/6=O": 858, + "O/7": 1300, + "O/8": 1712, + "O/9": 1827, + "OC": 887, + "P": 56, + "PO": 1275, + "Q": 57, + "QQ": 1386, + "R": 58, + "S": 59, + "S(CCCCCC$": 1147, + "SO/3=O/3=O": 492, + "T": 60, + "U": 61, + "V": 62, + "W": 63, + "X": 64, + "Y": 65, + "Z": 66, + "[": 67, + "[BRANCH_CLOSE]": 6, + "[BRANCH_OPEN]": 5, + "[C": 292, + "[C@": 293, + "[C@@": 382, + "[C@@H]": 519, + "[C@@H](O)": 760, + "[C@@H]1": 1512, + "[C@@H]2": 1973, + "[C@@]": 502, + "[C@@](C)": 1312, + "[C@@]1": 1719, + "[C@@]2": 1550, + "[C@@]3": 1037, + "[C@@]4": 1604, + "[C@@]5": 1733, + "[C@H]": 537, + "[C@H](C": 2044, + "[C@H](O)": 921, + "[C@H](O)C": 1377, + "[C@H]1": 1235, + "[C@H]2": 1959, + "[C@H]3": 1627, + "[C@H]4": 1644, + "[C@]": 472, + "[C@](C)": 1594, + "[C@]1": 1430, + "[C@]12": 1877, + "[C@]2": 1843, + "[C@]3": 1401, + "[C@]4": 1862, + "[C@]5": 1324, + "[C@]5([H])": 1916, + "[END]": 3, + "[H]": 615, + "[LINK]": 7, + "[MASK]": 4, + "[MOD]": 8, + "[PAD]": 0, + "[RESIDUE_ERROR]": 9, + "[START]": 2, + "[UNK]": 1, + "\\": 68, + "]": 69, + "^": 70, + "^R": 621, + "^S": 851, + "^X": 331, + "^XO": 392, + "^XO*/3CO/6=O/3C": 1382, + "a": 71, + "a1": 161, + "a1*OC": 1838, + "a1*OPO*/3O/3=O": 1242, + "a1-": 319, + "a1-a": 1818, + "a1-b": 835, + "a1-b1": 916, + "a1-b2": 936, + "a1-b3~n": 1810, + "a1-b4~n": 1638, + "a1-c": 741, + "a1-c2": 1899, + "a1-c3~": 1768, + "a1-c3~n": 1352, + "a1-c4~": 1860, + "a1-c4~n": 1628, + "a1-d": 705, + "a1-d2": 1351, + "a1-d2~n": 1785, + "a1-d3~": 1708, + "a1-d3~n": 1245, + "a1-d4~": 1910, + "a1-d4~n": 1353, + "a1-e": 909, + "a1-e2": 1922, + "a1-e3~n": 1820, + "a1-e4~n": 2057, + "a1-f": 1313, + "a1-g": 1855, + "a11": 1223, + "a111": 1102, + "a1111": 1307, + "a1111h-1a": 1710, + "a1112": 825, + "a1112h-1b": 1296, + "a1112h-1x": 1482, + "a112": 797, + "a1121": 919, + "a1121A-1a": 1839, + "a1122": 410, + "a11221": 301, + "a11221h-1a": 358, + "a11221h-1x": 424, + "a11222": 645, + "a11222h-1a": 804, + "a11222h-1x": 992, + "a1122A-1b": 1053, + "a1122A-1x": 1491, + "a1122h-1": 172, + "a1122h-1a": 196, + "a1122h-1b": 250, + "a1122h-1x": 223, + "a1122m-1a": 699, + "a1122m-1b": 1723, + "a1122m-1x": 1145, + "a12": 612, + "a121": 1625, + "a1211": 787, + "a1211h-1a": 1874, + "a1211h-1b": 1496, + "a1211h-1x": 1476, + "a1211m-1a": 1936, + "a1212": 1358, + "a1221": 213, + "a1221h-1a": 1480, + "a1221h-1x": 1622, + "a1221m-1": 215, + "a1221m-1a": 245, + "a1221m-1b": 1128, + "a1221m-1x": 270, + "a1222": 997, + "a1222h-1a": 1814, + "a1222h-1b": 2091, + "a1222h-1x": 1950, + "a122h-1": 580, + "a122h-1a": 777, + "a122h-1b": 1236, + "a122h-1x": 982, + "a1d21": 1692, + "a1d21m-1a": 2004, + "a1d22": 1854, + "a1x1": 1419, + "a1x1xh-1u": 1920, + "a1x2": 1239, + "a1x2xh-1u": 1840, + "a2": 125, + "a2-": 937, + "a2-b1": 399, + "a2-c1": 1775, + "a21": 653, + "a211": 433, + "a2111": 1047, + "a2112": 159, + "a2112A-1a": 633, + "a2112A-1b": 1229, + "a2112A-1x": 798, + "a2112h-1": 166, + "a2112h-1a": 281, + "a2112h-1b": 190, + "a2112h-1x": 205, + "a2112m-1a": 687, + "a2112m-1b": 925, + "a2112m-1x": 824, + "a211h-1a": 624, + "a211h-1b": 1156, + "a211h-1x": 772, + "a212": 305, + "a2121": 546, + "a2121A-1a": 780, + "a2121A-1x": 879, + "a2121h-1b": 1792, + "a2122": 304, + "a2122A-1": 320, + "a2122A-1a": 822, + "a2122A-1b": 417, + "a2122A-1x": 532, + "a2122h-1": 146, + "a2122h-1a": 246, + "a2122h-1b": 177, + "a2122h-1x": 187, + "a2122m-1a": 1206, + "a2122m-1b": 799, + "a2122m-1x": 1098, + "a212h-1a": 815, + "a212h-1b": 451, + "a212h-1x": 527, + "a21EE": 1255, + "a21EEA-1a": 1782, + "a21EEA-1x": 1968, + "a21FF": 1347, + "a21FFA-1a": 1939, + "a21FFA-1x": 2026, + "a21d2": 1689, + "a21eE": 1274, + "a21eEA-1a": 1954, + "a21eEA-1x": 1976, + "a22": 651, + "a2211": 285, + "a2211h-1a": 1783, + "a2211h-1x": 1748, + "a2211m-1a": 314, + "a2211m-1b": 884, + "a2211m-1x": 513, + "a2212": 1022, + "a2212h-1b": 1724, + "a2212h-1x": 1788, + "a222": 689, + "a2221": 832, + "a2221h-1b": 1822, + "a2221h-1x": 2027, + "a2221m-1a": 1348, + "a2222": 707, + "a2222h-1a": 1769, + "a2222h-1b": 1114, + "a2222h-1x": 1143, + "a222h-1a": 1811, + "a222h-1b": 852, + "a222h-1x": 1575, + "a26": 1927, + "a28-b1": 1249, + "a2d": 1018, + "a2d12": 1308, + "a2d12m-1a": 1777, + "a2d22": 1878, + "a2|": 1452, + "a2|b2|": 1526, + "a2|b2|c2|": 1527, + "a2|b2|c2|d2|e2": 1535, + "a2|b2|c2|d2|e2|f2": 1815, + "a3": 736, + "a3-": 256, + "a3-b1": 262, + "a3-b2": 1903, + "a3-c1": 719, + "a3-d1": 1639, + "a3-e1": 1911, + "a3344": 812, + "a3344h-1a": 1148, + "a3344h-1x": 1868, + "a3344m-1x": 2086, + "a344": 1956, + "a4": 597, + "a4-": 222, + "a4-b1": 228, + "a4-b2": 1772, + "a4-c1": 571, + "a4-d1": 1378, + "a4-e1": 2024, + "a4334": 845, + "a4334h-1b": 1856, + "a4334h-1x": 1310, + "a4344": 914, + "a4344h-1b": 1690, + "a4344h-1x": 1479, + "a5": 483, + "a5-": 1309, + "a5-b1": 518, + "a5-c1": 1665, + "a6-": 261, + "a6-b1": 404, + "a6-b2": 1616, + "a6-b3*N": 1957, + "a6-c1": 708, + "a6-d1": 784, + "a6-e1": 951, + "a6-f1": 947, + "a6-g1": 1277, + "a6-h1": 1323, + "a6-i1": 1054, + "a6-j1": 901, + "a6-k1": 954, + "a6-l1": 816, + "a6-m1": 1113, + "a6-n1": 1164, + "a6-o1": 1165, + "a6-p1": 1477, + "a6-q1": 1757, + "a6-r1": 1263, + "a6-s1": 1871, + "a6-t1": 1879, + "a6-u1": 1844, + "a6|b": 1192, + "a7-b1": 1282, + "a8-": 1283, + "a8-b1": 1418, + "a8-b3": 2040, + "a?-": 226, + "a?-b1": 241, + "a?-b2": 1267, + "a?-c1": 972, + "a?-d1": 959, + "a?-e1": 979, + "a?-f1": 1055, + "a?-g1": 1342, + "a?-h1": 1561, + "a?-i1": 1420, + "a?-j1": 1233, + "a?-k1": 1318, + "a?-l1": 1115, + "a?-m1": 1416, + "a?-n1": 1425, + "a?-o1": 1605, + "a?-p1": 1740, + "a?-q1": 1912, + "a?-r1": 1661, + "a?-s1": 1907, + "a?-t1": 2020, + "a?|": 131, + "a?|b": 132, + "a?|b?|c": 134, + "a?|b?|c?|d": 136, + "a?|b?|c?|d?|e": 138, + "a?|b?|c?|d?|e?|f": 141, + "a?|b?|c?|d?|e?|f?|g": 143, + "a?|b?|c?|d?|e?|f?|g?|h": 145, + "a?|b?|c?|d?|e?|f?|g?|h?|i": 148, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j": 151, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k": 153, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l": 156, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m": 158, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n": 165, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o": 168, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p": 176, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|": 180, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q": 181, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|": 183, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r": 184, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s": 193, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t": 198, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u": 218, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v": 239, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w": 265, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x": 299, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y": 323, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z": 388, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A": 435, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B": 463, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C": 494, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D": 536, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E": 609, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F": 636, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G": 647, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H": 668, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I": 676, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J": 690, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K": 833, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N": 944, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V": 1019, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V?|W?|X?|Y": 1172, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V?|W?|X?|Y?|Z?|aa?|ab": 1374, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?|K?|L?|M?|N?|O?|P?|Q?|R?|S?|T?|U?|V?|W?|X?|Y?|Z?|aa?|ab?|ac?|ad": 1741, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?|E?|F?|G?|H?|I?|J?": 1568, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?|D?": 1602, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?|C?": 1636, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?|B?": 1391, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?|A?": 1501, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?|z?": 989, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?|y?": 810, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?|x?": 661, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?|w?": 540, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?|v?": 428, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?|u?": 366, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?|t?": 336, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?|s?": 369, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?|r?": 355, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?|q?": 377, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?|p?": 351, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?}": 2105, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?|o?": 361, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?}": 1524, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?|n?": 380, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?}": 1478, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?|m?": 391, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?}": 1483, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?|l?": 342, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?}": 1262, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?|k?": 373, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?}": 958, + "a?|b?|c?|d?|e?|f?|g?|h?|i?|j?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?|j?": 385, + "a?|b?|c?|d?|e?|f?|g?|h?|i?}": 886, + "a?|b?|c?|d?|e?|f?|g?|h?|i?}-{a?|b?|c?|d?|e?|f?|g?|h?|i?": 421, + "a?|b?|c?|d?|e?|f?|g?|h?}": 1000, + "a?|b?|c?|d?|e?|f?|g?|h?}*OSO/3=O/3=O": 2035, + "a?|b?|c?|d?|e?|f?|g?|h?}-{a?|b?|c?|d?|e?|f?|g?|h?": 432, + "a?|b?|c?|d?|e?|f?|g?}": 1150, + "a?|b?|c?|d?|e?|f?|g?}-{a?|b?|c?|d?|e?|f?|g?": 446, + "a?|b?|c?|d?|e?|f?}": 834, + "a?|b?|c?|d?|e?|f?}*OC": 2110, + "a?|b?|c?|d?|e?|f?}*OSO/3=O/3=O": 1333, + "a?|b?|c?|d?|e?|f?}-{a?|b?|c?|d?|e?|f?": 442, + "a?|b?|c?|d?|e?}": 791, + "a?|b?|c?|d?|e?}*OC": 2034, + "a?|b?|c?|d?|e?}*OSO/3=O/3=O": 1253, + "a?|b?|c?|d?|e?}-{a?|b?|c?|d?|e?": 478, + "a?|b?|c?|d?}": 1923, + "a?|b?|c?|d?}*OC": 1951, + "a?|b?|c?|d?}*OSO/3=O/3=O": 1349, + "a?|b?|c?|d?}-{a?|b?|c?|d?": 489, + "a?|b?|c?}*OC": 1563, + "a?|b?|c?}*OCC/3=O": 1773, + "a?|b?|c?}*OSO/3=O/3=O": 2030, + "a?|b?|c?}-{a?|b?|c?": 604, + "a?|b?}*OSO/3=O/3=O": 2101, + "a?|b?}-{a?|b?": 996, + "ab": 1316, + "ac": 1833, + "ad": 485, + "ad111": 1895, + "ad112": 1681, + "ad122": 1040, + "ad122h-1": 1734, + "ad122m-1b": 1285, + "ad2": 1539, + "ad21": 1837, + "ad221": 2041, + "ad222": 945, + "ad222m-1b": 1153, + "ad222m-1x": 1845, + "ad22h-1b": 1413, + "adxx": 2037, + "al": 1914, + "am": 1707, + "an": 912, + "ar": 1784, + "ax": 473, + "ax1": 1725, + "ax11": 850, + "ax11xh-1u": 1071, + "ax12": 732, + "ax12xh-1d": 1278, + "ax12xh-1u": 1077, + "ax21": 1789, + "ax22": 1607, + "axx": 524, + "axx1": 1029, + "axx1xh-1u": 1426, + "axx2": 881, + "axx21": 1662, + "axx2xh-1d": 1528, + "axx2xh-1u": 1529, + "axxxh-1x": 1134, + "axxxx": 224, + "axxxxA-1x": 1295, + "axxxxh-1x": 231, + "axxxxm-1x": 618, + "axxxxxh-1a": 2071, + "axxxxxh-1x": 1139, + "b": 72, + "b1": 179, + "b1-": 2000, + "b1-b": 1432, + "b2": 568, + "b2-": 396, + "b2-c1": 418, + "b2-d1": 1264, + "b2|": 1516, + "b3": 1408, + "b3*N": 1857, + "b3-": 271, + "b3-c1": 291, + "b3-c2": 750, + "b3-d1": 783, + "b3-e1": 1666, + "b4-": 236, + "b4-c1": 242, + "b4-d1": 745, + "b4-e1": 981, + "b4-f1": 1260, + "b4-g1": 2072, + "b5-": 1287, + "b5-c1": 1517, + "b6-": 339, + "b6-c1": 509, + "b6-c2": 906, + "b6-d1": 1036, + "b6-e1": 1112, + "b6-f1": 966, + "b6-g1": 1141, + "b6-h1": 1979, + "b?-": 237, + "b?-c1": 251, + "b?-c2": 793, + "b?-d1": 1072, + "b?-e1": 910, + "b?-f1": 938, + "b?-g1": 1021, + "b?-h1": 1250, + "b?-i1": 1531, + "b?-j1": 1671, + "c": 73, + "c(O)": 1913, + "c1": 185, + "c2": 436, + "c2-": 402, + "c2-d1": 413, + "c2-e1": 1558, + "c2|": 1505, + "c3-": 248, + "c3-d1": 255, + "c3-d2": 1331, + "c3-e1": 779, + "c3-f1": 1826, + "c4-": 288, + "c4-d1": 321, + "c4-d2": 1983, + "c4-e1": 821, + "c4-f1": 1091, + "c4-g1": 1289, + "c4-h1": 1097, + "c4-i1": 1200, + "c4-j1": 1392, + "c4-k1": 1218, + "c4-l1": 1761, + "c5-": 955, + "c5-d1": 1130, + "c6-": 268, + "c6-d1": 593, + "c6-d2": 2008, + "c6-e1": 738, + "c6-f1": 758, + "c6-g1": 607, + "c6-h1": 566, + "c6-i1": 628, + "c6-j1": 767, + "c6-k1": 682, + "c6-l1": 898, + "c6-m1": 1314, + "c6-n1": 2005, + "c7-": 1248, + "c8-": 1364, + "c8-d2": 1484, + "c?-": 229, + "c?-d1": 258, + "c?-d2": 1161, + "c?-e1": 880, + "c?-f1": 844, + "c?-g1": 711, + "c?-h1": 649, + "c?-i1": 654, + "c?-j1": 820, + "c?-k1": 720, + "c?-l1": 894, + "c?-m1": 1038, + "c?-n1": 1445, + "c?-o1": 1608, + "c?-p1": 1992, + "c?-q1": 1945, + "c?-r1": 2066, + "cc": 1256, + "d": 74, + "d1": 186, + "d1-c3|c6": 1387, + "d11": 1489, + "d111": 1637, + "d111h": 1678, + "d1122h": 325, + "d1122h-2": 406, + "d11h": 1320, + "d12h": 1675, + "d2": 357, + "d2-": 278, + "d2-e1": 282, + "d21": 204, + "d21122h": 207, + "d21h": 1801, + "d22": 1379, + "d221h": 1679, + "d22h": 1219, + "d2h": 1776, + "d2|": 1335, + "d2|e2": 1502, + "d3-": 343, + "d3-e1": 411, + "d3-e2": 1122, + "d3-f1": 927, + "d3-g1": 1858, + "d4-": 306, + "d4-e1": 408, + "d4-f1": 842, + "d4-g1": 792, + "d4-h1": 650, + "d4-i1": 857, + "d4-j1": 1680, + "d4-k1": 2102, + "d5-": 2029, + "d6-": 480, + "d6-e1": 678, + "d6-e2": 1866, + "d6-f1": 1227, + "d6-g1": 1252, + "d6-h1": 1234, + "d6-i1": 2095, + "d7-": 1280, + "d7-e1": 1774, + "d8-": 1886, + "d8-e2": 2015, + "d?-": 247, + "d?-e1": 275, + "d?-e2": 1050, + "d?-f1": 961, + "d?-g1": 754, + "d?-h1": 640, + "d?-i1": 788, + "d?-j1": 1001, + "d?-k1": 1360, + "dd": 2036, + "dd1": 1279, + "dd1dh": 1356, + "dd2": 1291, + "dd2dh": 1361, + "dh": 700, + "di": 1198, + "dx": 1131, + "dxdh": 1268, + "dxx": 1629, + "dxxxx": 455, + "e": 75, + "e1": 200, + "e1-": 1977, + "e2": 547, + "e2-": 497, + "e2-f1": 510, + "e3-": 347, + "e3-f1": 394, + "e3-f2": 1344, + "e3-g1": 1265, + "e4-": 287, + "e4-f1": 308, + "e4-g1": 526, + "e4|": 1064, + "e4|e6|": 1451, + "e4|f4|": 1623, + "e4|f4|g": 1654, + "e6-": 638, + "e6-f1": 796, + "e6-f2": 2038, + "e6-g1": 1536, + "e6|": 1205, + "e7-": 1576, + "e7-f1": 1704, + "e?-": 276, + "e?-f1": 295, + "e?-f2": 1197, + "e?-g1": 953, + "e?-h1": 817, + "e?-i1": 1305, + "eE": 1105, + "ec": 2076, + "en": 746, + "er": 1257, + "et": 1062, + "ethyl": 1742, + "f": 76, + "f1": 211, + "f1-": 2092, + "f1-a?|b?|c?|d?|e?}": 1798, + "f2": 619, + "f2-": 591, + "f2-g1": 616, + "f3-": 395, + "f3-g1": 464, + "f3-g2": 710, + "f3-h1": 1645, + "f3|f": 999, + "f3|f6": 1035, + "f4-": 479, + "f4-g1": 511, + "f4-h1": 1201, + "f4|": 1085, + "f6-": 543, + "f6-g1": 985, + "f6-g2": 765, + "f6-h1": 1417, + "f6-i1": 1985, + "f6|g": 1213, + "f7-": 1978, + "f?-": 309, + "f?-g1": 363, + "f?-g2": 499, + "f?-h1": 1396, + "f?-i1": 1940, + "g": 77, + "g1": 232, + "g1-": 1986, + "g1-a?|b?|c?|d?|e?|f?}": 1672, + "g2": 348, + "g2-": 482, + "g2-f3|f6": 1051, + "g2-h1": 531, + "g3-": 491, + "g3-h1": 544, + "g3-h2": 1261, + "g3|g": 748, + "g3|g6": 761, + "g4-": 458, + "g4-h1": 486, + "g4-i1": 1182, + "g6-": 681, + "g6-h1": 1136, + "g6-i1": 1238, + "g6-j1": 1404, + "g8-": 1711, + "g8-h2": 1720, + "g?-": 329, + "g?-h1": 401, + "g?-h2": 885, + "g?-i1": 1178, + "g?-j1": 1513, + "gen": 983, + "genin": 1125, + "gl": 1701, + "glyc": 1770, + "h": 78, + "h-1": 120, + "h-1a": 277, + "h-1b": 303, + "h-1u": 2096, + "h-1x": 203, + "h1": 234, + "h1-": 1577, + "h11": 1904, + "h1122h": 1338, + "h12": 1946, + "h2": 315, + "h2-": 438, + "h2-g3|g6": 773, + "h2-i1": 506, + "h21": 1892, + "h2112h": 574, + "h2122h": 525, + "h22": 1850, + "h222h": 1321, + "h2h": 674, + "h3-": 572, + "h3-i1": 629, + "h3-i2": 1572, + "h4": 890, + "h4-": 443, + "h4-i1": 466, + "h4-j1": 1194, + "h4h": 1190, + "h6-": 702, + "h6-i1": 1184, + "h6-i2": 2058, + "h6-j1": 1497, + "h6-k1": 1650, + "h6-l1": 1799, + "h8-": 1375, + "h8-i2": 1380, + "h?-": 352, + "h?-i1": 409, + "h?-i2": 893, + "h?-j1": 1301, + "hU": 1048, + "hU122h": 1554, + "ha": 626, + "ha122h-2": 669, + "ha122h-2b": 830, + "ha122h-2x": 1104, + "haxx": 2017, + "hdxdh": 1269, + "hxh": 853, + "hxxxxh": 1123, + "hy": 934, + "hyd": 1137, + "hydro": 1144, + "hydroxy": 1215, + "hyl": 1698, + "i": 79, + "i1": 240, + "i1-": 1302, + "i1-a?|b?|c?|d?|e?|f?|g?|h?}": 1961, + "i1-a?|b?|c?|d?|e?}": 2077, + "i2": 627, + "i2-": 522, + "i2-j1": 549, + "i3-": 555, + "i3-j1": 658, + "i3-j2": 1041, + "i3|i": 1655, + "i3|i6": 1743, + "i4-": 471, + "i4-j1": 501, + "i4-k1": 1151, + "i6-": 713, + "i6-j1": 1359, + "i6-j2": 1472, + "i6-k1": 1673, + "i6-l1": 1405, + "i?-": 345, + "i?-j1": 415, + "i?-j2": 859, + "i?-k1": 1317, + "i?-l1": 1193, + "ic": 840, + "ic@acid": 1121, + "ic~": 1573, + "id": 861, + "ide": 1896, + "in": 684, + "in@=@SMILES@O": 2042, + "ine": 1887, + "j": 80, + "j1": 253, + "j1-": 1224, + "j1-a?|b?|c?|d?|e?|f?|g?|h?|i?}": 1905, + "j2": 585, + "j2-": 599, + "j2-i3|i6": 1764, + "j2-k1": 656, + "j3-": 655, + "j3-k1": 769, + "j3-k2": 1231, + "j3|j": 1646, + "j3|j6": 1683, + "j4-": 529, + "j4-k1": 565, + "j4-l1": 1744, + "j6-": 776, + "j6-k1": 1537, + "j6-k2": 1469, + "j6-m1": 1758, + "j6-n1": 2054, + "j?-": 405, + "j?-k1": 470, + "j?-k2": 873, + "j?-l1": 1752, + "j?-m1": 1626, + "j?-n1": 2093, + "k": 81, + "k1": 263, + "k1-": 1204, + "k2": 632, + "k2-": 567, + "k2-j3|j6": 1684, + "k2-l1": 630, + "k3-": 762, + "k3-l1": 854, + "k3-l2": 1595, + "k3|k": 1593, + "k3|k6": 1631, + "k4-": 610, + "k4-l1": 665, + "k4-m1": 1584, + "k6-": 753, + "k6-l1": 1980, + "k6-n1": 1941, + "k6-o1": 1243, + "k?-": 416, + "k?-l1": 496, + "k?-l2": 1116, + "k?-m1": 1888, + "k?-n1": 1780, + "k?-o1": 1124, + "l": 82, + "l1": 284, + "l1-": 1362, + "l2": 785, + "l2-": 685, + "l2-k3|k6": 1632, + "l2-m1": 819, + "l3-": 800, + "l3-m1": 865, + "l3-m2": 1930, + "l3|l": 2019, + "l3|l6": 2078, + "l4-": 545, + "l4-m1": 589, + "l4-n1": 1506, + "l6-": 896, + "l6-p1": 1749, + "l?-": 450, + "l?-m1": 516, + "l?-m2": 1383, + "l?-n1": 1790, + "l?-o1": 1991, + "l?-p1": 1726, + "l?-q1": 1804, + "m": 83, + "m-1": 189, + "m-1a": 274, + "m-1b": 423, + "m-1x": 318, + "m1": 302, + "m1-": 1547, + "m2": 948, + "m2-": 828, + "m2-l3|l6": 2079, + "m2-n1": 1039, + "m3-": 717, + "m3-n1": 836, + "m3-n2": 1284, + "m3|m": 1762, + "m3|m6": 1805, + "m4-": 663, + "m4-n1": 735, + "m4-o1": 1368, + "m6-": 902, + "m6-n2": 1548, + "m?-": 481, + "m?-n1": 620, + "m?-n2": 950, + "m?-p1": 1686, + "m?-q1": 2021, + "m?-r1": 1948, + "methyl": 1900, + "n": 84, + "n1": 310, + "n1*1": 1721, + "n1*1O": 677, + "n1*1O(CCCCCC$3": 1963, + "n1*1O(CCCCCC$3/6)N": 814, + "n1-": 1057, + "n1-4": 1778, + "n2": 634, + "n2*1O": 1520, + "n2*OC": 1730, + "n2-": 672, + "n2-6": 872, + "n2-8": 1343, + "n2-m3|m6": 1806, + "n2-o1": 1446, + "n3-": 807, + "n3-o1": 922, + "n3-o2": 1987, + "n3|n": 1492, + "n3|n6": 1508, + "n4-": 731, + "n4-o1": 806, + "n4-p1": 1571, + "n6-": 1403, + "n?-": 590, + "n?-o1": 734, + "n?-o2": 1220, + "n?-q1": 1893, + "o": 85, + "o1": 338, + "o1-": 1880, + "o2": 874, + "o2-": 1030, + "o2-n3|n6": 1509, + "o2-p1": 2059, + "o3-": 895, + "o3-p1": 957, + "o3|o": 1286, + "o3|o6": 1298, + "o4-": 774, + "o4-p1": 855, + "o4-q1": 1538, + "o6-": 2009, + "o?-": 637, + "o?-p1": 752, + "o?-p2": 1503, + "ogenin": 1841, + "oic@acid": 1808, + "ol": 692, + "ol@=@SMILES@C": 1823, + "ole": 1617, + "olean": 1731, + "olic~": 1917, + "on": 1163, + "op": 2025, + "os": 1786, + "p": 86, + "p1": 400, + "p2": 1158, + "p2-": 1067, + "p2-o3|o6": 1299, + "p3-": 976, + "p3-q1": 1101, + "p3|p6": 1487, + "p4-": 907, + "p4-q1": 1082, + "p4-r1": 1759, + "p6-": 1828, + "p?-": 778, + "p?-q1": 952, + "p?-q2": 1433, + "q": 87, + "q1": 448, + "q2": 1020, + "q2-": 1209, + "q2-p3|p6": 1488, + "q3-": 1126, + "q3-r1": 1246, + "q3|q6": 1695, + "q4-": 1086, + "q4-r1": 1303, + "q4-s1": 1969, + "q?-": 843, + "q?-r1": 1026, + "q?-r2": 1993, + "r": 88, + "r1": 474, + "r2": 1365, + "r2-": 1334, + "r2-q3|q6": 1696, + "r3-": 1388, + "r3-s1": 1532, + "r3|r6": 1705, + "r4-": 1195, + "r4-s1": 1384, + "r?-": 963, + "r?-s1": 1138, + "ri": 1514, + "ro": 871, + "s": 89, + "s1": 550, + "s2": 1872, + "s2-": 1409, + "s2-r3|r6": 1706, + "s3-": 1609, + "s3-t1": 1802, + "s3|s": 1728, + "s3|s6": 1735, + "s4-": 1556, + "s4-t1": 1781, + "s?-": 1173, + "s?-t1": 1428, + "st": 1407, + "t": 90, + "t1": 652, + "t2": 1901, + "t2-": 1474, + "t2-s3|s6": 1736, + "t3-": 1970, + "t?-": 1829, + "tri": 1819, + "u": 91, + "u1": 260, + "u112": 1543, + "u1121h": 2048, + "u11221h": 582, + "u11222h": 1410, + "u1122h": 286, + "u1122m": 1414, + "u12": 1186, + "u1211h": 1955, + "u1221": 328, + "u1221h": 2087, + "u1221m": 330, + "u122h": 1281, + "u2": 188, + "u2-": 1897, + "u21": 1329, + "u2112": 751, + "u2112A": 1087, + "u2112h": 252, + "u2112m": 970, + "u211h": 977, + "u212": 1154, + "u2121A": 1466, + "u2122": 664, + "u2122A": 775, + "u2122h": 219, + "u2122m": 1214, + "u212h": 683, + "u22": 1254, + "u2211": 617, + "u2211m": 631, + "u2222h": 1670, + "u222h": 1498, + "u4": 1258, + "u4344h": 1964, + "ud": 838, + "ud222m": 1981, + "ux": 913, + "ux12": 1640, + "ux12xh": 1717, + "uxx": 679, + "uxx2": 1449, + "uxx2xh": 1624, + "uxxxh": 888, + "uxxxx": 201, + "uxxxxA": 781, + "uxxxxh": 212, + "uxxxxm": 398, + "uxxxxxh": 611, + "v": 92, + "v1": 917, + "w": 93, + "w1": 1203, + "x": 94, + "x1": 759, + "x2": 737, + "x21": 1793, + "x22h": 1889, + "x2h": 1794, + "x2xh": 2031, + "xA-1": 1450, + "xA-1u": 1559, + "xh": 317, + "xh-1": 452, + "xh-1a": 1928, + "xh-1d": 722, + "xh-1u": 530, + "xh-1x": 639, + "xh-2x": 1582, + "xm": 1447, + "xm-1": 1118, + "xm-1u": 1199, + "xx": 129, + "xxh": 1846, + "xxxh": 1569, + "xxxx": 182, + "xxxxh": 1092, + "xy": 1119, + "y": 95, + "y1": 1574, + "yc": 1490, + "yl": 1994, + "z": 96, + "z1": 1667, + "zz": 1155, + "{": 97, + "{1": 695, + "{14}": 1933, + "{16}": 1585, + "{1}": 1687, + "{2": 768, + "{22": 1884, + "{2}": 1974, + "{3": 1614, + "{3}": 782, + "{3}[C@@H](O)": 1090, + "{3}[C@@H](O)CC[C@]": 1270, + "{3}[C@@H](O)CC[C@]2(C)[C@@]3": 1988, + "{3}[C@H](O)": 2097, + "{3}[C@H](O)C": 2103, + "{5": 905, + "{7": 1346, + "{8": 1641, + "|": 98, + "|f2": 1812, + "|g2": 2080, + "}": 99, + "}C": 503, + "}C(": 1754, + "}C(O)": 671, + "}C(O)=C": 1581, + "}C(O)=O)": 1369, + "}C(O)C": 2111, + "}C1": 1620, + "}CO)": 1149, + "}[C@@H](O)": 1232, + "~": 100, + "~n": 425, + "Δ": 101, + "α": 102, + "β": 103, + "β,": 2060, + "γ": 104, + "δ": 105, + "ζ": 106, + "ξ": 107, + "С": 108, + "’": 109, + "′": 110, + "″": 111, + "→": 112, + "−": 113 + } +} diff --git a/releases/2026-10-02/figures/figure3_inputs/source_example.json b/releases/2026-10-02/figures/figure3_inputs/source_example.json new file mode 100644 index 0000000000000000000000000000000000000000..4a15177b2b1c17066aa4ab3da30ee24e3b528cc8 --- /dev/null +++ b/releases/2026-10-02/figures/figure3_inputs/source_example.json @@ -0,0 +1,131 @@ +{ + "schema": "bertose_figure3_verified_example_v1", + "example": { + "wurcs": "WURCS=2.0/2,2,1/[a2122h-1b_1-5][a2211m-1a_1-5]/1-2/a4-b1", + "provenance": "Existing base-tokenizer test_wurcs example at source line729; corpus membership or independent chemistry validation is not asserted.", + "output": { + "tokens": [ + "[START]", + "a2122h-1b", + "1-5", + "a2211m-1a", + "1-5", + "a4-b1", + "[END]" + ], + "token_ids": [ + 2, + 177, + 119, + 314, + 119, + 228, + 3 + ], + "residue_ids": [ + -1, + 0, + 0, + 1, + 1, + -2, + -1 + ], + "branch_depths": [ + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "linkage_types": [ + 0, + 0, + 0, + 0, + 0, + 3, + 0 + ], + "attention_mask": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "length": 7, + "tree_channels_valid": true, + "tree_channel_failure_reason": "" + }, + "padding_count": 249, + "unknown_tokens": 0 + }, + "selected_unit": { + "semantic_unit_index": 1, + "text": "a2122h-1b", + "type_from_code": "residue", + "residue_id": 0, + "branch_depth": 0, + "linkage_type": 0, + "raw_wurcs_character_span_zero_based_end_exclusive": [ + 17, + 26 + ], + "output_token_span_zero_based_end_exclusive": [ + 1, + 2 + ], + "bpe_tokens": [ + "a2122h-1b" + ], + "token_ids": [ + 177 + ] + }, + "source_files": { + "frozen_topology": { + "path": "06_code/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py", + "sha256": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7" + }, + "frozen_a5_tokenizer": { + "path": "06_code/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py", + "sha256": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4" + }, + "final_tree_runtime": { + "path": "06_code/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py", + "sha256": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04" + }, + "base_tokenizer": { + "path": "06_code/bertose_source/bert_training_v4/downstream_tasks/utils/wurcs_bpe_tokenizer.py", + "sha256": "0bc54399362945601bcfd403441fc80968d173200dd0561f57568b2053a94839" + }, + "vocabulary": { + "path": "06_code/bertose_source/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json", + "sha256": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b" + }, + "parent_index": { + "path": "04_source_data/figure_inputs/review_sequence_parent_index.tsv.gz", + "sha256": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0" + } + }, + "runtime_class": "ReviewA5WURCSBPETokenizerV3", + "category_origin": "pre_tokenize semantic-unit type; not a separately returned tokenize_sequence field", + "claim_limit": "Character-to-token example is one residue semantic unit, not the full raw WURCS string. The zero linkage value on this residue means no linkage annotation, not a bond class.", + "counts": { + "characters": 104, + "special_tokens": 10, + "initial_items": 114, + "merges": 2000, + "vocabulary_items": 2114, + "fit_parents": 221899, + "fit_parents_over256": 72, + "fit_parents_at_most256": 221827, + "parent_index_contributor_flag_note": "model_pretraining_contributor is true for all fit parents in the source index;221827 is obtained after the full_untruncated_length<=256 filter." + }, + "verification_receipt_sha256": "0f7767a70addb1f54b047cf06ad838feca7c461a1b8350724f3b0e15b115dced" +} diff --git a/releases/2026-10-02/figures/final_iar/README.md b/releases/2026-10-02/figures/final_iar/README.md new file mode 100644 index 0000000000000000000000000000000000000000..852805b5fa81e20d735fdc6fb75f2a317a4c6c93 --- /dev/null +++ b/releases/2026-10-02/figures/final_iar/README.md @@ -0,0 +1,15 @@ +# Final IAR Figures 4 and 5 + +`build_final_iar_figures.py` reproduces both final figures from the job 16604931 artifacts, saved palette and verified Wilson-interval handoff CSV in `inputs/`. It performs no inference or fitting. Python requires matplotlib and Pillow. + +From this directory: + +```bash +python build_final_iar_figures.py --outdir /absolute/output/directory +``` + +Without `--outdir`, outputs are written here. In the consolidated submission package, `06_code/figures/build_grey_seal_figure5.py` and `05_figures/build_current_iar_figure4.py` both call this builder and default to the package's `05_figures` directory. Both support `--outdir` and `--inputs`. The former also preserves the main figure builder's `build(package_dir, outdir)` API; its earlier eight-row `--source-csv` option is superseded by the final input directory. + +Each figure has SVG, PDF, 600 dpi PNG, RGB LZW TIFF and a ten-row source CSV. `IAR_token_metrics_source.csv` supplies the separate masked-token denominators, coverage and accuracy among answered tokens. `build_receipt.json` records input, script and output hashes. The plot source uses exact-span first-choice and IAR metrics: benchmark `all_cases`, grey-seal `not_in_wa3_training` (160 cases), and the corresponding baseline subsets. Baseline bar heights retain their recorded four-decimal precision. The 12 baseline numerator counts are uniquely recovered from the saved rate and denominator; all integers from zero to n are checked. Wilson limits use those counts, while BERTose counts are reproduced from the summary. All 20 intervals are recomputed and checked against `iar_recount_and_wilson_intervals.csv`; token coverage and conditional-accuracy rows and duplicate or historical comparator rows in that file are not plotted. + +The original inputs and verified Wilson CSV remain unchanged. Both figures use aligned horizontal residue/linkage panels with one shared set of method labels at 6.5 × 3.1 inches. Arial type is 10.5–12 pt, and the same five method colours apply to both figures. Case counts, masking rules, linkage-readout scope and threshold settings are stated in the captions. The 20 bar values, percentage rounding and Wilson limits are preserved. Error bars describe each proportion; they are not paired method-comparison tests. Rendering used Python 3.12.14 and Matplotlib 3.10.7. These plotting checks do not rerun or independently validate the upstream encoder. diff --git a/releases/2026-10-02/figures/final_iar/build_final_iar_figures.py b/releases/2026-10-02/figures/final_iar/build_final_iar_figures.py new file mode 100644 index 0000000000000000000000000000000000000000..2c25b73633b7af08b8c378d30957be558bd9fcf6 --- /dev/null +++ b/releases/2026-10-02/figures/final_iar/build_final_iar_figures.py @@ -0,0 +1,273 @@ +#!/usr/bin/env python3 +"""Reproduce candidate Supplementary Figures 4/5 from the final job 16604931 files. + +Requires matplotlib and Pillow. Run this script with --outdir to write elsewhere. +Only the saved input files and palette under inputs/ are read. Baseline bar +heights retain their four-decimal rates; unique integer counts give Wilson bars. +The default output directory is this candidate directory, never the live package. +""" +from pathlib import Path +from decimal import Decimal, ROUND_HALF_UP +import argparse +import csv +import hashlib +import json +import math +import sys + +try: + import matplotlib +except ModuleNotFoundError: + sys.path.append('/opt/homebrew/lib/python3.12/site-packages') + import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from PIL import Image + +HERE = Path(__file__).resolve().parent +STEMS = {4: 'Supplementary_Figure_4_current_IAR_exact_span', + 5: 'Supplementary_Figure_5_grey_seal_exact_span'} +KEYS = ['bertose_first_choice', 'bertose_iar', 'marginal_frequency', + 'context_frequency', 'nearest_neighbour'] +LABELS = ['BERTose first choice', 'BERTose IAR exact-span', 'Marginal frequency', + 'Context frequency', 'Nearest neighbour'] +BENCH_RUNS = ['bench1392/benchmark1392_residue_full', 'bench1392/benchmark1392_linkage_full'] +SEAL_RUNS = ['seal162/seal162_residue_t080', 'seal162/seal162_linkage_t080'] +EXPECTED_COUNTS = {(4, 'residue'): (1392, 1187, 1058, 1394, 1103, 1058), + (4, 'linkage'): (1362, 1081, 814, 1419, 908, 829), + (5, 'residue'): (160, 149, 141, 160, 142, 141), + (5, 'linkage'): (160, 134, 97, 169, 114, 99)} + + +def sha(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def rounded_percent(value): + return str((Decimal(str(value)) * 100).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)) + + +def exact_count(rate, total): + count = round(rate * total) + assert math.isclose(rate * total, count, abs_tol=1e-9) + return count + + +def wilson_interval(k, n, z=1.959963984540054): + """Two-sided 95% Wilson score interval for one binomial proportion.""" + rate = k / n + denominator = 1 + z * z / n + center = (rate + z * z / (2 * n)) / denominator + half = z * math.sqrt(rate * (1 - rate) / n + z * z / (4 * n * n)) / denominator + return max(0.0, center - half), min(1.0, center + half) + + +def add_wilson_intervals(figures, inputs): + """Check the handoff against existing counts; keep all plotted rates intact.""" + path = inputs / 'iar_recount_and_wilson_intervals.csv' + handoff = list(csv.DictReader(path.open(newline=''))) + for figure, rows in figures.items(): + dataset = 'benchmark' if figure == 4 else 'grey_seal' + for row in rows: + key, n = row['method_key'], row['n_cases'] + if key.startswith('bertose'): + method = 'BERTose' + metric = 'first_choice_exact_span' if key == 'bertose_first_choice' else 'iar_exact_span_t080' + k = row['n_correct_cases'] + basis = 'exact count from summary; independently recounted from archived cases' + else: + method, metric = key, 'exact_span_no_threshold' + candidates = [k for k in range(n + 1) if round(k / n, 4) == row['exact_span_accuracy']] + assert len(candidates) == 1, (row, candidates) + k = candidates[0] + row['n_correct_cases'] = k + row['measurement_precision'] = 'saved four-decimal bar rate; unique numerator recovered from rate and case denominator' + basis = 'unique integer consistent with saved four-decimal rate; not a raw baseline-case recount' + selected = [r for r in handoff if (r['set'], r['task'], r['method'], r['metric']) + == (dataset, row['task'], method, metric)] + assert len(selected) == 1 and int(selected[0]['k']) == k and int(selected[0]['n']) == n + lo, hi = wilson_interval(k, n) + assert abs(lo - float(selected[0]['wilson95_lo'])) < 1e-14 + assert abs(hi - float(selected[0]['wilson95_hi'])) < 1e-14 + assert abs(k / n - float(selected[0]['rate'])) < 1e-14 + row.update(wilson95_lo=lo, wilson95_hi=hi, + interval_numerator=k, interval_denominator=n, + interval_exact_rate=k / n, interval_count_basis=basis, + interval_metric='exact-span correct cases / all cases in panel', + interval_method='two-sided 95% Wilson score', + interval_source_file=path.name, interval_source_sha256=sha(path)) + + +def write_csv(path, rows): + with path.open('w', newline='') as handle: + writer = csv.DictWriter(handle, fieldnames=list(rows[0])) + writer.writeheader() + writer.writerows(rows) + + +def assemble(inputs): + summary_path = inputs / 'final_iar_summary.json' + baseline_path = inputs / 'baselines_same_cases.csv' + summary = json.loads(summary_path.read_text()) + baselines = list(csv.DictReader(baseline_path.open(newline=''))) + figures, token_rows = {}, [] + for figure, runs, subset, baseline_subset in [ + (4, BENCH_RUNS, 'all_cases', 'all_cases'), + (5, SEAL_RUNS, 'not_in_wa3_training', 'single_answer_not_in_wa3_training')]: + rows = [] + for task, run in zip(('residue', 'linkage'), runs): + m = summary['runs'][run][subset] + n = m['num_cases'] + n_masked = m['num_masked_positions'] + first_correct = exact_count(m['initial_exact_span_accuracy_top1'], n) + iar_correct = exact_count(m['iterative_exact_span_accuracy'], n) + answered = exact_count(m['iterative_resolved_fraction'], n_masked) + answered_correct = exact_count(m['iterative_accuracy_among_resolved'], answered) + assert (n, first_correct, iar_correct, n_masked, answered, answered_correct) == EXPECTED_COUNTS[(figure, task)] + token_rows.append(dict(figure=figure, task=task, source_run=run, + source_subset=subset, n_cases=n, n_masked_tokens=n_masked, + n_answered_tokens=answered, n_correct_answered_tokens=answered_correct, + token_coverage=m['iterative_resolved_fraction'], + token_coverage_display_percent=rounded_percent(m['iterative_resolved_fraction']), + accuracy_among_answered=m['iterative_accuracy_among_resolved'], + accuracy_among_answered_display_percent=rounded_percent(m['iterative_accuracy_among_resolved']), + source_file=summary_path.name, source_sha256=sha(summary_path))) + for key, label in zip(KEYS, LABELS): + is_bertose = key.startswith('bertose') + metric = ('initial_exact_span_accuracy_top1' if key == 'bertose_first_choice' + else 'iterative_exact_span_accuracy') + if is_bertose: + value = m[metric] + correct = exact_count(value, n) + source, selected_subset = summary_path, subset + precision = 'summary full-precision rate; exact numerator checked against denominator' + else: + selected = [r for r in baselines if r['set'] + '/' + r['run'] == run + and r['method'] == key and r['subset'] == baseline_subset] + assert len(selected) == 1 and int(selected[0]['n']) == n + value = float(selected[0]['exact_span_accuracy']) + correct, source, selected_subset = '', baseline_path, baseline_subset + metric = 'exact_span_accuracy' + precision = 'saved four-decimal fractional rate; numerator not inferred' + rows.append(dict(figure=figure, task=task, method=label, method_key=key, + n_cases=n, n_correct_cases=correct, exact_span_accuracy=value, + exact_span_percent=value * 100, display_percent=rounded_percent(value), + confidence_threshold='0.80' if key == 'bertose_iar' else '', + prediction_policy=('up to three rounds; abstentions incorrect' if key == 'bertose_iar' + else 'top-ranked first-round prediction; no confidence threshold' if is_bertose + else 'one candidate; no confidence threshold'), + bertose_output=('linear read-out fitted on training glycans at masked single-token linkages; encoder frozen' + if task == 'linkage' and is_bertose else 'pretrained output layer' if is_bertose else ''), + measurement_precision=precision, source_file=source.name, + source_sha256=sha(source), source_run=run, source_subset=selected_subset, + source_metric=metric)) + # Published BERTose baseline CSV must agree with the full-precision summary. + saved = [r for r in baselines if r['set'] + '/' + r['run'] == run + and r['method'] == 'BERTose_final_IAR' and r['subset'] == baseline_subset] + assert len(saved) == 1 and abs(float(saved[0]['exact_span_accuracy']) - m['iterative_exact_span_accuracy']) <= 0.00005 + 1e-12 + figures[figure] = rows + add_wilson_intervals(figures, inputs) + return figures, token_rows + + +def style(): + plt.rcParams.update({'font.family': 'Arial', 'font.size': 11, 'axes.labelsize': 11, 'pdf.fonttype': 42, + 'ps.fonttype': 42, 'svg.fonttype': 'none', 'svg.hashsalt': 'iar-simplified-20260928', + 'axes.linewidth': .55, 'xtick.major.width': .55, 'ytick.major.width': .55, + 'text.color': '#252525', 'axes.labelcolor': '#252525', + 'xtick.color': '#252525', 'ytick.color': '#252525'}) + + +def save(fig, outdir, stem): + fig.canvas.draw() + renderer = fig.canvas.get_renderer() + outside = [] + for text in fig.findobj(plt.Text): + if text.get_visible() and text.get_text(): + box = text.get_window_extent(renderer) + if box.x0 < -.5 or box.y0 < -.5 or box.x1 > fig.bbox.x1 + .5 or box.y1 > fig.bbox.y1 + .5: + outside.append(text.get_text()) + assert not outside, outside + for ext in ('svg', 'pdf', 'png'): + meta = {'Date': None} if ext == 'svg' else {'CreationDate': None, 'ModDate': None} if ext == 'pdf' else {} + fig.savefig(outdir / f'{stem}.{ext}', dpi=600, facecolor='white', metadata=meta) + with Image.open(outdir / f'{stem}.png') as im: + dimensions = list(im.size) + im.convert('RGB').save(outdir / f'{stem}.tif', compression='tiff_lzw', dpi=(600, 600)) + fig.savefig(outdir / f'{stem}_preview.png', dpi=180, facecolor='white') + plt.close(fig) + return dimensions + + +def draw_completion(rows, outdir, palette, figure): + """Identical aligned panels; shared labels describe both method rows.""" + colors = [palette['alpha_0_6_hex8'][4]] + palette['alpha_0_6_hex8'][:4] + fig = plt.figure(figsize=(6.5, 3.1), facecolor='white') + labels = ['BERTose\nfirst choice', 'BERTose IAR', + 'Marginal\nfrequency', 'Context\nfrequency', 'Nearest\nneighbour'] + for letter, task, pos in [('a', 'residue', [.245, .20, .285, .675]), + ('b', 'linkage', [.650, .20, .285, .675])]: + ax = fig.add_axes(pos) + selected = [next(r for r in rows if r['task'] == task and r['method_key'] == key) + for key in KEYS] + values = [r['exact_span_percent'] for r in selected] + bars = ax.barh(range(5), values, color=colors, height=.57, + edgecolor='none', zorder=3) + for y, value, row, patch in zip(range(5), values, selected, bars): + patch.set_gid(f'point-estimate:{task}:{row["method_key"]}') + error = ax.errorbar(value, y, + xerr=[[value - row['wilson95_lo'] * 100], [row['wilson95_hi'] * 100 - value]], + fmt='none', ecolor='#4B5156', elinewidth=.85, capsize=2, capthick=.85, zorder=4) + error.lines[2][0].set_gid(f'wilson95:{task}:{row["method_key"]}') + ax.text(row['wilson95_hi'] * 100 + 2.1, y, row['display_percent'] + '%', + va='center', fontsize=10.5, clip_on=False, + gid=f'value-label:{task}:{row["method_key"]}') + ax.set_yticks(range(5), labels if task == 'residue' else [''] * 5) + ax.set(xlim=(0, 100), ylim=(4.6, -.6), xlabel='Exact-span accuracy (%)') + ax.set_xticks([0, 25, 50, 75, 100]) + ax.tick_params(axis='y', length=0, pad=8, labelsize=11) + ax.tick_params(axis='x', labelsize=10.5, length=3) + ax.grid(axis='x', color='#E6E9EB', linewidth=.55, zorder=0) + for side in ('top', 'right', 'left'): + ax.spines[side].set_visible(False) + ax.spines['bottom'].set_color('#777D81') + ax.text(0, 1.07, letter + ' ' + task.capitalize(), transform=ax.transAxes, + fontsize=12, weight='bold') + for label in ax.get_yticklabels()[:2]: + label.set_weight('bold') + return save(fig, outdir, STEMS[figure]), dict(zip(KEYS, colors)) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--inputs', type=Path, default=HERE / 'inputs') + parser.add_argument('--outdir', type=Path, default=HERE) + args = parser.parse_args() + args.outdir.mkdir(parents=True, exist_ok=True) + figures, token_rows = assemble(args.inputs) + style() + palette = json.loads((args.inputs / 'nature-bpg-palette.json').read_text()) + receipts = {} + for figure, rows in figures.items(): + source = args.outdir / f'{STEMS[figure]}_source.csv' + write_csv(source, rows) + dims, colors = draw_completion(rows, args.outdir, palette, figure) + receipts[str(figure)] = dict(figure=f'Supplementary Figure {figure}', source_rows=len(rows), + source_csv=source.name, source_csv_sha256=sha(source), png_dimensions_px=dims, + size_inches=[6.5, 3.1], raster_dpi=600, minimum_font_points=10.5, all_text_within_canvas=True, + error_bars=True, interval_method='two-sided 95% Wilson score', paired_tests=False, + significance_annotations=False, baseline_numerators_uniquely_recovered=True, + colors=colors, outputs={f'{STEMS[figure]}.{ext}': sha(args.outdir / f'{STEMS[figure]}.{ext}') + for ext in ('png', 'svg', 'pdf', 'tif')}) + write_csv(args.outdir / 'IAR_token_metrics_source.csv', token_rows) + receipt = dict(status='CANDIDATE', job_id='16604931', script_sha256=sha(Path(__file__)), + input_sha256={p.name: sha(p) for p in sorted(args.inputs.iterdir()) if p.is_file()}, + raw_case_records_read=False, + count_verification='summary rates reproduce integer counts; baseline integers uniquely recovered; all Wilson limits recomputed and handoff checked', + figures=receipts) + (args.outdir / 'build_receipt.json').write_text(json.dumps(receipt, indent=2) + '\n') + print(json.dumps({'outdir': str(args.outdir), 'figures': list(receipts), 'counts': 'verified'}, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/releases/2026-10-02/figures/final_iar/inputs/baselines_same_cases.csv b/releases/2026-10-02/figures/final_iar/inputs/baselines_same_cases.csv new file mode 100644 index 0000000000000000000000000000000000000000..48a867ac37e1e7e27e03f60c559da75dfad4169b --- /dev/null +++ b/releases/2026-10-02/figures/final_iar/inputs/baselines_same_cases.csv @@ -0,0 +1,61 @@ +set,run,method,subset,n,exact_span_accuracy +bench1392,benchmark1392_residue_full,marginal_frequency,all_cases,1392,0.2507 +bench1392,benchmark1392_residue_full,marginal_frequency,single_answer,1392,0.2507 +bench1392,benchmark1392_residue_full,marginal_frequency,single_answer_not_in_wa3_training,1392,0.2507 +bench1392,benchmark1392_residue_full,context_frequency,all_cases,1392,0.4088 +bench1392,benchmark1392_residue_full,context_frequency,single_answer,1392,0.4088 +bench1392,benchmark1392_residue_full,context_frequency,single_answer_not_in_wa3_training,1392,0.4088 +bench1392,benchmark1392_residue_full,nearest_neighbour,all_cases,1392,0.7414 +bench1392,benchmark1392_residue_full,nearest_neighbour,single_answer,1392,0.7414 +bench1392,benchmark1392_residue_full,nearest_neighbour,single_answer_not_in_wa3_training,1392,0.7414 +bench1392,benchmark1392_residue_full,BERTose_final_IAR,all_cases,1392,0.7601 +bench1392,benchmark1392_residue_full,BERTose_final_IAR,single_answer,1392,0.7601 +bench1392,benchmark1392_residue_full,BERTose_final_IAR,single_answer_not_in_wa3_training,1392,0.7601 +bench1392,benchmark1392_residue_full,WA0_submitted,all_cases,1392,0.8441 +bench1392,benchmark1392_residue_full,WA0_submitted,single_answer,1392,0.8441 +bench1392,benchmark1392_residue_full,WA0_submitted,single_answer_not_in_wa3_training,1392,0.8441 +bench1392,benchmark1392_linkage_full,marginal_frequency,all_cases,1362,0.1344 +bench1392,benchmark1392_linkage_full,marginal_frequency,single_answer,1362,0.1344 +bench1392,benchmark1392_linkage_full,marginal_frequency,single_answer_not_in_wa3_training,1362,0.1344 +bench1392,benchmark1392_linkage_full,context_frequency,all_cases,1362,0.558 +bench1392,benchmark1392_linkage_full,context_frequency,single_answer,1362,0.558 +bench1392,benchmark1392_linkage_full,context_frequency,single_answer_not_in_wa3_training,1362,0.558 +bench1392,benchmark1392_linkage_full,nearest_neighbour,all_cases,1362,0.7151 +bench1392,benchmark1392_linkage_full,nearest_neighbour,single_answer,1362,0.7151 +bench1392,benchmark1392_linkage_full,nearest_neighbour,single_answer_not_in_wa3_training,1362,0.7151 +bench1392,benchmark1392_linkage_full,BERTose_final_IAR,all_cases,1362,0.5977 +bench1392,benchmark1392_linkage_full,BERTose_final_IAR,single_answer,1362,0.5977 +bench1392,benchmark1392_linkage_full,BERTose_final_IAR,single_answer_not_in_wa3_training,1362,0.5977 +bench1392,benchmark1392_linkage_full,WA0_submitted,all_cases,1362,0.826 +bench1392,benchmark1392_linkage_full,WA0_submitted,single_answer,1362,0.826 +bench1392,benchmark1392_linkage_full,WA0_submitted,single_answer_not_in_wa3_training,1362,0.826 +seal162,seal162_residue_t080,marginal_frequency,all_cases,162,0.2778 +seal162,seal162_residue_t080,marginal_frequency,single_answer,162,0.2778 +seal162,seal162_residue_t080,marginal_frequency,single_answer_not_in_wa3_training,160,0.2812 +seal162,seal162_residue_t080,context_frequency,all_cases,162,0.5062 +seal162,seal162_residue_t080,context_frequency,single_answer,162,0.5062 +seal162,seal162_residue_t080,context_frequency,single_answer_not_in_wa3_training,160,0.5125 +seal162,seal162_residue_t080,nearest_neighbour,all_cases,162,0.7901 +seal162,seal162_residue_t080,nearest_neighbour,single_answer,162,0.7901 +seal162,seal162_residue_t080,nearest_neighbour,single_answer_not_in_wa3_training,160,0.7937 +seal162,seal162_residue_t080,BERTose_final_IAR,all_cases,162,0.8827 +seal162,seal162_residue_t080,BERTose_final_IAR,single_answer,162,0.8827 +seal162,seal162_residue_t080,BERTose_final_IAR,single_answer_not_in_wa3_training,160,0.8812 +seal162,seal162_residue_t080,WA0_submitted,all_cases,162,0.8642 +seal162,seal162_residue_t080,WA0_submitted,single_answer,162,0.8642 +seal162,seal162_residue_t080,WA0_submitted,single_answer_not_in_wa3_training,160,0.8625 +seal162,seal162_linkage_t080,marginal_frequency,all_cases,162,0.1728 +seal162,seal162_linkage_t080,marginal_frequency,single_answer,162,0.1728 +seal162,seal162_linkage_t080,marginal_frequency,single_answer_not_in_wa3_training,160,0.175 +seal162,seal162_linkage_t080,context_frequency,all_cases,162,0.6049 +seal162,seal162_linkage_t080,context_frequency,single_answer,162,0.6049 +seal162,seal162_linkage_t080,context_frequency,single_answer_not_in_wa3_training,160,0.6 +seal162,seal162_linkage_t080,nearest_neighbour,all_cases,162,0.6296 +seal162,seal162_linkage_t080,nearest_neighbour,single_answer,162,0.6296 +seal162,seal162_linkage_t080,nearest_neighbour,single_answer_not_in_wa3_training,160,0.6312 +seal162,seal162_linkage_t080,BERTose_final_IAR,all_cases,162,0.6049 +seal162,seal162_linkage_t080,BERTose_final_IAR,single_answer,162,0.6049 +seal162,seal162_linkage_t080,BERTose_final_IAR,single_answer_not_in_wa3_training,160,0.6062 +seal162,seal162_linkage_t080,WA0_submitted,all_cases,162,0.9753 +seal162,seal162_linkage_t080,WA0_submitted,single_answer,162,0.9753 +seal162,seal162_linkage_t080,WA0_submitted,single_answer_not_in_wa3_training,160,0.975 diff --git a/releases/2026-10-02/figures/final_iar/inputs/final_iar_summary.json b/releases/2026-10-02/figures/final_iar/inputs/final_iar_summary.json new file mode 100644 index 0000000000000000000000000000000000000000..87900a59d440bb321e47a3ae7f7c82221b01df6a --- /dev/null +++ b/releases/2026-10-02/figures/final_iar/inputs/final_iar_summary.json @@ -0,0 +1,140 @@ +{ + "runs": { + "bench1392/benchmark1392_residue_full": { + "all_cases": { + "num_cases": 1392, + "num_masked_positions": 1394, + "avg_masked_positions_per_case": 1.0014367816091954, + "initial_top1_token_accuracy": 0.851506456241033, + "initial_top5_token_accuracy": 0.9598278335724534, + "initial_exact_span_accuracy_top1": 0.8527298850574713, + "initial_exact_span_accuracy_top5": 0.9597701149425287, + "iterative_resolved_fraction": 0.7912482065997131, + "iterative_accuracy_among_resolved": 0.9592021758839528, + "iterative_final_token_accuracy": 0.7589670014347202, + "iterative_exact_span_accuracy": 0.7600574712643678, + "avg_iterations_used_per_case": 0.7923850574712644 + }, + "not_in_wa3_training": { + "num_cases": 1392, + "num_masked_positions": 1394, + "avg_masked_positions_per_case": 1.0014367816091954, + "initial_top1_token_accuracy": 0.851506456241033, + "initial_top5_token_accuracy": 0.9598278335724534, + "initial_exact_span_accuracy_top1": 0.8527298850574713, + "initial_exact_span_accuracy_top5": 0.9597701149425287, + "iterative_resolved_fraction": 0.7912482065997131, + "iterative_accuracy_among_resolved": 0.9592021758839528, + "iterative_final_token_accuracy": 0.7589670014347202, + "iterative_exact_span_accuracy": 0.7600574712643678, + "avg_iterations_used_per_case": 0.7923850574712644 + }, + "cases_using_readout": 0 + }, + "bench1392/benchmark1392_linkage_full": { + "all_cases": { + "num_cases": 1362, + "num_masked_positions": 1419, + "avg_masked_positions_per_case": 1.0418502202643172, + "initial_top1_token_accuracy": 0.7766032417195208, + "initial_top5_token_accuracy": 0.959830866807611, + "initial_exact_span_accuracy_top1": 0.7936857562408223, + "initial_exact_span_accuracy_top5": 0.9757709251101322, + "iterative_resolved_fraction": 0.6398872445384073, + "iterative_accuracy_among_resolved": 0.9129955947136564, + "iterative_final_token_accuracy": 0.5842142353770261, + "iterative_exact_span_accuracy": 0.5976505139500734, + "avg_iterations_used_per_case": 0.6637298091042585 + }, + "not_in_wa3_training": { + "num_cases": 1362, + "num_masked_positions": 1419, + "avg_masked_positions_per_case": 1.0418502202643172, + "initial_top1_token_accuracy": 0.7766032417195208, + "initial_top5_token_accuracy": 0.959830866807611, + "initial_exact_span_accuracy_top1": 0.7936857562408223, + "initial_exact_span_accuracy_top5": 0.9757709251101322, + "iterative_resolved_fraction": 0.6398872445384073, + "iterative_accuracy_among_resolved": 0.9129955947136564, + "iterative_final_token_accuracy": 0.5842142353770261, + "iterative_exact_span_accuracy": 0.5976505139500734, + "avg_iterations_used_per_case": 0.6637298091042585 + }, + "cases_using_readout": 1318 + }, + "seal162/seal162_residue_t080": { + "all_cases": { + "num_cases": 162, + "num_masked_positions": 162, + "avg_masked_positions_per_case": 1.0, + "initial_top1_token_accuracy": 0.9320987654320988, + "initial_top5_token_accuracy": 1.0, + "initial_exact_span_accuracy_top1": 0.9320987654320988, + "initial_exact_span_accuracy_top5": 1.0, + "iterative_resolved_fraction": 0.8888888888888888, + "iterative_accuracy_among_resolved": 0.9930555555555556, + "iterative_final_token_accuracy": 0.8827160493827161, + "iterative_exact_span_accuracy": 0.8827160493827161, + "avg_iterations_used_per_case": 0.8888888888888888 + }, + "not_in_wa3_training": { + "num_cases": 160, + "num_masked_positions": 160, + "avg_masked_positions_per_case": 1.0, + "initial_top1_token_accuracy": 0.93125, + "initial_top5_token_accuracy": 1.0, + "initial_exact_span_accuracy_top1": 0.93125, + "initial_exact_span_accuracy_top5": 1.0, + "iterative_resolved_fraction": 0.8875, + "iterative_accuracy_among_resolved": 0.9929577464788732, + "iterative_final_token_accuracy": 0.88125, + "iterative_exact_span_accuracy": 0.88125, + "avg_iterations_used_per_case": 0.8875 + }, + "cases_using_readout": 0 + }, + "seal162/seal162_linkage_t080": { + "all_cases": { + "num_cases": 162, + "num_masked_positions": 171, + "avg_masked_positions_per_case": 1.0555555555555556, + "initial_top1_token_accuracy": 0.8187134502923976, + "initial_top5_token_accuracy": 0.9590643274853801, + "initial_exact_span_accuracy_top1": 0.8395061728395061, + "initial_exact_span_accuracy_top5": 0.9691358024691358, + "iterative_resolved_fraction": 0.672514619883041, + "iterative_accuracy_among_resolved": 0.8695652173913043, + "iterative_final_token_accuracy": 0.5847953216374269, + "iterative_exact_span_accuracy": 0.6049382716049383, + "avg_iterations_used_per_case": 0.6975308641975309 + }, + "not_in_wa3_training": { + "num_cases": 160, + "num_masked_positions": 169, + "avg_masked_positions_per_case": 1.05625, + "initial_top1_token_accuracy": 0.8165680473372781, + "initial_top5_token_accuracy": 0.9585798816568047, + "initial_exact_span_accuracy_top1": 0.8375, + "initial_exact_span_accuracy_top5": 0.96875, + "iterative_resolved_fraction": 0.6745562130177515, + "iterative_accuracy_among_resolved": 0.868421052631579, + "iterative_final_token_accuracy": 0.5857988165680473, + "iterative_exact_span_accuracy": 0.60625, + "avg_iterations_used_per_case": 0.7 + }, + "cases_using_readout": 155 + } + }, + "linkage_readout": { + "dev_accuracy_for_selection": 0.7359, + "best_epoch": 46, + "tokens": 211, + "train_samples": 111989, + "development_samples": 27690, + "feature_dim": 768 + }, + "neutral_unknown": { + "neutral_linkage_embedding": "sequence_embeddings.linkage_embeddings", + "hidden_capture_input_of": "sequence_head" + } +} \ No newline at end of file diff --git a/releases/2026-10-02/figures/final_iar/inputs/iar_recount_and_wilson_intervals.csv b/releases/2026-10-02/figures/final_iar/inputs/iar_recount_and_wilson_intervals.csv new file mode 100644 index 0000000000000000000000000000000000000000..2cbd3b6e4346179ce5a1fee6974f9ba749c56e2d --- /dev/null +++ b/releases/2026-10-02/figures/final_iar/inputs/iar_recount_and_wilson_intervals.csv @@ -0,0 +1,37 @@ +set,task,method,metric,k,n,rate,wilson95_lo,wilson95_hi,numerator +benchmark,residue,BERTose,first_choice_exact_span,1187,1392,0.8527298850574713,0.8331432323959508,0.8703750603116346,recounted from case file +benchmark,residue,BERTose,iar_exact_span_t080,1058,1392,0.7600574712643678,0.7369273088367472,0.7817562389435908,recounted from case file +benchmark,residue,BERTose,token_coverage_t080,1103,1394,0.7912482065997131,0.7691273428751361,0.8117682908006983,recounted from case file +benchmark,residue,BERTose,accuracy_among_filled_t080,1058,1103,0.9592021758839528,0.9458458715424637,0.9693710205671983,recounted from case file +benchmark,linkage,BERTose,first_choice_exact_span,1081,1362,0.7936857562408223,0.771383516259564,0.81433600106329,recounted from case file +benchmark,linkage,BERTose,iar_exact_span_t080,814,1362,0.5976505139500734,0.5713684338550821,0.623383305654767,recounted from case file +benchmark,linkage,BERTose,token_coverage_t080,908,1419,0.6398872445384073,0.614564162897312,0.6644549769645871,recounted from case file +benchmark,linkage,BERTose,accuracy_among_filled_t080,829,908,0.9129955947136564,0.892879792011584,0.9296316136114865,recounted from case file +grey_seal,residue,BERTose,first_choice_exact_span,149,160,0.93125,0.8810970775754896,0.9611805790890873,recounted from case file +grey_seal,residue,BERTose,iar_exact_span_t080,141,160,0.88125,0.8219771441876508,0.9226451319940766,recounted from case file +grey_seal,residue,BERTose,token_coverage_t080,142,160,0.8875,0.8291855372862971,0.9276436614557864,recounted from case file +grey_seal,residue,BERTose,accuracy_among_filled_t080,141,142,0.9929577464788732,0.9611907282841454,0.9987557857734521,recounted from case file +grey_seal,linkage,BERTose,first_choice_exact_span,134,160,0.8375,0.7725474698683045,0.8866263483909297,recounted from case file +grey_seal,linkage,BERTose,iar_exact_span_t080,97,160,0.60625,0.5289051905524178,0.6786124929736372,recounted from case file +grey_seal,linkage,BERTose,token_coverage_t080,114,169,0.6745562130177515,0.6007182193425489,0.7406350670886115,recounted from case file +grey_seal,linkage,BERTose,accuracy_among_filled_t080,99,114,0.868421052631579,0.7942086425628117,0.9186134901622525,recounted from case file +benchmark,residue,marginal_frequency,exact_span_no_threshold,349,1392,0.2507183908045977,0.22865642971644362,0.27415243470406114,recovered from 4-decimal rate; unique=True +benchmark,residue,context_frequency,exact_span_no_threshold,569,1392,0.40876436781609193,0.3832244989358571,0.4348064110970078,recovered from 4-decimal rate; unique=True +benchmark,residue,nearest_neighbour,exact_span_no_threshold,1032,1392,0.7413793103448276,0.7177343072983621,0.7636957260005152,recovered from 4-decimal rate; unique=True +benchmark,residue,BERTose_final_IAR,exact_span_no_threshold,1058,1392,0.7600574712643678,0.7369273088367472,0.7817562389435908,recovered from 4-decimal rate; unique=True +benchmark,residue,WA0_submitted,exact_span_no_threshold,1175,1392,0.8441091954022989,0.8241085963904132,0.8622157665564981,recovered from 4-decimal rate; unique=True +benchmark,linkage,marginal_frequency,exact_span_no_threshold,183,1362,0.1343612334801762,0.11727394034327226,0.15350526058977426,recovered from 4-decimal rate; unique=True +benchmark,linkage,context_frequency,exact_span_no_threshold,760,1362,0.5580029368575624,0.5315017163961108,0.584177888275153,recovered from 4-decimal rate; unique=True +benchmark,linkage,nearest_neighbour,exact_span_no_threshold,974,1362,0.7151248164464024,0.6905753228471,0.7384642235918907,recovered from 4-decimal rate; unique=True +benchmark,linkage,BERTose_final_IAR,exact_span_no_threshold,814,1362,0.5976505139500734,0.5713684338550821,0.623383305654767,recovered from 4-decimal rate; unique=True +benchmark,linkage,WA0_submitted,exact_span_no_threshold,1125,1362,0.8259911894273128,0.8049476418559507,0.8452010223724173,recovered from 4-decimal rate; unique=True +grey_seal,residue,marginal_frequency,exact_span_no_threshold,45,160,0.28125,0.217343234860214,0.35541447552731964,recovered from 4-decimal rate; unique=True +grey_seal,residue,context_frequency,exact_span_no_threshold,82,160,0.5125,0.43566953810500403,0.5887443070157083,recovered from 4-decimal rate; unique=True +grey_seal,residue,nearest_neighbour,exact_span_no_threshold,127,160,0.79375,0.7245262240066808,0.84919913633006,recovered from 4-decimal rate; unique=True +grey_seal,residue,BERTose_final_IAR,exact_span_no_threshold,141,160,0.88125,0.8219771441876508,0.9226451319940766,recovered from 4-decimal rate; unique=True +grey_seal,residue,WA0_submitted,exact_span_no_threshold,138,160,0.8625,0.8005890571519036,0.9074124513487551,recovered from 4-decimal rate; unique=True +grey_seal,linkage,marginal_frequency,exact_span_no_threshold,28,160,0.175,0.12394200193945988,0.24129802492201852,recovered from 4-decimal rate; unique=True +grey_seal,linkage,context_frequency,exact_span_no_threshold,96,160,0.6,0.522604836968219,0.67270592399748,recovered from 4-decimal rate; unique=True +grey_seal,linkage,nearest_neighbour,exact_span_no_threshold,101,160,0.63125,0.5542327024207806,0.7021126713466993,recovered from 4-decimal rate; unique=True +grey_seal,linkage,BERTose_final_IAR,exact_span_no_threshold,97,160,0.60625,0.5289051905524178,0.6786124929736372,recovered from 4-decimal rate; unique=True +grey_seal,linkage,WA0_submitted,exact_span_no_threshold,156,160,0.975,0.9374901071333326,0.9902360074537375,recovered from 4-decimal rate; unique=True diff --git a/releases/2026-10-02/figures/final_iar/inputs/nature-bpg-palette.json b/releases/2026-10-02/figures/final_iar/inputs/nature-bpg-palette.json new file mode 100644 index 0000000000000000000000000000000000000000..45ea20e5b3865ea0fefd85cc8c2befd639ee1000 --- /dev/null +++ b/releases/2026-10-02/figures/final_iar/inputs/nature-bpg-palette.json @@ -0,0 +1,30 @@ +{ + "name": "Nature BPG", + "upstream_palette": "ggsci NPG nrc", + "alpha": 0.6, + "alpha_hex_suffix": "99", + "alpha_0_6_hex8": [ + "#E64B3599", + "#4DBBD599", + "#00A08799", + "#3C548899", + "#F39B7F99", + "#8491B499", + "#91D1C299", + "#DC000099", + "#7E614899", + "#B09C8599" + ], + "opaque_hex": [ + "#E64B35", + "#4DBBD5", + "#00A087", + "#3C5488", + "#F39B7F", + "#8491B4", + "#91D1C2", + "#DC0000", + "#7E6148", + "#B09C85" + ] +} diff --git a/releases/2026-10-02/figures/final_iar/inputs/run_manifest.json b/releases/2026-10-02/figures/final_iar/inputs/run_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..d8906d115479bcba23d3ddf99aeaeaaeffd9a5cc --- /dev/null +++ b/releases/2026-10-02/figures/final_iar/inputs/run_manifest.json @@ -0,0 +1,102 @@ +{ + "schema": "bertose_wa3_final_iar_readout_alltrain_v1", + "parent_script": "wa3_same_test.py sha256 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 (job 12847066)", + "decoding": "type-consistent answer space (see docstring); renormalised softmax; threshold 0.80; 3 rounds", + "started": "2026-09-26T23:45:25", + "slurm_job_id": "16604931", + "host": "nova20-amp-1", + "python": "3.10.16", + "torch": "2.9.1+cu128", + "threads": 8, + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back", + "wa3_invalid_prediction_set": { + "specials": 10, + "ambiguity_tokens": 377 + }, + "inputs": { + "bench1392": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/glycangt_heldout_ipa_validation/data/benchmark_exclusion_1392_unseen_to_bertose_v5b_excluded.csv", + "sha256": "dbe6a21d409c7acc0992e2a87afc6218f01307a666fba6ad75339fc195bdf0c6", + "rows": 1392, + "helper_errors": 0, + "exposure_glycans": { + "excluded_exact_or_verified_graph_identity": 1291, + "absent_from_wa3_sequence_parents": 101 + }, + "wa0_checkpoints": { + "benchmark1392_residue_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_linkage_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt" + } + }, + "seal162": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/review/heldout_masking_wa3_final_iar_readout_all_20260927_r1/inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv", + "sha256": "e08c82fd1407f8a510f15e3dda0b4312c90aeb30eef8ac33d54bbe4d7eaadc7c", + "rows": 162, + "helper_errors": 0, + "exposure_glycans": { + "absent_from_wa3_sequence_parents": 160, + "pretraining_train": 2 + }, + "wa0_checkpoints": { + "seal162_residue_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_linkage_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt" + } + } + }, + "answer_space": { + "training_rows_scanned": 221897, + "vocab": 2114, + "invalid_excluded": 387, + "pipe_tokens_excluded": 379, + "linkage_tokens_seen": 462, + "residue_tokens_seen": 1185, + "linkage_tokens_allowed": 462, + "residue_tokens_allowed": 1170, + "linkage_class_counts": [ + 0, + 97966, + 150442, + 219104, + 95827, + 13486, + 11976, + 23, + 36422, + 658542 + ] + }, + "truth_outside_answer_space": { + "bench1392/benchmark1392_residue_full": 0, + "bench1392/benchmark1392_linkage_full": 0, + "seal162/seal162_residue_t080": 0, + "seal162/seal162_linkage_t080": 0 + }, + "case_identity_skipped_runs": [], + "device": "cuda", + "hooks": { + "neutral_linkage_embedding": "sequence_embeddings.linkage_embeddings", + "hidden_capture_input_of": "sequence_head" + }, + "ordinary_single_token_linkages": 211, + "partitions": { + "pretraining_train": 221899, + "pretraining_development": 55476, + "excluded_exact_or_verified_graph_identity": 3833 + }, + "linkage_readout": { + "dev_accuracy_for_selection": 0.7359, + "best_epoch": 46, + "tokens": 211, + "train_samples": 111989, + "development_samples": 27690, + "feature_dim": 768 + }, + "baseline_fit": { + "fitted": 221825, + "unit_walk_mismatch": 72, + "removed_test_glycan": 2 + }, + "finished": "2026-09-27T00:04:51", + "script_sha256": "72f8583bf32799ba29c09829d138900c0cbb589f73bd278f389da6fa8a786730", + "status": "COMPLETE" +} \ No newline at end of file diff --git a/releases/2026-10-02/figures/model_variants_figure10/README.md b/releases/2026-10-02/figures/model_variants_figure10/README.md new file mode 100644 index 0000000000000000000000000000000000000000..81c8d243b8bcedf6a8db99eabff5d3d57e937201 --- /dev/null +++ b/releases/2026-10-02/figures/model_variants_figure10/README.md @@ -0,0 +1,13 @@ +# Supplementary Figure 10: model variants + +Requires Python 3.10 or later, matplotlib, NumPy and Pillow, with Arial installed. Run from the submission-package root: + +```sh +python 06_code/figures/model_variants_figure10/build_model_variants_figure10.py --outdir rebuilt_figure10 +``` + +The builder reads the two exact CSV copies in its adjacent `inputs/` directory: `review_weight_policy_sensitivity.csv` and `review_weight_policy_ranks.csv`. Use `--package-dir .` to read the originals in `04_source_data/`, or `--source-dir` to provide another directory containing both files. + +The output includes editable SVG, vector PDF, PNG and TIFF at 300 dpi (6.5 × 7.3 inches), a caption, plotted-values CSV and source provenance. Arial text remains 8–10 pt at native size. The figure retains all five variants and eleven endpoints. It shows existing means, sample SDs and three downstream seed values per cell, along with objective coefficients, selected epochs and descriptive ranks. Checks verify the saved summaries against the individual values; no models are fitted and no new significance tests are performed. + +Variant 3 is BERTose. Each variant represents one pretraining run at its own selected checkpoint; this descriptive, post-hoc comparison does not isolate causal weighting effects. One pretrained checkpoint per variant is planned for release. diff --git a/releases/2026-10-02/figures/model_variants_figure10/build_model_variants_figure10.py b/releases/2026-10-02/figures/model_variants_figure10/build_model_variants_figure10.py new file mode 100644 index 0000000000000000000000000000000000000000..cba8a2045c8a4c3a3cd7966d835552e9610ef358 --- /dev/null +++ b/releases/2026-10-02/figures/model_variants_figure10/build_model_variants_figure10.py @@ -0,0 +1,249 @@ +#!/usr/bin/env python3 +"""Build Supplementary Figure 10 from the two released weighting CSVs. + +Requires Python 3.10+, matplotlib, numpy, and Pillow; Arial must be installed. +Example: python build_model_variants_figure10.py --package-dir submit_comm --outdir out +With no source argument, reads exact source copies in the sibling inputs directory. +No training, inference, resampling, or significance tests are performed. +""" +from __future__ import annotations + +import argparse +import csv +import hashlib +import json +import math +import statistics +from datetime import datetime, timezone +from pathlib import Path + +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from matplotlib import font_manager, ticker +from matplotlib.colors import LinearSegmentedColormap +from matplotlib.lines import Line2D +import numpy as np +from PIL import Image + +STEM = 'Supplementary_Figure_10_model_variants' +SOURCE_NAMES = ('review_weight_policy_sensitivity.csv', 'review_weight_policy_ranks.csv') +ARMS = [f'WA{i}' for i in range(1, 6)] +LABELS = {a: f'Variant {i}' + (' (BERTose)' if i == 3 else '') for i, a in enumerate(ARMS, 1)} +OBJECTIVES = ['sequence', 'topology', 'MS', 'static', 'MD'] +SEEDS = ['241271852', '582005623', '1258669096'] +ENDPOINTS = ['domain', 'kingdom', 'phylum', 'class', 'order', 'family', 'genus', 'species', + 'immunogenicity', 'linkage', 'interaction'] +METRICS = {e: 'Pooled multilabel MCC' for e in ENDPOINTS[:8]} +METRICS.update(immunogenicity='Average precision', linkage='MCC', interaction='Spearman correlation') +# Stable BERTose-coral semantics; remaining categories follow the saved palette order. +COLOURS = {'WA1': '#4DBBD5', 'WA2': '#00A087', 'WA3': '#E64B35', 'WA4': '#3C5488', 'WA5': '#8491B4'} +PALETTE = ['#E64B3599', '#4DBBD599', '#00A08799', '#3C548899', '#F39B7F99', + '#8491B499', '#91D1C299', '#DC000099', '#7E614899', '#B09C8599'] +SIZE = (6.5, 7.3) +DATE = datetime(2026, 9, 27, tzinfo=timezone.utc) +CAPTION = ( + 'Supplementary Figure 10 | Model-variant sensitivity. a, Objective coefficients, selected epochs and mean ranks across 11 benchmark tasks. Shading shows each coefficient divided by the fixed loss denominator of five. b, Task scores: circles show three downstream fits; diamonds and bars show means and sample SDs. Each variant used its own validation-selected checkpoint and was ranked separately against the same comparators. Variant 3 is BERTose. The comparison was post hoc and does not isolate weighting effects.' +) + + +def sha256(path): + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + + +def read_csv(path): + with Path(path).open(newline='') as handle: + return list(csv.DictReader(handle)) + + +def read_and_check(source_dir): + paths = [source_dir / name for name in SOURCE_NAMES] + rows, rank_rows = map(read_csv, paths) + cells = {(r['arm'], r['endpoint']): r for r in rows} + assert len(rows) == len(cells) == 55 + assert set(cells) == {(a, e) for a in ARMS for e in ENDPOINTS} + ranks = {r['arm']: r for r in rank_rows} + assert set(ranks) == set(ARMS) and len(rank_rows) == 5 + errors = [] + for (arm, endpoint), r in cells.items(): + vals = [float(r['seed_' + seed]) for seed in SEEDS] + assert all(math.isfinite(v) for v in vals) + errors.append(abs(statistics.mean(vals) - float(r['mean']))) + errors.append(abs(statistics.stdev(vals) - float(r['sample_sd']))) + assert errors[-1] < 1e-12 and errors[-2] < 1e-12 + assert int(r['n_downstream_fits']) == 3 + assert int(r['loss_denominator']) == 5 + configs = {} + for arm in ARMS: + own = [cells[(arm, e)] for e in ENDPOINTS] + fields = ['upstream_seed', 'upstream_selected_epoch', 'upstream_checkpoint_sha256'] + fields += ['coefficient_' + o for o in OBJECTIVES] + assert all(len({r[f] for r in own}) == 1 for f in fields) + coeff = [float(own[0]['coefficient_' + o]) for o in OBJECTIVES] + assert math.isclose(sum(coeff), 5) + rr = ranks[arm] + rank_values = [float(rr['rank_' + ('interaction_851' if e == 'interaction' else e)]) for e in ENDPOINTS] + assert int(rr['ranked_endpoint_count']) == 11 + assert math.isclose(sum(rank_values), float(rr['rank_sum'])) + assert math.isclose(statistics.mean(rank_values), float(rr['mean_rank_11'])) + assert sum(v == 1 for v in rank_values) == int(rr['first_place_count']) + assert rr['upstream_selected_epoch'] == own[0]['upstream_selected_epoch'] + assert rr['policy_source_sha256'] == sha256(paths[0]) + configs[arm] = {'coefficients': coeff, 'effective_coefficients': [v / 5 for v in coeff], + 'epoch': int(own[0]['upstream_selected_epoch']), + 'mean_rank': float(rr['mean_rank_11']), 'endpoint_ranks': rank_values} + return cells, configs, {'summary_cells': 55, 'individual_seed_values': 165, + 'maximum_mean_or_sample_sd_error': max(errors), + 'weights_and_ranks_consistent': True}, paths + + +def draw(cells, configs): + font_path = font_manager.findfont('Arial', fallback_to_default=False) + plt.rcParams.update({'font.family': 'Arial', 'font.size': 8.5, + 'axes.labelsize': 8, 'axes.titlesize': 9, + 'xtick.labelsize': 8, 'ytick.labelsize': 8, + 'axes.linewidth': 0.55, 'pdf.fonttype': 42, + 'ps.fonttype': 42, 'svg.fonttype': 'none', + 'svg.hashsalt': 'bertose-supplement-figure10-v1', + 'figure.facecolor': 'white', 'savefig.facecolor': 'white'}) + fig = plt.figure(figsize=SIZE) + fig.text(0.025, 0.987, 'a', fontsize=10, fontweight='bold', va='top') + fig.text(0.067, 0.987, 'Objective coefficients and selected checkpoints', + fontsize=10, fontweight='bold', va='top') + # A neutral ordered scale encodes quantitative weights, separate from variant colours. + cmap = LinearSegmentedColormap.from_list('coefficient', ['#FFFFFF', '#D4DAE3', '#76849A']) + ax = fig.add_axes([0.23, 0.797, 0.465, 0.134]) + matrix = np.array([configs[a]['effective_coefficients'] for a in ARMS]) + ax.pcolormesh(np.arange(6)-.5, np.arange(6)-.5, matrix, cmap=cmap, + vmin=0, vmax=0.5, shading='flat', rasterized=False) + ax.set_xlim(-.5, 4.5); ax.set_ylim(4.5, -.5) + ax.set_xticks(range(5), ['Sequence', 'Topology', 'MS', 'Static', 'MD']) + ax.xaxis.tick_top() + ax.tick_params(axis='both', length=0, pad=5) + ax.set_yticks(range(5), [LABELS[a] for a in ARMS]) + for lab, arm in zip(ax.get_yticklabels(), ARMS): + lab.set_color(COLOURS[arm] if arm == 'WA3' else '#222222') + if arm == 'WA3': lab.set_fontweight('bold') + for i, arm in enumerate(ARMS): + for j, val in enumerate(configs[arm]['coefficients']): + ax.text(j, i, f'{val:g}', ha='center', va='center', fontsize=8.5) + ax.set_xticks(np.arange(-0.5, 5, 1), minor=True) + ax.set_yticks(np.arange(-0.5, 5, 1), minor=True) + ax.grid(which='minor', color='white', linewidth=1) + ax.tick_params(which='minor', length=0) + for sp in ax.spines.values(): sp.set_visible(False) + side = fig.add_axes([0.713, 0.797, 0.26, 0.134]) + side.set_xlim(0, 2); side.set_ylim(4.5, -0.5); side.axis('off') + for x, label in [(0.37, 'Selected\nepoch'), (1.38, 'Mean\nrank')]: + side.text(x, -0.67, label, ha='center', va='bottom', fontsize=8) + for i, arm in enumerate(ARMS): + color = COLOURS[arm] if arm == 'WA3' else '#222222' + side.text(0.37, i, str(configs[arm]['epoch']), ha='center', va='center', color=color) + side.text(1.38, i, f"{configs[arm]['mean_rank']:.2f}", ha='center', va='center', color=color) + fig.text(0.23, 0.775, 'Listed coefficients; weighted loss divided by 5', fontsize=8) + cax = fig.add_axes([0.23, 0.749, 0.225, 0.009]) + cb = fig.colorbar(matplotlib.cm.ScalarMappable(norm=matplotlib.colors.Normalize(0, .5), cmap=cmap), + cax=cax, orientation='horizontal', ticks=[0, .25, .5]) + cb.solids.set_rasterized(False) + cb.outline.set_visible(False); cb.ax.tick_params(length=2, width=.5, pad=2, labelsize=8) + fig.text(0.475, 0.754, 'Shading: coefficient / 5', fontsize=8, va='center') + fig.text(0.025, 0.714, 'b', fontsize=10, fontweight='bold', va='top') + fig.text(0.067, 0.714, 'Endpoint performance across three downstream seeds', + fontsize=10, fontweight='bold', va='top') + gs = fig.add_gridspec(4, 3, left=0.125, right=0.975, top=0.66, bottom=0.065, + wspace=0.41, hspace=0.68) + limits = {} + for index, endpoint in enumerate(ENDPOINTS): + ax = fig.add_subplot(gs[index // 3, index % 3]) + all_bounds = [] + for i, arm in enumerate(ARMS): + r = cells[(arm, endpoint)] + mean, sd = float(r['mean']), float(r['sample_sd']) + vals = [float(r['seed_' + seed]) for seed in SEEDS] + all_bounds += vals + [mean - sd, mean + sd] + color = COLOURS[arm] + ax.errorbar(mean, i, xerr=sd, fmt='D', color=color, ecolor=color, + markersize=3.4, markeredgewidth=.55, capsize=2, + capthick=.65, elinewidth=.8, zorder=3) + ax.scatter(vals, [i-.15, i, i+.15], s=10, facecolors=color+'99', + edgecolors=color, linewidths=.45, zorder=4) + lo, hi = min(all_bounds), max(all_bounds) + pad = (hi-lo)*.18 + lo, hi = max(0 if endpoint == 'immunogenicity' else -1, lo-pad), min(1, hi+pad) + ax.set_xlim(lo, hi); limits[endpoint] = [lo, hi] + ax.set_ylim(4.55, -.55) + ax.set_yticks(range(5)) + if index % 3 == 0: + ax.set_yticklabels([f'Variant {i}' for i in range(1, 6)]) + for lab, arm in zip(ax.get_yticklabels(), ARMS): + if arm == 'WA3': lab.set_color(COLOURS[arm]); lab.set_fontweight('bold') + else: ax.set_yticklabels([]) + ax.set_title(endpoint.title(), loc='left', fontweight='bold', pad=4) + ax.set_xlabel(METRICS[endpoint], labelpad=3) + ax.xaxis.set_major_locator(ticker.MaxNLocator(nbins=3, min_n_ticks=2)) + ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.3f' if hi-lo < .04 else '%.2f')) + ax.tick_params(axis='x', length=2.5, width=.55, pad=2) + ax.tick_params(axis='y', length=0, pad=4) + for side_name in ['top', 'right', 'left']: ax.spines[side_name].set_visible(False) + ax.spines['bottom'].set_color('#707070') + ax.grid(False) + legend_ax = fig.add_subplot(gs[3, 2]); legend_ax.axis('off') + legend_ax.legend(handles=[Line2D([], [], marker='o', linestyle='None', markersize=3.5, + markerfacecolor='#8491B499', markeredgecolor='#8491B4', label='Individual seed'), + Line2D([], [], marker='D', linestyle='-', markersize=3.5, + color='#8491B4', label='Mean ± sample SD')], + loc='upper left', bbox_to_anchor=(-.05, .99), frameon=False, + handlelength=1.5, handletextpad=.55, borderpad=0, labelspacing=.8, fontsize=8) + legend_ax.text(0, .30, 'Variant 3 = BERTose\nAxes vary by endpoint', + fontsize=8, va='top', linespacing=1.4) + return fig, {'font_file': font_path, 'size_inches': list(SIZE), 'axis_limits': limits, + 'minimum_label_font_pt': 8, 'normal_font_pt': 8.5, + 'public_labels': list(LABELS.values()), 'palette_alpha_0_6_hex8': PALETTE} + + +def build(source_dir, outdir): + outdir.mkdir(parents=True, exist_ok=True) + cells, configs, checks, sources = read_and_check(source_dir) + fig, layout = draw(cells, configs) + for ext in ['svg', 'pdf', 'png']: + kwargs = {'dpi': 300} + if ext == 'pdf': kwargs['metadata'] = {'Title': 'Supplementary Figure 10 | Model variants', + 'CreationDate': DATE, 'ModDate': DATE} + elif ext == 'svg': kwargs['metadata'] = {'Date': DATE.isoformat()} + fig.savefig(outdir / f'{STEM}.{ext}', **kwargs) + plt.close(fig) + with Image.open(outdir / f'{STEM}.png') as im: + im.convert('RGB').save(outdir / f'{STEM}.tif', compression='tiff_lzw', dpi=(300, 300)) + (outdir / f'{STEM}_caption.txt').write_text(CAPTION + '\n') + plotted = outdir / f'{STEM}_plotted_values.csv' + with plotted.open('w', newline='') as f: + writer = csv.writer(f) + writer.writerow(['variant', 'endpoint', 'metric', 'mean', 'sample_sd'] + ['seed_'+s for s in SEEDS]) + for endpoint in ENDPOINTS: + for arm in ARMS: + r = cells[(arm, endpoint)] + writer.writerow([LABELS[arm], endpoint, METRICS[endpoint], r['mean'], r['sample_sd']] + + [r['seed_'+s] for s in SEEDS]) + provenance = {'figure': 10, 'status': 'BUILT_PENDING_VISUAL_QA', + 'sources': [{'path': str(p.resolve()), 'sha256': sha256(p)} for p in sources], + 'builder': {'path': str(Path(__file__).resolve()), 'sha256': sha256(__file__)}, + 'numeric_checks': checks, 'configurations': configs, 'layout': layout, + 'caption': CAPTION, 'statistical_scope': 'Existing descriptive summaries and downstream seed variation only; no new tests or resampling.', + 'exports': [{'path': str(p.resolve()), 'sha256': sha256(p)} for p in sorted(outdir.glob(STEM+'.*'))]} + (outdir / f'{STEM}_source_provenance.json').write_text(json.dumps(provenance, indent=2)+'\n') + return provenance + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--package-dir', type=Path) + parser.add_argument('--source-dir', type=Path) + parser.add_argument('--outdir', type=Path, default=Path(__file__).resolve().parent) + args = parser.parse_args() + source_dir = args.source_dir or (args.package_dir / '04_source_data' if args.package_dir else Path(__file__).resolve().parent / 'inputs') + result = build(source_dir, args.outdir) + print(json.dumps({'outdir': str(args.outdir.resolve()), 'checks': result['numeric_checks']})) + + +if __name__ == '__main__': + main() diff --git a/releases/2026-10-02/figures/model_variants_figure10/inputs/review_weight_policy_ranks.csv b/releases/2026-10-02/figures/model_variants_figure10/inputs/review_weight_policy_ranks.csv new file mode 100644 index 0000000000000000000000000000000000000000..29943d9117548324db4dbed3c538e4ef579a3e29 --- /dev/null +++ b/releases/2026-10-02/figures/model_variants_figure10/inputs/review_weight_policy_ranks.csv @@ -0,0 +1,6 @@ +arm,policy,upstream_seed,upstream_selected_epoch,n_downstream_fits,downstream_seed_ids,rank_domain,rank_kingdom,rank_phylum,rank_class,rank_order,rank_family,rank_genus,rank_species,rank_immunogenicity,rank_linkage,rank_interaction_851,rank_sum,ranked_endpoint_count,mean_rank_11,first_place_count,overall_mean_rank_position,comparison_panel_model_count,complete_mean_rank_model_count,missing_comparator_cell,policy_source_path,policy_source_sha256,comparator_source_path,comparator_source_sha256 +WA1,WA1_FINAL_MD_EQUAL_NORMALIZED,42,29,3,241271852;582005623;1258669096,3.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,3.0,16.0,11,1.4545454545454546,8,1,25,24,GNNGly linkage; GNNGly complete mean is unavailable,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/review_weight_policy_sensitivity.csv,9b35cb9ab5056c0548eea944f8472906a8cb36e2a7adf5cf3135268c675619b7,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/review_table1_cells.csv,eeefeae915b172517c621aab82ab0c5f84fb026fe1f6c4cc68530e9964ede523 +WA2,WA2_FINAL_MD_SEQUENCE_HEAVY,42,27,3,241271852;582005623;1258669096,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,7.0,3.0,21.0,11,1.9090909090909092,7,1,25,24,GNNGly linkage; GNNGly complete mean is unavailable,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/review_weight_policy_sensitivity.csv,9b35cb9ab5056c0548eea944f8472906a8cb36e2a7adf5cf3135268c675619b7,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/review_table1_cells.csv,eeefeae915b172517c621aab82ab0c5f84fb026fe1f6c4cc68530e9964ede523 +WA3,WA3_FINAL_MS_MD_HEAVY,42,58,3,241271852;582005623;1258669096,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,3.0,3.0,15.0,11,1.3636363636363635,9,1,25,24,GNNGly linkage; GNNGly complete mean is unavailable,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/review_weight_policy_sensitivity.csv,9b35cb9ab5056c0548eea944f8472906a8cb36e2a7adf5cf3135268c675619b7,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/review_table1_cells.csv,eeefeae915b172517c621aab82ab0c5f84fb026fe1f6c4cc68530e9964ede523 +WA4,WA4_FINAL_AUXILIARY_HEAVY,42,29,3,241271852;582005623;1258669096,7.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,3.0,3.0,21.0,11,1.9090909090909092,8,1,25,24,GNNGly linkage; GNNGly complete mean is unavailable,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/review_weight_policy_sensitivity.csv,9b35cb9ab5056c0548eea944f8472906a8cb36e2a7adf5cf3135268c675619b7,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/review_table1_cells.csv,eeefeae915b172517c621aab82ab0c5f84fb026fe1f6c4cc68530e9964ede523 +WA5,WA5_FINAL_STRUCTURE_MINIMAL,42,58,3,241271852;582005623;1258669096,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,6.0,3.0,18.0,11,1.6363636363636365,9,1,25,24,GNNGly linkage; GNNGly complete mean is unavailable,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/review_weight_policy_sensitivity.csv,9b35cb9ab5056c0548eea944f8472906a8cb36e2a7adf5cf3135268c675619b7,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/04_source_data/review_table1_cells.csv,eeefeae915b172517c621aab82ab0c5f84fb026fe1f6c4cc68530e9964ede523 diff --git a/releases/2026-10-02/figures/model_variants_figure10/inputs/review_weight_policy_sensitivity.csv b/releases/2026-10-02/figures/model_variants_figure10/inputs/review_weight_policy_sensitivity.csv new file mode 100644 index 0000000000000000000000000000000000000000..9dc644d0304c4b2bdd18a39b26cbf8946a42b223 --- /dev/null +++ b/releases/2026-10-02/figures/model_variants_figure10/inputs/review_weight_policy_sensitivity.csv @@ -0,0 +1,56 @@ +arm,policy,endpoint,metric,mean,sample_sd,n_downstream_fits,upstream_seed,upstream_selected_epoch,coefficient_sequence,coefficient_topology,coefficient_MS,coefficient_static,coefficient_MD,loss_denominator,seed_241271852,seed_582005623,seed_1258669096,source_path,source_sha256,metric_source,role,heldout_view_sha256,upstream_checkpoint_path,upstream_checkpoint_sha256,policy_manifest_path,policy_manifest_sha256,selection_rule,scope,source_241271852_path,source_241271852_sha256,source_582005623_path,source_582005623_sha256,source_1258669096_path,source_1258669096_sha256 +WA1,WA1_FINAL_MD_EQUAL_NORMALIZED,domain,pooled_multilabel_MCC,0.9368065861399124,0.00519632703923241,3,42,29,1.0,1.0,1.0,1.0,1.0,5,0.9338954440868715,0.9337183973071401,0.9428059170257257,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa1_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,89e5f17d603932934085937d35c1d01e38c2f1be3415c7b19e9dc91fe3327dc8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA1/seed-241271852/result.json,f32373912196a98edd0ad1415a2b7a1b533b61fc07bff53578f566ea9f099e9a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA1/seed-582005623/result.json,22ad56317a616ddbae9505f4af527f3c44335b2b2318f6bbd4cd9f4674503170,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA1/seed-1258669096/result.json,f63e830e6fa667e1e882129b3b7a8e986e249dd5077843c5ffdd4502022a9596 +WA2,WA2_FINAL_MD_SEQUENCE_HEAVY,domain,pooled_multilabel_MCC,0.9387289953365838,0.0065112409107775625,3,42,27,2.5,0.625,0.625,0.625,0.625,5,0.9339636187360524,0.9360753508847853,0.9461480163889137,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa2_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,e8b153ad5fa32b4f69cec88b65eda91003c26930056711a51392f55fc1feff8a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA2/seed-241271852/result.json,e03a99613ea333158efa76905dd62b4203df205e0697bad95c3f0a5a6f98f06c,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA2/seed-582005623/result.json,898d5835066e3c92eba72c4a0139806bd913887ff7b85ff36399e80178b32115,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA2/seed-1258669096/result.json,5177577fa3f500e5c489e6cf6a7e325af1a22e7183ef08e39a48b2d5de6a7760 +WA3,WA3_FINAL_MS_MD_HEAVY,domain,pooled_multilabel_MCC,0.9408614741317026,0.002594959745429332,3,42,58,0.5,0.25,2.0,0.25,2.0,5,0.9393632734241427,0.9393632734241427,0.9438578755468223,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA3/seed-241271852/result.json,dc8480f7edfbf46aaa3211fd21434b1e682de4dd5307d7375ed23af2de65c85a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA3/seed-582005623/result.json,925a0b71f374d31e8782444415a97db9986391ccf562d6afc052419085cdf514,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA3/seed-1258669096/result.json,5787e04036bde7e0c2d577cb4a53a174668449891824608c9c1c75e4deead964 +WA4,WA4_FINAL_AUXILIARY_HEAVY,domain,pooled_multilabel_MCC,0.9346562581780093,0.004410725247002435,3,42,29,0.25,0.25,1.5,1.5,1.5,5,0.937288635128416,0.9295641670428093,0.9371159723628029,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa4_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,6be1d4868c9c7d6e55f1bb7bff9b8475e96ce957c0c3bdf271b990a495a43353,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA4/seed-241271852/result.json,d6beb273100f1a4f016d646536314496bc277f91fa8e5411c199d5a9762567a7,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA4/seed-582005623/result.json,efe47274d8da2a30741ed160b79cc57dc8d6dece786ab19717e2d88ebb6fbbc7,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA4/seed-1258669096/result.json,7cb226425ceeed403272d41cd5e10f99bbd76962a9b8a820e1f7b6c031e70160 +WA5,WA5_FINAL_STRUCTURE_MINIMAL,domain,pooled_multilabel_MCC,0.9449747653025751,0.0011237115463085946,3,42,58,0.75,0.75,1.75,0.25,1.5,5,0.9449612437527408,0.9438578755468223,0.9461051766081622,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa5_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,f51c55a5a39f944a7009ba84274f2d22fa0c7db1a5197fcee12980f05dfb0288,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA5/seed-241271852/result.json,8a5641cd383f5bca810c656ee007e748b7d97a98f14ccd3d51f7a3b6d4c364c5,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA5/seed-582005623/result.json,06ff8ba8f8cfbd6b03c3a31ca619bf3d76dec797de334a95040be8e322b5758c,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/domain/WA5/seed-1258669096/result.json,4f346b41e5ba006e5c00c137838785dbf4a61f09a8ead804964dd4ea342c3eaa +WA1,WA1_FINAL_MD_EQUAL_NORMALIZED,kingdom,pooled_multilabel_MCC,0.9176025762000454,0.002310336301387803,3,42,29,1.0,1.0,1.0,1.0,1.0,5,0.9192632706680427,0.9185803285867764,0.9149641293453171,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa1_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,89e5f17d603932934085937d35c1d01e38c2f1be3415c7b19e9dc91fe3327dc8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA1/seed-241271852/result.json,174e3a95221112403705c8cb18c5434d5baf6024100a3a6da5f8d1203e4a1d6e,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA1/seed-582005623/result.json,ce7927cb202c6265f23309dc88134fc8449624a6772b23a1665ace6e95c94eb8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA1/seed-1258669096/result.json,29ac1edb082354526272fa2f453c2a05d64c2086881246b2e58e7236bcfb79e3 +WA2,WA2_FINAL_MD_SEQUENCE_HEAVY,kingdom,pooled_multilabel_MCC,0.9308229594736017,0.006109098193089106,3,42,27,2.5,0.625,0.625,0.625,0.625,5,0.9247282016455264,0.9307943790258076,0.9369462977494711,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa2_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,e8b153ad5fa32b4f69cec88b65eda91003c26930056711a51392f55fc1feff8a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA2/seed-241271852/result.json,8d45ef2005287c8e97eae39b84b764cef0e6403cc7e986e07b1de83bd572cdcc,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA2/seed-582005623/result.json,60030ae5f6848eb413516ae60429cee8033176b723c073423ca73a1582ff69b3,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA2/seed-1258669096/result.json,56a785972d4dc9fcd22d6643edc22af30ddae49f7c1ee9584c0a14fdbba7f8ae +WA3,WA3_FINAL_MS_MD_HEAVY,kingdom,pooled_multilabel_MCC,0.9316149856341082,0.003908367274893472,3,42,58,0.5,0.25,2.0,0.25,2.0,5,0.9324168052753967,0.9273678895591867,0.9350602620677412,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA3/seed-241271852/result.json,077bd36676d6917130658a1bb8ab74813617448341d531ee59a085285c7c6585,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA3/seed-582005623/result.json,326cd0dfe24bb2b826b3c098d1e4f4af09d60773bd041a70359676f82b19551f,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA3/seed-1258669096/result.json,0ad378030ccda3446a42622034f8b9e4dab24ea04a6168ba1d48a7772825ea2a +WA4,WA4_FINAL_AUXILIARY_HEAVY,kingdom,pooled_multilabel_MCC,0.9198648524278654,0.006579316990389304,3,42,29,0.25,0.25,1.5,1.5,1.5,5,0.9127404734872242,0.9257117367558501,0.9211423470405219,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa4_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,6be1d4868c9c7d6e55f1bb7bff9b8475e96ce957c0c3bdf271b990a495a43353,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA4/seed-241271852/result.json,30b5832d773672a699e5fb883bff2a40e6c3977cad35fff5becea61a9bf25de9,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA4/seed-582005623/result.json,380f784fa550784fa5cf8f7fc951031319b65142fbe5d3a6bd21efd69ebec737,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA4/seed-1258669096/result.json,1b50068f0cc9960dd8122fac0ab20edd0c2b9b589de15bdc99fd31223acaf10a +WA5,WA5_FINAL_STRUCTURE_MINIMAL,kingdom,pooled_multilabel_MCC,0.9151580271321671,0.014355783325618357,3,42,58,0.75,0.75,1.75,0.25,1.5,5,0.9087625707713058,0.9316000793174061,0.9051114313077895,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa5_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,f51c55a5a39f944a7009ba84274f2d22fa0c7db1a5197fcee12980f05dfb0288,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA5/seed-241271852/result.json,584ba4f678bd5ab14e2f8c78e240df667b9e1fcf8e1079cbbb9d3fec5b28ebe8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA5/seed-582005623/result.json,c670fe8ed1af4c66412947000b377df8a06b07418c24e599b0c5515feb2d740b,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/kingdom/WA5/seed-1258669096/result.json,3a5676ad9c5fdb304a20a1987904e724f1f254ea34737abdcd34ef35c976c5ef +WA1,WA1_FINAL_MD_EQUAL_NORMALIZED,phylum,pooled_multilabel_MCC,0.8602204085939255,0.00592178721318785,3,42,29,1.0,1.0,1.0,1.0,1.0,5,0.8562911053897567,0.8573386186101081,0.8670315017819115,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa1_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,89e5f17d603932934085937d35c1d01e38c2f1be3415c7b19e9dc91fe3327dc8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA1/seed-241271852/result.json,b5c799376d55ea0b0913843e4b4ff143e76f6d5e5d3882a4fedc06358287637a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA1/seed-582005623/result.json,9bd4c037468acc8e466bb897a73ba868b8aa7ad37cfa68aafdb721930ab8d9f2,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA1/seed-1258669096/result.json,3bcb31769f79d2db3d40bd74663e49ccac82fe973aaa405176a4753a6362cadb +WA2,WA2_FINAL_MD_SEQUENCE_HEAVY,phylum,pooled_multilabel_MCC,0.8660125692603754,0.006011984693928521,3,42,27,2.5,0.625,0.625,0.625,0.625,5,0.8664419998407401,0.8597973829893019,0.8717983249510841,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa2_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,e8b153ad5fa32b4f69cec88b65eda91003c26930056711a51392f55fc1feff8a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA2/seed-241271852/result.json,df3c96e85e041b6131be0c8ebfc83b31ece8503c679f504b2130731c036d8d03,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA2/seed-582005623/result.json,96d1a380ae003169852dfe9aecb43e6230387b94c37527330d075891911df883,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA2/seed-1258669096/result.json,388b78b9c4af10d268511f86f029dbbdec84e26a8c729fa07f8ff4f5ad1c2d68 +WA3,WA3_FINAL_MS_MD_HEAVY,phylum,pooled_multilabel_MCC,0.8664005449533572,0.005508728612011745,3,42,58,0.5,0.25,2.0,0.25,2.0,5,0.8635712054283973,0.8628814312477295,0.8727489981839447,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA3/seed-241271852/result.json,daef2dca84df5b4f3f91960a5b71292424b8ad736e34ab63719fed2e6745ad73,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA3/seed-582005623/result.json,ef640dfff3deb0e50bcd9652342740f0f34a95221791896eb064b8e0519561a8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA3/seed-1258669096/result.json,a3d729c15747b4bb5e8b76a576a81ec81d142850c3d5a88fad1e692169ddd258 +WA4,WA4_FINAL_AUXILIARY_HEAVY,phylum,pooled_multilabel_MCC,0.8651164249548887,0.0044396389383441264,3,42,29,0.25,0.25,1.5,1.5,1.5,5,0.8658838616177021,0.8691223164728068,0.8603430967741573,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa4_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,6be1d4868c9c7d6e55f1bb7bff9b8475e96ce957c0c3bdf271b990a495a43353,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA4/seed-241271852/result.json,6c4d35ec9ca4db2febab33c89d30e933568336a576cf377106973b218a82ebb0,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA4/seed-582005623/result.json,933d07ff5a81b4aba917bf698fcd1272244b883dd845aa0c9303c271174de89c,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA4/seed-1258669096/result.json,10f06efc637af57ffb24f0ba15b8ba2b92cdadf56c1cb4b724e8dd9f8a4f1344 +WA5,WA5_FINAL_STRUCTURE_MINIMAL,phylum,pooled_multilabel_MCC,0.8594282584983115,0.006174210818622128,3,42,58,0.75,0.75,1.75,0.25,1.5,5,0.8664419998407401,0.8570288414464068,0.8548139342077877,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa5_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,f51c55a5a39f944a7009ba84274f2d22fa0c7db1a5197fcee12980f05dfb0288,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA5/seed-241271852/result.json,9078a16e06d57038d23828770234ad68a7df150416de6a142e2ad43cb65c0cad,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA5/seed-582005623/result.json,650e9d739f80ac94730e070e795dae0a307d8d2272ec4b0116401d4634d98485,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/phylum/WA5/seed-1258669096/result.json,a67e08c0a1ebfa9b2ef1b21533426dff7c1e6fd81a7e216510b11450e272359d +WA1,WA1_FINAL_MD_EQUAL_NORMALIZED,class,pooled_multilabel_MCC,0.7106182609737832,0.005232445776171903,3,42,29,1.0,1.0,1.0,1.0,1.0,5,0.7075954693122763,0.7075991450532084,0.7166601685558648,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa1_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,89e5f17d603932934085937d35c1d01e38c2f1be3415c7b19e9dc91fe3327dc8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA1/seed-241271852/result.json,20cd12110c9366fa860fd4f973e1c3d9b36efeaf60bc61f2ffa1e3bc6997018e,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA1/seed-582005623/result.json,c53de4e57212d4a8914e110ce4a35b9f1ed476e649520a38248d141063588431,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA1/seed-1258669096/result.json,086d0ececa52198692788684d3104790b65b17ff88654ca88fa2dda9edd03808 +WA2,WA2_FINAL_MD_SEQUENCE_HEAVY,class,pooled_multilabel_MCC,0.6983333786039869,0.007639685832487871,3,42,27,2.5,0.625,0.625,0.625,0.625,5,0.6908502557052337,0.7061205492016541,0.698029330905073,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa2_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,e8b153ad5fa32b4f69cec88b65eda91003c26930056711a51392f55fc1feff8a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA2/seed-241271852/result.json,f826a5923e1e69ff070913e9f0cb2a709b5651a30a5a014d8225c96b4fc7e7c6,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA2/seed-582005623/result.json,ace79fc44c1128c785fc9adb787fdcaa469ec145a207b953d67c79de11120488,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA2/seed-1258669096/result.json,d4e0fdda44e9c8c7a0a3b2befdd0b5d77decc88d34de995298f67eca4d5e8b43 +WA3,WA3_FINAL_MS_MD_HEAVY,class,pooled_multilabel_MCC,0.7005009344774543,0.016209871854125424,3,42,58,0.5,0.25,2.0,0.25,2.0,5,0.7069320517951841,0.6820623507229863,0.7125084009141927,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA3/seed-241271852/result.json,4845d256a393413b700ea3465f7e8167ab234c66394245e61a86656942b52563,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA3/seed-582005623/result.json,b636a053a199b15eb193904eb45f90aca1f0048b71f66e624119422aff9462be,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA3/seed-1258669096/result.json,9967fd4ecb3b7168f1a27727cb5a57a645c23d8fe17d8bfec638812c6392b8cd +WA4,WA4_FINAL_AUXILIARY_HEAVY,class,pooled_multilabel_MCC,0.7017871736274051,0.0070593181192274545,3,42,29,0.25,0.25,1.5,1.5,1.5,5,0.7068821675923281,0.6937292547299264,0.7047500985599607,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa4_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,6be1d4868c9c7d6e55f1bb7bff9b8475e96ce957c0c3bdf271b990a495a43353,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA4/seed-241271852/result.json,1628044847db8ae3cfbdfb958c394aff436cf14625f124ae41f74c0c73e8f5f3,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA4/seed-582005623/result.json,c31df342c26c915efe1c0cfcaf8fcc6a4c416754c5ec5bfd3155ac6e0014e275,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA4/seed-1258669096/result.json,65b8f24d96c94d1f12e4b4d2f7bda3dc89fbba83954a7a0857be10f9cc8a74fe +WA5,WA5_FINAL_STRUCTURE_MINIMAL,class,pooled_multilabel_MCC,0.70750648977131,0.009828682046029187,3,42,58,0.75,0.75,1.75,0.25,1.5,5,0.7005259768942996,0.718746412056957,0.7032470803626735,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa5_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,f51c55a5a39f944a7009ba84274f2d22fa0c7db1a5197fcee12980f05dfb0288,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA5/seed-241271852/result.json,69adc495567758daf66c475549f555398b61eb40cf1b50c2444e02d7df978592,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA5/seed-582005623/result.json,b4bf348221371e27a35b3af88096f2af977be3204b37c07f618737c47b5c64d0,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/class/WA5/seed-1258669096/result.json,8049581259419d4b0f0655881093eff7cb9ae180afd6a8080e9d94400dfe86bc +WA1,WA1_FINAL_MD_EQUAL_NORMALIZED,order,pooled_multilabel_MCC,0.5012488366806098,0.002808807986339254,3,42,29,1.0,1.0,1.0,1.0,1.0,5,0.49965839929897904,0.5044919695867229,0.49959614115612744,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa1_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,89e5f17d603932934085937d35c1d01e38c2f1be3415c7b19e9dc91fe3327dc8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA1/seed-241271852/result.json,591e78ab98addc4628ab6ca1e11a706ff60ad97bd768900505ca6ce17320690b,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA1/seed-582005623/result.json,67b39e8859d5672d3340da345b8880cd5e6621a2787f0f8a7a06e14f1f383486,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA1/seed-1258669096/result.json,de445d441b346104fdf93618f58d60b9ad4ae0833b84caa12c867b24f89ca2e3 +WA2,WA2_FINAL_MD_SEQUENCE_HEAVY,order,pooled_multilabel_MCC,0.5150504770679918,0.00985999451625882,3,42,27,2.5,0.625,0.625,0.625,0.625,5,0.5049106589855802,0.51563624083921,0.5246045313791853,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa2_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,e8b153ad5fa32b4f69cec88b65eda91003c26930056711a51392f55fc1feff8a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA2/seed-241271852/result.json,dd28c3401e31f5732c40c855ab7440f3a458eb61ce4cd2dde581aa4f025d9b71,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA2/seed-582005623/result.json,888341d129cb7c1083f7ff1aa0a461350de4456328dab670d9b7e8b3d41c43e8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA2/seed-1258669096/result.json,85a6e15b7ff78c74cf124edb286b0371465bf5b8bab764c3a9f10bb5dcecb30c +WA3,WA3_FINAL_MS_MD_HEAVY,order,pooled_multilabel_MCC,0.49828437547734444,0.006284403608984348,3,42,58,0.5,0.25,2.0,0.25,2.0,5,0.49251760987698745,0.5049824718452132,0.49735304470983266,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA3/seed-241271852/result.json,bee650cab82e595e0295d7c66823abd4fa13ed8984d7e3d6081821ed45fd3113,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA3/seed-582005623/result.json,c3180228b58f5e1004193af51ba23c2445855f7afb9755994c3d53c8659351b4,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA3/seed-1258669096/result.json,1accba46852936fea478c05481bff05c1cbe2ff67d7393ba7e3eab814fc19a42 +WA4,WA4_FINAL_AUXILIARY_HEAVY,order,pooled_multilabel_MCC,0.5051799489258253,0.008052813897525424,3,42,29,0.25,0.25,1.5,1.5,1.5,5,0.501627810459508,0.4995139387516369,0.5143980975663311,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa4_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,6be1d4868c9c7d6e55f1bb7bff9b8475e96ce957c0c3bdf271b990a495a43353,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA4/seed-241271852/result.json,ef22f8df0d16169b3771cc89889ced6a877d4f52721a530acb6a3bb272a4c9df,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA4/seed-582005623/result.json,96cc7036db422eafa5fba9aada3f7521cebd0be4707c33d3475d5d45da178c94,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA4/seed-1258669096/result.json,e2cecc6eaba48b18f8de0d5ec5aed02ddb54fd568fc6f543ecee623d8e6a15ce +WA5,WA5_FINAL_STRUCTURE_MINIMAL,order,pooled_multilabel_MCC,0.49811636996579,0.016777111556459886,3,42,58,0.75,0.75,1.75,0.25,1.5,5,0.4819375423336065,0.5154337643038579,0.49697780325990565,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa5_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,f51c55a5a39f944a7009ba84274f2d22fa0c7db1a5197fcee12980f05dfb0288,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA5/seed-241271852/result.json,fefc56a0e50ced3aad4960c54754e0ab405d4f8b0c454f2e5a152c7c421a6146,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA5/seed-582005623/result.json,1b4feac92bda4dacd999ec4fbda3ec387835eca5f8a6bbd21d758bf89b0422b1,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/order/WA5/seed-1258669096/result.json,951b6ec8ed5fb0fa50cee48953ea2a0070cc584d04151941d8bfc4bb64fba279 +WA1,WA1_FINAL_MD_EQUAL_NORMALIZED,family,pooled_multilabel_MCC,0.48415597092595636,0.007513625775238936,3,42,29,1.0,1.0,1.0,1.0,1.0,5,0.4928204657541727,0.4802103361334657,0.47943711089023067,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa1_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,89e5f17d603932934085937d35c1d01e38c2f1be3415c7b19e9dc91fe3327dc8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA1/seed-241271852/result.json,1fe48cb4d5171dfc450928e92a1ccd91e97f1c53ad95a73993e4e37db4d486b4,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA1/seed-582005623/result.json,5a5c03bc2cae27b6503b4f594f530010abf259c0ed8f75e90a9982222033a309,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA1/seed-1258669096/result.json,467d3578238eefe3bcc550477f5ac4a448a8ad6f8562ed8a973091bc17bf4a2c +WA2,WA2_FINAL_MD_SEQUENCE_HEAVY,family,pooled_multilabel_MCC,0.49173800155688174,0.017655137076476014,3,42,27,2.5,0.625,0.625,0.625,0.625,5,0.5068292763289647,0.4960622392546091,0.47232248908707136,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa2_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,e8b153ad5fa32b4f69cec88b65eda91003c26930056711a51392f55fc1feff8a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA2/seed-241271852/result.json,6d8ff2ce55caaa85ec0793646cba72a0c3c351b77f5564b5ca848392aacef6fc,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA2/seed-582005623/result.json,11f30f43633ac5717aee3682d4304b19f3458b3d1d3a4bcc758fdc36b85d00b2,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA2/seed-1258669096/result.json,711d82d97b9ad6fe6af90b4d4956aab446cd649fc2ae0749c812841f41cf84b8 +WA3,WA3_FINAL_MS_MD_HEAVY,family,pooled_multilabel_MCC,0.505973606437345,0.00971098492365675,3,42,58,0.5,0.25,2.0,0.25,2.0,5,0.49521581025057215,0.5086128705970863,0.5140921384643766,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA3/seed-241271852/result.json,a83293bfc310c15f6c4edac85bf8ac527a177cb88819c9e08e32c061810b75f2,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA3/seed-582005623/result.json,d8e0e54041c1de5bc094db8684647b4ee073b9c1b47d5cee34e21c495b18db3d,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA3/seed-1258669096/result.json,53e7017c93c6dbc1da02fb4eef6203fe9b668307c6c32897344895043916f1cd +WA4,WA4_FINAL_AUXILIARY_HEAVY,family,pooled_multilabel_MCC,0.4538247646836933,0.008427726339092598,3,42,29,0.25,0.25,1.5,1.5,1.5,5,0.45256149146181135,0.446099985985317,0.46281281660395157,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa4_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,6be1d4868c9c7d6e55f1bb7bff9b8475e96ce957c0c3bdf271b990a495a43353,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA4/seed-241271852/result.json,049641f4ec0d0d5a6052b74c886360ef789cb9ec83798da87bc844b1a2ff18ef,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA4/seed-582005623/result.json,347818482fec543f1cb1e5bc34f70c5b3635f30e693d83a53e35792483dfb578,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA4/seed-1258669096/result.json,e20a81f90325c7d5008db723fe71451b86c368566f3db5b2eb1b26d4a1ce4496 +WA5,WA5_FINAL_STRUCTURE_MINIMAL,family,pooled_multilabel_MCC,0.49036502705047524,0.021749743987843243,3,42,58,0.75,0.75,1.75,0.25,1.5,5,0.4660451326952934,0.4970974133162642,0.507952535139868,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa5_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,f51c55a5a39f944a7009ba84274f2d22fa0c7db1a5197fcee12980f05dfb0288,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA5/seed-241271852/result.json,ba0e10479e08363c6eabfa049001ea0aef799ed88232f2c3360420a7e941e514,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA5/seed-582005623/result.json,3ce75f5c242aff066200ae809f2d572c373eeb7cd1c787036c3747f871c0e7c1,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/family/WA5/seed-1258669096/result.json,73cc454d2748d76c753f4b5ab940b20165d2a233e3f2548c4f6886ea8df81a14 +WA1,WA1_FINAL_MD_EQUAL_NORMALIZED,genus,pooled_multilabel_MCC,0.41537124167055567,0.025876559099950146,3,42,29,1.0,1.0,1.0,1.0,1.0,5,0.44428986749030797,0.39440185031444863,0.40742200720691046,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa1_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,89e5f17d603932934085937d35c1d01e38c2f1be3415c7b19e9dc91fe3327dc8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA1/seed-241271852/result.json,007cd83f24707383f2b373ffd83f1f31753ba23fc2b3470152c9d33235eef152,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA1/seed-582005623/result.json,f7c4f79e9b87d363408057c4c3233ff4ccde2bff5be4a04a8afc97f1d1f29d54,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA1/seed-1258669096/result.json,554bed27e6c89486c1d303ec4fe23b0c475639c8f3522baa7d125e683699f974 +WA2,WA2_FINAL_MD_SEQUENCE_HEAVY,genus,pooled_multilabel_MCC,0.4233424764414445,0.012491750188332939,3,42,27,2.5,0.625,0.625,0.625,0.625,5,0.41703568920583584,0.4152614520128484,0.43773028810564935,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa2_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,e8b153ad5fa32b4f69cec88b65eda91003c26930056711a51392f55fc1feff8a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA2/seed-241271852/result.json,ed2e705802463e09284b691d34f6574e04a18f86fb9c4880bf8a5e776eb39288,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA2/seed-582005623/result.json,c15443882fc261f2991b965ad5707b12495441c11b7c198b75d9305db548b3bf,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA2/seed-1258669096/result.json,90dc02ab462d967b381dbaafcd8ac862c03daa49c7e0ce6f0058ae8fd23182f2 +WA3,WA3_FINAL_MS_MD_HEAVY,genus,pooled_multilabel_MCC,0.41493563178676957,0.02295513565175392,3,42,58,0.5,0.25,2.0,0.25,2.0,5,0.42098056591258515,0.4342633846635254,0.3895629447841982,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA3/seed-241271852/result.json,fcacd6783e76caace6aaf39e553243b1dfcf2a5a676f293293849341f8f0d6c8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA3/seed-582005623/result.json,a469df4e72ae6ed40712f24b2b6ff7819f22a5d691a7c51fa6e0355e3192ae86,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA3/seed-1258669096/result.json,4d136fecc17108532600880d94b9b8c3dc3495b7125b9df72f75be97787631d9 +WA4,WA4_FINAL_AUXILIARY_HEAVY,genus,pooled_multilabel_MCC,0.40715730992408017,0.01900593486820453,3,42,29,0.25,0.25,1.5,1.5,1.5,5,0.389605849285064,0.42734291457647344,0.40452316591070314,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa4_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,6be1d4868c9c7d6e55f1bb7bff9b8475e96ce957c0c3bdf271b990a495a43353,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA4/seed-241271852/result.json,27fcb5f9ad595ec860e1753341d1bca5f267c9ba35136c125c3121cca743be41,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA4/seed-582005623/result.json,52a98c663d65c7c8d7daa9b87e46f9e4f2d9e0903221d61d7a276a63cfeb96f4,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA4/seed-1258669096/result.json,728dcafad48a87dc2f2d7c44c06742d23b4bb22d3ba76da190782e9ff61a7bea +WA5,WA5_FINAL_STRUCTURE_MINIMAL,genus,pooled_multilabel_MCC,0.41707992238096675,0.01345036742749391,3,42,58,0.75,0.75,1.75,0.25,1.5,5,0.4136580692098734,0.43191070318030705,0.40567099475271984,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa5_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,f51c55a5a39f944a7009ba84274f2d22fa0c7db1a5197fcee12980f05dfb0288,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA5/seed-241271852/result.json,b711ef9d146111ff4133e3bf218d5d0f8b4a82889452cc64a11f17abdec3ba47,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA5/seed-582005623/result.json,5ad3096ce31f90b46b4df988f3ccfda9134d47d527df4ada7b1467ca79a3da9f,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/genus/WA5/seed-1258669096/result.json,afada733e3b564c4284a538989e767fd7dc31351390c54dd09b19ff97153d92f +WA1,WA1_FINAL_MD_EQUAL_NORMALIZED,species,pooled_multilabel_MCC,0.39785044513222373,0.02507675992899455,3,42,29,1.0,1.0,1.0,1.0,1.0,5,0.3933034591967926,0.4248895912856251,0.37535828491425344,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa1_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,89e5f17d603932934085937d35c1d01e38c2f1be3415c7b19e9dc91fe3327dc8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA1/seed-241271852/result.json,69430fcdfac751ed11c81807a2837a4b9a3c6761b2633ff4cb7ec1826d0aff79,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA1/seed-582005623/result.json,89f5d03dcefb9d0f3afd8b0c61414ec4a00f4d7bc4aa9e74beb2dc5edc9a1f3d,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA1/seed-1258669096/result.json,d05b79d5aacbcfc2a64aa9edecf61ad6eb3f9bca9bf89862eef4e7daa3df8c26 +WA2,WA2_FINAL_MD_SEQUENCE_HEAVY,species,pooled_multilabel_MCC,0.4131310574322309,0.019520843020245683,3,42,27,2.5,0.625,0.625,0.625,0.625,5,0.40493890421372525,0.39904115643634874,0.43541311164661867,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa2_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,e8b153ad5fa32b4f69cec88b65eda91003c26930056711a51392f55fc1feff8a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA2/seed-241271852/result.json,268182949c33e4a617b21480f9adc3b9081d7aed0aa919dc91e3e28817b4f996,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA2/seed-582005623/result.json,a56f8de228f8e2a746edfc3f3f5e36e505b2341c0b0dadee5484207a9d53d775,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA2/seed-1258669096/result.json,815362bad62b27d119a3a4b6cfe31995371609dd8c3cbc82635c06c57ab076ea +WA3,WA3_FINAL_MS_MD_HEAVY,species,pooled_multilabel_MCC,0.4021288320337033,0.021292885043644454,3,42,58,0.5,0.25,2.0,0.25,2.0,5,0.37812901368695395,0.41875405124794357,0.40950343116621246,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA3/seed-241271852/result.json,0b33260cc113ea563eb4f308e0ba0b73c138a3fead2dcca46eea77c5076a7dd6,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA3/seed-582005623/result.json,58ca66480474ddaf2dfe31689d68ca7b7e5fa482dc2528c0acb86e82cbe6eda3,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA3/seed-1258669096/result.json,0d499379c068ab5b55f8725da36ed55fdebd810a260151c3a187504a76825bed +WA4,WA4_FINAL_AUXILIARY_HEAVY,species,pooled_multilabel_MCC,0.38177036473482795,0.03075157657858098,3,42,29,0.25,0.25,1.5,1.5,1.5,5,0.41051001953051247,0.3854610922491969,0.3493399824247745,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa4_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,6be1d4868c9c7d6e55f1bb7bff9b8475e96ce957c0c3bdf271b990a495a43353,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA4/seed-241271852/result.json,d1950a95d0be1005addb0533ba8956fcd815dcc63b20b101516e75794b6b7bef,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA4/seed-582005623/result.json,625137b886135d3c41970934ac8c7dac7fe685a131a9df8444bd88dcd6eee65e,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA4/seed-1258669096/result.json,40156afbf6552c039a3661f9779901338ac64bda9313ef54a06e0ec98d05da39 +WA5,WA5_FINAL_STRUCTURE_MINIMAL,species,pooled_multilabel_MCC,0.39070274182514125,0.029101151029713765,3,42,58,0.75,0.75,1.75,0.25,1.5,5,0.42106763411525117,0.3879845236309755,0.3630560677291971,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.primary_metric_value,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa5_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,f51c55a5a39f944a7009ba84274f2d22fa0c7db1a5197fcee12980f05dfb0288,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA5/seed-241271852/result.json,5adf37f47204a7e93f41bf74aeb163b0d27d7aa00e98963bde15c5074716483d,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA5/seed-582005623/result.json,86e40470fba607efe7d200e577b1c2284bb2ef08530833ee29bc56462394f3a6,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/species/WA5/seed-1258669096/result.json,493a000ec54e8144ca2b5a17a383059dfd922e8b467ab3d5f5b4070c3fe9c298 +WA1,WA1_FINAL_MD_EQUAL_NORMALIZED,linkage,MCC,0.9596247410175427,0.00027924275441489516,3,42,29,1.0,1.0,1.0,1.0,1.0,5,0.9599009640066453,0.9593425734189498,0.9596306856270331,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.mcc,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa1_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,89e5f17d603932934085937d35c1d01e38c2f1be3415c7b19e9dc91fe3327dc8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA1/seed-241271852/result.json,049eed5e57f5b1af0a9b0b1bc0723a23af9e3b56e674e546b191b6cdd3638605,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA1/seed-582005623/result.json,0f47a6301d126a12dceab0a48a76dffc2f75d00cb11f3c18189d5e8962eedb31,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA1/seed-1258669096/result.json,d6c4a4a2d73faeca9b1b3174f654aa731c03f68b1c78363da3d33204b9cb0b61 +WA2,WA2_FINAL_MD_SEQUENCE_HEAVY,linkage,MCC,0.928594735099268,0.014989401298120111,3,42,27,2.5,0.625,0.625,0.625,0.625,5,0.9458932107943923,0.9204496849597884,0.9194413095436234,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.mcc,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa2_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,e8b153ad5fa32b4f69cec88b65eda91003c26930056711a51392f55fc1feff8a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA2/seed-241271852/result.json,52b0a570abe250322be056ee6d1992c0b602d6e179c9ac288cfd91c74453176b,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA2/seed-582005623/result.json,1eba9c90866812449e9ff4e22c353a46ee576d30f0558b318d0ad743ea6820c4,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA2/seed-1258669096/result.json,e077bbe339cadc42c2ef55ee5011dd1469292f045b8e942bc20043ca2147ece5 +WA3,WA3_FINAL_MS_MD_HEAVY,linkage,MCC,0.9507182650055247,0.028032685758345454,3,42,58,0.5,0.25,2.0,0.25,2.0,5,0.9730079497134405,0.9192458812964884,0.9599009640066453,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.mcc,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA3/seed-241271852/result.json,d528ff17f8c54199a61b49b219d4479a81f3599fc3159ced022422f4e20bdfc2,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA3/seed-582005623/result.json,5e732d858155c70f6a760a4f280f9de1b16523b0d4f5b233731fd1f17028ad47,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA3/seed-1258669096/result.json,acb5d252feb55e351147a3858ca6fc07862def8fcf396ec10746fbbd55875448 +WA4,WA4_FINAL_AUXILIARY_HEAVY,linkage,MCC,0.9464549216423324,0.000661186987457219,3,42,29,0.25,0.25,1.5,1.5,1.5,5,0.9471835816273138,0.9462879725052911,0.9458932107943923,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.mcc,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa4_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,6be1d4868c9c7d6e55f1bb7bff9b8475e96ce957c0c3bdf271b990a495a43353,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA4/seed-241271852/result.json,a4b069da79bc5a23819fdfbfd2138d1f9660d92230fc05eb3164b47af521720d,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA4/seed-582005623/result.json,5ae28a8a6f3464ec0a7dfd9c6d83e083e34712452d659215e16b4394ef966c3e,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA4/seed-1258669096/result.json,8489ddc209ff1f437273c7778a932a45f6e01044312e801346ab1f2b102e6d05 +WA5,WA5_FINAL_STRUCTURE_MINIMAL,linkage,MCC,0.9333169635405373,0.012625491036644556,3,42,58,0.75,0.75,1.75,0.25,1.5,5,0.921067977580477,0.9462879725052911,0.9325949405358437,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.mcc,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa5_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,f51c55a5a39f944a7009ba84274f2d22fa0c7db1a5197fcee12980f05dfb0288,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA5/seed-241271852/result.json,6e2b0e22121e791a684b4e1dd1bcedc8e4e50ac7ce332ec3770c10b219472d77,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA5/seed-582005623/result.json,91ea3b184a6c73811326b5fecabc1c5f82b25c288619df688dc65aa08a0e9118,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/linkage/WA5/seed-1258669096/result.json,7010318e49c9974815de61658f62bb542e83fe22739543277df9da734be0957c +WA1,WA1_FINAL_MD_EQUAL_NORMALIZED,interaction,spearman,0.27018105644096707,0.01627417909887638,3,42,29,1.0,1.0,1.0,1.0,1.0,5,0.2608923496748329,0.28897245369552493,0.2606783659525434,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.spearman,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa1_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,89e5f17d603932934085937d35c1d01e38c2f1be3415c7b19e9dc91fe3327dc8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA1/seed-241271852/result.json,fed47aa8bd6e6fb2c527177b918873918850534cee66613cdc959b154af026a6,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA1/seed-582005623/result.json,1b1cf73b37d8a40da3e36a30f5e62aec02727a133fcd4dc1c1bf38ecb5cda76a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA1/seed-1258669096/result.json,dc1cea2f73b13431d282bf217010f5e2f03c0191763f80b13ec6d5a5fc7075b6 +WA2,WA2_FINAL_MD_SEQUENCE_HEAVY,interaction,spearman,0.2730188405186322,0.014095940903187262,3,42,27,2.5,0.625,0.625,0.625,0.625,5,0.2734410352061462,0.2868989412673201,0.2587165450824302,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.spearman,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa2_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,e8b153ad5fa32b4f69cec88b65eda91003c26930056711a51392f55fc1feff8a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA2/seed-241271852/result.json,db1e950b996dc9dd462fb3182fe29cab69f9373de744b8819c1a09e5fa90d52c,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA2/seed-582005623/result.json,90b061a0ff6556f2e7e1729d49cfc54d9856a5a8da3a2d3a0d45e8066404499a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA2/seed-1258669096/result.json,eccbc6ce40d49455d5adc25fd8c5729d6a915871f60c474dbc285f6c38760606 +WA3,WA3_FINAL_MS_MD_HEAVY,interaction,spearman,0.2803700161718966,0.009435546214877365,3,42,58,0.5,0.25,2.0,0.25,2.0,5,0.2777772357773455,0.2908308839725225,0.2725019287658218,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.spearman,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA3/seed-241271852/result.json,33e93d286e8993d0e0241116d046591dc6401dd22e568e3749ac2ebc44c70e68,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA3/seed-582005623/result.json,3d8a5dd050b461efcfa77f0463241af9a184ef2dd3eaab95ced1e5a6554f8e8b,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA3/seed-1258669096/result.json,68c80914bb569b5c437b26fd161c8801af4814dcc36d90b66d4acebe903cb35d +WA4,WA4_FINAL_AUXILIARY_HEAVY,interaction,spearman,0.27230094479447686,0.01429017408549888,3,42,29,0.25,0.25,1.5,1.5,1.5,5,0.2634918351661563,0.28878890831897364,0.2646220908983006,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.spearman,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa4_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,6be1d4868c9c7d6e55f1bb7bff9b8475e96ce957c0c3bdf271b990a495a43353,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA4/seed-241271852/result.json,de3d33d54e1129b7eccb072631cd03cfdd7e3a0c53d0947e1e6a0c207dbd84bb,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA4/seed-582005623/result.json,c16a96ebd3b8bdf328efe03a59d182ee314ddaf0b57fe995071dbae23451b03b,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA4/seed-1258669096/result.json,6f3e98795aa6375401d18c8e3973959f90e49b279de8f3fa7e81c9518ebc4419 +WA5,WA5_FINAL_STRUCTURE_MINIMAL,interaction,spearman,0.2739807546773646,0.013241121488057884,3,42,58,0.75,0.75,1.75,0.25,1.5,5,0.27485687290614974,0.2867620605590072,0.2603233305669368,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,metric_result.spearman,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa5_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,f51c55a5a39f944a7009ba84274f2d22fa0c7db1a5197fcee12980f05dfb0288,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA5/seed-241271852/result.json,60b3734b94c8896edc26eb3a1cac9f837afbfd85b793bbdd01bd6706f3122f8f,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA5/seed-582005623/result.json,2b4e95fee96c8410f597b0db712a953c7e227684514aaeb73fdb0dce6433dd8a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/interaction/WA5/seed-1258669096/result.json,7d96f12c90b3ae160739f3d2ccc39eddbe7dc17283feb6e0381d7d7ed8c94b04 +WA1,WA1_FINAL_MD_EQUAL_NORMALIZED,immunogenicity,average_precision,0.8371216066854295,0.06990716547320172,3,42,29,1.0,1.0,1.0,1.0,1.0,5,0.874826001971984,0.7564568236201361,0.8800819944641683,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,auprc.binary.average_precision,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa1_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,89e5f17d603932934085937d35c1d01e38c2f1be3415c7b19e9dc91fe3327dc8,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA1/seed-241271852/result.json,d7e873f46262245b86410eb1bef67afcbc9c7602ba41da4951a5df3be5f22b97,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA1/seed-582005623/result.json,58efc202c9c531ec6e72041d014114b56225a751afbe25c2f98d468421209c7e,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA1/seed-1258669096/result.json,473aa07179991cdffe5059fefc4d9de27934d1ee8c05a75296b523fe1be76ab2 +WA2,WA2_FINAL_MD_SEQUENCE_HEAVY,immunogenicity,average_precision,0.8327095984411879,0.021591730579823346,3,42,27,2.5,0.625,0.625,0.625,0.625,5,0.8445986960964582,0.8077863814005494,0.845743717826556,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,auprc.binary.average_precision,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/review_md_temporal_20x6_a1111_wa2_s424344_20260811_r1/production/review_md20x6_md20x6-a1111-wa2-finalmd-20260811-r1_A1111_wa2_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,e8b153ad5fa32b4f69cec88b65eda91003c26930056711a51392f55fc1feff8a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA2/seed-241271852/result.json,ed0823727622f8aa6a46eb4d3af963370a924c5abe7c760e315f81ec6f040cd3,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA2/seed-582005623/result.json,77c95ffe934109fb5d69bd643553d6d6e030a2f944401adc9ad7ed31a79f9213,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA2/seed-1258669096/result.json,f7b967339affcaf1389eb214ea63645fa9e8f694a67d547481499d55f47c394e +WA3,WA3_FINAL_MS_MD_HEAVY,immunogenicity,average_precision,0.8490047160580149,0.059397019090140786,3,42,58,0.5,0.25,2.0,0.25,2.0,5,0.8401423037317001,0.9123349808945784,0.7945368635477662,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,auprc.binary.average_precision,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA3/seed-241271852/result.json,706407fb9852f760c18d3a99741109be58ef60de4505db00bef4e3e9345f3b2a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA3/seed-582005623/result.json,6f259ae52975e7c22bc822bdb5b23bb2d10359629596a1fd114776c7ed62144a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_sources_12261009/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA3/seed-1258669096/result.json,9a145cbe791bc00f6b99e4305cfa0607be9a0c40c58eea3c020ddc8a322390e5 +WA4,WA4_FINAL_AUXILIARY_HEAVY,immunogenicity,average_precision,0.8510167379798627,0.08591790988271336,3,42,29,0.25,0.25,1.5,1.5,1.5,5,0.881046696121067,0.7541144067164939,0.917889111102027,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,auprc.binary.average_precision,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa4_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,6be1d4868c9c7d6e55f1bb7bff9b8475e96ce957c0c3bdf271b990a495a43353,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA4/seed-241271852/result.json,7fe6747b0869b780beb4b149d8dd7bd9119f704d3181bb78c739bf99340b0db0,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA4/seed-582005623/result.json,48ffb30992397e651db63330bccc52ad1815251f3cbe305d071d1f78e3cc48b0,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA4/seed-1258669096/result.json,48a92f6e3b96e330075c073b967b134dcd4175afc0b6327cda377dc9c37825fb +WA5,WA5_FINAL_STRUCTURE_MINIMAL,immunogenicity,average_precision,0.8563288781781879,0.07201495377166754,3,42,58,0.75,0.75,1.75,0.25,1.5,5,0.9377283419195186,0.800906746920763,0.8303515456942822,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/weight_policy_primary_checks.json,7773296a4eeb3478e10cd5fc022d44f9b296cdc806ed46f0e624898b35d2a621,auprc.binary.average_precision,heldout,aefd1dff1c634e103645ad539c8f677eb3bf1afbe342b1d0f445f6199707affe,/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc/writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa5_seed42/review_checkpoints/review_md20x6_checkpoint_best.pt,f51c55a5a39f944a7009ba84274f2d22fa0c7db1a5197fcee12980f05dfb0288,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_downstream_20260820_r1_preparation/wa_downstream_manifest.json,297aac30c056ed09b1857f3b5753bfdb415912b5a1bb04f0d47ed4ad16b62922,arm_own_development_best_epoch,"Exploratory, post-hoc checkpoint-policy comparison; one pretraining run per policy; not an isolated coefficient effect.",/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA5/seed-241271852/result.json,67df55b2a3868c137977f62e406703e76b4fed4a0ce673f768c90898efc89c2a,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA5/seed-582005623/result.json,72bdad9be80d9523022af665a12fe5ed7bb6aa597d9c24a1a52d7cd7893331a5,/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/submit_comm/_verification/nova_major_review_12261262/remote/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/review/multimodal/runtime/a5_wa_direct_heldout_20260822_r1/wa_arms2/immunogenicity/WA5/seed-1258669096/result.json,066f480aa976aa58a6e7c544bd3622a6c3ad3fb0d5917cb16d5da3781ca774c9 diff --git a/releases/2026-10-02/figures/taxonomy_figure11/README.md b/releases/2026-10-02/figures/taxonomy_figure11/README.md new file mode 100644 index 0000000000000000000000000000000000000000..648ce54c572e2fe2d5790ecba457ea3683998c32 --- /dev/null +++ b/releases/2026-10-02/figures/taxonomy_figure11/README.md @@ -0,0 +1,15 @@ +# Supplementary Figure 11: taxonomy sensitivity + +The builder draws eight stored mean differences and unadjusted 95% paired-glycan bootstrap intervals. It reads the existing source CSV without recomputing statistics, fitting a model or fetching data. Source Data retains every original column, including the separate model/comparator MCC values and the interval qualifications. + +From the released package: + +```sh +python 06_code/figures/build_taxonomy_figure11.py --package-dir . --outdir /path/to/output +``` + +Inputs are `04_source_data/review_restricted_taxonomy_bootstrap.csv` and the sibling `06_code/figures/taxonomy_figure11/nature-bpg-palette.json`. `--input` and `--palette` accept explicit file paths. Dependencies: Python 3, Matplotlib and Pillow. Arial is used when installed; font substitution can change text geometry. No GPU is used. The local review run used the bundled Python and existing Matplotlib libraries via `PYTHONPATH=/opt/homebrew/lib/python3.12/site-packages`; the builder has no machine-specific runtime path. + +Outputs are editable-text SVG, vector PDF, PNG and LZW TIFF at 300 dpi, caption and SHA256-bound provenance. Size: 6.9 ×4.35 inches. Coral points and muted slate intervals use the saved Nature BPG palette. Values and interval endpoints are plotted at source precision; labels report the original glycan and retained/total label counts. + +Comparators were selected post hoc and held fixed during resampling. The pointwise intervals are conditional on the fitted models, fixed downstream seeds and represented labels; they exclude model-selection and pretraining uncertainty. The taxonomy ranks are correlated. No significance stars are used. diff --git a/releases/2026-10-02/figures/taxonomy_figure11/nature-bpg-palette.json b/releases/2026-10-02/figures/taxonomy_figure11/nature-bpg-palette.json new file mode 100644 index 0000000000000000000000000000000000000000..45ea20e5b3865ea0fefd85cc8c2befd639ee1000 --- /dev/null +++ b/releases/2026-10-02/figures/taxonomy_figure11/nature-bpg-palette.json @@ -0,0 +1,30 @@ +{ + "name": "Nature BPG", + "upstream_palette": "ggsci NPG nrc", + "alpha": 0.6, + "alpha_hex_suffix": "99", + "alpha_0_6_hex8": [ + "#E64B3599", + "#4DBBD599", + "#00A08799", + "#3C548899", + "#F39B7F99", + "#8491B499", + "#91D1C299", + "#DC000099", + "#7E614899", + "#B09C8599" + ], + "opaque_hex": [ + "#E64B35", + "#4DBBD5", + "#00A087", + "#3C5488", + "#F39B7F", + "#8491B4", + "#91D1C2", + "#DC0000", + "#7E6148", + "#B09C85" + ] +} diff --git a/releases/2026-10-02/iar_completion/README.md b/releases/2026-10-02/iar_completion/README.md new file mode 100644 index 0000000000000000000000000000000000000000..a7ffda22040b5857ef3b93ef76b592e11a74b502 --- /dev/null +++ b/releases/2026-10-02/iar_completion/README.md @@ -0,0 +1,69 @@ +# Final IAR linkage readout + +This addition preserves the final job 16604931 source and saved linkage readout. The readout is a linear layer over the input of `sequence_head` and predicts 211 ordinary linkage tokens. It was trained for 60 epochs on 111,989 training parents with the encoder frozen; the highest accuracy on 27,690 validation parents selected the retained state at zero-based index 46, the 47th epoch. The original `best_epoch=46` identifier and source/metadata terminology are retained. + +The saved weight matrix is 211 × 768, with a 211-element bias and 768-element feature mean and scale. The readout is used only for a masked single-token linkage case with one masked position and one semantic unit. Residues and multi-token linkage cases use the pretrained head. IAR retains a threshold of 0.80 and up to three rounds. Raw softmax confidence has not been calibrated. + +## Included files + +- `assets/linkage_readout.pt`: unchanged saved readout, SHA-256 `a03990a02a1737de05a7fa1739164e84fa6a0a4170ebaa65317a9f3c2f16c0b0`. +- `originals/wa3_final_iar_readout_all.py`: unchanged executed source, SHA-256 `72f8583bf32799ba29c09829d138900c0cbb589f73bd278f389da6fa8a786730`. Its six predecessor scripts are also included for provenance. The final script contains their implementation; it does not import the predecessor files. +- `provenance/final_run/`: the final run manifest, aggregate summary and baseline table. The full source roster contains 162 grey-seal glycans; the reported held-out subset is the 160 absent from pretraining. Historical WA0 rows and superseded parent-run results are diagnostic provenance, not the final comparison. +- `runtime_snapshot/`: the pinned tokenizer, vocabulary, ambiguity files, submitted case harness and its Python imports, schema helpers and official Java helper. These are source dependencies, not training arrays or the encoder checkpoint. +- `model_metadata.json`: readout/encoder/vocabulary bindings, tensor dimensions, fitting metadata and claim limits. `provenance/source_inventory.json` records every copied file's source, size and hash. `provenance/required_input_hashes.json` records all 18 file digests checked by the original final script. +- `readout.py` and `check_package.py`: portable CPU artifact and import checks added for this package. They do not replace the executed scientific source. + +## Runnable local checks + +From this folder, with the Python dependencies in `requirements.txt` available: + +```bash +python readout.py +python check_package.py +``` + +The first command verifies readout, source and vocabulary hashes; safely loads the checkpoint using `weights_only=True` with a narrow NumPy reconstruction allowlist; checks tensor shapes and finite values; matches all 211 token IDs to the frozen 2,114-token vocabulary; and checks a synthetic projection at the training feature mean. The second hashes all copied artifacts, compiles the Python sources, imports all seven lineage scripts, constructs the original case harness with an identity model, and imports the frozen tokenizer and schema dependencies. It writes only temporary tokenizer shims. Neither command loads the upstream encoder or runs training, glycan inference, or a historical metric replay. + +These commands passed locally with Python 3.12 and PyTorch 2.9.1 / NumPy 1.26.4. Exact environment and results are recorded in `provenance/local_checks.json`. The historical job instead recorded Python 3.10.16 and PyTorch 2.9.1+cu128; its NumPy version was not recorded in the run manifest. + +`readout.py` can also apply the saved layer to previously extracted features: + +```bash +python readout.py --features hidden.npy --output linkage_probabilities.json +``` + +`hidden.npy` must be a finite float32-compatible N × 768 array from the input of `sequence_head` for the exact frozen WA3 checkpoint and neutral masked-linkage input described below. The JSON preserves the serialized class order and provides full probabilities. This command does not extract those features, choose mask positions, or perform the IAR rounds. The caller must supply the correct features; their upstream provenance cannot be established from the array alone. + +## Encoder and token binding + +The source requires WA3 A1111, seed 42, selected epoch 58, checkpoint SHA-256 `8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82`. Its loader checks that digest, model identity and the 138,487,995-parameter / 505-entry state inventory. The local package check does not load that checkpoint. The readout artifact does not itself embed the encoder hash: the sidecar binds its bytes to the final manifest and the executed source that pins the encoder digest. + +For masked linkage inputs, the final script replaces `sequence_embeddings.linkage_embeddings` with the training-frequency-weighted mean of ordinary class rows 1–8. The counts and module binding are in `model_metadata.json`. It captures the input of `sequence_head`, normalizes it with the saved training mean and standard deviation (the saved scale already includes `1e-6`), and applies the linear layer and softmax. The encoder is in evaluation mode, all encoder forwards run under `torch.inference_mode()`, captured features are detached, and the optimizer receives only `lin.parameters()`. The source does not explicitly disable every encoder parameter's `requires_grad` flag; the frozen-encoder claim follows from this computation and optimizer boundary. + +Training parent sampling uses seed 7 and validation sampling seed 11, with one eligible ordinary linkage per parent. The source excludes test glycans from both samples using exact or linkage-order-normalized identity. The linear fit uses AdamW, learning rate 0.001, weight decay 0.01, batch size 512, 60 passes and seed 0; the largest validation accuracy selects the saved state. These are source checks and serialized metadata checks, not an independent reconstruction of the fitted sample roster. + +## Full historical replay requirements + +The unchanged final source retains absolute Nova paths and is not a standalone end-to-end launcher. `runtime_dependencies.json` enumerates its path variables, Python import chain and additional inputs. Replaying its `main()` also refits the readout; the original script does not load the supplied `linkage_readout.pt` for evaluation. + +The following resources remain external: + +1. The exact WA3 encoder checkpoint above and the native training authority/runtime workspace needed by `load_model()`. The surrounding `06_code/bertose_source/` supplies model source and recorded runtime receipts; it does not supply the checkpoint or all immutable external authority inputs. +2. The frozen 281,208-row parent index and six NumPy arrays (tokens, residue IDs, depths, linkage classes, attention masks and lengths). Their exact digests are listed in `provenance/required_input_hashes.json`. The arrays are not included because they are full pretraining inputs. +3. Both evaluation CSVs, and the original `summary.md` plus `case_details.jsonl` for `benchmark1392_residue_full`, `benchmark1392_linkage_full`, `seal162_residue_t080` and `seal162_linkage_t080`. The two CSV digests are recorded in the final run manifest. The benchmark input path is also read from its original summary. The legacy WA0 checkpoint path is metadata only in this workflow; `_NoModelDistiller` substitutes an identity model. +4. A JDK with `java` and `javac`, a compatible PyTorch environment and sufficient compute memory. The archived run requested one GPU, eight CPUs and 128 GB RAM. These are historical resource requests, not newly benchmarked requirements. + +On a provisioned compute workspace, preserve or explicitly remap `PROJ`, `PKGD`, `WA0_HARNESS`, `WA0_VOCAB`, `WA0_AMB`, `BENCH_DIR`, `SCHEMA_DIR`, `JAVA_BIN`, `ROOT`, `TRAIN_MOD`, `CK`, `JAVA_DIR` and the `SETS` run locations, plus any nested runtime-authority paths. Keep each original hash check. Supply a new, isolated `WORK` directory containing `inputs/java/`, `inputs/wa0_seal/` and the seal CSV, with all outputs absent. Once that environment is prepared, the original entrypoint is: + +```bash +WORK=/absolute/path/to/new/run NTHREADS=8 OMP_NUM_THREADS=8 MKL_NUM_THREADS=8 PYTHONHASHSEED=0 \ + python originals/wa3_final_iar_readout_all.py +``` + +That command is conditional on restoring the external workspace and path bindings; it cannot run the full pipeline from this folder alone. `originals/run_all_training.sbatch` is the historical launch record, including its former queue and work paths. Do not submit it unchanged. No new training, scheduler job or full inference replay was performed for this package. + +## Provenance limits + +The final source and five predecessor sources match their complete local run-manifest hashes. The local probe source matches the `0ebc6297` prefix recorded by descendants; its complete locally computed digest and the availability of its original manifest are recorded in `provenance/source_inventory.json`. The final job's own manifest uses an inherited `parent_script` field pointing to `wa3_same_test.py`; the fuller lineage is in the source docstrings and inventory. + +Direct dependencies not hashed by the historical final job are labeled as local or historical snapshots in the inventory. Hashing them now does not retroactively bind them to job 16604931. Final per-case metric verification and manuscript/source-data updates are separate from these code-package checks. diff --git a/releases/2026-10-02/iar_completion/SHA256SUMS b/releases/2026-10-02/iar_completion/SHA256SUMS new file mode 100644 index 0000000000000000000000000000000000000000..5425df598464f8077d6630d5703b0c09d686a089 --- /dev/null +++ b/releases/2026-10-02/iar_completion/SHA256SUMS @@ -0,0 +1,45 @@ +04670f06e3459608d7a43da767531544421d4da1a6125376edc3939dba951d1f README.md +a03990a02a1737de05a7fa1739164e84fa6a0a4170ebaa65317a9f3c2f16c0b0 assets/linkage_readout.pt +37514cb79322719772b5c14a5795f00a78f3275f3315d5b3b674ee97127ca953 check_package.py +bbf016ce2f1a7dc82940be28397cbe8083da7ad0f5f525b1cf7345fd42a5758d model_metadata.json +d406620e3b0c070dff4d6fb6e0c57effce848a9ca5b3dc3de705d65c49ac0961 originals/run_all_training.sbatch +5acafc45244a0bf9a8489794f8a39f956622cf50594d87eb2eaa04502589fcb5 originals/wa3_final_iar_readout.py +72f8583bf32799ba29c09829d138900c0cbb589f73bd278f389da6fa8a786730 originals/wa3_final_iar_readout_all.py +679499406106611dc2c70240a3c14c9b94311bc03a7811d3dae807c58aef4ef8 originals/wa3_linkage_diagnosis.py +0ebc629778c854621f485ceb4f5f11090e84ac9171d52270fcc90b6b07d6fe7f originals/wa3_linkage_probe.py +0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 originals/wa3_same_test.py +c6e9506dbf97752aa248e325e75acf3abf63495054bcac68d48602967379531d originals/wa3_typed_strict_test.py +1341b0051fefaf54b4113d7dda5e408540844d12a9275f9a73607c416f35928d originals/wa3_typed_test.py +259fdc68a39b415c4ec114fbd6872ceaccaf09327d1fde958390071a5a94af2a provenance/final_run/baselines_same_cases.csv +d5b7fd634677ea22ea27670649ea30636ef6c98daedc8592cd3f5d7b56beb9c0 provenance/final_run/final_iar_summary.json +0aa0dc0fb74388a72750578acdf9beafba917a1976059c813157a90eceae3419 provenance/final_run/run_manifest.json +a615d9a889c7a62c19d05a4d07d66d9e743fbfb9e37e4d646c889490d297e492 provenance/heldout_masking_wa3_final_iar_readout_20260926_run_manifest.json +0aa0dc0fb74388a72750578acdf9beafba917a1976059c813157a90eceae3419 provenance/heldout_masking_wa3_final_iar_readout_all_20260927_run_manifest.json +933ef4d07c380bd4322814acff135e207e00db36197c3dc543214b24cb5d554e provenance/heldout_masking_wa3_linkage_diagnosis_20260925_run_manifest.json +3f713f4e074cbb068264173a8fb0ec99813665ad1b23fdea507f7389071cb04b provenance/heldout_masking_wa3_same_test_run_manifest.json +b3cf90dc772f206dc386a3a92d96e43d7a6c1de4147bc7cc501599730d31807f provenance/heldout_masking_wa3_typed_20260924_run_manifest.json +4a13b9faecc329257c2aa08fd6734a8b6c02837d0b230b0f659fd00602832c75 provenance/heldout_masking_wa3_typed_strict_20260925_run_manifest.json +9c957fe6b76da503c909ac4e3a0d70cf4ea1fd6da34a3aa6573bac4722d4c62d provenance/local_checks.json +8af8ed8b6124f26072d6041deb0e6966c13c149926f5bd720b714884cba6801e provenance/required_input_hashes.json +2cb3a3f4e8b1d37dd3ad0234996d546f34ab48231bf69247ffb6ace0651a4a69 provenance/source_inventory.json +42464d76c743a302bae79ced6b09af9657444c6f977535b5de49dcf59a5a8a90 readout.py +9ef74c17ef3ffacde3f0fc862f9844757bacfffa55b3ac9e7e6a6cca43f5843c requirements.txt +3392850a98f1739e3eec8434f42c26f3fad2d3da9fc815a17dd2790aa3b0ff98 runtime_dependencies.json +a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6 runtime_snapshot/java/review_A5WurcsArrayTreeAudit.java +bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf runtime_snapshot/java/review_MolWURCS.jar +5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37 runtime_snapshot/java/review_wurcsframework-1.3.1.jar +0bc54399362945601bcfd403441fc80968d173200dd0561f57568b2053a94839 runtime_snapshot/project/bert_training_v4/downstream_tasks/utils/wurcs_bpe_tokenizer.py +c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74 runtime_snapshot/project/data/bpe_ambiguity_tokens.json +6a572afdf53f1494ab96c896876b824ca7ea749777352606aa9f96bf270ceecc runtime_snapshot/project/data/bpe_vocabulary_clean.json +22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_ambiguity_tokens.json +918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json +10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04 runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py +f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7 runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py +6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4 runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py +de8c3237b858b640ee9fbf4dac34864c54b6dac80bc89f346a44c774254289a4 runtime_snapshot/project/writing/cluster/nature_submission/code/model/__init__.py +b69f14c9976951325e3a0a4e8107a16126e67d410e966650f513f1f538a732bb runtime_snapshot/project/writing/cluster/nature_submission/code/model/glycan_bert.py +8e06c32f4e844c3c66f146fd15a075472808a0720c892d0b9683dfd32f15ef0c runtime_snapshot/project/writing/cluster/nature_submission/code/model/multimodal_glycan_bert_v3.py +f0c8efda7a12942b4c6359792d6ee9417e6a9ec0eb04623ad17b4772430270b5 runtime_snapshot/project/writing/cluster/nature_submission/code/training/ipa_bpe_distillation.py +8d05a4048e200625694ff9a36f50af89b845fd0d38ba8034a97a710e7ad3dce2 runtime_snapshot/project/writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py +cfce20d28291c8b5868d35386990037415090202dd823bdfd73038456cc65557 runtime_snapshot/schema/classify.py +704ed130bdcce94a7af7ce3e37654705f709b8526f632907ef794451c6ef7f30 runtime_snapshot/schema/pipelib.py diff --git a/releases/2026-10-02/iar_completion/assets/linkage_readout.pt b/releases/2026-10-02/iar_completion/assets/linkage_readout.pt new file mode 100644 index 0000000000000000000000000000000000000000..7fb4bb07fa80e2beaa9960895bcbc73c76ecb367 --- /dev/null +++ b/releases/2026-10-02/iar_completion/assets/linkage_readout.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a03990a02a1737de05a7fa1739164e84fa6a0a4170ebaa65317a9f3c2f16c0b0 +size 663845 diff --git a/releases/2026-10-02/iar_completion/check_package.py b/releases/2026-10-02/iar_completion/check_package.py new file mode 100644 index 0000000000000000000000000000000000000000..ff12b7ec93f7acba8d3c83332b724ce5e4714de1 --- /dev/null +++ b/releases/2026-10-02/iar_completion/check_package.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +"""CPU source/import checks; never calls the final main() or loads an encoder.""" +from pathlib import Path +import builtins +import hashlib +import importlib.util +import json +import os +import sys +import tempfile + +from readout import load_readout, probabilities + + +ROOT = Path(__file__).resolve().parent + + +def load(name, path): + spec = importlib.util.spec_from_file_location(name, path) + mod = importlib.util.module_from_spec(spec) + sys.modules[name] = mod + spec.loader.exec_module(mod) + return mod + + +def main(): + inventory = json.loads((ROOT / "provenance/source_inventory.json").read_text()) + for row in inventory["files"]: + assert hashlib.sha256((ROOT / row["path"]).read_bytes()).hexdigest() == row["sha256"], row["path"] + sources = sorted(ROOT.rglob("*.py")) + for path in sources: + compile(path.read_bytes(), str(path), "exec") + original_open = builtins.open + with tempfile.TemporaryDirectory(prefix="bertose-iar-smoke-") as work: + os.environ["WORK"] = work + os.environ["NTHREADS"] = "1" + final = load("iar_final_source_smoke", ROOT / "originals/wa3_final_iar_readout_all.py") + builtins.open = original_open + project = ROOT / "runtime_snapshot/project" + final.PROJ = project + final.PKGD = project / "data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" + final.WA0_HARNESS = project / "writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py" + final.WA0_VOCAB = project / "data/bpe_vocabulary_clean.json" + final.WA0_AMB = project / "data/bpe_ambiguity_tokens.json" + final.SCHEMA_DIR = ROOT / "runtime_snapshot/schema" + _, evaluator = final.load_wa0_evaluator() + tokenizer = final.build_wa3_tokenizer() + assert len(tokenizer["t2i"]) == 2114 + assert evaluator.distiller.model.__class__.__name__ == "Identity" + achem = final.load_achem() + assert callable(achem) + # Verify that the original probe optimizer cannot update encoder params: + # source review accompanies these imports; no training is run here. + imported = ["wa3_final_iar_readout_all.py"] + for row in inventory["lineage"]: + if row["script"].endswith("wa3_final_iar_readout_all.py"): + continue + path = ROOT / row["script"] + load("smoke_" + path.stem, path) + builtins.open = original_open + imported.append(path.name) + payload, linear, _ = load_readout() + p = probabilities(payload["feature_mean"][None, :], payload, linear) + assert p.shape == (1, 211) + print(json.dumps({"status": "PASS", "copied_artifact_hashes": len(inventory["files"]), + "python_sources_compiled": len(sources), "lineage_imports": imported, + "wa0_harness_import_and_identity_model": "PASS", "wa3_tokenizer_vocabulary": 2114, + "schema_imports": "PASS", "readout_projection_shape": list(p.shape), + "encoder_checkpoint_loaded": False, "full_pipeline_rerun": False}, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/iar_completion/model_metadata.json b/releases/2026-10-02/iar_completion/model_metadata.json new file mode 100644 index 0000000000000000000000000000000000000000..274f7e82a13fba7454dd81f929093d34b53c25a8 --- /dev/null +++ b/releases/2026-10-02/iar_completion/model_metadata.json @@ -0,0 +1,91 @@ +{ + "schema": "bertose_final_iar_linkage_readout_package_v1", + "readout": { + "path": "assets/linkage_readout.pt", + "sha256": "a03990a02a1737de05a7fa1739164e84fa6a0a4170ebaa65317a9f3c2f16c0b0", + "bytes": 663845, + "weight_shape": [ + 211, + 768 + ], + "bias_shape": [ + 211 + ], + "feature_mean_shape": [ + 768 + ], + "feature_sd_shape": [ + 768 + ], + "normalization": "(hidden - feature_mean) / feature_sd; feature_sd already includes 1e-6", + "output": "softmax over 211 ordered token_ids; token list is serialized in readout" + }, + "fit": { + "dev_accuracy_for_selection": 0.7359, + "best_epoch": 46, + "tokens": 211, + "train_samples": 111989, + "development_samples": 27690, + "feature_dim": 768 + }, + "epoch_convention": "best_epoch=46 is the original zero-based loop index (range(60)); preserve the recorded label", + "encoder": { + "model": "WA3 A1111 seed42 epoch58", + "checkpoint_sha256": "8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82", + "checkpoint_included": false, + "checkpoint_payload_verified_locally": false, + "hidden": "input of sequence_head", + "vocabulary_size": 2114, + "frozen_evidence": "load_model sets eval(); encoder forward runs under torch.inference_mode(); capture detaches the feature; AdamW receives only lin.parameters()", + "requires_grad_flags_disabled_on_encoder": false + }, + "vocabulary": { + "path": "runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json", + "sha256": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b" + }, + "linkage_input": { + "module": "sequence_embeddings.linkage_embeddings", + "rows": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "training_counts": [ + 97966, + 150442, + 219104, + 95827, + 13486, + 11976, + 23, + 36422 + ], + "rule": "weighted mean of embedding rows 1 through 8, normalized by their total counts" + }, + "evaluation": { + "threshold": 0.8, + "rounds": 3, + "readout_scope": "masked single-token linkage cases with exactly one masked position and one semantic unit; residue and multi-token cases use pretrained sequence head", + "benchmark_cases": { + "residue": 1392, + "linkage": 1362 + }, + "grey_seal_primary_subset": "160 cases absent from pretraining, not the full 162-glycan source roster" + }, + "source": { + "path": "originals/wa3_final_iar_readout_all.py", + "sha256": "72f8583bf32799ba29c09829d138900c0cbb589f73bd278f389da6fa8a786730", + "slurm_job_id": "16604931", + "manifest": "provenance/final_run/run_manifest.json" + }, + "limits": [ + "Readout file does not embed the upstream checkpoint hash. This sidecar binds the readout bytes to the final-run manifest and executed source, which pins the checkpoint SHA.", + "The upstream encoder checkpoint was not loaded in these local checks.", + "No full inference, fitting, historical metric reproduction, or confidence calibration is claimed by the portable smoke check." + ] +} diff --git a/releases/2026-10-02/iar_completion/originals/run_all_training.sbatch b/releases/2026-10-02/iar_completion/originals/run_all_training.sbatch new file mode 100644 index 0000000000000000000000000000000000000000..eab36bb87478c5ba884990f368e3d3b89ffc9d03 --- /dev/null +++ b/releases/2026-10-02/iar_completion/originals/run_all_training.sbatch @@ -0,0 +1,29 @@ +#!/bin/bash +#SBATCH --job-name=wa3_iar_all +#SBATCH --partition=nova +#SBATCH --account=ratul +#SBATCH --qos=normal +#SBATCH --gres=gpu:1 +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=8 +#SBATCH --mem=128G +#SBATCH --time=06:00:00 +#SBATCH --output=/work/ratul1/supantha/glycan-SD-VS/review/heldout_masking_wa3_final_iar_readout_all_20260927_r1/logs/%j.out +#SBATCH --error=/work/ratul1/supantha/glycan-SD-VS/review/heldout_masking_wa3_final_iar_readout_all_20260927_r1/logs/%j.err +# Final IAR with the linkage read-out fitted on ALL training glycans (pre-committed replacement of the 24k read-out), +# child of job 16602478. Inference + a linear read-out on a frozen encoder; generic one-GPU request. +set -euo pipefail +PYTHON=/work/ratul1/supantha/miniconda3/bin/python3.10 +export OMP_NUM_THREADS=8 MKL_NUM_THREADS=8 NTHREADS=8 PYTHONHASHSEED=0 +export WORK=/work/ratul1/supantha/glycan-SD-VS/review/heldout_masking_wa3_final_iar_readout_all_20260927_r1 +R3=/work/ratul1/supantha/glycan-SD-VS/review/heldout_masking_wa3_same_test_20260914_r3 +if ! "$PYTHON" -c "import torch,sys; sys.exit(0 if torch.cuda.is_available() else 1)"; then + echo "FATAL: CUDA unavailable on ${SLURMD_NODENAME} despite a GPU allocation. Resubmit with --exclude=${SLURMD_NODENAME}" + exit 1 +fi +nvidia-smi --query-gpu=name,memory.total --format=csv,noheader +test ! -e "$WORK/outputs/run_manifest.json" || { echo "outputs already exist; refusing to overwrite"; exit 1; } +[ -d "$WORK/inputs" ] || cp -r "$R3/inputs" "$WORK/inputs" +echo "host=$(hostname) python=$($PYTHON --version 2>&1) script_sha=$(sha256sum "$WORK/wa3_final_iar_readout_all.py" | cut -d' ' -f1)" +cd "$WORK" && "$PYTHON" -u wa3_final_iar_readout_all.py diff --git a/releases/2026-10-02/iar_completion/originals/wa3_final_iar_readout.py b/releases/2026-10-02/iar_completion/originals/wa3_final_iar_readout.py new file mode 100644 index 0000000000000000000000000000000000000000..a2fd097fe320844ccc3d54f267a8ec223eeb8bdc --- /dev/null +++ b/releases/2026-10-02/iar_completion/originals/wa3_final_iar_readout.py @@ -0,0 +1,1526 @@ +#!/usr/bin/env python3 +"""FINAL IAR WITH LINKAGE READ-OUT, child of wa3_linkage_probe.py (sha 0ebc6297..., job 16597594), 2026-09-26. + +Final completion numbers for the paper (Supplementary Fig. 4 and grey seal), all cases: + bench1392 residue (1,392) and linkage (1,362); seal162 residue and linkage (162 each). +Setting (identical to the probe study, now applied inside full IAR): + * designated masked-site inputs withheld (residue depth 202; linkage class -> neutral "ordinary, positions + unknown" embedding = training-frequency-weighted mean of class rows 1-8, via forward hook) + * answer space: residue slots = tokens seen as residue pieces in training; linkage slots = tokens seen in + ordinary (class 1-8) linkages in training; same answer space for the three baselines + * linkage read-out: linear layer on the input of `sequence_head`, refitted exactly as in the probe study + (24,000 training parents, seed 7; epoch chosen on 4,000 development parents, seed 11; encoder frozen), + used at masked single-token linkage positions; multi-token linkage units and residues use the MLM head + * IAR unchanged: threshold 0.80, up to 3 rounds, exact-span scoring with abstentions as errors +The fitted read-out is saved (outputs/linkage_readout.pt) with its token list and feature normalisation. + +Parent docstring follows. + +LINKAGE PROBE STUDY, child of wa3_linkage_diagnosis.py (sha 67949940..., job 16593043), 2026-09-25. + +Why is linkage completion weak? Frozen WA3, neutral-unknown linkage input, ordinary-linkage answer space. + 1. In-distribution check: development-partition parents (never trained on), one ordinary single-token linkage + masked per glycan, scored with the linkage class visible (true_class), set to 9 (class9) and neutral. + 2. Probe: hidden state entering the MLM vocabulary projection at the masked linkage, collected for training + parents (neutral input). Linear probes fitted on TRAINING parents only, epoch chosen on development: + * class probe -- 8 attachment-position classes (shared across letter pairs) + * token probe -- full ordinary linkage token + * guided -- MLM restricted to tokens of the class-probe's predicted class + scored on development, bench1392 and seal162 (single-token linkage cases, channels blanked, neutral). + 3. Strata on the benchmark (glycan size, acceptor-letter index) for MLM, probes and the three baselines. +Test glycans (exact or linkage-order-normalised identity) are excluded from every probe training/dev sample. + +Parent docstring follows. + +LINKAGE DIAGNOSIS, child of wa3_typed_strict_test.py (sha c6e9506d..., job 16592624), 2026-09-25. + +Linkage runs only (bench1392 linkage, seal162 linkage), channels blanked, ordinary-linkage answer space for all. +Two BERTose arms at masked linkage positions: + * class9 -- linkage class 9 (as the parent; reproduces it) + * neutral_unknown -- the linkage-class embedding at masked linkage positions is replaced (forward hook) by the + training-frequency-weighted mean of the ordinary class embeddings 1-8: "an ordinary + linkage, positions unknown", instead of 9, which in training marked only complex notation. +Saves each masked position's round-0 top-10, and writes linkage_diagnosis.json: per method (both arms, first +choice and IAR, three baselines) exact rate and error categories (right sugars/wrong positions, etc.), rank of +the truth in the top-10, and exact rates by attachment-position pair and by number of admissible positions. + +Parent docstring follows. + +STRICT typed-decoding DIAGNOSTIC, child of wa3_typed_test.py (sha 1341b005..., job 16591409), 2026-09-25. + +Question: is the controlled linkage failure a bug, or the class-9 input steering the model? In WA3 training a +masked token with linkage class 9 was always complex notation ('?' tokens are never MLM targets and simple +linkages always carry classes 1-8), so blanking to 9 asks for complex notation. Here linkage slots may only be +filled with tokens seen in ORDINARY linkages (class 1-8) in training, for BERTose and all baselines alike. +Residue slots are unchanged from the parent. truth_outside_answer_space reports any target this makes impossible. + +Parent docstring follows. + +TYPED-DECODING child of wa3_same_test.py (sha 0da5f247..., job 12847066), 2026-09-24. + +Only change: every method answers from the same, type-consistent answer space. + * BERTose: at a masked linkage piece (residue_id == -2) the softmax is taken only over tokens seen as + linkage pieces in WA3 training parents; at a masked residue piece (residue_id >= 0) only over tokens + seen as residue pieces. Specials, '?' ambiguity tokens and enumerated-alternative ('|') tokens are + excluded, because the test never scores them as correct (single_answer excludes '|' and '?'). + Probabilities are renormalised within the allowed set; threshold 0.80, 3 rounds, cases, inputs + (class 9 / depth 202 blanking) and metrics unchanged. + * Baselines: enumerated-alternative ('|') units are no longer prediction candidates, so all methods + choose from the same answer space. Their features/similarity are unchanged. +Runs: the four primary single-span runs only (bench1392 residue/linkage, seal162 residue/linkage at 0.80). + +Original docstring follows. + +WA3 rerun of the submitted held-out masking tests, on the SAME cases. + +Tests reproduced (both reported in the original submission): + * bench1392 -- 1,392 benchmark glycans (Supplementary Fig. 4; WA0 runs on Nova, 04-24) + * seal162 -- 162 paper-novel grey-seal milk glycans (Supplementary Fig. 5; WA0 runs 04-24/25) + +Same test, by construction: + 1. The untouched submitted harness (heldout_ipa_eval.py, sha 8d05a404...) rebuilds every WA0 case + with the submitted tokenizer, vocabulary, eligibility rule, seed 42 and mask plans. Every rebuilt + case must equal the WA0 run's own case_details.jsonl (case ids, masked positions, truth ids), + otherwise the job stops. + 2. Each masked WA0 span is mapped to its WURCS semantic unit(s). WA3 masks exactly those units. + 3. WA3 inputs are built exactly as WA3's training arrays were built: official WURCSArray helper + (Java) for branch structure + the frozen builder's repair + frozen 2,114-token BPE. A parity gate + rebuilds a sample of WA3 training parents and requires 100% agreement on all five channels. + 4. Filling, threshold, 3 rounds, top-k and every metric are identical to the harness. + +Reviewer 2 point 5 (irreducible uncertainty, simple baselines) is handled on the same cases: + * masked units that are curator-declared enumerations ('|') or unknown ('?') are flagged and + excluded from the single-answer score (reported separately, never silently dropped) + * each masked single linkage gets |A_chem| (chemically admissible acceptor positions; chance=1/k) + * marginal-frequency, context-frequency and nearest-neighbour baselines fitted on WA3's own + training parents (test glycans removed) are scored on the identical single-span cases + +Inference only on the frozen reported model (WA3, A1111, seed 42, epoch 58). No write-back. +""" +from __future__ import annotations + +import base64 +import builtins +import collections +import csv +import functools +import gzip +import hashlib +import importlib.util +import json +import os +import platform +import re +import shutil +import subprocess +import sys +import time +from pathlib import Path + +import numpy as np +import torch + +torch.set_num_threads(int(os.environ.get("NTHREADS", "16"))) +csv.field_size_limit(10 ** 9) + +PROJ = Path("/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training") +PKGD = PROJ / "data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" +WA0_HARNESS = PROJ / "writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py" +WA0_VOCAB = PROJ / "data/bpe_vocabulary_clean.json" +WA0_AMB = PROJ / "data/bpe_ambiguity_tokens.json" +WA0_CKPT_PATH = PROJ / "checkpoints_v5b_excluded/best_v5b_excluded_model.pt" # path only; never loaded +BENCH_DIR = PROJ / "writing/glycangt_heldout_ipa_validation" +SCHEMA_DIR = Path("/work/ratul1/supantha/glycan-SD-VS/review/iar_pipe_schema_20260823_r1") +JAVA_BIN = Path("/work/ratul1/supantha/miniconda3/envs/DeepGlycanSite/bin") +ROOT = Path("/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc") +TRAIN_MOD = ROOT / ("writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/" + "run_review_md_temporal_20x6_training_r3.py") +CK = ROOT / ("writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/" + "review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/" + "review_md20x6_checkpoint_best.pt") +CK_SHA = "8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82" + +WORK = Path(os.environ["WORK"]) +SCRIPT_SHA = hashlib.sha256(Path(__file__).read_bytes()).hexdigest() +OUT = WORK / "outputs" +JAVA_DIR = WORK / "inputs/java" + +EXPECTED_SHA = { + PKGD / "review_frozen_training_a5_wurcs_bpe.py": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4", + PKGD / "review_frozen_training_a5_topology.py": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7", + PKGD / "review_frozen_sequence_tree_runtime.py": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04", + PKGD / "review_bpe_vocabulary.json": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b", + PKGD / "review_bpe_ambiguity_tokens.json": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b", + PKGD / "review_sequence_parent_index.tsv.gz": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0", + PKGD / "review_token_ids.npy": "ec2d52dced65d22f0f218ff617d351fbd2930661bc8681e939990149d493537d", + PKGD / "review_residue_ids.npy": "36c96dcd3e03ba30e02e16f98d17605742627a37b37cd7824f2a745dd09dc044", + PKGD / "review_branch_depths.npy": "f39f76aa56a9bb782b2349f3ad1ca4ad16351ee1f06a8b9ae4b06bff9b1ebece", + PKGD / "review_linkage_types.npy": "89edb1940765928ced6f54e0d394f95c573eb9d96310b14dbd0adf8e20ac07c4", + PKGD / "review_attention_mask.npy": "01ed165720b9414e614dd7e7d75284a8886165f11138e16117ffcbe4e4bbf95c", + PKGD / "review_lengths.npy": "ade919d1e054c0ba852aa047bf873ac675f81a6c1f8a05cc73a0a2258131f021", + WA0_HARNESS: "8d05a4048e200625694ff9a36f50af89b845fd0d38ba8034a97a710e7ad3dce2", + WA0_VOCAB: "6a572afdf53f1494ab96c896876b824ca7ea749777352606aa9f96bf270ceecc", + WA0_AMB: "c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74", + JAVA_DIR / "review_A5WurcsArrayTreeAudit.java": "a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6", + JAVA_DIR / "review_wurcsframework-1.3.1.jar": "5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37", + JAVA_DIR / "review_MolWURCS.jar": "bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf", +} + +SEAL_RUNS = ["seal162_residue_t080", "seal162_linkage_t080"] +BENCH_RUNS = ["benchmark1392_residue_full", "benchmark1392_linkage_full"] +SETS = { + "bench1392": {"runs": BENCH_RUNS, "wa0_root": BENCH_DIR / "outputs", + "baseline_runs": ["benchmark1392_residue_full", "benchmark1392_linkage_full"]}, + "seal162": {"runs": SEAL_RUNS, "wa0_root": WORK / "inputs/wa0_seal", + "baseline_runs": ["seal162_residue_t080", "seal162_linkage_t080"]}, +} +ITERATIONS, TOP_K, MAX_LEN, BATCH = 3, 5, 256, 32 + +_real_open = builtins.open + + +def _guarded_open(f, *a, **k): + t = str(f) + if "locked_test" in t or "expert_audit_pool" in t: + raise SystemExit("FAIL-CLOSED: refused to open %s" % t) + return _real_open(f, *a, **k) + + +builtins.open = _guarded_open + + +def sha256_file(path: Path) -> str: + h = hashlib.sha256() + with _real_open(path, "rb") as fh: + for chunk in iter(lambda: fh.read(1 << 22), b""): + h.update(chunk) + return h.hexdigest() + + +def fail(msg: str): + raise SystemExit("FAIL-CLOSED: " + msg) + + +def log(msg: str) -> None: + print(time.strftime("%H:%M:%S"), msg, flush=True) + + +def write_json(path: Path, obj) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + tmp = path.with_suffix(path.suffix + ".tmp") + with _real_open(tmp, "w") as fh: + json.dump(obj, fh, indent=2) + tmp.replace(path) + + +# ============================================================== WA0: the submitted harness, untouched +def load_wa0_evaluator(): + spec = importlib.util.spec_from_file_location("heldout_ipa_eval_wa3_same_test", str(WA0_HARNESS)) + hie = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = hie + spec.loader.exec_module(hie) + + class _NoModelDistiller(hie.BPEIPADistiller): # same pattern as r2_05_baselines.py + def _load_model(self): + return torch.nn.Identity() + + hie.BPEIPADistiller = _NoModelDistiller + ev = hie.HeldoutIPAEvaluator(checkpoint=WA0_CKPT_PATH, vocab=WA0_VOCAB, ambiguity=WA0_AMB, device="cpu", + threshold=0.80, batch_size=32, top_k=TOP_K, max_length=MAX_LEN) + return hie, ev + + +def parse_wa0_summary(run_dir: Path) -> dict: + cfg = {} + for line in _real_open(run_dir / "summary.md"): + m = re.match(r"^- (\w+): `(.*)`\s*$", line.strip()) + if m and m.group(1) not in cfg: + cfg[m.group(1)] = m.group(2) + if "mask_plan" in cfg: + mask_plan = "" if cfg["mask_plan"] in ("", "single-span default") else cfg["mask_plan"] + else: # older summary.md files omit the line; the run's own case records carry it + with _real_open(run_dir / "case_details.jsonl") as fh: + mp = json.loads(fh.readline()).get("mask_plan", "") + mask_plan = mp if "," in mp or not re.fullmatch(r"(residue|linkage):1", mp or "") else "" + if int(cfg["iterations"]) != ITERATIONS or int(cfg["top_k"]) != TOP_K: + fail("%s used iterations=%s top_k=%s" % (run_dir.name, cfg["iterations"], cfg["top_k"])) + return {"threshold": float(cfg["threshold"]), "iterations": int(cfg["iterations"]), "top_k": int(cfg["top_k"]), + "selection_mode": cfg["selection_mode"], "max_cases_per_glycan": int(cfg["max_cases_per_glycan"]), + "span_types": [s.strip() for s in cfg["span_types"].split(",") if s.strip()], "mask_plan": mask_plan, + "input_csv": cfg.get("input_csv"), "checkpoint": cfg.get("checkpoint"), + "glycans_loaded": int(cfg["glycans_loaded"])} + + +def wa0_units(ev, wurcs): + """Mirror of HeldoutIPAEvaluator._tokenize_with_spans, adding the global non-special unit index.""" + tok = ev.tokenizer.tokenize(wurcs, max_length=ev.max_length) + unp = tok["tokens"][: tok["length"]] + recs, cur, g = [], 0, 0 + for u in ev.tokenizer.pre_tokenizer.pre_tokenize(wurcs): + pieces = [u["text"]] if u["type"] == "special" else list(ev.tokenizer.apply_bpe(u["text"])) + s, e = cur, cur + len(pieces) - 1 + cur += len(pieces) + if u["type"] == "special": + continue + gi = g + g += 1 + if e >= len(unp) or unp[s:e + 1] != pieces: + continue + recs.append({"start": s, "end": e, "unit_type": u["type"], "unit_text": u["text"], "g": gi}) + _, spans, _ = ev._tokenize_with_spans(wurcs) + if [(r["start"], r["end"], r["unit_type"], r["unit_text"]) for r in recs] != \ + [(sp.start, sp.end, sp.unit_type, sp.unit_text) for sp in spans]: + fail("WA0 unit geometry differs from the harness for %s" % wurcs[:80]) + return recs + + +def rebuild_wa0_cases(hie, ev, rows, run_dir: Path): + cfg = parse_wa0_summary(run_dir) + if cfg["glycans_loaded"] != len(rows): + fail("%s loaded %d glycans, input has %d" % (run_dir.name, cfg["glycans_loaded"], len(rows))) + mask_req = hie.parse_mask_plan(cfg["mask_plan"]) + span_types = sorted(set(cfg["span_types"]) | set(mask_req)) if mask_req else cfg["span_types"] + cases, _ = ev.build_cases(rows=rows, span_types=span_types, selection_mode=cfg["selection_mode"], + max_cases_per_glycan=cfg["max_cases_per_glycan"], seed=42, mask_requirements=mask_req) + reported = {} + with _real_open(run_dir / "case_details.jsonl") as fh: + for line in fh: + r = json.loads(line) + reported[r["case_id"]] = r + if {c.case_id for c in cases} != set(reported): + fail("%s: rebuilt %d cases vs reported %d (ids differ)" % (run_dir.name, len(cases), len(reported))) + out = [] + for c in cases: + rep = reported[c.case_id] + if list(rep["positions"]) != list(c.positions) or list(rep["truth_token_ids"]) != list(c.truth_token_ids): + fail("%s: case %s positions/truth differ from the reported run" % (run_dir.name, c.case_id)) + pos = set(c.positions) + chosen = [r for r in wa0_units(ev, c.wurcs) if all(p in pos for p in range(r["start"], r["end"] + 1))] + covered = {p for r in chosen for p in range(r["start"], r["end"] + 1)} + if covered != pos: + fail("%s: case %s masked positions do not decompose into whole units" % (run_dir.name, c.case_id)) + out.append({"case_id": c.case_id, "glycan_index": c.glycan_index, "wurcs": c.wurcs, "mask_plan": c.mask_plan, + "units": [{"g": r["g"], "unit_type": r["unit_type"], "unit_text": r["unit_text"]} for r in chosen], + "wa0_iterative_span_exact": bool(rep["iterative_span_exact"]), + "wa0_initial_span_exact_top1": bool(rep["initial_span_exact_top1"]), + "wa0_resolved_all": int(rep["resolved_count"]) == len(rep["positions"])}) + return cfg, out + + +# ============================================================== WA3: frozen tokenizer + official helper +def build_wa3_tokenizer(): + shim = WORK / "shim" + if shim.exists(): + shutil.rmtree(shim) + pkg = shim / "frozen_training" + pkg.mkdir(parents=True) + (pkg / "__init__.py").write_text("") + shutil.copy(PKGD / "review_frozen_training_a5_topology.py", pkg / "a5_topology.py") + shutil.copy(PKGD / "review_frozen_training_a5_wurcs_bpe.py", pkg / "a5_wurcs_bpe.py") + src = (PKGD / "review_frozen_sequence_tree_runtime.py").read_text() + src = (src.replace("from training.a5_topology import", "from frozen_training.a5_topology import") + .replace("from training.a5_wurcs_bpe import", "from frozen_training.a5_wurcs_bpe import")) + if src.count("from frozen_training.") != 2: + fail("tree-runtime import rewrite did not hit exactly two lines") + (shim / "frozen_tree_runtime.py").write_text(src) + sys.path.insert(0, str(PROJ)) + sys.path.insert(0, str(shim)) + import frozen_training.a5_wurcs_bpe as fab # noqa: E402 + import frozen_tree_runtime as ftr # noqa: E402 + for mod in (fab, ftr): + if not str(Path(mod.__file__).resolve()).startswith(str(shim.resolve())): + fail("frozen module resolved outside the shim: %s" % mod.__file__) + if int(ftr.BRANCH_DEPTH_UNKNOWN) != 202: + fail("BRANCH_DEPTH_UNKNOWN != 202") + tok = ftr.ReviewA5WURCSBPETokenizerV3(PKGD / "review_bpe_vocabulary.json") + tok.apply_bpe = functools.lru_cache(maxsize=None)(tok.apply_bpe) + semantic = fab.A5WURCSPreTokenizer() + vocab = json.load(_real_open(PKGD / "review_bpe_vocabulary.json")) + t2i = {k: int(v) for k, v in vocab["token_to_id"].items()} + if len(t2i) != 2114 or sorted(t2i.values()) != list(range(2114)): + fail("WA3 vocabulary is not 2,114 contiguous ids") + specials = {int(v) for v in vocab["special_tokens"].values()} + amb = json.load(_real_open(PKGD / "review_bpe_ambiguity_tokens.json")) + amb_map = {str(t): int(i) for t, i in amb["ambiguous_tokens"].items()} + if set(amb_map.values()) != {int(x) for x in amb["ambiguous_ids"]}: + fail("WA3 ambiguity map ids and token dict disagree") + if any(t2i.get(t) != i for t, i in amb_map.items()) or not all("?" in t for t in amb_map): + fail("WA3 ambiguity map disagrees with the vocabulary") + return {"tok": tok, "semantic": semantic, "exact_linkage": ftr.ReviewA5WURCSPreTokenizerV3.exact_linkage_type, + "t2i": t2i, "i2t": {v: k for k, v in t2i.items()}, "invalid": specials | set(amb_map.values()), + "n_specials": len(specials), "n_ambiguity": len(amb_map), "mask_id": t2i["[MASK]"], + "branch_open_id": t2i["[BRANCH_OPEN]"], "linkage_unknown": int(ftr.LINKAGE_UNKNOWN), + "branch_depth_unknown": int(ftr.BRANCH_DEPTH_UNKNOWN)} + + +def compile_java_helper(): + classes = WORK / "java_classes" + if classes.exists(): + shutil.rmtree(classes) + src = WORK / "java_src/review/a5/A5WurcsArrayTreeAudit.java" + src.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(JAVA_DIR / "review_A5WurcsArrayTreeAudit.java", src) + classes.mkdir(parents=True) + cp = os.pathsep.join([str(JAVA_DIR / "review_wurcsframework-1.3.1.jar"), str(JAVA_DIR / "review_MolWURCS.jar")]) + subprocess.run([str(JAVA_BIN / "javac"), "-cp", cp, "-d", str(classes), str(src)], check=True) + return os.pathsep.join([str(classes), cp]) + + +def run_java_helper(classpath, wurcs_list): + payload = "".join("%d\t%s\n" % (i, base64.urlsafe_b64encode(w.encode()).decode().rstrip("=")) + for i, w in enumerate(wurcs_list)) + res = subprocess.run([str(JAVA_BIN / "java"), "-cp", classpath, "review.a5.A5WurcsArrayTreeAudit"], + input=payload, text=True, capture_output=True, check=True) + lines = res.stdout.splitlines() + if len(lines) != len(wurcs_list): + fail("official helper returned %d lines for %d inputs" % (len(lines), len(wurcs_list))) + out = [] + for i, line in enumerate(lines): + f = line.split("\t") + if int(f[0]) != i: + fail("official helper row order drift at %d" % i) + if len(f) < 2 or f[1] == "ERROR": # frozen builder semantics for ERROR rows + out.append({"rooted": False, "depths": (), "parents": (), "helper_error": True}) + continue + if len(f) < 27: + fail("official helper output truncated at row %d" % i) + rooted = f[20] == "true" + n = int(f[2]) + dec = lambda v: base64.urlsafe_b64decode(v + "=" * ((4 - len(v) % 4) % 4)).decode() # noqa: E731 + depths = tuple(int(x) for x in dec(f[24]).split(",")) if rooted else () + parents = tuple(int(x) for x in dec(f[26]).split(",")) if rooted else () + if rooted and (len(depths) != n or len(parents) != n): + fail("official rooted cardinality drift at row %d" % i) + out.append({"rooted": rooted, "depths": depths, "parents": parents, "helper_error": False}) + return out + + +def wa3_encode(w3, wurcs, auth): + """Frozen builder transform (review_build_official_sequence_topology_successor.py) + unit spans.""" + units = [dict(u) for u in w3["semantic"].pre_tokenize(wurcs) if u.get("text") != "[BRANCH_OPEN]"] + child = collections.Counter(v for v in auth["parents"] if v >= 0) + seen, repaired = set(), [] + for u in units: + u.pop("distance_matrix", None) + rid = int(u.get("residue_id", -1)) + u["linkage_type"] = 0 + if rid >= 0: + depth = int(auth["depths"][rid]) if auth["rooted"] else 202 + u["branch_depth"] = depth + if rid not in seen: + repaired.extend({"text": "[BRANCH_OPEN]", "type": "special", "residue_id": -1, + "branch_depth": depth, "linkage_type": 0} + for _ in range(max(0, child[rid] - 1))) + seen.add(rid) + else: + u["branch_depth"] = 0 + if u.get("type") == "linkage": + u["linkage_type"] = w3["exact_linkage"](str(u["text"])) + repaired.append(u) + pieces, spans, g, ords = [], [], 0, collections.Counter() + for u in repaired: + ps = [str(u["text"])] if u["type"] == "special" else list(w3["tok"].apply_bpe(str(u["text"]))) + s = len(pieces) + pieces.extend((p, int(u["residue_id"]), int(u["branch_depth"]), int(u["linkage_type"])) for p in ps) + if u["type"] != "special": + spans.append({"g": g, "start": s, "end": len(pieces) - 1, "unit_type": u["type"], + "unit_text": str(u["text"]), "ordinal": ords[u["type"]]}) + ords[u["type"]] += 1 + g += 1 + full = len(pieces) + capped = pieces[:255] + [("[END]", -1, 0, 0)] if full > 256 else list(pieces) + L = len(capped) + unk, pad = w3["t2i"]["[UNK]"], w3["t2i"]["[PAD]"] + enc = {"token_ids": [w3["t2i"].get(p[0], unk) for p in capped] + [pad] * (256 - L), + "residue_ids": [p[1] for p in capped] + [-1] * (256 - L), + "branch_depths": [p[2] for p in capped] + [0] * (256 - L), + "linkage_types": [p[3] for p in capped] + [0] * (256 - L), + "attention_mask": [1] * L + [0] * (256 - L), "length": L, "full_length": full, + "tokens": [p[0] for p in capped]} + return enc, spans + + +def parity_gate(w3, classpath, idx_rows): + arrays = {k: np.load(PKGD / ("review_%s.npy" % k), mmap_mode="r") + for k in ("token_ids", "residue_ids", "branch_depths", "linkage_types", "attention_mask")} + sample = [i for i in range(0, len(idx_rows), 97) if idx_rows[i]["truncated_at_256"] != "True"] + auths = run_java_helper(classpath, [idx_rows[i]["canonical_wurcs"] for i in sample]) + counts, bad = collections.Counter(), [] + for i, auth in zip(sample, auths): + enc, _ = wa3_encode(w3, idx_rows[i]["canonical_wurcs"], auth) + ok_all = True + for k, arr in arrays.items(): + same = np.array_equal(np.asarray(enc[k], dtype=np.int64), np.asarray(arr[i], dtype=np.int64)) + counts[k] += int(same) + ok_all &= same + counts["all"] += int(ok_all) + counts["helper_error"] += int(auth["helper_error"]) + if not ok_all and len(bad) < 10: + bad.append(idx_rows[i]["parent_glycorpus_id"]) + res = {"rows": len(sample), "matches": dict(counts), "mismatch_parents": bad, + "rule": "every 97th sequence_row excluding truncated_at_256; official helper + frozen transform"} + res["status"] = "PASS" if counts["all"] == len(sample) else "FAIL" + return res + + +# ============================================================== exposure of test glycans to WA3 +def wurcs_sections(w): + body = w[6:] if w.startswith("WURCS=") else w + out, buf, depth = [], [], 0 + for ch in body: + depth += (ch == "[") - (ch == "]") + if ch == "/" and depth == 0: + out.append("".join(buf)) + buf = [] + else: + buf.append(ch) + out.append("".join(buf)) + return out + + +def lin_key(w): + s = wurcs_sections(w) + if len(s) < 5: + return w + return "WURCS=" + "/".join(s[:4] + ["_".join(sorted(x for x in "/".join(s[4:]).split("_") if x))]) + + +def exposure_lookup(idx_rows): + exact, keyed = collections.defaultdict(list), collections.defaultdict(list) + for r in idx_rows: + exact[r["canonical_wurcs"]].append(r) + keyed[lin_key(r["canonical_wurcs"])].append(r) + priority = ["pretraining_train", "pretraining_development", "excluded_exact_or_verified_graph_identity"] + + def look(w): + hits = {id(r): r for r in exact.get(w, []) + keyed.get(lin_key(w), [])}.values() + if not hits: + return {"wa3_partition": "absent_from_wa3_sequence_parents", "wa3_match_mode": "none", "wa3_parent_id": ""} + parts = {r["pretraining_partition"] for r in hits} + best = next((p for p in priority if p in parts), sorted(parts)[0]) + hit = next(r for r in hits if r["pretraining_partition"] == best) + mode = "exact" if hit["canonical_wurcs"] == w else "lin_order_insensitive" + return {"wa3_partition": best, "wa3_match_mode": mode, "wa3_parent_id": hit["parent_glycorpus_id"]} + return look + + +# ============================================================== A_chem (verbatim logic from iar_achem_q_20260824_r1/a.py) +def load_achem(): + sys.path.insert(0, str(SCHEMA_DIR)) + from pipelib import parse_record, SIDE_RE, node_index # noqa: E402 + from classify import PLAIN_LINK # noqa: E402 + no_oh = set("Amd") + + def a_chem(rec, ai, skip_li): + occ = set() + for ei, e in enumerate([x for x in rec["lin"].split("_") if x]): + if ei == skip_li: + continue + m = PLAIN_LINK.match(e) + if not m: + continue + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if sm and sm.group(2) != "?": + try: + if node_index(sm.group(1)) - 1 == ai: + occ.add(int(sm.group(2))) + except ValueError: + pass + sk = rec["skel"][ai] + if not sk: + return None, "no_skeleton" + n = len(sk) + if n < 3: + return None, "skeleton_lt_3" + if n > 12: + return None, "skeleton_gt_12" + free = set(range(1, n + 1)) + if rec["anom"][ai] is not None: + free.discard(rec["anom"][ai]) + rg = rec["ring"][ai] + if rg and rg[1] != "?": + try: + free.discard(int(rg[1])) + except ValueError: + pass + free -= set(rec["subs"][ai]) + for p, ch in enumerate(sk, 1): + if ch in no_oh: + free.discard(p) + return free - occ, "ok" + + def for_linkage(wurcs, entry): + rec = parse_record(wurcs) + if rec is None or not rec["lin"]: + return {"achem_status": "unparsable"} + ents = [x for x in rec["lin"].split("_") if x] + if ents.count(entry) != 1: + return {"achem_status": "entry_not_unique_in_lin"} + li = ents.index(entry) + m = PLAIN_LINK.match(entry) + if not m: + return {"achem_status": "not_plain_linkage"} + sides = [] + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if not sm or sm.group(2) == "?": + return {"achem_status": "side_unparsable"} + try: + sides.append((node_index(sm.group(1)) - 1, int(sm.group(2)))) + except ValueError: + return {"achem_status": "bad_label"} + donor_flags = [0 <= ai < rec["nres"] and rec["anom"][ai] is not None and rec["anom"][ai] == p for ai, p in sides] + if donor_flags.count(True) != 1: + return {"achem_status": "orientation_undetermined"} + ai, truth_pos = sides[donor_flags.index(False)] + A, why = a_chem(rec, ai, li) + if A is None: + return {"achem_status": why} + k = len(A) + return {"achem_status": "ok", "achem_k": k, "achem_positions": sorted(A), "truth_in_achem": truth_pos in A, + "achem_chance": (1.0 / k) if k else None} + return for_linkage + + +# ============================================================== WA3 cases, model, evaluation +def build_wa3_cases(w3, wa0_cases, encodings, look): + cases, excluded = [], collections.Counter() + for c in wa0_cases: + enc, spans = encodings[c["wurcs"]] + by_g = {s["g"]: s for s in spans} + positions, texts = [], [] + for u in c["units"]: + s = by_g.get(u["g"]) + if s is None or s["unit_text"] != u["unit_text"] or s["unit_type"] != u["unit_type"]: + fail("unit mapping mismatch for %s unit %s" % (c["case_id"], u)) + positions.extend(range(s["start"], s["end"] + 1)) + texts.append(u["unit_text"]) + if max(positions) >= enc["length"] - (1 if enc["full_length"] > 256 else 0): + excluded["wa3_truncated_beyond_256"] += 1 + continue + truth = [enc["token_ids"][p] for p in positions] + masked = list(enc["token_ids"]) + for p in positions: + masked[p] = w3["mask_id"] + flags = {"enumerated_alternative": any("|" in t for t in texts), + "unknown_question_mark": any("?" in t for t in texts), + "wa3_truth_uses_invalid_token": any(t in w3["invalid"] for t in truth)} + flags["single_answer"] = not any(flags.values()) + lt_blank, bd_blank = list(enc["linkage_types"]), list(enc["branch_depths"]) + # Blank the channels that encode the hidden unit, honouring WA3's own input contract + # (composite_r4.validate_sequence_surface:584-592): linkage pieces are exactly residue_id == -2 and + # must keep a nonzero linkage class; non-residue pieces must keep branch depth 0. + for p in positions: + if enc["residue_ids"][p] == -2: + lt_blank[p] = w3["linkage_unknown"] # 9 = the class WA3 already uses for '?' linkages + elif enc["residue_ids"][p] >= 0: + bd_blank[p] = w3["branch_depth_unknown"] # 202 = the depth WA3 uses when the tree is not rooted + cases.append({**{k: c[k] for k in ("case_id", "glycan_index", "wurcs", "mask_plan", "units", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")}, + "unit_text": " | ".join("%s:%s" % (u["unit_type"], u["unit_text"]) for u in c["units"]), + "positions": positions, "truth_ids": truth, "masked_ids": masked, + "attention_mask": enc["attention_mask"], "residue_ids": enc["residue_ids"], + "branch_depths": enc["branch_depths"], "linkage_types": enc["linkage_types"], + "branch_depths_blank": bd_blank, "linkage_types_blank": lt_blank, + **flags, **look(c["wurcs"])}) + return cases, dict(excluded) + + +def all_absent(B, dev): # contract from iar_bytype3_20260825_r1/bytype.py (job 12094273) + return {"ms_token_ids": torch.empty((0, 64), dtype=torch.long, device=dev), + "ms_attention_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), + "ms_input_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), "ms_labels": None, + "ms_acquisition_parent_indices": torch.empty((0,), dtype=torch.long, device=dev), + "ms_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), "ms_mode": "development", + "static_token_ids": torch.zeros((B, 1, 4), dtype=torch.long, device=dev), + "static_attention_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), + "static_residue_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_slot_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_state_mask": torch.zeros((B, 1), dtype=torch.bool, device=dev), + "static_state_ids": torch.full((B, 1), -1, dtype=torch.long, device=dev), + "static_input_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), "static_labels": None, + "static_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), + "md_values": torch.zeros((B, 2, 20, 6), dtype=torch.float32, device=dev), + "md_feature_mask": torch.zeros((B, 2, 20, 6), dtype=torch.bool, device=dev), + "md_child_present_mask": torch.zeros((B, 2), dtype=torch.bool, device=dev), + "md_state_row_ids": torch.full((B, 2), -1, dtype=torch.long, device=dev), + "md_window_input_mask": torch.zeros((B, 2, 20), dtype=torch.bool, device=dev), "md_labels": None, + "md_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev)} + + +def load_model(): + spec = importlib.util.spec_from_file_location("wa3_train_mod", str(TRAIN_MOD)) + tm = importlib.util.module_from_spec(spec) + sys.modules["wa3_train_mod"] = tm + spec.loader.exec_module(tm) + if sha256_file(CK) != CK_SHA: + fail("WA3 checkpoint sha mismatch") + ctx = tm.native_authority(None, static_active=False) + _native, r8, _static, _runner = ctx.__enter__() + r5 = r8._core._r6._r5 + if int(r5.SEQUENCE_VOCAB_SIZE) != 2114: + fail("r5.SEQUENCE_VOCAB_SIZE != 2114") + model = tm.mdcore.make_md_enabled_composite_class(r5)(r8.NativeEightConfig(cell_id="A111", seq_vocab_size=2114), + md_cell_id="A1111", md_temporal_size=128) + ck = torch.load(CK, map_location="cpu", weights_only=False) + if str(ck.get("md_cell_id")) != "A1111" or int(ck["selection"]["best_epoch"]) != 58: + fail("checkpoint identity is not A1111 / best epoch 58") + model.load_state_dict(ck["model_state"], strict=True) + n_par = sum(p.numel() for p in model.parameters()) + if n_par != 138487995 or len(model.state_dict()) != 505: + fail("WA3 inventory %d params / %d tensors" % (n_par, len(model.state_dict()))) + model.eval() + dev = "cuda" if torch.cuda.is_available() else "cpu" + model.to(dev) + return model, dev, ctx + + +def evaluate(model, dev, w3, cases, threshold, blank_side_channels=False, neutral=False, readout=None): + bd_key = "branch_depths_blank" if blank_side_channels else "branch_depths" + lt_key = "linkage_types_blank" if blank_side_channels else "linkage_types" + results = [] + for b0 in range(0, len(cases), BATCH): + batch = cases[b0:b0 + BATCH] + current = [list(c["masked_ids"]) for c in batch] + unresolved = [set(c["positions"]) for c in batch] + initial, accepted = [[] for _ in batch], [[] for _ in batch] + top10 = [[] for _ in batch] + used_readout = [False for _ in batch] + for it in range(ITERATIONS): + t = lambda key: torch.tensor([c[key] for c in batch], dtype=torch.long, device=dev) # noqa: E731 + HOOK["mask"] = None + if neutral: + m = torch.zeros((len(batch), len(batch[0]["masked_ids"])), dtype=torch.bool) + for ci, c in enumerate(batch): + for p in c["positions"]: + if c["residue_ids"][p] == -2: + m[ci, p] = True + HOOK["mask"] = m.to(dev) + with torch.inference_mode(): + o = model(seq_token_ids=torch.tensor(current, dtype=torch.long, device=dev), + seq_attention_mask=t("attention_mask").bool(), seq_residue_ids=t("residue_ids"), + seq_branch_depths=t(bd_key), seq_linkage_types=t(lt_key), + seq_labels=None, topology_labels=None, topology_available=None, + **all_absent(len(batch), torch.device(dev))) + HOOK["mask"] = None + logits = o.sequence_logits.float() + if w3["allowed_mask"]["linkage"].shape[0] != logits.shape[-1]: + fail("answer-space mask size %d != model vocabulary %d" + % (w3["allowed_mask"]["linkage"].shape[0], logits.shape[-1])) + progress = 0 + for ci, c in enumerate(batch): + if not unresolved[ci]: + continue + for li, pos in enumerate(c["positions"]): + rid = c["residue_ids"][pos] + if rid != -2 and rid < 0: + fail("masked position %d of %s is neither a residue nor a linkage piece" % (pos, c["case_id"])) + if readout is not None and rid == -2 and len(c["positions"]) == 1 and len(c["units"]) == 1: + hv = _gather_h(len(batch), logits.shape[1], ci, pos).float().cpu().numpy()[None, :] + pp = torch.softmax(readout["lin"](readout["f"](hv)), dim=-1)[0] + tpp, tii = torch.topk(pp, k=min(10, pp.shape[0])) + tp10, ti10 = tpp.to(logits.device), readout["ids_t"][tii].to(logits.device) + used_readout[ci] = True + else: + allow = w3["allowed_mask"]["linkage" if rid == -2 else "residue"] + row = logits[ci, pos].masked_fill(~allow, float("-inf")) + tp10, ti10 = torch.topk(torch.softmax(row, dim=-1), k=10) + tp, ti = tp10[:TOP_K], ti10[:TOP_K] + ids = [int(x) for x in ti.tolist()] + if it == 0: + top10[ci].append([[w3["i2t"][int(i)], round(float(p), 4)] + for p, i in zip(tp10.tolist(), ti10.tolist())]) + initial[ci].append((ids[0] == c["truth_ids"][li], c["truth_ids"][li] in ids)) + if pos not in unresolved[ci]: + continue + if float(tp[0]) < threshold or ids[0] in w3["invalid"]: + continue + current[ci][pos] = ids[0] + unresolved[ci].remove(pos) + progress += 1 + accepted[ci].append(it + 1) + if progress == 0: + break + for ci, c in enumerate(batch): + final = [current[ci][p] for p in c["positions"]] + correct = [f == t for f, t in zip(final, c["truth_ids"])] + results.append({k: c[k] for k in ("case_id", "glycan_index", "mask_plan", "unit_text", "single_answer", + "enumerated_alternative", "unknown_question_mark", + "wa3_truth_uses_invalid_token", "wa3_partition", "wa3_match_mode", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")} + | {"num_masked_positions": len(c["positions"]), + "truth_tokens": [w3["i2t"][x] for x in c["truth_ids"]], + "final_tokens": [w3["i2t"][x] for x in final], + "initial_top1_correct_count": sum(a for a, _ in initial[ci]), + "initial_top5_correct_count": sum(b for _, b in initial[ci]), + "resolved_count": len(c["positions"]) - len(unresolved[ci]), + "final_correct_count": sum(correct), + "initial_span_exact_top1": all(a for a, _ in initial[ci]), + "initial_span_exact_top5": all(b for _, b in initial[ci]), + "iterative_span_exact": all(correct), + "iterations_used": max(accepted[ci], default=0), + "initial_top10": top10[ci], "used_readout": used_readout[ci]}) + return results + + +def aggregate(rs): # identical formulas to HeldoutIPAEvaluator._aggregate_slice + n = len(rs) + if not n: + return {"num_cases": 0} + pos = sum(r["num_masked_positions"] for r in rs) + res = sum(r["resolved_count"] for r in rs) + cor = sum(r["final_correct_count"] for r in rs) + return {"num_cases": n, "num_masked_positions": pos, "avg_masked_positions_per_case": pos / n, + "initial_top1_token_accuracy": sum(r["initial_top1_correct_count"] for r in rs) / pos, + "initial_top5_token_accuracy": sum(r["initial_top5_correct_count"] for r in rs) / pos, + "initial_exact_span_accuracy_top1": sum(bool(r["initial_span_exact_top1"]) for r in rs) / n, + "initial_exact_span_accuracy_top5": sum(bool(r["initial_span_exact_top5"]) for r in rs) / n, + "iterative_resolved_fraction": res / pos, + "iterative_accuracy_among_resolved": (cor / res) if res else 0.0, + "iterative_final_token_accuracy": cor / pos, + "iterative_exact_span_accuracy": sum(bool(r["iterative_span_exact"]) for r in rs) / n, + "avg_iterations_used_per_case": sum(r["iterations_used"] for r in rs) / n} + + +def paired(rs): + n = len(rs) + if not n: + return {"n": 0} + a = [bool(r["wa0_iterative_span_exact"]) for r in rs] + b = [bool(r["iterative_span_exact"]) for r in rs] + return {"n": n, "wa0_exact_span": sum(a) / n, "wa3_exact_span": sum(b) / n, + "both": sum(x and y for x, y in zip(a, b)), "wa0_only": sum(x and not y for x, y in zip(a, b)), + "wa3_only": sum(y and not x for x, y in zip(a, b)), "neither": sum(not x and not y for x, y in zip(a, b))} + + +# ============================================================== R2-05 baselines (port of r2_05_baselines.py) +class BaselineStats: + def __init__(self): + self.marginal = collections.defaultdict(collections.Counter) + self.ctx_pair = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.ctx_prev = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.n_glycans = 0 + self.feature_ids, self._feats, self._donor = {}, [], collections.defaultdict(list) + self.text_ids, self.texts, self.donor_index = {}, [], {} + + def _tid(self, text): + if text not in self.text_ids: + self.text_ids[text] = len(self.texts) + self.texts.append(text) + return self.text_ids[text] + + def add(self, index, unpadded, records): + self.n_glycans += 1 + feats = set() + for r in records: + key = (r["unit_type"], r["unit_text"]) + feats.add(self.feature_ids.setdefault(key, len(self.feature_ids))) + if not r["eligible"] or "|" in r["unit_text"]: # typed child: same answer space as BERTose + continue + if r["unit_type"] == "linkage" and not 1 <= BaselineStats.linkage_class(r["unit_text"]) <= 8: + continue # strict child: ordinary linkages only, as for BERTose + ut, text = r["unit_type"], r["unit_text"] + self.marginal[ut][text] += 1 + prev_t = unpadded[r["start"] - 1] if r["start"] > 0 else "" + next_t = unpadded[r["end"] + 1] if r["end"] + 1 < len(unpadded) else "" + self.ctx_pair[ut][(prev_t, next_t)][text] += 1 + self.ctx_prev[ut][prev_t][text] += 1 + self._donor[(ut, r["ordinal"])].append((index, self._tid(text))) + self._feats.append(sorted(feats)) + + def finalize(self): + counts = np.zeros(len(self.feature_ids) + 1, dtype=np.int64) + for fs in self._feats: + for f in fs: + counts[f + 1] += 1 + self.indptr = np.cumsum(counts) + self.rows = np.zeros(int(self.indptr[-1]), dtype=np.int32) + fill = self.indptr[:-1].copy() + for gid, fs in enumerate(self._feats): + for f in fs: + self.rows[fill[f]] = gid + fill[f] += 1 + self.sizes = np.array([len(fs) for fs in self._feats], dtype=np.int64) + self._feats = [] + for key, pairs in self._donor.items(): + pairs.sort() + self.donor_index[key] = (np.array([p[0] for p in pairs], dtype=np.int64), + np.array([p[1] for p in pairs], dtype=np.int64)) + self._donor = {} + + @staticmethod + def _argmax(counter): + total = sum(counter.values()) + text = min(counter.items(), key=lambda kv: (-kv[1], kv[0]))[0] + return text, counter[text] / total + + def marginal_pred(self, ut): + return self._argmax(self.marginal[ut]) if self.marginal.get(ut) else (None, 0.0) + + def context_pred(self, ut, prev_t, next_t): + c = self.ctx_pair.get(ut, {}).get((prev_t, next_t)) + if c: + return self._argmax(c)[0], "prev_next" + c = self.ctx_prev.get(ut, {}).get(prev_t) + if c: + return self._argmax(c)[0], "prev_only" + return self.marginal_pred(ut)[0], "marginal_backoff" + + def nn_pred(self, ut, ordinal, query_keys): + donor = self.donor_index.get((ut, ordinal)) + if donor is None: + return None + cand_idx, cand_txt = donor + fids = [self.feature_ids[k] for k in query_keys if k in self.feature_ids] + if fids: + rows = np.concatenate([self.rows[self.indptr[f]:self.indptr[f + 1]] for f in fids]) + inter = np.bincount(rows, minlength=self.n_glycans)[cand_idx].astype(np.float64) + else: + inter = np.zeros(len(cand_idx)) + union = self.sizes[cand_idx] + len(query_keys) - inter + jac = np.divide(inter, union, out=np.zeros_like(inter), where=union > 0) + return self.texts[int(cand_txt[int(np.argmax(jac))])] + + +def fit_baselines(w3, idx_rows, test_wurcs): + token_ids = np.load(PKGD / "review_token_ids.npy", mmap_mode="r") + lengths = np.load(PKGD / "review_lengths.npy", mmap_mode="r") + stats, counts, bo, unk = BaselineStats(), collections.Counter(), w3["branch_open_id"], w3["t2i"]["[UNK]"] + test_keys = {lin_key(w) for w in test_wurcs} + for i, r in enumerate(idx_rows): + if r["pretraining_partition"] != "pretraining_train" or r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + counts["removed_test_glycan"] += 1 + continue + L = int(lengths[i]) + ids = [int(x) for x in token_ids[i, :L]] + p, recs, ords, ok = 0, [], collections.Counter(), True + for u in w3["semantic"].pre_tokenize(w): + if u.get("text") == "[BRANCH_OPEN]": + continue + while p < L and ids[p] == bo: + p += 1 + ps = [u["text"]] if u["type"] == "special" else list(w3["tok"].apply_bpe(u["text"])) + pid = [w3["t2i"].get(x, unk) for x in ps] + if ids[p:p + len(pid)] != pid: + ok = False + break + if u["type"] != "special": + recs.append({"start": p, "end": p + len(pid) - 1, "unit_type": u["type"], "unit_text": u["text"], + "ordinal": ords[u["type"]], "eligible": not any(x in w3["invalid"] for x in pid)}) + ords[u["type"]] += 1 + p += len(pid) + while ok and p < L and ids[p] == bo: + p += 1 + if not ok or p != L: + counts["unit_walk_mismatch"] += 1 + continue + stats.add(counts["fitted"], [w3["i2t"][x] for x in ids], recs) + counts["fitted"] += 1 + stats.finalize() + return stats, dict(counts) + + +def build_allowed(w3, idx_rows, test_wurcs): + """Type-consistent answer space: token ids seen at linkage / residue pieces in WA3 training parents.""" + token_ids = np.load(PKGD / "review_token_ids.npy", mmap_mode="r") + residue_ids = np.load(PKGD / "review_residue_ids.npy", mmap_mode="r") + linkage_types = np.load(PKGD / "review_linkage_types.npy", mmap_mode="r") + lengths = np.load(PKGD / "review_lengths.npy", mmap_mode="r") + test_keys = {lin_key(w) for w in test_wurcs} + V = len(w3["t2i"]) + seen = {"linkage": np.zeros(V, dtype=bool), "residue": np.zeros(V, dtype=bool)} + rows = 0 + class_counts = np.zeros(10, dtype=np.int64) + for i, r in enumerate(idx_rows): + if r["pretraining_partition"] != "pretraining_train" or r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + continue + L = int(lengths[i]) + ids, rid = np.asarray(token_ids[i, :L]), np.asarray(residue_ids[i, :L]) + lt = np.asarray(linkage_types[i, :L]) + class_counts += np.bincount(lt[rid == -2], minlength=10)[:10] + seen["linkage"][ids[(rid == -2) & (lt >= 1) & (lt <= 8)]] = True # strict: ordinary linkages only + seen["residue"][ids[rid >= 0]] = True + rows += 1 + bad = np.zeros(V, dtype=bool) + bad[sorted(w3["invalid"])] = True + pipe = [i for t, i in w3["t2i"].items() if "|" in t] + bad[pipe] = True + allowed = {k: v & ~bad for k, v in seen.items()} + info = {"training_rows_scanned": rows, "vocab": V, "invalid_excluded": len(w3["invalid"]), + "pipe_tokens_excluded": len(pipe), + "linkage_tokens_seen": int(seen["linkage"].sum()), "residue_tokens_seen": int(seen["residue"].sum()), + "linkage_tokens_allowed": int(allowed["linkage"].sum()), + "residue_tokens_allowed": int(allowed["residue"].sum()), + "linkage_class_counts": class_counts.tolist()} + return allowed, info + + +def truth_outside(w3, cases): + """Cases whose true token at some masked position lies outside the allowed answer space.""" + n = 0 + for c in cases: + for pos, t in zip(c["positions"], c["truth_ids"]): + kind = "linkage" if c["residue_ids"][pos] == -2 else "residue" + if not w3["allowed_np"][kind][t]: + n += 1 + break + return n + + +HOOK = {"mask": None, "vec": None} + + +def _linkage_hook(module, inputs, output): + m = HOOK["mask"] + if m is None: + return None + if output.dim() == 3 and tuple(output.shape[:2]) == tuple(m.shape): + idx = m + elif output.dim() == 2 and output.shape[0] == m.numel(): + idx = m.reshape(-1) + else: + fail("linkage embedding output %s does not match mask %s" % (tuple(output.shape), tuple(m.shape))) + out = output.clone() + out[idx] = HOOK["vec"].to(out.dtype) + return out + + +def find_linkage_embedding(model): + cands = [(n, m) for n, m in model.named_modules() if isinstance(m, torch.nn.Embedding) and m.num_embeddings == 10] + named = [(n, m) for n, m in cands if "linkage" in n.lower()] + if len(named) != 1: + fail("linkage embedding not unique: %s" % [n for n, _ in cands]) + return named[0] + + +def baseline_unit_preds(w3, stats, cases, encodings): + out = {} + for c in cases: + if len(c["units"]) != 1: + continue + enc, spans = encodings[c["wurcs"]] + s = {sp["g"]: sp for sp in spans}[c["units"][0]["g"]] + tokens = [w3["i2t"][x] for x in enc["token_ids"][:enc["length"]]] + prev_t = tokens[s["start"] - 1] if s["start"] > 0 else "" + next_t = tokens[s["end"] + 1] if s["end"] + 1 < len(tokens) else "" + query = {(sp["unit_type"], sp["unit_text"]) for sp in spans if sp["g"] != s["g"]} + out[c["case_id"]] = {"marginal_frequency": stats.marginal_pred(s["unit_type"])[0], + "context_frequency": stats.context_pred(s["unit_type"], prev_t, next_t)[0], + "nearest_neighbour": stats.nn_pred(s["unit_type"], s["ordinal"], query)} + return out + + +PAT_ORD = re.compile(r"^([A-Za-z]+)(\d+)-([A-Za-z]+)(\d+)$") + + +def _cat(truth, pred): + if pred is None: + return "no_answer" + if pred == truth: + return "exact" + t, p = PAT_ORD.match(truth), PAT_ORD.match(pred) + if t is None: + return "truth_not_ordinary" + if p is None: + return "non_ordinary_answer" + if (t.group(1), t.group(3)) == (p.group(1), p.group(3)): + return "right_sugars_wrong_positions" + if (t.group(2), t.group(4)) == (p.group(2), p.group(4)): + return "right_positions_wrong_sugars" + return "both_wrong" + + +def decompose(cases, arms, preds): + by_id = {a: {r["case_id"]: r for r in res} for a, res in arms.items()} + out = {} + for subset, sel in (("all_cases", cases), + ("not_in_wa3_training", [c for c in cases if c["wa3_partition"] != "pretraining_train"])): + rows = [] + for c in sel: + if len(c["positions"]) != 1 or len(c["units"]) != 1: + continue + truth = c["units"][0]["unit_text"] + m = {} + for a in arms: + r = by_id[a][c["case_id"]] + toks = [tk for tk, _ in r["initial_top10"][0]] + m["BERTose_%s_first_choice" % a] = toks[0] + m["BERTose_%s_IAR" % a] = r["final_tokens"][0] if r["resolved_count"] else None + m["_rank_%s" % a] = toks.index(truth) + 1 if truth in toks else 11 + m.update(preds.get(c["case_id"], {})) + t = PAT_ORD.match(truth) + rows.append({"truth": truth, "pair": "%s-%s" % (t.group(2), t.group(4)) if t else "non_ordinary", + "k": c.get("achem_k"), "m": m}) + methods = [k for k in (rows[0]["m"] if rows else {}) if not k.startswith("_")] + res = {"n_single_token_cases": len(rows), "methods": {}} + for meth in methods: + cats = collections.Counter(_cat(r["truth"], r["m"].get(meth)) for r in rows) + res["methods"][meth] = {"exact": round(cats["exact"] / len(rows), 4) if rows else 0.0, + "categories": dict(cats)} + for a in arms: + ranks = collections.Counter(r["m"]["_rank_%s" % a] for r in rows) + res["rank_of_truth_%s" % a] = {("%d" % k if k <= 10 else ">10"): v for k, v in sorted(ranks.items())} + strata = collections.defaultdict(list) + for r in rows: + strata["pair=" + r["pair"]].append(r) + k = r["k"] + strata["admissible_positions=" + ("unknown" if k is None else (str(k) if k < 4 else ">=4"))].append(r) + res["strata"] = {} + for name, rs in sorted(strata.items()): + res["strata"][name] = {"n": len(rs)} | { + meth: round(sum(_cat(r["truth"], r["m"].get(meth)) == "exact" for r in rs) / len(rs), 4) + for meth in methods} + out[subset] = res + return out + + +ORD_RE = re.compile(r"^[A-Za-z]+\d+-[A-Za-z]+\d+$") +CAP = {"h": None} +N_TRAIN, N_DEV, PROBE_BATCH = 24000, 4000, 64 +LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + + +def _cap_hook(module, inputs, output): + CAP["h"] = inputs[0].detach() + + +def find_lm_projection(model): + cands = [(n, m) for n, m in model.named_modules() if isinstance(m, torch.nn.Linear) and m.out_features == 2114] + if len(cands) > 1: + pref = [(n, m) for n, m in cands if any(k in n.lower() for k in ("seq", "mlm", "lm_", "sequence"))] + cands = pref if len(pref) == 1 else cands + if len(cands) != 1: + fail("LM projection not unique: %s" % [n for n, _ in cands]) + return cands[0] + + +def _gather_h(B, L, bi, pos): + H = CAP["h"] + if H.dim() == 3 and H.shape[0] == B and H.shape[1] == L: + return H[bi, pos] + if H.dim() == 2 and H.shape[0] == B * L: + return H.reshape(B, L, -1)[bi, pos] + fail("unexpected LM-projection input shape %s for batch %d x %d" % (tuple(H.shape), B, L)) + + +def _forward(model, dev, tok, am, rid, bd, lt, neutral_pos): + HOOK["mask"] = None + if neutral_pos is not None: + m = torch.zeros(tok.shape, dtype=torch.bool) + for bi, p in neutral_pos: + m[bi, p] = True + HOOK["mask"] = m.to(dev) + with torch.inference_mode(): + o = model(seq_token_ids=tok.to(dev), seq_attention_mask=am.bool().to(dev), seq_residue_ids=rid.to(dev), + seq_branch_depths=bd.to(dev), seq_linkage_types=lt.to(dev), + seq_labels=None, topology_labels=None, topology_available=None, + **all_absent(tok.shape[0], torch.device(dev))) + HOOK["mask"] = None + return o.sequence_logits.float() + + +def _score(w3, logits, B, L, bi, pos, want_h): + row = logits[bi, pos].masked_fill(~w3["allowed_mask"]["linkage"], float("-inf")) + pr = torch.softmax(row, dim=-1) + p1, i1 = pr.max(-1) + out = {"pred_id": int(i1), "pred_prob": float(p1), + "ord_probs": pr[w3["ord_ids_t"]].cpu().numpy().astype(np.float32)} + if want_h: + out["h"] = _gather_h(B, L, bi, pos).float().cpu().numpy() + return out + + +def sample_parents(w3, idx_rows, test_wurcs, arrays, want_partition, n, seed, require_contributor=True): + token_ids, residue_ids, _bd, linkage_types, _am, lengths = arrays + test_keys = {lin_key(w) for w in test_wurcs} + rng = np.random.default_rng(seed) + out = [] + for i in rng.permutation(len(idx_rows)): + r = idx_rows[int(i)] + if r["pretraining_partition"] != want_partition: + continue + if require_contributor and r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + continue + L = int(lengths[i]) + ids, rid, lt = (np.asarray(token_ids[i, :L]), np.asarray(residue_ids[i, :L]), np.asarray(linkage_types[i, :L])) + cand = np.flatnonzero((rid == -2) & (lt >= 1) & (lt <= 8) & w3["ord_full_np"][ids]) + if cand.size == 0: + continue + p = int(rng.choice(cand)) + out.append({"row": int(i), "pos": p, "true_id": int(ids[p]), "true_class": int(lt[p]), + "n_residues": int(len(set(int(x) for x in rid if x >= 0)))}) + if len(out) >= n: + break + return out + + +def run_parent_samples(model, dev, w3, arrays, samples, arm, want_h): + token_ids, residue_ids, branch_depths, linkage_types, attention_mask, _ = arrays + res = [] + for b0 in range(0, len(samples), PROBE_BATCH): + batch = samples[b0:b0 + PROBE_BATCH] + rows = [s["row"] for s in batch] + g = lambda a: torch.as_tensor(np.stack([np.asarray(a[r]) for r in rows]).astype(np.int64)) # noqa: E731 + tok, am, rid, bd, lt = g(token_ids), g(attention_mask), g(residue_ids), g(branch_depths), g(linkage_types) + for bi, s in enumerate(batch): + tok[bi, s["pos"]] = w3["mask_id"] + if arm != "true_class": + lt[bi, s["pos"]] = w3["linkage_unknown"] + B, L = tok.shape + logits = _forward(model, dev, tok, am, rid, bd, lt, + [(bi, s["pos"]) for bi, s in enumerate(batch)] if arm == "neutral" else None) + for bi, s in enumerate(batch): + res.append(_score(w3, logits, B, L, bi, s["pos"], want_h)) + return res + + +def run_harness_cases(model, dev, w3, cases, encodings): + res, meta = [], [] + sel = [c for c in cases if len(c["positions"]) == 1 and len(c["units"]) == 1] + for b0 in range(0, len(sel), PROBE_BATCH): + batch = sel[b0:b0 + PROBE_BATCH] + t = lambda key: torch.tensor([c[key] for c in batch], dtype=torch.long) # noqa: E731 + tok = torch.tensor([c["masked_ids"] for c in batch], dtype=torch.long) + B, L = tok.shape + logits = _forward(model, dev, tok, t("attention_mask"), t("residue_ids"), t("branch_depths_blank"), + t("linkage_types_blank"), [(bi, c["positions"][0]) for bi, c in enumerate(batch)]) + for bi, c in enumerate(batch): + res.append(_score(w3, logits, B, L, bi, c["positions"][0], True)) + spans = encodings[c["wurcs"]][1] + tt = c["units"][0]["unit_text"] + meta.append({"case_id": c["case_id"], "true_id": c["truth_ids"][0], "truth": tt, + "true_class": int(w3["exact_linkage"](tt)), + "n_residues": sum(1 for sp in spans if sp["unit_type"] == "residue"), + "wa3_partition": c["wa3_partition"]}) + return res, meta + + +def train_probe(Xtr, ytr, Xdv, ydv, n_out, seed=0): + mu, sd = Xtr.mean(0), Xtr.std(0) + 1e-6 + f = lambda X: torch.as_tensor((X - mu) / sd, dtype=torch.float32) # noqa: E731 + Xt, Xd, yt, yd = f(Xtr), f(Xdv), torch.as_tensor(ytr), torch.as_tensor(ydv) + torch.manual_seed(seed) + lin = torch.nn.Linear(Xt.shape[1], n_out) + opt = torch.optim.AdamW(lin.parameters(), lr=1e-3, weight_decay=1e-2) + best = (-1.0, None, -1) + for ep in range(60): + perm = torch.randperm(len(Xt)) + for b in range(0, len(Xt), 512): + idx = perm[b:b + 512] + loss = torch.nn.functional.cross_entropy(lin(Xt[idx]), yt[idx]) + opt.zero_grad() + loss.backward() + opt.step() + with torch.no_grad(): + acc = float((lin(Xd).argmax(-1) == yd).float().mean()) + if acc > best[0]: + best = (acc, {k: v.clone() for k, v in lin.state_dict().items()}, ep) + lin.load_state_dict(best[1]) + lin.eval() + for p in lin.parameters(): + p.requires_grad_(False) + return lin, f, {"dev_accuracy_for_selection": round(best[0], 4), "best_epoch": best[2]}, mu, sd + + +def score_prediction(truth_tokens, pred_tokens): + n = len(truth_tokens) + if pred_tokens is None: + ok, nc = False, 0 + else: + ok = list(pred_tokens) == list(truth_tokens) + nc = sum(a == b for a, b in zip(pred_tokens, truth_tokens)) if len(pred_tokens) == n else 0 + return {"num_masked_positions": n, "initial_top1_correct_count": nc, "initial_top5_correct_count": nc, + "resolved_count": n if pred_tokens is not None else 0, "final_correct_count": nc, + "initial_span_exact_top1": ok, "initial_span_exact_top5": ok, "iterative_span_exact": ok, + "iterations_used": 0} + + +def run_baselines(w3, stats, cases, encodings, results_by_id, results_blank_by_id=None): + method_rows = collections.defaultdict(list) + for c in cases: + if len(c["units"]) != 1: + continue + enc, spans = encodings[c["wurcs"]] + s = {sp["g"]: sp for sp in spans}[c["units"][0]["g"]] + tokens = [w3["i2t"][x] for x in enc["token_ids"][:enc["length"]]] + prev_t = tokens[s["start"] - 1] if s["start"] > 0 else "" + next_t = tokens[s["end"] + 1] if s["end"] + 1 < len(tokens) else "" + query = {(sp["unit_type"], sp["unit_text"]) for sp in spans if sp["g"] != s["g"]} + truth = [w3["i2t"][x] for x in c["truth_ids"]] + bpe = lambda t: None if t is None else list(w3["tok"].apply_bpe(t)) # noqa: E731 + preds = {"marginal_frequency": bpe(stats.marginal_pred(s["unit_type"])[0]), + "context_frequency": bpe(stats.context_pred(s["unit_type"], prev_t, next_t)[0]), + "nearest_neighbour": bpe(stats.nn_pred(s["unit_type"], s["ordinal"], query))} + flags = {k: c[k] for k in ("single_answer", "wa3_partition")} + for m, p in preds.items(): + method_rows[m].append({**score_prediction(truth, p), **flags}) + method_rows["WA3_harness_inputs"].append({**results_by_id[c["case_id"]]}) + if results_blank_by_id is not None: + method_rows["WA3_side_channels_blanked"].append({**results_blank_by_id[c["case_id"]]}) + wa0 = {"num_masked_positions": 1, "initial_top1_correct_count": 0, "initial_top5_correct_count": 0, + "resolved_count": 1, "final_correct_count": 0, "initial_span_exact_top1": c["wa0_initial_span_exact_top1"], + "initial_span_exact_top5": False, "iterative_span_exact": c["wa0_iterative_span_exact"], + "iterations_used": 0, **flags} + method_rows["WA0_submitted"].append(wa0) + table = [] + for m, rows in method_rows.items(): + for subset, sel in (("all_cases", rows), ("single_answer", [r for r in rows if r["single_answer"]]), + ("single_answer_not_in_wa3_training", + [r for r in rows if r["single_answer"] and r["wa3_partition"] != "pretraining_train"])): + a = aggregate(sel) + table.append({"method": m, "subset": subset, "n": a["num_cases"], + "exact_span_accuracy": round(a.get("iterative_exact_span_accuracy", 0.0), 4)}) + return table + + +# ============================================================== main +def summarize_run(results, cases_all, excluded, cfg, results_blank=None): + sa = [r for r in results if r["single_answer"]] + unseen = lambda rs: [r for r in rs if r["wa3_partition"] != "pretraining_train"] # noqa: E731 + out = {"wa0_config": cfg, "wa3_excluded": excluded, + "flags": {"cases": len(results), "single_answer": len(sa), + "enumerated_alternative": sum(r["enumerated_alternative"] for r in results), + "unknown_question_mark": sum(r["unknown_question_mark"] for r in results), + "wa3_truth_uses_invalid_token": sum(r["wa3_truth_uses_invalid_token"] for r in results)}, + "exposure": dict(collections.Counter(r["wa3_partition"] for r in results)), + "wa3_all_cases": aggregate(results), "wa3_single_answer": aggregate(sa), + "wa3_single_answer_not_in_wa3_training": aggregate(unseen(sa)), + "paired_wa0_vs_wa3_all_cases": paired(results), "paired_wa0_vs_wa3_single_answer": paired(sa)} + if results_blank is not None: + sb = [r for r in results_blank if r["single_answer"]] + out["wa3_side_channels_blanked_all_cases"] = aggregate(results_blank) + out["wa3_side_channels_blanked_single_answer"] = aggregate(sb) + out["wa3_side_channels_blanked_single_answer_not_in_wa3_training"] = aggregate(unseen(sb)) + ach = [c for c in cases_all if "achem_status" in c] + if ach: + by_id = {r["case_id"]: r for r in results} + strata = collections.defaultdict(list) + status = collections.Counter(c["achem_status"] for c in ach) + for c in ach: + if c["achem_status"] != "ok" or not by_id[c["case_id"]]["single_answer"]: + continue + k = c["achem_k"] + strata["k=0" if k == 0 else ("k=1" if k == 1 else ("k=2" if k == 2 else ("k=3" if k == 3 else "k>=4")))].append(c) + out["achem"] = {"status": dict(status), "strata": {}} + for name, cs in sorted(strata.items()): + rs = [by_id[c["case_id"]] for c in cs] + row = {"n": len(cs), "mean_chance": float(np.mean([c["achem_chance"] or 0 for c in cs])), + "truth_in_achem": sum(c["truth_in_achem"] for c in cs), + "wa3_exact_span_harness_inputs": aggregate(rs)["iterative_exact_span_accuracy"], + "wa0_exact_span_harness_inputs": sum(c["wa0_iterative_span_exact"] for c in cs) / len(cs)} + if results_blank is not None: + bb = {r["case_id"]: r for r in results_blank} + row["wa3_exact_span_side_channels_blanked"] = aggregate([bb[c["case_id"]] for c in cs])["iterative_exact_span_accuracy"] + out["achem"]["strata"][name] = row + return out + + +def main(): + OUT.mkdir(parents=True, exist_ok=True) + manifest = {"schema": "bertose_wa3_final_iar_readout_v1", + "parent_script": "wa3_same_test.py sha256 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 (job 12847066)", + "decoding": "type-consistent answer space (see docstring); renormalised softmax; threshold 0.80; 3 rounds", + "started": time.strftime("%Y-%m-%dT%H:%M:%S"), + "slurm_job_id": os.environ.get("SLURM_JOB_ID"), "host": platform.node(), "python": sys.version.split()[0], + "torch": torch.__version__, "threads": torch.get_num_threads(), + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back"} + for path, expect in EXPECTED_SHA.items(): + got = sha256_file(path) + if got != expect: + fail("%s sha %s != %s" % (path, got, expect)) + log("all %d pinned file hashes match" % len(EXPECTED_SHA)) + + hie, ev0 = load_wa0_evaluator() + w3 = build_wa3_tokenizer() + manifest["wa3_invalid_prediction_set"] = {"specials": w3["n_specials"], "ambiguity_tokens": w3["n_ambiguity"]} + java_cp = compile_java_helper() + with gzip.open(PKGD / "review_sequence_parent_index.tsv.gz", "rt", newline="") as fh: + idx_rows = list(csv.DictReader(fh, delimiter="\t")) + if len(idx_rows) != 281208: + fail("parent index row count %d" % len(idx_rows)) + + parity = parity_gate(w3, java_cp, idx_rows) + write_json(OUT / "gate_wa3_input_parity.json", parity) + log("WA3 input parity: %s %s/%d" % (parity["status"], parity["matches"].get("all", 0), parity["rows"])) + if parity["status"] != "PASS": + fail("WA3 inputs do not reproduce the training arrays; see gate_wa3_input_parity.json") + + look = exposure_lookup(idx_rows) + achem = load_achem() + set_data, all_test_wurcs = {}, set() + for set_name, spec in SETS.items(): + first_cfg = parse_wa0_summary(spec["wa0_root"] / spec["runs"][0]) + csv_path = Path(first_cfg["input_csv"]) if set_name == "bench1392" else WORK / "inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv" + rows = hie.load_rows(input_csv=csv_path, limit=first_cfg["glycans_loaded"], shuffle=False, seed=42) + manifest.setdefault("inputs", {})[set_name] = {"csv": str(csv_path), "sha256": sha256_file(csv_path), "rows": len(rows)} + uniq = sorted({r["wurcs"] for r in rows}) + auths = run_java_helper(java_cp, uniq) + encodings = {w: wa3_encode(w3, w, a) for w, a in zip(uniq, auths)} + manifest["inputs"][set_name]["helper_errors"] = sum(a["helper_error"] for a in auths) + manifest["inputs"][set_name]["exposure_glycans"] = dict(collections.Counter(look(w)["wa3_partition"] for w in uniq)) + set_data[set_name] = (rows, encodings) + all_test_wurcs.update(uniq) + log("%s: %d glycans; WA3 exposure %s" % (set_name, len(uniq), manifest["inputs"][set_name]["exposure_glycans"])) + + w3["allowed_np"], manifest["answer_space"] = build_allowed(w3, idx_rows, all_test_wurcs) + log("answer space: %s" % manifest["answer_space"]) + + built, identity_failures = [], [] + for set_name, spec in SETS.items(): + rows, encodings = set_data[set_name] + for run in spec["runs"]: + try: + cfg, wa0_cases = rebuild_wa0_cases(hie, ev0, rows, spec["wa0_root"] / run) + except (SystemExit, OSError, KeyError, ValueError) as exc: + identity_failures.append({"set": set_name, "run": run, "reason": str(exc)}) + log("%s/%s: SKIPPED, not the same test: %s" % (set_name, run, exc)) + continue + cases, excluded = build_wa3_cases(w3, wa0_cases, encodings, look) + for c in cases: + if len(c["units"]) == 1 and c["units"][0]["unit_type"] == "linkage": + c.update(achem(c["wurcs"], c["units"][0]["unit_text"])) + manifest["inputs"][set_name].setdefault("wa0_checkpoints", {})[run] = cfg["checkpoint"] + manifest.setdefault("truth_outside_answer_space", {})["%s/%s" % (set_name, run)] = truth_outside(w3, cases) + built.append((set_name, run, cfg, cases, excluded)) + log("%s/%s: WA0 cases rebuilt and verified (%d); WA3 cases %d; excluded %s" + % (set_name, run, len(wa0_cases), len(cases), excluded)) + write_json(OUT / "gate_case_identity.json", {"status": "PASS" if not identity_failures else "PARTIAL", + "verified_runs": [(s, r, len(c)) for s, r, _, c, _ in built], + "skipped_runs": identity_failures}) + manifest["case_identity_skipped_runs"] = identity_failures + if not built: + fail("no run could be reproduced as the same test") + + model, dev, ctx = load_model() + w3["allowed_mask"] = {k: torch.as_tensor(v, dtype=torch.bool, device=dev) for k, v in w3["allowed_np"].items()} + manifest["device"] = dev + log("WA3 loaded strict 505/505 on %s" % dev) + + counts = np.array(manifest["answer_space"]["linkage_class_counts"], dtype=np.float64) + wts = counts[1:9] / counts[1:9].sum() + lk_name, lk_mod = find_linkage_embedding(model) + with torch.no_grad(): + w = torch.as_tensor(wts, dtype=torch.float32, device=lk_mod.weight.device) + HOOK["vec"] = (lk_mod.weight[1:9].detach().float() * w[:, None]).sum(0) + lk_mod.register_forward_hook(_linkage_hook) + lm_name, lm_mod = find_lm_projection(model) + lm_mod.register_forward_hook(_cap_hook) + manifest["hooks"] = {"neutral_linkage_embedding": lk_name, "hidden_capture_input_of": lm_name} + log("hooks: neutral on %s, hidden = input of %s" % (lk_name, lm_name)) + + V = len(w3["t2i"]) + ord_full = np.zeros(V, dtype=bool) + ord_class = np.zeros(V, dtype=np.int64) + for tkn, i in w3["t2i"].items(): + if ORD_RE.match(tkn): + ord_full[i] = True + ord_class[i] = int(w3["exact_linkage"](tkn)) + ord_full &= w3["allowed_np"]["linkage"] + w3["ord_full_np"] = ord_full + ORD_IDS = np.flatnonzero(ord_full) + w3["ord_ids_t"] = torch.as_tensor(ORD_IDS, dtype=torch.long, device=dev) + ord_pos = {int(i): k for k, i in enumerate(ORD_IDS)} + manifest["ordinary_single_token_linkages"] = int(ord_full.sum()) + + arrays = tuple(np.load(PKGD / f, mmap_mode="r") for f in + ("review_token_ids.npy", "review_residue_ids.npy", "review_branch_depths.npy", + "review_linkage_types.npy", "review_attention_mask.npy", "review_lengths.npy")) + if arrays[0].shape[1] != MAX_LEN: + fail("training arrays width %d != %d" % (arrays[0].shape[1], MAX_LEN)) + parts = collections.Counter(r["pretraining_partition"] for r in idx_rows) + manifest["partitions"] = dict(parts) + dev_part = [p for p in parts if "develop" in p] + if len(dev_part) != 1: + fail("development partition label not unique: %s" % dict(parts)) + t0 = time.time() + tr_s = sample_parents(w3, idx_rows, all_test_wurcs, arrays, "pretraining_train", N_TRAIN, 7) + dv_s = sample_parents(w3, idx_rows, all_test_wurcs, arrays, dev_part[0], N_DEV, 11, require_contributor=False) + log("partitions: %s" % dict(parts)) + if len(tr_s) < 1000 or len(dv_s) < 1000: + fail("too few probe samples: train %d, development %d" % (len(tr_s), len(dv_s))) + log("samples: train %d, development %d (%.0fs)" % (len(tr_s), len(dv_s), time.time() - t0)) + + t0 = time.time() + tr = run_parent_samples(model, dev, w3, arrays, tr_s, "neutral", True) + log("train neutral forward done (%.0fs)" % (time.time() - t0)) + dv = run_parent_samples(model, dev, w3, arrays, dv_s, "neutral", True) + log("development neutral forward done") + Xtr = np.stack([r["h"] for r in tr]) + Xdv = np.stack([r["h"] for r in dv]) + tok_seen = sorted({s["true_id"] for s in tr_s}) + tok_idx = {t: k for k, t in enumerate(tok_seen)} + tr_mask = [k for k, s in enumerate(tr_s) if s["true_id"] in tok_idx] + dv_mask = [k for k, s in enumerate(dv_s) if s["true_id"] in tok_idx] + tok_probe, tok_f, tok_info, mu, sd = train_probe( + Xtr[tr_mask], np.array([tok_idx[tr_s[k]["true_id"]] for k in tr_mask]), + Xdv[dv_mask], np.array([tok_idx[dv_s[k]["true_id"]] for k in dv_mask]), len(tok_seen)) + manifest["linkage_readout"] = tok_info | {"tokens": len(tok_seen), "train_samples": len(tr_mask), + "development_samples": len(dv_mask), "feature_dim": int(Xtr.shape[1])} + torch.save({"state_dict": tok_probe.state_dict(), "token_ids": tok_seen, + "tokens": [w3["i2t"][t] for t in tok_seen], "feature_mean": mu, "feature_sd": sd, + "hidden": "input of %s" % lm_name, "linkage_input": "neutral mean of class rows 1-8", + "fit": manifest["linkage_readout"]}, OUT / "linkage_readout.pt") + log("linkage read-out fitted and saved: %s" % manifest["linkage_readout"]) + readout = {"lin": tok_probe, "f": tok_f, "ids_t": torch.as_tensor(tok_seen, dtype=torch.long)} + + final, results_store = {}, {} + for set_name, run, cfg, cases, excluded in built: + t0 = time.time() + res = evaluate(model, dev, w3, cases, cfg["threshold"], blank_side_channels=True, neutral=True, + readout=readout) + (OUT / set_name).mkdir(parents=True, exist_ok=True) + with _real_open(OUT / set_name / ("%s__final.jsonl" % run), "w") as fh: + for r in res: + fh.write(json.dumps(r) + "\n") + unseen = [r for r in res if r["wa3_partition"] != "pretraining_train"] + a = aggregate(res) + final["%s/%s" % (set_name, run)] = {"all_cases": a, "not_in_wa3_training": aggregate(unseen), + "cases_using_readout": sum(r["used_readout"] for r in res)} + results_store[(set_name, run)] = res + log("%s/%s FINAL: exact-span %.4f | first choice %.4f | top5 %.4f | filled %.4f | acc filled %.4f | " + "read-out cases %d (%.0fs)" % (set_name, run, a["iterative_exact_span_accuracy"], + a["initial_exact_span_accuracy_top1"], a["initial_exact_span_accuracy_top5"], + a["iterative_resolved_fraction"], a["iterative_accuracy_among_resolved"], + final["%s/%s" % (set_name, run)]["cases_using_readout"], time.time() - t0)) + ctx.__exit__(None, None, None) + del model + + BaselineStats.linkage_class = staticmethod(w3["exact_linkage"]) + stats, fit_counts = fit_baselines(w3, idx_rows, all_test_wurcs) + manifest["baseline_fit"] = fit_counts + base_rows = [] + for set_name, run, cfg, cases, excluded in built: + by_id = {r["case_id"]: r for r in results_store[(set_name, run)]} + for row in run_baselines(w3, stats, cases, set_data[set_name][1], by_id, None): + row = dict(row) + if row["method"] == "WA3_harness_inputs": + row["method"] = "BERTose_final_IAR" + base_rows.append({"set": set_name, "run": run, **row}) + with _real_open(OUT / "baselines_same_cases.csv", "w", newline="") as fh: + wr = csv.DictWriter(fh, fieldnames=list(base_rows[0].keys())) + wr.writeheader() + wr.writerows(base_rows) + for r in base_rows: + if r["subset"] == "all_cases": + log(" %s/%s %-22s n=%d exact-span %.4f" % (r["set"], r["run"], r["method"], r["n"], r["exact_span_accuracy"])) + write_json(OUT / "final_iar_summary.json", {"runs": final, "linkage_readout": manifest["linkage_readout"], + "neutral_unknown": manifest.get("hooks")}) + manifest["finished"] = time.strftime("%Y-%m-%dT%H:%M:%S") + manifest["script_sha256"] = sha256_file(Path(__file__)) + manifest["status"] = "COMPLETE" if not identity_failures else "PARTIAL_RUNS_SKIPPED" + write_json(OUT / "run_manifest.json", manifest) + log("DONE") + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/iar_completion/originals/wa3_final_iar_readout_all.py b/releases/2026-10-02/iar_completion/originals/wa3_final_iar_readout_all.py new file mode 100644 index 0000000000000000000000000000000000000000..cc32649d387168a5a236d7779bc45feb4fafb1b3 --- /dev/null +++ b/releases/2026-10-02/iar_completion/originals/wa3_final_iar_readout_all.py @@ -0,0 +1,1537 @@ +#!/usr/bin/env python3 +"""FINAL IAR WITH LINKAGE READ-OUT FITTED ON ALL TRAINING GLYCANS, child of wa3_final_iar_readout.py +(sha 5acafc45..., job 16602478), 2026-09-27. GPU. + +Only change: the read-out is fitted on ALL training parents (one masked ordinary single-token linkage each, +seed 7) instead of 24,000, and the stopping epoch is chosen on ALL development parents (one each, seed 11) +instead of 4,000. Method, features, optimiser and every evaluation setting are unchanged. +PRE-COMMITMENT (owner, 2026-09-26/27, before any result): this read-out REPLACES the 24,000-sample read-out +for the paper regardless of how it scores on the test sets; test sets are used once, for reporting only. + +Parent docstring follows. + +FINAL IAR WITH LINKAGE READ-OUT, child of wa3_linkage_probe.py (sha 0ebc6297..., job 16597594), 2026-09-26. + +Final completion numbers for the paper (Supplementary Fig. 4 and grey seal), all cases: + bench1392 residue (1,392) and linkage (1,362); seal162 residue and linkage (162 each). +Setting (identical to the probe study, now applied inside full IAR): + * designated masked-site inputs withheld (residue depth 202; linkage class -> neutral "ordinary, positions + unknown" embedding = training-frequency-weighted mean of class rows 1-8, via forward hook) + * answer space: residue slots = tokens seen as residue pieces in training; linkage slots = tokens seen in + ordinary (class 1-8) linkages in training; same answer space for the three baselines + * linkage read-out: linear layer on the input of `sequence_head`, refitted exactly as in the probe study + (24,000 training parents, seed 7; epoch chosen on 4,000 development parents, seed 11; encoder frozen), + used at masked single-token linkage positions; multi-token linkage units and residues use the MLM head + * IAR unchanged: threshold 0.80, up to 3 rounds, exact-span scoring with abstentions as errors +The fitted read-out is saved (outputs/linkage_readout.pt) with its token list and feature normalisation. + +Parent docstring follows. + +LINKAGE PROBE STUDY, child of wa3_linkage_diagnosis.py (sha 67949940..., job 16593043), 2026-09-25. + +Why is linkage completion weak? Frozen WA3, neutral-unknown linkage input, ordinary-linkage answer space. + 1. In-distribution check: development-partition parents (never trained on), one ordinary single-token linkage + masked per glycan, scored with the linkage class visible (true_class), set to 9 (class9) and neutral. + 2. Probe: hidden state entering the MLM vocabulary projection at the masked linkage, collected for training + parents (neutral input). Linear probes fitted on TRAINING parents only, epoch chosen on development: + * class probe -- 8 attachment-position classes (shared across letter pairs) + * token probe -- full ordinary linkage token + * guided -- MLM restricted to tokens of the class-probe's predicted class + scored on development, bench1392 and seal162 (single-token linkage cases, channels blanked, neutral). + 3. Strata on the benchmark (glycan size, acceptor-letter index) for MLM, probes and the three baselines. +Test glycans (exact or linkage-order-normalised identity) are excluded from every probe training/dev sample. + +Parent docstring follows. + +LINKAGE DIAGNOSIS, child of wa3_typed_strict_test.py (sha c6e9506d..., job 16592624), 2026-09-25. + +Linkage runs only (bench1392 linkage, seal162 linkage), channels blanked, ordinary-linkage answer space for all. +Two BERTose arms at masked linkage positions: + * class9 -- linkage class 9 (as the parent; reproduces it) + * neutral_unknown -- the linkage-class embedding at masked linkage positions is replaced (forward hook) by the + training-frequency-weighted mean of the ordinary class embeddings 1-8: "an ordinary + linkage, positions unknown", instead of 9, which in training marked only complex notation. +Saves each masked position's round-0 top-10, and writes linkage_diagnosis.json: per method (both arms, first +choice and IAR, three baselines) exact rate and error categories (right sugars/wrong positions, etc.), rank of +the truth in the top-10, and exact rates by attachment-position pair and by number of admissible positions. + +Parent docstring follows. + +STRICT typed-decoding DIAGNOSTIC, child of wa3_typed_test.py (sha 1341b005..., job 16591409), 2026-09-25. + +Question: is the controlled linkage failure a bug, or the class-9 input steering the model? In WA3 training a +masked token with linkage class 9 was always complex notation ('?' tokens are never MLM targets and simple +linkages always carry classes 1-8), so blanking to 9 asks for complex notation. Here linkage slots may only be +filled with tokens seen in ORDINARY linkages (class 1-8) in training, for BERTose and all baselines alike. +Residue slots are unchanged from the parent. truth_outside_answer_space reports any target this makes impossible. + +Parent docstring follows. + +TYPED-DECODING child of wa3_same_test.py (sha 0da5f247..., job 12847066), 2026-09-24. + +Only change: every method answers from the same, type-consistent answer space. + * BERTose: at a masked linkage piece (residue_id == -2) the softmax is taken only over tokens seen as + linkage pieces in WA3 training parents; at a masked residue piece (residue_id >= 0) only over tokens + seen as residue pieces. Specials, '?' ambiguity tokens and enumerated-alternative ('|') tokens are + excluded, because the test never scores them as correct (single_answer excludes '|' and '?'). + Probabilities are renormalised within the allowed set; threshold 0.80, 3 rounds, cases, inputs + (class 9 / depth 202 blanking) and metrics unchanged. + * Baselines: enumerated-alternative ('|') units are no longer prediction candidates, so all methods + choose from the same answer space. Their features/similarity are unchanged. +Runs: the four primary single-span runs only (bench1392 residue/linkage, seal162 residue/linkage at 0.80). + +Original docstring follows. + +WA3 rerun of the submitted held-out masking tests, on the SAME cases. + +Tests reproduced (both reported in the original submission): + * bench1392 -- 1,392 benchmark glycans (Supplementary Fig. 4; WA0 runs on Nova, 04-24) + * seal162 -- 162 paper-novel grey-seal milk glycans (Supplementary Fig. 5; WA0 runs 04-24/25) + +Same test, by construction: + 1. The untouched submitted harness (heldout_ipa_eval.py, sha 8d05a404...) rebuilds every WA0 case + with the submitted tokenizer, vocabulary, eligibility rule, seed 42 and mask plans. Every rebuilt + case must equal the WA0 run's own case_details.jsonl (case ids, masked positions, truth ids), + otherwise the job stops. + 2. Each masked WA0 span is mapped to its WURCS semantic unit(s). WA3 masks exactly those units. + 3. WA3 inputs are built exactly as WA3's training arrays were built: official WURCSArray helper + (Java) for branch structure + the frozen builder's repair + frozen 2,114-token BPE. A parity gate + rebuilds a sample of WA3 training parents and requires 100% agreement on all five channels. + 4. Filling, threshold, 3 rounds, top-k and every metric are identical to the harness. + +Reviewer 2 point 5 (irreducible uncertainty, simple baselines) is handled on the same cases: + * masked units that are curator-declared enumerations ('|') or unknown ('?') are flagged and + excluded from the single-answer score (reported separately, never silently dropped) + * each masked single linkage gets |A_chem| (chemically admissible acceptor positions; chance=1/k) + * marginal-frequency, context-frequency and nearest-neighbour baselines fitted on WA3's own + training parents (test glycans removed) are scored on the identical single-span cases + +Inference only on the frozen reported model (WA3, A1111, seed 42, epoch 58). No write-back. +""" +from __future__ import annotations + +import base64 +import builtins +import collections +import csv +import functools +import gzip +import hashlib +import importlib.util +import json +import os +import platform +import re +import shutil +import subprocess +import sys +import time +from pathlib import Path + +import numpy as np +import torch + +torch.set_num_threads(int(os.environ.get("NTHREADS", "16"))) +csv.field_size_limit(10 ** 9) + +PROJ = Path("/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training") +PKGD = PROJ / "data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" +WA0_HARNESS = PROJ / "writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py" +WA0_VOCAB = PROJ / "data/bpe_vocabulary_clean.json" +WA0_AMB = PROJ / "data/bpe_ambiguity_tokens.json" +WA0_CKPT_PATH = PROJ / "checkpoints_v5b_excluded/best_v5b_excluded_model.pt" # path only; never loaded +BENCH_DIR = PROJ / "writing/glycangt_heldout_ipa_validation" +SCHEMA_DIR = Path("/work/ratul1/supantha/glycan-SD-VS/review/iar_pipe_schema_20260823_r1") +JAVA_BIN = Path("/work/ratul1/supantha/miniconda3/envs/DeepGlycanSite/bin") +ROOT = Path("/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc") +TRAIN_MOD = ROOT / ("writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/" + "run_review_md_temporal_20x6_training_r3.py") +CK = ROOT / ("writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/" + "review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/" + "review_md20x6_checkpoint_best.pt") +CK_SHA = "8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82" + +WORK = Path(os.environ["WORK"]) +SCRIPT_SHA = hashlib.sha256(Path(__file__).read_bytes()).hexdigest() +OUT = WORK / "outputs" +JAVA_DIR = WORK / "inputs/java" + +EXPECTED_SHA = { + PKGD / "review_frozen_training_a5_wurcs_bpe.py": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4", + PKGD / "review_frozen_training_a5_topology.py": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7", + PKGD / "review_frozen_sequence_tree_runtime.py": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04", + PKGD / "review_bpe_vocabulary.json": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b", + PKGD / "review_bpe_ambiguity_tokens.json": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b", + PKGD / "review_sequence_parent_index.tsv.gz": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0", + PKGD / "review_token_ids.npy": "ec2d52dced65d22f0f218ff617d351fbd2930661bc8681e939990149d493537d", + PKGD / "review_residue_ids.npy": "36c96dcd3e03ba30e02e16f98d17605742627a37b37cd7824f2a745dd09dc044", + PKGD / "review_branch_depths.npy": "f39f76aa56a9bb782b2349f3ad1ca4ad16351ee1f06a8b9ae4b06bff9b1ebece", + PKGD / "review_linkage_types.npy": "89edb1940765928ced6f54e0d394f95c573eb9d96310b14dbd0adf8e20ac07c4", + PKGD / "review_attention_mask.npy": "01ed165720b9414e614dd7e7d75284a8886165f11138e16117ffcbe4e4bbf95c", + PKGD / "review_lengths.npy": "ade919d1e054c0ba852aa047bf873ac675f81a6c1f8a05cc73a0a2258131f021", + WA0_HARNESS: "8d05a4048e200625694ff9a36f50af89b845fd0d38ba8034a97a710e7ad3dce2", + WA0_VOCAB: "6a572afdf53f1494ab96c896876b824ca7ea749777352606aa9f96bf270ceecc", + WA0_AMB: "c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74", + JAVA_DIR / "review_A5WurcsArrayTreeAudit.java": "a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6", + JAVA_DIR / "review_wurcsframework-1.3.1.jar": "5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37", + JAVA_DIR / "review_MolWURCS.jar": "bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf", +} + +SEAL_RUNS = ["seal162_residue_t080", "seal162_linkage_t080"] +BENCH_RUNS = ["benchmark1392_residue_full", "benchmark1392_linkage_full"] +SETS = { + "bench1392": {"runs": BENCH_RUNS, "wa0_root": BENCH_DIR / "outputs", + "baseline_runs": ["benchmark1392_residue_full", "benchmark1392_linkage_full"]}, + "seal162": {"runs": SEAL_RUNS, "wa0_root": WORK / "inputs/wa0_seal", + "baseline_runs": ["seal162_residue_t080", "seal162_linkage_t080"]}, +} +ITERATIONS, TOP_K, MAX_LEN, BATCH = 3, 5, 256, 32 + +_real_open = builtins.open + + +def _guarded_open(f, *a, **k): + t = str(f) + if "locked_test" in t or "expert_audit_pool" in t: + raise SystemExit("FAIL-CLOSED: refused to open %s" % t) + return _real_open(f, *a, **k) + + +builtins.open = _guarded_open + + +def sha256_file(path: Path) -> str: + h = hashlib.sha256() + with _real_open(path, "rb") as fh: + for chunk in iter(lambda: fh.read(1 << 22), b""): + h.update(chunk) + return h.hexdigest() + + +def fail(msg: str): + raise SystemExit("FAIL-CLOSED: " + msg) + + +def log(msg: str) -> None: + print(time.strftime("%H:%M:%S"), msg, flush=True) + + +def write_json(path: Path, obj) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + tmp = path.with_suffix(path.suffix + ".tmp") + with _real_open(tmp, "w") as fh: + json.dump(obj, fh, indent=2) + tmp.replace(path) + + +# ============================================================== WA0: the submitted harness, untouched +def load_wa0_evaluator(): + spec = importlib.util.spec_from_file_location("heldout_ipa_eval_wa3_same_test", str(WA0_HARNESS)) + hie = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = hie + spec.loader.exec_module(hie) + + class _NoModelDistiller(hie.BPEIPADistiller): # same pattern as r2_05_baselines.py + def _load_model(self): + return torch.nn.Identity() + + hie.BPEIPADistiller = _NoModelDistiller + ev = hie.HeldoutIPAEvaluator(checkpoint=WA0_CKPT_PATH, vocab=WA0_VOCAB, ambiguity=WA0_AMB, device="cpu", + threshold=0.80, batch_size=32, top_k=TOP_K, max_length=MAX_LEN) + return hie, ev + + +def parse_wa0_summary(run_dir: Path) -> dict: + cfg = {} + for line in _real_open(run_dir / "summary.md"): + m = re.match(r"^- (\w+): `(.*)`\s*$", line.strip()) + if m and m.group(1) not in cfg: + cfg[m.group(1)] = m.group(2) + if "mask_plan" in cfg: + mask_plan = "" if cfg["mask_plan"] in ("", "single-span default") else cfg["mask_plan"] + else: # older summary.md files omit the line; the run's own case records carry it + with _real_open(run_dir / "case_details.jsonl") as fh: + mp = json.loads(fh.readline()).get("mask_plan", "") + mask_plan = mp if "," in mp or not re.fullmatch(r"(residue|linkage):1", mp or "") else "" + if int(cfg["iterations"]) != ITERATIONS or int(cfg["top_k"]) != TOP_K: + fail("%s used iterations=%s top_k=%s" % (run_dir.name, cfg["iterations"], cfg["top_k"])) + return {"threshold": float(cfg["threshold"]), "iterations": int(cfg["iterations"]), "top_k": int(cfg["top_k"]), + "selection_mode": cfg["selection_mode"], "max_cases_per_glycan": int(cfg["max_cases_per_glycan"]), + "span_types": [s.strip() for s in cfg["span_types"].split(",") if s.strip()], "mask_plan": mask_plan, + "input_csv": cfg.get("input_csv"), "checkpoint": cfg.get("checkpoint"), + "glycans_loaded": int(cfg["glycans_loaded"])} + + +def wa0_units(ev, wurcs): + """Mirror of HeldoutIPAEvaluator._tokenize_with_spans, adding the global non-special unit index.""" + tok = ev.tokenizer.tokenize(wurcs, max_length=ev.max_length) + unp = tok["tokens"][: tok["length"]] + recs, cur, g = [], 0, 0 + for u in ev.tokenizer.pre_tokenizer.pre_tokenize(wurcs): + pieces = [u["text"]] if u["type"] == "special" else list(ev.tokenizer.apply_bpe(u["text"])) + s, e = cur, cur + len(pieces) - 1 + cur += len(pieces) + if u["type"] == "special": + continue + gi = g + g += 1 + if e >= len(unp) or unp[s:e + 1] != pieces: + continue + recs.append({"start": s, "end": e, "unit_type": u["type"], "unit_text": u["text"], "g": gi}) + _, spans, _ = ev._tokenize_with_spans(wurcs) + if [(r["start"], r["end"], r["unit_type"], r["unit_text"]) for r in recs] != \ + [(sp.start, sp.end, sp.unit_type, sp.unit_text) for sp in spans]: + fail("WA0 unit geometry differs from the harness for %s" % wurcs[:80]) + return recs + + +def rebuild_wa0_cases(hie, ev, rows, run_dir: Path): + cfg = parse_wa0_summary(run_dir) + if cfg["glycans_loaded"] != len(rows): + fail("%s loaded %d glycans, input has %d" % (run_dir.name, cfg["glycans_loaded"], len(rows))) + mask_req = hie.parse_mask_plan(cfg["mask_plan"]) + span_types = sorted(set(cfg["span_types"]) | set(mask_req)) if mask_req else cfg["span_types"] + cases, _ = ev.build_cases(rows=rows, span_types=span_types, selection_mode=cfg["selection_mode"], + max_cases_per_glycan=cfg["max_cases_per_glycan"], seed=42, mask_requirements=mask_req) + reported = {} + with _real_open(run_dir / "case_details.jsonl") as fh: + for line in fh: + r = json.loads(line) + reported[r["case_id"]] = r + if {c.case_id for c in cases} != set(reported): + fail("%s: rebuilt %d cases vs reported %d (ids differ)" % (run_dir.name, len(cases), len(reported))) + out = [] + for c in cases: + rep = reported[c.case_id] + if list(rep["positions"]) != list(c.positions) or list(rep["truth_token_ids"]) != list(c.truth_token_ids): + fail("%s: case %s positions/truth differ from the reported run" % (run_dir.name, c.case_id)) + pos = set(c.positions) + chosen = [r for r in wa0_units(ev, c.wurcs) if all(p in pos for p in range(r["start"], r["end"] + 1))] + covered = {p for r in chosen for p in range(r["start"], r["end"] + 1)} + if covered != pos: + fail("%s: case %s masked positions do not decompose into whole units" % (run_dir.name, c.case_id)) + out.append({"case_id": c.case_id, "glycan_index": c.glycan_index, "wurcs": c.wurcs, "mask_plan": c.mask_plan, + "units": [{"g": r["g"], "unit_type": r["unit_type"], "unit_text": r["unit_text"]} for r in chosen], + "wa0_iterative_span_exact": bool(rep["iterative_span_exact"]), + "wa0_initial_span_exact_top1": bool(rep["initial_span_exact_top1"]), + "wa0_resolved_all": int(rep["resolved_count"]) == len(rep["positions"])}) + return cfg, out + + +# ============================================================== WA3: frozen tokenizer + official helper +def build_wa3_tokenizer(): + shim = WORK / "shim" + if shim.exists(): + shutil.rmtree(shim) + pkg = shim / "frozen_training" + pkg.mkdir(parents=True) + (pkg / "__init__.py").write_text("") + shutil.copy(PKGD / "review_frozen_training_a5_topology.py", pkg / "a5_topology.py") + shutil.copy(PKGD / "review_frozen_training_a5_wurcs_bpe.py", pkg / "a5_wurcs_bpe.py") + src = (PKGD / "review_frozen_sequence_tree_runtime.py").read_text() + src = (src.replace("from training.a5_topology import", "from frozen_training.a5_topology import") + .replace("from training.a5_wurcs_bpe import", "from frozen_training.a5_wurcs_bpe import")) + if src.count("from frozen_training.") != 2: + fail("tree-runtime import rewrite did not hit exactly two lines") + (shim / "frozen_tree_runtime.py").write_text(src) + sys.path.insert(0, str(PROJ)) + sys.path.insert(0, str(shim)) + import frozen_training.a5_wurcs_bpe as fab # noqa: E402 + import frozen_tree_runtime as ftr # noqa: E402 + for mod in (fab, ftr): + if not str(Path(mod.__file__).resolve()).startswith(str(shim.resolve())): + fail("frozen module resolved outside the shim: %s" % mod.__file__) + if int(ftr.BRANCH_DEPTH_UNKNOWN) != 202: + fail("BRANCH_DEPTH_UNKNOWN != 202") + tok = ftr.ReviewA5WURCSBPETokenizerV3(PKGD / "review_bpe_vocabulary.json") + tok.apply_bpe = functools.lru_cache(maxsize=None)(tok.apply_bpe) + semantic = fab.A5WURCSPreTokenizer() + vocab = json.load(_real_open(PKGD / "review_bpe_vocabulary.json")) + t2i = {k: int(v) for k, v in vocab["token_to_id"].items()} + if len(t2i) != 2114 or sorted(t2i.values()) != list(range(2114)): + fail("WA3 vocabulary is not 2,114 contiguous ids") + specials = {int(v) for v in vocab["special_tokens"].values()} + amb = json.load(_real_open(PKGD / "review_bpe_ambiguity_tokens.json")) + amb_map = {str(t): int(i) for t, i in amb["ambiguous_tokens"].items()} + if set(amb_map.values()) != {int(x) for x in amb["ambiguous_ids"]}: + fail("WA3 ambiguity map ids and token dict disagree") + if any(t2i.get(t) != i for t, i in amb_map.items()) or not all("?" in t for t in amb_map): + fail("WA3 ambiguity map disagrees with the vocabulary") + return {"tok": tok, "semantic": semantic, "exact_linkage": ftr.ReviewA5WURCSPreTokenizerV3.exact_linkage_type, + "t2i": t2i, "i2t": {v: k for k, v in t2i.items()}, "invalid": specials | set(amb_map.values()), + "n_specials": len(specials), "n_ambiguity": len(amb_map), "mask_id": t2i["[MASK]"], + "branch_open_id": t2i["[BRANCH_OPEN]"], "linkage_unknown": int(ftr.LINKAGE_UNKNOWN), + "branch_depth_unknown": int(ftr.BRANCH_DEPTH_UNKNOWN)} + + +def compile_java_helper(): + classes = WORK / "java_classes" + if classes.exists(): + shutil.rmtree(classes) + src = WORK / "java_src/review/a5/A5WurcsArrayTreeAudit.java" + src.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(JAVA_DIR / "review_A5WurcsArrayTreeAudit.java", src) + classes.mkdir(parents=True) + cp = os.pathsep.join([str(JAVA_DIR / "review_wurcsframework-1.3.1.jar"), str(JAVA_DIR / "review_MolWURCS.jar")]) + subprocess.run([str(JAVA_BIN / "javac"), "-cp", cp, "-d", str(classes), str(src)], check=True) + return os.pathsep.join([str(classes), cp]) + + +def run_java_helper(classpath, wurcs_list): + payload = "".join("%d\t%s\n" % (i, base64.urlsafe_b64encode(w.encode()).decode().rstrip("=")) + for i, w in enumerate(wurcs_list)) + res = subprocess.run([str(JAVA_BIN / "java"), "-cp", classpath, "review.a5.A5WurcsArrayTreeAudit"], + input=payload, text=True, capture_output=True, check=True) + lines = res.stdout.splitlines() + if len(lines) != len(wurcs_list): + fail("official helper returned %d lines for %d inputs" % (len(lines), len(wurcs_list))) + out = [] + for i, line in enumerate(lines): + f = line.split("\t") + if int(f[0]) != i: + fail("official helper row order drift at %d" % i) + if len(f) < 2 or f[1] == "ERROR": # frozen builder semantics for ERROR rows + out.append({"rooted": False, "depths": (), "parents": (), "helper_error": True}) + continue + if len(f) < 27: + fail("official helper output truncated at row %d" % i) + rooted = f[20] == "true" + n = int(f[2]) + dec = lambda v: base64.urlsafe_b64decode(v + "=" * ((4 - len(v) % 4) % 4)).decode() # noqa: E731 + depths = tuple(int(x) for x in dec(f[24]).split(",")) if rooted else () + parents = tuple(int(x) for x in dec(f[26]).split(",")) if rooted else () + if rooted and (len(depths) != n or len(parents) != n): + fail("official rooted cardinality drift at row %d" % i) + out.append({"rooted": rooted, "depths": depths, "parents": parents, "helper_error": False}) + return out + + +def wa3_encode(w3, wurcs, auth): + """Frozen builder transform (review_build_official_sequence_topology_successor.py) + unit spans.""" + units = [dict(u) for u in w3["semantic"].pre_tokenize(wurcs) if u.get("text") != "[BRANCH_OPEN]"] + child = collections.Counter(v for v in auth["parents"] if v >= 0) + seen, repaired = set(), [] + for u in units: + u.pop("distance_matrix", None) + rid = int(u.get("residue_id", -1)) + u["linkage_type"] = 0 + if rid >= 0: + depth = int(auth["depths"][rid]) if auth["rooted"] else 202 + u["branch_depth"] = depth + if rid not in seen: + repaired.extend({"text": "[BRANCH_OPEN]", "type": "special", "residue_id": -1, + "branch_depth": depth, "linkage_type": 0} + for _ in range(max(0, child[rid] - 1))) + seen.add(rid) + else: + u["branch_depth"] = 0 + if u.get("type") == "linkage": + u["linkage_type"] = w3["exact_linkage"](str(u["text"])) + repaired.append(u) + pieces, spans, g, ords = [], [], 0, collections.Counter() + for u in repaired: + ps = [str(u["text"])] if u["type"] == "special" else list(w3["tok"].apply_bpe(str(u["text"]))) + s = len(pieces) + pieces.extend((p, int(u["residue_id"]), int(u["branch_depth"]), int(u["linkage_type"])) for p in ps) + if u["type"] != "special": + spans.append({"g": g, "start": s, "end": len(pieces) - 1, "unit_type": u["type"], + "unit_text": str(u["text"]), "ordinal": ords[u["type"]]}) + ords[u["type"]] += 1 + g += 1 + full = len(pieces) + capped = pieces[:255] + [("[END]", -1, 0, 0)] if full > 256 else list(pieces) + L = len(capped) + unk, pad = w3["t2i"]["[UNK]"], w3["t2i"]["[PAD]"] + enc = {"token_ids": [w3["t2i"].get(p[0], unk) for p in capped] + [pad] * (256 - L), + "residue_ids": [p[1] for p in capped] + [-1] * (256 - L), + "branch_depths": [p[2] for p in capped] + [0] * (256 - L), + "linkage_types": [p[3] for p in capped] + [0] * (256 - L), + "attention_mask": [1] * L + [0] * (256 - L), "length": L, "full_length": full, + "tokens": [p[0] for p in capped]} + return enc, spans + + +def parity_gate(w3, classpath, idx_rows): + arrays = {k: np.load(PKGD / ("review_%s.npy" % k), mmap_mode="r") + for k in ("token_ids", "residue_ids", "branch_depths", "linkage_types", "attention_mask")} + sample = [i for i in range(0, len(idx_rows), 97) if idx_rows[i]["truncated_at_256"] != "True"] + auths = run_java_helper(classpath, [idx_rows[i]["canonical_wurcs"] for i in sample]) + counts, bad = collections.Counter(), [] + for i, auth in zip(sample, auths): + enc, _ = wa3_encode(w3, idx_rows[i]["canonical_wurcs"], auth) + ok_all = True + for k, arr in arrays.items(): + same = np.array_equal(np.asarray(enc[k], dtype=np.int64), np.asarray(arr[i], dtype=np.int64)) + counts[k] += int(same) + ok_all &= same + counts["all"] += int(ok_all) + counts["helper_error"] += int(auth["helper_error"]) + if not ok_all and len(bad) < 10: + bad.append(idx_rows[i]["parent_glycorpus_id"]) + res = {"rows": len(sample), "matches": dict(counts), "mismatch_parents": bad, + "rule": "every 97th sequence_row excluding truncated_at_256; official helper + frozen transform"} + res["status"] = "PASS" if counts["all"] == len(sample) else "FAIL" + return res + + +# ============================================================== exposure of test glycans to WA3 +def wurcs_sections(w): + body = w[6:] if w.startswith("WURCS=") else w + out, buf, depth = [], [], 0 + for ch in body: + depth += (ch == "[") - (ch == "]") + if ch == "/" and depth == 0: + out.append("".join(buf)) + buf = [] + else: + buf.append(ch) + out.append("".join(buf)) + return out + + +def lin_key(w): + s = wurcs_sections(w) + if len(s) < 5: + return w + return "WURCS=" + "/".join(s[:4] + ["_".join(sorted(x for x in "/".join(s[4:]).split("_") if x))]) + + +def exposure_lookup(idx_rows): + exact, keyed = collections.defaultdict(list), collections.defaultdict(list) + for r in idx_rows: + exact[r["canonical_wurcs"]].append(r) + keyed[lin_key(r["canonical_wurcs"])].append(r) + priority = ["pretraining_train", "pretraining_development", "excluded_exact_or_verified_graph_identity"] + + def look(w): + hits = {id(r): r for r in exact.get(w, []) + keyed.get(lin_key(w), [])}.values() + if not hits: + return {"wa3_partition": "absent_from_wa3_sequence_parents", "wa3_match_mode": "none", "wa3_parent_id": ""} + parts = {r["pretraining_partition"] for r in hits} + best = next((p for p in priority if p in parts), sorted(parts)[0]) + hit = next(r for r in hits if r["pretraining_partition"] == best) + mode = "exact" if hit["canonical_wurcs"] == w else "lin_order_insensitive" + return {"wa3_partition": best, "wa3_match_mode": mode, "wa3_parent_id": hit["parent_glycorpus_id"]} + return look + + +# ============================================================== A_chem (verbatim logic from iar_achem_q_20260824_r1/a.py) +def load_achem(): + sys.path.insert(0, str(SCHEMA_DIR)) + from pipelib import parse_record, SIDE_RE, node_index # noqa: E402 + from classify import PLAIN_LINK # noqa: E402 + no_oh = set("Amd") + + def a_chem(rec, ai, skip_li): + occ = set() + for ei, e in enumerate([x for x in rec["lin"].split("_") if x]): + if ei == skip_li: + continue + m = PLAIN_LINK.match(e) + if not m: + continue + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if sm and sm.group(2) != "?": + try: + if node_index(sm.group(1)) - 1 == ai: + occ.add(int(sm.group(2))) + except ValueError: + pass + sk = rec["skel"][ai] + if not sk: + return None, "no_skeleton" + n = len(sk) + if n < 3: + return None, "skeleton_lt_3" + if n > 12: + return None, "skeleton_gt_12" + free = set(range(1, n + 1)) + if rec["anom"][ai] is not None: + free.discard(rec["anom"][ai]) + rg = rec["ring"][ai] + if rg and rg[1] != "?": + try: + free.discard(int(rg[1])) + except ValueError: + pass + free -= set(rec["subs"][ai]) + for p, ch in enumerate(sk, 1): + if ch in no_oh: + free.discard(p) + return free - occ, "ok" + + def for_linkage(wurcs, entry): + rec = parse_record(wurcs) + if rec is None or not rec["lin"]: + return {"achem_status": "unparsable"} + ents = [x for x in rec["lin"].split("_") if x] + if ents.count(entry) != 1: + return {"achem_status": "entry_not_unique_in_lin"} + li = ents.index(entry) + m = PLAIN_LINK.match(entry) + if not m: + return {"achem_status": "not_plain_linkage"} + sides = [] + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if not sm or sm.group(2) == "?": + return {"achem_status": "side_unparsable"} + try: + sides.append((node_index(sm.group(1)) - 1, int(sm.group(2)))) + except ValueError: + return {"achem_status": "bad_label"} + donor_flags = [0 <= ai < rec["nres"] and rec["anom"][ai] is not None and rec["anom"][ai] == p for ai, p in sides] + if donor_flags.count(True) != 1: + return {"achem_status": "orientation_undetermined"} + ai, truth_pos = sides[donor_flags.index(False)] + A, why = a_chem(rec, ai, li) + if A is None: + return {"achem_status": why} + k = len(A) + return {"achem_status": "ok", "achem_k": k, "achem_positions": sorted(A), "truth_in_achem": truth_pos in A, + "achem_chance": (1.0 / k) if k else None} + return for_linkage + + +# ============================================================== WA3 cases, model, evaluation +def build_wa3_cases(w3, wa0_cases, encodings, look): + cases, excluded = [], collections.Counter() + for c in wa0_cases: + enc, spans = encodings[c["wurcs"]] + by_g = {s["g"]: s for s in spans} + positions, texts = [], [] + for u in c["units"]: + s = by_g.get(u["g"]) + if s is None or s["unit_text"] != u["unit_text"] or s["unit_type"] != u["unit_type"]: + fail("unit mapping mismatch for %s unit %s" % (c["case_id"], u)) + positions.extend(range(s["start"], s["end"] + 1)) + texts.append(u["unit_text"]) + if max(positions) >= enc["length"] - (1 if enc["full_length"] > 256 else 0): + excluded["wa3_truncated_beyond_256"] += 1 + continue + truth = [enc["token_ids"][p] for p in positions] + masked = list(enc["token_ids"]) + for p in positions: + masked[p] = w3["mask_id"] + flags = {"enumerated_alternative": any("|" in t for t in texts), + "unknown_question_mark": any("?" in t for t in texts), + "wa3_truth_uses_invalid_token": any(t in w3["invalid"] for t in truth)} + flags["single_answer"] = not any(flags.values()) + lt_blank, bd_blank = list(enc["linkage_types"]), list(enc["branch_depths"]) + # Blank the channels that encode the hidden unit, honouring WA3's own input contract + # (composite_r4.validate_sequence_surface:584-592): linkage pieces are exactly residue_id == -2 and + # must keep a nonzero linkage class; non-residue pieces must keep branch depth 0. + for p in positions: + if enc["residue_ids"][p] == -2: + lt_blank[p] = w3["linkage_unknown"] # 9 = the class WA3 already uses for '?' linkages + elif enc["residue_ids"][p] >= 0: + bd_blank[p] = w3["branch_depth_unknown"] # 202 = the depth WA3 uses when the tree is not rooted + cases.append({**{k: c[k] for k in ("case_id", "glycan_index", "wurcs", "mask_plan", "units", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")}, + "unit_text": " | ".join("%s:%s" % (u["unit_type"], u["unit_text"]) for u in c["units"]), + "positions": positions, "truth_ids": truth, "masked_ids": masked, + "attention_mask": enc["attention_mask"], "residue_ids": enc["residue_ids"], + "branch_depths": enc["branch_depths"], "linkage_types": enc["linkage_types"], + "branch_depths_blank": bd_blank, "linkage_types_blank": lt_blank, + **flags, **look(c["wurcs"])}) + return cases, dict(excluded) + + +def all_absent(B, dev): # contract from iar_bytype3_20260825_r1/bytype.py (job 12094273) + return {"ms_token_ids": torch.empty((0, 64), dtype=torch.long, device=dev), + "ms_attention_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), + "ms_input_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), "ms_labels": None, + "ms_acquisition_parent_indices": torch.empty((0,), dtype=torch.long, device=dev), + "ms_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), "ms_mode": "development", + "static_token_ids": torch.zeros((B, 1, 4), dtype=torch.long, device=dev), + "static_attention_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), + "static_residue_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_slot_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_state_mask": torch.zeros((B, 1), dtype=torch.bool, device=dev), + "static_state_ids": torch.full((B, 1), -1, dtype=torch.long, device=dev), + "static_input_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), "static_labels": None, + "static_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), + "md_values": torch.zeros((B, 2, 20, 6), dtype=torch.float32, device=dev), + "md_feature_mask": torch.zeros((B, 2, 20, 6), dtype=torch.bool, device=dev), + "md_child_present_mask": torch.zeros((B, 2), dtype=torch.bool, device=dev), + "md_state_row_ids": torch.full((B, 2), -1, dtype=torch.long, device=dev), + "md_window_input_mask": torch.zeros((B, 2, 20), dtype=torch.bool, device=dev), "md_labels": None, + "md_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev)} + + +def load_model(): + spec = importlib.util.spec_from_file_location("wa3_train_mod", str(TRAIN_MOD)) + tm = importlib.util.module_from_spec(spec) + sys.modules["wa3_train_mod"] = tm + spec.loader.exec_module(tm) + if sha256_file(CK) != CK_SHA: + fail("WA3 checkpoint sha mismatch") + ctx = tm.native_authority(None, static_active=False) + _native, r8, _static, _runner = ctx.__enter__() + r5 = r8._core._r6._r5 + if int(r5.SEQUENCE_VOCAB_SIZE) != 2114: + fail("r5.SEQUENCE_VOCAB_SIZE != 2114") + model = tm.mdcore.make_md_enabled_composite_class(r5)(r8.NativeEightConfig(cell_id="A111", seq_vocab_size=2114), + md_cell_id="A1111", md_temporal_size=128) + ck = torch.load(CK, map_location="cpu", weights_only=False) + if str(ck.get("md_cell_id")) != "A1111" or int(ck["selection"]["best_epoch"]) != 58: + fail("checkpoint identity is not A1111 / best epoch 58") + model.load_state_dict(ck["model_state"], strict=True) + n_par = sum(p.numel() for p in model.parameters()) + if n_par != 138487995 or len(model.state_dict()) != 505: + fail("WA3 inventory %d params / %d tensors" % (n_par, len(model.state_dict()))) + model.eval() + dev = "cuda" if torch.cuda.is_available() else "cpu" + model.to(dev) + return model, dev, ctx + + +def evaluate(model, dev, w3, cases, threshold, blank_side_channels=False, neutral=False, readout=None): + bd_key = "branch_depths_blank" if blank_side_channels else "branch_depths" + lt_key = "linkage_types_blank" if blank_side_channels else "linkage_types" + results = [] + for b0 in range(0, len(cases), BATCH): + batch = cases[b0:b0 + BATCH] + current = [list(c["masked_ids"]) for c in batch] + unresolved = [set(c["positions"]) for c in batch] + initial, accepted = [[] for _ in batch], [[] for _ in batch] + top10 = [[] for _ in batch] + used_readout = [False for _ in batch] + for it in range(ITERATIONS): + t = lambda key: torch.tensor([c[key] for c in batch], dtype=torch.long, device=dev) # noqa: E731 + HOOK["mask"] = None + if neutral: + m = torch.zeros((len(batch), len(batch[0]["masked_ids"])), dtype=torch.bool) + for ci, c in enumerate(batch): + for p in c["positions"]: + if c["residue_ids"][p] == -2: + m[ci, p] = True + HOOK["mask"] = m.to(dev) + with torch.inference_mode(): + o = model(seq_token_ids=torch.tensor(current, dtype=torch.long, device=dev), + seq_attention_mask=t("attention_mask").bool(), seq_residue_ids=t("residue_ids"), + seq_branch_depths=t(bd_key), seq_linkage_types=t(lt_key), + seq_labels=None, topology_labels=None, topology_available=None, + **all_absent(len(batch), torch.device(dev))) + HOOK["mask"] = None + logits = o.sequence_logits.float() + if w3["allowed_mask"]["linkage"].shape[0] != logits.shape[-1]: + fail("answer-space mask size %d != model vocabulary %d" + % (w3["allowed_mask"]["linkage"].shape[0], logits.shape[-1])) + progress = 0 + for ci, c in enumerate(batch): + if not unresolved[ci]: + continue + for li, pos in enumerate(c["positions"]): + rid = c["residue_ids"][pos] + if rid != -2 and rid < 0: + fail("masked position %d of %s is neither a residue nor a linkage piece" % (pos, c["case_id"])) + if readout is not None and rid == -2 and len(c["positions"]) == 1 and len(c["units"]) == 1: + hv = _gather_h(len(batch), logits.shape[1], ci, pos).float().cpu().numpy()[None, :] + pp = torch.softmax(readout["lin"](readout["f"](hv)), dim=-1)[0] + tpp, tii = torch.topk(pp, k=min(10, pp.shape[0])) + tp10, ti10 = tpp.to(logits.device), readout["ids_t"][tii].to(logits.device) + used_readout[ci] = True + else: + allow = w3["allowed_mask"]["linkage" if rid == -2 else "residue"] + row = logits[ci, pos].masked_fill(~allow, float("-inf")) + tp10, ti10 = torch.topk(torch.softmax(row, dim=-1), k=10) + tp, ti = tp10[:TOP_K], ti10[:TOP_K] + ids = [int(x) for x in ti.tolist()] + if it == 0: + top10[ci].append([[w3["i2t"][int(i)], round(float(p), 4)] + for p, i in zip(tp10.tolist(), ti10.tolist())]) + initial[ci].append((ids[0] == c["truth_ids"][li], c["truth_ids"][li] in ids)) + if pos not in unresolved[ci]: + continue + if float(tp[0]) < threshold or ids[0] in w3["invalid"]: + continue + current[ci][pos] = ids[0] + unresolved[ci].remove(pos) + progress += 1 + accepted[ci].append(it + 1) + if progress == 0: + break + for ci, c in enumerate(batch): + final = [current[ci][p] for p in c["positions"]] + correct = [f == t for f, t in zip(final, c["truth_ids"])] + results.append({k: c[k] for k in ("case_id", "glycan_index", "mask_plan", "unit_text", "single_answer", + "enumerated_alternative", "unknown_question_mark", + "wa3_truth_uses_invalid_token", "wa3_partition", "wa3_match_mode", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")} + | {"num_masked_positions": len(c["positions"]), + "truth_tokens": [w3["i2t"][x] for x in c["truth_ids"]], + "final_tokens": [w3["i2t"][x] for x in final], + "initial_top1_correct_count": sum(a for a, _ in initial[ci]), + "initial_top5_correct_count": sum(b for _, b in initial[ci]), + "resolved_count": len(c["positions"]) - len(unresolved[ci]), + "final_correct_count": sum(correct), + "initial_span_exact_top1": all(a for a, _ in initial[ci]), + "initial_span_exact_top5": all(b for _, b in initial[ci]), + "iterative_span_exact": all(correct), + "iterations_used": max(accepted[ci], default=0), + "initial_top10": top10[ci], "used_readout": used_readout[ci]}) + return results + + +def aggregate(rs): # identical formulas to HeldoutIPAEvaluator._aggregate_slice + n = len(rs) + if not n: + return {"num_cases": 0} + pos = sum(r["num_masked_positions"] for r in rs) + res = sum(r["resolved_count"] for r in rs) + cor = sum(r["final_correct_count"] for r in rs) + return {"num_cases": n, "num_masked_positions": pos, "avg_masked_positions_per_case": pos / n, + "initial_top1_token_accuracy": sum(r["initial_top1_correct_count"] for r in rs) / pos, + "initial_top5_token_accuracy": sum(r["initial_top5_correct_count"] for r in rs) / pos, + "initial_exact_span_accuracy_top1": sum(bool(r["initial_span_exact_top1"]) for r in rs) / n, + "initial_exact_span_accuracy_top5": sum(bool(r["initial_span_exact_top5"]) for r in rs) / n, + "iterative_resolved_fraction": res / pos, + "iterative_accuracy_among_resolved": (cor / res) if res else 0.0, + "iterative_final_token_accuracy": cor / pos, + "iterative_exact_span_accuracy": sum(bool(r["iterative_span_exact"]) for r in rs) / n, + "avg_iterations_used_per_case": sum(r["iterations_used"] for r in rs) / n} + + +def paired(rs): + n = len(rs) + if not n: + return {"n": 0} + a = [bool(r["wa0_iterative_span_exact"]) for r in rs] + b = [bool(r["iterative_span_exact"]) for r in rs] + return {"n": n, "wa0_exact_span": sum(a) / n, "wa3_exact_span": sum(b) / n, + "both": sum(x and y for x, y in zip(a, b)), "wa0_only": sum(x and not y for x, y in zip(a, b)), + "wa3_only": sum(y and not x for x, y in zip(a, b)), "neither": sum(not x and not y for x, y in zip(a, b))} + + +# ============================================================== R2-05 baselines (port of r2_05_baselines.py) +class BaselineStats: + def __init__(self): + self.marginal = collections.defaultdict(collections.Counter) + self.ctx_pair = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.ctx_prev = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.n_glycans = 0 + self.feature_ids, self._feats, self._donor = {}, [], collections.defaultdict(list) + self.text_ids, self.texts, self.donor_index = {}, [], {} + + def _tid(self, text): + if text not in self.text_ids: + self.text_ids[text] = len(self.texts) + self.texts.append(text) + return self.text_ids[text] + + def add(self, index, unpadded, records): + self.n_glycans += 1 + feats = set() + for r in records: + key = (r["unit_type"], r["unit_text"]) + feats.add(self.feature_ids.setdefault(key, len(self.feature_ids))) + if not r["eligible"] or "|" in r["unit_text"]: # typed child: same answer space as BERTose + continue + if r["unit_type"] == "linkage" and not 1 <= BaselineStats.linkage_class(r["unit_text"]) <= 8: + continue # strict child: ordinary linkages only, as for BERTose + ut, text = r["unit_type"], r["unit_text"] + self.marginal[ut][text] += 1 + prev_t = unpadded[r["start"] - 1] if r["start"] > 0 else "" + next_t = unpadded[r["end"] + 1] if r["end"] + 1 < len(unpadded) else "" + self.ctx_pair[ut][(prev_t, next_t)][text] += 1 + self.ctx_prev[ut][prev_t][text] += 1 + self._donor[(ut, r["ordinal"])].append((index, self._tid(text))) + self._feats.append(sorted(feats)) + + def finalize(self): + counts = np.zeros(len(self.feature_ids) + 1, dtype=np.int64) + for fs in self._feats: + for f in fs: + counts[f + 1] += 1 + self.indptr = np.cumsum(counts) + self.rows = np.zeros(int(self.indptr[-1]), dtype=np.int32) + fill = self.indptr[:-1].copy() + for gid, fs in enumerate(self._feats): + for f in fs: + self.rows[fill[f]] = gid + fill[f] += 1 + self.sizes = np.array([len(fs) for fs in self._feats], dtype=np.int64) + self._feats = [] + for key, pairs in self._donor.items(): + pairs.sort() + self.donor_index[key] = (np.array([p[0] for p in pairs], dtype=np.int64), + np.array([p[1] for p in pairs], dtype=np.int64)) + self._donor = {} + + @staticmethod + def _argmax(counter): + total = sum(counter.values()) + text = min(counter.items(), key=lambda kv: (-kv[1], kv[0]))[0] + return text, counter[text] / total + + def marginal_pred(self, ut): + return self._argmax(self.marginal[ut]) if self.marginal.get(ut) else (None, 0.0) + + def context_pred(self, ut, prev_t, next_t): + c = self.ctx_pair.get(ut, {}).get((prev_t, next_t)) + if c: + return self._argmax(c)[0], "prev_next" + c = self.ctx_prev.get(ut, {}).get(prev_t) + if c: + return self._argmax(c)[0], "prev_only" + return self.marginal_pred(ut)[0], "marginal_backoff" + + def nn_pred(self, ut, ordinal, query_keys): + donor = self.donor_index.get((ut, ordinal)) + if donor is None: + return None + cand_idx, cand_txt = donor + fids = [self.feature_ids[k] for k in query_keys if k in self.feature_ids] + if fids: + rows = np.concatenate([self.rows[self.indptr[f]:self.indptr[f + 1]] for f in fids]) + inter = np.bincount(rows, minlength=self.n_glycans)[cand_idx].astype(np.float64) + else: + inter = np.zeros(len(cand_idx)) + union = self.sizes[cand_idx] + len(query_keys) - inter + jac = np.divide(inter, union, out=np.zeros_like(inter), where=union > 0) + return self.texts[int(cand_txt[int(np.argmax(jac))])] + + +def fit_baselines(w3, idx_rows, test_wurcs): + token_ids = np.load(PKGD / "review_token_ids.npy", mmap_mode="r") + lengths = np.load(PKGD / "review_lengths.npy", mmap_mode="r") + stats, counts, bo, unk = BaselineStats(), collections.Counter(), w3["branch_open_id"], w3["t2i"]["[UNK]"] + test_keys = {lin_key(w) for w in test_wurcs} + for i, r in enumerate(idx_rows): + if r["pretraining_partition"] != "pretraining_train" or r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + counts["removed_test_glycan"] += 1 + continue + L = int(lengths[i]) + ids = [int(x) for x in token_ids[i, :L]] + p, recs, ords, ok = 0, [], collections.Counter(), True + for u in w3["semantic"].pre_tokenize(w): + if u.get("text") == "[BRANCH_OPEN]": + continue + while p < L and ids[p] == bo: + p += 1 + ps = [u["text"]] if u["type"] == "special" else list(w3["tok"].apply_bpe(u["text"])) + pid = [w3["t2i"].get(x, unk) for x in ps] + if ids[p:p + len(pid)] != pid: + ok = False + break + if u["type"] != "special": + recs.append({"start": p, "end": p + len(pid) - 1, "unit_type": u["type"], "unit_text": u["text"], + "ordinal": ords[u["type"]], "eligible": not any(x in w3["invalid"] for x in pid)}) + ords[u["type"]] += 1 + p += len(pid) + while ok and p < L and ids[p] == bo: + p += 1 + if not ok or p != L: + counts["unit_walk_mismatch"] += 1 + continue + stats.add(counts["fitted"], [w3["i2t"][x] for x in ids], recs) + counts["fitted"] += 1 + stats.finalize() + return stats, dict(counts) + + +def build_allowed(w3, idx_rows, test_wurcs): + """Type-consistent answer space: token ids seen at linkage / residue pieces in WA3 training parents.""" + token_ids = np.load(PKGD / "review_token_ids.npy", mmap_mode="r") + residue_ids = np.load(PKGD / "review_residue_ids.npy", mmap_mode="r") + linkage_types = np.load(PKGD / "review_linkage_types.npy", mmap_mode="r") + lengths = np.load(PKGD / "review_lengths.npy", mmap_mode="r") + test_keys = {lin_key(w) for w in test_wurcs} + V = len(w3["t2i"]) + seen = {"linkage": np.zeros(V, dtype=bool), "residue": np.zeros(V, dtype=bool)} + rows = 0 + class_counts = np.zeros(10, dtype=np.int64) + for i, r in enumerate(idx_rows): + if r["pretraining_partition"] != "pretraining_train" or r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + continue + L = int(lengths[i]) + ids, rid = np.asarray(token_ids[i, :L]), np.asarray(residue_ids[i, :L]) + lt = np.asarray(linkage_types[i, :L]) + class_counts += np.bincount(lt[rid == -2], minlength=10)[:10] + seen["linkage"][ids[(rid == -2) & (lt >= 1) & (lt <= 8)]] = True # strict: ordinary linkages only + seen["residue"][ids[rid >= 0]] = True + rows += 1 + bad = np.zeros(V, dtype=bool) + bad[sorted(w3["invalid"])] = True + pipe = [i for t, i in w3["t2i"].items() if "|" in t] + bad[pipe] = True + allowed = {k: v & ~bad for k, v in seen.items()} + info = {"training_rows_scanned": rows, "vocab": V, "invalid_excluded": len(w3["invalid"]), + "pipe_tokens_excluded": len(pipe), + "linkage_tokens_seen": int(seen["linkage"].sum()), "residue_tokens_seen": int(seen["residue"].sum()), + "linkage_tokens_allowed": int(allowed["linkage"].sum()), + "residue_tokens_allowed": int(allowed["residue"].sum()), + "linkage_class_counts": class_counts.tolist()} + return allowed, info + + +def truth_outside(w3, cases): + """Cases whose true token at some masked position lies outside the allowed answer space.""" + n = 0 + for c in cases: + for pos, t in zip(c["positions"], c["truth_ids"]): + kind = "linkage" if c["residue_ids"][pos] == -2 else "residue" + if not w3["allowed_np"][kind][t]: + n += 1 + break + return n + + +HOOK = {"mask": None, "vec": None} + + +def _linkage_hook(module, inputs, output): + m = HOOK["mask"] + if m is None: + return None + if output.dim() == 3 and tuple(output.shape[:2]) == tuple(m.shape): + idx = m + elif output.dim() == 2 and output.shape[0] == m.numel(): + idx = m.reshape(-1) + else: + fail("linkage embedding output %s does not match mask %s" % (tuple(output.shape), tuple(m.shape))) + out = output.clone() + out[idx] = HOOK["vec"].to(out.dtype) + return out + + +def find_linkage_embedding(model): + cands = [(n, m) for n, m in model.named_modules() if isinstance(m, torch.nn.Embedding) and m.num_embeddings == 10] + named = [(n, m) for n, m in cands if "linkage" in n.lower()] + if len(named) != 1: + fail("linkage embedding not unique: %s" % [n for n, _ in cands]) + return named[0] + + +def baseline_unit_preds(w3, stats, cases, encodings): + out = {} + for c in cases: + if len(c["units"]) != 1: + continue + enc, spans = encodings[c["wurcs"]] + s = {sp["g"]: sp for sp in spans}[c["units"][0]["g"]] + tokens = [w3["i2t"][x] for x in enc["token_ids"][:enc["length"]]] + prev_t = tokens[s["start"] - 1] if s["start"] > 0 else "" + next_t = tokens[s["end"] + 1] if s["end"] + 1 < len(tokens) else "" + query = {(sp["unit_type"], sp["unit_text"]) for sp in spans if sp["g"] != s["g"]} + out[c["case_id"]] = {"marginal_frequency": stats.marginal_pred(s["unit_type"])[0], + "context_frequency": stats.context_pred(s["unit_type"], prev_t, next_t)[0], + "nearest_neighbour": stats.nn_pred(s["unit_type"], s["ordinal"], query)} + return out + + +PAT_ORD = re.compile(r"^([A-Za-z]+)(\d+)-([A-Za-z]+)(\d+)$") + + +def _cat(truth, pred): + if pred is None: + return "no_answer" + if pred == truth: + return "exact" + t, p = PAT_ORD.match(truth), PAT_ORD.match(pred) + if t is None: + return "truth_not_ordinary" + if p is None: + return "non_ordinary_answer" + if (t.group(1), t.group(3)) == (p.group(1), p.group(3)): + return "right_sugars_wrong_positions" + if (t.group(2), t.group(4)) == (p.group(2), p.group(4)): + return "right_positions_wrong_sugars" + return "both_wrong" + + +def decompose(cases, arms, preds): + by_id = {a: {r["case_id"]: r for r in res} for a, res in arms.items()} + out = {} + for subset, sel in (("all_cases", cases), + ("not_in_wa3_training", [c for c in cases if c["wa3_partition"] != "pretraining_train"])): + rows = [] + for c in sel: + if len(c["positions"]) != 1 or len(c["units"]) != 1: + continue + truth = c["units"][0]["unit_text"] + m = {} + for a in arms: + r = by_id[a][c["case_id"]] + toks = [tk for tk, _ in r["initial_top10"][0]] + m["BERTose_%s_first_choice" % a] = toks[0] + m["BERTose_%s_IAR" % a] = r["final_tokens"][0] if r["resolved_count"] else None + m["_rank_%s" % a] = toks.index(truth) + 1 if truth in toks else 11 + m.update(preds.get(c["case_id"], {})) + t = PAT_ORD.match(truth) + rows.append({"truth": truth, "pair": "%s-%s" % (t.group(2), t.group(4)) if t else "non_ordinary", + "k": c.get("achem_k"), "m": m}) + methods = [k for k in (rows[0]["m"] if rows else {}) if not k.startswith("_")] + res = {"n_single_token_cases": len(rows), "methods": {}} + for meth in methods: + cats = collections.Counter(_cat(r["truth"], r["m"].get(meth)) for r in rows) + res["methods"][meth] = {"exact": round(cats["exact"] / len(rows), 4) if rows else 0.0, + "categories": dict(cats)} + for a in arms: + ranks = collections.Counter(r["m"]["_rank_%s" % a] for r in rows) + res["rank_of_truth_%s" % a] = {("%d" % k if k <= 10 else ">10"): v for k, v in sorted(ranks.items())} + strata = collections.defaultdict(list) + for r in rows: + strata["pair=" + r["pair"]].append(r) + k = r["k"] + strata["admissible_positions=" + ("unknown" if k is None else (str(k) if k < 4 else ">=4"))].append(r) + res["strata"] = {} + for name, rs in sorted(strata.items()): + res["strata"][name] = {"n": len(rs)} | { + meth: round(sum(_cat(r["truth"], r["m"].get(meth)) == "exact" for r in rs) / len(rs), 4) + for meth in methods} + out[subset] = res + return out + + +ORD_RE = re.compile(r"^[A-Za-z]+\d+-[A-Za-z]+\d+$") +CAP = {"h": None} +N_TRAIN, N_DEV, PROBE_BATCH = 10 ** 9, 10 ** 9, 64 +LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + + +def _cap_hook(module, inputs, output): + CAP["h"] = inputs[0].detach() + + +def find_lm_projection(model): + cands = [(n, m) for n, m in model.named_modules() if isinstance(m, torch.nn.Linear) and m.out_features == 2114] + if len(cands) > 1: + pref = [(n, m) for n, m in cands if any(k in n.lower() for k in ("seq", "mlm", "lm_", "sequence"))] + cands = pref if len(pref) == 1 else cands + if len(cands) != 1: + fail("LM projection not unique: %s" % [n for n, _ in cands]) + return cands[0] + + +def _gather_h(B, L, bi, pos): + H = CAP["h"] + if H.dim() == 3 and H.shape[0] == B and H.shape[1] == L: + return H[bi, pos] + if H.dim() == 2 and H.shape[0] == B * L: + return H.reshape(B, L, -1)[bi, pos] + fail("unexpected LM-projection input shape %s for batch %d x %d" % (tuple(H.shape), B, L)) + + +def _forward(model, dev, tok, am, rid, bd, lt, neutral_pos): + HOOK["mask"] = None + if neutral_pos is not None: + m = torch.zeros(tok.shape, dtype=torch.bool) + for bi, p in neutral_pos: + m[bi, p] = True + HOOK["mask"] = m.to(dev) + with torch.inference_mode(): + o = model(seq_token_ids=tok.to(dev), seq_attention_mask=am.bool().to(dev), seq_residue_ids=rid.to(dev), + seq_branch_depths=bd.to(dev), seq_linkage_types=lt.to(dev), + seq_labels=None, topology_labels=None, topology_available=None, + **all_absent(tok.shape[0], torch.device(dev))) + HOOK["mask"] = None + return o.sequence_logits.float() + + +def _score(w3, logits, B, L, bi, pos, want_h): + row = logits[bi, pos].masked_fill(~w3["allowed_mask"]["linkage"], float("-inf")) + pr = torch.softmax(row, dim=-1) + p1, i1 = pr.max(-1) + out = {"pred_id": int(i1), "pred_prob": float(p1), + "ord_probs": pr[w3["ord_ids_t"]].cpu().numpy().astype(np.float32)} + if want_h: + out["h"] = _gather_h(B, L, bi, pos).float().cpu().numpy() + return out + + +def sample_parents(w3, idx_rows, test_wurcs, arrays, want_partition, n, seed, require_contributor=True): + token_ids, residue_ids, _bd, linkage_types, _am, lengths = arrays + test_keys = {lin_key(w) for w in test_wurcs} + rng = np.random.default_rng(seed) + out = [] + for i in rng.permutation(len(idx_rows)): + r = idx_rows[int(i)] + if r["pretraining_partition"] != want_partition: + continue + if require_contributor and r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + continue + L = int(lengths[i]) + ids, rid, lt = (np.asarray(token_ids[i, :L]), np.asarray(residue_ids[i, :L]), np.asarray(linkage_types[i, :L])) + cand = np.flatnonzero((rid == -2) & (lt >= 1) & (lt <= 8) & w3["ord_full_np"][ids]) + if cand.size == 0: + continue + p = int(rng.choice(cand)) + out.append({"row": int(i), "pos": p, "true_id": int(ids[p]), "true_class": int(lt[p]), + "n_residues": int(len(set(int(x) for x in rid if x >= 0)))}) + if len(out) >= n: + break + return out + + +def run_parent_samples(model, dev, w3, arrays, samples, arm, want_h): + token_ids, residue_ids, branch_depths, linkage_types, attention_mask, _ = arrays + res = [] + for b0 in range(0, len(samples), PROBE_BATCH): + batch = samples[b0:b0 + PROBE_BATCH] + rows = [s["row"] for s in batch] + g = lambda a: torch.as_tensor(np.stack([np.asarray(a[r]) for r in rows]).astype(np.int64)) # noqa: E731 + tok, am, rid, bd, lt = g(token_ids), g(attention_mask), g(residue_ids), g(branch_depths), g(linkage_types) + for bi, s in enumerate(batch): + tok[bi, s["pos"]] = w3["mask_id"] + if arm != "true_class": + lt[bi, s["pos"]] = w3["linkage_unknown"] + B, L = tok.shape + logits = _forward(model, dev, tok, am, rid, bd, lt, + [(bi, s["pos"]) for bi, s in enumerate(batch)] if arm == "neutral" else None) + for bi, s in enumerate(batch): + res.append(_score(w3, logits, B, L, bi, s["pos"], want_h)) + return res + + +def run_harness_cases(model, dev, w3, cases, encodings): + res, meta = [], [] + sel = [c for c in cases if len(c["positions"]) == 1 and len(c["units"]) == 1] + for b0 in range(0, len(sel), PROBE_BATCH): + batch = sel[b0:b0 + PROBE_BATCH] + t = lambda key: torch.tensor([c[key] for c in batch], dtype=torch.long) # noqa: E731 + tok = torch.tensor([c["masked_ids"] for c in batch], dtype=torch.long) + B, L = tok.shape + logits = _forward(model, dev, tok, t("attention_mask"), t("residue_ids"), t("branch_depths_blank"), + t("linkage_types_blank"), [(bi, c["positions"][0]) for bi, c in enumerate(batch)]) + for bi, c in enumerate(batch): + res.append(_score(w3, logits, B, L, bi, c["positions"][0], True)) + spans = encodings[c["wurcs"]][1] + tt = c["units"][0]["unit_text"] + meta.append({"case_id": c["case_id"], "true_id": c["truth_ids"][0], "truth": tt, + "true_class": int(w3["exact_linkage"](tt)), + "n_residues": sum(1 for sp in spans if sp["unit_type"] == "residue"), + "wa3_partition": c["wa3_partition"]}) + return res, meta + + +def train_probe(Xtr, ytr, Xdv, ydv, n_out, seed=0): + mu, sd = Xtr.mean(0), Xtr.std(0) + 1e-6 + f = lambda X: torch.as_tensor((X - mu) / sd, dtype=torch.float32) # noqa: E731 + Xt, Xd, yt, yd = f(Xtr), f(Xdv), torch.as_tensor(ytr), torch.as_tensor(ydv) + torch.manual_seed(seed) + lin = torch.nn.Linear(Xt.shape[1], n_out) + opt = torch.optim.AdamW(lin.parameters(), lr=1e-3, weight_decay=1e-2) + best = (-1.0, None, -1) + for ep in range(60): + perm = torch.randperm(len(Xt)) + for b in range(0, len(Xt), 512): + idx = perm[b:b + 512] + loss = torch.nn.functional.cross_entropy(lin(Xt[idx]), yt[idx]) + opt.zero_grad() + loss.backward() + opt.step() + with torch.no_grad(): + acc = float((lin(Xd).argmax(-1) == yd).float().mean()) + if acc > best[0]: + best = (acc, {k: v.clone() for k, v in lin.state_dict().items()}, ep) + lin.load_state_dict(best[1]) + lin.eval() + for p in lin.parameters(): + p.requires_grad_(False) + return lin, f, {"dev_accuracy_for_selection": round(best[0], 4), "best_epoch": best[2]}, mu, sd + + +def score_prediction(truth_tokens, pred_tokens): + n = len(truth_tokens) + if pred_tokens is None: + ok, nc = False, 0 + else: + ok = list(pred_tokens) == list(truth_tokens) + nc = sum(a == b for a, b in zip(pred_tokens, truth_tokens)) if len(pred_tokens) == n else 0 + return {"num_masked_positions": n, "initial_top1_correct_count": nc, "initial_top5_correct_count": nc, + "resolved_count": n if pred_tokens is not None else 0, "final_correct_count": nc, + "initial_span_exact_top1": ok, "initial_span_exact_top5": ok, "iterative_span_exact": ok, + "iterations_used": 0} + + +def run_baselines(w3, stats, cases, encodings, results_by_id, results_blank_by_id=None): + method_rows = collections.defaultdict(list) + for c in cases: + if len(c["units"]) != 1: + continue + enc, spans = encodings[c["wurcs"]] + s = {sp["g"]: sp for sp in spans}[c["units"][0]["g"]] + tokens = [w3["i2t"][x] for x in enc["token_ids"][:enc["length"]]] + prev_t = tokens[s["start"] - 1] if s["start"] > 0 else "" + next_t = tokens[s["end"] + 1] if s["end"] + 1 < len(tokens) else "" + query = {(sp["unit_type"], sp["unit_text"]) for sp in spans if sp["g"] != s["g"]} + truth = [w3["i2t"][x] for x in c["truth_ids"]] + bpe = lambda t: None if t is None else list(w3["tok"].apply_bpe(t)) # noqa: E731 + preds = {"marginal_frequency": bpe(stats.marginal_pred(s["unit_type"])[0]), + "context_frequency": bpe(stats.context_pred(s["unit_type"], prev_t, next_t)[0]), + "nearest_neighbour": bpe(stats.nn_pred(s["unit_type"], s["ordinal"], query))} + flags = {k: c[k] for k in ("single_answer", "wa3_partition")} + for m, p in preds.items(): + method_rows[m].append({**score_prediction(truth, p), **flags}) + method_rows["WA3_harness_inputs"].append({**results_by_id[c["case_id"]]}) + if results_blank_by_id is not None: + method_rows["WA3_side_channels_blanked"].append({**results_blank_by_id[c["case_id"]]}) + wa0 = {"num_masked_positions": 1, "initial_top1_correct_count": 0, "initial_top5_correct_count": 0, + "resolved_count": 1, "final_correct_count": 0, "initial_span_exact_top1": c["wa0_initial_span_exact_top1"], + "initial_span_exact_top5": False, "iterative_span_exact": c["wa0_iterative_span_exact"], + "iterations_used": 0, **flags} + method_rows["WA0_submitted"].append(wa0) + table = [] + for m, rows in method_rows.items(): + for subset, sel in (("all_cases", rows), ("single_answer", [r for r in rows if r["single_answer"]]), + ("single_answer_not_in_wa3_training", + [r for r in rows if r["single_answer"] and r["wa3_partition"] != "pretraining_train"])): + a = aggregate(sel) + table.append({"method": m, "subset": subset, "n": a["num_cases"], + "exact_span_accuracy": round(a.get("iterative_exact_span_accuracy", 0.0), 4)}) + return table + + +# ============================================================== main +def summarize_run(results, cases_all, excluded, cfg, results_blank=None): + sa = [r for r in results if r["single_answer"]] + unseen = lambda rs: [r for r in rs if r["wa3_partition"] != "pretraining_train"] # noqa: E731 + out = {"wa0_config": cfg, "wa3_excluded": excluded, + "flags": {"cases": len(results), "single_answer": len(sa), + "enumerated_alternative": sum(r["enumerated_alternative"] for r in results), + "unknown_question_mark": sum(r["unknown_question_mark"] for r in results), + "wa3_truth_uses_invalid_token": sum(r["wa3_truth_uses_invalid_token"] for r in results)}, + "exposure": dict(collections.Counter(r["wa3_partition"] for r in results)), + "wa3_all_cases": aggregate(results), "wa3_single_answer": aggregate(sa), + "wa3_single_answer_not_in_wa3_training": aggregate(unseen(sa)), + "paired_wa0_vs_wa3_all_cases": paired(results), "paired_wa0_vs_wa3_single_answer": paired(sa)} + if results_blank is not None: + sb = [r for r in results_blank if r["single_answer"]] + out["wa3_side_channels_blanked_all_cases"] = aggregate(results_blank) + out["wa3_side_channels_blanked_single_answer"] = aggregate(sb) + out["wa3_side_channels_blanked_single_answer_not_in_wa3_training"] = aggregate(unseen(sb)) + ach = [c for c in cases_all if "achem_status" in c] + if ach: + by_id = {r["case_id"]: r for r in results} + strata = collections.defaultdict(list) + status = collections.Counter(c["achem_status"] for c in ach) + for c in ach: + if c["achem_status"] != "ok" or not by_id[c["case_id"]]["single_answer"]: + continue + k = c["achem_k"] + strata["k=0" if k == 0 else ("k=1" if k == 1 else ("k=2" if k == 2 else ("k=3" if k == 3 else "k>=4")))].append(c) + out["achem"] = {"status": dict(status), "strata": {}} + for name, cs in sorted(strata.items()): + rs = [by_id[c["case_id"]] for c in cs] + row = {"n": len(cs), "mean_chance": float(np.mean([c["achem_chance"] or 0 for c in cs])), + "truth_in_achem": sum(c["truth_in_achem"] for c in cs), + "wa3_exact_span_harness_inputs": aggregate(rs)["iterative_exact_span_accuracy"], + "wa0_exact_span_harness_inputs": sum(c["wa0_iterative_span_exact"] for c in cs) / len(cs)} + if results_blank is not None: + bb = {r["case_id"]: r for r in results_blank} + row["wa3_exact_span_side_channels_blanked"] = aggregate([bb[c["case_id"]] for c in cs])["iterative_exact_span_accuracy"] + out["achem"]["strata"][name] = row + return out + + +def main(): + OUT.mkdir(parents=True, exist_ok=True) + manifest = {"schema": "bertose_wa3_final_iar_readout_alltrain_v1", + "parent_script": "wa3_same_test.py sha256 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 (job 12847066)", + "decoding": "type-consistent answer space (see docstring); renormalised softmax; threshold 0.80; 3 rounds", + "started": time.strftime("%Y-%m-%dT%H:%M:%S"), + "slurm_job_id": os.environ.get("SLURM_JOB_ID"), "host": platform.node(), "python": sys.version.split()[0], + "torch": torch.__version__, "threads": torch.get_num_threads(), + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back"} + for path, expect in EXPECTED_SHA.items(): + got = sha256_file(path) + if got != expect: + fail("%s sha %s != %s" % (path, got, expect)) + log("all %d pinned file hashes match" % len(EXPECTED_SHA)) + + hie, ev0 = load_wa0_evaluator() + w3 = build_wa3_tokenizer() + manifest["wa3_invalid_prediction_set"] = {"specials": w3["n_specials"], "ambiguity_tokens": w3["n_ambiguity"]} + java_cp = compile_java_helper() + with gzip.open(PKGD / "review_sequence_parent_index.tsv.gz", "rt", newline="") as fh: + idx_rows = list(csv.DictReader(fh, delimiter="\t")) + if len(idx_rows) != 281208: + fail("parent index row count %d" % len(idx_rows)) + + parity = parity_gate(w3, java_cp, idx_rows) + write_json(OUT / "gate_wa3_input_parity.json", parity) + log("WA3 input parity: %s %s/%d" % (parity["status"], parity["matches"].get("all", 0), parity["rows"])) + if parity["status"] != "PASS": + fail("WA3 inputs do not reproduce the training arrays; see gate_wa3_input_parity.json") + + look = exposure_lookup(idx_rows) + achem = load_achem() + set_data, all_test_wurcs = {}, set() + for set_name, spec in SETS.items(): + first_cfg = parse_wa0_summary(spec["wa0_root"] / spec["runs"][0]) + csv_path = Path(first_cfg["input_csv"]) if set_name == "bench1392" else WORK / "inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv" + rows = hie.load_rows(input_csv=csv_path, limit=first_cfg["glycans_loaded"], shuffle=False, seed=42) + manifest.setdefault("inputs", {})[set_name] = {"csv": str(csv_path), "sha256": sha256_file(csv_path), "rows": len(rows)} + uniq = sorted({r["wurcs"] for r in rows}) + auths = run_java_helper(java_cp, uniq) + encodings = {w: wa3_encode(w3, w, a) for w, a in zip(uniq, auths)} + manifest["inputs"][set_name]["helper_errors"] = sum(a["helper_error"] for a in auths) + manifest["inputs"][set_name]["exposure_glycans"] = dict(collections.Counter(look(w)["wa3_partition"] for w in uniq)) + set_data[set_name] = (rows, encodings) + all_test_wurcs.update(uniq) + log("%s: %d glycans; WA3 exposure %s" % (set_name, len(uniq), manifest["inputs"][set_name]["exposure_glycans"])) + + w3["allowed_np"], manifest["answer_space"] = build_allowed(w3, idx_rows, all_test_wurcs) + log("answer space: %s" % manifest["answer_space"]) + + built, identity_failures = [], [] + for set_name, spec in SETS.items(): + rows, encodings = set_data[set_name] + for run in spec["runs"]: + try: + cfg, wa0_cases = rebuild_wa0_cases(hie, ev0, rows, spec["wa0_root"] / run) + except (SystemExit, OSError, KeyError, ValueError) as exc: + identity_failures.append({"set": set_name, "run": run, "reason": str(exc)}) + log("%s/%s: SKIPPED, not the same test: %s" % (set_name, run, exc)) + continue + cases, excluded = build_wa3_cases(w3, wa0_cases, encodings, look) + for c in cases: + if len(c["units"]) == 1 and c["units"][0]["unit_type"] == "linkage": + c.update(achem(c["wurcs"], c["units"][0]["unit_text"])) + manifest["inputs"][set_name].setdefault("wa0_checkpoints", {})[run] = cfg["checkpoint"] + manifest.setdefault("truth_outside_answer_space", {})["%s/%s" % (set_name, run)] = truth_outside(w3, cases) + built.append((set_name, run, cfg, cases, excluded)) + log("%s/%s: WA0 cases rebuilt and verified (%d); WA3 cases %d; excluded %s" + % (set_name, run, len(wa0_cases), len(cases), excluded)) + write_json(OUT / "gate_case_identity.json", {"status": "PASS" if not identity_failures else "PARTIAL", + "verified_runs": [(s, r, len(c)) for s, r, _, c, _ in built], + "skipped_runs": identity_failures}) + manifest["case_identity_skipped_runs"] = identity_failures + if not built: + fail("no run could be reproduced as the same test") + + model, dev, ctx = load_model() + w3["allowed_mask"] = {k: torch.as_tensor(v, dtype=torch.bool, device=dev) for k, v in w3["allowed_np"].items()} + manifest["device"] = dev + log("WA3 loaded strict 505/505 on %s" % dev) + + counts = np.array(manifest["answer_space"]["linkage_class_counts"], dtype=np.float64) + wts = counts[1:9] / counts[1:9].sum() + lk_name, lk_mod = find_linkage_embedding(model) + with torch.no_grad(): + w = torch.as_tensor(wts, dtype=torch.float32, device=lk_mod.weight.device) + HOOK["vec"] = (lk_mod.weight[1:9].detach().float() * w[:, None]).sum(0) + lk_mod.register_forward_hook(_linkage_hook) + lm_name, lm_mod = find_lm_projection(model) + lm_mod.register_forward_hook(_cap_hook) + manifest["hooks"] = {"neutral_linkage_embedding": lk_name, "hidden_capture_input_of": lm_name} + log("hooks: neutral on %s, hidden = input of %s" % (lk_name, lm_name)) + + V = len(w3["t2i"]) + ord_full = np.zeros(V, dtype=bool) + ord_class = np.zeros(V, dtype=np.int64) + for tkn, i in w3["t2i"].items(): + if ORD_RE.match(tkn): + ord_full[i] = True + ord_class[i] = int(w3["exact_linkage"](tkn)) + ord_full &= w3["allowed_np"]["linkage"] + w3["ord_full_np"] = ord_full + ORD_IDS = np.flatnonzero(ord_full) + w3["ord_ids_t"] = torch.as_tensor(ORD_IDS, dtype=torch.long, device=dev) + ord_pos = {int(i): k for k, i in enumerate(ORD_IDS)} + manifest["ordinary_single_token_linkages"] = int(ord_full.sum()) + + arrays = tuple(np.load(PKGD / f, mmap_mode="r") for f in + ("review_token_ids.npy", "review_residue_ids.npy", "review_branch_depths.npy", + "review_linkage_types.npy", "review_attention_mask.npy", "review_lengths.npy")) + if arrays[0].shape[1] != MAX_LEN: + fail("training arrays width %d != %d" % (arrays[0].shape[1], MAX_LEN)) + parts = collections.Counter(r["pretraining_partition"] for r in idx_rows) + manifest["partitions"] = dict(parts) + dev_part = [p for p in parts if "develop" in p] + if len(dev_part) != 1: + fail("development partition label not unique: %s" % dict(parts)) + t0 = time.time() + tr_s = sample_parents(w3, idx_rows, all_test_wurcs, arrays, "pretraining_train", N_TRAIN, 7) + dv_s = sample_parents(w3, idx_rows, all_test_wurcs, arrays, dev_part[0], N_DEV, 11, require_contributor=False) + log("partitions: %s" % dict(parts)) + if len(tr_s) < 1000 or len(dv_s) < 1000: + fail("too few probe samples: train %d, development %d" % (len(tr_s), len(dv_s))) + log("samples: train %d, development %d (%.0fs)" % (len(tr_s), len(dv_s), time.time() - t0)) + + t0 = time.time() + tr = run_parent_samples(model, dev, w3, arrays, tr_s, "neutral", True) + log("train neutral forward done (%.0fs)" % (time.time() - t0)) + dv = run_parent_samples(model, dev, w3, arrays, dv_s, "neutral", True) + log("development neutral forward done") + Xtr = np.stack([r["h"] for r in tr]) + Xdv = np.stack([r["h"] for r in dv]) + tok_seen = sorted({s["true_id"] for s in tr_s}) + tok_idx = {t: k for k, t in enumerate(tok_seen)} + tr_mask = [k for k, s in enumerate(tr_s) if s["true_id"] in tok_idx] + dv_mask = [k for k, s in enumerate(dv_s) if s["true_id"] in tok_idx] + tok_probe, tok_f, tok_info, mu, sd = train_probe( + Xtr[tr_mask], np.array([tok_idx[tr_s[k]["true_id"]] for k in tr_mask]), + Xdv[dv_mask], np.array([tok_idx[dv_s[k]["true_id"]] for k in dv_mask]), len(tok_seen)) + manifest["linkage_readout"] = tok_info | {"tokens": len(tok_seen), "train_samples": len(tr_mask), + "development_samples": len(dv_mask), "feature_dim": int(Xtr.shape[1])} + torch.save({"state_dict": tok_probe.state_dict(), "token_ids": tok_seen, + "tokens": [w3["i2t"][t] for t in tok_seen], "feature_mean": mu, "feature_sd": sd, + "hidden": "input of %s" % lm_name, "linkage_input": "neutral mean of class rows 1-8", + "fit": manifest["linkage_readout"]}, OUT / "linkage_readout.pt") + log("linkage read-out fitted and saved: %s" % manifest["linkage_readout"]) + readout = {"lin": tok_probe, "f": tok_f, "ids_t": torch.as_tensor(tok_seen, dtype=torch.long)} + + final, results_store = {}, {} + for set_name, run, cfg, cases, excluded in built: + t0 = time.time() + res = evaluate(model, dev, w3, cases, cfg["threshold"], blank_side_channels=True, neutral=True, + readout=readout) + (OUT / set_name).mkdir(parents=True, exist_ok=True) + with _real_open(OUT / set_name / ("%s__final.jsonl" % run), "w") as fh: + for r in res: + fh.write(json.dumps(r) + "\n") + unseen = [r for r in res if r["wa3_partition"] != "pretraining_train"] + a = aggregate(res) + final["%s/%s" % (set_name, run)] = {"all_cases": a, "not_in_wa3_training": aggregate(unseen), + "cases_using_readout": sum(r["used_readout"] for r in res)} + results_store[(set_name, run)] = res + log("%s/%s FINAL: exact-span %.4f | first choice %.4f | top5 %.4f | filled %.4f | acc filled %.4f | " + "read-out cases %d (%.0fs)" % (set_name, run, a["iterative_exact_span_accuracy"], + a["initial_exact_span_accuracy_top1"], a["initial_exact_span_accuracy_top5"], + a["iterative_resolved_fraction"], a["iterative_accuracy_among_resolved"], + final["%s/%s" % (set_name, run)]["cases_using_readout"], time.time() - t0)) + ctx.__exit__(None, None, None) + del model + + BaselineStats.linkage_class = staticmethod(w3["exact_linkage"]) + stats, fit_counts = fit_baselines(w3, idx_rows, all_test_wurcs) + manifest["baseline_fit"] = fit_counts + base_rows = [] + for set_name, run, cfg, cases, excluded in built: + by_id = {r["case_id"]: r for r in results_store[(set_name, run)]} + for row in run_baselines(w3, stats, cases, set_data[set_name][1], by_id, None): + row = dict(row) + if row["method"] == "WA3_harness_inputs": + row["method"] = "BERTose_final_IAR" + base_rows.append({"set": set_name, "run": run, **row}) + with _real_open(OUT / "baselines_same_cases.csv", "w", newline="") as fh: + wr = csv.DictWriter(fh, fieldnames=list(base_rows[0].keys())) + wr.writeheader() + wr.writerows(base_rows) + for r in base_rows: + if r["subset"] == "all_cases": + log(" %s/%s %-22s n=%d exact-span %.4f" % (r["set"], r["run"], r["method"], r["n"], r["exact_span_accuracy"])) + write_json(OUT / "final_iar_summary.json", {"runs": final, "linkage_readout": manifest["linkage_readout"], + "neutral_unknown": manifest.get("hooks")}) + manifest["finished"] = time.strftime("%Y-%m-%dT%H:%M:%S") + manifest["script_sha256"] = sha256_file(Path(__file__)) + manifest["status"] = "COMPLETE" if not identity_failures else "PARTIAL_RUNS_SKIPPED" + write_json(OUT / "run_manifest.json", manifest) + log("DONE") + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/iar_completion/originals/wa3_linkage_diagnosis.py b/releases/2026-10-02/iar_completion/originals/wa3_linkage_diagnosis.py new file mode 100644 index 0000000000000000000000000000000000000000..221f520b56463444c108e6c887aca3a85c90c346 --- /dev/null +++ b/releases/2026-10-02/iar_completion/originals/wa3_linkage_diagnosis.py @@ -0,0 +1,1267 @@ +#!/usr/bin/env python3 +"""LINKAGE DIAGNOSIS, child of wa3_typed_strict_test.py (sha c6e9506d..., job 16592624), 2026-09-25. + +Linkage runs only (bench1392 linkage, seal162 linkage), channels blanked, ordinary-linkage answer space for all. +Two BERTose arms at masked linkage positions: + * class9 -- linkage class 9 (as the parent; reproduces it) + * neutral_unknown -- the linkage-class embedding at masked linkage positions is replaced (forward hook) by the + training-frequency-weighted mean of the ordinary class embeddings 1-8: "an ordinary + linkage, positions unknown", instead of 9, which in training marked only complex notation. +Saves each masked position's round-0 top-10, and writes linkage_diagnosis.json: per method (both arms, first +choice and IAR, three baselines) exact rate and error categories (right sugars/wrong positions, etc.), rank of +the truth in the top-10, and exact rates by attachment-position pair and by number of admissible positions. + +Parent docstring follows. + +STRICT typed-decoding DIAGNOSTIC, child of wa3_typed_test.py (sha 1341b005..., job 16591409), 2026-09-25. + +Question: is the controlled linkage failure a bug, or the class-9 input steering the model? In WA3 training a +masked token with linkage class 9 was always complex notation ('?' tokens are never MLM targets and simple +linkages always carry classes 1-8), so blanking to 9 asks for complex notation. Here linkage slots may only be +filled with tokens seen in ORDINARY linkages (class 1-8) in training, for BERTose and all baselines alike. +Residue slots are unchanged from the parent. truth_outside_answer_space reports any target this makes impossible. + +Parent docstring follows. + +TYPED-DECODING child of wa3_same_test.py (sha 0da5f247..., job 12847066), 2026-09-24. + +Only change: every method answers from the same, type-consistent answer space. + * BERTose: at a masked linkage piece (residue_id == -2) the softmax is taken only over tokens seen as + linkage pieces in WA3 training parents; at a masked residue piece (residue_id >= 0) only over tokens + seen as residue pieces. Specials, '?' ambiguity tokens and enumerated-alternative ('|') tokens are + excluded, because the test never scores them as correct (single_answer excludes '|' and '?'). + Probabilities are renormalised within the allowed set; threshold 0.80, 3 rounds, cases, inputs + (class 9 / depth 202 blanking) and metrics unchanged. + * Baselines: enumerated-alternative ('|') units are no longer prediction candidates, so all methods + choose from the same answer space. Their features/similarity are unchanged. +Runs: the four primary single-span runs only (bench1392 residue/linkage, seal162 residue/linkage at 0.80). + +Original docstring follows. + +WA3 rerun of the submitted held-out masking tests, on the SAME cases. + +Tests reproduced (both reported in the original submission): + * bench1392 -- 1,392 benchmark glycans (Supplementary Fig. 4; WA0 runs on Nova, 04-24) + * seal162 -- 162 paper-novel grey-seal milk glycans (Supplementary Fig. 5; WA0 runs 04-24/25) + +Same test, by construction: + 1. The untouched submitted harness (heldout_ipa_eval.py, sha 8d05a404...) rebuilds every WA0 case + with the submitted tokenizer, vocabulary, eligibility rule, seed 42 and mask plans. Every rebuilt + case must equal the WA0 run's own case_details.jsonl (case ids, masked positions, truth ids), + otherwise the job stops. + 2. Each masked WA0 span is mapped to its WURCS semantic unit(s). WA3 masks exactly those units. + 3. WA3 inputs are built exactly as WA3's training arrays were built: official WURCSArray helper + (Java) for branch structure + the frozen builder's repair + frozen 2,114-token BPE. A parity gate + rebuilds a sample of WA3 training parents and requires 100% agreement on all five channels. + 4. Filling, threshold, 3 rounds, top-k and every metric are identical to the harness. + +Reviewer 2 point 5 (irreducible uncertainty, simple baselines) is handled on the same cases: + * masked units that are curator-declared enumerations ('|') or unknown ('?') are flagged and + excluded from the single-answer score (reported separately, never silently dropped) + * each masked single linkage gets |A_chem| (chemically admissible acceptor positions; chance=1/k) + * marginal-frequency, context-frequency and nearest-neighbour baselines fitted on WA3's own + training parents (test glycans removed) are scored on the identical single-span cases + +Inference only on the frozen reported model (WA3, A1111, seed 42, epoch 58). No write-back. +""" +from __future__ import annotations + +import base64 +import builtins +import collections +import csv +import functools +import gzip +import hashlib +import importlib.util +import json +import os +import platform +import re +import shutil +import subprocess +import sys +import time +from pathlib import Path + +import numpy as np +import torch + +torch.set_num_threads(int(os.environ.get("NTHREADS", "16"))) +csv.field_size_limit(10 ** 9) + +PROJ = Path("/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training") +PKGD = PROJ / "data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" +WA0_HARNESS = PROJ / "writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py" +WA0_VOCAB = PROJ / "data/bpe_vocabulary_clean.json" +WA0_AMB = PROJ / "data/bpe_ambiguity_tokens.json" +WA0_CKPT_PATH = PROJ / "checkpoints_v5b_excluded/best_v5b_excluded_model.pt" # path only; never loaded +BENCH_DIR = PROJ / "writing/glycangt_heldout_ipa_validation" +SCHEMA_DIR = Path("/work/ratul1/supantha/glycan-SD-VS/review/iar_pipe_schema_20260823_r1") +JAVA_BIN = Path("/work/ratul1/supantha/miniconda3/envs/DeepGlycanSite/bin") +ROOT = Path("/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc") +TRAIN_MOD = ROOT / ("writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/" + "run_review_md_temporal_20x6_training_r3.py") +CK = ROOT / ("writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/" + "review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/" + "review_md20x6_checkpoint_best.pt") +CK_SHA = "8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82" + +WORK = Path(os.environ["WORK"]) +SCRIPT_SHA = hashlib.sha256(Path(__file__).read_bytes()).hexdigest() +OUT = WORK / "outputs" +JAVA_DIR = WORK / "inputs/java" + +EXPECTED_SHA = { + PKGD / "review_frozen_training_a5_wurcs_bpe.py": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4", + PKGD / "review_frozen_training_a5_topology.py": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7", + PKGD / "review_frozen_sequence_tree_runtime.py": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04", + PKGD / "review_bpe_vocabulary.json": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b", + PKGD / "review_bpe_ambiguity_tokens.json": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b", + PKGD / "review_sequence_parent_index.tsv.gz": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0", + PKGD / "review_token_ids.npy": "ec2d52dced65d22f0f218ff617d351fbd2930661bc8681e939990149d493537d", + PKGD / "review_residue_ids.npy": "36c96dcd3e03ba30e02e16f98d17605742627a37b37cd7824f2a745dd09dc044", + PKGD / "review_branch_depths.npy": "f39f76aa56a9bb782b2349f3ad1ca4ad16351ee1f06a8b9ae4b06bff9b1ebece", + PKGD / "review_linkage_types.npy": "89edb1940765928ced6f54e0d394f95c573eb9d96310b14dbd0adf8e20ac07c4", + PKGD / "review_attention_mask.npy": "01ed165720b9414e614dd7e7d75284a8886165f11138e16117ffcbe4e4bbf95c", + PKGD / "review_lengths.npy": "ade919d1e054c0ba852aa047bf873ac675f81a6c1f8a05cc73a0a2258131f021", + WA0_HARNESS: "8d05a4048e200625694ff9a36f50af89b845fd0d38ba8034a97a710e7ad3dce2", + WA0_VOCAB: "6a572afdf53f1494ab96c896876b824ca7ea749777352606aa9f96bf270ceecc", + WA0_AMB: "c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74", + JAVA_DIR / "review_A5WurcsArrayTreeAudit.java": "a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6", + JAVA_DIR / "review_wurcsframework-1.3.1.jar": "5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37", + JAVA_DIR / "review_MolWURCS.jar": "bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf", +} + +SEAL_RUNS = ["seal162_linkage_t080"] +BENCH_RUNS = ["benchmark1392_linkage_full"] +SETS = { + "bench1392": {"runs": BENCH_RUNS, "wa0_root": BENCH_DIR / "outputs", + "baseline_runs": ["benchmark1392_residue_full", "benchmark1392_linkage_full"]}, + "seal162": {"runs": SEAL_RUNS, "wa0_root": WORK / "inputs/wa0_seal", + "baseline_runs": ["seal162_residue_t080", "seal162_linkage_t080"]}, +} +ITERATIONS, TOP_K, MAX_LEN, BATCH = 3, 5, 256, 32 + +_real_open = builtins.open + + +def _guarded_open(f, *a, **k): + t = str(f) + if "locked_test" in t or "expert_audit_pool" in t: + raise SystemExit("FAIL-CLOSED: refused to open %s" % t) + return _real_open(f, *a, **k) + + +builtins.open = _guarded_open + + +def sha256_file(path: Path) -> str: + h = hashlib.sha256() + with _real_open(path, "rb") as fh: + for chunk in iter(lambda: fh.read(1 << 22), b""): + h.update(chunk) + return h.hexdigest() + + +def fail(msg: str): + raise SystemExit("FAIL-CLOSED: " + msg) + + +def log(msg: str) -> None: + print(time.strftime("%H:%M:%S"), msg, flush=True) + + +def write_json(path: Path, obj) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + tmp = path.with_suffix(path.suffix + ".tmp") + with _real_open(tmp, "w") as fh: + json.dump(obj, fh, indent=2) + tmp.replace(path) + + +# ============================================================== WA0: the submitted harness, untouched +def load_wa0_evaluator(): + spec = importlib.util.spec_from_file_location("heldout_ipa_eval_wa3_same_test", str(WA0_HARNESS)) + hie = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = hie + spec.loader.exec_module(hie) + + class _NoModelDistiller(hie.BPEIPADistiller): # same pattern as r2_05_baselines.py + def _load_model(self): + return torch.nn.Identity() + + hie.BPEIPADistiller = _NoModelDistiller + ev = hie.HeldoutIPAEvaluator(checkpoint=WA0_CKPT_PATH, vocab=WA0_VOCAB, ambiguity=WA0_AMB, device="cpu", + threshold=0.80, batch_size=32, top_k=TOP_K, max_length=MAX_LEN) + return hie, ev + + +def parse_wa0_summary(run_dir: Path) -> dict: + cfg = {} + for line in _real_open(run_dir / "summary.md"): + m = re.match(r"^- (\w+): `(.*)`\s*$", line.strip()) + if m and m.group(1) not in cfg: + cfg[m.group(1)] = m.group(2) + if "mask_plan" in cfg: + mask_plan = "" if cfg["mask_plan"] in ("", "single-span default") else cfg["mask_plan"] + else: # older summary.md files omit the line; the run's own case records carry it + with _real_open(run_dir / "case_details.jsonl") as fh: + mp = json.loads(fh.readline()).get("mask_plan", "") + mask_plan = mp if "," in mp or not re.fullmatch(r"(residue|linkage):1", mp or "") else "" + if int(cfg["iterations"]) != ITERATIONS or int(cfg["top_k"]) != TOP_K: + fail("%s used iterations=%s top_k=%s" % (run_dir.name, cfg["iterations"], cfg["top_k"])) + return {"threshold": float(cfg["threshold"]), "iterations": int(cfg["iterations"]), "top_k": int(cfg["top_k"]), + "selection_mode": cfg["selection_mode"], "max_cases_per_glycan": int(cfg["max_cases_per_glycan"]), + "span_types": [s.strip() for s in cfg["span_types"].split(",") if s.strip()], "mask_plan": mask_plan, + "input_csv": cfg.get("input_csv"), "checkpoint": cfg.get("checkpoint"), + "glycans_loaded": int(cfg["glycans_loaded"])} + + +def wa0_units(ev, wurcs): + """Mirror of HeldoutIPAEvaluator._tokenize_with_spans, adding the global non-special unit index.""" + tok = ev.tokenizer.tokenize(wurcs, max_length=ev.max_length) + unp = tok["tokens"][: tok["length"]] + recs, cur, g = [], 0, 0 + for u in ev.tokenizer.pre_tokenizer.pre_tokenize(wurcs): + pieces = [u["text"]] if u["type"] == "special" else list(ev.tokenizer.apply_bpe(u["text"])) + s, e = cur, cur + len(pieces) - 1 + cur += len(pieces) + if u["type"] == "special": + continue + gi = g + g += 1 + if e >= len(unp) or unp[s:e + 1] != pieces: + continue + recs.append({"start": s, "end": e, "unit_type": u["type"], "unit_text": u["text"], "g": gi}) + _, spans, _ = ev._tokenize_with_spans(wurcs) + if [(r["start"], r["end"], r["unit_type"], r["unit_text"]) for r in recs] != \ + [(sp.start, sp.end, sp.unit_type, sp.unit_text) for sp in spans]: + fail("WA0 unit geometry differs from the harness for %s" % wurcs[:80]) + return recs + + +def rebuild_wa0_cases(hie, ev, rows, run_dir: Path): + cfg = parse_wa0_summary(run_dir) + if cfg["glycans_loaded"] != len(rows): + fail("%s loaded %d glycans, input has %d" % (run_dir.name, cfg["glycans_loaded"], len(rows))) + mask_req = hie.parse_mask_plan(cfg["mask_plan"]) + span_types = sorted(set(cfg["span_types"]) | set(mask_req)) if mask_req else cfg["span_types"] + cases, _ = ev.build_cases(rows=rows, span_types=span_types, selection_mode=cfg["selection_mode"], + max_cases_per_glycan=cfg["max_cases_per_glycan"], seed=42, mask_requirements=mask_req) + reported = {} + with _real_open(run_dir / "case_details.jsonl") as fh: + for line in fh: + r = json.loads(line) + reported[r["case_id"]] = r + if {c.case_id for c in cases} != set(reported): + fail("%s: rebuilt %d cases vs reported %d (ids differ)" % (run_dir.name, len(cases), len(reported))) + out = [] + for c in cases: + rep = reported[c.case_id] + if list(rep["positions"]) != list(c.positions) or list(rep["truth_token_ids"]) != list(c.truth_token_ids): + fail("%s: case %s positions/truth differ from the reported run" % (run_dir.name, c.case_id)) + pos = set(c.positions) + chosen = [r for r in wa0_units(ev, c.wurcs) if all(p in pos for p in range(r["start"], r["end"] + 1))] + covered = {p for r in chosen for p in range(r["start"], r["end"] + 1)} + if covered != pos: + fail("%s: case %s masked positions do not decompose into whole units" % (run_dir.name, c.case_id)) + out.append({"case_id": c.case_id, "glycan_index": c.glycan_index, "wurcs": c.wurcs, "mask_plan": c.mask_plan, + "units": [{"g": r["g"], "unit_type": r["unit_type"], "unit_text": r["unit_text"]} for r in chosen], + "wa0_iterative_span_exact": bool(rep["iterative_span_exact"]), + "wa0_initial_span_exact_top1": bool(rep["initial_span_exact_top1"]), + "wa0_resolved_all": int(rep["resolved_count"]) == len(rep["positions"])}) + return cfg, out + + +# ============================================================== WA3: frozen tokenizer + official helper +def build_wa3_tokenizer(): + shim = WORK / "shim" + if shim.exists(): + shutil.rmtree(shim) + pkg = shim / "frozen_training" + pkg.mkdir(parents=True) + (pkg / "__init__.py").write_text("") + shutil.copy(PKGD / "review_frozen_training_a5_topology.py", pkg / "a5_topology.py") + shutil.copy(PKGD / "review_frozen_training_a5_wurcs_bpe.py", pkg / "a5_wurcs_bpe.py") + src = (PKGD / "review_frozen_sequence_tree_runtime.py").read_text() + src = (src.replace("from training.a5_topology import", "from frozen_training.a5_topology import") + .replace("from training.a5_wurcs_bpe import", "from frozen_training.a5_wurcs_bpe import")) + if src.count("from frozen_training.") != 2: + fail("tree-runtime import rewrite did not hit exactly two lines") + (shim / "frozen_tree_runtime.py").write_text(src) + sys.path.insert(0, str(PROJ)) + sys.path.insert(0, str(shim)) + import frozen_training.a5_wurcs_bpe as fab # noqa: E402 + import frozen_tree_runtime as ftr # noqa: E402 + for mod in (fab, ftr): + if not str(Path(mod.__file__).resolve()).startswith(str(shim.resolve())): + fail("frozen module resolved outside the shim: %s" % mod.__file__) + if int(ftr.BRANCH_DEPTH_UNKNOWN) != 202: + fail("BRANCH_DEPTH_UNKNOWN != 202") + tok = ftr.ReviewA5WURCSBPETokenizerV3(PKGD / "review_bpe_vocabulary.json") + tok.apply_bpe = functools.lru_cache(maxsize=None)(tok.apply_bpe) + semantic = fab.A5WURCSPreTokenizer() + vocab = json.load(_real_open(PKGD / "review_bpe_vocabulary.json")) + t2i = {k: int(v) for k, v in vocab["token_to_id"].items()} + if len(t2i) != 2114 or sorted(t2i.values()) != list(range(2114)): + fail("WA3 vocabulary is not 2,114 contiguous ids") + specials = {int(v) for v in vocab["special_tokens"].values()} + amb = json.load(_real_open(PKGD / "review_bpe_ambiguity_tokens.json")) + amb_map = {str(t): int(i) for t, i in amb["ambiguous_tokens"].items()} + if set(amb_map.values()) != {int(x) for x in amb["ambiguous_ids"]}: + fail("WA3 ambiguity map ids and token dict disagree") + if any(t2i.get(t) != i for t, i in amb_map.items()) or not all("?" in t for t in amb_map): + fail("WA3 ambiguity map disagrees with the vocabulary") + return {"tok": tok, "semantic": semantic, "exact_linkage": ftr.ReviewA5WURCSPreTokenizerV3.exact_linkage_type, + "t2i": t2i, "i2t": {v: k for k, v in t2i.items()}, "invalid": specials | set(amb_map.values()), + "n_specials": len(specials), "n_ambiguity": len(amb_map), "mask_id": t2i["[MASK]"], + "branch_open_id": t2i["[BRANCH_OPEN]"], "linkage_unknown": int(ftr.LINKAGE_UNKNOWN), + "branch_depth_unknown": int(ftr.BRANCH_DEPTH_UNKNOWN)} + + +def compile_java_helper(): + classes = WORK / "java_classes" + if classes.exists(): + shutil.rmtree(classes) + src = WORK / "java_src/review/a5/A5WurcsArrayTreeAudit.java" + src.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(JAVA_DIR / "review_A5WurcsArrayTreeAudit.java", src) + classes.mkdir(parents=True) + cp = os.pathsep.join([str(JAVA_DIR / "review_wurcsframework-1.3.1.jar"), str(JAVA_DIR / "review_MolWURCS.jar")]) + subprocess.run([str(JAVA_BIN / "javac"), "-cp", cp, "-d", str(classes), str(src)], check=True) + return os.pathsep.join([str(classes), cp]) + + +def run_java_helper(classpath, wurcs_list): + payload = "".join("%d\t%s\n" % (i, base64.urlsafe_b64encode(w.encode()).decode().rstrip("=")) + for i, w in enumerate(wurcs_list)) + res = subprocess.run([str(JAVA_BIN / "java"), "-cp", classpath, "review.a5.A5WurcsArrayTreeAudit"], + input=payload, text=True, capture_output=True, check=True) + lines = res.stdout.splitlines() + if len(lines) != len(wurcs_list): + fail("official helper returned %d lines for %d inputs" % (len(lines), len(wurcs_list))) + out = [] + for i, line in enumerate(lines): + f = line.split("\t") + if int(f[0]) != i: + fail("official helper row order drift at %d" % i) + if len(f) < 2 or f[1] == "ERROR": # frozen builder semantics for ERROR rows + out.append({"rooted": False, "depths": (), "parents": (), "helper_error": True}) + continue + if len(f) < 27: + fail("official helper output truncated at row %d" % i) + rooted = f[20] == "true" + n = int(f[2]) + dec = lambda v: base64.urlsafe_b64decode(v + "=" * ((4 - len(v) % 4) % 4)).decode() # noqa: E731 + depths = tuple(int(x) for x in dec(f[24]).split(",")) if rooted else () + parents = tuple(int(x) for x in dec(f[26]).split(",")) if rooted else () + if rooted and (len(depths) != n or len(parents) != n): + fail("official rooted cardinality drift at row %d" % i) + out.append({"rooted": rooted, "depths": depths, "parents": parents, "helper_error": False}) + return out + + +def wa3_encode(w3, wurcs, auth): + """Frozen builder transform (review_build_official_sequence_topology_successor.py) + unit spans.""" + units = [dict(u) for u in w3["semantic"].pre_tokenize(wurcs) if u.get("text") != "[BRANCH_OPEN]"] + child = collections.Counter(v for v in auth["parents"] if v >= 0) + seen, repaired = set(), [] + for u in units: + u.pop("distance_matrix", None) + rid = int(u.get("residue_id", -1)) + u["linkage_type"] = 0 + if rid >= 0: + depth = int(auth["depths"][rid]) if auth["rooted"] else 202 + u["branch_depth"] = depth + if rid not in seen: + repaired.extend({"text": "[BRANCH_OPEN]", "type": "special", "residue_id": -1, + "branch_depth": depth, "linkage_type": 0} + for _ in range(max(0, child[rid] - 1))) + seen.add(rid) + else: + u["branch_depth"] = 0 + if u.get("type") == "linkage": + u["linkage_type"] = w3["exact_linkage"](str(u["text"])) + repaired.append(u) + pieces, spans, g, ords = [], [], 0, collections.Counter() + for u in repaired: + ps = [str(u["text"])] if u["type"] == "special" else list(w3["tok"].apply_bpe(str(u["text"]))) + s = len(pieces) + pieces.extend((p, int(u["residue_id"]), int(u["branch_depth"]), int(u["linkage_type"])) for p in ps) + if u["type"] != "special": + spans.append({"g": g, "start": s, "end": len(pieces) - 1, "unit_type": u["type"], + "unit_text": str(u["text"]), "ordinal": ords[u["type"]]}) + ords[u["type"]] += 1 + g += 1 + full = len(pieces) + capped = pieces[:255] + [("[END]", -1, 0, 0)] if full > 256 else list(pieces) + L = len(capped) + unk, pad = w3["t2i"]["[UNK]"], w3["t2i"]["[PAD]"] + enc = {"token_ids": [w3["t2i"].get(p[0], unk) for p in capped] + [pad] * (256 - L), + "residue_ids": [p[1] for p in capped] + [-1] * (256 - L), + "branch_depths": [p[2] for p in capped] + [0] * (256 - L), + "linkage_types": [p[3] for p in capped] + [0] * (256 - L), + "attention_mask": [1] * L + [0] * (256 - L), "length": L, "full_length": full, + "tokens": [p[0] for p in capped]} + return enc, spans + + +def parity_gate(w3, classpath, idx_rows): + arrays = {k: np.load(PKGD / ("review_%s.npy" % k), mmap_mode="r") + for k in ("token_ids", "residue_ids", "branch_depths", "linkage_types", "attention_mask")} + sample = [i for i in range(0, len(idx_rows), 97) if idx_rows[i]["truncated_at_256"] != "True"] + auths = run_java_helper(classpath, [idx_rows[i]["canonical_wurcs"] for i in sample]) + counts, bad = collections.Counter(), [] + for i, auth in zip(sample, auths): + enc, _ = wa3_encode(w3, idx_rows[i]["canonical_wurcs"], auth) + ok_all = True + for k, arr in arrays.items(): + same = np.array_equal(np.asarray(enc[k], dtype=np.int64), np.asarray(arr[i], dtype=np.int64)) + counts[k] += int(same) + ok_all &= same + counts["all"] += int(ok_all) + counts["helper_error"] += int(auth["helper_error"]) + if not ok_all and len(bad) < 10: + bad.append(idx_rows[i]["parent_glycorpus_id"]) + res = {"rows": len(sample), "matches": dict(counts), "mismatch_parents": bad, + "rule": "every 97th sequence_row excluding truncated_at_256; official helper + frozen transform"} + res["status"] = "PASS" if counts["all"] == len(sample) else "FAIL" + return res + + +# ============================================================== exposure of test glycans to WA3 +def wurcs_sections(w): + body = w[6:] if w.startswith("WURCS=") else w + out, buf, depth = [], [], 0 + for ch in body: + depth += (ch == "[") - (ch == "]") + if ch == "/" and depth == 0: + out.append("".join(buf)) + buf = [] + else: + buf.append(ch) + out.append("".join(buf)) + return out + + +def lin_key(w): + s = wurcs_sections(w) + if len(s) < 5: + return w + return "WURCS=" + "/".join(s[:4] + ["_".join(sorted(x for x in "/".join(s[4:]).split("_") if x))]) + + +def exposure_lookup(idx_rows): + exact, keyed = collections.defaultdict(list), collections.defaultdict(list) + for r in idx_rows: + exact[r["canonical_wurcs"]].append(r) + keyed[lin_key(r["canonical_wurcs"])].append(r) + priority = ["pretraining_train", "pretraining_development", "excluded_exact_or_verified_graph_identity"] + + def look(w): + hits = {id(r): r for r in exact.get(w, []) + keyed.get(lin_key(w), [])}.values() + if not hits: + return {"wa3_partition": "absent_from_wa3_sequence_parents", "wa3_match_mode": "none", "wa3_parent_id": ""} + parts = {r["pretraining_partition"] for r in hits} + best = next((p for p in priority if p in parts), sorted(parts)[0]) + hit = next(r for r in hits if r["pretraining_partition"] == best) + mode = "exact" if hit["canonical_wurcs"] == w else "lin_order_insensitive" + return {"wa3_partition": best, "wa3_match_mode": mode, "wa3_parent_id": hit["parent_glycorpus_id"]} + return look + + +# ============================================================== A_chem (verbatim logic from iar_achem_q_20260824_r1/a.py) +def load_achem(): + sys.path.insert(0, str(SCHEMA_DIR)) + from pipelib import parse_record, SIDE_RE, node_index # noqa: E402 + from classify import PLAIN_LINK # noqa: E402 + no_oh = set("Amd") + + def a_chem(rec, ai, skip_li): + occ = set() + for ei, e in enumerate([x for x in rec["lin"].split("_") if x]): + if ei == skip_li: + continue + m = PLAIN_LINK.match(e) + if not m: + continue + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if sm and sm.group(2) != "?": + try: + if node_index(sm.group(1)) - 1 == ai: + occ.add(int(sm.group(2))) + except ValueError: + pass + sk = rec["skel"][ai] + if not sk: + return None, "no_skeleton" + n = len(sk) + if n < 3: + return None, "skeleton_lt_3" + if n > 12: + return None, "skeleton_gt_12" + free = set(range(1, n + 1)) + if rec["anom"][ai] is not None: + free.discard(rec["anom"][ai]) + rg = rec["ring"][ai] + if rg and rg[1] != "?": + try: + free.discard(int(rg[1])) + except ValueError: + pass + free -= set(rec["subs"][ai]) + for p, ch in enumerate(sk, 1): + if ch in no_oh: + free.discard(p) + return free - occ, "ok" + + def for_linkage(wurcs, entry): + rec = parse_record(wurcs) + if rec is None or not rec["lin"]: + return {"achem_status": "unparsable"} + ents = [x for x in rec["lin"].split("_") if x] + if ents.count(entry) != 1: + return {"achem_status": "entry_not_unique_in_lin"} + li = ents.index(entry) + m = PLAIN_LINK.match(entry) + if not m: + return {"achem_status": "not_plain_linkage"} + sides = [] + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if not sm or sm.group(2) == "?": + return {"achem_status": "side_unparsable"} + try: + sides.append((node_index(sm.group(1)) - 1, int(sm.group(2)))) + except ValueError: + return {"achem_status": "bad_label"} + donor_flags = [0 <= ai < rec["nres"] and rec["anom"][ai] is not None and rec["anom"][ai] == p for ai, p in sides] + if donor_flags.count(True) != 1: + return {"achem_status": "orientation_undetermined"} + ai, truth_pos = sides[donor_flags.index(False)] + A, why = a_chem(rec, ai, li) + if A is None: + return {"achem_status": why} + k = len(A) + return {"achem_status": "ok", "achem_k": k, "achem_positions": sorted(A), "truth_in_achem": truth_pos in A, + "achem_chance": (1.0 / k) if k else None} + return for_linkage + + +# ============================================================== WA3 cases, model, evaluation +def build_wa3_cases(w3, wa0_cases, encodings, look): + cases, excluded = [], collections.Counter() + for c in wa0_cases: + enc, spans = encodings[c["wurcs"]] + by_g = {s["g"]: s for s in spans} + positions, texts = [], [] + for u in c["units"]: + s = by_g.get(u["g"]) + if s is None or s["unit_text"] != u["unit_text"] or s["unit_type"] != u["unit_type"]: + fail("unit mapping mismatch for %s unit %s" % (c["case_id"], u)) + positions.extend(range(s["start"], s["end"] + 1)) + texts.append(u["unit_text"]) + if max(positions) >= enc["length"] - (1 if enc["full_length"] > 256 else 0): + excluded["wa3_truncated_beyond_256"] += 1 + continue + truth = [enc["token_ids"][p] for p in positions] + masked = list(enc["token_ids"]) + for p in positions: + masked[p] = w3["mask_id"] + flags = {"enumerated_alternative": any("|" in t for t in texts), + "unknown_question_mark": any("?" in t for t in texts), + "wa3_truth_uses_invalid_token": any(t in w3["invalid"] for t in truth)} + flags["single_answer"] = not any(flags.values()) + lt_blank, bd_blank = list(enc["linkage_types"]), list(enc["branch_depths"]) + # Blank the channels that encode the hidden unit, honouring WA3's own input contract + # (composite_r4.validate_sequence_surface:584-592): linkage pieces are exactly residue_id == -2 and + # must keep a nonzero linkage class; non-residue pieces must keep branch depth 0. + for p in positions: + if enc["residue_ids"][p] == -2: + lt_blank[p] = w3["linkage_unknown"] # 9 = the class WA3 already uses for '?' linkages + elif enc["residue_ids"][p] >= 0: + bd_blank[p] = w3["branch_depth_unknown"] # 202 = the depth WA3 uses when the tree is not rooted + cases.append({**{k: c[k] for k in ("case_id", "glycan_index", "wurcs", "mask_plan", "units", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")}, + "unit_text": " | ".join("%s:%s" % (u["unit_type"], u["unit_text"]) for u in c["units"]), + "positions": positions, "truth_ids": truth, "masked_ids": masked, + "attention_mask": enc["attention_mask"], "residue_ids": enc["residue_ids"], + "branch_depths": enc["branch_depths"], "linkage_types": enc["linkage_types"], + "branch_depths_blank": bd_blank, "linkage_types_blank": lt_blank, + **flags, **look(c["wurcs"])}) + return cases, dict(excluded) + + +def all_absent(B, dev): # contract from iar_bytype3_20260825_r1/bytype.py (job 12094273) + return {"ms_token_ids": torch.empty((0, 64), dtype=torch.long, device=dev), + "ms_attention_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), + "ms_input_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), "ms_labels": None, + "ms_acquisition_parent_indices": torch.empty((0,), dtype=torch.long, device=dev), + "ms_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), "ms_mode": "development", + "static_token_ids": torch.zeros((B, 1, 4), dtype=torch.long, device=dev), + "static_attention_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), + "static_residue_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_slot_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_state_mask": torch.zeros((B, 1), dtype=torch.bool, device=dev), + "static_state_ids": torch.full((B, 1), -1, dtype=torch.long, device=dev), + "static_input_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), "static_labels": None, + "static_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), + "md_values": torch.zeros((B, 2, 20, 6), dtype=torch.float32, device=dev), + "md_feature_mask": torch.zeros((B, 2, 20, 6), dtype=torch.bool, device=dev), + "md_child_present_mask": torch.zeros((B, 2), dtype=torch.bool, device=dev), + "md_state_row_ids": torch.full((B, 2), -1, dtype=torch.long, device=dev), + "md_window_input_mask": torch.zeros((B, 2, 20), dtype=torch.bool, device=dev), "md_labels": None, + "md_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev)} + + +def load_model(): + spec = importlib.util.spec_from_file_location("wa3_train_mod", str(TRAIN_MOD)) + tm = importlib.util.module_from_spec(spec) + sys.modules["wa3_train_mod"] = tm + spec.loader.exec_module(tm) + if sha256_file(CK) != CK_SHA: + fail("WA3 checkpoint sha mismatch") + ctx = tm.native_authority(None, static_active=False) + _native, r8, _static, _runner = ctx.__enter__() + r5 = r8._core._r6._r5 + if int(r5.SEQUENCE_VOCAB_SIZE) != 2114: + fail("r5.SEQUENCE_VOCAB_SIZE != 2114") + model = tm.mdcore.make_md_enabled_composite_class(r5)(r8.NativeEightConfig(cell_id="A111", seq_vocab_size=2114), + md_cell_id="A1111", md_temporal_size=128) + ck = torch.load(CK, map_location="cpu", weights_only=False) + if str(ck.get("md_cell_id")) != "A1111" or int(ck["selection"]["best_epoch"]) != 58: + fail("checkpoint identity is not A1111 / best epoch 58") + model.load_state_dict(ck["model_state"], strict=True) + n_par = sum(p.numel() for p in model.parameters()) + if n_par != 138487995 or len(model.state_dict()) != 505: + fail("WA3 inventory %d params / %d tensors" % (n_par, len(model.state_dict()))) + model.eval() + dev = "cuda" if torch.cuda.is_available() else "cpu" + model.to(dev) + return model, dev, ctx + + +def evaluate(model, dev, w3, cases, threshold, blank_side_channels=False, neutral=False): + bd_key = "branch_depths_blank" if blank_side_channels else "branch_depths" + lt_key = "linkage_types_blank" if blank_side_channels else "linkage_types" + results = [] + for b0 in range(0, len(cases), BATCH): + batch = cases[b0:b0 + BATCH] + current = [list(c["masked_ids"]) for c in batch] + unresolved = [set(c["positions"]) for c in batch] + initial, accepted = [[] for _ in batch], [[] for _ in batch] + top10 = [[] for _ in batch] + for it in range(ITERATIONS): + t = lambda key: torch.tensor([c[key] for c in batch], dtype=torch.long, device=dev) # noqa: E731 + HOOK["mask"] = None + if neutral: + m = torch.zeros((len(batch), len(batch[0]["masked_ids"])), dtype=torch.bool) + for ci, c in enumerate(batch): + for p in c["positions"]: + if c["residue_ids"][p] == -2: + m[ci, p] = True + HOOK["mask"] = m.to(dev) + with torch.inference_mode(): + o = model(seq_token_ids=torch.tensor(current, dtype=torch.long, device=dev), + seq_attention_mask=t("attention_mask").bool(), seq_residue_ids=t("residue_ids"), + seq_branch_depths=t(bd_key), seq_linkage_types=t(lt_key), + seq_labels=None, topology_labels=None, topology_available=None, + **all_absent(len(batch), torch.device(dev))) + HOOK["mask"] = None + logits = o.sequence_logits.float() + if w3["allowed_mask"]["linkage"].shape[0] != logits.shape[-1]: + fail("answer-space mask size %d != model vocabulary %d" + % (w3["allowed_mask"]["linkage"].shape[0], logits.shape[-1])) + progress = 0 + for ci, c in enumerate(batch): + if not unresolved[ci]: + continue + for li, pos in enumerate(c["positions"]): + rid = c["residue_ids"][pos] + if rid != -2 and rid < 0: + fail("masked position %d of %s is neither a residue nor a linkage piece" % (pos, c["case_id"])) + allow = w3["allowed_mask"]["linkage" if rid == -2 else "residue"] + row = logits[ci, pos].masked_fill(~allow, float("-inf")) + tp10, ti10 = torch.topk(torch.softmax(row, dim=-1), k=10) + tp, ti = tp10[:TOP_K], ti10[:TOP_K] + ids = [int(x) for x in ti.tolist()] + if it == 0: + top10[ci].append([[w3["i2t"][int(i)], round(float(p), 4)] + for p, i in zip(tp10.tolist(), ti10.tolist())]) + initial[ci].append((ids[0] == c["truth_ids"][li], c["truth_ids"][li] in ids)) + if pos not in unresolved[ci]: + continue + if float(tp[0]) < threshold or ids[0] in w3["invalid"]: + continue + current[ci][pos] = ids[0] + unresolved[ci].remove(pos) + progress += 1 + accepted[ci].append(it + 1) + if progress == 0: + break + for ci, c in enumerate(batch): + final = [current[ci][p] for p in c["positions"]] + correct = [f == t for f, t in zip(final, c["truth_ids"])] + results.append({k: c[k] for k in ("case_id", "glycan_index", "mask_plan", "unit_text", "single_answer", + "enumerated_alternative", "unknown_question_mark", + "wa3_truth_uses_invalid_token", "wa3_partition", "wa3_match_mode", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")} + | {"num_masked_positions": len(c["positions"]), + "truth_tokens": [w3["i2t"][x] for x in c["truth_ids"]], + "final_tokens": [w3["i2t"][x] for x in final], + "initial_top1_correct_count": sum(a for a, _ in initial[ci]), + "initial_top5_correct_count": sum(b for _, b in initial[ci]), + "resolved_count": len(c["positions"]) - len(unresolved[ci]), + "final_correct_count": sum(correct), + "initial_span_exact_top1": all(a for a, _ in initial[ci]), + "initial_span_exact_top5": all(b for _, b in initial[ci]), + "iterative_span_exact": all(correct), + "iterations_used": max(accepted[ci], default=0), + "initial_top10": top10[ci]}) + return results + + +def aggregate(rs): # identical formulas to HeldoutIPAEvaluator._aggregate_slice + n = len(rs) + if not n: + return {"num_cases": 0} + pos = sum(r["num_masked_positions"] for r in rs) + res = sum(r["resolved_count"] for r in rs) + cor = sum(r["final_correct_count"] for r in rs) + return {"num_cases": n, "num_masked_positions": pos, "avg_masked_positions_per_case": pos / n, + "initial_top1_token_accuracy": sum(r["initial_top1_correct_count"] for r in rs) / pos, + "initial_top5_token_accuracy": sum(r["initial_top5_correct_count"] for r in rs) / pos, + "initial_exact_span_accuracy_top1": sum(bool(r["initial_span_exact_top1"]) for r in rs) / n, + "initial_exact_span_accuracy_top5": sum(bool(r["initial_span_exact_top5"]) for r in rs) / n, + "iterative_resolved_fraction": res / pos, + "iterative_accuracy_among_resolved": (cor / res) if res else 0.0, + "iterative_final_token_accuracy": cor / pos, + "iterative_exact_span_accuracy": sum(bool(r["iterative_span_exact"]) for r in rs) / n, + "avg_iterations_used_per_case": sum(r["iterations_used"] for r in rs) / n} + + +def paired(rs): + n = len(rs) + if not n: + return {"n": 0} + a = [bool(r["wa0_iterative_span_exact"]) for r in rs] + b = [bool(r["iterative_span_exact"]) for r in rs] + return {"n": n, "wa0_exact_span": sum(a) / n, "wa3_exact_span": sum(b) / n, + "both": sum(x and y for x, y in zip(a, b)), "wa0_only": sum(x and not y for x, y in zip(a, b)), + "wa3_only": sum(y and not x for x, y in zip(a, b)), "neither": sum(not x and not y for x, y in zip(a, b))} + + +# ============================================================== R2-05 baselines (port of r2_05_baselines.py) +class BaselineStats: + def __init__(self): + self.marginal = collections.defaultdict(collections.Counter) + self.ctx_pair = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.ctx_prev = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.n_glycans = 0 + self.feature_ids, self._feats, self._donor = {}, [], collections.defaultdict(list) + self.text_ids, self.texts, self.donor_index = {}, [], {} + + def _tid(self, text): + if text not in self.text_ids: + self.text_ids[text] = len(self.texts) + self.texts.append(text) + return self.text_ids[text] + + def add(self, index, unpadded, records): + self.n_glycans += 1 + feats = set() + for r in records: + key = (r["unit_type"], r["unit_text"]) + feats.add(self.feature_ids.setdefault(key, len(self.feature_ids))) + if not r["eligible"] or "|" in r["unit_text"]: # typed child: same answer space as BERTose + continue + if r["unit_type"] == "linkage" and not 1 <= BaselineStats.linkage_class(r["unit_text"]) <= 8: + continue # strict child: ordinary linkages only, as for BERTose + ut, text = r["unit_type"], r["unit_text"] + self.marginal[ut][text] += 1 + prev_t = unpadded[r["start"] - 1] if r["start"] > 0 else "" + next_t = unpadded[r["end"] + 1] if r["end"] + 1 < len(unpadded) else "" + self.ctx_pair[ut][(prev_t, next_t)][text] += 1 + self.ctx_prev[ut][prev_t][text] += 1 + self._donor[(ut, r["ordinal"])].append((index, self._tid(text))) + self._feats.append(sorted(feats)) + + def finalize(self): + counts = np.zeros(len(self.feature_ids) + 1, dtype=np.int64) + for fs in self._feats: + for f in fs: + counts[f + 1] += 1 + self.indptr = np.cumsum(counts) + self.rows = np.zeros(int(self.indptr[-1]), dtype=np.int32) + fill = self.indptr[:-1].copy() + for gid, fs in enumerate(self._feats): + for f in fs: + self.rows[fill[f]] = gid + fill[f] += 1 + self.sizes = np.array([len(fs) for fs in self._feats], dtype=np.int64) + self._feats = [] + for key, pairs in self._donor.items(): + pairs.sort() + self.donor_index[key] = (np.array([p[0] for p in pairs], dtype=np.int64), + np.array([p[1] for p in pairs], dtype=np.int64)) + self._donor = {} + + @staticmethod + def _argmax(counter): + total = sum(counter.values()) + text = min(counter.items(), key=lambda kv: (-kv[1], kv[0]))[0] + return text, counter[text] / total + + def marginal_pred(self, ut): + return self._argmax(self.marginal[ut]) if self.marginal.get(ut) else (None, 0.0) + + def context_pred(self, ut, prev_t, next_t): + c = self.ctx_pair.get(ut, {}).get((prev_t, next_t)) + if c: + return self._argmax(c)[0], "prev_next" + c = self.ctx_prev.get(ut, {}).get(prev_t) + if c: + return self._argmax(c)[0], "prev_only" + return self.marginal_pred(ut)[0], "marginal_backoff" + + def nn_pred(self, ut, ordinal, query_keys): + donor = self.donor_index.get((ut, ordinal)) + if donor is None: + return None + cand_idx, cand_txt = donor + fids = [self.feature_ids[k] for k in query_keys if k in self.feature_ids] + if fids: + rows = np.concatenate([self.rows[self.indptr[f]:self.indptr[f + 1]] for f in fids]) + inter = np.bincount(rows, minlength=self.n_glycans)[cand_idx].astype(np.float64) + else: + inter = np.zeros(len(cand_idx)) + union = self.sizes[cand_idx] + len(query_keys) - inter + jac = np.divide(inter, union, out=np.zeros_like(inter), where=union > 0) + return self.texts[int(cand_txt[int(np.argmax(jac))])] + + +def fit_baselines(w3, idx_rows, test_wurcs): + token_ids = np.load(PKGD / "review_token_ids.npy", mmap_mode="r") + lengths = np.load(PKGD / "review_lengths.npy", mmap_mode="r") + stats, counts, bo, unk = BaselineStats(), collections.Counter(), w3["branch_open_id"], w3["t2i"]["[UNK]"] + test_keys = {lin_key(w) for w in test_wurcs} + for i, r in enumerate(idx_rows): + if r["pretraining_partition"] != "pretraining_train" or r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + counts["removed_test_glycan"] += 1 + continue + L = int(lengths[i]) + ids = [int(x) for x in token_ids[i, :L]] + p, recs, ords, ok = 0, [], collections.Counter(), True + for u in w3["semantic"].pre_tokenize(w): + if u.get("text") == "[BRANCH_OPEN]": + continue + while p < L and ids[p] == bo: + p += 1 + ps = [u["text"]] if u["type"] == "special" else list(w3["tok"].apply_bpe(u["text"])) + pid = [w3["t2i"].get(x, unk) for x in ps] + if ids[p:p + len(pid)] != pid: + ok = False + break + if u["type"] != "special": + recs.append({"start": p, "end": p + len(pid) - 1, "unit_type": u["type"], "unit_text": u["text"], + "ordinal": ords[u["type"]], "eligible": not any(x in w3["invalid"] for x in pid)}) + ords[u["type"]] += 1 + p += len(pid) + while ok and p < L and ids[p] == bo: + p += 1 + if not ok or p != L: + counts["unit_walk_mismatch"] += 1 + continue + stats.add(counts["fitted"], [w3["i2t"][x] for x in ids], recs) + counts["fitted"] += 1 + stats.finalize() + return stats, dict(counts) + + +def build_allowed(w3, idx_rows, test_wurcs): + """Type-consistent answer space: token ids seen at linkage / residue pieces in WA3 training parents.""" + token_ids = np.load(PKGD / "review_token_ids.npy", mmap_mode="r") + residue_ids = np.load(PKGD / "review_residue_ids.npy", mmap_mode="r") + linkage_types = np.load(PKGD / "review_linkage_types.npy", mmap_mode="r") + lengths = np.load(PKGD / "review_lengths.npy", mmap_mode="r") + test_keys = {lin_key(w) for w in test_wurcs} + V = len(w3["t2i"]) + seen = {"linkage": np.zeros(V, dtype=bool), "residue": np.zeros(V, dtype=bool)} + rows = 0 + class_counts = np.zeros(10, dtype=np.int64) + for i, r in enumerate(idx_rows): + if r["pretraining_partition"] != "pretraining_train" or r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + continue + L = int(lengths[i]) + ids, rid = np.asarray(token_ids[i, :L]), np.asarray(residue_ids[i, :L]) + lt = np.asarray(linkage_types[i, :L]) + class_counts += np.bincount(lt[rid == -2], minlength=10)[:10] + seen["linkage"][ids[(rid == -2) & (lt >= 1) & (lt <= 8)]] = True # strict: ordinary linkages only + seen["residue"][ids[rid >= 0]] = True + rows += 1 + bad = np.zeros(V, dtype=bool) + bad[sorted(w3["invalid"])] = True + pipe = [i for t, i in w3["t2i"].items() if "|" in t] + bad[pipe] = True + allowed = {k: v & ~bad for k, v in seen.items()} + info = {"training_rows_scanned": rows, "vocab": V, "invalid_excluded": len(w3["invalid"]), + "pipe_tokens_excluded": len(pipe), + "linkage_tokens_seen": int(seen["linkage"].sum()), "residue_tokens_seen": int(seen["residue"].sum()), + "linkage_tokens_allowed": int(allowed["linkage"].sum()), + "residue_tokens_allowed": int(allowed["residue"].sum()), + "linkage_class_counts": class_counts.tolist()} + return allowed, info + + +def truth_outside(w3, cases): + """Cases whose true token at some masked position lies outside the allowed answer space.""" + n = 0 + for c in cases: + for pos, t in zip(c["positions"], c["truth_ids"]): + kind = "linkage" if c["residue_ids"][pos] == -2 else "residue" + if not w3["allowed_np"][kind][t]: + n += 1 + break + return n + + +HOOK = {"mask": None, "vec": None} + + +def _linkage_hook(module, inputs, output): + m = HOOK["mask"] + if m is None: + return None + if output.dim() == 3 and tuple(output.shape[:2]) == tuple(m.shape): + idx = m + elif output.dim() == 2 and output.shape[0] == m.numel(): + idx = m.reshape(-1) + else: + fail("linkage embedding output %s does not match mask %s" % (tuple(output.shape), tuple(m.shape))) + out = output.clone() + out[idx] = HOOK["vec"].to(out.dtype) + return out + + +def find_linkage_embedding(model): + cands = [(n, m) for n, m in model.named_modules() if isinstance(m, torch.nn.Embedding) and m.num_embeddings == 10] + named = [(n, m) for n, m in cands if "linkage" in n.lower()] + if len(named) != 1: + fail("linkage embedding not unique: %s" % [n for n, _ in cands]) + return named[0] + + +def baseline_unit_preds(w3, stats, cases, encodings): + out = {} + for c in cases: + if len(c["units"]) != 1: + continue + enc, spans = encodings[c["wurcs"]] + s = {sp["g"]: sp for sp in spans}[c["units"][0]["g"]] + tokens = [w3["i2t"][x] for x in enc["token_ids"][:enc["length"]]] + prev_t = tokens[s["start"] - 1] if s["start"] > 0 else "" + next_t = tokens[s["end"] + 1] if s["end"] + 1 < len(tokens) else "" + query = {(sp["unit_type"], sp["unit_text"]) for sp in spans if sp["g"] != s["g"]} + out[c["case_id"]] = {"marginal_frequency": stats.marginal_pred(s["unit_type"])[0], + "context_frequency": stats.context_pred(s["unit_type"], prev_t, next_t)[0], + "nearest_neighbour": stats.nn_pred(s["unit_type"], s["ordinal"], query)} + return out + + +PAT_ORD = re.compile(r"^([A-Za-z]+)(\d+)-([A-Za-z]+)(\d+)$") + + +def _cat(truth, pred): + if pred is None: + return "no_answer" + if pred == truth: + return "exact" + t, p = PAT_ORD.match(truth), PAT_ORD.match(pred) + if t is None: + return "truth_not_ordinary" + if p is None: + return "non_ordinary_answer" + if (t.group(1), t.group(3)) == (p.group(1), p.group(3)): + return "right_sugars_wrong_positions" + if (t.group(2), t.group(4)) == (p.group(2), p.group(4)): + return "right_positions_wrong_sugars" + return "both_wrong" + + +def decompose(cases, arms, preds): + by_id = {a: {r["case_id"]: r for r in res} for a, res in arms.items()} + out = {} + for subset, sel in (("all_cases", cases), + ("not_in_wa3_training", [c for c in cases if c["wa3_partition"] != "pretraining_train"])): + rows = [] + for c in sel: + if len(c["positions"]) != 1 or len(c["units"]) != 1: + continue + truth = c["units"][0]["unit_text"] + m = {} + for a in arms: + r = by_id[a][c["case_id"]] + toks = [tk for tk, _ in r["initial_top10"][0]] + m["BERTose_%s_first_choice" % a] = toks[0] + m["BERTose_%s_IAR" % a] = r["final_tokens"][0] if r["resolved_count"] else None + m["_rank_%s" % a] = toks.index(truth) + 1 if truth in toks else 11 + m.update(preds.get(c["case_id"], {})) + t = PAT_ORD.match(truth) + rows.append({"truth": truth, "pair": "%s-%s" % (t.group(2), t.group(4)) if t else "non_ordinary", + "k": c.get("achem_k"), "m": m}) + methods = [k for k in (rows[0]["m"] if rows else {}) if not k.startswith("_")] + res = {"n_single_token_cases": len(rows), "methods": {}} + for meth in methods: + cats = collections.Counter(_cat(r["truth"], r["m"].get(meth)) for r in rows) + res["methods"][meth] = {"exact": round(cats["exact"] / len(rows), 4) if rows else 0.0, + "categories": dict(cats)} + for a in arms: + ranks = collections.Counter(r["m"]["_rank_%s" % a] for r in rows) + res["rank_of_truth_%s" % a] = {("%d" % k if k <= 10 else ">10"): v for k, v in sorted(ranks.items())} + strata = collections.defaultdict(list) + for r in rows: + strata["pair=" + r["pair"]].append(r) + k = r["k"] + strata["admissible_positions=" + ("unknown" if k is None else (str(k) if k < 4 else ">=4"))].append(r) + res["strata"] = {} + for name, rs in sorted(strata.items()): + res["strata"][name] = {"n": len(rs)} | { + meth: round(sum(_cat(r["truth"], r["m"].get(meth)) == "exact" for r in rs) / len(rs), 4) + for meth in methods} + out[subset] = res + return out + + +def score_prediction(truth_tokens, pred_tokens): + n = len(truth_tokens) + if pred_tokens is None: + ok, nc = False, 0 + else: + ok = list(pred_tokens) == list(truth_tokens) + nc = sum(a == b for a, b in zip(pred_tokens, truth_tokens)) if len(pred_tokens) == n else 0 + return {"num_masked_positions": n, "initial_top1_correct_count": nc, "initial_top5_correct_count": nc, + "resolved_count": n if pred_tokens is not None else 0, "final_correct_count": nc, + "initial_span_exact_top1": ok, "initial_span_exact_top5": ok, "iterative_span_exact": ok, + "iterations_used": 0} + + +def run_baselines(w3, stats, cases, encodings, results_by_id, results_blank_by_id=None): + method_rows = collections.defaultdict(list) + for c in cases: + if len(c["units"]) != 1: + continue + enc, spans = encodings[c["wurcs"]] + s = {sp["g"]: sp for sp in spans}[c["units"][0]["g"]] + tokens = [w3["i2t"][x] for x in enc["token_ids"][:enc["length"]]] + prev_t = tokens[s["start"] - 1] if s["start"] > 0 else "" + next_t = tokens[s["end"] + 1] if s["end"] + 1 < len(tokens) else "" + query = {(sp["unit_type"], sp["unit_text"]) for sp in spans if sp["g"] != s["g"]} + truth = [w3["i2t"][x] for x in c["truth_ids"]] + bpe = lambda t: None if t is None else list(w3["tok"].apply_bpe(t)) # noqa: E731 + preds = {"marginal_frequency": bpe(stats.marginal_pred(s["unit_type"])[0]), + "context_frequency": bpe(stats.context_pred(s["unit_type"], prev_t, next_t)[0]), + "nearest_neighbour": bpe(stats.nn_pred(s["unit_type"], s["ordinal"], query))} + flags = {k: c[k] for k in ("single_answer", "wa3_partition")} + for m, p in preds.items(): + method_rows[m].append({**score_prediction(truth, p), **flags}) + method_rows["WA3_harness_inputs"].append({**results_by_id[c["case_id"]]}) + if results_blank_by_id is not None: + method_rows["WA3_side_channels_blanked"].append({**results_blank_by_id[c["case_id"]]}) + wa0 = {"num_masked_positions": 1, "initial_top1_correct_count": 0, "initial_top5_correct_count": 0, + "resolved_count": 1, "final_correct_count": 0, "initial_span_exact_top1": c["wa0_initial_span_exact_top1"], + "initial_span_exact_top5": False, "iterative_span_exact": c["wa0_iterative_span_exact"], + "iterations_used": 0, **flags} + method_rows["WA0_submitted"].append(wa0) + table = [] + for m, rows in method_rows.items(): + for subset, sel in (("all_cases", rows), ("single_answer", [r for r in rows if r["single_answer"]]), + ("single_answer_not_in_wa3_training", + [r for r in rows if r["single_answer"] and r["wa3_partition"] != "pretraining_train"])): + a = aggregate(sel) + table.append({"method": m, "subset": subset, "n": a["num_cases"], + "exact_span_accuracy": round(a.get("iterative_exact_span_accuracy", 0.0), 4)}) + return table + + +# ============================================================== main +def summarize_run(results, cases_all, excluded, cfg, results_blank=None): + sa = [r for r in results if r["single_answer"]] + unseen = lambda rs: [r for r in rs if r["wa3_partition"] != "pretraining_train"] # noqa: E731 + out = {"wa0_config": cfg, "wa3_excluded": excluded, + "flags": {"cases": len(results), "single_answer": len(sa), + "enumerated_alternative": sum(r["enumerated_alternative"] for r in results), + "unknown_question_mark": sum(r["unknown_question_mark"] for r in results), + "wa3_truth_uses_invalid_token": sum(r["wa3_truth_uses_invalid_token"] for r in results)}, + "exposure": dict(collections.Counter(r["wa3_partition"] for r in results)), + "wa3_all_cases": aggregate(results), "wa3_single_answer": aggregate(sa), + "wa3_single_answer_not_in_wa3_training": aggregate(unseen(sa)), + "paired_wa0_vs_wa3_all_cases": paired(results), "paired_wa0_vs_wa3_single_answer": paired(sa)} + if results_blank is not None: + sb = [r for r in results_blank if r["single_answer"]] + out["wa3_side_channels_blanked_all_cases"] = aggregate(results_blank) + out["wa3_side_channels_blanked_single_answer"] = aggregate(sb) + out["wa3_side_channels_blanked_single_answer_not_in_wa3_training"] = aggregate(unseen(sb)) + ach = [c for c in cases_all if "achem_status" in c] + if ach: + by_id = {r["case_id"]: r for r in results} + strata = collections.defaultdict(list) + status = collections.Counter(c["achem_status"] for c in ach) + for c in ach: + if c["achem_status"] != "ok" or not by_id[c["case_id"]]["single_answer"]: + continue + k = c["achem_k"] + strata["k=0" if k == 0 else ("k=1" if k == 1 else ("k=2" if k == 2 else ("k=3" if k == 3 else "k>=4")))].append(c) + out["achem"] = {"status": dict(status), "strata": {}} + for name, cs in sorted(strata.items()): + rs = [by_id[c["case_id"]] for c in cs] + row = {"n": len(cs), "mean_chance": float(np.mean([c["achem_chance"] or 0 for c in cs])), + "truth_in_achem": sum(c["truth_in_achem"] for c in cs), + "wa3_exact_span_harness_inputs": aggregate(rs)["iterative_exact_span_accuracy"], + "wa0_exact_span_harness_inputs": sum(c["wa0_iterative_span_exact"] for c in cs) / len(cs)} + if results_blank is not None: + bb = {r["case_id"]: r for r in results_blank} + row["wa3_exact_span_side_channels_blanked"] = aggregate([bb[c["case_id"]] for c in cs])["iterative_exact_span_accuracy"] + out["achem"]["strata"][name] = row + return out + + +def main(): + OUT.mkdir(parents=True, exist_ok=True) + manifest = {"schema": "bertose_wa3_linkage_diagnosis_v1", + "parent_script": "wa3_same_test.py sha256 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 (job 12847066)", + "decoding": "type-consistent answer space (see docstring); renormalised softmax; threshold 0.80; 3 rounds", + "started": time.strftime("%Y-%m-%dT%H:%M:%S"), + "slurm_job_id": os.environ.get("SLURM_JOB_ID"), "host": platform.node(), "python": sys.version.split()[0], + "torch": torch.__version__, "threads": torch.get_num_threads(), + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back"} + for path, expect in EXPECTED_SHA.items(): + got = sha256_file(path) + if got != expect: + fail("%s sha %s != %s" % (path, got, expect)) + log("all %d pinned file hashes match" % len(EXPECTED_SHA)) + + hie, ev0 = load_wa0_evaluator() + w3 = build_wa3_tokenizer() + manifest["wa3_invalid_prediction_set"] = {"specials": w3["n_specials"], "ambiguity_tokens": w3["n_ambiguity"]} + java_cp = compile_java_helper() + with gzip.open(PKGD / "review_sequence_parent_index.tsv.gz", "rt", newline="") as fh: + idx_rows = list(csv.DictReader(fh, delimiter="\t")) + if len(idx_rows) != 281208: + fail("parent index row count %d" % len(idx_rows)) + + parity = parity_gate(w3, java_cp, idx_rows) + write_json(OUT / "gate_wa3_input_parity.json", parity) + log("WA3 input parity: %s %s/%d" % (parity["status"], parity["matches"].get("all", 0), parity["rows"])) + if parity["status"] != "PASS": + fail("WA3 inputs do not reproduce the training arrays; see gate_wa3_input_parity.json") + + look = exposure_lookup(idx_rows) + achem = load_achem() + set_data, all_test_wurcs = {}, set() + for set_name, spec in SETS.items(): + first_cfg = parse_wa0_summary(spec["wa0_root"] / spec["runs"][0]) + csv_path = Path(first_cfg["input_csv"]) if set_name == "bench1392" else WORK / "inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv" + rows = hie.load_rows(input_csv=csv_path, limit=first_cfg["glycans_loaded"], shuffle=False, seed=42) + manifest.setdefault("inputs", {})[set_name] = {"csv": str(csv_path), "sha256": sha256_file(csv_path), "rows": len(rows)} + uniq = sorted({r["wurcs"] for r in rows}) + auths = run_java_helper(java_cp, uniq) + encodings = {w: wa3_encode(w3, w, a) for w, a in zip(uniq, auths)} + manifest["inputs"][set_name]["helper_errors"] = sum(a["helper_error"] for a in auths) + manifest["inputs"][set_name]["exposure_glycans"] = dict(collections.Counter(look(w)["wa3_partition"] for w in uniq)) + set_data[set_name] = (rows, encodings) + all_test_wurcs.update(uniq) + log("%s: %d glycans; WA3 exposure %s" % (set_name, len(uniq), manifest["inputs"][set_name]["exposure_glycans"])) + + w3["allowed_np"], manifest["answer_space"] = build_allowed(w3, idx_rows, all_test_wurcs) + log("answer space: %s" % manifest["answer_space"]) + + built, identity_failures = [], [] + for set_name, spec in SETS.items(): + rows, encodings = set_data[set_name] + for run in spec["runs"]: + try: + cfg, wa0_cases = rebuild_wa0_cases(hie, ev0, rows, spec["wa0_root"] / run) + except (SystemExit, OSError, KeyError, ValueError) as exc: + identity_failures.append({"set": set_name, "run": run, "reason": str(exc)}) + log("%s/%s: SKIPPED, not the same test: %s" % (set_name, run, exc)) + continue + cases, excluded = build_wa3_cases(w3, wa0_cases, encodings, look) + for c in cases: + if len(c["units"]) == 1 and c["units"][0]["unit_type"] == "linkage": + c.update(achem(c["wurcs"], c["units"][0]["unit_text"])) + manifest["inputs"][set_name].setdefault("wa0_checkpoints", {})[run] = cfg["checkpoint"] + manifest.setdefault("truth_outside_answer_space", {})["%s/%s" % (set_name, run)] = truth_outside(w3, cases) + built.append((set_name, run, cfg, cases, excluded)) + log("%s/%s: WA0 cases rebuilt and verified (%d); WA3 cases %d; excluded %s" + % (set_name, run, len(wa0_cases), len(cases), excluded)) + write_json(OUT / "gate_case_identity.json", {"status": "PASS" if not identity_failures else "PARTIAL", + "verified_runs": [(s, r, len(c)) for s, r, _, c, _ in built], + "skipped_runs": identity_failures}) + manifest["case_identity_skipped_runs"] = identity_failures + if not built: + fail("no run could be reproduced as the same test") + + model, dev, ctx = load_model() + w3["allowed_mask"] = {k: torch.as_tensor(v, dtype=torch.bool, device=dev) for k, v in w3["allowed_np"].items()} + manifest["device"] = dev + log("WA3 loaded strict 505/505 on %s" % dev) + + counts = np.array(manifest["answer_space"]["linkage_class_counts"], dtype=np.float64) + wts = counts[1:9] / counts[1:9].sum() + lk_name, lk_mod = find_linkage_embedding(model) + with torch.no_grad(): + w = torch.as_tensor(wts, dtype=torch.float32, device=lk_mod.weight.device) + HOOK["vec"] = (lk_mod.weight[1:9].detach().float() * w[:, None]).sum(0) + lk_mod.register_forward_hook(_linkage_hook) + manifest["neutral_unknown"] = {"module": lk_name, "rows_averaged": [1, 8], + "weights": [round(float(x), 6) for x in wts]} + log("neutral unknown = frequency-weighted mean of %s rows 1-8, weights %s" + % (lk_name, manifest["neutral_unknown"]["weights"])) + + arms_by_run = {} + for set_name, run, cfg, cases, excluded in built: + arms = {} + for arm, neutral in (("class9", False), ("neutral_unknown", True)): + t0 = time.time() + res = evaluate(model, dev, w3, cases, cfg["threshold"], blank_side_channels=True, neutral=neutral) + (OUT / set_name).mkdir(parents=True, exist_ok=True) + with _real_open(OUT / set_name / ("%s__%s.jsonl" % (run, arm)), "w") as fh: + for r in res: + fh.write(json.dumps(r) + "\n") + a = aggregate(res) + manifest.setdefault("aggregates", {})["%s/%s/%s" % (set_name, run, arm)] = a + log("%s/%s [%s]: exact-span %.4f | first choice %.4f | top5 %.4f | filled %.4f | acc filled %.4f (%.0fs)" + % (set_name, run, arm, a["iterative_exact_span_accuracy"], a["initial_exact_span_accuracy_top1"], + a["initial_exact_span_accuracy_top5"], a["iterative_resolved_fraction"], + a["iterative_accuracy_among_resolved"], time.time() - t0)) + arms[arm] = res + arms_by_run[(set_name, run)] = (cases, arms) + ctx.__exit__(None, None, None) + del model + log("BERTose arms complete; fitting baselines") + + BaselineStats.linkage_class = staticmethod(w3["exact_linkage"]) + stats, fit_counts = fit_baselines(w3, idx_rows, all_test_wurcs) + manifest["baseline_fit"] = fit_counts + report = {} + for (set_name, run), (cases, arms) in arms_by_run.items(): + preds = baseline_unit_preds(w3, stats, cases, set_data[set_name][1]) + report["%s/%s" % (set_name, run)] = decompose(cases, arms, preds) + write_json(OUT / "linkage_diagnosis.json", report) + manifest["finished"] = time.strftime("%Y-%m-%dT%H:%M:%S") + manifest["script_sha256"] = sha256_file(Path(__file__)) + manifest["status"] = "COMPLETE" if not identity_failures else "PARTIAL_RUNS_SKIPPED" + write_json(OUT / "run_manifest.json", manifest) + log("DONE") + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/iar_completion/originals/wa3_linkage_probe.py b/releases/2026-10-02/iar_completion/originals/wa3_linkage_probe.py new file mode 100644 index 0000000000000000000000000000000000000000..51905555d3b95ed9bd43d14060c02e07bf2dc7e5 --- /dev/null +++ b/releases/2026-10-02/iar_completion/originals/wa3_linkage_probe.py @@ -0,0 +1,1548 @@ +#!/usr/bin/env python3 +"""LINKAGE PROBE STUDY, child of wa3_linkage_diagnosis.py (sha 67949940..., job 16593043), 2026-09-25. + +Why is linkage completion weak? Frozen WA3, neutral-unknown linkage input, ordinary-linkage answer space. + 1. In-distribution check: development-partition parents (never trained on), one ordinary single-token linkage + masked per glycan, scored with the linkage class visible (true_class), set to 9 (class9) and neutral. + 2. Probe: hidden state entering the MLM vocabulary projection at the masked linkage, collected for training + parents (neutral input). Linear probes fitted on TRAINING parents only, epoch chosen on development: + * class probe -- 8 attachment-position classes (shared across letter pairs) + * token probe -- full ordinary linkage token + * guided -- MLM restricted to tokens of the class-probe's predicted class + scored on development, bench1392 and seal162 (single-token linkage cases, channels blanked, neutral). + 3. Strata on the benchmark (glycan size, acceptor-letter index) for MLM, probes and the three baselines. +Test glycans (exact or linkage-order-normalised identity) are excluded from every probe training/dev sample. + +Parent docstring follows. + +LINKAGE DIAGNOSIS, child of wa3_typed_strict_test.py (sha c6e9506d..., job 16592624), 2026-09-25. + +Linkage runs only (bench1392 linkage, seal162 linkage), channels blanked, ordinary-linkage answer space for all. +Two BERTose arms at masked linkage positions: + * class9 -- linkage class 9 (as the parent; reproduces it) + * neutral_unknown -- the linkage-class embedding at masked linkage positions is replaced (forward hook) by the + training-frequency-weighted mean of the ordinary class embeddings 1-8: "an ordinary + linkage, positions unknown", instead of 9, which in training marked only complex notation. +Saves each masked position's round-0 top-10, and writes linkage_diagnosis.json: per method (both arms, first +choice and IAR, three baselines) exact rate and error categories (right sugars/wrong positions, etc.), rank of +the truth in the top-10, and exact rates by attachment-position pair and by number of admissible positions. + +Parent docstring follows. + +STRICT typed-decoding DIAGNOSTIC, child of wa3_typed_test.py (sha 1341b005..., job 16591409), 2026-09-25. + +Question: is the controlled linkage failure a bug, or the class-9 input steering the model? In WA3 training a +masked token with linkage class 9 was always complex notation ('?' tokens are never MLM targets and simple +linkages always carry classes 1-8), so blanking to 9 asks for complex notation. Here linkage slots may only be +filled with tokens seen in ORDINARY linkages (class 1-8) in training, for BERTose and all baselines alike. +Residue slots are unchanged from the parent. truth_outside_answer_space reports any target this makes impossible. + +Parent docstring follows. + +TYPED-DECODING child of wa3_same_test.py (sha 0da5f247..., job 12847066), 2026-09-24. + +Only change: every method answers from the same, type-consistent answer space. + * BERTose: at a masked linkage piece (residue_id == -2) the softmax is taken only over tokens seen as + linkage pieces in WA3 training parents; at a masked residue piece (residue_id >= 0) only over tokens + seen as residue pieces. Specials, '?' ambiguity tokens and enumerated-alternative ('|') tokens are + excluded, because the test never scores them as correct (single_answer excludes '|' and '?'). + Probabilities are renormalised within the allowed set; threshold 0.80, 3 rounds, cases, inputs + (class 9 / depth 202 blanking) and metrics unchanged. + * Baselines: enumerated-alternative ('|') units are no longer prediction candidates, so all methods + choose from the same answer space. Their features/similarity are unchanged. +Runs: the four primary single-span runs only (bench1392 residue/linkage, seal162 residue/linkage at 0.80). + +Original docstring follows. + +WA3 rerun of the submitted held-out masking tests, on the SAME cases. + +Tests reproduced (both reported in the original submission): + * bench1392 -- 1,392 benchmark glycans (Supplementary Fig. 4; WA0 runs on Nova, 04-24) + * seal162 -- 162 paper-novel grey-seal milk glycans (Supplementary Fig. 5; WA0 runs 04-24/25) + +Same test, by construction: + 1. The untouched submitted harness (heldout_ipa_eval.py, sha 8d05a404...) rebuilds every WA0 case + with the submitted tokenizer, vocabulary, eligibility rule, seed 42 and mask plans. Every rebuilt + case must equal the WA0 run's own case_details.jsonl (case ids, masked positions, truth ids), + otherwise the job stops. + 2. Each masked WA0 span is mapped to its WURCS semantic unit(s). WA3 masks exactly those units. + 3. WA3 inputs are built exactly as WA3's training arrays were built: official WURCSArray helper + (Java) for branch structure + the frozen builder's repair + frozen 2,114-token BPE. A parity gate + rebuilds a sample of WA3 training parents and requires 100% agreement on all five channels. + 4. Filling, threshold, 3 rounds, top-k and every metric are identical to the harness. + +Reviewer 2 point 5 (irreducible uncertainty, simple baselines) is handled on the same cases: + * masked units that are curator-declared enumerations ('|') or unknown ('?') are flagged and + excluded from the single-answer score (reported separately, never silently dropped) + * each masked single linkage gets |A_chem| (chemically admissible acceptor positions; chance=1/k) + * marginal-frequency, context-frequency and nearest-neighbour baselines fitted on WA3's own + training parents (test glycans removed) are scored on the identical single-span cases + +Inference only on the frozen reported model (WA3, A1111, seed 42, epoch 58). No write-back. +""" +from __future__ import annotations + +import base64 +import builtins +import collections +import csv +import functools +import gzip +import hashlib +import importlib.util +import json +import os +import platform +import re +import shutil +import subprocess +import sys +import time +from pathlib import Path + +import numpy as np +import torch + +torch.set_num_threads(int(os.environ.get("NTHREADS", "16"))) +csv.field_size_limit(10 ** 9) + +PROJ = Path("/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training") +PKGD = PROJ / "data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" +WA0_HARNESS = PROJ / "writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py" +WA0_VOCAB = PROJ / "data/bpe_vocabulary_clean.json" +WA0_AMB = PROJ / "data/bpe_ambiguity_tokens.json" +WA0_CKPT_PATH = PROJ / "checkpoints_v5b_excluded/best_v5b_excluded_model.pt" # path only; never loaded +BENCH_DIR = PROJ / "writing/glycangt_heldout_ipa_validation" +SCHEMA_DIR = Path("/work/ratul1/supantha/glycan-SD-VS/review/iar_pipe_schema_20260823_r1") +JAVA_BIN = Path("/work/ratul1/supantha/miniconda3/envs/DeepGlycanSite/bin") +ROOT = Path("/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc") +TRAIN_MOD = ROOT / ("writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/" + "run_review_md_temporal_20x6_training_r3.py") +CK = ROOT / ("writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/" + "review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/" + "review_md20x6_checkpoint_best.pt") +CK_SHA = "8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82" + +WORK = Path(os.environ["WORK"]) +SCRIPT_SHA = hashlib.sha256(Path(__file__).read_bytes()).hexdigest() +OUT = WORK / "outputs" +JAVA_DIR = WORK / "inputs/java" + +EXPECTED_SHA = { + PKGD / "review_frozen_training_a5_wurcs_bpe.py": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4", + PKGD / "review_frozen_training_a5_topology.py": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7", + PKGD / "review_frozen_sequence_tree_runtime.py": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04", + PKGD / "review_bpe_vocabulary.json": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b", + PKGD / "review_bpe_ambiguity_tokens.json": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b", + PKGD / "review_sequence_parent_index.tsv.gz": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0", + PKGD / "review_token_ids.npy": "ec2d52dced65d22f0f218ff617d351fbd2930661bc8681e939990149d493537d", + PKGD / "review_residue_ids.npy": "36c96dcd3e03ba30e02e16f98d17605742627a37b37cd7824f2a745dd09dc044", + PKGD / "review_branch_depths.npy": "f39f76aa56a9bb782b2349f3ad1ca4ad16351ee1f06a8b9ae4b06bff9b1ebece", + PKGD / "review_linkage_types.npy": "89edb1940765928ced6f54e0d394f95c573eb9d96310b14dbd0adf8e20ac07c4", + PKGD / "review_attention_mask.npy": "01ed165720b9414e614dd7e7d75284a8886165f11138e16117ffcbe4e4bbf95c", + PKGD / "review_lengths.npy": "ade919d1e054c0ba852aa047bf873ac675f81a6c1f8a05cc73a0a2258131f021", + WA0_HARNESS: "8d05a4048e200625694ff9a36f50af89b845fd0d38ba8034a97a710e7ad3dce2", + WA0_VOCAB: "6a572afdf53f1494ab96c896876b824ca7ea749777352606aa9f96bf270ceecc", + WA0_AMB: "c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74", + JAVA_DIR / "review_A5WurcsArrayTreeAudit.java": "a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6", + JAVA_DIR / "review_wurcsframework-1.3.1.jar": "5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37", + JAVA_DIR / "review_MolWURCS.jar": "bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf", +} + +SEAL_RUNS = ["seal162_linkage_t080"] +BENCH_RUNS = ["benchmark1392_linkage_full"] +SETS = { + "bench1392": {"runs": BENCH_RUNS, "wa0_root": BENCH_DIR / "outputs", + "baseline_runs": ["benchmark1392_residue_full", "benchmark1392_linkage_full"]}, + "seal162": {"runs": SEAL_RUNS, "wa0_root": WORK / "inputs/wa0_seal", + "baseline_runs": ["seal162_residue_t080", "seal162_linkage_t080"]}, +} +ITERATIONS, TOP_K, MAX_LEN, BATCH = 3, 5, 256, 32 + +_real_open = builtins.open + + +def _guarded_open(f, *a, **k): + t = str(f) + if "locked_test" in t or "expert_audit_pool" in t: + raise SystemExit("FAIL-CLOSED: refused to open %s" % t) + return _real_open(f, *a, **k) + + +builtins.open = _guarded_open + + +def sha256_file(path: Path) -> str: + h = hashlib.sha256() + with _real_open(path, "rb") as fh: + for chunk in iter(lambda: fh.read(1 << 22), b""): + h.update(chunk) + return h.hexdigest() + + +def fail(msg: str): + raise SystemExit("FAIL-CLOSED: " + msg) + + +def log(msg: str) -> None: + print(time.strftime("%H:%M:%S"), msg, flush=True) + + +def write_json(path: Path, obj) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + tmp = path.with_suffix(path.suffix + ".tmp") + with _real_open(tmp, "w") as fh: + json.dump(obj, fh, indent=2) + tmp.replace(path) + + +# ============================================================== WA0: the submitted harness, untouched +def load_wa0_evaluator(): + spec = importlib.util.spec_from_file_location("heldout_ipa_eval_wa3_same_test", str(WA0_HARNESS)) + hie = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = hie + spec.loader.exec_module(hie) + + class _NoModelDistiller(hie.BPEIPADistiller): # same pattern as r2_05_baselines.py + def _load_model(self): + return torch.nn.Identity() + + hie.BPEIPADistiller = _NoModelDistiller + ev = hie.HeldoutIPAEvaluator(checkpoint=WA0_CKPT_PATH, vocab=WA0_VOCAB, ambiguity=WA0_AMB, device="cpu", + threshold=0.80, batch_size=32, top_k=TOP_K, max_length=MAX_LEN) + return hie, ev + + +def parse_wa0_summary(run_dir: Path) -> dict: + cfg = {} + for line in _real_open(run_dir / "summary.md"): + m = re.match(r"^- (\w+): `(.*)`\s*$", line.strip()) + if m and m.group(1) not in cfg: + cfg[m.group(1)] = m.group(2) + if "mask_plan" in cfg: + mask_plan = "" if cfg["mask_plan"] in ("", "single-span default") else cfg["mask_plan"] + else: # older summary.md files omit the line; the run's own case records carry it + with _real_open(run_dir / "case_details.jsonl") as fh: + mp = json.loads(fh.readline()).get("mask_plan", "") + mask_plan = mp if "," in mp or not re.fullmatch(r"(residue|linkage):1", mp or "") else "" + if int(cfg["iterations"]) != ITERATIONS or int(cfg["top_k"]) != TOP_K: + fail("%s used iterations=%s top_k=%s" % (run_dir.name, cfg["iterations"], cfg["top_k"])) + return {"threshold": float(cfg["threshold"]), "iterations": int(cfg["iterations"]), "top_k": int(cfg["top_k"]), + "selection_mode": cfg["selection_mode"], "max_cases_per_glycan": int(cfg["max_cases_per_glycan"]), + "span_types": [s.strip() for s in cfg["span_types"].split(",") if s.strip()], "mask_plan": mask_plan, + "input_csv": cfg.get("input_csv"), "checkpoint": cfg.get("checkpoint"), + "glycans_loaded": int(cfg["glycans_loaded"])} + + +def wa0_units(ev, wurcs): + """Mirror of HeldoutIPAEvaluator._tokenize_with_spans, adding the global non-special unit index.""" + tok = ev.tokenizer.tokenize(wurcs, max_length=ev.max_length) + unp = tok["tokens"][: tok["length"]] + recs, cur, g = [], 0, 0 + for u in ev.tokenizer.pre_tokenizer.pre_tokenize(wurcs): + pieces = [u["text"]] if u["type"] == "special" else list(ev.tokenizer.apply_bpe(u["text"])) + s, e = cur, cur + len(pieces) - 1 + cur += len(pieces) + if u["type"] == "special": + continue + gi = g + g += 1 + if e >= len(unp) or unp[s:e + 1] != pieces: + continue + recs.append({"start": s, "end": e, "unit_type": u["type"], "unit_text": u["text"], "g": gi}) + _, spans, _ = ev._tokenize_with_spans(wurcs) + if [(r["start"], r["end"], r["unit_type"], r["unit_text"]) for r in recs] != \ + [(sp.start, sp.end, sp.unit_type, sp.unit_text) for sp in spans]: + fail("WA0 unit geometry differs from the harness for %s" % wurcs[:80]) + return recs + + +def rebuild_wa0_cases(hie, ev, rows, run_dir: Path): + cfg = parse_wa0_summary(run_dir) + if cfg["glycans_loaded"] != len(rows): + fail("%s loaded %d glycans, input has %d" % (run_dir.name, cfg["glycans_loaded"], len(rows))) + mask_req = hie.parse_mask_plan(cfg["mask_plan"]) + span_types = sorted(set(cfg["span_types"]) | set(mask_req)) if mask_req else cfg["span_types"] + cases, _ = ev.build_cases(rows=rows, span_types=span_types, selection_mode=cfg["selection_mode"], + max_cases_per_glycan=cfg["max_cases_per_glycan"], seed=42, mask_requirements=mask_req) + reported = {} + with _real_open(run_dir / "case_details.jsonl") as fh: + for line in fh: + r = json.loads(line) + reported[r["case_id"]] = r + if {c.case_id for c in cases} != set(reported): + fail("%s: rebuilt %d cases vs reported %d (ids differ)" % (run_dir.name, len(cases), len(reported))) + out = [] + for c in cases: + rep = reported[c.case_id] + if list(rep["positions"]) != list(c.positions) or list(rep["truth_token_ids"]) != list(c.truth_token_ids): + fail("%s: case %s positions/truth differ from the reported run" % (run_dir.name, c.case_id)) + pos = set(c.positions) + chosen = [r for r in wa0_units(ev, c.wurcs) if all(p in pos for p in range(r["start"], r["end"] + 1))] + covered = {p for r in chosen for p in range(r["start"], r["end"] + 1)} + if covered != pos: + fail("%s: case %s masked positions do not decompose into whole units" % (run_dir.name, c.case_id)) + out.append({"case_id": c.case_id, "glycan_index": c.glycan_index, "wurcs": c.wurcs, "mask_plan": c.mask_plan, + "units": [{"g": r["g"], "unit_type": r["unit_type"], "unit_text": r["unit_text"]} for r in chosen], + "wa0_iterative_span_exact": bool(rep["iterative_span_exact"]), + "wa0_initial_span_exact_top1": bool(rep["initial_span_exact_top1"]), + "wa0_resolved_all": int(rep["resolved_count"]) == len(rep["positions"])}) + return cfg, out + + +# ============================================================== WA3: frozen tokenizer + official helper +def build_wa3_tokenizer(): + shim = WORK / "shim" + if shim.exists(): + shutil.rmtree(shim) + pkg = shim / "frozen_training" + pkg.mkdir(parents=True) + (pkg / "__init__.py").write_text("") + shutil.copy(PKGD / "review_frozen_training_a5_topology.py", pkg / "a5_topology.py") + shutil.copy(PKGD / "review_frozen_training_a5_wurcs_bpe.py", pkg / "a5_wurcs_bpe.py") + src = (PKGD / "review_frozen_sequence_tree_runtime.py").read_text() + src = (src.replace("from training.a5_topology import", "from frozen_training.a5_topology import") + .replace("from training.a5_wurcs_bpe import", "from frozen_training.a5_wurcs_bpe import")) + if src.count("from frozen_training.") != 2: + fail("tree-runtime import rewrite did not hit exactly two lines") + (shim / "frozen_tree_runtime.py").write_text(src) + sys.path.insert(0, str(PROJ)) + sys.path.insert(0, str(shim)) + import frozen_training.a5_wurcs_bpe as fab # noqa: E402 + import frozen_tree_runtime as ftr # noqa: E402 + for mod in (fab, ftr): + if not str(Path(mod.__file__).resolve()).startswith(str(shim.resolve())): + fail("frozen module resolved outside the shim: %s" % mod.__file__) + if int(ftr.BRANCH_DEPTH_UNKNOWN) != 202: + fail("BRANCH_DEPTH_UNKNOWN != 202") + tok = ftr.ReviewA5WURCSBPETokenizerV3(PKGD / "review_bpe_vocabulary.json") + tok.apply_bpe = functools.lru_cache(maxsize=None)(tok.apply_bpe) + semantic = fab.A5WURCSPreTokenizer() + vocab = json.load(_real_open(PKGD / "review_bpe_vocabulary.json")) + t2i = {k: int(v) for k, v in vocab["token_to_id"].items()} + if len(t2i) != 2114 or sorted(t2i.values()) != list(range(2114)): + fail("WA3 vocabulary is not 2,114 contiguous ids") + specials = {int(v) for v in vocab["special_tokens"].values()} + amb = json.load(_real_open(PKGD / "review_bpe_ambiguity_tokens.json")) + amb_map = {str(t): int(i) for t, i in amb["ambiguous_tokens"].items()} + if set(amb_map.values()) != {int(x) for x in amb["ambiguous_ids"]}: + fail("WA3 ambiguity map ids and token dict disagree") + if any(t2i.get(t) != i for t, i in amb_map.items()) or not all("?" in t for t in amb_map): + fail("WA3 ambiguity map disagrees with the vocabulary") + return {"tok": tok, "semantic": semantic, "exact_linkage": ftr.ReviewA5WURCSPreTokenizerV3.exact_linkage_type, + "t2i": t2i, "i2t": {v: k for k, v in t2i.items()}, "invalid": specials | set(amb_map.values()), + "n_specials": len(specials), "n_ambiguity": len(amb_map), "mask_id": t2i["[MASK]"], + "branch_open_id": t2i["[BRANCH_OPEN]"], "linkage_unknown": int(ftr.LINKAGE_UNKNOWN), + "branch_depth_unknown": int(ftr.BRANCH_DEPTH_UNKNOWN)} + + +def compile_java_helper(): + classes = WORK / "java_classes" + if classes.exists(): + shutil.rmtree(classes) + src = WORK / "java_src/review/a5/A5WurcsArrayTreeAudit.java" + src.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(JAVA_DIR / "review_A5WurcsArrayTreeAudit.java", src) + classes.mkdir(parents=True) + cp = os.pathsep.join([str(JAVA_DIR / "review_wurcsframework-1.3.1.jar"), str(JAVA_DIR / "review_MolWURCS.jar")]) + subprocess.run([str(JAVA_BIN / "javac"), "-cp", cp, "-d", str(classes), str(src)], check=True) + return os.pathsep.join([str(classes), cp]) + + +def run_java_helper(classpath, wurcs_list): + payload = "".join("%d\t%s\n" % (i, base64.urlsafe_b64encode(w.encode()).decode().rstrip("=")) + for i, w in enumerate(wurcs_list)) + res = subprocess.run([str(JAVA_BIN / "java"), "-cp", classpath, "review.a5.A5WurcsArrayTreeAudit"], + input=payload, text=True, capture_output=True, check=True) + lines = res.stdout.splitlines() + if len(lines) != len(wurcs_list): + fail("official helper returned %d lines for %d inputs" % (len(lines), len(wurcs_list))) + out = [] + for i, line in enumerate(lines): + f = line.split("\t") + if int(f[0]) != i: + fail("official helper row order drift at %d" % i) + if len(f) < 2 or f[1] == "ERROR": # frozen builder semantics for ERROR rows + out.append({"rooted": False, "depths": (), "parents": (), "helper_error": True}) + continue + if len(f) < 27: + fail("official helper output truncated at row %d" % i) + rooted = f[20] == "true" + n = int(f[2]) + dec = lambda v: base64.urlsafe_b64decode(v + "=" * ((4 - len(v) % 4) % 4)).decode() # noqa: E731 + depths = tuple(int(x) for x in dec(f[24]).split(",")) if rooted else () + parents = tuple(int(x) for x in dec(f[26]).split(",")) if rooted else () + if rooted and (len(depths) != n or len(parents) != n): + fail("official rooted cardinality drift at row %d" % i) + out.append({"rooted": rooted, "depths": depths, "parents": parents, "helper_error": False}) + return out + + +def wa3_encode(w3, wurcs, auth): + """Frozen builder transform (review_build_official_sequence_topology_successor.py) + unit spans.""" + units = [dict(u) for u in w3["semantic"].pre_tokenize(wurcs) if u.get("text") != "[BRANCH_OPEN]"] + child = collections.Counter(v for v in auth["parents"] if v >= 0) + seen, repaired = set(), [] + for u in units: + u.pop("distance_matrix", None) + rid = int(u.get("residue_id", -1)) + u["linkage_type"] = 0 + if rid >= 0: + depth = int(auth["depths"][rid]) if auth["rooted"] else 202 + u["branch_depth"] = depth + if rid not in seen: + repaired.extend({"text": "[BRANCH_OPEN]", "type": "special", "residue_id": -1, + "branch_depth": depth, "linkage_type": 0} + for _ in range(max(0, child[rid] - 1))) + seen.add(rid) + else: + u["branch_depth"] = 0 + if u.get("type") == "linkage": + u["linkage_type"] = w3["exact_linkage"](str(u["text"])) + repaired.append(u) + pieces, spans, g, ords = [], [], 0, collections.Counter() + for u in repaired: + ps = [str(u["text"])] if u["type"] == "special" else list(w3["tok"].apply_bpe(str(u["text"]))) + s = len(pieces) + pieces.extend((p, int(u["residue_id"]), int(u["branch_depth"]), int(u["linkage_type"])) for p in ps) + if u["type"] != "special": + spans.append({"g": g, "start": s, "end": len(pieces) - 1, "unit_type": u["type"], + "unit_text": str(u["text"]), "ordinal": ords[u["type"]]}) + ords[u["type"]] += 1 + g += 1 + full = len(pieces) + capped = pieces[:255] + [("[END]", -1, 0, 0)] if full > 256 else list(pieces) + L = len(capped) + unk, pad = w3["t2i"]["[UNK]"], w3["t2i"]["[PAD]"] + enc = {"token_ids": [w3["t2i"].get(p[0], unk) for p in capped] + [pad] * (256 - L), + "residue_ids": [p[1] for p in capped] + [-1] * (256 - L), + "branch_depths": [p[2] for p in capped] + [0] * (256 - L), + "linkage_types": [p[3] for p in capped] + [0] * (256 - L), + "attention_mask": [1] * L + [0] * (256 - L), "length": L, "full_length": full, + "tokens": [p[0] for p in capped]} + return enc, spans + + +def parity_gate(w3, classpath, idx_rows): + arrays = {k: np.load(PKGD / ("review_%s.npy" % k), mmap_mode="r") + for k in ("token_ids", "residue_ids", "branch_depths", "linkage_types", "attention_mask")} + sample = [i for i in range(0, len(idx_rows), 97) if idx_rows[i]["truncated_at_256"] != "True"] + auths = run_java_helper(classpath, [idx_rows[i]["canonical_wurcs"] for i in sample]) + counts, bad = collections.Counter(), [] + for i, auth in zip(sample, auths): + enc, _ = wa3_encode(w3, idx_rows[i]["canonical_wurcs"], auth) + ok_all = True + for k, arr in arrays.items(): + same = np.array_equal(np.asarray(enc[k], dtype=np.int64), np.asarray(arr[i], dtype=np.int64)) + counts[k] += int(same) + ok_all &= same + counts["all"] += int(ok_all) + counts["helper_error"] += int(auth["helper_error"]) + if not ok_all and len(bad) < 10: + bad.append(idx_rows[i]["parent_glycorpus_id"]) + res = {"rows": len(sample), "matches": dict(counts), "mismatch_parents": bad, + "rule": "every 97th sequence_row excluding truncated_at_256; official helper + frozen transform"} + res["status"] = "PASS" if counts["all"] == len(sample) else "FAIL" + return res + + +# ============================================================== exposure of test glycans to WA3 +def wurcs_sections(w): + body = w[6:] if w.startswith("WURCS=") else w + out, buf, depth = [], [], 0 + for ch in body: + depth += (ch == "[") - (ch == "]") + if ch == "/" and depth == 0: + out.append("".join(buf)) + buf = [] + else: + buf.append(ch) + out.append("".join(buf)) + return out + + +def lin_key(w): + s = wurcs_sections(w) + if len(s) < 5: + return w + return "WURCS=" + "/".join(s[:4] + ["_".join(sorted(x for x in "/".join(s[4:]).split("_") if x))]) + + +def exposure_lookup(idx_rows): + exact, keyed = collections.defaultdict(list), collections.defaultdict(list) + for r in idx_rows: + exact[r["canonical_wurcs"]].append(r) + keyed[lin_key(r["canonical_wurcs"])].append(r) + priority = ["pretraining_train", "pretraining_development", "excluded_exact_or_verified_graph_identity"] + + def look(w): + hits = {id(r): r for r in exact.get(w, []) + keyed.get(lin_key(w), [])}.values() + if not hits: + return {"wa3_partition": "absent_from_wa3_sequence_parents", "wa3_match_mode": "none", "wa3_parent_id": ""} + parts = {r["pretraining_partition"] for r in hits} + best = next((p for p in priority if p in parts), sorted(parts)[0]) + hit = next(r for r in hits if r["pretraining_partition"] == best) + mode = "exact" if hit["canonical_wurcs"] == w else "lin_order_insensitive" + return {"wa3_partition": best, "wa3_match_mode": mode, "wa3_parent_id": hit["parent_glycorpus_id"]} + return look + + +# ============================================================== A_chem (verbatim logic from iar_achem_q_20260824_r1/a.py) +def load_achem(): + sys.path.insert(0, str(SCHEMA_DIR)) + from pipelib import parse_record, SIDE_RE, node_index # noqa: E402 + from classify import PLAIN_LINK # noqa: E402 + no_oh = set("Amd") + + def a_chem(rec, ai, skip_li): + occ = set() + for ei, e in enumerate([x for x in rec["lin"].split("_") if x]): + if ei == skip_li: + continue + m = PLAIN_LINK.match(e) + if not m: + continue + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if sm and sm.group(2) != "?": + try: + if node_index(sm.group(1)) - 1 == ai: + occ.add(int(sm.group(2))) + except ValueError: + pass + sk = rec["skel"][ai] + if not sk: + return None, "no_skeleton" + n = len(sk) + if n < 3: + return None, "skeleton_lt_3" + if n > 12: + return None, "skeleton_gt_12" + free = set(range(1, n + 1)) + if rec["anom"][ai] is not None: + free.discard(rec["anom"][ai]) + rg = rec["ring"][ai] + if rg and rg[1] != "?": + try: + free.discard(int(rg[1])) + except ValueError: + pass + free -= set(rec["subs"][ai]) + for p, ch in enumerate(sk, 1): + if ch in no_oh: + free.discard(p) + return free - occ, "ok" + + def for_linkage(wurcs, entry): + rec = parse_record(wurcs) + if rec is None or not rec["lin"]: + return {"achem_status": "unparsable"} + ents = [x for x in rec["lin"].split("_") if x] + if ents.count(entry) != 1: + return {"achem_status": "entry_not_unique_in_lin"} + li = ents.index(entry) + m = PLAIN_LINK.match(entry) + if not m: + return {"achem_status": "not_plain_linkage"} + sides = [] + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if not sm or sm.group(2) == "?": + return {"achem_status": "side_unparsable"} + try: + sides.append((node_index(sm.group(1)) - 1, int(sm.group(2)))) + except ValueError: + return {"achem_status": "bad_label"} + donor_flags = [0 <= ai < rec["nres"] and rec["anom"][ai] is not None and rec["anom"][ai] == p for ai, p in sides] + if donor_flags.count(True) != 1: + return {"achem_status": "orientation_undetermined"} + ai, truth_pos = sides[donor_flags.index(False)] + A, why = a_chem(rec, ai, li) + if A is None: + return {"achem_status": why} + k = len(A) + return {"achem_status": "ok", "achem_k": k, "achem_positions": sorted(A), "truth_in_achem": truth_pos in A, + "achem_chance": (1.0 / k) if k else None} + return for_linkage + + +# ============================================================== WA3 cases, model, evaluation +def build_wa3_cases(w3, wa0_cases, encodings, look): + cases, excluded = [], collections.Counter() + for c in wa0_cases: + enc, spans = encodings[c["wurcs"]] + by_g = {s["g"]: s for s in spans} + positions, texts = [], [] + for u in c["units"]: + s = by_g.get(u["g"]) + if s is None or s["unit_text"] != u["unit_text"] or s["unit_type"] != u["unit_type"]: + fail("unit mapping mismatch for %s unit %s" % (c["case_id"], u)) + positions.extend(range(s["start"], s["end"] + 1)) + texts.append(u["unit_text"]) + if max(positions) >= enc["length"] - (1 if enc["full_length"] > 256 else 0): + excluded["wa3_truncated_beyond_256"] += 1 + continue + truth = [enc["token_ids"][p] for p in positions] + masked = list(enc["token_ids"]) + for p in positions: + masked[p] = w3["mask_id"] + flags = {"enumerated_alternative": any("|" in t for t in texts), + "unknown_question_mark": any("?" in t for t in texts), + "wa3_truth_uses_invalid_token": any(t in w3["invalid"] for t in truth)} + flags["single_answer"] = not any(flags.values()) + lt_blank, bd_blank = list(enc["linkage_types"]), list(enc["branch_depths"]) + # Blank the channels that encode the hidden unit, honouring WA3's own input contract + # (composite_r4.validate_sequence_surface:584-592): linkage pieces are exactly residue_id == -2 and + # must keep a nonzero linkage class; non-residue pieces must keep branch depth 0. + for p in positions: + if enc["residue_ids"][p] == -2: + lt_blank[p] = w3["linkage_unknown"] # 9 = the class WA3 already uses for '?' linkages + elif enc["residue_ids"][p] >= 0: + bd_blank[p] = w3["branch_depth_unknown"] # 202 = the depth WA3 uses when the tree is not rooted + cases.append({**{k: c[k] for k in ("case_id", "glycan_index", "wurcs", "mask_plan", "units", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")}, + "unit_text": " | ".join("%s:%s" % (u["unit_type"], u["unit_text"]) for u in c["units"]), + "positions": positions, "truth_ids": truth, "masked_ids": masked, + "attention_mask": enc["attention_mask"], "residue_ids": enc["residue_ids"], + "branch_depths": enc["branch_depths"], "linkage_types": enc["linkage_types"], + "branch_depths_blank": bd_blank, "linkage_types_blank": lt_blank, + **flags, **look(c["wurcs"])}) + return cases, dict(excluded) + + +def all_absent(B, dev): # contract from iar_bytype3_20260825_r1/bytype.py (job 12094273) + return {"ms_token_ids": torch.empty((0, 64), dtype=torch.long, device=dev), + "ms_attention_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), + "ms_input_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), "ms_labels": None, + "ms_acquisition_parent_indices": torch.empty((0,), dtype=torch.long, device=dev), + "ms_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), "ms_mode": "development", + "static_token_ids": torch.zeros((B, 1, 4), dtype=torch.long, device=dev), + "static_attention_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), + "static_residue_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_slot_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_state_mask": torch.zeros((B, 1), dtype=torch.bool, device=dev), + "static_state_ids": torch.full((B, 1), -1, dtype=torch.long, device=dev), + "static_input_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), "static_labels": None, + "static_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), + "md_values": torch.zeros((B, 2, 20, 6), dtype=torch.float32, device=dev), + "md_feature_mask": torch.zeros((B, 2, 20, 6), dtype=torch.bool, device=dev), + "md_child_present_mask": torch.zeros((B, 2), dtype=torch.bool, device=dev), + "md_state_row_ids": torch.full((B, 2), -1, dtype=torch.long, device=dev), + "md_window_input_mask": torch.zeros((B, 2, 20), dtype=torch.bool, device=dev), "md_labels": None, + "md_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev)} + + +def load_model(): + spec = importlib.util.spec_from_file_location("wa3_train_mod", str(TRAIN_MOD)) + tm = importlib.util.module_from_spec(spec) + sys.modules["wa3_train_mod"] = tm + spec.loader.exec_module(tm) + if sha256_file(CK) != CK_SHA: + fail("WA3 checkpoint sha mismatch") + ctx = tm.native_authority(None, static_active=False) + _native, r8, _static, _runner = ctx.__enter__() + r5 = r8._core._r6._r5 + if int(r5.SEQUENCE_VOCAB_SIZE) != 2114: + fail("r5.SEQUENCE_VOCAB_SIZE != 2114") + model = tm.mdcore.make_md_enabled_composite_class(r5)(r8.NativeEightConfig(cell_id="A111", seq_vocab_size=2114), + md_cell_id="A1111", md_temporal_size=128) + ck = torch.load(CK, map_location="cpu", weights_only=False) + if str(ck.get("md_cell_id")) != "A1111" or int(ck["selection"]["best_epoch"]) != 58: + fail("checkpoint identity is not A1111 / best epoch 58") + model.load_state_dict(ck["model_state"], strict=True) + n_par = sum(p.numel() for p in model.parameters()) + if n_par != 138487995 or len(model.state_dict()) != 505: + fail("WA3 inventory %d params / %d tensors" % (n_par, len(model.state_dict()))) + model.eval() + dev = "cuda" if torch.cuda.is_available() else "cpu" + model.to(dev) + return model, dev, ctx + + +def evaluate(model, dev, w3, cases, threshold, blank_side_channels=False, neutral=False): + bd_key = "branch_depths_blank" if blank_side_channels else "branch_depths" + lt_key = "linkage_types_blank" if blank_side_channels else "linkage_types" + results = [] + for b0 in range(0, len(cases), BATCH): + batch = cases[b0:b0 + BATCH] + current = [list(c["masked_ids"]) for c in batch] + unresolved = [set(c["positions"]) for c in batch] + initial, accepted = [[] for _ in batch], [[] for _ in batch] + top10 = [[] for _ in batch] + for it in range(ITERATIONS): + t = lambda key: torch.tensor([c[key] for c in batch], dtype=torch.long, device=dev) # noqa: E731 + HOOK["mask"] = None + if neutral: + m = torch.zeros((len(batch), len(batch[0]["masked_ids"])), dtype=torch.bool) + for ci, c in enumerate(batch): + for p in c["positions"]: + if c["residue_ids"][p] == -2: + m[ci, p] = True + HOOK["mask"] = m.to(dev) + with torch.inference_mode(): + o = model(seq_token_ids=torch.tensor(current, dtype=torch.long, device=dev), + seq_attention_mask=t("attention_mask").bool(), seq_residue_ids=t("residue_ids"), + seq_branch_depths=t(bd_key), seq_linkage_types=t(lt_key), + seq_labels=None, topology_labels=None, topology_available=None, + **all_absent(len(batch), torch.device(dev))) + HOOK["mask"] = None + logits = o.sequence_logits.float() + if w3["allowed_mask"]["linkage"].shape[0] != logits.shape[-1]: + fail("answer-space mask size %d != model vocabulary %d" + % (w3["allowed_mask"]["linkage"].shape[0], logits.shape[-1])) + progress = 0 + for ci, c in enumerate(batch): + if not unresolved[ci]: + continue + for li, pos in enumerate(c["positions"]): + rid = c["residue_ids"][pos] + if rid != -2 and rid < 0: + fail("masked position %d of %s is neither a residue nor a linkage piece" % (pos, c["case_id"])) + allow = w3["allowed_mask"]["linkage" if rid == -2 else "residue"] + row = logits[ci, pos].masked_fill(~allow, float("-inf")) + tp10, ti10 = torch.topk(torch.softmax(row, dim=-1), k=10) + tp, ti = tp10[:TOP_K], ti10[:TOP_K] + ids = [int(x) for x in ti.tolist()] + if it == 0: + top10[ci].append([[w3["i2t"][int(i)], round(float(p), 4)] + for p, i in zip(tp10.tolist(), ti10.tolist())]) + initial[ci].append((ids[0] == c["truth_ids"][li], c["truth_ids"][li] in ids)) + if pos not in unresolved[ci]: + continue + if float(tp[0]) < threshold or ids[0] in w3["invalid"]: + continue + current[ci][pos] = ids[0] + unresolved[ci].remove(pos) + progress += 1 + accepted[ci].append(it + 1) + if progress == 0: + break + for ci, c in enumerate(batch): + final = [current[ci][p] for p in c["positions"]] + correct = [f == t for f, t in zip(final, c["truth_ids"])] + results.append({k: c[k] for k in ("case_id", "glycan_index", "mask_plan", "unit_text", "single_answer", + "enumerated_alternative", "unknown_question_mark", + "wa3_truth_uses_invalid_token", "wa3_partition", "wa3_match_mode", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")} + | {"num_masked_positions": len(c["positions"]), + "truth_tokens": [w3["i2t"][x] for x in c["truth_ids"]], + "final_tokens": [w3["i2t"][x] for x in final], + "initial_top1_correct_count": sum(a for a, _ in initial[ci]), + "initial_top5_correct_count": sum(b for _, b in initial[ci]), + "resolved_count": len(c["positions"]) - len(unresolved[ci]), + "final_correct_count": sum(correct), + "initial_span_exact_top1": all(a for a, _ in initial[ci]), + "initial_span_exact_top5": all(b for _, b in initial[ci]), + "iterative_span_exact": all(correct), + "iterations_used": max(accepted[ci], default=0), + "initial_top10": top10[ci]}) + return results + + +def aggregate(rs): # identical formulas to HeldoutIPAEvaluator._aggregate_slice + n = len(rs) + if not n: + return {"num_cases": 0} + pos = sum(r["num_masked_positions"] for r in rs) + res = sum(r["resolved_count"] for r in rs) + cor = sum(r["final_correct_count"] for r in rs) + return {"num_cases": n, "num_masked_positions": pos, "avg_masked_positions_per_case": pos / n, + "initial_top1_token_accuracy": sum(r["initial_top1_correct_count"] for r in rs) / pos, + "initial_top5_token_accuracy": sum(r["initial_top5_correct_count"] for r in rs) / pos, + "initial_exact_span_accuracy_top1": sum(bool(r["initial_span_exact_top1"]) for r in rs) / n, + "initial_exact_span_accuracy_top5": sum(bool(r["initial_span_exact_top5"]) for r in rs) / n, + "iterative_resolved_fraction": res / pos, + "iterative_accuracy_among_resolved": (cor / res) if res else 0.0, + "iterative_final_token_accuracy": cor / pos, + "iterative_exact_span_accuracy": sum(bool(r["iterative_span_exact"]) for r in rs) / n, + "avg_iterations_used_per_case": sum(r["iterations_used"] for r in rs) / n} + + +def paired(rs): + n = len(rs) + if not n: + return {"n": 0} + a = [bool(r["wa0_iterative_span_exact"]) for r in rs] + b = [bool(r["iterative_span_exact"]) for r in rs] + return {"n": n, "wa0_exact_span": sum(a) / n, "wa3_exact_span": sum(b) / n, + "both": sum(x and y for x, y in zip(a, b)), "wa0_only": sum(x and not y for x, y in zip(a, b)), + "wa3_only": sum(y and not x for x, y in zip(a, b)), "neither": sum(not x and not y for x, y in zip(a, b))} + + +# ============================================================== R2-05 baselines (port of r2_05_baselines.py) +class BaselineStats: + def __init__(self): + self.marginal = collections.defaultdict(collections.Counter) + self.ctx_pair = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.ctx_prev = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.n_glycans = 0 + self.feature_ids, self._feats, self._donor = {}, [], collections.defaultdict(list) + self.text_ids, self.texts, self.donor_index = {}, [], {} + + def _tid(self, text): + if text not in self.text_ids: + self.text_ids[text] = len(self.texts) + self.texts.append(text) + return self.text_ids[text] + + def add(self, index, unpadded, records): + self.n_glycans += 1 + feats = set() + for r in records: + key = (r["unit_type"], r["unit_text"]) + feats.add(self.feature_ids.setdefault(key, len(self.feature_ids))) + if not r["eligible"] or "|" in r["unit_text"]: # typed child: same answer space as BERTose + continue + if r["unit_type"] == "linkage" and not 1 <= BaselineStats.linkage_class(r["unit_text"]) <= 8: + continue # strict child: ordinary linkages only, as for BERTose + ut, text = r["unit_type"], r["unit_text"] + self.marginal[ut][text] += 1 + prev_t = unpadded[r["start"] - 1] if r["start"] > 0 else "" + next_t = unpadded[r["end"] + 1] if r["end"] + 1 < len(unpadded) else "" + self.ctx_pair[ut][(prev_t, next_t)][text] += 1 + self.ctx_prev[ut][prev_t][text] += 1 + self._donor[(ut, r["ordinal"])].append((index, self._tid(text))) + self._feats.append(sorted(feats)) + + def finalize(self): + counts = np.zeros(len(self.feature_ids) + 1, dtype=np.int64) + for fs in self._feats: + for f in fs: + counts[f + 1] += 1 + self.indptr = np.cumsum(counts) + self.rows = np.zeros(int(self.indptr[-1]), dtype=np.int32) + fill = self.indptr[:-1].copy() + for gid, fs in enumerate(self._feats): + for f in fs: + self.rows[fill[f]] = gid + fill[f] += 1 + self.sizes = np.array([len(fs) for fs in self._feats], dtype=np.int64) + self._feats = [] + for key, pairs in self._donor.items(): + pairs.sort() + self.donor_index[key] = (np.array([p[0] for p in pairs], dtype=np.int64), + np.array([p[1] for p in pairs], dtype=np.int64)) + self._donor = {} + + @staticmethod + def _argmax(counter): + total = sum(counter.values()) + text = min(counter.items(), key=lambda kv: (-kv[1], kv[0]))[0] + return text, counter[text] / total + + def marginal_pred(self, ut): + return self._argmax(self.marginal[ut]) if self.marginal.get(ut) else (None, 0.0) + + def context_pred(self, ut, prev_t, next_t): + c = self.ctx_pair.get(ut, {}).get((prev_t, next_t)) + if c: + return self._argmax(c)[0], "prev_next" + c = self.ctx_prev.get(ut, {}).get(prev_t) + if c: + return self._argmax(c)[0], "prev_only" + return self.marginal_pred(ut)[0], "marginal_backoff" + + def nn_pred(self, ut, ordinal, query_keys): + donor = self.donor_index.get((ut, ordinal)) + if donor is None: + return None + cand_idx, cand_txt = donor + fids = [self.feature_ids[k] for k in query_keys if k in self.feature_ids] + if fids: + rows = np.concatenate([self.rows[self.indptr[f]:self.indptr[f + 1]] for f in fids]) + inter = np.bincount(rows, minlength=self.n_glycans)[cand_idx].astype(np.float64) + else: + inter = np.zeros(len(cand_idx)) + union = self.sizes[cand_idx] + len(query_keys) - inter + jac = np.divide(inter, union, out=np.zeros_like(inter), where=union > 0) + return self.texts[int(cand_txt[int(np.argmax(jac))])] + + +def fit_baselines(w3, idx_rows, test_wurcs): + token_ids = np.load(PKGD / "review_token_ids.npy", mmap_mode="r") + lengths = np.load(PKGD / "review_lengths.npy", mmap_mode="r") + stats, counts, bo, unk = BaselineStats(), collections.Counter(), w3["branch_open_id"], w3["t2i"]["[UNK]"] + test_keys = {lin_key(w) for w in test_wurcs} + for i, r in enumerate(idx_rows): + if r["pretraining_partition"] != "pretraining_train" or r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + counts["removed_test_glycan"] += 1 + continue + L = int(lengths[i]) + ids = [int(x) for x in token_ids[i, :L]] + p, recs, ords, ok = 0, [], collections.Counter(), True + for u in w3["semantic"].pre_tokenize(w): + if u.get("text") == "[BRANCH_OPEN]": + continue + while p < L and ids[p] == bo: + p += 1 + ps = [u["text"]] if u["type"] == "special" else list(w3["tok"].apply_bpe(u["text"])) + pid = [w3["t2i"].get(x, unk) for x in ps] + if ids[p:p + len(pid)] != pid: + ok = False + break + if u["type"] != "special": + recs.append({"start": p, "end": p + len(pid) - 1, "unit_type": u["type"], "unit_text": u["text"], + "ordinal": ords[u["type"]], "eligible": not any(x in w3["invalid"] for x in pid)}) + ords[u["type"]] += 1 + p += len(pid) + while ok and p < L and ids[p] == bo: + p += 1 + if not ok or p != L: + counts["unit_walk_mismatch"] += 1 + continue + stats.add(counts["fitted"], [w3["i2t"][x] for x in ids], recs) + counts["fitted"] += 1 + stats.finalize() + return stats, dict(counts) + + +def build_allowed(w3, idx_rows, test_wurcs): + """Type-consistent answer space: token ids seen at linkage / residue pieces in WA3 training parents.""" + token_ids = np.load(PKGD / "review_token_ids.npy", mmap_mode="r") + residue_ids = np.load(PKGD / "review_residue_ids.npy", mmap_mode="r") + linkage_types = np.load(PKGD / "review_linkage_types.npy", mmap_mode="r") + lengths = np.load(PKGD / "review_lengths.npy", mmap_mode="r") + test_keys = {lin_key(w) for w in test_wurcs} + V = len(w3["t2i"]) + seen = {"linkage": np.zeros(V, dtype=bool), "residue": np.zeros(V, dtype=bool)} + rows = 0 + class_counts = np.zeros(10, dtype=np.int64) + for i, r in enumerate(idx_rows): + if r["pretraining_partition"] != "pretraining_train" or r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + continue + L = int(lengths[i]) + ids, rid = np.asarray(token_ids[i, :L]), np.asarray(residue_ids[i, :L]) + lt = np.asarray(linkage_types[i, :L]) + class_counts += np.bincount(lt[rid == -2], minlength=10)[:10] + seen["linkage"][ids[(rid == -2) & (lt >= 1) & (lt <= 8)]] = True # strict: ordinary linkages only + seen["residue"][ids[rid >= 0]] = True + rows += 1 + bad = np.zeros(V, dtype=bool) + bad[sorted(w3["invalid"])] = True + pipe = [i for t, i in w3["t2i"].items() if "|" in t] + bad[pipe] = True + allowed = {k: v & ~bad for k, v in seen.items()} + info = {"training_rows_scanned": rows, "vocab": V, "invalid_excluded": len(w3["invalid"]), + "pipe_tokens_excluded": len(pipe), + "linkage_tokens_seen": int(seen["linkage"].sum()), "residue_tokens_seen": int(seen["residue"].sum()), + "linkage_tokens_allowed": int(allowed["linkage"].sum()), + "residue_tokens_allowed": int(allowed["residue"].sum()), + "linkage_class_counts": class_counts.tolist()} + return allowed, info + + +def truth_outside(w3, cases): + """Cases whose true token at some masked position lies outside the allowed answer space.""" + n = 0 + for c in cases: + for pos, t in zip(c["positions"], c["truth_ids"]): + kind = "linkage" if c["residue_ids"][pos] == -2 else "residue" + if not w3["allowed_np"][kind][t]: + n += 1 + break + return n + + +HOOK = {"mask": None, "vec": None} + + +def _linkage_hook(module, inputs, output): + m = HOOK["mask"] + if m is None: + return None + if output.dim() == 3 and tuple(output.shape[:2]) == tuple(m.shape): + idx = m + elif output.dim() == 2 and output.shape[0] == m.numel(): + idx = m.reshape(-1) + else: + fail("linkage embedding output %s does not match mask %s" % (tuple(output.shape), tuple(m.shape))) + out = output.clone() + out[idx] = HOOK["vec"].to(out.dtype) + return out + + +def find_linkage_embedding(model): + cands = [(n, m) for n, m in model.named_modules() if isinstance(m, torch.nn.Embedding) and m.num_embeddings == 10] + named = [(n, m) for n, m in cands if "linkage" in n.lower()] + if len(named) != 1: + fail("linkage embedding not unique: %s" % [n for n, _ in cands]) + return named[0] + + +def baseline_unit_preds(w3, stats, cases, encodings): + out = {} + for c in cases: + if len(c["units"]) != 1: + continue + enc, spans = encodings[c["wurcs"]] + s = {sp["g"]: sp for sp in spans}[c["units"][0]["g"]] + tokens = [w3["i2t"][x] for x in enc["token_ids"][:enc["length"]]] + prev_t = tokens[s["start"] - 1] if s["start"] > 0 else "" + next_t = tokens[s["end"] + 1] if s["end"] + 1 < len(tokens) else "" + query = {(sp["unit_type"], sp["unit_text"]) for sp in spans if sp["g"] != s["g"]} + out[c["case_id"]] = {"marginal_frequency": stats.marginal_pred(s["unit_type"])[0], + "context_frequency": stats.context_pred(s["unit_type"], prev_t, next_t)[0], + "nearest_neighbour": stats.nn_pred(s["unit_type"], s["ordinal"], query)} + return out + + +PAT_ORD = re.compile(r"^([A-Za-z]+)(\d+)-([A-Za-z]+)(\d+)$") + + +def _cat(truth, pred): + if pred is None: + return "no_answer" + if pred == truth: + return "exact" + t, p = PAT_ORD.match(truth), PAT_ORD.match(pred) + if t is None: + return "truth_not_ordinary" + if p is None: + return "non_ordinary_answer" + if (t.group(1), t.group(3)) == (p.group(1), p.group(3)): + return "right_sugars_wrong_positions" + if (t.group(2), t.group(4)) == (p.group(2), p.group(4)): + return "right_positions_wrong_sugars" + return "both_wrong" + + +def decompose(cases, arms, preds): + by_id = {a: {r["case_id"]: r for r in res} for a, res in arms.items()} + out = {} + for subset, sel in (("all_cases", cases), + ("not_in_wa3_training", [c for c in cases if c["wa3_partition"] != "pretraining_train"])): + rows = [] + for c in sel: + if len(c["positions"]) != 1 or len(c["units"]) != 1: + continue + truth = c["units"][0]["unit_text"] + m = {} + for a in arms: + r = by_id[a][c["case_id"]] + toks = [tk for tk, _ in r["initial_top10"][0]] + m["BERTose_%s_first_choice" % a] = toks[0] + m["BERTose_%s_IAR" % a] = r["final_tokens"][0] if r["resolved_count"] else None + m["_rank_%s" % a] = toks.index(truth) + 1 if truth in toks else 11 + m.update(preds.get(c["case_id"], {})) + t = PAT_ORD.match(truth) + rows.append({"truth": truth, "pair": "%s-%s" % (t.group(2), t.group(4)) if t else "non_ordinary", + "k": c.get("achem_k"), "m": m}) + methods = [k for k in (rows[0]["m"] if rows else {}) if not k.startswith("_")] + res = {"n_single_token_cases": len(rows), "methods": {}} + for meth in methods: + cats = collections.Counter(_cat(r["truth"], r["m"].get(meth)) for r in rows) + res["methods"][meth] = {"exact": round(cats["exact"] / len(rows), 4) if rows else 0.0, + "categories": dict(cats)} + for a in arms: + ranks = collections.Counter(r["m"]["_rank_%s" % a] for r in rows) + res["rank_of_truth_%s" % a] = {("%d" % k if k <= 10 else ">10"): v for k, v in sorted(ranks.items())} + strata = collections.defaultdict(list) + for r in rows: + strata["pair=" + r["pair"]].append(r) + k = r["k"] + strata["admissible_positions=" + ("unknown" if k is None else (str(k) if k < 4 else ">=4"))].append(r) + res["strata"] = {} + for name, rs in sorted(strata.items()): + res["strata"][name] = {"n": len(rs)} | { + meth: round(sum(_cat(r["truth"], r["m"].get(meth)) == "exact" for r in rs) / len(rs), 4) + for meth in methods} + out[subset] = res + return out + + +ORD_RE = re.compile(r"^[A-Za-z]+\d+-[A-Za-z]+\d+$") +CAP = {"h": None} +N_TRAIN, N_DEV, PROBE_BATCH = 24000, 4000, 64 +LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + + +def _cap_hook(module, inputs, output): + CAP["h"] = inputs[0].detach() + + +def find_lm_projection(model): + cands = [(n, m) for n, m in model.named_modules() if isinstance(m, torch.nn.Linear) and m.out_features == 2114] + if len(cands) > 1: + pref = [(n, m) for n, m in cands if any(k in n.lower() for k in ("seq", "mlm", "lm_", "sequence"))] + cands = pref if len(pref) == 1 else cands + if len(cands) != 1: + fail("LM projection not unique: %s" % [n for n, _ in cands]) + return cands[0] + + +def _gather_h(B, L, bi, pos): + H = CAP["h"] + if H.dim() == 3 and H.shape[0] == B and H.shape[1] == L: + return H[bi, pos] + if H.dim() == 2 and H.shape[0] == B * L: + return H.reshape(B, L, -1)[bi, pos] + fail("unexpected LM-projection input shape %s for batch %d x %d" % (tuple(H.shape), B, L)) + + +def _forward(model, dev, tok, am, rid, bd, lt, neutral_pos): + HOOK["mask"] = None + if neutral_pos is not None: + m = torch.zeros(tok.shape, dtype=torch.bool) + for bi, p in neutral_pos: + m[bi, p] = True + HOOK["mask"] = m.to(dev) + with torch.inference_mode(): + o = model(seq_token_ids=tok.to(dev), seq_attention_mask=am.bool().to(dev), seq_residue_ids=rid.to(dev), + seq_branch_depths=bd.to(dev), seq_linkage_types=lt.to(dev), + seq_labels=None, topology_labels=None, topology_available=None, + **all_absent(tok.shape[0], torch.device(dev))) + HOOK["mask"] = None + return o.sequence_logits.float() + + +def _score(w3, logits, B, L, bi, pos, want_h): + row = logits[bi, pos].masked_fill(~w3["allowed_mask"]["linkage"], float("-inf")) + pr = torch.softmax(row, dim=-1) + p1, i1 = pr.max(-1) + out = {"pred_id": int(i1), "pred_prob": float(p1), + "ord_probs": pr[w3["ord_ids_t"]].cpu().numpy().astype(np.float32)} + if want_h: + out["h"] = _gather_h(B, L, bi, pos).float().cpu().numpy() + return out + + +def sample_parents(w3, idx_rows, test_wurcs, arrays, want_partition, n, seed, require_contributor=True): + token_ids, residue_ids, _bd, linkage_types, _am, lengths = arrays + test_keys = {lin_key(w) for w in test_wurcs} + rng = np.random.default_rng(seed) + out = [] + for i in rng.permutation(len(idx_rows)): + r = idx_rows[int(i)] + if r["pretraining_partition"] != want_partition: + continue + if require_contributor and r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + continue + L = int(lengths[i]) + ids, rid, lt = (np.asarray(token_ids[i, :L]), np.asarray(residue_ids[i, :L]), np.asarray(linkage_types[i, :L])) + cand = np.flatnonzero((rid == -2) & (lt >= 1) & (lt <= 8) & w3["ord_full_np"][ids]) + if cand.size == 0: + continue + p = int(rng.choice(cand)) + out.append({"row": int(i), "pos": p, "true_id": int(ids[p]), "true_class": int(lt[p]), + "n_residues": int(len(set(int(x) for x in rid if x >= 0)))}) + if len(out) >= n: + break + return out + + +def run_parent_samples(model, dev, w3, arrays, samples, arm, want_h): + token_ids, residue_ids, branch_depths, linkage_types, attention_mask, _ = arrays + res = [] + for b0 in range(0, len(samples), PROBE_BATCH): + batch = samples[b0:b0 + PROBE_BATCH] + rows = [s["row"] for s in batch] + g = lambda a: torch.as_tensor(np.stack([np.asarray(a[r]) for r in rows]).astype(np.int64)) # noqa: E731 + tok, am, rid, bd, lt = g(token_ids), g(attention_mask), g(residue_ids), g(branch_depths), g(linkage_types) + for bi, s in enumerate(batch): + tok[bi, s["pos"]] = w3["mask_id"] + if arm != "true_class": + lt[bi, s["pos"]] = w3["linkage_unknown"] + B, L = tok.shape + logits = _forward(model, dev, tok, am, rid, bd, lt, + [(bi, s["pos"]) for bi, s in enumerate(batch)] if arm == "neutral" else None) + for bi, s in enumerate(batch): + res.append(_score(w3, logits, B, L, bi, s["pos"], want_h)) + return res + + +def run_harness_cases(model, dev, w3, cases, encodings): + res, meta = [], [] + sel = [c for c in cases if len(c["positions"]) == 1 and len(c["units"]) == 1] + for b0 in range(0, len(sel), PROBE_BATCH): + batch = sel[b0:b0 + PROBE_BATCH] + t = lambda key: torch.tensor([c[key] for c in batch], dtype=torch.long) # noqa: E731 + tok = torch.tensor([c["masked_ids"] for c in batch], dtype=torch.long) + B, L = tok.shape + logits = _forward(model, dev, tok, t("attention_mask"), t("residue_ids"), t("branch_depths_blank"), + t("linkage_types_blank"), [(bi, c["positions"][0]) for bi, c in enumerate(batch)]) + for bi, c in enumerate(batch): + res.append(_score(w3, logits, B, L, bi, c["positions"][0], True)) + spans = encodings[c["wurcs"]][1] + tt = c["units"][0]["unit_text"] + meta.append({"case_id": c["case_id"], "true_id": c["truth_ids"][0], "truth": tt, + "true_class": int(w3["exact_linkage"](tt)), + "n_residues": sum(1 for sp in spans if sp["unit_type"] == "residue"), + "wa3_partition": c["wa3_partition"]}) + return res, meta + + +def train_probe(Xtr, ytr, Xdv, ydv, n_out, seed=0): + mu, sd = Xtr.mean(0), Xtr.std(0) + 1e-6 + f = lambda X: torch.as_tensor((X - mu) / sd, dtype=torch.float32) # noqa: E731 + Xt, Xd, yt, yd = f(Xtr), f(Xdv), torch.as_tensor(ytr), torch.as_tensor(ydv) + torch.manual_seed(seed) + lin = torch.nn.Linear(Xt.shape[1], n_out) + opt = torch.optim.AdamW(lin.parameters(), lr=1e-3, weight_decay=1e-2) + best = (-1.0, None, -1) + for ep in range(60): + perm = torch.randperm(len(Xt)) + for b in range(0, len(Xt), 512): + idx = perm[b:b + 512] + loss = torch.nn.functional.cross_entropy(lin(Xt[idx]), yt[idx]) + opt.zero_grad() + loss.backward() + opt.step() + with torch.no_grad(): + acc = float((lin(Xd).argmax(-1) == yd).float().mean()) + if acc > best[0]: + best = (acc, {k: v.clone() for k, v in lin.state_dict().items()}, ep) + lin.load_state_dict(best[1]) + lin.eval() + return lin, f, {"dev_accuracy_for_selection": round(best[0], 4), "best_epoch": best[2]} + + +def score_prediction(truth_tokens, pred_tokens): + n = len(truth_tokens) + if pred_tokens is None: + ok, nc = False, 0 + else: + ok = list(pred_tokens) == list(truth_tokens) + nc = sum(a == b for a, b in zip(pred_tokens, truth_tokens)) if len(pred_tokens) == n else 0 + return {"num_masked_positions": n, "initial_top1_correct_count": nc, "initial_top5_correct_count": nc, + "resolved_count": n if pred_tokens is not None else 0, "final_correct_count": nc, + "initial_span_exact_top1": ok, "initial_span_exact_top5": ok, "iterative_span_exact": ok, + "iterations_used": 0} + + +def run_baselines(w3, stats, cases, encodings, results_by_id, results_blank_by_id=None): + method_rows = collections.defaultdict(list) + for c in cases: + if len(c["units"]) != 1: + continue + enc, spans = encodings[c["wurcs"]] + s = {sp["g"]: sp for sp in spans}[c["units"][0]["g"]] + tokens = [w3["i2t"][x] for x in enc["token_ids"][:enc["length"]]] + prev_t = tokens[s["start"] - 1] if s["start"] > 0 else "" + next_t = tokens[s["end"] + 1] if s["end"] + 1 < len(tokens) else "" + query = {(sp["unit_type"], sp["unit_text"]) for sp in spans if sp["g"] != s["g"]} + truth = [w3["i2t"][x] for x in c["truth_ids"]] + bpe = lambda t: None if t is None else list(w3["tok"].apply_bpe(t)) # noqa: E731 + preds = {"marginal_frequency": bpe(stats.marginal_pred(s["unit_type"])[0]), + "context_frequency": bpe(stats.context_pred(s["unit_type"], prev_t, next_t)[0]), + "nearest_neighbour": bpe(stats.nn_pred(s["unit_type"], s["ordinal"], query))} + flags = {k: c[k] for k in ("single_answer", "wa3_partition")} + for m, p in preds.items(): + method_rows[m].append({**score_prediction(truth, p), **flags}) + method_rows["WA3_harness_inputs"].append({**results_by_id[c["case_id"]]}) + if results_blank_by_id is not None: + method_rows["WA3_side_channels_blanked"].append({**results_blank_by_id[c["case_id"]]}) + wa0 = {"num_masked_positions": 1, "initial_top1_correct_count": 0, "initial_top5_correct_count": 0, + "resolved_count": 1, "final_correct_count": 0, "initial_span_exact_top1": c["wa0_initial_span_exact_top1"], + "initial_span_exact_top5": False, "iterative_span_exact": c["wa0_iterative_span_exact"], + "iterations_used": 0, **flags} + method_rows["WA0_submitted"].append(wa0) + table = [] + for m, rows in method_rows.items(): + for subset, sel in (("all_cases", rows), ("single_answer", [r for r in rows if r["single_answer"]]), + ("single_answer_not_in_wa3_training", + [r for r in rows if r["single_answer"] and r["wa3_partition"] != "pretraining_train"])): + a = aggregate(sel) + table.append({"method": m, "subset": subset, "n": a["num_cases"], + "exact_span_accuracy": round(a.get("iterative_exact_span_accuracy", 0.0), 4)}) + return table + + +# ============================================================== main +def summarize_run(results, cases_all, excluded, cfg, results_blank=None): + sa = [r for r in results if r["single_answer"]] + unseen = lambda rs: [r for r in rs if r["wa3_partition"] != "pretraining_train"] # noqa: E731 + out = {"wa0_config": cfg, "wa3_excluded": excluded, + "flags": {"cases": len(results), "single_answer": len(sa), + "enumerated_alternative": sum(r["enumerated_alternative"] for r in results), + "unknown_question_mark": sum(r["unknown_question_mark"] for r in results), + "wa3_truth_uses_invalid_token": sum(r["wa3_truth_uses_invalid_token"] for r in results)}, + "exposure": dict(collections.Counter(r["wa3_partition"] for r in results)), + "wa3_all_cases": aggregate(results), "wa3_single_answer": aggregate(sa), + "wa3_single_answer_not_in_wa3_training": aggregate(unseen(sa)), + "paired_wa0_vs_wa3_all_cases": paired(results), "paired_wa0_vs_wa3_single_answer": paired(sa)} + if results_blank is not None: + sb = [r for r in results_blank if r["single_answer"]] + out["wa3_side_channels_blanked_all_cases"] = aggregate(results_blank) + out["wa3_side_channels_blanked_single_answer"] = aggregate(sb) + out["wa3_side_channels_blanked_single_answer_not_in_wa3_training"] = aggregate(unseen(sb)) + ach = [c for c in cases_all if "achem_status" in c] + if ach: + by_id = {r["case_id"]: r for r in results} + strata = collections.defaultdict(list) + status = collections.Counter(c["achem_status"] for c in ach) + for c in ach: + if c["achem_status"] != "ok" or not by_id[c["case_id"]]["single_answer"]: + continue + k = c["achem_k"] + strata["k=0" if k == 0 else ("k=1" if k == 1 else ("k=2" if k == 2 else ("k=3" if k == 3 else "k>=4")))].append(c) + out["achem"] = {"status": dict(status), "strata": {}} + for name, cs in sorted(strata.items()): + rs = [by_id[c["case_id"]] for c in cs] + row = {"n": len(cs), "mean_chance": float(np.mean([c["achem_chance"] or 0 for c in cs])), + "truth_in_achem": sum(c["truth_in_achem"] for c in cs), + "wa3_exact_span_harness_inputs": aggregate(rs)["iterative_exact_span_accuracy"], + "wa0_exact_span_harness_inputs": sum(c["wa0_iterative_span_exact"] for c in cs) / len(cs)} + if results_blank is not None: + bb = {r["case_id"]: r for r in results_blank} + row["wa3_exact_span_side_channels_blanked"] = aggregate([bb[c["case_id"]] for c in cs])["iterative_exact_span_accuracy"] + out["achem"]["strata"][name] = row + return out + + +def main(): + OUT.mkdir(parents=True, exist_ok=True) + manifest = {"schema": "bertose_wa3_linkage_probe_v1", + "parent_script": "wa3_same_test.py sha256 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 (job 12847066)", + "decoding": "type-consistent answer space (see docstring); renormalised softmax; threshold 0.80; 3 rounds", + "started": time.strftime("%Y-%m-%dT%H:%M:%S"), + "slurm_job_id": os.environ.get("SLURM_JOB_ID"), "host": platform.node(), "python": sys.version.split()[0], + "torch": torch.__version__, "threads": torch.get_num_threads(), + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back"} + for path, expect in EXPECTED_SHA.items(): + got = sha256_file(path) + if got != expect: + fail("%s sha %s != %s" % (path, got, expect)) + log("all %d pinned file hashes match" % len(EXPECTED_SHA)) + + hie, ev0 = load_wa0_evaluator() + w3 = build_wa3_tokenizer() + manifest["wa3_invalid_prediction_set"] = {"specials": w3["n_specials"], "ambiguity_tokens": w3["n_ambiguity"]} + java_cp = compile_java_helper() + with gzip.open(PKGD / "review_sequence_parent_index.tsv.gz", "rt", newline="") as fh: + idx_rows = list(csv.DictReader(fh, delimiter="\t")) + if len(idx_rows) != 281208: + fail("parent index row count %d" % len(idx_rows)) + + parity = parity_gate(w3, java_cp, idx_rows) + write_json(OUT / "gate_wa3_input_parity.json", parity) + log("WA3 input parity: %s %s/%d" % (parity["status"], parity["matches"].get("all", 0), parity["rows"])) + if parity["status"] != "PASS": + fail("WA3 inputs do not reproduce the training arrays; see gate_wa3_input_parity.json") + + look = exposure_lookup(idx_rows) + achem = load_achem() + set_data, all_test_wurcs = {}, set() + for set_name, spec in SETS.items(): + first_cfg = parse_wa0_summary(spec["wa0_root"] / spec["runs"][0]) + csv_path = Path(first_cfg["input_csv"]) if set_name == "bench1392" else WORK / "inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv" + rows = hie.load_rows(input_csv=csv_path, limit=first_cfg["glycans_loaded"], shuffle=False, seed=42) + manifest.setdefault("inputs", {})[set_name] = {"csv": str(csv_path), "sha256": sha256_file(csv_path), "rows": len(rows)} + uniq = sorted({r["wurcs"] for r in rows}) + auths = run_java_helper(java_cp, uniq) + encodings = {w: wa3_encode(w3, w, a) for w, a in zip(uniq, auths)} + manifest["inputs"][set_name]["helper_errors"] = sum(a["helper_error"] for a in auths) + manifest["inputs"][set_name]["exposure_glycans"] = dict(collections.Counter(look(w)["wa3_partition"] for w in uniq)) + set_data[set_name] = (rows, encodings) + all_test_wurcs.update(uniq) + log("%s: %d glycans; WA3 exposure %s" % (set_name, len(uniq), manifest["inputs"][set_name]["exposure_glycans"])) + + w3["allowed_np"], manifest["answer_space"] = build_allowed(w3, idx_rows, all_test_wurcs) + log("answer space: %s" % manifest["answer_space"]) + + built, identity_failures = [], [] + for set_name, spec in SETS.items(): + rows, encodings = set_data[set_name] + for run in spec["runs"]: + try: + cfg, wa0_cases = rebuild_wa0_cases(hie, ev0, rows, spec["wa0_root"] / run) + except (SystemExit, OSError, KeyError, ValueError) as exc: + identity_failures.append({"set": set_name, "run": run, "reason": str(exc)}) + log("%s/%s: SKIPPED, not the same test: %s" % (set_name, run, exc)) + continue + cases, excluded = build_wa3_cases(w3, wa0_cases, encodings, look) + for c in cases: + if len(c["units"]) == 1 and c["units"][0]["unit_type"] == "linkage": + c.update(achem(c["wurcs"], c["units"][0]["unit_text"])) + manifest["inputs"][set_name].setdefault("wa0_checkpoints", {})[run] = cfg["checkpoint"] + manifest.setdefault("truth_outside_answer_space", {})["%s/%s" % (set_name, run)] = truth_outside(w3, cases) + built.append((set_name, run, cfg, cases, excluded)) + log("%s/%s: WA0 cases rebuilt and verified (%d); WA3 cases %d; excluded %s" + % (set_name, run, len(wa0_cases), len(cases), excluded)) + write_json(OUT / "gate_case_identity.json", {"status": "PASS" if not identity_failures else "PARTIAL", + "verified_runs": [(s, r, len(c)) for s, r, _, c, _ in built], + "skipped_runs": identity_failures}) + manifest["case_identity_skipped_runs"] = identity_failures + if not built: + fail("no run could be reproduced as the same test") + + model, dev, ctx = load_model() + w3["allowed_mask"] = {k: torch.as_tensor(v, dtype=torch.bool, device=dev) for k, v in w3["allowed_np"].items()} + manifest["device"] = dev + log("WA3 loaded strict 505/505 on %s" % dev) + + counts = np.array(manifest["answer_space"]["linkage_class_counts"], dtype=np.float64) + wts = counts[1:9] / counts[1:9].sum() + lk_name, lk_mod = find_linkage_embedding(model) + with torch.no_grad(): + w = torch.as_tensor(wts, dtype=torch.float32, device=lk_mod.weight.device) + HOOK["vec"] = (lk_mod.weight[1:9].detach().float() * w[:, None]).sum(0) + lk_mod.register_forward_hook(_linkage_hook) + lm_name, lm_mod = find_lm_projection(model) + lm_mod.register_forward_hook(_cap_hook) + manifest["hooks"] = {"neutral_linkage_embedding": lk_name, "hidden_capture_input_of": lm_name} + log("hooks: neutral on %s, hidden = input of %s" % (lk_name, lm_name)) + + V = len(w3["t2i"]) + ord_full = np.zeros(V, dtype=bool) + ord_class = np.zeros(V, dtype=np.int64) + for tkn, i in w3["t2i"].items(): + if ORD_RE.match(tkn): + ord_full[i] = True + ord_class[i] = int(w3["exact_linkage"](tkn)) + ord_full &= w3["allowed_np"]["linkage"] + w3["ord_full_np"] = ord_full + ORD_IDS = np.flatnonzero(ord_full) + w3["ord_ids_t"] = torch.as_tensor(ORD_IDS, dtype=torch.long, device=dev) + ord_pos = {int(i): k for k, i in enumerate(ORD_IDS)} + manifest["ordinary_single_token_linkages"] = int(ord_full.sum()) + + arrays = tuple(np.load(PKGD / f, mmap_mode="r") for f in + ("review_token_ids.npy", "review_residue_ids.npy", "review_branch_depths.npy", + "review_linkage_types.npy", "review_attention_mask.npy", "review_lengths.npy")) + if arrays[0].shape[1] != MAX_LEN: + fail("training arrays width %d != %d" % (arrays[0].shape[1], MAX_LEN)) + parts = collections.Counter(r["pretraining_partition"] for r in idx_rows) + manifest["partitions"] = dict(parts) + dev_part = [p for p in parts if "develop" in p] + if len(dev_part) != 1: + fail("development partition label not unique: %s" % dict(parts)) + t0 = time.time() + tr_s = sample_parents(w3, idx_rows, all_test_wurcs, arrays, "pretraining_train", N_TRAIN, 7) + dv_s = sample_parents(w3, idx_rows, all_test_wurcs, arrays, dev_part[0], N_DEV, 11, require_contributor=False) + log("partitions: %s" % dict(parts)) + if len(tr_s) < 1000 or len(dv_s) < 1000: + fail("too few probe samples: train %d, development %d" % (len(tr_s), len(dv_s))) + log("samples: train %d, development %d (%.0fs)" % (len(tr_s), len(dv_s), time.time() - t0)) + + t0 = time.time() + tr = run_parent_samples(model, dev, w3, arrays, tr_s, "neutral", True) + log("train neutral forward done (%.0fs)" % (time.time() - t0)) + dv = {arm: run_parent_samples(model, dev, w3, arrays, dv_s, arm, arm == "neutral") + for arm in ("true_class", "class9", "neutral")} + log("development forwards done") + sets = {} + for set_name, run, cfg, cases, excluded in built: + r_, m_ = run_harness_cases(model, dev, w3, cases, set_data[set_name][1]) + sets[set_name] = (r_, m_) + log("%s: %d single-token linkage cases collected" % (set_name, len(r_))) + ctx.__exit__(None, None, None) + del model + + Xtr = np.stack([r["h"] for r in tr]) + ytr_c = np.array([s["true_class"] - 1 for s in tr_s]) + Xdv = np.stack([r["h"] for r in dv["neutral"]]) + ydv_c = np.array([s["true_class"] - 1 for s in dv_s]) + cls_probe, cls_f, cls_info = train_probe(Xtr, ytr_c, Xdv, ydv_c, 8) + tok_seen = sorted({s["true_id"] for s in tr_s}) + tok_idx = {t: k for k, t in enumerate(tok_seen)} + tr_mask = [k for k, s in enumerate(tr_s) if s["true_id"] in tok_idx] + dv_mask = [k for k, s in enumerate(dv_s) if s["true_id"] in tok_idx] + tok_probe, tok_f, tok_info = train_probe(Xtr[tr_mask], np.array([tok_idx[tr_s[k]["true_id"]] for k in tr_mask]), + Xdv[dv_mask], np.array([tok_idx[dv_s[k]["true_id"]] for k in dv_mask]), + len(tok_seen)) + manifest["probes"] = {"class": cls_info, "token": tok_info | {"tokens_seen_in_training": len(tok_seen)}, + "feature_dim": int(Xtr.shape[1])} + log("probes fitted: class %s, token %s" % (cls_info, tok_info)) + + def evaluate_set(res, truths): + X = np.stack([r["h"] for r in res]) + with torch.no_grad(): + pc = torch.softmax(cls_probe(cls_f(X)), -1).numpy() + pt = torch.softmax(tok_probe(tok_f(X)), -1).numpy() + rows = [] + for k, (r, t) in enumerate(zip(res, truths)): + c_hat = int(pc[k].argmax()) + 1 + op = r["ord_probs"] + in_cls = np.flatnonzero(ord_class[ORD_IDS] == c_hat) + guided = int(ORD_IDS[in_cls[int(op[in_cls].argmax())]]) if in_cls.size else r["pred_id"] + tp = int(pt[k].argmax()) + rows.append({"true_id": t["true_id"], "true_class": t["true_class"], + "mlm": r["pred_id"], "mlm_prob": r["pred_prob"], "mlm_class": int(ord_class[r["pred_id"]]), + "class_probe": c_hat, "guided": guided, + "token_probe": tok_seen[tp], "token_probe_prob": float(pt[k][tp]), + "token_in_probe_vocab": t["true_id"] in tok_idx}) + n = len(rows) + acc = lambda key: round(sum(r[key] == r["true_id"] for r in rows) / n, 4) # noqa: E731 + gated = [r for r in rows if r["token_probe_prob"] >= 0.80] + return rows, {"n": n, + "mlm_neutral_exact": acc("mlm"), + "mlm_neutral_class_accuracy": round(sum(r["mlm_class"] == r["true_class"] for r in rows) / n, 4), + "class_probe_accuracy": round(sum(r["class_probe"] == r["true_class"] for r in rows) / n, 4), + "guided_exact": acc("guided"), "token_probe_exact": acc("token_probe"), + "token_probe_gated080_coverage": round(len(gated) / n, 4), + "token_probe_gated080_accuracy_among_filled": + round(sum(r["token_probe"] == r["true_id"] for r in gated) / len(gated), 4) if gated else 0.0, + "token_probe_gated080_exact": round(sum(r["token_probe"] == r["true_id"] for r in gated) / n, 4), + "truth_outside_probe_vocab": sum(not r["token_in_probe_vocab"] for r in rows), + "majority_class_rate": round(collections.Counter(r["true_class"] for r in rows).most_common(1)[0][1] / n, 4)} + + report = {"development": {}} + _, report["development"]["neutral_probe_eval"] = evaluate_set(dv["neutral"], dv_s) + for arm in ("true_class", "class9", "neutral"): + report["development"]["mlm_%s_exact" % arm] = round( + sum(r["pred_id"] == s["true_id"] for r, s in zip(dv[arm], dv_s)) / len(dv_s), 4) + report["train_in_sample"] = {"mlm_neutral_exact": round(sum(r["pred_id"] == s["true_id"] for r, s in zip(tr, tr_s)) / len(tr_s), 4)} + + BaselineStats.linkage_class = staticmethod(w3["exact_linkage"]) + stats, fit_counts = fit_baselines(w3, idx_rows, all_test_wurcs) + manifest["baseline_fit"] = fit_counts + for set_name, run, cfg, cases, excluded in built: + res, meta = sets[set_name] + rows, summ = evaluate_set(res, meta) + preds = baseline_unit_preds(w3, stats, cases, set_data[set_name][1]) + for r, m in zip(rows, meta): + p = preds.get(m["case_id"], {}) + for bn in ("marginal_frequency", "context_frequency", "nearest_neighbour"): + r[bn] = p.get(bn) == m["truth"] + r["n_residues"], r["truth"] = m["n_residues"], m["truth"] + r["wa3_partition"] = m["wa3_partition"] + for bn in ("marginal_frequency", "context_frequency", "nearest_neighbour"): + summ[bn + "_exact"] = round(sum(r[bn] for r in rows) / len(rows), 4) + strata = collections.defaultdict(list) + for r in rows: + nr = r["n_residues"] + strata["residues=" + ("<=4" if nr <= 4 else "5-7" if nr <= 7 else "8-10" if nr <= 10 else ">=11")].append(r) + li = LETTERS.find(r["truth"][0]) + strata["acceptor_letter=" + ("a-c" if li <= 2 else "d-f" if li <= 5 else "g+")].append(r) + strata["class=%d" % r["true_class"]].append(r) + summ["strata"] = {} + for name, rs in sorted(strata.items()): + summ["strata"][name] = {"n": len(rs), + "mlm_neutral": round(sum(r["mlm"] == r["true_id"] for r in rs) / len(rs), 4), + "class_probe": round(sum(r["class_probe"] == r["true_class"] for r in rs) / len(rs), 4), + "guided": round(sum(r["guided"] == r["true_id"] for r in rs) / len(rs), 4), + "token_probe": round(sum(r["token_probe"] == r["true_id"] for r in rs) / len(rs), 4), + "context_frequency": round(sum(r["context_frequency"] for r in rs) / len(rs), 4), + "nearest_neighbour": round(sum(r["nearest_neighbour"] for r in rs) / len(rs), 4)} + unseen = [r for r in rows if r["wa3_partition"] != "pretraining_train"] + summ["not_in_wa3_training_n"] = len(unseen) + summ["not_in_wa3_training_token_probe_exact"] = round( + sum(r["token_probe"] == r["true_id"] for r in unseen) / len(unseen), 4) if unseen else None + summ["not_in_wa3_training_guided_exact"] = round( + sum(r["guided"] == r["true_id"] for r in unseen) / len(unseen), 4) if unseen else None + report[set_name] = summ + with _real_open(OUT / ("%s_probe_rows.jsonl" % set_name), "w") as fh: + for r in rows: + fh.write(json.dumps({k: (int(v) if isinstance(v, (np.integer,)) else v) for k, v in r.items()}) + "\n") + log("%s: %s" % (set_name, {k: v for k, v in summ.items() if k != "strata"})) + write_json(OUT / "linkage_probe_report.json", report) + log("development: %s" % {k: v for k, v in report["development"].items() if k != "neutral_probe_eval"}) + log("development probe eval: %s" % report["development"]["neutral_probe_eval"]) + manifest["finished"] = time.strftime("%Y-%m-%dT%H:%M:%S") + manifest["script_sha256"] = sha256_file(Path(__file__)) + manifest["status"] = "COMPLETE" if not identity_failures else "PARTIAL_RUNS_SKIPPED" + write_json(OUT / "run_manifest.json", manifest) + log("DONE") + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/iar_completion/originals/wa3_same_test.py b/releases/2026-10-02/iar_completion/originals/wa3_same_test.py new file mode 100644 index 0000000000000000000000000000000000000000..aa93a979a6e06869fa397cec6b4a6069211e0717 --- /dev/null +++ b/releases/2026-10-02/iar_completion/originals/wa3_same_test.py @@ -0,0 +1,1084 @@ +#!/usr/bin/env python3 +"""WA3 rerun of the submitted held-out masking tests, on the SAME cases. + +Tests reproduced (both reported in the original submission): + * bench1392 -- 1,392 benchmark glycans (Supplementary Fig. 4; WA0 runs on Nova, 04-24) + * seal162 -- 162 paper-novel grey-seal milk glycans (Supplementary Fig. 5; WA0 runs 04-24/25) + +Same test, by construction: + 1. The untouched submitted harness (heldout_ipa_eval.py, sha 8d05a404...) rebuilds every WA0 case + with the submitted tokenizer, vocabulary, eligibility rule, seed 42 and mask plans. Every rebuilt + case must equal the WA0 run's own case_details.jsonl (case ids, masked positions, truth ids), + otherwise the job stops. + 2. Each masked WA0 span is mapped to its WURCS semantic unit(s). WA3 masks exactly those units. + 3. WA3 inputs are built exactly as WA3's training arrays were built: official WURCSArray helper + (Java) for branch structure + the frozen builder's repair + frozen 2,114-token BPE. A parity gate + rebuilds a sample of WA3 training parents and requires 100% agreement on all five channels. + 4. Filling, threshold, 3 rounds, top-k and every metric are identical to the harness. + +Reviewer 2 point 5 (irreducible uncertainty, simple baselines) is handled on the same cases: + * masked units that are curator-declared enumerations ('|') or unknown ('?') are flagged and + excluded from the single-answer score (reported separately, never silently dropped) + * each masked single linkage gets |A_chem| (chemically admissible acceptor positions; chance=1/k) + * marginal-frequency, context-frequency and nearest-neighbour baselines fitted on WA3's own + training parents (test glycans removed) are scored on the identical single-span cases + +Inference only on the frozen reported model (WA3, A1111, seed 42, epoch 58). No write-back. +""" +from __future__ import annotations + +import base64 +import builtins +import collections +import csv +import functools +import gzip +import hashlib +import importlib.util +import json +import os +import platform +import re +import shutil +import subprocess +import sys +import time +from pathlib import Path + +import numpy as np +import torch + +torch.set_num_threads(int(os.environ.get("NTHREADS", "16"))) +csv.field_size_limit(10 ** 9) + +PROJ = Path("/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training") +PKGD = PROJ / "data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" +WA0_HARNESS = PROJ / "writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py" +WA0_VOCAB = PROJ / "data/bpe_vocabulary_clean.json" +WA0_AMB = PROJ / "data/bpe_ambiguity_tokens.json" +WA0_CKPT_PATH = PROJ / "checkpoints_v5b_excluded/best_v5b_excluded_model.pt" # path only; never loaded +BENCH_DIR = PROJ / "writing/glycangt_heldout_ipa_validation" +SCHEMA_DIR = Path("/work/ratul1/supantha/glycan-SD-VS/review/iar_pipe_schema_20260823_r1") +JAVA_BIN = Path("/work/ratul1/supantha/miniconda3/envs/DeepGlycanSite/bin") +ROOT = Path("/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc") +TRAIN_MOD = ROOT / ("writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/" + "run_review_md_temporal_20x6_training_r3.py") +CK = ROOT / ("writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/" + "review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/" + "review_md20x6_checkpoint_best.pt") +CK_SHA = "8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82" + +WORK = Path(os.environ["WORK"]) +SCRIPT_SHA = hashlib.sha256(Path(__file__).read_bytes()).hexdigest() +OUT = WORK / "outputs" +JAVA_DIR = WORK / "inputs/java" + +EXPECTED_SHA = { + PKGD / "review_frozen_training_a5_wurcs_bpe.py": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4", + PKGD / "review_frozen_training_a5_topology.py": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7", + PKGD / "review_frozen_sequence_tree_runtime.py": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04", + PKGD / "review_bpe_vocabulary.json": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b", + PKGD / "review_bpe_ambiguity_tokens.json": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b", + PKGD / "review_sequence_parent_index.tsv.gz": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0", + PKGD / "review_token_ids.npy": "ec2d52dced65d22f0f218ff617d351fbd2930661bc8681e939990149d493537d", + PKGD / "review_residue_ids.npy": "36c96dcd3e03ba30e02e16f98d17605742627a37b37cd7824f2a745dd09dc044", + PKGD / "review_branch_depths.npy": "f39f76aa56a9bb782b2349f3ad1ca4ad16351ee1f06a8b9ae4b06bff9b1ebece", + PKGD / "review_linkage_types.npy": "89edb1940765928ced6f54e0d394f95c573eb9d96310b14dbd0adf8e20ac07c4", + PKGD / "review_attention_mask.npy": "01ed165720b9414e614dd7e7d75284a8886165f11138e16117ffcbe4e4bbf95c", + PKGD / "review_lengths.npy": "ade919d1e054c0ba852aa047bf873ac675f81a6c1f8a05cc73a0a2258131f021", + WA0_HARNESS: "8d05a4048e200625694ff9a36f50af89b845fd0d38ba8034a97a710e7ad3dce2", + WA0_VOCAB: "6a572afdf53f1494ab96c896876b824ca7ea749777352606aa9f96bf270ceecc", + WA0_AMB: "c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74", + JAVA_DIR / "review_A5WurcsArrayTreeAudit.java": "a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6", + JAVA_DIR / "review_wurcsframework-1.3.1.jar": "5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37", + JAVA_DIR / "review_MolWURCS.jar": "bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf", +} + +SEAL_RUNS = ["seal162_residue_t070", "seal162_residue_t080", "seal162_residue_t090", + "seal162_linkage_t070", "seal162_linkage_t080", "seal162_linkage_t090", + "seal162_residue2_t080", "seal162_residue3_t080", "seal162_linkage2_t080", + "seal162_linkage3_t080", "seal162_r1_l1_t080", "seal162_r2_l2_t080"] +BENCH_RUNS = ["benchmark1392_residue_full", "benchmark1392_residue_full_thr070", "benchmark1392_residue_full_thr075", + "benchmark1392_residue_full_thr085", "benchmark1392_residue_full_thr090", + "benchmark1392_linkage_full", "benchmark1392_linkage_full_thr070", "benchmark1392_linkage_full_thr075", + "benchmark1392_linkage_full_thr085", "benchmark1392_linkage_full_thr090", + "benchmark1392_complexity_residue2_t080", "benchmark1392_complexity_residue3_t080", + "benchmark1392_complexity_linkage2_t080", "benchmark1392_complexity_linkage3_t080", + "benchmark1392_complexity_r1_l1_t080", "benchmark1392_complexity_r2_l1_t080", + "benchmark1392_complexity_r2_l2_t080"] +SETS = { + "bench1392": {"runs": BENCH_RUNS, "wa0_root": BENCH_DIR / "outputs", + "baseline_runs": ["benchmark1392_residue_full", "benchmark1392_linkage_full"]}, + "seal162": {"runs": SEAL_RUNS, "wa0_root": WORK / "inputs/wa0_seal", + "baseline_runs": ["seal162_residue_t080", "seal162_linkage_t080"]}, +} +ITERATIONS, TOP_K, MAX_LEN, BATCH = 3, 5, 256, 32 + +_real_open = builtins.open + + +def _guarded_open(f, *a, **k): + t = str(f) + if "locked_test" in t or "expert_audit_pool" in t: + raise SystemExit("FAIL-CLOSED: refused to open %s" % t) + return _real_open(f, *a, **k) + + +builtins.open = _guarded_open + + +def sha256_file(path: Path) -> str: + h = hashlib.sha256() + with _real_open(path, "rb") as fh: + for chunk in iter(lambda: fh.read(1 << 22), b""): + h.update(chunk) + return h.hexdigest() + + +def fail(msg: str): + raise SystemExit("FAIL-CLOSED: " + msg) + + +def log(msg: str) -> None: + print(time.strftime("%H:%M:%S"), msg, flush=True) + + +def write_json(path: Path, obj) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + tmp = path.with_suffix(path.suffix + ".tmp") + with _real_open(tmp, "w") as fh: + json.dump(obj, fh, indent=2) + tmp.replace(path) + + +# ============================================================== WA0: the submitted harness, untouched +def load_wa0_evaluator(): + spec = importlib.util.spec_from_file_location("heldout_ipa_eval_wa3_same_test", str(WA0_HARNESS)) + hie = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = hie + spec.loader.exec_module(hie) + + class _NoModelDistiller(hie.BPEIPADistiller): # same pattern as r2_05_baselines.py + def _load_model(self): + return torch.nn.Identity() + + hie.BPEIPADistiller = _NoModelDistiller + ev = hie.HeldoutIPAEvaluator(checkpoint=WA0_CKPT_PATH, vocab=WA0_VOCAB, ambiguity=WA0_AMB, device="cpu", + threshold=0.80, batch_size=32, top_k=TOP_K, max_length=MAX_LEN) + return hie, ev + + +def parse_wa0_summary(run_dir: Path) -> dict: + cfg = {} + for line in _real_open(run_dir / "summary.md"): + m = re.match(r"^- (\w+): `(.*)`\s*$", line.strip()) + if m and m.group(1) not in cfg: + cfg[m.group(1)] = m.group(2) + if "mask_plan" in cfg: + mask_plan = "" if cfg["mask_plan"] in ("", "single-span default") else cfg["mask_plan"] + else: # older summary.md files omit the line; the run's own case records carry it + with _real_open(run_dir / "case_details.jsonl") as fh: + mp = json.loads(fh.readline()).get("mask_plan", "") + mask_plan = mp if "," in mp or not re.fullmatch(r"(residue|linkage):1", mp or "") else "" + if int(cfg["iterations"]) != ITERATIONS or int(cfg["top_k"]) != TOP_K: + fail("%s used iterations=%s top_k=%s" % (run_dir.name, cfg["iterations"], cfg["top_k"])) + return {"threshold": float(cfg["threshold"]), "iterations": int(cfg["iterations"]), "top_k": int(cfg["top_k"]), + "selection_mode": cfg["selection_mode"], "max_cases_per_glycan": int(cfg["max_cases_per_glycan"]), + "span_types": [s.strip() for s in cfg["span_types"].split(",") if s.strip()], "mask_plan": mask_plan, + "input_csv": cfg.get("input_csv"), "checkpoint": cfg.get("checkpoint"), + "glycans_loaded": int(cfg["glycans_loaded"])} + + +def wa0_units(ev, wurcs): + """Mirror of HeldoutIPAEvaluator._tokenize_with_spans, adding the global non-special unit index.""" + tok = ev.tokenizer.tokenize(wurcs, max_length=ev.max_length) + unp = tok["tokens"][: tok["length"]] + recs, cur, g = [], 0, 0 + for u in ev.tokenizer.pre_tokenizer.pre_tokenize(wurcs): + pieces = [u["text"]] if u["type"] == "special" else list(ev.tokenizer.apply_bpe(u["text"])) + s, e = cur, cur + len(pieces) - 1 + cur += len(pieces) + if u["type"] == "special": + continue + gi = g + g += 1 + if e >= len(unp) or unp[s:e + 1] != pieces: + continue + recs.append({"start": s, "end": e, "unit_type": u["type"], "unit_text": u["text"], "g": gi}) + _, spans, _ = ev._tokenize_with_spans(wurcs) + if [(r["start"], r["end"], r["unit_type"], r["unit_text"]) for r in recs] != \ + [(sp.start, sp.end, sp.unit_type, sp.unit_text) for sp in spans]: + fail("WA0 unit geometry differs from the harness for %s" % wurcs[:80]) + return recs + + +def rebuild_wa0_cases(hie, ev, rows, run_dir: Path): + cfg = parse_wa0_summary(run_dir) + if cfg["glycans_loaded"] != len(rows): + fail("%s loaded %d glycans, input has %d" % (run_dir.name, cfg["glycans_loaded"], len(rows))) + mask_req = hie.parse_mask_plan(cfg["mask_plan"]) + span_types = sorted(set(cfg["span_types"]) | set(mask_req)) if mask_req else cfg["span_types"] + cases, _ = ev.build_cases(rows=rows, span_types=span_types, selection_mode=cfg["selection_mode"], + max_cases_per_glycan=cfg["max_cases_per_glycan"], seed=42, mask_requirements=mask_req) + reported = {} + with _real_open(run_dir / "case_details.jsonl") as fh: + for line in fh: + r = json.loads(line) + reported[r["case_id"]] = r + if {c.case_id for c in cases} != set(reported): + fail("%s: rebuilt %d cases vs reported %d (ids differ)" % (run_dir.name, len(cases), len(reported))) + out = [] + for c in cases: + rep = reported[c.case_id] + if list(rep["positions"]) != list(c.positions) or list(rep["truth_token_ids"]) != list(c.truth_token_ids): + fail("%s: case %s positions/truth differ from the reported run" % (run_dir.name, c.case_id)) + pos = set(c.positions) + chosen = [r for r in wa0_units(ev, c.wurcs) if all(p in pos for p in range(r["start"], r["end"] + 1))] + covered = {p for r in chosen for p in range(r["start"], r["end"] + 1)} + if covered != pos: + fail("%s: case %s masked positions do not decompose into whole units" % (run_dir.name, c.case_id)) + out.append({"case_id": c.case_id, "glycan_index": c.glycan_index, "wurcs": c.wurcs, "mask_plan": c.mask_plan, + "units": [{"g": r["g"], "unit_type": r["unit_type"], "unit_text": r["unit_text"]} for r in chosen], + "wa0_iterative_span_exact": bool(rep["iterative_span_exact"]), + "wa0_initial_span_exact_top1": bool(rep["initial_span_exact_top1"]), + "wa0_resolved_all": int(rep["resolved_count"]) == len(rep["positions"])}) + return cfg, out + + +# ============================================================== WA3: frozen tokenizer + official helper +def build_wa3_tokenizer(): + shim = WORK / "shim" + if shim.exists(): + shutil.rmtree(shim) + pkg = shim / "frozen_training" + pkg.mkdir(parents=True) + (pkg / "__init__.py").write_text("") + shutil.copy(PKGD / "review_frozen_training_a5_topology.py", pkg / "a5_topology.py") + shutil.copy(PKGD / "review_frozen_training_a5_wurcs_bpe.py", pkg / "a5_wurcs_bpe.py") + src = (PKGD / "review_frozen_sequence_tree_runtime.py").read_text() + src = (src.replace("from training.a5_topology import", "from frozen_training.a5_topology import") + .replace("from training.a5_wurcs_bpe import", "from frozen_training.a5_wurcs_bpe import")) + if src.count("from frozen_training.") != 2: + fail("tree-runtime import rewrite did not hit exactly two lines") + (shim / "frozen_tree_runtime.py").write_text(src) + sys.path.insert(0, str(PROJ)) + sys.path.insert(0, str(shim)) + import frozen_training.a5_wurcs_bpe as fab # noqa: E402 + import frozen_tree_runtime as ftr # noqa: E402 + for mod in (fab, ftr): + if not str(Path(mod.__file__).resolve()).startswith(str(shim.resolve())): + fail("frozen module resolved outside the shim: %s" % mod.__file__) + if int(ftr.BRANCH_DEPTH_UNKNOWN) != 202: + fail("BRANCH_DEPTH_UNKNOWN != 202") + tok = ftr.ReviewA5WURCSBPETokenizerV3(PKGD / "review_bpe_vocabulary.json") + tok.apply_bpe = functools.lru_cache(maxsize=None)(tok.apply_bpe) + semantic = fab.A5WURCSPreTokenizer() + vocab = json.load(_real_open(PKGD / "review_bpe_vocabulary.json")) + t2i = {k: int(v) for k, v in vocab["token_to_id"].items()} + if len(t2i) != 2114 or sorted(t2i.values()) != list(range(2114)): + fail("WA3 vocabulary is not 2,114 contiguous ids") + specials = {int(v) for v in vocab["special_tokens"].values()} + amb = json.load(_real_open(PKGD / "review_bpe_ambiguity_tokens.json")) + amb_map = {str(t): int(i) for t, i in amb["ambiguous_tokens"].items()} + if set(amb_map.values()) != {int(x) for x in amb["ambiguous_ids"]}: + fail("WA3 ambiguity map ids and token dict disagree") + if any(t2i.get(t) != i for t, i in amb_map.items()) or not all("?" in t for t in amb_map): + fail("WA3 ambiguity map disagrees with the vocabulary") + return {"tok": tok, "semantic": semantic, "exact_linkage": ftr.ReviewA5WURCSPreTokenizerV3.exact_linkage_type, + "t2i": t2i, "i2t": {v: k for k, v in t2i.items()}, "invalid": specials | set(amb_map.values()), + "n_specials": len(specials), "n_ambiguity": len(amb_map), "mask_id": t2i["[MASK]"], + "branch_open_id": t2i["[BRANCH_OPEN]"], "linkage_unknown": int(ftr.LINKAGE_UNKNOWN), + "branch_depth_unknown": int(ftr.BRANCH_DEPTH_UNKNOWN)} + + +def compile_java_helper(): + classes = WORK / "java_classes" + if classes.exists(): + shutil.rmtree(classes) + src = WORK / "java_src/review/a5/A5WurcsArrayTreeAudit.java" + src.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(JAVA_DIR / "review_A5WurcsArrayTreeAudit.java", src) + classes.mkdir(parents=True) + cp = os.pathsep.join([str(JAVA_DIR / "review_wurcsframework-1.3.1.jar"), str(JAVA_DIR / "review_MolWURCS.jar")]) + subprocess.run([str(JAVA_BIN / "javac"), "-cp", cp, "-d", str(classes), str(src)], check=True) + return os.pathsep.join([str(classes), cp]) + + +def run_java_helper(classpath, wurcs_list): + payload = "".join("%d\t%s\n" % (i, base64.urlsafe_b64encode(w.encode()).decode().rstrip("=")) + for i, w in enumerate(wurcs_list)) + res = subprocess.run([str(JAVA_BIN / "java"), "-cp", classpath, "review.a5.A5WurcsArrayTreeAudit"], + input=payload, text=True, capture_output=True, check=True) + lines = res.stdout.splitlines() + if len(lines) != len(wurcs_list): + fail("official helper returned %d lines for %d inputs" % (len(lines), len(wurcs_list))) + out = [] + for i, line in enumerate(lines): + f = line.split("\t") + if int(f[0]) != i: + fail("official helper row order drift at %d" % i) + if len(f) < 2 or f[1] == "ERROR": # frozen builder semantics for ERROR rows + out.append({"rooted": False, "depths": (), "parents": (), "helper_error": True}) + continue + if len(f) < 27: + fail("official helper output truncated at row %d" % i) + rooted = f[20] == "true" + n = int(f[2]) + dec = lambda v: base64.urlsafe_b64decode(v + "=" * ((4 - len(v) % 4) % 4)).decode() # noqa: E731 + depths = tuple(int(x) for x in dec(f[24]).split(",")) if rooted else () + parents = tuple(int(x) for x in dec(f[26]).split(",")) if rooted else () + if rooted and (len(depths) != n or len(parents) != n): + fail("official rooted cardinality drift at row %d" % i) + out.append({"rooted": rooted, "depths": depths, "parents": parents, "helper_error": False}) + return out + + +def wa3_encode(w3, wurcs, auth): + """Frozen builder transform (review_build_official_sequence_topology_successor.py) + unit spans.""" + units = [dict(u) for u in w3["semantic"].pre_tokenize(wurcs) if u.get("text") != "[BRANCH_OPEN]"] + child = collections.Counter(v for v in auth["parents"] if v >= 0) + seen, repaired = set(), [] + for u in units: + u.pop("distance_matrix", None) + rid = int(u.get("residue_id", -1)) + u["linkage_type"] = 0 + if rid >= 0: + depth = int(auth["depths"][rid]) if auth["rooted"] else 202 + u["branch_depth"] = depth + if rid not in seen: + repaired.extend({"text": "[BRANCH_OPEN]", "type": "special", "residue_id": -1, + "branch_depth": depth, "linkage_type": 0} + for _ in range(max(0, child[rid] - 1))) + seen.add(rid) + else: + u["branch_depth"] = 0 + if u.get("type") == "linkage": + u["linkage_type"] = w3["exact_linkage"](str(u["text"])) + repaired.append(u) + pieces, spans, g, ords = [], [], 0, collections.Counter() + for u in repaired: + ps = [str(u["text"])] if u["type"] == "special" else list(w3["tok"].apply_bpe(str(u["text"]))) + s = len(pieces) + pieces.extend((p, int(u["residue_id"]), int(u["branch_depth"]), int(u["linkage_type"])) for p in ps) + if u["type"] != "special": + spans.append({"g": g, "start": s, "end": len(pieces) - 1, "unit_type": u["type"], + "unit_text": str(u["text"]), "ordinal": ords[u["type"]]}) + ords[u["type"]] += 1 + g += 1 + full = len(pieces) + capped = pieces[:255] + [("[END]", -1, 0, 0)] if full > 256 else list(pieces) + L = len(capped) + unk, pad = w3["t2i"]["[UNK]"], w3["t2i"]["[PAD]"] + enc = {"token_ids": [w3["t2i"].get(p[0], unk) for p in capped] + [pad] * (256 - L), + "residue_ids": [p[1] for p in capped] + [-1] * (256 - L), + "branch_depths": [p[2] for p in capped] + [0] * (256 - L), + "linkage_types": [p[3] for p in capped] + [0] * (256 - L), + "attention_mask": [1] * L + [0] * (256 - L), "length": L, "full_length": full, + "tokens": [p[0] for p in capped]} + return enc, spans + + +def parity_gate(w3, classpath, idx_rows): + arrays = {k: np.load(PKGD / ("review_%s.npy" % k), mmap_mode="r") + for k in ("token_ids", "residue_ids", "branch_depths", "linkage_types", "attention_mask")} + sample = [i for i in range(0, len(idx_rows), 97) if idx_rows[i]["truncated_at_256"] != "True"] + auths = run_java_helper(classpath, [idx_rows[i]["canonical_wurcs"] for i in sample]) + counts, bad = collections.Counter(), [] + for i, auth in zip(sample, auths): + enc, _ = wa3_encode(w3, idx_rows[i]["canonical_wurcs"], auth) + ok_all = True + for k, arr in arrays.items(): + same = np.array_equal(np.asarray(enc[k], dtype=np.int64), np.asarray(arr[i], dtype=np.int64)) + counts[k] += int(same) + ok_all &= same + counts["all"] += int(ok_all) + counts["helper_error"] += int(auth["helper_error"]) + if not ok_all and len(bad) < 10: + bad.append(idx_rows[i]["parent_glycorpus_id"]) + res = {"rows": len(sample), "matches": dict(counts), "mismatch_parents": bad, + "rule": "every 97th sequence_row excluding truncated_at_256; official helper + frozen transform"} + res["status"] = "PASS" if counts["all"] == len(sample) else "FAIL" + return res + + +# ============================================================== exposure of test glycans to WA3 +def wurcs_sections(w): + body = w[6:] if w.startswith("WURCS=") else w + out, buf, depth = [], [], 0 + for ch in body: + depth += (ch == "[") - (ch == "]") + if ch == "/" and depth == 0: + out.append("".join(buf)) + buf = [] + else: + buf.append(ch) + out.append("".join(buf)) + return out + + +def lin_key(w): + s = wurcs_sections(w) + if len(s) < 5: + return w + return "WURCS=" + "/".join(s[:4] + ["_".join(sorted(x for x in "/".join(s[4:]).split("_") if x))]) + + +def exposure_lookup(idx_rows): + exact, keyed = collections.defaultdict(list), collections.defaultdict(list) + for r in idx_rows: + exact[r["canonical_wurcs"]].append(r) + keyed[lin_key(r["canonical_wurcs"])].append(r) + priority = ["pretraining_train", "pretraining_development", "excluded_exact_or_verified_graph_identity"] + + def look(w): + hits = {id(r): r for r in exact.get(w, []) + keyed.get(lin_key(w), [])}.values() + if not hits: + return {"wa3_partition": "absent_from_wa3_sequence_parents", "wa3_match_mode": "none", "wa3_parent_id": ""} + parts = {r["pretraining_partition"] for r in hits} + best = next((p for p in priority if p in parts), sorted(parts)[0]) + hit = next(r for r in hits if r["pretraining_partition"] == best) + mode = "exact" if hit["canonical_wurcs"] == w else "lin_order_insensitive" + return {"wa3_partition": best, "wa3_match_mode": mode, "wa3_parent_id": hit["parent_glycorpus_id"]} + return look + + +# ============================================================== A_chem (verbatim logic from iar_achem_q_20260824_r1/a.py) +def load_achem(): + sys.path.insert(0, str(SCHEMA_DIR)) + from pipelib import parse_record, SIDE_RE, node_index # noqa: E402 + from classify import PLAIN_LINK # noqa: E402 + no_oh = set("Amd") + + def a_chem(rec, ai, skip_li): + occ = set() + for ei, e in enumerate([x for x in rec["lin"].split("_") if x]): + if ei == skip_li: + continue + m = PLAIN_LINK.match(e) + if not m: + continue + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if sm and sm.group(2) != "?": + try: + if node_index(sm.group(1)) - 1 == ai: + occ.add(int(sm.group(2))) + except ValueError: + pass + sk = rec["skel"][ai] + if not sk: + return None, "no_skeleton" + n = len(sk) + if n < 3: + return None, "skeleton_lt_3" + if n > 12: + return None, "skeleton_gt_12" + free = set(range(1, n + 1)) + if rec["anom"][ai] is not None: + free.discard(rec["anom"][ai]) + rg = rec["ring"][ai] + if rg and rg[1] != "?": + try: + free.discard(int(rg[1])) + except ValueError: + pass + free -= set(rec["subs"][ai]) + for p, ch in enumerate(sk, 1): + if ch in no_oh: + free.discard(p) + return free - occ, "ok" + + def for_linkage(wurcs, entry): + rec = parse_record(wurcs) + if rec is None or not rec["lin"]: + return {"achem_status": "unparsable"} + ents = [x for x in rec["lin"].split("_") if x] + if ents.count(entry) != 1: + return {"achem_status": "entry_not_unique_in_lin"} + li = ents.index(entry) + m = PLAIN_LINK.match(entry) + if not m: + return {"achem_status": "not_plain_linkage"} + sides = [] + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if not sm or sm.group(2) == "?": + return {"achem_status": "side_unparsable"} + try: + sides.append((node_index(sm.group(1)) - 1, int(sm.group(2)))) + except ValueError: + return {"achem_status": "bad_label"} + donor_flags = [0 <= ai < rec["nres"] and rec["anom"][ai] is not None and rec["anom"][ai] == p for ai, p in sides] + if donor_flags.count(True) != 1: + return {"achem_status": "orientation_undetermined"} + ai, truth_pos = sides[donor_flags.index(False)] + A, why = a_chem(rec, ai, li) + if A is None: + return {"achem_status": why} + k = len(A) + return {"achem_status": "ok", "achem_k": k, "achem_positions": sorted(A), "truth_in_achem": truth_pos in A, + "achem_chance": (1.0 / k) if k else None} + return for_linkage + + +# ============================================================== WA3 cases, model, evaluation +def build_wa3_cases(w3, wa0_cases, encodings, look): + cases, excluded = [], collections.Counter() + for c in wa0_cases: + enc, spans = encodings[c["wurcs"]] + by_g = {s["g"]: s for s in spans} + positions, texts = [], [] + for u in c["units"]: + s = by_g.get(u["g"]) + if s is None or s["unit_text"] != u["unit_text"] or s["unit_type"] != u["unit_type"]: + fail("unit mapping mismatch for %s unit %s" % (c["case_id"], u)) + positions.extend(range(s["start"], s["end"] + 1)) + texts.append(u["unit_text"]) + if max(positions) >= enc["length"] - (1 if enc["full_length"] > 256 else 0): + excluded["wa3_truncated_beyond_256"] += 1 + continue + truth = [enc["token_ids"][p] for p in positions] + masked = list(enc["token_ids"]) + for p in positions: + masked[p] = w3["mask_id"] + flags = {"enumerated_alternative": any("|" in t for t in texts), + "unknown_question_mark": any("?" in t for t in texts), + "wa3_truth_uses_invalid_token": any(t in w3["invalid"] for t in truth)} + flags["single_answer"] = not any(flags.values()) + lt_blank, bd_blank = list(enc["linkage_types"]), list(enc["branch_depths"]) + # Blank the channels that encode the hidden unit, honouring WA3's own input contract + # (composite_r4.validate_sequence_surface:584-592): linkage pieces are exactly residue_id == -2 and + # must keep a nonzero linkage class; non-residue pieces must keep branch depth 0. + for p in positions: + if enc["residue_ids"][p] == -2: + lt_blank[p] = w3["linkage_unknown"] # 9 = the class WA3 already uses for '?' linkages + elif enc["residue_ids"][p] >= 0: + bd_blank[p] = w3["branch_depth_unknown"] # 202 = the depth WA3 uses when the tree is not rooted + cases.append({**{k: c[k] for k in ("case_id", "glycan_index", "wurcs", "mask_plan", "units", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")}, + "unit_text": " | ".join("%s:%s" % (u["unit_type"], u["unit_text"]) for u in c["units"]), + "positions": positions, "truth_ids": truth, "masked_ids": masked, + "attention_mask": enc["attention_mask"], "residue_ids": enc["residue_ids"], + "branch_depths": enc["branch_depths"], "linkage_types": enc["linkage_types"], + "branch_depths_blank": bd_blank, "linkage_types_blank": lt_blank, + **flags, **look(c["wurcs"])}) + return cases, dict(excluded) + + +def all_absent(B, dev): # contract from iar_bytype3_20260825_r1/bytype.py (job 12094273) + return {"ms_token_ids": torch.empty((0, 64), dtype=torch.long, device=dev), + "ms_attention_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), + "ms_input_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), "ms_labels": None, + "ms_acquisition_parent_indices": torch.empty((0,), dtype=torch.long, device=dev), + "ms_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), "ms_mode": "development", + "static_token_ids": torch.zeros((B, 1, 4), dtype=torch.long, device=dev), + "static_attention_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), + "static_residue_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_slot_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_state_mask": torch.zeros((B, 1), dtype=torch.bool, device=dev), + "static_state_ids": torch.full((B, 1), -1, dtype=torch.long, device=dev), + "static_input_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), "static_labels": None, + "static_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), + "md_values": torch.zeros((B, 2, 20, 6), dtype=torch.float32, device=dev), + "md_feature_mask": torch.zeros((B, 2, 20, 6), dtype=torch.bool, device=dev), + "md_child_present_mask": torch.zeros((B, 2), dtype=torch.bool, device=dev), + "md_state_row_ids": torch.full((B, 2), -1, dtype=torch.long, device=dev), + "md_window_input_mask": torch.zeros((B, 2, 20), dtype=torch.bool, device=dev), "md_labels": None, + "md_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev)} + + +def load_model(): + spec = importlib.util.spec_from_file_location("wa3_train_mod", str(TRAIN_MOD)) + tm = importlib.util.module_from_spec(spec) + sys.modules["wa3_train_mod"] = tm + spec.loader.exec_module(tm) + if sha256_file(CK) != CK_SHA: + fail("WA3 checkpoint sha mismatch") + ctx = tm.native_authority(None, static_active=False) + _native, r8, _static, _runner = ctx.__enter__() + r5 = r8._core._r6._r5 + if int(r5.SEQUENCE_VOCAB_SIZE) != 2114: + fail("r5.SEQUENCE_VOCAB_SIZE != 2114") + model = tm.mdcore.make_md_enabled_composite_class(r5)(r8.NativeEightConfig(cell_id="A111", seq_vocab_size=2114), + md_cell_id="A1111", md_temporal_size=128) + ck = torch.load(CK, map_location="cpu", weights_only=False) + if str(ck.get("md_cell_id")) != "A1111" or int(ck["selection"]["best_epoch"]) != 58: + fail("checkpoint identity is not A1111 / best epoch 58") + model.load_state_dict(ck["model_state"], strict=True) + n_par = sum(p.numel() for p in model.parameters()) + if n_par != 138487995 or len(model.state_dict()) != 505: + fail("WA3 inventory %d params / %d tensors" % (n_par, len(model.state_dict()))) + model.eval() + dev = "cuda" if torch.cuda.is_available() else "cpu" + model.to(dev) + return model, dev, ctx + + +def evaluate(model, dev, w3, cases, threshold, blank_side_channels=False): + bd_key = "branch_depths_blank" if blank_side_channels else "branch_depths" + lt_key = "linkage_types_blank" if blank_side_channels else "linkage_types" + results = [] + for b0 in range(0, len(cases), BATCH): + batch = cases[b0:b0 + BATCH] + current = [list(c["masked_ids"]) for c in batch] + unresolved = [set(c["positions"]) for c in batch] + initial, accepted = [[] for _ in batch], [[] for _ in batch] + for it in range(ITERATIONS): + t = lambda key: torch.tensor([c[key] for c in batch], dtype=torch.long, device=dev) # noqa: E731 + with torch.inference_mode(): + o = model(seq_token_ids=torch.tensor(current, dtype=torch.long, device=dev), + seq_attention_mask=t("attention_mask").bool(), seq_residue_ids=t("residue_ids"), + seq_branch_depths=t(bd_key), seq_linkage_types=t(lt_key), + seq_labels=None, topology_labels=None, topology_available=None, + **all_absent(len(batch), torch.device(dev))) + logits = o.sequence_logits.float() + progress = 0 + for ci, c in enumerate(batch): + if not unresolved[ci]: + continue + for li, pos in enumerate(c["positions"]): + tp, ti = torch.topk(torch.softmax(logits[ci, pos], dim=-1), k=TOP_K) + ids = [int(x) for x in ti.tolist()] + if it == 0: + initial[ci].append((ids[0] == c["truth_ids"][li], c["truth_ids"][li] in ids)) + if pos not in unresolved[ci]: + continue + if float(tp[0]) < threshold or ids[0] in w3["invalid"]: + continue + current[ci][pos] = ids[0] + unresolved[ci].remove(pos) + progress += 1 + accepted[ci].append(it + 1) + if progress == 0: + break + for ci, c in enumerate(batch): + final = [current[ci][p] for p in c["positions"]] + correct = [f == t for f, t in zip(final, c["truth_ids"])] + results.append({k: c[k] for k in ("case_id", "glycan_index", "mask_plan", "unit_text", "single_answer", + "enumerated_alternative", "unknown_question_mark", + "wa3_truth_uses_invalid_token", "wa3_partition", "wa3_match_mode", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")} + | {"num_masked_positions": len(c["positions"]), + "truth_tokens": [w3["i2t"][x] for x in c["truth_ids"]], + "final_tokens": [w3["i2t"][x] for x in final], + "initial_top1_correct_count": sum(a for a, _ in initial[ci]), + "initial_top5_correct_count": sum(b for _, b in initial[ci]), + "resolved_count": len(c["positions"]) - len(unresolved[ci]), + "final_correct_count": sum(correct), + "initial_span_exact_top1": all(a for a, _ in initial[ci]), + "initial_span_exact_top5": all(b for _, b in initial[ci]), + "iterative_span_exact": all(correct), + "iterations_used": max(accepted[ci], default=0)}) + return results + + +def aggregate(rs): # identical formulas to HeldoutIPAEvaluator._aggregate_slice + n = len(rs) + if not n: + return {"num_cases": 0} + pos = sum(r["num_masked_positions"] for r in rs) + res = sum(r["resolved_count"] for r in rs) + cor = sum(r["final_correct_count"] for r in rs) + return {"num_cases": n, "num_masked_positions": pos, "avg_masked_positions_per_case": pos / n, + "initial_top1_token_accuracy": sum(r["initial_top1_correct_count"] for r in rs) / pos, + "initial_top5_token_accuracy": sum(r["initial_top5_correct_count"] for r in rs) / pos, + "initial_exact_span_accuracy_top1": sum(bool(r["initial_span_exact_top1"]) for r in rs) / n, + "initial_exact_span_accuracy_top5": sum(bool(r["initial_span_exact_top5"]) for r in rs) / n, + "iterative_resolved_fraction": res / pos, + "iterative_accuracy_among_resolved": (cor / res) if res else 0.0, + "iterative_final_token_accuracy": cor / pos, + "iterative_exact_span_accuracy": sum(bool(r["iterative_span_exact"]) for r in rs) / n, + "avg_iterations_used_per_case": sum(r["iterations_used"] for r in rs) / n} + + +def paired(rs): + n = len(rs) + if not n: + return {"n": 0} + a = [bool(r["wa0_iterative_span_exact"]) for r in rs] + b = [bool(r["iterative_span_exact"]) for r in rs] + return {"n": n, "wa0_exact_span": sum(a) / n, "wa3_exact_span": sum(b) / n, + "both": sum(x and y for x, y in zip(a, b)), "wa0_only": sum(x and not y for x, y in zip(a, b)), + "wa3_only": sum(y and not x for x, y in zip(a, b)), "neither": sum(not x and not y for x, y in zip(a, b))} + + +# ============================================================== R2-05 baselines (port of r2_05_baselines.py) +class BaselineStats: + def __init__(self): + self.marginal = collections.defaultdict(collections.Counter) + self.ctx_pair = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.ctx_prev = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.n_glycans = 0 + self.feature_ids, self._feats, self._donor = {}, [], collections.defaultdict(list) + self.text_ids, self.texts, self.donor_index = {}, [], {} + + def _tid(self, text): + if text not in self.text_ids: + self.text_ids[text] = len(self.texts) + self.texts.append(text) + return self.text_ids[text] + + def add(self, index, unpadded, records): + self.n_glycans += 1 + feats = set() + for r in records: + key = (r["unit_type"], r["unit_text"]) + feats.add(self.feature_ids.setdefault(key, len(self.feature_ids))) + if not r["eligible"]: + continue + ut, text = r["unit_type"], r["unit_text"] + self.marginal[ut][text] += 1 + prev_t = unpadded[r["start"] - 1] if r["start"] > 0 else "" + next_t = unpadded[r["end"] + 1] if r["end"] + 1 < len(unpadded) else "" + self.ctx_pair[ut][(prev_t, next_t)][text] += 1 + self.ctx_prev[ut][prev_t][text] += 1 + self._donor[(ut, r["ordinal"])].append((index, self._tid(text))) + self._feats.append(sorted(feats)) + + def finalize(self): + counts = np.zeros(len(self.feature_ids) + 1, dtype=np.int64) + for fs in self._feats: + for f in fs: + counts[f + 1] += 1 + self.indptr = np.cumsum(counts) + self.rows = np.zeros(int(self.indptr[-1]), dtype=np.int32) + fill = self.indptr[:-1].copy() + for gid, fs in enumerate(self._feats): + for f in fs: + self.rows[fill[f]] = gid + fill[f] += 1 + self.sizes = np.array([len(fs) for fs in self._feats], dtype=np.int64) + self._feats = [] + for key, pairs in self._donor.items(): + pairs.sort() + self.donor_index[key] = (np.array([p[0] for p in pairs], dtype=np.int64), + np.array([p[1] for p in pairs], dtype=np.int64)) + self._donor = {} + + @staticmethod + def _argmax(counter): + total = sum(counter.values()) + text = min(counter.items(), key=lambda kv: (-kv[1], kv[0]))[0] + return text, counter[text] / total + + def marginal_pred(self, ut): + return self._argmax(self.marginal[ut]) if self.marginal.get(ut) else (None, 0.0) + + def context_pred(self, ut, prev_t, next_t): + c = self.ctx_pair.get(ut, {}).get((prev_t, next_t)) + if c: + return self._argmax(c)[0], "prev_next" + c = self.ctx_prev.get(ut, {}).get(prev_t) + if c: + return self._argmax(c)[0], "prev_only" + return self.marginal_pred(ut)[0], "marginal_backoff" + + def nn_pred(self, ut, ordinal, query_keys): + donor = self.donor_index.get((ut, ordinal)) + if donor is None: + return None + cand_idx, cand_txt = donor + fids = [self.feature_ids[k] for k in query_keys if k in self.feature_ids] + if fids: + rows = np.concatenate([self.rows[self.indptr[f]:self.indptr[f + 1]] for f in fids]) + inter = np.bincount(rows, minlength=self.n_glycans)[cand_idx].astype(np.float64) + else: + inter = np.zeros(len(cand_idx)) + union = self.sizes[cand_idx] + len(query_keys) - inter + jac = np.divide(inter, union, out=np.zeros_like(inter), where=union > 0) + return self.texts[int(cand_txt[int(np.argmax(jac))])] + + +def fit_baselines(w3, idx_rows, test_wurcs): + token_ids = np.load(PKGD / "review_token_ids.npy", mmap_mode="r") + lengths = np.load(PKGD / "review_lengths.npy", mmap_mode="r") + stats, counts, bo, unk = BaselineStats(), collections.Counter(), w3["branch_open_id"], w3["t2i"]["[UNK]"] + test_keys = {lin_key(w) for w in test_wurcs} + for i, r in enumerate(idx_rows): + if r["pretraining_partition"] != "pretraining_train" or r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + counts["removed_test_glycan"] += 1 + continue + L = int(lengths[i]) + ids = [int(x) for x in token_ids[i, :L]] + p, recs, ords, ok = 0, [], collections.Counter(), True + for u in w3["semantic"].pre_tokenize(w): + if u.get("text") == "[BRANCH_OPEN]": + continue + while p < L and ids[p] == bo: + p += 1 + ps = [u["text"]] if u["type"] == "special" else list(w3["tok"].apply_bpe(u["text"])) + pid = [w3["t2i"].get(x, unk) for x in ps] + if ids[p:p + len(pid)] != pid: + ok = False + break + if u["type"] != "special": + recs.append({"start": p, "end": p + len(pid) - 1, "unit_type": u["type"], "unit_text": u["text"], + "ordinal": ords[u["type"]], "eligible": not any(x in w3["invalid"] for x in pid)}) + ords[u["type"]] += 1 + p += len(pid) + while ok and p < L and ids[p] == bo: + p += 1 + if not ok or p != L: + counts["unit_walk_mismatch"] += 1 + continue + stats.add(counts["fitted"], [w3["i2t"][x] for x in ids], recs) + counts["fitted"] += 1 + stats.finalize() + return stats, dict(counts) + + +def score_prediction(truth_tokens, pred_tokens): + n = len(truth_tokens) + if pred_tokens is None: + ok, nc = False, 0 + else: + ok = list(pred_tokens) == list(truth_tokens) + nc = sum(a == b for a, b in zip(pred_tokens, truth_tokens)) if len(pred_tokens) == n else 0 + return {"num_masked_positions": n, "initial_top1_correct_count": nc, "initial_top5_correct_count": nc, + "resolved_count": n if pred_tokens is not None else 0, "final_correct_count": nc, + "initial_span_exact_top1": ok, "initial_span_exact_top5": ok, "iterative_span_exact": ok, + "iterations_used": 0} + + +def run_baselines(w3, stats, cases, encodings, results_by_id, results_blank_by_id=None): + method_rows = collections.defaultdict(list) + for c in cases: + if len(c["units"]) != 1: + continue + enc, spans = encodings[c["wurcs"]] + s = {sp["g"]: sp for sp in spans}[c["units"][0]["g"]] + tokens = [w3["i2t"][x] for x in enc["token_ids"][:enc["length"]]] + prev_t = tokens[s["start"] - 1] if s["start"] > 0 else "" + next_t = tokens[s["end"] + 1] if s["end"] + 1 < len(tokens) else "" + query = {(sp["unit_type"], sp["unit_text"]) for sp in spans if sp["g"] != s["g"]} + truth = [w3["i2t"][x] for x in c["truth_ids"]] + bpe = lambda t: None if t is None else list(w3["tok"].apply_bpe(t)) # noqa: E731 + preds = {"marginal_frequency": bpe(stats.marginal_pred(s["unit_type"])[0]), + "context_frequency": bpe(stats.context_pred(s["unit_type"], prev_t, next_t)[0]), + "nearest_neighbour": bpe(stats.nn_pred(s["unit_type"], s["ordinal"], query))} + flags = {k: c[k] for k in ("single_answer", "wa3_partition")} + for m, p in preds.items(): + method_rows[m].append({**score_prediction(truth, p), **flags}) + method_rows["WA3_harness_inputs"].append({**results_by_id[c["case_id"]]}) + if results_blank_by_id is not None: + method_rows["WA3_side_channels_blanked"].append({**results_blank_by_id[c["case_id"]]}) + wa0 = {"num_masked_positions": 1, "initial_top1_correct_count": 0, "initial_top5_correct_count": 0, + "resolved_count": 1, "final_correct_count": 0, "initial_span_exact_top1": c["wa0_initial_span_exact_top1"], + "initial_span_exact_top5": False, "iterative_span_exact": c["wa0_iterative_span_exact"], + "iterations_used": 0, **flags} + method_rows["WA0_submitted"].append(wa0) + table = [] + for m, rows in method_rows.items(): + for subset, sel in (("all_cases", rows), ("single_answer", [r for r in rows if r["single_answer"]]), + ("single_answer_not_in_wa3_training", + [r for r in rows if r["single_answer"] and r["wa3_partition"] != "pretraining_train"])): + a = aggregate(sel) + table.append({"method": m, "subset": subset, "n": a["num_cases"], + "exact_span_accuracy": round(a.get("iterative_exact_span_accuracy", 0.0), 4)}) + return table + + +# ============================================================== main +def summarize_run(results, cases_all, excluded, cfg, results_blank=None): + sa = [r for r in results if r["single_answer"]] + unseen = lambda rs: [r for r in rs if r["wa3_partition"] != "pretraining_train"] # noqa: E731 + out = {"wa0_config": cfg, "wa3_excluded": excluded, + "flags": {"cases": len(results), "single_answer": len(sa), + "enumerated_alternative": sum(r["enumerated_alternative"] for r in results), + "unknown_question_mark": sum(r["unknown_question_mark"] for r in results), + "wa3_truth_uses_invalid_token": sum(r["wa3_truth_uses_invalid_token"] for r in results)}, + "exposure": dict(collections.Counter(r["wa3_partition"] for r in results)), + "wa3_all_cases": aggregate(results), "wa3_single_answer": aggregate(sa), + "wa3_single_answer_not_in_wa3_training": aggregate(unseen(sa)), + "paired_wa0_vs_wa3_all_cases": paired(results), "paired_wa0_vs_wa3_single_answer": paired(sa)} + if results_blank is not None: + sb = [r for r in results_blank if r["single_answer"]] + out["wa3_side_channels_blanked_all_cases"] = aggregate(results_blank) + out["wa3_side_channels_blanked_single_answer"] = aggregate(sb) + out["wa3_side_channels_blanked_single_answer_not_in_wa3_training"] = aggregate(unseen(sb)) + ach = [c for c in cases_all if "achem_status" in c] + if ach: + by_id = {r["case_id"]: r for r in results} + strata = collections.defaultdict(list) + status = collections.Counter(c["achem_status"] for c in ach) + for c in ach: + if c["achem_status"] != "ok" or not by_id[c["case_id"]]["single_answer"]: + continue + k = c["achem_k"] + strata["k=0" if k == 0 else ("k=1" if k == 1 else ("k=2" if k == 2 else ("k=3" if k == 3 else "k>=4")))].append(c) + out["achem"] = {"status": dict(status), "strata": {}} + for name, cs in sorted(strata.items()): + rs = [by_id[c["case_id"]] for c in cs] + row = {"n": len(cs), "mean_chance": float(np.mean([c["achem_chance"] or 0 for c in cs])), + "truth_in_achem": sum(c["truth_in_achem"] for c in cs), + "wa3_exact_span_harness_inputs": aggregate(rs)["iterative_exact_span_accuracy"], + "wa0_exact_span_harness_inputs": sum(c["wa0_iterative_span_exact"] for c in cs) / len(cs)} + if results_blank is not None: + bb = {r["case_id"]: r for r in results_blank} + row["wa3_exact_span_side_channels_blanked"] = aggregate([bb[c["case_id"]] for c in cs])["iterative_exact_span_accuracy"] + out["achem"]["strata"][name] = row + return out + + +def main(): + OUT.mkdir(parents=True, exist_ok=True) + manifest = {"schema": "bertose_wa3_same_test_heldout_masking_v1", "started": time.strftime("%Y-%m-%dT%H:%M:%S"), + "slurm_job_id": os.environ.get("SLURM_JOB_ID"), "host": platform.node(), "python": sys.version.split()[0], + "torch": torch.__version__, "threads": torch.get_num_threads(), + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back"} + for path, expect in EXPECTED_SHA.items(): + got = sha256_file(path) + if got != expect: + fail("%s sha %s != %s" % (path, got, expect)) + log("all %d pinned file hashes match" % len(EXPECTED_SHA)) + + hie, ev0 = load_wa0_evaluator() + w3 = build_wa3_tokenizer() + manifest["wa3_invalid_prediction_set"] = {"specials": w3["n_specials"], "ambiguity_tokens": w3["n_ambiguity"]} + java_cp = compile_java_helper() + with gzip.open(PKGD / "review_sequence_parent_index.tsv.gz", "rt", newline="") as fh: + idx_rows = list(csv.DictReader(fh, delimiter="\t")) + if len(idx_rows) != 281208: + fail("parent index row count %d" % len(idx_rows)) + + parity = parity_gate(w3, java_cp, idx_rows) + write_json(OUT / "gate_wa3_input_parity.json", parity) + log("WA3 input parity: %s %s/%d" % (parity["status"], parity["matches"].get("all", 0), parity["rows"])) + if parity["status"] != "PASS": + fail("WA3 inputs do not reproduce the training arrays; see gate_wa3_input_parity.json") + + look = exposure_lookup(idx_rows) + achem = load_achem() + set_data, all_test_wurcs = {}, set() + for set_name, spec in SETS.items(): + first_cfg = parse_wa0_summary(spec["wa0_root"] / spec["runs"][0]) + csv_path = Path(first_cfg["input_csv"]) if set_name == "bench1392" else WORK / "inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv" + rows = hie.load_rows(input_csv=csv_path, limit=first_cfg["glycans_loaded"], shuffle=False, seed=42) + manifest.setdefault("inputs", {})[set_name] = {"csv": str(csv_path), "sha256": sha256_file(csv_path), "rows": len(rows)} + uniq = sorted({r["wurcs"] for r in rows}) + auths = run_java_helper(java_cp, uniq) + encodings = {w: wa3_encode(w3, w, a) for w, a in zip(uniq, auths)} + manifest["inputs"][set_name]["helper_errors"] = sum(a["helper_error"] for a in auths) + manifest["inputs"][set_name]["exposure_glycans"] = dict(collections.Counter(look(w)["wa3_partition"] for w in uniq)) + set_data[set_name] = (rows, encodings) + all_test_wurcs.update(uniq) + log("%s: %d glycans; WA3 exposure %s" % (set_name, len(uniq), manifest["inputs"][set_name]["exposure_glycans"])) + + built, identity_failures = [], [] + for set_name, spec in SETS.items(): + rows, encodings = set_data[set_name] + for run in spec["runs"]: + try: + cfg, wa0_cases = rebuild_wa0_cases(hie, ev0, rows, spec["wa0_root"] / run) + except (SystemExit, OSError, KeyError, ValueError) as exc: + identity_failures.append({"set": set_name, "run": run, "reason": str(exc)}) + log("%s/%s: SKIPPED, not the same test: %s" % (set_name, run, exc)) + continue + cases, excluded = build_wa3_cases(w3, wa0_cases, encodings, look) + for c in cases: + if len(c["units"]) == 1 and c["units"][0]["unit_type"] == "linkage": + c.update(achem(c["wurcs"], c["units"][0]["unit_text"])) + manifest["inputs"][set_name].setdefault("wa0_checkpoints", {})[run] = cfg["checkpoint"] + built.append((set_name, run, cfg, cases, excluded)) + log("%s/%s: WA0 cases rebuilt and verified (%d); WA3 cases %d; excluded %s" + % (set_name, run, len(wa0_cases), len(cases), excluded)) + write_json(OUT / "gate_case_identity.json", {"status": "PASS" if not identity_failures else "PARTIAL", + "verified_runs": [(s, r, len(c)) for s, r, _, c, _ in built], + "skipped_runs": identity_failures}) + manifest["case_identity_skipped_runs"] = identity_failures + if not built: + fail("no run could be reproduced as the same test") + + model, dev, ctx = load_model() + manifest["device"] = dev + log("WA3 loaded strict 505/505 on %s" % dev) + + table, results_store = [], {} + for set_name, run, cfg, cases, excluded in built: + run_dir = OUT / set_name / run + case_digest = hashlib.sha256("\n".join(c["case_id"] for c in cases).encode()).hexdigest() + prior = json.load(_real_open(run_dir / "summary.json")) if (run_dir / "summary.json").is_file() else {} + if prior.get("script_sha256") == SCRIPT_SHA and prior.get("case_ids_sha256") == case_digest \ + and (run_dir / "case_results.jsonl").is_file(): + results = [json.loads(l) for l in _real_open(run_dir / "case_results.jsonl")] + summary = json.load(_real_open(run_dir / "summary.json")) + log("%s/%s: reused completed outputs" % (set_name, run)) + else: + t0 = time.time() + results = evaluate(model, dev, w3, cases, cfg["threshold"]) + results_blank = None + if run in SETS[set_name]["baseline_runs"]: + results_blank = evaluate(model, dev, w3, cases, cfg["threshold"], blank_side_channels=True) + run_dir.parent.mkdir(parents=True, exist_ok=True) + with _real_open(run_dir.parent / (run + "__side_channels_blanked.jsonl"), "w") as fh: + for r in results_blank: + fh.write(json.dumps(r) + "\n") + summary = summarize_run(results, cases, excluded, cfg, results_blank) + summary["script_sha256"], summary["case_ids_sha256"] = SCRIPT_SHA, case_digest + summary["seconds"] = round(time.time() - t0, 1) + run_dir.mkdir(parents=True, exist_ok=True) + tmp = run_dir / "case_results.jsonl.tmp" + with _real_open(tmp, "w") as fh: + for r in results: + fh.write(json.dumps(r) + "\n") + tmp.replace(run_dir / "case_results.jsonl") + write_json(run_dir / "summary.json", summary) + log("%s/%s: WA3 exact-span all %.4f | single-answer %.4f | WA0 paired %.4f (%.0fs)" + % (set_name, run, summary["wa3_all_cases"].get("iterative_exact_span_accuracy", 0), + summary["wa3_single_answer"].get("iterative_exact_span_accuracy", 0), + summary["paired_wa0_vs_wa3_all_cases"].get("wa0_exact_span", 0), summary["seconds"])) + results_store[(set_name, run)] = results + blank_path = OUT / set_name / (run + "__side_channels_blanked.jsonl") + if blank_path.is_file(): + results_store[(set_name, run, "blank")] = [json.loads(l) for l in _real_open(blank_path)] + a, s, u = summary["wa3_all_cases"], summary["wa3_single_answer"], summary["wa3_single_answer_not_in_wa3_training"] + p = summary["paired_wa0_vs_wa3_all_cases"] + table.append({"set": set_name, "run": run, "threshold": cfg["threshold"], "mask_plan": cfg["mask_plan"] or cfg["span_types"][0] + ":1", + "cases": a.get("num_cases", 0), "wa0_exact_span_same_cases": round(p.get("wa0_exact_span", 0), 4), + "wa3_exact_span": round(a.get("iterative_exact_span_accuracy", 0), 4), + "wa3_resolved_fraction": round(a.get("iterative_resolved_fraction", 0), 4), + "wa3_accuracy_among_resolved": round(a.get("iterative_accuracy_among_resolved", 0), 4), + "single_answer_cases": s.get("num_cases", 0), + "wa3_exact_span_single_answer": round(s.get("iterative_exact_span_accuracy", 0), 4), + "single_answer_not_in_wa3_training_cases": u.get("num_cases", 0), + "wa3_exact_span_single_answer_not_in_wa3_training": round(u.get("iterative_exact_span_accuracy", 0), 4) if u.get("num_cases") else "", + "wa3_exact_span_side_channels_blanked": round(summary["wa3_side_channels_blanked_all_cases"]["iterative_exact_span_accuracy"], 4) + if summary.get("wa3_side_channels_blanked_all_cases", {}).get("num_cases") else ""}) + with _real_open(OUT / "summary_table.csv", "w", newline="") as fh: + wr = csv.DictWriter(fh, fieldnames=list(table[0].keys())) + wr.writeheader() + wr.writerows(table) + ctx.__exit__(None, None, None) + del model + log("WA3 evaluation complete; fitting baselines") + + stats, fit_counts = fit_baselines(w3, idx_rows, all_test_wurcs) + manifest["baseline_fit"] = fit_counts + base_table = [] + for set_name, run, cfg, cases, excluded in built: + if run not in SETS[set_name]["baseline_runs"] or (set_name, run) not in results_store: + continue + by_id = {r["case_id"]: r for r in results_store[(set_name, run)]} + blank = results_store.get((set_name, run, "blank")) + blank_by_id = {r["case_id"]: r for r in blank} if blank else None + encodings = set_data[set_name][1] + for row in run_baselines(w3, stats, cases, encodings, by_id, blank_by_id): + base_table.append({"set": set_name, "run": run, **row}) + if not base_table: + base_table = [{"set": "", "run": "", "method": "none", "subset": "", "n": 0, "exact_span_accuracy": ""}] + with _real_open(OUT / "baselines_same_cases.csv", "w", newline="") as fh: + wr = csv.DictWriter(fh, fieldnames=list(base_table[0].keys())) + wr.writeheader() + wr.writerows(base_table) + manifest["finished"] = time.strftime("%Y-%m-%dT%H:%M:%S") + manifest["script_sha256"] = sha256_file(Path(__file__)) + manifest["status"] = "COMPLETE" if not identity_failures else "PARTIAL_RUNS_SKIPPED" + write_json(OUT / "run_manifest.json", manifest) + log("DONE") + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/iar_completion/originals/wa3_typed_strict_test.py b/releases/2026-10-02/iar_completion/originals/wa3_typed_strict_test.py new file mode 100644 index 0000000000000000000000000000000000000000..8e17eca08b79dbe3f377557db21efeff61ad64d9 --- /dev/null +++ b/releases/2026-10-02/iar_completion/originals/wa3_typed_strict_test.py @@ -0,0 +1,1165 @@ +#!/usr/bin/env python3 +"""STRICT typed-decoding DIAGNOSTIC, child of wa3_typed_test.py (sha 1341b005..., job 16591409), 2026-09-25. + +Question: is the controlled linkage failure a bug, or the class-9 input steering the model? In WA3 training a +masked token with linkage class 9 was always complex notation ('?' tokens are never MLM targets and simple +linkages always carry classes 1-8), so blanking to 9 asks for complex notation. Here linkage slots may only be +filled with tokens seen in ORDINARY linkages (class 1-8) in training, for BERTose and all baselines alike. +Residue slots are unchanged from the parent. truth_outside_answer_space reports any target this makes impossible. + +Parent docstring follows. + +TYPED-DECODING child of wa3_same_test.py (sha 0da5f247..., job 12847066), 2026-09-24. + +Only change: every method answers from the same, type-consistent answer space. + * BERTose: at a masked linkage piece (residue_id == -2) the softmax is taken only over tokens seen as + linkage pieces in WA3 training parents; at a masked residue piece (residue_id >= 0) only over tokens + seen as residue pieces. Specials, '?' ambiguity tokens and enumerated-alternative ('|') tokens are + excluded, because the test never scores them as correct (single_answer excludes '|' and '?'). + Probabilities are renormalised within the allowed set; threshold 0.80, 3 rounds, cases, inputs + (class 9 / depth 202 blanking) and metrics unchanged. + * Baselines: enumerated-alternative ('|') units are no longer prediction candidates, so all methods + choose from the same answer space. Their features/similarity are unchanged. +Runs: the four primary single-span runs only (bench1392 residue/linkage, seal162 residue/linkage at 0.80). + +Original docstring follows. + +WA3 rerun of the submitted held-out masking tests, on the SAME cases. + +Tests reproduced (both reported in the original submission): + * bench1392 -- 1,392 benchmark glycans (Supplementary Fig. 4; WA0 runs on Nova, 04-24) + * seal162 -- 162 paper-novel grey-seal milk glycans (Supplementary Fig. 5; WA0 runs 04-24/25) + +Same test, by construction: + 1. The untouched submitted harness (heldout_ipa_eval.py, sha 8d05a404...) rebuilds every WA0 case + with the submitted tokenizer, vocabulary, eligibility rule, seed 42 and mask plans. Every rebuilt + case must equal the WA0 run's own case_details.jsonl (case ids, masked positions, truth ids), + otherwise the job stops. + 2. Each masked WA0 span is mapped to its WURCS semantic unit(s). WA3 masks exactly those units. + 3. WA3 inputs are built exactly as WA3's training arrays were built: official WURCSArray helper + (Java) for branch structure + the frozen builder's repair + frozen 2,114-token BPE. A parity gate + rebuilds a sample of WA3 training parents and requires 100% agreement on all five channels. + 4. Filling, threshold, 3 rounds, top-k and every metric are identical to the harness. + +Reviewer 2 point 5 (irreducible uncertainty, simple baselines) is handled on the same cases: + * masked units that are curator-declared enumerations ('|') or unknown ('?') are flagged and + excluded from the single-answer score (reported separately, never silently dropped) + * each masked single linkage gets |A_chem| (chemically admissible acceptor positions; chance=1/k) + * marginal-frequency, context-frequency and nearest-neighbour baselines fitted on WA3's own + training parents (test glycans removed) are scored on the identical single-span cases + +Inference only on the frozen reported model (WA3, A1111, seed 42, epoch 58). No write-back. +""" +from __future__ import annotations + +import base64 +import builtins +import collections +import csv +import functools +import gzip +import hashlib +import importlib.util +import json +import os +import platform +import re +import shutil +import subprocess +import sys +import time +from pathlib import Path + +import numpy as np +import torch + +torch.set_num_threads(int(os.environ.get("NTHREADS", "16"))) +csv.field_size_limit(10 ** 9) + +PROJ = Path("/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training") +PKGD = PROJ / "data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" +WA0_HARNESS = PROJ / "writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py" +WA0_VOCAB = PROJ / "data/bpe_vocabulary_clean.json" +WA0_AMB = PROJ / "data/bpe_ambiguity_tokens.json" +WA0_CKPT_PATH = PROJ / "checkpoints_v5b_excluded/best_v5b_excluded_model.pt" # path only; never loaded +BENCH_DIR = PROJ / "writing/glycangt_heldout_ipa_validation" +SCHEMA_DIR = Path("/work/ratul1/supantha/glycan-SD-VS/review/iar_pipe_schema_20260823_r1") +JAVA_BIN = Path("/work/ratul1/supantha/miniconda3/envs/DeepGlycanSite/bin") +ROOT = Path("/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc") +TRAIN_MOD = ROOT / ("writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/" + "run_review_md_temporal_20x6_training_r3.py") +CK = ROOT / ("writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/" + "review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/" + "review_md20x6_checkpoint_best.pt") +CK_SHA = "8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82" + +WORK = Path(os.environ["WORK"]) +SCRIPT_SHA = hashlib.sha256(Path(__file__).read_bytes()).hexdigest() +OUT = WORK / "outputs" +JAVA_DIR = WORK / "inputs/java" + +EXPECTED_SHA = { + PKGD / "review_frozen_training_a5_wurcs_bpe.py": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4", + PKGD / "review_frozen_training_a5_topology.py": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7", + PKGD / "review_frozen_sequence_tree_runtime.py": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04", + PKGD / "review_bpe_vocabulary.json": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b", + PKGD / "review_bpe_ambiguity_tokens.json": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b", + PKGD / "review_sequence_parent_index.tsv.gz": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0", + PKGD / "review_token_ids.npy": "ec2d52dced65d22f0f218ff617d351fbd2930661bc8681e939990149d493537d", + PKGD / "review_residue_ids.npy": "36c96dcd3e03ba30e02e16f98d17605742627a37b37cd7824f2a745dd09dc044", + PKGD / "review_branch_depths.npy": "f39f76aa56a9bb782b2349f3ad1ca4ad16351ee1f06a8b9ae4b06bff9b1ebece", + PKGD / "review_linkage_types.npy": "89edb1940765928ced6f54e0d394f95c573eb9d96310b14dbd0adf8e20ac07c4", + PKGD / "review_attention_mask.npy": "01ed165720b9414e614dd7e7d75284a8886165f11138e16117ffcbe4e4bbf95c", + PKGD / "review_lengths.npy": "ade919d1e054c0ba852aa047bf873ac675f81a6c1f8a05cc73a0a2258131f021", + WA0_HARNESS: "8d05a4048e200625694ff9a36f50af89b845fd0d38ba8034a97a710e7ad3dce2", + WA0_VOCAB: "6a572afdf53f1494ab96c896876b824ca7ea749777352606aa9f96bf270ceecc", + WA0_AMB: "c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74", + JAVA_DIR / "review_A5WurcsArrayTreeAudit.java": "a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6", + JAVA_DIR / "review_wurcsframework-1.3.1.jar": "5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37", + JAVA_DIR / "review_MolWURCS.jar": "bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf", +} + +SEAL_RUNS = ["seal162_residue_t080", "seal162_linkage_t080"] +BENCH_RUNS = ["benchmark1392_residue_full", "benchmark1392_linkage_full"] +SETS = { + "bench1392": {"runs": BENCH_RUNS, "wa0_root": BENCH_DIR / "outputs", + "baseline_runs": ["benchmark1392_residue_full", "benchmark1392_linkage_full"]}, + "seal162": {"runs": SEAL_RUNS, "wa0_root": WORK / "inputs/wa0_seal", + "baseline_runs": ["seal162_residue_t080", "seal162_linkage_t080"]}, +} +ITERATIONS, TOP_K, MAX_LEN, BATCH = 3, 5, 256, 32 + +_real_open = builtins.open + + +def _guarded_open(f, *a, **k): + t = str(f) + if "locked_test" in t or "expert_audit_pool" in t: + raise SystemExit("FAIL-CLOSED: refused to open %s" % t) + return _real_open(f, *a, **k) + + +builtins.open = _guarded_open + + +def sha256_file(path: Path) -> str: + h = hashlib.sha256() + with _real_open(path, "rb") as fh: + for chunk in iter(lambda: fh.read(1 << 22), b""): + h.update(chunk) + return h.hexdigest() + + +def fail(msg: str): + raise SystemExit("FAIL-CLOSED: " + msg) + + +def log(msg: str) -> None: + print(time.strftime("%H:%M:%S"), msg, flush=True) + + +def write_json(path: Path, obj) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + tmp = path.with_suffix(path.suffix + ".tmp") + with _real_open(tmp, "w") as fh: + json.dump(obj, fh, indent=2) + tmp.replace(path) + + +# ============================================================== WA0: the submitted harness, untouched +def load_wa0_evaluator(): + spec = importlib.util.spec_from_file_location("heldout_ipa_eval_wa3_same_test", str(WA0_HARNESS)) + hie = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = hie + spec.loader.exec_module(hie) + + class _NoModelDistiller(hie.BPEIPADistiller): # same pattern as r2_05_baselines.py + def _load_model(self): + return torch.nn.Identity() + + hie.BPEIPADistiller = _NoModelDistiller + ev = hie.HeldoutIPAEvaluator(checkpoint=WA0_CKPT_PATH, vocab=WA0_VOCAB, ambiguity=WA0_AMB, device="cpu", + threshold=0.80, batch_size=32, top_k=TOP_K, max_length=MAX_LEN) + return hie, ev + + +def parse_wa0_summary(run_dir: Path) -> dict: + cfg = {} + for line in _real_open(run_dir / "summary.md"): + m = re.match(r"^- (\w+): `(.*)`\s*$", line.strip()) + if m and m.group(1) not in cfg: + cfg[m.group(1)] = m.group(2) + if "mask_plan" in cfg: + mask_plan = "" if cfg["mask_plan"] in ("", "single-span default") else cfg["mask_plan"] + else: # older summary.md files omit the line; the run's own case records carry it + with _real_open(run_dir / "case_details.jsonl") as fh: + mp = json.loads(fh.readline()).get("mask_plan", "") + mask_plan = mp if "," in mp or not re.fullmatch(r"(residue|linkage):1", mp or "") else "" + if int(cfg["iterations"]) != ITERATIONS or int(cfg["top_k"]) != TOP_K: + fail("%s used iterations=%s top_k=%s" % (run_dir.name, cfg["iterations"], cfg["top_k"])) + return {"threshold": float(cfg["threshold"]), "iterations": int(cfg["iterations"]), "top_k": int(cfg["top_k"]), + "selection_mode": cfg["selection_mode"], "max_cases_per_glycan": int(cfg["max_cases_per_glycan"]), + "span_types": [s.strip() for s in cfg["span_types"].split(",") if s.strip()], "mask_plan": mask_plan, + "input_csv": cfg.get("input_csv"), "checkpoint": cfg.get("checkpoint"), + "glycans_loaded": int(cfg["glycans_loaded"])} + + +def wa0_units(ev, wurcs): + """Mirror of HeldoutIPAEvaluator._tokenize_with_spans, adding the global non-special unit index.""" + tok = ev.tokenizer.tokenize(wurcs, max_length=ev.max_length) + unp = tok["tokens"][: tok["length"]] + recs, cur, g = [], 0, 0 + for u in ev.tokenizer.pre_tokenizer.pre_tokenize(wurcs): + pieces = [u["text"]] if u["type"] == "special" else list(ev.tokenizer.apply_bpe(u["text"])) + s, e = cur, cur + len(pieces) - 1 + cur += len(pieces) + if u["type"] == "special": + continue + gi = g + g += 1 + if e >= len(unp) or unp[s:e + 1] != pieces: + continue + recs.append({"start": s, "end": e, "unit_type": u["type"], "unit_text": u["text"], "g": gi}) + _, spans, _ = ev._tokenize_with_spans(wurcs) + if [(r["start"], r["end"], r["unit_type"], r["unit_text"]) for r in recs] != \ + [(sp.start, sp.end, sp.unit_type, sp.unit_text) for sp in spans]: + fail("WA0 unit geometry differs from the harness for %s" % wurcs[:80]) + return recs + + +def rebuild_wa0_cases(hie, ev, rows, run_dir: Path): + cfg = parse_wa0_summary(run_dir) + if cfg["glycans_loaded"] != len(rows): + fail("%s loaded %d glycans, input has %d" % (run_dir.name, cfg["glycans_loaded"], len(rows))) + mask_req = hie.parse_mask_plan(cfg["mask_plan"]) + span_types = sorted(set(cfg["span_types"]) | set(mask_req)) if mask_req else cfg["span_types"] + cases, _ = ev.build_cases(rows=rows, span_types=span_types, selection_mode=cfg["selection_mode"], + max_cases_per_glycan=cfg["max_cases_per_glycan"], seed=42, mask_requirements=mask_req) + reported = {} + with _real_open(run_dir / "case_details.jsonl") as fh: + for line in fh: + r = json.loads(line) + reported[r["case_id"]] = r + if {c.case_id for c in cases} != set(reported): + fail("%s: rebuilt %d cases vs reported %d (ids differ)" % (run_dir.name, len(cases), len(reported))) + out = [] + for c in cases: + rep = reported[c.case_id] + if list(rep["positions"]) != list(c.positions) or list(rep["truth_token_ids"]) != list(c.truth_token_ids): + fail("%s: case %s positions/truth differ from the reported run" % (run_dir.name, c.case_id)) + pos = set(c.positions) + chosen = [r for r in wa0_units(ev, c.wurcs) if all(p in pos for p in range(r["start"], r["end"] + 1))] + covered = {p for r in chosen for p in range(r["start"], r["end"] + 1)} + if covered != pos: + fail("%s: case %s masked positions do not decompose into whole units" % (run_dir.name, c.case_id)) + out.append({"case_id": c.case_id, "glycan_index": c.glycan_index, "wurcs": c.wurcs, "mask_plan": c.mask_plan, + "units": [{"g": r["g"], "unit_type": r["unit_type"], "unit_text": r["unit_text"]} for r in chosen], + "wa0_iterative_span_exact": bool(rep["iterative_span_exact"]), + "wa0_initial_span_exact_top1": bool(rep["initial_span_exact_top1"]), + "wa0_resolved_all": int(rep["resolved_count"]) == len(rep["positions"])}) + return cfg, out + + +# ============================================================== WA3: frozen tokenizer + official helper +def build_wa3_tokenizer(): + shim = WORK / "shim" + if shim.exists(): + shutil.rmtree(shim) + pkg = shim / "frozen_training" + pkg.mkdir(parents=True) + (pkg / "__init__.py").write_text("") + shutil.copy(PKGD / "review_frozen_training_a5_topology.py", pkg / "a5_topology.py") + shutil.copy(PKGD / "review_frozen_training_a5_wurcs_bpe.py", pkg / "a5_wurcs_bpe.py") + src = (PKGD / "review_frozen_sequence_tree_runtime.py").read_text() + src = (src.replace("from training.a5_topology import", "from frozen_training.a5_topology import") + .replace("from training.a5_wurcs_bpe import", "from frozen_training.a5_wurcs_bpe import")) + if src.count("from frozen_training.") != 2: + fail("tree-runtime import rewrite did not hit exactly two lines") + (shim / "frozen_tree_runtime.py").write_text(src) + sys.path.insert(0, str(PROJ)) + sys.path.insert(0, str(shim)) + import frozen_training.a5_wurcs_bpe as fab # noqa: E402 + import frozen_tree_runtime as ftr # noqa: E402 + for mod in (fab, ftr): + if not str(Path(mod.__file__).resolve()).startswith(str(shim.resolve())): + fail("frozen module resolved outside the shim: %s" % mod.__file__) + if int(ftr.BRANCH_DEPTH_UNKNOWN) != 202: + fail("BRANCH_DEPTH_UNKNOWN != 202") + tok = ftr.ReviewA5WURCSBPETokenizerV3(PKGD / "review_bpe_vocabulary.json") + tok.apply_bpe = functools.lru_cache(maxsize=None)(tok.apply_bpe) + semantic = fab.A5WURCSPreTokenizer() + vocab = json.load(_real_open(PKGD / "review_bpe_vocabulary.json")) + t2i = {k: int(v) for k, v in vocab["token_to_id"].items()} + if len(t2i) != 2114 or sorted(t2i.values()) != list(range(2114)): + fail("WA3 vocabulary is not 2,114 contiguous ids") + specials = {int(v) for v in vocab["special_tokens"].values()} + amb = json.load(_real_open(PKGD / "review_bpe_ambiguity_tokens.json")) + amb_map = {str(t): int(i) for t, i in amb["ambiguous_tokens"].items()} + if set(amb_map.values()) != {int(x) for x in amb["ambiguous_ids"]}: + fail("WA3 ambiguity map ids and token dict disagree") + if any(t2i.get(t) != i for t, i in amb_map.items()) or not all("?" in t for t in amb_map): + fail("WA3 ambiguity map disagrees with the vocabulary") + return {"tok": tok, "semantic": semantic, "exact_linkage": ftr.ReviewA5WURCSPreTokenizerV3.exact_linkage_type, + "t2i": t2i, "i2t": {v: k for k, v in t2i.items()}, "invalid": specials | set(amb_map.values()), + "n_specials": len(specials), "n_ambiguity": len(amb_map), "mask_id": t2i["[MASK]"], + "branch_open_id": t2i["[BRANCH_OPEN]"], "linkage_unknown": int(ftr.LINKAGE_UNKNOWN), + "branch_depth_unknown": int(ftr.BRANCH_DEPTH_UNKNOWN)} + + +def compile_java_helper(): + classes = WORK / "java_classes" + if classes.exists(): + shutil.rmtree(classes) + src = WORK / "java_src/review/a5/A5WurcsArrayTreeAudit.java" + src.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(JAVA_DIR / "review_A5WurcsArrayTreeAudit.java", src) + classes.mkdir(parents=True) + cp = os.pathsep.join([str(JAVA_DIR / "review_wurcsframework-1.3.1.jar"), str(JAVA_DIR / "review_MolWURCS.jar")]) + subprocess.run([str(JAVA_BIN / "javac"), "-cp", cp, "-d", str(classes), str(src)], check=True) + return os.pathsep.join([str(classes), cp]) + + +def run_java_helper(classpath, wurcs_list): + payload = "".join("%d\t%s\n" % (i, base64.urlsafe_b64encode(w.encode()).decode().rstrip("=")) + for i, w in enumerate(wurcs_list)) + res = subprocess.run([str(JAVA_BIN / "java"), "-cp", classpath, "review.a5.A5WurcsArrayTreeAudit"], + input=payload, text=True, capture_output=True, check=True) + lines = res.stdout.splitlines() + if len(lines) != len(wurcs_list): + fail("official helper returned %d lines for %d inputs" % (len(lines), len(wurcs_list))) + out = [] + for i, line in enumerate(lines): + f = line.split("\t") + if int(f[0]) != i: + fail("official helper row order drift at %d" % i) + if len(f) < 2 or f[1] == "ERROR": # frozen builder semantics for ERROR rows + out.append({"rooted": False, "depths": (), "parents": (), "helper_error": True}) + continue + if len(f) < 27: + fail("official helper output truncated at row %d" % i) + rooted = f[20] == "true" + n = int(f[2]) + dec = lambda v: base64.urlsafe_b64decode(v + "=" * ((4 - len(v) % 4) % 4)).decode() # noqa: E731 + depths = tuple(int(x) for x in dec(f[24]).split(",")) if rooted else () + parents = tuple(int(x) for x in dec(f[26]).split(",")) if rooted else () + if rooted and (len(depths) != n or len(parents) != n): + fail("official rooted cardinality drift at row %d" % i) + out.append({"rooted": rooted, "depths": depths, "parents": parents, "helper_error": False}) + return out + + +def wa3_encode(w3, wurcs, auth): + """Frozen builder transform (review_build_official_sequence_topology_successor.py) + unit spans.""" + units = [dict(u) for u in w3["semantic"].pre_tokenize(wurcs) if u.get("text") != "[BRANCH_OPEN]"] + child = collections.Counter(v for v in auth["parents"] if v >= 0) + seen, repaired = set(), [] + for u in units: + u.pop("distance_matrix", None) + rid = int(u.get("residue_id", -1)) + u["linkage_type"] = 0 + if rid >= 0: + depth = int(auth["depths"][rid]) if auth["rooted"] else 202 + u["branch_depth"] = depth + if rid not in seen: + repaired.extend({"text": "[BRANCH_OPEN]", "type": "special", "residue_id": -1, + "branch_depth": depth, "linkage_type": 0} + for _ in range(max(0, child[rid] - 1))) + seen.add(rid) + else: + u["branch_depth"] = 0 + if u.get("type") == "linkage": + u["linkage_type"] = w3["exact_linkage"](str(u["text"])) + repaired.append(u) + pieces, spans, g, ords = [], [], 0, collections.Counter() + for u in repaired: + ps = [str(u["text"])] if u["type"] == "special" else list(w3["tok"].apply_bpe(str(u["text"]))) + s = len(pieces) + pieces.extend((p, int(u["residue_id"]), int(u["branch_depth"]), int(u["linkage_type"])) for p in ps) + if u["type"] != "special": + spans.append({"g": g, "start": s, "end": len(pieces) - 1, "unit_type": u["type"], + "unit_text": str(u["text"]), "ordinal": ords[u["type"]]}) + ords[u["type"]] += 1 + g += 1 + full = len(pieces) + capped = pieces[:255] + [("[END]", -1, 0, 0)] if full > 256 else list(pieces) + L = len(capped) + unk, pad = w3["t2i"]["[UNK]"], w3["t2i"]["[PAD]"] + enc = {"token_ids": [w3["t2i"].get(p[0], unk) for p in capped] + [pad] * (256 - L), + "residue_ids": [p[1] for p in capped] + [-1] * (256 - L), + "branch_depths": [p[2] for p in capped] + [0] * (256 - L), + "linkage_types": [p[3] for p in capped] + [0] * (256 - L), + "attention_mask": [1] * L + [0] * (256 - L), "length": L, "full_length": full, + "tokens": [p[0] for p in capped]} + return enc, spans + + +def parity_gate(w3, classpath, idx_rows): + arrays = {k: np.load(PKGD / ("review_%s.npy" % k), mmap_mode="r") + for k in ("token_ids", "residue_ids", "branch_depths", "linkage_types", "attention_mask")} + sample = [i for i in range(0, len(idx_rows), 97) if idx_rows[i]["truncated_at_256"] != "True"] + auths = run_java_helper(classpath, [idx_rows[i]["canonical_wurcs"] for i in sample]) + counts, bad = collections.Counter(), [] + for i, auth in zip(sample, auths): + enc, _ = wa3_encode(w3, idx_rows[i]["canonical_wurcs"], auth) + ok_all = True + for k, arr in arrays.items(): + same = np.array_equal(np.asarray(enc[k], dtype=np.int64), np.asarray(arr[i], dtype=np.int64)) + counts[k] += int(same) + ok_all &= same + counts["all"] += int(ok_all) + counts["helper_error"] += int(auth["helper_error"]) + if not ok_all and len(bad) < 10: + bad.append(idx_rows[i]["parent_glycorpus_id"]) + res = {"rows": len(sample), "matches": dict(counts), "mismatch_parents": bad, + "rule": "every 97th sequence_row excluding truncated_at_256; official helper + frozen transform"} + res["status"] = "PASS" if counts["all"] == len(sample) else "FAIL" + return res + + +# ============================================================== exposure of test glycans to WA3 +def wurcs_sections(w): + body = w[6:] if w.startswith("WURCS=") else w + out, buf, depth = [], [], 0 + for ch in body: + depth += (ch == "[") - (ch == "]") + if ch == "/" and depth == 0: + out.append("".join(buf)) + buf = [] + else: + buf.append(ch) + out.append("".join(buf)) + return out + + +def lin_key(w): + s = wurcs_sections(w) + if len(s) < 5: + return w + return "WURCS=" + "/".join(s[:4] + ["_".join(sorted(x for x in "/".join(s[4:]).split("_") if x))]) + + +def exposure_lookup(idx_rows): + exact, keyed = collections.defaultdict(list), collections.defaultdict(list) + for r in idx_rows: + exact[r["canonical_wurcs"]].append(r) + keyed[lin_key(r["canonical_wurcs"])].append(r) + priority = ["pretraining_train", "pretraining_development", "excluded_exact_or_verified_graph_identity"] + + def look(w): + hits = {id(r): r for r in exact.get(w, []) + keyed.get(lin_key(w), [])}.values() + if not hits: + return {"wa3_partition": "absent_from_wa3_sequence_parents", "wa3_match_mode": "none", "wa3_parent_id": ""} + parts = {r["pretraining_partition"] for r in hits} + best = next((p for p in priority if p in parts), sorted(parts)[0]) + hit = next(r for r in hits if r["pretraining_partition"] == best) + mode = "exact" if hit["canonical_wurcs"] == w else "lin_order_insensitive" + return {"wa3_partition": best, "wa3_match_mode": mode, "wa3_parent_id": hit["parent_glycorpus_id"]} + return look + + +# ============================================================== A_chem (verbatim logic from iar_achem_q_20260824_r1/a.py) +def load_achem(): + sys.path.insert(0, str(SCHEMA_DIR)) + from pipelib import parse_record, SIDE_RE, node_index # noqa: E402 + from classify import PLAIN_LINK # noqa: E402 + no_oh = set("Amd") + + def a_chem(rec, ai, skip_li): + occ = set() + for ei, e in enumerate([x for x in rec["lin"].split("_") if x]): + if ei == skip_li: + continue + m = PLAIN_LINK.match(e) + if not m: + continue + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if sm and sm.group(2) != "?": + try: + if node_index(sm.group(1)) - 1 == ai: + occ.add(int(sm.group(2))) + except ValueError: + pass + sk = rec["skel"][ai] + if not sk: + return None, "no_skeleton" + n = len(sk) + if n < 3: + return None, "skeleton_lt_3" + if n > 12: + return None, "skeleton_gt_12" + free = set(range(1, n + 1)) + if rec["anom"][ai] is not None: + free.discard(rec["anom"][ai]) + rg = rec["ring"][ai] + if rg and rg[1] != "?": + try: + free.discard(int(rg[1])) + except ValueError: + pass + free -= set(rec["subs"][ai]) + for p, ch in enumerate(sk, 1): + if ch in no_oh: + free.discard(p) + return free - occ, "ok" + + def for_linkage(wurcs, entry): + rec = parse_record(wurcs) + if rec is None or not rec["lin"]: + return {"achem_status": "unparsable"} + ents = [x for x in rec["lin"].split("_") if x] + if ents.count(entry) != 1: + return {"achem_status": "entry_not_unique_in_lin"} + li = ents.index(entry) + m = PLAIN_LINK.match(entry) + if not m: + return {"achem_status": "not_plain_linkage"} + sides = [] + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if not sm or sm.group(2) == "?": + return {"achem_status": "side_unparsable"} + try: + sides.append((node_index(sm.group(1)) - 1, int(sm.group(2)))) + except ValueError: + return {"achem_status": "bad_label"} + donor_flags = [0 <= ai < rec["nres"] and rec["anom"][ai] is not None and rec["anom"][ai] == p for ai, p in sides] + if donor_flags.count(True) != 1: + return {"achem_status": "orientation_undetermined"} + ai, truth_pos = sides[donor_flags.index(False)] + A, why = a_chem(rec, ai, li) + if A is None: + return {"achem_status": why} + k = len(A) + return {"achem_status": "ok", "achem_k": k, "achem_positions": sorted(A), "truth_in_achem": truth_pos in A, + "achem_chance": (1.0 / k) if k else None} + return for_linkage + + +# ============================================================== WA3 cases, model, evaluation +def build_wa3_cases(w3, wa0_cases, encodings, look): + cases, excluded = [], collections.Counter() + for c in wa0_cases: + enc, spans = encodings[c["wurcs"]] + by_g = {s["g"]: s for s in spans} + positions, texts = [], [] + for u in c["units"]: + s = by_g.get(u["g"]) + if s is None or s["unit_text"] != u["unit_text"] or s["unit_type"] != u["unit_type"]: + fail("unit mapping mismatch for %s unit %s" % (c["case_id"], u)) + positions.extend(range(s["start"], s["end"] + 1)) + texts.append(u["unit_text"]) + if max(positions) >= enc["length"] - (1 if enc["full_length"] > 256 else 0): + excluded["wa3_truncated_beyond_256"] += 1 + continue + truth = [enc["token_ids"][p] for p in positions] + masked = list(enc["token_ids"]) + for p in positions: + masked[p] = w3["mask_id"] + flags = {"enumerated_alternative": any("|" in t for t in texts), + "unknown_question_mark": any("?" in t for t in texts), + "wa3_truth_uses_invalid_token": any(t in w3["invalid"] for t in truth)} + flags["single_answer"] = not any(flags.values()) + lt_blank, bd_blank = list(enc["linkage_types"]), list(enc["branch_depths"]) + # Blank the channels that encode the hidden unit, honouring WA3's own input contract + # (composite_r4.validate_sequence_surface:584-592): linkage pieces are exactly residue_id == -2 and + # must keep a nonzero linkage class; non-residue pieces must keep branch depth 0. + for p in positions: + if enc["residue_ids"][p] == -2: + lt_blank[p] = w3["linkage_unknown"] # 9 = the class WA3 already uses for '?' linkages + elif enc["residue_ids"][p] >= 0: + bd_blank[p] = w3["branch_depth_unknown"] # 202 = the depth WA3 uses when the tree is not rooted + cases.append({**{k: c[k] for k in ("case_id", "glycan_index", "wurcs", "mask_plan", "units", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")}, + "unit_text": " | ".join("%s:%s" % (u["unit_type"], u["unit_text"]) for u in c["units"]), + "positions": positions, "truth_ids": truth, "masked_ids": masked, + "attention_mask": enc["attention_mask"], "residue_ids": enc["residue_ids"], + "branch_depths": enc["branch_depths"], "linkage_types": enc["linkage_types"], + "branch_depths_blank": bd_blank, "linkage_types_blank": lt_blank, + **flags, **look(c["wurcs"])}) + return cases, dict(excluded) + + +def all_absent(B, dev): # contract from iar_bytype3_20260825_r1/bytype.py (job 12094273) + return {"ms_token_ids": torch.empty((0, 64), dtype=torch.long, device=dev), + "ms_attention_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), + "ms_input_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), "ms_labels": None, + "ms_acquisition_parent_indices": torch.empty((0,), dtype=torch.long, device=dev), + "ms_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), "ms_mode": "development", + "static_token_ids": torch.zeros((B, 1, 4), dtype=torch.long, device=dev), + "static_attention_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), + "static_residue_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_slot_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_state_mask": torch.zeros((B, 1), dtype=torch.bool, device=dev), + "static_state_ids": torch.full((B, 1), -1, dtype=torch.long, device=dev), + "static_input_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), "static_labels": None, + "static_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), + "md_values": torch.zeros((B, 2, 20, 6), dtype=torch.float32, device=dev), + "md_feature_mask": torch.zeros((B, 2, 20, 6), dtype=torch.bool, device=dev), + "md_child_present_mask": torch.zeros((B, 2), dtype=torch.bool, device=dev), + "md_state_row_ids": torch.full((B, 2), -1, dtype=torch.long, device=dev), + "md_window_input_mask": torch.zeros((B, 2, 20), dtype=torch.bool, device=dev), "md_labels": None, + "md_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev)} + + +def load_model(): + spec = importlib.util.spec_from_file_location("wa3_train_mod", str(TRAIN_MOD)) + tm = importlib.util.module_from_spec(spec) + sys.modules["wa3_train_mod"] = tm + spec.loader.exec_module(tm) + if sha256_file(CK) != CK_SHA: + fail("WA3 checkpoint sha mismatch") + ctx = tm.native_authority(None, static_active=False) + _native, r8, _static, _runner = ctx.__enter__() + r5 = r8._core._r6._r5 + if int(r5.SEQUENCE_VOCAB_SIZE) != 2114: + fail("r5.SEQUENCE_VOCAB_SIZE != 2114") + model = tm.mdcore.make_md_enabled_composite_class(r5)(r8.NativeEightConfig(cell_id="A111", seq_vocab_size=2114), + md_cell_id="A1111", md_temporal_size=128) + ck = torch.load(CK, map_location="cpu", weights_only=False) + if str(ck.get("md_cell_id")) != "A1111" or int(ck["selection"]["best_epoch"]) != 58: + fail("checkpoint identity is not A1111 / best epoch 58") + model.load_state_dict(ck["model_state"], strict=True) + n_par = sum(p.numel() for p in model.parameters()) + if n_par != 138487995 or len(model.state_dict()) != 505: + fail("WA3 inventory %d params / %d tensors" % (n_par, len(model.state_dict()))) + model.eval() + dev = "cuda" if torch.cuda.is_available() else "cpu" + model.to(dev) + return model, dev, ctx + + +def evaluate(model, dev, w3, cases, threshold, blank_side_channels=False): + bd_key = "branch_depths_blank" if blank_side_channels else "branch_depths" + lt_key = "linkage_types_blank" if blank_side_channels else "linkage_types" + results = [] + for b0 in range(0, len(cases), BATCH): + batch = cases[b0:b0 + BATCH] + current = [list(c["masked_ids"]) for c in batch] + unresolved = [set(c["positions"]) for c in batch] + initial, accepted = [[] for _ in batch], [[] for _ in batch] + for it in range(ITERATIONS): + t = lambda key: torch.tensor([c[key] for c in batch], dtype=torch.long, device=dev) # noqa: E731 + with torch.inference_mode(): + o = model(seq_token_ids=torch.tensor(current, dtype=torch.long, device=dev), + seq_attention_mask=t("attention_mask").bool(), seq_residue_ids=t("residue_ids"), + seq_branch_depths=t(bd_key), seq_linkage_types=t(lt_key), + seq_labels=None, topology_labels=None, topology_available=None, + **all_absent(len(batch), torch.device(dev))) + logits = o.sequence_logits.float() + if w3["allowed_mask"]["linkage"].shape[0] != logits.shape[-1]: + fail("answer-space mask size %d != model vocabulary %d" + % (w3["allowed_mask"]["linkage"].shape[0], logits.shape[-1])) + progress = 0 + for ci, c in enumerate(batch): + if not unresolved[ci]: + continue + for li, pos in enumerate(c["positions"]): + rid = c["residue_ids"][pos] + if rid != -2 and rid < 0: + fail("masked position %d of %s is neither a residue nor a linkage piece" % (pos, c["case_id"])) + allow = w3["allowed_mask"]["linkage" if rid == -2 else "residue"] + row = logits[ci, pos].masked_fill(~allow, float("-inf")) + tp, ti = torch.topk(torch.softmax(row, dim=-1), k=TOP_K) + ids = [int(x) for x in ti.tolist()] + if it == 0: + initial[ci].append((ids[0] == c["truth_ids"][li], c["truth_ids"][li] in ids)) + if pos not in unresolved[ci]: + continue + if float(tp[0]) < threshold or ids[0] in w3["invalid"]: + continue + current[ci][pos] = ids[0] + unresolved[ci].remove(pos) + progress += 1 + accepted[ci].append(it + 1) + if progress == 0: + break + for ci, c in enumerate(batch): + final = [current[ci][p] for p in c["positions"]] + correct = [f == t for f, t in zip(final, c["truth_ids"])] + results.append({k: c[k] for k in ("case_id", "glycan_index", "mask_plan", "unit_text", "single_answer", + "enumerated_alternative", "unknown_question_mark", + "wa3_truth_uses_invalid_token", "wa3_partition", "wa3_match_mode", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")} + | {"num_masked_positions": len(c["positions"]), + "truth_tokens": [w3["i2t"][x] for x in c["truth_ids"]], + "final_tokens": [w3["i2t"][x] for x in final], + "initial_top1_correct_count": sum(a for a, _ in initial[ci]), + "initial_top5_correct_count": sum(b for _, b in initial[ci]), + "resolved_count": len(c["positions"]) - len(unresolved[ci]), + "final_correct_count": sum(correct), + "initial_span_exact_top1": all(a for a, _ in initial[ci]), + "initial_span_exact_top5": all(b for _, b in initial[ci]), + "iterative_span_exact": all(correct), + "iterations_used": max(accepted[ci], default=0)}) + return results + + +def aggregate(rs): # identical formulas to HeldoutIPAEvaluator._aggregate_slice + n = len(rs) + if not n: + return {"num_cases": 0} + pos = sum(r["num_masked_positions"] for r in rs) + res = sum(r["resolved_count"] for r in rs) + cor = sum(r["final_correct_count"] for r in rs) + return {"num_cases": n, "num_masked_positions": pos, "avg_masked_positions_per_case": pos / n, + "initial_top1_token_accuracy": sum(r["initial_top1_correct_count"] for r in rs) / pos, + "initial_top5_token_accuracy": sum(r["initial_top5_correct_count"] for r in rs) / pos, + "initial_exact_span_accuracy_top1": sum(bool(r["initial_span_exact_top1"]) for r in rs) / n, + "initial_exact_span_accuracy_top5": sum(bool(r["initial_span_exact_top5"]) for r in rs) / n, + "iterative_resolved_fraction": res / pos, + "iterative_accuracy_among_resolved": (cor / res) if res else 0.0, + "iterative_final_token_accuracy": cor / pos, + "iterative_exact_span_accuracy": sum(bool(r["iterative_span_exact"]) for r in rs) / n, + "avg_iterations_used_per_case": sum(r["iterations_used"] for r in rs) / n} + + +def paired(rs): + n = len(rs) + if not n: + return {"n": 0} + a = [bool(r["wa0_iterative_span_exact"]) for r in rs] + b = [bool(r["iterative_span_exact"]) for r in rs] + return {"n": n, "wa0_exact_span": sum(a) / n, "wa3_exact_span": sum(b) / n, + "both": sum(x and y for x, y in zip(a, b)), "wa0_only": sum(x and not y for x, y in zip(a, b)), + "wa3_only": sum(y and not x for x, y in zip(a, b)), "neither": sum(not x and not y for x, y in zip(a, b))} + + +# ============================================================== R2-05 baselines (port of r2_05_baselines.py) +class BaselineStats: + def __init__(self): + self.marginal = collections.defaultdict(collections.Counter) + self.ctx_pair = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.ctx_prev = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.n_glycans = 0 + self.feature_ids, self._feats, self._donor = {}, [], collections.defaultdict(list) + self.text_ids, self.texts, self.donor_index = {}, [], {} + + def _tid(self, text): + if text not in self.text_ids: + self.text_ids[text] = len(self.texts) + self.texts.append(text) + return self.text_ids[text] + + def add(self, index, unpadded, records): + self.n_glycans += 1 + feats = set() + for r in records: + key = (r["unit_type"], r["unit_text"]) + feats.add(self.feature_ids.setdefault(key, len(self.feature_ids))) + if not r["eligible"] or "|" in r["unit_text"]: # typed child: same answer space as BERTose + continue + if r["unit_type"] == "linkage" and not 1 <= BaselineStats.linkage_class(r["unit_text"]) <= 8: + continue # strict child: ordinary linkages only, as for BERTose + ut, text = r["unit_type"], r["unit_text"] + self.marginal[ut][text] += 1 + prev_t = unpadded[r["start"] - 1] if r["start"] > 0 else "" + next_t = unpadded[r["end"] + 1] if r["end"] + 1 < len(unpadded) else "" + self.ctx_pair[ut][(prev_t, next_t)][text] += 1 + self.ctx_prev[ut][prev_t][text] += 1 + self._donor[(ut, r["ordinal"])].append((index, self._tid(text))) + self._feats.append(sorted(feats)) + + def finalize(self): + counts = np.zeros(len(self.feature_ids) + 1, dtype=np.int64) + for fs in self._feats: + for f in fs: + counts[f + 1] += 1 + self.indptr = np.cumsum(counts) + self.rows = np.zeros(int(self.indptr[-1]), dtype=np.int32) + fill = self.indptr[:-1].copy() + for gid, fs in enumerate(self._feats): + for f in fs: + self.rows[fill[f]] = gid + fill[f] += 1 + self.sizes = np.array([len(fs) for fs in self._feats], dtype=np.int64) + self._feats = [] + for key, pairs in self._donor.items(): + pairs.sort() + self.donor_index[key] = (np.array([p[0] for p in pairs], dtype=np.int64), + np.array([p[1] for p in pairs], dtype=np.int64)) + self._donor = {} + + @staticmethod + def _argmax(counter): + total = sum(counter.values()) + text = min(counter.items(), key=lambda kv: (-kv[1], kv[0]))[0] + return text, counter[text] / total + + def marginal_pred(self, ut): + return self._argmax(self.marginal[ut]) if self.marginal.get(ut) else (None, 0.0) + + def context_pred(self, ut, prev_t, next_t): + c = self.ctx_pair.get(ut, {}).get((prev_t, next_t)) + if c: + return self._argmax(c)[0], "prev_next" + c = self.ctx_prev.get(ut, {}).get(prev_t) + if c: + return self._argmax(c)[0], "prev_only" + return self.marginal_pred(ut)[0], "marginal_backoff" + + def nn_pred(self, ut, ordinal, query_keys): + donor = self.donor_index.get((ut, ordinal)) + if donor is None: + return None + cand_idx, cand_txt = donor + fids = [self.feature_ids[k] for k in query_keys if k in self.feature_ids] + if fids: + rows = np.concatenate([self.rows[self.indptr[f]:self.indptr[f + 1]] for f in fids]) + inter = np.bincount(rows, minlength=self.n_glycans)[cand_idx].astype(np.float64) + else: + inter = np.zeros(len(cand_idx)) + union = self.sizes[cand_idx] + len(query_keys) - inter + jac = np.divide(inter, union, out=np.zeros_like(inter), where=union > 0) + return self.texts[int(cand_txt[int(np.argmax(jac))])] + + +def fit_baselines(w3, idx_rows, test_wurcs): + token_ids = np.load(PKGD / "review_token_ids.npy", mmap_mode="r") + lengths = np.load(PKGD / "review_lengths.npy", mmap_mode="r") + stats, counts, bo, unk = BaselineStats(), collections.Counter(), w3["branch_open_id"], w3["t2i"]["[UNK]"] + test_keys = {lin_key(w) for w in test_wurcs} + for i, r in enumerate(idx_rows): + if r["pretraining_partition"] != "pretraining_train" or r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + counts["removed_test_glycan"] += 1 + continue + L = int(lengths[i]) + ids = [int(x) for x in token_ids[i, :L]] + p, recs, ords, ok = 0, [], collections.Counter(), True + for u in w3["semantic"].pre_tokenize(w): + if u.get("text") == "[BRANCH_OPEN]": + continue + while p < L and ids[p] == bo: + p += 1 + ps = [u["text"]] if u["type"] == "special" else list(w3["tok"].apply_bpe(u["text"])) + pid = [w3["t2i"].get(x, unk) for x in ps] + if ids[p:p + len(pid)] != pid: + ok = False + break + if u["type"] != "special": + recs.append({"start": p, "end": p + len(pid) - 1, "unit_type": u["type"], "unit_text": u["text"], + "ordinal": ords[u["type"]], "eligible": not any(x in w3["invalid"] for x in pid)}) + ords[u["type"]] += 1 + p += len(pid) + while ok and p < L and ids[p] == bo: + p += 1 + if not ok or p != L: + counts["unit_walk_mismatch"] += 1 + continue + stats.add(counts["fitted"], [w3["i2t"][x] for x in ids], recs) + counts["fitted"] += 1 + stats.finalize() + return stats, dict(counts) + + +def build_allowed(w3, idx_rows, test_wurcs): + """Type-consistent answer space: token ids seen at linkage / residue pieces in WA3 training parents.""" + token_ids = np.load(PKGD / "review_token_ids.npy", mmap_mode="r") + residue_ids = np.load(PKGD / "review_residue_ids.npy", mmap_mode="r") + linkage_types = np.load(PKGD / "review_linkage_types.npy", mmap_mode="r") + lengths = np.load(PKGD / "review_lengths.npy", mmap_mode="r") + test_keys = {lin_key(w) for w in test_wurcs} + V = len(w3["t2i"]) + seen = {"linkage": np.zeros(V, dtype=bool), "residue": np.zeros(V, dtype=bool)} + rows = 0 + for i, r in enumerate(idx_rows): + if r["pretraining_partition"] != "pretraining_train" or r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + continue + L = int(lengths[i]) + ids, rid = np.asarray(token_ids[i, :L]), np.asarray(residue_ids[i, :L]) + lt = np.asarray(linkage_types[i, :L]) + seen["linkage"][ids[(rid == -2) & (lt >= 1) & (lt <= 8)]] = True # strict: ordinary linkages only + seen["residue"][ids[rid >= 0]] = True + rows += 1 + bad = np.zeros(V, dtype=bool) + bad[sorted(w3["invalid"])] = True + pipe = [i for t, i in w3["t2i"].items() if "|" in t] + bad[pipe] = True + allowed = {k: v & ~bad for k, v in seen.items()} + info = {"training_rows_scanned": rows, "vocab": V, "invalid_excluded": len(w3["invalid"]), + "pipe_tokens_excluded": len(pipe), + "linkage_tokens_seen": int(seen["linkage"].sum()), "residue_tokens_seen": int(seen["residue"].sum()), + "linkage_tokens_allowed": int(allowed["linkage"].sum()), + "residue_tokens_allowed": int(allowed["residue"].sum())} + return allowed, info + + +def truth_outside(w3, cases): + """Cases whose true token at some masked position lies outside the allowed answer space.""" + n = 0 + for c in cases: + for pos, t in zip(c["positions"], c["truth_ids"]): + kind = "linkage" if c["residue_ids"][pos] == -2 else "residue" + if not w3["allowed_np"][kind][t]: + n += 1 + break + return n + + +def score_prediction(truth_tokens, pred_tokens): + n = len(truth_tokens) + if pred_tokens is None: + ok, nc = False, 0 + else: + ok = list(pred_tokens) == list(truth_tokens) + nc = sum(a == b for a, b in zip(pred_tokens, truth_tokens)) if len(pred_tokens) == n else 0 + return {"num_masked_positions": n, "initial_top1_correct_count": nc, "initial_top5_correct_count": nc, + "resolved_count": n if pred_tokens is not None else 0, "final_correct_count": nc, + "initial_span_exact_top1": ok, "initial_span_exact_top5": ok, "iterative_span_exact": ok, + "iterations_used": 0} + + +def run_baselines(w3, stats, cases, encodings, results_by_id, results_blank_by_id=None): + method_rows = collections.defaultdict(list) + for c in cases: + if len(c["units"]) != 1: + continue + enc, spans = encodings[c["wurcs"]] + s = {sp["g"]: sp for sp in spans}[c["units"][0]["g"]] + tokens = [w3["i2t"][x] for x in enc["token_ids"][:enc["length"]]] + prev_t = tokens[s["start"] - 1] if s["start"] > 0 else "" + next_t = tokens[s["end"] + 1] if s["end"] + 1 < len(tokens) else "" + query = {(sp["unit_type"], sp["unit_text"]) for sp in spans if sp["g"] != s["g"]} + truth = [w3["i2t"][x] for x in c["truth_ids"]] + bpe = lambda t: None if t is None else list(w3["tok"].apply_bpe(t)) # noqa: E731 + preds = {"marginal_frequency": bpe(stats.marginal_pred(s["unit_type"])[0]), + "context_frequency": bpe(stats.context_pred(s["unit_type"], prev_t, next_t)[0]), + "nearest_neighbour": bpe(stats.nn_pred(s["unit_type"], s["ordinal"], query))} + flags = {k: c[k] for k in ("single_answer", "wa3_partition")} + for m, p in preds.items(): + method_rows[m].append({**score_prediction(truth, p), **flags}) + method_rows["WA3_harness_inputs"].append({**results_by_id[c["case_id"]]}) + if results_blank_by_id is not None: + method_rows["WA3_side_channels_blanked"].append({**results_blank_by_id[c["case_id"]]}) + wa0 = {"num_masked_positions": 1, "initial_top1_correct_count": 0, "initial_top5_correct_count": 0, + "resolved_count": 1, "final_correct_count": 0, "initial_span_exact_top1": c["wa0_initial_span_exact_top1"], + "initial_span_exact_top5": False, "iterative_span_exact": c["wa0_iterative_span_exact"], + "iterations_used": 0, **flags} + method_rows["WA0_submitted"].append(wa0) + table = [] + for m, rows in method_rows.items(): + for subset, sel in (("all_cases", rows), ("single_answer", [r for r in rows if r["single_answer"]]), + ("single_answer_not_in_wa3_training", + [r for r in rows if r["single_answer"] and r["wa3_partition"] != "pretraining_train"])): + a = aggregate(sel) + table.append({"method": m, "subset": subset, "n": a["num_cases"], + "exact_span_accuracy": round(a.get("iterative_exact_span_accuracy", 0.0), 4)}) + return table + + +# ============================================================== main +def summarize_run(results, cases_all, excluded, cfg, results_blank=None): + sa = [r for r in results if r["single_answer"]] + unseen = lambda rs: [r for r in rs if r["wa3_partition"] != "pretraining_train"] # noqa: E731 + out = {"wa0_config": cfg, "wa3_excluded": excluded, + "flags": {"cases": len(results), "single_answer": len(sa), + "enumerated_alternative": sum(r["enumerated_alternative"] for r in results), + "unknown_question_mark": sum(r["unknown_question_mark"] for r in results), + "wa3_truth_uses_invalid_token": sum(r["wa3_truth_uses_invalid_token"] for r in results)}, + "exposure": dict(collections.Counter(r["wa3_partition"] for r in results)), + "wa3_all_cases": aggregate(results), "wa3_single_answer": aggregate(sa), + "wa3_single_answer_not_in_wa3_training": aggregate(unseen(sa)), + "paired_wa0_vs_wa3_all_cases": paired(results), "paired_wa0_vs_wa3_single_answer": paired(sa)} + if results_blank is not None: + sb = [r for r in results_blank if r["single_answer"]] + out["wa3_side_channels_blanked_all_cases"] = aggregate(results_blank) + out["wa3_side_channels_blanked_single_answer"] = aggregate(sb) + out["wa3_side_channels_blanked_single_answer_not_in_wa3_training"] = aggregate(unseen(sb)) + ach = [c for c in cases_all if "achem_status" in c] + if ach: + by_id = {r["case_id"]: r for r in results} + strata = collections.defaultdict(list) + status = collections.Counter(c["achem_status"] for c in ach) + for c in ach: + if c["achem_status"] != "ok" or not by_id[c["case_id"]]["single_answer"]: + continue + k = c["achem_k"] + strata["k=0" if k == 0 else ("k=1" if k == 1 else ("k=2" if k == 2 else ("k=3" if k == 3 else "k>=4")))].append(c) + out["achem"] = {"status": dict(status), "strata": {}} + for name, cs in sorted(strata.items()): + rs = [by_id[c["case_id"]] for c in cs] + row = {"n": len(cs), "mean_chance": float(np.mean([c["achem_chance"] or 0 for c in cs])), + "truth_in_achem": sum(c["truth_in_achem"] for c in cs), + "wa3_exact_span_harness_inputs": aggregate(rs)["iterative_exact_span_accuracy"], + "wa0_exact_span_harness_inputs": sum(c["wa0_iterative_span_exact"] for c in cs) / len(cs)} + if results_blank is not None: + bb = {r["case_id"]: r for r in results_blank} + row["wa3_exact_span_side_channels_blanked"] = aggregate([bb[c["case_id"]] for c in cs])["iterative_exact_span_accuracy"] + out["achem"]["strata"][name] = row + return out + + +def main(): + OUT.mkdir(parents=True, exist_ok=True) + manifest = {"schema": "bertose_wa3_typed_strict_linkage_diagnostic_v1", + "parent_script": "wa3_same_test.py sha256 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 (job 12847066)", + "decoding": "type-consistent answer space (see docstring); renormalised softmax; threshold 0.80; 3 rounds", + "started": time.strftime("%Y-%m-%dT%H:%M:%S"), + "slurm_job_id": os.environ.get("SLURM_JOB_ID"), "host": platform.node(), "python": sys.version.split()[0], + "torch": torch.__version__, "threads": torch.get_num_threads(), + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back"} + for path, expect in EXPECTED_SHA.items(): + got = sha256_file(path) + if got != expect: + fail("%s sha %s != %s" % (path, got, expect)) + log("all %d pinned file hashes match" % len(EXPECTED_SHA)) + + hie, ev0 = load_wa0_evaluator() + w3 = build_wa3_tokenizer() + manifest["wa3_invalid_prediction_set"] = {"specials": w3["n_specials"], "ambiguity_tokens": w3["n_ambiguity"]} + java_cp = compile_java_helper() + with gzip.open(PKGD / "review_sequence_parent_index.tsv.gz", "rt", newline="") as fh: + idx_rows = list(csv.DictReader(fh, delimiter="\t")) + if len(idx_rows) != 281208: + fail("parent index row count %d" % len(idx_rows)) + + parity = parity_gate(w3, java_cp, idx_rows) + write_json(OUT / "gate_wa3_input_parity.json", parity) + log("WA3 input parity: %s %s/%d" % (parity["status"], parity["matches"].get("all", 0), parity["rows"])) + if parity["status"] != "PASS": + fail("WA3 inputs do not reproduce the training arrays; see gate_wa3_input_parity.json") + + look = exposure_lookup(idx_rows) + achem = load_achem() + set_data, all_test_wurcs = {}, set() + for set_name, spec in SETS.items(): + first_cfg = parse_wa0_summary(spec["wa0_root"] / spec["runs"][0]) + csv_path = Path(first_cfg["input_csv"]) if set_name == "bench1392" else WORK / "inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv" + rows = hie.load_rows(input_csv=csv_path, limit=first_cfg["glycans_loaded"], shuffle=False, seed=42) + manifest.setdefault("inputs", {})[set_name] = {"csv": str(csv_path), "sha256": sha256_file(csv_path), "rows": len(rows)} + uniq = sorted({r["wurcs"] for r in rows}) + auths = run_java_helper(java_cp, uniq) + encodings = {w: wa3_encode(w3, w, a) for w, a in zip(uniq, auths)} + manifest["inputs"][set_name]["helper_errors"] = sum(a["helper_error"] for a in auths) + manifest["inputs"][set_name]["exposure_glycans"] = dict(collections.Counter(look(w)["wa3_partition"] for w in uniq)) + set_data[set_name] = (rows, encodings) + all_test_wurcs.update(uniq) + log("%s: %d glycans; WA3 exposure %s" % (set_name, len(uniq), manifest["inputs"][set_name]["exposure_glycans"])) + + w3["allowed_np"], manifest["answer_space"] = build_allowed(w3, idx_rows, all_test_wurcs) + log("answer space: %s" % manifest["answer_space"]) + + built, identity_failures = [], [] + for set_name, spec in SETS.items(): + rows, encodings = set_data[set_name] + for run in spec["runs"]: + try: + cfg, wa0_cases = rebuild_wa0_cases(hie, ev0, rows, spec["wa0_root"] / run) + except (SystemExit, OSError, KeyError, ValueError) as exc: + identity_failures.append({"set": set_name, "run": run, "reason": str(exc)}) + log("%s/%s: SKIPPED, not the same test: %s" % (set_name, run, exc)) + continue + cases, excluded = build_wa3_cases(w3, wa0_cases, encodings, look) + for c in cases: + if len(c["units"]) == 1 and c["units"][0]["unit_type"] == "linkage": + c.update(achem(c["wurcs"], c["units"][0]["unit_text"])) + manifest["inputs"][set_name].setdefault("wa0_checkpoints", {})[run] = cfg["checkpoint"] + manifest.setdefault("truth_outside_answer_space", {})["%s/%s" % (set_name, run)] = truth_outside(w3, cases) + built.append((set_name, run, cfg, cases, excluded)) + log("%s/%s: WA0 cases rebuilt and verified (%d); WA3 cases %d; excluded %s" + % (set_name, run, len(wa0_cases), len(cases), excluded)) + write_json(OUT / "gate_case_identity.json", {"status": "PASS" if not identity_failures else "PARTIAL", + "verified_runs": [(s, r, len(c)) for s, r, _, c, _ in built], + "skipped_runs": identity_failures}) + manifest["case_identity_skipped_runs"] = identity_failures + if not built: + fail("no run could be reproduced as the same test") + + model, dev, ctx = load_model() + w3["allowed_mask"] = {k: torch.as_tensor(v, dtype=torch.bool, device=dev) for k, v in w3["allowed_np"].items()} + manifest["device"] = dev + log("WA3 loaded strict 505/505 on %s" % dev) + + table, results_store = [], {} + for set_name, run, cfg, cases, excluded in built: + run_dir = OUT / set_name / run + case_digest = hashlib.sha256("\n".join(c["case_id"] for c in cases).encode()).hexdigest() + prior = json.load(_real_open(run_dir / "summary.json")) if (run_dir / "summary.json").is_file() else {} + if prior.get("script_sha256") == SCRIPT_SHA and prior.get("case_ids_sha256") == case_digest \ + and (run_dir / "case_results.jsonl").is_file(): + results = [json.loads(l) for l in _real_open(run_dir / "case_results.jsonl")] + summary = json.load(_real_open(run_dir / "summary.json")) + log("%s/%s: reused completed outputs" % (set_name, run)) + else: + t0 = time.time() + results = evaluate(model, dev, w3, cases, cfg["threshold"]) + results_blank = None + if run in SETS[set_name]["baseline_runs"]: + results_blank = evaluate(model, dev, w3, cases, cfg["threshold"], blank_side_channels=True) + run_dir.parent.mkdir(parents=True, exist_ok=True) + with _real_open(run_dir.parent / (run + "__side_channels_blanked.jsonl"), "w") as fh: + for r in results_blank: + fh.write(json.dumps(r) + "\n") + summary = summarize_run(results, cases, excluded, cfg, results_blank) + summary["script_sha256"], summary["case_ids_sha256"] = SCRIPT_SHA, case_digest + summary["seconds"] = round(time.time() - t0, 1) + run_dir.mkdir(parents=True, exist_ok=True) + tmp = run_dir / "case_results.jsonl.tmp" + with _real_open(tmp, "w") as fh: + for r in results: + fh.write(json.dumps(r) + "\n") + tmp.replace(run_dir / "case_results.jsonl") + write_json(run_dir / "summary.json", summary) + log("%s/%s: WA3 exact-span all %.4f | single-answer %.4f | WA0 paired %.4f (%.0fs)" + % (set_name, run, summary["wa3_all_cases"].get("iterative_exact_span_accuracy", 0), + summary["wa3_single_answer"].get("iterative_exact_span_accuracy", 0), + summary["paired_wa0_vs_wa3_all_cases"].get("wa0_exact_span", 0), summary["seconds"])) + results_store[(set_name, run)] = results + blank_path = OUT / set_name / (run + "__side_channels_blanked.jsonl") + if blank_path.is_file(): + results_store[(set_name, run, "blank")] = [json.loads(l) for l in _real_open(blank_path)] + a, s, u = summary["wa3_all_cases"], summary["wa3_single_answer"], summary["wa3_single_answer_not_in_wa3_training"] + p = summary["paired_wa0_vs_wa3_all_cases"] + table.append({"set": set_name, "run": run, "threshold": cfg["threshold"], "mask_plan": cfg["mask_plan"] or cfg["span_types"][0] + ":1", + "cases": a.get("num_cases", 0), "wa0_exact_span_same_cases": round(p.get("wa0_exact_span", 0), 4), + "wa3_exact_span": round(a.get("iterative_exact_span_accuracy", 0), 4), + "wa3_resolved_fraction": round(a.get("iterative_resolved_fraction", 0), 4), + "wa3_accuracy_among_resolved": round(a.get("iterative_accuracy_among_resolved", 0), 4), + "single_answer_cases": s.get("num_cases", 0), + "wa3_exact_span_single_answer": round(s.get("iterative_exact_span_accuracy", 0), 4), + "single_answer_not_in_wa3_training_cases": u.get("num_cases", 0), + "wa3_exact_span_single_answer_not_in_wa3_training": round(u.get("iterative_exact_span_accuracy", 0), 4) if u.get("num_cases") else "", + "wa3_exact_span_side_channels_blanked": round(summary["wa3_side_channels_blanked_all_cases"]["iterative_exact_span_accuracy"], 4) + if summary.get("wa3_side_channels_blanked_all_cases", {}).get("num_cases") else ""}) + with _real_open(OUT / "summary_table.csv", "w", newline="") as fh: + wr = csv.DictWriter(fh, fieldnames=list(table[0].keys())) + wr.writeheader() + wr.writerows(table) + ctx.__exit__(None, None, None) + del model + log("WA3 evaluation complete; fitting baselines") + + BaselineStats.linkage_class = staticmethod(w3["exact_linkage"]) + stats, fit_counts = fit_baselines(w3, idx_rows, all_test_wurcs) + manifest["baseline_fit"] = fit_counts + base_table = [] + for set_name, run, cfg, cases, excluded in built: + if run not in SETS[set_name]["baseline_runs"] or (set_name, run) not in results_store: + continue + by_id = {r["case_id"]: r for r in results_store[(set_name, run)]} + blank = results_store.get((set_name, run, "blank")) + blank_by_id = {r["case_id"]: r for r in blank} if blank else None + encodings = set_data[set_name][1] + for row in run_baselines(w3, stats, cases, encodings, by_id, blank_by_id): + base_table.append({"set": set_name, "run": run, **row}) + if not base_table: + base_table = [{"set": "", "run": "", "method": "none", "subset": "", "n": 0, "exact_span_accuracy": ""}] + with _real_open(OUT / "baselines_same_cases.csv", "w", newline="") as fh: + wr = csv.DictWriter(fh, fieldnames=list(base_table[0].keys())) + wr.writeheader() + wr.writerows(base_table) + manifest["finished"] = time.strftime("%Y-%m-%dT%H:%M:%S") + manifest["script_sha256"] = sha256_file(Path(__file__)) + manifest["status"] = "COMPLETE" if not identity_failures else "PARTIAL_RUNS_SKIPPED" + write_json(OUT / "run_manifest.json", manifest) + log("DONE") + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/iar_completion/originals/wa3_typed_test.py b/releases/2026-10-02/iar_completion/originals/wa3_typed_test.py new file mode 100644 index 0000000000000000000000000000000000000000..7952d57935729ebc39699107ecdad2bf23bebc1d --- /dev/null +++ b/releases/2026-10-02/iar_completion/originals/wa3_typed_test.py @@ -0,0 +1,1150 @@ +#!/usr/bin/env python3 +"""TYPED-DECODING child of wa3_same_test.py (sha 0da5f247..., job 12847066), 2026-09-24. + +Only change: every method answers from the same, type-consistent answer space. + * BERTose: at a masked linkage piece (residue_id == -2) the softmax is taken only over tokens seen as + linkage pieces in WA3 training parents; at a masked residue piece (residue_id >= 0) only over tokens + seen as residue pieces. Specials, '?' ambiguity tokens and enumerated-alternative ('|') tokens are + excluded, because the test never scores them as correct (single_answer excludes '|' and '?'). + Probabilities are renormalised within the allowed set; threshold 0.80, 3 rounds, cases, inputs + (class 9 / depth 202 blanking) and metrics unchanged. + * Baselines: enumerated-alternative ('|') units are no longer prediction candidates, so all methods + choose from the same answer space. Their features/similarity are unchanged. +Runs: the four primary single-span runs only (bench1392 residue/linkage, seal162 residue/linkage at 0.80). + +Original docstring follows. + +WA3 rerun of the submitted held-out masking tests, on the SAME cases. + +Tests reproduced (both reported in the original submission): + * bench1392 -- 1,392 benchmark glycans (Supplementary Fig. 4; WA0 runs on Nova, 04-24) + * seal162 -- 162 paper-novel grey-seal milk glycans (Supplementary Fig. 5; WA0 runs 04-24/25) + +Same test, by construction: + 1. The untouched submitted harness (heldout_ipa_eval.py, sha 8d05a404...) rebuilds every WA0 case + with the submitted tokenizer, vocabulary, eligibility rule, seed 42 and mask plans. Every rebuilt + case must equal the WA0 run's own case_details.jsonl (case ids, masked positions, truth ids), + otherwise the job stops. + 2. Each masked WA0 span is mapped to its WURCS semantic unit(s). WA3 masks exactly those units. + 3. WA3 inputs are built exactly as WA3's training arrays were built: official WURCSArray helper + (Java) for branch structure + the frozen builder's repair + frozen 2,114-token BPE. A parity gate + rebuilds a sample of WA3 training parents and requires 100% agreement on all five channels. + 4. Filling, threshold, 3 rounds, top-k and every metric are identical to the harness. + +Reviewer 2 point 5 (irreducible uncertainty, simple baselines) is handled on the same cases: + * masked units that are curator-declared enumerations ('|') or unknown ('?') are flagged and + excluded from the single-answer score (reported separately, never silently dropped) + * each masked single linkage gets |A_chem| (chemically admissible acceptor positions; chance=1/k) + * marginal-frequency, context-frequency and nearest-neighbour baselines fitted on WA3's own + training parents (test glycans removed) are scored on the identical single-span cases + +Inference only on the frozen reported model (WA3, A1111, seed 42, epoch 58). No write-back. +""" +from __future__ import annotations + +import base64 +import builtins +import collections +import csv +import functools +import gzip +import hashlib +import importlib.util +import json +import os +import platform +import re +import shutil +import subprocess +import sys +import time +from pathlib import Path + +import numpy as np +import torch + +torch.set_num_threads(int(os.environ.get("NTHREADS", "16"))) +csv.field_size_limit(10 ** 9) + +PROJ = Path("/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training") +PKGD = PROJ / "data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1" +WA0_HARNESS = PROJ / "writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py" +WA0_VOCAB = PROJ / "data/bpe_vocabulary_clean.json" +WA0_AMB = PROJ / "data/bpe_ambiguity_tokens.json" +WA0_CKPT_PATH = PROJ / "checkpoints_v5b_excluded/best_v5b_excluded_model.pt" # path only; never loaded +BENCH_DIR = PROJ / "writing/glycangt_heldout_ipa_validation" +SCHEMA_DIR = Path("/work/ratul1/supantha/glycan-SD-VS/review/iar_pipe_schema_20260823_r1") +JAVA_BIN = Path("/work/ratul1/supantha/miniconda3/envs/DeepGlycanSite/bin") +ROOT = Path("/work/ratul1/supantha/bertose_a5_static_precache_20260723_r2c4_closure31_py310_3c8d5299a4af15bc") +TRAIN_MOD = ROOT / ("writing/review/multimodal/runtime/md_temporal_20x6_end_to_end_20260802_r3_native_intersection/" + "run_review_md_temporal_20x6_training_r3.py") +CK = ROOT / ("writing/review/multimodal/outputs/a5_wa345_pretraining_20260817_r1/production/" + "review_md20x6_md20x6-a1111-wa345-20260817-r1_A1111_wa3_seed42/review_checkpoints/" + "review_md20x6_checkpoint_best.pt") +CK_SHA = "8e7d95ee492df6d843f495dd4708c97ee16a947e75b5cd8f83b23e4f4a0d6d82" + +WORK = Path(os.environ["WORK"]) +SCRIPT_SHA = hashlib.sha256(Path(__file__).read_bytes()).hexdigest() +OUT = WORK / "outputs" +JAVA_DIR = WORK / "inputs/java" + +EXPECTED_SHA = { + PKGD / "review_frozen_training_a5_wurcs_bpe.py": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4", + PKGD / "review_frozen_training_a5_topology.py": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7", + PKGD / "review_frozen_sequence_tree_runtime.py": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04", + PKGD / "review_bpe_vocabulary.json": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b", + PKGD / "review_bpe_ambiguity_tokens.json": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b", + PKGD / "review_sequence_parent_index.tsv.gz": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0", + PKGD / "review_token_ids.npy": "ec2d52dced65d22f0f218ff617d351fbd2930661bc8681e939990149d493537d", + PKGD / "review_residue_ids.npy": "36c96dcd3e03ba30e02e16f98d17605742627a37b37cd7824f2a745dd09dc044", + PKGD / "review_branch_depths.npy": "f39f76aa56a9bb782b2349f3ad1ca4ad16351ee1f06a8b9ae4b06bff9b1ebece", + PKGD / "review_linkage_types.npy": "89edb1940765928ced6f54e0d394f95c573eb9d96310b14dbd0adf8e20ac07c4", + PKGD / "review_attention_mask.npy": "01ed165720b9414e614dd7e7d75284a8886165f11138e16117ffcbe4e4bbf95c", + PKGD / "review_lengths.npy": "ade919d1e054c0ba852aa047bf873ac675f81a6c1f8a05cc73a0a2258131f021", + WA0_HARNESS: "8d05a4048e200625694ff9a36f50af89b845fd0d38ba8034a97a710e7ad3dce2", + WA0_VOCAB: "6a572afdf53f1494ab96c896876b824ca7ea749777352606aa9f96bf270ceecc", + WA0_AMB: "c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74", + JAVA_DIR / "review_A5WurcsArrayTreeAudit.java": "a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6", + JAVA_DIR / "review_wurcsframework-1.3.1.jar": "5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37", + JAVA_DIR / "review_MolWURCS.jar": "bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf", +} + +SEAL_RUNS = ["seal162_residue_t080", "seal162_linkage_t080"] +BENCH_RUNS = ["benchmark1392_residue_full", "benchmark1392_linkage_full"] +SETS = { + "bench1392": {"runs": BENCH_RUNS, "wa0_root": BENCH_DIR / "outputs", + "baseline_runs": ["benchmark1392_residue_full", "benchmark1392_linkage_full"]}, + "seal162": {"runs": SEAL_RUNS, "wa0_root": WORK / "inputs/wa0_seal", + "baseline_runs": ["seal162_residue_t080", "seal162_linkage_t080"]}, +} +ITERATIONS, TOP_K, MAX_LEN, BATCH = 3, 5, 256, 32 + +_real_open = builtins.open + + +def _guarded_open(f, *a, **k): + t = str(f) + if "locked_test" in t or "expert_audit_pool" in t: + raise SystemExit("FAIL-CLOSED: refused to open %s" % t) + return _real_open(f, *a, **k) + + +builtins.open = _guarded_open + + +def sha256_file(path: Path) -> str: + h = hashlib.sha256() + with _real_open(path, "rb") as fh: + for chunk in iter(lambda: fh.read(1 << 22), b""): + h.update(chunk) + return h.hexdigest() + + +def fail(msg: str): + raise SystemExit("FAIL-CLOSED: " + msg) + + +def log(msg: str) -> None: + print(time.strftime("%H:%M:%S"), msg, flush=True) + + +def write_json(path: Path, obj) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + tmp = path.with_suffix(path.suffix + ".tmp") + with _real_open(tmp, "w") as fh: + json.dump(obj, fh, indent=2) + tmp.replace(path) + + +# ============================================================== WA0: the submitted harness, untouched +def load_wa0_evaluator(): + spec = importlib.util.spec_from_file_location("heldout_ipa_eval_wa3_same_test", str(WA0_HARNESS)) + hie = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = hie + spec.loader.exec_module(hie) + + class _NoModelDistiller(hie.BPEIPADistiller): # same pattern as r2_05_baselines.py + def _load_model(self): + return torch.nn.Identity() + + hie.BPEIPADistiller = _NoModelDistiller + ev = hie.HeldoutIPAEvaluator(checkpoint=WA0_CKPT_PATH, vocab=WA0_VOCAB, ambiguity=WA0_AMB, device="cpu", + threshold=0.80, batch_size=32, top_k=TOP_K, max_length=MAX_LEN) + return hie, ev + + +def parse_wa0_summary(run_dir: Path) -> dict: + cfg = {} + for line in _real_open(run_dir / "summary.md"): + m = re.match(r"^- (\w+): `(.*)`\s*$", line.strip()) + if m and m.group(1) not in cfg: + cfg[m.group(1)] = m.group(2) + if "mask_plan" in cfg: + mask_plan = "" if cfg["mask_plan"] in ("", "single-span default") else cfg["mask_plan"] + else: # older summary.md files omit the line; the run's own case records carry it + with _real_open(run_dir / "case_details.jsonl") as fh: + mp = json.loads(fh.readline()).get("mask_plan", "") + mask_plan = mp if "," in mp or not re.fullmatch(r"(residue|linkage):1", mp or "") else "" + if int(cfg["iterations"]) != ITERATIONS or int(cfg["top_k"]) != TOP_K: + fail("%s used iterations=%s top_k=%s" % (run_dir.name, cfg["iterations"], cfg["top_k"])) + return {"threshold": float(cfg["threshold"]), "iterations": int(cfg["iterations"]), "top_k": int(cfg["top_k"]), + "selection_mode": cfg["selection_mode"], "max_cases_per_glycan": int(cfg["max_cases_per_glycan"]), + "span_types": [s.strip() for s in cfg["span_types"].split(",") if s.strip()], "mask_plan": mask_plan, + "input_csv": cfg.get("input_csv"), "checkpoint": cfg.get("checkpoint"), + "glycans_loaded": int(cfg["glycans_loaded"])} + + +def wa0_units(ev, wurcs): + """Mirror of HeldoutIPAEvaluator._tokenize_with_spans, adding the global non-special unit index.""" + tok = ev.tokenizer.tokenize(wurcs, max_length=ev.max_length) + unp = tok["tokens"][: tok["length"]] + recs, cur, g = [], 0, 0 + for u in ev.tokenizer.pre_tokenizer.pre_tokenize(wurcs): + pieces = [u["text"]] if u["type"] == "special" else list(ev.tokenizer.apply_bpe(u["text"])) + s, e = cur, cur + len(pieces) - 1 + cur += len(pieces) + if u["type"] == "special": + continue + gi = g + g += 1 + if e >= len(unp) or unp[s:e + 1] != pieces: + continue + recs.append({"start": s, "end": e, "unit_type": u["type"], "unit_text": u["text"], "g": gi}) + _, spans, _ = ev._tokenize_with_spans(wurcs) + if [(r["start"], r["end"], r["unit_type"], r["unit_text"]) for r in recs] != \ + [(sp.start, sp.end, sp.unit_type, sp.unit_text) for sp in spans]: + fail("WA0 unit geometry differs from the harness for %s" % wurcs[:80]) + return recs + + +def rebuild_wa0_cases(hie, ev, rows, run_dir: Path): + cfg = parse_wa0_summary(run_dir) + if cfg["glycans_loaded"] != len(rows): + fail("%s loaded %d glycans, input has %d" % (run_dir.name, cfg["glycans_loaded"], len(rows))) + mask_req = hie.parse_mask_plan(cfg["mask_plan"]) + span_types = sorted(set(cfg["span_types"]) | set(mask_req)) if mask_req else cfg["span_types"] + cases, _ = ev.build_cases(rows=rows, span_types=span_types, selection_mode=cfg["selection_mode"], + max_cases_per_glycan=cfg["max_cases_per_glycan"], seed=42, mask_requirements=mask_req) + reported = {} + with _real_open(run_dir / "case_details.jsonl") as fh: + for line in fh: + r = json.loads(line) + reported[r["case_id"]] = r + if {c.case_id for c in cases} != set(reported): + fail("%s: rebuilt %d cases vs reported %d (ids differ)" % (run_dir.name, len(cases), len(reported))) + out = [] + for c in cases: + rep = reported[c.case_id] + if list(rep["positions"]) != list(c.positions) or list(rep["truth_token_ids"]) != list(c.truth_token_ids): + fail("%s: case %s positions/truth differ from the reported run" % (run_dir.name, c.case_id)) + pos = set(c.positions) + chosen = [r for r in wa0_units(ev, c.wurcs) if all(p in pos for p in range(r["start"], r["end"] + 1))] + covered = {p for r in chosen for p in range(r["start"], r["end"] + 1)} + if covered != pos: + fail("%s: case %s masked positions do not decompose into whole units" % (run_dir.name, c.case_id)) + out.append({"case_id": c.case_id, "glycan_index": c.glycan_index, "wurcs": c.wurcs, "mask_plan": c.mask_plan, + "units": [{"g": r["g"], "unit_type": r["unit_type"], "unit_text": r["unit_text"]} for r in chosen], + "wa0_iterative_span_exact": bool(rep["iterative_span_exact"]), + "wa0_initial_span_exact_top1": bool(rep["initial_span_exact_top1"]), + "wa0_resolved_all": int(rep["resolved_count"]) == len(rep["positions"])}) + return cfg, out + + +# ============================================================== WA3: frozen tokenizer + official helper +def build_wa3_tokenizer(): + shim = WORK / "shim" + if shim.exists(): + shutil.rmtree(shim) + pkg = shim / "frozen_training" + pkg.mkdir(parents=True) + (pkg / "__init__.py").write_text("") + shutil.copy(PKGD / "review_frozen_training_a5_topology.py", pkg / "a5_topology.py") + shutil.copy(PKGD / "review_frozen_training_a5_wurcs_bpe.py", pkg / "a5_wurcs_bpe.py") + src = (PKGD / "review_frozen_sequence_tree_runtime.py").read_text() + src = (src.replace("from training.a5_topology import", "from frozen_training.a5_topology import") + .replace("from training.a5_wurcs_bpe import", "from frozen_training.a5_wurcs_bpe import")) + if src.count("from frozen_training.") != 2: + fail("tree-runtime import rewrite did not hit exactly two lines") + (shim / "frozen_tree_runtime.py").write_text(src) + sys.path.insert(0, str(PROJ)) + sys.path.insert(0, str(shim)) + import frozen_training.a5_wurcs_bpe as fab # noqa: E402 + import frozen_tree_runtime as ftr # noqa: E402 + for mod in (fab, ftr): + if not str(Path(mod.__file__).resolve()).startswith(str(shim.resolve())): + fail("frozen module resolved outside the shim: %s" % mod.__file__) + if int(ftr.BRANCH_DEPTH_UNKNOWN) != 202: + fail("BRANCH_DEPTH_UNKNOWN != 202") + tok = ftr.ReviewA5WURCSBPETokenizerV3(PKGD / "review_bpe_vocabulary.json") + tok.apply_bpe = functools.lru_cache(maxsize=None)(tok.apply_bpe) + semantic = fab.A5WURCSPreTokenizer() + vocab = json.load(_real_open(PKGD / "review_bpe_vocabulary.json")) + t2i = {k: int(v) for k, v in vocab["token_to_id"].items()} + if len(t2i) != 2114 or sorted(t2i.values()) != list(range(2114)): + fail("WA3 vocabulary is not 2,114 contiguous ids") + specials = {int(v) for v in vocab["special_tokens"].values()} + amb = json.load(_real_open(PKGD / "review_bpe_ambiguity_tokens.json")) + amb_map = {str(t): int(i) for t, i in amb["ambiguous_tokens"].items()} + if set(amb_map.values()) != {int(x) for x in amb["ambiguous_ids"]}: + fail("WA3 ambiguity map ids and token dict disagree") + if any(t2i.get(t) != i for t, i in amb_map.items()) or not all("?" in t for t in amb_map): + fail("WA3 ambiguity map disagrees with the vocabulary") + return {"tok": tok, "semantic": semantic, "exact_linkage": ftr.ReviewA5WURCSPreTokenizerV3.exact_linkage_type, + "t2i": t2i, "i2t": {v: k for k, v in t2i.items()}, "invalid": specials | set(amb_map.values()), + "n_specials": len(specials), "n_ambiguity": len(amb_map), "mask_id": t2i["[MASK]"], + "branch_open_id": t2i["[BRANCH_OPEN]"], "linkage_unknown": int(ftr.LINKAGE_UNKNOWN), + "branch_depth_unknown": int(ftr.BRANCH_DEPTH_UNKNOWN)} + + +def compile_java_helper(): + classes = WORK / "java_classes" + if classes.exists(): + shutil.rmtree(classes) + src = WORK / "java_src/review/a5/A5WurcsArrayTreeAudit.java" + src.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(JAVA_DIR / "review_A5WurcsArrayTreeAudit.java", src) + classes.mkdir(parents=True) + cp = os.pathsep.join([str(JAVA_DIR / "review_wurcsframework-1.3.1.jar"), str(JAVA_DIR / "review_MolWURCS.jar")]) + subprocess.run([str(JAVA_BIN / "javac"), "-cp", cp, "-d", str(classes), str(src)], check=True) + return os.pathsep.join([str(classes), cp]) + + +def run_java_helper(classpath, wurcs_list): + payload = "".join("%d\t%s\n" % (i, base64.urlsafe_b64encode(w.encode()).decode().rstrip("=")) + for i, w in enumerate(wurcs_list)) + res = subprocess.run([str(JAVA_BIN / "java"), "-cp", classpath, "review.a5.A5WurcsArrayTreeAudit"], + input=payload, text=True, capture_output=True, check=True) + lines = res.stdout.splitlines() + if len(lines) != len(wurcs_list): + fail("official helper returned %d lines for %d inputs" % (len(lines), len(wurcs_list))) + out = [] + for i, line in enumerate(lines): + f = line.split("\t") + if int(f[0]) != i: + fail("official helper row order drift at %d" % i) + if len(f) < 2 or f[1] == "ERROR": # frozen builder semantics for ERROR rows + out.append({"rooted": False, "depths": (), "parents": (), "helper_error": True}) + continue + if len(f) < 27: + fail("official helper output truncated at row %d" % i) + rooted = f[20] == "true" + n = int(f[2]) + dec = lambda v: base64.urlsafe_b64decode(v + "=" * ((4 - len(v) % 4) % 4)).decode() # noqa: E731 + depths = tuple(int(x) for x in dec(f[24]).split(",")) if rooted else () + parents = tuple(int(x) for x in dec(f[26]).split(",")) if rooted else () + if rooted and (len(depths) != n or len(parents) != n): + fail("official rooted cardinality drift at row %d" % i) + out.append({"rooted": rooted, "depths": depths, "parents": parents, "helper_error": False}) + return out + + +def wa3_encode(w3, wurcs, auth): + """Frozen builder transform (review_build_official_sequence_topology_successor.py) + unit spans.""" + units = [dict(u) for u in w3["semantic"].pre_tokenize(wurcs) if u.get("text") != "[BRANCH_OPEN]"] + child = collections.Counter(v for v in auth["parents"] if v >= 0) + seen, repaired = set(), [] + for u in units: + u.pop("distance_matrix", None) + rid = int(u.get("residue_id", -1)) + u["linkage_type"] = 0 + if rid >= 0: + depth = int(auth["depths"][rid]) if auth["rooted"] else 202 + u["branch_depth"] = depth + if rid not in seen: + repaired.extend({"text": "[BRANCH_OPEN]", "type": "special", "residue_id": -1, + "branch_depth": depth, "linkage_type": 0} + for _ in range(max(0, child[rid] - 1))) + seen.add(rid) + else: + u["branch_depth"] = 0 + if u.get("type") == "linkage": + u["linkage_type"] = w3["exact_linkage"](str(u["text"])) + repaired.append(u) + pieces, spans, g, ords = [], [], 0, collections.Counter() + for u in repaired: + ps = [str(u["text"])] if u["type"] == "special" else list(w3["tok"].apply_bpe(str(u["text"]))) + s = len(pieces) + pieces.extend((p, int(u["residue_id"]), int(u["branch_depth"]), int(u["linkage_type"])) for p in ps) + if u["type"] != "special": + spans.append({"g": g, "start": s, "end": len(pieces) - 1, "unit_type": u["type"], + "unit_text": str(u["text"]), "ordinal": ords[u["type"]]}) + ords[u["type"]] += 1 + g += 1 + full = len(pieces) + capped = pieces[:255] + [("[END]", -1, 0, 0)] if full > 256 else list(pieces) + L = len(capped) + unk, pad = w3["t2i"]["[UNK]"], w3["t2i"]["[PAD]"] + enc = {"token_ids": [w3["t2i"].get(p[0], unk) for p in capped] + [pad] * (256 - L), + "residue_ids": [p[1] for p in capped] + [-1] * (256 - L), + "branch_depths": [p[2] for p in capped] + [0] * (256 - L), + "linkage_types": [p[3] for p in capped] + [0] * (256 - L), + "attention_mask": [1] * L + [0] * (256 - L), "length": L, "full_length": full, + "tokens": [p[0] for p in capped]} + return enc, spans + + +def parity_gate(w3, classpath, idx_rows): + arrays = {k: np.load(PKGD / ("review_%s.npy" % k), mmap_mode="r") + for k in ("token_ids", "residue_ids", "branch_depths", "linkage_types", "attention_mask")} + sample = [i for i in range(0, len(idx_rows), 97) if idx_rows[i]["truncated_at_256"] != "True"] + auths = run_java_helper(classpath, [idx_rows[i]["canonical_wurcs"] for i in sample]) + counts, bad = collections.Counter(), [] + for i, auth in zip(sample, auths): + enc, _ = wa3_encode(w3, idx_rows[i]["canonical_wurcs"], auth) + ok_all = True + for k, arr in arrays.items(): + same = np.array_equal(np.asarray(enc[k], dtype=np.int64), np.asarray(arr[i], dtype=np.int64)) + counts[k] += int(same) + ok_all &= same + counts["all"] += int(ok_all) + counts["helper_error"] += int(auth["helper_error"]) + if not ok_all and len(bad) < 10: + bad.append(idx_rows[i]["parent_glycorpus_id"]) + res = {"rows": len(sample), "matches": dict(counts), "mismatch_parents": bad, + "rule": "every 97th sequence_row excluding truncated_at_256; official helper + frozen transform"} + res["status"] = "PASS" if counts["all"] == len(sample) else "FAIL" + return res + + +# ============================================================== exposure of test glycans to WA3 +def wurcs_sections(w): + body = w[6:] if w.startswith("WURCS=") else w + out, buf, depth = [], [], 0 + for ch in body: + depth += (ch == "[") - (ch == "]") + if ch == "/" and depth == 0: + out.append("".join(buf)) + buf = [] + else: + buf.append(ch) + out.append("".join(buf)) + return out + + +def lin_key(w): + s = wurcs_sections(w) + if len(s) < 5: + return w + return "WURCS=" + "/".join(s[:4] + ["_".join(sorted(x for x in "/".join(s[4:]).split("_") if x))]) + + +def exposure_lookup(idx_rows): + exact, keyed = collections.defaultdict(list), collections.defaultdict(list) + for r in idx_rows: + exact[r["canonical_wurcs"]].append(r) + keyed[lin_key(r["canonical_wurcs"])].append(r) + priority = ["pretraining_train", "pretraining_development", "excluded_exact_or_verified_graph_identity"] + + def look(w): + hits = {id(r): r for r in exact.get(w, []) + keyed.get(lin_key(w), [])}.values() + if not hits: + return {"wa3_partition": "absent_from_wa3_sequence_parents", "wa3_match_mode": "none", "wa3_parent_id": ""} + parts = {r["pretraining_partition"] for r in hits} + best = next((p for p in priority if p in parts), sorted(parts)[0]) + hit = next(r for r in hits if r["pretraining_partition"] == best) + mode = "exact" if hit["canonical_wurcs"] == w else "lin_order_insensitive" + return {"wa3_partition": best, "wa3_match_mode": mode, "wa3_parent_id": hit["parent_glycorpus_id"]} + return look + + +# ============================================================== A_chem (verbatim logic from iar_achem_q_20260824_r1/a.py) +def load_achem(): + sys.path.insert(0, str(SCHEMA_DIR)) + from pipelib import parse_record, SIDE_RE, node_index # noqa: E402 + from classify import PLAIN_LINK # noqa: E402 + no_oh = set("Amd") + + def a_chem(rec, ai, skip_li): + occ = set() + for ei, e in enumerate([x for x in rec["lin"].split("_") if x]): + if ei == skip_li: + continue + m = PLAIN_LINK.match(e) + if not m: + continue + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if sm and sm.group(2) != "?": + try: + if node_index(sm.group(1)) - 1 == ai: + occ.add(int(sm.group(2))) + except ValueError: + pass + sk = rec["skel"][ai] + if not sk: + return None, "no_skeleton" + n = len(sk) + if n < 3: + return None, "skeleton_lt_3" + if n > 12: + return None, "skeleton_gt_12" + free = set(range(1, n + 1)) + if rec["anom"][ai] is not None: + free.discard(rec["anom"][ai]) + rg = rec["ring"][ai] + if rg and rg[1] != "?": + try: + free.discard(int(rg[1])) + except ValueError: + pass + free -= set(rec["subs"][ai]) + for p, ch in enumerate(sk, 1): + if ch in no_oh: + free.discard(p) + return free - occ, "ok" + + def for_linkage(wurcs, entry): + rec = parse_record(wurcs) + if rec is None or not rec["lin"]: + return {"achem_status": "unparsable"} + ents = [x for x in rec["lin"].split("_") if x] + if ents.count(entry) != 1: + return {"achem_status": "entry_not_unique_in_lin"} + li = ents.index(entry) + m = PLAIN_LINK.match(entry) + if not m: + return {"achem_status": "not_plain_linkage"} + sides = [] + for s_ in (m.group(1), m.group(2)): + sm = SIDE_RE.match(s_) + if not sm or sm.group(2) == "?": + return {"achem_status": "side_unparsable"} + try: + sides.append((node_index(sm.group(1)) - 1, int(sm.group(2)))) + except ValueError: + return {"achem_status": "bad_label"} + donor_flags = [0 <= ai < rec["nres"] and rec["anom"][ai] is not None and rec["anom"][ai] == p for ai, p in sides] + if donor_flags.count(True) != 1: + return {"achem_status": "orientation_undetermined"} + ai, truth_pos = sides[donor_flags.index(False)] + A, why = a_chem(rec, ai, li) + if A is None: + return {"achem_status": why} + k = len(A) + return {"achem_status": "ok", "achem_k": k, "achem_positions": sorted(A), "truth_in_achem": truth_pos in A, + "achem_chance": (1.0 / k) if k else None} + return for_linkage + + +# ============================================================== WA3 cases, model, evaluation +def build_wa3_cases(w3, wa0_cases, encodings, look): + cases, excluded = [], collections.Counter() + for c in wa0_cases: + enc, spans = encodings[c["wurcs"]] + by_g = {s["g"]: s for s in spans} + positions, texts = [], [] + for u in c["units"]: + s = by_g.get(u["g"]) + if s is None or s["unit_text"] != u["unit_text"] or s["unit_type"] != u["unit_type"]: + fail("unit mapping mismatch for %s unit %s" % (c["case_id"], u)) + positions.extend(range(s["start"], s["end"] + 1)) + texts.append(u["unit_text"]) + if max(positions) >= enc["length"] - (1 if enc["full_length"] > 256 else 0): + excluded["wa3_truncated_beyond_256"] += 1 + continue + truth = [enc["token_ids"][p] for p in positions] + masked = list(enc["token_ids"]) + for p in positions: + masked[p] = w3["mask_id"] + flags = {"enumerated_alternative": any("|" in t for t in texts), + "unknown_question_mark": any("?" in t for t in texts), + "wa3_truth_uses_invalid_token": any(t in w3["invalid"] for t in truth)} + flags["single_answer"] = not any(flags.values()) + lt_blank, bd_blank = list(enc["linkage_types"]), list(enc["branch_depths"]) + # Blank the channels that encode the hidden unit, honouring WA3's own input contract + # (composite_r4.validate_sequence_surface:584-592): linkage pieces are exactly residue_id == -2 and + # must keep a nonzero linkage class; non-residue pieces must keep branch depth 0. + for p in positions: + if enc["residue_ids"][p] == -2: + lt_blank[p] = w3["linkage_unknown"] # 9 = the class WA3 already uses for '?' linkages + elif enc["residue_ids"][p] >= 0: + bd_blank[p] = w3["branch_depth_unknown"] # 202 = the depth WA3 uses when the tree is not rooted + cases.append({**{k: c[k] for k in ("case_id", "glycan_index", "wurcs", "mask_plan", "units", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")}, + "unit_text": " | ".join("%s:%s" % (u["unit_type"], u["unit_text"]) for u in c["units"]), + "positions": positions, "truth_ids": truth, "masked_ids": masked, + "attention_mask": enc["attention_mask"], "residue_ids": enc["residue_ids"], + "branch_depths": enc["branch_depths"], "linkage_types": enc["linkage_types"], + "branch_depths_blank": bd_blank, "linkage_types_blank": lt_blank, + **flags, **look(c["wurcs"])}) + return cases, dict(excluded) + + +def all_absent(B, dev): # contract from iar_bytype3_20260825_r1/bytype.py (job 12094273) + return {"ms_token_ids": torch.empty((0, 64), dtype=torch.long, device=dev), + "ms_attention_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), + "ms_input_mask": torch.zeros((0, 64), dtype=torch.bool, device=dev), "ms_labels": None, + "ms_acquisition_parent_indices": torch.empty((0,), dtype=torch.long, device=dev), + "ms_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), "ms_mode": "development", + "static_token_ids": torch.zeros((B, 1, 4), dtype=torch.long, device=dev), + "static_attention_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), + "static_residue_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_slot_ids": torch.full((B, 1, 4), -1, dtype=torch.long, device=dev), + "static_state_mask": torch.zeros((B, 1), dtype=torch.bool, device=dev), + "static_state_ids": torch.full((B, 1), -1, dtype=torch.long, device=dev), + "static_input_mask": torch.zeros((B, 1, 4), dtype=torch.bool, device=dev), "static_labels": None, + "static_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev), + "md_values": torch.zeros((B, 2, 20, 6), dtype=torch.float32, device=dev), + "md_feature_mask": torch.zeros((B, 2, 20, 6), dtype=torch.bool, device=dev), + "md_child_present_mask": torch.zeros((B, 2), dtype=torch.bool, device=dev), + "md_state_row_ids": torch.full((B, 2), -1, dtype=torch.long, device=dev), + "md_window_input_mask": torch.zeros((B, 2, 20), dtype=torch.bool, device=dev), "md_labels": None, + "md_parent_available": torch.zeros((B,), dtype=torch.bool, device=dev)} + + +def load_model(): + spec = importlib.util.spec_from_file_location("wa3_train_mod", str(TRAIN_MOD)) + tm = importlib.util.module_from_spec(spec) + sys.modules["wa3_train_mod"] = tm + spec.loader.exec_module(tm) + if sha256_file(CK) != CK_SHA: + fail("WA3 checkpoint sha mismatch") + ctx = tm.native_authority(None, static_active=False) + _native, r8, _static, _runner = ctx.__enter__() + r5 = r8._core._r6._r5 + if int(r5.SEQUENCE_VOCAB_SIZE) != 2114: + fail("r5.SEQUENCE_VOCAB_SIZE != 2114") + model = tm.mdcore.make_md_enabled_composite_class(r5)(r8.NativeEightConfig(cell_id="A111", seq_vocab_size=2114), + md_cell_id="A1111", md_temporal_size=128) + ck = torch.load(CK, map_location="cpu", weights_only=False) + if str(ck.get("md_cell_id")) != "A1111" or int(ck["selection"]["best_epoch"]) != 58: + fail("checkpoint identity is not A1111 / best epoch 58") + model.load_state_dict(ck["model_state"], strict=True) + n_par = sum(p.numel() for p in model.parameters()) + if n_par != 138487995 or len(model.state_dict()) != 505: + fail("WA3 inventory %d params / %d tensors" % (n_par, len(model.state_dict()))) + model.eval() + dev = "cuda" if torch.cuda.is_available() else "cpu" + model.to(dev) + return model, dev, ctx + + +def evaluate(model, dev, w3, cases, threshold, blank_side_channels=False): + bd_key = "branch_depths_blank" if blank_side_channels else "branch_depths" + lt_key = "linkage_types_blank" if blank_side_channels else "linkage_types" + results = [] + for b0 in range(0, len(cases), BATCH): + batch = cases[b0:b0 + BATCH] + current = [list(c["masked_ids"]) for c in batch] + unresolved = [set(c["positions"]) for c in batch] + initial, accepted = [[] for _ in batch], [[] for _ in batch] + for it in range(ITERATIONS): + t = lambda key: torch.tensor([c[key] for c in batch], dtype=torch.long, device=dev) # noqa: E731 + with torch.inference_mode(): + o = model(seq_token_ids=torch.tensor(current, dtype=torch.long, device=dev), + seq_attention_mask=t("attention_mask").bool(), seq_residue_ids=t("residue_ids"), + seq_branch_depths=t(bd_key), seq_linkage_types=t(lt_key), + seq_labels=None, topology_labels=None, topology_available=None, + **all_absent(len(batch), torch.device(dev))) + logits = o.sequence_logits.float() + if w3["allowed_mask"]["linkage"].shape[0] != logits.shape[-1]: + fail("answer-space mask size %d != model vocabulary %d" + % (w3["allowed_mask"]["linkage"].shape[0], logits.shape[-1])) + progress = 0 + for ci, c in enumerate(batch): + if not unresolved[ci]: + continue + for li, pos in enumerate(c["positions"]): + rid = c["residue_ids"][pos] + if rid != -2 and rid < 0: + fail("masked position %d of %s is neither a residue nor a linkage piece" % (pos, c["case_id"])) + allow = w3["allowed_mask"]["linkage" if rid == -2 else "residue"] + row = logits[ci, pos].masked_fill(~allow, float("-inf")) + tp, ti = torch.topk(torch.softmax(row, dim=-1), k=TOP_K) + ids = [int(x) for x in ti.tolist()] + if it == 0: + initial[ci].append((ids[0] == c["truth_ids"][li], c["truth_ids"][li] in ids)) + if pos not in unresolved[ci]: + continue + if float(tp[0]) < threshold or ids[0] in w3["invalid"]: + continue + current[ci][pos] = ids[0] + unresolved[ci].remove(pos) + progress += 1 + accepted[ci].append(it + 1) + if progress == 0: + break + for ci, c in enumerate(batch): + final = [current[ci][p] for p in c["positions"]] + correct = [f == t for f, t in zip(final, c["truth_ids"])] + results.append({k: c[k] for k in ("case_id", "glycan_index", "mask_plan", "unit_text", "single_answer", + "enumerated_alternative", "unknown_question_mark", + "wa3_truth_uses_invalid_token", "wa3_partition", "wa3_match_mode", + "wa0_iterative_span_exact", "wa0_initial_span_exact_top1")} + | {"num_masked_positions": len(c["positions"]), + "truth_tokens": [w3["i2t"][x] for x in c["truth_ids"]], + "final_tokens": [w3["i2t"][x] for x in final], + "initial_top1_correct_count": sum(a for a, _ in initial[ci]), + "initial_top5_correct_count": sum(b for _, b in initial[ci]), + "resolved_count": len(c["positions"]) - len(unresolved[ci]), + "final_correct_count": sum(correct), + "initial_span_exact_top1": all(a for a, _ in initial[ci]), + "initial_span_exact_top5": all(b for _, b in initial[ci]), + "iterative_span_exact": all(correct), + "iterations_used": max(accepted[ci], default=0)}) + return results + + +def aggregate(rs): # identical formulas to HeldoutIPAEvaluator._aggregate_slice + n = len(rs) + if not n: + return {"num_cases": 0} + pos = sum(r["num_masked_positions"] for r in rs) + res = sum(r["resolved_count"] for r in rs) + cor = sum(r["final_correct_count"] for r in rs) + return {"num_cases": n, "num_masked_positions": pos, "avg_masked_positions_per_case": pos / n, + "initial_top1_token_accuracy": sum(r["initial_top1_correct_count"] for r in rs) / pos, + "initial_top5_token_accuracy": sum(r["initial_top5_correct_count"] for r in rs) / pos, + "initial_exact_span_accuracy_top1": sum(bool(r["initial_span_exact_top1"]) for r in rs) / n, + "initial_exact_span_accuracy_top5": sum(bool(r["initial_span_exact_top5"]) for r in rs) / n, + "iterative_resolved_fraction": res / pos, + "iterative_accuracy_among_resolved": (cor / res) if res else 0.0, + "iterative_final_token_accuracy": cor / pos, + "iterative_exact_span_accuracy": sum(bool(r["iterative_span_exact"]) for r in rs) / n, + "avg_iterations_used_per_case": sum(r["iterations_used"] for r in rs) / n} + + +def paired(rs): + n = len(rs) + if not n: + return {"n": 0} + a = [bool(r["wa0_iterative_span_exact"]) for r in rs] + b = [bool(r["iterative_span_exact"]) for r in rs] + return {"n": n, "wa0_exact_span": sum(a) / n, "wa3_exact_span": sum(b) / n, + "both": sum(x and y for x, y in zip(a, b)), "wa0_only": sum(x and not y for x, y in zip(a, b)), + "wa3_only": sum(y and not x for x, y in zip(a, b)), "neither": sum(not x and not y for x, y in zip(a, b))} + + +# ============================================================== R2-05 baselines (port of r2_05_baselines.py) +class BaselineStats: + def __init__(self): + self.marginal = collections.defaultdict(collections.Counter) + self.ctx_pair = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.ctx_prev = collections.defaultdict(lambda: collections.defaultdict(collections.Counter)) + self.n_glycans = 0 + self.feature_ids, self._feats, self._donor = {}, [], collections.defaultdict(list) + self.text_ids, self.texts, self.donor_index = {}, [], {} + + def _tid(self, text): + if text not in self.text_ids: + self.text_ids[text] = len(self.texts) + self.texts.append(text) + return self.text_ids[text] + + def add(self, index, unpadded, records): + self.n_glycans += 1 + feats = set() + for r in records: + key = (r["unit_type"], r["unit_text"]) + feats.add(self.feature_ids.setdefault(key, len(self.feature_ids))) + if not r["eligible"] or "|" in r["unit_text"]: # typed child: same answer space as BERTose + continue + ut, text = r["unit_type"], r["unit_text"] + self.marginal[ut][text] += 1 + prev_t = unpadded[r["start"] - 1] if r["start"] > 0 else "" + next_t = unpadded[r["end"] + 1] if r["end"] + 1 < len(unpadded) else "" + self.ctx_pair[ut][(prev_t, next_t)][text] += 1 + self.ctx_prev[ut][prev_t][text] += 1 + self._donor[(ut, r["ordinal"])].append((index, self._tid(text))) + self._feats.append(sorted(feats)) + + def finalize(self): + counts = np.zeros(len(self.feature_ids) + 1, dtype=np.int64) + for fs in self._feats: + for f in fs: + counts[f + 1] += 1 + self.indptr = np.cumsum(counts) + self.rows = np.zeros(int(self.indptr[-1]), dtype=np.int32) + fill = self.indptr[:-1].copy() + for gid, fs in enumerate(self._feats): + for f in fs: + self.rows[fill[f]] = gid + fill[f] += 1 + self.sizes = np.array([len(fs) for fs in self._feats], dtype=np.int64) + self._feats = [] + for key, pairs in self._donor.items(): + pairs.sort() + self.donor_index[key] = (np.array([p[0] for p in pairs], dtype=np.int64), + np.array([p[1] for p in pairs], dtype=np.int64)) + self._donor = {} + + @staticmethod + def _argmax(counter): + total = sum(counter.values()) + text = min(counter.items(), key=lambda kv: (-kv[1], kv[0]))[0] + return text, counter[text] / total + + def marginal_pred(self, ut): + return self._argmax(self.marginal[ut]) if self.marginal.get(ut) else (None, 0.0) + + def context_pred(self, ut, prev_t, next_t): + c = self.ctx_pair.get(ut, {}).get((prev_t, next_t)) + if c: + return self._argmax(c)[0], "prev_next" + c = self.ctx_prev.get(ut, {}).get(prev_t) + if c: + return self._argmax(c)[0], "prev_only" + return self.marginal_pred(ut)[0], "marginal_backoff" + + def nn_pred(self, ut, ordinal, query_keys): + donor = self.donor_index.get((ut, ordinal)) + if donor is None: + return None + cand_idx, cand_txt = donor + fids = [self.feature_ids[k] for k in query_keys if k in self.feature_ids] + if fids: + rows = np.concatenate([self.rows[self.indptr[f]:self.indptr[f + 1]] for f in fids]) + inter = np.bincount(rows, minlength=self.n_glycans)[cand_idx].astype(np.float64) + else: + inter = np.zeros(len(cand_idx)) + union = self.sizes[cand_idx] + len(query_keys) - inter + jac = np.divide(inter, union, out=np.zeros_like(inter), where=union > 0) + return self.texts[int(cand_txt[int(np.argmax(jac))])] + + +def fit_baselines(w3, idx_rows, test_wurcs): + token_ids = np.load(PKGD / "review_token_ids.npy", mmap_mode="r") + lengths = np.load(PKGD / "review_lengths.npy", mmap_mode="r") + stats, counts, bo, unk = BaselineStats(), collections.Counter(), w3["branch_open_id"], w3["t2i"]["[UNK]"] + test_keys = {lin_key(w) for w in test_wurcs} + for i, r in enumerate(idx_rows): + if r["pretraining_partition"] != "pretraining_train" or r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + counts["removed_test_glycan"] += 1 + continue + L = int(lengths[i]) + ids = [int(x) for x in token_ids[i, :L]] + p, recs, ords, ok = 0, [], collections.Counter(), True + for u in w3["semantic"].pre_tokenize(w): + if u.get("text") == "[BRANCH_OPEN]": + continue + while p < L and ids[p] == bo: + p += 1 + ps = [u["text"]] if u["type"] == "special" else list(w3["tok"].apply_bpe(u["text"])) + pid = [w3["t2i"].get(x, unk) for x in ps] + if ids[p:p + len(pid)] != pid: + ok = False + break + if u["type"] != "special": + recs.append({"start": p, "end": p + len(pid) - 1, "unit_type": u["type"], "unit_text": u["text"], + "ordinal": ords[u["type"]], "eligible": not any(x in w3["invalid"] for x in pid)}) + ords[u["type"]] += 1 + p += len(pid) + while ok and p < L and ids[p] == bo: + p += 1 + if not ok or p != L: + counts["unit_walk_mismatch"] += 1 + continue + stats.add(counts["fitted"], [w3["i2t"][x] for x in ids], recs) + counts["fitted"] += 1 + stats.finalize() + return stats, dict(counts) + + +def build_allowed(w3, idx_rows, test_wurcs): + """Type-consistent answer space: token ids seen at linkage / residue pieces in WA3 training parents.""" + token_ids = np.load(PKGD / "review_token_ids.npy", mmap_mode="r") + residue_ids = np.load(PKGD / "review_residue_ids.npy", mmap_mode="r") + lengths = np.load(PKGD / "review_lengths.npy", mmap_mode="r") + test_keys = {lin_key(w) for w in test_wurcs} + V = len(w3["t2i"]) + seen = {"linkage": np.zeros(V, dtype=bool), "residue": np.zeros(V, dtype=bool)} + rows = 0 + for i, r in enumerate(idx_rows): + if r["pretraining_partition"] != "pretraining_train" or r["model_pretraining_contributor"] != "True": + continue + w = r["canonical_wurcs"] + if w in test_wurcs or lin_key(w) in test_keys: + continue + L = int(lengths[i]) + ids, rid = np.asarray(token_ids[i, :L]), np.asarray(residue_ids[i, :L]) + seen["linkage"][ids[rid == -2]] = True + seen["residue"][ids[rid >= 0]] = True + rows += 1 + bad = np.zeros(V, dtype=bool) + bad[sorted(w3["invalid"])] = True + pipe = [i for t, i in w3["t2i"].items() if "|" in t] + bad[pipe] = True + allowed = {k: v & ~bad for k, v in seen.items()} + info = {"training_rows_scanned": rows, "vocab": V, "invalid_excluded": len(w3["invalid"]), + "pipe_tokens_excluded": len(pipe), + "linkage_tokens_seen": int(seen["linkage"].sum()), "residue_tokens_seen": int(seen["residue"].sum()), + "linkage_tokens_allowed": int(allowed["linkage"].sum()), + "residue_tokens_allowed": int(allowed["residue"].sum())} + return allowed, info + + +def truth_outside(w3, cases): + """Cases whose true token at some masked position lies outside the allowed answer space.""" + n = 0 + for c in cases: + for pos, t in zip(c["positions"], c["truth_ids"]): + kind = "linkage" if c["residue_ids"][pos] == -2 else "residue" + if not w3["allowed_np"][kind][t]: + n += 1 + break + return n + + +def score_prediction(truth_tokens, pred_tokens): + n = len(truth_tokens) + if pred_tokens is None: + ok, nc = False, 0 + else: + ok = list(pred_tokens) == list(truth_tokens) + nc = sum(a == b for a, b in zip(pred_tokens, truth_tokens)) if len(pred_tokens) == n else 0 + return {"num_masked_positions": n, "initial_top1_correct_count": nc, "initial_top5_correct_count": nc, + "resolved_count": n if pred_tokens is not None else 0, "final_correct_count": nc, + "initial_span_exact_top1": ok, "initial_span_exact_top5": ok, "iterative_span_exact": ok, + "iterations_used": 0} + + +def run_baselines(w3, stats, cases, encodings, results_by_id, results_blank_by_id=None): + method_rows = collections.defaultdict(list) + for c in cases: + if len(c["units"]) != 1: + continue + enc, spans = encodings[c["wurcs"]] + s = {sp["g"]: sp for sp in spans}[c["units"][0]["g"]] + tokens = [w3["i2t"][x] for x in enc["token_ids"][:enc["length"]]] + prev_t = tokens[s["start"] - 1] if s["start"] > 0 else "" + next_t = tokens[s["end"] + 1] if s["end"] + 1 < len(tokens) else "" + query = {(sp["unit_type"], sp["unit_text"]) for sp in spans if sp["g"] != s["g"]} + truth = [w3["i2t"][x] for x in c["truth_ids"]] + bpe = lambda t: None if t is None else list(w3["tok"].apply_bpe(t)) # noqa: E731 + preds = {"marginal_frequency": bpe(stats.marginal_pred(s["unit_type"])[0]), + "context_frequency": bpe(stats.context_pred(s["unit_type"], prev_t, next_t)[0]), + "nearest_neighbour": bpe(stats.nn_pred(s["unit_type"], s["ordinal"], query))} + flags = {k: c[k] for k in ("single_answer", "wa3_partition")} + for m, p in preds.items(): + method_rows[m].append({**score_prediction(truth, p), **flags}) + method_rows["WA3_harness_inputs"].append({**results_by_id[c["case_id"]]}) + if results_blank_by_id is not None: + method_rows["WA3_side_channels_blanked"].append({**results_blank_by_id[c["case_id"]]}) + wa0 = {"num_masked_positions": 1, "initial_top1_correct_count": 0, "initial_top5_correct_count": 0, + "resolved_count": 1, "final_correct_count": 0, "initial_span_exact_top1": c["wa0_initial_span_exact_top1"], + "initial_span_exact_top5": False, "iterative_span_exact": c["wa0_iterative_span_exact"], + "iterations_used": 0, **flags} + method_rows["WA0_submitted"].append(wa0) + table = [] + for m, rows in method_rows.items(): + for subset, sel in (("all_cases", rows), ("single_answer", [r for r in rows if r["single_answer"]]), + ("single_answer_not_in_wa3_training", + [r for r in rows if r["single_answer"] and r["wa3_partition"] != "pretraining_train"])): + a = aggregate(sel) + table.append({"method": m, "subset": subset, "n": a["num_cases"], + "exact_span_accuracy": round(a.get("iterative_exact_span_accuracy", 0.0), 4)}) + return table + + +# ============================================================== main +def summarize_run(results, cases_all, excluded, cfg, results_blank=None): + sa = [r for r in results if r["single_answer"]] + unseen = lambda rs: [r for r in rs if r["wa3_partition"] != "pretraining_train"] # noqa: E731 + out = {"wa0_config": cfg, "wa3_excluded": excluded, + "flags": {"cases": len(results), "single_answer": len(sa), + "enumerated_alternative": sum(r["enumerated_alternative"] for r in results), + "unknown_question_mark": sum(r["unknown_question_mark"] for r in results), + "wa3_truth_uses_invalid_token": sum(r["wa3_truth_uses_invalid_token"] for r in results)}, + "exposure": dict(collections.Counter(r["wa3_partition"] for r in results)), + "wa3_all_cases": aggregate(results), "wa3_single_answer": aggregate(sa), + "wa3_single_answer_not_in_wa3_training": aggregate(unseen(sa)), + "paired_wa0_vs_wa3_all_cases": paired(results), "paired_wa0_vs_wa3_single_answer": paired(sa)} + if results_blank is not None: + sb = [r for r in results_blank if r["single_answer"]] + out["wa3_side_channels_blanked_all_cases"] = aggregate(results_blank) + out["wa3_side_channels_blanked_single_answer"] = aggregate(sb) + out["wa3_side_channels_blanked_single_answer_not_in_wa3_training"] = aggregate(unseen(sb)) + ach = [c for c in cases_all if "achem_status" in c] + if ach: + by_id = {r["case_id"]: r for r in results} + strata = collections.defaultdict(list) + status = collections.Counter(c["achem_status"] for c in ach) + for c in ach: + if c["achem_status"] != "ok" or not by_id[c["case_id"]]["single_answer"]: + continue + k = c["achem_k"] + strata["k=0" if k == 0 else ("k=1" if k == 1 else ("k=2" if k == 2 else ("k=3" if k == 3 else "k>=4")))].append(c) + out["achem"] = {"status": dict(status), "strata": {}} + for name, cs in sorted(strata.items()): + rs = [by_id[c["case_id"]] for c in cs] + row = {"n": len(cs), "mean_chance": float(np.mean([c["achem_chance"] or 0 for c in cs])), + "truth_in_achem": sum(c["truth_in_achem"] for c in cs), + "wa3_exact_span_harness_inputs": aggregate(rs)["iterative_exact_span_accuracy"], + "wa0_exact_span_harness_inputs": sum(c["wa0_iterative_span_exact"] for c in cs) / len(cs)} + if results_blank is not None: + bb = {r["case_id"]: r for r in results_blank} + row["wa3_exact_span_side_channels_blanked"] = aggregate([bb[c["case_id"]] for c in cs])["iterative_exact_span_accuracy"] + out["achem"]["strata"][name] = row + return out + + +def main(): + OUT.mkdir(parents=True, exist_ok=True) + manifest = {"schema": "bertose_wa3_typed_decoding_heldout_masking_v1", + "parent_script": "wa3_same_test.py sha256 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 (job 12847066)", + "decoding": "type-consistent answer space (see docstring); renormalised softmax; threshold 0.80; 3 rounds", + "started": time.strftime("%Y-%m-%dT%H:%M:%S"), + "slurm_job_id": os.environ.get("SLURM_JOB_ID"), "host": platform.node(), "python": sys.version.split()[0], + "torch": torch.__version__, "threads": torch.get_num_threads(), + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back"} + for path, expect in EXPECTED_SHA.items(): + got = sha256_file(path) + if got != expect: + fail("%s sha %s != %s" % (path, got, expect)) + log("all %d pinned file hashes match" % len(EXPECTED_SHA)) + + hie, ev0 = load_wa0_evaluator() + w3 = build_wa3_tokenizer() + manifest["wa3_invalid_prediction_set"] = {"specials": w3["n_specials"], "ambiguity_tokens": w3["n_ambiguity"]} + java_cp = compile_java_helper() + with gzip.open(PKGD / "review_sequence_parent_index.tsv.gz", "rt", newline="") as fh: + idx_rows = list(csv.DictReader(fh, delimiter="\t")) + if len(idx_rows) != 281208: + fail("parent index row count %d" % len(idx_rows)) + + parity = parity_gate(w3, java_cp, idx_rows) + write_json(OUT / "gate_wa3_input_parity.json", parity) + log("WA3 input parity: %s %s/%d" % (parity["status"], parity["matches"].get("all", 0), parity["rows"])) + if parity["status"] != "PASS": + fail("WA3 inputs do not reproduce the training arrays; see gate_wa3_input_parity.json") + + look = exposure_lookup(idx_rows) + achem = load_achem() + set_data, all_test_wurcs = {}, set() + for set_name, spec in SETS.items(): + first_cfg = parse_wa0_summary(spec["wa0_root"] / spec["runs"][0]) + csv_path = Path(first_cfg["input_csv"]) if set_name == "bench1392" else WORK / "inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv" + rows = hie.load_rows(input_csv=csv_path, limit=first_cfg["glycans_loaded"], shuffle=False, seed=42) + manifest.setdefault("inputs", {})[set_name] = {"csv": str(csv_path), "sha256": sha256_file(csv_path), "rows": len(rows)} + uniq = sorted({r["wurcs"] for r in rows}) + auths = run_java_helper(java_cp, uniq) + encodings = {w: wa3_encode(w3, w, a) for w, a in zip(uniq, auths)} + manifest["inputs"][set_name]["helper_errors"] = sum(a["helper_error"] for a in auths) + manifest["inputs"][set_name]["exposure_glycans"] = dict(collections.Counter(look(w)["wa3_partition"] for w in uniq)) + set_data[set_name] = (rows, encodings) + all_test_wurcs.update(uniq) + log("%s: %d glycans; WA3 exposure %s" % (set_name, len(uniq), manifest["inputs"][set_name]["exposure_glycans"])) + + w3["allowed_np"], manifest["answer_space"] = build_allowed(w3, idx_rows, all_test_wurcs) + log("answer space: %s" % manifest["answer_space"]) + + built, identity_failures = [], [] + for set_name, spec in SETS.items(): + rows, encodings = set_data[set_name] + for run in spec["runs"]: + try: + cfg, wa0_cases = rebuild_wa0_cases(hie, ev0, rows, spec["wa0_root"] / run) + except (SystemExit, OSError, KeyError, ValueError) as exc: + identity_failures.append({"set": set_name, "run": run, "reason": str(exc)}) + log("%s/%s: SKIPPED, not the same test: %s" % (set_name, run, exc)) + continue + cases, excluded = build_wa3_cases(w3, wa0_cases, encodings, look) + for c in cases: + if len(c["units"]) == 1 and c["units"][0]["unit_type"] == "linkage": + c.update(achem(c["wurcs"], c["units"][0]["unit_text"])) + manifest["inputs"][set_name].setdefault("wa0_checkpoints", {})[run] = cfg["checkpoint"] + manifest.setdefault("truth_outside_answer_space", {})["%s/%s" % (set_name, run)] = truth_outside(w3, cases) + built.append((set_name, run, cfg, cases, excluded)) + log("%s/%s: WA0 cases rebuilt and verified (%d); WA3 cases %d; excluded %s" + % (set_name, run, len(wa0_cases), len(cases), excluded)) + write_json(OUT / "gate_case_identity.json", {"status": "PASS" if not identity_failures else "PARTIAL", + "verified_runs": [(s, r, len(c)) for s, r, _, c, _ in built], + "skipped_runs": identity_failures}) + manifest["case_identity_skipped_runs"] = identity_failures + if not built: + fail("no run could be reproduced as the same test") + + model, dev, ctx = load_model() + w3["allowed_mask"] = {k: torch.as_tensor(v, dtype=torch.bool, device=dev) for k, v in w3["allowed_np"].items()} + manifest["device"] = dev + log("WA3 loaded strict 505/505 on %s" % dev) + + table, results_store = [], {} + for set_name, run, cfg, cases, excluded in built: + run_dir = OUT / set_name / run + case_digest = hashlib.sha256("\n".join(c["case_id"] for c in cases).encode()).hexdigest() + prior = json.load(_real_open(run_dir / "summary.json")) if (run_dir / "summary.json").is_file() else {} + if prior.get("script_sha256") == SCRIPT_SHA and prior.get("case_ids_sha256") == case_digest \ + and (run_dir / "case_results.jsonl").is_file(): + results = [json.loads(l) for l in _real_open(run_dir / "case_results.jsonl")] + summary = json.load(_real_open(run_dir / "summary.json")) + log("%s/%s: reused completed outputs" % (set_name, run)) + else: + t0 = time.time() + results = evaluate(model, dev, w3, cases, cfg["threshold"]) + results_blank = None + if run in SETS[set_name]["baseline_runs"]: + results_blank = evaluate(model, dev, w3, cases, cfg["threshold"], blank_side_channels=True) + run_dir.parent.mkdir(parents=True, exist_ok=True) + with _real_open(run_dir.parent / (run + "__side_channels_blanked.jsonl"), "w") as fh: + for r in results_blank: + fh.write(json.dumps(r) + "\n") + summary = summarize_run(results, cases, excluded, cfg, results_blank) + summary["script_sha256"], summary["case_ids_sha256"] = SCRIPT_SHA, case_digest + summary["seconds"] = round(time.time() - t0, 1) + run_dir.mkdir(parents=True, exist_ok=True) + tmp = run_dir / "case_results.jsonl.tmp" + with _real_open(tmp, "w") as fh: + for r in results: + fh.write(json.dumps(r) + "\n") + tmp.replace(run_dir / "case_results.jsonl") + write_json(run_dir / "summary.json", summary) + log("%s/%s: WA3 exact-span all %.4f | single-answer %.4f | WA0 paired %.4f (%.0fs)" + % (set_name, run, summary["wa3_all_cases"].get("iterative_exact_span_accuracy", 0), + summary["wa3_single_answer"].get("iterative_exact_span_accuracy", 0), + summary["paired_wa0_vs_wa3_all_cases"].get("wa0_exact_span", 0), summary["seconds"])) + results_store[(set_name, run)] = results + blank_path = OUT / set_name / (run + "__side_channels_blanked.jsonl") + if blank_path.is_file(): + results_store[(set_name, run, "blank")] = [json.loads(l) for l in _real_open(blank_path)] + a, s, u = summary["wa3_all_cases"], summary["wa3_single_answer"], summary["wa3_single_answer_not_in_wa3_training"] + p = summary["paired_wa0_vs_wa3_all_cases"] + table.append({"set": set_name, "run": run, "threshold": cfg["threshold"], "mask_plan": cfg["mask_plan"] or cfg["span_types"][0] + ":1", + "cases": a.get("num_cases", 0), "wa0_exact_span_same_cases": round(p.get("wa0_exact_span", 0), 4), + "wa3_exact_span": round(a.get("iterative_exact_span_accuracy", 0), 4), + "wa3_resolved_fraction": round(a.get("iterative_resolved_fraction", 0), 4), + "wa3_accuracy_among_resolved": round(a.get("iterative_accuracy_among_resolved", 0), 4), + "single_answer_cases": s.get("num_cases", 0), + "wa3_exact_span_single_answer": round(s.get("iterative_exact_span_accuracy", 0), 4), + "single_answer_not_in_wa3_training_cases": u.get("num_cases", 0), + "wa3_exact_span_single_answer_not_in_wa3_training": round(u.get("iterative_exact_span_accuracy", 0), 4) if u.get("num_cases") else "", + "wa3_exact_span_side_channels_blanked": round(summary["wa3_side_channels_blanked_all_cases"]["iterative_exact_span_accuracy"], 4) + if summary.get("wa3_side_channels_blanked_all_cases", {}).get("num_cases") else ""}) + with _real_open(OUT / "summary_table.csv", "w", newline="") as fh: + wr = csv.DictWriter(fh, fieldnames=list(table[0].keys())) + wr.writeheader() + wr.writerows(table) + ctx.__exit__(None, None, None) + del model + log("WA3 evaluation complete; fitting baselines") + + stats, fit_counts = fit_baselines(w3, idx_rows, all_test_wurcs) + manifest["baseline_fit"] = fit_counts + base_table = [] + for set_name, run, cfg, cases, excluded in built: + if run not in SETS[set_name]["baseline_runs"] or (set_name, run) not in results_store: + continue + by_id = {r["case_id"]: r for r in results_store[(set_name, run)]} + blank = results_store.get((set_name, run, "blank")) + blank_by_id = {r["case_id"]: r for r in blank} if blank else None + encodings = set_data[set_name][1] + for row in run_baselines(w3, stats, cases, encodings, by_id, blank_by_id): + base_table.append({"set": set_name, "run": run, **row}) + if not base_table: + base_table = [{"set": "", "run": "", "method": "none", "subset": "", "n": 0, "exact_span_accuracy": ""}] + with _real_open(OUT / "baselines_same_cases.csv", "w", newline="") as fh: + wr = csv.DictWriter(fh, fieldnames=list(base_table[0].keys())) + wr.writeheader() + wr.writerows(base_table) + manifest["finished"] = time.strftime("%Y-%m-%dT%H:%M:%S") + manifest["script_sha256"] = sha256_file(Path(__file__)) + manifest["status"] = "COMPLETE" if not identity_failures else "PARTIAL_RUNS_SKIPPED" + write_json(OUT / "run_manifest.json", manifest) + log("DONE") + + +if __name__ == "__main__": + main() diff --git a/releases/2026-10-02/iar_completion/provenance/final_run/baselines_same_cases.csv b/releases/2026-10-02/iar_completion/provenance/final_run/baselines_same_cases.csv new file mode 100644 index 0000000000000000000000000000000000000000..48a867ac37e1e7e27e03f60c559da75dfad4169b --- /dev/null +++ b/releases/2026-10-02/iar_completion/provenance/final_run/baselines_same_cases.csv @@ -0,0 +1,61 @@ +set,run,method,subset,n,exact_span_accuracy +bench1392,benchmark1392_residue_full,marginal_frequency,all_cases,1392,0.2507 +bench1392,benchmark1392_residue_full,marginal_frequency,single_answer,1392,0.2507 +bench1392,benchmark1392_residue_full,marginal_frequency,single_answer_not_in_wa3_training,1392,0.2507 +bench1392,benchmark1392_residue_full,context_frequency,all_cases,1392,0.4088 +bench1392,benchmark1392_residue_full,context_frequency,single_answer,1392,0.4088 +bench1392,benchmark1392_residue_full,context_frequency,single_answer_not_in_wa3_training,1392,0.4088 +bench1392,benchmark1392_residue_full,nearest_neighbour,all_cases,1392,0.7414 +bench1392,benchmark1392_residue_full,nearest_neighbour,single_answer,1392,0.7414 +bench1392,benchmark1392_residue_full,nearest_neighbour,single_answer_not_in_wa3_training,1392,0.7414 +bench1392,benchmark1392_residue_full,BERTose_final_IAR,all_cases,1392,0.7601 +bench1392,benchmark1392_residue_full,BERTose_final_IAR,single_answer,1392,0.7601 +bench1392,benchmark1392_residue_full,BERTose_final_IAR,single_answer_not_in_wa3_training,1392,0.7601 +bench1392,benchmark1392_residue_full,WA0_submitted,all_cases,1392,0.8441 +bench1392,benchmark1392_residue_full,WA0_submitted,single_answer,1392,0.8441 +bench1392,benchmark1392_residue_full,WA0_submitted,single_answer_not_in_wa3_training,1392,0.8441 +bench1392,benchmark1392_linkage_full,marginal_frequency,all_cases,1362,0.1344 +bench1392,benchmark1392_linkage_full,marginal_frequency,single_answer,1362,0.1344 +bench1392,benchmark1392_linkage_full,marginal_frequency,single_answer_not_in_wa3_training,1362,0.1344 +bench1392,benchmark1392_linkage_full,context_frequency,all_cases,1362,0.558 +bench1392,benchmark1392_linkage_full,context_frequency,single_answer,1362,0.558 +bench1392,benchmark1392_linkage_full,context_frequency,single_answer_not_in_wa3_training,1362,0.558 +bench1392,benchmark1392_linkage_full,nearest_neighbour,all_cases,1362,0.7151 +bench1392,benchmark1392_linkage_full,nearest_neighbour,single_answer,1362,0.7151 +bench1392,benchmark1392_linkage_full,nearest_neighbour,single_answer_not_in_wa3_training,1362,0.7151 +bench1392,benchmark1392_linkage_full,BERTose_final_IAR,all_cases,1362,0.5977 +bench1392,benchmark1392_linkage_full,BERTose_final_IAR,single_answer,1362,0.5977 +bench1392,benchmark1392_linkage_full,BERTose_final_IAR,single_answer_not_in_wa3_training,1362,0.5977 +bench1392,benchmark1392_linkage_full,WA0_submitted,all_cases,1362,0.826 +bench1392,benchmark1392_linkage_full,WA0_submitted,single_answer,1362,0.826 +bench1392,benchmark1392_linkage_full,WA0_submitted,single_answer_not_in_wa3_training,1362,0.826 +seal162,seal162_residue_t080,marginal_frequency,all_cases,162,0.2778 +seal162,seal162_residue_t080,marginal_frequency,single_answer,162,0.2778 +seal162,seal162_residue_t080,marginal_frequency,single_answer_not_in_wa3_training,160,0.2812 +seal162,seal162_residue_t080,context_frequency,all_cases,162,0.5062 +seal162,seal162_residue_t080,context_frequency,single_answer,162,0.5062 +seal162,seal162_residue_t080,context_frequency,single_answer_not_in_wa3_training,160,0.5125 +seal162,seal162_residue_t080,nearest_neighbour,all_cases,162,0.7901 +seal162,seal162_residue_t080,nearest_neighbour,single_answer,162,0.7901 +seal162,seal162_residue_t080,nearest_neighbour,single_answer_not_in_wa3_training,160,0.7937 +seal162,seal162_residue_t080,BERTose_final_IAR,all_cases,162,0.8827 +seal162,seal162_residue_t080,BERTose_final_IAR,single_answer,162,0.8827 +seal162,seal162_residue_t080,BERTose_final_IAR,single_answer_not_in_wa3_training,160,0.8812 +seal162,seal162_residue_t080,WA0_submitted,all_cases,162,0.8642 +seal162,seal162_residue_t080,WA0_submitted,single_answer,162,0.8642 +seal162,seal162_residue_t080,WA0_submitted,single_answer_not_in_wa3_training,160,0.8625 +seal162,seal162_linkage_t080,marginal_frequency,all_cases,162,0.1728 +seal162,seal162_linkage_t080,marginal_frequency,single_answer,162,0.1728 +seal162,seal162_linkage_t080,marginal_frequency,single_answer_not_in_wa3_training,160,0.175 +seal162,seal162_linkage_t080,context_frequency,all_cases,162,0.6049 +seal162,seal162_linkage_t080,context_frequency,single_answer,162,0.6049 +seal162,seal162_linkage_t080,context_frequency,single_answer_not_in_wa3_training,160,0.6 +seal162,seal162_linkage_t080,nearest_neighbour,all_cases,162,0.6296 +seal162,seal162_linkage_t080,nearest_neighbour,single_answer,162,0.6296 +seal162,seal162_linkage_t080,nearest_neighbour,single_answer_not_in_wa3_training,160,0.6312 +seal162,seal162_linkage_t080,BERTose_final_IAR,all_cases,162,0.6049 +seal162,seal162_linkage_t080,BERTose_final_IAR,single_answer,162,0.6049 +seal162,seal162_linkage_t080,BERTose_final_IAR,single_answer_not_in_wa3_training,160,0.6062 +seal162,seal162_linkage_t080,WA0_submitted,all_cases,162,0.9753 +seal162,seal162_linkage_t080,WA0_submitted,single_answer,162,0.9753 +seal162,seal162_linkage_t080,WA0_submitted,single_answer_not_in_wa3_training,160,0.975 diff --git a/releases/2026-10-02/iar_completion/provenance/final_run/final_iar_summary.json b/releases/2026-10-02/iar_completion/provenance/final_run/final_iar_summary.json new file mode 100644 index 0000000000000000000000000000000000000000..87900a59d440bb321e47a3ae7f7c82221b01df6a --- /dev/null +++ b/releases/2026-10-02/iar_completion/provenance/final_run/final_iar_summary.json @@ -0,0 +1,140 @@ +{ + "runs": { + "bench1392/benchmark1392_residue_full": { + "all_cases": { + "num_cases": 1392, + "num_masked_positions": 1394, + "avg_masked_positions_per_case": 1.0014367816091954, + "initial_top1_token_accuracy": 0.851506456241033, + "initial_top5_token_accuracy": 0.9598278335724534, + "initial_exact_span_accuracy_top1": 0.8527298850574713, + "initial_exact_span_accuracy_top5": 0.9597701149425287, + "iterative_resolved_fraction": 0.7912482065997131, + "iterative_accuracy_among_resolved": 0.9592021758839528, + "iterative_final_token_accuracy": 0.7589670014347202, + "iterative_exact_span_accuracy": 0.7600574712643678, + "avg_iterations_used_per_case": 0.7923850574712644 + }, + "not_in_wa3_training": { + "num_cases": 1392, + "num_masked_positions": 1394, + "avg_masked_positions_per_case": 1.0014367816091954, + "initial_top1_token_accuracy": 0.851506456241033, + "initial_top5_token_accuracy": 0.9598278335724534, + "initial_exact_span_accuracy_top1": 0.8527298850574713, + "initial_exact_span_accuracy_top5": 0.9597701149425287, + "iterative_resolved_fraction": 0.7912482065997131, + "iterative_accuracy_among_resolved": 0.9592021758839528, + "iterative_final_token_accuracy": 0.7589670014347202, + "iterative_exact_span_accuracy": 0.7600574712643678, + "avg_iterations_used_per_case": 0.7923850574712644 + }, + "cases_using_readout": 0 + }, + "bench1392/benchmark1392_linkage_full": { + "all_cases": { + "num_cases": 1362, + "num_masked_positions": 1419, + "avg_masked_positions_per_case": 1.0418502202643172, + "initial_top1_token_accuracy": 0.7766032417195208, + "initial_top5_token_accuracy": 0.959830866807611, + "initial_exact_span_accuracy_top1": 0.7936857562408223, + "initial_exact_span_accuracy_top5": 0.9757709251101322, + "iterative_resolved_fraction": 0.6398872445384073, + "iterative_accuracy_among_resolved": 0.9129955947136564, + "iterative_final_token_accuracy": 0.5842142353770261, + "iterative_exact_span_accuracy": 0.5976505139500734, + "avg_iterations_used_per_case": 0.6637298091042585 + }, + "not_in_wa3_training": { + "num_cases": 1362, + "num_masked_positions": 1419, + "avg_masked_positions_per_case": 1.0418502202643172, + "initial_top1_token_accuracy": 0.7766032417195208, + "initial_top5_token_accuracy": 0.959830866807611, + "initial_exact_span_accuracy_top1": 0.7936857562408223, + "initial_exact_span_accuracy_top5": 0.9757709251101322, + "iterative_resolved_fraction": 0.6398872445384073, + "iterative_accuracy_among_resolved": 0.9129955947136564, + "iterative_final_token_accuracy": 0.5842142353770261, + "iterative_exact_span_accuracy": 0.5976505139500734, + "avg_iterations_used_per_case": 0.6637298091042585 + }, + "cases_using_readout": 1318 + }, + "seal162/seal162_residue_t080": { + "all_cases": { + "num_cases": 162, + "num_masked_positions": 162, + "avg_masked_positions_per_case": 1.0, + "initial_top1_token_accuracy": 0.9320987654320988, + "initial_top5_token_accuracy": 1.0, + "initial_exact_span_accuracy_top1": 0.9320987654320988, + "initial_exact_span_accuracy_top5": 1.0, + "iterative_resolved_fraction": 0.8888888888888888, + "iterative_accuracy_among_resolved": 0.9930555555555556, + "iterative_final_token_accuracy": 0.8827160493827161, + "iterative_exact_span_accuracy": 0.8827160493827161, + "avg_iterations_used_per_case": 0.8888888888888888 + }, + "not_in_wa3_training": { + "num_cases": 160, + "num_masked_positions": 160, + "avg_masked_positions_per_case": 1.0, + "initial_top1_token_accuracy": 0.93125, + "initial_top5_token_accuracy": 1.0, + "initial_exact_span_accuracy_top1": 0.93125, + "initial_exact_span_accuracy_top5": 1.0, + "iterative_resolved_fraction": 0.8875, + "iterative_accuracy_among_resolved": 0.9929577464788732, + "iterative_final_token_accuracy": 0.88125, + "iterative_exact_span_accuracy": 0.88125, + "avg_iterations_used_per_case": 0.8875 + }, + "cases_using_readout": 0 + }, + "seal162/seal162_linkage_t080": { + "all_cases": { + "num_cases": 162, + "num_masked_positions": 171, + "avg_masked_positions_per_case": 1.0555555555555556, + "initial_top1_token_accuracy": 0.8187134502923976, + "initial_top5_token_accuracy": 0.9590643274853801, + "initial_exact_span_accuracy_top1": 0.8395061728395061, + "initial_exact_span_accuracy_top5": 0.9691358024691358, + "iterative_resolved_fraction": 0.672514619883041, + "iterative_accuracy_among_resolved": 0.8695652173913043, + "iterative_final_token_accuracy": 0.5847953216374269, + "iterative_exact_span_accuracy": 0.6049382716049383, + "avg_iterations_used_per_case": 0.6975308641975309 + }, + "not_in_wa3_training": { + "num_cases": 160, + "num_masked_positions": 169, + "avg_masked_positions_per_case": 1.05625, + "initial_top1_token_accuracy": 0.8165680473372781, + "initial_top5_token_accuracy": 0.9585798816568047, + "initial_exact_span_accuracy_top1": 0.8375, + "initial_exact_span_accuracy_top5": 0.96875, + "iterative_resolved_fraction": 0.6745562130177515, + "iterative_accuracy_among_resolved": 0.868421052631579, + "iterative_final_token_accuracy": 0.5857988165680473, + "iterative_exact_span_accuracy": 0.60625, + "avg_iterations_used_per_case": 0.7 + }, + "cases_using_readout": 155 + } + }, + "linkage_readout": { + "dev_accuracy_for_selection": 0.7359, + "best_epoch": 46, + "tokens": 211, + "train_samples": 111989, + "development_samples": 27690, + "feature_dim": 768 + }, + "neutral_unknown": { + "neutral_linkage_embedding": "sequence_embeddings.linkage_embeddings", + "hidden_capture_input_of": "sequence_head" + } +} \ No newline at end of file diff --git a/releases/2026-10-02/iar_completion/provenance/final_run/run_manifest.json b/releases/2026-10-02/iar_completion/provenance/final_run/run_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..d8906d115479bcba23d3ddf99aeaeaaeffd9a5cc --- /dev/null +++ b/releases/2026-10-02/iar_completion/provenance/final_run/run_manifest.json @@ -0,0 +1,102 @@ +{ + "schema": "bertose_wa3_final_iar_readout_alltrain_v1", + "parent_script": "wa3_same_test.py sha256 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 (job 12847066)", + "decoding": "type-consistent answer space (see docstring); renormalised softmax; threshold 0.80; 3 rounds", + "started": "2026-09-26T23:45:25", + "slurm_job_id": "16604931", + "host": "nova20-amp-1", + "python": "3.10.16", + "torch": "2.9.1+cu128", + "threads": 8, + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back", + "wa3_invalid_prediction_set": { + "specials": 10, + "ambiguity_tokens": 377 + }, + "inputs": { + "bench1392": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/glycangt_heldout_ipa_validation/data/benchmark_exclusion_1392_unseen_to_bertose_v5b_excluded.csv", + "sha256": "dbe6a21d409c7acc0992e2a87afc6218f01307a666fba6ad75339fc195bdf0c6", + "rows": 1392, + "helper_errors": 0, + "exposure_glycans": { + "excluded_exact_or_verified_graph_identity": 1291, + "absent_from_wa3_sequence_parents": 101 + }, + "wa0_checkpoints": { + "benchmark1392_residue_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_linkage_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt" + } + }, + "seal162": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/review/heldout_masking_wa3_final_iar_readout_all_20260927_r1/inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv", + "sha256": "e08c82fd1407f8a510f15e3dda0b4312c90aeb30eef8ac33d54bbe4d7eaadc7c", + "rows": 162, + "helper_errors": 0, + "exposure_glycans": { + "absent_from_wa3_sequence_parents": 160, + "pretraining_train": 2 + }, + "wa0_checkpoints": { + "seal162_residue_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_linkage_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt" + } + } + }, + "answer_space": { + "training_rows_scanned": 221897, + "vocab": 2114, + "invalid_excluded": 387, + "pipe_tokens_excluded": 379, + "linkage_tokens_seen": 462, + "residue_tokens_seen": 1185, + "linkage_tokens_allowed": 462, + "residue_tokens_allowed": 1170, + "linkage_class_counts": [ + 0, + 97966, + 150442, + 219104, + 95827, + 13486, + 11976, + 23, + 36422, + 658542 + ] + }, + "truth_outside_answer_space": { + "bench1392/benchmark1392_residue_full": 0, + "bench1392/benchmark1392_linkage_full": 0, + "seal162/seal162_residue_t080": 0, + "seal162/seal162_linkage_t080": 0 + }, + "case_identity_skipped_runs": [], + "device": "cuda", + "hooks": { + "neutral_linkage_embedding": "sequence_embeddings.linkage_embeddings", + "hidden_capture_input_of": "sequence_head" + }, + "ordinary_single_token_linkages": 211, + "partitions": { + "pretraining_train": 221899, + "pretraining_development": 55476, + "excluded_exact_or_verified_graph_identity": 3833 + }, + "linkage_readout": { + "dev_accuracy_for_selection": 0.7359, + "best_epoch": 46, + "tokens": 211, + "train_samples": 111989, + "development_samples": 27690, + "feature_dim": 768 + }, + "baseline_fit": { + "fitted": 221825, + "unit_walk_mismatch": 72, + "removed_test_glycan": 2 + }, + "finished": "2026-09-27T00:04:51", + "script_sha256": "72f8583bf32799ba29c09829d138900c0cbb589f73bd278f389da6fa8a786730", + "status": "COMPLETE" +} \ No newline at end of file diff --git a/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_final_iar_readout_20260926_run_manifest.json b/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_final_iar_readout_20260926_run_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..b3a88e923c591c69193506a7f45ee405ad219e8c --- /dev/null +++ b/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_final_iar_readout_20260926_run_manifest.json @@ -0,0 +1,102 @@ +{ + "schema": "bertose_wa3_final_iar_readout_v1", + "parent_script": "wa3_same_test.py sha256 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 (job 12847066)", + "decoding": "type-consistent answer space (see docstring); renormalised softmax; threshold 0.80; 3 rounds", + "started": "2026-09-26T10:13:47", + "slurm_job_id": "16602478", + "host": "nova18-wide-52", + "python": "3.10.16", + "torch": "2.9.1+cu128", + "threads": 16, + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back", + "wa3_invalid_prediction_set": { + "specials": 10, + "ambiguity_tokens": 377 + }, + "inputs": { + "bench1392": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/glycangt_heldout_ipa_validation/data/benchmark_exclusion_1392_unseen_to_bertose_v5b_excluded.csv", + "sha256": "dbe6a21d409c7acc0992e2a87afc6218f01307a666fba6ad75339fc195bdf0c6", + "rows": 1392, + "helper_errors": 0, + "exposure_glycans": { + "excluded_exact_or_verified_graph_identity": 1291, + "absent_from_wa3_sequence_parents": 101 + }, + "wa0_checkpoints": { + "benchmark1392_residue_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_linkage_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt" + } + }, + "seal162": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/review/heldout_masking_wa3_final_iar_readout_20260926_r1/inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv", + "sha256": "e08c82fd1407f8a510f15e3dda0b4312c90aeb30eef8ac33d54bbe4d7eaadc7c", + "rows": 162, + "helper_errors": 0, + "exposure_glycans": { + "absent_from_wa3_sequence_parents": 160, + "pretraining_train": 2 + }, + "wa0_checkpoints": { + "seal162_residue_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_linkage_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt" + } + } + }, + "answer_space": { + "training_rows_scanned": 221897, + "vocab": 2114, + "invalid_excluded": 387, + "pipe_tokens_excluded": 379, + "linkage_tokens_seen": 462, + "residue_tokens_seen": 1185, + "linkage_tokens_allowed": 462, + "residue_tokens_allowed": 1170, + "linkage_class_counts": [ + 0, + 97966, + 150442, + 219104, + 95827, + 13486, + 11976, + 23, + 36422, + 658542 + ] + }, + "truth_outside_answer_space": { + "bench1392/benchmark1392_residue_full": 0, + "bench1392/benchmark1392_linkage_full": 0, + "seal162/seal162_residue_t080": 0, + "seal162/seal162_linkage_t080": 0 + }, + "case_identity_skipped_runs": [], + "device": "cpu", + "hooks": { + "neutral_linkage_embedding": "sequence_embeddings.linkage_embeddings", + "hidden_capture_input_of": "sequence_head" + }, + "ordinary_single_token_linkages": 211, + "partitions": { + "pretraining_train": 221899, + "pretraining_development": 55476, + "excluded_exact_or_verified_graph_identity": 3833 + }, + "linkage_readout": { + "dev_accuracy_for_selection": 0.6927, + "best_epoch": 27, + "tokens": 211, + "train_samples": 24000, + "development_samples": 4000, + "feature_dim": 768 + }, + "baseline_fit": { + "fitted": 221825, + "unit_walk_mismatch": 72, + "removed_test_glycan": 2 + }, + "finished": "2026-09-26T11:09:02", + "script_sha256": "5acafc45244a0bf9a8489794f8a39f956622cf50594d87eb2eaa04502589fcb5", + "status": "COMPLETE" +} \ No newline at end of file diff --git a/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_final_iar_readout_all_20260927_run_manifest.json b/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_final_iar_readout_all_20260927_run_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..d8906d115479bcba23d3ddf99aeaeaaeffd9a5cc --- /dev/null +++ b/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_final_iar_readout_all_20260927_run_manifest.json @@ -0,0 +1,102 @@ +{ + "schema": "bertose_wa3_final_iar_readout_alltrain_v1", + "parent_script": "wa3_same_test.py sha256 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 (job 12847066)", + "decoding": "type-consistent answer space (see docstring); renormalised softmax; threshold 0.80; 3 rounds", + "started": "2026-09-26T23:45:25", + "slurm_job_id": "16604931", + "host": "nova20-amp-1", + "python": "3.10.16", + "torch": "2.9.1+cu128", + "threads": 8, + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back", + "wa3_invalid_prediction_set": { + "specials": 10, + "ambiguity_tokens": 377 + }, + "inputs": { + "bench1392": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/glycangt_heldout_ipa_validation/data/benchmark_exclusion_1392_unseen_to_bertose_v5b_excluded.csv", + "sha256": "dbe6a21d409c7acc0992e2a87afc6218f01307a666fba6ad75339fc195bdf0c6", + "rows": 1392, + "helper_errors": 0, + "exposure_glycans": { + "excluded_exact_or_verified_graph_identity": 1291, + "absent_from_wa3_sequence_parents": 101 + }, + "wa0_checkpoints": { + "benchmark1392_residue_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_linkage_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt" + } + }, + "seal162": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/review/heldout_masking_wa3_final_iar_readout_all_20260927_r1/inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv", + "sha256": "e08c82fd1407f8a510f15e3dda0b4312c90aeb30eef8ac33d54bbe4d7eaadc7c", + "rows": 162, + "helper_errors": 0, + "exposure_glycans": { + "absent_from_wa3_sequence_parents": 160, + "pretraining_train": 2 + }, + "wa0_checkpoints": { + "seal162_residue_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_linkage_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt" + } + } + }, + "answer_space": { + "training_rows_scanned": 221897, + "vocab": 2114, + "invalid_excluded": 387, + "pipe_tokens_excluded": 379, + "linkage_tokens_seen": 462, + "residue_tokens_seen": 1185, + "linkage_tokens_allowed": 462, + "residue_tokens_allowed": 1170, + "linkage_class_counts": [ + 0, + 97966, + 150442, + 219104, + 95827, + 13486, + 11976, + 23, + 36422, + 658542 + ] + }, + "truth_outside_answer_space": { + "bench1392/benchmark1392_residue_full": 0, + "bench1392/benchmark1392_linkage_full": 0, + "seal162/seal162_residue_t080": 0, + "seal162/seal162_linkage_t080": 0 + }, + "case_identity_skipped_runs": [], + "device": "cuda", + "hooks": { + "neutral_linkage_embedding": "sequence_embeddings.linkage_embeddings", + "hidden_capture_input_of": "sequence_head" + }, + "ordinary_single_token_linkages": 211, + "partitions": { + "pretraining_train": 221899, + "pretraining_development": 55476, + "excluded_exact_or_verified_graph_identity": 3833 + }, + "linkage_readout": { + "dev_accuracy_for_selection": 0.7359, + "best_epoch": 46, + "tokens": 211, + "train_samples": 111989, + "development_samples": 27690, + "feature_dim": 768 + }, + "baseline_fit": { + "fitted": 221825, + "unit_walk_mismatch": 72, + "removed_test_glycan": 2 + }, + "finished": "2026-09-27T00:04:51", + "script_sha256": "72f8583bf32799ba29c09829d138900c0cbb589f73bd278f389da6fa8a786730", + "status": "COMPLETE" +} \ No newline at end of file diff --git a/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_linkage_diagnosis_20260925_run_manifest.json b/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_linkage_diagnosis_20260925_run_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..8e7473e14c1b2eb9965690ebdea5aaf9b0b59f36 --- /dev/null +++ b/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_linkage_diagnosis_20260925_run_manifest.json @@ -0,0 +1,155 @@ +{ + "schema": "bertose_wa3_linkage_diagnosis_v1", + "parent_script": "wa3_same_test.py sha256 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 (job 12847066)", + "decoding": "type-consistent answer space (see docstring); renormalised softmax; threshold 0.80; 3 rounds", + "started": "2026-09-25T07:10:27", + "slurm_job_id": "16593043", + "host": "nova18-wide-11", + "python": "3.10.16", + "torch": "2.9.1+cu128", + "threads": 16, + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back", + "wa3_invalid_prediction_set": { + "specials": 10, + "ambiguity_tokens": 377 + }, + "inputs": { + "bench1392": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/glycangt_heldout_ipa_validation/data/benchmark_exclusion_1392_unseen_to_bertose_v5b_excluded.csv", + "sha256": "dbe6a21d409c7acc0992e2a87afc6218f01307a666fba6ad75339fc195bdf0c6", + "rows": 1392, + "helper_errors": 0, + "exposure_glycans": { + "excluded_exact_or_verified_graph_identity": 1291, + "absent_from_wa3_sequence_parents": 101 + }, + "wa0_checkpoints": { + "benchmark1392_linkage_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt" + } + }, + "seal162": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/review/heldout_masking_wa3_linkage_diagnosis_20260925_r1/inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv", + "sha256": "e08c82fd1407f8a510f15e3dda0b4312c90aeb30eef8ac33d54bbe4d7eaadc7c", + "rows": 162, + "helper_errors": 0, + "exposure_glycans": { + "absent_from_wa3_sequence_parents": 160, + "pretraining_train": 2 + }, + "wa0_checkpoints": { + "seal162_linkage_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt" + } + } + }, + "answer_space": { + "training_rows_scanned": 221897, + "vocab": 2114, + "invalid_excluded": 387, + "pipe_tokens_excluded": 379, + "linkage_tokens_seen": 462, + "residue_tokens_seen": 1185, + "linkage_tokens_allowed": 462, + "residue_tokens_allowed": 1170, + "linkage_class_counts": [ + 0, + 97966, + 150442, + 219104, + 95827, + 13486, + 11976, + 23, + 36422, + 658542 + ] + }, + "truth_outside_answer_space": { + "bench1392/benchmark1392_linkage_full": 0, + "seal162/seal162_linkage_t080": 0 + }, + "case_identity_skipped_runs": [], + "device": "cpu", + "neutral_unknown": { + "module": "sequence_embeddings.linkage_embeddings", + "rows_averaged": [ + 1, + 8 + ], + "weights": [ + 0.156684, + 0.240612, + 0.350428, + 0.153263, + 0.021569, + 0.019154, + 3.7e-05, + 0.058252 + ] + }, + "aggregates": { + "bench1392/benchmark1392_linkage_full/class9": { + "num_cases": 1362, + "num_masked_positions": 1419, + "avg_masked_positions_per_case": 1.0418502202643172, + "initial_top1_token_accuracy": 0.3474277660324172, + "initial_top5_token_accuracy": 0.7801268498942917, + "initial_exact_span_accuracy_top1": 0.3509544787077827, + "initial_exact_span_accuracy_top5": 0.7819383259911894, + "iterative_resolved_fraction": 0.24383368569415081, + "iterative_accuracy_among_resolved": 0.5780346820809249, + "iterative_final_token_accuracy": 0.14094432699083861, + "iterative_exact_span_accuracy": 0.14243759177679882, + "avg_iterations_used_per_case": 0.25183553597650515 + }, + "bench1392/benchmark1392_linkage_full/neutral_unknown": { + "num_cases": 1362, + "num_masked_positions": 1419, + "avg_masked_positions_per_case": 1.0418502202643172, + "initial_top1_token_accuracy": 0.5095137420718816, + "initial_top5_token_accuracy": 0.9393939393939394, + "initial_exact_span_accuracy_top1": 0.5154185022026432, + "initial_exact_span_accuracy_top5": 0.9544787077826725, + "iterative_resolved_fraction": 0.5052854122621564, + "iterative_accuracy_among_resolved": 0.6457461645746164, + "iterative_final_token_accuracy": 0.3262861169837914, + "iterative_exact_span_accuracy": 0.328928046989721, + "avg_iterations_used_per_case": 0.5234948604992657 + }, + "seal162/seal162_linkage_t080/class9": { + "num_cases": 162, + "num_masked_positions": 171, + "avg_masked_positions_per_case": 1.0555555555555556, + "initial_top1_token_accuracy": 0.26900584795321636, + "initial_top5_token_accuracy": 0.7192982456140351, + "initial_exact_span_accuracy_top1": 0.25308641975308643, + "initial_exact_span_accuracy_top5": 0.7098765432098766, + "iterative_resolved_fraction": 0.15789473684210525, + "iterative_accuracy_among_resolved": 0.48148148148148145, + "iterative_final_token_accuracy": 0.07602339181286549, + "iterative_exact_span_accuracy": 0.06172839506172839, + "avg_iterations_used_per_case": 0.16049382716049382 + }, + "seal162/seal162_linkage_t080/neutral_unknown": { + "num_cases": 162, + "num_masked_positions": 171, + "avg_masked_positions_per_case": 1.0555555555555556, + "initial_top1_token_accuracy": 0.4444444444444444, + "initial_top5_token_accuracy": 0.935672514619883, + "initial_exact_span_accuracy_top1": 0.4444444444444444, + "initial_exact_span_accuracy_top5": 0.9444444444444444, + "iterative_resolved_fraction": 0.42105263157894735, + "iterative_accuracy_among_resolved": 0.5277777777777778, + "iterative_final_token_accuracy": 0.2222222222222222, + "iterative_exact_span_accuracy": 0.2222222222222222, + "avg_iterations_used_per_case": 0.43209876543209874 + } + }, + "baseline_fit": { + "fitted": 221825, + "unit_walk_mismatch": 72, + "removed_test_glycan": 2 + }, + "finished": "2026-09-25T07:24:41", + "script_sha256": "679499406106611dc2c70240a3c14c9b94311bc03a7811d3dae807c58aef4ef8", + "status": "COMPLETE" +} \ No newline at end of file diff --git a/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_same_test_run_manifest.json b/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_same_test_run_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..f50a1f253a15d357c92fb18b25da1a4709c07835 --- /dev/null +++ b/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_same_test_run_manifest.json @@ -0,0 +1,79 @@ +{ + "schema": "bertose_wa3_same_test_heldout_masking_v1", + "started": "2026-09-14T18:49:17", + "slurm_job_id": "12847066", + "host": "nova18-wide-33", + "python": "3.10.16", + "torch": "2.9.1+cu128", + "threads": 16, + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back", + "wa3_invalid_prediction_set": { + "specials": 10, + "ambiguity_tokens": 377 + }, + "inputs": { + "bench1392": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/glycangt_heldout_ipa_validation/data/benchmark_exclusion_1392_unseen_to_bertose_v5b_excluded.csv", + "sha256": "dbe6a21d409c7acc0992e2a87afc6218f01307a666fba6ad75339fc195bdf0c6", + "rows": 1392, + "helper_errors": 0, + "exposure_glycans": { + "excluded_exact_or_verified_graph_identity": 1291, + "absent_from_wa3_sequence_parents": 101 + }, + "wa0_checkpoints": { + "benchmark1392_residue_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_residue_full_thr070": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_residue_full_thr075": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_residue_full_thr085": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_residue_full_thr090": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_linkage_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_linkage_full_thr070": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_linkage_full_thr075": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_linkage_full_thr085": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_linkage_full_thr090": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_complexity_residue2_t080": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_complexity_residue3_t080": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_complexity_linkage2_t080": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_complexity_linkage3_t080": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_complexity_r1_l1_t080": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_complexity_r2_l1_t080": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_complexity_r2_l2_t080": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt" + } + }, + "seal162": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/review/heldout_masking_wa3_same_test_20260914_r3/inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv", + "sha256": "e08c82fd1407f8a510f15e3dda0b4312c90aeb30eef8ac33d54bbe4d7eaadc7c", + "rows": 162, + "helper_errors": 0, + "exposure_glycans": { + "absent_from_wa3_sequence_parents": 160, + "pretraining_train": 2 + }, + "wa0_checkpoints": { + "seal162_residue_t070": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_residue_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_residue_t090": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_linkage_t070": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_linkage_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_linkage_t090": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_residue2_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_residue3_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_linkage2_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_linkage3_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_r1_l1_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_r2_l2_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt" + } + } + }, + "case_identity_skipped_runs": [], + "device": "cpu", + "baseline_fit": { + "fitted": 221825, + "unit_walk_mismatch": 72, + "removed_test_glycan": 2 + }, + "finished": "2026-09-14T20:22:17", + "script_sha256": "0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86", + "status": "COMPLETE" +} \ No newline at end of file diff --git a/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_typed_20260924_run_manifest.json b/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_typed_20260924_run_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..8c08f173dff753f84e7b1c99e7b71c05e6da59c0 --- /dev/null +++ b/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_typed_20260924_run_manifest.json @@ -0,0 +1,72 @@ +{ + "schema": "bertose_wa3_typed_decoding_heldout_masking_v1", + "parent_script": "wa3_same_test.py sha256 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 (job 12847066)", + "decoding": "type-consistent answer space (see docstring); renormalised softmax; threshold 0.80; 3 rounds", + "started": "2026-09-24T16:38:23", + "slurm_job_id": "16591409", + "host": "nova21-33", + "python": "3.10.16", + "torch": "2.9.1+cu128", + "threads": 16, + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back", + "wa3_invalid_prediction_set": { + "specials": 10, + "ambiguity_tokens": 377 + }, + "inputs": { + "bench1392": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/glycangt_heldout_ipa_validation/data/benchmark_exclusion_1392_unseen_to_bertose_v5b_excluded.csv", + "sha256": "dbe6a21d409c7acc0992e2a87afc6218f01307a666fba6ad75339fc195bdf0c6", + "rows": 1392, + "helper_errors": 0, + "exposure_glycans": { + "excluded_exact_or_verified_graph_identity": 1291, + "absent_from_wa3_sequence_parents": 101 + }, + "wa0_checkpoints": { + "benchmark1392_residue_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_linkage_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt" + } + }, + "seal162": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/review/heldout_masking_wa3_typed_20260924_r1/inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv", + "sha256": "e08c82fd1407f8a510f15e3dda0b4312c90aeb30eef8ac33d54bbe4d7eaadc7c", + "rows": 162, + "helper_errors": 0, + "exposure_glycans": { + "absent_from_wa3_sequence_parents": 160, + "pretraining_train": 2 + }, + "wa0_checkpoints": { + "seal162_residue_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_linkage_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt" + } + } + }, + "answer_space": { + "training_rows_scanned": 221897, + "vocab": 2114, + "invalid_excluded": 387, + "pipe_tokens_excluded": 379, + "linkage_tokens_seen": 1130, + "residue_tokens_seen": 1185, + "linkage_tokens_allowed": 755, + "residue_tokens_allowed": 1170 + }, + "truth_outside_answer_space": { + "bench1392/benchmark1392_residue_full": 0, + "bench1392/benchmark1392_linkage_full": 0, + "seal162/seal162_residue_t080": 0, + "seal162/seal162_linkage_t080": 0 + }, + "case_identity_skipped_runs": [], + "device": "cpu", + "baseline_fit": { + "fitted": 221825, + "unit_walk_mismatch": 72, + "removed_test_glycan": 2 + }, + "finished": "2026-09-24T17:14:48", + "script_sha256": "1341b0051fefaf54b4113d7dda5e408540844d12a9275f9a73607c416f35928d", + "status": "COMPLETE" +} \ No newline at end of file diff --git a/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_typed_strict_20260925_run_manifest.json b/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_typed_strict_20260925_run_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..a3fea7f87020e0e26b3dd2d0f6d79135f791dafe --- /dev/null +++ b/releases/2026-10-02/iar_completion/provenance/heldout_masking_wa3_typed_strict_20260925_run_manifest.json @@ -0,0 +1,72 @@ +{ + "schema": "bertose_wa3_typed_strict_linkage_diagnostic_v1", + "parent_script": "wa3_same_test.py sha256 0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86 (job 12847066)", + "decoding": "type-consistent answer space (see docstring); renormalised softmax; threshold 0.80; 3 rounds", + "started": "2026-09-25T01:03:09", + "slurm_job_id": "16592624", + "host": "nova18-wide-35", + "python": "3.10.16", + "torch": "2.9.1+cu128", + "threads": 16, + "model": "WA3 A1111 seed42 epoch58 (reported; non-IAR); frozen inference; no write-back", + "wa3_invalid_prediction_set": { + "specials": 10, + "ambiguity_tokens": 377 + }, + "inputs": { + "bench1392": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/glycangt_heldout_ipa_validation/data/benchmark_exclusion_1392_unseen_to_bertose_v5b_excluded.csv", + "sha256": "dbe6a21d409c7acc0992e2a87afc6218f01307a666fba6ad75339fc195bdf0c6", + "rows": 1392, + "helper_errors": 0, + "exposure_glycans": { + "excluded_exact_or_verified_graph_identity": 1291, + "absent_from_wa3_sequence_parents": 101 + }, + "wa0_checkpoints": { + "benchmark1392_residue_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt", + "benchmark1392_linkage_full": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/checkpoints_v5b_excluded/best_v5b_excluded_model.pt" + } + }, + "seal162": { + "csv": "/work/ratul1/supantha/glycan-SD-VS/review/heldout_masking_wa3_typed_strict_20260925_r1/inputs/seal_milk_novel_162_unseen_to_bertose_v5b_excluded.csv", + "sha256": "e08c82fd1407f8a510f15e3dda0b4312c90aeb30eef8ac33d54bbe4d7eaadc7c", + "rows": 162, + "helper_errors": 0, + "exposure_glycans": { + "absent_from_wa3_sequence_parents": 160, + "pretraining_train": 2 + }, + "wa0_checkpoints": { + "seal162_residue_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt", + "seal162_linkage_t080": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/checkpoints/bertose_v5b_excluded.pt" + } + } + }, + "answer_space": { + "training_rows_scanned": 221897, + "vocab": 2114, + "invalid_excluded": 387, + "pipe_tokens_excluded": 379, + "linkage_tokens_seen": 462, + "residue_tokens_seen": 1185, + "linkage_tokens_allowed": 462, + "residue_tokens_allowed": 1170 + }, + "truth_outside_answer_space": { + "bench1392/benchmark1392_residue_full": 0, + "bench1392/benchmark1392_linkage_full": 0, + "seal162/seal162_residue_t080": 0, + "seal162/seal162_linkage_t080": 0 + }, + "case_identity_skipped_runs": [], + "device": "cpu", + "baseline_fit": { + "fitted": 221825, + "unit_walk_mismatch": 72, + "removed_test_glycan": 2 + }, + "finished": "2026-09-25T01:25:05", + "script_sha256": "c6e9506dbf97752aa248e325e75acf3abf63495054bcac68d48602967379531d", + "status": "COMPLETE" +} \ No newline at end of file diff --git a/releases/2026-10-02/iar_completion/provenance/local_checks.json b/releases/2026-10-02/iar_completion/provenance/local_checks.json new file mode 100644 index 0000000000000000000000000000000000000000..d237c4363c03566c65017d5f7338f3eabee99afa --- /dev/null +++ b/releases/2026-10-02/iar_completion/provenance/local_checks.json @@ -0,0 +1,32 @@ +{ + "checked_at": "2026-09-27T13:34:53.471833+00:00", + "python": "3.12.4 (main, Jun 6 2024, 18:26:44) [Clang 15.0.0 (clang-1500.3.9.4)]", + "executable": "/opt/homebrew/opt/python@3.12/bin/python3.12", + "scope": "CPU source/import and saved readout checks only; no encoder payload or full pipeline replay", + "checks": [ + { + "command": [ + "/opt/homebrew/opt/python@3.12/bin/python3.12", + "readout.py" + ], + "exit_code": 0, + "stdout": "{\n \"status\": \"PASS\",\n \"scope\": \"readout bytes, tensors, vocabulary, metadata and synthetic CPU projection only\",\n \"torch\": \"2.9.1\",\n \"numpy\": \"1.26.4\",\n \"fit\": {\n \"dev_accuracy_for_selection\": 0.7359,\n \"best_epoch\": 46,\n \"tokens\": 211,\n \"train_samples\": 111989,\n \"development_samples\": 27690,\n \"feature_dim\": 768\n },\n \"readout_sha256\": \"a03990a02a1737de05a7fa1739164e84fa6a0a4170ebaa65317a9f3c2f16c0b0\",\n \"classes\": 211,\n \"weight_shape\": [\n 211,\n 768\n ],\n \"vocabulary_binding\": \"211/211 token IDs match\",\n \"encoder_checkpoint_loaded\": false,\n \"full_pipeline_rerun\": false\n}\n", + "stderr": "" + }, + { + "command": [ + "/opt/homebrew/opt/python@3.12/bin/python3.12", + "check_package.py" + ], + "exit_code": 0, + "stdout": "Loaded vocabulary with 2090 tokens\nLoaded vocabulary with 2114 tokens\n{\n \"status\": \"PASS\",\n \"copied_artifact_hashes\": 36,\n \"python_sources_compiled\": 20,\n \"lineage_imports\": [\n \"wa3_final_iar_readout_all.py\",\n \"wa3_same_test.py\",\n \"wa3_typed_test.py\",\n \"wa3_typed_strict_test.py\",\n \"wa3_linkage_diagnosis.py\",\n \"wa3_linkage_probe.py\",\n \"wa3_final_iar_readout.py\"\n ],\n \"wa0_harness_import_and_identity_model\": \"PASS\",\n \"wa3_tokenizer_vocabulary\": 2114,\n \"schema_imports\": \"PASS\",\n \"readout_projection_shape\": [\n 1,\n 211\n ],\n \"encoder_checkpoint_loaded\": false,\n \"full_pipeline_rerun\": false\n}\n", + "stderr": "" + } + ], + "limits": [ + "No Java compilation", + "No encoder checkpoint loaded", + "No historical training or inference rerun", + "No raw case metrics recomputed by these checks" + ] +} diff --git a/releases/2026-10-02/iar_completion/provenance/required_input_hashes.json b/releases/2026-10-02/iar_completion/provenance/required_input_hashes.json new file mode 100644 index 0000000000000000000000000000000000000000..c9a1d0de777a06c5e85edc680fbae0f0469f6d2b --- /dev/null +++ b/releases/2026-10-02/iar_completion/provenance/required_input_hashes.json @@ -0,0 +1,113 @@ +{ + "source": "originals/wa3_final_iar_readout_all.py EXPECTED_SHA", + "inputs": [ + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py", + "sha256": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4", + "packaged_path": "runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py", + "status": "included hash match" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py", + "sha256": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7", + "packaged_path": "runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py", + "status": "included hash match" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py", + "sha256": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04", + "packaged_path": "runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py", + "status": "included hash match" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json", + "sha256": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b", + "packaged_path": "runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json", + "status": "included hash match" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_ambiguity_tokens.json", + "sha256": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b", + "packaged_path": "runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_ambiguity_tokens.json", + "status": "included hash match" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_sequence_parent_index.tsv.gz", + "sha256": "2c39e9b26bb41a1b9317c59372414f69812ead8676b0c33b23d2676e444a48b0", + "packaged_path": null, + "status": "external input required" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_token_ids.npy", + "sha256": "ec2d52dced65d22f0f218ff617d351fbd2930661bc8681e939990149d493537d", + "packaged_path": null, + "status": "external input required" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_residue_ids.npy", + "sha256": "36c96dcd3e03ba30e02e16f98d17605742627a37b37cd7824f2a745dd09dc044", + "packaged_path": null, + "status": "external input required" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_branch_depths.npy", + "sha256": "f39f76aa56a9bb782b2349f3ad1ca4ad16351ee1f06a8b9ae4b06bff9b1ebece", + "packaged_path": null, + "status": "external input required" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_linkage_types.npy", + "sha256": "89edb1940765928ced6f54e0d394f95c573eb9d96310b14dbd0adf8e20ac07c4", + "packaged_path": null, + "status": "external input required" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_attention_mask.npy", + "sha256": "01ed165720b9414e614dd7e7d75284a8886165f11138e16117ffcbe4e4bbf95c", + "packaged_path": null, + "status": "external input required" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_lengths.npy", + "sha256": "ade919d1e054c0ba852aa047bf873ac675f81a6c1f8a05cc73a0a2258131f021", + "packaged_path": null, + "status": "external input required" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py", + "sha256": "8d05a4048e200625694ff9a36f50af89b845fd0d38ba8034a97a710e7ad3dce2", + "packaged_path": "runtime_snapshot/project/writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py", + "status": "included hash match" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/bpe_vocabulary_clean.json", + "sha256": "6a572afdf53f1494ab96c896876b824ca7ea749777352606aa9f96bf270ceecc", + "packaged_path": "runtime_snapshot/project/data/bpe_vocabulary_clean.json", + "status": "included hash match" + }, + { + "historical_path": "/work/ratul1/supantha/glycan-SD-VS/bert_training_v3/v3.1_cluster_training/data/bpe_ambiguity_tokens.json", + "sha256": "c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74", + "packaged_path": "runtime_snapshot/project/data/bpe_ambiguity_tokens.json", + "status": "included hash match" + }, + { + "historical_path": "$WORK/inputs/java/review_A5WurcsArrayTreeAudit.java", + "sha256": "a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6", + "packaged_path": "runtime_snapshot/java/review_A5WurcsArrayTreeAudit.java", + "status": "included hash match" + }, + { + "historical_path": "$WORK/inputs/java/review_wurcsframework-1.3.1.jar", + "sha256": "5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37", + "packaged_path": "runtime_snapshot/java/review_wurcsframework-1.3.1.jar", + "status": "included hash match" + }, + { + "historical_path": "$WORK/inputs/java/review_MolWURCS.jar", + "sha256": "bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf", + "packaged_path": "runtime_snapshot/java/review_MolWURCS.jar", + "status": "included hash match" + } + ] +} diff --git a/releases/2026-10-02/iar_completion/provenance/source_inventory.json b/releases/2026-10-02/iar_completion/provenance/source_inventory.json new file mode 100644 index 0000000000000000000000000000000000000000..2eb98da7464c7bd3d2f2086d331a77debb3d2084 --- /dev/null +++ b/releases/2026-10-02/iar_completion/provenance/source_inventory.json @@ -0,0 +1,379 @@ +{ + "files": [ + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_same_test/wa3_same_test.py", + "path": "originals/wa3_same_test.py", + "sha256": "0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86", + "bytes": 59535, + "role": "executed source", + "recorded_sha256": "0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86", + "recorded_hash_matches": true + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_same_test/outputs/run_manifest.json", + "path": "provenance/heldout_masking_wa3_same_test_run_manifest.json", + "sha256": "3f713f4e074cbb068264173a8fb0ec99813665ad1b23fdea507f7389071cb04b", + "bytes": 6861, + "role": "historical run manifest", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_typed_20260924/wa3_typed_test.py", + "path": "originals/wa3_typed_test.py", + "sha256": "1341b0051fefaf54b4113d7dda5e408540844d12a9275f9a73607c416f35928d", + "bytes": 63012, + "role": "executed source", + "recorded_sha256": "1341b0051fefaf54b4113d7dda5e408540844d12a9275f9a73607c416f35928d", + "recorded_hash_matches": true + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_typed_20260924/outputs/run_manifest.json", + "path": "provenance/heldout_masking_wa3_typed_20260924_run_manifest.json", + "sha256": "b3cf90dc772f206dc386a3a92d96e43d7a6c1de4147bc7cc501599730d31807f", + "bytes": 3136, + "role": "historical run manifest", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_typed_strict_20260925/wa3_typed_strict_test.py", + "path": "originals/wa3_typed_strict_test.py", + "sha256": "c6e9506dbf97752aa248e325e75acf3abf63495054bcac68d48602967379531d", + "bytes": 64136, + "role": "executed source", + "recorded_sha256": "c6e9506dbf97752aa248e325e75acf3abf63495054bcac68d48602967379531d", + "recorded_hash_matches": true + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_typed_strict_20260925/outputs/run_manifest.json", + "path": "provenance/heldout_masking_wa3_typed_strict_20260925_run_manifest.json", + "sha256": "4a13b9faecc329257c2aa08fd6734a8b6c02837d0b230b0f659fd00602832c75", + "bytes": 3148, + "role": "historical run manifest", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_linkage_diagnosis_20260925/wa3_linkage_diagnosis.py", + "path": "originals/wa3_linkage_diagnosis.py", + "sha256": "679499406106611dc2c70240a3c14c9b94311bc03a7811d3dae807c58aef4ef8", + "bytes": 67711, + "role": "executed source", + "recorded_sha256": "679499406106611dc2c70240a3c14c9b94311bc03a7811d3dae807c58aef4ef8", + "recorded_hash_matches": true + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_linkage_diagnosis_20260925/outputs/run_manifest.json", + "path": "provenance/heldout_masking_wa3_linkage_diagnosis_20260925_run_manifest.json", + "sha256": "933ef4d07c380bd4322814acff135e207e00db36197c3dc543214b24cb5d554e", + "bytes": 6034, + "role": "historical run manifest", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_linkage_probe_20260925/wa3_linkage_probe.py", + "path": "originals/wa3_linkage_probe.py", + "sha256": "0ebc629778c854621f485ceb4f5f11090e84ac9171d52270fcc90b6b07d6fe7f", + "bytes": 83203, + "role": "parent source; descendant SHA prefix only", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_final_iar_readout_20260926/wa3_final_iar_readout.py", + "path": "originals/wa3_final_iar_readout.py", + "sha256": "5acafc45244a0bf9a8489794f8a39f956622cf50594d87eb2eaa04502589fcb5", + "bytes": 81913, + "role": "executed source", + "recorded_sha256": "5acafc45244a0bf9a8489794f8a39f956622cf50594d87eb2eaa04502589fcb5", + "recorded_hash_matches": true + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_final_iar_readout_20260926/outputs/run_manifest.json", + "path": "provenance/heldout_masking_wa3_final_iar_readout_20260926_run_manifest.json", + "sha256": "a615d9a889c7a62c19d05a4d07d66d9e743fbfb9e37e4d646c889490d297e492", + "bytes": 3825, + "role": "historical run manifest", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_final_iar_readout_all_20260927/wa3_final_iar_readout_all.py", + "path": "originals/wa3_final_iar_readout_all.py", + "sha256": "72f8583bf32799ba29c09829d138900c0cbb589f73bd278f389da6fa8a786730", + "bytes": 82622, + "role": "executed source", + "recorded_sha256": "72f8583bf32799ba29c09829d138900c0cbb589f73bd278f389da6fa8a786730", + "recorded_hash_matches": true + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_final_iar_readout_all_20260927/outputs/run_manifest.json", + "path": "provenance/heldout_masking_wa3_final_iar_readout_all_20260927_run_manifest.json", + "sha256": "0aa0dc0fb74388a72750578acdf9beafba917a1976059c813157a90eceae3419", + "bytes": 3838, + "role": "historical run manifest", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_final_iar_readout_all_20260927/run.sbatch", + "path": "originals/run_all_training.sbatch", + "sha256": "d406620e3b0c070dff4d6fb6e0c57effce848a9ca5b3dc3de705d65c49ac0961", + "bytes": 1703, + "role": "historical launcher; do not submit unchanged", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_final_iar_readout_all_20260927/outputs/linkage_readout.pt", + "path": "assets/linkage_readout.pt", + "sha256": "a03990a02a1737de05a7fa1739164e84fa6a0a4170ebaa65317a9f3c2f16c0b0", + "bytes": 663845, + "role": "final job 16604931 artifact", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_final_iar_readout_all_20260927/outputs/run_manifest.json", + "path": "provenance/final_run/run_manifest.json", + "sha256": "0aa0dc0fb74388a72750578acdf9beafba917a1976059c813157a90eceae3419", + "bytes": 3838, + "role": "final job 16604931 artifact", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_final_iar_readout_all_20260927/outputs/final_iar_summary.json", + "path": "provenance/final_run/final_iar_summary.json", + "sha256": "d5b7fd634677ea22ea27670649ea30636ef6c98daedc8592cd3f5d7b56beb9c0", + "bytes": 6162, + "role": "final job 16604931 artifact", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_final_iar_readout_all_20260927/outputs/baselines_same_cases.csv", + "path": "provenance/final_run/baselines_same_cases.csv", + "sha256": "259fdc68a39b415c4ec114fbd6872ceaccaf09327d1fde958390071a5a94af2a", + "bytes": 4968, + "role": "final job 16604931 artifact", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py", + "path": "runtime_snapshot/project/writing/glycangt_heldout_ipa_validation/cluster/heldout_ipa_eval.py", + "sha256": "8d05a4048e200625694ff9a36f50af89b845fd0d38ba8034a97a710e7ad3dce2", + "bytes": 40107, + "role": "direct runtime dependency; local snapshot", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/code/training/ipa_bpe_distillation.py", + "path": "runtime_snapshot/project/writing/cluster/nature_submission/code/training/ipa_bpe_distillation.py", + "sha256": "f0c8efda7a12942b4c6359792d6ee9417e6a9ec0eb04623ad17b4772430270b5", + "bytes": 15975, + "role": "direct runtime dependency; local snapshot", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/code/model/__init__.py", + "path": "runtime_snapshot/project/writing/cluster/nature_submission/code/model/__init__.py", + "sha256": "de8c3237b858b640ee9fbf4dac34864c54b6dac80bc89f346a44c774254289a4", + "bytes": 104, + "role": "direct runtime dependency; local snapshot", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/code/model/multimodal_glycan_bert_v3.py", + "path": "runtime_snapshot/project/writing/cluster/nature_submission/code/model/multimodal_glycan_bert_v3.py", + "sha256": "8e06c32f4e844c3c66f146fd15a075472808a0720c892d0b9683dfd32f15ef0c", + "bytes": 45141, + "role": "direct runtime dependency; local snapshot", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/bert_training_v4/downstream_tasks/utils/wurcs_bpe_tokenizer.py", + "path": "runtime_snapshot/project/bert_training_v4/downstream_tasks/utils/wurcs_bpe_tokenizer.py", + "sha256": "0bc54399362945601bcfd403441fc80968d173200dd0561f57568b2053a94839", + "bytes": 27983, + "role": "direct runtime dependency; local snapshot", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/bpe_vocabulary_clean.json", + "path": "runtime_snapshot/project/data/bpe_vocabulary_clean.json", + "sha256": "6a572afdf53f1494ab96c896876b824ca7ea749777352606aa9f96bf270ceecc", + "bytes": 118583, + "role": "direct runtime dependency; local snapshot", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/data/vocab/bpe_ambiguity_tokens.json", + "path": "runtime_snapshot/project/data/bpe_ambiguity_tokens.json", + "sha256": "c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74", + "bytes": 11127, + "role": "direct runtime dependency; local snapshot", + "recorded_sha256": "c68cd003370b2dcdb162f848f766e4e62f2653c6c38d205f8cbe53a9aabe2d74", + "recorded_hash_matches": true + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py", + "path": "runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_wurcs_bpe.py", + "sha256": "6591b854962c278dc797981c942e114c18a26e97af43029c1d539bae3badb2f4", + "bytes": 14161, + "role": "direct runtime dependency; local snapshot", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py", + "path": "runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_training_a5_topology.py", + "sha256": "f48ba266abf30a7a1298dea747676da64d53acef4ef02cba7ac8f16509460fc7", + "bytes": 6186, + "role": "direct runtime dependency; local snapshot", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py", + "path": "runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_frozen_sequence_tree_runtime.py", + "sha256": "10ca4b121d2f22d7a64208e4f05172e7a756b653d0828c9dcc49dd8ea1a5ad04", + "bytes": 11405, + "role": "direct runtime dependency; local snapshot", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json", + "path": "runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_vocabulary.json", + "sha256": "918c73a55adeb603614112d75bb02033e5823fd9c8a70d43f6c0a4a9c78e360b", + "bytes": 138150, + "role": "direct runtime dependency; local snapshot", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_ambiguity_tokens.json", + "path": "runtime_snapshot/project/data/review_sequences_a5_non_iar_later_role_official_array_v4_20260721_r1/review_bpe_ambiguity_tokens.json", + "sha256": "22d2aad45b978988c9e26bc9400016014ee825cc6207377385a8cd74f3c88f2b", + "bytes": 19693, + "role": "direct runtime dependency; local snapshot", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/iar_external_validation_20260825_r1/inputs/w2_phase0/remote_snapshot/iar_pipe_schema_20260823_r1/pipelib.py", + "path": "runtime_snapshot/schema/pipelib.py", + "sha256": "704ed130bdcce94a7af7ce3e37654705f709b8526f632907ef794451c6ef7f30", + "bytes": 4397, + "role": "A_chem import dependency; historical snapshot, final job did not hash it", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/review/iar_external_validation_20260825_r1/inputs/w2_phase0/remote_snapshot/iar_pipe_schema_20260823_r1/classify.py", + "path": "runtime_snapshot/schema/classify.py", + "sha256": "cfce20d28291c8b5868d35386990037415090202dd823bdfd73038456cc65557", + "bytes": 3063, + "role": "A_chem import dependency; historical snapshot, final job did not hash it", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_same_test/inputs/java/review_A5WurcsArrayTreeAudit.java", + "path": "runtime_snapshot/java/review_A5WurcsArrayTreeAudit.java", + "sha256": "a791b8f4bbda75317f41afb34d62fe518448f4d5d90db0b852e2b0d0af5e83a6", + "bytes": 19697, + "role": "official WURCS helper", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_same_test/inputs/java/review_wurcsframework-1.3.1.jar", + "path": "runtime_snapshot/java/review_wurcsframework-1.3.1.jar", + "sha256": "5449f9276a7b952adf087468c874bb13c7295062cce7d1afb13fdea78ace7f37", + "bytes": 340319, + "role": "official WURCS helper", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/heldout_masking_wa3_same_test/inputs/java/review_MolWURCS.jar", + "path": "runtime_snapshot/java/review_MolWURCS.jar", + "sha256": "bc38e44e66daed7ec04f7c7907a13509aac125a8a09c97d9972725ab4278edaf", + "bytes": 4019920, + "role": "official WURCS helper", + "recorded_sha256": null, + "recorded_hash_matches": null + }, + { + "original_path": "/Users/supantha/Documents/esm-g/plan/bert_training_v3/v3.1_cluster_training/writing/cluster/nature_submission/code/model/glycan_bert.py", + "path": "runtime_snapshot/project/writing/cluster/nature_submission/code/model/glycan_bert.py", + "sha256": "b69f14c9976951325e3a0a4e8107a16126e67d410e966650f513f1f538a732bb", + "bytes": 11024, + "role": "WA0 distiller model import dependency; no model weights loaded", + "recorded_sha256": null, + "recorded_hash_matches": null + } + ], + "lineage": [ + { + "script": "originals/wa3_same_test.py", + "sha256": "0da5f24799afc8978b88c85ea7856deb8c641ebae319760e88539c93a4eb3a86", + "job_id": "12847066", + "manifest_present": true, + "binding": "full manifest SHA" + }, + { + "script": "originals/wa3_typed_test.py", + "sha256": "1341b0051fefaf54b4113d7dda5e408540844d12a9275f9a73607c416f35928d", + "job_id": "16591409", + "manifest_present": true, + "binding": "full manifest SHA" + }, + { + "script": "originals/wa3_typed_strict_test.py", + "sha256": "c6e9506dbf97752aa248e325e75acf3abf63495054bcac68d48602967379531d", + "job_id": "16592624", + "manifest_present": true, + "binding": "full manifest SHA" + }, + { + "script": "originals/wa3_linkage_diagnosis.py", + "sha256": "679499406106611dc2c70240a3c14c9b94311bc03a7811d3dae807c58aef4ef8", + "job_id": "16593043", + "manifest_present": true, + "binding": "full manifest SHA" + }, + { + "script": "originals/wa3_linkage_probe.py", + "sha256": "0ebc629778c854621f485ceb4f5f11090e84ac9171d52270fcc90b6b07d6fe7f", + "job_id": "16597594 (descendant docstring)", + "manifest_present": false, + "binding": "descendant docstring prefix 0ebc6297 only; full hash computed locally" + }, + { + "script": "originals/wa3_final_iar_readout.py", + "sha256": "5acafc45244a0bf9a8489794f8a39f956622cf50594d87eb2eaa04502589fcb5", + "job_id": "16602478", + "manifest_present": true, + "binding": "full manifest SHA" + }, + { + "script": "originals/wa3_final_iar_readout_all.py", + "sha256": "72f8583bf32799ba29c09829d138900c0cbb589f73bd278f389da6fa8a786730", + "job_id": "16604931", + "manifest_present": true, + "binding": "full manifest SHA" + } + ] +} diff --git a/releases/2026-10-02/iar_completion/readout.py b/releases/2026-10-02/iar_completion/readout.py new file mode 100644 index 0000000000000000000000000000000000000000..fd0b7361cfbbb3c5e6c651d98e7161612c954943 --- /dev/null +++ b/releases/2026-10-02/iar_completion/readout.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +"""Load the shipped linkage readout; optional scoring of precomputed hidden states. + +This module does not build a glycan input or run the upstream encoder. Features +must be the 768-wide input of sequence_head under the recorded neutral linkage +input and frozen WA3 checkpoint. Run without arguments for a CPU artifact check. +""" +from pathlib import Path +import argparse +import hashlib +import json +import re + +import numpy as np +import torch + + +ROOT = Path(__file__).resolve().parent + + +def _sha(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def load_readout(root=ROOT): + root = Path(root) + meta = json.loads((root / "model_metadata.json").read_text()) + for key in ("readout", "vocabulary", "source"): + item = meta[key] + if _sha(root / item["path"]) != item["sha256"]: + raise ValueError(f"{key} SHA-256 differs from model_metadata.json") + # The historical file contains two NumPy arrays. Permit only their narrow + # reconstruction primitives while retaining PyTorch's weights-only loader. + reconstruct = np.core.multiarray._reconstruct + safe = [ + (reconstruct, "numpy._core.multiarray._reconstruct"), + (reconstruct, "numpy.core.multiarray._reconstruct"), + np.ndarray, np.dtype, type(np.dtype(np.float32)), + ] + with torch.serialization.safe_globals(safe): + payload = torch.load(root / meta["readout"]["path"], map_location="cpu", weights_only=True) + if payload["fit"] != meta["fit"]: + raise ValueError("Serialized fitting metadata differs from sidecar") + if payload["hidden"] != meta["encoder"]["hidden"]: + raise ValueError("Unexpected hidden-state source") + vocab = json.loads((root / meta["vocabulary"]["path"]).read_text()) + token_to_id = vocab.get("token_to_id", vocab) + ids, tokens = payload["token_ids"], payload["tokens"] + if len(ids) != 211 or len(tokens) != 211 or len(set(ids)) != 211: + raise ValueError("Expected 211 unique linkage token classes") + if any(token_to_id.get(t) != i or not re.fullmatch(r"[A-Za-z]+\d+-[A-Za-z]+\d+", t) + for i, t in zip(ids, tokens)): + raise ValueError("Readout classes differ from frozen vocabulary or ordinary linkage syntax") + state = payload["state_dict"] + if set(state) != {"weight", "bias"}: + raise ValueError("Unexpected readout state entries") + for name, shape in (("weight", (211, 768)), ("bias", (211,))): + if tuple(state[name].shape) != shape or not torch.isfinite(state[name]).all(): + raise ValueError(f"Invalid {name} tensor") + for name in ("feature_mean", "feature_sd"): + a = payload[name] + if a.shape != (768,) or a.dtype != np.float32 or not np.isfinite(a).all(): + raise ValueError(f"Invalid {name}") + if not (payload["feature_sd"] > 0).all(): + raise ValueError("Feature scales must be positive") + lin = torch.nn.Linear(768, 211) + lin.load_state_dict(state, strict=True) + lin.eval().requires_grad_(False) + return payload, lin, meta + + +def probabilities(hidden, payload, linear): + """Return probabilities in payload['token_ids'] order for [N, 768] features.""" + hidden = np.asarray(hidden, dtype=np.float32) + if hidden.ndim != 2 or hidden.shape[1] != 768 or not np.isfinite(hidden).all(): + raise ValueError("hidden must be a finite N by 768 array") + # Use the original NumPy float32 normalization before PyTorch projection. + x = torch.as_tensor((hidden - payload["feature_mean"]) / payload["feature_sd"], dtype=torch.float32) + with torch.inference_mode(): + return torch.softmax(linear(x), dim=-1).numpy() + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--features", type=Path, help="Precomputed N by 768 .npy array; allow_pickle=False") + parser.add_argument("--output", type=Path, help="JSON output for --features; must not already exist") + args = parser.parse_args() + if bool(args.features) != bool(args.output): + parser.error("--features and --output must be supplied together") + payload, lin, meta = load_readout() + # At the training mean the normalized feature is zero: probabilities are + # exactly the softmax of the learned bias, checking normalization and mapping. + actual = probabilities(payload["feature_mean"][None, :], payload, lin)[0] + expected = torch.softmax(payload["state_dict"]["bias"], dim=-1).numpy() + if not np.array_equal(actual, expected) or not np.isclose(actual.sum(), 1.0): + raise ValueError("Synthetic mean-feature check failed") + report = {"status": "PASS", "scope": "readout bytes, tensors, vocabulary, metadata and synthetic CPU projection only", + "torch": torch.__version__, "numpy": np.__version__, "fit": payload["fit"], + "readout_sha256": meta["readout"]["sha256"], "classes": len(payload["token_ids"]), + "weight_shape": list(lin.weight.shape), "vocabulary_binding": "211/211 token IDs match", + "encoder_checkpoint_loaded": False, "full_pipeline_rerun": False} + if args.features: + p = probabilities(np.load(args.features, allow_pickle=False), payload, lin) + result = {"token_ids": payload["token_ids"], "tokens": payload["tokens"], "probabilities": p.tolist()} + with args.output.open("x") as handle: + json.dump(result, handle) + report["feature_rows_scored"] = len(p) + print(json.dumps(report, indent=2)) + + +if __name__ == "__main__": + main()